[med-svn] [exabayes] 01/02: New upstream version 1.5

Andreas Tille tille at debian.org
Wed Mar 15 12:42:31 UTC 2017


This is an automated email from the git hooks/post-receive script.

tille pushed a commit to branch master
in repository exabayes.

commit 9780a5df7437495f74946fe7436e7fd16554295c
Author: Andreas Tille <tille at debian.org>
Date:   Wed Mar 15 13:41:21 2017 +0100

    New upstream version 1.5
---
 .gitignore                                         |    63 +
 CHANGELOG                                          |    23 +
 COPYING                                            |    14 +
 Doxyfile                                           |  1792 ++++
 INSTALL.txt                                        |    12 +
 LICENSE.txt                                        |   674 ++
 Makefile.am                                        |   283 +
 README.md                                          |    63 +
 bootstrap.sh                                       |    46 +
 configure.ac                                       |   157 +
 examples/aa-revmat/aln.phy                         |   776 ++
 examples/aa-revmat/call-parallel.sh                |    22 +
 examples/aa-revmat/call.sh                         |    21 +
 examples/aa-revmat/config.nex                      |    12 +
 examples/aa/aln.phy                                |     1 +
 examples/aa/call-parallel.sh                       |    22 +
 examples/aa/call.sh                                |    23 +
 examples/aa/config.nex                             |    19 +
 examples/binary/aln.model                          |     1 +
 examples/binary/aln.phy                            |    11 +
 examples/binary/call-parallel.sh                   |    22 +
 examples/binary/call.sh                            |    22 +
 examples/binary/config.nex                         |    19 +
 examples/configFile-all-options.nex                |   185 +
 examples/dna-partitioned/aln.part                  |     4 +
 examples/dna-partitioned/aln.phy                   |  3927 +++++++
 examples/dna-partitioned/call-parallel.sh          |    22 +
 examples/dna-partitioned/call.sh                   |    22 +
 examples/dna-partitioned/config.nex                |    19 +
 examples/dna-unpartitioned/aln.phy                 |     1 +
 examples/dna-unpartitioned/call-parallel.sh        |    21 +
 examples/dna-unpartitioned/call.sh                 |    22 +
 examples/dna-unpartitioned/config.nex              |     7 +
 lib/Random123-1.08/LICENSE                         |    31 +
 lib/Random123-1.08/docs/Doxyfile                   |  1648 +++
 lib/Random123-1.08/docs/cbrng.dox                  |   198 +
 lib/Random123-1.08/docs/header.html                |    12 +
 lib/Random123-1.08/docs/html/CBRNG.html            |   151 +
 lib/Random123-1.08/docs/html/Engine_8hpp.html      |    95 +
 .../docs/html/Engine_8hpp_source.html              |   305 +
 lib/Random123-1.08/docs/html/ExamplesREADME.html   |   167 +
 lib/Random123-1.08/docs/html/LICENSE.html          |    71 +
 lib/Random123-1.08/docs/html/MicroURNG_8hpp.html   |    90 +
 .../docs/html/MicroURNG_8hpp_source.html           |   182 +
 lib/Random123-1.08/docs/html/README.html           |    77 +
 .../docs/html/ReinterpretCtr_8hpp.html             |    90 +
 .../docs/html/ReinterpretCtr_8hpp_source.html      |   149 +
 lib/Random123-1.08/docs/html/Release_01Notes.html  |   198 +
 lib/Random123-1.08/docs/html/aes_8h.html           |   135 +
 lib/Random123-1.08/docs/html/aes_8h_source.html    |   364 +
 lib/Random123-1.08/docs/html/annotated.html        |   107 +
 lib/Random123-1.08/docs/html/array_8h.html         |   647 ++
 lib/Random123-1.08/docs/html/array_8h_source.html  |   376 +
 lib/Random123-1.08/docs/html/ars_8h.html           |   137 +
 lib/Random123-1.08/docs/html/ars_8h_source.html    |   228 +
 lib/Random123-1.08/docs/html/bc_s.png              |   Bin 0 -> 677 bytes
 lib/Random123-1.08/docs/html/cbrng_8dox.html       |    77 +
 lib/Random123-1.08/docs/html/classes.html          |    86 +
 .../html/classr123_1_1AESNI1xm128i-members.html    |    83 +
 .../html/classr123_1_1AESNI1xm128i__R-members.html |    83 +
 .../html/classr123_1_1AESNI4x32__R-members.html    |    83 +
 .../html/classr123_1_1ARS1xm128i__R-members.html   |    83 +
 .../docs/html/classr123_1_1ARS4x32__R-members.html |    83 +
 .../docs/html/classr123_1_1MicroURNG-members.html  |    93 +
 .../docs/html/classr123_1_1MicroURNG.html          |   436 +
 .../html/classr123_1_1Philox2x32__R-members.html   |    83 +
 .../html/classr123_1_1Philox2x64__R-members.html   |    83 +
 .../html/classr123_1_1Philox4x32__R-members.html   |    83 +
 .../html/classr123_1_1Philox4x64__R-members.html   |    83 +
 .../html/classr123_1_1Threefry2x32__R-members.html |    83 +
 .../html/classr123_1_1Threefry2x64__R-members.html |    83 +
 .../html/classr123_1_1Threefry4x32__R-members.html |    83 +
 .../html/classr123_1_1Threefry4x64__R-members.html |    83 +
 lib/Random123-1.08/docs/html/closed.png            |   Bin 0 -> 126 bytes
 .../docs/html/compilerfeatures_8h.html             |    79 +
 .../docs/html/compilerfeatures_8h_source.html      |   236 +
 lib/Random123-1.08/docs/html/doxygen.css           |   656 ++
 lib/Random123-1.08/docs/html/doxygen.png           |   Bin 0 -> 3942 bytes
 lib/Random123-1.08/docs/html/files.html            |    91 +
 lib/Random123-1.08/docs/html/functions.html        |   116 +
 lib/Random123-1.08/docs/html/functions_0x61.html   |   122 +
 lib/Random123-1.08/docs/html/functions_0x62.html   |   150 +
 lib/Random123-1.08/docs/html/functions_0x63.html   |   223 +
 lib/Random123-1.08/docs/html/functions_0x64.html   |   140 +
 lib/Random123-1.08/docs/html/functions_0x65.html   |   141 +
 lib/Random123-1.08/docs/html/functions_0x66.html   |   136 +
 lib/Random123-1.08/docs/html/functions_0x67.html   |   114 +
 lib/Random123-1.08/docs/html/functions_0x69.html   |   141 +
 lib/Random123-1.08/docs/html/functions_0x6b.html   |   131 +
 lib/Random123-1.08/docs/html/functions_0x6d.html   |   125 +
 lib/Random123-1.08/docs/html/functions_0x6f.html   |   185 +
 lib/Random123-1.08/docs/html/functions_0x70.html   |   119 +
 lib/Random123-1.08/docs/html/functions_0x72.html   |   190 +
 lib/Random123-1.08/docs/html/functions_0x73.html   |   169 +
 lib/Random123-1.08/docs/html/functions_0x75.html   |   128 +
 lib/Random123-1.08/docs/html/functions_0x76.html   |   131 +
 lib/Random123-1.08/docs/html/functions_eval.html   |    96 +
 lib/Random123-1.08/docs/html/functions_func.html   |   117 +
 .../docs/html/functions_func_0x62.html             |   139 +
 .../docs/html/functions_func_0x63.html             |   150 +
 .../docs/html/functions_func_0x64.html             |   119 +
 .../docs/html/functions_func_0x65.html             |   135 +
 .../docs/html/functions_func_0x66.html             |   131 +
 .../docs/html/functions_func_0x67.html             |   109 +
 .../docs/html/functions_func_0x69.html             |   125 +
 .../docs/html/functions_func_0x6d.html             |   117 +
 .../docs/html/functions_func_0x6f.html             |   172 +
 .../docs/html/functions_func_0x72.html             |   149 +
 .../docs/html/functions_func_0x73.html             |   142 +
 lib/Random123-1.08/docs/html/functions_rela.html   |    97 +
 lib/Random123-1.08/docs/html/functions_type.html   |   328 +
 lib/Random123-1.08/docs/html/functions_vars.html   |   190 +
 lib/Random123-1.08/docs/html/globals.html          |   464 +
 lib/Random123-1.08/docs/html/globals_defs.html     |   131 +
 lib/Random123-1.08/docs/html/globals_enum.html     |   119 +
 lib/Random123-1.08/docs/html/globals_eval.html     |   119 +
 lib/Random123-1.08/docs/html/globals_func.html     |   244 +
 lib/Random123-1.08/docs/html/globals_type.html     |   205 +
 lib/Random123-1.08/docs/html/group__AESNI.html     |   647 ++
 lib/Random123-1.08/docs/html/group__PhiloxNxW.html |   238 +
 .../docs/html/group__ThreefryNxW.html              |   239 +
 lib/Random123-1.08/docs/html/group__arrayNxW.html  |    88 +
 lib/Random123-1.08/docs/html/gsl__cbrng_8h.html    |   126 +
 .../docs/html/gsl__cbrng_8h_source.html            |   174 +
 lib/Random123-1.08/docs/html/gsl__microrng_8h.html |   137 +
 .../docs/html/gsl__microrng_8h_source.html         |   171 +
 lib/Random123-1.08/docs/html/hierarchy.html        |   111 +
 lib/Random123-1.08/docs/html/index.html            |   244 +
 lib/Random123-1.08/docs/html/installdox            |   117 +
 lib/Random123-1.08/docs/html/main_8dox.html        |    77 +
 lib/Random123-1.08/docs/html/modules.html          |    75 +
 lib/Random123-1.08/docs/html/namespacemembers.html |   136 +
 .../docs/html/namespacemembers_type.html           |   136 +
 lib/Random123-1.08/docs/html/namespacer123.html    |   275 +
 lib/Random123-1.08/docs/html/namespaces.html       |    78 +
 lib/Random123-1.08/docs/html/nav_f.png             |   Bin 0 -> 159 bytes
 lib/Random123-1.08/docs/html/nav_h.png             |   Bin 0 -> 97 bytes
 lib/Random123-1.08/docs/html/open.png              |   Bin 0 -> 118 bytes
 lib/Random123-1.08/docs/html/pages.html            |    81 +
 lib/Random123-1.08/docs/html/philox_8h.html        |   617 ++
 lib/Random123-1.08/docs/html/philox_8h_source.html |   460 +
 lib/Random123-1.08/docs/html/porting.html          |   165 +
 .../docs/html/releasenotes_8dox.html               |    77 +
 lib/Random123-1.08/docs/html/search/all_5f.html    |    44 +
 lib/Random123-1.08/docs/html/search/all_61.html    |   344 +
 lib/Random123-1.08/docs/html/search/all_62.html    |    88 +
 lib/Random123-1.08/docs/html/search/all_63.html    |   201 +
 lib/Random123-1.08/docs/html/search/all_64.html    |    67 +
 lib/Random123-1.08/docs/html/search/all_65.html    |    98 +
 lib/Random123-1.08/docs/html/search/all_66.html    |    67 +
 lib/Random123-1.08/docs/html/search/all_67.html    |    54 +
 lib/Random123-1.08/docs/html/search/all_68.html    |    26 +
 lib/Random123-1.08/docs/html/search/all_69.html    |    68 +
 lib/Random123-1.08/docs/html/search/all_6b.html    |    54 +
 lib/Random123-1.08/docs/html/search/all_6c.html    |    25 +
 lib/Random123-1.08/docs/html/search/all_6d.html    |    67 +
 lib/Random123-1.08/docs/html/search/all_6f.html    |   204 +
 lib/Random123-1.08/docs/html/search/all_70.html    |   245 +
 lib/Random123-1.08/docs/html/search/all_72.html    |   301 +
 lib/Random123-1.08/docs/html/search/all_73.html    |   116 +
 lib/Random123-1.08/docs/html/search/all_74.html    |   233 +
 lib/Random123-1.08/docs/html/search/all_75.html    |    48 +
 lib/Random123-1.08/docs/html/search/all_76.html    |    53 +
 .../docs/html/search/classes_61.html               |    61 +
 .../docs/html/search/classes_65.html               |    26 +
 .../docs/html/search/classes_6d.html               |    26 +
 .../docs/html/search/classes_70.html               |    44 +
 .../docs/html/search/classes_72.html               |    76 +
 .../docs/html/search/classes_74.html               |    44 +
 lib/Random123-1.08/docs/html/search/close.png      |   Bin 0 -> 273 bytes
 .../docs/html/search/defines_61.html               |    50 +
 .../docs/html/search/defines_67.html               |    32 +
 .../docs/html/search/defines_70.html               |    44 +
 .../docs/html/search/defines_72.html               |    26 +
 .../docs/html/search/defines_74.html               |    44 +
 lib/Random123-1.08/docs/html/search/enums_72.html  |    92 +
 .../docs/html/search/enumvalues_61.html            |    44 +
 .../docs/html/search/enumvalues_70.html            |    44 +
 .../docs/html/search/enumvalues_73.html            |    36 +
 .../docs/html/search/enumvalues_74.html            |    44 +
 lib/Random123-1.08/docs/html/search/files_61.html  |    35 +
 lib/Random123-1.08/docs/html/search/files_63.html  |    30 +
 lib/Random123-1.08/docs/html/search/files_65.html  |    25 +
 lib/Random123-1.08/docs/html/search/files_67.html  |    30 +
 lib/Random123-1.08/docs/html/search/files_6c.html  |    25 +
 lib/Random123-1.08/docs/html/search/files_6d.html  |    30 +
 lib/Random123-1.08/docs/html/search/files_70.html  |    25 +
 lib/Random123-1.08/docs/html/search/files_72.html  |    35 +
 lib/Random123-1.08/docs/html/search/files_73.html  |    25 +
 lib/Random123-1.08/docs/html/search/files_74.html  |    25 +
 .../docs/html/search/functions_5f.html             |    26 +
 .../docs/html/search/functions_61.html             |   115 +
 .../docs/html/search/functions_62.html             |    70 +
 .../docs/html/search/functions_63.html             |    90 +
 .../docs/html/search/functions_64.html             |    51 +
 .../docs/html/search/functions_65.html             |    75 +
 .../docs/html/search/functions_66.html             |    67 +
 .../docs/html/search/functions_67.html             |    32 +
 .../docs/html/search/functions_68.html             |    26 +
 .../docs/html/search/functions_69.html             |    52 +
 .../docs/html/search/functions_6d.html             |    45 +
 .../docs/html/search/functions_6f.html             |   200 +
 .../docs/html/search/functions_70.html             |    68 +
 .../docs/html/search/functions_72.html             |    87 +
 .../docs/html/search/functions_73.html             |    79 +
 .../docs/html/search/functions_74.html             |    92 +
 lib/Random123-1.08/docs/html/search/mag_sel.png    |   Bin 0 -> 563 bytes
 .../docs/html/search/namespaces_72.html            |    25 +
 lib/Random123-1.08/docs/html/search/nomatches.html |    12 +
 .../docs/html/search/related_6f.html               |    44 +
 lib/Random123-1.08/docs/html/search/search.css     |   240 +
 lib/Random123-1.08/docs/html/search/search.js      |   746 ++
 lib/Random123-1.08/docs/html/search/search_l.png   |   Bin 0 -> 604 bytes
 lib/Random123-1.08/docs/html/search/search_m.png   |   Bin 0 -> 158 bytes
 lib/Random123-1.08/docs/html/search/search_r.png   |   Bin 0 -> 612 bytes
 .../docs/html/search/typedefs_61.html              |   152 +
 .../docs/html/search/typedefs_62.html              |    26 +
 .../docs/html/search/typedefs_63.html              |   115 +
 .../docs/html/search/typedefs_64.html              |    36 +
 .../docs/html/search/typedefs_65.html              |    26 +
 .../docs/html/search/typedefs_69.html              |    36 +
 .../docs/html/search/typedefs_6b.html              |    42 +
 .../docs/html/search/typedefs_70.html              |   132 +
 .../docs/html/search/typedefs_72.html              |    61 +
 .../docs/html/search/typedefs_73.html              |    36 +
 .../docs/html/search/typedefs_74.html              |   116 +
 .../docs/html/search/typedefs_75.html              |    42 +
 .../docs/html/search/typedefs_76.html              |    36 +
 .../docs/html/search/variables_5f.html             |    38 +
 .../docs/html/search/variables_62.html             |    32 +
 .../docs/html/search/variables_63.html             |    26 +
 .../docs/html/search/variables_65.html             |    26 +
 .../docs/html/search/variables_6b.html             |    32 +
 .../docs/html/search/variables_6d.html             |    26 +
 .../docs/html/search/variables_72.html             |    39 +
 .../docs/html/search/variables_75.html             |    26 +
 .../docs/html/search/variables_76.html             |    37 +
 lib/Random123-1.08/docs/html/sse_8h.html           |   527 +
 lib/Random123-1.08/docs/html/sse_8h_source.html    |   355 +
 .../html/structaesni1xm128i__key__t-members.html   |    84 +
 .../docs/html/structaesni1xm128i__key__t.html      |   208 +
 .../docs/html/structr123_1_1AESNI1xm128i.html      |   207 +
 .../docs/html/structr123_1_1AESNI1xm128i.png       |   Bin 0 -> 645 bytes
 .../docs/html/structr123_1_1AESNI1xm128i__R.html   |   109 +
 .../docs/html/structr123_1_1AESNI1xm128i__R.png    |   Bin 0 -> 641 bytes
 .../docs/html/structr123_1_1AESNI4x32-members.html |    83 +
 .../docs/html/structr123_1_1AESNI4x32.html         |   198 +
 .../docs/html/structr123_1_1AESNI4x32.png          |   Bin 0 -> 631 bytes
 .../docs/html/structr123_1_1AESNI4x32__R.html      |   104 +
 .../docs/html/structr123_1_1AESNI4x32__R.png       |   Bin 0 -> 625 bytes
 .../docs/html/structr123_1_1ARS1xm128i__R.html     |   212 +
 .../docs/html/structr123_1_1ARS4x32__R.html        |   205 +
 .../docs/html/structr123_1_1Engine-members.html    |   117 +
 .../docs/html/structr123_1_1Engine.html            |   922 ++
 .../docs/html/structr123_1_1Philox2x32__R.html     |   209 +
 .../docs/html/structr123_1_1Philox2x64__R.html     |   209 +
 .../docs/html/structr123_1_1Philox4x32__R.html     |   209 +
 .../docs/html/structr123_1_1Philox4x64__R.html     |   209 +
 .../html/structr123_1_1ReinterpretCtr-members.html |    83 +
 .../docs/html/structr123_1_1ReinterpretCtr.html    |   203 +
 .../docs/html/structr123_1_1Threefry2x32__R.html   |   209 +
 .../docs/html/structr123_1_1Threefry2x64__R.html   |   209 +
 .../docs/html/structr123_1_1Threefry4x32__R.html   |   209 +
 .../docs/html/structr123_1_1Threefry4x64__R.html   |   209 +
 .../docs/html/structr123array16x8-members.html     |   123 +
 .../docs/html/structr123array16x8.html             |   892 ++
 .../docs/html/structr123array1x32-members.html     |   123 +
 .../docs/html/structr123array1x32.html             |   892 ++
 .../docs/html/structr123array1x64-members.html     |   123 +
 .../docs/html/structr123array1x64.html             |   892 ++
 .../docs/html/structr123array1xm128i-members.html  |   123 +
 .../docs/html/structr123array1xm128i.html          |   892 ++
 .../docs/html/structr123array2x32-members.html     |   123 +
 .../docs/html/structr123array2x32.html             |   892 ++
 .../docs/html/structr123array2x64-members.html     |   123 +
 .../docs/html/structr123array2x64.html             |   892 ++
 .../docs/html/structr123array4x32-members.html     |   123 +
 .../docs/html/structr123array4x32.html             |   892 ++
 .../docs/html/structr123array4x64-members.html     |   123 +
 .../docs/html/structr123array4x64.html             |   892 ++
 .../docs/html/structr123array8x32-members.html     |   123 +
 .../docs/html/structr123array8x32.html             |   892 ++
 .../docs/html/structr123m128i-members.html         |    83 +
 lib/Random123-1.08/docs/html/structr123m128i.html  |   183 +
 lib/Random123-1.08/docs/html/tab_a.png             |   Bin 0 -> 140 bytes
 lib/Random123-1.08/docs/html/tab_b.png             |   Bin 0 -> 178 bytes
 lib/Random123-1.08/docs/html/tab_h.png             |   Bin 0 -> 192 bytes
 lib/Random123-1.08/docs/html/tab_s.png             |   Bin 0 -> 189 bytes
 lib/Random123-1.08/docs/html/tabs.css              |    59 +
 lib/Random123-1.08/docs/html/threefry_8h.html      |   728 ++
 .../docs/html/threefry_8h_source.html              |   839 ++
 lib/Random123-1.08/docs/main.dox                   |   343 +
 lib/Random123-1.08/docs/releasenotes.dox           |   125 +
 lib/Random123-1.08/examples/BUILD.LOG              |    35 +
 lib/Random123-1.08/examples/BUILDVC.BAT            |    50 +
 lib/Random123-1.08/examples/BUILDVC11.BAT          |     6 +
 lib/Random123-1.08/examples/GNUmakefile            |   133 +
 lib/Random123-1.08/examples/README                 |   196 +
 lib/Random123-1.08/examples/boxmuller.hpp          |   135 +
 lib/Random123-1.08/examples/gencl.sh               |    50 +
 lib/Random123-1.08/examples/kat.h                  |    67 +
 lib/Random123-1.08/examples/kat_c.c                |    41 +
 lib/Random123-1.08/examples/kat_cpp.cpp            |   209 +
 lib/Random123-1.08/examples/kat_cuda.cu            |    63 +
 lib/Random123-1.08/examples/kat_dev_execute.h      |    45 +
 lib/Random123-1.08/examples/kat_main.h             |   292 +
 lib/Random123-1.08/examples/kat_opencl.c           |   101 +
 lib/Random123-1.08/examples/kat_opencl_kernel.ocl  |    38 +
 lib/Random123-1.08/examples/kat_vectors            |    83 +
 lib/Random123-1.08/examples/old_kat_vectors        |  5339 ++++++++++
 lib/Random123-1.08/examples/pi_aes.cpp             |    83 +
 lib/Random123-1.08/examples/pi_capi.c              |    78 +
 lib/Random123-1.08/examples/pi_check.h             |    67 +
 lib/Random123-1.08/examples/pi_cppapi.cpp          |    78 +
 lib/Random123-1.08/examples/pi_cuda.cu             |   119 +
 lib/Random123-1.08/examples/pi_cudapp.cu           |   125 +
 lib/Random123-1.08/examples/pi_gsl.c               |    67 +
 lib/Random123-1.08/examples/pi_microurng.cpp       |   108 +
 lib/Random123-1.08/examples/pi_opencl.c            |    92 +
 lib/Random123-1.08/examples/pi_opencl_kernel.ocl   |    71 +
 lib/Random123-1.08/examples/pi_uniform.cpp         |   136 +
 lib/Random123-1.08/examples/rngNxW.h               |    46 +
 lib/Random123-1.08/examples/simple.c               |    52 +
 lib/Random123-1.08/examples/simplepp.cpp           |    47 +
 lib/Random123-1.08/examples/time_boxmuller.cpp     |   132 +
 lib/Random123-1.08/examples/time_boxmuller_cuda.cu |   181 +
 lib/Random123-1.08/examples/time_cuda.cu           |   175 +
 lib/Random123-1.08/examples/time_initkeyctr.h      |    99 +
 lib/Random123-1.08/examples/time_misc.h            |    53 +
 lib/Random123-1.08/examples/time_opencl.c          |   199 +
 lib/Random123-1.08/examples/time_opencl_kernel.ocl |    35 +
 lib/Random123-1.08/examples/time_random123.h       |   135 +
 lib/Random123-1.08/examples/time_serial.c          |   154 +
 lib/Random123-1.08/examples/time_thread.c          |   240 +
 lib/Random123-1.08/examples/timers.cpp             |   238 +
 lib/Random123-1.08/examples/u01fixedpt.h           |   197 +
 lib/Random123-1.08/examples/ua.hpp                 |   101 +
 lib/Random123-1.08/examples/uniform.hpp            |   210 +
 lib/Random123-1.08/examples/ut_Engine.cpp          |   240 +
 lib/Random123-1.08/examples/ut_M128.cpp            |   149 +
 lib/Random123-1.08/examples/ut_ReinterpretCtr.cpp  |    47 +
 lib/Random123-1.08/examples/ut_aes.cpp             |   106 +
 lib/Random123-1.08/examples/ut_ars.c               |    82 +
 lib/Random123-1.08/examples/ut_carray.cpp          |   317 +
 lib/Random123-1.08/examples/ut_features.cpp        |   454 +
 lib/Random123-1.08/examples/ut_gsl.c               |   112 +
 lib/Random123-1.08/examples/ut_ua.cpp              |    63 +
 lib/Random123-1.08/examples/ut_uniform.cpp         |   167 +
 lib/Random123-1.08/examples/ut_uniform_IEEEkat.cpp |   293 +
 .../examples/ut_uniform_IEEEkatvectors.hpp         |  2605 +++++
 .../examples/ut_uniform_kat_vectors.dat            |  2604 +++++
 .../examples/ut_uniform_reference.hpp              |    19 +
 lib/Random123-1.08/examples/util.h                 |   291 +
 lib/Random123-1.08/examples/util_cpu.h             |   198 +
 lib/Random123-1.08/examples/util_cuda.h            |   116 +
 lib/Random123-1.08/examples/util_demangle.hpp      |    75 +
 lib/Random123-1.08/examples/util_expandtpl.h       |    77 +
 lib/Random123-1.08/examples/util_m128.h            |    87 +
 lib/Random123-1.08/examples/util_opencl.h          |   337 +
 lib/Random123-1.08/examples/util_print.h           |    58 +
 lib/Random123-1.08/include/Random123/MicroURNG.hpp |   146 +
 .../include/Random123/ReinterpretCtr.hpp           |    88 +
 lib/Random123-1.08/include/Random123/aes.h         |   344 +
 lib/Random123-1.08/include/Random123/array.h       |   326 +
 lib/Random123-1.08/include/Random123/ars.h         |   204 +
 .../include/Random123/conventional/Engine.hpp      |   250 +
 .../include/Random123/conventional/gsl_cbrng.h     |   128 +
 .../include/Random123/features/clangfeatures.h     |    76 +
 .../include/Random123/features/compilerfeatures.h  |   320 +
 .../include/Random123/features/gccfeatures.h       |   247 +
 .../include/Random123/features/iccfeatures.h       |   208 +
 .../include/Random123/features/msvcfeatures.h      |   200 +
 .../include/Random123/features/nvccfeatures.h      |   110 +
 .../include/Random123/features/open64features.h    |    50 +
 .../include/Random123/features/openclfeatures.h    |    89 +
 .../include/Random123/features/pgccfeatures.h      |   194 +
 .../include/Random123/features/sse.h               |   280 +
 .../include/Random123/features/sunprofeatures.h    |   172 +
 .../include/Random123/features/xlcfeatures.h       |   202 +
 .../include/Random123/gsl_microrng.h               |   136 +
 lib/Random123-1.08/include/Random123/philox.h      |   486 +
 lib/Random123-1.08/include/Random123/threefry.h    |   864 ++
 lib/ncl-2.1.18/AUTHORS                             |    32 +
 lib/ncl-2.1.18/BSDLicense.txt                      |    24 +
 lib/ncl-2.1.18/COPYING                             |   280 +
 lib/ncl-2.1.18/ChangeLog                           |   380 +
 lib/ncl-2.1.18/INSTALL                             |    70 +
 lib/ncl-2.1.18/Jamroot                             |    53 +
 lib/ncl-2.1.18/Makefile.am                         |     8 +
 lib/ncl-2.1.18/NEWS                                |    35 +
 lib/ncl-2.1.18/README                              |    28 +
 lib/ncl-2.1.18/config.h                            |   102 +
 lib/ncl-2.1.18/config/libtool.m4                   |  7983 +++++++++++++++
 lib/ncl-2.1.18/config/ltmain.sh                    |  9661 +++++++++++++++++
 lib/ncl-2.1.18/config/ltoptions.m4                 |   384 +
 lib/ncl-2.1.18/config/ltversion.m4                 |    23 +
 lib/ncl-2.1.18/config/lt~obsolete.m4               |    98 +
 lib/ncl-2.1.18/configure.ac                        |   188 +
 lib/ncl-2.1.18/libtool                             | 10246 +++++++++++++++++++
 lib/ncl-2.1.18/ncl/Makefile.am                     |    51 +
 lib/ncl-2.1.18/ncl/libncl.la                       |    41 +
 lib/ncl-2.1.18/ncl/ncl.h                           |    97 +
 lib/ncl-2.1.18/ncl/nxsallocatematrix.h             |   253 +
 lib/ncl-2.1.18/ncl/nxsassumptionsblock.cpp         |  2807 +++++
 lib/ncl-2.1.18/ncl/nxsassumptionsblock.h           |   391 +
 lib/ncl-2.1.18/ncl/nxsassumptionsblock.lo          |    12 +
 lib/ncl-2.1.18/ncl/nxsblock.cpp                    |   641 ++
 lib/ncl-2.1.18/ncl/nxsblock.h                      |   366 +
 lib/ncl-2.1.18/ncl/nxsblock.lo                     |    12 +
 lib/ncl-2.1.18/ncl/nxscdiscretematrix.h            |   113 +
 lib/ncl-2.1.18/ncl/nxscharactersblock.cpp          |  5422 ++++++++++
 lib/ncl-2.1.18/ncl/nxscharactersblock.h            |  2073 ++++
 lib/ncl-2.1.18/ncl/nxscharactersblock.lo           |    12 +
 lib/ncl-2.1.18/ncl/nxscxxdiscretematrix.cpp        |   512 +
 lib/ncl-2.1.18/ncl/nxscxxdiscretematrix.h          |   264 +
 lib/ncl-2.1.18/ncl/nxscxxdiscretematrix.lo         |    12 +
 lib/ncl-2.1.18/ncl/nxsdatablock.cpp                |    63 +
 lib/ncl-2.1.18/ncl/nxsdatablock.h                  |    69 +
 lib/ncl-2.1.18/ncl/nxsdatablock.lo                 |    12 +
 lib/ncl-2.1.18/ncl/nxsdefs.h                       |   108 +
 lib/ncl-2.1.18/ncl/nxsdiscretedatum.h              |    58 +
 lib/ncl-2.1.18/ncl/nxsdistancedatum.h              |    42 +
 lib/ncl-2.1.18/ncl/nxsdistancesblock.cpp           |   714 ++
 lib/ncl-2.1.18/ncl/nxsdistancesblock.h             |   197 +
 lib/ncl-2.1.18/ncl/nxsdistancesblock.lo            |    12 +
 lib/ncl-2.1.18/ncl/nxsexception.cpp                |   106 +
 lib/ncl-2.1.18/ncl/nxsexception.h                  |    97 +
 lib/ncl-2.1.18/ncl/nxsexception.lo                 |    12 +
 lib/ncl-2.1.18/ncl/nxsmultiformat.cpp              |  1597 +++
 lib/ncl-2.1.18/ncl/nxsmultiformat.h                |   260 +
 lib/ncl-2.1.18/ncl/nxsmultiformat.lo               |    12 +
 lib/ncl-2.1.18/ncl/nxspublicblocks.cpp             |   808 ++
 lib/ncl-2.1.18/ncl/nxspublicblocks.h               |   731 ++
 lib/ncl-2.1.18/ncl/nxspublicblocks.lo              |    12 +
 lib/ncl-2.1.18/ncl/nxsreader.cpp                   |  1396 +++
 lib/ncl-2.1.18/ncl/nxsreader.h                     |   612 ++
 lib/ncl-2.1.18/ncl/nxsreader.lo                    |    12 +
 lib/ncl-2.1.18/ncl/nxssetreader.cpp                |   536 +
 lib/ncl-2.1.18/ncl/nxssetreader.h                  |   104 +
 lib/ncl-2.1.18/ncl/nxssetreader.lo                 |    12 +
 lib/ncl-2.1.18/ncl/nxsstring.cpp                   |  1041 ++
 lib/ncl-2.1.18/ncl/nxsstring.h                     |   742 ++
 lib/ncl-2.1.18/ncl/nxsstring.lo                    |    12 +
 lib/ncl-2.1.18/ncl/nxstaxaassociationblock.cpp     |   237 +
 lib/ncl-2.1.18/ncl/nxstaxaassociationblock.h       |   139 +
 lib/ncl-2.1.18/ncl/nxstaxaassociationblock.lo      |    12 +
 lib/ncl-2.1.18/ncl/nxstaxablock.cpp                |   634 ++
 lib/ncl-2.1.18/ncl/nxstaxablock.h                  |   484 +
 lib/ncl-2.1.18/ncl/nxstaxablock.lo                 |    12 +
 lib/ncl-2.1.18/ncl/nxstoken.cpp                    |  1058 ++
 lib/ncl-2.1.18/ncl/nxstoken.h                      |   874 ++
 lib/ncl-2.1.18/ncl/nxstoken.lo                     |    12 +
 lib/ncl-2.1.18/ncl/nxstreesblock.cpp               |  2045 ++++
 lib/ncl-2.1.18/ncl/nxstreesblock.h                 |   983 ++
 lib/ncl-2.1.18/ncl/nxstreesblock.lo                |    12 +
 lib/ncl-2.1.18/ncl/nxsunalignedblock.cpp           |   917 ++
 lib/ncl-2.1.18/ncl/nxsunalignedblock.h             |   332 +
 lib/ncl-2.1.18/ncl/nxsunalignedblock.lo            |    12 +
 lib/ncl-2.1.18/ncl/nxsutilcopy.h                   |   264 +
 lib/ncl-2.1.18/nclv2.1.pc                          |    12 +
 lib/ncl-2.1.18/nclv2.1.pc.in                       |    12 +
 lib/pll/alignment.c                                |   697 ++
 lib/pll/avxLikelihood.c                            |  4106 ++++++++
 lib/pll/bipartitionList.c                          |   434 +
 lib/pll/cycle.h                                    |   516 +
 lib/pll/errcodes.h                                 |    69 +
 lib/pll/evaluateGenericSpecial.c                   |  3284 ++++++
 lib/pll/evaluatePartialGenericSpecial.c            |  1225 +++
 lib/pll/fastDNAparsimony.c                         |  1937 ++++
 lib/pll/genericParallelization.c                   |  2182 ++++
 lib/pll/genericParallelization.h                   |   123 +
 lib/pll/globalVariables.h                          |   173 +
 lib/pll/hardware.c                                 |   150 +
 lib/pll/hardware.h                                 |    48 +
 lib/pll/hash.c                                     |   219 +
 lib/pll/hash.h                                     |    50 +
 lib/pll/lexer.c                                    |   299 +
 lib/pll/lexer.h                                    |    88 +
 lib/pll/makenewzGenericSpecial.c                   |  3090 ++++++
 lib/pll/mem_alloc.c                                |   228 +
 lib/pll/mem_alloc.h                                |    41 +
 lib/pll/mic_native.h                               |    56 +
 lib/pll/mic_native_aa.c                            |  1254 +++
 lib/pll/mic_native_dna.c                           |   676 ++
 lib/pll/models.c                                   |  4311 ++++++++
 lib/pll/newick.c                                   |   592 ++
 lib/pll/newick.h                                   |    61 +
 lib/pll/newviewGenericSpecial.c                    |  8738 ++++++++++++++++
 lib/pll/optimizeModel.c                            |  2715 +++++
 lib/pll/parsePartition.c                           |   394 +
 lib/pll/parsePartition.h                           |    51 +
 lib/pll/parsimony.c                                |   878 ++
 lib/pll/pll-renamed.h                              |  1673 +++
 lib/pll/pllInternal.h                              |   263 +
 lib/pll/queue.c                                    |    96 +
 lib/pll/queue.h                                    |    48 +
 lib/pll/randomTree.c                               |   177 +
 lib/pll/recom.c                                    |   688 ++
 lib/pll/restartHashTable.c                         |   357 +
 lib/pll/searchAlgo.c                               |  3295 ++++++
 lib/pll/ssort.c                                    |   121 +
 lib/pll/stack.c                                    |    85 +
 lib/pll/stack.h                                    |    48 +
 lib/pll/topologies.c                               |   782 ++
 lib/pll/trash.c                                    |   129 +
 lib/pll/treeIO.c                                   |   238 +
 lib/pll/treeIO.h                                   |    23 +
 lib/pll/utils.c                                    |  3720 +++++++
 m4/ax_cxx_compile_stdcxx_11.m4                     |   136 +
 m4/ax_ext.m4                                       |   213 +
 m4/lx_find_mpi.m4                                  |   255 +
 manual/manual.org                                  |  1526 +++
 manual/process.sh                                  |    45 +
 runtests.sh                                        |     7 +
 src.am                                             |     4 +
 src/README.dox                                     |    45 +
 src/TreePrinter.cpp                                |   110 +
 src/TreePrinter.hpp                                |    30 +
 src/TreeRandomizer.cpp                             |   312 +
 src/TreeRandomizer.hpp                             |    55 +
 src/apps/README.txt                                |     2 +
 src/apps/consense.cpp                              |   198 +
 src/apps/credibleSet.cpp                           |   136 +
 src/apps/exabayes.cpp                              |   282 +
 src/apps/extractBips.cpp                           |   152 +
 src/apps/parser.cpp                                |   138 +
 src/apps/postProcParam.cpp                         |   369 +
 src/apps/sdsf.cpp                                  |   203 +
 src/avxConditional.c                               |    17 +
 src/branches/BranchBackup.cpp                      |    75 +
 src/branches/BranchBackup.hpp                      |    32 +
 src/branches/BranchLengthOptimizer.cpp             |   128 +
 src/branches/BranchLengthOptimizer.hpp             |    35 +
 src/branches/BranchSetProposer.cpp                 |   174 +
 src/branches/BranchSetProposer.hpp                 |    32 +
 src/branches/ComplexTuner.cpp                      |    65 +
 src/branches/ComplexTuner.hpp                      |    64 +
 src/branches/DistributionProposer.hpp              |    62 +
 src/branches/GammaProposer.cpp                     |    73 +
 src/branches/GammaProposer.hpp                     |    46 +
 src/branches/OptimizedParameter.cpp                |   187 +
 src/branches/OptimizedParameter.hpp                |   109 +
 src/branches/README.txt                            |     2 +
 src/branches/TreeTraverser.cpp                     |   130 +
 src/branches/TreeTraverser.hpp                     |    66 +
 src/branches/TreeTraverser.tpp                     |   103 +
 src/branches/WeibullProposer.cpp                   |    82 +
 src/branches/WeibullProposer.hpp                   |    48 +
 src/comm/AbstractPendingSwap.hpp                   |    43 +
 src/comm/CommCommon.hpp                            |    58 +
 src/comm/CommCore.hpp                              |    67 +
 src/comm/CommCoreNew.hpp                           |   138 +
 src/comm/CommFlag.hpp                              |    17 +
 src/comm/CommRequest.cpp                           |    53 +
 src/comm/CommRequest.hpp                           |    36 +
 src/comm/Communicator.cpp                          |   159 +
 src/comm/Communicator.hpp                          |    56 +
 src/comm/Communicator.tpp                          |   158 +
 src/comm/IncompleteMesh.cpp                        |   169 +
 src/comm/IncompleteMesh.hpp                        |    54 +
 src/comm/LocalComm.cpp                             |   247 +
 src/comm/LocalComm.hpp                             |    92 +
 src/comm/LocalComm.tpp                             |   324 +
 src/comm/LocalSwap.cpp                             |    63 +
 src/comm/LocalSwap.hpp                             |    38 +
 src/comm/ParallelSetup.cpp                         |   601 ++
 src/comm/ParallelSetup.hpp                         |   144 +
 src/comm/PendingSwap.cpp                           |    70 +
 src/comm/PendingSwap.hpp                           |    54 +
 src/comm/RemoteComm.cpp                            |   207 +
 src/comm/RemoteComm.hpp                            |    48 +
 src/comm/SwapElem.cpp                              |    75 +
 src/comm/SwapElem.hpp                              |    38 +
 src/comm/dummy/CommMethods.hpp                     |     0
 src/comm/dummy/CommRequestImpl.cpp                 |    25 +
 src/comm/dummy/CommRequestImpl.hpp                 |    21 +
 src/comm/dummy/PendingSwapImpl.cpp                 |    30 +
 src/comm/dummy/PendingSwapImpl.hpp                 |    23 +
 src/comm/dummy/RemoteCommImpl.cpp                  |    81 +
 src/comm/dummy/RemoteCommImpl.hpp                  |    50 +
 src/comm/dummy/RemoteCommImpl.tpp                  |    58 +
 src/comm/mpi/CommRequestImpl.cpp                   |    31 +
 src/comm/mpi/CommRequestImpl.hpp                   |    33 +
 src/comm/mpi/MpiType.cpp                           |    50 +
 src/comm/mpi/MpiType.hpp                           |    33 +
 src/comm/mpi/PendingSwapImpl.cpp                   |   100 +
 src/comm/mpi/PendingSwapImpl.hpp                   |    27 +
 src/comm/mpi/RemoteCommImpl.cpp                    |   216 +
 src/comm/mpi/RemoteCommImpl.hpp                    |    48 +
 src/comm/mpi/RemoteCommImpl.tpp                    |   108 +
 src/comm/threads/MessageQueue.cpp                  |    94 +
 src/comm/threads/MessageQueue.hpp                  |    74 +
 src/comm/threads/MessageQueue.tpp                  |    71 +
 src/comm/threads/MessageQueueSingle.cpp            |    72 +
 src/comm/threads/MessageQueueSingle.hpp            |    58 +
 src/comm/threads/MessageQueueSingle.tpp            |    50 +
 src/comm/threads/ThreadResource.cpp                |   107 +
 src/comm/threads/ThreadResource.hpp                |    64 +
 src/comm/threads/threadDefs.hpp                    |     8 +
 src/common.h                                       |    76 +
 src/config/BlockParams.cpp                         |   138 +
 src/config/BlockParams.hpp                         |    39 +
 src/config/BlockPrior.cpp                          |   265 +
 src/config/BlockPrior.hpp                          |    48 +
 src/config/BlockProposalConfig.cpp                 |   117 +
 src/config/BlockProposalConfig.hpp                 |    53 +
 src/config/BlockRunParameters.cpp                  |   186 +
 src/config/BlockRunParameters.hpp                  |    69 +
 src/config/CommandLine.cpp                         |   324 +
 src/config/CommandLine.hpp                         |    81 +
 src/config/ConfigReader.hpp                        |    30 +
 src/config/ExaBlock.cpp                            |    59 +
 src/config/ExaBlock.hpp                            |    16 +
 src/config/MemoryMode.cpp                          |    26 +
 src/config/MemoryMode.hpp                          |    16 +
 src/config/README.txt                              |     2 +
 src/contrib/AlignmentPLL.cpp                       |   461 +
 src/contrib/AlignmentPLL.hpp                       |    51 +
 src/contrib/BipartitionExtractor.cpp               |   409 +
 src/contrib/BipartitionExtractor.hpp               |    42 +
 src/contrib/ConsensusTree.cpp                      |   182 +
 src/contrib/ConsensusTree.hpp                      |    24 +
 src/contrib/CredibleSet.cpp                        |   125 +
 src/contrib/CredibleSet.hpp                        |    19 +
 src/contrib/README.txt                             |     3 +
 src/contrib/SplitFreqAssessor.cpp                  |   167 +
 src/contrib/SplitFreqAssessor.hpp                  |    44 +
 src/data-struct/Bipartition.cpp                    |   327 +
 src/data-struct/Bipartition.hpp                    |   122 +
 src/data-struct/BipartitionHash.cpp                |   136 +
 src/data-struct/BipartitionHash.hpp                |    37 +
 src/data-struct/Path.cpp                           |   195 +
 src/data-struct/Path.hpp                           |    74 +
 src/eval/ArrayOrientation.cpp                      |   171 +
 src/eval/ArrayOrientation.hpp                      |    47 +
 src/eval/ArrayPolicy.hpp                           |    66 +
 src/eval/ArrayReservoir.cpp                        |   107 +
 src/eval/ArrayReservoir.hpp                        |    35 +
 src/eval/ArrayRestorer.cpp                         |   280 +
 src/eval/ArrayRestorer.hpp                         |    61 +
 src/eval/FullCachePolicy.cpp                       |    39 +
 src/eval/FullCachePolicy.hpp                       |    29 +
 src/eval/LikelihoodEvaluator.cpp                   |   684 ++
 src/eval/LikelihoodEvaluator.hpp                   |   123 +
 src/eval/NoCachePolicy.cpp                         |    28 +
 src/eval/NoCachePolicy.hpp                         |    23 +
 src/eval/ParsimonyEvaluator.cpp                    |    62 +
 src/eval/ParsimonyEvaluator.hpp                    |    63 +
 src/eval/PartitionLikelihood.hpp                   |    44 +
 src/eval/README.txt                                |     2 +
 src/file/DiagnosticsFile.cpp                       |   228 +
 src/file/DiagnosticsFile.hpp                       |    32 +
 src/file/OutputFile.cpp                            |    49 +
 src/file/OutputFile.hpp                            |    30 +
 src/file/ParameterFile.cpp                         |   140 +
 src/file/ParameterFile.hpp                         |    35 +
 src/file/README.txt                                |     1 +
 src/file/TopologyFile.cpp                          |   158 +
 src/file/TopologyFile.hpp                          |    31 +
 src/math/Arithmetics.cpp                           |   252 +
 src/math/Arithmetics.hpp                           |    46 +
 src/math/Density.cpp                               |   118 +
 src/math/Density.hpp                               |    32 +
 src/math/Randomness.cpp                            |   264 +
 src/math/Randomness.hpp                            |   163 +
 src/math/brent.cpp                                 |  1532 +++
 src/math/brent.hpp                                 |    60 +
 src/mcmc/Chain.cpp                                 |   801 ++
 src/mcmc/Chain.hpp                                 |   155 +
 src/mcmc/CoupledChains.cpp                         |   550 +
 src/mcmc/CoupledChains.hpp                         |   109 +
 src/mcmc/ParameterList.cpp                         |    66 +
 src/mcmc/ParameterList.hpp                         |    46 +
 src/mcmc/SampleMaster.cpp                          |  1333 +++
 src/mcmc/SampleMaster.hpp                          |   102 +
 src/mcmc/SuccessCounter.cpp                        |   110 +
 src/mcmc/SuccessCounter.hpp                        |    51 +
 src/mcmc/SwapMatrix.cpp                            |   109 +
 src/mcmc/SwapMatrix.hpp                            |    45 +
 src/model/AbstractAlphabet.cpp                     |    42 +
 src/model/AbstractAlphabet.hpp                     |    43 +
 src/model/AminoAcidAlphabet.hpp                    |    19 +
 src/model/BinaryAlphabet.hpp                       |    23 +
 src/model/BranchLength.cpp                         |    14 +
 src/model/BranchLength.hpp                         |    53 +
 src/model/BranchLengthResource.cpp                 |    64 +
 src/model/BranchLengthResource.hpp                 |    67 +
 src/model/BranchLengths.cpp                        |    16 +
 src/model/BranchLengths.hpp                        |    46 +
 src/model/BranchPlain.cpp                          |    50 +
 src/model/BranchPlain.hpp                          |   118 +
 src/model/Category.cpp                             |   223 +
 src/model/Category.hpp                             |    77 +
 src/model/DnaAlphabet.hpp                          |    17 +
 src/model/InternalBranchLength.cpp                 |    30 +
 src/model/InternalBranchLength.hpp                 |    50 +
 src/model/NodeAge.cpp                              |    16 +
 src/model/NodeAge.hpp                              |    33 +
 src/model/Partition.cpp                            |   485 +
 src/model/Partition.hpp                            |   133 +
 src/model/ProtModel.cpp                            |   112 +
 src/model/ProtModel.hpp                            |    64 +
 src/model/RateHelper.cpp                           |   109 +
 src/model/RateHelper.hpp                           |    38 +
 src/model/TreeAln.cpp                              |  1089 ++
 src/model/TreeAln.hpp                              |   309 +
 src/parameters/AbstractParameter.cpp               |    81 +
 src/parameters/AbstractParameter.hpp               |   105 +
 src/parameters/BranchLengthsParameter.cpp          |   114 +
 src/parameters/BranchLengthsParameter.hpp          |    94 +
 src/parameters/DivergenceRates.cpp                 |   171 +
 src/parameters/DivergenceRates.hpp                 |    46 +
 src/parameters/DivergenceTimes.cpp                 |   209 +
 src/parameters/DivergenceTimes.hpp                 |    38 +
 src/parameters/FrequencyParameter.cpp              |   120 +
 src/parameters/FrequencyParameter.hpp              |    43 +
 src/parameters/ParamAttribute.hpp                  |    30 +
 src/parameters/ParameterContent.cpp                |   115 +
 src/parameters/ParameterContent.hpp                |    43 +
 src/parameters/ProtModelParameter.cpp              |    86 +
 src/parameters/ProtModelParameter.hpp              |    34 +
 src/parameters/README.txt                          |     2 +
 src/parameters/RateHetParameter.cpp                |    53 +
 src/parameters/RateHetParameter.hpp                |    28 +
 src/parameters/RevMatParameter.cpp                 |   162 +
 src/parameters/RevMatParameter.hpp                 |    46 +
 src/parameters/TopologyParameter.cpp               |    22 +
 src/parameters/TopologyParameter.hpp               |    28 +
 src/pll.h                                          |    50 +
 src/priors/AbstractPrior.hpp                       |    62 +
 src/priors/DirichletPrior.cpp                      |    40 +
 src/priors/DirichletPrior.hpp                      |    38 +
 src/priors/DiscreteModelPrior.cpp                  |    77 +
 src/priors/DiscreteModelPrior.hpp                  |    32 +
 src/priors/ExponentialPrior.cpp                    |    68 +
 src/priors/ExponentialPrior.hpp                    |    28 +
 src/priors/FixedPrior.cpp                          |   108 +
 src/priors/FixedPrior.hpp                          |    32 +
 src/priors/PriorBelief.cpp                         |   129 +
 src/priors/PriorBelief.hpp                         |    86 +
 src/priors/README.txt                              |     1 +
 src/priors/UniformPrior.cpp                        |    68 +
 src/priors/UniformPrior.hpp                        |    34 +
 src/proposals/AbstractProposal.cpp                 |   222 +
 src/proposals/AbstractProposal.hpp                 |   202 +
 src/proposals/AminoModelJump.cpp                   |   164 +
 src/proposals/AminoModelJump.hpp                   |    67 +
 src/proposals/BranchIntegrator.hpp                 |    39 +
 src/proposals/BranchLengthMultiplier.cpp           |   137 +
 src/proposals/BranchLengthMultiplier.hpp           |    42 +
 src/proposals/ChosenBranchIntegrator.hpp           |    39 +
 src/proposals/DistributionBranchLength.hpp         |    43 +
 src/proposals/DistributionBranchLength.tpp         |   159 +
 src/proposals/DivRateSlider.cpp                    |   240 +
 src/proposals/DivRateSlider.hpp                    |    50 +
 src/proposals/DivTimeProposal.cpp                  |    84 +
 src/proposals/DivTimeProposal.hpp                  |    70 +
 src/proposals/DivTimeSlider.cpp                    |   310 +
 src/proposals/DivTimeSlider.hpp                    |    43 +
 src/proposals/GenericTopoProposal.cpp              |   264 +
 src/proposals/GenericTopoProposal.hpp              |    50 +
 src/proposals/InsertionResult.hpp                  |    34 +
 src/proposals/InsertionScore.hpp                   |    39 +
 src/proposals/MoveEnumeration.cpp                  |   105 +
 src/proposals/MoveEnumeration.hpp                  |    25 +
 src/proposals/NodeSlider.cpp                       |   186 +
 src/proposals/NodeSlider.hpp                       |    40 +
 src/proposals/ParameterProposal.cpp                |   225 +
 src/proposals/ParameterProposal.hpp                |    82 +
 src/proposals/ProposalSet.cpp                      |   113 +
 src/proposals/ProposalSet.hpp                      |    60 +
 src/proposals/ProposalType.cpp                     |   217 +
 src/proposals/ProposalType.hpp                     |    91 +
 src/proposals/README.txt                           |     1 +
 src/proposals/TreeLengthMultiplier.cpp             |   133 +
 src/proposals/TreeLengthMultiplier.hpp             |    33 +
 src/proposals/param-proposers/AbstractProposer.cpp |    74 +
 src/proposals/param-proposers/AbstractProposer.hpp |    37 +
 .../param-proposers/DirichletProposer.cpp          |    47 +
 .../param-proposers/DirichletProposer.hpp          |    35 +
 .../param-proposers/MultiplierProposer.cpp         |    28 +
 .../param-proposers/MultiplierProposer.hpp         |    20 +
 src/proposals/param-proposers/README.txt           |     2 +
 .../param-proposers/RateDirichletProposer.cpp      |    95 +
 .../param-proposers/RateDirichletProposer.hpp      |    24 +
 .../param-proposers/RateSlidingProposer.cpp        |    38 +
 .../param-proposers/RateSlidingProposer.hpp        |    22 +
 src/proposals/param-proposers/SlidingProposer.cpp  |   115 +
 src/proposals/param-proposers/SlidingProposer.hpp  |    33 +
 .../topo-proposers/ExtendedSprProposer.cpp         |   129 +
 .../topo-proposers/ExtendedSprProposer.hpp         |    21 +
 .../topo-proposers/ExtendedTbrProposer.cpp         |   148 +
 .../topo-proposers/ExtendedTbrProposer.hpp         |    37 +
 .../topo-proposers/LikelihoodSprProposer.cpp       |   206 +
 .../topo-proposers/LikelihoodSprProposer.hpp       |    39 +
 src/proposals/topo-proposers/MoveOptMode.cpp       |    29 +
 src/proposals/topo-proposers/MoveOptMode.hpp       |    18 +
 src/proposals/topo-proposers/ParsSprProposer.cpp   |   247 +
 src/proposals/topo-proposers/ParsSprProposer.hpp   |    62 +
 src/proposals/topo-proposers/SprMove.cpp           |   358 +
 src/proposals/topo-proposers/SprMove.hpp           |    58 +
 src/proposals/topo-proposers/StatNniProposer.cpp   |    40 +
 src/proposals/topo-proposers/StatNniProposer.hpp   |    25 +
 src/proposals/topo-proposers/TbrMove.cpp           |   163 +
 src/proposals/topo-proposers/TbrMove.hpp           |    40 +
 src/proposals/topo-proposers/TopoMove.cpp          |     3 +
 src/proposals/topo-proposers/TopoMove.hpp          |    42 +
 src/proposals/topo-proposers/TopoMoveProposer.hpp  |    62 +
 src/system/AlignedAllocator.hpp                    |   165 +
 src/system/BandWidthTest.cpp                       |    56 +
 src/system/BandWidthTest.hpp                       |    16 +
 src/system/BitMask.cpp                             |    11 +
 src/system/BitMask.hpp                             |    21 +
 src/system/BoundsChecker.cpp                       |   172 +
 src/system/BoundsChecker.hpp                       |    35 +
 src/system/ByteFile.cpp                            |   531 +
 src/system/ByteFile.hpp                            |    81 +
 src/system/ByteFile.tpp                            |    41 +
 src/system/FlagType.hpp                            |    44 +
 src/system/GlobalVariables.hpp                     |    81 +
 src/system/NastyGlobalVariables.cpp                |     3 +
 src/system/PartitionAssignment.cpp                 |   405 +
 src/system/PartitionAssignment.hpp                 |    64 +
 src/system/ProposalRegistry.cpp                    |   232 +
 src/system/ProposalRegistry.hpp                    |    40 +
 src/system/RunFactory.cpp                          |   523 +
 src/system/RunFactory.hpp                          |    50 +
 src/system/Serializable.cpp                        |   151 +
 src/system/Serializable.hpp                        |    49 +
 src/system/SyncOut.hpp                             |    42 +
 src/system/TeeStream.hpp                           |    68 +
 src/system/Teebuf.cpp                              |    42 +
 src/system/Teebuf.hpp                              |    24 +
 src/system/TimeTracker.cpp                         |    67 +
 src/system/TimeTracker.hpp                         |    45 +
 src/system/VectAlign.hpp                           |    12 +
 src/system/extensions.cpp                          |    67 +
 src/system/extensions.hpp                          |    83 +
 src/system/log_double.cpp                          |    40 +
 src/system/log_double.hpp                          |   121 +
 src/system/memory.hpp                              |    18 +
 src/tree-parse/BasicTreeReader.cpp                 |   123 +
 src/tree-parse/BasicTreeReader.hpp                 |    38 +
 src/tree-parse/BranchLengthPolicy.hpp              |    43 +
 src/tree-parse/LabelPolicy.hpp                     |    77 +
 src/tree-parse/README.txt                          |     1 +
 src/tree-parse/TreeProcessor.cpp                   |   158 +
 src/tree-parse/TreeProcessor.hpp                   |    31 +
 tests/BipartitionTest.cpp                          |    25 +
 tests/LocalCommTest.cpp                            |   414 +
 tests/MessageQueueTest.cpp                         |    64 +
 tests/PartitionAssignmentTest.cpp                  |   106 +
 tests/Test.cpp                                     |    11 +
 tests/TopLevelInvocation.cpp                       |   373 +
 tests/TreeAlnTest.cpp                              |    30 +
 tests/brentTest.cpp                                |    37 +
 tests/exatest.cpp                                  |    65 +
 utils/automatedBuild.sh                            |    27 +
 utils/build-distro.sh                              |   110 +
 utils/checkBounds.R                                |   109 +
 utils/clangTest.sh                                 |    18 +
 utils/colGrep.sh                                   |    17 +
 utils/compileTest.sh                               |    86 +
 utils/composePage.sh                               |    18 +
 utils/concat-trees.sh                              |    63 +
 utils/createMDSPlot.sh                             |    51 +
 utils/createMDSPlotHelper.R                        |    42 +
 utils/defaultRun.sh                                |   230 +
 utils/distributionPlotter.R                        |    16 +
 utils/extractAllCredSets.py                        |    47 +
 utils/getMapTree.sh                                |    24 +
 utils/getTopologies.sh                             |    39 +
 utils/monitorTemperature.sh                        |    27 +
 utils/plot.R                                       |    24 +
 utils/plotExa.R                                    |    43 +
 utils/plotParamDistribution.sh                     |    26 +
 utils/setupPLLLinks.sh                             |    39 +
 utils/smoketests.sh                                |    46 +
 utils/switchMpi.sh                                 |    23 +
 utils/updateDate.sh                                |    13 +
 utils/updateWebpage.sh                             |    35 +
 881 files changed, 225782 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6b2e3f6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,63 @@
+*.o
+.dirstamp
+*.a
+.deps
+ExaBayes_*
+aclocal.m4
+autom4te.cache
+consense
+credibleSet
+extractBips
+parser-exabayes
+postProcParam
+src/stamp-h1
+sdsf
+/src/releaseDate.hpp
+/yggdrasil
+/config.guess
+/config.log
+/config.status
+/config.sub
+/configure
+/compile_commands.json
+/exatest
+/install-sh
+/exabayes
+/missing
+/src/config.h
+/src/config.h.in
+/depcomp
+/Makefile
+/Makefile.in
+/lib/ncl-2.1.18/Makefile.in
+/lib/ncl-2.1.18/config.h.in
+/lib/ncl-2.1.18/config.h.in~
+/lib/ncl-2.1.18/config.log
+/lib/ncl-2.1.18/config.status
+/lib/ncl-2.1.18/config/config.guess
+/lib/ncl-2.1.18/config/config.sub
+/lib/ncl-2.1.18/config/depcomp
+/lib/ncl-2.1.18/config/install-sh
+/lib/ncl-2.1.18/config/missing
+/lib/ncl-2.1.18/ncl/Makefile
+/lib/ncl-2.1.18/ncl/Makefile.in
+/lib/ncl-2.1.18/stamp-h1
+/src/config.h.in~
+/compile
+/manual/missfont.log
+/manual/manual.dvi
+/manual/manual.html~
+/manual/manual.html
+/manual/manual.pdf
+/manual/manual.tex
+/manual/manual-blx.bib
+/manual/texput.log
+/manual/index.html
+/manual/library2_bib.html
+/manual/library2.html
+/manual/manual.log
+/manual/manual.out
+/manual/manual.toc
+/manual/manual.bbl
+/manual/manual.blg
+/manual/manual.aux
diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
index 0000000..82d1c87
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,23 @@
+        EXABAYES CHANGELOG
+        ==================
+
+
+        2016-09-23 Version 1.5 (Andre Aberer exabayes at googlegroups.com)
+
+        * Fixes several issues with the exponential prior
+
+        * Enables out-of-source builds
+
+        * Enables compilation with icc-14
+
+        * Ensures compilation with
+        - clang versions 3.4 - 4.0 (libc++)
+        - gcc 4.8 - 6.0 (libstdc++)
+
+        * Adds a bootstrap script
+
+        * Removes biased branch length proposal
+
+        * Updates weights for branch length multiplier and Gamma distribution proposal
+
+        * Adds support for binary data in alignments
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..69dc5d0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,14 @@
+Original ExaBayes source code is licensed under the GNU Public License
+v3 (see LICENSE.txt). If not stated otherwise, any file in "src" and
+"utils" is original ExaBayes source code.
+
+We merely distribute software included in the lib-folder: 
+* the random-123 library, 
+* the nexus class library.
+
+We distribute modified versions of ExaML and the phylogenetic
+likelihood library (PLL).
+
+The copyright for original ExaBayes source code and modifications to
+distributed software is:
+Copyright December 2013 by Andre Aberer, Kassian Kobert, Alexandros Stamatakis
diff --git a/Doxyfile b/Doxyfile
new file mode 100644
index 0000000..2e08568
--- /dev/null
+++ b/Doxyfile
@@ -0,0 +1,1792 @@
+# Doxyfile 1.8.1.2
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a hash (#) is considered a comment and will be ignored.
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or sequence of words) that should
+# identify the project. Note that if you do not use Doxywizard you need
+# to put quotes around the project name if it contains spaces.
+
+PROJECT_NAME           = "ExaBayes"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER         =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer
+# a quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          =
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is
+# included in the documentation. The maximum height of the logo should not
+# exceed 55 pixels and the maximum width should not exceed 200 pixels.
+# Doxygen will copy the logo to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = ./doc
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful if your file system
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = YES 
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding
+# "class=itcl::class" will allow you to use the command class in the
+# itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given extension.
+# Doxygen has a built-in mapping, but you can override or extend it using this
+# tag. The format is ext=language, where ext is a file extension, and language
+# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,
+# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions
+# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      = 
+
+# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all
+# comments according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you
+# can mix doxygen, HTML, and XML commands with Markdown formatting.
+# Disable only in case of backward compatibilities issues.
+
+MARKDOWN_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also makes the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter
+# and setter methods for a property. Setting this option to YES (the default)
+# will make doxygen replace the get and set methods by a property in the
+# documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
+# unions are shown inside the group in which they are included (e.g. using
+# @ingroup) instead of on a separate page (for HTML and Man pages) or
+# section (for LaTeX and RTF).
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and
+# unions with only public data fields will be shown inline in the documentation
+# of the scope in which they are defined (i.e. file, namespace, or group
+# documentation), provided this scope is documented. If set to NO (the default),
+# structs, classes, and unions are shown on a separate page (for HTML and Man
+# pages) or section (for LaTeX and RTF).
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penalty.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will roughly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols.
+
+SYMBOL_CACHE_SIZE      = 0
+
+# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be
+# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given
+# their name and scope. Since this can be an expensive process and often the
+# same symbol appear multiple times in the code, doxygen keeps a cache of
+# pre-resolved symbols. If the cache is too small doxygen will become slower.
+# If the cache is too large, memory is wasted. The cache size is given by this
+# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespaces are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+# will list include files with double quotes in the documentation
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+# will sort the (brief and detailed) documentation of class members so that
+# constructors and destructors are listed first. If set to NO (the default)
+# the constructors will appear in the respective orders defined by
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
+# do proper type resolution of all parameters of a function it will reject a
+# match between the prototype and the implementation of a member function even
+# if there is only one candidate or it is obvious which candidate to choose
+# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
+# will still accept a match between prototype and implementation in such cases.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or macro consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and macros in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page.
+# This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option.
+# You can optionally specify a file name after the option, if omitted
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files
+# containing the references data. This must be a list of .bib files. The
+# .bib extension is automatically appended if omitted. Using this command
+# requires the bibtex tool to be installed. See also
+# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style
+# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this
+# feature you need bibtex and perl available in the search path.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# The WARN_NO_PARAMDOC option can be enabled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT                  = ./src
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
+# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
+# *.f90 *.f *.for *.vhd *.vhdl
+
+FILE_PATTERNS          = *.c *.cpp *.h *.dox *.hpp
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE              = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = 
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+# If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.
+# Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.
+# The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty or if
+# non of the patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
+# and it is also possible to disable source filtering for a specific pattern
+# using *.ext= (so without naming a filter). This option only has effect when
+# FILTER_SOURCE_FILES is enabled.
+
+FILTER_SOURCE_PATTERNS =
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C, C++ and Fortran comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header. Note that when using a custom header you are responsible
+#  for the proper inclusion of any scripts and style sheets that doxygen
+# needs, which is dependent on the configuration options used.
+# It is advised to generate a default header using "doxygen -w html
+# header.html footer.html stylesheet.css YourConfigFile" and then modify
+# that header. Note that the header is subject to change so you typically
+# have to redo this when upgrading to a newer version of doxygen or when
+# changing the value of configuration settings such as GENERATE_TREEVIEW!
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# style sheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that
+# the files will be copied as-is; there are no commands or markers available.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+# Doxygen will adjust the colors in the style sheet and background images
+# according to this color. Hue is specified as an angle on a colorwheel,
+# see http://en.wikipedia.org/wiki/Hue for more information.
+# For instance the value 0 represents red, 60 is yellow, 120 is green,
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+# the colors in the HTML output. For a value of 0 the output will use
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+# the luminance component of the colors in the HTML output. Values below
+# 100 gradually make the output lighter, whereas values above 100 make
+# the output darker. The value divided by 100 is the actual gamma applied,
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of
+# entries shown in the various tree structured indices initially; the user
+# can expand and collapse entries dynamically later on. Doxygen will expand
+# the tree to such a level that at most the specified number of entries are
+# visible (unless a fully collapsed tree already exceeds this amount).
+# So setting the number of entries 1 will produce a full collapsed tree by
+# default. 0 is a special value representing an infinite number of entries
+# and will result in a full expanded tree by default.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE               =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING     =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
+# that can be used as input for Qt's qhelpgenerator to generate a
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
+# add. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+#  will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have
+# this name.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)
+# at top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it. Since the tabs have the same information as the
+# navigation tree you can set this option to NO if you already set
+# GENERATE_TREEVIEW to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+# Since the tree basically has the same information as the tab index you
+# could consider to set DISABLE_INDEX to NO when enabling this option.
+
+GENERATE_TREEVIEW      = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
+# (range [0,1..20]) that doxygen will group on one line in the generated HTML
+# documentation. Note that a value of 0 will completely suppress the enum
+# values from appearing in the overview section.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are
+# not supported properly for IE 6.0, but are supported on all modern browsers.
+# Note that when changing this option you need to delete any form_*.png files
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
+# (see http://www.mathjax.org) which uses client side Javascript for the
+# rendering instead of using prerendered bitmaps. Use this if you do not
+# have LaTeX installed or if you want to formulas look prettier in the HTML
+# output. When enabled you may also need to install MathJax separately and
+# configure the path to it using the MATHJAX_RELPATH option.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you need to specify the location relative to the
+# HTML output directory using the MATHJAX_RELPATH option. The destination
+# directory should contain the MathJax.js script. For instance, if the mathjax
+# directory is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to
+# the MathJax Content Delivery Network so you can quickly see the result without
+# installing MathJax.
+# However, it is strongly recommended to install a local
+# copy of MathJax from http://www.mathjax.org before deployment.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension
+# names that should be enabled during MathJax rendering.
+
+MATHJAX_EXTENSIONS     =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should
+# typically be disabled. For large projects the javascript based search engine
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a PHP enabled web server instead of at the web client
+# using Javascript. Doxygen will generate the search PHP script and index
+# file to put on the web server. The advantage of the server
+# based approach is that it scales better to large projects and allows
+# full text search. The disadvantages are that it is more difficult to setup
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX         = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
+# the generated latex document. The footer should contain everything after
+# the last chapter. If it is left blank doxygen will generate a
+# standard footer. Notice: only use this tag if you know what you are doing!
+
+LATEX_FOOTER           =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See
+# http://en.wikipedia.org/wiki/BibTeX for more info.
+
+LATEX_BIB_STYLE        = plain
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load style sheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.
+# This is useful
+# if you want to understand what is going on.
+# On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# pointed to by INCLUDE_PATH will be searched when a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition that
+# overrules the definition found in the source code.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all references to function-like macros
+# that are alone on a line, have an all uppercase name, and do not end with a
+# semicolon, because these will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. For each
+# tag file the location of the external documentation should be added. The
+# format of a tag file without this location is as follows:
+#
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths
+# or URLs. Note that each tag file must have a unique name (where the name does
+# NOT include the path). If a tag file is not located in the directory in which
+# doxygen is run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option also works with HAVE_DOT disabled, but it is recommended to
+# install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+# allowed to run in parallel. When set to 0 (the default) doxygen will
+# base this on the number of processors available in the system. You can set it
+# explicitly to a value larger than 0 to get control over the balance
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS        = 0
+
+# By default doxygen will use the Helvetica font for all dot files that
+# doxygen generates. When you want a differently looking font you can specify
+# the font name using DOT_FONTNAME. You need to make sure dot is able to find
+# the font, which can be done by putting it in a standard location or by setting
+# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
+# directory containing the font.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the Helvetica font.
+# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to
+# set the path where dot can find it.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside
+# the class node. If there are many fields or methods and many nodes the
+# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS
+# threshold limits the number of items for each type to make the size more
+# managable. Set this to 0 for no limit. Note that the threshold may be
+# exceeded by 50% before the limit is enforced.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will generate a graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are svg, png, jpg, or gif.
+# If left blank png will be used. If you choose svg you need to set
+# HTML_FILE_EXTENSION to xhtml in order to make the SVG files
+# visible in IE 9+ (other browsers do not have this requirement).
+
+DOT_IMAGE_FORMAT       = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+# Note that this requires a modern browser other than Internet Explorer.
+# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you
+# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files
+# visible. Older versions of IE do not have SVG support.
+
+INTERACTIVE_SVG        = NO
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the
+# \mscfile command).
+
+MSCFILE_DIRS           =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = YES
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP            = YES
diff --git a/INSTALL.txt b/INSTALL.txt
new file mode 100644
index 0000000..ff65028
--- /dev/null
+++ b/INSTALL.txt
@@ -0,0 +1,12 @@
+instructions on how to set up this repository: 
+* check out the repo into this folder (top-level dir)
+* make sure, you installed MPI 
+* exa-bayes: autoreconf  => follow instructions of command and repeat until it completes successfully
+* install the ncl library => assuming default location /usr/local/lib/ncl (you should not have to do anything)
+* in lib: $ git clone  git://github.com/stamatak/ExaML.git
+* in lib: git clone PLL 
+* in src: $ ln -s ../lib/ExaML/examl
+* in src: $ ln -s  ../lib/phylogenetic-likelihood-library/ pll
+* in top-level dir: ./configure 
+* now make should work ... 
+* for the PLL: execute ./utils/setupPLLLinks.sh
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..fe418b2
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,283 @@
+################################################################
+# GENENRAL 
+
+AUTOMAKE_OPTIONS= foreign subdir-objects
+
+EXTRA_DIST= src/releaseDate.hpp lib/Random123-1.08  LICENSE.txt lib/pll/avxLikelihood.c examples
+noinst_LIBRARIES=libbayes.a libncl.a libcommdummy.a libpll.a libpll_model.a 
+bin_PROGRAMS = yggdrasil parser-exabayes sdsf postProcParam credibleSet extractBips consense
+dist_doc_DATA = ./CHANGELOG  ./README.md ./COPYING
+
+# shared/doc/manual
+docmanualdir=$(docdir)/manual
+dist_docmanual_DATA= \
+./manual/manual.pdf ./manual/css/org.css ./manual/img/banner.png \
+./manual/img/banner2.png ./manual/manual.html ./manual/library2.html
+
+# shared/doc/examples
+docexamplesdir=$(docdir)/examples
+dist_docexamples_DATA = examples/configFile-all-options.nex
+
+# shared/doc/examples/dna-unpartitioned
+docexamples1dir=$(docdir)/examples/dna-unpartitioned
+dist_docexamples1_DATA=examples/dna-unpartitioned/call-parallel.sh \
+examples/dna-unpartitioned/call.sh examples/dna-unpartitioned/config.nex
+
+# shared/doc/examples/aa
+docexamplesdir2dir=$(docdir)/examples/aa
+dist_docexamplesdir2_DATA=examples/aa/call-parallel.sh examples/aa/call.sh \
+examples/aa/config.nex
+
+# shared/doc/examples/aa-revmat
+docexamplesdir3dir=$(docdir)/examples/aa-revmat
+dist_docexamplesdir3_DATA=examples/aa-revmat/call-parallel.sh \
+examples/aa-revmat/call.sh \
+examples/aa-revmat/aln.phy examples/aa-revmat/config.nex
+
+# shared/doc/examples/dna-partitioned
+docexamplesdir4dir=$(docdir)/examples/dna-partitioned
+dist_docexamplesdir4_DATA=examples/dna-partitioned/call-parallel.sh \
+examples/dna-partitioned/call.sh examples/dna-partitioned/aln.phy \
+examples/dna-partitioned/aln.part examples/dna-partitioned/config.nex
+
+# shared/doc/examples/binary
+docexamplesdir5dir=$(docdir)/examples/aa
+dist_docexamplesdir5_DATA= examples/binary/aln.model \
+examples/binary/call-parallel.sh examples/binary/call.sh \
+examples/binary/aln.phy examples/binary/config.nex
+
+.PHONY: my-update-src doc man date dist
+
+
+################################################################
+# FLAGS  & preparations  
+
+# enforce, once sanity is back: -Wsign-compare -Wtype-limits
+
+WARN_OFF= -Wno-unused-parameter -Wno-sign-conversion -Wno-unknown-pragmas \
+-Wno-inline
+GCC_WARN= -Wcast-align -Wchar-subscripts -Wformat-nonliteral -Wformat-y2k \
+-Wimport  -Wmissing-field-initializers -Wmissing-format-attribute  -Wpacked \
+-Wredundant-decls -Wstack-protector -Wswitch-default -Wswitch-enum \
+-Wunreachable-code -Wvariadic-macros -Wvolatile-register-var -Wunused-label \
+-Wunused-value -Wint-to-pointer-cast
+
+# the intel compiler way overdoes it with the warnings 
+# GCC_WARN+=-Weffc++   
+
+GCC_WARN_OFF= -Wno-suggest-attribute=noreturn -Wno-unknown-warning-option \
+-Wno-unknown-warning -Wno-missing-noreturn
+WARN_FLAGS=-Wall -Wextra -pedantic -Wcast-qual -Wcomment -Wconversion \
+-Wdisabled-optimization -Wfloat-equal  -Wformat  -Wformat=2 -Wformat-security \
+-Winit-self -Winline -Winvalid-pch -Wmissing-braces -Wmissing-include-dirs \
+-Wparentheses -Wpointer-arith -Wreturn-type -Wsequence-point -Wshadow \
+-Wsign-compare -Wstrict-aliasing -Wstrict-aliasing=2 -Wswitch -Wtrigraphs \
+-Wuninitialized -Wunknown-pragmas  -Wwrite-strings -Wunused  -Wunused-function \
+-Wunused-variable -Wreturn-type -Wmissing-declarations -Wundef  $(WARN_OFF)
+
+if WITH_INTEL
+else 
+  WARN_FLAGS+=$(GCC_WARN) $(GCC_WARN_OFF)
+endif
+
+RAX_FEATURE=-D_GNU_SOURCE -fomit-frame-pointer -funroll-loops -D__STRICT_ANSI__ 
+
+AM_CXXFLAGS=$(RAX_FEATURE) $(WARN_FLAGS) $(PTHREAD_CFLAGS)
+AM_CFLAGS=$(RAX_FEATURE) $(WARN_FLAGS) -std=c99
+AM_LDFLAGS=$(PTHREAD_LDFLAGS) $(AM_LDLFLAGS)
+
+if WITH_INTEL
+else 
+ AM_CXXFLAGS+=-Weffc++
+endif 
+
+
+# clarify vector flags 
+if WITH_MIC
+VECTOR_FLAGS=-DMANUAL_SSE_OVERRIDE -DMANUAL_AVX_OVERRIDE -mmic -D__MIC_NATIVE -opt-streaming-cache-evict=0
+else 
+if NO_SSE
+VECTOR_FLAGS=-DMANUAL_SSE_OVERRIDE -DMANUAL_AVX_OVERRIDE -mno-avx -mno-sse3 # $(SIMD_FLAGS) -march=native -mtune=generic -mno-avx -mno-sse3
+else 
+if NO_AVX
+VECTOR_FLAGS=-DMANUAL_AVX_OVERRIDE -msse3 -mno-avx  # $(SIMD_FLAGS) -march=native -mtune=native -mno-avx -m
+else 
+VECTOR_FLAGS= $(SIMD_FLAGS) -march=native -mtune=native
+endif
+endif
+endif
+
+AM_CFLAGS+=$(VECTOR_FLAGS)
+AM_CXXFLAGS+=$(VECTOR_FLAGS)
+
+folders=$(shell find $(top_srcdir)/src -type d | grep -v '.deps' | grep -v comm | grep -v apps)
+
+SRCINCLUDE=$(shell echo $(folders) | tr ' ' '\n' |  sed "s/\(.*\)/-I\1/" | tr '\n' ' ')
+SRCINCLUDE+= -I$(top_srcdir)/src/comm/ -I$(top_srcdir)/src/comm/threads
+
+RAND123_INCLUDES=-isystem $(top_srcdir)/lib/Random123-1.08/include/Random123 -isystem $(top_srcdir)/lib/Random123-1.08/include -isystem $(top_srcdir)/lib/Random123-1.08/examples
+NCL_INCLUDES=-isystem $(top_srcdir)/lib/ncl-2.1.18
+BAYES_COMMON= $(RAND123_INCLUDES) $(NCL_INCLUDES) $(SRCINCLUDE)  
+BAYES_INCLUDES=$(BAYES_COMMON) -I$(top_srcdir)/src/comm/dummy 
+BAYES_INCLUDES_PARA= $(BAYES_COMMON)-I$(top_srcdir)/src/comm/mpi 
+
+seqlibs= libncl.a libbayes.a libcommdummy.a  libpll.a libpll_model.a libncl.a  
+paralibs= libbayes.a libcommmpi.a libpll.a libpll_model.a libncl.a
+
+
+################################################################ 
+# auto generated sources 
+
+commFolds=./src/comm/ ./src/comm/threads
+mpiFolds= ./src/comm/mpi  $(commFolds)
+dummyFolds= ./src/comm/dummy $(commFolds)
+
+my-update-src:
+	@echo -n "" > src.am 
+	@echo "libbayes_a_SOURCES=" $(shell echo "$(top_srcdir)/src/common.h $(top_srcdir)/src/pll.h")    $(shell find $(folders)  -maxdepth 1   -name "*.[cht]pp" ) >> src.am
+	@echo "libcommdummy_a_SOURCES=" $(shell find ${dummyFolds} -maxdepth 1 -name "*.[cht]pp" ) >> src.am
+	@echo "libcommmpi_a_SOURCES=" $(shell find ${mpiFolds}  -maxdepth 1 -name "*.[cht]pp" ) >> src.am
+	@echo "libncl_a_SOURCES=" $(shell find $(top_srcdir)/lib/ncl-2.1.18/ncl -name "*.[cht]") $(shell find $(top_srcdir)/lib/ncl-2.1.18/ncl -name "*.[cht]pp") >> src.am	
+
+include src.am 
+
+################################################################
+# libcomdummy 
+
+libcommdummy_a_CXXFLAGS=-O3 $(AM_CXXFLAGS)  $(BAYES_INCLUDES)  
+
+
+################################################################
+# lib comm mpi 
+if WITH_MPI 
+bin_PROGRAMS+=exabayes 
+noinst_LIBRARIES+=libcommmpi.a
+libcommmpi_a_CXXFLAGS=$(AM_CXXFLAGS) -O3  $(MPI_CXXFLAGS) $(BAYES_INCLUDES_PARA)    
+endif 
+
+
+################################################################
+#  libbayes 
+
+libbayes_a_CXXFLAGS= $(AM_CXXFLAGS) -O3 $(BAYES_INCLUDES)      
+libbayes_a_CFLAGS=-O2 $(BAYES_INCLUDES)   
+
+
+################################################################
+# libpll 
+
+libpll_a_SOURCES=./lib/pll/alignment.c ./lib/pll/evaluateGenericSpecial.c \
+./lib/pll/globalVariables.h ./lib/pll/lexer.c ./lib/pll/mem_alloc.h \
+./lib/pll/genericParallelization.h  ./lib/pll/newick.h ./lib/pll/pllInternal.h \
+./lib/pll/recom.c ./lib/pll/stack.h ./lib/pll/utils.c \
+./lib/pll/evaluatePartialGenericSpecial.c ./lib/pll/lexer.h \
+./lib/pll/newviewGenericSpecial.c ./lib/pll/pll-renamed.h \
+./lib/pll/restartHashTable.c ./lib/pll/topologies.c ./lib/pll/bipartitionList.c \
+./lib/pll/fastDNAparsimony.c ./lib/pll/makenewzGenericSpecial.c \
+./lib/pll/optimizeModel.c ./lib/pll/queue.c ./lib/pll/searchAlgo.c \
+./lib/pll/trash.c ./lib/pll/cycle.h ./lib/pll/hash.c ./lib/pll/parsePartition.c \
+./lib/pll/queue.h ./lib/pll/ssort.c ./lib/pll/treeIO.c ./lib/pll/errcodes.h \
+./lib/pll/hash.h  ./lib/pll/newick.c ./lib/pll/parsePartition.h \
+./lib/pll/randomTree.c ./lib/pll/stack.c ./lib/pll/treeIO.h \
+./src/avxConditional.c
+
+libpll_model_a_SOURCES= ./lib/pll/models.c 
+libpll_model_a_CFLAGS=$(AM_CFLAGS) -w  $(SRCINCLUDE) -O1 $(MIC_FLAGS)
+
+libpll_a_CFLAGS=$(AM_CFLAGS) -w  -O2 $(SRCINCLUDE)   $(MIC_FLAGS)
+
+if WITH_MIC
+libpll_a_SOURCES+=./lib/pll/mic_native_aa.c ./lib/pll/mic_native_dna.c ./lib/pll/mic_native.h 
+endif
+
+
+################################################################
+# exabayes
+exabayes_SOURCES = ./src/apps/exabayes.cpp
+exabayes_CXXFLAGS=   $(AM_CXXFLAGS) -O3 $(BAYES_INCLUDES)
+exabayes_LDFLAGS=$(MPI_CXXLDFLAGS)
+exabayes_LDADD= $(paralibs) $(MPI_CXXLDFLAGS)
+
+################################################################
+# yggdrasil 
+yggdrasil_SOURCES = ./src/apps/exabayes.cpp
+yggdrasil_CXXFLAGS=$(AM_CXXFLAGS) -O3 $(BAYES_INCLUDES)  -D_IS_YGG
+yggdrasil_LDADD=$(seqlibs)
+
+################################################################
+# SDSF
+sdsf_SOURCES= ./src/apps/sdsf.cpp
+sdsf_CXXFLAGS= $(AM_CXXFLAGS) -O3 $(BAYES_INCLUDES)    
+sdsf_LDADD= $(seqlibs)
+
+################################################################
+# the parser 
+parser_exabayes_SOURCES=./src/apps/parser.cpp
+parser_exabayes_CXXFLAGS=-O3 $(AM_CXXFLAGS) $(BAYES_INCLUDES) -Wno-deprecated-writable-strings
+parser_exabayes_LDADD=$(seqlibs)
+
+################################################################
+# extractBips
+extractBips_SOURCES=./src/apps/extractBips.cpp
+extractBips_CXXFLAGS=-O3 $(AM_CXXFLAGS)  $(BAYES_INCLUDES)
+extractBips_LDADD=$(seqlibs)
+
+################################################################
+# consense
+consense_SOURCES=./src/apps/consense.cpp
+consense_CXXFLAGS=-O3 $(AM_CXXFLAGS)  $(BAYES_INCLUDES)  
+consense_LDADD=$(seqlibs)
+
+################################################################
+# credibleSet
+credibleSet_SOURCES=./src/apps/credibleSet.cpp
+credibleSet_CXXFLAGS=-O3 $(AM_CXXFLAGS)  $(BAYES_INCLUDES)   
+credibleSet_LDADD= $(seqlibs)
+
+################################################################
+# postProcParam
+postProcParam_SOURCES=./src/apps/postProcParam.cpp
+postProcParam_CXXFLAGS=-O3 $(AM_CXXFLAGS)  $(BAYES_INCLUDES)   
+postProcParam_LDADD=$(seqlibs)
+
+################################################################
+# ncl 
+libncl_a_CXXFLAGS=  -w $(AM_CXXFLAGS) -O3 $(NCL_INCLUDES) -D__STRICT_ANSI__  
+
+################################################################
+# exatest 
+
+if WITH_TEST
+ bin_PROGRAMS+=exatest
+endif 
+
+exatest_SOURCES = ./tests/exatest.cpp
+exatest_CXXFLAGS=$(AM_CXXFLAGS) -O3  $(BAYES_INCLUDES)  -D_IS_YGG
+exatest_LDFLAGS=-L/usr/local/lib -lgtest -lpthread 
+exatest_LDADD= $(seqlibs) 
+
+if WITH_MPI
+ exatest_CXXFLAGS+=-D_WITH_MPI	
+ # teststr="mpirun -np 2 ./exatest"
+ teststr="./exatest"
+else 
+ teststr="./exatest"
+endif
+
+test : exatest
+	$(RM) ExaBayes_*test-*
+	eval $(teststr)
+
+################################################################
+
+doc:
+	doxygen 
+
+man:
+	./manual/process.sh ./manual
+
+date:
+	./utils/updateDate.sh
+
+dist-hook:
+	make date
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..226e688
--- /dev/null
+++ b/README.md
@@ -0,0 +1,63 @@
+# Exabayes Readme 
+
+ExaBayes is a software package for Bayesian phylogenetic tree
+inference. It is particularly suitable for large-scale analyses on
+computer clusters.
+
+## Repository structure
+
+This ExaBayes repository supports is now gitflow oriented.
+
+It contains the following branches: 
+
+* _devel:_ latest potentially unstable changes, bugfixes before they enter releases
+* _master:_ a commit on the master branch (always tagged) is a specific version of ExaBayes
+* _feature branches_: intended for development only 
+
+## Documentation
+
+Please find a detailed manual in manual/manual.pdf or
+manual/manual.html.
+
+An online version of the manual is available on the ExaBayes site on
+the [Exelixis website][1].
+
+Possibly, blog posts may appear on my [personal webpage][2].
+
+
+## Installation
+
+Preferably download, compile and install a released version (available
+on the [Exelixis website][1]).
+
+The slightly harder to way to install latest development version is to
+run `bootstrap.sh` (you need to have installed autoconf and an
+up-to-date version of autoconf-archive).
+
+## Identifiability
+
+All released versions correspond to a git-tag and thus allow you to
+trace which code exactly was used when performing an analysis.
+
+If you build from the devel-branch, ExaBayes specifies a `pre-X`
+version in the header of the log (where X is the succeeding
+version). Furthermore, ExaBayes prints the git commit id and git
+commit date.
+
+## Support
+
+Since I have started working in a full-time job outside academia, my
+capabilities to support ExaBayes are fairly limited, despite
+intentions to keep the project running as well as possible. Please
+keep nagging me in particular about bug fixes, until you obtain a
+result that you see fit.
+
+Consider posting in the [ExaBayes google group][3].
+
+## License
+
+Regarding licensing, please consider the file COPYING.
+
+[1]: http://sco.h-its.org/exelixis/web/software/exabayes/index.html
+[2]: http://aberer.io
+[3]: https://groups.google.com/forum/#!forum/exabayes
diff --git a/bootstrap.sh b/bootstrap.sh
new file mode 100755
index 0000000..f75654a
--- /dev/null
+++ b/bootstrap.sh
@@ -0,0 +1,46 @@
+#! /bin/bash
+
+gitroot=$(dirname $0)
+
+if [ ! -d "$gitroot/.git" ]; then
+
+    echo ".git folder not found. Most likely you are attempting to"
+    echo "bootstrap from a github generated tar-ball which is not"
+    echo "supported. Please download the source-tarball from the"
+    echo "contributor's site or try to bootstrap in a cloned repository."
+
+    exit
+fi
+
+# use this script to compile the source code downloaded from the
+# repository.
+
+cd $gitroot
+
+autoreconf -vfi && ./configure && make date
+
+if [ ! -f $gitroot/src/releaseDate.hpp ]; then
+    read -r -d  '' MSG <<EOF
+\n
+Bootstrapping failed. Please check the messages above for
+errors (exabayes most likely will not compile).
+
+Did you install autoconf and autoconf-archive (must be released later
+than 2015)?
+
+EOF
+
+    echo -e "$MSG"
+    exit
+
+else
+
+    read -r -d '' MSG <<EOF
+\n
+Bootstrap successful. You can now run configure and make.
+EOF
+
+    echo -e "$MSG"
+    exit
+
+fi
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..d0bd4e5
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,157 @@
+#                                               -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+
+AC_REREQ([2.67])
+AC_INIT([exabayes],[1.5],[exabayes-at-googlegroups-dot-com])
+
+m4_include([./m4/ax_cxx_compile_stdcxx_11.m4])
+m4_include([./m4/lx_find_mpi.m4])
+
+
+AC_CONFIG_SRCDIR([src/])
+
+dnl todo-ish 
+AM_INIT_AUTOMAKE([subdir-objects])
+AC_CONFIG_HEADERS([src/config.h])
+
+
+AC_DEFINE([PROGRAM_NAME], ["ExaBayes"], ["name used for log files"])
+
+AM_SILENT_RULES([yes])
+
+
+# Checks for programs.
+
+OLD_CXXFLAGS=$CXXFLAGS
+OLD_CFLAGS=$CFLAGS
+AC_PROG_CC( [gcc icc] )
+AC_PROG_CXX( [g++ icpc] )
+CXXFLAGS=$OLD_CXXFLAGS
+CFLAGS=$OLD_CFLAGS
+
+dnl TODO: could we remove this one? 
+AC_C_LONG_LONG
+
+AX_CXX_COMPILE_STDCXX_11([noext], [mandatory])
+
+AX_CXX_COMPILE_STDCXX(14, [noext], [optional])
+
+AC_PROG_CC_STDC
+AC_PROG_CC_C99
+AC_PROG_RANLIB
+
+dnl NOTICE if you have trouble with that, then install autoconf-archive (or similar)
+
+AX_EXT 
+
+AX_PTHREAD
+
+
+AC_ARG_VAR([MPICXX],[sets the MPI c++ compiler ])
+
+
+# Checks for header files.
+AC_CHECK_HEADERS([fcntl.h limits.h stdint.h stdlib.h string.h strings.h sys/time.h unistd.h])
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_C_INLINE
+AC_TYPE_SIZE_T
+AC_TYPE_UINT32_T
+AC_TYPE_UINT64_T
+
+# Checks for library functions.
+AC_FUNC_MALLOC
+AC_FUNC_MMAP
+AC_FUNC_REALLOC
+AC_CHECK_FUNCS([clock_gettime getcwd getpagesize gettimeofday memset pow sqrt strcasecmp strchr])
+
+
+
+
+dnl disallow to use sse3 
+AC_ARG_ENABLE( [sse], 
+	       [  --disable-sse    compiles ExaBayes without any vectorization (slower), even if available], 
+ 	       [ case $enableval in 
+	       no ) GUESS_SSE="yes" ;; 
+ 	       yes ) GUESS_SSE="no" ;; 
+	       * )  GUESS_SSE="no"
+ 	       esac ] ,
+	       [GUESS_SSE="no"]
+ )
+AM_CONDITIONAL([NO_SSE], [ test "x$GUESS_SSE" = "xyes" ])
+
+dnl allow to disable avx 
+AC_ARG_ENABLE( [avx],
+	       [  --disable-avx    compiles ExaBayes with SSE support (slower) only, altough AVX is available ], 
+[ case $enableval in 
+  no ) GUESSAVX="yes" ;; 
+  yes ) GUESSAVX="no" ;;
+  * ) GUESSAVX="no"
+  esac ] , 
+  [GUESSAVX="no"]
+  )
+AM_CONDITIONAL([NO_AVX], [ test "x$GUESSAVX" = "xyes" ])
+
+AC_ARG_ENABLE( [mpi], 	      
+	   [  --enable-mpi     compiles ExaBayes with MPI support (optionally use MPICXX, to set a non-default MPI compiler ) ], 
+[  case "${enableval}" in 
+   no )  MPI_CODE="no" ;; 
+   yes ) MPI_CODE="yes" ;; 
+   *) MPI_CODE="no" 
+   esac ] ,
+[MPI_CODE="no"]
+)
+
+
+dnl check, if we are an intel compiler 
+
+INTEL=no
+AC_TRY_COMPILE( [], 
+[ 
+  #ifndef __INTEL_COMPILER 
+  #error "checked for intel compiler without success" 
+  #endif 
+], 
+[ INTEL="yes" ]
+)
+AM_CONDITIONAL( [WITH_INTEL], [ test "x$INTEL" = "xyes" ] ) 
+
+
+
+AC_ARG_ENABLE( [mic],
+	       [  --enable-mic     compiles the PLL with support for Intel accellerators (Xeon Phi/Intel MIC)  ],
+	       [  case "${enableval}" in 
+	             no )  MIC_CODE="no" ;; 
+		     yes ) MIC_CODE="yes" ;; 
+                     *) MIC_CODE="no" 
+	          esac ] ,
+	       [MIC_CODE="no"]
+	        )
+AM_CONDITIONAL([WITH_MIC], [ test "x$MIC_CODE" = "xyes" ])
+
+
+
+dnl enable google tests 
+AC_ARG_ENABLE( [tests], 
+	   [  --enable-tests   enable automated tests (developer only) ], 
+	   [   case "${enableval}" in 
+	       no ) CODE="no" ;; 
+	       yes )  CODE="yes" ;; 
+ 	       *) CODE="no"
+	       esac ], 
+  	   [CODE="no"]
+	)
+AM_CONDITIONAL([WITH_TEST], [ test "x$CODE" = "xyes" ])
+
+dnl test, if we have PLL AND force the user to provide a mpi-comiler, if we dont
+if test "x$MPI_CODE" = "xyes" ; then 
+   AC_LANG_PUSH([C++])	 
+   LX_FIND_MPI([], AC_MSG_ERROR(could not find mpi))
+
+   AC_LANG_POP([C++])	 
+fi 
+
+AM_CONDITIONAL([WITH_MPI], [ test "x$MPI_CODE" = "xyes" ])
+
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
diff --git a/examples/aa-revmat/aln.phy b/examples/aa-revmat/aln.phy
new file mode 100755
index 0000000..abe4aab
--- /dev/null
+++ b/examples/aa-revmat/aln.phy
@@ -0,0 +1,776 @@
+775 4519
+Seq1 ----M--NLSFFDQFMSPS-LMNIPLLVLALTLPWLLFPS-LTSRWLNNRVITLQAWFIGQFTNQLLSPINPKMHKWAMIFCSLMLLLMTLNLLGLLPYTFTPTTQLSLNLGLAVPLWLATVLVGLINQPT-TSLGHLLPEGTPTLLIPMLIIIETISLMIRP--IALAVRLTANLTAGHLLMQLIATAAFVLMNTMPVVAILTSLILFLL---TLLEVAVALIQAYVFVLLLSLYLQEN-T-M-PQLNPNPWFLILLFSW-IIFLTILPNKIN-KH-IFTNKP-----A-I-NNLP-SP-KT---------D-----N-W-NWP-WT------------V-TI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELNQPGALMGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASAGVEAGAGTGWTVYPPLAGNLAHAGASVD [...]
+Seq2 ----M--MVSFFDQFASPS-YLGIPLIAIAIALPWVLYPT-SSSRWINNRLITIQGWFINRFTNQLMLPLNVGGHKWALLLASLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAILVFSW-LVFLTIIPTKIL-SH-ISPNEP-----T-P-VSAE-KH-KT---------E-----S-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNVAHAGASVD [...]
+Seq3 ----M--TLSLFNQFSIPQ-FMGIPLILPAIMLPATMIFM-ASNRLLINRISNIQIWLIKTFTKQLMTPINYKGQKWTMTLMSLLMLLISMNLLGLLPYTFTPTTQLSMNMGLAIPMWLATVLTGLRNQTS-ISIGHLLPEGTPPPLIPILIMIETISLFIRP--LALGVRLTANLTAGHLLIQLISMAIITIIPTLPTTALITFMVLLLL---TLLELAVAMIQAYVFILLLSLYLQEN-V-M-PQLNPGPWLMTFLITW-FTYISIFLMKTQTSY-FLN-LP-----TLTTNK---EQ-KT---------N-----P-W-TWP-WP------------V-TL--TRWLFSTNHKDIGTLYLMFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGASVD [...]
+Seq4 ----M--TLSFFDQFMSPT-YLGIPLMALALVLPWVLFPK-PTSRWLNNRVLNLQGWFINRFTQQIFQPLSLGGHKWAALLASLMLFLITLNMLGLLPYTFTPTTQLSLNMAFAVPLWLATVIIGMRNQPN-HALAHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTSALLLML---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-AH-TFPNEP-----T-P-QSTE-KP-KT---------E-----S-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGASVD [...]
+Seq5 ----M--TVSLFDQFMSPT-FLGIHLIAIALLAAWYLVPT-PTQRWMNNRVLSLQSLFINRFASQLLTPINVGGHKWALILCALMLYIIFLNTLGLLPYTFTPTTQLSLNLGLAVPMWLSTVLIGFRNQPT-AALGHLLPEVTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISLAVYTLLLSMPVVALLTSVVLLLL---TILEIAVAMIQAYVFILLISLYLQEN-V-M-PQLNPSPWFLILIFSW-LVLLVLVVPKVM-KF-IYPNEA-----T-S-QSAE-TS-KS---------N-----N-W-TWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQINNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLASNLAHAGASVD [...]
+Seq6 ----M--AMSFFDQFASPS-YLGIPLIAIAIALPWVLFPT-PSSRWINNRLTTIQGWVINRFTNQLMLPLNIGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTVIPTKVL-NH-TSPNEP-----A-P-VSAE-TH-KT---------E-----S-W-DWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASVD [...]
+Seq7 ----M--MTSFFDQFASPT-FMGIPLIAIAVALPWIMFPT-PPARWVNNRLITLQTWLISRFTNQLLLPLNVGGHKWALLLASLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIMGMRNQPT-IALGHLLPEGTPIPLIPVLIIIETISLLIRP--LALGVRLTANLTAGHLLIQLIATAVFVLAPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFLILVFSW-IIFLTIIPTKVL-NH-VTPNEL-----T-P-VSEE-KL-KT---------E-----P-W-NWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASVD [...]
+Seq8 ----M--NENLFASFITPT-MMGLPIVMLIIMFPSILFPS--PNRLINNRLISLQQWLVQLTSKQMLAIHNYKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRHKTK-ASLAHFLPQGTPIPLIPMLVVIETISLFIQP--MALAVRLTANITAGHLLMHLIGGATLALTNITVPAALITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITIMSMI-MTLFIVFQLKIS-KH-LYPSNP-----EPK-SMIT-LEQPN---------------P-W-EKK-WTKIYSPLSLPQQ-M-FM--IRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGASVD [...]
+Seq9 ----M--ILSFFDQFMSPT-HLGIPLIALALSLPWVLIPT-PTNRWLNNRLLTLQGWFINRFTQQLMLPINLGGHKWAVLLTALMLLLITLNLLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPIPLIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTSTVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFMILIFSW-LIFLIILPPKVL-GH-TFTNEP-----T-H-KNAE-KI-KP---------E-----P-W-TWP-WS------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASVD [...]
+Seq10 ----M--ILSFFDQFMSPT-HLGIPLIALALSLPWVLIPT-PTNRWLNNRLLTLQGWFINRFTHQLMLPINLGGHKWAVLLTALMLLLITLNLLGLLPYAFAPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPGGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPAVAILTSTVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFMILVFSW-LIFLIVLPPKVL-GH-TFTNEP-----T-H-KNAE-KI-KP---------E-----P-W-TWP-WS------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq11 ----M--ILSFFDQFMSPT-HLGIPLIALALSLPWVLIPT-PTNRWLNNRLLTLQGWFINRFTQQLMLPINLGGHKWAVLLTALMLLLITLNLLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTSMVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFMILIFSW-LIFLIILPPKVL-GH-TFTNEP-----T-H-KNAE-KI-KP---------E-----P-W-TWP-WS------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq12 ----M--NMNMFNQFICPE-ILTLPITPVLLIITLLITNN--KPKLLSNRMTTAMKFMLKNLSINMANQLSKQGQKWLHLLMSLLITIMLSNLIGLLPYTFTTTSQLYINMTLALPMWMATVITGLLNKPS-HTLAHMLPETSPTPLIPFMIMIETVSLLMRP--LALGVRLTANITAGHLLMTMISSTALIFLNNMITLHMMTMILLMLL---TILEMAVACIQAYVFTLLVILYLQEN-T-M-PQLDTIHTLTNFIITW--VLTVLVSKKIQ-KI-TMNSML-----KK-LHHNIMKLKPI-----------------WY-MP-WT------------V-YI--TRWLFSTNHKDIGTLYLIFGMWSGLMGACLSILMRMELAQMGSLLGNDQIYNVLVTAHAFIMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPALLLLLSSSYVENGVGTGWTVYPPLSGNLVHSGPSV [...]
+Seq13 ----M--NENLFASFTTPM-MMGVPIVVLIIIFPSILFPS--PNRLINNRLATVQQWLIQLVSKHMLSIHNYKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVVMGFRHKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLIHLIGGATLVLMNINPVTALITFIILILL---TILELAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITILSMI-LTLFIMFQLKVS-KH-NYPEFP-----ELK-TTPL-SKKPM---------------P-W-EEK-WTKICSPLLLPQW-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMTGTALSLLIRAELGQPGALLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq14 ----M--NENLFASFTTPT-LMGLPIVILIIMFPSILFPS--SNRLTNNRLISIQQWLLKLTSKQMLSTHNYKGQSWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVVTGFRYKTK-ASLAHFLPQGTPIFLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLVLMNISTVTALITFIILVLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITIMSVM-LTLFIMFQLKIL-KS-SFPNNP-----EPK-PTPM-LKTSM---------------S-W-EKK-WTKIYLPLSLPQH-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq15 ----M--ALSFFDQFMSPT-YLGVPLVALALSLPWVLYPT-PSSRWLNNRLLTLQGWFLNRFTQQLFLPLNVGGHKWAVLLASLMVFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVAIGMRNQPT-AALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLAPMMPAVAISAAVVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFFIFVLSW-FIYLTVIHTKVT-GH-VFANEP-----TVS-VDKL-ES-KP---------E-----P-W-NWP-WH------------M-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGASV [...]
+Seq16 ----M--MVSFFDQFASPS-FLGIPLIAVAIALPWVLFPT-PPSRWVNNRLITVQTWFINRFTNQLMLPLNVGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IVFLTIIPTKIL-NH-TAPNEP-----A-P-MSEE-KH-KT---------E-----P-W-NWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq17 ----M--TLNFFDQFMSPT-HLGIPLIALALSLPWVLFPT-PSARWLNNRLLTLQGWFINRFTQQLLLPLNVGGHKWALLFTSLMVFLITLNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLAPMMPTVAILTTTVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLAILLFSW-LMFLIIIPTKVM-GH-LFTNEP-----S-V-QSAE-KP-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLSSSGVEAGAGTGWTVYPPLASNLAHAGASV [...]
+Seq18 ----M--NLSFFDQFSSPY-LLGIPLLPLSLILPTLLFPT-PSNRWIPNRLSTLQLWLFHLITKQLMTPLNKNGHKWALMLTSLMVLLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ISLGHLLPEGTPTPLVPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATTVLLPMMPAVSALTALILFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFTIMIFTW-LTLSLIIQPKLL-SF-TSANPP-----S-N-KTLT-TL-KA---------N-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGTWAGMIGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq19 ----M--TLSFFDQFMSPT-YFGIPLMALALTLPWILYPT-PSARWLNNRLLTLQGWFINRFTQQLLLPLNLGGHKWAALLTSLMIFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATIIIGMRNQPT-AALGHLLPEGTPTPLIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFTW-LVFLTMIPPKVL-GH-TFTNEP-----T-A-LSTE-KT-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLLPLMLGAPDMAFPRMNNMSFWLLPPSLLLLLSSSGVEAGVGTGWTVYPPLAGNLAHAGASV [...]
+Seq20 ----M----NLFDQFLTPS-LLGISLLMPALLMTTILLLN-PKNQWLSHPTTTIKSWFINQAAKQIMTPINPTGHKHSLILISLLILLSLTNLLGLLPYTFTPTTQLSMNMAIALPLWLVTVLIGLRTQPT-TSLAHLLPEGTPMLLIPILILIETISLLIRP--IALGVRLTANLTAGHLLIQLISIATLNLWFMMPPLSLLTSTVLILL---LLLEFAVAMIQAYVFVLLLSLYLQEN-S-M-PQLNPEPWLTTFLIVW-ISLIVILQPKIA-SL-MLTSSP---------TPYK-AM-TI---------K-----T-W-PWP-WT------------V-NF--HRWLFSTNHKDIGTLYFIFGTWAGMVGTALSLLIRTELSQPGPLLGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFTLLLSSACIEAGAGTGWTVYPPLAGNLAHAGPSV [...]
+Seq21 ----V--NTNLFDQFLIPS-LLGISLLMPALLMTAILLLN-PKNQWLSHPTVTIKSWFINKATKQIMLPISPSGRKQSLILISLLILLLFTNLLGLLPYTFTPTTQLSMNMALGLPLWLATVLIGLRTRPT-ASLGHLLPGGTPTLLIPGLILIETISLLIRP--IALGVRLTANLTAGHLLIQLISIATLNLWSMMPPLSLLTLTVLILL---LLLEFAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNPEPWLTTLLITW-ISFIAFLQPKIT-SP-APVNDP---------TTRK-PP-TI---------K-----T-W-PWP-WTQTCLINS-----V-NA--HRWLFSTNHKDIGTLYFVFGTWAGMVGTALSLLIRTELSQPGPLLGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFMLLLSSACVEAGAGTGWTVYPPLAGNLAHAGPSV [...]
+Seq22 ----M--TLSFFDQFLSPT-YLGIPLILVALTLPWLLFPT-PSPRWLNNRLLTIQGWFINRFTQQLLLPINVGGHKWALIFASLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMHNQPT-HALGHLLPEGTPTALIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVALLTSLLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLMIFVFSW-LVFLAVIPPKIL-AH-NFTNEP-----T-T-QTTE-TM-KP---------N-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq23 ----M--MLSFFDQFMSPS-YLGIPLIAVAIALPWVLYPT-PTTRWLNNRVLTLQGWFINRFTQQLLLPINPGGHKWAVLFTSLMLFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPAPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPTVAILTATILFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTVIPPKVL-AH-NFNNEP-----T-T-VGAE-KA-KP---------E-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq24 ----M--MLSFFDQFMSPS-YLGIPLIAVAIALPWTLYPT-PTTRWLNNRVLTLQGWFINRFTQQLLLPINPGGHKWAVLLTSLMLFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPTVAILTATILFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTVIPPKVL-AH-NFNNEP-----T-T-VGAE-KA-KP---------E-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq25 ----M--NLSFFDQFMSPS-LLGIPLIAVAMLTPWLLFPT-PSNRWLNNRILTLQAWFINNFTKQIFLPINLNGHKWAMMLASLMVFLMTINLLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGLRNQPT-AALGHLLPEGTPGPLIPVPIIIETISLFIRP--IALGVRLTANLTAGHLLIQLIATAAFVLLPLMPSISLVTSIVLLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFAILLFSW-LVILTILPPKIT-SH-QSFNEP-----T-T-QNSS-KP-KP---------A-----P-W-TWP-WT------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq26 ----M--NLSFFDQFMSPT-MLGIPLILLAMTIPWLLYAS-PTDRWLNNRLTTLQAWFLASFTKQLMLPLSIKGYKWALPLTSLMIFLITMNLLGLLPYTFTPTTQLSLNLGLAVPFWLATVLIGLRNQPT-AALGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAVFVLMPMMPTTAIITAIVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNPGPWFAILIMSW-FIYLFILMSKTN-NF-KYNNEP-----N-M-QNVK-KM-KP---------Q-----S-W-NWP-WT------------V-MI--TRWLFSTNHKDIGALYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq27 ----M--NLSFFDQFMSPT-MLGMPLILLAMTIPWLLYVS-PTDRWLNNRLTTLQAWFLSSFTKQLMLPLSIKGYKWALPLTSLMIFLITMNLLGLLPYTFTPTTQLSLNLGLAVPFWLATVLIGLRNQPT-AALGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAVFVLMPMMPTTAIITAVVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNPGPWFAILIMSW-FIYLFILMSKTN-NF-KFNNDP-----N-M-QNVK-KI-KP---------Q-----S-W-NWP-WT------------V-MI--TRWLFSTNHKDIGTLYLVFGAGGQILGTAISLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq28 ----M--NLSFFDQFMSPT-MLGIPLILLAMTIPWLLYAS-PTDRWLNNRLTTLQAWFLASFTKQLMLPLSIKGYKWALPLTSLMIFLITMNLLGLLPYTFTPTTQLSLNLGLAVPFWLATVLIGLRNQPT-AALGHLLPEGTPTLLIPILIIIETSSLFIRP--LALGVRLTANLTAGHLLIQLISTAVFVLMPMMPTTAIITAVVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNPGPSFAILIMSW-FIYLFILMSKTN-NF-KYNNDP-----N-M-QNVK-KM-KP---------Q-----S-W-SWP-WT------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq29 ----M--NLSFFDQFMSPT-MLGIPLILLAMTIPWLLYIS-PTDRWLNNRLTTLQAWFLATFTKQLMLPLNIKGHKWALSLTTLMIFLITMNLLGLLPYTFTPTTQLSLNLGLAVPFWLATVLIGLRNQPT-AAFGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAVFVLMPMMPTTAIITAMVLFLL---TLLEIAVAMIQAYVFILLLSLYLQEN-T-M-PQLNPGPWLAILFMSW-FIYLFILIPKTN-NF-KYNNDP-----N-M-QNVK-KI-KP---------Q-----P-W-NWP-WT------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq30 ----M--NLSFFDQFMSPT-MLGIPLILLAMTIPWLLYAS-PTDRWLNNRLTTLQAWFLASFTKQLMLPLSIKGYKWALPLTSLMIFLITMNLLGLLPYTFTPTTQLSLNLGLAVPFWLATVLIGLRNQPT-AALGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAVFVLMPMMPTTAIITAIVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNPGPWFAILIMSW-FIYLFILMSKTN-NF-KYNNEP-----N-M-QNVK-KM-KP---------Q-----S-W-NWP-WT------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq31 ----M--NLSFFDQFMSPI-MLGIPLILLAMTIPWLLYAS-PTDRWLNNRLTTLQAWFLASFTKQLMLPLNIKGHKWALPLTSLMIFLITMNLLGLLPYTFTPTTQLSLNLGLAVPFWLATVLIGLRNQPT-AALGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAVFVLMPMMPTTAIITAIVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNPGPWFAILIMSW-FIYLFILMSKTN-NF-KYNNDP-----N-M-QNVK-KI-KP---------Q-----S-W-NWP-WT------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq32 ----M--ILSFFDQFDSPI-ICYIPLMILAMTLPWILYPT-PTDRWLNNRLLTLQGWFMNRFTQQLLTPLNVGGHKWALLLTSVMVFLITMNLLSLLPYTFTPTAQLSMSLGLAVPLWLATVLIGMRNQPT-AALGHLLPEGTPTPLIPVLIIIETISLFIRP--VALGVRITANLTAGHLLIQLIATAAFVLIPMMPTVALLTSIVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLDLAPWVLYLLYSW-MILLVVLTPKIL-GH-TFPNEP-----T-T-QSAK-KP-ET---------Q-----S-W-AWP-WS------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLASNLAHAGASV [...]
+Seq33 ----M--NENLFTSFITPM-MLGLPLVTLIVLFPSLLFPT--SNRLINNRLISLQQWLLQLVSKQMMSIHNTKGQTWTLMLVSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRNKTK-ASLAHFLPQGTPTPLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLIHLIGGATLALTAINTTTALITFIILILL---TILEFAVAMIQAYVFTLLVNLYLHDN-T-M-PQLDTSTWLTMILSMF-LTLFIILQLKIS-KH-NFYYNP-----ELM-ATKT-PKQNT---------------P-W-ETK-WTKTYLPLSLP-L-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq34 ----M----NLFDQFAPAT-LMNVSLILMAMLFPWLLTPT-PLLRWKRNRLQTLQSWFFELSMKQLLLPLSTPAHKWAFLFISLLTFLLTMNLIGLLPYTFTPTTQLSINLGLAIPLWFTTVLVGFRNQPS-HSLAHFLPEGTPMPLIPVLILIETISLLIRP--LALGVRLTANLTAGHLLIHLVSSAVPAIFFMSPTASLMTFMILTLL---MTLELMVAMIQAYVFVLLLSLYLQEN-T-M-PQLDPVPWFCYLLMTW-LILVSLAPQKIL-AH-INLNKL-----N-I-KKTK-TF-TK---------Q-----T-W-TWT-WQ------------M-MI--NRWLFSTNHKDIGTLYLLFGAWAGMIGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFFLLLASSTVEAGAGTGWTVYPPLAGNLAHAGPSV [...]
+Seq35 ----V--TLSFFDQFMSPT-LLGIPLIALALTLPWVLFPK-PSSRWLNNRVLTLQSWFINGFAQQIFQPINQGGHKWAALLTSLMIFLITLNMLGLLPYTFTPTTQLSMNMAFAVPLWLATVIIGMRNQPT-HALAHLLPEGTPTPLIPILIMIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAALVLLPLMPTVAILTGALLLML---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILMFSW-LIFLTVIPPKIL-AH-TFPNEP-----T-H-QSTE-KP-KT---------D-----P-W-TWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMLGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGASV [...]
+Seq36 ----M--ILTFFDQFAIPH-LLGFPLIIPAMLIP-LTFFP-TTNRLAQNRLSTLISYTSKTITKQLMLPLSQKAHKWTNPLFSLMLMLTMLNLFGLLPYTFTPTTQLSINMALALPMWLMTVLTGLRTQTT-TSLGHMLPEGTPTPLIPMLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATLTLFPMSYTLTALLGTVLILL---TLLEIAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWLYLLILTW-TALPLYMVKIMHMSF-QATQAP-----N---QNHK-TTLKP---------L-------W-YWP-WS------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMAGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASAGVEAGAGTGWTVYPPLAGNLAHAGPSV [...]
+Seq37 ----M--NLSFFDQFSSPH-LLGIPLILLSLLFPALLFPS-PGNRWINNRLSTIQLWLLHLITKQLMIPLNKNGHKWALMLTSLMTMLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNKPS-ASLAHLLPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTASIALMPILPTVSILTMAILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFSIMVMTW-LTLALLIQPKLL-TF-TTTNPP-----S-K-KPSL-IT-KP---------T-----P-W-AWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMIGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq38 ----M--NLSFFDQFSSPT-ILGLPLIMVAMFLPWALIPN-PTSKWMTNRLSTLQIWLVHKFIKQLMLPLNTSGHKWSLMFVSLMVFIMTLNILGMLPYIFTPTTQLSLNLGLAIPLWLSTVLVGLRNQPT-STLGHLLPEGTPNPLIPILIIIETMSLFIRP--LALGVRLTANLTAGHLLIQLISTAVMVLTPVLPTASIIIMLVLFLL---TLLEIAVALIQAYVFVLLLSLYLQEN-T-M-PQLSPGPWFAIFTISW-MILLLILMPKIN-NL-KSMNEP-----T-F-MGLF-LN-KP---------Q-----S-W-NWP-WI------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGIEAGAGTGWTVYPPLASNLAHAGASV [...]
+Seq39 ----M--NLSFFDQFSSPT-ILGLPLIMIAMLLPWALIPD-PTKKWMTNCLSTLQIWLAHKFIKQLMLPLNISGHKWALMFMSLMVFIMTLNILGMLPYIFTPTTQLSLNLGLAIPLWLSTVLVGLRNQPT-STLGHLLPEGTPNPLIPILIIIETMSLFIRP--LALGVRLTANLTAGHLLIQLISTAVMVLTPVLPTASMVIMLVLFKL---TLLEIAVALIQAYVFVLLLSLYLQEN-I-M-PQLSPGPWFAIFMISW-MILLLILMPKIN-NL-KNMNEP-----T-S-TGLF-LN-KP---------Q-----S-W-NWP-WI------------V-MV--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGIEAGAGTGWTVYPPLASNLAHAGASV [...]
+Seq40 ----M--SLSFFDQFMSPT-LMGIPLIIVSMYFPLLLIPN-LTNKWLENRLSSLQLWFMCNLTKQLMGPLN-NGHKWSPLLISLMMFIIFMNLLGLFPYTFTPTTQLSMNLGLAAPLWLATVLMGLRNKPS-MALGHLLPEGTPALLIPALVLIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAIFILIPLMPVIATMTLMILLLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPSPWFLIFMMSW-FIYLIILMSKTT-NF-KMLNKP-----T---QYLY-LT-NP---------Q-----P-W-NWL-WV------------V-MI--TRWFFSTNHKDIGTLYLMFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLASNMAHAGASV [...]
+Seq41 ----M--SLSFFDQFMSPI-LMGVPLITLSLLLPWLLIPN-PTNQWCGNRLSSLQLWFSCNLTKQLMNPLNSNGHKWSLLLISLMVFIISMNLLGLLPYTFTPTTQLSMNLGLAAPMWLATVILGLRNQPT-MTLGHLLPEGTPTLLIPTLILIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAIFILLPLMPMVATMTLMMLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPDPWFLIFTLSW-LIYLIILMMKVM-NF-KSPNEP-----T-T-QNTY-MN-KP---------Q-----P-W-NWP-WA------------V-MI--TRWFFSTNHKDIGTLYLMFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLASNMAHAGASV [...]
+Seq42 ----M--MLSFFDQFMSPT-YMGISLITLALTLPWILYPT-PTSRWLNNRILTLQSWFVGRFTQQLLLPLNVGGHKWAVMLTSLMLFLLTMNLLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLMPMMPTVAILTAIVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILVFSW-AVFLAILPTKVM-AH-TFNNEP-----S-P-QTAK-KP-KL---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq43 ----M--MLSFFDQFMSPT-YMGISLITLALTLPWILYPT-PTSRWLNNRILTLQSWFVSRFTQQLLLPLNVGGHKWAVMLTSLMLFLLTMNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLMPMMPTVAILTAMVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFMILVFSW-AVFLAILPTKVM-AH-TFNNEP-----S-Q-QTAK-KP-KM---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq44 ----M--MLSFFDQFMSPT-YMGISLITLALTLPWILYPT-PTSRWLNNRILTLQSWFVSRFTQQLLLPLNVGGHKWAVMLTSLMLFLLTMNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLMPMMPTVAILTAMVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFMILVFSW-AVFLAILPTKVM-AH-TFNNEP-----S-Q-QTAK-KP-KM---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq45 ----M--MLSFFDQFMSPT-LMGISLIALALTLPWILFPT-PTSRWLNNRILTLQGWFINRFTQQLLLPLNLGGHKWAIMLTSLMLFLISMNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPIMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILVFSW-AVFLAILPTKVM-AH-TFNNEP-----N-L-QTAK-KP-KM---------D-----S-W-SWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq46 ----M--MLSFFDQFMSPT-FMGISLITLALTLPWILFPT-PTSRWLNNRILTLQGWFINRFTQQLLLPLNLGGHKWAIMLTSLMLFLLTTNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILVLSW-AVFLAILPTKVM-AH-TFNNEP-----N-L-QTAK-KP-KM---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq47 ----M--MLSFFDQFMSPT-FMGISLITLALTLPWILFPT-PTSRWLNNRILTLQGWFINRFTQQLLLPLNLGGHKWAIMLTSLMLFLLTTNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILVLSW-AVFLAILPTKVM-AH-TFNNEP-----N-L-QTAK-KP-KM---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq48 ----M--MLSFFDQFMSPT-FMGISLITLALILPWILFPT-PTSRWLNNRILTLQGWFINRFTQQLLLPLNVGGHKWAILLTSLMLFLLTTNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILVFSW-AVFLAILPTKVM-AH-TFNNEP-----N-L-QTAK-KP-KM---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq49 ----M--MLSFFDQFMSPT-YLGISLITLALTLPWVLYPT-PTSRWLNNRILTLQSWFISRFTQQLLLPLNIGGHKWAVMLTSLMLFLLTMNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLMPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILVFSW-AVFLAILPTKVM-AH-TFNNEP-----N-Q-QTAK-KP-KL---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq50 ----M--MLSFFDQFMSPT-LMGISLITLALTLPWILFPT-PTSRWLNNRILTLQGWFINRFTQQLLLPLNLGGHKWAIMLTSLMLFLLTMNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPAPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILVFSW-AVFLTILPTKVM-AH-TFNNEP-----N-L-QTAK-KT-KM---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq51 ----M--MLSFFDQFMSPT-FMGISLITLALTLPWILYPT-PTSRWLNNRVLTLQGWFVNRFTQQLLLPLNVGGHKWAIMLTSLMLFLLTTNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILVFSW-AVFLAILPTKVM-AH-TFNNEP-----N-L-QTAK-KP-KT---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq52 ----M--MLSFFDQFMSPT-FMGISLITLALTLPWVLYPT-PTSRWLNNRVLTLQSWFVSRFTQQLLLPLNVGGHKWAVMLTSLMLFLLTMNLLGLLPYTFTPTTQLSLNMGFAIPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAVLVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILVLSW-AVFLAILPTKVM-AH-TFNNEP-----N-L-QTAK-KP-KL---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq53 ----M--MLSFFDQFMSPT-LMGISLITLALILPWILFPT-PTSRWLNNRILTLQGWFVNRFTQQLLLPLNVGGHKWAVILTSLMLFLITMNMLGLLPYTFTPTTQLSMNMGFAVPMWLATVIVGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTSTVLLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILVLSW-AVFLAILPTKVM-AH-TFNNEP-----N-L-QTAK-KP-KM---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq54 ----M--MLSFFDQFMSPT-LMGISLITLALTLPWILFPT-PTSRWLSNRILTLQSWFVGRFTQQLLLPLNVGGHKWAIMLTSLMLFLLTMNLLGLLPYTFTPTTQLSLNMGFAVPMWLSTVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPIMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILVFSW-AVFLAILPTKVM-AH-TFNNEP-----N-L-QTAK-KS-KM---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq55 ----M--MLSFFDQFMSPT-YMGISLITLALTLPWVLYPT-PTSRWLNNRILTLQSWFVNRFTQQLLLPLNVGGHKWAVMLTSLMLFLLTMNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILVFSW-AVFLAVLPTKVM-AH-TFNNEP-----N-L-QTAK-KP-KL---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq56 ----M--MLSFFDQFMSPT-LMGISLIALALTLPWILFPT-PTSRWLNNRILTLQGWFINRFTQQLLLPLNLGGHKWAIMLTSLMLFLISMNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPIMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILVFSW-AVFLAILPTKVM-AH-TFNNEP-----N-L-QTAK-KP-KM---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq57 ----M--MLSFFDQFMSPT-LMGISLITLALTLPWILFPT-PTSRWLNNRILTLQGWFINRFTQQLLLPLNLGGHKWAIMLTSLMLFLLTMNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILVFSW-AVFLAILPTKVM-AH-TFNNEP-----N-L-QTAK-KP-KM---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq58 ----M--MLSFFDQFMSPT-FMGISLITLALTLPWILFPT-PTSRWLNNRTLTLQSWFVNRFTQQLLLPLNVGGHKWAIMLTSLMLFLLTMNLLGLLPYTFTPTTQLSLNMGFAIPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILVFSW-AVFLAILPTKVM-AH-TFNNEP-----N-L-QTAK-KP-KM---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq59 ----M--MLSFFDQFMSPT-YMGISLITLALTLPWILYPT-PTSRWLNNRTLTLQSWFVNRFTQQLLLPLNVGGHKWAVMLTSLMLFLLTTNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLMPMMPTVAILTAVVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILVFSW-AVFLAILPTKVM-AH-TFNNEP-----S-P-QTAK-KP-KL---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq60 ----M--TLSLFDQFMSPT-LLGIPLIAISLSLPWVLFPT-PTTRWLNNRLLSLQGWFINRFAQQLMLPLNPGGHKWALLLTALMIFLITVNLLGLLPYTFTPTTQLSLNMGLAAPLWLTTVIIGMRNQPT-HALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIAMGISALVSMMPTTALIMMVLLLLM---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFLILVFSW-FIFLTLLPPKVL-AH-SFPNEP-----T-A-QSTE-KP-KT---------E-----P-W-NWT-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq61 ----M--NLTLFDQFSSPQ-LLGIPLILLSTLFPALLLPS-PNNRWITNRLSALQLWLFQLITKQLMVPLNKAGHNWALILSSLMTFLLLINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ISLAHILPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATMALLSIMPAISILTMLILLLL---TILELAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPHPWFSILLMVW-FILLLLIQPKFL-SF-IHTNPP-----S-N-KTKM-AP-IP---------P-----T-W-TWP-WT------------VTFI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTIEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq62 ----M--NENLFSSFIAPS-MMGLPIIILIILFPIILFKT--PTRLMNNRLISLQMWLIKLVTKQMMTIHNKKGQTWSLLLMSLITFISSTNLLGLLPYSFTPTTQLSTNLAMAIPLWAGTVLVGFRHKTK-SSLAHFLPQGTPTPLIPMLIVIETVSLLIQP--MALAVRLTANITAGHLLMHLIGSATLGLMTISLPTATITLILLILL---TVLELAVAFIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLITIISTI-ITLFIFFQMKII-TF-NFLQKP-----EIK-NLKI-YTTKT---------------P-W-ENK-WTKTYSPPSLPPQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTIEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq63 ----M--TLSLFDQFMSPT-LLGIPLIAISLSLPWVLFPT-PSLRWLNNRLLSLQGWFINRFAQQLMLPLNPGGHKWALLLTALMIFLITINLLGLLPYTFTPTTQLSLNMGFAVPLWLATVVIGMRNQPT-HALGHLLPEGTPTALIPTLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIAMGINALVSVMPTTALIMSVLLLLM---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFLILIFSW-TIFLALLPSKVL-AH-TFPNEP-----T-T-QSTE-KP-KT---------E-----P-W-NWT-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLSSSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq64 ----M--NLSFFDQFSSPN-LLGIPLILLSLLFPTLLFPS-PNNRWINNRLSTIQTWLLHLITKQLMVPLNKNGHKWAMMFTSLMVMLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ASLAHLLPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTASIALMPTLPAVSILTMIILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFSIMVMTW-LTLALLIQPKLL-AF-TTTNPP-----S-N-KTSL-TT-KP---------T-----P-W-SWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq65 ----M--NLSFFDQFSSPH-LLGIPLILLSLLFPALLFPS-PNNRWISNRLSALQLWFLHLITKQLMMPLNKNGHKWALMLTSLMTMLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-TSLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATTALLPLMPAVSVLTALVLLML---TILEIAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFSTMIMTW-LIFSLLIQPKLL-SF-MPTNPP-----L-N-KPHT-PT-KT---------T-----P-W-SWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMIGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq66 ----M--TLSFFDQFMSPT-YLGIPLMALALILPWVFFPR-PSSRWLENRLLTLQSWFINRFTQQLLLPLNMGGHKWALLLTSLMLFLISLNMLGLLPYTFTPTTQLSLNLGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVLLIPILIVIETISLFIRP--LALGVRLTANLTAGHLLMQLIATAAFVLLPLMPTVAILTTVLLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPTPWFAILTFSW-LIFLMVLPSKVL-AH-TFPNEP-----A-S-QSTE-KP-KT---------E-----P-W-TWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAAMVGTALSLLIRAELSQPGALLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq67 ----M--MLSLFDQFMSPT-LLGIPLIIIALSLPWIMLPK-PSTRWLENRLLTLQNWFINRFTQQLLLPLNPGGHKWATMLTSLMIFLITINMLGLLPYTFTPTTQLSLNMGLAVPMWLATVLIGMRNQPT-HSLGHLLPEGTPTPLIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPLMPTIAIITSVLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFMILVFSW-CIFLSVLPPKVM-AH-SFPNDP-----N-P-QSTK-TT-KT---------T-----P-W-TWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq68 ----M--MTSFFDQFASPS-FLGIPLITIAIALPWVLFPT-PPSRWINNRLITVQTWFINRFTNQLMMPLNVGGHKWALLLASLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-IALGHLLPEGTPIPLIPVLIIIETISLLIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQ-----M-PQLNPNPWFAILVFSW-IIFLTIIPTKIL-NH-TSPNEP-----A-P-MNEE-KH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq69 ----M--APNFFDQFSSPT-HFGVPLIMIALTFPWILYPT-PSNRWLENRLVTLQNWFINRFTQQLLLPLNPEGHKWALMLSSLMIFLISLNLLGLLPYTFTPTTQLSLNLGLAVPFWLATVLIGMRNRPT-AALAHLLPEGTPPLLIPILIMIETVSLFIRP--LALGVRLTANLTAGHLLIQLIATATAVLLPMTVTLATLTMTVLFLL---TLLEIAVAMIQAFVFILLLSLYLQEN-I-V-PQLNPAPWFTILLFSW-VIFLTVIPPKML-KH-LFISPP-----T-A-LSTK-DS-KT---------Q-----P-W-NWP---------------V-AF--TRWFFSTNHKDIGTLYMVFGAWAGMIGTALSLLIRAELNQPGTLLEDDQIYNVAVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIAAPDMAFPRMNNMSFWLLPPSFFLLLASAGLEAGVGTGWTLYPPLAGNAAHAGASV [...]
+Seq70 ----M--NLSFFDQFASPQ-LLGIPLILLSMLLPALLLPS-PTNRWMTNRLSTLQSWFLQLITKQLMIPLNKMGHKWALILSSLMTFLLLINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ISLGHLLPEGTPTILIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATMTLLPIMPAISILTASILLLL---TILELAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFLIMLMSW-LTFSFLMQPKLL-SF-LPTNLP-----T-S-KTKT-IL-NP---------T-----P-W-SWP-WT------------VTFT--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTIEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq71 ----M--TVSLFDQFMSPT-LLGLPLIVLATTLPWIMYPT-PTTRWLNSRLLALQGWFINRFTQQLLLPLNLSGHKWAALLTSLMIFLITMNLLGLLPYTFTPTTQLSLNLGLATPLWLATVIIGVRNQPT-HALGHLLPEGTPGPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAAFVLLSSMPAIALLTSTVLVLL---TLLEVAVAMIQAYVFVLLLTLYLQEN-V-M-PQLNPTPWFTILIFSW-LIFLTVIPPKVM-AH-TFPYEP-----T-L-QSTE-NP-KT---------A-----P-W-AWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTGLSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq72 ----M--NLSFFDQFMSPH-LLGIPLILLSTLFPALLLPT-PGNRWITNRLSTLQSWSLHLIAKQLMTPLNKNGHKWALILTSLMTLLLMINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ASLGHLLPEGTPTPLIPALIMIDTTSLLIRP--LALGVRLTANLTAGDLLIQLISMATTALLSIMPAISILTTLILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFFIMLLSW-LTFTLIIQPKLL-SF-PPTNPP-----S-N-KTTA-HT-KT---------T-----P-W-TWP-WT------------VTYI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq73 ----M--TLSFFDQFMSPV-FLGIPLMALAFTLPWLLFPK-PTSRWLNNRLITLQTWSLMRFTQQIFQPLSRPGHKWALILASLMVFIISLNLMGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTWALLFFL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWLAIFIFSW-LILLIIIPPKIL-AH-LNPNEP-----S-L-QDSQ-QP-KT---------S-----S-W-TWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGASV [...]
+Seq74 ----M--NENLFTSFASPT-MMGLPIVTLIILFPSMLFPS--PGRLINNRFTSIQQWLIQLTSKQMMLIHNHKGQTWTLMLMSLIMFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVAMGLRHKTK-ASLAHFLPQGTPSPLIPMLVIIESISLLIQP--MALAVRLTANITAGHLLIHLIGGATLALTNISMITALITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWSTTIVSMI-LTLFIIFQLKIS-KH-HFPMSP-----ELK-PLST-SKTNT---------------P-W-EKK-WTKIYLPLSLPLQ-M-FV--NRWLFSTNHKDIGTLYLLFGAWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSLVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq75 ----M--NENLFTSFTSPT-MMGLPIVTLVILFPSMLFPS--PGRLINNRFTSIQQWLIQLTSKQMMMIHNHKGQTWTLMLTSLIMFIASTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVAMGLRHKTK-ASLAHFLPQGTPSPLIPMLVIIESISLLIQP--MALAVRLTANITAGHLLIHLIGGATLALTNISMITALITFIILILL---TIREFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFTTIASMI-LTLFIVFQLKIS-KH-HFPMSP-----ELK-SLSA-SKTNT---------------P-W-EKK-WTKIYSPLSLPLQ-M-FV--NRWLFSTNHKDIGTLYLLFGAWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSLVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq76 ----M--NENLFTSFASPT-MMGLPVVTLIILFPSMLFPS--PGRLINNRLTSIQQWLIQLTSKQMMSIHNRKGQTWTLMLMSLIMFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVAMGLRHKTK-ASLAHFLPQGTPSPLVPMLVIIESISLLIQP--MALAVRLTANITAGHLLIHLIGGATLALTNISMITALVTFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFTTIVSMI-LTLFIIFQLKIS-KH-HFPMSP-----ELK-PLST-SKTNI---------------P-W-EEK-WTKIYLPLLLPLQ-M-FV--NRWLFSTNHKDIGTLYLLFGAWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSLVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq77 ----M--TVSLFDQFMSPT-LLGIPLIALALTLPWIMYPA-PSTRWLNSRFLALQGWFINRFTQQLLLPLSLGGHKWAALLTSLMIFLITMNMMGLLPYTFTPTTQLSLNLGLATPLWLATVIIGMRNQPT-HALGHLLPEGTPGPLIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAAFVLLSSMPAVALLTSTVLVLL---TLLEVAVAMIQAYVFVLLLTLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLAVIPPKVM-AH-TFPNEP-----T-L-QSAA-KP-KT---------E-----S-W-TWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWPGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq78 ----M--NLSFFDQFTSPC-LLGIPLILLAMLFPALLLPS-PNNRWITNRLSTLQLWFLHLITKQLMMPLNKAGHKWALILTSLMMFLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-MSLGHLLPEGTPTLLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATTALLPILPAVSALTTLILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFFILLMSW-TAFSLIIQPKLL-SF-TTTNPP-----S-T-KPKV-TP-KT---------T-----P-W-AWP-WT------------VTFI--TRWLFSTNHKDIGTLYLIFGAWAGMIGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFMLLLASSTVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq79 ----M--NLSFFDQFTSPC-LLGIPLILLSMLFPALLLPT-PDNRWITNRFTTLQLWFSHLITKQLMAPLNKSGHKWALILTSLMMFLLLINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ASLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATTALLPLIPAVSLLTASILLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFFIMLASW-LTFSLIIQPKLL-SL-TPTNPP-----S-N-KTST-TT-KT---------T-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq80 ----M--NENLFASFITPT-MMGLPIVILIIMFPTIMFPS--TNRLVNNRLVAIQQWLVYLTSKQMLSIHNRKGQTWALMLMSLILFIGCTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVILGFRHKTK-ASLAHFLPQGTPLPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMNISTATALITFMILVLL---TILEFAVALIQAYVFTLLVSLYLHDN-A-M-PQLDTSTWFITILATI-LTLFIIMQLKIS-TY-YYHSNP-----EPK-TTKM-TKSLI---------------P-W-EIK-WTKIYSPLSLPLR-M-FI--SRWFFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGVGTGWTVYPPLAGNLAHAGASV [...]
+Seq81 ----M--TVNFFDQFMSPN-FLGIPMILLSLLLPWFLFPS-PSSLWIKNRLVTLQSWALNQFVKQICSPLHPAGHKWALMFTSLMLFLVSLNTLGLLPYTFTPTTQLSLNLGLAIPLWLATVVIGLRNHTT-RSFAHLLPEGTPALLVPVLIIIETISLFIRP--FALGVRLTANLTAGHLLIHLISTGVFVLSSLSMPAAILTSLLLLLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-I-M-PQLDPTPWLITLLFSW-FTLLTIVPLKLL-PH-LVPNEF-----TRKDTNKL---KNT---------------T-W-TWP-WQ------------V-ET--TRWLFSTNHKDIGTLYMVFGAFAGMIGTALSLIIRAELSQPGTLLGDDQLYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSSVEAGAGTGWTVYPPLSANLAHAGASV [...]
+Seq82 ----M--TLSFFDQFMSPT-YLGVPLIALALTLPWVLFPK-PSPRWLNNRLLTLQGWFINRFTQQIFQSLSLGGHKWAVLLTSMMLFLITLNILGLLPYTFTPTTQLSLNMAFAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPVVALLTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-AH-SFPNEP-----A-P-KSTE-KP-ET---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGPSV [...]
+Seq83 ----M--TLSFFDQFMSPT-YMGIPLMALALTLPWILYPT-PSSRWLNNRLMSLQSWFIGQFTHQLMLPLGLGGHKWATMLTSLMIFLITINMLGLLPYTFTPTTQLSLNMGFALTLWMATVIIGMRNQPT-MVLGHLLPEGTPVPLIPVLIIIETISLFIRP--IALGVRLTANLTAGHLLIQLIATGAYVLLPMMPTVATLTAVLLLLL---TLLETAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFSILIFSW-LVFLLIIPSKVI-KH-TFPHDP-----A-S-HDTK-PP-TP---------N-----P-W-NLP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELNQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq84 ----M--TLSFFDQFMSPT-YLGIPLIALALTLPWILFPS-SSPRWLENRLLTLQNWFIGRFTQQLFQPVNLGGHKWALLLASLMIFLISLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPTPLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTTLLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLAVIPPKIL-SH-SFPNDP-----T-T-QSTK-TP-KS---------Q-----P-W-NWP-WH------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq85 ----M--TLSFFDQFMSPV-FLGIPLMALALTLPWILFPT-PTTRWLNNRLLTLQNWFIGRFAHELFMPVNLPGHKWAVLLTSLMLFLISLNMLGLLPYTFTPTTQLSLNMGLAFPLWLATVIIGMRNQPT-EALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAATVLLPLMPTVAILTATILFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLAILVFSW-LVFLIVIPPKVM-AH-SFPNEP-----T-P-QSTE-KP-KG---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq86 ----M--TLSFFDQFMSPV-FLGIPLMALALTLPWILFPT-PTTRWLNNRLLTLQNWFIGRFAHELFMPVNLPGHKWAVLLTSLMLFLISLNMLGLLPYTFTPTTQLSLNMGLAFPLWLATVIIGMRNQPT-EALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAATVLLPLMPTVAILTATILFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLAILVFSW-LVFLIVIPPKVM-AH-SFPNEP-----T-P-QSTE-KP-KG---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq87 ----M--NLSFFDQFSSPY-LLGIPLILLSLLFPALLFPS-PGNRWISNRLSTIQLWLLHLITKQLMIPLNKSGHKWALMLTSLMTMLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNKPS-ASLAHLLPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTASIALMPILPAVSVLTMVILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFSIMIMTW-LTLALLIQPKLL-TF-TTTNPP-----S-S-KPSL-TT-KP---------T-----P-W-AWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMIGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq88 ----M--NENLFAPFMAPV-MVGIPITTLIIILPSILFPT--PNRLINNRMISIQQWLTKLTSKQLMNTHSPKGQTWSLMLISLFLFIASTNLLGMLPHSFTPTTQLSMNVGMAIPLWAGTVFTGFRNKTK-MSLAHLLPQGTPTFLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGEATLALMDISLFTTLITFTILTLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLLTILSML-LTLFVLLQLKIS-KH-SHSPNP-----KLV-LTKT-RKQQT---------------P-W-NTT-WTKIYLP---LS--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLIGDDQVYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSMVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq89 ----M--NENLFAPFMIPT-MLGIPVITLIIILPSILFPT--PNRLVNNRTISIQQWLTKLTSKQLMSVHSPKGQTWSLMLISLFLFIASTNLLGMLPHSFTPTTQLSMNVGMAIPLWAGTVITGFRNKTK-MSLAHLLPQGTPTFLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGETTLVLMNTSFLMALITFTILALL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLLTILSMF-LALFMLFQLKIS-NH-SYFPSP-----KPM-YTKT-QKQQT---------------P-W-NTT-WTKIYLP---LL--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLIGDDQVYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSMVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq90 ----M--NENLFAPFMIPM-MLGLPITTLIIILPSILFPT--PNRLVNNRTISIQQWLTKLTSKQLMNVHSPKGQTWSLMLISLFLFIASTNLLGMLPHSFTPTTQLSMNVGMAIPLWAGAVITGFRNKTK-MSLAHLLPQGTPTFLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGETTLVLMSTSLLTALITFTILTLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLLTILSMF-LALFVLLQLKIS-NH-SYSPNP-----KPT-YTKT-QKQQT---------------P-W-NTT-WTKIYLP---LL--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLIGDDQVYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSMVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq91 ----M--NENLFAPFMIPM-MLGIPITTLIIILPSVLFPT--PNRLINNRTISIQQWLTKLTSKQLMNVHSPKGQTWSLMLISLFLFIASTNLLGMLPHSFTPTTQLSMNMGMAIPLWAGTVATGFRNKTK-MSLAHLLPQGTPTFLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGETTLVLMNTSPFTALITFTILALL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLLTILSMF-LALFMLFQLKIS-KH-SYSPSP-----KLV-FTKT-QKQQT---------------P-W-NTT-WTKIYLP---LL--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLIGDDQVYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSMVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq92 ----M--NENLFAPFMIPT-MLGIPITTLIIILPSVLFPT--PNRLINNRTISIQQWLTKLTSKQLMNVHSPKGQTWSLMLISLFLFIASTNLLGMLPHSFTPTTQLSMNMGMAIPLWAGTVATGFRNKTK-MSLAHLLPQGTPTFLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGETTLVLMNTSLFTALITFTILALL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLLTILSMF-LALFMLFQLKIS-KH-SYSPSP-----KLV-STKT-QKQQT---------------P-W-NTT-WTKIYLP---LL--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLIGDDQVYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSMVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq93 ----M--NENLFAPFMIPM-MLGIPITTLIIILPSILFPT--PNRLINNRTISIQQWLTKLTSKQLMNVHSPKGQTWSLMLISLFLFIASTNLLGMLPHSFTPTTQLSMNMGMAIPLWAGTVATGFRNKTK-MSLAHLLPQGTPTFLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGETTLVLMNTSLFTALITFTILALL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLLTILSMF-LALFMLFQLKIS-KH-SYSPSP-----KLV-FTKT-QKQQT---------------P-W-NTT-WTKIYLP---LL--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLIGDDQVYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSMVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq94 ----M--NENLFAPFMIPV-MLGIPITTLIIILPSILFPA--PNRLINNRTISIQQWLTKLTSKQLMSVHSPKGQTWSLMLISLFLFIASTNLLGMLPHSFTPTTQLSMNVGMAIPLWAGTVATGFRNKTK-MSLAHLLPQGTPTFLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGETTLVLMSTSLFTAIITFTILALL---TILEFRVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLLTILSML-LTLFVLFQLKIS-KH-SYSPNP-----KLV-PTKT-QKQQT---------------P-W-NIT-WTKIYLP---LL--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLIGDDQVYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSMIEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq95 ----M--NENLFTPFMTPV-MLGIPITTLIIMLPSILFPT--PNRLINNRMISIQQWLTKLTSKQLMNVHSPKGQTWSLMLISLLLFIASTNLLGMLPHSFTPTTQLSMNVGMAIPLWAGAVAAGFRNKTK-MSLAHLLPQGTPTFLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGETTLALMSTSLFTALITFTILALL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLLTISSML-LTLFVLFQLKIS-KH-SYLPSP-----KLM-STKT-QKQQT---------------P-W-DTA-WTKIYLP---LL--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLIGDDQVYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSMVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq96 ----M--NENLFAPFMIPV-MLGIPITTLIIILPSMLFPA--PNRLINNRTIAIQQWLTKLTSKQLMNVHSPKGQTWSLMLISLFLFIASTNLLGMLPHSFTPTTQLSMNVGMAIPLWAGTVTTGFRNKTK-MSLAHLLPQGTPTFLIPMLVIIETISLFIQP--VAWAVRLTANITAGHLLMHLIGETTLALMNINLFSAFITFTILALL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSMWLLTILSML-LTLFVLFQLKIS-KH-SYSPNP-----KLA-HTKT-QKQQA---------------P-W-NTT-WTKIYLP---LL--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLIGDDQVYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSMIEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq97 ----M--AMSFFDQFASTS-YLGIPLIAVAIALPWVLYPT-PTSRWINNRLLTVQGWFIGRFTSQLMLPLNAGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTIIPTKVM-SH-TMPNEP-----A-H-LDAE-KH-KT---------E-----P-W-DWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq98 ----M--MASFFDQFASPS-YLGVPLIAIAIALPWVFYPT-PSSRWINNRLITIQGWFINRFTNQLMLPLNVGGHKWALLLTSLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLLIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAILMFSW-LIFLTIIPTKIL-SH-TSPNEP-----T-P-VSAE-KH-KT---------E-----S-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGASV [...]
+Seq99 ----M--MASFFDQFMSPS-YLGIPLIAVAIALPWVLYPT-PSSRWINNRLITVQGWFINRFTNQLMLPLNVGGHKWALLLTSLMTFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVVIGMRNQPT-VALGHLLPEGTPILLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAILVFSW-LIFLVVIPTKVM-NH-TSPNEP-----T-P-LSAE-KH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGASV [...]
+Seq100 ----M--MTSLFDQFASPY-SLGIPLIAIAIVLPWVMYPT-SSPRWLNDRLVTIQGWAVNRSTNQLMLPLNLKGHKWSLLLASLMIFLITINMLGLLPYTFTPTTQLSLNMGIAVPLWLATVIMGMRNQPT-IALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVYILLPILPAVAILTATMLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFMILMYSW-LVLLVVVSTKVS-NI-TSPNEL-----I-L-ISTE-KH-KT---------E-----S-W-NWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq101 ----M--ILNLFDQFASPT-LLAIPLVVFAMLAPWDMYPA-PGKQWLGNRMLAIQAWTFKTLTQQIVMPANVMGHKWALLLMSLLVFLITLNMMGTLPYTFTPTTQLSLSLGLAFPLWLATVIIGLRYHPV-RSIGHLLPESTPTLLIPVLIIIETISLLVRP--LALGVRLAANLTAGHLILQMIASTTIGLLCLMNPAGLLGAVVLYLL---ACLELAVAAIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWLMILIFAW-TVLLVVIPPKIL-AH-TYPNEP-----T-A-QNNK-AP-ES---------Q-----P-W-NLP-WS------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq102 ----L--TLSLFEQFTSPV-FLGIPLAVIALSLPWLLCPT-PSNRWLGSRTTILQGWFIARFTNQLFMPLKPSGHKWALLFMTLVTFLLTVNLMGLLPYTFTPTTQPELNLGLALPLWLTTVVIGFRNQPT-HALGHLLPEGTPTPLVPVLIIIESISLIIRP--IALGVRLTANLTAGHLLIHLISSGIFNILQTMTTVALLAFVLLLVL---ILLEMAVAMIQAYVFVLLLSLYLQEN-I-M-KMTKRDRYYYFLLMVF--LLLLYIPLFFL-CW-VFPNQM---------TAYY-AKQKP---------------QGW-SFP-WH------------V-MI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPLMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq103 ----M--TLSFFDQFSSPT-YLGIPLMALALTLPWILFPT-PSARWLNNRLITLQGWFINRFTQQLLLPLNLGGHKWATMLASLMLFLISLNMLGLLPYTFTPTTQLSLNLGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPTPLIPILIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPTVAILTASVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVLLTIIPPKVL-NH-TFPNEP-----S-T-LSAQ-KT-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq104 ----M--NLSFFDQFASPT-ILGVPLIILSLALPTLLLFP-QTKLWMGSRTQSLQLWFSHSFIKQLMLPLNKPGHKWALALMSLMLMLMFINLLGLLPYTFTPTTQLSMNLGLAVPLWLSTVLMGMRNQPT-NSLGHMLPEGTPTLLIPTLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAVFVLLPMMPTVAIITAMVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWLSIFLMSW-LIYLIILLPKVG-NL-KVLNKT-----T-T-QSSN-TI-ET---------Q-----P-W-NWP-WT------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPLMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq105 ----M--NLSFFDQFASPT-LMGMPLFVMSLVFPILLLPP-QIKQWVGGRTQSLQIWFFNNITKQLMSPLNMPGHKWSLIFMALIVLLMTINLLGLLPYTFTPTTQLSMNLGLAIPLWLSTVLIGIRNQPT-SSLGHLLPEGTPILLIPTLIMIETISLFIRP--LALGVRLTANL-AGHLLIQLISTAVFVLLPMMPTIAIITMTVLLLL---TLLEIAVAVIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWLLFFIVSW-LVYLTILTPKMN-NL-KMLNEP-----T-M-KNIN-MN-MT---------Q-----H-W-NWP-WT------------M-MV--TRWLFSTNHKDIGTLYLMFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq106 ----M--NLSFFDQFLSPV-VMGVPLVMLAMLLPWLLFPN-PTNKWLNNRLSTLQIWSSQKFSKQLMLPLNMKGHKWAMIFTALMTFLVTINLLGLLPYTFTPTTQLSLNLGLAVPFWLATILIGLRNQPT-ATFGHLLPEGAPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATATLTILPMMPMVSILTMGVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAIFFLSW-TVFMFILTFKVS-KL-NNLNEP-----T-S-QNMK-KN-EP---------K-----S-W-NWP-WI------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPVMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq107 ----M--NLSFFDQFLSPV-MMGIPLMMLAMMLPWLLFPN-PTNKWLNNRLSTLQIWFSQKFTKQLMFPLSIGGYKWAMILTSLMVFLITINLLGLLPYTFTPTTQLSLNLGLAVPFWLTTILIGLRNQPT-AAFGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATATLVLLPIMPLASILTMLVLLLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAIFIISW-IVFLLILTFKIS-NF-INLNEP-----T-S-QNIK-KN-KP---------E-----S-W-NWP-WI------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq108 ----M--NLSFFDQFLSPV-MMGIPLVMMAILLPWLLFPT-PTDKWLNNRLSTLQIWSSQKFTKQLITPLNFKGHKWAMIFTALMMFLITINLLGLLPYTFTPTTQLSLNLGLAVPFWLATILIGLRNQPT-ATFGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATATLVLLPMMPMVSILTMLVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAIFLLSW-AVFLFILTFKII-KF-NNLNEP-----T-S-QNIK-KN-KP---------E-----S-W-NWP-WI------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPSTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq109 ----M--NLSFFDQFLSPT-MMGIPLMMVAMTLPWLLFPR-PTNKWLNNRLSTLQIWFSQNFTKQLMLPLNIGGYKWAMILTSLMMFLITINLLGLLPYTFTPTTQLSLNLGLAVPFWLATILIGLRNQPT-AAFGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATATLVLFPLMPIMSILTMLVLFLL---TLLEIAVAMIQAYVFVLLLSLYLPEN-V-M-PQLNPGPWFAIFIMSW-IVFLLILTFKIS-NF-NNLNEP-----T-S-QNIK-KN-KP---------E-----S-W-NWP-WI------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq110 ----M--NLSFFDQFLSPM-MMGIPLVMVAMTLPWLLFPS-PTNKWLNNRLSTLQIWSSQKFTKQLMSPLNIGGYKWAMILTSLMMFLITVNLLGLLPYTFTPTTQLSLNLGLAVPFWLATILIGLRNQPT-TAFGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATATLVLLPMMPMVSILTMLVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAIFIMSW-IVFLLILTFKVN-NF-NNLNEP-----T-S-HNIK-KN-KP---------E-----S-W-NWP-WI------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq111 ----M--NENLFTSFTVPV-VLGIPITTLIIMFPTILFPS--PNRLINNRVISLQQWLTKLTSKQLMNTHSPKGQTWSLMLISLLLFIASTNLLGMLPHSFTPTTQLSMNIGMAVPLWAGTVITGFRNKTK-MSLAHLLPQGTPTFLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGKTTLVLMSINLPMAFITFTILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLLAILSML-LALFTLLQLKIS-KH-LYCPDP-----KTV-VTKT-QKQQT---------------P-W-NIT-WTKIYLPLSLSQ--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRTELGQPGTLIGDDQLYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGSPDMAFPRMNNMSFWLLPPSFLLLMASSMIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq112 ----M--ILSFFDQFMSPT-YLGIPLIALALSLPWILYPA-PTGRWLNNRLLALQGWFINRFTQQLLLPMSLGGHKWAALFTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATATAVLAPLMPTVAILTGTLLLML---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILIFSW-LIFLTFLPPKVL-AH-TFPNEL-----T-T-QSTE-SP-NT---------Q-----S-W-NWP-WS------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq113 ----M--ILSFFDQFMSPT-YLGIPLIALALSLPWILYPA-PTSRWLNNRLLALQGWFINRFTQQLLLPMSLGGHKWAALFTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATATAVLAPLMPTVAILTGTLLLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILIFSW-LIFLTFLPPKVL-AH-TFPNEL-----T-T-QSTE-SP-NT---------Q-----A-W-NWP-WS------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq114 ----M--MLAYFDQFASPT-LLGLPLVLPALAAPFMLLPT--TKRLIQNRMATLTSHTILMITKQIFQPLRPEGHKWAATYTTLLLLILSMNLMGLLPYTFTPTTQLSINMSLALPMWLSTVLIGLRKRTN-DTLSHMLPEGTPGPLIPMLIIIETISLLIRP--LALAVRLTANLTAGHLLLQLTSSATLYALQLNMAPFALLTVTLLLL---SLLELAVAFIQAYVFVLLLSLYLQEN-T-M-PQLNPAPWFPLLLLTW-GTLLLLMMKTTH--N-TKQTDP-----T---VATH-TNH-H---------T-----T-W-PWP-WY------------V-SL--TRWFFSTNHKDIGTLYLLFGAWAGAAGTALSLLIRAELGQPGALLGNDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASAGVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq115 ----M--TLAYFDQFASPA-LLGLPLVLPATTIPLMLLPT--TSRLIQNRTSTLTNHMILIATKQIFYPLRPEAHKWAAAYTTLLLLLLMMNLLGLLPYTFTPTTQLSINMALALPLWLATITIGLRLRTN-ATLAHMLPEGTPSPLIPMLIVIETISQLIRP--LALAVRLTANLTAGHLLLQLASSATLYALTLPTTPFTLLMITLLLL---TVLELAVGFIQAYVFVLLLSLYLQES-T-M-PQLNPTPWFPLLLLIW-TTLLLLMTKITR--H-NKHRSP-----G---HPPT-TAH-N---------I-----A-W-PWP-WH------------V-SF--TRWFFSTNHKDIGTLYLVFGAWAGAVGTALSLLVRAELGQPGALLGNDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASAGVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq116 ----M--MLAYFDQFATPT-ILGLPLIIMAVLAPIPLLPS--TNRLIQNRMRTLSNQTMTAMAQQIFRPLPSMAHKWASPYIALLFMLLTMNLLGLLPYTFTPTTQLSINLSLAVPLWLATVLIGLRLHTT-HAISHMLPEGTPTPLIPMLVMIETISLFIRP--LALAVRLTANLTAGHLLLQLISSATMYMIHLSATPSSLLIMVLLLL---TMLELAVAIIQAYVFVLLLSLYLQEN-T-M-PQLDPTPWFALLILTW-TTLMLLMTKISN--S-TTPPSP-----S---SQWE-KAH-G---------T-----T-W-PWP-WY------------V-SL--TRWLFSTNHKDIGTLYLLFGAWAGAAGTALSLLIRAELGQPGALLGNDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASAGMEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq117 ----M--MTSFFDQFASPS-FLGIPLIAIAIALPWMLFPT-PPSRWLNNRLITLQTWFINRFTNQLLLPLNVGGHKWALLFASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IIFLTIIPTKIL-NH-TTPNEP-----A-P-MNEE-KH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq118 ----M--NMNMFEQFASPE-VLFIPVTMGSMLMPIIMIHS--NHSLLGNRMTMIIKWFLKTMLYNMVHQLSPKGQKWSRFLAGAIMFIMLSNLLGLLPYTFTTTSQLSMNMAMAIPLWLATLITGMTLKPS-STLAHMLPEGSPTPLIPFMIMIETVSLLMRP--IALGVRLTANITAGHLLMTMISSAALSFINTINTMSIMMTALLILL---TLLEVAVACIQAYVFVLLVTLYLQEN-T-M-PQLDIVFIMMVYTWTW--MSLMIMTWKIQ-KM-TMNNVP-----EK-NNMLMNNTEHM-----------------PT-LP-WT------------V-YI--TRWLFSTNHKDIGTLYLLFGAWSGLIGACLSILMRMELTQPGSLFGSDQIFNVLVTAHAFIMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPALLLLLSSSYVEAGAGTGWTVYPPLSSNMVHSGPS [...]
+Seq119 ----M--NLSLFDQFMSPI-LLYMPLIFISLMFPMLLISP-KTPYWVGNRFNTLQIWFMYAFIKQLLLPLTTKSNKWATLMMSLLLLLMSVNLLGLLPYTFTPTTQLSMNLGLAVPLWLATVIMGLKNKTT-EALGHLLPEGTPTLLIPALITIETISLLIRP--LALGVRLTANLTAGHLLMHLISAATLIILSILPAAAALTMLVLLLL---TILEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNPHPWFLILMMSW-LIYLMVMS-KSN-SL-KMLNNS-----L---TKTN-QY-FL---------K-----S-W-NWP-WI------------V-MI--TRWLFSTNHKDIGTLYLIFGAWAGMIGTALSLLIRTELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq120 ----M--NLSFFDQFMSPL-LLGVPLIAVAIVMPGLLLPT-PSNRWISNRLITLQTWFVNNFTKQIFSPINLGGHKWALMLTSLMLFLISVNLLGLLPYTFTPTTQLSLNMGLAVPLWLATVLVGLRNQPT-VALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPAVSIITSIILFLL---TILEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAILIFSW-LILLTIFPQKVT-KH-LSMNEP-----A-T-QTTE-KS-KP---------T-----P-W-PWP-WT------------V-AI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMMGGCGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq121 ----M--NLSFFDQFMSPL-FLGIPLIAIAILMPSLLLPT-PSNRWVNNRLITLQTWFINNFTKQIFSPINLGGHKWALMLASLMLFLISMNLLGLLPYTFTPTTQLSLNMGLAVPLWLATVLIGLRNQPT-AALGHLLPEGTPTPLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPTVSIITSIILFLL---TILEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFAILMFSW-LILLTVYPQKVT-KH-LSTNEP-----A-T-QNTE-KS-KP---------T-----P-W-TWP-WT------------V-AI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq122 ----M--NLSFFDQFMSPF-LLGVPLIAIAILMPSLLLPT-PSSRWINNRLITLQTWFINNFTKQIFSPINPGGHKWALMLASLMLFLISMNLLGLLPYTFTPTTQLSLNMGLAVPLWLATVLIGLRNQPT-VALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPTVSIITSIILFLL---TILEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAILIFSW-LILLTIFPQKVT-KH-LSMNEP-----A-T-QNTE-KS-KP---------T-----P-W-TWP-WT------------V-AI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq123 ----M--NENLFASFITPM-ILGLPLVTLIVLFPSLLFPT--SNRLVNNRFVTLQQWMLQLVSKQMMSIHNPKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRNKTK-TSLAHFLPQGTPTPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMSISATTALITFIILILL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLTMILSMF-LTLFIIFQLKIS-KH-NFYYNP-----ELT-STKM-LKQNT---------------P-W-ETK-WTKIYLPLLLP-L-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq124 ----M--NENLFASFITPV-ILGLPLVTLIVLFPSLLFPT--SNRLVSNRFVTLQQWMLQLVSKQMMSIHNSKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRNKTK-ASLAHFLPQGTPTPLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLIHLIGGATLALMSISTTTALITFTILILL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLTMILSMF-LTLFIIFQLKIS-KH-NFYHNP-----ELT-PTKM-LKQNT---------------P-W-EAK-WTKIYLPLLLP-L-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq125 ----M--NENLFTSFITPV-ILGLPLVTLIVLFPSLLFPT--SNRLVSNRFVTLQQWMLQLVSKQMMSIHNSKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRNKTK-ASLAHFLPQGTPTPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMSISTTTALITFTILILL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLTMILSMF-LTLFIIFQLKVS-KH-NFYHNP-----ELT-PTKM-LKQNT---------------P-W-ETK-WTKIYLPLLLP-L-M-FI--NRWLFSTSHKDIGTLYLLFDAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNAVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq126 ----M--AMSFFDQFASPS-YLGVPLIAIAIALPWVLYPT-PSSRWINNRLVTIQGWLINRFTNQLMLPLNAGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSMNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPTPWFAILLFSW-LIFLIIIPTKIL-NH-ISPNEP-----T-P-VSAE-KH-KT---------E-----P-W-DWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq127 ----M--NENLFASFTTPT-MMNIPIALFIVALPTLLFPS--PNRLINNRIVSMQQWTTNLILKRMMITHGPKGQTWSLMLVSLIIFIGTTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVAVGFRHKTK-ASLAHLLPQGTPTPLIPMLVIIETISLLIQP--VALAVRLTANITAGHMLMYLTGSATLTLMSINPMAALTSFIILTLL---TILEFAVALIQAYVFTLLINLYLRNN-T-M-PQLDTSTWFIIIFSMY-ISLFTLMQPKLA-KH-NFPTPP-----TP-KTFST-LAHPT---------------P-W-KTK-WTKTCLPLLPLPQ-M-FI--TRWLFSTNHKDIGTLYLLFGAWAGVVGTALSLLIRAELGQPGTLLGDDQIYNVIVTSHAFIMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq128 ----M--NLSFFDQFSSPH-LLGIPLILLSLLFPTLLLPS-PNNRWINNRLSTIQTWILHLITKQLMVPLNKNGHKWALMFTSLMIMLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNRPS-ASLAHLLPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTASIALMPTLPAVSILTMIILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFSIMVMTW-LTLALIIQPKLL-AF-TTTNPP-----S-N-KISL-TT-KP---------T-----P-W-SWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq129 ----M--TLSLFSQFESTT-LFGISLIFIAITFPALLLPS-PTLRWLENRTLTLQNWFMGQFTNQIFQPLNTPGHKWALLLTSLAIFLMTSNVLGLLPYTFTPTTQLSLNMALALPLWLATVILGLRHHTN-HAFAHLLPEGTPTLLIPILIVIESISLIIRP--LALAVRLTANLTAGHLLIHLIGAAFFTLIS-MPLVASFTGILLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPIPWFSIAVFTW-MIFLFIMLPKVY-SH-QFPNNP-------SFYKTS-SQ-QS---------T-----S-W-NWP-WH------------M-AI--TRWMFSTNHKDIGTLYLLFGTWAGMVGTALSILIRTELAQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLTSMTVESGVGTGWTVYPPLASNCAHSGAS [...]
+Seq130 ----M--NENLFASFITPM-ILGLPLVTLIVLFPSLLFPT--PNRLMSNRLISLQQWMLQLVSKQMMSIHNTKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVVTGFRNKTK-ASLAHFLPQGTPTPLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLIHLIGGATLALMSISMTTALITFIILVLL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLTMILSMF-LALFIIFQLKIS-KH-SFHHNP-----EPT-PTKM-PKQNT---------------P-W-ETK-WTKIYLPLSLP-L-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq131 ----M--TMSLFNQFTSPT-LFGVPLILVAMLMPWLLFPT-RSSKWLPNRVISLQTWFLKTFSKHIMMPMNSPAYSWVFMLSSVMIFLLGINILGLFPYTFTPTTQLSLNLGIAVPLWLATVLIGLRKQPT-VSLAHLLPEGTPTPLIPVLIIIETISLFIRP--VALAVRLTANLTAGHLLIQLISSATLAIFNISLSLALLTFVLLILL---TILEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNPDPWFITFILAW-TILLSLAPMKIL-SY-TELTEP-----S-T-KSI--KT-SP---------L-----P-W-IWP-WQ--------------MF--TRWFFSTNHKDIGTLYLIFGAWAGMIGTALSLLIRAELAQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq132 ----M--TMNLFSQFASPT-LLGIPLILVAFVVPWLLFPT-PCNRWTTNRLVTIQSWFVKTFTKQIFLPLNTPGHKWALILASLMIFLLGMNLLGLLPYTFTPTTQLSLNLGLAIPLWLATVAIGFRNQLT-ASLGHFLPEGTPTPLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATMALLFSNPVVSSLTFATLLLL---TMLEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLDPAPWFFILFSAW-MVFILISPLKTS-NY-IHLNDP-----S---PKPF-KG-LN---------K-----P-W-HWP-WP--------------MI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASAGVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq133 ----M--TMNLFSQFASPT-FLGVPLVHIAFLVPWLLFPT-PCNRWTTNRLVTIQTWFVKTFTKQIFLPLNTPGHKWALILTSLMIFLLGMNLLGLLPYTFTPTTQLSLNLGLAVPLWLATVAIGFRNQST-ASLGHFLPEGTPTPLIPVLIIIETISLFIRP--MALGVRLTANLTAGHLLIQLISTATMALLFSNPIVSSLTFITLLLL---TMLEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLDPAPWFFILFSAW-TVFILLSPLKTS-NY-TNLNDP-----A---PKSY-KG-LN---------K-----S-W-FWP-WP------------V-MI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASAGVEAGAGTGWTVYPPLAGNLAHRGPS [...]
+Seq134 ----M--NLSFFDQFTSPH-LLGIPLILISTLFPTLLLPS-PTNRWITNRLSTLQLWFIHLTTKQLMLPLNKGGHKWALILTSLMLLLLMINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPT-MSLGHLLPEGTPTPLIPALILIETVSLLIRP--LALGVRLTANLTAGHLLIQLISTATTALLPILPTVSALTALILLLL---TILEIAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPTPWFLIMALSW-LTFTMIIQPKLL-PF-IPTNTP-----S-T-KPTT-ITHTP---------S-------W-NWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNMAHAGAS [...]
+Seq135 ----M--TLSLFNQFSSPS-LLGIPLIIAALTLPWLLFSL-PSGRWLNGRMTTLHEWFIARFTNQLFLPLSIKGHKWAPLFASLMMFLFSINLLGLLPYTFTPTTQLSLNLAIAIPLWLATVLIGLRNQPT-HTFGHFLPEGTPTLLIPILIIIENISLIIRP--IALGVRLTANLTAGHLLIHLVSSAVFTLLPSMTTVALLTAILLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-C-M-PQLNPNPWFMIMAYTW-TIFLLIVMPATL-LF-IIPNET-----T-T-QNAS-TP-KT---------E-----P-W-AWP-WH------------V-VI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPLMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq136 ----M--NENLFAPFITPT-ILGITTLPMVMLLPCLILSS--PKRWLPNRIQILQIWLIRLITKQMMIMHNTQGRSWSLMLMSLILFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWMGTVITGFRNKPK-ASLAHFLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSINMAVSMITFIILFLL---TILELAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWSMTIILMI-IGLFCIYQLKML-NQ-PMINLD-----LQNKQIMI-KKENL---------------P-W-EKK-WTKIYLPHSSPLQSM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLIGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq137 ----M--NTNLFDQFMIPN-LMGTPLLMPALLIIPLLLLN-PKNQWLSNPATTMKSWYITQITKQIMTPINKPGHMHSVTLISLLILLSFTNLLGLLPYTFTPTTQLSMNMALALPLWGMTVLIGLRTQPT-TSLAHLLPEGTPTPLIPILILIETISLLIRP--VALAVRLTANLTAGHLLIQLLSMATMNLWSIMPPLSLLTLTTLTLL---LLLEFAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNPEPWLVILLITW-TFFTTILQPQTT-SL-IPTNDP---------LHMT-YK-PP---------K-----T-W-PWP-WT---LTY------M-FI--HRWFFSTNHKDIGTLYFIFGTWAGMVGTALSLLIRTELSQPGPLLGDDQIYNVIVTAHAFIMIFFMVMPVMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFTLLLASSCIEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq138 ----M--HENLFASFTSPT-MMGLPIVTLIILFPSMLFPS--PNQLISNRLTSIQQWLIQLMSKQMMSIHNHKGQTWALMLMSLITFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVIVGLRHKTK-ASLAHFLPQGTPSPLIPMLVIIESISLLIQP--MALAVRLTANITAGHLLIHLIGGATLALTNISMITAFITFIILTLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFMTVLSMI-LTLFIVFQLKIS-KH-HFPMSP-----ELK-SPLT-SKINT---------------P-W-EKK-CTKIYSPLSLPLQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSLVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq139 ----M--MLNLFDQFITPQ-LLSISLLPIILLWPIMIFQM-NTNKLKNDRFTALMILLMKKTTKTLMPPTTIKAHVWATILTTLLLFLTALNTTGILPYTFTPTTQLSMNMALAIPLWLATVIIGMRNHTT-RSVAHLLPEGTPTPLIPILVLIETASLLIRP--VALGVRLTANLTAGHLLLHLISTATITTAHTLPMVSAFTAILLALL---TALEMAVALIQAYVFSLLVSLYLQEN-T-V-PQLNPSPWFLTMLITW-L-FLLIMMTKTT-AW-TTTTNP-----T-T-QNFN-FTKSP-----------------W-TWS-WY------------MSFL--TRWLLSTNHKDIGTLYFLFGAAAGLTGSLVSLLVRAQLMQPGQALGGDSLYNVFITFHALVMIFFMVMPIMIGGFGNWLVPLMLGAPDMAFPRMNNMSFWLLPPSFLLLLFSSGFETGVGTGWTIYPPLSNNIAHSGPS [...]
+Seq140 ----M--NENLFASFITPT-VMGLPIVILIIMFPSMLFPA--PFRLINNRVISLQYWLIRVTCKQMMSIHDHKGQTWSLMLMSLIMFIGTTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVVTGFRNKTK-ASLAHFLPQGTPTPLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGGATLALMSINTPTALITFIVLILL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITILSML-MTLFVLFQLKIS-KH-MYLSAP-----SPK-SNKT-RKQKT---------------P-W-ETK-WTKIYLPLSLPQQ-M-FI--TRWLFSTNHKDIGTLYLLFGAWAGMVGMGLSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq141 ----M--NENLFASFITPT-VMGLPIVILIIMFPSMLFPA--PFRLINNRLISLQYWLIRLTSKQMMTIHNHKGQTWSLMLMSLIMFIGTTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVVTGFRNKTK-ASLAHFLPQGTPTPLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGGATLALMSINTPTALITFIVLILL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITILSML-MTLFVLFQLKIS-KH-MYLSAP-----SPK-SNKM-RKQKT---------------P-W-ETK-WTKIYLPLSLPQQ-M-FI--TRWLFSTNQKDIGTLYLLFGAWAGMVGMGLSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq142 ----M--MTSFFDQFASPS-FLGIPLIAVAIALPWVMFPT-PPSRWVNSRLITIQSWFINRFTNQLMMPLNVQGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGLAMPLWLATVIIGMRNQPT-IALGHLLPEGTPIPLIPVLIVIETISLLIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFMILVFSW-VVFLTIIPTKVL-SH-LTPNEP-----S-P-MDKE-QH-KA---------D-----S-W-NWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq143 ----M--NENLFASFAAPS-MMGLPIVVLIVMFPSILFPA--PNRLINNRLISIQQWLIQLTSKQMLAIHNQKGRTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRYKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALINISAATAFITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFIMILSMF-LTLFILFQLKIS-NH-YYPENP-----MTK-SAKI-TGQHN---------------P-W-ENK-WTKIYSPLSLPPQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq144 ----M--NENLFASFAAPS-MMGLPIVVLIVMFPSILFPT--PSRLINNRLISIQQWLIQLTSKQMLAIHNQKGRTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRYKTK-ASLAHFLPQGTPLPLIPMLVVIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALINISATTAFITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFIMIFSMF-LTLFILFQLKIS-NH-YYPENP-----MTK-SAKI-AGQHN---------------P-W-ENK-WTKIYSLLSLPPQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq145 ----M--NENLFASFAAPS-MMGLPIVVLIVMFPSILFPT--PSRLINNRLISIQQWLIQLTSKQMLAIHNQKGRTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRYKTK-ASLAHFLPQGTPLPLIPMLVVIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALINISATTAFITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFIMIFSMF-LTLFILFQLKIS-NH-YYPENP-----MTK-SAKI-AGQHN---------------P-W-ENK-WTKIYSLLSLPPQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq146 ----M--NENLFASFAAPS-MMGLPIVVLIVMFPSILFPT--PSRLINNRLISIQQWLIQLTSKQMLAIHNQKGRTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRYKTK-ASLAHFLPQGTPLPLIPMLVVIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALINISATTAFITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFIMIFSMF-LTLFILFQLKIS-NH-YYPENP-----MTK-SAKI-AGQHN---------------P-W-ENK-WTKIYSLLSLPPQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq147 ----M--NENLFAPFMIPM-VMGIPITILIIILPSILFPT--PNRLINNRTISIQQWLTKLTSKQLMNVHSPKGQTWSLMLISLFLFIASTNLLGMLPHSFTPTTQLSMNVGMAIPLWAGTVATGLRNKTK-MSLAHLLPQGTPTFLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGETTLTLMNTSLFTALITFIILTLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLLTILSMF-LALFMLFQLKIS-KY-SYLPNP-----KLT-FTNT-QKQQA---------------P-W-NTT-WTKIYLP---PL--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLIGDDQVYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq148 ----M--AMSFFDQFMSPV-YLGIPLIALALTLPWILYPT-PSARWLNNRLLTLQGWFINRFTQQLLLPLNPGGHKWATLFTSLMIFLISLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTAILLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILTFSW-LIFLTVIPPKVM-AH-TFPNEP-----T-P-QSTE-KP-KT---------E-----P-W-NWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq149 --------MSFFDQFMSPV-YLGVPLMALALTLPWVLYPT-PSARWLNNRLLTLQGWFINRFTQQLLLPLNPGGHKWATLLTSLMIFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTTILLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILTFSW-LIFLTVLPSKVM-SH-TYPNEP-----T-P-QSTE-KP-KT---------E-----A-W-SWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq150 ----M--NLTLFDQFASPT-LMGIPLVVIATLAPWTLYPA-LPGHWLKTRLGALLSSAFKSVAQQIVLPIPEKGHKWSALFVSLLVLLITLNTLGTLPYTFTPTTQLSMSLGLALPLWLATVIIGLRYNPT-HSFAHLLPQSTPVALIPALIMIETASLLVRP--LALGVRLAANLTAGHMILQMIASTGITMLYALSPAGIFGVIILYLL---TGLEIMVAAIQAYVLVLLLSLYLQEN-V-V-PQLIPGPWLMMLVLSW-TTLLFVIPPKVL-AY-KYPAKP-----D-S-QKSH-TP-TT---------P-----S-W-VLP-WT------------V-MI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq151 ----M--MVSFFDQFASPS-YLGIPLIAIAIALPWVLYPT-SSSRWINNRLITIQGWFINRFTNQLMLPLNVGGHKWALLLASLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLMPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAILVFSW-LVFLTIIPTKIL-SH-ISPNEP-----T-P-VSAE-KH-KT---------E-----S-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq152 ----M--MVSFFDQFASPS-YLGIPLIAIAIALPWVLYPT-SSSRWINNRLITIQGWFINRFTNQLMLPLNVGGHKWALLLASLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFLLLLSLYLQEN-V-M-PQLNPGPWFAILVFSW-LVFLTIIPTKIL-SH-ISPNEP-----T-P-VSAE-KH-KT---------E-----S-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq153 ----M--MVSFFDQFASPS-YLGIPLIAIAIALPWVLYPT-SSSRWINNRLITIQGWFINRFTNQLMLPLNVGGHKWALLLASLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAILVFSW-LVFLTIIPTKIL-SH-ISPNEP-----T-P-VSAE-KH-KT---------E-----S-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq154 ----M--MVSFFDQFASPS-YLGIPLIAIAIALPWVLYPT-SSSRWINNRLITIQGWFINRFTNQLMLPLNVGGHKWALLLASLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAILVFSW-LVFLTIIPTKIL-SH-ISPNEP-----T-P-VSAE-KH-KT---------E-----S-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq155 ----M--AMSFFDQFASPS-YLGVPLIAIAITLPWVLYPT-PPSRWINNRLITIQGWLINRFTSQLMLPLNVGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAIVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-VIFLTVIPTKVL-NH-VSPNEP-----T-P-MSAE-KH-KT---------E-----S-W-DWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq156 ----M--NLSFFDQFASPQ-LLGIPLILLSLLFPVLLFPA-PGGRWITNRLSTLQLWFLQLITKQLMTPLNKPGHKWALILSSLMIFLLLVNLLGLLPYTFTPTTQLSMNMALAFPLWLATILTGLRNQPS-ISLGHLLPEGTPTPLIPALILIETTSLFIRP--LALGVRLTANLTAGHLLIQLISTATMALLPIMPTISILTASILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFLIMLTSW-AIFLLLMQPKLL-SF-IPTNPP-----S-N-KTKT-TA-NP---------T-----P-W-AWP-WT------------VTFI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq157 ----M--TLSFFDQFMSPT-FLGIPLMALALSLPWILFPA-PTTRWLNNRLLTLQGWFINRFTQQLLLPLNLGGHKWATLLTSLMIFLITLNMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTAALLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWLAILIFSW-LVFTTVMPPKIL-AH-TFPNEP-----T-T-QSTE-KP-KT---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq158 ----M--NLSFFDQFTSPC-LLGIPLILLSMLFPALLIPT-LSNRWITNRLSTLQLWFFHLITKQLMIPLNKKGHKWALILTSLMMLLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ISLGHLLPEGTPTLLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATTALLPIMPTVSILTALILFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFFIMLTSW-LTFSLIIQPKLL-SF-TPTNSP-----STN-KTPT-TT-KT---------T-----P-W-TWP-WT------------MTFI--NRWLFSTNHKDIGTLYLIFGAWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq159 ----M--AMSFFDQFASPS-YLGVPLIAIAITLPWVLYPT-PPSRWINNRLITIQGWLINRFTSQLMLPLNVGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-VIFLTIIPTKVL-NH-ISPNEP-----T-P-VSAE-KH-KT---------E-----S-W-DWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq160 ----M--TLSFFDQFSSPS-YLGIPLIALALTLPLILFPT-PSSKWLSNRLLAMQNWFINQLSKQLLSPLSLGGHKWALLLIPLMLFLITLNALGLLPYTFTPTTQLSLNIGLAVPLWLATVLIGMRNQPT-IALGHLLPEGTPTPLIPVLVIIETISLLIRP--LALGVRLTANLTAGHLLIQLIATAAFVLVPLMPAVAILTATVLLLL---TLLEVAVALIQAYVFVLLLTLYLQEN-V-M-PQLNPAPWFTILLSTW-LILLVVLTPKVL-TH-TFPYAP-----D-P-ATAS-TS-KT---------Q-----P-W-PWQ-WH------------V-IT--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQVYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq161 ----M--NENLFASFITPT-LMGLPIVTIIIMFPIILFPS--PTHLINNRLITIQQWLVKLVLKQMMSMHNIKGRTWSLMLTSLILFIGSTNLLGLLPHSFTPTTQLSMNLAMAIPLWAATVILGFRYKMK-ASLAHFLPQGTPGPLIPMLILIETISLFIQP--IALAVRLTANITAGHLLMHLIGGATLVLTTISTPTALITFIILLLL---TMLEIAVAMIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWFTVILSMI-ISLFMLLQLKIS-SH-SFYLDP-----KTM-SLKT-TKHNL---------------P-W-ENK-WTKTYLPLSLHLH-M-LI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLSSSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq162 ----M--NQNLFASFNMPM-ILGIPLVALFILFPTMLITP--SNNLNNNRSSSLQQWLIQLVLKQMMTNHTTKGQTWSLMLLTLITFITLNNLLGITPYAFTPTTQLSLNLGMAIPLWMATVLMGLRFKTK-ATLAHLLPQGTPIPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLMHLLGDTMLILLSIYLSSSVITVIVIILL---ITLELGVALIQAYVFTLLVSLYLHNN-S-V-PQLDISPWPMVTLSMI-LTLFYAMQLKML-KF-IFHTTP-----LSK-LTKI-QNQKT---------------T-W-ELK-WTKIYLPLSMYQ--M-FM--NRWLFSTNHKDIGTLYLMFGAWAGATGTALSLLIRAELGQPGSLMEDDHVYNVIVTSHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSTLEAGVGTGWTVYPPLAGNMSHPGAS [...]
+Seq163 ----M--NENLFTSFATPT-IMGLPIVILIIMFPSIMFPS--PNRLINNRLVSTQQWLLQLTSKQMLSIHNNKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVFLGFRHKTK-ASLAHFLPQGTPVFLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGGATLALMNISPTTALITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWSITIVSMI-ITLFIMFQLKLS-KY-SYPSSP-----ELK-LTKT-PTHTT---------------P-W-ESK-WTKTYLPLSLPQQSM-FV--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq164 ----M--NENLFASFITPM-IMGLPLATLIVMFPSLLFPT--SNRLVNNRLISLQQWMLQLVSKQMMGIHNAKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVVTGFRNKTK-ASLAHFLPQGTPTPLIPMLVIIETISLFIQP--IALAVRLTANITAGHLLIHLIGGAALALMSISTTMALITFIILVLL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLMMIMSMF-LALFIIFQLKIS-KH-NFHFNP-----ELM-LTKT-QKQNT---------------P-W-ETK-WTKIYLPLLLP-Q-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALDLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPQMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq165 ----M--NENLFTSFITPM-ILRLPLATLIVMSPSLLFPT--SNRLVNNRLISLQQWMLQLVSKQMMGIHNAKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRNKTK-TSLAHFLPQGTPTPLIPMLVIIETISLFIQP--IALAVRLTANITAGHLLIHLIGGAALALMSISTTMALITFIILVLL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLMMIMSMF-LTLFIIFQLKIS-KH-NFHFNP-----ELM-STKT-QKQNT---------------P-W-ETK-WTKIYLPLLLP-Q-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq166 ----M--NENLFASFITPM-MLGLPLATLIVMFPSLLFPT--SNRLVNNRLISLQQWMLQLVSKQMMGIHNAKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRNKTK-ASLAHFLPQGTPTPLIPMLVIIETISLFIQP--IALAVRLTANITAGHLLIHLIGGAALALVSISTTMALITFIILVLL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLMMIMSMF-LALFIIFQLKIL-KH-NFHFNP-----ELT-LTKT-QKQNT---------------P-W-ETK-WTKIYLPLLLP-Q-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq167 ----M--NENLFASFITPM-ILGLPLATLIVMFPSLLFPT--SNRLVNNRLISLQQWMLQLVSKQMMGIHNAKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRNKTK-ASLAHFLPQGTPTPLIPMLVIIETISLFIQP--IALAVRLTANITAGHLLIHLIGGAALALMSISTMMALITFIILVLL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLMMIMSMF-LALFIIFQLKIS-KH-NFHFNP-----ELM-STKT-QKQNT---------------P-W-ETK-WTKIYLPLLLP-Q-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq168 ----M--NENLFTSFITPM-ILGLPLATLIVMFPSLLFPT--SNRLVNNRLISLQQWMLQLVSKQMMGIHNAKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRNKTK-TSLAHFLPQGTPTPLIPMLVVIETISLFIQP--IALAVRLTANITAGHLLIHLIGGAALALMSISTTMALITFIILVLL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLMMIMSMF-LTLFIIFQLKIS-KH-NFHFNP-----ELM-STKT-QKQNT---------------P-W-ETK-WTKIYLPLLLP-Q-M-FI--NRWLFSTNHKDIGTLYLLCGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq169 ----M--NENLFASFIAPM-ILGLPLATLIVMFPSLLFPT--SNRLVNNRLISLQQWMLQLVSKQMMGIHNAKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVVTGFRNKTK-ASLAHFLPQGTPTPLIPMLVIIETISLFIQP--IALAVRLTANITAGHLLIHLIGGAALALMSISTTMALITFIILVLL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLMMIMSMF-LALFIIFQLKIS-KH-NFHFNP-----ELT-LTKT-QKQDN---------------H-W-ETK-WTKIYLPLLLP-Q-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq170 ----V--TLSMFDQFASPV-YLGIPLMALALSLPWILLPT-PSTRWLGNRLLTLQAHSINRFTQQLLLPLNLMGHKWAILLTSLMVFLITLNMLGLLPYTFTPTTQLSLNLGLAVPLWMATIIIGMRNQPT-HALAHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPAVAILTTILLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFIILIFSW-AMFLTIIPPKIL-AH-TFPNEP-----S-T-QSTK-ET-MT---------K-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq171 ----M--TLSFFDQFMSPT-YLGIPLIAIALTLPWILYPS-PSNRWLNNRLITLQGWFINRFTQQLLLPLNPAGHKWALMLASLMIFLLSLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-ASLGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMTTVALLTTTILFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTIVPSKVL-KH-TFNNEP-----T-T-LSVE-KP-KT---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALMGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq172 ----M--NENLFASFITPT-LMGLPIVIAIIMFPSMFFPS--TTRLISNRLIAMQKWIIRLITKQMMVIHTKKGQTWALMLVSLIMFIGSTNLMGLLPHSFTPTTQLSMNLGMAIPLWAGTVILGFRHKTK-ASLAHFLPQGTPLALIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGAATLALMDISMTTALITFNILVLL---TMLEFAVALIQAYVFTLLVSLYLHDN-A-M-PQLDTSTWFITIMSMI-ATLFIMFQLKIS-KH-YYYTYP-----EPL-AIKT-QTHNT---------------P-W-EAK-WTKIYLPLSLPQH-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq173 ----M--MVSFFDQFASPS-FLGIPLIALAIALPWLLFPT-PPSRWINNRLITLQTWFINRFTNQLMMPLNVGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IVFLTIIPTKIL-NH-TTPNEP-----T-P-MSEE-KH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq174 ----M--ALNFFDQFMSPT-YLGIPLIALALSLPWVLFPT-PSSRWLNNRLLTLQGWFINRFTQQMLLPLNLGGHKWAVLLTSMMIFLVTLKMLGLLPYTFTPTTQLSLNMGFAVPLWLATVVIGLRNQPT-VALGHLLPEGTPVVLIPFLIIVETFSLLIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLTLYLQEN-T-M-PQLNPAPWFAILIFSW-LVFLTVIPPKVL-GH-SFTNEP-----T-P-LNVK-KA-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq175 ----M--GMGIFAQFASPF-LLGIPLLALAVTFPWLILPP-TSRQLVDNRFRTLVDWFAGSVTKHLLGPVGPKGHVWAALLVSIIVFIAAHNILGLLPYTFVPTCLLSFNLALAVPIWLATVLMGLRHQPT-ITFGHLLPEGTPIPLIPLMIVIESFSLLIRP--VSLAVRLTANMTAGHLLLKLISTATGAALAKAPELGLLAFPAVVGF---SILEVAVAMIQAYVFVLLVTLYMQEN-ISMLPHLEPTHWFYTLICAW-LMFLVLIYPYIT-SL-TFPNEP-----SFV-PEEK-APSTL---------Q-----S-W-SWP-WE------------V-AI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGAFMGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq176 ----M--TLSLFDQFMSPT-LLGVPLLPIALLLPWALFPN-PACRWLLARLLTLQNWFIKQYAKHLFTPLDMGGHKWALLFTSLMVFIMTLNLLGLLPYTFTPTTQLALTLGLAMPLWLMTIIIGLRNKPN-AVIVHFLPKGTPRPLIPVLIIIETTSVIIRP--LALAVRLMANLTAGHLMMQLIAMATLALIPYLMPIWILTWTLLSLL---LVLEVAVALIQAYVFVLLLSLYLQEN-I-M-PQLNPTPWLYILLLTW-LIFLVVLPPKIM-AH-VFPNMP-----H-L-PHIF-NF-QT---------N-----N-W-YWP-WR------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq177 ----M--TLSLFDQFMSPT-FLGVPLLPIALLLPWALFPN-PACRWLLARLLTLQNWFIKQYAKHLFTPLDMGGHKWALLFTSLMVFIMTLNLLGLLPYTFTPTTQLALTLGLAMPLWLMTIIIGLRNKPN-AVIIHFLPKGTPRPLIPVLIIIETTSVIIRP--LALAVRLMANLTAGHLMMQLIAMATLTLIPYLMPLWILTWTLLSLL---LVLEVAVALIQAYVFVLLLSLYLQEN-I-M-PQLNPTPWLYILLLTW-LIFLVVLPPKIM-AH-VFPNMP-----H-L-HHIF-NF-QT---------N-----N-W-YWP-WR------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq178 ----M--NPTFFDQFMSPQ-TLGIPLITLAMLMPPIIFPT-QNTRWLTNRFSTLQSWTINLFTKQLMLPINKTGHQWSIILTSLMTMLLTINLLGLLPYTFTPTTQLSLNMGLAIPMWLATVLIGLRNQPT-TSLGHLLPEGTPTPLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLTSIAVLALIPTMPTLSMLTMTILFLL---TILELAVAMIQAYVFILLLSLYLQEN-T-M-PQLNPAPWFMILSSTW-LIYTIILQPKIL-SH-LPTNNP-----T-N-KNNK--I-NT---------N-----S-W-TWP-WTQHSSTNS-----V-IL--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq179 ----M--NLTFFDQFMSPQ-ILGMPLIILALLMPSIIFPA-PNNRWLTNRLTTLQVWTINLFTKQLMLPINKTGHKWAIILTSLMAMLLMTNLLGLLPYTFTPTTQLSMNMGLAIPMWLATVLTGLRNQLT-TSLGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLTSTAVLALLPTMTTLSLMTATILLLL---TILELAVAMIQAYVFVLLLCLYLQEN-I-M-PQLNLDPWFLILSSTW-LAYTMVLQPKIS-SY-MSANSP-----A-N-KDNK-MT-NT---------N-----P-W-TWP-WT------------V-FL--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFIMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq180 ----V--TLSFFDQFMSPT-YLGIPLMTLALTLPWILFPT-PSNRWINSRLLTLQAWFINRFTHQIFLPLNQGGHKWATMLTSLMIFLITLNMLGLLPYTFTPTTQLSLNMALAVPMWLATVIIGMRNQPT-AALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLMPLMPTVALLTSAVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLDPSPWFAILVFSW-AIFLMILPPKVL-AH-QFNNEP-----T-L-KSTE-AA-KP---------E-----P-W-MWS-WH------------V-AV--TRWLFSTNHKDIGTLYMIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSAVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq181 ----M--MTNLFTQFSIPT-IMGLSLLPITLFYPLMLINL-SQKRLKSSRLITLTSWLTKNIIKYLMPTSTSPTHKWTPILTSLILLILTINILGMLPYTFTPTTQLSLTLSLALPLWLGTVLTGLRTQPT-KTMAHLLPLGTPIPLIPILIVVETISLIIRP--LALGVRLTANLTAGHLLLQLISTTSLTTTMIFPSLTLMPTITLMLF---TILEIAVAMIQAYVFTLLLILYLQEN-S-M-PQLNPSPWFFVMVITW-MTMILLITKLTT--T-QTHTTP-----T---KTPK-PNYTQ---------S-----T-W-PW----------------MSTM--NRWFLSTNHKDIGTLYFVFGIMAGISGSVTSLMVRMQLIQPGQSSGGDSLYNMFITYHALTMIFFMVMPIMIGGFGNWLVPLMLGAPDMAFPRLNNMSFWLLPPAFLLLVSSAWFNSGVGTGWTIYPPLSGNLAHAGPS [...]
+Seq182 ----M--NENLFTLFATPM-ILNQPATIPIIMFPMLLIPT--SKHLINNRLITIQRNLVLFTLKQMMMIHNAKGRTWSLMLMSLITFITTTNLLGLLPHSFTPTTQLSMNLAMAIPLWAATVITGLRFKTK-SSLAHLLPQGTPTLLIPMLVMIETISLIIQP--VALAVRLTANITAGHLLMHLIGNATLTLLTISPPATSLVFTLLTLL---TILEIAVALIQAYVFTLLISLYLHNN-T-M-PQLDTSTWFITITTTL-PTLYLITQLKLL-NT-HYYQPP-----QQK-NSHK-QTPNN---------------H-W-QLK-WTKIYLPYSQLQ--M-FI--NRWLFSTNHKDIGTLYLLFGAWAGIMGTALSLLIRAELGQPGSLLGSDHIYNVI-TAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLMGSTMIEAGAGTGWTVYPPLAGNFSHPGAS [...]
+Seq183 ----M--NENLFTLFATPM-ILNQPATIPIIMFPVLLIPT--SKHLINNRLTTIQRNLVLLALKQMMMTHNAKGRTWSLMLMSLITFITTTNLLGLLPHSFTPTTPTIYKPRYSNPLWAATAITGLRFKTK-NSLAHLLPQGTPTLLIPMLVMIETISLIIQP--VALAVRLTANITAGHLLMHLIGNTALTLLSISPPAALLTFTLLMLL---TILEIAVALIQAYVFTLLVSLYLHNN-T-M-PQLDTSTWFITITTML-PTLYLITQLKLL-DM-CYYQSP-----QQK-NSBK-QTPNN---------------H-W-QLK-WTKIYLPYSQLQ--M-FI--NRWLFSTNHKDIGTLYLLFGAWAGIMGTALSLLIRAELGQPGSLLGSDHIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLMASTMIEAGAGTGWTVYPPLAGNLSHPGAS [...]
+Seq184 ----M--VLNFFDQFMSPT-LFGIPLIGLAMTLPWILFPL-PSRRWQDSRLLALQNWFINRFTQQLLLPLNFGGHKWAALLSSLMVFLMALNMLGLLPYTYTPTTQLSLNLGLAVPLWLATVLIGFRNQPT-HALAHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLMQLIATAAFVLLPMMPAVAILTGIVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-LVFLIVIPPKIV-NH-TFPYDP-----T-A-TSVE-KP-AH---------T-----P-W-HWP-WY------------V-MI--TRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSAVEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq185 ----M--ALSFFDQFLSPT-FLGVPLMVIALTLPWVFFPE-APSQWLTNRYMTLQGWFINRFTQQLLLPLNVGGHKWAVLLTSLMLFILSLNMMGLLPYTFTPTTQLSLNMGLAVPLWLATVLIGMRNQPT-VALGHLLPEGTPTLLIPILIIIETLSLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLTPLMPTVALLTAILLVLL---TILEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPRPWFWIFMFAW-VIFLGVLPKKVL-SH-KFLNDP-----A-S-ETKE-TP-VS---------A-----P-W-SWR-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq186 ----M--NENLFASFVVPT-MMGLPIVILIVMFPTLLFPS--PGRLITNRLISIQQQMTNLILKQMMIIHSPKGRTWSLMLISLITFIGSTNLLGLLPYSFTPTTQLSMNLGMAVPLWAGTVIMGLRHKTK-TSLAHFLPQGTPIPLIPMLVIIETMSLFIQP--TALAVRLTANITAGHLIMHLIGNATLALMSISPTTAFITFIILIAL---TALEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWSITILSTF-ISLFTLMQLKLT-KH-NFITPP-----TP-KTPNT-TKHTT---------------P-W-EMK-WTKTYSPL----S-M-LV--TRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLTSSMVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq187 ----M--MVSFFDQFASPS-FLGVPLIAIAVALPWVLFPT-PPSRWMNNRLITLQTWFINRFTNQLMLPLNAGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPLMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IVFLTVIPTKIL-NH-TTPNEP-----A-P-MSEE-KH-KT---------E-----S-W-NWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq188 ----M--NPTFFDQFMSPQ-ILGIPLAVLALLMPPIMFPT-QNNRWLTNRLSTLQLWAINLFTKQLMLPISKTGHQWSIILTSLMIMLLTTNLLGLLPYTFTPTTQLSMNMGMAIPMWLATVLTGLRNQPT-KSLGHLLPEGTPILLTPTLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLTSTATLSLLPTMLTLSAMTTVVLLSL---TILELAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNTDPWFMILSSSW-LMYILILQPKIS-SY-LPTNDP-----T-N-KNNK-TM-HT---------N-----S-W-TWP-WTQHSSINS-----V-IF--TRWFFSTNHKDIGTLYFIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLVPMMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq189 ----M--NENLFASFITPT-LMGLPIVLLIIAFPTIMFPS--SKRLIPNRLVSFQQWLISLILKQMMAMHNIKGRTWSLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRHKTK-ASLAHFLPQGTPIPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLVLMSISMPTAIITFIILLLL---TVLEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTNTWFITIISAT-LTLFILFQINFS-KL-TFYLEP-----EPK-LLKS-TEHKN---------------P-W-ETK-WTKIYLPHSSLPH-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq190 ----M--NLSFFDQFASPC-LLGIPLILLSMLFPALLLPT-PGNRWITNRLSTLQLWLLHLITKQLMIPLNKNGHKWALILTSLMMLLLTINLCGLLPYTFTPTTQLSMNMALAFPLWLATVITGLRNQPS-ISLGHLLPEGTPTPLIPALIMIETISLLIRP--LALGVRLTANLTAGHLLIQLISTATIALLPIMPTVSILTTSILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFYIMLATW-LTLLLAIQPKLL-SF-TTTNQP-----S-N-KLPT-TI-KT---------T-----P-W-AWP-WT------------VTFI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq191 ----M--NLSFFDQFASPC-LLGIPLILLSMLFPALLLPT-PGNRWVTNRLSTLQLWLLHLITKQLMIPLNKSGHKWALILTSLMMLLLTINLCGLLPYTFTPTTQLSMNMALAFPLWLATVITGLRNQPS-ISLGHLLPEGTPTPLIPALIMIETISLLIRP--LALGVRLTANLTAGHLLIQLISTATIALLPIMPTVSILTASILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFYIMLATW-LTLLLAIQPKLL-SF-TTTNQP-----S-N-KLPT-TI-KT---------T-----P-W-AWP-WT------------VTFI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq192 ----M--MLSFFDQFMSPT-YLGIPLIALALVLPWTLYPT-PTPRWLNSRLLTLQGWFINRFTQQIFMPINPGGHKWAVMLASLMVFLTSLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEKRL-M-PQLNPAPWFAILVFSW-VVFLTIIPQKIL-AH-NFNNEP-----T-T-MGAE-KA-KP---------E-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq193 ----M--MLSFFDQFMSPT-YLGIPLIALALVLPWTLYPT-PTPRWLNSRLLTLQGWFINRFTQQIFMPINPGGHKWAVMLASLMVFLTSLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-VVFLTIIPQKIL-AH-NFNNEP-----T-T-MGAE-KA-KP---------E-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq194 ----M--NLSFFDQFMSPS-LLGIPLILISLLLPMLLYPS-PNNRWITNRVSTLQLWFFQLITKQLMTPLNKKGHKWALILLSLMILLLTINLLGLLPYTFTPTTQLSMNLALAFPLWLATLLTGLRNQPS-ATLGHLLPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATTVLLPIMPAVSMLTTTILLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPTPWFSIMVTSW-FIFSFILQPKIS-QF-TSTNQP-----S-N-KTFS-AT-KA---------P-----S-W-NWP-WT------------MTFI--NRWLFSTNHKDIGTLYLIFGAWAGMIGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGVGTGWTVYPPLAGNLAHAGAS [...]
+Seq195 ----M--AMSFFDQFASPS-YLGNSTNCYCYCPTMSNMPN-PFTRWMKNRLITIQGWLINRFTNQLMLPLNVGGHKWALLLASLMIFLITTNMLGLLPYTFTPTTQLSLNMGFAVPLWLATVLIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLLIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVYFFLLCKKLPKLKFKLTYLFFFKPMSS----EN-V-M-PQLNPRPLICNLIIFV-VNLLNHYSHQSSKLRLTKWANP---------IKYE-EHKAQ---------------P-W-DWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPHLLGNLAHAGAS [...]
+Seq196 ----M--AMSFFDQFASPS-CLGIPLIAVAIALPWVMYPT-PSARWINNRLITIQGWLINRFTNQLMLPLNVGGHKWALLLASLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVLIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFMILLFSW-LIFLTVIPTKVL-NH-ISPNEP-----T-P-FSTD-EH-KA---------Q-----P-W-DWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq197 ----M--MLSFFDQFMSPT-YMGIPLIALAITLPWILYPT-PTSRWINNRLLTLQGWFINRLSQQIFLPINQGGHKWAVLLTSLMIFLITLNMLGLLPYTFTPTTQLSLNMAFAVPLWLATVIIGMRNQPT-AALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFMILLLSW-VTFLIILPPKVL-AH-EFSNEP-----N-V-MGVE-KS-KP---------E-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMLGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq198 ----M--ILNFFDQFATPY-TLGIPLMLIALLVP-TLLIM-ISPRLTPNRLVAMQTLTMKNFIKQLMSPLNTEGHKHAALLLTLMLYLLLLNLLGLLPYTFTPTTQLAMNMGFALPLWLMTIIIGLRNQPT-MALGHLLPLGTPTPLIPILIIIETVSLFIRP--IALGVRLTANLTAGHLLMQLISTAVFVLLPIMPTISIITFIILLLL---TLLEFAVAMIQAYVFILLVSLYLQEN-V-M-PQLNPGPWYLTMVAAW--TIILLSTPTLMKIK-TPHQ-P-----K---LTKN-GAQ-K---------P-----T-W-TWP-WS------------V-MI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRTELSQPGTLLGDDQLYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAANLAHAGAS [...]
+Seq199 ----M--NENLFTPFTTPT-ILGLPAVILIILFPTLLLPT--SKHIISNRLITIQQNLIQLIMKQIMTTHSAKGQAWSLMLMSLIIFITMTNLLGLLPHSFTPTAQLSMNLAMAIPLWAGTVITGLRFKTK-SSLAHLLPQGTPTPLIPMLVIVETTSLFIQP--VALAVRLTANITAGHLLMHLIGAATLTLSTISLPAASLTLMLLVLF---MILEVAVALIQAYVFTLLVSLYLHDN-T-M-PQLNTSTWFTIIMTML-PTLYIIMQLKLL-ST-TYYPSP-----PQK-LAKT-KPRNN---------------P-W-QLK-WTKIYLPHSQLQQSM-LV--NRWLFSTNHKDIGTLYLLFGAWAGMMGMAMSLLIRAELGQPGNLLGNDHIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLLASAAVEAGAGTGWTLYPPLAGNFSHPGAS [...]
+Seq200 ----M--TLSFFDQFMSPT-FLGIPLIALALSLPWILYPQ-PSARWLNNRPLTLQNWFIGRFTQQIFQPLSPAGHHWALILASLMMFLFTLNVLGLLPYTFTPTTQLSMNMGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLASTAPTLAILTTMLLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFAILMFTW-LIFLTIIPPKIM-AH-TFPNEP-----N-T-MSTQ-KP-KT---------E-----S-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq201 ----M--VLGFFDQFMSPV-LMWIPLMALALTLPWLLFPS-PSMRWINNRLLTLQGWFINRFTQQIFTPINNPGHKWATLLTALMLFLISINMLGLLPYTYTPTTQLSLNLGFAVPLWLATVIIGLRNQPT-ISLGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAALTFTVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPTPWLAILVFSW-AAFLIILPTKVI-SH-IFTNDP-----N-P-QKAK-KP-EL---------E-----T-W-NWP-WY------------V-AI--NRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLTSSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq202 ----M--TLALFDQFLSPK-LLFIPLLLPAMTLPALLLPT-PNNRLSKPRLLSLYLFITKPFIKQLMSPVNTPGHKWTPLLLVLMLYLTTLNTLGLLPYTFTPTTQLSMNMGLAIPLWLATVFIGLRNQPT-TSLAHFLPEGTPTPLVPILVLIETVSLFIRP--VALGVRLTANLTAGHLLIQLISLTIFTLSTSMNMMAIPAILILFLL---SILEVAVAIIQAYVFTLLLSLYLQEN-V-M-PQLILNPWFLTFLFSW-LIILFVFKPKAI-RL-TYENPR---------KAYE-HHQKT---------------HYW-NWP-WP------------V-TF--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRTELSQPGMFIGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq203 ----M--TLSFFDQFMSPT-YLGIPLIAVALTLPWILFPT-PSARWLNNRLITLQGWFINRFTQQLLLPLNLGGHKWAVMLTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTAIVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-GH-TFTNEP-----T-S-QSTE-KA-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq204 ----M--MMSFFDQFASPS-FLGIPLIAIAIALPWILFPT-PPSRWLNNRLVTLQTWFINRFTNQLLLPLNVGGHKWALLFASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLMPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IIFLTIIPTKIL-SH-TTPNEP-----T-P-MGEE-KH-KT---------E-----S-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq205 ----M--NLSFFDQFSSPS-LLGIPLILIAMTFPALLLPT-QGNRWITDRLSTLQSWFINLVTKQLMMPLGNKGHKWALILTSLMIFLLLTNLLGLLPYTFTPTTQLSMNLALAIPLWLATLLTGLRNQPS-ISLGHLLPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATAALVSTMPMISLLTLLVLFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFFIMLTSW-LTYSMIIQPKLL-SF-ITMNPP-----L-N-KTQT-TL-TT---------S-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq206 ----M--ALNMFDQFMSTA-YLGIPLITIALTLPWILVPS-PSNRWQNNRLVTLQSWFIKNFTSQLLTPLNKSGHKWALMLASLMIFILSLNMLGLLPYTFTPTTQLSLNMGLAVPFWLATVLIGLRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISSATFVMLPMMATAAVFTATLLVLL---TLLEVAVAMIQAYVFVLLVSLYLQEN-I-M-PQLNPAPWFFILVFTW-LIFLTIIPYKIL-NH-TFTNDM-----N-P-ISTE-SL-KT---------D-----T-W-NWP-WH------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELNQPGSLLGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq207 ----M--TVSLFDQFMSPT-LLGIPLIALAITLPWIMYPA-PTTRWLNSRFLALQGWFINRFTQQLLLPLSLGGHKWAALLTSLMIFLITMNMLGLLPYTFTPTTQLSLNLGLATPLWLATVIIGMRNQPT-HALGHLLPEGTPGPLIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAAFVLISSMPAVALLTSTVLVLL---TLLEVAVAMIQAYVFVLLLTLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLAIIPPKVM-AH-TFPNEP-----T-L-QSAE-KP-KT---------E-----P-W-TWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq208 ----M--NLSFFDQFSSPY-LMGIPLILPSLLLPTLLFPT-PGRRWLTNRLSTLQLWMINLVTKQLMAPLNKAGHKWALLLTSLILMLLSINLMGLLPYTFTPTTQLSMNMALAFPLWLATLLIGLRNQPS-ASLAHLLPEGTPTPLIPILIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATIALMPMMPSISTLTALILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFTIMLMTW-LTFSLLIQPKLL-SF-ISTNNP-----S-N-KTTA-TT-KP---------T-----P-W-TWP-WI------------VTLI--NRWLFSTNHKDIGTLYLIFGTWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq209 ----M--NLSFFDQFSSPY-LMGMPLILPSLLLPTLLFPT-PGRRWISNRLSTLQLWVINLITKQLMTPLNKTGHKWALLLTSLILLLLSINLMGLLPYTFTPTTQLSMNMALAFPLWLATLLIGLRNQPS-ASLAHLLPEGTPTPLIPILIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATIALLPTMPSISTLTALILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFMIMLMTW-FTYSLLIQPKLL-SF-TSMNTP-----S-N-KTTS-TT-KP---------T-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGTWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq210 ----M--ALNLFDQFMSPT-HLGIPLIAIALTLPWVLIPS-PTNRYQNNRLTSLQNWFIKTFTQQLLMPLNQGGHKWALILASLMIFILTLNILGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGLRNQPT-VALGHLLPEGTPAPLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATITLLPMMTTVAALTAILLVLL---TLLEIAVAIIQAYVFVLLLSLYLQEN-V-M-PQLNPTPWFAILVFSW-LIFLTVIPNKVL-NH-AFTNEI-----T-M-LNTE-NL-KS---------D-----T-W-NWP-WH------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELAQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq211 ----M--MLSFFDQFMSPV-FLGIPLIALALTLPWTLFPK-LTTRWLNNRLLTLQSWFINNFTQQIFQPMNLPGHKWALLFASLMVFLMSLNLLGLLPYTFTPTTQLSLNMALAVPLWLATIIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATATFVLLPLMPPVAFLTAILLLLL---SLLEVAVALIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWLLILLFSW-LIFLTIIPPKIL-SH-TSPNEP-----A-H-QSAE-KP-KT---------E-----V-W-TWP-WY------------V-AV--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq212 ----M--NENLFSSFITPT-LMGLPIIILIIMFPLVIMTS--SKRLVNNRFHTFQQWLIKLITKQMMAIHSPKGRTWSLMLASLIIFIGSTNLLGLLPHTFTPTTQLSMNLGMAIPLWAGAVILGFRHKMK-DSLAHFLPQGTPIPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLMHLIGGATLVLTSISLPTAMITFIILIML---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFTTVLASS-ITLFILMQLKIS-FH-DLHKKP-----SNK-YLKL-FKPTN---------------P-W-EQK-WTKIYSPLSLPQP-M-FI--NRWLFSTNHKDIGTLYLMFGAWAGMVGTALSILIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPMMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq213 ----M--NENLFASFATPT-MMGLPIVVLIILFPSVMFPT--PNRLITNRLTALQQWMIQLTSKQMMTIHNQKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRYKTK-ASLAHFLPQGTPLPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLVLSNISPTTALITFIILMML---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITIISML-LTLFITFQLKIS-KF-IYPNTP-----EPK-SLKA-LKQNT---------------P-W-ETK-WTKIYSPLSLPPQ-M-FM--TRWLFSTNHKDIGTLYMVFGAWAGMAGTALSILIRAELGQPGALLGDDQIYNVIVTAHAFIMIFFMVMPVMMGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq214 ----T--NLNLFDQFLVPK-LFGMSLLIPAMLLTTLLIYN-PQDRWLSNPLTTLQAWLIAKTTKQIMSPVNKPGHKWSLMLISLLTMLILNNLLGLLPYTFTPTTQLSMNMALALPLWLATVLIGLRNKPA-SSLAHLLPEGTPTPLIPILILIETISLLIRP--IALAVRLTANLTAGHLLMHLISTAALNLVTTSTLLAGLTLSILALL---MLLEIAVAMIQAYVFTLLLSLYLQEN-V-M-PQLNPEPWLMISSITW-LVFVITLQPKIA-SM-KFMNNP---------SNPN-QK-TT---------K-----T-W-PWP-QI------------V-NI--NRWLFSTNHKDIGTLYFIFGAWAGMVGTAMSLLIRTELSQPGPFMGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFTLLLFSAFIETGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq215 ----T--NLNLFDQFLVPQ-LLGMPLLIPAMLLTTVLIYN-PQDRWLSNPLTTLQSWLIAKATKQIMTPVNKPGHKWSLMLISLLTMLILNNLLGLLPYTFTPTTQLSMNMALALPLWLATVLIGLRNKPT-SSLAHLLPEGTPTPLIPILILIETISLLIRP--IALAVRLTANLTAGHLLLHLISTAALSLMTTSTLLAGLTLIILTLL---MLLEIAVAMIQAYVFTLLLSLYLQEN-V-M-PQLNPEPWLMILSITW-LVLITSLQPKIA-SL-KFMNSP---------SSPA-QK-TT---------K-----T-W-PWP-QI------------V-NI--NRWLFSTNHKDIGTLYFIFGAWAGMVGTAMSLLIRTELSQPGPFMGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFTLLLSSAFIETGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq216 MTLTT--NLNLFDQFLVPK-LLGMSLLIPAMLLTTVLIYN-PQDRWLSNPLTTLQSWLIAKATKQIMTPVNKPGHKWSLMLISLLTMLILNNLLGLLPYTFTPTTQLSMNMALALPLWLATVLIGLRNNPT-SSLAHLLPEGTPTPLIPILILIETISLLIRP--IALAVRLTANLTAGHLLMHLISTAALSLMTTSTLLAGLTLIILTLL---MLLEIAVAMIQAYVFTLLLSLYLQEN-V-M-PQLNPEPWLMILSITW-LVLITTLQPKIA-SL-KFMNSP---------SSPA-QK-TT---------K-----T-W-PWP-QI------------V-NI--NRWLFSTNHKDIGTLYFIFGAWAGMVGTAMSLLIRTELSQPGPFMGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFTLLLSSAFIETGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq217 ----M--TLSFFDQFMSPT-FMGVPLVMVALSLPWILYPT-PSNRWINNRMLTLQGWFINRFTQQMFLPLNQSGHKWAILMTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGFAVPLWLATVLIGMRNQPT-MTLGHLLPEGTPTPLIPFLIVIETFSLLIRP--VALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTTIVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPTPWFTILLFSW-LMFLTVLPPKVM-KF-NFNNEP-----T-P-TSTK-KL-PT---------E-----P-W-NWP-WH------------V-TV--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLMGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq218 ----M--NLTFFDQFMSPQ-ILGIPLIILALLMPSIIFPT-PSNRWLANRLSTLQMWTINLFTKQLMLPINKTGHKWSMILTSLMAMLLVSNLLGLLPYTFTPTTQLSMNMGLAIPMWLATVLTGLRNQLT-TSLGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLTSTAVLALLPTMMTLSVLTGTILLLL---TILELAVAMIQAYVFVLLLCLYLQEN-I-M-PQLNLDPWFLILSSTW-LAYTMILQPKIS-SY-LSMNNP-----A-N-KDNK-IT-NT---------N-----P-W-IWP-WT------------V-FL--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFIMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq219 ----M--AMSFFDQFASPS-YLGVPLIAIAITLPWVLYPT-PPSRWINNRLITIQGWLINRFTSQLMLPLNVGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAIVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPTPWFAILVFSW-MIFLMIIPTKVL-NH-VSPNEP-----T-L-VSAE-KH-KT---------E-----S-W-DWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq220 ----M--NLSFFDQFSSPH-LLGIPLILLSLLFPALLFPS-PNNRWINNRLSTLQTWLLHLITKQLMVPLNKNGHKWAMMLTSLMIMLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGVRNQPS-ASLAHLLPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTASIALAPTLPAVSALTMIILLLL---TILEVAVAMIQAYVFVLLLSLYLQKN-I-M-PQLNPAPWFSIMIMTW-LTLALLIQPKLL-AF-TMTNPP-----S-S-KTSL-TT-KP---------T-----P-W-PWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq221 ----M--NLNMFEQFASPE-ILLLPTNIMSMLIPILLIYT--KPTLLGNRISTILNWFLKTALSNMINQLSLAGQKWSRFLMSLLLLILLSNLLGLLPYTFTTTSQLSMNMAFAIPMWLGTVITGLTMKTS-SSLAHMLPEGSPTPLIPFMILIETISLLMRP--IALGVRLTPNITAGHLLMTMISSAALSFINMYNTLSIMTMMLLMLL---TLLEMAVACIQAYVFILLITLYLQEN-T-M-PQLDVVYALLTFIWAW--STLVVMMIKIR-TI-MLNKEL-----EK-KPMTNDQPGLI-----------------WN-LP-WT------------V-FI--TRWLFSTNHKDIGTLYLLFGAWSGLIGASLSILMRMELTQPGSLFGSDQIFNVLVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPALLLLLSSSYIEAGAGTGWTVYPPLSGNMVHSGPS [...]
+Seq222 ----M--TLSFFDQFMSPV-YLGIPLMALALSLPWILYPK-PTPRWLNNRLLTLQGWFINRFTQQMFLPVNLGGHKWATLLTSLMLFLITLNMLGLLPYTFTPTTQLSLNMAFAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLAPMMPTVAILTATVLLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPTPWFVILAFSW-LIFAAVIPPKIL-AN-IFPNEP-----S-A-QSTE-KS-KT---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTGLSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq223 ----M--NENLFNSFTTPT-LMGLPIVALIIFLPNMMYPS--PSRLINNRLTSLQMWLVQLILKQLMTVHNIKGRSWSLMLISLILFIGSTNLLGLLPHSFTPTSQLSLNLGMAIPLWAGTVILGLRNKMK-KSLAHLLPQGTPTPLIPMLVIIETISLFIQP--LALAVRLTANITAGHLLMHLTGNATSTLITLSPPTTPTIFTLLVLL---TMLELTVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFTTITFTI-LMLFTTFQLKLL-KF-TYYPDP-----TEK-PIKS-FKPKN---------------P-W-EKK-WTKIYLTHSQPQH-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGTVGTALSLLIRTELGQPGAFLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq224 ----M--MTSFFDQFASPS-FLGIPLIAIAIALPWVLFPT-PSSRWMNNRLTTLQAWFINRFTNQLLMPLNTGGHKWALMFTSLMLFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPLMPTVAFLTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFEILVFSW-LIIITFIPTKVL-DF-LTPNK------P-A-PSEM-KH-KS---------N-----P-W-NWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq225 ----M--MTSFFDQFASPY-FLGIPLIAIAIALPWLLFPT-PSSRWMNSRLTTLQAWFINRFTNQLLMPLTTGGHKWALMFASLMLFLITINMLGLLPYTFTPTTQLSLNMGLAMPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVALLTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFAVLVFSW-FIFLTIIPTKVL-NH-LTPNEP-----A-P-MSEE-KH-KA---------D-----S-W-NWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq226 ----M--TLSFFDQFMSPT-LLGIPLIALALTLPWVLFPQ-PSTRWMNNRLLTLQNWFISRFTQQIFQPINPPGHKWALILTSLMLFLISLNMLGLLPYTFTPTTQLSLNMALAVPLWLATVIIGMRTQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPTTAILTSVLLLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFLILVFSW-IVFLTILPPKVL-AH-TFPNEP-----V-S-HSKQ-KP-QT---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq227 ----M--MVSFFDQFASPS-YLGIPNIAVAIALPWVLYPT-PPARWINNRLITIQGWFINRFTNQLMLPLNVGGHKWALLLASLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-IALGHLLPEGTPIPLIPVLIIIETISLLIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAILVFSW-LIFLTIIPTKIL-SH-ISPNEP-----T-P-VSAE-KH-KT---------E-----S-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLSDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWSVYPPLAGNLAHAGAS [...]
+Seq228 ----M--MVNFFDQFMSPV-FLGIPLIALALSLPWTLFPR-PSARWLHNRTLTLQNWFMNRFTQQIFMPIPLLGHRWALILMSLMIFLLTLNMLGLLPYTFTPTTQLSMNMAIATPLWLATVIIGMRNQPT-HALGHLLPEGTPTLLIPILIIIETISLFIRP--IALGVRLTANLTAGHLLIQLIATAAFQLLPIMPAVALSTTVLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-FIFLTIIPPKVL-AH-SFPNEP-----T-P-QSTK-LP-KT---------E-----S-W-NWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq229 ----M--NENLFTSFAAPT-MMGLPIVLLITLFPSILFPS--PDRLINNRLASIQQWLIQLTSKQMLSIHNHKGQTWALMLMSLILFIGSTNLLGLMPHSFTPTTQLSMNLGMAIPLWAGTVITGFRYKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMDISTTTAFITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLIVILSMI-LTLFITFQLKIS-KH-LFPMNP-----EPK-HTLL-LKNST---------------P-W-EEK-WTKIYSPLSLPPQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq230 ----M--NENLFAPFVTPT-ILGITTLPIIMLFPCLILSS--PKRWLPSRIQTLQIWLIRLITKQMMTMHNKQGRSWSLMLMSLILFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWMGTVVMGFRNKPK-SSLAHFLPQGTPTALIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSINMTVSTITITILFLL---TILELAVGMIQAYVFTLLVSLYLHDK-S-M-PQLDTSTWSLTITLML-ISLFCIYQLKML-NQ-TMTSIS-----SQEDKILY-PKPQL---------------P-W-EKK-WTKTYLLHSSHLLSM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLIGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq231 ----M--ILSLFDQFETPW-YMGVPLIAIAIASPWLFLPV-PTPRWLSNRLLSLQAWFVTNATQQIMLPLSPAGQKWALLFTSLMMYIISLNLLGLLPYTFTPTTQLSMSLGLAVPLWLATVLIGMRNQPS-DSLAHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLVSMASLAMASVLPAASLLTSALLLML---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFLILIFSW-LVFLTVIPPKVL-SH-SLLNDP-----N-P-SDSP-SY-QA---------E-----A-W-SWP-WS------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq232 ----M--ILSLFDQFESPW-YIGIPLIAIALVSPWLFLPT-PTPRWLSNRLVSLQGWFVTRATHQIMLPLSPAGHKWALLFTSLMVYLISLNLLGLLPYTFTPTTQLSMSLGLAVPLWLATVLIGMRNQPS-HSLAHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLVSTASFVLLSVMPTVAVLTSALLLML---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFAILIFSW-LVFLTVIPPKVL-SH-TLLNDP-----N-V-SDSL-SY-LA---------E-----P-W-NWP-WS------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq233 ----M--MLNFFDQFMSPV-FLGFPLIALALCLPWMLFPS-PTTRWINNRFITLQAWSINRATYQLFSPLSVGGHKWALLLISLMIFLITLNLLGLLPYTFTPTTQLSLNMAFAIPLWLATVVIGLRNQPT-IALGHLLPEGTPLLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVLVLLPIMPAVAILTASILFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFSILIFSW-LVFLIVIPPKML-NH-TFINEP-----A-P-QNTE-KP-KT---------E-----P-W-SWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq234 ----M--TLNMFEQFMSPT-YLGLPLIGLALVLPLLLYPT-PSRRWLGNRLLSLQAHLINRFVQQIFLPMNLSGHKWATLLTSVMIFLITLNLLGLLPYTFTPTTQLSLNLGLAVPLWLATVTIGMRNQPT-HALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATFVLLPLMPTVAILTTALLFLL---TLLEIAVAMIQAYVFILLLSLYLQEN-V-M-PQLNPSPWLAILVFSW-LVFLSFVPFKVL-AH-TFPNEH-----Q-A-QDEK-ES-VT---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq235 ----M--MTSFFDQFASPY-LLGIPLILVAMLLPWLLFPA-PTSRWINNRLITVQTWLTGRFTNQLMTPLNFSGHKWALLFASLMVFLITINLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMKNQPT-IALGHLLPEGTPIPLIPALIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPAVAILTASVLFLL---TLLEVAVAMIQAYVFILLLSLYLQEN-I-M-PQLNPKPWFMILFFSW-VIFLTIIPTKII-NH-IQPNDP-----T-Q-VDAK-EH-KN---------D-----T-W-NWP-W-------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq236 ----M--NENLFASFATPT-MMGLPIIMLIIMFPSILFPT--PKRMITNRVVSVQQWLINMIMKQMMNIHNNKGRTWTLMLISLITFIGTTNLLGLLPHTFTPTTQLSMNLGMAIPLWAGAVVTGFRHKTK-ASLAHFLPQGTPIPLIPMLIIIQTISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMSISPTTASITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITIVSML-LSLFILMQLKFI-KF-SSFSTP-----CPT-TMEK-TKHLT---------------P-W-EMK-WTKTYLPHSLPLP-M-FI--TRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq237 ----M--NENLFAPFICPT-IMGISTLPIIMIFPCLLFTT--PKRWLPNRIQILQIWLIRLITKQMMTMHNNLGRTWTLMLMTLILFIATTNLLGLLPYSFTPTTQLSMNISMAIPLWMGTVVLGFRNKPK-ASFAHFLPQGTPTPLVPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLISSAALTLISINILLTSITFIVLFLL---TILELAVAMIQAYVFTLLVSLYLHNN-T-M-PQLNTSAWFYVAGLTI-INIFCLFQLQLV-GIEMIYIYP-----PEE-VLKL-PEIPF---------------P-W-EKK-WTKIYLPLSSALLLM-FV--TRWLFSTNHKDIGTLYLLFGAWAGMTGTALSLLIRAELGQPGTLIGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq238 ----M--ILSFFDQFMSPT-WLGVPLIALALTLPWIMYPT-PSSRWLNNRLLTLQGWFINRFTQQLLLPLNLPGHKWALIFTSLMIFLITLNLLGLLPYTFTPTTQLSLNMGLALPLWLATVIIGLRNQPT-AALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPLMPAVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFAILVFSW-LIFLTVIPPKIL-NH-TFNNEP-----T-T-MSAE-KS-KP---------Q-----S-W-NWP-WS------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq239 ----M--NLSLFDQFMSPT-LMGIPLIMISLALPWLLLPK-LTNKWLINRLSSLQLWFLHMITKQLFNPINLKGHKWALILASLMLFIMSMNLLGLLPYTFTPTTQLSMNLGLAVPLWLATLLIGLQNQPT-MTLGHLLPEGTPSLLIPILILIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAIFMLLSLMPMIAILTAMILFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFLIFITSW-LIYLIILMYKIN-NF-KTLNEP-----T-M-QDVI-KN-KP---------Q-----S-W-NWL-WI------------V-MI--TRWLYSTNHKDIGTLYLMFGAWASMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAGNMAHAGAS [...]
+Seq240 ----M--NLSLFDQFMSPT-LLGMPLIILSMMFTWFLFPN-QTNQWLVNRFSSLQLWLLCNFTKQLFSPINFNGHKWSLLLASLMLFLISMNLLGLLPYTFTPTTQLSLNLGLAIPLWLATVLMGLRNQPT-TALGHLLPEGTPTLLIPILVLIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATFMLLPLMPMISTLTMMILFLL---TLLEMAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFIIFTMAW-LIYLVFLMYKIG-NL-KVFNKP-----M-M-QTVT-KN-N----------K-----S-W-NWP-WI------------V-MI--TRWLYSTNHKDIGTLYLMFGTWAGMVGTALSILIRTELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq241 ----M--ALNFFDQFASPV-LYGIPLMALALTLPWMLYPT-ATNRWLNSRLLTLQSWFMNRFTQQLLLPINLGGHKWATLFTSLMIFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLITIPPKVL-SH-TFPHEP-----T-S-QSTE-KP-KT---------N-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq242 ----M--NENLFAPFITPT-ILGITTLPIIITFPCLILSS--PKRWLPNRIQILQMWLIRLITKQMMTMHNKQGRTWTLMLMSLILFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWAGTVIMGFRNKPK-MSLAHFLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSISMTVSTITFSILFLL---TLLEIAVAMIQAYVFTLLVSLYLHDN-S-M-PQLNTSTWTLTISLMI-ISLFCIYQLKMM-NQ-TLIQIT-----PSTEQSKL-TKHTL---------------P-W-EKK-WTKIYLPHSSHQQFM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLIGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq243 ----M--TMNMFEQFMSPE-LLMIPTALLSMLVPVLLIHH--NPKLLGNRMTTAIAWLLMTIMSNMTNQLTPSGQKWCQVLTSLLLMILLSNLLGLLPYTFTSTSQLSMNMAMAIPLWMATIITGMTKKPS-ITLAHMLPEGSPTPLIPFMIIIETISLLMRP--LALGVRLTANITAGHLLMTMVSTTTLNFITSHITLSIMTYLLLFLL---CILELAVACIQAYVFVLLIILYLQEN-T-M-PQLDTIYILMTHLWAW--LMLYLTTQKIK-TF-IMTSH--------PMIYHKPNKQ--------------------TPTPTWL------------V-FI--TRWLFSTNHKDIGTLYLLFGAWSGLIGACLSILMRMELTQPGSLLGSDQIFNVLVTAHAFIMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPALLLLLSSSYVEAGAGTGWTVYPPLSGNLVHSGPS [...]
+Seq244 ----M--NLTLFDQFSSPQ-LLGVPLILLSTLFPALLLPS-PNSRWITNRLSTLQLWFFQLITKQLMMPLNKAGHNWALILSSLMTFLLLINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-TSLAHILPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATMALLSIMPTISILTMLVLLLL---TILELAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPYPWFSILLMVW-FILLLLIQPKFL-SF-THTNPP-----S-N-KTKM-AP-IP---------P-----T-W-TWP-WT------------VTFI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq245 ----M--NLSFFDQFTSPC-LLGIPLILLSMLFPALLLPT-PNSRWITNRLSTLQLWFFHLITKQLMTPLNKSGHKWALILTSLMVLLLATNLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ISLGHLLPEGTPTLLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATIALLPIMPTVSILTALILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPSPWFLIMLTSW-MTFSLIIQPKLS-SF-TPTNSP-----C-N-KAST-TT-KT---------A-----P-W-PWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq246 ----M--TLSFFDQFMSPT-FLGLPLIALALSLPWLLFPA-PTTRWLNNRLLTLQGWFINRFTQQLLLPLNLGGHKWATLLTSLMIFLITLNMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-HALGHLLPEGAPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVALLTTTLLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFAILIFSW-LVFTTVIPPKIL-AH-TFPNEP-----T-A-QSTE-KP-KT---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq247 ----M--TLSFFDQFMIPQ-LMGMPLIIPAMFFP-LLLLP-QTPRMLQNRMHTIMTYITQNFTKQLLLPLNLPAHKWANPLTSLMILLASMNLLGLLPYTFTPTTQLSINMALAIPLWLTTVLIGFRTQPT-NALGHMLPEGTPTPLIPMLVLIETISLLIRP--LALGVRLTANLTAGHLLLQLISTATLALLPTLPSIAILITMVLILL---TLLELAVALIQAYVFVLLLSLYLQEN-T-M-PQLNPAPWLMLLMLTW-TTLILYMTKTSY--F-TFHMYP-----T---SQPI-MKT-K---------I-----Y-W-TWP-WP------------V-ML--TRWFFSTNHKDIGTLYLLFGAWAGMAGTALSLLIRAELGQPGALLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASAGVEAGAGTGWTVYPPLAGNLTHAGAS [...]
+Seq248 ----M--ALSFFDQFLSPT-HLGIPLIALALLLPWALLPT-PSGRWLNNRLLTLQGWFVSRFAQQLLTPLNPAGHKWAAIFTCLIVFLMTLNILGLLPYTFTPTTQLSLNLGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPTLLIPVLIVIETISLLIRP--LALGVRLTANLTAGHLLIGLISTAAVVLLPLMPAVAALTAVILFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPSPWFAILLFSW-LVFLIILPPKII-AH-TFPGEP-----A-L--STE-KT-KT---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq249 ----M--TLSLFDHFISPV-FLGIPLVALATALPWLLFPA-PTTRWLNNRLLSVQNWFIGTFAKHISLPLNVGGHKWALLLTSLLIFLITINMLGLIAYSYTPTTQLSFSLGFAVPLWLATVITGLRTQPT-HAFAHLLPEGTPVLLIPVLVIIETISLMIRP--IALGVRLTANLTAGHLLIHLLSTGAYVLYPTMPAVALLPTIFMFAL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFATLVFSW-FIFLVVIPPKIL-AH-TYPNEP-----T-T-QSTE-KP-PT---------T-----P-W-AWP-WH------------M-MI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPMMIGGFGNWLIPLMIEAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq250 ----M--TLSLFDHFISPI-FLGVPLVALATALPWLLFPA-PTTRWLNNRLLSVQNWFIGTFAKHISLPLNVGGHKWALLLTSLLIFLITINMLGLIAYSYTPTTQLSFSLGFAVPLWLATVITGLRTQPT-HAFAHLLPEGTPVLLIPVLVIIETISLMIRP--IALGVRLTANLTAGHLLIHLLSTGAYVLYPTMPAVALLPTIFMFAL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFATLVFSW-FIFLVVIPPKIL-AH-TYPNEP-----T-A-QSTE-KP-PT---------T-----P-W-AWP-WH------------M-MI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPMMIGGFGNWLIPLMIEAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq251 ----M--NLSFFDQFMSPS-LLGVPLIALAILAPWVLLPA-QSDRWLNNRLMTLQSWFIFTFTKQIFTPINHNGHKWAMILVSLMMFLISINLLGLLPYTFTPTTQLSLNMGLAVPLWLATVLIGLRNQPT-VALGHLLPEGTPTPLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPVVSILTSAVLLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAILVFSW-LVLLTIIPPKVT-SH-KTFNEP-----T-T-QNTE-KS-KP---------T-----P-W-TWP-WT------------V-AI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq252 ----M--NENLFAPFITPT-IMGISTLPIIMMFPCLILTS--PKRWLPNRIQTLQIWLIRMITKQMMMMHNKQGRSWTLMLMSLILFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWMGTVTMGFRNKPK-MSLAHFLPQGTPTPLIPMLIVIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSISMTISSITFTILFLL---TILELAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFFTITLML-ISLFCMYQLKML-NQ-TMTSIS-----PQNNKNPK-TNINM---------------P-W-EKK-WTKIYLPHSSPLQSM-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLIGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq253 ----M--TLSFFDQFMSPT-YLGIPLMALALSLPWILYPK-PTHRWLNNRLLTLQGWFINRFTQQMFLPINLGGHKWAALLTSLMLFLITLNMLGLLPYTFTPTTQLSLNMAFAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLAPIMPTIAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFVILIFSW-LIFAAIVPPKIL-AY-LFPNEP-----S-L-QSTS-KS-NK---------Q-----P-W-GWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTGLSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq254 ----M--NLTLFDQFLSPQ-MLGLSLMTLATTMPSMTWPT-QNNRWLNNRLSTLQSWTTHMITKQLMLPISKPGHKWSVMLVSLMIFLLTINLLGLLPYTFTPTTQLSMNMALAVPLWLSTVLTGLRNQPT-KSLGHLLPEGTPTLLIPTLIIIETISLLIRP--LALGVRLTANLTAGHLLIQLVSTTTITLMFTSPTLSMLTSITLLLL---TLLELAVALIQAYVFALLLSLYLQEN-V-M-PQLNPVPWLSILLITW-LTYIMIYQPKIT-SL-LQTNNI-------I-YNHK-CL-NT---------N-----S-W-NWP-WT------------V-IL--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLTSSGVETGAGTGWTVYPPLASNLAHAGAS [...]
+Seq255 ----M--MLSFFDQFMSPT-CLGIPLIALAIALPWTLYPA-PTSRWLNNRVLTLQGWFINRFTQQLLLPLNLGGHKWAVLLTSLMLFLVTINMLGLLPYTFTPTTQLSLNLGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPILIVIETISLLIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPTVAILTGTVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTVIPPKVL-AH-NFNNEP-----T-T-VGAE-KA-KP---------E-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq256 ----M--NLSFFDQFASPQ-LLGIPLILLSLLFPTLLLPS-PGGRWITNRLSTLQLWFLQLITKQLMTPLNKPGHKWALILSSLMVFLLLTNLLGLLPYTFTPTTQLSMNMALALPLWLATLLTGLRNQPS-ISLGHLLPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATMALLPIMPTISILTASILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFLIMLASW-AILLLLMQPKLL-SF-TPTNSP-----P-N-KTKT-TP-NP---------T-----P-W-TWP-WT------------VTFI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq257 ----M--NENLFAPFITPT-ILGISTLPIIMLFPCLILTT--PKRWLPNRIQILQIWLIRLITKQMMSMHNQRGRSWTLMLMSLMLFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWMGTVVMGFRNKPK-VSLAHFLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSINMTVSTITFTILFLL---TILELAVAMIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWFLTITLMI-ISLFCIYQLKMM-NQ-NMISIM-----AQNEKIKP-TKTTL---------------P-W-EKK-WTKIYLPHSSPLLSM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLIGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq258 ----M--NLSFFDQFTSPC-LLGIPLVLLSMLFPALLLPS-PGSRWITNRLSTLQSWCIDLITKQLMTPLNKSGHKWALILTSLMILLLSINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ASLGHLLPEGTPTPLIPALILIETVSLLIRP--LALGVRLTANLTAGHLLIQLISTATTALLSVMPAISMLTSIILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFFIMLLSW-LTFSLMIQPKLL-SF-PHTNPP-----T-S-KSTT-AA-KT---------T-----P-W-AWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMIGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq259 ----M--NENLFTSFITPT-MMGLPIVILVIVFPAMLYPS--PNRLINNRLISIQQWLVQLILKQMLLIHNSKGRTWALMLISLILFIGSTNLLGLVPYTFTPTTQLSMNLGMAIPLWAGAVITGFRHKAK-ASLAHFLPQGTPITLIPMLVVIETISLFIQP--MALAIRLTANITAGHLLMHLIGGAVLALTSISPAAATITFIILLLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTTTWFITILSML-ITLFILFQTKLL-NY-TYPLNA-----LPI-SPNV-TNHLT---------------P-W-KMK-WTKTYLPLSLPLQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSILIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMIEAGAGTGWTVYPPLAGNLAHGGAS [...]
+Seq260 ----M--NENLFTSFSTPT-LMGLPIIIMIIAFPALLYPT--SNRLISNRIRTLQQYLINLILKQMMAIHSPKGRTWSLMLMSLIIFIASTNLLGLLPHTFTPTTQLSINLGLAIPLWAGAVILGFRYKFK-TSVSHFLPQGTPILLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLMHLIGAATLALFSISTSTALITFIILLLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSPWLISILSMSDLRLYLLMPIKIS-KI-LINNDI-----NCH-PSEI-TKSTN---------------P-W-NNK-WTKIYLPHSLPLH-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGTVGTALSLLIRAELGQPGALLGDDQIYKLIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq261 ----M--NENLFTSFMIPM-FMGLPVFIIIIMFPSILFPS--PSRLINNRIITIQQWIVKITSKQMMSIHNQKGQTWTLLLMSLIMFIGSTNLLGLFPHSFTPTTQLSMNLGMAIPLWAGTVIMGFRFKTK-ASLAHFLPQGTPLALIPMLVLIETISLFIQP--MALAVRLTANITAGHLLIHLIGSATLTLISISPTAATFSFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFSTIIVMI-MTLFILFQLKFS-TY-NYISSP-----EIK-LINL-TTHKN---------------S-W-ETK-WTKIYLPLL-----M-FI--NRWLFSTNHKDIGTLYMIFGAWAGMAGTSLSLLIRAELGQPGALLGDDQIYNVVVTAHAFIMIFFMVMPIMLGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq262 ----M--NENLFAPFITPT-ILGVTTLPIIMFFPCLILTT--PKRWLPNRIQMLQMWLIRLITKQMMMMHNKQGRSWALMLMSLILFIASTNLLGLLPYSFTPTTQLSMNIGMALPLWMGTVLMGFRNKPK-ASLAHFLPQGTPTPLIPMLIIIETISLFIQP--IALAVRLTANITAGHLLIHLIGSATLALTSISISISAITFIILFLL---TILELAVAMIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWLLVIFLMI-MALFCVYQLKML-NQ-KMISII-----PTTNNMILTTKTQL---------------P-W-EKK-WTKIYLPHSSPLQFM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq263 ----L--ALNFFDQFMSPT-HLGIPLIAIALSLPWILYPS-PSDRWLNNRLITLQAWFMNRFTQQLLLPLNPGGHKWALIFTSLMVFLLSINLLGLLPYTFTPTTQLSLNMGLAVPFWLATVIIGMRNQPT-AALGHLLPEGTPVLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVMLPTMTTLAVLTAIVLLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLAILLFSW-FIFLAVLPAKVM-KH-TFTNEP-----T-A-LSAK-AP-KT---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYMVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq264 ----M--NENLFASFIIPM-VLGLPLVTLIIMFPSLLFPT--SNRLVNNRFISLQQWMLQLVSKQMMGIHNTKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVVTGFRNKTK-ASLAHFLPQGTPTPLIPMLVIIETISLFIQP--IALAVRLTANITAGHLLIHLIGGATLALMNISTTMALITFIILVLL---TVLEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFVMIMSMF-LVLFIIFQLKIS-KH-NFHFNP-----EPM-LTKT-QKQNI---------------P-W-ETK-WTKIYLPLLLS-Q-M-FI--NRWLYSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq265 ----M--MLSFFDQFASPT-FLGIPLITLALTLPWILYPS-PSSRWLNNRLLTLQGWFINRFTQQLLLPLNVGGHKWAVMLTSLMLFLITLNMLGLLPYTFTPTTQLSMNMALAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAVLTATLLFLL---TLLEVAVAMIQAYVFVLLISLYLQEN-I-M-PQLNPAPWLMILIFSW-FVFLTLIPPKVL-AH-TYPNEP-----S-P-RDTK-TF-ET---------K-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq266 ----M--ALNFFDQFMSPT-YLGIPLIALALTLPWTLFPT-PSSRWLNNRVLTLQGWFINRFTYQLMMPINAGGHKWATIFASLMLFLISLNMLGLLPYTFTPTTQLSMNMGLAVPLWMATVLIGMRNQPT-AALGHLLPEGTPAPLIPVLIIIETISVFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLIPLMPTVALLTGVVLFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTILPPKIL-AH-TFPNEP-----T-P-QSTQ-KP-KT---------E-----S-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq267 ----M--NENLFASFITPT-LAGLPIVVLIIAFPSILFPN--SNRLINNRWVAIQQWLITVILKQMMMMHNIKGRTWSLMLVSLILFIGSTNLLGLLPHTFTPTTQLSMNLGMAIPLWAGAVITGFRHKTK-ASLAHFLPQGTPIPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLVLMSISTPTAMITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITILSAL-ITLFIIFQINLA-SF-TNPQDP-----SIK-TSKT-SLSPS---------------T-W-ETK-WTKIYLPHSSRLH-M-FI--NRWLFSTNHKDIGTLYLIFGTWAGMVGTALSILIRAELGQPGALMGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq268 ----M--ALSFFDQFASPT-YLKVPLIALAIALPWVLYPA-PTSRWLNNRLLTLQGWFINRFTQQLLLPLNVGGHKWALLLASLMIFLLTQNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAVVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTTIPTKVM-AH-SFMNEP-----S-T-QSAE-KP-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq269 ----M--ALSFFDQFASPT-YLKVPLIALAIALPWVLYPT-PTSRWLNNRLLTLQGWFINRFTQQLLLPLNVGGHKWALLLASLMVFLLTQNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAVVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTIIPTKVM-AH-SFMNEP-----S-T-QSAE-KP-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq270 ----M--NLTLFDQFSSPQ-LLGIPLILLSTLFPALLLPS-PNNRWITNRLSALQLWLFQLITKQLMMPLNKAGHNWALILSSLMTFLLLINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ISLAHILPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATMALLSIMPTISILTMLILLLL---TILELAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPHPWFSILLMVW-FILLLLIQPKFL-SF-IYTNLP-----S-N-KTKM-AP-IP---------P-----T-W-TWP-WT------------VTFI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq271 ----M--TLSFFDQFMSPS-YLGIPLMALALSLPWILFPT-PSARWLNNRMLTLQNWFINRFTQQLLLPLNPGGHKWALILTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-IALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTILPPKVM-AH-TFPNEP-----T-P-QSTQ-KP-KT---------E-----P-W-TWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq272 ----M--MLSFFDQFASPN-YMGIPLIALAIVLPWILFPT-PTSRWLNNRLLTLQGWFINRVSQQIFLPINPGGHKWAMLFTSLLVFLITINMLGLLPYTFTPTTQLSLNMAFAVPLWLATVIIGMRNQPT-AALGHLLPEGTPGPLIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATGAFVLLPIMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFFILILSW-LTFLIILPPKVL-AH-EFTNEP-----T-V-MGAE-KP-KP---------E-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMLGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq273 ----M--MLSFFDQFASPN-YMGIPLIALAIVLPWILFPT-PTSRWLNNRLLTLQGWFINRVSQQIFLPINPGGHKWAMLFTSLLVFLITINMLGLLPYTFTPTTQLSLNMAFAVPLWLATVIIGMRNQPT-AALGHLLPEGTPGPLIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATGAFVLLPIMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFFILILSW-LTFLIILPPKVL-AH-EFTNEP-----T-V-MGAE-KP-KP---------E-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMLGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq274 ----M--NENLFSSFITPV-VMGLPIVIAIVMFPSIMFPS--PSRLINNRLISIQQWLVQLTSKQMLSIHNQKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRYKTK-ASLAHFLPQGTPIPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMNISTITAAVTFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLITIMSMI-ITLFIMFQLKVS-KH-CFPDNP-----EPK-LTTT-SKPTT---------------P-W-EEK-WTKIYFPLSLPL--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq275 ----M--MMSLFDQYMSPT-LLGVSLIFLSLIIPLLFTRN-PTNQWLNNRFTSLQLWSSYGFTKQLMSPLNFIGHKWSLMLMSLMMFIITVNLLGLLPYTFTPTTQLSMNLGLAVPLWMATVILGLKNQPT-MTLGHLLPEGTPTLLIPALILIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAIFVLLSLMPPIAILTSGLLLLL---MLLEIAVATIQAYVFVLLLSLYLQEN-V-M-PQLNPDPWFMTLVVYW-IIYVILM-SKIN-NF-KTTKEF---------VMKD-KNIEL---------Q-----S-W-ILM-W-------------V-MF--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRTELSQPGTFLGDDQIYNVLVTSHAFVMIFFMVMPIMIGGFGNWLLPMMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLASNMAHAGAS [...]
+Seq276 ----M--NENLFASFATPT-MMGLPIVILIILFPSIMFPA--PNRLINNRLVALQQWLIQLISKQMMTIHNQKGQTWTLMLISLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRHKTK-ASLAHFLPQGTPLPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLVLMSISPITAFITFIILVML---TVLEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITIMSML-LTLFIVFQLKVS-KY-LYPMNP-----ELK-SLKT-LKHNN---------------P-W-ETK-WTKIYSPLSLPQQ-M-FI--TRWLFSTNHKDIGTLYMVFGAWAGMAGTALSILIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMLGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq277 ----M--NENLFASFATPT-MMGLPIVILIIMFPSILFPS--SNRLINNRLISIQQWLVQLTSKQMMTIHNNKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVFMGFRHKTK-AALAHFLPQGTPIFLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMDISPSTALITFIILILL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFINIVSMI-LTLFIVFQLKIS-KH-SYPMHP-----EAK-TTKM-AKRLT---------------P-W-ESK-WTKIYSPLSLPQQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq278 ----M--NENLFASFATPT-MVGLPIVILIIMFPSILFPS--PNRLINNRLISIQQWLVQLTSKQMMAIHNSKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVFMGFRHKTK-AALAHFLPQGTPIFLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGGATLALMSISPSTALITFIILILL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFINIVSMI-LTLFIVFQLKIS-KH-SYPTHP-----EVK-TTKM-TKHSA---------------P-W-ESK-WTKIYSPLSLPQQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq279 ----M--NENLFASFTTPT-MMGLPIVILIILFPSILFPS--PNRLVNNRLTSIQQWLIQLTSKQMLSIHNHKGQTWALMLMSLILFIGTTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRYKTK-ASLAHFLPQGTPLLLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMDISTTTALITFTILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFIVILSMI-LTLFITFQLKIS-KH-LFPMNP-----EPK-QTTP-LKNNT---------------P-W-EEK-WTKIYSPLSLPLQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq280 ----M--NENLFTPFIAPT-LLGIPVAILIIMFPSLLFIK--HTRLFSNRIMILQQWMIKKTTKQMMSNHNPKGQTWALLLMSLMMFISSSNILGLLPHSFTPTTQLSMNLGMAIPLWAGAVIMGFRLKLK-NSLAHFLPQGTPLPLIPMLIIIETISLLIQP--MALAIRLTANITAGHLLIHLIGSAVLNLLAINPSVAMLTLIILLLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSSWFTMILAMF-LTLFIIMQLKIN-SY-KTYNMM-----ETK-KQTL-NHSLK---------------P-W-EHK-WTKIYLPLLLPLHYM-FI--SRWLFSTNHKDIGTLYLLFGAWAGMVGTSLSLLIRMELGQPGALLGDDQIYNVVVTAHAFVMIFFMVMPIMLGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFILLLTSSMVEAGVGTGWTVYPPLAGNMAHAGSS [...]
+Seq281 ----M--MLNFFDQFASQS-LLGIPLIAIAMLVPWLLFPS-PYKRWLNNRLITFQYWFISRATSQLMLPLNINAHKWALILMALLLFLIMLNLLGLLPYTFTPTTQLSMNMALAVPLWLATVLIGMRNQPT-HSMAHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATFVMLSFMPTIAMLTFIVLALL---TLLEIAVAMIQAYV---------------M-PQLNPDPWFVILIFTW-TVFLTILPNKIT-FY-KIPNEP-----L-N-SDPL-GS-NM---------D-----T-W-SWP-WY------------V-TI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGALMGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLTSSAVEAGVGTGWTVYPPLAGNLAHAGAS [...]
+Seq282 ----M--NENLFAPFMTPV-MLGIPITTLIIILPSILFPT--PNRLVNNRTISIQQWLTKLTSKQLMNVHNPKGQTWSLMLTSLFLFIASTNLLGMLPHSFTPTTQLSMNVGMAIPLWAGTVATGLRNKTK-MSLAHLLPQGTPTFLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLMHLIGETTLVLTSISPFTALITFIILTLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLLTILSML-LTLFVLFQLKIS-KY-SYSPDP-----KLT-LTKT-QKQQT---------------P-W-NTT-WTKIYLP---LS--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGSLIGDDQIYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq283 ----M--TVSLFDQFESPI-LLGIPLVVVAIILPWTLFPT-PKPKWINNRLATAQTWLINWFTSQLMLPLSVRGHKWALVFASLILFLITINMLGLLPYTFTPTTQLSMNMAFAVPLWLATVIIGMKNQPT-IALGHLLPEGTPTPLIPILVIIETISLLIRP--LALGVRLTANLTAGHLLIQLLATAAFVMTSIMPAAAAATIIVLYLL---TLLEVAVAMIQAYVFALLLSLYLQEN-V-M-PQLCTDPWFMILVTSW-LTFLTIVPTKVL-SY-TQPNEP-----T-P-INVD-KH-IT---------G-----P-W-NWP-WQ------------M-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq284 ----M--MLNFFDQFMSPV-LLGIPLIALALLLPWILFPN-PAARWINNRLITLQGWSISQATHQLFTPLNQGGHKWATLLISLMIFLISLNLLGLLPYTFTPTTQLSLNMAFAVPLWLATVIVGLRNQPT-IALGHLLPEGTPLPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPLMPTVAILTASVLFLL---TLLEVAVAMIQAYVFILLLSLYLQEN-V-M-PQLNPAPWLSILVFSW-FVFLFVIPPKVL-NH-SFMNEP-----A-P-QSAE-KP-KF---------N-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq285 ----M--TLSFFDQFMSPT-FMGIPLMALALSLPWLLYPA-PSARWLNNRFLALQSWFINRFTQQMLLPLNAGGHKWAALLASLMIFLITLNMLGLLPYTFTPTTQLSLNLGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPGPLIPVLIVIETISLLIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTSTVLVLL---TLLEIAVAMIQAYVFVLLLTLYLQEN-V-M-PQLNPTPWFAILVFTW-LIFLAIVPTKIL-AH-TYPNEP-----T-S-QSTE-KP-KT---------E-----P-W-TWP-WH------------V-AT--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq286 ----M--MLSFFDQFMSPT-YLGIPLIALAIALPWTLYPT-PTSRWLNNRVLTLQGWFINRFTQQLLLPLNPGGHKWAVLFTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTVIPPKVL-AH-NFNNEP-----T-T-VGAE-KA-KP---------E-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq287 ----M--MLSFFDQFMSPS-FLGIPLIALAIALPWTLYPT-PTSRWLNNRVLTLQGWFVNRFTQQIFLPLNPGGHKWAALLASLMIFLLTINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGLRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLMPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTVIPPKVL-AH-TFNNEP-----T-T-VGAE-KA-KP---------E-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVMVTAHAFVMIFFMVMPILIGGFGNWLVPLMLGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq288 ----M--NENLFAPFMTPV-MVGIPITTLIIILPSILFPT--PNRLINNRTISIQQWLTKLTSKQLMSAHSPKGQTWSLMLISLFLFIASTNLLGMLPHSFTPTTQLSMNVGMAIPLWAGTVFTGFRNKTK-MSLAHLLPQGTPTFLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGEATLALMNISLLTTLITFIILTLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLLTILSML-LTLFVLLQLKIS-KH-SHSPNP-----KLV-LTKT-QKQQT---------------P-W-DTT-WTKIYLP---LS--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLIGDDQVYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq289 ----M--NENLFAPFMTPV-MVGIPITTLIIILPSILFPT--PNRLINNRTISIQQWLTKLTSKQLMSTHSPKGQTWSLMLISLFLFIASTNLLGMLPHSFTPTTQLSMNVGMAIPLWAGTVFTGFRNKTK-MSLAHLLPQGTPTFLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGEATLALMNISLLTTLITFIILTLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLLTILSML-LTLFVLLQLKIS-KH-SHSPNP-----KLV-LTKT-QKQQT---------------P-W-DTT-WTKIYLP---LS--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLIGDDQVYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq290 ----M--NLTFFDQFSSPQ-LLGIPLILLSMAFPTLLLPS-MSNRWTTNRLSTLQLWFTQLVTKQLMISLNKPGHKWALILSSLLTFLLIINLLGLLPYTFTPTTQLSMNMALAFPLWLATVLIGLRNQPS-ISLGHILPEGTPTPLIPILIIIETISLLIRP--LALGVRLTANLTAGHLLIQLISTATITLLSIMPTISLLTSLILILL---TILELAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFLIMASSW-LIFLLIMQPKLA-SF-NPTNPP-----S-N-KTQS-TK-QP---------L-----P-W-SWP-WT------------VTFL--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMLGAPDMAFPRMNNMSFWLLPPSFLLLLASSTIESGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq291 ----M--NLSFFDQFASPC-LLGIPLILLSMLFPTLLFPT-PNNRWITNRLSTLQLWSIHSITKQFMNPLNKEGHKWALILTSLMILLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ISLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTAITTLLPIMPAVSILTASILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFPIMLASW-LTFSLVIQPKLT-AF-ISTNNP-----A---KTTT-TT-KT---------M-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq292 ----M--NLSFFDQFASPC-FLGIPLILLSMLFPALLFPA-PNSRWITNRLSTLQLWSLHSITKHLMTPLNKKGHKWALILTSLMMLLLTTNLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ISLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTAITTLLPIMPTVSILTMSILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWLPIMMASW-LILSLIIQPKLT-TF-ISTNYP-----S---KTPT-TT-KT---------T-----P-W-TWP-WT------------VTFT--NRWLFSTNHKDIGTLYLIFGAWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq293 ----M--NLNFFDQFLSPQ-LLGIPLILLAMTVPPMLIFM-TTNRLIPNRLTALQSWFAFLFTKQLMMPLNKPGHKWAAILMSLMLFLLSLNMLGLLPYTFTPTTQLSMNMGLAVPLWLATVLIGLRNQPT-ISLGHLLPEGTPTPLVPILITIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATFVLLPIMTTTATLALIVLLLL---TGLEIAVAMIQAYVFTLLLSLYLQEN-V-M-PQLNPAPWLLILLLSW-TVLMFIFKTKTL-SS-TPHNTP-----T-A-PDLL-TH-HT---------T-----P-W-NWP-WT------------V-TI--NRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq294 ----M--NENLFTSFASPT-MMGLPIVTLVILFPSMLFPS--PSRLINNRLTSIQQWLIQLTSKQMMLMHNHKGQTWTLMLMSLIMFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVAMGLRHKTK-ASLAHFLPQGTPSPLIPMLVIIESISLLIQP--MALAVRLTANITAGHLLIHLIGGATLALINISMISAFITFIILTLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLTTIVSMI-LTLFIVFQLKIS-KH-HFPMSP-----ELK-PLST-SKTYT---------------P-W-EKK-WTKIYSPLSLPLQ-M-FV--NRWLFSTNHKDIGTLYLLFGAWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSLVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq295 ----M--NLSFFDQFMSPT-LLGVPLIMMSIVFPIFLFPM-SQKQWLSNRTNSLHLWFSSNFTKQLFTPLNILGHKWSLLLTSLMLFLISMNLLGLLPYTFTPTTQLSMNLGLAVPLWLATVMIGLRNQPT-AALGHLLPEGTPAILIPILITIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATITILPLMPSIAILAMITLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFSIFFMSW-LIYLIIVLLKIN-NL-KMFNEP-----T---QNTI-KN-KP---------Q-----S-W-YWP-WT------------V-MI--TRWLFSTNHKDIGTLYLMFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNMAHAGAS [...]
+Seq296 ----M--ALNLFDQFMSPA-FMGIPLMALALTLPWVLLPT-PSARWLDSRVSTLQNWFMCQFTRQLLTPLNMGAHKWAVIFASLMSFLLVINILGLLPYTFTPTTQLSLNLGLAVPLWMATVIIGLRNQPT-ATLGHLLPEGTPSPLIPMLIIIETISLCIRP--LALGVRLTANLTAGHLLIQLIATAIFALMPTMMLTAALTMVVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNPSPWFMILVFSW-AVFLIIIPTKIM-AH-ATSNQP-----T-SLQAPT-AL-TP---------D-----P-W-NWP-WH------------M-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELTQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq297 ----V--TLSMFDQFASPV-YLGIPLMALALSLPWILLPT-PSTRWLGNRLLTLQAHSINRFTQQLLLPLNLMGHKWAILLTSLMVFLITLNMLGLLPYTFTPTTQLSLNLGLAVPLWMATIIIGMRNQPT-HALAHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPAVAILTTILLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFIILIFSW-AMFLTIIPPKIL-AH-TFPNEP-----S-T-QSTK-ET-MT---------K-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq298 ----M--TLSFFDQFMSPV-FLGIPLMALALTLPWILFPT-PTTRWLNNRLLTLQNWFIGRFAHELFMPVNLPGHKWAVLLTSLMLFLISLNMLGLLPYTFTPTTQLSLNMGFAFPLWLATVIIGMRNQPT-EALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAATVLLPLMPTVAILTATILFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLAILVFSW-LVFLIVIPPKVM-AH-SFPNEP-----T-P-QSTE-KP-KG---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq299 ----M--MVSFFDQFMSPV-FLGIPLIALALSLPWTLFPR-PSARWLHNRTLTLQNWFMNRFTQQIFMPMPALGHRWALILMSLMIYLLSLNMLGLLPYTFTPTTQLSLSMGLATPLWLATVITGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--IALGVRLTANLTAGHLLIQLIATAAFQLLPIMPTVALTTTVLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLDPAPWFAILVFSW-FIFLTIIPPKVL-AH-SFPNEP-----T-P-QSTK-LP-KT---------E-----S-W-NWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq300 ----M--NLSFFDQFSSPY-LMGMPLALLSILFPALLFPS-PSTRWINNRLITLQSWLIHLITKQLMTPLDKKGHKWALILTSLMMLLLMINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPT-TSLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATATLLPIMPAISTLTMLVLLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFLTMLATW-AIFLLIIQPKLL-PF-TPTNPP-----M-N-KTNT-SN-KS---------T-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRTELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGVGTGWTVYPPLAGNLAHAGAS [...]
+Seq301 ----M--NLSFFDQFSSPY-LMGMPLALLSILFPALLFPS-PNTRWINNRLTTLQSWLIHLVTKQLMMPLDKKGHKWALILTSLMMLLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPT-ISLGHLLPEGTPTPLIPALILIETTSLFIRP--LALGVRLTANLTAGHLLIQLISTATAVLLPIMPTISALTMLVLLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFLTMLVTW-TIFLLIIQPKLL-PF-TSTNNP-----Q-N-KANT-LN-KS---------T-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLLFGAWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGVGTGWTVYPPLAGNLAHAGAS [...]
+Seq302 ----M--MNNLFDQFASPT-LFFTPLIIIALLTPWLIFFP-ATKTCTNNRPNAIQSWFLKTSTKQIFLPINHAGHKWALILASLLVFLMSINLLGLFPYTFTPTTQLSMNLGLAVPLWLTTVLIGLRNQPT-ISLGHLLPEGTPTPLIPILIVIETISLFIRP--LALGVRLTANLTAGHLLIHLISSATLAVTAMSTGLTLLTFAVLLLL---TILEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLLPEPWFYIFFFSW-TIFLIATPIKIA-SY-EFFKDP-----L-P-GALK-T--NS---------M-----T-W-SWK-W---------------MF--SRWLFSTNHKDIGTMYLIFGAWAGMTGTALSLLIRAELSQPGALLGDDQIYNVVVTAHAFVMIFFMVMPILIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFFLLLASSTVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq303 ----M--NENLFASFTTPT-MMGLPIVILIIMFPSILFPS--PNRLINNRLVSLQQWLVQLTSKQMLAIHNHKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRHKTK-ASLAHFLPQGTPVPLIPMLVVIETISLFIQP--MALAVRLTANITAGHLLMHLIGGAALALMNISTSIALITFTILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWSITIMSMI-MTLFIVFQLKIS-KY-LYPSNP-----EPK-SMTT-LKQRN---------------P-W-EKK-WTKIYSPLSLPQQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq304 ----M--MTELFDQFMIPK-LWGINLMPIAIVTPALLIY--PTNKIQTNRVTSTMQWLMKKTTKHLLSTMNTPAHMWSLLLITTITLISITNIIGLLPYTFTPTTQLSMNMAMATPMWMATVMIGLRNQPT-HSMSHFLPQGTPTLLIPTLIIIETISLFIRP--IALGVRLTANLTAGHLLMQLISMAT---MKTNLTLFPIMLTTLLLL---TALEIAVALIQAYVFTLLLSLYLQENTNEL-PQLNPTPWLMMMLMAW-LTINVMSTLINSNLM-QNPTTP-----T---KMNN-HTKKS---------T-----A-W-TWP-W-------------MWTI---RWLLSTNHKDIGSMYFLFGLAAGLVGATSSLIMRTKLGQPGFSLGDDHSYNVLITLHGLTMIFFMVMPIMIGGFGNWLVPLMLGAPDMAFPRMNNMSFWLLPPSFLLLLASSKAGTGVGTGWTIYPPLSGNMAHAGPS [...]
+Seq305 ----M--TLSLFDQFSSPS-FLGIPMILMALALPWLLIPT-PTSRWLSNRVVSLQGWFIARFTNQLFLPLNVGGHKWAPLLASLMMFLLTLNMLGLMPYIFTPTTQLSLNLGLAVPLWLATVLIGMRNQPT-HALGHFLPEGTPTALIPILIIMQTISLFIRP--LALGVRLTANLTAGHLLIHLISSAVFVLMPMMPVVAILTAVLLLLL---TMLEVAVAMIQAYVFILLLSLYLQEN-V-M-PQLNPAPWFMIFMFTW-AIFLTILPPKVM-AH-TFPNEP-----S-P-QGMT-TP-KT---------A-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPLMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTLYPPLAGNLAHAGAS [...]
+Seq306 ----M--TLSFFDQFMSPT-FLGVPLMALALTLPWMLFPT-PSSRWLNNRLLTLQGWFINRFTQQLLLPLNLGGHKWALVLTSLMVFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPAVALLTSAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILTFSW-LIFLTIIPPKVL-GH-TFPNEP-----T-A-QSTE-KA-KP---------E-----S-W-PWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq307 ----V--MLSFFDQFASPM-FMGIPLMAIALILPWVLYPT-PTSRWLNSRLMTLQTWFINRFIKQLLTPLNLAGHKWALMFTSLMIFLMSLNVLGLLPYTFTPTTQLSLNMGLAIPLWLATVIIGVRSQPT-AAMGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFALLPMMTTMAIMTTVILFLL---TLLEAAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPSPWFIILTFSW-LVLLTVIPPKVL-GH-TFPNEP-----T-T-QNTH-KP-KP---------G-----S-W-YWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq308 ----M--NENLFSSFTTPT-LMGLPIVMLIIMFPSMFFPS--PNRLINNRLISIQQWLIKLISKQMMSIHNMKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVMLGFRHKTK-TSLAHFLPQGTPLPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMSISTTTAMITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFTTILGTI-MTLFILFQLKIS-KH-MFYLTP-----EAK-TMKS-LKHEN---------------P-W-ETK-WTKIYSPLSLPLL-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAEWGQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILLGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq309 ----M--NLSFFDQFSSPC-LLGIPLILPSLLLPALLLPS-PGNRWINNRLSTIQLWFTHLITKQLMTPLNKAGHKWALLLTSLILMLLSINLLGLLPYTFTPTTQLSMNMALALPLWLATLLTGLRNQPS-ASLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATIALLPMMPSISALTALILFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFSIMLLTW-FTFSLLIQPKLL-SF-TLTNNP-----A-N-KIT--TT-KP---------T-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGTWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq310 ----M--NLSFFDQFSSPC-LLGIPLILPSLLLPALLLPS-PGNRWINNRLSTIQLWFTHLITKQLMTPLNKAGHKWALLLTSLILMLLSINLLGLLPYTFTPTTQLSMNMALALPLWLATLLTGLRNQPS-ASLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATIALLPMMPSISALTALILFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFSIMLLTW-FTFSLLIQPKLL-SF-TLTNNP-----A-N-KIT--TT-KP---------T-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGTWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq311 ----M--NLSFFDQFSSPC-LLGIPLILPSLLLPALLLPS-PGNRWINNRLSTIQLWFTHLITKQLMTPLNKAGHKWALLLTSLILMLLSINLLGLLPYTFTPTTQLSMNMALALPLWLATLLTGLRNQPS-ASLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATIALLPMMPSISALTALILFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFSIMLLTW-FTFSLLIQPKLL-SF-TLTNNP-----A-N-KIT--TT-KP---------T-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGTWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq312 ----M--NLSFFDQFSSPC-LLGIPLILPSLLLPALLLPS-PGNRWINNRLSTIQLWFTHLITKQLMTPLNKAGHKWALLLTSLILMLLSINLLGLLPYTFTPTTQLSMNMALALPLWLATLLTGLRNQPS-ASLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATIALLPMMPSISALTALILFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFSIMLLTW-FTFSLLIQPKLL-SF-TLTNNP-----A-N-KIT--TT-KP---------T-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGTWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq313 ----M--NLSFFDQFSSPC-LLGIPLILPSLLLPTLLLPS-PGNRWINNRLSTIQLWFTHLITKQLMTPLNKAGHKWALLLTSLILMLLSINLLGLLPYTFTPTTQLSMNMALALPLWLATLLTGLRNQPS-ASLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATIALLPMMPSISALTALILFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFSIMLLTW-FTFSLLIQPKLL-SF-TLTNNP-----T-N-KVT--TT-KP---------T-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGTWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq314 ----M--NLSFFDQFSSPY-LLGIPLILPSLLLPALLLPS-PGNRWINNRLSTIQLWFTHLITKQLMTPLNKAGHKWALLLTSLILMLLSINLLGLLPYTFTPTTQLSMNMALALPLWLATLLTGLRNQPS-ASLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATITLLPMMPSISALTALILFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFSIMLLTW-FTFSLLIQPKLL-SL-TLTNNP-----T-N-KVT--TT-KP---------T-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGTWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq315 ----M--NLSFFDQFSSPC-LLGIPLILPSLLLPTLLLPS-PGNRWINNRLSTIQLWFTHLITKQLMTPLNKAGHKWALLLTSLILMLLSINLLGLLPYTFTPTTQLSMNMALALPLWLATLLTGLRNQPS-ISLGHLLPEGTPTPLIPALVMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATIALLPMMPSISALTALILFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFSIMLLTW-FTFSLLIQPKLL-SF-TLTNNP-----T-N-KVT--TT-KP---------T-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGTWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq316 ----M--TLSLFDQFLSPA-LMGVPLAAAALALPWALFPR-PTLRWVNNRLLTLQNWFFGQFAQQIFLPINIAGHKWAVLLTSLMLFLITLNTAGLLPYTFTPTTQLSMNMGFAVPLWLATVILGMRTQPT-HSLGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLVSTATSVLLMTMPVLAVLTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLTPTPWLAYLLFSW-LIFSVIVLPKVS-TH-TFMESP-----A-P-LTKQ-KP-DT---------E-----P-W-NWP-WH------------V-AT--TRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq317 ----M--TLSFFDQFMSPV-FMGIPLAAIAIALPWVLLPT-PTARWTSNRFLGLQGWFINRFTQQLLLPVNLGGHKWAALLTSLMIFLITLNMLGLLPYTFTPTTQLSINLGLATPLWLATVIIGMRNQPT-HALGHLLPEGTPGPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATASFVLLSLMPAVAITVTVVLFLL---TLLEVAVAMIQAYVFVLLLTLYLQEN-V-M-PQLDPSPWFAMLIFSW-LVFLVVIPPKVM-AH-IFSNEP-----A-M-QSAE-KR-FT---------D-----P-W-TWP-WP------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq318 ----M--NLSF-DQFTSPY-LLGVPLILLAMLFPTLLFPT-PSNRWITNRLSTLQLWLFHLITKQLMMPLNKKGHKWALVLTSLMIFLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ASLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTASTALLPIVPAVSVLTTLILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFFIMLASW-LTFSLIIQP-LL-SF-TLTNLP-----S-N-K-PA--T-NT---------A-----P-W-LWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq319 ----M--NLSFFDQFTSPY-LLGIPLILLAMLFPTLLLPT-PNNRWINNRLSTLQLWFFHLITKQLMMPLNKKGHKWALILTSLMILLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ASLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATTALLPIMPAVSALTALILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFFIMLTSW-LTFSLIVQPKLL-SF-TSANPP-----S-D-KSPL-TT-KT---------T-----P-W-HWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq320 MTLAT--NLSLFDQFSIPK-LLGIPMLIPAMLMTSMLLYN-PEDRWLSNPTTTIQSWLIAKTTKQIMAPVNQPGHKWSLMLISLLTFLLINNLLGLLPYTFTPTTQLSMNLALALPLWMATVLIGLRNKPT-ASLAHLLPEGTPTPLIPILILIESISLLIRP--IALAVRLTANLTAGHLLIHLIAATALNLLMTSMLLAALTLTILTLL---TLLEIAVAIIQAYVFTLLLSLYLQEN-V-M-PQLNPKPWLMVFLTTW-FMLIIATHPKIA-SL-KFMNNP---------APFH-PT-PI---------K-----P-W-PWP-QI------------V-NM--NRWLFSTNHKDIGTLYFIFGAWAGMVGTALSLLIRTELSQPGPLMGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFTLLLFSAFVETGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq321 ----M--MINFFDQFMSPT-LLGAPLIMLAVIFPLMLMPN-PSLHWINNRLTIVQNWFMLNFTKQLFMPINIKGQNWALILTSLMMFLMSMNLLGLLPYTFTPTTQLSMNMAMAIPLWFSTVLTGLRNQPT-MSLGHLLPEGTPIMLIPLLIIIETISLFIRP--IALGVRLTANLTAGHLLIQLIATAAFALMLLMPTISMLTTIILFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNPNPWFLIMMMSW-FILMTFFMNKTI-KH-TPSTFS-----F---KQLQ-QK-QL---------N-----K-W-YWP-W-------------V-MI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq322 ----M--TMNLFDQFLSPK-VLGIPLSTIALIFPLLLFKLCHSQRLISNRISTLQTWLLMKFTKHLMSPINKSGHPWTLLLTTLMCFLLLLNTLGLLPYTFTPTAQLSTNMALAVPMWLSTVLTGLRNQPA-NSLAHMLPLGTPTPLIPILIIIETVSLLIRP--VALGVRLTANLTAGHLLITLISTTIMTLMKTSLTLSLFTMTLLLSL---SLLEIAVAVIQAYVFTLLLSLYLQEN-T-M-PQLNTTSWFTTFIITW-ITMSSLLNML------MLSHEM-----MLPPKKLL-SI-KT---------L-----P-W-TWP-WT------------M--F--ARWFFSTNHKDIGTLYFLFGLWAGMVGAALSLLIRAELGQPGALLGNDQLYNVIVTAHAFVMIFFMVMPVMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSLFLLLASASVEAGAGTGWTVYPPLAANLAHAGAS [...]
+Seq323 ----M--TMNLFSQFASPQ-MLGIPLLLLALSMPLMILSL--QQRLITNRMAMIQNWVLLKFTKQLMLPLNKTGHNWSILLTPLMYYLFTINLLGLLPYTFTPTTQLSMNMGFAVPLWIATVLIGLRKQPT-VSLAHMLPLGTPMLLIPILIIIETISLLIRP--LALGVRLTANLTAGHLLMTLISVTALALVSSSLSLSLITMILLLLL---TGLEIAVAMIQAYVFTLLLSLYLQEN-T-M-PQLNLMPWFFTLTLSW-LLFFTLI--KIMTNQ-HTLTPP-----N---KHTH-CNHLT---------------P-W-TWM-WP------------V-TF--TRWFLSTNHKDIGTLYLLFGAWAGMTGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAANLAHAGAS [...]
+Seq324 ----M--TMSIFDQFLIPN-FLGLPLIIPAMLMP-LLLFP-QTARLMQNRLEALTNFIIKLLTKQLTQPLNPGTHKWTNPLISLMLLLTSMNLLGLFPYTFTPTTQLSMNMALALPLWMATVLIGLRTQPT-HALGHLLPEGTPTLLIPALILIETISLFIRP--LALAVRLTANLTAGHLLIQLISTATLLLPATSYSLTMMLGVILLLL---MVLEIAVAMIQAYVFVLLLTLYLQEN-T-M-PQLNPAPWFLLLIFTW-LTLMLYMMKTAY--V-TFYLYP-----T---QQPK-PSC-T---------C-----H-W-HWP-WL------------V-TL--TRWFFSTNHKDIGTLYLVFGAWAGMAGTALSLLVRAELGQPGALLGDDQIYNVVVTAHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASAGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq325 ----M--NLTLFNQFMSPQ-ILGIPLIILALIMPSLIFPT-QNNRWLTNRLSTLQSWAINLFTKQLMLPISKTGHKWSIILTSLMVMLLMINLLGLLPYTFTPTTQLSMNMGLAIPMWMATVLTGLRNQLT-TSLGHLLPEGTPTPLIPILIMIETISLFIRP--MALGVRLTANLTAGHLLIQLTSTAVLALLST-TTLSLLTMIILLLL---TILELAVAMIQAYVFILLLSLYLQEN-I-M-PQLNPDPWLFILSFTW-LTYIIIIQPKIS-SY-LPTNIP-------H-KNNK-TT-NT---------N-----P-W-AWP-WI------------V-FL--TRWFFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq326 ----M--MVSFFDQFASPS-FLGIPLIAVAIALPWVLFPT-PPSRWMNNRLITIQTWFINRFTNQLMMPLNTGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPLMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFAILVFSW-VVFLTVIPTKIL-NH-TAPNEP-----T-P-MSEE-KH-KT---------E-----P-W-NWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq327 ----M--TLSFFDQFMSPV-HLGIPLMALALTLPWILFPT-PSARWLNNRLITLQAWFINRFTQQLLLPLNLAGHKWATMLTSLMLFLITLNMLGLLPYTFTPTTQLSLNLGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPTPLIPILIIIETISLLIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPTVAILTSTVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPTPWFPILVFSW-LVLLTIIPPKVT-SH-TFSNEP-----D-T-LSTQ-KT-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq328 ----M--MMSFFDQFASPS-FLGVPLIAIAIALPWVLFPT-PPSRWLNNRLVTLQTWFINRFTNQLLLPLNVGGHKWALLFASLMVFLITINMIGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLLIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IIFLTIIPTKIL-SH-TSPNEP-----A-P-MNKE-KH-KT---------E-----S-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq329 ----M--MMSFFDQFASPS-FLGIPLIAVAIALPWMLFPT-PPSRWLNNRLITLQTWFINRFTNQLLLPLNTGGHKWALLFASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLMPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFAILVFSW-IIFLTIIPTKIL-SH-TAPNEP-----A-P-MSEE-KH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq330 ----M--ALSLFDQFTSPV-LLGIPLIAIAVAMPWILLRS-ALNRFLTSRFLEIQSWLLHQFARQIFSPLNPEGHKWALLITSLMVFLFTLNVLGLLPYTFTPTTQLSMNMGFAVPFWLATVIVGAQKQPN-IALAHLLPEGTPLALIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIYLISMAAFVLTPMMPAVGLLTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLDPAIWFPILIFSW-ILFTVAIPHKVA-TL-ASPNTP-----KDP-NTEE-ANVPPSQHPSPAPLQ-----P-W-NWP-WH------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq331 ----M--MLNLFDQFASPM-HLNIPLISLALVLPWALLPT-PSHQWQNSRLLTLQGWFISKLAKQLLLPLNAGGHKWATILMSLLTFLITLNILGLLPYTFTPTTQLSLNLSLAIPLWLSTVALGLQNQPT-VSLGHLLPEGTPSLLIPVLITIETISLLIRP--LALGVRLTANLTAGHLLIGLVSMAAFTLLPTAPLLAILSIIPLFLL---TLLEIAVAMIQAFVFVLLLSLYLQEN-T-M-PQLNPAPWLSISLLAW-LILLTLIPPKIL-AH-FTHNKL-----T---PGTE-KT-QT---------K-----P-W-DWS-WY------------V-MV--TRWFFSTNHKDIGTLYLMFGAWAGMVGTALSLLIRAELSQPGALLGDDQIFNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq332 ----M--NENLFASFIAPT-ILGLPAAVLIILLPPLLIPT--SKYLINNRLIATQQWLIQLTSKQMMTMHNAKGRTWSLMLMWLIIFIATTNLLGLLPHSFTPTTQLSMNLAMAIPLWAGAVTTGFRSKTK-NALAHLLPQGTPTPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLMHLIGSATLAMSTTNLPSTLIIFTVLILL---TMLEIAVALIQAYVFTLLVSLYLHEN-T-M-PQLNTTVWPTMIAPML-LTLFLITQLKVL-NT-NYHLPP-----LPK-TMKM-KNFCK---------------P-W-EPK-WTKIYSLHSLPPQSM-FT--DRWLFSTNHKDIGTLYLLFGAWAGVLGTALSLLIRAELGQPGNLLGNDHIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASAMVEAGAGTGWTVYPPLAGNYSHPGAS [...]
+Seq333 ----M--TLSFFDQFMSPT-FMGVPLIIVALSLPWILYPT-PSTRWLSNRMTTLQGWFINRFTQQMFLPLNQSGHKWAILMTSLMMFLITLNMLGLLPYTFTPTTQLSLNMGFAVPLWLATVLIGMRNQPT-MALGHLLPEGTPTPLIPFLIIIETFSLLIRP--IALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTAITLFLL---TLLEVAVAMIQAYVFVLLLTLYLQEN-I-M-PQLNPAPWFTILVFSW-LVFLTVIPPKVL-KF-TFNNEP-----T-P-MSTK-KT-PT---------E-----P-W-NWP-WH------------V-TV--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLMGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq334 ----M--NENLFSSFITPT-MMGLPIVILITMFPGIMFPS--PSRLINNRLISIQQWLVQLTSKQMLSVHNQKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSLNLGMAIPLWAGTVVTGFRYKMK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAIRLTANITAGHLLIHLIGEATLALTSISTITAMVTFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFIMILSMI-ITLFFMFQLKVS-KY-YFPENP-----EPK-PVSM-SNPIT---------------P-W-EKK-WTKIYSPLSLPLQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq335 ----M--MVSFFDQFASPS-YLGIPLIALAILLPSMCYPA-PLSRWINNRLITIQGWFINQFTSQLMLPLNVGGHKWALLLASLMIFLVTMNMVGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPILLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPIMPTVAVLTATVLLLL---TLLEIAVAMIQAYVFVLLLTLYLQEN-V-M-PQLNPGPWFAILVFSW-LVFLILIPTKVL-NH-VTPNEL-----T-P-VGAE-KH-KT---------E-----S-W-NWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq336 ----M--MTSFFDQFMSPV-YLGIPLMALAFLLPWLLFPS-PAPRWLNNRLLTLQSWFINRFTSQLLTPMNVGGHKWALVLTSLMIFLISLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVLIGLRNQPT-AALGHLLPEGTPGPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLMQLIATAAFVLLPLMPTVAGLTAIVLFLL---TILEVAVAMIQAYAFVLLMSLYLQEN-V-M-PQLNPSPWFAILVFSW-LVFLTIVVPKTL-NH-TFPNEP-----S-L-QSTQ-AP-KT---------D-----S-W-SWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq337 ----M--ALNFFDQFMSPT-LMGIPLMGLALLLPWILYPT-CTPRWLNNRLLTLQSWFIGLFTQQIFMPLSPAGHKWATLFASLMLFLISMNLLGLLPYTFTPTTQLSLNMAFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPLMPTVAILTALVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFMILVFSW-LVFIFIAPTKVM-SH-TFNNEP-----N-P-RTTE-TT-TT---------N-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq338 ----M--AMSFFDQFASPS-YLGIPLIAIAIALPWVLYPT-PSSRWINNRLITLQGWVINRFTSQLMLPINVGGHKWALILASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVLIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTIIPTKVL-NH-ISPNEP-----T-P-VSAE-KH-KA---------E-----P-W-DWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq339 ----M--NLSFFDQFLTPT-LMGIPLIIMALIFPLLLIFM-PSKHWQGGRIFSTQLWFSNNFTKQLLMPLTPSGHKWALLLTSLMLLLVSMNLLGLLPYTFTPTTQLSMNLGFAIPLWLATVIIGLRNQPI-MALGHLLPEGTPTLLIPILIMIETISLFIRP--LALGVRLTANLTAGHLLIQLTSTAILTLLPLMPTIAALTTMILLLL---TLLEIAVAVIQAYVFVLLLSLYLQEN-V-M-PQLNPDPWFFILFMSW-FVYLIILMPKTN-NL-KTSNEP-----T-M-QQ-N-QN-KP---------E-----P-L-IWP-WT------------V-MI--TRWLFSTNHKDIGTLYLMFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAGNMAHAGAS [...]
+Seq340 ----M--NLSFFDQFTSPC-LLGIPLILLSMLFPALLLPM-PDNRWITNRLSTLQLWLLHLITKQLMMPLNKGGHKWALILASLMMFLLTINLLGLLPYTFTPTTQLSMNMALAFPLWFATLLTGLRNQPS-TSLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATTALLPILPTISALTMLILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFFIMLTSW-LTFSFIIQPKLL-SF-THTNTP-----S-N-KTST-TT-KT---------T-----P-W-TWP-WT------------MTFI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq341 ----M--TLSFFDQFMSPS-FMGVPLMALALVLPWILFPK-PSPQWVTNRVLTLQGWFINRFTQQLLLPLNLPGHKWAALLTSLMLFLLTLNMLGLLPYTFTPTTQLSLNMGLAVPFWLATVLMGLRNQPT-AALGHLLPEGTPPLLIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLASSMPIVSLLTASVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWLAIFLFSW-LVFLTVIPPKVL-AH-TFSNEP-----T-S-QSTE-AP-RT---------T-----P-W-AWP-WH------------V-AI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq342 ----M--NENLFASFTTPT-MMGLPIVILIVLFPSILFPS--PDRLINNRLTSIQQWLIQLTSKQMLSIHNHKGQTWALMLISLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRHKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMDISTTTAFITFIVLILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLIMISSMI-LTLFITFHLKVS-KH-YFPTNP-----EPK-HTLL-LKNSA---------------P-W-EEK-WTKIYSPLSLPLQ-M-FM--DRWLFSTNHKDIGTLYLLFGAWAGMAGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq343 ----V--ALNFFDQFMSPS-LMGIPLIGLAMTLPWILFTS-PTPRWISNRFLTLQGWFINRFTQQLFQPLNAGGHKWALLFTSLMMFLFSLNMLGLLPYTFTPTTQLSLNMGLAVPFWLATVIIGMRNQPT-VALGHLLPEGTPTPLIPILIIIETISLFIRP--IALGVRLTANLTAGHLLIQLIATAAFVLLPLMPSVAILTALLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLVILPSKVL-NH-IFPNDP-----T-T-KSTE-KT-KP---------E-----P-W-NWP-WH------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq344 ----M--TLSFFDQFMSPT-YLGIPLMALALTLPWLLYPM-PTTRWLNNRFLALQGWFINRFTQQLLLPLNIGGHKWAALLTSLMIFLITLNMLGLLPYTFTPTTQLSLNLGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPGPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATGAFVLLPLMPTVAIITTTVLVLL---TLLEVAVAMIQAYVFVLLLTLYLQEN-V-M-PQLNPAPWFAILVFSW-MVFLAVIPAKVT-AH-TFPNTP-----T-L-QSAK-KA-ET---------D-----P-W-TWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq345 ----M--TLDFFNQFMTSQ-MLGIPLVLLAMIAPSMFIFT-KSTRLTYNRTMSLQYWLMLSFTKQLMMSTNYKGQKWSSILLSLMLYLLLLNLLGLLPYTFTPTTQLSMNMGFAIPLWLATIMLGIRSQPT-MTLGHLLPEGTPTFLIPILIIIETISLIIRP--LALGVRLTANLTAGHLLIQLTSTATLMVVNTMPTTALLSFMVLILL---MGLELAVAMIQAYVFTLLLSLYLQEN-V-M-PQLNPSPWFYILMSAW-ISLFTLVFTKIL--C-ISHNNP-------MTLNTY-KY-KS---------D-----P-W-IWP-WH------------V-TI--TRWLFSTNHKDIGTLYLIFGAWSGMVGTALSLLIRAELNQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIESGAGTGWTVYPPLAGNLTHAGAS [...]
+Seq346 ----M--MMSFFDQFASPS-FLGIPLIAVAIALPWILFPT-PPSRWLNNRLITLQTWFINRFTNQLLLPLNVGGHKWALLFASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTGAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IIFLTIIPTKIL-NH-TAPNEP-----A-P-MSEE-KH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq347 ----M--MMSFFDQFASPP-FLGIPLIAVAIALPWILFPT-PPSRWLNNRLITLQTWFINRFTNQLLLPLNVGGHKWALLFASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTGAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IIFLTIIPTKIL-NH-TTPNEP-----A-P-MSEE-KH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq348 ----M--MMSFFDQFASPS-FLGIPLIAIAIALPWTLFPT-PPSRWLNNRLITLQTWFINRFTNQLLLPLNVGGHKWALLFASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTGAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFAILVFSW-IISLTVIPTKIL-SH-TTPNEP-----A-P-MSEE-KH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq349 ----M--MMSFFDQFASPS-FLGVPLIAIAIALPWVLFPT-PPSRWLNNRLITLQTWFINRFTNQLLLPLNVGGHKWALLFASLMVFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTGAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IIFLTIIPTKIL-SH-TSPNEP-----A-P-MSEE-KH-KT---------E-----P-W-DWP-W-------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq350 ----M--NLSFFNQFESPT-LMGAPLIILALLYPTLLFF--MSNQWLGSRTQSLQLWFSNNFTKQLMSPLNKAGHNWSLILTSLILLLMSINLLGLLPYTFTPTTQLSMNLGLAVPLWLSTVLMGLRRQTT-VALGHLLPEGTPTLLIPILIMIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAVFVLLPLMPMIATLSLIILLLL---TILEIAVAMIQAYVFVLLISLYLQEN-L-M-PQLNLAPWFYILIMSW-LVYLMVL-PKTG-NM-KTPNNP-----T---DKYN-QE-TP---------N-----H-W-NWP-WT------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNMAHAGAS [...]
+Seq351 ----M--NENLFASFIIPT-LMGLPMTILIIMFPSLLFIK--HTRLITNRIMALQQWMIKNITKQMMSIHSIKGQTWTLLLISLIMFIASTNILGLLPHTFTPTAQLSMNLGMAIPLWAGTVILGFRLKLK-SSLAHFLPQGTPLPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGSATLNLITIYTSTAMITFIILLLL---TILEIAVALIQAYVFTLLVSLYLHDN-S-M-PQLDTSSWFMMILTMI-FTLFIIMQLKIS-SH-KMFIKP-----ESE-DYIF-SSSSK---------------P-W-EHK-WTKIYLPLLLSLH-M-FI--SRWLFSTNHKDIGTLYLLFGAWAGMVGTSLSLLIRAELGQPGALMGDDQIYNVVVTAHAFVMIFFMVMPIMLGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGVGTGWTVYPPLAGNMAHAGCS [...]
+Seq352 ----M--NENLFASFTTPT-MMGLPVVILIIMFPSIMFPA--PNRLINNRLISLQQWLIQLTSKQMLAIHNHKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVIMGFRHKTK-SSLAHFLPQGTPLPLIPMLVVIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLVLMNISTSIAFITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITIVSMI-TTLFIVFQLKLS-KH-LYPSNP-----ELK-STIS-LKQPT---------------P-W-EKK-WTKIYSPLSLPQQ-M-FM--DRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGSLFGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq353 ----M--NMSFFDQFLSPS-LLGIPLIAMAITIPWLIFPT-PTNRWLNNRLMTLQAWFINRFTYQLMQPINLGGHKWATLLTALMLFLITMNLLGLLPYTFTPTTQLSLNMAFAIPLWLMTVLIGMFNQPT-IALGHLLPEGTPTPLVPILIIIETISLFIRP--LALGVRLTANLTAGHLLMQLIATAAFVLISIMPTVALLTSLILFLL---TILEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPHPWFSILLFSW-IIFLMILPNKVM-KH-SFNNNP-----L-P-KNTE-KL-KP---------Q-----P-W-NWP-WT------------V-AI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASAGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq354 ----M--TLSFFDQFSLSS-YMGIPLIVLALTLPWVLYPT-PQNRYSNNRLLTLQAWFIRQFTHQLFLPINPGGHKWALLLASFLIFLITLNLLGILPYTFTPTTQLSLNMGLAVPLWLAAVLIGIRKQLT-HTLAHMLPVGTPGPLIPVLIIIETISLFIRP--IALGVRLTANLTAGHLLIQLISTAAFNLFFMMPAVSALTMVLLLLL---SVLELAVAVIQAYVFVLLVSLYLQES-V-M-PQLNPAPWFLILLFSW-LVFLTIIPTKIM-GH-SFTNEP-----T-T-RTAK-ET-HL---------T-----S-W-TWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq355 ----M--MLSFFDQFMSPS-YLGIPLIALAISLPWILFPT-PQARWLNNRVLTLQGWFISRFTSQLLLPLNPGGHKWAVLFTSLMVFLFSINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTALIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPVVAILTTVVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-MIFLTVIPPKVL-AH-TYPNEP-----T-S-QSTQ-KP-KT---------E-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTGLSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq356 ----M--MLSFFDQFMSPS-YLGIPLIALAISLPWILFPT-PQARWLNNRVLTLQGWFISRFTSQLLLPLNPGGHKWAVLFTSLMVFLFSINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTALIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPVVAILTTVVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-MIFLTVIPPKVL-AH-TYPNEP-----T-S-QSTQ-KP-KT---------E-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTGLSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq357 ----M--NENLFASFITPT-ILGLPLVTLIIMFPSMLFPA--PTLLITNRLVSIQQWLIQLVSKQMMNIHNHKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVIMGFRNKTK-ISLAHFLPQGTPTPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLMHLIGGATLALMNISMTTALITFIILVLL---TALEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFTTILSMF-LTLFIIFQLKIS-KH-TYHPNP-----ETT-LPMT-QKQPT---------------P-W-ETK-WTKIYSPLSLPLQSM-FM--NRWLFSTNHKDIGTLYLLFGAWAGMAGTGLSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq358 ----M--AVSFFDQFASPS-YLGIPLIAIAIALPWVLYPS-PSSRWLNNRLITIQGWMINRFTNQLMLPLNIGGHKWALLLTSLMIFLITTNMLGLLPYTFTPTTQLSLNMGFAVPLWLSTVIIGMRNQPT-IALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAVLTATVLFLL---TLLEVAVAMIQAYVFILLLSLYLQEN-V-M-PQLNPAPWFAILLFSW-AIFLTIIPTKVM-GH-ILPNEP-----T-P-VNTQ-MH-KT---------E-----P-W-NWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELNQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq359 ----M--NENLFASFIAPT-ILGLPAAVLIILFPPLLIPT--SKYLINNRLITTQQWLIKLTSKQMMAMHNTKGRTWSLMLVSLIIFIATTNLLGLLPHSFTPTTQLSMNLAMAIPLWAGAVIMGFRSKIK-NALAHFLPQGTPTPLIPMLVIIETISLLIQP--MALAVRLTANITAGHLLMHLIGSATLAMSTINLPSTLIIFTILILL---TILEIAVALIQAYVFTLLVSLYLHDN-T-M-PQLNTTVWPTMITPML-LTLFLITQLKML-NT-NYHLPP-----SPK-PMKM-KNYNK---------------P-W-EPK-WTKICSLHSLPPQSM-FA--DRWLFSTNHKDIGTLYLLFGAWAGVLGTALSLLIRAELGQPGNLLGNDHIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASAMVEAGAGTGWTVYPPLAGNYSHPGAS [...]
+Seq360 ----M--NENLFASFIAPT-ILGLPAAVLIILFPPLLIPT--SKYLINNRLITTQQWLIKLTSKQMMTMHNTKGRTWSLMLVSLIIFIATTNLLGLLPHSFTPTTQLSMNLAMAIPLWAGTVIMGFRSKIK-NALAHFLPQGTPTPLIPMLVIIETISLLIQP--MALAVRLTANITAGHLLMHLIGSATLAMSTINLPSTLIIFTILILL---TILEIAVALIQAYVFTLLVSLYLHDN-T-M-PQLNTTVWPTMITPML-LTLFLITQLKML-NT-NYHLPP-----SPK-PMKM-KNYNK---------------P-W-EPK-WTKICSLHSLPPQSM-FA--DRWLFSTNHKDIGTLYLLFGAWAGVLGTALSLLIRAELGQPGNLLGNDHIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASAMVEAGAGTGWTVYPPLAGNYSHPGAS [...]
+Seq361 ----M--TLSLFDQFMSPT-LLGIPLIAVALTLPWILFPT-PSLRWLNNRLLSLQGWFINRFAQQLMLPLNPGGHKWALLLTALMIFLISINLLGLLPYTFTPTTQLSLNMGLAAPLWLTTVIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIAMGISALVSVMPVTALIMMVLLLLM---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFLILVFSW-FIFLALLPSKVL-AH-TFPNEP-----T-T-QSTK-KP-KT---------E-----P-W-NWT-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq362 ----M--ILSFFDQFMSPT-HLGIPLIALALSLPWVLIPT-PTNRWLNNRLLTLQGWFINRFTQQLMLPINLGGHKWAVLLTALMLLLITLNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTSTVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFMILIFSW-LIFLIVLPPKVL-GH-TFTNEP-----T-H-KNAE-KI-KP---------E-----P-W-TWP-WS------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq363 ----M--NLSFFDQFMSPT-LMGVSLILMALIFPLLLFPN-PTNKWLGNRLSSLQLWFSHSFIKQLMIPLNINGHKWSLLLISLMILIMSINLLGLLPYTFTPTTQLSLNLGLAMPLWLATVLVGLRNQPT-TALGHLLPEGTPTLLIPILIIIETISLFIQP--LALGVRLTANLTAGHLLIQLMSTAVFVLLPLMPTTAMLAMMILFLL---TLLEIAVAMIQAFVFVLLLSLYLQEN-V-M-PQLNPDPWFFIFTTSW-LVYLVLLMSKTS-NF-KQSNEP-----T-M-QNIS-KS-KP---------Q-----P-W-NWP-WT------------M-MI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRSELNQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGIEAGAGTGWTVYPPLAGNMAHAGAS [...]
+Seq364 ----M--NENLFASFTTPT-MMGLPIVILIILFPSILFPS--PNRLVNNRLISIQQWLIQLTSKQLLSIHNYKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRHKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLVLMDISTATASITFTILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFIVILSMI-LTLFIMFQLKLS-KH-HFLTNP-----EPK-QTLP-PKSNT---------------P-W-EEK-WTKIYSPLSLPLQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq365 ----L--SLNLFSQFASPN-LLGLPLIFIALLAPWLMFPT-PCNRWLTNRLVTMQTWFINTFTKQIFSPLNTPGHKWALILASLMIFLLGMNLLGLLPYTFTPTTQLSLNLGLAIPLWLATVAIGFRNQLT-ASLGHFLPEGTPTPLIPILIIIETISLFIRP--MALGVRLTANLTAGHLLIQLISSATLALLFSSPMVSALTFITLILL---TMLEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLDPMPWFSILFASW-LIFLVFSPTKVA-KY-SSLNDP-----S---PKTY-KG-LN---------K-----S-W-PWP-WA--------------MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLDDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASAGVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq366 ----M--NENLFTSFATPT-ILGLPAAVPIILFPSLLIPT--SKYLINNRLITTQQWLIQLTLKQMMTMHNTKGRTWSLMLISLITFIATTNLLGLLPHSFTPTTQLSMNLAMAIPLWAGTVATGFRLKAK-NTLAHLLPQGTPTPLIPMLIIIETISLFIQP--VALAVRLTANITAGHLLMHLIGAATMALSTISLPATPIIFTVLTLL---TTLEIAVALIQAYVFTLLVSLYLHDN-T-M-PQLNTTVWPTIIMSML-LALFLLMQLKTL-NT-HYHPPA-----SPK-LTNI-KPHNN---------------P-W-EHK-WTKIYSLHSLPPQFM-FA--DRWLFSTNHKDIGTLYLLFGAWAGVLGTALSLLIRAELGQPGNLLGNDHIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASAMVEAGAGTGWTVYPPLAGNYSHPGAS [...]
+Seq367 ----M--NLSFFDQFLSPV-MLGVPLIMVAMVLPWLLFPS-PTNKWLNNRLSTLQIWFTQKFTKQLMSPINTGGYKWAMIFLSLMVFLMTINLLGLLPYTFTPTTQLSLNLGLAVPFWLATILIGLRNQPT-VAFGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAVHLLIQLIATATLVLLPLMPMVSILPMMTLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWLAIFLLSW-VVFLLILTFKIS-NF-NNLNEP-----T-S-QNKN-MK-KP---------E-----S-W-NWP-WI------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq368 ----M--NLSFFDQFLSPV-MMGIPLIMLAMILPWLLFPS-PTNKWLNNRLSTLQIWFTQKFTKQLMSPINSSGYKWAMILMSLMMFLIMMNLLGLLPYTFTPTAQLSLNLGLAVPFWLATILIGLRNQPT-AAFGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGQLLIQLIATATLILLPMMPIVSILTMIVLFLL---TLLEMGVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAIFLMSW-IIFLLILTFKIN-NF-NNLNEP-----T-S-QNIN-KN-KP---------E-----S-W-NWP-WI------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMYNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq369 ----M--NLSFFDQFLSPM-MLGIPLIMMAMILPWLLFPS-PTNKWLNNRLSTLQIWFTQKFTKQLMSPINTGGHKWATIFLSLMVFLMMINLLGLLPYTFTPTTQLSLNLGLAVPFWLATILIGLRNQPT-AAFGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATATLVLLPLMPVVSILTMMTLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAIFLMPW-IVFLLILTFKMS-NF-NNLNEP-----T-S-QNKD-MK-KP---------E-----S-W-NWP-WI------------V-MI--TRWLFSTNHKDIGTLYLMFGAWAGMPGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq370 ----M--NLSFFDQFLSPV-MMGIPLIMLAMILPWLLFPS-PTNKWLNNRLSTLQIWFTQKFTKQLMSPINSSGYKWAMILMSLMMFLIMMNLLGLLPYTFTPTTQLFLNLGLAVPFWLATILIGLRNQPT-AAFGTPLPEGTPTLLSPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATATSILLPMMPIVSILTMIVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAIFLMSW-IIFLLILTFKIN-NF-NNLNEP-----T-S-QNIN-KN-KP---------E-----S-W-NWP-WI------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq371 ----M--NLSFFDQFLSPM-MMGIPLIMLAMVLPWLLFPN-PTNKWLNNRLSTLQIWFMQKFTKQLMSPINAGGYKWAMIFLSLMMFLMTMNLLGLLPYTFTPTTQLSLNLGLAVPFWLATILIGLRNQPT-AAFGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATATLVLLPLMPVVSILMMMTLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAIFLMSW-IVFLLILTFKIS-NF-NNLNEP-----T-M-QNKN-VK-KP---------E-----S-W-IWP-WI------------V-MI--TRWLFSTNHKDIGTLYLMFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPGMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq372 ----M--AMSFFDQFASPS-YLGVPLIAIAITLPWVLYPT-PPSRWINNRLITIQGWLINRFTNQLMLPLNVGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-VIFLTIIPTKVL-NH-ISPNEP-----S-P-VSAD-KH-KT---------E-----S-W-NWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq373 ----M--NENLFASFTIPM-MLGIPIVTLIIVFPTILFPT--PNRLINNRTISLQQWLTKLTSKQLMNMHNPKGQTWSLMLISLLLFIASTNLLGMLPHSFTPTTQLSMNIGMAIPLWAGTVIMGFRNKTK-MSLAHLLPQGTPTFLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLMHLIGKTTLALMNISLSVAFITFMILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLPVILSML-LALFTLFQLKIS-KH-LYHSNP-----KMI--TKP-QKQQT---------------P-W-NIT-WTKIYLPLLQSQ--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGMLIGDDQVYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGSPDMAFPRMNNMSFWLLPPSFLLLMASSMIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq374 ----M--TLSFFDQFMSPT-LLGIPLMALALSLPWILYPK-PTARWLNSRLLTLQGWFINRFTQQIFQPISLGGHKWAAILTSLMIFLITLNMLGLLPYTFTPTTQLSLNMAFAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPAVAVLTSALLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLIVIPPKVL-AH-IFPNEP-----T-P-QSTE-KS-KA---------E-----S-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLTSSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq375 ----M--TLSFFDQFMTPI-FLGIPLAAIAIALPWVLFPT-PTTRWVSNRFLALQGWFINRFTQQLLLPVNLGGHKWAALLTSLMIFLITLNMLGLLPYTFTPTTQLSINLGLATPLWLATVIIGMRNQPT-HALGHLLPEGTPGPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATASFVLLPLMPAVAFTITLVLFLL---TLLEVAVAMIQAYVFVLLLTLYLQEN-V-M-PQLDPSPWFAMLVFSW-LVFLAIIPPKVM-AH-TFSNEP-----T-L-QSTD-KR-LA---------N-----P-W-IWP-WP------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq376 ----M--TLALFDQFMIST-FMCIPLILLPMTLPWILITS-QHKKWTVNRLTAIQSWFLFYSTKQLMATMNMKGQKWALLLISLMTFLILTNLLGLLPYTFTPTTQLSMNMALAIPMWLATVLLGMRHQMT-TSLGHLLPEGTPTLLIPPLVLIETISLFIRP--LALGVRLTANLTAGHLLIQLISTASMLLMPTMPTISLATTTILLLL---TVLELAVAMIQAYVFVLLLTLYLQEN-I-M-PQLNPSPWFLIFLLSW-VVLTTSIAVKTM-KH-QPVNDI-----S---TENQ-TK-AQ---------S-----P-W-NWP-WH------------V-MM--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGNDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq377 ----M--TLTLFDQFMSPT-LLYIPLILLSMTMPWILITT-QSEKWTTNRLTTLQSWFLFNLTKQLMSTMNMKGQKWALLLTSLMTLIIVTNLLGLLPHTFTPTTQLSMNMALAVPMWLATVILGMRHQMT-TSLGHLLPEGTPTLLIPPLILIETISLFIRP--LALGVRLTANLTAGHLLIQLISLASLLLMPLMPVISLLTTSILLLL---TILELAVAMIQAYVFVLLLTLYLQEN-I-M-PQLNPSPWFLIFLLSW-AILTMIIMVKTM-KH-QPINNI-----L---TKTK-TK-FP---------S-----P-W-TWP-WH------------V-AL--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGNDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq378 ----M--ALNLFDQFMSPT-HLGIPLIAIALTLPWILIPS-PTSRYQNNRLISLQSWFIKTFTQQLLTPLNQAGHKWALILASLMIFILTLNVLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGLRNQPT-AALGHLLPEGTPALLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATITLMPMMTTVATLTAILLVLL---TLLEVAVAIIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTVIPNKVL-NH-TFTNEV-----T-A-LSAE-KL-KS---------D-----T-W-NWP-WH------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELAQPGALLGDDQIYNVIDTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq379 ----M--TLSFFDQFIIPQ-ALGIPLIIIAIIIPPLLILT-MTNRLIPNRLSTLQLWATKTFTKQLMFPINTPGHKWAAILTSLMLLLISLNLLGLLPYTFTPTTQLSMNMALAVPTWLATILLGLRNQPT-VSLGHLLPEGTPTPLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATFVLTSSMPMTALLAFIVLLLL---TGLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFLILLLIW-TTLATTFLNKTI-HS-KFPSPP-----T-P-QKPN-QK-PT---------E-----P-W-TWP-WH------------V-SI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq380 ----M--MLSFFDQFMSPT-YMGIPLMALALTLPWILYPT-PSSRWLNNRLVSLQSWFIGQFTHQLMLPLNIGGHKWATMLTSLMIFLITINMLGLLPYTFTPTTQLSLNMGFALTLWMATVIIGMRNQPT-MVLGHLLPEGTPAPLIPVLIIIETISLFIRP--IALGVRLTANLTAGHLLIQLIATGAYVLLPMMPTIATLTAILLLLL---TLLETAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFSILVFSW-LVFLLIIPSKVI-KH-TFPNEP-----A-S-HSTK-PP-AP---------S-----P-W-NLP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELNQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq381 ----M--TLSFFDQFMSPN-YLGVPLIALAIALPWILYPT-PTSQWLNNRILTLQSWFINRFTQQILLPLNPGGHKWAVLLTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPLMPTVAILTATVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFLILIFSW-LIFLTIIPPKIL-SH-KFNNEP-----T-M-TNTE-KL-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMAGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPMLIGGFGNWLVPLMLGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGVGTGWTVYPPLAGNLAHAGAS [...]
+Seq382 ----M--TLSFFDQFMSPN-YLGIPLIALAIILPWTLYPT-PTSQWVNNRVLTLQSWFINRFTQQIFVPLNPNGHKWATLLASLMLFLITLNMLGLLPYTFTPTTQLSLNMGFAVPLWLATVITGMRNQPT-ATLGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFLILIFSW-LVFLTVIPPKVL-AH-KFNNEP-----T-T-TNTE-KS-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMAGTALSLLIRAELSQPGALLGDDQIYNVIVPAHAFVMIFFMVMPMLIGGFGNWLVPLMLGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGVGTGWTVYPPLAGNLAHAGAS [...]
+Seq383 ----M--TLSLFDQFMSPT-LLGIPLILLALTLPWTLLPA-ATSRLLSSRMVTTQSWLIGQITRQLLLPLSPAGHKWAIIFASLMVYLITLNLLGLLPYTFTPTTQLSLNLGLAFPLWLATVLIGLRNQPT-HALGHLLPEGTPTPLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLMQLIATASFVLLPLMPVVALTTTALLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-T-V-PQLTPNPWLYILLASW-LVFLTVLPTKTL-TY-VFPNNP-----A-L-KGLE-KY-KM---------T-----P-W-SWP-WH------------V-AI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMLGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGVGTGWTVYPPLAGNLAHAGAS [...]
+Seq384 ----M--NLMLFDQFMSPQ-ILGIPLFALALLTPSIMFPT-QNSRWLTNRFSTLQLWTINLFTKHLMLPINKTGHKWSIILTSLMTLLLMINLLGLLPYTFTPTTQLSMNMGLALPMWMATIFTGFRNQLT-TSLGHLLPEGTPTPLTPILIMIETISLFIRP--LALGVRLTANLTAGHLLIQLLSTSVLTLLKTTMTLSILTTMILLLL---TILELAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPDPWFLVLSSTW-LTYTIILQPKIS-SY-LPMNTP-----N-K-KNNK-IT-NT---------K-----P-W-TWP-WT------------V-FL--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq385 ----M--NLMLFDQFMSPQ-ILGVPLFALALLTPSIMLPT-QNSRWLTNRFSTLQLWAINLFTKHLMLPVNKTGHKWSIILTSLMTLLLMINLLGLLPYTFTPTTQLSLNMGLALPMWMATVLTSFRNQLT-TSLGHLLPEGTPSPLTPILILIETISLFIRP--LALGVRLTANLTAGHLLIQLLSTSVLTLLKTTMTLSVLTTIILLLL---TILELAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPDPWFLVLSSTW-LTYTIILQPKIS-SY-LPTNTP---TKN-N-KNNK-IT-NT---------K-----P-W-TWP-WT------------V-FL--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq386 ----M--NENLFAPFTAPM-MLGIPMTPLIIMLPIMLFPM--PDRLINNRLISIQQWTTKLLLKQLMKMHNPKGQTWALMLTTLILFIASTNLLGMLPYSFTPTAQLSMNLGMAIPLWAGAVSMGFRNKTK-MSLAHFLPQGTPTLLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLLHLIGSATLALTKISLLMTPITFTILTLL---TILEFAVALIQAYVFTLLVSLYMHDN-T-M-PQLNTSTWLLTISPML-LTLFTLLQLKLS-KH-FYLPSP-----KPT-LTEL-QKQKT---------------P-W-NNT-WTKIYLPPSQPL--M-FM--DRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSMLIRAELGQPGTLIGDDQIYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLMTSSVIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq387 ----M--MVSFFDQFASPS-FLGIPLIAIAIALPWLLFPT-PPSRWINNRLITLQTWFINRFTNQLMMPLNVGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIQP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IVFLTIIPTKIL-NH-TTPNEP-----T-P-MSEE-KH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq388 ----M--NENLFAPFITPT-IMGITTLPIVMFFPCLILST--PKRWLPNRIQTLQMWLIRLITKQMMVMHNERGRSWTLMLMSLILFIASTNLLGLLPYSFTPTTQLSMNIGMALPLWMGTVLMGFRNKPK-ASLAHFLPQGTPTPLVPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALASISITISTITFIILLLL---TVLELAVAMIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWLLVIFLMI-MALFCMYQLKML-NQ-KLISIS-----PQNNDVII-TKPQL---------------P-W-EKK-WTKIYLPHSSPLQLM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq389 ----M--NENLFASFITPT-LMGLPVIILIVAMPNIFIPS--SNRLLTNRVLTLQRWLIQLILKQMMAMHNNKGRSWSLMLISLIIFIGSTNLLGLSPHTFTPTTQLSMNLGMAIPLWAGAVILGFRHKTK-SSLAHFLPQGTPVPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALLSISVPTALVTLIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-A-M-PQLDTSTWFITIVSMF-LSLFVLLQTKIS-SF-IFPPIP-----SPK-FLVS-QKLEN---------------P-W-NSK-WTKIYLPLSLPQHSM-FV--TRWLFSTNHKDIGTLYMIFAAWAGMIGTALSILIRAELGQPGALMGDDQIYNVVVTAHAFVMIFFMVMPMMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq390 ----M--MLSFFDQFASST-YMGIPLVALAIALPWILYPN-PTTRWLNNRVLTLQGWFINRFTQQLLLPLNTGGHKWAALFASLMVFLITLNMLGLLPYTFTPTTQLSLNMGIAVPLWLATVIIGMRNQPT-AALGHLLPEGTPIPLIPVLIIIETVSLFIRP--IALGVRLTANLTAGHLLIQLIATAVFVLLPLMPTVAILTATILFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-AH-KFNNEP-----T-V-MGAQ-KT-SP---------D-----P-W-TWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq391 ----M--ILNLFSQFSSPS-ILGIPLILIAMLAPWLLFPT-PSDRWLPNRLISIQSWFVKSFTKQIFMPLNTPGHKWAFLLTSLMIFLLGMNLLGLLPYTFTPTTQLPMNLGLAIPLWLATVAIGFRNQLT-ASLGHLLPEGTPTPLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISMATVAMTSTSLIVASLTFTTLLLL---TIIEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLIPDPWFFIFMSSW-FILISLAPKKIL-KH-NILNDP-----T-Q-TTTN-T--ST---------K-----N-W-TWP-WS--------------MI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSAVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq392 ----M--TLSFFDQFMSPV-FLGIPLMALALTLPWVLFPT-PTTRWLNNRLLTLQNWFIGRFAHELFMPVNLPGHKWAVLLTSLMLFLISLNMLGLLPYTFTPTTQLSLNMGLAFPLWLATVIIGMRNQPT-EALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAATVLLPLMPTVAILTATILFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLAILVFSW-LVFLIVIPPKVM-AH-SFPNEP-----T-P-QSTE-KP-KG---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq393 ----M--TLSFFDQFMSPT-FMGIPLIIVALSLPWILYPT-PSNRWISNRMTTLQGWFINRFTQQMFLPLSQNGHKWAILMTSLMLFLISLNMLGLLPYTFTPTTQLSLNMGFAVPLWLATVLIGMRNQPT-MTLGHLLPEGTPTPLIPFLIIIETFSLLIRP--IALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTAITLFLL---TLLEVAVAMIQAYVFVLLLTLYLQEN-I-M-PQLNPAPWFTILLFSW-LVFLTVIPPKVM-KF-TFNNEP-----A-P-TSTK-KS-PT---------E-----P-W-NWP-WH------------V-TV--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLMGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq394 ----M--NQNLFASFTTPV-VLGIPIITLIIMFPIILFPT--STRLINNRMISIQQWLTKLTSKQLMGMHNSKGQTWSLMITSLILFIASTNLLGMLPHSFTPTTQLSMNLGMAIPLWAGTVIMGFRNKTK-ASLAHFLPQGTPTFLIPMLVIIETISLLIQP--MALAVRLTANITAGHLLMHLIGMATLALTNMSLLTALITFVILTLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFLTILSMY-TTLFILLQLKIS-NH-LYSPNP-----KLT-PVKV-QKQQA---------------P-W-NTT-WTKIYLPLSQPQ--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLIGDDQVYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq395 ----M--TMNLFNQFLSPT-FLGLPLIAIALMAPCLLYPS-PAPGWQSNRWTTLQNWFIGSFIKQTLSPINTKGHSWALLLATLMVFLITLNTLGLLPYTFTPTTQLSLNMAFAVPLWLATVIMGFRNSPT-HALGHLLPEGTPTPLVPILIIIESISLLIRP--LALGVRLTANLTAGHLLIQLVSSAAFSLLLSQTTAASLAVGLLLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFLILVFSW-LIFLALMPPKIL-TH-QFPHEP-----S-T-LTAH-KP-KA---------N-----S-W-TWA-WQ------------V-AI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq396 ----M--MASFFDQFASPS-HLGIPLIAIAIALPWVLYPA-PSSRWINNRLITIQGWFINRFTNQLLLPLNMAGHKWALLLASLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAILTFSW-LIFLIIIPIKVL-NH-TSPNEP-----T-P-VSAE-KH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPVLIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq397 ----M--MTSFFNQFASPS-HLGIPLIAIAIALPWVLYPT-PSSRWISNRLITIQGWFINRFTNQLLLPLNTGGHKWALLLASLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAILVFSW-LIFLTIIPTKIL-NH-ISPNEP-----S-P-VSAE-KH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPVLIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq398 ----L--ALNFFDQFMSPV-YLGIPLITLALTLPWILFPK-SSTRWLKNRFMTLQDWFLARFTQQMFQPVNPTGHKWALLLATLMTFLLALNMLGLLPYTFTPTTQLSLNMAMAVPLWLSTVIIGMRNQPT-LALAHLLPEGTPVMLIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATASFVLAPTMPAVAISTTMLLLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLDPTPWFAIFIFSW-AVFLTVLPPKIA-SH-TFPNDP-----A-P-QGTT-KP-TT---------Q-----P-W-NWP-WP------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHALCNNFFMVMPIMIGGFGNWLIPLMIGGPDMAFPRMNNMSFWLLPPPHPPPMASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq399 ----M--ILSFFDQFSIPN-LLGIPLMIPALSFP-LIVWF-TTNRFIQNRYSTIQSFLTFYITKQMMQPISTTGHKWASTFMTLMLTLMLLNTLGLLPYTFTPTTQLSMNMALAIPTWLMTILIGLRNQPT-ASLGHLLPEGTPTLLIPMLILIETVSLLIRP--IALGVRLTANLTAGHLLIQLTSTAVFTLLNSMTLTASMTLIVLALL---TCLEMAVALIQAYVFVLLLTLYLQEN-I-M-PQLNPTPWFMTLILIW-M-FLIMLLTKIL-NN-KPPLN------T-S-QYWK-QSDKP---------------H-W-TWP---------------V-SL--IRWLFSTNHKDIGTLYLLFGAWAGMTGTALSLLIRTELSQPGTLLGDDQVYNVIVTAHAFVMIFFLVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLSSSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq400 ----M--NENLFAPFMIPI-MLGIPITTLIIMFPTMLFPT--PNRLINNRVIAIQQWLTKLTSKQLMITHSPKGQTWSLMLTSLLLFIASTNLLGMLPHSFTPTTQLSMNLGMAIPLWAGTVFIGFRNKTK-MSLAHLLPLGTPTFLIPMLVIIETISLFIQP--LALAVRLTANITAGHLLLHLIGSATLALMNISLFTALITFIILTLL---VILEFAVALIQAYVFTLLVSLYLQDN-T-M-PQLDTSTWLLTILSMI-FTLFALLQLKIS-KH-FYSHSP-----KPV-DTKL-QKQQT---------------P-W-NHT-WTKIYLPLS-----M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLIGDDQLYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLMASSMIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq401 ----M--NENLFAPFITPT-ILGITTLPIIMLFPCLLLTS--PKRWLPNRIQILQIWLIRLITKQMMTIHNKQGRSWTLMLMSLILFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWLATVLMGFRNKPK-VSLAHFLPQGTPTPLVPMLVIIETISLFIQP--VALAVRLTANITAGHLLIHLIGSATLALSSISLTVSTITFTILFLL---TILELAVAMIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWLLTITLMI-LSLFCIYQSKMI-NQ-TMTSIP-----PQDKKQTH-PTTQL---------------P-W-ETK-WTKIYLPHSSPLLSM-FI--TRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLIGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq402 ----M--NENLFATFVTPT-IMGVTTLPIIILFPCMLLST--PKRWLPNRIQILQIWLIRLITKQMLTMHNKQGRTWALMLMSLILFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWLATVLMGFRNKPK-VSLAHFLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSISMTVSTITFTILFLL---TILELAVAMIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWFLTITLMI-ISLFCVFQSKMI-NQ-LMTSIP-----PQDKNHTK-PKAQL---------------P-W-ETK-WTKIYLPHSSPLLSM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLIGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq403 ----M--KENLFASFITPT-MMGLPIVTLVVMFPSMLFPT--PTRLINNRLISFQHWLIRLTSKQMMTIHNYKGQTWSLMLMSLIMFIGATNLLGLLPHSFTPTTQLSMNLGMAVPLWAGTVVTGFRNKTK-ASLAHFLPQGTPTPLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGGATLALMNISTLTALITFVVLILL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITILSML-MTLFILFQLKLS-KH-IYYPTP-----EPK-FSKT-HKQNT---------------P-W-ETK-WKKIYLPLLLPQQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq404 ----M--TLAIFDQFKSPT-MFGLPLAWLAMLIPSILLIL-QTPNFIKSRYHTLLMPTLMTITKQLFTPINSQGHKWALICMASMMFILTINLLGLLPYTYTPTTQLSMNMGLAVPMWLATVLIGLQKKPT-EALAHLLPEGTPIALIPMLVIIETISLFIRP--IALGVRLTANLTAGHLLIQLISITTFAVMPMI-SLTLATSLLLFLL---TILELAVAMIQAYVFILLLTLYLQEN-V-M-PQLEPAPWFSMLTVSW-LIILLLIMPTIM-FY-QTQNTV-----S-A-QQAT-KP-KQ---------P-----T-W-TWP-WH------------V-TL--IRWLFSTNHKDIGTLYLIFGAWAGMVGTALSILIRAELSQPGTLLGDDQIFNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPMMLSAPDMAFPRMNNMSFWLLPPSLLLLLASAGVEAGAGTGWTVYPPLAGNLAHTGAS [...]
+Seq405 ----M--TLSLFDQFMSPF-LLGVPLIIIALTLPWSLFPT-ATRRWLNNRVLTLQGWFINRFAQQLLLPLSTAGHKWAVLLVSLMMYLITLNMLGLLPYTFTPTTQLSLNLALAVPLWLATVITGMRNQPT-HALGHLLPEGTPTPLIPALIIIETISLFIRP--LALGVRLTANLTAGHLLIQLTSTATFVLLPLMPAVAISTGALLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLDPAPWFYILAYSW-LVFLTILPAKTT-TH-IFPNNP-----A-P-EDPK-KP-TT---------Q-----P-W-AWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGVGTGWTVYPPLAGNLAHAGAS [...]
+Seq406 ----M--TLSLFDQFASPT-LLAVPLVILAMLAPWDMFPA-PGVQWLGSRLLAIQSWVFKTVTRQMIMPMSVAGHKWALLLMSLLIFLITLNMLGTLPYTFTPTTQLSLSLGLALPLWLATVLIGLRYHPV-RSFSHLLPESTPTLLIPVLIIIETISLLVRP--LALGVRLAANLTAGHMILQMIASTTLGMLCVLSPTGLLGAVILYLL---ACLELVVAAIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFMILVFAW-AVLLVIIPPKIL-AH-TYPNEP-----T-T-QNNK-TP-KS---------Q-----P-W-NLP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq407 ----M--NLSFFDQFTSPC-LLGIPLILLSMLFPALLLPT-SDNRWITNRLTTLQLWFVHLITKQLMTPLNKAGHKWALILTSLMTFLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ASLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATTALLPIIPTVSILTTLILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFFIMLMSW-LTFSLIIQPKLL-SF-TPTNHP-----S-N-KTHS-TI-KT---------T-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq408 ----M--ALSFFDQFMSPN-FLGIPLIAMAIALPWTLYPT-PSTRWLSNRLLTLQNWSINRFTQQLLLPLNQEGHKWAALLASLMIFLLSLNMLGLLPYTFTPTTQLSLNLGLAVPLWLATVIIGMRNRPT-HALGHLLPEGTPSLLIPILIIIETISLLIRP--IALGVRLTANLTAGHLLIQLIATASFVLLPLMPTVAVLTTALLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLAILTFSW-LIFLTVIPPKIL-AH-SFPNEP-----T-P-HSTK-AP-KT---------D-----P-W-MWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq409 ----M--SLNFFDQFMSPT-LLGVPLIAVAMMFPWTLLPT-PTNRWLNNRTLTLQNWFIGRFTNQLLQPLNTGGHKWAMI-------LMSLNLLGLLPYTFTPTTQLSLNMGLAIPFWLATVLLGLRNQPT-AALGHLLPEGTPTLLIPILIIIETISLLIRP--FALGVRLTANLTAGHLLMQLIATAAFVLLPMMPTVALLTTLVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWLLILLFSW-LIFLTMLPSKTQ-LH-TFPNMP-----S-T-QNMC-KQ-EP---------E-----P-W-TWP-WA------------V-MI--TRWLFSTNHKDIGTLYMIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq410 ----M--SLNFFDQFMSPT-LLGVPLIAVAMMFPWILLPT-PTNRWLNNRTLTLQNWFIDRFTNQLLQPLNIGGHKWAMILTMLMIFLMLLNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVLLGLRNQPT-ATLGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLMQLIATATFVLLPMMPTVALLTTLVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWLLILLFSW-FIFLTMLPSKTQ-LH-TFPNMP-----S-T-QNMC-KQ-EP---------E-----P-W-TWP-WA------------V-MI--TRWLFSTNHKDIGTLYMIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFGMIFFMVMPVMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq411 ----M--AMSFFDQFASPS-YLGIPLIAIAIALPWMLFPT-PSSRWINNRLITVQGWLISRFTNQLMLPLNLGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVLIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPLMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTIIPTKVM-NH-ITPNEP-----A-I-LDSE-KH-KT---------E-----P-W-NWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq412 ----M--NENLFASFITPT-IVGIPIVILIIMTPYIIFPS--PTRLINNRLTSLQQWLVQLILKQLMSIHNTKGRTWSLMLISLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAATVIKGFRHKTK-ASLAHFLPQGTPIPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLMHLIGGATLVLTSISPATASITFIILTLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLITILSMI-LTLLIVFQLKIS-KF-NYPLNP-----TMK-NINK-DLYTN---------------P-W-ETK-WTKIYLPLSLPQQSM-FI--NRWFYSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGSLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq413 ----M--MLSLFDQFASPK-IMGLPLILIATLFP-IMIFF-TSNRLIYNRLSTTQAWLTMTITKQLLLPINTNGHKWATPLISVMMLLISINLLGLLPYTFTPTTQLSMNMALATPLWLATVLMGLKNQPS-TSLGHLLPEGTPPPLIPALIIIETISLFIRP--IALGVRLTANLTAGHLLMHLISTAAFNMALTMPTVSLFTLVLLLLL---TGLEIAVAMIQAYVFTLLLSLYLQEN-V-M-PQLNPAPWFLILLMTW-LSLQLMST------M-KTLSVP-----T---QNSL-DTSTS---------SLEESHP-W-PWP-WY------------V-TI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRSELSQPGTLLGDDQLYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq414 ----M--ILSFFDQFLSPT-LLGMPLIILAIVFPWILYPS-QTNRWVINRLSSIQNWLVLLVTKQLLQPVNSPGHKWAAILTTMLIFLISLNLLGLLPYTFTPTTQLSMNVSLAIPMWLATVLIGLRNQPT-TSLGHLLPEGTPTLLIPALVIIETISLFIRP--IALGVRLTANLTAGHLLMQLIATAVFYLLTTLPSIAILTFIVLFLL---TILELAVAMIQAYVFVLLLTLYLQEN-T-M-PQLNPNPWFMILVISW-LTLLLILFPKIT-SF-TLFSNP-------E-QKLL-SM-KT---------K-----S-W-TWP-WS------------V-TI--TRWLFSTNHKDIGTLYMLFGAWAGMVGTALSLLIRAELSQPGALLGDDQIFNVLVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRLNNMSFWLLPPAFLLLLAGSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq415 ----M--TLSLFDQFAIPT-YLGIPLIIIALTFPWILYPT-PTNRWLNNRLLTLQGWFINRFTQQLLLPLNLGGHKWALILTSLMLYLITLNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-AALGHLLPEGTPAPLIPVLIIIETISLMIRP--LALGVRLTANLTAGHLLIQLLSTATFVLLQLMPTVATLTAMVMLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPTPWFFILFLSW-LTFLIILPSKIM-EH-SFTMEP-----T-T-QSVE-KP-NP---------E-----P-L-NWP-WP------------V-AI--TRWFFSTNHKDIGTLYMVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGIEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq416 ----M--TLSLFDQFAIPT-YLGIPLIIIALTLPWILYPT-PTNRWLNNRLLTLQGWFINRFTQQLLLPLNLGGHKWALILTSLMLYLITLNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-AALGHLLPEGTPAPLIPVLIIIETISLMIRP--LALGVRLTANLTAGHLLIQLLSTATFVLLQLMPTVATLTAMVMLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPTPWFFILFLSW-LTFLIILPSKIM-EH-SFTIEP-----T-T-QSVE-KP-NP---------E-----P-L-NWP-WP------------V-AI--TRWFFSTNHKDIGTLYMVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGIEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq417 ----M--TLSLFDQFAIPT-YLGIPLIIIALTFPWILYPT-PTSRWLNNRLLTLQGWFVNRFTQQLLLPLNVGGHKWALILTSLMLYLITLNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-AALGHLLPEGTPAPLIPVLIIIETISLMIRP--LALGVRLTANLTAGHLLIQLLSTATFVLLQLMPTVATLTAIVMLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPTPWFFILILSW-LTFLIIIPSKVM-GH-SFATEP-----T-A-QNVE-KP-NP---------E-----P-L-NWP-WP------------V-AI--TRWFFSTNHKDIGTLYMVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGIEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq418 ----M--AMSFFDQFASPS-YLGIPLIAIAIALPWVLYPT-PSSRWINNRLITIQGWLINRFTNQLMLPLNVGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTIIPTKVL-NH-VSPNEP-----T-P-VSAE-KH-KT---------E-----P-W-DWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq419 ----M--NENLFASFTTPT-MMGLPIVILIILFPSILFPS--PNRLINNRLISIQQWLIQLTSKQMLSIHNYKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRHKTK-ASLAHFLPQGTPLLLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLVLMDISTATASITFTILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWSIVILSMI-LTLFIMFQLKIS-KH-HFPTNP-----EPK-QTLL-PKSNT---------------P-W-EEK-WTKIYSPLSLPLQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq420 ----M--TLNLFNQFKSPE-ILGLPTTILAIMMIIPLLHN--KPHLLGNRLTTLLTWLTKTTSKTFTTTLTAKGQKWARLLTALFFLLLSSNLMGLLPYTMPPTALLSMNMALALPLWLGTVLTGLINKPT-TALAHLLPEGSPNALSPALILIETTSLLMRP--IALGVRLTANITAGHLLISMISLATINLTNLSTTLSMTTLTLLTAL---TLLEIAVACIQAYVFTLLLSLYLQEN-T-M-PQLEPMNMLLIMTWTW--MILTSTTKKIS-KL-TPTKHS-----IKPQTKHH-TTQ--------------------WPWP-WP------------V-YI--NRWLFSTNHKDIGTLYFLFGAWAGLAGMSMSLMIRMELCQPGALLGNDQIYNTIVTAHAFIMIFFMVMPTMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPALLLLLTSSFTEAGAGTGWTVYPPLSGNLAHSGTS [...]
+Seq421 ----M--NENLFSSFITPT-MMGLPIVILIIMFPTLLFPI--PTRLINNRLVSAQQWLAQLILKQMMMMHSPKGRTWALMLISLIMFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRYKTK-ASLAHFLPQGTPVPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLMHLIGGAALALISISPTTALITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLVTIIAMI-LTLFILIQLKFH-KY-SYPLSP-----APK-TFKS-TSFPT---------------P-W-ETK-WTKIYSPLLLP-QQM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq422 ----M--VTNLFDQFASPT-SLGVPLILIAMLVPWLLFPA-PSKQWLLNRLTSSQSLFLKTFTKQIFLPLSTPGHKWAFILSSLMLFILGMNLLGLLPYTFTPTTQLSMNLGLAVPFWLATVLIGLRNQMT-ASFAHFLPEGTPTLLIPILIVIETISLFIRP--LALGVRLTANLTAGHLLIHLISTATSVMLSTSIIVATLTFLTLLLL---TLLELAVAMIQAYVFVLLLSLYLQEN-T-M-PQILERWPIAIFMWSW-IIFICLPPKKIL-TH-LFLNEP-------SSKSSK-ISKQT-----------------W-IWL-W-------------M--F--TRWLFSTNHKDIGTMYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPILIGGFGNWLIPLMLGAPDMAFPRMNNMSFWLLPPSFFLLLASSMVEAGVGTGWTVYPPLAGNIAHAGPS [...]
+Seq423 ----M--ALNLFDQFMSPT-QLGVPLIAIALTLPWMLTPT-PLTRYQNNRLMSLQSWFVKTFTHQLLMPLNKGGHKWAMLLASLMIFILTLNVLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETIGLFIRP--LARGVRLTANLTAGHLLIQLISTATITLLPTMTTVAMLTATLLVLL---TLLEIAVAVIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTVIPNKVL-SH-TFTNEI-----M-A-PSAE-KL-KT---------E-----T-W-NWP-WH------------V-TI--TRWFSSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELAQPGALLGDDQIYNVIVTTHALVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMGFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq424 ----M--NQNLFTPFMTPF-MLGIPITTLIIMLPAMLFPS--PNRLTNNRLISIQQWLTKTVLKQLMNMHNPKGQSWSLMLISLLLFIASTNLLGMLPHSFTPTTQLSMNLGMAIPLWTGTVLMGLRHKTK-TSLAHLLPQGTPTFLIPMLVVIETISLFIQP--MALAVRLTANITAGHLLLHLIGSAILALANINTLAAFTTFIILTLL---VILELAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWSLTILFML-LTLFTLLQPKIS-KHSYFPSPK-----STYKKMN---KQQN---------------P-W-NKV-WTKIYLPL----S-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLIGDDQIYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLMASSVIEAGTGTGWTVYPPLAGNLAHAGAS [...]
+Seq425 ----M--TLSFFDQFLSPT-MMGIPLMMIAMVLPWLLFPT-PTNEWLNNRLSTLQIWFSQKFTKQLMTPLNIKGHKWAMILTSLMVFLMTINLLGLLPYTFTPTTQLSLNLGLAVPFWLATILIGLRNQPT-ATFGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATATLVILPMMPMVSILTMVVLLLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLMPGPWLAIFLMSW-IVFLLVLTYKIS-NF-NNLNEP-----T-S-QNIK-KN-KP---------E-----S-W-NWP-WL------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSFLGDDQIYNVVVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq426 ----M--NENLFASFTTPT-MMGLPIVILIILFPSILFPS--PNRLINNRLISIQQWLIQLTSKQMLSIHNHKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVIMGFRHKMK-ASLAHFLPQGTPLLLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLVLMDISTVTASITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWSIVILSMI-LTLFIMFQLKIS-KH-HFPTNP-----EPK-QTLL-SKSNT---------------P-W-EEK-WTKIYSPLSLPLQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq427 ----M--TLSLFDQFMSPW-LLGVPLIALALALPWTLFPT-PSTRWLNNRLLTLQGWFINRFTQQLLQPMSLGGHKWALLLTSLMLYLITLNMLGLLPYTFTPTTQLSLNIGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPTPLIPILIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVALLTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPTPWFAILVFSW-LVFLTILPSKVM-AH-AFPNEP-----T-P-QSTE-KS-KT---------N-----P-W-TWP-WH------------V-AI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq428 ----M--TLSLFEQFEINS-TFGVPVIILAFTLPWLLIAT-PSRKLLTNRLVSVQKRFIRWVVKELIRPMSLGGHKWALLLTSLLLFIMTLNIFGLLPHSFTPTTQLAMNLGLSVPLWMATVIVGFRKHRS-AALAHFLPLGAPNALIPILVIIELISLIVRP--LALAVRLTANITAGHLMMQIVATGAQVLIPLMPVTAFITLLTLILF---FILEAAMALVQAYVFVLLLSLYLEES-Q-M-PQLDLSPWFLVLFLTW-SVFLLIVPQKVL-AH-SFPFKP-------NSRHTK-TTNLN---------N-------W-NWS-WH------------M-TV--TRWFFSTNHKDIGTLYLIFGAWAGMVGTGLSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq429 ----M--TLSLFDQFSSPS-YLGIPLILIALSLPWVLFPA-PSTRWLNNRMLTLQGWFIARFTNQLFLPLNVGGHKWAPLLASLMIFLLTLNMLGLMPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-HALGHFLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIHLISSAAFVLMPMMPTVALLTAILLLML---TLLEVAVAMIQAYVFILLLSLYLQEN-V-M-PQLNPAPWFMIFMFTW-VIFLTILPPKVL-AH-TFPNEP-----S-P-QSMT-AP-KT---------T-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPLMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq430 ----V--NEELSTFFYVPV-----GTMMLAIAFPAILLPT--PNRLITNRWITIQQWLIQLIMKQLLSIHNTKGLSWSLMLITLTLFIGLTNLLGLLPYSFAPTTQLTVNLSMAIPLWTGTVVPGFRYKTK-ISLAHLLPQGTPMFLIPMIIIIETISLLIRP--VTLAVRLTANITAGHSLIHLTGTATLTLSSIHSMTITVTFVTVILL---TILELAVALIQAYVFALLISLYLHEN-A-M-ERMDIIIWLLAVVIVL-TTLMIFLHLKTL-KI-IRLLFP-----ISK-ELSK-KSCVF---------------P-W-KKK-WTKNYPPSSMYP--M-FA--NRWLYSTNHKDIGTLYLLFGAWAGMVGTAFSILIRAELGQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq431 ----M--NLNLFNQFLSPT-LMGIPLMGLALLLPWLLTPK-PMHHWLSNRLTTLQSWFFSMFTKQLMLPISLKGHSWSLLLASMLMLLITMNLLGLLPYTFTPTTQLSLNLGLAIPLWFATVLTGLRNQPT-VAFGHMLPEGTPALLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLTSTAVLVLMPLLPLISVLTMTVLLML---TLLEIAVAVIQAYVFILLLSLYLQEN-V-M-PQLNPSPWFAIFLTSW-IIYLTILAPKMS-NF-KYQNEP-----K-L-QDIN-KE-SP---------K-----P-W-NWP-WT------------V-MI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq432 ----M--TLSFFDQFMSPT-HLGVPLMALALTLPWILYPT-PTARWLNNRFLALQGWFINRFTQQLLLPLSLGGHKWAALLTSLMIFLITLNMLGLLPYTFTPTTQLSLNLGLATPLWLATVIIGMRNQPT-HALGHLLPEGTPGPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLMPLMPAVALLTSAVLVLL---TLLEIAVAMIQAYVFVLLLTLYLQEN-V-M-PQLNPTPWFAILVFSW-LVFLAVLPPKVL-AH-TFPNEP-----T-L-QSTD-KP-KT---------D-----P-W-TWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq433 ----M--NENLFTPFSAPT-ILNQPATIPIILFPTLLILT--PKHPINNRLATIQQNLTRFTLKQMMMTHNAKGQTWSLMLTSLITFTATTNLLGLMPYSFTPTTQLSMNLAMAIPLWAGTVMVGLRFKTK-NSLAHLLPQGTPTPLIPMLVAIETISLLIQP--VALAVRLTANITAGHLLMHLIGNTVLALSTTNLSMALLASTLLVLL---TILEIAVALIQAYVFTLLISLYLRNN-T-M-PQLDTSTWFTTIMTML-PTLYLIMQLKLL-NT-NHHQPP-----LTK-TPTL-QSHNV---------------R-W-QPK-WTKTCLPLSQPQQFM-LI--NRWLFSTNHKDIGTLYLLFGAWAGIMGTALSLLIRAELGQPGNLLGNDHIYNVIVTAHAFVMIFFTVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLMASAVVEAGAGTGWTVYPPLAGNFSHPGAS [...]
+Seq434 ----M--NENLFTPFSTPM-ILNQPATIPIILFPTLLILT--SKHPINNRLATIQQNLTQFTLKQMMTTHNAKGQTWSLMLTSLITFITMTNLLGLTPHSFTPTTQLSMNLAMRIPLWAGTVIMGLRFKTK-NSLAHLLPQGTPTLLIPLLVAIETISLLIQP--VALAVRLTANITAGHLLMHLIGNATLALSSINFPMTLLIFTLLALL---TILEVAVALIQAYVFTLLTSLYLHNN-T-M-PQLDTSTWSTTIMAML-PTLYLITQLKLL-NT-NYYQPP-----LTK-NPNL-QTHNI---------------Y-W-QPE-WTKTCLPHSQPQ--M-LI--NRWLFSTNHKDIGTLYLLFGAWAGIMGTALSLLIRAELGQPGNLLGNDHIYNVVVTAHAFIMIFFTVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWHLPPSFLLLMASTVVEAGVGTGWTVYPPLAGNFSHPGAS [...]
+Seq435 MSLTM--DLTFFDQFMSPQ-ILGVQLIIMSLLMPPIMFPA-QNNRWLTNRFSTLQSWAINLFTKQLMLPTNKTSRQWSIILTSLMAMLLTTNLLGLLPYTFTPTTQLSMNMGLAIPMWLATVLTGLRDQPT-MSLGHMLPEGTPTPLTPTLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLTSTAMITLLPTMPTLSLLAMTVLFLL---TMLELAVAMIQAYVFVLLLNLYLQEN-T-M-PQLNPNPWFLILSSTW-LIYTLILQPNIA-SY-LSMNYP-------T-KKNK-TT-NT---------N-----P-W-AWP-WT------------V-IL--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFIMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIEAGAGTGWTVYPPLAGNMAHAGAS [...]
+Seq436 ----M--NENLFATFITPT-ILGITTLPIIMLFPCLLLTS--PKRWLPNRIQILQVWLIRLITKQMLTIHNKQGRSWALMLMSLILFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWLATVLMGFRNKPK-ISLAHFLPQGTPTPLVPMLIIIETISLFIQP--VALAVRLTANITAGHLLIHLIGSATLALCSISVTVSTITFIILFLL---TILELAVAMIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWLLTITLMI-LALFCIYQSKMI-NQ-TMISIP-----PQDKKVIK-PTTQL---------------P-W-ESK-WTKIYLPHSSPLLSM-FI--TRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq437 ----M--NENLFTSFITPT-LVGLPMTVIIIAFPSILFPQ--PKRLINNRWTTIQQWMINLILKQMMSMHNIKGRTWSLMLISLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVIMGFRNKPK-TSLAHFLPQGTPIPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLILMSISTTTATITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTTPWFTVIMSML-ITLFILFQTNTS-KF-ITPLDP-----INK-NPKS-TTKTN---------------P-W-DTK-WTKIYLPHSLHQH-M-FI--NRWLFSTNHKDIGTLYLIFGTWAGMVGTALSILIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHSGAS [...]
+Seq438 ----M--NENLFAPFITPS-IMGITTLPIIMFFPCLILST--PKRWLPNRIQTLQIWLIRLITKQMMTMHNKRGRSWTLMLMSLILFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWMGTVVMGFRNKPK-TSLAHFLPQGTPTPLVPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLSLASISIMVSTITFIILFLL---TILELAVAMIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWLLVILLMI-VALFCVYQLKMM-NQ-TMLSIY-----QQNDKNIL-VTQQL---------------P-W-EKK-WTKIYLPHSSPLLSM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq439 ----M--NLALFDQFMSPQ-ILGLPLITLALLTPLIMFPT-QNNRWLTNRFSTLQSWAINSLTKHLMLPINKTGHKWSIILTSLVTLLLTINLLGLLPYTFTPTTQLSTNMALAIPMWMATVLTGFRNQPT-TSLGHLLPEGTPTLLSPTLILIETISLFIRP--LALGIRLTANLTAGHLLIQLTSTSVLALVKTTMTLSALTTATLILL---TILELAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPDPWFLTLFSTW-LTY-IILQPKIL-SY-LRTNTP----NK-N-NKNK-II-NT---------K-----P-W-TWP-WT------------V-FL--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQTYNVIVTAHAFVMIFFMVMPIMIGGFGNWLMPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIEAGAGTGWTVYPPLAGNLAHSGAS [...]
+Seq440 ----V--NEGLSTFFDVPM-----GTMTLIVAFPAILLPT--TNRLITNRLVTIQQWLIQLIMKQLLTIHNTKGLSWSLMLITLTLFIGLTNLLGLLPYSFTPTTQLAMNLSMAIPLWTGTVILGLRHKTK-VSLAHLLPQGTPTFLIPMIIVIETISLLIRP--ITLAVRLTANITAGHLLIHLTGTATLTLLSIHPMTITVTFITMILL---TILELAVALIQAYVFALLVSLYLYEN-A-M-AQANIIILLLVAAIVL-ITLAIFLHIKVL-NI-LYFLFP-----ASK-EFSK-KSYIF---------------P-WKKKK-WTKDYPPSSMYP--M-FA--NRWLYSTNHKDIGTLYLLFGAWAGMVGTAFSILIRAELGQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq441 ----V--NEELSAFFDVPV-----GTMMLAIAFPAILLPT--PNRLITNRWITIQQWLVKLIMKQLLSIHNTKGLSWSLMLITLTLFIGLTNLLGLLPYSFAPTAQLTVNLSMAIPLWTGTVILGFRYKTK-ISLAHLLPQGTPTFLIPMIIIIETISLLIRP--VTLAVRLTANITAGHLLIHLTGTAALTLLSIHSMTITVTFITVVVL---TILELAVALIQAYVFALLISLYLHES-A-M-ERMDIIIWLLAVVIVL-TTLMIFLHLKTL-KI-IRLLFP-----VSK-ELSK-KSCVF---------------P-W-KKK-WTKNYPPSSMYP--M-FA--NRWLYSTNHKDIGTLYLLFGAWAGMVGTAFSILIRAELGQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGTGTGWTVYPPLAGNLAHAGAS [...]
+Seq442 ----M--NENLFTSFTAPT-IMGIPITLIIIMFPIIMFPT--PKRLINNRIEAIQQWLLQQTTKQMMSIHNYKGQTWTLMLMSLIMFIASTNLLGLLPYSFTATTQLSMNLGMAIPLWAATVITGFRHKTK-ISLAHFLPQGTPTPLIPMLVIIETISLLIQP--MALAVRLTANITAGHLLMHLIGSAIFALMSINLTVATPTFIILVLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFIMITSMI-LTLFILFQLKLS-KY-EYPHNT-----ESM-TKFN-PKTSA---------------P-W-TKK-WTKIYSPLSLPQQLM-FI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq443 ----M--NLTFFDQFMSPQ-MLGIPLIILALLVPSIIFTT-QNNRWLTNRFSVLQSWTINSFTKRLMLPINKTGHKWSIILTSLMAMLLAINLLGLLPYTFTPTTQLSLNMGLAVPMWLATVLTGLRKQPT-ASLAHLLPEGTPPPLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLTSIAVLALLPSM-MMSILTMAVLFLL---MILELAVAMIQSYVFVLLLSLYLQEN-T-M-PQLNPDPWFLILSSTW-LMYSIVLQPKIS-SY-LSTNNP-----T-N-KNNK-TT-NT---------K-----P-W-TWP-WT------------V-FL--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAGNLAHTGAS [...]
+Seq444 ----M--MTSLFDQFSSPS-LLSIPLILIAMLVPWLFLAS-STNRWSSNRLISLQTIFMNTFTKHILQPMNQSAHKWAFLFVTIFVYILGMNLLGLFPYIFTPTTQLSLNLGLAIPLWLATVLIGLRNQPS-ASLGHLLPEGTPPLLIPVLIIIETISLFIRP--IALGVRLTANLTAGHLLIQLISQATLAMLSMSAAVSLLAFSALVLL---TILEIAVAMIQAYVFILLLSLYLQEN-S-M-PQLIPDPWFFTLLTSW-LILMLLAPKKIL-TH-ITLNDP-----N-S-KNMK-T--TH---------S-----T-W-NWP-W---------------ML--VRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELAQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPMLIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFFLLLASSMVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq445 ----M--NENLFSSFITPT-MMGLPIVIAITMFPSIMFPS--PTRLINNRLISIQQWLVQLTSKQMLSIHNQKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSLNLGMAIPLWAGTVITGFRHKTK-ASLAHFLPQGTPLPLIPMLVVIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMSISTVTAMVTFTILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITILSMI-ITLFFMFQLKVA-KY-NFPENP-----EPK-LMSV-SKSTT---------------P-W-EKK-WTKIYSPLSLPLQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq446 ----M--VLNFFDQFMSPT-YLGIPLIALALTLPWIFYPT-HSTRWLNNRLLTLQNWFIGQFTKQLFLPLNVPGHKWATILISLMIFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVLLGMLTQPT-HSLGHLLPEGTPTPLIPILIIIETISLLIRP--LALGVRLTANLTAGHLLIQLIATAAFVLMPMMTSVAILTTALLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFAILTFSW-LIFLTILPSKTT-AH-PFPNEP-----A-P-QSTM-TP-KT---------E-----T-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSAVESGAGTGWTVYPPLASNLAHAGAS [...]
+Seq447 ----M--TLSFFDQFMSPT-LIGVPLMALALSLPWILYPT-PTARWLNNRLLTLQNWFINRFTQQLLLPLNLGGHKWALILTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-IALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTILPPKVS-AH-TFPNEP-----T-P-QNTE-KP-QT---------E-----S-W-TWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq448 ----M--NLTFFDQFMSPQ-ILGVPLIILALLMPSIIFPT-PNNRWLANRLSTLQVWTINLFTKQLMLPINKTGHKWALILTSLLAMLLMTNLLGLLPYAFTPTTQLSMNMGLAIPMWLATVLTGLRNQLT-TSLGHLLPEGTPAPLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAMLALLPTMTTLSILTGIILLLL---MILELAVAMIQAYVFVLLLCLYLQEN-I-M-PQLNLDQWFLILSSTW-LVYTTILQPKIS-SY-LSTNNP-----A-N-KDNK-VT-NT---------N-----P-W-TWP-WT------------V-FL--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq449 ----M--MLSFFDQFASPT-YLGIPLVALALTLPWTLYPT-PSNRWLNNRLLTLQSWFINRFTQQLLLPLNISGHKWAVLFASLMVFLMTLNLLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-IALGHLLPEGTPAPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLFPMMPTVAILTSTVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILMFSW-LVFLTTIPPKIT-AH-SFTNDP-----N-T-QNTE-KP-KP---------E-----P-W-SWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq450 ----M--MLSFFDQFASPT-YLGIPLIALALSLPWILYPT-PSNRWLNNRLLTLQAWFINRFTQQLLLPLNIGGHKWAMLFASLMIFLMTLNLLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-IALGHLLPEGTPAPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLFPMMPTVAILTSTVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFAILMFSW-LMFLTTIPPKIM-AH-HFTNDP-----N-T-QSTE-KP-KP---------E-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq451 ----M--NENLFAPFMIPI-MLGIPITTLIIILPSILFPA--PNRLINNRTISIQQWLTKLTSKQLMNVHSPKGQTWALMLISLFLFIASTNLLGMLPHSFTPTTQLSMNVGMAIPLWAGTVATGFRNKTK-MSLAHLLPQGTPTFLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGETTLTLMNTSLFTALITFTILALL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLLTILSML-LTLFVLFQLKIS-KH-SYSPSP-----KLT-PTKT-QKQQA---------------P-W-NTT-WTKIYLP---LL--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLIGDDQVYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq452 ----M--VLNFFDQFESPS-LLGIPLVVLALSLPLLLFPT-PSPRWLNSRLLTLQNWFINRFTQQLLLPLSLGGHKWALLLTSLMLFLITLNMLGLLPYTYTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-IALGHLLPEGTPALLVPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMTTVAILTSTVLLLL---TLLEVGVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPLPWFTILFYSW-LVFLVILPPKVL-AH-SFPNEP-----N-P-EATE-AS-QP---------Q-----T-W-VWP-WY------------V-AI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVESGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq453 ----M--TLSLFDQFSSPS-FLGIPMILMALALPWLLIPT-PTSRWLSNRVVSLQGWFIARFTNQLFLPLNVGGHKWAPLLASLMMFLLTLNMLGLMPYIFTPTTQLSLNMGLAVPLWLATVLIGMRNQPT-HALGHFLPEGTPTALIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIHLISSAVFVLMPMMPTVAILTAVLLLLL---TMLEVAVAMIQAYVFILLLSLYLQEN-V-M-PQLNPAPWFMIFMFTW-AIFLTILPPKVM-AH-TFPNEP-----S-P-QGMT-TP-KT---------A-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPLMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq454 ----V--TLGLFDQFLSPV-FLGVPLIALALSLPWILYPQ-PTSRWVNNRLLALQGCFINRFTQQIFQPINPKGHKWAALFTALMLFLVTLNTLGLLPYTFTPTTQLSLNMAFAVPLWLATVLIGMRYQPT-HALGHLLPEGTPAPLIPLLIIIETASLFIRP--LALGVRLTANLTAGHLLIQLTSTAVFTLMFLMPTLAFLTSILLLLL---TLLEVAVALIQAYVFVLLLSLYLQEN-L-M-PQLKLKPWFPILALAW-LIFMALAPRKVI-EY-SYPNRF-----T-P-QGSK-TP-KS---------L-----P-W-TWL-WH------------V-MI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq455 ----M--NENLFSSFITPT-MMGLPIVIIIIMFPSILFPS--PNRLINNRLISIQQWLVQLTSKQMLSIHNQKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSLNLGMAIPLWAGTVIVGFRHKTK-ASLAHFLPQGTPLLLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGSATLALMNISTTTAMVTFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLITILSMI-ITLFLMFQLKVS-KY-NFPENP-----EQK-SVFV-PKTNT---------------P-W-EKK-WTKIYFPLSLPQQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq456 ----M--IMSFFDQFSSPH-LLGIPLILLSMLLPTLLLPT-PNNRWATNRLSTLQSWTINTITKQLMTPLNKPGHKWALILSSLMILLLTINLLGLLPYTFTPTTQLSMNMALAFPLWFATLLTGLRNQPT-ASLGHLLPEGTPTPLIPALIMIETISLFIRP--LALGVRLTANLTAGHLLIQLISTASITLLPILPTVAILTTMILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFFIMILSW-LTFSLIIQPKML-SF-TPTNHP-----T-N-KTPT-TT-KN---------N-----P-W-TWP-WS------------VT-L--NRWLFSTNHKDIGTLYLIFGAWAGMIGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq457 ----M--NLTFFDQFSSPS-LLGIPLILIAMTFPALLIPS-PGNRWITSRLTTLQLWFFNLVTKQLMMPLDKKGHKWALILTSLMVFLLLTNLLGLLPYTFTPTTQLSMNLALAFPLWLATVLTGLRNQPS-TSLGHLLPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATTALFSTMPAISLLTLLILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWLFTMLITW-ATYSLLIQPKLL-SF-TSTNPP-----T-N-KLYQ-AT-DT---------T-----P-W-TWP-WT------------VTFT--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq458 ----M--TLSLFDQFSSPS-FLGIPMILMALALPWLLIPT-PTSRWLSNRVVSLQGWFIARFTSQLFMPLNVGGHKWAPLLASLMMFLLTLNMLGLMPYIFTPTTQLSLNLGLAVPLWLATVLIGMRNQPT-HALGHFLPEGTPTALIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIHLISSAVFVLMPMMPTVAILTAVLLLLL---TMLEVAVAMIQAYVFILLLSLYLQEN-V-M-PQLNPAPWFMIFMFTW-AIFLTILPPKVM-AH-TFPNEP-----S-P-QGMT-TP-KT---------A-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPLMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq459 ----M--NENLFAPFITPT-IMGITTLPIIIMFPCLILSS--PKRWLPNRIQILQMWLIRLITKQMMTMHNKQGRAWTLMLMSLILFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWAGTVIMGFRNKPK-MSLAHFLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSISMTVSTITFSILFLL---TLLEIAVAMIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWTLTILLMI-ISLFCIYQLKMM-NQ-ALIQIT-----PMTEQSKS-TKYTM---------------P-W-EKK-WTKIYLPHSSHPQLM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMTGTALSILIRAELGQPGTLIGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq460 ----M--NMSFFDQFTSPC-LLGIPLILLAMLFPALLLPT-PDPRWINTRLSVLLTWLLRLITKQLMMPLNKKGHKWALILTSLMTFLLLTNLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ITLGHLLPEGTPIPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATTVLLPIMPTISLLTSSILLLL---TLLEMAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFLTFLLTW-LTFSLTIQPKLL-PF-MPTNPP-----Q-N-KTQL-TV-KT---------T-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq461 ----M--ILNLFSQFSSPT-LLGIPLILIAMLIPWLLFPT-PSDRWLPNRLIASQSWFMKTFSKQIFLPLNTPGHKWAFLLTSVMVFILGMNLLGLLPYTFTPTTQLSLNLGLAVPLWLATVAVGFRNQIT-ASLGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISMATMAMASTSIMVSSLTFITLLLL---TILEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLIPDPWFLIFLSSW-LIIIFLAPQKIL-NH-TILNEP-----S-P-KHSK-T--TH---------Q-----N-W-VWP-WS--------------MI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSAVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq462 ----M--ILNLFSQFSSPT-LMGIPLILVAMLVPWLLFPT-PSSRWLPNRLIASQSWFVKIFSKQIFMPLNTPGHKWAFLLTSVMVFLLGMNLLGLLPYTFTPTTQLSLNLGLAVPLWLATVAVGFRNQMT-ASLGHLLPEGTPTPLIPVLIIIETISLLIRP--LALGVRLTANLTAGHLLIQLISMATMAMASTSILVSSLTFIALLLL---TILEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLIPDPWFFIFLSSW-IIIFILAPQKIL-NH-TILNEP-----S-S-KATK-T--AY---------S-----N-W-TWP-WS--------------MI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSAVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq463 ----M--TLSFFDQFMSPT-YLGIPLIVLALSLPWVLFPT-PSSRWLNNRLLTLQGWFVNRFTQQLLLPLNPGGHKWAILFTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-IALGHLLPEGTPTLLIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTVLPPKVL-AH-TFPNEP-----S-L-QSTE-TP-KT---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq464 ----M--NENLFASFITPT-MMGLPIVIIIIMLPAMLMTS--SKRLVSNRFHSFQQWLIKLIIKQMMLIHSPKGRTWSLMLVSLIMFIGSTNLLGLLPHTFTPTTQLSMNLGMAIPLWAGAVILGFRHKLK-SSLAHFLPQGTPISLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLVLTNISPPTATITFIILALL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITTLSAT-ITLFILMQLKIS-LH-NFPQTP-----SIK-SIKH-TKTNN---------------P-W-ESK-WTKIYSPLSLPQQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSILIRAELGQPGALLGDDQIYNVVVTAHAFVMIFFMVMPMMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq465 ----M--NENLFASFITPT-MMGLPIVVLIIMLPSMLMTS--SKRLISNRFHSFQQWLVKLIIKQMMLIHSPKGRTWSLMLVSLIMFIGSTNLLGLLPHTFTPTTQLSTNLGMAIPLWAGAVILGFRHKLK-ASLAHFLPQGTPISLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLVLTSISPPTATITFIILALL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITVLSTT-ITLFILMQLKIS-LH-NFPQTP-----SVK-SMKL-MKTNN---------------P-W-ESK-WTKIYSPLSLPLQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSILIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPMMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq466 ----M--AMSFFDQFASPS-YLGVPLIAIAITLPWVLYPT-PPSRWINNRLITIQGWLINRFTSQLMLPLNVGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-VIFLTIIPTKVL-NH-ISPNEP-----T-P-VSAE-KH-KT---------E-----S-W-DWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq467 ----M--NENLFTSFATPT-MMGLPIVILVILFPSILFPS--PDRLINNRLTSIQQWLIQLTSKQMLSIHNHKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRYKMK-MSLAHFLPQGTPLLLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLVLMSISTATASITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFTVILSMI-LTLFIMFQLKIS-KH-HFPMNP-----ELK-QTSL-LKSNA---------------P-W-EEK-WTKIYSPLSLPLQ-M-FV--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq468 ----M--AMSFFDQFASPS-YLGIPLIAIAIALPWIMYPT-PSARWINNRLITIQGWLINRFTNQLMLPLNVGGHKWALLFASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVLIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLAILLFSW-FIFLTIVPTKVL-NH-ISPNEP-----I-P-FGAE-EH-KT---------Q-----P-W-DWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGNDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq469 ----M--NENLFASFITPT-MMGLPIVILIIMFPSIMFPA--PNRLVNNRLISLQQWLIQLTSKQMMSIHNPKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRHKTK-ASLAHFLPQGTPLPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMSISTATAFITFIILVLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITILATI-MTLFILFQLKIS-KH-TYPANP-----EPK-SLKS-LKQNT---------------P-W-ETK-WTKIYSPLSLPLQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPILLGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq470 ----M--TLSFFDQFMSPT-LIGVPLMALALSLPWILYPA-PTARWLNNRLLTLQNWFINRFTQQLLLPLNLGGHKWALILTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPPLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTAALLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTILPPKVS-AH-SFPNEP-----A-H-QSTE-KP-QT---------E-----S-W-TWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq471 ----M--NENLFASFATPT-MMGLPIVILITLFPSILLPS--PDRLINNRLISIQQWLIQLTSKQMLSVHNYKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVIMGFRHKMK-TSLAHFLPQGTPLLLIPMLVIIETISLLIQP--MALAVRLTANITAGHLLIHLIGGATLILMDINTATASITFIILMLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWSTMILSMI-LTLFIMFQLKIS-KH-YFPMNP-----KLK-QMSP-LKSNT---------------P-W-EEK-WTKIYSLLSLPLQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq472 ----M--TLSLFDQFMSPT-LLGIPLIALSLTLPWILFPT-PTLRWLNNRLLSLQSWFINRFAQQLMLPLNPGGHKWALLLTALMIFLITVNLLGLLPYTFTPTTQLSLNMGLAAPLWLTTVIIGMRNQPT-HALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIAMGICALVSLMPTTALIMSILLLLM---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFLILVFSW-FIFLALLPSKVL-AH-TFPNEP-----T-T-QSTE-KP-KT---------E-----P-W-NWT-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq473 ----M--NENLFAPFVTPT-IMGITTLPIIIMFPCVMLSS--PKRWLPNRIQTLQIWLIRLITKQMMTMHNKQGRTWTLMLISLILFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWAGTVIMGFRNKPK-ISLAHFLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGAATLALSSINTTVSTITFSILFLL---TILELAVAMIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWTLTIMLMI-ISLFCIYQLKMM-NQ-VIIQIT-----PSNEKKKA-TKSTL---------------P-W-QTK-WTKIYLPHSSHQQLM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLIGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRTNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq474 ----M--NENLFTPFTIPM-MLGIPITTLIIMFPTMLFPT--PNQLINNRMITIQQWLTKLTSKQLMNTHNPKGQTWSLMFISLFLFITSTNLLGMLPHSFTPTAQLSMNLGMAIPLWAGTVVMGFRNKTK-ISLAHLLPLGTPTFLIPMLVMIETISLFIQP--LALAVRLTANITAGHLLLHLIGSATLALVNISLFTALITFTILTLL---TILEFAVALIQAYVFTLLVSLYLQDN-T-M-PQLDTSTWLLTILSMI-LTLFALLQLKIS-KH-FYPPSP-----KPT-PTKL-QKRQT---------------P-W-NCT-WTKIYLPLSQSQ--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGSLIGDDQIYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLMASSMIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq475 ----M--MVNSFSQFESPV-FLTIPLILLALILPWAFYPS-PSPRWLSNRTLTLQNWFIGRFAKQLLASSTPKVHLWATLLVSLMLYIISLNLLGMLPYTFTPTTQLSMNMGLAVPLWLATVLVGFRNQPT-LSLAHLLPEGTPTLLVPVLIIIETISLLIRP--FALGVRLTANLTAGHLLIQLIATATLAFMSIMPAIATLTSILLLLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-S-M-PQLNPAPWFYILIFSW-LVFILIIPHKVV-AH-TYPNPP-----T-S-KTTE-SP-KT---------E-----S-W-SWP-W-------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGMALSLLIRAELCQPGSLLGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASAGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq476 ----M--AMSFFDQFASPS-YLGVPLIAIAITLPWVLYPT-PPSRWINNRLITIQGWLINRFTSQLMLPLNVGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLLIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPTPWFAILVFSW-VIFLTVIPTKVL-NH-ISPNEP-----S-P-VSAD-KH-KT---------E-----S-W-DWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq477 ----M--MLSFFDQFMSPV-FLGIPLIALALTLPWTLFPK-LTTRWLNNRLLTLQSWFINNFTQQIFQPMNLPGHKWALLFASLMVFLMSLNLLGLLPYTFTPTTQLSLNMALAVPLWLATIIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATATFVLLPLMPPVAFLTAILLLLL---SLLEVAVALIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWLLILIFSW-LIFLTIIPPKIL-SH-TSPNEP-----A-H-QSAE-KP-KT---------E-----V-W-TWP-WY------------V-AV--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq478 ----M--NENLFASFITPM-VLGLPLATLIVMFPSMLFPT--SNRLVNNRLISLQQWALQLVSKQMMGIHNTKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRNKTK-ASLAHFLPQGTPTPLIPMLVIIETISLFIQP--IALAVRLTANITAGHLLIHLIGGATLALMSISTTTALITFIILVLL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLTMIMSMF-LVLFIIFQLKIS-KH-NFYFNP-----EIL-LTKT-QKQNT---------------P-W-ETK-WTKIYLPLLLP-Q-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq479 ----M--NENLFASFITPM-ILGLPLATLVVMFPSLLFPT--SNRLVNNRLISLQQWALQLVSKQMMGIHNTKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRNKTK-ASLAHFLPQGTPTPLIPMLIIIETISLFIQP--IALAVRLTANITAGHLLIHLIGGATLALMSISTTTALITFIILVLL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLIMIMSMF-LVLFIIFQLKIS-KH-NFYFNP-----ETL-PTKA-QKQNT---------------P-W-ETK-WTKIYLPLLLP-Q-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq480 ----M--NENLFASFITPM-ILGLPLTTLIVMFPSLLFPT--SNRLVNNRLISLQQWALQLVSKQMMGIHNTKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRNKTK-ASLAHFLPQGTPTPLIPMLIIIETISLFIQP--IALAVRLTANITAGHLLIHLIGGATLALMSISTTTALITFIILVLL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFIMIMSMF-LVLFIIFQLKIS-KH-SFYFNP-----EPM-LTKT-QKQNI---------------P-W-ETK-WTKIYLPLLLP-Q-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq481 ----M--NENLFASFITPM-ILGLPLATLIVMFPSLLFPT--SNRLVNNRLISLQQWALQLVSKQMMGIHNTKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRNKTK-ASLAHFLPQGTPTPLIPMLIIIETISLFIQP--IALAVRLTANITAGHLLIHLIGGATLALMSISTTTALITFIILVLL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFIMIMSMF-LVLFIIFQLKIS-KH-NFYFNP-----EPM-LTKT-QKQNI---------------P-W-ETK-WTKIYLPLLLP-Q-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq482 ----M--NENLFASFITPT-MMGFPIVVAIIMFPSILFPS--SKRLINNRLHSFQHWLVKLIIKQMMLIHTPKGRTWTLMIVSLIMFIGSTNLLGLLPHTFTPTTQLSMNLSMAIPLWAGAVITGFRHKLK-SSLAHFLPQGTPISLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLMHLIGGATLVLMNISPPTATITFIILLLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITIISSM-ITLFILFQLKVS-SQ-TFPLAP-----SPK-SLTT-MKVKT---------------P-W-ELK-WTKIYLPHSLPQQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSILIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPMMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq483 ----M--NENLFASFITPT-MMGFPIVVAIIMFPSILFPS--SKRLINNRLHSFQHWLVKLIIKQMMLIHTPKGRTWTLMIVSLIMFIGSTNLLGLLPHTFTPTTQLSMNLSMAIPLWAGAVITGFRHKLK-SSLAHFLPQGTPISLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLMHLIGGATLVLMNISPPTATITFIILLLL---TILEFAVALIQAYVFTLLVSLYLHDN-T--------------------------------------------------------------------------------------------------M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSILIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPMMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq484 ----M--NENLFASFITPT-MMGLPIVVAIIMFPSILFPS--SKRLINNRLHSFQHWLIKLIIKQMMLIHTPKGRTWTLMIVSLIMFIGSTNLLGLLPHTFTPTTQLSMNLSMAIPLWAGAVITGFRHKLK-SSLAHFLPQGTPISLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLMHLIGGATLVLMNISPPTATITFIILLLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITIMSSM-ITLFILFQLKVS-SQ-TFPLAP-----SPK-SLTT-MKVKT---------------P-W-ELK-WTKIYLPHSLPQQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSILIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPMMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq485 ----M--IMSFFDQFLSPS-LIGIPLIALAILIPWLTFPT-PSSRWLNNRLITLQAWFINRFIYQLMQPMNLGGHKWAVLFTALMLFLITINLLGLLPYTFTPTTQLSLNMAFALPLWLTTVLIGMLNQPT-IALGHLLPEGTPTPLVPILIIIKTISLFIRP--LALGVRLTANLTAGHLLMQLIATAAFVLLTIMPTVALLTSLILFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-M-M-PQLNPNPWFLILLFSW-IVFLTILPNKVM-SH-LFNNDP-----T-L-KSTE-KP-KP---------N-----P-W-NWP-WL------------V-AI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASAGVEAGAGTGWTVYPPLASNLAHAGPS [...]
+Seq486 ----M--SLSMFDQFMSPT-LLGIPLIALALTLPWILYPT-VTSRWLNNRLITLQGWFMSSFSQQLLLPLNPGGHKWAALFTSLMMFLITLNMLGLLPYTFTPTTQLSLNLGLAVPLWLATVVLGMRNDPT-HALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLILLIAKGAFVLLSIMPAVAILTSIVLVLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILIFSW-LVFLITIPPKVL-SH-TFPNET-----T-S-RSTE-KS-KT---------N-----P-W-NWP-WA------------V-T---TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq487 ----M--NEELFASFITPT-LTGLPVVILIILFQGILFPS--SNRLINNRLISFQLCLHNWFLKQMMTMHNNKGRTWSLMLVSLIMFIGSTNLLGLLPHTFTPTTQLSMNLGMAIPLWAGAVITGFRHKLN-QSLAHFLPQGTPIPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLMHLIGGATLVLTSISPPTAMITFIILILL---TILEFAVALIQDYMFNILVSIYLHDN-T-M-PQLDTSTWFTTILSTS-FSIIHRLQLKLT-TH-IFSPNP-----TPK-DLKT-LKHHN---------------P-W-DKK-WTKSYLPLSLHQH-M-FI--NRWFFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSLWLLPPSFLLLSASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq488 ----M--TLSFFDQFASPT-HLGIPLVLLALVLPWTLYPT-PSSRWLGNRLIALQSWFFNRFTQQLFLPLNREGHKWATILMSLMIFLITLNMLGLLPYTYTPTTQLSMNMGFAVPLWLATVLIGMRNQPT-HALGHLLPEGTPVLLIPVLVIIETISLFIRP--LALGVRLTANLTAGHLLMQLIATATFVLLSIMPGVAVLTAILLLML---SLLEVAVAMIQAYVFILLLSLYLQEN-V-M-PQLDPAPWFMTLVFSW-AVFLVVIPPKVT-AH-VFPNEP-----S-A-RTAE-TL-EH---------K-----P-W-HWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq489 ----M--NENLFASFITPT-LMGLPIVVLIIMFPTILFPS--SNRLINNRLIAIQQWLIHLTSKQMLSIHNQKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVVLGFRHKTK-ASLAHFLPQGTPIPLIPMLVIIETISLFIQP--IALAVRLTANITAGHLLIHLIGGATLALMSISKATALITFIILVLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITILSMV-LTLFIIMQLKVS-KH-SYYSTP-----EPM-TTKA-LKQTT---------------P-W-ESK-WTKIYSPLSLPLR-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq490 ----M--MVSLFDQFVSPT-HLGMPLIVIAITLPWVLYPT-PSSRWINNRLITIQGWLINRFTSQLMLPLNVGGHKWALLLTSLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-MIFLTIAPTGMV-NH-VFTNEP-----T-P-VSAE-KH-KN---------E-----S-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLVASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq491 ----M--NENLFASFATPT-LMGLPIVIPIIMLPTLFFKT--TNKLINNRVTTAQQWLIKLITKQMMFTHSPKGRTWSLMLTSLIIFIGSTNLLGLLPHTFTPTTQLSMNLGMAIPMWAGAVILGFRHKTK-ASLAHFLPQGTPIILIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLVLTTISPSTASITFLILTML---TILELAVAMIQAYVFTLLVSLYLQDN-T-M-PQLDTSTWSTVIMASL-VTLFIILQLKLS-LF-SLTPAP-----SLK-QTKL-NKTHN---------------P-W-DKK-WTKIYLPLSLPLH-M-FI--TRWLFSTNHKDIGTLYLMFGAWAGMVGTALSILIRAELGQPGALLGDDQIYNVVVTRHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq492 ----M--TLSFFDQFSSPT-HFGVPLMALALTLPWILFPT-PSARWLNNRLITLQGWFINRFTQQLLLPLNLAGHKWAAILASLMLFLISLNMLGLLPYTFTPTTQLSLNLGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPTPLIPILIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVLLTIIPPKIL-NH-TFPNEP-----S-T-LSAQ-KT-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq493 ----M--NENLFTPFTTPT-LLELPVVVPIILFPTLLLPT--SKYLINNRLITIQQKLVQLILKQMMVIHNTKGQTWSLMLMSLIIFIASTNFLGLLPYSFTATTQLSMNLAMAIPLWAGTVITGLRFKTK-SSLAHFLPQGTPTPLIPALVIIETISLFIQP--MALAVRLTANITAGHLLMHLIGSATLALLTISLLATSLTLVLLVML---TILEMAVALIQAYVFTLLVSLYLHDN-T-M-PQLNTSTWFITIMAML-PALYLIMQLKLL-NT-TYHFSP-----SQK-VLSM-QTTNN---------------S-W-QLK-WTKIYLPHSQPQHSM-LI--NRWLFSTNHKDIGTLYLLFGAWAGTAGMAMSLLIRAELGQPGNLLGNDHIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLLASAMVEAGAGTGWTVYPPLAGNFSHPGAS [...]
+Seq494 ----M--VLSFFDQFMSPT-YLGIPLIALAIALPWTLYPT-PTERWLNNRVLTLQGWFINRFTQQLLLPLNQGGHKWAVLLTSLMVFLLTINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVVLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-AH-NFNNEP-----T-T-VGAE-KS-KP---------E-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq495 ----M--NLSFFDQFMSPT-LMGIPLITLAISIPWLLLPT-PTNRWLNNRVITLQSWFINRFTQQLMQPLNQGGHKWAVLLTAMMLFLITINLLGLLPYTFTPTTQLSMNMGFAIPLWLATVLVGLRNQPT-TSLGHLLPEGTPGPLIPILIIIETISLFIRP--IALGVRLTANLTAGHLLMQLIATAAFVVWPIMPAVAALTFTVLFLL---TLLELAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWLMILMLSW-IGFLLILASKII-AH-TYLNEP-----T-T-QNTE-KL-TA---------Q-----P-W-TWP-WT------------V-TI--TRWFFSTNHKDIGTLYMIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVLVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq496 ----M--TLSFFDQFLSPT-YLGIPLILVALTLPWLLFPA-PSPRWLNNRLLTIQGWFISRFTQQLLLPINVGGHKWALIFASLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMHNQPT-HALGHLLPEGTPTALIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVALLTSLLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLMIFVFSW-LVFLAVIPPKIL-AH-NFTNEP-----T-P-QTTE-TM-KP---------S-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq497 ----M--NENLFASFTTPT-MMGLPIVVLIIMFPSILFPS--PNRLVNNRLVSLQQWLVQLTSKQMLAIHNHKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRRKTK-ASLAHFLPQGTPGPLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGGAALALMNISTPVALITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFVTIVSMI-MTLFIVFQLKIS-KH-LYLSNP-----EPK-PMAM-LKQPN---------------P-W-EKK-WTKIYSPLSLPQQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq498 ----M--TLSFFDQFMSPT-YLGIPLIAIALSLPWILYPK-PTPRWLNNRLITLQGWFINRFTQQIFQPLSLGGHKWAALLASLMLFLITLNMLGLLPYTFTPTTQLSLNMAFAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTAVLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-AH-TFPNDP-----T-L-QSTE-KP-KT---------E-----P-W-SWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGPS [...]
+Seq499 ----M--NENLFTSFASPT-MMGLPIVTLIILFPSALFPS--PGRLINNRFTSIQQWLVQLTSKQMMMIHNHKGQAWTLMLMSLIMFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVAMGLRHKTK-ASLAHFLPQGTPSPLIPTLVIIESISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALTNISMIAALITFIILVLL---TVLEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFTTIVSMI-LTLFIVFQLKIS-KH-HFPMSP-----ELK-PLSA-PKTNI---------------P-W-EKK-WTKIYSLLSLPLQ-M-FV--NRWLFSTNHKDIGTLYLLFGAWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSLVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq500 ----M--ALNFFDQFMSPT-LIGIPLIALALTLPWILYPT-PSARWLNNRVLTLQGWFLNRFTQQLLLPVNLGGHKWAALFTSLMIFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTPLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPTVAILTATLLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILVLSW-LVFLVTIPPKVL-SH-TYPHDP-----A-T-QSAE-KP-KT---------D-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGTPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq501 ----M--NLSFFDQFMSPC-LMGIPLILLSMLFPALLLPS-PNNRWLPNRLSTLQLWLLLTITKQLMTPLNKKGHKWAMILTSLMMMLLMINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRHQPS-VSLGHLLPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATMALLPLLPTVSVLTATVLLLL---TILEIAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWLFIMLTSW-LTLSLIIQPKLL-SF-TTTNPP-----S-H-KPTM-TT-KT---------T-----P-W-TWP-WI------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMIGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq502 ----M--NLSFFDQFTSPC-LLGIPLILLSMLFPALLLPM-PGNRWVTNRLSTLQLWLFHLITKQLMIPLNKAGHKWALILTSLMVLLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ISLGHLLPEGTPTLLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATTALLPIMPTVSILTTSILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFPIMLMSW-LILSLIIQPKLL-HF-TTTNHP-----S-N-KPQM-TS-QT---------T-----P-W-AWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq503 ----M--ILNFFDQFTSPC-LLGIPLILISMLFPTLLLPS-PTNRWITNRLSTLQLWFIHLTTKQLMLPLNKGGHKWALILASLMMLLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPT-TSLGHLLPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTASTVLLPILPTVSALTTLILLLL---TILEIAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWLLIMLSSW-LIFTLIIQPKLL-PF-TSTNAP-----S-N-KPTA-AI-TP---------S-----P-W-NWP-WS------------VTLI--NRWLFSTNHKDIGTLYLIFGAWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNMAHAGAS [...]
+Seq504 ----M--ILSFFDQFTSPC-LLGIPLILISMLFPTLLLPS-PTNRWITNRLSTLQLWFIHLTTKQLMLPLNKGGHKWALILVSLMMLLLTTNLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPT-TSLGHLLPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTASTVLLPILPTVSILTTLILLLL---TILEIAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWLLVMLSSW-LIFTLIIQPKLL-PF-TPTNAP-----S-N-KPTT-AT-TP---------S-----P-W-NWP-WS------------VTLI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLASNMAHAGAS [...]
+Seq505 ----M--VLNFFDQFMSPT-HLGIPLIVLALSLPWVLFPT-PSARWVNNRLLTIQGWFINRFTQQLLLPLNVGGHKWALMFTSLMVFLIMLNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-AALGHLLPEGTPILLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLTPMMPTVAILTTTVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLAILLFSW-LMFLIIIPTKVM-GH-LYSNEP-----S-V-QSAE-KP-KP---------E-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYFVFGAWAGMVGTALSLLIRAELSQPGAFLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLSSSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq506 ----M--MVSFFDQFASPS-FLGIPLIAIAIALPWVLFPT-PPSRWVNNRLITVQTWFINRFTNQLMLPLNIGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IVFLTIIPTKIL-NH-TAPNEP-----T-P-MSEE-KH-KT---------E-----P-W-NWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq507 ----M--NENLFAPFITPS-IMGITTLPIIIMFPCLILST--PKRWIPNRIQTLQMWLIRLITKQMMTMHNKLGRTWTLMLMSLILFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWMGTVLMGFRNKPK-ASLAHFLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSISMTVSSITFMILFLL---TILEFAVAMIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWLLVIFLMT-ISLFCAYQLKMK-NQ-DMTSIT-----ALDTRPDY-PKTLL---------------P-W-EAK-WTKIYLPPSSPLQSM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLIGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq508 ----M--MASFFDQFASPS-FLGIPLIAVAIALPWVLFPT-PSSRWMNSRLTTLQAWFINRFTNQLLMPLNVGGHKWALLLTSLMVFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAVVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-FIFLTIIPTKVL-NH-LTPNEP-----A-P-MSEE-KH-KT---------D-----S-W-NWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq509 ----M--NLSFFDQFSSPY-LLGIPLIPLSLLFPTLLLPS-PNNRWVTNRLSTLQLWLANLITKQLMTPLNKAGHKWALLLTSLMLFLLSINLLGLLPYTFTPTTQLSMNMALAVPLWLATLLTGLRNQPS-ASLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATVTLLPMMPSISALTALILFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFTILLLTW-FSFSLLIQPKLL-TF-TTTNPP-----L-N-KTQ--PT-KP---------T-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGTWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq510 ----M--DQNLFASFITPT-MAGLPIVIFIVMFPYIMISA--PTRLISNRMTSMQQWLIQLILKQLMVTHNTKGRTWSLMLISLIIFIGSTNLLGLLPHTFTPTTQLSMNLAMAIPLWAATVITGFRHKTK-ASLAHFLPQGTPPLLIPMLVLIETISLLIQP--MALAVRLTANITAGHLLMHLIGGATLAISSISSVAASITFIILILL---SILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWTITIMSMI-LTLFILFQLKLS-KF-MYPTNP-----TKK-LTKP-HKLES---------------P-W-EMK-WTKTYLPHSLPLQ-M-FI--NRWLYSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq511 ----M--NENLFSSFITPS-IMGLPIVIIIIMFPIILFPT--PTRLINNRLITIQQWLVQLILKQMMLIHNPKGRTWSLMLISLIMFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRYKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLMHLIGGATLALTSISPPTATITFIILLLL---TGLEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITILSML-VSLFSLIQLKFH-KY-TFPTNP-----SPT-GLKT-TKQIT---------------P-W-ETK-WTKIYSPLSLPHQLM-FI--NRWLFSTNHKDIGTLYMLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGVGTGWTVYPPLAGNLAHAGAS [...]
+Seq512 ----M--NENLFSSFITPS-IMGLPIVILIIMFPIILFPT--PTRLINNRLIAIQQWLVQLILKQMMLIHNPKGRTWSLMLISLIMFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRYKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLMHLIGGATLALTSISPATATITFIILLLL---TGLEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITILSML-VSLFSLIQLKFH-KY-TFPANP-----SPA-SLKS-TKQIT---------------P-W-ESK-WTKIYSPLSLPPQLM-FI--NRWLFSTNHKDIGTLYMLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGVGTGWTVYPPLAGNLAHAGAS [...]
+Seq513 ----M--ALNFFDQFESPV-LLGIPLMAVALTCPWILFPN-PTPQWLSNRLLTLQNWLIKVYTQQLLTPLNLPGHKWALLFTSLMLFLMSLNILGLLPYTFTPTTQLSLNMALAVPLWLATVIIGLRTQPT-AALGHLLPEGTPPLLIPILIVIETISLLIRP--LALAVRLTANLTAGHLLIQLIATGTLVLFSLMPPVALLTATVLFLL---TLLEVAVALIQAYVFVLLLSLYLHEN-V-M-PQLNPAPWLIIMVFTW-LVFLAILPPKVL-AH-DFPNEP-----T-T-QSTK-KS-EP---------S-----P-W-SWP-WP------------V-AT--TRWFFSTNHKDIGTLYMVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq514 ----M--MLSFFDQFMSPT-YMGIPLIALAIALPWTLYPT-PTSRWLNNRVLTLQGWFINRFTQQLLLPLNPGGHKWAVLLTSLMLFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-AH-NFNNEP-----T-T-VGAE-KA-KP---------E-----P-W-TWP-WY------------V-GI--TRWFFSTNHKDIGTLYLVFGAWPGMVGTALSLLIRAELSQPGALLGDDQIYNVIGTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq515 ----M--NENLFTSFTSPT-MMGFPVVMLIILFPSIMFPS--PDRLINNRLASIQQWLIQLTSKQMMSIHNHKGQTWTLMLMSLIMFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRYKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--IALAVRLTANITAGHLLMHLIGGATLALTNISMTTALITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFTVIVSTI-LTLFIVFQLKIS-KH-SLQTSL-----ELK-STLP-LKTNA---------------P-W-DKK-WTKIYLPLSLPLP-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMTGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq516 ----M--NLSFFDQFMSPS-LLGLPLVVLSMMFPLLLISA-QMKQWITNRMHTTQLQFSYGFTKQLLSPLNTKGHKWSLLLLSLMLILMSINMLGLLPYTFTPTTQLSMNLGLAMPLWLATILIGARNQPT-ITLGHLLPEGTPMLLIPTLIIIETISLLIRP--LALGVRLTANLTAGHLLIQLISTATFFLSSMMTTVAMMTATVLLLL---TMLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPRPWFFILVLSW-LIYLMVIQ-LTK-NL-NMLNEL-----T---SKNN-MY-MT---------Q-----P-W-YWP-WT------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLSHAGSS [...]
+Seq517 ----M--TLSFFDQFMSPT-YLGIPLIAVALTLPWILFPT-PSARWLNNRLITLQGWFINRFTQQLLLPLNLGGHKWAALLTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTSIVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-GH-TFTNEP-----T-S-QSTE-KA-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLSSSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq518 ----M--TLSFFDQFMSPT-YLGIPLIAVALTLPWILFPT-PTARWLNNRLITLQGWFINRFTQQLLLPLNLGGHKWAALLTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTSIVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIAPKVL-GD-TFTNEP-----T-S-QSTE-KG-KP---------D-----P-G-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLSSSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq519 ----M--TLSFFDQFMSPT-YLGIPLIAVALTLPWILFPT-PSARWLNNRLITLQGWFINRFTQQLLLPLNLGGHKWAALLTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTSIVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-GH-TFTNEP-----T-S-QSTE-KA-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLSSSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq520 ----M--TLSFFDQFMSPT-YLGIPLIAVALALPWILFPT-PSARWLNNRLITLQGWFINRFTQQLLLPLNLGGHKWAALLTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTSIVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-GH-TFTNEP-----T-S-QSTE-KA-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLSSSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq521 ----M--TLSFFDQFMSPT-YLGIPLIAVALTLPWILFPT-PSARWLNNRLITLQGWFINRFTQQLLLPLNLGGHKWAALLTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTSIVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-GH-TFTNEP-----T-S-QSTE-KA-KP---------A-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLSSSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq522 ----M--TLSFFDQFMSPT-YLGIPLIAVALTLPWILFPT-PSARWLNNRLITLQGWFINRFTQQLLLPLNLGGHKWAALLTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTSIVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-GH-TFTNEP-----T-S-QSTE-KA-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLSSSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq523 ----M--TLSFFDQFMSPT-YLGIPLIAVALTLPWILFPT-PSARWLNNRLITLQGWFINRFTQQLLLPLNLGGHKWAALLTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTSIVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-GH-TFTNEP-----T-S-QSTE-KA-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLSSSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq524 ----M--TLSFFDQFMSPT-YLGIPLIAVALTLPWILFPT-PSARWLNNRLITLQGWFINRFTQQLLLPLNLGGHKWAALLTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTSIVLFLL---TLLEIAVAMIHAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-GH-TFTNEP-----T-S-QSTE-KA-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLSSSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq525 ----M--TLSFFDQFMSPT-YLGIPLIAVALTLPWILFPT-PTARWLNNRLITLQGWFINRFTQQLLLPLNLGGHKWAALLTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTSIVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-GH-TFTNEP-----T-S-QSTE-KA-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLSSSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq526 ----M--NLSFFDQFMSPT-ILGIPLVMVAMIYPWLLFPY-PTNKWLNNRLTTLQVWFSQKFTKQLFTPVNMKGHKWAMMFLSLMVFIIMINLLGLLPYTFTPTTQLSLNLGLAIPFWLMTVLIGLRNQPT-MTFGHLLPEGTPTLLIPILIMIESVSLIIRP--LALGVRLTANLTAGHLLIQLIATATLVLLPIMPLVSFMTMFILFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWLTIFLMSW-LIFLTTLTMKMN-NL-KCLNEP-----A-S-HSIK-KN-KP---------Q-----S-W-NWP-WI------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq527 ----M--MLNFFDQFMSPT-YMGIPLMAVALVLPWTLYPT-PSLRWLNNRLLTLQGWFINRFTQQLFLPINTGGHKWAILLTSLMLFLLTINLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPLPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVALLTTTVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPTPWFAILVFSW-VIFLAIIPTKVM-GH-IFNNEP-----N-P-QTAK-KP-QL---------S-----S-W-TWP-WY------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq528 ----M--MLNFFDQFMSPT-HLGVPLMALALTLPWLLLPA-PSTRWLNSRLITLQSWFINQFTRQLLLPLNLAGHKWAAVLTSLMLFLITLNMLGLLPYTFTPTTQLSLNLGFAFPLWFATVLIGMRNQPT-TALGHLLPEGTPTPLIPILIIIETVSLLIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPAVAILTAIILFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFIILVFSW-LVFLVVLPPKVL-SH-TPTNQP-----D-A-LNTQ-KP-KP---------E-----P-W-DWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq529 ----M--MASFFDQFASPS-FFGVPLIAVAIALPWVLFPT-PPSRWVNNRLITIQTWFINRFTNQLMMPLNVGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IIFLTIIPTKVL-NH-TSPNEP-----T-P-MSEE-AH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGLGKGLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq530 ----M--MASFFDQFASPS-FFGIPLIAVAIALPWVLFPT-PPSRWINNRLITIQTWFINRFTNQLMMPLNVGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IIFLTIIPTKVL-NH-TSPNEP-----A-P-MSEE-AH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq531 ----M--TLSFFDQFMSPT-YLGIPLIALALSLPWILYPK-PTTRWLNNRLITLQGWFINRFTQQIFQPLSLGGHKWAVLLASLMLFLITLNMLGLLPYTFTPTTQLSLNMALRCTPLLATVIIGMRNQPT-HALGHLLPEGTPTPLIPILIIIETISLFIRPSHLEFDYRKSYSWSSSYSLI----APRFVFFPYTYS-GNPNWSLLFLL---TLLEVAVAMIQAEVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-AH-TFPNDP-----T-L-QSTE-KP-KT---------E-----P-W-TWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq532 ----M--TLSFFDQFMSPT-YLGIPLIALALSLPWILYPK-PTTRWLNNRLITLQGWFINRFTQQIFQPLSLGGHKWAALLASLMLFLITLNMLGLLPYTFTPTTQLSLNMAFAVPLWFATVIIGMRNQPT-HALGHLLPEGTPAPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTAMLLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-AH-TFPNDP-----T-L-QSTE-KP-KT---------E-----P-W-TWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq533 ----M--NENLFAPFITPT-VLGISVLPLIMIFPCLLFST--SNRWVPNRLIALQLWLVRLITKQMMMMHNKQGRMWTLMLITLIIFIASTNLLGLLPYTFTPTTQLSMNMGMAIPLWMGTVLMGFRNKPK-ASLAHFLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSISLTVSTITFTILFLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWYTTILLMI-LAIFCIFQLKMI-KH-LYMNVP-----LILNQELF-IKHQT---------------P-W-HSK-WTKIYLPPSLLLQSM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMAGTALSILIRSELGQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLVSSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq534 ----M--NENLFASFATPT-LMGLPVVLLIIMFPMLLYPP--SNRLITNRLSAIQQWLVKLILKQLMSIHNTKGRTWSLMLISLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVIMGFRHKTK-SSLAHFLPQGTPIPLIPMLIIIETISLFIQP--MALAIRLTANITAGHLLMHLIGGATLALMSISTTTAFITFIILLLL---TMLEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTTPWFITILSMI-ITLFILFQSNMS-KY-LYPLEP-----QPK-TLKT-QLYNA---------------P-W-ETK-WTKIYLPHSLHLH-M-FV--NRWLYSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq535 ----M--NENLFSSFATPT-LMGLPIVALIIMFPTLLFPS--PSRLINNRLVSTQQWLAQLILKQMMLMHSPKGRTWSLMLISLIMFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRYKTK-ASLAHFLPQGTPIPLIPMLIVIETISLFIQP--MALAVRLTANITAGHLLMHLIGGAALALVSISPTTALITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFTTIVAMI-LSLFILMQLKFH-KY-TYPMNP-----VLK-ALES-TSFPC---------------P-W-ETK-WTKIYSPLSLP-QHM-FV--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq536 ----M--TLSLFDQFMSPT-LLGVPLIGLALALPWVLFFQ-PGARWMNNRLVTLQAVFMNWFVKQIFQPMSLGGHKWAALLMSLMLFLITLNMLGLLPYTFTPTTQLSLNMAFAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTALIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLFPMMPSVAILTSILLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAIMVFSW-LVFLAVLPPKVL-AH-YFPNDP-----T-P-QSVK-KS-KS---------E-----T-W-TWP-WL------------V-AI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq537 ----M--TLSFFDQFSITS-FLGIPLIALALTLPWILYPT-PQNRCMNNRLLTLQSWFIRQFTHQLFLPINQGGHKWALLLASVLIFLITLNLLGILPYTFTPTTQLSMNMGFAIPLWLATILIGARYQPT-HTLAHLLPVGTPAPLIPILIMIETISLFIRP--IALGVRLTANLTAGHLLIQLISTAAFHMFFMMPTVATLTMILLLLL---SVLELAVAVIQAYVFVLLVSLYLQES-V-M-PQLNPAPWLLIFLFSW-LVLLTMIPPKIL-KH-HFTNEP-----T-S-QTTE-KQ-PL---------A-----P-W-NWP-WH------------V-KI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq538 ----M--TLSFFDQFMSPT-YLGVPLIALALALPWVLYPA-PSARWLNNRLLTLQGWFINRFTQQLLLPLNLGGHKWATILTSLMIFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPSLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFMILVFSW-FIFLTLIPPKVM-AH-NFPNEP-----S-P-QAAE-TL-KT---------K-----S-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq539 ----M--NENLFASFITPM-MFGLPLVTLIVLFPSLLFPT--SNRLVNNRLISLQQWMLQLVSKQMMSIHNTKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWGGAVITGFRNKTK-ASLAHFLPQGTPTPLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLIHLIGGATLALMSINTTTALITFIILILL---TVLEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLTMILSMF-LVLFIIFQLKIS-KH-NFYHNP-----ELM-TTKT-PKQNT---------------P-W-ETK-WTKIYLPLSLP-L-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq540 ----M--NMNMFEQFMSPE-FALLPTMPLSILIPFFLVYH--KPKLLENRMTTAISWFLKMFMLNMTSQLPLKGQKWSRLLASLLLLILLSNLLSLLPYTFTPTSQLSMNMTLALPLWLATVITGLKNKPS-LTLAHLLPEGSPTLLIPFMILIETVSLLMRP--IALGVRLTANITAGHLLMTMVSSATIDLINTYISLSPLALTLLFLL---TLLELAVACIQAYVFVLLIILYLQEN-T-M-PQLDITHILLIYLWTW--LTLALITLKIK-TF-MLTNKP--------KNYLPLKPQLT-----------------TSPTP-WT------------V-YI--TRWLFSTNHKDIGTLYLMFGAWSGLIGACLSILMRMELTQPGTLFGSDQIFNVLVTAHAFIMIFFMVMPIMIGGFGNWLIPLMIGTPDMAFPRMNNMSFWLLPPALLLLLSSSYIEAGAGTGWTVYPPLSGNLVHSGPS [...]
+Seq541 ----M--NLSFFDQFLSPS-MMGIPLMMMAMLLPWLLFPT-PTNKWLNNRLSTLQIWFSQAFAKQLMSPISINGHKWAMILTSLMVFLITINLLGLLPYTFTPTTQLSLNLGLAVPFWLATILIGLRNQPS-MTFGHLLPEGTPILLIPILIIIETISLLIRP--LALGVRLTANLTAGHLLIQLIATATLVLLPMMPMVSLMTMMVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWYAIFLMSW-LVFLLILTFKIS-KF-NNLNEP-----M-S-HNTK-KI-KP---------E-----S-W-NWP-WI------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq542 ----M--MASFFDQFSSPF-FMGIPLMALALLLPWVLLPT-PTSRWLNNRLLTLQGWFLGMFTRQLFLPINHPGHKWALILASLMIFLLSLNLLGLLPYTFTPTTQLSINLGFAVPLWLATVLIGMRNQPN-LSLAHLLPEGTPLLLIPILIVIETISLMIRP--LALGVRLTANLTAGHLLIQLISTGLFVLFSSQPTVVLLTGALLLML---SLLEVAVAIIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-VIFLTILPLKVG-AH-TFPNEP-----T-L-QSTD-TP-KT---------E-----S-W-TWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq543 ----M--MLSFFDQFSSPF-FMGIPLMALALVLPWTLFPA-PSSRWLNNRLATLQGWFVSSFARQLLMPVNQPGHKWALILTSLMVFLLGLNLLGLLPYTFTPTTQLSINLGFAVPLWLATVLIGFRYQPN-FSLAHLLPEGTPLLLIPVLIIIETISLMIRP--LALGVRLTANLTAGHLLIQLISTGMFVLLPLQPTVAILTGVLLLML---SMLEVAVAVIQAYVFILLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-VIFLTILPPKIM-AH-TFPNEP-----T-L-QSTE-KP-KT---------E-----P-W-TWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMGMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq544 ----M--MLSFFDQFSSPF-FMGIPLMALALVLPWILFPT-PSSHWLNNRLTTLQSWFVSSFARQLLMPVNQPGHKWALILTALMVFLLGLNLLGLLPYTFTPTTQLSINLGFAVPLWLATVLIGFRYQPN-FSLAHLLPEGTPLLLIPVLIIIETISLMIRP--LALGVRLTANLTAGHLLIQLISTGMFVLLPLQPTVAILTGILLLML---SMLEIAVAVIQAYVFILLLSLYLQEN-V-M-PQLNPAPWFNILVFSW-VVFLTILLPKVL-AH-TFPNEP-----T-L-QSTE-KP-KT---------E-----P-W-TWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq545 ----M--NENLFASFAAPT-ILGLPAAVLIILFPPLLVPT--SKHLINNRLITTQQWLIQLTSKQMMTMHNTKGRTWSLMLVSLIIFIATTNLLGLLPHSFTPTTQLSMNLAMAIPLWAGTVVMGFRFKTK-NALAHFLPQGTPTPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLMHLIGSATLALSTISLPSTLIIFTILILL---TVLEIAVALIQAYVFTLLVSLYLHDN-T-M-PQLNTAVWPTTITPML-LTLFLITQLKML-NS-NYHLPP-----SPK-PMKM-KNYNK---------------P-W-EPK-WTKICSLHSLPPQSM-FT--DRWLFSTNHKDIGTLYLLFGTWAGVLGTALSLLIRAELGQPGNLLGNDHIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASAMVEAGAGTGWTVYPPLAGNYSHPGAS [...]
+Seq546 ----M--NENLFASFAAPT-ILGLPAAVLIILFPPLLVPT--SKHLINNRLITTQQWLIQLTSKQMMTMHSTKGRTWSLMLVSLIIFITTTNLLGLLPHSFTPTTQLSMNLAMAIPLWAGAVVMGFRFKTK-NALAHFLPQGTPTPLIPMLVIIETISLLIQP--MALAVRLTANITAGHLLMHLIGSATLALSTINLPYALIIFTILILL---TILEIAVALIQAYVFTLLVSLYLHDN-T-M-PQLNTAVWPTMITPML-LTLFLVTQLKML-NS-NYHLPP-----SPK-PMKM-KNYNK---------------P-W-EPK-WTKIYSLHSLPPQSM-FT--DRWLFSTNHKDIGTLYLLFGAWAGVLGTALSLLIRAELGQPGNLLGNDHIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASAMVEAGAGTGWTVYPPLAGNYSHPGAS [...]
+Seq547 ----M--NLSFFDQFASPC-LLGIPLILLSILFPALLFPS-PTNRWVTNRLSTLQLWLISLTTKQLMMPLNKKGHKWALTLTSLMMFLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLMGMRYQPT-TSLGHLLPEGTPTPLIPALILIETISLLIRP--LALGVRLTANLTAGHLLIQLISTATIALLPILPSVSILTASVLLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWLLIMLMSW-MTFTLIIQPKLL-QL-TQANTP-----T-N-KLVM-TN-TT---------P-----S-W-TWP-WT------------MTFI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSTVEAGAGTGWTVYPPLASNMAHAGAS [...]
+Seq548 ----M--ALNLFDQFMSPT-HLGIPLIAIALTLPWILVPS-PTSRYQNNRLISLQNWFIKTFTQQLLMPLNQGGHKWAMILASLMVFILMMNILGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGLRNQPT-AALGHLLPEGTPALLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATITLIPMMTTVAALTAILLVLL---TLLEVAVAVIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTVIPNKVL-NH-TFTNEI-----T-T-LSTE-KL-KS---------D-----T-W-NWP-WH------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELAQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq549 ----M--AMSFFDQFASPS-YLGIPLIAIAISLPWVLYPT-PSSRWVNNRLITIQGWLINRFTNQLMLPLNVGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTIIPTKVL-NH-ISPNEP-----T-P-LNAE-KH-KT---------E-----P-W-DWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq550 ----M--NENLFTSFITPM-MLGLPLATLIVLFPSLLFPT--SNRLINNRLISLQQWMLQLVSKQMMSIHNIKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRNKTK-ASLAHFLPQGTPTPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMSISTTTALITFIILILL---TILEFAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLTMILSMF-LTLFIIFQLKIS-KH-NFYYNP-----EPS-LTKM-LKQNT---------------P-W-ETK-WTKIYLPLSLP-L-M-FI--NRWLYSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq551 ----M--TLSFFDQFSLTS-FMGVPLVALALTLPWILWPT-PQNRCLNNRLITLQSWFIRQLTNQLFMPINQNGHKWALLLASLLVFLISLNLLGILPYTFTPTTQLSMNMGLAVPLWLATVLIGARNQPT-HTLAHMLPTGTPGPLIPVLIIIETISLFIRP--IALGVRLTANLTAGHLLIQLISMATFVMLFMSPAVSAITMILLFLL---SILELAVAIIQAYVFVLLLSLYLQES-V-M-PQLNPTPWFLMLLFSW-LVFL-MIPQKIM-KH-HFSTDP-----S-T--SNA-KE-QT---------S-----P-W-TWP-WH------------V-TM--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq552 ----M--NENLFTSFSAPT-ILGQPATIPIIMFPTLLIPT--SKHLINNQLTTVQQNLIKLTLKQMMAPHNAKGQSWSLMLMSLITFITMTNLLGLLPHSFTPTTQLSMNLAMAIPLWAGTIITGLRFKTK-NFLAHMLPQGTPTPLIPMLVMIETISLLIQP--MALAVRLTANITAGHLLMHLIGNTMLTLSTINLSTTLLTSVLLMLL---TILEIAVALIQAYVFTLLVNLYLHNN-T-M-PQLDTSTWFTIIMAML-PTLYLITQLKLL-SM-NYYQPP-----LTK-NPNL-QTHNT---------------C-W-RPK-WTKTYLPHSQPQQSM-LI--NRWLFSTNHKDIGTLYLLFGAWAGVTGMALSLLIRAELGQPGNLLGNDHIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLMASTAVEAGAGTGWTVYPPLSGNFSHPGAS [...]
+Seq553 ----M--TLSFFDQFMSPV-FLGIPLIALALTLPWILFPT-PTSRWLNNRLLALQSWFINRFTQQLLLPLSLGGHKWAILLTSLMLFLISLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVLIGLRNQPT-IALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLMPLMPTVAILTGTLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTILIFSW-MIFLIVIPPKVM-AH-TFPYEP-----T-P-QSAE-KP-KT---------D-----S-W-NWP-WH------------V-AT--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq554 ----M--TLSFFDQFMSPT-FMGIPLIIVALSLPWILYPT-PSSRWINNRVTTLQGWFINRFTQQMFLPLNQNGHKWAILMASLMLFLITLNMLGLLPYTFTPTTQLSLNMGFAVPLWLATVLIGMRNQPT-MALGHLLPEGTPTPLIPFLIIIETFSLLIRP--IALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTTITLFLL---TLLEVAVAMIQAYVFVLLLTLYLQEN-I-M-PQLNPAPWFTILLFSW-LVFLTVIPPKVM-KF-TFNNEP-----A-P-MSTK-KS-PT---------E-----P-W-NWP-WH------------V-TV--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLMGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq555 ----M--MLSFFDQFMSPV-YLGIPLIALAIILPWALFPT-PSSRWMNNRLLTLQGWFINRFTSQLLLPLNLGGHKWATLFASLMIFLLSINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTALIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPMIAISTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFMILVFSW-MVFLTIIPPKVL-AH-TFPNEP-----T-P-QSTQ-KP-KT---------E-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq556 ----M--NLSFFDQFMSPI-MFGTPLVTLALLLPWLLFHK-TTNHWLSNRLLTTQTWFFGMFTKQLMLPINIKGHSWSLLLAALMMFLITTNLMGLLPYTFTPTTQLSLNLGLAVPLWLATVLTGLRNQPT-HALGHMLPEGTPTPLIPILVIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAVLVLMPLMPSISIMTMIILFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFTIFLMSW-VIYLIILTAKIN-NF-NFQNEP-----T-P-QNTK-KE-KH---------S-----P-W-NWP-WT------------V-MI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq557 ----M--MLSFFDQFSSPF-FMGIPLMALALILPWTLFPA-PSSRWLNNRLATLQGWFVSSFTRQLLLPVNQPGHKWALILTSLMVFLLGLNLLGLLPYTFTPTTQLSINLGFAVPLWLATVLIGFRYQPN-FSLAHLLPEGTPLLLIPVLIIIETISLMIRP--LALGVRLTANLTAGHLLIQLISTGMFVLLPLQPTVAILTGVLLLML---SLLEVAVAMIQAYVFILLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-VIFLTILPPKVM-AH-TFPNEP-----T-L-QSAE-KP-KT---------E-----S-W-TWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq558 ----M--TLSFFDQFSSPM-LMGIPLILVALLLPWLLLPT-PTRRWLSNRLLTIQGWFISQFSQQLLHPLSPAGHKWALLFASLMLFLISINMLGLLPYTFTPTTQLSLNLGLAVPLWLATVIVGMRNQPT-QSLAHLLPEGTPTTLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAAFLLLPLMPAVAALTTLLLFFL---TLLEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLDPNPWLSIFLLTW-SVFLVVLPTKIL-AH-NFPNEL-----I-L-QITE-AT-KA---------N-----S-W-NWP-WL------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq559 ----M--MASFFDQFASPS-FLGIPLIAVAIALPWVLFPT-PPSRWVNNRLITIQTWFINRFTNQLMLPLNVGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IVFLTIIPTKVL-GH-TAPNEP-----T-P-MSEE-KH-KT---------E-----S-W-NWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq560 ----M--MLSFFDQFMSPT-YMGIPLIALAIALPWTLYPT-PTSRWLNNRVLTLQGWFINRFTQQLLLPLNPGGHKWAVLLTSLMLFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPTVAILTATGLFLL---TLLEVAGAMIQAYVFGLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-AH-NFNNEP-----T-T-VGAE-KA-KP---------E-----P-W-TWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTGLSLLIRAELSQPGALLGDDQIYHVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq561 ----M--NLSLFDQFASPI-FLGFPLIIIAMLFPTLIFPS-PSSRWLNNRLLAAQTWFISNVTKQIFLPISLPGHKWALMLISLMLYLISINLLGLLPYTFTPTTQLSMNMGFAVPMWLATVIIGLRNQPT-MALGHLLPEGTPTPLIPALVIIETISLFIRP--LALGVRLTANLTAGHLLIQLIGMAAFAMLSLAPSVSLIIIIVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAILIFSW-MILLIIMPPKIY-NH-KLLNNP-----S-P-QTMK-KL-HT---------Q-----Y-W-TWP-WT------------V-AI--TRWLYSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSAVESGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq562 ----M--NLTIFDQFLSPQ-ILGLPLMTLAIILPSMMWPS-QNNRWLNNRLSTLQSWFINMITKQLMMPINKSGHQWSTILMSLIILLLTVNLLGLLPYTFTPTTQLSMNMALAIPLWLATVLTGLRNQTT-KSLGHLLPEGTPAPLIPTLIIIETISLLIRP--LALGVRLTANLTAGHLLIQLISTTIIILLPTAPMLSMLTSIILLLL---TLLELAVALIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWLSILLTTW-LVYIMIYQPKII-SL-LQTNNI-------N-HNLK-PL-NI---------N-----S-W-NWP-WT------------V-TL--TRWLFSTNMKTLAP--FIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIETGAGTGWTVYPPLASNLAHVGAS [...]
+Seq563 ----M--NLTLFDQFSSPN-ILAIPLMTISLLMLTIIFPM-KHNRLLTNRLLSIQSKMIHIFTKQLMLPIPKSGHHWALILTSLMTLLLTSNLLGLLPYTFTPTTQLSMNLGFALPMWLATLLIGLRNQPT-MSLAHLLPEGTPTPLIPTLILIESISLMIRP--LALGVRISANLTAGHLLMQLTSSATLSL-SSMPTLSFMTAILLFLL---TILEMAVAMIQALVFVLLLSLYLQENTHNM-PQLNPHPWFSIFITSW-LILIIILLPKIK-SH-IPNNSP-----T-N-KKNM-LT-TP---------M-----P-W-TWP-WT------------V-NL--NRWLFSTNHKDIGTLYLIFGAWAGMIGTALSLLIRTELNQPGNLLGSDQTYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSLLLMLASSAIEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq564 ----M--NENLFAPFITPT-IMGITTLPIVMFFPCLILST--PKRWLPNRIQTLQMWLIRLITKQMMIMHNERGRSWTLMLMSLILFIASTNLLGLMPYSFTPTTQLSMNIGMALPLWMGTVLMGFRNKPK-ASLAHFLPQGTPTPLVPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALASISITISTITFIILLLL---TILEFAVAMIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWLLVIFLMI-MALFCMYQLKML-NQ-KLISIS-----PQNNNITI-TKPQL---------------P-W-EKK-WTKIYLPHSSPLQLM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq565 ----M--TLSFFDQFMSPT-FMGVPLMALALSLPWILYPA-PSARWLNNRLLSLQGWFINRFTQQLLLPLNTGGHKWAALLASLMIFLITLNMLGLLPYTFTPTTQLSLNLGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPGPLIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTSTVLVLL---TLLEIAVAMIQAYVFVLLLTLYLQEN-V-M-PQLNPAPWFAILVFTW-LIFLIIVPTKIL-AH-TYPNEP-----T-S-QSTE-KP-KT---------E-----P-W-TWP-WH------------V-AT--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq566 ----M--TLSLFDQFMSPT-LLGVPLILAAMILPWALLPT-PTTRWLENRMLTLQSWFINRFTQQLLLPLSLAGHKWATILTSLMIFLITINMLGLLPYTFTPTTQLSLNMGLAVPMWLATVIIGMRNQPT-HSLAHLLPEGTPTPLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPLMPTIAILTSVLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFMVLVFSW-LVFLTILPPKIV-AH-TFPNDP-----A-A-QSTE-TT-KT---------E-----P-W-SWP-WL------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq567 ----M--NENLFAPFITPT-ILGITTLPIIMCFPCLLLSS--PKRWLPNRILIMQIWLIRLVTKQMMVMHNKQGRAWTLMLMSLMLFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWLGTVVMGFRNKPK-MALAHFLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSISMTVSTITFTILFLL---TILELAVAVIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWYMTISLMV-VALFCIYQLKML-NH-SLTSIT-----PQDEKPLH-HKIQL---------------P-W-DKK-WTKIYLPHSSPLLSM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLIGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLTSSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq568 ----M--TLDIFDQFTSPT-MFGLPLAWLAMLAPSLMLVS-QTPKFIKSRYHTLLTPILTSIAKQLFLPMNQQGHKWALICMASMMFILMINLLGLLPYTYTPTTQLSMNMGLAVPLWLATVLIGLQKKPT-EALAHLLPEGTPAALIPMLIIIETISLFIRP--IALGVRLTANLTAGHLLMQLVSMTTFVMIPVI-SISIITSLLLLLL---TILELAVAVIQAYVFILLLTLYLQEN-V-M-PQLDPAPWFSMLTVSW-LIIFLLIMPTIL-FY-QPQNTI-----S-T-KQVT-KP-KQ---------S-----T-W-TWP-WH------------V-TH--IRWLFSTNHKDIGTLYLIFGAWAGMVGTALSILIRAELSQPGTLLGDDQIFNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMLGAPDMAFPRMNNMSFWLLPPSLLLLLASAGVEAGAGTGWTVYPPLAGNLAHTGAS [...]
+Seq569 ----MMTSVSLFDQFESPV-LMGLPLVIISLSVPLILYPQ-LTPQWLTNAYSAIQSWFINRATHQILLPLSPAGHKWALLLMSLLVYLITINMLGLLPYSFTPTTQLSMNMALAVPLWLATVILGMRNFTT-RSLAHLVPEGSPTALIPILIIIETISLFIRP--IALGVRLTANLTAGHLLIQLIATATFALMFSSPPTAMITVILFVLM---TILEIAVAMIQAYVFVLLLTLYLQEN-V-M-PQLDPAPWLMISTFAW-INLLVFLPPKIA-TH-IYPKEP-----S---MPQA-KDYIT---------E-----P-W-TW----------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq570 ----M--NENLFASFITPT-MMGLPIVTLIIMFPSLLFPT--PKRLINNRMISIQQWLTQLTSKQMMAIHNQKGQTWSLMLMSLIMFIGSTNILGLLPHSFTPTTQLSMNLGMAIPLWAATVFTGFRHKTK-ASLAHFLPQGTPVPLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLIHLIGGATLALLNINTMVASITFIILIML---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFLTIMSMT-MTLFILFQLKIS-NY-SYPLNP-----EPT-EMKT-QKHST---------------P-W-EMK-WTKIYLPLSLPLR-M-FV--NRWLYSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq571 ----M--NLSFFDQFLSPT-LMGMPLIILSLTLPWLLIPN-PTNKWLGNRLSSLQLWFSCNFTKQLMNPINLNGHKWSLLLMSLMMLLISVNLLGLLPYTFTPTTQLSMNLGLAVPLWLATVLIGVRNQLT-TTLGHLLPEGTPILLIPILILIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAVFVLLPLMPAIATLTAMILLLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFFIFTMLW-LIYLIILLSKTN-NL-KTLNEP-----T-T-QNM--NN-KP---------Q-----S-W-NWP-WI------------V-MI--TRWLYSTNHKDIGTLYLMFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNMAHAGAS [...]
+Seq572 MNLTM--NLSFFDQFASPN-FLGIPLILLSMLFPSLLLPS-PNNRWLPNRLSTLQLWLSHLIAKQLMLPLNKGGHKWALILTSLMMLLLSINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRHQPS-ASLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATMVLLPIMPTVSLLTALILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFLIMLASW-LIFLLMMQPKLL-SL-TSANSP-----S-T-KTNP-AS-KT---------T-----P-W-TWP-WT------------VTFT--NRWLFSTNHKDIGTLYLIFGAWAGMIGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq573 ----M--NENLFATFTTPS-IMGITTLPIIMLFPCLILTS--PKRWLPNRIQTLQMWLIRSVTKQMMTIHNKQGRTWTLMLMSLILFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWLGTVIMGFRNKPK-ASLAHFLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSINMTVSSITFIILLLL---TILELAVAMIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWSLTITMML-ISLFCVYQMKMI-NQ-TMISIT-----PHDKKNIM--KTQL---------------P-W-EKK-WTKIYLPHSLPLPLM-FI--NRWLFSTNHKDIGTLYLIFGAWAGMVSTALSLLIRTELGQPGTLIGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq574 ----M--NENLFAPFICPT-IMGISTLPIIMLFPCLIFST--PKRWLPNRIQILQVWLIRLITKQMMLMHNNIGRTWALMLMTLILFIATTNLLGLLPYSFTPTTQLSMNISMAIPLWMGTVILGFRNKPK-ASLAHFLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSAALALMSINIFLSSITLIILFLL---TILELAVALIQAYVFTLLVSLYLHDN-S-M-PQLETSAWFHVAGLTI-INIFCLFQLQLI-GIEMIYIYP-----PEE-ILKL-PEIPF---------------P-W-EKK-WTKIYLPLSSVLLLM-FI--TRWFFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLIGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq575 ----M--NKNLFTQFITPT-IMDTTMLPMIMYFPCLILST--PKHLFSNRIQTLQIWLIRLITKQMMLLHNKQGQTWTLMLMSLILFISSTNLLGLLPYSFTPTTQLSMNISMAIPLWMATVIMGLRNKPK-TSLAHLLPQGTPTPLIPMLIIIETISLLIQP--LALAVRLTANITAGHLLIHLITSATLALLSINMIASTMTFIIFLML---MILELTVALIQAYVFTLLVSLYLHNN-S-M-PQLNMSMWPLTITLTM-LTFFCMYQLKMI-NQ-TMTSMT-----PKNEKKMP-TKTQL---------------P-W-NKK-WTKIYLPNSLPPQLM-FI--NRWLFSTNHKDIGTMYMLFGAWAGMVGTALSLLIRMELGQPGALIEDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq576 ----M--MMSFFDQFASPS-FLGVPLIAIAIALPWVLFPT-PTSRWMNSRMTTIQAWFINRFTNQLMMPLNVGGHKWALILTSLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-IALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAILVLLPMMPAVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-LIFLLIIPAKLL-NH-LTPNEP-----A-T-VNEE-KH-KT---------N-----P-W-NWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq577 ----M--TLSFFDQFMSPT-YLGIPLIAIALTFPWIMLPA-PSSRWLNNRMITLQSWFINRFTQQLLLPLNLPGHKWALMLTSLMILLLSLNMLGLLPYTFTPTTQLSLNMAIATPFWLATVIIGMRNQPT-AALGHLLPEGTPIPLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATATLVLLPKITTVALLTALVLLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNPSPWFLILLFSW-MIFLLIIPSKVL-KH-VFPNEP-----E-V-LNAK-DS-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELNQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq578 ----M--NENLFASFATPT-MMGLPIVVLIVLFPSILFPS--PDRLINNRLTSIQQWLIQLTSKQMLSIHNHKGQTWALMLISLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRHKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMDISTTTAFITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLIMILSMI-LTLFITFQLKVS-KH-YFPTNP-----EPK-HALL-LKNSA---------------P-W-EEK-WTKIYSPLSLPLQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq579 ----M--NENLFASFTTPT-MMGLPIVILIVLFPSILFPS--PDRLINNRLASIQQWLIQLTSKQMLSIHNHKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVIMGFRHKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMDISTTTAFITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFIMILSMV-LTLFITFQLKIS-KH-YFPTNP-----EPK-HTLL-LKNNS---------------P-W-EEK-WTKIYSPLSLPLQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq580 ----M--NENLFASFAAPT-MMGLPIVILIVLFPSILFPS--PDRLINNRLASIQQWLIQLTSKQMLSIHNHKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRYKTK-MSLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMDISTTTAFITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFIMILSMI-LTLFITFQLKVS-KH-YFPMNP-----EPK-HTLL-LKNST---------------P-W-EEK-WTKIYSPLSLPLQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq581 ----M--NENLFASFTTPT-MMGLPVVILIVLFPSILFPS--PDRLINNRLASIQQWLIQLTSKQMLSIHNHKGQTWALMLISLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRHKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMNISTTTAFITFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLIMILSMI-LTLFITFQLKVS-KH-YFPTNP-----EPK-HTLL-LKNST---------------P-W-EEK-WTKIYSPLSLPLQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq582 ----M--NENLFASFATPT-MMGLPIVILIILFPSILFPS--PDRLINNRLTSIQQWLIQLTSKQMLSIHNHKGQTWALMLISLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRHKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMDISTATAFITFTILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLITILSMI-LTLFITFQLKVS-KH-YFPTNP-----EPK-HTPL-LKNSA---------------P-W-EEK-WTKIYSPLSLPLQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq583 ----M--NENLFASFAAPT-MMGLPIVILIVLFPSILFPS--PDRLINNRLASIQQWLIQLTSKQMLSIHNHKGQTWALMLISLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRHKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMDISTATALITFTILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLIMILSMI-LTLFITFQLKVS-KH-HFPTNP-----EPK-HTLL-LKNSA---------------P-W-EEK-WTKIYSPLSLPLQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq584 ----M--NENLFASFATPT-MMGLPIVILIVLFPSILFPS--PDRLINNRLASIQQWLIQLTSKQMLSIHNRKGQTWALMLISLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRHKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMDISTATAFITFTILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLIMILSMI-LTLFITFQLKVS-KH-YFPTNP-----EPK-HTPL-LKNSA---------------P-W-EEK-WTKIYSPLSLPLQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq585 ----M--NENLFTSFASPA-MMGLPIVTLIILFPSILFPS--PSRLVNNRFTSIQQWLIQLTSKQMMLIHNHKGQTWTLMLMSLITFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVIMGLRHKTK-ASLAHFLPQGTPSPLIPMLVIIESISLLIQP--MALAVRLTANITAGHLLIHLIGGATLALTNISMITALITFTILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFTTIMSMI-LTLFIVFQLKIS-KH-HFPMSP-----ESK-PLSA-SKTNI---------------P-W-EKK-WTKIYSPLSLPLQ-M-FV--NRWLFSTNHKDIGTLYLLFGAWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSLVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq586 ----M--NENLFAPFMVPV-MLGIPITTLIIMFPTLLFPT--PNRLISNRTVAIQQWLTKLTSKQLMITHNPKGQTWSLMLISLFLFIASTNLLGMMPHSFTPTTQLSMNLGMAIPLWAGAVVMGFRNKTK-MSLAHLLPLGTPTFLIPMLVMIETISLFIQP--LALAVRLTANITAGHLLLHLIGSATLVLTSISPPMALITFTILTLL---VILEFAVALIQAYVFTLLVSLYLQDN-T-M-PQLDTSTWLLTILSMM-FTLFALLQLKIS-KH-LYSPSP-----KPM-FTKT-QEQQA---------------P-W-NHT-WTKIYLPLS-----M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGSLIGDDQIYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLMASSVVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq587 ----M--TLSFFDQFMSPT-YLGIPLMALALTLPWILYPT-PTARWLNNRFLALQGWFINRFTQQLLLPLSLGGHKWAALLTSLMIFLITLNMVGLLPYTFTPTTQLSLNLGLATPLWLATVIIGMRNQPT-HALGHLLPEGTPGPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPAVALLTSTVLVLL---TLLEIAVAMIQAYVFVLLLTLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTIIPPKVL-AH-TFPNEP-----T-L-QSTE-KP-KT---------E-----P-W-TWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq588 ----M--MVSFFDQFASPS-FLGIPLIAVAIALPWVLFPT-PSSRWTNSRLITVQTWLMNRFTNQLMMPLNVGGHKWALLLASLMLFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLMPMMPAVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFAILVFSW-VIFLTIIPTKIL-NN-LTPNEP-----A-P-MSKE-EH-KT---------G-----A-W-TWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq589 ----M--VLNFFDQFMSPT-FLGVPLIALALSLPWILFPT-PSSRWLNNRLLTLQNWFINRFTQQMLLPLNLPGHKWALILASLMLFLMTLNLLGLLPYTFTPTTQLSMNMGFAVPLWLATVLIGLRNQPT-AALGHLLPEGTPTLLVPFLVIVETFSLLIRP--LALGVRLTANLTAGHLLIQLISTAAFVLMPMMTSVAILTAIVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFLILMFSW-LVFVTIIPPKVL-KH-TFPNDP-----A-L-MSTE-TP-TP---------N-----H-W-NWP-WS------------V-AI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq590 ----M--NQNLFTSFMTPV-MLGIPIITLIIMFPTILFPA--PTRLINNRTISIQQWLTKFRSKQLMITHNSKGQTWSLLLVSLILFITSTNLLGMLPHSFTPTTQLSMNMGMAVPLWAGTVIMGFRNKTK-ASLAHFLPQGTPTFLIPMLVIIETISLLIQP--VALAVRLTANITAGHLLMHLIGMATLALMSISLFTAFITFIILTLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFLTILSVM-LTLFTLLQPKIS-MH-LYTPNP-----KPM-PTKT-QKQHS---------------P-W-NTA-WTKIYLP---LL--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRTELGQPGTLIGDDQVYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq591 ----L--TLSLFSQFFSPV-WLGIPLIFISLIMPWVLFPS-PSSRWFSNRLVSIQGWMLANFTKQILLPLNEEGHKWAMLFVSLMIFLFGSNLLGLLPYTFTSTTQLSLNLALAVPLWMATILVGARNRPV-HVLGHLLPEGTPTLLIPVLIIIETISLFIRP--LALAVRLTANLTAGHLLIHLISSGTFIMLSMMPSVAILTGALLLVL---TLLEVAVAMIQAYVFVLLLSLYLQEN-I-VNKEKEESRVLWIFLVGW-CCFLAMIPLTLA-KV-LYPNLP-------NPDSTK-LPKST---------------P-W-HWP-WR------------V-IS--PRWFFSTNHKDIGTLYFIFGAWAGMVGTALSLLIRAELSQPGALFGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq592 ----M--NENLFASFITPT-LMGLPIVVVIITLPGIFFPS--SNRLINNRLVAVQKWLIRLITKQMMAIHSKKGQTWALMLMSLIMFIGSTNLIGLLPHSFTPTTQLSMNLGMAIPLWAGTVILGFRHKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMNISMTTAFITFIILVLL---TMLEFAVALIQAYVFTLLVSLYLHDN-A-M-PQLNTSTWFITIMSMI-LTLYIIFQLKIS-KH-YYYYNP-----EPS-TTKS-QKHTT---------------P-W-ETK-WTKIYLPLSLPLH-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq593 ----M--NENLFTSFTVPM-ALGIPITTLIIMFPSILFPT--PNRLINNRTISIQQWLIKLASKQIMNLHNLKGQTWSLMLTSLLLFIASTNLLGMFPHSFTPTTQLSMNIGMALPLWAGTIITGFRHKTK-LSLAHLLPQGTPTFLIPMLVMIETISLLIQP--VALAVRLTANITAGHLLMHLIGQTTLALMMISPFTALTTFVILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLLTITSML-LTLFTLFQLKIS-KH-LYYPSP-----KLT-TTKL-QKQQT---------------P-W-NTT-WTKIYLPPSLFQ--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLIGDDQVYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMLEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq594 ----M--MLSLFDQFLSPA-LLGIPLIALAITLPWTLFPA-PVSRWLNNRLISLQGWFINGFTSQLLLPLGPRGHKWALLFVSLVLYLISINMLGLLPYTYTPTTQLSLNLGLAVPLWLATVIIGMWNQPT-IALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIAMGAFALLPLMPLIGLTTMTVLYLL---TLLEVAVAVIQAYVFVLLLSLYLQEN-V-M-PQLDPAPWFAILVFSW-MILLTIIPPKVL-AH-IFPNEP-----T-S-QSTQ-KS-KT---------E-----T-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTGLSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq595 ----M--NLTFFNQFTSPQ-IMGVPLIMLALLAPSAMFQT-QNNRWLTNRLSLLQLWMINLFTKQLMSPISKTGHQWSVILTSLMIMLLMINLLGLLPYTFTPTTQLSMNMGLAIPMWLATVLTGLRNQPT-ASLGHLLPEGTPNLLTPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLTSTATFALLPTMPTLSMLTMVVLLLL---SILELAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNPDPWFLILSLAW-LTYILVLQPKIL-SN-KSMNHP-----T-N-KNNE-II-KT---------N-----P-W-TWP-WP------------M-IL--TRWFFSTNHKDIGTLYLIFGAWSGMIGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLMSSGIEAGAGTGWTVYPPLAGNMAHSGAS [...]
+Seq596 ----M--TLSFFDQFMSPT-YLGIPLMALALTLPWLLYPT-PSTRWLNNRLVTLQGWFLNRFTQQLLLPLNLGGHKWAALLTSLMIFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVVIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-AH-TFTNEP-----T-T-TSTE-KT-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLLPLMLGAPDMAFPRMNNMSFWLLPPSLLLLLSSSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq597 ----M--TLSFFDQFMSPV-FLGVPLIALALSLPWILFPT-PTARWLNNRLLTLQGWFINRFTQQLLLPLNVGGHKWATILTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTSAVLFLL---TLLEVAVAMIQAYVFVLLMSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-GH-VFSNEP-----T-V-QSAE-KT-NP---------E-----S-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq598 ----M--GLSFFDQFMAPL-YLGIPLIAMALVFPCLLFPT-LTTRWLNNRLTTLQGLFINRFTHQLLSPLNVAGHKWALLFASLMLFLISINLLGLLPYTHTPTAQLSLNLGFAVPLWLATVTIGFRYQFN-HALAHFLPEGTPNLLIPVLIIIETISLFIRP--LALGVRLAANLTAGHLLIQLISTAVFVLLPLLPSVAIVTAMVLVLL---TLLEIAVAMIQAYVFVLLLTLYLQEN-L-M-PQLLPTPWFMTLIFAW-VVFLGFVPTKVM-SH-SFSNEP-----T-S-VKPQ-KLEKD---------F-----LKL-TMGLS-------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq599 ----M--ALNFFNQFLSPS-LLGLPLIALAIMIPWLIFPP-PSKQWLTNRLLTLQTWFINRFTHQLMQPLSLGGHKWASILTALMLFLITINLLGLLPYTFTPTTQLSLNMAFALPLWLTTVLIGMFNQPT-VALSHFLPEGTPAPLIPILIIIETISLLIRP--LALGVRLTANLTAGHLLMQLIATAAFALISIMPSIALLTSLILFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFLIFLFTW-LFFLAIMPNKVM-SY-LLNNNP-----T-T-KNNQ-KP-KP---------N-----P-W-NWP-WP------------V-TI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTGLSLLIRTELSQPGALLGDDQIYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASAGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq600 ----V--IMNFFDQFLSPT-LLGVPLIFLSLAFTYMLIPT-PLSHWLDSRPPSLLLWLLHDFIKQLMSPLNQNAHKWSLLFISLMVLLMSVNLLGLIPYTFTPTTQLSLNIGLATPLWLTTILVGLRNQPT-TSAGHLLPEGTPILLIPILILIETVSLLIRP--LALGVRLTANLTAGHLLIQLTSTATFMLLSLIPTMAVVEMMILFLL---TLLEIAVAAIQAYVFVLLLSLYLQEN-T-M-PQLNPDPWFIIFIMSW-FLFLIILMPHTS-KL-KLMNKP-----M-M-QHTY--N-KT---------T-----S-W-NWP-WL------------V--M--TRWLFSTNHKDIGTLYLMFGAWAGTVGTALSLLIRTELSQPGALLGNDQIYNVVVTAHAFVMIFFMVMPVMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVETGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq601 ----V--NLSFFDQFMSPS-LLGMPLITLSLIFPCMLILS-PNNQWLGNRLFSLQLWFSHSFTKQLMSPLNQNGHKWSLLLASLMMLLLSVNLLGLLPYTFTPTTQLSMNLGLAMPLWLATVLTGLRNQPT-TSLGHLLPEGTPTPLIPILIMIETISLFIRP--LALGVRLTANLTAGHLLIQLISVAIFTLLPLLPTIAILTTVILFLL---VLLEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNPGPWFIILFMSW-LIYMTIISPKIN-KF-KMSHQP-----T-T-QNIN-KD-KP---------Q-----P-W-NWP-WT------------V-MI--TRWLFSTNHKDIGTLYLMFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAGNMAHAGAS [...]
+Seq602 ----M--NLNFFDQFLSPT-LMGIPLIMLSLAFPCMFIPT-PVNHCSTSRLTSLLLWSLHDFIKQLMNPLNQNGHKWSSLLASLMTFLISVNLLGLLPYTFTPTTQLSLNLGLAIPMWLATVLTGLRNQPT-MSAGHLLPEGTPILLIPVLILIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATFMMLSLAPMTVTLGMTALLLL---MVLEIAVAVIQAYVFVLLLSLYLQEN-T-V-PQLNLNPWFIIFTTFW-LMFLIKMLLHIN-KF-KLPGNP-------ILQQIH-NK-LS---------------P-W-SWP-WT------------M--I--TRWLFSTNHKDIGTLYLMFGAWAGMMGTALSLLIRAELSQPGALLDSDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVETGAGTGWTVYPPLASNLAHAGAS [...]
+Seq603 ----M--NLSFFDQFTSPC-LLGIPLILLSLLFPPLLFPS-PNNRWLTNRFSTLQSWFLHLTTKQLMSPLNQKGHKWALILTSLMMLLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ASLGHLLPEGTPTPLVPALILIETISLLIRP--LALGVRLTANLTAGHLLIQLISTATTALLPIIPSISILTTMILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPGPWFLTMLMTW-LTYLMIIQPKLL-SF-TPINSP-----S-N-MPNT-TT-KT---------T-----S-W-LWP-WT------------VTFT--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq604 ----M--MTNLFTQFSIPT-VLGVSLLPITLLYPLILMTF-PKKQLMSNRYTTMTFWLTKNIIKNLMPPSTSPTHKWTPILTSLILLILTINILGMLPYTFTPTTQLSLTLTLAFPLWLGTVLTGLRTQPT-TAMAHLLPMGTPIPLIPILIVVETISLLIRP--LALGVRLTANLTAGHLLLQLISTTTLMTTTTLPALAPAPALVLMLF---TILEIAVAVIQAYVFTLLLTLYLQEN-S-L-PQLNPSPWFYIMVATW-ATMMLLITKLTA--T-PTHTTP-----I---NTNK-PPHTK---------T-----T-W-PW----------------MSTM--NRWLLSTNHKDIGTLYFLFGVGPGMPGSVTSLLIRMKLIQPGESSGGDSLYNMFITYHALTMIFFMVMPIMIGGFGNWLVPLMLGAPDMAFPRLNNMSFWLLPPSFLLLMSTAWFNSGVGTGWTIYPPLSGNLAHAGPS [...]
+Seq605 ----M--MLSFFDQFMSPT-YLGIPLIALAISLPWILYPT-PSNRWLNNRLLTLQGWFINRFTQQLLLPLNVGGHKWATMFTSLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFAIMVFSW-LIFLTVIPPKVL-AH-NFPNDP-----A-L-HSTE-MT-KT---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq606 ----M--MLSFFDQFMSPT-YLGIPLIALAISLPWILYPT-PSNRWLNNRLLTLQGWFINRFTQQLLLPLNVGGHKWATMFTSLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFAIMVFSW-LIFLTVIPPKVL-AH-NFPNDP-----A-L-HSTE-MT-KT---------D-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq607 ----M--ILSFFDQFMSPT-HLGIPLIALALSLPWILIPT-PTNRWLNNRLLTLQAWFINRFTQQLMLPINLGGHKWAVLLTALMLLLITLNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTSVVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFMILVFSW-LVFLIILPPKVL-SH-TFTNEP-----T-H-KNAE-KI-KP---------E-----P-W-TWP-WS------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq608 ----M---GSLFSQFTSPT-LFGIHLFLIAMIFPWLFSYS-PSNRWIPNRLITVQSLFLSTFTKHILMPTNKPAHKWALLIVTVMVFLLSMNLMGLLPYTFTPTTQLPLNLGLAIPLWLATVLVGLRNQLS-ASLAHFLPEGTPTPLIPILIIIETISLLIRP--IALGVRLMANLTAGHLLIQLIATATMFMIPLSTVVSLMSFSVLLLL---TILEIAVAMIQAYVFVLLFSLYLHEN-T----------------------------------------------------------------------------------------------------ML--TRWFFSTNHKDIGTLYLVFGAWAGMIGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMLGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGVGTGWTVYPPLAGNLAHAGPS [...]
+Seq609 ----M--TLSFLDQFASQS-FLGIPLIAIAILIPWMLFPS-PYKRWMSNRLITFQSWFIARTTNQLMLPLNTGAHKWAMILTALLLFLMTLNLLGLLPYTFTPTTQLSMNMALAVPLWLATVLIGMRNQPT-HSLAHLLPEGTPTPLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATFVMLSIMPTIATLTFIVLALL---TILEIAVAMIQAYVLVLLLSLYLQEN-V-M-PQLNPNPWFTILIFTW-AVFLTILPNKVT-SH-KMPNEL-----L-T-KDPS-NL-LT---------E-----I-W-YWP-WH------------V-TI--TRWLFSTNHKDIGTLDLIFGAWAGMVGTALSLLIRAELGQPGALMGDDQIYNVVGTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLTSSAVEAGVGTGWTVYPPLGGNLAHAGAS [...]
+Seq610 ----M--TLTFFDQFASQT-FLGIPLIAIALLLPWLLFPT-PNKRWMNNRLITIQSWFITRATNQLMLPLNIGAHKWAVVLIALLLFLITLNLLGLLPYTFTPTTQLSMNMALAVPLWLATVLIGMRNQPT-HSLAHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATFVMLPIMPTIAMLTLTVLALL---TILEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPDPWFIILIFTW-TVFLTILPNKVI-MH-KTPNEP-----L-T-KDPS-SL-LT---------E-----I-W-SWP-WH------------V-TI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGALMGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLTSSAVEAGVGTGWTVYPPLAGNLAHAGAS [...]
+Seq611 ----M--NEDLFTPFTTPT-VLGLPAAILVILFPPLLVPT--SKHFINNRLITTQQWLIRLTLKQMMITHNTKGRTWSLMLTSLIIFIASTNLLGLFPYSFTPTTQLSMNLAMAIPLWASTVAMGLRFKAK-ISLAHLLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLMHLIGSATLTMLTINLPLTLITLTILTLL---TILEIAVALIQAYVFTLLVSLYLHDN-S-M-PQLNTTTWLTVITPTL-LALFLITQLKLL-NS-HLHPPT-----PPK-FTKT-KPHAK---------------P-W-ELK-WTKIYSPHSLPPQSM-FA--DRWLFSTNHKDIGTLYLLFGAWAGVLGTALSLLIRAELGQPGNLLGNDHIYNVIVTAHAFVMIFFMVMPMMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLLPSFLLLLASATVEAGAGTGWTVYPPLAGNYSHPGAS [...]
+Seq612 ----M--NESLFTPFITPT-VLGLPAAVLVILFPPLLIPT--SKHLINNRLIIIQQWLIRLILKQMMTTHNAKGRTWSLMLTSLIIFIASTNLLGLLPYSFTPTTQLSMNLAMAIPLWASTVAMGLRFKAK-ITLTHLLPQGTPTPLIPMLIIIETVSLFIQP--LALAVRLTANITAGHLLMHLIGSSALAMLAINLPLTLITLTILTLL---TILETAIALIQAYVFTLLVSLYLHDN-S-M-PQLNTTTWPTIITPML-LALFLITQLKLL-NS-HLHPPT-----PPK-FTKP-KLHAK---------------P-W-GPK-WTKVYLPHSLPPQYM-FA--DRWLFSTNHKDIGTLYLLFGAWAGVLGTALSLLIRAELGQPGNLLGNDHIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASATVEAGAGTGWTVYPPLAGNYSHPGAS [...]
+Seq613 ----M--NQNLFAPFMTPM-LLGIPVTLLVIMLPAMLLPT--PNQLINNRMISVQQWMIKLLTKQLMSTHNTKGQTWSLMLTSLFLFIALTNLLGMLPHSFTPTTQLSMNLGMAIPLWAGTVFAGFRNKTK-MSLAHLLPQGTPTFLIPMLVMIETISLFIQP--MALAVRLTANITAGHLLLHLIGSTVLALTNINLLAASITFIILTLL---TILEFAVALIQAYVFTLLVSLYLQDN-T-M-PQLDTSTWLLTISSMI-LTLFTLFQLKVS-KH-FHPSTP-----KST-QTGL-QKQQT---------------P-W-NTK-WTKIYLP---PS--M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSLLIRAELGQPGTLLGDDQIYNVLVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLMASSMVESGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq614 ----V--TMNLFGQFESPT-TLGIPLMVVAIILPVLLLKF-NSSRWSKNRMASVQAFWTKQFTSQLMQPINKPGHKWALLLTSLFLFIITTNTLGLLPYTFTPTTQLSMNLGLAIPLWLATVITGFRNDST-HALGHLLPESTPTLLIPILVVIETASLFIRP--LALGVRLTANLTAGHLLIQLIATTITKLLIMSISAALITMALLVLL---TILEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWLKFFLLSW-MVFI-IPMAVIS-MG-TYTSAP-----S---ST-MAKKAST---------------F-W-SWT-WT------------V-SL--TRWMFSTNHKDIGTLYLIFGAWAAMVGMALSLLIRTELTQPGSLLGNDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSVVETGVGTGWTVYPPLAGNLAHAGAS [...]
+Seq615 ----M--ILSFFDQFMSPT-YMGIPLIALALSLPWLMYPA-PSGRWLNNRLLTLQGWFVNRFTQQLLLPINMGGHKWAALFTSLMIFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATATAVLAPLMPTVAFLTGTLLLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWLAILIFSW-LIFLVFLPPKVL-AH-TFPNEP-----S-A-QSAE-ST-RT---------Q-----S-W-NWP-WS------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLSSSGVEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq616 ----M--NENLFAPFISPT-ILGITTLPIIMLFPCLLLST--PKRWLPNRIQLLQIWLIRLITKQMMMMHNKQGRSWALMLMSLILFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWLATVLMGFRNKPK-ISLAHFLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSISMTVSTITFTILFLL---TILELTVAMIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWLLTIILMI-ISLFCIYQSKMI-NQ-TMTLIP-----PQDKKPPQ-PKIQL---------------H-W-EMK-WTKIYLPLSSPLPSM-FV--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLIGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq617 ----M--NENLFTPFTTPT-FLGLPAVMPIIMFPMLLLPT--SKHLINNRLITIQQNLTQLILKQMMAIHNTKGQTWSLMLVSLIIFIATTNLLGLLPHSFTPTAQLSMNLAMAIPLWAGTVLTGLRFKTK-SSLAHFLPQGTPTLLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLVGNATLALMTMNFLATSLTLILLMLL---MILEIAVALIQAYVFTLLVSLYLHDN-T-M-PQLNTSTWLITIITML-PTLYLIMQLKLL-SM-NYHLSP-----LQK-NPNM-RMFNN---------------P-W-QLK-WTKIYLPHSQPQHSM-LI--NRWLFSTNHKDIGTLYLLFGAWAGTMGMAMSLLIRAELGQPGNLLGNDHIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLLASAMVEAGAGTGWTVYPPLAGNLSHPGAS [...]
+Seq618 ----M--NENLFTSFIAPS-MMGLPLAILIILFPTMLYPS--PKRLVNNRLISTQQWLTTLIMKQLMTTHNNKGRTWTLMLVSLILFIASTNLLGLLPYSFTPTTQLSMNLGMAVPLWAGTVFLGFRHKTK-ASLAHLLPQGTPTALIPMLVIIETISLFIQP--VALAVRLTANITAGHLLIHLIGSATLALMHINQTAAAISFIILFLL---TVLEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLNTMPWPMIITTMI-MTLFIVMQVKIS-KY-SYPNSL-----TPK-PINK-TTQHA---------------P-W-KTK-WTKIYLPPLLPPQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSILIRAELGQPGALLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGSPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq619 ----M--NENLFASFMMPT-ILGLPAVVPIIMFPALLFPT--SKHLISNRLITIQQNIIQMILKQIMTIHNTKGQTWSLMLMSLIIFIATTNLLGLLPHSFTPTAQLSMNLAMAVPLWAGTVVLGFRFKTK-NSLAHFLPQGTPTPLIPMLVVIETISLFIQP--VALAVRLTANITAGHLLMHLIGSAALALLTINLPTTFLILVLLVLL---TILEIAVALIQAYVFTLLVSLYLHDN-T-M-PQLNTSTWFIVIMTML-PTLYIIMQLKLL-ST-NYYPHP-----SQN-FSKM-QTHNN---------------P-W-QLK-WTKIYSP-----LSM-LI--NRWLFSTNHKDIGTLYLLFGAWAGMMGMAMSLLIRAELGQPGNLLGNDHIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLLASAMVEAGAGTGWTVYPPLAGNLSHPGAS [...]
+Seq620 ----M--NENLFSSFTTPT-MMGLPLIILITMAPSILFPS--PARLINNRFISIQQWLICLVSKQMLSIHNHKGQTWALMLLSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVILGFRYKTK-SSLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALISINVPTALITFIILTLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITILSMI-LTLFFVFQLKVS-KH-YFTNDP-----KPK-STLM-PKTST---------------P-W-EKK-WTKIYSPLSLPLQ-M-FM--TRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq621 ----M--ILSFFDQFMSPT-HLGIPLIALALSLPWILIPT-PTNRWLNNRLLTLQAWFINRFTQQLMLPINLGGHKWAMLLTALMLLLITLNLLGLLPYTFTPTTQLSLNMGFAVPLWLATVVIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTSVVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFMILIFSW-LIFLIILPPKVL-GH-TFTNEP-----T-H-KNAE-KI-KP---------E-----P-W-TWP-WS------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq622 ----M--MMSFFDQFASPS-FLGIPLMAVAIALPWVLFPT-PPSRWMNSRLITVQTWLINRFTSQLMLPLNVGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAALTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFAVLVFSW-VVFLTIIPTKIL-NN-LAPNEP-----A-P-MSKE-KH-KT---------D-----S-W-TWPWW-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq623 ----M--ALNLFDQFMSPT-HLGIPLIAIALTLPWILVPA-PTNRYQSNRLVSLQSWFIKTFTQQLLLPINQAGHKWAMILASLMIFILTLNVLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGLRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATITLMPMMTTVATLTAILLVLL---TLLEVAVAVIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTVIPHKVL-SH-TFTNEI-----T-A-LSAK-TL-KS---------D-----T-W-NWP-WH------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELAQPGALLGDDQSYNVIVTAHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq624 ----M--NENLFAPFITPT-IMGITTLPIIMLFPCLILST--PKRWLPNRIQTLQIWLIRLITKQMMTMHNKQGRSWTLMLISLILFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWMGTVVMGFRNKPK-ASLAHFLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSISMAVSSITFMILFLL---TILELAVAMIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWFMTIILMI-MALFCIYQLKML-NQ-TMVSIM-----QQDEKEHH-TKAQL---------------P-W-EKK-WTKIYLPHSSPLQSM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNMAHAGAS [...]
+Seq625 ----M--TLSFFDQFLSPM-MMGIPLVMIAMALPWLLFPG-PTNKWLNNRLSTLQIWFSQKFAKQLMTPLNTEGYKWAMILTSLMVFLMTVNLLGLLPYTFTPTTQLSLNLGLAVPFWLATILIGLRNQPT-ITFGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAALVLLPMMPVVSILTMLILFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLMPGPWFAIFLMSW-IVFLLVLTFKIS-NF-NNLNEP-----T-S-QNIK-KN-KP---------E-----S-W-NWP-WL------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSFLGDDQIYNVVVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLASNLAHAGTS [...]
+Seq626 ----M--ILSFFDQFMSPV-FLGIPLIALALVLPWILFPK-PSAQWITNRLLTLQGWFINRFTQQLFLPLNTPGHKWAVILTSLMLFLISLNMLGLLPYTFTPTTQLSLNMGFAVPLWLATVLIGMRNQPT-VALGHLLPEGTPTPLIPVLIIIETISLFIRP--IALGVRLTANLTAGHLLIQLIATAAFVLAPMMPTVALLTAALLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFAILLFSW-LVFLIVIPPKVA-AY-TFPNEL-----T-A-QSTQ-TP-VT---------E-----P-W-NWP-WS------------V-AT--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq627 ----M--MTSFFDQFASPS-FLGVPLIAVAIALPWVLFPT-PPSRWLNNRLITLQTWFINRFTNQLLLPLSVPGHKWALLFASLMVFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLMPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IIFLTIIPTKIM-NH-MTPNEP-----A-P-MNEE-KH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq628 ----M--NLSFFDQFMTPT-LMGIPLITLAMGFPLLLLFM-SPKHWQGGRIYSIQLWFSQNFTKQLLMPLNTTGHKWALLLTSLMLLLISMNLLGLLPYTFTPTTQLSMNLGLALPLWLATVVTGMRNQPT-MSLGHLLPEGTPTLLIPVLIAIETISLFIRP--LALGVRLTANLTAGHLLIQLTSTAVLTLLPLMPTIAILTAIVLLLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPDPWFFIFFTSW-FIYLIILMPKTS-NL-KMPKEP-----M-T-QN-N-KN-KT---------E-----P-L-TWP-WI------------V-MI--TRWLFSTNHKDIGTLYLMFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAGNMAHAGAS [...]
+Seq629 ----M--TLSFFDQFMSPN-YLGIPLMALALSLPWTLYPT-PSTRWLNNRLLTLQGWFINRFTQQLLLPLNPGGHKWALILTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-IALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTILPPKVM-AH-TFPNEP-----T-S-QSTE-KP-KT---------E-----P-W-TWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq630 ----M--NLSFFDQFASPQ-LLGIPLILLSMLFPTLLLPS-PGNRWVTNRLSTLQSWFLQLVTKQLMMPLNKTGHKWALTLSSLMILLLLINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ISLGHLLPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATLALLPILPSISILTATILLLL---TILEVAVAMIQAYVFVLLLSLYLQGN-I-M-PQLNPNPWFFTMIMSW-TIFLLLIQPKLL-SF-THMNLP-----S-N-KTLS-TP-NP---------T-----P-W-TWP-WT------------VTFI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq631 ----M--NLSFFDQFASPY-LLGIPLILLSVLFPALLFPS-PDNRWITNRLSTLQSWLLHLITKQLMTPLNKEGHKWALILTSLMMLLLTINLLGLLPYTFTPTTQLSANMALAFPLWFATLLTGLRNQPS-ASLGHLLPEGTPTLLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATMALLPTMPAVSILTASILFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWLFIMLMSW-LTFSLIIQPKLL-SF-TSTNSP-----S-D-KTSM-TI-KT---------T-----P-W-PWP-WT------------VTLI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq632 ----M--NLSFFDQFTSPC-LLGVPLILLAMLFPPLLIPR-QGSRWLNNRLSTLQLWFINLITKQLMLPLDKKGHKWALILTSLMILLLLINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ISLGHLLPEGTPTLLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATFVLLPILPAVSILTTLILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFLTMLLSW-LTFSLLIQPKLL-SF-NPTNTP-----S-N-KALA-PI-KT---------H-----P-W-TWP-WT------------VTFI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq633 ----M--NENLFSSFITPT-MMGLPIVTLIIMFPSMLFPS--TNRLINNRLIAIQQWIIHLTSKQMMAIHNQTGQKWSLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVALGFRHKTK-ASLAHFLPQGTPIPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMSISTMTALITFAILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITILSMI-LTLYIIMQLKVS-KH-LYHQNP-----EPT-IAKS-TKHST---------------P-W-EDK-WTKIYSPLSLPLQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq634 ----M--NENLFSSFITPT-MMGLPIVTLIIMFPSMLFPS--TNRLVNNRLVAIQQWIIHLTSKQMMAIHNQTGQKWSLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVALGFRHKTK-ASLAHFLPQGTPIPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMDISTMTALVTFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITILSMI-LTLYIIMQLKIS-KH-TYYQNP-----EPT-TTKS-TKHLT---------------P-W-ENK-WTKIYSPLSLPLQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq635 ----M--ALNFFDQFMSPT-YLGVPLIALALTLPWVLYPT-PSARWLNNRMLTLQGWFINRFTQQLLLPLNVGGHKWALLFASLMIFLLTLNLMGLLPYTFTPTTQLSLNMALAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLFPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFTW-LVFLTIIPTKVM-AH-TFTNEP-----T-T-QSAE-KP-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLMFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMVFDYC-PLLLLLLSSSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq636 ----M--MTSFFDQFASPS-FLGMPLIAIAIALPWVLFPT-PSSRWLNNRLITLQTWFINRFTNQLLLPLNTGGHKWALLFASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IIFLTIIPTKIL-NH-TTPNEP-----A-P-MTEE-KH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq637 ----M--MVSFFDQFASPF-YLGIPLIAIAITLPWMLFPT-PTSKWVNNRLITIQNWFINQFTSQLMLPLNVGGHKWALLLASLMIFLITINMLGLLPYTFTPTTQLSLNMAFAVPLWLATVIIGMRNQPT-IALGHLLPEGTPIPLIPVLIIIETISLFIRP--IALGVRLTANLTAGHLLIQLIATAAYVMASIMPVVAFLTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFLILVFSW-LVFLTIIPTKIL-NH-ITPNEP-----T-S-VSAE-KH-KT---------E-----S-W-NWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPVLIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq638 ----M--NENLFTSFTHPT-LLGLPAVVPIILFPTLLLPT--SKYLINNRLITIQQNLIQLIVKQMMMIHNIKGQTWSLMLMSLIIFIATTNLLGLLPHSFTPTAQLSMNLAMAIPLWAGTVITGLRFKTK-SSLAHFLPQGTPTLLIPMLVVIETISLFIQP--VALAVRLTANITAGHLLMHLIGSATLVLSTISLSMTSLTLVLLVLL---TILEMAVALIQAYVFTLLVSLYLHDN-T-M-PQLNTSTWLITIMTML-PALYLIMQLKLL-NM-VYYFPP-----SQK-VSST-QMFNN---------------P-W-QLK-WTKIYLPHLHTQHSM-LI--NRWLFSTNHKDIGTLYLLFGAWAGTTGMAMSLLIRAELGQPGSLLGNDHIYNVIITAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLLASAMVEAGAGTGWTVYPPLAGNFSHPGAS [...]
+Seq639 ----M--NENLFTPFMVPT-FLGLPAVVPIILFPTLLFPT--SKHLITNRLIIIQRNLVQLIMKQMMTIHSTKGQTWSLMLMSLIIFIAATNLLGLLPHSFTPTTQLSMNLAMAIPLWAGTVITGLRFKTK-NSLAHFLPQGTPTPLIPMLVVIETISLFIQP--VALAVRLTANITAGHLLMHLIGSATLALLTASFLATSLTLVLLVLL---TILEMAVALIQAYVFTLLVSLYLHDN-T-M-PQLNTSTWFITIMAML-PTLYLIMQLKLL-ST-NYHFSP-----PQKEIYSM-QAFNS---------------P-W-QLK-WTKIYLP-----HSM-LI--NRWLFSTNHKDIGTLYLLFGAWAGTMGMAMSLLIRAELGQPGNLLGNDHIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLLASAMVEAGAGTGWTVYPPLAGNFSHPGAS [...]
+Seq640 ----M--NMNMFEQFASPE-ILYVPTSLLSMLMPILFIRP--NNMLLGNRTSAIMSWFFKTILTNMMNQLSPTGQKWSRFLTGLLVFILLSNLLGLLPYTFTPTSQLSMNMALAIPMWLATIITGLTTKTS-STLAHMLPEGSPTPLIPFMILIETISLFMRP--IALGVRLTANITAGHLLMTMISSAVLNFFNSYNTLSALMLILLFLL---TLLEMAVACIQAYVFVLLITLYLQEN-T-M-PQLDIVYIFTNYLWAW--LTLMSLVWKIQ-IT-ILNKDS-----EA-ISTDDLKTELI-----------------WI-LP-WT------------V-YT--TRWLFSTNHKDIGTLYLLFGAWSGLVGACLSVLMRMELTQPGSLFGSDQIFNVLVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPALLLLLSSSYVEAGAGTGWTVYPPLSGNMVHSGPS [...]
+Seq641 ----M--ILNFFDQFLSPS-LMGLPLIALAIIMPALIFQT-PSNRWLNNRLITLQTWFVTRFTHQLLQPLNLGGHKWATILTALMLFLITINLLGLLPYTFTPTTQLSLNMAFALPLWLTTVLIGMLNQPT-VALGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLMQLIATAAFVLISTMPMVAILTSIVLLLL---TLLEVAVAMIQAYVFALLLSLYLQEN-V-M-PQLNPNPWFLIFLFSW-LFFLIVLPHKLT-SY-LLNYSP-----T-P-KNAE-KQ-KP---------E-----P-W-NWP-WS------------V-AI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTGLSLLIRAELSQPGTLLGDDQIYNVIVTAHALVMIFFMKPQLMIGGFGNWLVPLMIGSPDMAFPRMNNMSFWLLPPSFLLLLASAGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq642 ----M--ILNFFDQFLSPS-LMGLPLIALAIIMPAVIFQT-PSNRWLNNRLITLQTWFINRFTQQLLQPLNVGGHKWAIILTALMLFLITINLLGLLPYTFTPTTQLSLNMAFALPLWLTTVLIGMLNQPT-IALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLMQLIATAAFVLISTMPAVAILTSIVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNLNPWFLIFLFSW-LFFLVVLPHKLT-SY-LLNYSP-----T-P-KNTE-KQ-KP---------E-----P-W-NWP-WS------------V-AI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTGLSLLIRAELSQPGSLLGDDQIYNVLVTAHALVMIFFMVMPIMIGGFGNWLVPLMIGSPDMAFPRMNNMSFWLLPPSFLLLLASAGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq643 ----M--TMDLFSQFASST-SFGIPLILLAMLVPWLLFPT-PSKRWVNNRLLTSQTWFLTVFTKQIFLPLNAPAHKWAFLLTSLMAFLLSMNLLGLLPYTFTPTTQLSINLGLAVPLWLATVLLGFRNQFN-HSLAHFLPEGTPTPLIPVLILIETISLFIRP--LALGVRLTANLTAGHLLIHLISSAVSAIFSLSPTASLLTFTVLVLL---TILEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNPSPWLFYLFLAW-LILTFLAPSKIL-GH-TNLNEP-----N-P-KGTK-T--TN---------F-----T-W-TWP-WQ--------------MF--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFFLLLASSTVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq644 ----M--TMDLFSQFASST-SFGIPLILLAMLVPWLLFPT-PSKRWVNNRLLTSQTWFLTVFTKQIFLPLNAPAHKWAFLLTSLMAFLLSMNLLGLLPYTFTPTTQLSINLGLAVPLWLATVLLGFRNQFN-HSLAHFLPEGTPTPLIPVLILIETISLFIRP--LALGVRLTANLTAGHLLIHLISSAVSAIFSLSPTASLLTFTVLVLL---TILEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNPSPWLFYLFLAW-LILTFLAPSKIL-GH-TNLMIH-----N-L-KVQK-Q--LT---------L-----P-E-PDH-DN--------------MF--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFFLLLASSTVEAGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq645 ----M--NENLFASFITPV-ILGLPLATLIVMFPSLLFPT--SNRLVNNRLISLQQWALQLVSKQMMGIHNAKGQTWTLMLMSLIMFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVVTGFRNKTK-ASLAHFLPQGTPAPLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLIHLIGGATLALMSISTTMALITFIILILL---TVLEFAVAMIQAYVFTLLVSLYVHDN-T-M-PQLDTSTWFMMIMSMF-LTLFIIFQLKVS-KH-NFFFNP-----ELT-SIET-QKQNT---------------P-W-ETK-WTKIYLPLLLP-Q-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMIEAGTGTGWTVYPPLAGNLAHAGAS [...]
+Seq646 ----M--NLSFFDQFLSPS-MMGIPLVMMAMLLPWLLFPS-PTNKWLNNRLSTLQIWFSQKFTKQLMSPLNVKGHKWAMILTSLMMFLITINLLGLLPYTFTPTTQLSLNLGLAVPFWLATILIGLRNQPN-ATFGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAMLVLLPMMPMISIMTMMVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAIFLMSW-VVFLLILTFKVN-NF-NNLNDP-----T-S-QNMK-KN-KP---------E-----S-W-NWP-WI------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq647 ----M--TLSFFDQFMSPT-LMGIPLMALALSLPWILYPT-PTARWLNNRLLTLQNWFINRFTQQLLLPLNLGGHKWALIFTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVLPPKVS-AH-SFPNEP-----T-P-QSTE-KP-QT---------E-----S-W-SWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq648 ----M--NENLFASFITPT-MMGLPIVVTIIMFPSILFPS--SERLISNRLHSFQHWLIKLIIKQMMLIHTPKGRTWALMIVSLIMFIGSTNLLGLLPHTFTPTTQLSMDLSMAIPLWAGAVILGFRHKLK-NSLAHFSPQGTPISLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLMHLIGGATLVLMDISPPTATITFIILLLL---TVLEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITIISSM-ATLFILFQLKIS-SQ-TFPAPP-----SPK-TMAT-EKTNN---------------P-W-ESK-WTKIYLPLSLPPQ-M-FV--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSILIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPMMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGVS [...]
+Seq649 ----M--NENLFASFITPT-MMGLPIVVTIIMFPSILFPS--SERLISNRLHSFQHWLIKLIIKQMMLIHTPKGRTWALMIVSLIMFIGSTNLLGLLPHTFTPTTQLSMNLSMAIPLWAGAVILGFRHKLK-NSLAHFLPQGTPISLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLMHLIGGATLVLMDISPPTATITFIILLLL---TVLEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITIISSM-ATLFILFQLKIS-SQ-TFPAPP-----SPK-TMAT-EKTNN---------------P-W-ESK-WTKTYLPLSLPPQ-M-LV--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSILIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPMMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq650 ----M--MLSFFDQFMSPV-YLGIPLIALAITLPWILFPT-PQARWLNNRVLTLQGWFISRFTSQLLLPLNPGGHKWAVLFTSLMVFLFSINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTALIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPVVAILTTVVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-MIFLTVIPPKVL-AH-TYPNEP-----T-S-QSTQ-KP-KT---------E-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTGLSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq651 ----M--TLSFFDQFMSPS-LFGIPLIALALSLPWILFPT-PSARWLGNRLLALQSWSINRFTQQLLLPLNLGGHKWAAILTSLMLFLITMNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPTVAIMTSAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-VIFLTVIPPKVL-GH-IFTHEP-----T-V-SSSE-ET-NP---------V-----S-W-TWP-WL------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQVYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq652 ----I-----------------------LAMTTPWVLFPT-PSNQLVLNRLVSSLHFFLNLFSKHILLPMNKPAHNWAFMLATLMLFLLGMNMLGLVPYTFTPTTQLSMNLGLAVPLWLMTVIVGLRNQLS-SALAHFLPEGTPTSLTPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISMAALTMTSISTTLSLLTFITLMLL---TMLEIAVAMIQAYVFVLLLGLYLQEN-T-M-PQLIPEPWFFIFLTSW-LVIFSVAPTKIL-TH-LNLNKP-----N-F-KKPK-T--SR---------N-----S-W-TWP-WQ--------------ML--TRWLFSTNHKDIGTLYLIFGAWAGMIGTSLSLLIRAELAQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFFLLLASSMVEAGVGTGWTVYPPLAGNIAHAGPS [...]
+Seq653 ----M--NLSFFDQFASPQ-LLGIPLILLSMLFPALLLPS-PGNRWVTNRFSTLQSWFLQLITKQLMMPLNKSGHKWALTLSSLMTLLLLINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ISLGHLLPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATLALLPILPSISILTATILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFFIMIMSW-AVFLLLIQPKLL-SF-THTNLP-----S-N-KPLS-TP-NP---------T-----P-W-TWP-WT------------VTFI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq654 ----M--ILSFFDQFMSPT-LLGVPLLAMAISAPLVSLAK-PTQQWLDSRVTTMQTWLLLNFTKQLMAPLTLSGQKWATILTSLMMFLITMNLLGLLPYTFTPTTQLSMNMALAVPMWLATVLLGMRSQPT-TSFAHLLPEGTPTLLIPPLIMIETISLFIRP--LALGVRLTANLTAGHLLIQLTATAAMVLLPIMPTTALLTAAVLFLL---TILEVAVAMIQAYVFVLPLSLYLQEN-I-M-PQLNPGPWFTIMLFSW-LIFL-LIPAKMI-KH-QQTNLP---------TDQE-QL-PH---------N-----P-W-TWP-WS------------V-AI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVVGTAHAFVMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAANLAHAGAS [...]
+Seq655 ----M--TLSFFDQFSIPH-ILGLPLIILALLLPPMMIF--KTNRLLHNRLTTLQAWSSMMFTKQLLTPLNTHAQKWANTLLALMLMLIMLNTLGLLPYTFTPTTQLSMNLGLAVPMWLMTVLLGLRTQPT-NSLGHLLPEGTPTLLIPILIIIETISLFIRP--IALGVRLTANLTAGHLLIQLMSTAVFVMLPTMTLSATITMLVLLLL---TCLEVAVAIIQAYVFVLLLTLYLQEN-T-V-PQLNPAPWLLIFLLTW-TTLITIFLPKTF-TL-TQTTNP-----S---TTSIDMDIKQ---------------P-W-TWP-WL------------M-YM--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPALLLLLSGAGIEAGAGTGWTVYPPLASNLAHSGPS [...]
+Seq656 ----M--NENLFASFTTPT-MMGLPIVILIIMSPSIMFPS--PNRLINNRLISIQQWLLQLTSKQMMSTHNNKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVLTGFRHKTK-ASLAHFLPQGTPTFLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGGATLALMNISPTTSFITFITLVLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITITSMT-ITLFIMFQLKLS-KH-SYPSNP-----ELK-PINT-SMHTT---------------P-W-ESK-WTKIYSPLSLPQQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq657 ----M--NENLFASFITPT-MMGLPIVILIIMFPTILFPS--TNRLISNRLVAIQQWLIHMTSKQMMAIHNPKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVILGFRHKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--LALAMRLTANIAAGHLLIHLIGGATLALLSISTAPPSITFIILVLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLITIFSMI-LTLFIMMQLKVS-KH-SFHSNP-----EPL-EVKS-SKHTT---------------P-W-ETK-WTKIYSPLSLPQR-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq658 ----M--NENLFASFITPT-MMGLPIVILIIMFPTILFPS--TNRLISNRLVAIQQWLIHLTSKQMMAIHNPKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVILGFRHKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALLSISTATAFITFIILVLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITILSMI-LTLFIMMQLKVS-KH-SFHSNP-----EPL-EVKS-SKHTT---------------P-W-ETK-WTKIYSPLSLPQR-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq659 ----M--MTSFFDQFASPS-FMGIPLISLAIALPWIMFPT-PPARWLNNRLITLQTWFINRFTNQLLLPLNVGGHKWALLLTSLMIFLITTNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPAVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFAILVFLW-LIFLTIIPTKIL-SH-VTPNEL-----T-P-VNAE-EH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq660 ----M--MTSFFDQFASPS-FLGIPLIFVAISLPWIMFPT-PPARWLDNRLITLQTWFINRFTNQLLMPLNVGGHKWALLLTSLMIFLITTNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-NALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPILPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IIFLSILPAKVM-NH-ISPNEI-----T-P-VGAE-KH-KT---------D-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq661 ----M--TLSFFDQFMSPT-YLGIPLIALALLLPWLLFPT-PSSRWLNNRLLTLQGWFVNRFTYQLFMPLNQGGHKWATILTSLMLFLISLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVLIGLRNQTT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTASILFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTILPPKVL-AH-TFPNEP-----T-P-QSTQ-KS-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq662 ----M--NMSFFDQFTSPT-MAGIPLTMLALIAPWFMMPA-KTSKWLNNRLYTIQLWFSSLFVKQLMSPLNKKGHKWSLLLMTLLIFILLNNLLGLLPYTFTPTTQLSMNLGLAVPLWLSTIILGTQNQLT-VTLSHLLPEGTPTLLIPTLVIIETISLLIRP--LALGIRLTANLTAGHLLIQLISTAILTILPLMPMVSTLAFMILLLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-L-M-PQLNPNPWLTIFMVAW-LMYLFLLMFKM--NL-KMTNEL-----M-L-QNIN-KF-NN---------K-----S-W-YWP-WT------------V-MI--NRWLFSTNHKDIGTLYLMFGAWAGMIGTALSLLIRAELSQPGSLLGDDQIYNVVVTAHAFVMIFFMVMPVMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLTSSGVEAGAGTGWTVYPPLAGNMAHSGAS [...]
+Seq663 ----M--NENLFAPFITPT-ILGITTLPIIMLLPCLILTS--PKRWLPNRIQTLQIWLIRLITKQMMAMHNKLGQSWTLMLMSLILFIASTNLLGLLPYSFTPTTQLSMNIGMALPLWMGTVLLGFRNKPK-VSLAHFFPQGTPTPLIPMLIVIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSISMAVSTITFAVLFLL---TILELAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFMTITLMI-IGLFCIFQLKML-NQ-TMINIT-----PQDKQIFT-KKETL---------------P-W-ENK-WTKIYLPHLLPLQSM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLIGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq664 ----M--TLSFFDQFMSPT-YLGIPLIALALSLPWILYPT-PSARWLNNRLLTLQGWFINRFTQQLLLPLNLGGHKWATLLTSLMIFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTPLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTATLLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLMILIFSW-LIFLTLIPPKIL-AH-TFPNEP-----T-T-QSAE-KP-KT---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq665 ----M--NENLFASFITPT-MMGLPVVTLIIMFPTILFPS--SNRLINNRLIAIQQWILHLTAKQMMSIHNHTGQKWSLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVALGFRHKTK-ASLAHFLPQGTPVPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALLNINMLTSFITFIILVLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITIVSML-LTLYIIMQLKVS-KN-VYHQNP-----EPT-ITKS-TKHPT---------------P-W-EDK-WTKIYSPLSLPLR-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq666 ----M--SLGLFDQFMSPS-LMGLPLIVPALILPWMLFFP-PHSRWLNGRFSTLQGWFISQFARQLLMPLNKGGHKWAVVLTSLMLYLLTMNMLGLLPYTFTPTTQLSFNLGFAVPLWMATMIIGLRDRPT-TTLGHLLPEGTPQPLIPMLIIIETISMWIRP--LALGVRLTANLTAGHLLIQLVSTAVFTLLTTASLTAVLALVALLLL---TTLEVAVAMIQAYVFILLLSLYLQEN-V-M-PQLNPDPWFMILIVAW-VAFLVIIPVKIL-TH-VINNEI-----A-Q-QTTD-KL-KT---------N-----P-W-GWP-WA------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGLVGTALSMLIRTELSQPGTMLEDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq667 ----M--NLSFFDQFLSPT-MLGIPLVMVAMWLPWLLFPS-PTNKWLNNRLSTLQIWFSQKFTKQLMTPLNITGHKWAMILTSLMMFLITINLLGLLPYTFTPTTQLSLNLGLAVPFWLATILIGLRNQPT-AAFGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTAILTAGHLLIQLIATATLVLLPMMPVVSILTMLVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAIFISSW-LVFLLILTLKIS-NL-NNLNEP-----T-S-QNIK-KN-KP---------E-----S-W-NWP-WI------------V-MI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq668 ----M--TLSFFDQFMSPV-FLGIPLMALALSLPWILFPT-PTDRWLNNRLLTLQGWFINRFTQQLLLPLNPGGHKWALILTSLMLFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRTQPT-AALGHLLPEGTPGPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTSIVLFLL---TLLEVAVAMIQAYVFVLLMSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-GH-TFPNEP-----T-V-QSAE-KS-SP---------E-----S-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq669 ----M--TLSFFDQFMSPV-FLGIPLMALALSLPWILFPT-PTARWLNNRLLTLQGWFINRFTQQLLLPLNVGGHKWATILTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRTQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTSIVLFLL---TLLEVAVAMIQAYVFVLLMSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTIIPPKVL-GH-IFSNEP-----T-V-QSAE-KA-NP---------E-----S-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq670 ----M--MLNFFDQFLSPT-LMGIPLILVSLTIPWALYPQ-PTARWLNNRLLTLQGWFINRFTQQIFLPLSPSGHKWALMLASLMLFLITLNMLGLLPYTFTPTTQLSLNMALAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTPLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVALLTTALLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFMILFFSW-LVFLTVIPPKIL-AH-KFPNEP-----S-L-TTAE-KT-KT---------K-----S-W-TWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq671 ----M--TLSFFDQFMSPT-YLGIPLIAVALTLPWILFPT-PSTRWLNNRLITLQGWFINRFTQQLLLPLNLGGHKWAVLLTSLMLFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLMPIMPTVAILTSIVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-GH-TFTNEP-----T-S-QSTE-KA-KP---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq672 ----M--MASFFDQFASPS-FLGVPLIAVAIALPWIMFPT-PSSRWLNNRLITLQTWFINRFTNQLLLPLNTGGHKWALLFASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IIFLTIIPTKIL-NH-TAPNEP-----A-Q-MGEE-KH-KT---------E-----P-W-NWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq673 ----M--MLSFFDQFMSPT-YLGIPLIAVAIALPWVLYPT-PTARWLNNRVMTLQGWFINRFTQQLLLPINLGGHKWAALLTSLMLFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPTVAILTATILFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTVIPPKVL-AH-NFNNEP-----T-V-AGVE-KA-KP---------E-----S-W-NWA-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq674 ----M--MLSFFDQFASPT-YMGIPLIALAIALPWTLYPT-PTSRWLNNRVLTLQGWFINRFTQQLLLPLNTGGHKWAVLLTSLMVFLFTINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTVIPPKVL-AH-NFNNEP-----T-T-VGAE-KA-KP---------E-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq675 ----M--TLSFFDQFMSPT-YLGIPLIALALALPWVLYPT-PSARWLNNRLLTLQGWFINRFTQQLLLPLNLGGHKWATLFTSLMIFLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFMILVFSW-FIFLTLIPPKVL-AH-TFPNEP-----S-A-QSAE-VH-KT---------K-----A-W-DWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq676 ----M--TLSFFDQFMSPT-YLGIPLMALALTLPWILYPT-PTTRWLNNRFLALQGWFINRFTQQLLLPVNLGGHKWAALLASLMIFLITLNMLGLLPYTFTPTTQLSLNLGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPGPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAIVTSTVLVLL---TLLEVAVAMIQAYVFVLLLTLYLQEN-V-M-PQLNPAPWFAILAFSW-LVFLTLLPAKIT-AH-TFPNEP-----T-L-QSTE-KS-KT---------E-----P-W-TWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq677 ----M--ALNFFDQFMSPT-LMGIPLIGLAMTLPWILFTS-PTPRWLTNRFLTLQGWFINRFTQQLFQPLNPGGHKWALLFTSLMMFLFSLNMLGLLPYTFTPTTQLSLNMGLAVPFWLATVIIGMRNQPT-IALGHLLPEGTPTPLIPVLIIIETISLFIRP--IALGVRLTANLTAGHLLIQLIATAAFVLLPLMPSVAILTALLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVLPPKIL-NH-SFPNDP-----T-T-QSTE-KT-KP---------E-----P-W-NWP-WH------------V-TV--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq678 ----M--ILSFFDQFMSPT-HLGIPLIALALSLPWVLIPT-PTNRWLNNRLLTLQGWFINRFTQQLMLPINLGGHKWAVLLTALMLLLITLNLLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPMMPTVAILTSTVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFMILIFSW-LIFLIVLPPKVL-GH-TFTNEP-----T-H-KNAE-KI-KP---------E-----P-W-TWP-WS------------V-AI--TRGFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTGHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq679 ----M--TLSFFDQFAIPH-ALGIPLILIAIIMPTLLILN-PSNRLVHNRLSTLQLWLSKTFTKQLMLPINLGGHKWASTLLALTLLLLSLNLLGLLPYTFTPTTQLSMNMALAVPMWLSTVLIGMRNQPT-VSLGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAVFVLTPSMTLTASMAFIVLLLL---TGLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFLIMLLVW-AALMIIFLNKTL-MM-LSPNTP-----T-E-TASE-TK-HM---------T-----S-W-TWP-WH------------V-SI--NRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq680 ----M--TMSFFDQFASPF-YLGIPLITIAITLPWVLFPT-LSSRWINNRLITIQSWFISRFTNQLLLPLNVGGHKWALLLTSLMVFLITINMLGLLPYTFTPTTQLSLNMAFAVPLWLATVIIGMRNQPT-IALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLIIIPAKVM-SH-ISPNEP-----A-T-MDSK-KH-KT---------E-----S-W-DWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq681 ----M--NENLFASFITPT-LMGLPIIILIIAFPNILFPS--PNRLINNRLVSFQQWLIQLVLKQMMTMHNLKGRTWSLMLISLIMFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRHKTK-ASLAHFLPQGTPIPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLMHLIGGATLVLTSISTPTAMITFIILVLL---TVLEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITIISMI-LALFMLFQSKIA-NH-SYYSNP-----SHK-DMKP-TTHST---------------P-W-EKK-WTKIYLPLSLPLH-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq682 ----M--TLSFFDQFSLTA-FMGIPLIALALTLPWILYPT-PQNRCLNNRLLTLQAWFIRQLTHQLFLPINPGGHKWALLLASVLIFLITLNLLGILPYTFTPTTQLSMNMGLAVPLWLATVLIGARHQPT-HSLAHLLPVGTPTPLIPILIMIETISQFIRP--IALGVRLTANLTAGHLLIQLISTAAFYLAFTMPTVSILTMGLLLLL---SILELAVAIIQAYVFVLLVSLYLQES-V-M-PQLNPSPWLLILLFSW-LILLTTVFPKIM-RH-RFTNEP-----A-T-QATK-KH-HP---------T-----P-W-NWP-WH------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq683 ----M--MLSFFDQFLSPL-YLGVPLVGIALLMPCIILSV-PTKQWLNNRTTVLQTWLMINFTKQLLTPFNMNGQKWALILTSLLMFLITLNLLGLLPHTFTPTTQLSLNMALAVPMWFSTVLLGLRTQPT-TSLGHLLPEGTPLLLIPLLILIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATFVLMPIMTSVALLTLIILILL---ALLEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFLMLMVTW-IVFLVLLCNKIT-HY-KSFNDI---------NTKK-YNKSH---------E-----A-R-NWP-WY------------V-MI--TRWFFSTNHKDIGTLYLVFGAWAGMAGTGLSLLIRSELSQPGTLLGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASAGVEAGAGTGWTVYPPLAGNISHAGPS [...]
+Seq684 ----M--ALNFFDQFMSPV-YLGIPLMALALTLPWILFPT-PTLRWLNNRLLTLQNWFIGRFTHELLLPVNVPGHKWALLLASLMLFLISLNMLGLLPYTFTPTTQLSLNMGLAVPFWLATIIIGMRNQPT-ESLGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATGASVLLPLMPTVAILTGILLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLAILVFTW-SVFLIVIPPKVM-AH-TFPNEP-----T-L-QSTE-KP-KT---------E-----S-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWSGMVGTALSLLIRAELSQPGSLLGDDQVYNVIVTAHAFIMIFFLVMPVMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLSSSAVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq685 ----M--TLSFFDQFMSPV-MLGIPLMALALTLPWLLFPA-PTTRWLNNRLLTLQNWFIGRFAHELFMPVNIPGHKWAVLLTALMLFLISLNMLGLLPYTFTPTTQLSLNMGLAFPLWLATVIIGMRNQPT-EALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAAVLLPLMPAVAILTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLSILVFSW-LVFLIILPPKVM-AH-TYPNEP-----T-P-QSTE-KP-KG---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq686 ----M--ILSFFDQFMSPM-LLGVPLIILALSLPWLLFPA-PSGRWLNNRLLTLQAWFINRLTRQLFVLINFTGHKWASLFTALMLFLITLNMLGLLPYTFTPTTQLSLNLGFAVPLWLATVIIGMRNQPT-HALGHLLPEGTPILLIPLLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATTTAVLTPLMPAVAFLTGTLLLLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLATGPWFYILVFSW-LIFLTVLPPKVF-SH-KFPNEP-----S-P-QSTE-ST-RT---------Q-----A-W-NWP-WS------------V-AI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLSSSAVEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq687 ----M--IMSFFDQFLSPS-FLGIPLIALAISIPWLMFPT-PTNRWLNNRLLTLQAWFINRFIYQLMQPMNLGGHKWAILFTALMLFLITINLLGLLPYTFTPTTQLSLNMAFALPLWLTTVLIGMFNQPT-IALGHLLPEGTPTPLVPVLIIIETISLFIRP--LALGVRLTANLTAGHLLMQLIATAAFVLLTMMPTVALLTSLVLFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFIILLFSW-VIFMVILPNKVM-NH-LFNNEP-----A-L-KSTE-KS-KP---------D-----P-W-NWP-WL------------V-AI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASAGVEAGAGTGWTVYPPLAGNMAHAGRS [...]
+Seq688 ----M--TLSFFDQFMSPT-YLGIPLMALALTLPWLLYPT-PTTRWLNNRFLALQGWFINRFTQQLLLPLNIGGHKWAALLTSLMIFLITLNMLGLLPYTFTPTTQLSLNLGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPGPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATGAFVLLPLMPTVAIITTTVLVLL---TLLEVAVAMIQAYVFVLLLTLYLQEN-V-M-PQLNPAPWFAILVFSW-MVFLAVIPAKVT-AH-TFPNTP-----T-L-QSAE-KP-KT---------D-----P-W-TWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq689 ----M--NENLFAPFTAPS-LLGLPAVMPIILFPTLLIST--SKGLINNRLVTIQQNLIQVVLKQMMMTQSTKGQAWSLMLMSLFIFIATTNLLGLLPHSFTPTAQLSMNLAMAIPLWAGTVITGLRFKTK-NSLAHFLPQGTPTPLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGNAALALSINNFFASSLILAPLMAL---MILEIAVALIQAYVFTLLVSLYLHDN-T-M-PQLNTSTWFITIITML-PTLYLIMQLKLL-KT-TYYFSP-----SQK-ASDM-QSFNN---------------P-W-QLK-WTKICLPLSQLHHSM-LI--NRWLFSTNHKDIGTLYLLFGAWAGTAGMAMSLLIRAELGQPGNLLGNDHIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLLASAMVEAGAGTGWTVYPPLAGNLSHPGAS [...]
+Seq690 ----M--TLSFFNQFATPQ-VLGIPLILLAISLPPM-ILI-PTTRLLNNRLTSMQLWATKIFTKQLMLPINYKGHTWSAILTSLMLLLLLMNLLGLLPYTFTPTTQLSMNMGFAIPMWLATILTGLRNQPT-TSLGHLLPEGTPTPLIPILIIIETISLLIRP--IALGVRLTANLTAGHLLIQLISTATITLINMMPMTALILFFILMLL---TCLELAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLLILIMSW-LTLLLLYLTKTT-NF-SNTYTP-----S-I-FQTV-NH-KA---------S-----P-W-AWP-WP------------L-TI--TRWFFSTNHKDIGTLYLIFGAWAGMAGTALSLLIRAELSQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq691 ----M--TLSFFDQFMSPT-YLGIPLMAIAIALPWVLYPT-PSSRWLNNRLLTLQGWFINRFTQQLLLPINPGGHKWVLLFASLMLFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVLPPKVM-AH-TFPNEP-----T-L-QSTE-KP-KT---------E-----P-W-TWP-WH------------V-AT--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq692 ----M--MTSFFDQFLSPT-LLGVPLIMMAMLFTSALFPK-PTKLWLNNRLSALQTWFLMNSMKQLFLPINMQGQKWALILLTLMSFLMTLNLLGLLPYTFTPTTQLSMNMALALPMWLATVLIGLRNQPT-MSFAHLLPEGTPLMLIPSLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATATFVLMPMMPTVALLTAITLLLL---TLLEVAVAMIQAYVFVLLLTLYLQEN-T-M-PQLIPNPWFSIMMITW-MALLAMLLTKMI-KY-ETTNTT---------LPIK-EQKQF---------T-----S-W-NWP-W-------------V-KL--IRWFFSTNHKDIGTLYFIFGVWAGMAGTALSLLIRTELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAGNLAHGGAS [...]
+Seq693 ----M--DMDLFSQFTSPI-LFGVPLWVIAMTYPVYCLPN-TLQNTVKPRLTTALMWTLLQAMMQIMLKISATAQKWVVILTSTVTLLLLYNLFGTLPYVYPPTTQLSIAFGLAFPLWLGTLVKGVKLSVT-NTLAHFLPPSTPAALVPVLVIIETTSMLVRP--VALGMRLAANLTSGHMIMHAVSSVSLVLIQSASLSAALSLTLLGAL---TCLEMAIAGIQAYVFVLLTTLYLQEN-T-M-PHLELTSWLLNCWVSW-IMILVVIPFKIIELRYVETGAP---------LLTGYDVSPV---------------P---TLP-WT------------V-IS--ARWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq694 ----M--NENLFTPFICPS-IMGVSTLPIIILFPCLIFSA--PKRWLPNRMQILQIWLIRLITKQMMLMHNKLGRSWTLMLMSLILFIATTNLLGLLPYSFTPTTQLSMNLGMAIPLWMGTVVMGFRNKPK-ASLAHFLPQGTPTPLIPMLIIIETISLLIQP--LALAVRLTANITAGHLLIHLIGSAALALMSISLALSSITFIILFLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLNTSTWLYVIAFTL-FGIFCAFQLQLI-GIEMIYIYP-----PED-MIKL-PDIPF---------------P-W-EKK-WTKIYLPLSSVLVSM-FI--TRWLFSTNHKDIGTLYLLFGAWAGMIGTALSLLIRAELGQPGTLIGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq695 ----M--NENLFAPFICPS-IMDISTLPIIILFPCLIFSA--PKRWLPNRMQILQIWLIRLITKQMMTMHNKLGRTWTLMLMSLILFIATTNLLGLLPYSFTPTTQLSMNLGMAIPLWMGTVIMGFQNKPK-ASLAHFLPQGTPTPLIPMLIIIETISLLIQP--VALAVRLTANITAGHLLIHLISSAALALLSISITLSSITFIILFLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLNTSTWLHVIGFTL-FGIFCAFQLQLI-GIEMIYIYP-----PED-MIKL-PDIPF---------------P-W-EKK-WTKIYLPLSSVLVSM-FI--TRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGMLIGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq696 ----M--NLSFFDQFMSPS-LLGIPLILISTLFPMLLYPS-PGNRWIPNRLSTLQLWLFHTTTKQLLMPLNKKGHKWALILTSLMTFLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ASLGHLLPEGTPTLLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTASTALLPIMPSISLLTTLILFSL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWLFIMLTSW-VTFSLILQPKLT-LF-IPTNPP-----S-T-KTST-TM-KP---------S-----P-W-NWP-WT------------MTFI--TRWLFSTNHKDIGTLYLIFGAWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASS-VEAGAGTGWTVYPPLASNLAHAGAS [...]
+Seq697 ----M--TLSLFNQFASPV-LLGIPLIALAILLPWTLLPS-PANRWLTNRLLSLQGSFIGGFTKQLVLPLNPGGHKWALLFTSLMVYLITINLLGLLPYTFTPTTQLSLNMGLAIPLWLATVIIGMRNQPT-HSLAHFLPEGTPTLLIPVLVIIETISLFIRP--LALGVRLTANLTAGHLLIHLIAMATNVLFPLMPSVAILTGTLLLLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFLILVFSW-LVFLTILPPKIL-NH-TFPNEP-----T-P-NSSK-KP-LT---------N-----P-W-NWP-WL------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPAFLLLLTSSVVEAGAGTGWTVYPPLSSNLAHAGAS [...]
+Seq698 ----M--NENLFASFATPTMMMGLPIVVLIILFPSILFPT--PNRLINNRLVSLQQWLIQLTSKQMMAIHNQKGQTWTLMLISLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRYKTK-ASLAHFLPQGTPLPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLVLMSISPITAFITFIILVML---TVLEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITIISMI-MTLFIAFQLKIS-KY-LYPMSP-----ELK-SLKA-LKHNN---------------P-W-ETK-WTKIYSPLSLPQQ-M-FV--TRWLFSTNHKDIGTLYMVFGAWAGMVGTALSILIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMLGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq699 ----M--IPNLFEIFATPY-LLKMPLMWLAVMMPAMVLFT-PSQHLVTGRYILLKKWTMKQFTKQIMNPLPTQGHKWTVFFMTLMMTLTSMNMISLLPHTFTPTAQLALTMALAFPLWMATVIIGVLKKTT-RSLAHFLPEGSPTILIPALVVVETISLLIRP--LALGVRLAANLTAGHLLLQLMALAIIHLPTPMWPATVAVATTLMLL---TILEVAVALIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWLSTMVLVW--LSLGVMHQKVKLFQ---NIYP---------TTMCCGAPRP---------------P-W-PWP-W-------------ILPLPYKRWLYSTNHKDIGTLYLLFGAWAGMVGTSLSLLIRGELSYPGTLMGNDQIYNVIVTAHAFTMIFFMVMPVMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLTSAWTETGAGTGWTVYPPLAGNLAHAGPS [...]
+Seq700 ----M--MLSFFDQFMSST-YLGVPLIALAIALPWVLYPT-PSARWLNNRVITLQAWFINRFTQQLLLPLNPGGHKWAALFASLMVFLITMNMLGLLPYTFTPTTQLSLNMGIAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVALIPVLIIIETVSLFIRP--VALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILIFSW-LIFLTLIPPKVL-AH-KFNNEP-----T-V-ASTQ-KA-DT---------T-----P-W-TWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq701 ----M--MLSFFDQFMSST-YLGVPLIALAITLPWVLYPT-PSSRWLNNRVITLQGWFVNRFTQQLLLPLNPGGHKWAALFASLMIFLITMNMLGLLPYTFTPTTQLSLNMGMAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVALIPVLIIIETVSLFIRP--VALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LIFLTLIPPKVL-AH-KFNNEP-----T-V-AGAQ-KA-HP---------D-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq702 ----M--MLSFFDQFMSPT-YLGIPLIALALVLPWTLYPT-PTPRWLNSRLLTLQGWFINRFTQQIFMPINPGGHKWAVMLASLMVFLTSLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPVLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-VVFLTIIPQKIL-AH-NFNNEP-----T-T-MGAE-KA-KP---------E-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMVGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq703 ----M--TLSLFNQFSSPS-YLGIPLILVALSLPWILFPT-PSARWLNNRVLTLQGWFIARFTNQLFLPLNVGGHKWAPLLTSLMIFLLTLNMLGLMPYTFTPTTQLSLNLGIAVPLWLATVIIGMRNQLT-HALGHFLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIHLISSASFVLFCTMPAVSILTVALLLML---TLLEVAVAMIQAYVFILLLSLYLQEN-I-M-PQLNPDPWFMIFILTW-GIFLAVLPFKVM-GH-IFPNEP-----T-P-KSMM-TP-KT---------T-----P-W-NWP-WH------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELGQPGSLLGDDQIYNVLVTAHAFVMIFFMVMPLMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq704 ----M--NLSFFDQFLSPS-LLGIPLIAMAIMIPWLIFPT-PTNRWLNNRLMTVQSWFINRFTYQLMQPMNFGGHKWATILTALMLFLITINLLGLLPYTFTPTTQLSLNMAFAIPLWLTTVLIGMLNQPT-VALGHLLPEGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLMQLIATAAFVLITIMPTVALLTSLILFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPHPWFAILVFSW-IFFLVILPKKVM-TH-LFNNNP-----T-A-KSAE-KP-KP---------E-----P-W-NWP-WT------------V-AI--NRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASAGVEAGAGTGWTVYPPLAGNMAHAGAS [...]
+Seq705 ----M--TLSFFDQFISPV-FLGIPLIALALLVPWLLFPA-ATSRWVNSRLLALQGWFISNFTNQLLLPINFAGHKWALMLMSLMLFLITINMLGLLPYTFTPTTQLSMNMGLAVPLWLATVIIGLRGQPT-VSLAHLLPEGTPPALIPVLIIIETLSLFIRP--FALGVRLTANLTAGHLLLQLVSTAVYVLMSFLPAVALITTALLFLL---TLLEIAVALIQAHVFVLLLSLYLQEN-V-M-PQLDPAPWLMILVLSW-SILLTVIPPKVL-SH-TFPNTP-----N-A-QSAE-KL-ET---------N-----P-W-TWL-WH------------V-AT--TRWLFSTNHKDIGTLYMIFGAWAGMVGTALSLLIRAELSQPGALLGDDQMYNVVVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq706 ----M--NLSFFDQFLTPT-LLGIPLILLALVFPLLLIFM-PPKHWQGSRIYSTQLWFTHNFTKQLLMPLSPQGHKWALLLVSLMLLLISVNLLGLLPYTFTPTTQLSMNLGLAVPLWLATVIIGLRNQPT-IALGHLLPEGTPTPLIPILIAIETVSLFIRP--LALGVRLTANLTAGHLLIQLTSTAILTLLPIMPTIATLTAMVLLML---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPDPWFFIFTASW-FIYLIILLPKTN-SL-KMPGEP-----E-T-PQ-N-KG-KT---------E-----P-L-IWP-WT------------V-MI--TRWLFSTNHKDIGTLYLMFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAGNMAHAGAS [...]
+Seq707 ----M--ILTFFDQFSSPC-LLGIPLIILSMLFPTLLFPT-PNNRWVTNRLTTLQLWLTHTITKQLMIPLNKPGHKWALILTSLMMLLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLVGLRNQPT-TSLGHLLPEGTPTPLIPALIMIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATITLLPIMPTVSIITLTILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFFIMIMSW-LTLSLIIQPKLL-SF-ILTSPP-----I-N-KTST-TT-KT---------N-----P-W-AWP-WS------------VT-L--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq708 ----M--NLSFFDQFASPQ-LLGIPLILLSLLFPTLLLPS-PNNRWINNRLSTLQLWFLQLITKQLMMPLNKAGHKWALILTSLMTFLLLINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ISLGHLLPEGTPTPLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATLALLPTMPTISVLTATVLLLL---TILELAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWLFIMFMSW-TVFLFLMQPKLT-SF-ISTNSP-----S-N-KNKT-TL-TP---------T-----P-W-TWP-WT------------VTFI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq709 ----M--TLSFFDQFMSPF-FLGIPLMALALLLPWILFPT-PTARWQTNRFLTLQNWFINRFTQQLLLPMNLGGHKWALILTSLMLYLITLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAYVLLPLMPTVAILTATLLLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLFFLPPKVM-AH-VFPNES-----S-P-QNTE-KP-KT---------E-----S-W-NWP-WH------------V-AI--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSSVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq710 ----M--VLNFFDQFESPI-LMGLPLMAVAIMLPWIFVPT-PSSRWLNNRLITLQAWFFNRFSYQLLMPINPAGHKWALMLTSLMVFLFLINIFGLLPYTFTPTTQLSLNMGLAVPLWLATVLTGMRNQPT-HALGHLLPEGTPVPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTAVFVLLPLMPPVAILTASVLFLL---TILEVAVAMIQAYVFVLLMSLYLQEN-V-M-PQLNPAPWFTIFIFTW-LVFLTIIPPKVM-AH-TFNNEP-----T-T-MGAE-KA-TP---------E-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALMGDDQVYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSAVESGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq711 ----M--NENLFASFIAPT-MMGLPIVTLIIMFPSLLFPT--PKRLINNRTISIQQWLIQLTSKQMMAIHNQKGQTWSLMLMSLIMFIGSTNILGLLPHSFTPTTQLSMNLGMAIPLWSATVFTGFRYKTK-TSLAHFLPQGTPALLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLIHLIGGATLALLNINTMTAFITFTILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITITSMI-MTLFILFQLKIS-NY-SYPASP-----ESI-ELKT-QKHST---------------P-W-EMK-WTKIYLPLLLPPR-M-FV--NRWLYSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq712 ----M--ALNFFDQFMSPT-YMGIPLMALALTLPWLLYPT-PTTRWLNNRLLTLQSWFINRFTQQLLMPLNVGGHKWALMLTSLMMFLFTINLLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-AALGHLLPEGTPALLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVYVLLPMMTTVALLTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-AVFLTVIPTKIM-AH-TFNNEP-----N-P-QATK-TP-KT---------D-----P-W-NWP-WH------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq713 ----M--ILSFFDQFMSPS-LMGIPLIFLALTLPWILYPT-PSSRWLDNRLLTLQNWAIARFTSQLLMPLNVGGHKWATLLTSLMVFLITLNMLGLLPYTFTPTTQLSLNMAFAVPLWLATVIIGMRNQPT-AALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVALLTAALLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFSIMLFSW-LIFLTVIPPKVI-KH-TFPNEP-----A-T-QPAD-KM-KT---------E-----P-W-AWP-WS------------V-TV--TRWFFSTNHKDIGTLYMIFGAWAGMVGTALSLLIRAELNQPGALLGDDQIYNVIGTAHAFVMIYFMVMPIMIGGFGNWLNPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLADAGAS [...]
+Seq714 ----M--NLSFFDQFASPC-LLGVPLILLSMLFPALLLPS-PDNRWLTNRLSTLQLWFFHLITKQLMMPLNKTGHKWALVLTSLMMFLLTINLLGLLPYTFTPTTQLSMNMALAFPLWLATLLTGLRNQPS-ASLGHLLPEGTPTPLIPALIMIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATTALLPIIPAVSLLTALILLLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFLIMLMSW-ITFSMIIQPKLL-SF-TPTNPP-----S-N-KTPT-TT-KN---------T-----P-W-IWP-WT------------VTLI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq715 ----M--NENLFASFITPT-ILGISILPLIMIFPCLLFSA--PNRWMPNRLVALQLWLVRMVTKQMMSMHNKQGRMWTLMLITLIMFIASTNLLGLLPYTFTPTTQLSMNMGMAVPLWLGTVLMGFRNKPK-SSLAHFLPQGTPTPLIPMLIIIETISLFIQP--VALAVRLTANITAGHLLIHLIGSATLALSSISLTVSTITFTILFLL---TILEIAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFMAILLMV-FTIYGIFQLKVV-KY-LPTVLP-----TPSTQAMP-VTNLT---------------P-W-NSK-WTKIYLPHSSLLQSM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMAGTALSILIRSELGQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLVSSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq716 ----M--NLSFFDQFSSPS-LLGIPLILISMTFPALLLPS-MDNRWITNRLSTLQLWFINLVTKQLMTPLNKKGHKWALILTSLMVFLLLINLLGLLPYTFTPTTQLSMNLALAFPLWLATLLTGLRNQPS-ISLAHLLPEGTPTLLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATVALATTMPAVSLLTLLVLFLL---TILEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWLFIMLISW-LTFSMIIQPKIL-TF-VSANPP-----S-N-KVYS-TP-KT---------T-----P-W-TWP-WT------------MTYI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGALLGDDQVYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGVGTGWTVYPPLAGNLAHAGAS [...]
+Seq717 ----M--TLSFFDQFLSPT-AFGIPLIALALLLPWTLFPT-PTNRWTNNRLLTLQSQFINRFTQQLLLPLNMGGHKWGPYIASLMVFLITINMLGLLPYTFTPTTQLSVNMALAVPLWLATVIIGMRNNPT-AALGHLLPEGTPNALIPILIIIETVSLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTSTLLFLL---TLLEVAVEMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFLIMVFSW-CVFLIFLPPKIM-AH-LFPNEP-----S-S-QNTC-PK-EI---------K-----P-W-PWS-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq718 ----M--TLSFFDQFNIPS-LLGISLMIPAMLFP-TTLWL-TTSRLIQNRHSTIQSSLVFSMMKQMMLPINTKGHKWTSTFMALLLLLIFLNTLGLLPYTFTPTTQLSMNMALAVPAWLMTILTGLRNQPT-AALGHLLPEGTPTPLIPMLVLIETTSLFIRP--IALGVRLTANLTAGHLLIQLTSTAIVSLIPTMALTAMTTFIILILL---TCLEMAVALIQAYVFVLLLTLYLQEN-I-M-PQLNPAPWFLAFLLAW-FT---MFVMSTK----ILNSKP-----KLLTTPYL-EQ-LN---------N-----PNW-TWP-WP------------V-SL--TRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRTELSQPGSLLGDDQVYNVIVTAHAFVMIFFLVMPVMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq719 ----M--NENLFASFITPT-MMGLPIVVLIIMFPSIMFPS--PNRLINNRLVSLQQWLIQLTSKQMMTIHNAKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRHKTK-ASLAHFLPQGTPLPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMSISTATALVTFIILILL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFTTILATI-TTLFILFQLKIS-KY-IYPSSP-----ELK-SMKS-LKHNT---------------P-W-ETK-WTKIYSPLSLPLQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPILLGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq720 ----M--NENLFASFISPT-MMGLPIVMLIIMFPTILFPA--PNRLINNRMISMQQWLTNLVLKQMMMIHNPKGRTWALMLTSLIMFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVIMGFRHKTK-SALAHFLPQGTPMSLIPMLIIIETISLFIQP--IALAVRLTANITAGHLLMHLIGGATLALMSISPTTALITFIILVLL---TMLEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLVTITSMI-LTLFILMQLKFT-KH-YFHQTP-----MPD-TPNS-TKQQT---------------P-W-ETK-WTKIYLPPSSLQR-M-FI--SRWLFSTNHKDIGTLYLLFGAWAGMVGTGLSILIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLTHAGAS [...]
+Seq721 ----M--NENLFAPFITPT-IMGITTLPIIMTFPCLMLSS--PKRWLPNRIQVLQIWLIRLITKQMMAMHNIQGRSWTLMLMSLILFIGSTNLLGLLPYSFTPTTQLSMNIGMAIPLWMGTVVMGFRNKPK-ASLAHFLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSISMTVSMITFSILLLL---TILELAVAMIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFLTIILMV-ISLFCIYQLKML-NQ-PMNSIT-----PTSEKEMCTTPTTQ---------------PHW-NSK-WTKIYLPHSSPLRSM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLIGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq722 ----M--NENLFASFITPT-MMGLPVVILIIMFPTMLFPT--PTRLINNRFISLQQWLIQLVLKQMMTMHNNKGRTWSLMLVSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGAVITGFRYKTK-ASLAHFLPQGTPILLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLMHLIGGATLILLSINTIAASTTFIILTLL---TILELAVALIQAYVFTLLVSLYLHDN-T-M-PQLNTSTWFITILSMT-LTLFILFQLNIS-KL-TYPLNL-----NLK-NINT-ETFKL---------------P-W-ELK-WTKTYSPLSLPPQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLMASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq723 ----M--MLNFFDQFLTPK-LLGIPLMLIAMLLP-AITLY-PSSRLLPNRTLATKMWLMNSFIKQLMGPLNKMGHSWAAILLMVMYYLLVTNLLGLLPYTFTPTTQLSLNMSLAVPLWLSTVLLGLRNQPT-TSLSHFLPTGTPTLLIPILIIIETISLFIRP--LALGVRLTANLTAGHLLMQLISTAALILAPLMPTLSILTTILLLLL---TGLEIAVAMIQAYVFVLLLSLYLQEN-T-M-PQLSPSPWLPIMLTAW-AILLLIIMPKLL-KL-TTTNTP-----Q-P--PHT-KP-HN---------T-----T-W-SWP-WY------------V-MI--HRWFFSTNHKDIGTLYLIFGAWAGMAGTGLSLLIRAELGQPGALLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAANLAHAGAS [...]
+Seq724 ----M--NLTLFNQFMSPQ-ILGIPLITLALLTPSIMFPT-QNNRWLTNRLSTLQLWAINLFTKHLMLPMNKTGHKWSIILTPLMVLLLTINLLGLLPYTFTPTTQLSMNMGLAIPMWMATVLTGFRNQLT-TSLGHLLPEGTPTPLTPILIMIETISLFIRP--LALGVRLTANLTAGHLLIQLISIALLALLKTMTTLSVLTMTILLLL---TVLELAVAMIQAYVFVLLLSLYLQEN-T-M-PQLNPDPWFLVLTSTW-LTYTIILQPKIL-SY-LPTNSP---NQD-N-KNNK-TI-NT---------K-----P-W-TWP-WT------------V-FL--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq725 ----M--NLMLFDQFMSPQ-ILGIPLITLALLTPSVMLPT-QNNRWLTNRFSTLQLWAINLFTKHLMLPINKTGYKWSIILTSLMALLLTINLLGLLPYTFTPTTQLSMNMGLAIPMWMATVLTGFRNQLT-TSLAHLLPEGTPTPLTPILIMIETISLFIRP--LALGVRLTANLTAGHLLIQLISASVLALMKTTMTLSILAMATLLLL---TILELAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPDPWFLVLSSTW-LTYAIILQPKIS-SY-LPTNTP----NK-N-KNNK-II-NT---------K-----P-W-TWP-WT------------V-FL--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLVRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq726 ----M--NLMLFDQFMSPQ-ILGIPLIILALLTPSIMFPT-QNNRWLTNRLSTLQSWAINLFTKHLMLPMNKTGHKWSIILTSLMVLLLTINLLGLLPYTFTPTTQLSMNMGLAIPMWMATVLTGLRNQLT-TSLGHLLPEGTPTPLTPILIMIETISLFIRP--LALGVRLTANLTAGHLLIQLISISLLALLKTMTTLSVLTMATLLLL---TILELAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPDPWFLILTSTW-LTYTIILQPKIS-SY-LPTNTPNQNNQN-N-KNNK-IT-NT---------K-----P-W-AWP-WT------------V-FL--TRWFFSTNHKDIGTLYLIFGAWAGMMGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq727 ----M--NLMLFDQFMSPQ-ILGIPLIILALLTPSIMFPT-QNNRWLTNRLSTLQLWAINSFTKHLMLPMSKTGHKWSIILTSLMVLLLTINLLGLLPYTFTPTTQLSMNMGLAIPMWMATVLTGLRNQLT-TSLGHLLPEGTPTPLTPILIMIETISLFIRP--LALGVRLTANLTAGHLLIQLISISLLALLKTTMTLSILTMTILLLL---TILELAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPDPWFLVLTSTW-LTYTIILQPKIL-SY-LPTNTP---SQD-N-KNNK-II-NA---------K-----P-W-TWP-WT------------V-FL--TRWFFSTNHKDIGTLYLIFGAWAGMVGMALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq728 ----M--TLSFFDQFLSPT-LFGIPLIALALLLPWTLFPA-PSSRWVNSRLLTLQSWFINRFTQQLLLPLNMGGHKWGPYILLVMVFLISINMLGLLPYTFTPTTQLSVNMALAVPVWLMTVIIGLRKNPT-AALGHLLPEGTPVPLIPALILIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTTILLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFAIMVFSW-FVFLIFLPPKIM-AH-TFPNEP-----T-A-QSTQ-TL-KT---------K-----S-W-TWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq729 ----M--TLSLFDQFSSPS-FLGIPMILMALALPWLLIPT-PTSRWLSNRVVSLQGWFIARFTNQLFLPLNVGGHKWAPLLASLMMFLLTLNMLGLLPYIFTPTTQLSLNLGLAVPLWLATVLIGMRNQPT-HALGHFLPEGTPTALIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIHLISSAVFVLMPMMPAVAILTAVLLLLL---TMLEVAVAMIQAYVFILLLSLYLQEN-V-M-PQLNPAPWFMIFMFTW-AIFLTILPPKVM-AH-TFPNEP-----S-P-QGMT-TP-KT---------A-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPLMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq730 ----M--TLSLFDQFSSPS-FLGIPMILMALALPWLLIPT-PTSRWLSNRVVSLQGWFIARFTNQLFLPLNVGGHKWAPLLASLMMFLLTLNMLGLLPYIFTPTTQLSLNLGLAVPLWLATVLIGMRNQPT-HALGHFLPEGTPTALIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIHLISSAVFVLMPMMPAVAILTAVLLLLL---TMLEVAVAMIQAYVFILLLSLYLQEN-V-M-PQLNPAPWFMIFMFTW-AIFLTILPPKVM-AH-TFPNEP-----S-P-QGMT-TP-KT---------A-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPLMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq731 ----V--NLSFFDQFMSPV-LMGVPLIVLSLMFPLLMIPA-PAAQWAGSRTQSLQLWLYNNFTKQLLMPLNTHGHKWALLLLSLVLLLISMNLLGLMPYTFTPTTQLSMNLGLAIPLWLATVIMGLRNMPT-AALGHLLPEGTPTLLTPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLISTATLVLMPLMPMVAFLTAAVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFFILLMSW-LVYLMMA-PKTS-NL-KTLNEL-----T---IKND-KN-TA---------S-----S-W-NWP-WT------------V-MI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLLPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNMAHAGPS [...]
+Seq732 ----M--NENLFSSFMTPS-LIGIPMITMIILFPTILFPT--PNRLINNRLISLQQWLMNLVLKQMMTMHTPKGRTWSLMLMTLIMFIASTNLLGLLPHSFTPTTQLSMNLGMAIPLWFATVVLGFRHKAK-KSLAHFLPQGTPIPLIPMLIIIETISLFIQP--VALAVRLTANITAGHLLIHLISAATLTLMSINFPTATILFTILILL---TILELAVAVIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWALTIISMI-ITLFYFFQKKMM-SY-YYYNIN-----SQLKPMKT-PKHLT---------------P-W-EKK-WTKTYSPL----S-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLSSSMIEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq733 ----M--TLSFFDQFMSPV-FLGIPLMALALTLPWVLFPT-PTSRWLNNRLLTLQNWFIGRFAHELFMPVNLPGHKWAVLLTSLMLFLISLNMLGLLPYTFTPTTQLSLNMGLAFPLWLATVIIGMRNQPT-EALGHLLPEGTPTLLIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAATVLLPLMPTVAILTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLAILVFSW-LVFLIIIPPKVM-AH-SFPNEP-----T-P-QSTE-KP-KG---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq734 ----M--TLSFFDQFMSPV-FLGIPLMALALTLPWVLFPT-PTSRWLNNRLLTLQNWFIGRFAHELFMPVNLPGHKWAVLLTSLMLFLISLNMLGLLPYTFTPTTQLSLNMGLAFPLWLATVIIGMRNQPT-EALGHLLPEGTPTLLIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAATVLLPLMPTVAILTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLAILVFSW-LVFLIIIPPKVM-AH-SFPNEP-----T-P-QSTE-KP-KG---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq735 ----M--TLSFFDQFMSPV-FLGIPLMALALTLPWVLFPT-PTSRWLNNRLLTLQNWFIGRFAHELFMPVNLPGHKWAVLLTSLMLFLISLNMLGLLPYTFTPTTQLSLNMGLAFPLWLATVIIGMRNQPT-EALGHLLPEGTPTLLIPVLIVIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAATVLLPLMPTVAILTATLLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWLAILVFSW-LVFLIIIPPKVM-AH-SFPNEP-----T-P-QSTE-KP-KG---------E-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq736 ----M--NENLFAPFITPT-IMGITTLPLIILLPCVMLSS--PKRWLPNRIQILQIWLIRLITKQMMTMHNKQGRTWSLMLMSLILFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWAGTVIMGFRNKPK-MSLAHFLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSISMTVSTITFSILFLL---TILELAVAMIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWSSIIVLMI-LSLFCLFQLKMI-NH-TLIQVP-----SPNETTMT-SKTSL---------------P-W-ENK-WTKIYLPHSSHQPLM-FI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLIGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq737 ----M--NLTFFDQFASPQ-LMGMPLIMISMFFPTLLLPS-PNNRWITNRLTTVQLWSIKSMTKQLMTPLNKSGHKWALILSSLMIFLLLTNLLGLLPYTFTPTTQLSTNMALAFPLWLATILTGLRNQPS-MSLGHILPEGTPTLLIPTLILIETTSQIIRP--LALGVRLTANLTAGHLLIQLVSTATIVLLQILPTLSIITFTILLLL---TILELAVAMIQAYVFVLLISLYLQEN-I-M-PQLNPNPWFSIMTSLW-IIFLLIMQPKSS-TT-YFPNSP-----S---HKTK-PTLKP---------L-----S-W-SWP-WT------------VTFT--TRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPVMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTIEAGAGTGWTVYPPLAGNMAHAGPS [...]
+Seq738 ----M--MMSFFDQFASPS-FLGIPLIAIAIALPWTLLPT-PPSRWVNNRLITLQTWFINRFTNQLMMPLSVGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-IALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFAILVFSW-IVFLSIIPTKIL-SH-TTPNEP-----T-P-MSEE-KH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq739 ----M--TLSFFDQFMSPS-LLGIPLIAIALTLPWTLLPT-VTRRWLNNRLLTLQGWFIGRFTQQLLLPLNLPGHKWALLFASLMIFLISLNMLGLLPYTFTPTTQLSLNMAFAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTALIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPSVAILTTALLFFL---TLLEIAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPAPWFLIFIFSW-FVFLSILPPKIM-TH-SFPNEP-----L-V-KSSE-DI-KT---------N-----P-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq740 ----M--MASFFDQFQSPV-YLGIPLMALALTLPWILYPT-PSTRWLNNRLLTLQGWFINRFTQQLLLPLNPGGHKWAALFASLMVFLISLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRTQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTTILLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILTFSW-LIFLTVIPPKVM-AH-TFPNEP-----A-P-QSTE-KP-KT---------S-----P-W-TWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq741 ----M--MASFFDQFQSPV-YLGIPLMALALTLPWILYPT-PSTRWLNNRLLTLQGWFINRFTQQLLLPLNPGGHKWAALFASLMVFLISLNMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRTQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAILTTILLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILTFSW-LIFLTVIPPKIM-AH-TFPNEP-----A-P-QSTE-KP-KT---------S-----P-W-TWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq742 ----M--NENLFTPFTTPT-LLSLPAVVPIILFPTLLFPT--SKHLVNNRLITIQQNLTQLILKQMMMIHNTKGRTWSLMLMALIIFIATTNLLGLLPHSFTPTAQLSMNLAMAIPLWAGTVITGLRFKTK-SSLAHFLPQGTPTLLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLMHLIGSAVLALSTINFLVTSLTFVLLLLL---TILEIAVALIQAYVFTLLVSLYLHDN-T-M-PQLNTSTWFITIMTML-PALYLIMQLKLL-NT-NYYLPP-----TQK-TPNT-QMFNN---------------S-W-QLK-WTKIYLPHLQPQHSM-FI--NRWLFSTNHKDIGTLYLLFGAWAGTVGMAMSLLIRAELGQPGNLLGNDHIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRLNNMSFWLLPPSFLLLLASAMVEAGAGTGWTVYPPLAGNLSHPGAS [...]
+Seq743 ----M--TLSLFNQFSSPT-HLGIPLILIALTLPWLLFPA-PSTRWLNNRVLTLQGWFIARFTNQLFLPLNAGGHKWAPLLTSLMIFLLTLNMLGLLPYTFTPTTQLSLNLGLAVPLWLATVIIGMRNQPT-HALGHFLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIHLISSASFVLLPMMPTVAILTTALLLML---TLLEVAVAMIQAYVFILLLSLYLQEN-I-M-PQLNPDPWFMIFILSW-GVFLAILPLKVM-GH-TFPNEP-----T-P-KSMT-TP-KT---------T-----P-W-NWP-WH------------V-SI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELGQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPLMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq744 ----M--MMSFFDQFASPS-FLGIPLMAVAIALPWVLFPT-PPSRWMNSRLITVQTWLINRFTSQLMLPLNVGGHKWALLLASLMVFLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAVLTAAVLLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPNPWFAVLVFSW-AVFLTIIPTKIL-NN-LAPNEP-----A-P-MSKE-KH-KT---------D-----S-W-AWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq745 ----M--NENLFATFITPT-IMGITTLPIIMLFPCLILTT--PKRWLPNRIQTLQIWLIRLITKQMMTMHNKQGRTWTLMLMSLILFIASTNLLGLLPYSFTPTTQLSMNIGMAIPLWLGTVIMGFRNKPK-TSLAHFLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSINMTVSTITFTILFLL---TILELAVAMIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWFLTISLMI-ISLFCVYQTKMI-NQ-TMISIT-----QQNKKDIT-SQTQL---------------H-W-EKK-WTKIYLPHSSPLLSM-FI--TRWLFSTNHKDIGTLYLIFGAWAGMTGTALSLLIRAELGQPGTLIGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSAVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq746 ----M--MLSFFDQFMSPT-YLGIPLIALALSLPWILYPK-PTPRWLNNRLVTLQGWFINRFTQQIFQPLSLGGHKWAALLASLMLFLITLNMLGLLPYTFTPTTQLSLNMAFAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTLLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLTPLMPTVAILTAALLLLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-LVFLTVIPPKVL-AH-TFPNDP-----T-L-QSTE-KP-KT---------E-----P-W-SWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGPS [...]
+Seq747 ----M--NENLFASFITPT-LMGLPIVVLIIAFPSILFPT--TSRLVSNRLVAIQQWVVKLIMKQMMAMHNTKGRTWALMLTSLIIFIGSTNLLGLLPHSFTPTTQLSMNLGMAVPLWAGAVILGFRHKPK-SSLAHFLPQGTPVPLIPMLIMIETISLFIQP--MALAVRLTANITAGHLLMHLIGGATLVLTSISTPTAMLTFIILVLL---TVLEFAVALIQAYVFTLLVSLYLHDN-S-M-PQLDTSTWFITIVSML-ATLFILFQLKLS-SY-CYYNLP-----QTK-TMKT-KKQDT---------------P-W-NQK-WTKTYLPLSLPRH-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq748 ----M--MTSFFNQFMTPT-LLGVPLTLMAVAFPLLTLPA-PARNWVNNRLATIQTWALLAATKQLLAPISAHGQKWALILLSLMMMLITMNLLGLLPYTFTPTAQLSMNMALAVPLWLATVLVGLRNQPT-TSLGHLLPEGTPTLLIPPLIVIETISLVMRP--LALGVRLTANLTAGHLLIQLISTAVFSLLTTMPAVAVLMTLVLLLL---TLLEIAVAMIQAYVFVLLLALYLQEN-T-M-PQLNPAPWFWTLIIIW--LSMLMLWTKFINYEPTNPINP---------FNYQTSHPSN---------------P-W-AWP-W-------------V-AI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVVVTAHAFIMIFFMVMPIMLGGFGNWLVPLMLGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq749 ----M--TLTLFDQFLSPT-LLGIPLILLSTTLPWTLLTN-QPKKWMKNRLTTLQSSFIYTFTKQTMSPINLAGQKWALLLMSLMTFLVMMNLLGLLPYTFTPTTQLSMNMALATPMWLATVLLGFRHQMT-KSLGHLLPEGTPTLLIPPLILIETTSLFIRP--LALGVRLTANLTAGHLLIQLIATASLTLATMMPTLSLLTFLILLLL---AILELAVAIIQAYVFTLLLSLYLQEN-A-M-PQLYPAPWFMIFMLTW-FIFLLVSLTKTT-KH-LPENNI-----L---PKSE-KL-ST---------T-----M-W-TWP-WH------------V-MI--TRWFFSTNHKDIGTLYLIFGAWSGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHALVMIFFMVMPVMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGMGWTVYPPLAANLAHAGPS [...]
+Seq750 ----M--NENLFASFITPT-MMGLPIVILIIMFPTILFPE--PNRLINNRLISMQQWLIQLTSKQMMSIHNSKGQTWTLMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRHKTK-ASLAHFLPQGTPIPLIPMLIIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMNISVATAMVTFIILVLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFITILATI-ITLFMVFQLKIS-KF-IYPSNP-----ELK-SMKS-LKHNT---------------P-W-ETK-WTKIYSPLSLPLQ-M-FI--NRWLFSTNHKDIGTLYMLFGAWAGMVGTALSLLIRAELGQPGALMGDDQIYNVVVTAHAFVMIFFMVMPILLGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq751 ----M--NESLFTSFITPT-MMGIPIVVLIIMFPSILFPS--PSRLVNNRLVSIQQWLVRLTSKQMLSIHNHKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWTGTVAIGLRYKTK-ASLAHFLPQGTPFPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALTSISTITALITFTILVLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSAWSITILSMV-LALFIMFQLKVS-KY-KYPEIP-----EPK-PLSS-PKKPM---------------P-W-EEK-WTKVCSPLLLPQQ-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq752 ----M--NENLFTSFITPT-MVGIPIVLLIIMFPSILFPS--PSRLIDNRLVSIQQWLVRLTSKQMLSIHSHKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVATGFRYKTK-ASLAHFLPQGTPFPLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLIHLIGGATLTLTSISTITAFITFTVLVLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWSITILSMA-LTLFIALQLKVS-KY-KYPETP-----EPK-SLSS-LKKLV---------------P-W-EEK-WTKIYLPLLSPQR-M-FM--SRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq753 ----M--NENLFTSFITPT-MVGIPIVPLIIMFPSILFPS--PSRLIDNRLVSIQQWLVRLTSKQMLSIHSHKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVATGFRYKTK-ASLAHFLPQGTPFPLIPMLVIIETISLFIQP--VALAVRLTANITAGHLLIHLIGGATLTLTSISTITAFITFTVLVLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWSITILSMV-LTLFIALQLKVS-KY-KYPEIP-----EPK-SLSS-SKKLV---------------P-W-EEK-WTKIYLPLLSPQR-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGALLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq754 ----M--NENLFTSFITPM-MMGVPIVVLIVMFPSILFPS--PSRLIDNRLVSIQQWLVRLTSKQMLSIHNRKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVATGFRYKTK-ASLAHFLPQGTPFPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALMSISTITALITFIILVLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWSITILSMV-LALFIMFQLKIS-KY-KYPETP-----EPK-SLSS-SKKLM---------------P-W-EEK-WTKIYSPLLLPRW-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq755 ----M--NENLFTSFITPT-MMGVPIVVLIVMFPSILFPS--PSRLIDNRLVSIQQWLVWLTSKQMLSIHNRKGQTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVATGFRYKTK-ASLAHFLPQGTPFPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALTSISTITALITFIILVLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWSITILSMV-LALFIIFQLKIS-KY-KYPETP-----EPK-SPSP-SKKLM---------------P-W-EEK-WTKIYSPLLLPRR-M-FM--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGILLGDDQIYNVVVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSSLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq756 ----M--AVSFFDQFASPS-YMGIPLIAIAIALPWVLYPK-PTSRWINNRLITIQGWLMNRFTNQLLMPLSTGGHKWALLLTSLMVLLITINMLGLLPYTFTPTTQLSLNMGLAVPLWLATVLIGMRNQPT-IALGHLLPQGTPAPLVPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLDPAPWFMILVFSW-IVFLTIIPTKVL-NH-ITPNEP-----T-P-VSAE-KH-ET---------G-----P-W-NWP-WQ------------V-MI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq757 ----M--NLNLFDQFASPK-LIGIPLIILAISLPTLLIMT-PNMHLTNNRPMAIQLFLKTKLAKQLMLPLSNNGRKWTSTLISLLTFLTVTNLSGLLPYTFTPTTQLSLNMALAAPMWLATVLTGLKNQPT-TSLGHLLPEGTPTPLIPTLILIETISLLIRP--LALGVRLTANLVAGHLLIQLISLAILTTSSTFPTVALLSSLTLLLL---TLLELAVALIQAFVFTLLLSLYLQEN-T-M-PQLNPNPWFLTMVITW-LSLIFLLLAKLL-LT-SPHNLP-----P---LISR-TSP-T---------P-----N-W-IWS-WT------------M-TF--ARWLFSTNHKDIGTLYLIFGTWAGMVGTAMSLLIRAELSQPGTILGNDQIYNVIVTAHALVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSLLLLMASAWTDSGSGTGWTVYPPLAGNIAHAGAS [...]
+Seq758 ----M--MTSLFSQFASPS-LLGIPLVIIAMALPWLLLPT-PSERWLENRAMTLFGWFTTRFTNQLFLPLNLNGHKWAPLFMALMIFLLSINVLGLLPYTFTPTAQLSLNLGLAAPLWLTTVLIGLRNQPT-HTFGHFLPEGSPTPLIPLLIVIETISLLIRP--IALGVRLTANLTAGHLLIHLVSSAVFALLPSMITVAALASTLLFLL---TLLEAAVAVIQAYVFVLLLSLYLQEN-I-M-PQLNTAPWLTTMLFAW-SVLLSILLVQVVNFFPPCELRP---------EEL-TPHLTS---------------P-W-SWP-W-------------V-SI--SRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPLMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSLLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq759 ----M--MLSFFDQFMSPV-CLGIPLIALAISLPWIFFPA-PQIRWLNNRVLTLQGWFMSNFASQLLLPLNPGGHKWAILFTSLMVFLLSINMLGLLPYTFTPTTQLSLNLGFAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTALIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPVVAILTTVVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPTPWFAILVFSW-MIFLVVIPPKIL-AH-VYPNEP-----T-S-QSTQ-KS-KT---------E-----P-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTGLSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq760 ----M--VLSFFDQFMSPV-CLGIPLIALAISLPWIFFPA-PKIRWLNNRLLTLQGWFMSNFTSQLLLPLNPGGHKWAILFTSLMVFLLSINMLGLLPYTFTPTTQLSLNLGFAVPLWLATVIIGMRNQPT-HALGHLLPEGTPAALIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPVVAVLTTVVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPAPWFAILVFSW-MIFLVVIPPKIL-AH-IYPNEP-----T-S-QSTQ-KS-KT---------E-----S-W-NWP-WY------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTGLSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq761 ----M--NLSFFDQFSSPS-LLGIPLVLISTMFPALLIPS-MDKRWVTNRLSTLQLWFINLVTKQLMSPLNNKGHKWALILTSLMIFLLLINLLGLLPYTFTPTTQLSMNLALAFPLWLATLLTGLRNQPS-TSLGHLLPEGTPTLLIPALILIETTSLLIRP--LALGVRLTANLTAGHLLIQLISTATVTLFSTMPAVSLLALLVLFLL---TILEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWLFIMFISW-FTFSMIIQPKIL-TF-VSTNPP-----S-K-KTLT-AP-TT---------T-----P-W-TWP-WT------------MTFI--NRWLFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELGQPGALLGDDQVYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGVGTGWTVYPPLAGNLAHAGAS [...]
+Seq762 ----M--NENLFAPFITPT-IMGITTLPIIMIFPCIILST--PKRWLPNRIQTLQIWLIRQITKQMLSMHNTRGRTWALMLMSLILFIASTNLLGLLPYSFTPTTQLAMNIGMAIPLWLATVIMGFRNKPK-VSLAHFLPQGTPTPLIPMLIIIETISLFIQP--LALAVRLTANITAGHLLIHLIGSATLALSSISMTVSTITFTILFLL---TILELAVAMIQAYVFTLLVSLYLHDN-S-M-PQLNTSTWSLTITLMV-ISLFCIFQLKMM-NQ-TMTSIP-----PQEDKKLP-TKPQL---------------P-W-DKK-WTKIYLPHSSLLQSM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLIGDDQIYNVIVSAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSTVEAGAGTGWTVYPPLAGNMAHAGAS [...]
+Seq763 ----M--NENLFASFATPT-MMGLPIAVLIVMFPSILFPS--PNRLINNRLISIQQWLIQLTSKQMLTIHNQKGRTWALMLMSLILFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVITGFRHKTK-ASLAHFLPQGTPLPLIPMLVIIETISLFIQP--MALAVRLTANITAGHLLIHLIGGATLALINISATTALITFMILVLL---TILEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWLVMILSMI-LTLFILFQLKVS-KH-YYPESP-----GPK-SIKS-ISKHT---------------P-W-ENK-WTKIYSPLSLPLQ-M-FI--NRWLFSTNHKDIGTLYLLFGAWAGMVGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSMVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq764 ----M--MTNLFDQFTPPQ-ALGFKLTLITMLFPILLSPW-TTNRLYTDRVTSITKWTFKMATKHFTSLIPAKGQKWSMILMSTFFLLLTLNILGLLPYTFTPTAHLSMNLAMAIPLWLGTVLTGIISQPT-TSLAHMLPMGTPTPLIPILVVIEFISLMMRP--LALGVRLTANITAGHLLLQLTSTATLATINTMPTLFLLPSCLLFLL---TTLEMAVAMIQAYVFTLLLCLYLEEN-T-M-PQLDMTNWFQVFMFTW--LTLMVLLSKTS-NV-KFVTKP-----TK------LEMKMK-----------------TQTPP-W-------------MSKV--TRWLFSTNHKDIGTLYFLFGTFAGLVGSAVSLMVRTQLAQPGQHT-NDTLYNTFITLHAFIMIFFMVMPIMIGGFGNWLVPMMLGAPDMAFPRMNNMSFWLLPPAFFLLLTASKLGEGVGTGWTIYPPLSGNMAHSGPS [...]
+Seq765 ----M--MVSFFDQFASPS-FLGIPLIAVAIALPWLLFPT-PPSRWINNRLITIQTWFINRFTNQLMMPLSVGGHKWALLFASLMVFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLLPMMPTVAILTATVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPNPWFAILVFSW-IVFLTIIPTKIL-NH-TTPNEP-----T-P-MSEE-KH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq766 ----M--NMNMFDQFASPE-ILLMPVSLVAMLVPIMFIRP--NNSILGNRMSTMLNWFFKTVLLNMIHQLSPIGQKWSRFLVSLLVFILLSNLLGLLPYTFTTTSQLSMNMAMAIPMWMATVVTGMTTKTS-STLAHMLPEGSPTPLIPFMIMIETISLFMRP--IALGVRLTANITAGHLLMTMISSATLNFFNVYNTLCITMTTLLFLL---TLLEMAVACIQAYVFVLLVTLYLQEN-T-M-PQLDIVYIFTNYIWTW--FILISLMWKIQ-TT-LLSSGP-----EQDISMEDLEAELA-----------------WI-LP-WM------------V-FI--TRWLFSTNHKDIGTLYLLFGAWSGLVGACLSILMRMELTQPGSLFGSDQIFNVLVTAHAFIMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPALLLLLSSSYVEAGAGTGWTVYPPLSGNMVHSGPS [...]
+Seq767 ----M--NLSFFDQFMSPV-ILGIPLIAIAMLDPFTLISWPIQSNGFNNRLITLQSWFLHNFTT-IFYQLTSPGHKWALLLTSLMLLLMSLNLLGLLPYTFTPTTQLSLNMGLAVPLWLATVI--MASKPTNYALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLSIMPTVAILTSIVLFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFLILIFSW-LVLLTFIPPKVL-KH-KAFNEP-----T-T-QTTE-KS-KP---------N-----P-W-NWP-WT------------M-AI--TRWLFSTNHKDIGTLYLVFGAWAGLVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq768 ----M--NLSFFDQFMSPT-LLGVPLIAIAMLIPWLLFPN-PSNRWLNNRLMTLQSWFIHNFTKQIFLPINTPGHKWALILASLMLLLMSLNLLGLLPYTFTPTTQLSLNMGLAVPLWLATVIIGLRNQPT-VALGHLLPEGTPTPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPIMPTVSILTSIVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPGPWFAILIFSW-LVLLVIIPPKIL-KH-KTFNEP-----T-T-QTTE-KQ-KP---------N-----P-W-NWP-WT------------V-AI--TRWLFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGTLLGDDQIYNVIVTAHAFIMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq769 ----M--MVSFFDQFASPS-FLGIPLIAIAIALPWILFPT-PPARWINNRLITVQTWFINRFTNQLMMPLNVGGHKWALLLASLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-VALGHLLPEGTPIPLIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAVFVLMPMMPTVAILTAAVLFLL---TLLEVAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPSPWFAILVFSW-TIFLTIIPTKIL-NH-TAPNEP-----T-P-MSEE-KH-KT---------E-----P-W-DWP-W-------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPILIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq770 ----M--NENLFASFITPT-ILGISILPLIMIFPCLLFSA--PNRWVPNRLVALQLWLIRMIAKQMMLIHNKQGRMWTLMLITLIMFIASTNLLGLLPYTFTPTTQLSMNMGMAIPLWLGTVLMGFRNKPK-SSLAHFLPQGTPTPLIPMLIIIETISLFIQP--VALAVRLTANITAGHLLIHLIGSATLALSSISLTVSTITFTILFLL---TILEIAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFMTIFLMI-FTIYGIFQLKVV-KY-LPTVLP-----TSSTQATP-VTKLT---------------P-W-NSK-WTKIYLPHSLLLQSM-FI--NRWLFSTNHKDIGTLYLLFGAWAGMARTALSILIRSELGQPGSLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLVSSTVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq771 ----M--NENLFTSFTSPT-MMGLPIVTLIILFPSMLFPS--PGRLINNRLTSIQQWLIQLTSKQMMLIHNHKGQTWTLMLMSLIMFIGSTNLLGLLPHSFTPTTQLSMNLGMAIPLWAGTVAMGLRTKTK-ASLAHFLPQGTPFPLIPMLVIIESISLLIQP--MALAVRLTANITAGHLLIHLIGGATLALINISAITALITFIILTLL---TVLEFAVALIQAYVFTLLVSLYLHDN-T-M-PQLDTSTWFTTIVSMI-LTLFIVFQLKIS-KH-HFPMSP-----ELK-PLST-SKTNI---------------P-W-EKK-WTKIYSPLSLPLQ-M-FV--NRWLFSTNHKDIGTLYLLFGAWAGMAGTALSLLIRAELGQPGTLLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLVPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSLVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq772 ----L--TVSLFDQFLSPS-YLGIPLILVALTLPWLLFPA-PSPRWLNNRLLTIQNRFINQFVQQLLLPINVGGHKWALILASLMIFLITINMLGLLPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTALIPVLIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPTVAIFTSVLLFLL---TLLEVAVAMIQAYVFILLLSLYLQEN-V-M-PQLNPAPWLMIFMFSW-LVFLTVVVPKAL-AH-SFPNEP-----N-P-QATE-TM-KA---------T-----P-W-NWP-WP------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq773 ----M--MLSFFDQFAAPV-YLGIPLIVLALALPWILLPT-PSARWKNNRFVNLEGWFIRNFAKELLLPIKQGGHKWALLFTSLVVFLITMNVLGLLPYIFTPTTQLSLSLGFAVPLWLATVITGMRNQPK-IAFAHLLPEGTPTLLIPILIIIETVSLLVRP--LALGLRLTANLTAGHLLIELIASAATTLLPLMPVVAFLTAVILFLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-V-M-PQLNPTPWLMILLFSW-MVFLTFVPPKIL-AH-TLPNES-----V-P-QDSK-TD-LA---------H-----S-W-NWP-WY------------V-TI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLSGNLAHAGAS [...]
+Seq774 ----M--TMNLFNQFLSPQ-YLGIPLILVALALPWLLFPP-SSSRWLNNRLLTLQSWFINRLTQQLLLPINVGGHKWALLFASLMIFLITINMLGLIPYTFTPTTQLSLNMGFAVPLWLATVIIGMRNQPT-HTLGHLLPEGTPTALIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIHLISTAAFVLLPLMPTVALLTSLLLFLL---TLLEIAVAMIQAYVFVLLLTLYLQEN-V-M-PQLNPAPWLMILLFSW-MVFLTMVPPKVL-AH-NFPNEP-----T-V-QDSK-TT-ET---------S-----P-W-TWP-WQ------------V-AI--TRWFFSTNHKDIGTLYLVFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
+Seq775 ----M--TLSFFDQFMSPT-LLGIPLIAVALALPWTLFPS-ATRRWLNNRLLTLQGWFISRFTQQLLLPLNSAGHKWAVLFASLMIFLITLNMLGLLPYTFTPTTQLSLNMAFAVPLWLATVIIGMRNQPT-HALGHLLPEGTPTALIPILIIIETISLFIRP--LALGVRLTANLTAGHLLIQLIATAAFVLLPLMPSVAVLTATLLLLL---TLLEIAVAMIQAYVFVLLLSLYLQEN-I-M-PQLNPSPWFLIFIFSW-FVFLTILPPKVM-TH-NFPNEP-----L-A-KDVK-DT-KT---------N-----S-W-NWP-WH------------V-AI--TRWFFSTNHKDIGTLYLIFGAWAGMVGTALSLLIRAELSQPGALLGDDQIYNVIVTAHAFVMIFFMVMPIMIGGFGNWLIPLMIGAPDMAFPRMNNMSFWLLPPSFLLLLASSGVEAGAGTGWTVYPPLAGNLAHAGAS [...]
diff --git a/examples/aa-revmat/call-parallel.sh b/examples/aa-revmat/call-parallel.sh
new file mode 100755
index 0000000..1e87dc2
--- /dev/null
+++ b/examples/aa-revmat/call-parallel.sh
@@ -0,0 +1,22 @@
+#! /bin/bash
+
+binname=exabayes
+
+if [ $# != 1 ]; then
+    echo -e  "Usage: Please enter path to $binname"
+    echo -e  "Example: ./call.sh ../$binname"
+    exit
+fi
+
+bin=$1
+
+if [ ! -x $bin ]; then
+    echo -e  "Error: $bin is not an executable file."
+    exit
+fi
+
+
+# this is a pretty memory intensive dataset. Let's trade as much runtime for memory as possible: 
+cmd="$mpi -np 2 $bin -f aln.phy -m PROT -c config.nex -n myRun -s 123 -M 3 -S"
+echo -e    "\n\ncommandline:\n$cmd\n\n"
+eval "$cmd"
diff --git a/examples/aa-revmat/call.sh b/examples/aa-revmat/call.sh
new file mode 100755
index 0000000..21ab271
--- /dev/null
+++ b/examples/aa-revmat/call.sh
@@ -0,0 +1,21 @@
+#! /bin/bash
+
+binname=yggdrasil
+
+if [ $# != 1 ]; then
+    echo -e  "Usage: Please enter path to $binname"
+    echo -e  "Example: ./call.sh ../$binname"
+    exit
+fi
+
+bin=$1
+
+if [ ! -x $bin ]; then
+    echo -e  "Error: $bin is not an executable file."
+    exit
+fi
+
+# this is a pretty memory intensive dataset. Let's trade as much runtime for memory as possible:
+cmd="$bin -f aln.phy -m PROT -c config.nex -n myRun -s 123 -M 3 -S"
+echo -e   "\n\ncommandline:\n$cmd\n\n"
+eval "$cmd"
diff --git a/examples/aa-revmat/config.nex b/examples/aa-revmat/config.nex
new file mode 100644
index 0000000..55e68d9
--- /dev/null
+++ b/examples/aa-revmat/config.nex
@@ -0,0 +1,12 @@
+#NEXUS
+
+begin params; 
+      revmat = (0)
+end; 
+
+begin run; 
+ numruns 2 
+ parsimonyStart  true
+ printFreq 10 
+end; 
+
diff --git a/examples/aa/aln.phy b/examples/aa/aln.phy
new file mode 120000
index 0000000..7e0f05e
--- /dev/null
+++ b/examples/aa/aln.phy
@@ -0,0 +1 @@
+../aa-revmat/aln.phy
\ No newline at end of file
diff --git a/examples/aa/call-parallel.sh b/examples/aa/call-parallel.sh
new file mode 100755
index 0000000..240f0f7
--- /dev/null
+++ b/examples/aa/call-parallel.sh
@@ -0,0 +1,22 @@
+#! /bin/bash
+
+binname=exabayes
+
+if [ $# != 1 ]; then
+    echo -e  "Usage: Please enter path to $binname"
+    echo -e  "Example: ./call.sh ../$binname"
+    exit
+fi
+
+bin=$1
+
+if [ ! -x $bin ]; then
+    echo -e  "Error: $bin is not an executable file."
+    exit
+fi
+
+
+# this is a pretty memory intensive dataset. Let's trade as much runtime for memory as possible: 
+cmd="$mpi -np 2  $bin -f aln.phy -m PROT -c config.nex -n myRun -s 123 -M 3 -S"
+echo -e  "\n\ncommandline:\n$cmd\n\n"
+eval "$cmd"
diff --git a/examples/aa/call.sh b/examples/aa/call.sh
new file mode 100755
index 0000000..30959e0
--- /dev/null
+++ b/examples/aa/call.sh
@@ -0,0 +1,23 @@
+#! /bin/bash
+
+
+binname=yggdrasil
+
+if [ $# != 1 ]; then
+    echo -e  "Usage: Please enter path to $binname"
+    echo -e  "Example: ./call.sh ../$binname"
+    exit
+fi
+
+bin=$1
+
+if [ ! -x $bin ]; then
+    echo -e  "Error: $bin is not an executable file."
+    exit
+fi
+
+
+# this is a pretty memory intensive dataset. Let's trade as much runtime for memory as possible:
+cmd="$bin -f aln.phy -m PROT -c config.nex -n myRun -s 123 -M 3 -S"
+echo -e  "\n\ncommandline:\n$cmd\n\n"
+eval "$cmd"
diff --git a/examples/aa/config.nex b/examples/aa/config.nex
new file mode 100644
index 0000000..c3186dc
--- /dev/null
+++ b/examples/aa/config.nex
@@ -0,0 +1,19 @@
+#NEXUS
+
+begin params; 
+ stateFreq = (0)       [ also integrate over state frequencies ] 
+end;  
+
+begin run; 
+ numruns 2 
+ parsimonyStart  true
+ printFreq 10
+end; 
+
+begin priors; 
+ aaPr disc(  DAYHOFF=1, DCMUT=1, JTT=1, MTREV=1, WAG=1, 
+       	      RTREV=1, CPREV=1, VT=1, BLOSUM62=1, MTMAM=1, 
+	      LG=1, MTART=1, MTZOA=1, PMB=1, HIVB=1, HIVW=1, 
+	      JTTDCMUT=1, FLU=1) 
+end; 
+
diff --git a/examples/binary/aln.model b/examples/binary/aln.model
new file mode 100644
index 0000000..4725d6c
--- /dev/null
+++ b/examples/binary/aln.model
@@ -0,0 +1 @@
+BIN, gene = 1 -10 
diff --git a/examples/binary/aln.phy b/examples/binary/aln.phy
new file mode 100644
index 0000000..8b05fe4
--- /dev/null
+++ b/examples/binary/aln.phy
@@ -0,0 +1,11 @@
+10 10
+A 0000011000
+B 0010110000
+C 1101010000
+D 1010001000
+E 0100101000
+F 0101000100
+G 0000000000
+H 0010001010
+I 1001000100
+J 0000000000
diff --git a/examples/binary/call-parallel.sh b/examples/binary/call-parallel.sh
new file mode 100755
index 0000000..fa7e030
--- /dev/null
+++ b/examples/binary/call-parallel.sh
@@ -0,0 +1,22 @@
+#! /bin/bash
+
+binname=exabayes
+
+if [ $# != 1 ]; then
+    echo -e  "Usage: Please enter path to $binname"
+    echo -e  "Example: ./call.sh ../$binname"
+    exit
+fi
+
+bin=$1
+
+if [ ! -x $bin ]; then
+    echo -e  "Error: $bin is not an executable file."
+    exit
+fi
+
+
+# this is a pretty memory intensive dataset. Let's trade as much runtime for memory as possible: 
+cmd="$mpi -np 8  $bin -R 2 -C 2  -f aln.phy -q aln.part -c config.nex -n myRun -s 123"
+echo -e   "\n\ncommandline:\n$cmd\n\n"
+eval "$cmd"
diff --git a/examples/binary/call.sh b/examples/binary/call.sh
new file mode 100755
index 0000000..d9f3dbe
--- /dev/null
+++ b/examples/binary/call.sh
@@ -0,0 +1,22 @@
+#! /bin/bash
+
+binname=yggdrasil
+
+if [ $# != 1 ]; then
+    echo -e  "Usage: Please enter path to $binname"
+    echo -e  "Example: ./call.sh ../$binname"
+    exit
+fi
+
+bin=$1
+
+if [ ! -x $bin ]; then
+    echo -e  "Error: $bin is not an executable file."
+    exit
+fi
+
+
+# this is a pretty memory intensive dataset. Let's trade as much runtime for memory as possible: 
+cmd="$bin -f aln.phy -q aln.part -c config.nex -n myRun -s 123"
+echo -e   "\n\commandline:\n$cmd\n\n"
+eval "$cmd"
diff --git a/examples/binary/config.nex b/examples/binary/config.nex
new file mode 100644
index 0000000..3e2564d
--- /dev/null
+++ b/examples/binary/config.nex
@@ -0,0 +1,19 @@
+#NEXUS
+
+begin params; 
+ [ apply an arbitrary linking scheme here ] 
+
+[  stateFreq = (0+1+2) ]
+[  brlens = (0+1,2+3)]
+[  ratehet = (0-3)]
+
+end;  
+
+begin run; 
+ numruns 4 
+ numCoupledChains 4 
+ numgen 1e4 
+ numswapspergen 4 
+ parsimonyStart  true
+end; 
+
diff --git a/examples/configFile-all-options.nex b/examples/configFile-all-options.nex
new file mode 100644
index 0000000..6818390
--- /dev/null
+++ b/examples/configFile-all-options.nex
@@ -0,0 +1,185 @@
+#NEXUS
+
+[ In this config file everything is commented out.  Remove the square
+  brances to activate an option. ]
+
+[ In most instances, it is convenient to use the scientific notations also
+   for integer variables (e.g., write 1e6 for requesting numgen=1000000) ] 
+
+[ all keywords are case-insensitive ]
+
+
+[================================================================]
+[                               GENERAL                          ] 
+[================================================================]
+begin RUN; 
+ [ RUN PARAMETERS ]
+ [ numRuns  2 ] 	   	[ number of independant runs ]
+ [ numGen 100000 ] 		[ number of generations to run. If a convergence criterion is used, this is the minimum number of generations to run.  ] 
+ [ diagFreq 5000 ] 		[ check for convergence of multiple independent runs after this many generations ]
+ [ samplingFreq 500 ] 	        [ take a sample every n generations ]
+ [ tuneFreq 100 ]    	 	[ tune move parameters every n generations, set to 0, if you want to disable parameter tuning ] 
+ [ printFreq 1000 ]  		[ print a sample to the screen every n generations, set to 0 if you want to disable output info about the state of the chains  ]
+
+ [ parsimonyStart false ]   [ if true: use parsimony trees as starting trees, else: use random starting trees ] 
+ [ heatedChainsUseSame  false ]   [ should heated chains start with the same tree as the cold chain? default: false] 
+ [ checkPointInterval   10000 ]	  [ defines how often a checkpoint is written ]
+
+ [ MCMCMC ]
+ [ numCoupledChains  2] 	[ number of chains per independent run (only one is cold)  => must be > 0] 
+ [ heatFactor 0.1 ]     	[ the heat increment added to each hotter chain (this is not the inverse heat)   ]
+ [ numSwapsPerGen 1 ]           [ number of swaps attempted on average per generation ] 
+
+ [ CONVERGENCE ]
+ [ convergenceCriterion mean ]  [ indicates whether a topological convergence criterion should be used. Valid values: none, mean (default), max ] 
+ [ sdsfIgnoreFreq  0.1 ]        [ ignore clades for which the relative frequency does not exceed this value in any chain (here 10%) ]
+ [ sdsfConvergence 0.01 ]       [ consider runs converged (and stop) once the asdsf or msdsf is below this value (here 1%): 1-5% is considered good, 0.5% can be considered very good convergence ] 
+
+ [ BURNIN ] 
+ [ burninGen 2000 ]		    [ exact number of generations that are discarded for diagnostics ]  
+ [ burninProportion      0.25 ]     [ discard this proportion of all initial samples as burnin  ]
+
+ [ proposalSets     false ]      [ enables accumulation of proposal into proposalSets. Very IMPORTANT, if you run an analysis using multiple unlinked parameters ]
+end; 
+
+
+begin params; 
+[================================================================]
+[ PARAMETERS: definition and linking ]
+[================================================================]
+
+[ stateFreq = (0-3)   ]    [ state frequencies ] 
+[ rateHet   = (0-3)   ]    [ rate heterogeneity among sites ] 
+[ revMat    = (0-3)   ]    [ reversible substitution rate matrix ] 
+[ brlens    = (0-3)   ]    [ branch lengths ] 
+[ aaModel   = (0-3)   ]    [ fixed-rate amino acid substitution matrix ] 
+
+[ brlens    = (0:3)   ]    [ branch lengths are now linked by default. Use this statement to UNLINK branch lengths (assuming, you have 4 partitions) ] 
+
+[ syntax for linking: ] 
+[ brlens = (0-3)      ]    [ linked: one branch length parameter, linked across all 4 partitions ]
+[ brlens = (0:3)      ]    [ unlinked: 4 branch length parameters (one for each partition)  ] 
+[ brlens = (0+1,2,3)  ]    [ the first parameter is linked for partitions 0 and 1 ] 
+[ brlens = (0-2,3)    ]    [ first parameter linked across the first 3 partiions, a separate parameter for the last partition ] 
+  
+end;  
+
+
+[================================================================]
+[ PRIOR configuration ]
+[================================================================]
+begin PRIORS; 
+[ TOPOLOGY: fixed or uniform  ]
+[   topoPr fixed()      ] 
+[   topoPr uniform(0,0) ]
+
+
+[ BRANCH LENGTHS: uniform, exponential or fixed ]
+[ brlenpr uniform(1e-6,4)     ] 
+[ brlenpr fixed()             ]      [ you should have provided a user tree with branch lengths, otherwise 0.1 ]  
+[ brlenpr fixed(0.1)          ]      [ fixes branch lengths to 0.1 ] 
+[ brlenpr exponential(10)     ]      [ exponential distribution with mean value 0.1 ] 
+
+[ SUBSTITUTION MATRIX: dirichlet or fixed, 6 values for DNA, 190 for AA (you must have defined a revMat parameter for the respective partitions) ]
+[ order of the substitution rates corresponds to the order in the ExaBayes_parameters* output file ]
+[ revMatPr dirichlet(1,2,3,
+		       4,5,
+		         6) ]            [ for DNA (rates are relative to each other and will be normalized, s.t. they sum up to 1) ]
+[ revMatPr dirichlet( 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
+  	   	          1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
+			      1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
+			          1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
+				      1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
+				          1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
+					      1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
+					          1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
+						      1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
+						          1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,	
+							      1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
+							          1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
+								      1.0,1.0,1.0,1.0,1.0,1.0,1.0,
+								          1.0,1.0,1.0,1.0,1.0,1.0,
+									      1.0,1.0,1.0,1.0,1.0,
+									          1.0,1.0,1.0,1.0,
+										      1.0,1.0,1.0,
+										          1.0,1.0,
+											      1.0 ) ]     [ 189 values for AA]
+[ revMatPr fixed(1,2,3,4,5,6) ]                [ for DNA, rates will be normalized  ] 
+
+[ STATE FREQUENCIES: dirichlet or fixed, 4 values for DNA, 190 for AA (you must have defined a stateFreq parameter for the respective partitions) ] 
+[ order of the frequecies corresponds to the order in the ExaBayes_parameters* output file ]
+[  statefreqpr  dirichlet(0.25,0.25,0.25,0.25)  ]                                                           [ for DNA,  could also be relative rates again  ]
+[  statefreqpr dirichlet(1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0) ] [ for AA  ] 
+[  stateFreqPr fixed(1,2,3,4)                   ] 
+
+[ RATE HETEROGENEITY: alpha parameter of gamma distribution, exponential, fixed or uniform ]
+[ shapePr exponential(2) ] 
+[ shapePr uniform(0.0000001,200) ] 
+[ shapePr fixed(1)   ] 
+
+[ fixed-rate MODELS for AMINO ACID partitions, fixed or specified ] 
+[ aaPr disc( WAG=3, REMAINDER=1 ) ]            [ high prior belief in WAG, all remaining models have a lower prior belief ]
+[ below a complete list of AA models implemented in ExaBayes ] 
+[ aaPr disc(  DAYHOFF=1, DCMUT=1, JTT=1, MTREV=1, WAG=1, 
+       	      RTREV=1, CPREV=1, VT=1, BLOSUM62=1, MTMAM=1, 
+	      LG=1, MTART=1, MTZOA=1, PMB=1, HIVB=1, HIVW=1, 
+	      JTTDCMUT=1, FLU=1) ]   
+[ aaPr fixed(WAG) ]                            [ fix the model to WAG ] 
+
+end; 
+
+
+ [================================================================]
+ [ PROPOSAL configuration ]
+ [================================================================]
+begin proposals; 
+ [ each proposal has a relative weight, use 0 to deactivate ] 
+
+ [ for disabling a category, please set it to fixed in the prior
+   section rather than to disable all proposals ]
+ 
+  [ TOPOLOGY proposals  ]
+  [ eTBR         0 ]       
+  [ eSPR         6 ] 
+  [ stNNI        6 ] 
+  [ parsimonySPR 6 ] 
+  [ likeSpr      2 ]		[ new posterior guided SPR ]
+
+  [ BRANCH LENGTHS proposals ] 
+  [ branchMulti    7 ]
+  [ treeLengthMult 1  ] 
+  [ nodeSlider     0  ] 
+  [ blDistGamma    7  ]         [ efficient Newton-Raphson-based branch length proposal ]
+  [ biasBLMult     0  ]         [ branch length multiplier that preferably samples short branch lengnths ]
+
+  [ RATE HETEROGENEITY ]
+  [ rateHetMulti   1  ] 
+
+  [ SUBSTITUTION RATES  ] 
+  [ revMatSlider       0.5 ]    [ for DNA ]
+  [ revMatDirichlet    0.5 ]    [ for DNA ] 
+  [ revMatRateDirich    2  ]    [ for AA  ]
+
+  [ [ STATE FREQUENIES ]	]	
+  [ frequencySlider    0.5  ] 
+  [ frequencyDirichlet 0.5  ] 
+
+  [ fixed-rate AA matrices ]    
+  [ aaModelJump        1 ] 
+
+
+  [ PARAMETERS for various moves ]
+  [ eSprStopProb 0.5   ]            [ stopping probability for eSPR moves ] 
+  [ etbrStopProb 0.5   ]            [ stopping probability for eTBR moves ] 
+  [ parsimonyWarp 0.10 ]            [ warp factor for parsimony based moves ]  
+  [ parsSPRRadius  10  ]            [ rearrangement radius (around current position) for parsimony SPR ] 
+
+  [ likesprmaxradius 5  ]           [ a radius for the posterior-guided SPR (likeSPR) move: when pruning a subtree, the likeSpr will check all possible re-attachment positions within this radius (expensive!)  ]
+  [ likesprwarp 1.0     ]           [ warp factor for posterior-guided SPR move ]
+  [ moveOptMode 0       ]           [ values in (0,4), proposes branches simultaneously with any of the topological moves  ] 
+  [ useMultiplier true	]           [ in case moveOptMode > 0, use a branch length multiplier instead of a gamma proposal ]
+
+  [================================================================]
+
+end ; 
+
diff --git a/examples/dna-partitioned/aln.part b/examples/dna-partitioned/aln.part
new file mode 100644
index 0000000..c5941d9
--- /dev/null
+++ b/examples/dna-partitioned/aln.part
@@ -0,0 +1,4 @@
+DNA, gene1-c1=1-1000/3
+DNA, gene1-c2=2-1000/3
+DNA, gene1-c3=3-1000/3
+DNA, gene2=1001-1269
diff --git a/examples/dna-partitioned/aln.phy b/examples/dna-partitioned/aln.phy
new file mode 100755
index 0000000..655f811
--- /dev/null
+++ b/examples/dna-partitioned/aln.phy
@@ -0,0 +1,3927 @@
+ 150 1269
+Species209   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNCA
+Species159   UAUCUGGUUG AUCCUGCCAG UAGUAUNUGC UUGUCUCAAA GAUUAAGCCA
+Species109   NNNNNNNNNN NNNNNNNNNN NNNNAUAUGC UUGUCUC--A GAUUAAGCCA
+Species025   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNAAA GAUUAAGCCA
+Species004   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+Species186   UACCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species034   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNAAA GAUUAAGCCA
+Species003   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNAAA GAUUAAGCCA
+Species192   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCAAA GAUUAAGCCA
+Species132   NNNNNNNNNN NNNNNNNNNN UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species172   NNNNNNNNNN NNNGAAUU-G UAUUANANGC -UGUUUCAAA GAUUAAGCCA
+Species048   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNUAAGCCA
+Species070   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+Species151   NNNNNNNNNN NNNNNNNNAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species027   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+Species040   UAUCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species121   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNAAA GAUUAAGCCA
+Species122   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCAAA GAUUAAGCCA
+Species078   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCAAA GAUUAAGCCA
+Species180   NNNNNNNNNN NNNNNNNNNG UAGUAUAUGC UUGUCUCCAC --UU------
+Species022   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNAA GAUUAAGCCA
+Species221   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNAAA GAUUAAGCCA
+Species158   NNNNNNNNAG CUUGAACUCG UAGUANAUGC UUGUCUCAAA GAGUAAGCCA
+Species113   NNNNNNNNNN NNNNNNNNNN NNNNNNNUGA UUGUCUCAAA GAUUAAGCCA
+Species046   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCAAA GAUUAAGCCA
+Species164   UACCUGGU-G AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species182   UACCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species212   UACCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species157   NNNNNNNNNN NNNNNNNNNN NNNNAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species211   NNNNNNNNNN NNNN-NNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNA
+Species202   NNNNNNNNNN NNNNNNNNNN NNNNNUAUGC UUGUCUCAAA GAUUAAGCCA
+Species231   NAUCUGGUUG AUCCUGCCAG UAGUANNUGC UUGUCUCAAA GACUAAGCCA
+Species187   UACCUGGUUG AUUCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species097   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNAAA GAUUAAGCCA
+Species177   UAUCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species110   NNNNNNNNNN NNNNNNNNNN NAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species126   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCAAA GAUUAAGCCA
+Species077   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN GAUUAAGCCA
+Species081   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+Species082   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+Species205   NNNCUGGUUG AUUCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species038   NNNNNNNNNN NNNNNNNNNN NNNNNUAUGC UUGUCUCAAA GAUUAAGCCA
+Species030   NNNNNCCAAG CUUGAAUUCG UAGUAUAUGC UUGUCUCAAA GACUAAGCCA
+Species123   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNC UUGUCUCAAA GAUUAAGCCA
+Species150   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNCCA
+Species056   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCAAA GAUUAAGCCA
+Species107   NNNNNNNNAG CUUGAACUCG UAGUAUAUGC NUGUCUCAAA GACUAAGCCA
+Species065   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+Species047   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+Species069   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCAAA GAUUAAGCCA
+Species171   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+Species086   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+Species032   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNCCA
+Species195   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCAAA GAUUAAGCCA
+Species165   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+Species053   AGCCGGCUGU UUAUUGAUUG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species207   NNNNNNNNNN NNNNNNNNNN NNNNAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species124   UAUCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species006   NNNNNNNNNN NNNNNNNNNN AGGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species190   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCAAA GAUUAAGCCA
+Species111   NNNNNNNNNN NNNNNNNNNG -AGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species054   NNNCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species074   NNNNNNNNNN NNNNNNNNNN NNNNNNNUGC UUGUCUCAAA GAUUAAGCCA
+Species146   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNUUAGGCCA
+Species090   UAUCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species174   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNAAA GAAUAAGCCA
+Species104   UAUCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species155   NNNNNNNNNN NNNNNNNNNN NAGUGUCCGC UCGUCUCAAA GAUUAAGCCA
+Species214   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNCA
+Species160   NNNNNNNNNN NNNNNNNNAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species008   UACCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUAAAA GAUUAAGCCA
+Species223   UACCUGGUUG AUUCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species042   UACCUGGUUG AUUCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species191   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNAAA GAUUAAGCCA
+Species092   CCGC-GG-GA AUUCGAUU-G UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species019   NNNNNNNNNN NNNNNNNNNN NNGUAUAUGC NUGUCUCAAA GAUUAAGCCA
+Species230   NAUCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species178   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNCUCAAA GAUUAAGCCA
+Species232   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCAAA GAUUAAGCCA
+Species106   UACCUGGUUG AUUCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species154   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNGUCUCAAA GAUUAAGCCA
+Species149   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+Species043   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCAAA GAUUAAGCCA
+Species020   AACCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species116   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNGCCA
+Species213   NNNNNNNNNN NNNNNNNNNN NNNNAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species125   UACCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species215   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNAAA GAUUAAGCCA
+Species103   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCAAA GAUUAAGCCA
+Species162   NNNNNNNNNN NNNNNNNNNN NNNNNUUUGC UUGUCUCAAA GAUUAAGCCA
+Species007   NNNNNNNNNN NNNNNNNNNG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species144   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCAAA GAUUAAGCCA
+Species197   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCAAA GAUUAAGCCA
+Species096   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNUAAGCCA
+Species131   UACCUGGUUG AUUCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species023   UACCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUAAAA GAUUAAGCCA
+Species060   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNA
+Species095   NNNNNNNNNN NNNNNNNNNN NNGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species100   NNNNNNNNNN NNNNNNNNUG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species041   NNNNNNNNNN NNNNNNNNNN NAGUAUAUGC UUGUCUCNAA GAGUAAGCCA
+Species201   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCAAA GAUUAAGCCA
+Species026   UACCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species018   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+Species222   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNA
+Species063   UACCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species193   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCAAA GAUUAAGCCA
+Species167   NNNNNNNNCG CUUGAAUUCG UAGUAUAUGC UUGUCUCAAA GAGUAAGCCA
+Species028   NNNNNNNNNN NNNNNNNNNN NNGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species067   NNNNNNNNNN NNNNNNNNUG ACGUGGAUGC UAUUCUCUGG GGCUAAGCCA
+Species064   CACCAGGUUG AUUCUGCCUG ACGUAGAUGC UAGUCUCUGA GAUUAAGCCA
+Species012   CACCAGGUUG AUUCUGCCUG ACGUGGACGC UAGCCUCGGG GAUUAAGCCA
+Species139   CACCAGGUUG AUUCUGCCUG ACGUAGACGC UAUACUCUAA GAUUAACCCA
+Species011   NNNNNGGUUG AUUCUGCCUG ACGUGAACGC UAGUCUCACA GAUUCAGCCA
+Species050   CACCAGGUUG AUUCUGCCUG ACGUGGACAC UUGCCUUGAA GAGUAAGCCA
+Species135   NNNNNNNNNN NNNNNNNNNG ACGUAGACGC UAUUCCCUAA GAUUGGCCCA
+Species227   CACCAGGUUG AUUCUGCCUG UUAUAUGUAC UAGUGUCGAA GAUUUAGCCA
+Species071   NNNNNNNNNN NNNNNNNNNN NCGUGGGUGC UAGCCUCUAA GAUUUAGCCA
+Species066   NNNNNNNNNN NNNNNNNNNN NNNUGGAUGC UAUUCUCUGG GGCUAAGCCA
+Species229   NNNNNNNNNN NNNNNNNNNN NCGUAGAUGC UAGUCUCUAA GAUUAAGCCA
+Species101   NNNNNNNNUG AUUCUGCCUG ACGUGGAUGC UAGUCUCUAA AGUUAAGCCA
+Species013   CACCAGGUUG AUUCUGCCUG ACGUGGAUGC UAGCCUCAAA GCUUAAGCCA
+Species138   CACCAGGUUG AUUCUGCCUG ACGUAGACGC UAUACUCUAA GAUUAACCCA
+Species161   NNNCAGGUUG AUUCUGCCUG ACGUGGACGC UAGU-UCAUA GGUUAAGCCA
+Species010   CACCAGGUUG AUUCUGCCUG ACUGUGACGC UAGCCUCGGG GAUUAAGCCA
+Species072   NNNNNNNNNN NNNNNNNNUG ACGUAGACGC UAGUCUCUGA GAUUAAGCCA
+Species084   NNNNNNNNNN NNNNNNNNNN NCGUGGAUGC UAGUCUCAUA GGUUAAGCCA
+Species014   CACCAGGUUG AUUCUGCCUG ACGUGUGUGC UAGUCUUGGG GACUUAGCCA
+Species228   CACCAGGUUG AUUCUGCCUG AUAUGUGUGC UAGCGUCAAA GAUUUAGCCA
+Species225   CACCAGGUUG AUUCUGCCUG ACGUAGACGC UAUUCCCUAA GAUUAACCCA
+Species188   NNNNNNNNNN NNNNNNNNUG ACGUGGAUGC UAUUCUCUGG GACUAAGCCA
+Species136   CACCAGGUUG AUUCUGCCUG ACGUAGACGC UAUUCCCUAA GAUUAACCCA
+Species142   CACCAGGUUG AUUCUGCCUG ACGUGGAUGC UCGCCUUAAA GACUAAGCCA
+Species226   NNNNNNGUUG AUUCUGCCUG ACGUAGAUGC UAGUCUCAUA GGUUAAGCCA
+Species061   CACCAGGUUG AUUCUGCCUG ACGUGGACGC UUGCCUCGAA GAUUAAGCCA
+Species194   CACCAGGUUG AUUCUGCCUG ACGUGGAUGC UAGUCUCAUA GAUUUAGCCA
+Species196   NNCCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species005   AACCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species179   AACCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species119   NNCCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species058   AACCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species099   NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNA
+Species117   AACCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species173   AACCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species181   AACCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GAUUAAGCCA
+Species114   AACCUGGUUG AUCCUGCCAG UAGUAUAUGC UUGUCUCAAA GACUAAGCCA
+Species073   NNNNNNNNNN NNNNNNNNNN NAGUAUAUGC UUGUCUCAAA GACUAAGCCA
+Species105   ---------- ---------- ---------- ------CAA- ----------
+Species120   ---------- ---------- ---------- ------CAAA GAUUAAGCCA
+Species137   ---------- ---------- ---------- ---------- ---UAAGCCA
+Species175   ---------- ---------- ---------- ---------- --------CA
+
+             UGCAUGUCAG UAUAGCUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCUUUA GUGAAACUGC GAAUGGCUNN UUAAAUCAGU
+             UGCAUGUCAG UAUAGCAUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             NNNNNNNNNN UAUAUCUUAU GUGAAACUUC GAAUGCCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCAGUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGUAUGUCAG UAUAACUUUA GUGAAACUGC GAAUGGCUCA UUAUAUCAGU
+             UGCAUGUCAG UAUAACUCUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             NGCAUGUCAG UAUAACUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAAGUCAG UUUAGCCCUA GCGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             NNNNNNNNNN NNNNNNUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCAUUA GCGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNUCAGU
+             UGCAUGUCAG UAUAGCAUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAAGUCAG UAUAGCUAUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUG GUGAAACUGU GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCAUAU GUGAAACUGC GAAUGGCUCA UUAUAUCAGC
+             -------CAA UCAU--UUAU GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCAACA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UGUAACUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCGUUA GUGAAACUGC GAAUGGCUCA UUAUAUCAGU
+             UGCAUGUCAG UAUAACUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUG GUGAAACUGC GAAUGGCUCA UUAAAGGAGU
+             UGCAUGUCAG UAUAGCUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUNACUUUA GUGAAACUGC GAACGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCACUA GUGAAACUGC GAAUNGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCUCUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUCA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCUUUA GCGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNAUGGCUCA UUAAAUCAGU
+             NNNNNNNCAG UAUAUCUUAU GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCACUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACAAUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCACUU GCAAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUU GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCAUUA GCGAAACUGC GAAUGGCUCA UUAUAUAAGU
+             UGCAUGUCAG UAUAGCUCUA GUGAAACUGC GAAUGGCUCA UUAUAUCAGU
+             UGCAUGUCAG UAUAACUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NAAUGGCUCA UUAAAUCAGU
+             NNNNNNNNNN NNNNNNUUCA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCCCUU GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCAUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             NNNNNNNNNN NNNNNCUUAU GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCAUUA GCGAAACUGC GAAUGGCUCA UUAUAUAAGU
+             UGCAUGUCAG UAUAACUUUA GUGAAACUGC GAAUGGCUCA UUAUAUCAGU
+             NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNGCUCA CUA-AUCAGU
+             UGCAAGUCAG UAC-GCAUUG GUGAAACUGC GAACGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUA GUGAAACUGC GAAUGGCUCA UUAUAUCAGU
+             UGCAUGUCAG UAUAACUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUCA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGUAUGUUAG UAUAACUUGG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UUUAGCAUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAAGUCAG UUUAAC--UA GUGAAACUGC GAAUGGCUCA UUACAACAGU
+             UGCAUGUCAG UAUAACUUCA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCAUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCAUUA GCGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCACUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAAGUCAG UAUAGCUCUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUUAU UAUAACUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCACUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UUUAGCAAUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGC
+             UGCAUGUCAG UAUAACUUCA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAAUUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCAUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCUCUA GUGAAACUGC GAAUGGCUCA UUAUAUCAGU
+             UGCAUGUCAG UAUAGCAUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCAUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACAUUU GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCUCUA GUGAAACUGC GAACGGCGCV SBBAAUCAGU
+             UGCAUGUCAG UAUAGCUAUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UUUAGCAUUA GCGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUAUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUUAG UAUAGCCUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGUAUGUUGG UUUAACUUGG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCUUUA GUGAAACUGC GAAUGGCUCA GUAAAUCAGU
+             UGCAUGUCAG UAUAACUUCA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             NNNNNNNNAG UAUAGCUCUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCUCUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACAAAU GUGAAACUGC GAAUGGCUCA UUAAAUAAGU
+             UGCAUGUCAG UAUAUCUCUA GCGAAACUGC GNNUGGCUCA UUAUAUCAGU
+             UGNAUGUNAG UAUAANUUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCUUUG GUGAAACUGC GAAUGGCUCA UUAUAUCAGC
+             UGCAUGUUUA UGAACCUAU- GG-GAUUGAC GGACGGCUCA GUGAUAGUAC
+             UGCAUGUCAG UGAAGCUUAC GUGGAACGGC GAACGGCUCA GUAAUGUUGC
+             UGCAAGUCUG UGAAGUUCUU AUGAAACAGU GUACGGCUCA GUAAAACACG
+             UGCAUGUUAU UGAAU-AUAA -AGAAAAGAC GAACAGCUCA GUAACUCUUA
+             UGCAAGUAGU AU--G-UAUG -U-AAUACAC -AAUGGCUCA GUAUC--GAG
+             UGCAAGCUUG UGAAUAAUCC UG-AAACAGU GAACGGCUCA GUAGAACACA
+             UGCAUGUUUU UGACGUUAU- ACUGAAAGAU GGACUGCUCA GUAAUACUCA
+             UGCAUGCUUA CGAAUUACAA AAGAAGUGGC GGACAGCUCA GUAAUACAGU
+             UGCAUGCUUG UGAACCAGAC GGGGAACGGC GAACGGCUCA GUAAUGUUGC
+             UGCAUGCUUG UGAACUUUGU GG-GAUUAGC GGACGGCUCA GUGAUAGCAC
+             UGCAUGUUUC CGC---AAUC ----AGGGAC GAAUAGCUCA GUAAAACUGC
+             UGGAUGUCAG CAAAGCGUAA GUCGAGCGGC AC-AGGCUCA GUAACG-GGC
+             UGCAAGUCUG UGAAUAAUAU UG-AAACAGU GAACGGCUCA GUAUAACACG
+             UGCAUGUUAU UGAAU-AUAA -AGAAAAGAC GAACAGCUCA GUAACUCUUA
+             UGCAUGUGGG CGACGUUUU- GUGGAGCGGC GGAAGGCUCA GUAACG-GGC
+             UGCAAGUCUG UGAAGUUCGU AUGAAACAGU GAACGGCUCA GUAAAACACG
+             UGCAUGUCUA UG----GAAC ----AAGGAC GAACAGCUCA GUAAAACUGC
+             UGCAUGUGAG CGAAGCGUAA GUGGAGCGGC GCAAGGCUCA GUAACG-GGC
+             UGCAAGCUAG CGAAGCGGA- GCGGAGCGGC GGACGGCUCA GUAGGACGGC
+             UGCAUGCUUU CGAACCUCGU GG-GAGAGGC GGAUAGCUCA GUAAUACAGU
+             UGCAUGUUUU UGA-U-AUG- -G--AAAAAU GGACUGCUCA GUAAUACUCA
+             UGCAUGUUGA UGAACCUGUG GG-GAUUGAC GGACGGCUCA GUGAUAGUAC
+             UGCAUGUUUU UGA-C-AUUU -G--AAAAAU GGACUGCUCA GUAAUACUCA
+             UGCAAGUUUG CGA---GCUG ----AGCAGC GAACGGCUCA GUAAAACAGG
+             UGCAUGUGAG CGAAGCGGUG GUGGAGCGGC GCAAGGCUCA GUAACG-GGC
+             UGCAAGUCUG UGAAU-AUAU -G-AAACAGU GUACGGCUCA GUAUAACACC
+             UGCAUGUGAG CGAAGCGAUU GUGAAGCGGC GGAAGGCUCA GUAACG-GGC
+             UGCACGUGAG UAUAGCUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAAUCUUU GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UUUAACCUUU GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAAU-UUU GUGAAACUGC GAAAGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAAUCUUU GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCCUUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUUUA GUGAAACUGC GAAUGGCUCA UUARAUCAGU
+             UGCAUGUCAG UAUAAU-GGU AUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCCUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAACUAUG GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUGACUUCA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             ---------- ------UUUU GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAGCUCUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUCAG UAUAAUUUUC GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+             UGCAUGUGAG UAUAGCUUUA GUGAAACUGC GAAUGGCUCA UUAAAUCAGU
+
+             UAUAGUUUAU UUGAUUUUGA UGGAUAACUG UGGUAAACUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUUUUAA UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAU UGGAUACCUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUAUUAU UGGAUAACCG UGGUAAUCUA GACCUAAUAC
+             UAUCGUUUAU UUGAUUCAAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUUUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUAUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUAUAU UUGAUCU-AA UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUUUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUGU UGGAUACGCC UGGCAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAAUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAAUUUAU UUGAUUUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUAUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUUUUGU UGGUUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUUCUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAAUUUAU UUGAUAUUAA UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAAUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUUUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUAUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUAAU UGGAUACCCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUUUU-A UGGAUAACCG UGAUAACUCA GAACUAAUAC
+             UAUCGUUUAU UUGAUCUUAA UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAU UGGAUACCCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUUUUAA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUAA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAAUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUACCUC UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUAU CGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUAUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAA UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAA UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUCUAU UUGACUUAGA UGGAUAACUG UGGCAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUAUUAA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGACCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUAUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUAUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAAUUUAU UUGAUCUUA- UGGAUAUCCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUAUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAAUUUAU UUGAUUUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUGU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCCUAA UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAAUUUAU UUGAUUUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU NUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAA UGGAUAACCG UGGUAAUCUG UGGCUAAUAC
+             UAUAGUUUAU UUGAUCUUAA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU GGGAUAUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUUUUAA UGGAUACCUG UGGUAAUCUA GAGCUAAUAC
+             CAUAGUUUAU UUGAUCCUAA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUUUUAA UGGAUAUCUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUCU UUGAUUUUGA CGGGCAACCU CGGUAAACUG AUGCUACUAC
+             UAUAGUUUAU UUGACCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUUUUAU CGGAUAUCCG UGGUAAUCUA GAGCUAAUAC
+             UAUAAUUUAU UUGAUUUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUUAUCUUAA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAAUUUAC UUGAUUAUA- UGGAUAACCG UGGUAAUCUA UGGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAA UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUAUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAAUUUCA GUGAAUUUAA UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUAA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUGAUCUAC GUGACUUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAA UGGAUACCUG UGGUAAUCUA GAGCUAAUAC
+             UAUAAUUUAU UUGACUUUAU UGGAUAUCCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAAUUUAC UUGAUUAUA- UGGAUAACCG UGGUAAUCUA UGGCUAAUAC
+             UAUAGUUUAU UUGAUCUUAA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUUUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUAA UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAAUUUAU UUGAUAUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUAA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUGAUCUAC UUGACUUUA- UGGAUAUCCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAA UGGAUACCUG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAAUUUAU UUGAUCUUA- UGGAUAUCCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAC UUGAUCUUAU UGGAUAACCG UAGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGA UGGAUAACUG UGGUAAUCUA GAGCUAAUAC
+             GAUGAUUUGA UUGGGAGCCG GAUGUAACUG UGGGAAACUG CAGGUAAGUU
+             GGUAAUUUGG UCUCUGUGUU AAACUAACCA CGGUAACCUG UGGCUAAAAG
+             UCA-AUCUAC CCACUUAUCU AAUAUAACCA CGGGAAACUG UGGCUAAUAU
+             UUUGAUUUGA UGUAUUAGG- AUUCUAACUA UGUUAAAUUA UAGGUAACAA
+             UAUGCUUUGC UCUCCAAGAG UG-AUACUUU CAGGAAACAG AAAAUAAAGC
+             UUUCAUCUAC CCAA-GUUA- AAAAUAACCA UGGGAAACUA UGGCUAAAUU
+             CUUUAUUUGA UGUACCUUA- UACAUAACUA CGUUAAAGUG UAGCUAACAU
+             UAUAAUAUAC UCUCUACUAA AGGAUAACCG CGGUAAGCUG CGGGUAAAAC
+             GGUGAUCUGC UCUGGUUGAA AAGAUAACCA CGGUAAACUG UGGCUAAGAG
+             GAUGAUUUGU UUGCGGGAUA GCAGUAGCUG CGGGAAACUG CAGAUAGUGG
+             GAUGAUUUAG UCUGGCUGUG UAGAUAACUA CGUGAAAAUG UAGCUAAGGG
+             GAAUAUUUAA UCUCCUCGAG UGGAUAUCCU CUGUAACCGG AGGGCAAAAC
+             UCU-AUCUAC CCAUUUUGUG AGAAUAACCA UGGAAAACUA UGGCUAAUAU
+             UUUCAUUUGA UGUAUUAGG- AUUAUAACUA UGUUAAAUUA UAGAUAACAA
+             GUCUAUUUGA UCUUCUGAGA CGGACAACCU CUGUAA-CCG GAGCCAAUAC
+             UCU-AUCUAC CCACUUGUCU AAUAUAACCC CGGGAAACUG UGGCUAAUAU
+             GAUGAUUCAG UCUGUCUGUC AAGAUAACCA CGCGAAAGUG UGGCUAAGAG
+             GAGUAUUUGA UCUCCUAGAG UGGAUAUCCU CUGUAACCGG AGGGCAAAAC
+             GAUAAUUCAC CCGCGGCAGA GGGAUAACCG CGGCAAGCUG CGGCUAAGAC
+             UAUAACAUAA GCUGCGUGUG UGGAUAACCU UGUUAAGAUA AGGCUAAGAC
+             CUUUAUUUAA UGUAUUAAAA GU-AUAACUG CGUUAAAGUG UAGCAUAAGA
+             GAUGAUUUGG UUGGCGGGAA GCUGUAACUG CGGGAAACUG CAGGUAGGGG
+             CUUUAUUUUA UGUAAAUUUU AA-UUAACUA CGUUAAAGUG UAGAUAAGAU
+             GCA-CUCUAA CGCACGGAA- GAGAUAACCA CGGGAAACUG UGGCUGAGAA
+             GACGAUUUGA UCUCCCGGUG UGGACAACCU CUGUAACCGG AGGCCAAAAC
+             UAU-AUCUAC CCACUUUUUA AAUAUAACCA UGGUAAACUA UGGCUAAUAU
+             GAGAUUUUAA UCUCUAGAAC CGGACAACCU CAGGAAACAG AGGGGAAAAC
+             UAUAGUUUAU UUGAUUUCCU UGGAUAACCC GAGUAAUCUC UGGCUAAUAC
+             UAUAGUUUAU UUGAUGUUUA UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUGUUUA UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUGCUUA UGGAUACCCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUACUUU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUUUAU UUGAUCUUAA UGGAUACCUG UGGUAAUCUA GAGCUAAUAC
+             UAUCGUCUAU UUGAUCUUAA UGGAUAACCG UAGUAAUCUA GAGCUAAUAC
+             UCUAGUUUCU UUGAUCUUAA UGGAUAACCG UAGUAA-AUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUGU UGGAUAACCG UAGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUCAA UGGAUAACUG UAGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUAA UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUG- UGGAUAACCG UGGUAAUCUA GAGCUAAUAC
+             UAUAGUUUAU UUGAUCUUAU UGGAUAACCG UGGUAAUCUA GAGCUAAUAA
+
+             AUGUAAUUUC AUUCAAAUAU CUGCCCUAUC AACUGGAUGG UAGGAUAGAG
+             AUGGAAGUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGAGAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAAGGUAUUG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGGAUAUC ANNCAAAUNN CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUGUC AUUCAAAUUU CUGCCCUAUC AACUGGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AAGUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGACGG CUGGGUCUUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG CAGGGUCUUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGAUAUAUC AUUCAAAUUU CUGCCCUAUC AACUGGAUGG UAGUAUAGAG
+             AUGGAAUAUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUUUC AUUCACAUAU CU-CCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAAGGUAGUG
+             AUGGAAUAUC AUUCAAAUUU CUGCCCUAUC AACUAGAUGG UAAGGUAGUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAACAUC AUUCAAAUUU CUGCCCUAUC AACUGGAUGG UAGGAUCGUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUGC AUUCAAAUUU CUGCCCUAUC AAGUUGAUGG UAGGUUAGUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUUG UAAGAUAGAG
+             GUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UA-GAUAGAG
+             AUGGAAUAUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             GUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUUUC AAUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUCUC AUUCGAAUAU CUGCCCUAUC AACUUGAUGG UAAGGUAUUG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUUCCCUAUC AACUUGAUGC GAAGGUAUUG
+             AUGGAAGGUC AUUCAAAUUU CUGCCCUAUC AACUGGAUGG UACGGUAGUG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGGAUAUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUAUGAUAUC AUAAAAAUUU CUGCCCUAUC AACUUGAUGG UAAGGUAGUG
+             AUGGGAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAAGGUAUUG
+             AUGGAAUAUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUUCCCUAUC AACUUGAUGC GAAGGUCUUG
+             AUGGAAUGUC AUUCAAAUUU CUGCCCUAUC AACUGGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGGAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUCGGG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGAUAUAUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGUAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAGUUC AUUCAAAUUU CUGCCCUAUC ANCUUGAUGG UAGGAUNGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             GUGGAACUUC AUUCAAGUUU CUGCCCUAUC AACUUGAAGC UAGGGUAUUG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             GUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGGACGUC AUUCAAAUUU CUGCCCUAUC AACUGGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUGGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACCUGAUGG CAGGGUCUUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUAAGAUGUC AAUCAAAUUU CUGCCCUAUC AACUUGAUGG UAAGGUAGUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGUGAUUUC AUUCAAAUUU CUGCCCUAUC AACUAGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGGAUUCC ACUCGAUUUU CUGCCCUAUC AGGUUGAUUG UAAGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUGUC AUUCAAAUUU CUGCCCUAUC AGCUUGAUGG UACGGUAGUG
+             AUGGGAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAAGGUAUUG
+             AUGGGAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAAGGUAUUG
+             AUAAGAUGUC AAUCAAAUUU CUGCCCUAUC AACUGGAUGG UAAGGUAGUG
+             AUGGAAGUUC AUUCAAAUAC CUGCCCUAUC AGCUUGAUGG UAAGGUAGUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGACGG CUGGGUCUUG
+             AUGGGAUGUC AUUCAAAUUU CUGCCCUAUC AACUUGACGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUGGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGUGAUUUC AAUCGAAUUU CUGCCCUAUC UGCUCGUUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGUG
+             AUAUGACAUC AUAAAAAUUU CUUCCCUAUC AACUUGAUGG UAAGGUAGUG
+             AUGGAACAUC AUUCAAAUUU CUGCCCUAUC AGCUUGAUGG UACGGUAGUG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUAU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+             CU-GGGGACC GAGUAAGUUG UAGGCCUAUC AGCUGGUAGU UAGGGUAAUG
+             C------GGA GAAUAAGGCG CAACCCUAUC AGCUUGUUGG UAGUGUAAAG
+             U-------GU GGAUGAGGGC GUGACCUAUC AGCUAGUCGG UACGGUAAAG
+             UA-----AUA CAAUAAGAAU AAGAUCUAUC AGUUAGUUGU UAAGGUAAUG
+             AUCUCUUGGA GAAGAAGCAC UCA-CCUAUC AGUUAGUAGG UAUGGUAAGG
+             AAU-----UU GGAUGAGAGU GUGACCUAUC AGCUAGUAGG UACGGUAAGA
+             AU-----GUA CAGUAAGAGU GAGACCUAUC AGCUAGUUGU UAAGGUAAUG
+             UUCCUAUAGA GUGUUAGUUU CUGGCCUAUU AGUUAGUAGG UAAUGUAAGG
+             A------CCA GAAUGAGCUG CAACCCUAUC AGUUUGUUGG AAGUGUAAAA
+             UC-UGCCGGC AAGUAAGUUG UGGGCCUAUC AGCUGGUAGU UAGGGUAAUG
+             AAG----GCA GAAUAAGACG CAGGACUAUC AGUUAGUUGG UAGUGUAAUG
+             ACAGACGGGA GAGUAAGACG CCAGUCCAUC AGUUAGUAAG UAGGGUAAGG
+             A-------AU GGAUGAGGAU GUGACCUAUC AGCUCGACGG UACGGUAAGU
+             UA-----AUA CAAUAAGAAU AAGAUCUAUC AGUUAGUUGU UAAGGUAAUG
+             GUCGAGGGAA GAGUAAGGAG CCAUCCCAUC AGUUAGUAAG UAGGGUAAGG
+             U-------GU GGAUGAGGGC GUGACCUAUC AGCUAGUCGG UACGGUAAAG
+             GGG----ACA GAACAAGACG CAGGACUAUC AGUUAGUUGG UAGUGUAAUG
+             ACAUGAGGGA GAGUAAGAAG CCAUCCCAUC AGUUAGUAAG UAGGGUAAGG
+             AAGGAGGGGC GGCGAAGAUG CCGACCUAUC AGCUAGUAGG UAGGGUAAGG
+             UUAAUAAGCA GCAUUGGUUU CUGACCUAUC AGUUAGUAUG UUCUGUAAGG
+             CAU----AUA CAGUAAGAGU GAGACCUAUC AGCUAGUUGU UAAGGUAAUG
+             CU-GGAGGCC AAGUAAGUUG UAGGCCUAUC AGCUGGUAGU UAGGGUAAUG
+             GU-----UUA CAGUAAGAGU GAGACCUAUC AGCUAGUUGU UAAGGUAAUG
+             -------GUG CGAUGAGGCU CUGACCUAUU AGUUUGUCGG UACGGUAAGU
+             ACAGAGGGGA GAGUAAGGAG CCAUCCCAUC AGUUAGUAAG UAGGGUAAGG
+             A-------GU GGAUGAGUGG GUGACCUAUC AGCUUGACGG UACGGUAAGU
+             GGAAGAGGGA GAGUAAGAAG CCAUCCCAUC AGUUAGUAAG UAGGGUAAGG
+             AUGAGAUAUC AUUCAAGUUU CUGCCCUAUC AACUUGAUGG UACGGUAUUG
+             AUGGAAUAUC AUUCAAAUUU CUGCCCUAUC AACUUGACGG UAGGGUAUUG
+             AUGUGACAUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAAGGUAUUG
+             AUGGAACAUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAAGGUAUUG
+             AUGGAAUAUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAAGGUAGUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC AACUGGAUGG UAAGGUAGUG
+             AUGGAAUUUC AUUCGAGUUU CUGCCCUAUC AACUUGAUGG UAAGGUAUUG
+             GUGGGAUUUC AUUCAAGUUU CUGCCCUAUC AACUGGAUGG UAGGGUAUUG
+             AUGGGRUCUC AUACAAAUAU CUGCCCUAUC AACUUGAUGG UAAGGUAGUG
+             AUGGAACUUC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UACGGUAGUG
+             AUGGAAUUGC AUUCAAAUUU CUGCCCUAUC AACUUGAUGG UAGGGUAGUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC A-CUGGAUGG UAGGAUAGAG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC A-CUUGAUGG UACGGUAUUG
+             AUGGAAUUUC AUUCAAAUUU CUGCCCUAUC A-CUUGAUGG UAGGAUAGAG
+             UCUGAAUUUC AUUCA-AUUU CUGCCCUAUC AACUUGAUGG UAGGAUAGAG
+
+             GCCUACCAUG GUUGCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCYGGAG
+             GCUUACCAUG GUGGCAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUNAACGG GUAANGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUUAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUUAACGG GUAACGGCGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUUAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUUAACGG GUAACGGGGA AUCAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUUAACGG GUAACGGAGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG CUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCAGCCGUG GUUACAACGG GUAACGGAGG GUUAGGGCUU GACCCCGGAG
+             GCCUACCAUG GUAUUUACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUGCCAUG GUUACAACGG GUAACGGAGG GUUAGGGCUC GACCCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUUAGGGUUC GGUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUUAGGGUUC UAUUCCGGAG
+             G-CUACCAUG GUUUUAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GACUACCAUG GU-------G GUA-----GA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUUAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUUAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUUAGGGUUC UAUUCCGGAG
+             GCCUCCCAUG GUUUCACCGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCUUACCAUG GUGACGACGG GUAACGGGAA AUAAGGGUUU GGUUCCGGAG
+             GCUUACCAUG GUUUUUACGG GUGACGGG-A AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCGACGG GUAACGGGGA AUAAGGGUUC UAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUAUCAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUUGACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUAACAACGG GUAACGGGGA AUCAGGGUUC UAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGN AUUAGGGUUC UAUUCCGGAG
+             GCCUACCAUG GUGGCAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG CUUUUAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCUUACAAUG GUCUUAACGG GUAACGGGGA AUUAGGGUUC UAUUCCGGAG
+             GCCUACCAUG GUUUUAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUUAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCUACGG GUAACGGGAG AUUAGGGUUU GACUCCGGAG
+             GCCUACCAUG GUGAUAACGG GUAACGGAGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUGAUAACGG GUAACGGGGA AUCAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             UCUUCGCAUG GUUGCAACGG GUAACGGAGG GUUAGGGCUC GACCCCGGAG
+             GCCUACCAUG GUGACAACGG GUAACGGGGA AUCAGGGUUU GAUUCCGGAG
+             GCCUACCAUG GUUUUAACGG GUAACGGGGA AUANGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUUAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUAUCAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCUUACCAUG GUUUUUACGG GUGACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCUUACCAUG GUUUCAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUUAACGG GUAACGGGGA AU-AGGGUUC GAUUCCGGAG
+             UCUUCGCAUG GUUACAACGG GUAACGGAGG GUUAGGGCUC GACCCCGGAG
+             GCCUACCAUG GUGGUGACGG GUAACGGGGA AUCAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCUACGG GUAACGGGGA AUUAGGGUUC UAUUCCGGAG
+             GCCUACCAUG GUAUCAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GACUACCAUG GUGGUAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAN
+             GCCUACCAUG GUUUUUACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUGAUGACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUGAUGACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUAGCUUG GUCGCAACGG GUAACGGAGA AUCAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUAUCAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUGAUAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUGCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUUAACGG GUAACGGAGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUGCCAUG GUUAUAACGG GUAACGGAGG GUUAGGGCUC GACCCCGGAG
+             GCCUACCAUG GUAUCAACGG GUAACGGGGA AUUAGGGUUC UAUUCCGGAG
+             GCUUACCAUG GUUGUAACGG GUGACGGGGA AUAAGGGUUC UAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUUAGGGUUC UAUUCCGGAG
+             GCCUACCAUG GUGAUAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUAUCAACGG GUAACGGGGA AUUAGGGUUC UAUUCCGGAG
+             GCCUACCAUG GUGAUGACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUAUCAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCUUACAAUG CCUACAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUGGCAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GCUUUAACGG GUAACGGGGA AUCAGGGUUU GAUUCCGGAG
+             GCUUACCAUG GUUUCAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCUUACCAUG GUUUCAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCUUACCAUG GUUGYAACGG GUGACGGGGA AUAAGGGUUC UAUUCCGGAG
+             GCUUACCAUG GCGGUUACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUUAGGGUUC UAUUCCGGAG
+             GCCAGCCAUG GUGACAACGG GUAACGGAGG GUUAGGGCUC GACCCCGGAG
+             GCCUACCGUG GUGAUAACGG GUAACGGGGA AUAAGGGUUU GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUGAUGACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GCUGCAACGG GUAACGGGGA AUAAGGGUUC UAUUCCGGAG
+             GCCUACCAUG GUAUCAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUGGCAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUUAGGGUUC UAUUCCGGAG
+             GCUUACCAUG GUUUUUACGG GUGACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCGUACCAUG GCAGCAACGG GUAACGGGGA AUCAGGGUUU GACUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUCAACGG GUAACGGGGA AUAAGGGUUC GAUUCCGGAG
+             GCCUAACUAG GCGGAGACGG GAGACGGGGG AUCAGGGUUU GAUUCCGGAG
+             GACUACCAAG GCCAUGACGG GUAACGGGAA AUCAGGGUUU GAUUCCGGAG
+             GCGUACGGAG GCGAUGACGG GUAACGGGGA AUAUGGGUUU UAUUCCGGAG
+             GCUUAACAAG ACUAUGACGG AUAACGGUUU ACUUU-GUAA UAUUCCGGAG
+             GCAUACCUAG ACGAAGACGG GU-ACGGGGA AGGCAACUUC GAUUCCGGAG
+             GCGUACCUAG GCUAUGACGG GUAACGGGGA AUCAGAGUUC GAUUCCGGAG
+             GCUUAACAAG GCAAUAACGG GUAACGGUUU ACUUU-GUAA UAUUCCGGAG
+             GAUUACCUAG ACUAUUAUGG GUAACGGGAG AUGAAUGUCU GAUACCGGAG
+             GACUCCCAAG ACGUCGACGG GUAACGGGAA AUCAGUGUUU GAUUCCGGAG
+             GCCUAACUAG GCGCAGACGG GAUACGGGGG AUCAGGGUUU GGUUCCGGAG
+             GACUACCAAG ACAGUGACGG UUGACGGGAA AUUAGGGUUU UGUACCGGAG
+             GCCUACUUAG ACGAAUACGG AU-ACGGGGA AUUAUCGUUU GAUUCCGGAG
+             GCGUACCGAG GCUAUAACGG GUAACGGGGA AUAUGGGUUU UAUUCCGGAG
+             GCUUAACAAG ACUAUGACGG AUAACGGUUU ACUUU-GUAA UAUUCCGGAG
+             GCCUACUUAG ACGAAGACGG GU-ACGGGGA AUUGUGGUUU GAUUCCGGAG
+             GCGUACGGAG GCGAUGACGG GUAACGGGGA AUAUGGGUUU UAUUCCGGAG
+             GACUACCAAG ACGGUGACGG UUGACGGGGA AUGAGGGUUC UAUACCGGAG
+             GCCUACUUAG ACGAAGACGG GU-ACGGGGA AUUAUCGUUU GAUUCCGGAG
+             GCCUACCUAG GCGACGACGG GUGACGGGGG GUGAGAGCCU GAUACCGGAG
+             GAGAACAUAG ACUAUGACGG GUAACGGGGG AUGCACGUCU GAUACCGGAG
+             GCUUAACAAG GCAAUGACGG GUAACGGUUU ACUUU-GUAA UAUUCCGGAG
+             GCCUAACUAG GCGGAGACGG GAGACGGGGG AUCGGGGUUU GAUUCCGGAG
+             GCUUAACAAG GCUGUGACGG GUAACGGUUU ACUUU-GUAA UAUUCCGGAG
+             GCGUACGGAG ACGAUGAUGG GUAACGGGGG AU-CAAGUCC GAUUCCGGAG
+             GCCUACUUAG ACGAAGACGG GU-ACGGGGA AUUAGAGUUC GAUUCCGGAG
+             GCGUACCGAG GCUAUAACGG GUAACGGGGA AUAUGGGUUU UAUUCCGGAG
+             GCCUAUUUAG ACGUAGACGG GU-ACGGGGG AUUAGGGUUU GAUUCCGGAG
+             GCCUACCAUG GUGACCACGG GUAACGGGGG AUUAGGGUUC GAUUCCGGAG
+             GCCUACCGUG GUUGCAACGG GUAACGGAGA AUUAGGGUUC GAUUCCGGAG
+             GCUUACCAUG GUGACCACGG GUAACGGGGA AUUAGGGUUC GGUUCCGGAG
+             GCUUACCAUG GUUACAACGG GUAACGGGGA AUUAGGGUUC GAUUCCGGAG
+             GCUUACCAUG GUUGCAACGG GUAACGGAGA AUUAGGGUUC GAUUCCGGAG
+             GCUUACCAUG GUUGCAACGG GUGACGGAGA AUUAGGGUUC GAUUCCGGAG
+             GCUUACCAUG GUGACAACGG GUAACGGAGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUGUAACGG GUGACGGAGA AUUAGGGUUC GGUUCCGGAG
+             GCUUACCAUG GUUGCAACGG GUAACGGAGA AUUAGRGUUC GAUUCCGGAG
+             GCCUACCAUG GUUGCAACGG GUGACGGAGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUGCAACGG GUGACGGAGA AUUGGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUUAACGG GUAACGGAGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUUUUAACGG GUAACGGGGA AUUAGGGUUC GGUUCCGGAG
+             GCCUACCAUG GUUUUAACGG GUAACGGAGA AUUAGGGUUC GAUUCCGGAG
+             GCCUACCAUG GUU-UAACGG GUAAC-GGGA AUUAGGGUUC GAUUCCGGAG
+
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAKCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGUUAGCCUG AGAAACGGCU AACACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGNU ACCACAUCCA AGGAAGGNAG NAGGNGNGNA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCUA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACUUCUA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCUA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AAGGAGCCUG AGAAACGGCU ACUACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AAGGAGCCUG AGAAACGGCU ACUACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACUUCUA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGA-CCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGACAG CAGGCGCGCA
+             AGAG-GCCUG AGAAACGGCC CUCAGAUCUA AGGAGUGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU NCCACAUCCA AGGANGGCAG CAGGCGCGCA
+             AAGGAGCCUG AGAAACGGCU ACUACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAGACGGCU ACCACAUCUA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AAGGAGCCUG AGAAACGGCU ACUACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACUUCUA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGGAGGCAG NNGUNACNCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAAUGGCU ACCACUUUUA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACUUCUA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAGACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACUUCUA AGGAGGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGAGGGCCUG AGAAACGGCC CUCAGUCCUA AGGGACGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGAGGGCCUG AGAAACGGCC CUCAGGUCUA AGGAACGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAGACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             GGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AAGGAGCCUG AGAAACGGCU ACUACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AAGGCGCCUG AGAAAUGGCG ACUACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGAGGGCCUG AGAAACGGCC CUCAGGUCUA AGGAACGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACUUCUA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGAGAGCCUG AGAAACGGCU CUCAUAACUA AGGUUAGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AAGGAGCCUG AGAAACGGCU ACUACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGUGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGAGGGCCUG AGAAACGGCC CUCAAAUCUA AGGAUUGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGUA ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGCGCCUG AGAAAUGGCG ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACUUCUA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAGAUGGCU ACUACGUCCA AGGAUGGCAG CAGGCGCGAA
+             AGGGAGCCUG AGAGAUGGCU CCCACGUCCA AGGACGGCAG CAGGCGCGAA
+             AGGGAGCCUG AGAGAUGGCU ACCACGUCCA AGGACGGCAG CAGGCGCGAA
+             AAGGAGCCUG AGAGAUUGCU ACUAAGUCUA AGGAUUGCAG CAGGGGCGAA
+             AGGGCGCCUU AGAGAUGGCG ACCAGUUCUA AGGAGUGCAG CAGGCUCGAA
+             AGGGAGCCUG AGAGAUGGCU ACUACGUCCA AGGAUGGCAG CAGGCGCGAA
+             AAGGAGCCUG AGAGACGGCU ACUAAGUCUA AGGAUUGCAG CAGGGGCGAA
+             AGGAAGCCUU AGAAACCGCU UUCACGUCCA AGGAUGGCAG CAGGCGCGAA
+             AGGGAGCCUG AGAGAUGGCU CCCACGUCCA AGGAUGGCAG CAGGCGCGAA
+             AGGGAGCCUG AGAGAUGGCU ACUACGUCCA AGGAUGGCAG CAGGCGCGAA
+             AGGGAGCCUG AGAGAUUGCU CCCACGUCCA AGGACGGCAG CAGGCGCGAA
+             AGGGAGCCUG AGAGACGGCU ACCGGGUCCA AGGACAACAG CAGGCGCGAA
+             AGGGAGCCUG AGAGAUGUCU GCCACGUCCA AGGACGGCAG CAGGCGCGAA
+             AAGGAGCCUG AGAGAUUGCU ACUAAGUCUA AGGAUUGCAG CAGGGGCGAA
+             AGGGAGCCUG AGAGACGGCU ACCAGGUCCA AGGACAGCAG CAGGCGCGAA
+             AGGGAGCCUG AGAGAUGGCU ACCAC-UCCA AGGACGGCAG -A-GCGCGAA
+             AGGGAGCCUG AGAGAUAGCU CCCACGUCCA AGGACGGCAG CAGGCGCGAA
+             AGGGAGCCUG AGAGACGGCU ACCAGGUCCA AGGACAGCAG CAGGCGCGAA
+             AGGGAGCCUG AGAAACAGCU CCCACGUCCA AGGACGGCAG CAGGCGCGAA
+             AGGAAGCCUU AGAGACAGCU UUCACGUCCA AGGAUGGCAG CAGGCGCGAA
+             AAGGAGCCUG AGAGACGGCU ACUAAGUCUA AGGAUUGCAG CAGGGGCGAA
+             AGGGAGCCUG AGAGAUGGCU ACUACGUCCA AGGAUGGCAG CAGGCGCGAA
+             AAGGAGCCUG AGAGACGGCU ACUAAGUCUA AGGAUUGCAG CAGGGGCGAA
+             AGGGAGCCUG AGAGAUGGCU GCCACGUCCA AGGACGGCAG CAGGCGCGCA
+             AGGGAGCCUA GAAGACGGCU ACCAGGUCCA AGGACAGCAG CAGGCGCGGA
+             AGGGAGCCUG AGAGAUGGCU GCCACGUCCA AGGACGGCAG CAGGCGCGAA
+             AGGGAGCCUG AGAGACGGCU ACCAGGUCCA AGGACAGCAG CAGGCGCGAA
+             AGGGAGCCUG AGAAAUGGCU ACCACUUCUA AGGAAGGCAG CAGGCGCGCA
+             AGGGARCCUG AGAGACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGGGCCUG AGAAAUGGCC ACCACUUCCA AGGAAGGCAG CAGGCGCGCA
+             AGG-GGCCUG AGAGAUGGCC ACCACUUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCUA AGGAAGGCAG CAGGCACGAA
+             AGGGAGCCCG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAAUGGCU ACCACAUCUA UGGAUGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAGACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAAUGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+             AGGGAGCCUG AGAAACGGCU ACCACAUCCA AGGAAGGCAG CAGGCGCGCA
+
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCUGCACAG GGAGGUAGUG ACAAUAUAUA ACGAUACAGG
+             AAUUACCCAA UCCCGUACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCUGUUCGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCCACANNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAGAAAUA ACAAUGCAGG
+             AAUUACCCAA UCCUGUUCAG GGAGGUAGUG ACAAUAAAUA ACAAUCCAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUACAGG
+             AAUUACCCAA UCCUGCACAG GGAGGUAGUG ACAAUAAAUA ACAAUCCAGG
+             AAUUACCCAA UCCUGCACAG GGAGGUAGUG ACAAUAAAUA ACGAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUGGG
+             AAUUACCCAA UCCCGUACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCCGUACGG GGAGGUAGUG ACAAUAAAUA ACAAUACAGG
+             AAUUACCCAA UCCCGUUCGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACGAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACGAUGCAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUACAGG
+             AAUUACCCAA UCCUGCUCAG GGAGGUAGUG ACAAUAAAUA ACAAUCCAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUACAGG
+             AAUUACCCAA UCCUGCACAG GGAGGUAGUG ACAAUAAAUA ACAAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACGAUACGGG
+             AAUUAUCCCA UCC-GUUCGG GGAGAUAGUG ACAAUAAAUA ACAAUGUAGG
+             AAUUACCCAA UCCUGCACAG GGAGGUAGUG ACAAUAAAUA ACGAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUACAGG
+             AAUUACCCAA UCCUGCWCAG GGAGGUAGUG ACAAUAUAUA ACGAUCCGGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCCGUACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCUAUUCAG GGAGGUAGUG ACAAUAAAUA ACGAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACGGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUACAGG
+             AAUUACCCAA UCCCGUACGG GGAGGUAGUG ACAAUAAAUA ACAAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGA
+             AAUUACCCAA UCCUGCACAG GGAGGUAGUG ACAAUAAAUA ACAAACCAGG
+             ACUUACCCAA UGCCAUACGG CGAGGUAGUG ACAAUAAAUA GCAAUGUAAG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UGCCGUACGG UGAGGUAGUG ACAAUAAAUA ACAACCCAGG
+             AAUUACC-AA UCCCGCACGG GGAGGUAGUG ACAAUANAUA ACAAUAUAGG
+             AAUUACCCAA UCCCACACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUGGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUACAGG
+             AAUUACCCAA UCCUGUACAG GGAGGUAGUG ACAAUAAAUA ACGAUCUAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACC-AA UCC-GCACGG GGAGGUAGUG ACAAUAAAUA ACAAUACGGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCUGCACAG GGAGGUAGUG ACAAUAAAUA ACAAUCCAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCCGCUCGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAACGUAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCUGCACAG GGAGGUAGUG ACAAUAAAUA ACAAUCCAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCUGCACAG GGAGGUAGUG ACAAUAUAUA ACGAUACAGG
+             AAUUAUCCCA UCCCGCACGG GGAGAUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCUAUUCAG GGAGGUAGUG ACAAUAAAUA ACGAUACAGG
+             AAUUAUCCCC UGGCACACGC CGAGAUAGUG ACAAUAAAUA ACAAUGCAGG
+             AAUUACCCAA UCCUAUUCAG GGAGGUAGUG ACAAUAAAUA ACGAUACAGG
+             AAUUACCCAA UCCUAAGCAG GGAGGUAGUG ACAAUAAAUA ACGAUGCGGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACGAUACAGG
+             AAUUACCCAA UCCUGUACAG GGAGGUAGUG ACAAUAAAUA ACGAUGCA-G
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUGCAGG
+             AAUUACCCAA UCC-GCACGG GGAGGUAGUG ACAAUAAAUA ACCAUAUAGG
+             AAUUACCCAA UCCUGCACAG GGAGGUAGUG ACAAUAAAUA ACAAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCCGCAC-G GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACGAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCUAUACAG GGAGGUAGUG ACAAUAAAUA ACAAUCCAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCCGCAC-G GGAGGUAGUG ACAAUAAAUA CUAAUACAGG
+             AAUUACCCAA UCCUGCACAG GGAGGUAGUG ACAAAAAAUA ACAAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUAUCCCC UGGCACACGC CGAGAUAGUG ACAAUAAAUA ACAAUGCAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUGCAGG
+             AAUUACCCAA UCCCGUACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UGCUACGCAG CGAGGUAGUG ACAAUAAAUA ACAAUCUAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCUAUACAG GGAGGUAGUG ACAAUAAAUA ACAAUCCAGG
+             AAUUAUCCGC UUCCGUACGG AGAGAUAGUG ACAAUAAAUA ACAAUAGAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCUGUACAG GGAGGUAGUG ACAAUAAAUA ACGAUGCGGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUACAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAAAAAUA ACAAUGCCGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUAGG
+             AAUUACCCAA -CC-GCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACGGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA CUGAUACAGG
+             AAUUACCCAA UCCUAUACAG GGAGGUAGUG ACAAUAAAUA ACGAUCUAGG
+             AAUUACCCAA UGCUACGCAG CGAGGUAGUG ACAAUAAAUA ACAAGUGCGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUAUGGG
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACAAUAAAUA ACAAUACAGG
+             ACUUGCCUAA UCCUUAUUGG GGAGGCGGUU AUGAGAAGU- AAGAUGUUUA
+             ACUUGUCCAC UCCUUACGGG GGAGACAGUC AUGAGACGUG AGUAUAAGAC
+             ACUUACCCAA UGA--ACA-U UGAGGUAGUU ACGGGGUGUA UUCUAUGACC
+             ACUUGACCUA UGAUAUUAAU UGAGGCAGUU AUGAGUAGUU AAUUUUGUAG
+             ACUUACCGAA UUAU-AGAAU AGAGGUAGUG AGGAAACGUA UAUAGAAAUA
+             ACUUACCCAA UGA--ACA-U UGAGGUAGUU ACGAGGCGUC CUAUGUAAUA
+             ACUUGACCUA UGGAUAUUUC UGAGGCAGUU AUGGGAAGUU AGUUGUUUCA
+             ACUUACCCAA UCGUUUUUAC GGAGGUAGUU AUGACACAUA CGAGGAAGAU
+             AAUUGUCCAC UCUUUGGAGA GGAGACAGUU AUGAGGCGUG AUUAAAAGAG
+             ACUUGCCUAA UCC--UUUGG GGAGGCGGUU AUGAGAAGUG AUGUGUGUGC
+             AAUUGCCCAC UCU--UUGCA GGAGGCAGUU AUGAGACGUG AGUAUCUUG-
+             AAUUACCCAG CCUGCAUUCA GGUGGUAGUA AGGAGACGUA UGUGCAGG--
+             ACUUACCCAA UGA--ACA-U UGAGGUAGUU AUGAGGCGU- AAUUGUGUGG
+             ACUUGACCUA UGAUAUGAAU UGAGGCAGUU AUGAGUAGUU AAUUUUGUAG
+             AAUUACCAAG CCUCCGGUGA GGGGGUAGUA AGGAGACGUA UGAGGAGG--
+             ACUUACCCAA UGA--ACA-U UGAGGUAGUU ACGGGGUGUA UUCUAUGACC
+             AAUUGCCCAC UGU--UUGGA GGAGGCAGUU AUGAGACGUG AGUGCUUG--
+             AAUUACCCAG CCUGCAUUCA GGGGGUAGUA AGGAGACGUA UGUGCGGG--
+             ACUUGCCCAA UCCCUACGGG GGAGGCAGCU ACAAGACGUC CCCGGAAAGC
+             ACUUACCCAA UUGUUUUGAC AGAGGUAGUU AUGACGUAUU AGAGAGAGAC
+             ACUUGACCUA UGGAUUUUUC UGAGGCAGUU AUGGGAAGUC UAUUGUUUCA
+             ACUUGCCUAA UCC--UUUGG GGAGGCGGUU AUGAGAAGUG AGUUUUUUUC
+             ACUUGACCUA UGGAUUUUUC UGAGGCAGUU AUGGGAAGUA UAUUGUUUCA
+             ACUUACCCAA UGA--GGA-U UGAGGUAGUG ACGAGGCGUA GAUUGUGAGU
+             AAUUACCAAG CCCGCGUUCG GGGGGUAGUA AGGAGACGUA UGUGCAGG--
+             ACUUACCCAA UGA--ACG-U UGAGGUAGUU ACGAGGCGUG UAUUAUGAGU
+             AAUUACCAAG CCUC-CAAGA GGGGGUAGUG AAGAGACGUG AAAACAAGUG
+             AAUUACCCAA UCCUGACAAG GGAGGUAGUG ACAAUACAUA CUAAGCGAGG
+             AAUUACCCAA UCCUGCACAG GGAGGUAGUG ACAAUAAAUA ACAAUACGGA
+             AAUUACCCAA UCCUGCACAG GGAGGUAGUG ACAAUAAAUA CUAAUCCAGG
+             AAUUACCCAA UCCUGCACAG GGAGGUAGUG ACAAUAAAUA ACAAUACAGA
+             AAUUACCCAA UCCUGCACAG GGAGGUAGUG ACAAUAAAUA ACAAUACAGG
+             AAUUACCCAA UCCCGUUCGG GGAGGUAGUG ACAAGAAAUA ACGGUACGGG
+             AAUUACCCAA UCCCGUUCGG GGAGGUAGUG ACAAUAAAUA ACGUUGCAGG
+             AAUUACCCAA UCCCGCCUGG GGAGGUAGUG ACAAUAAAUA ACAAUGCGGU
+             AAUUACCCAA UCCCGCACGG GGAGGUAGUG ACGAUAAAUA ACAAUGCAGG
+             AAUUACCCAA UCCCGCUCGG GGAGGUAGUG ACAAUAAAUA ACAAUGCCGG
+             AAUUACCCAA UCCCGCUCGG GGAGGUAGUG ACAAUAAAUA ACAAUGCCGG
+             AAUUACCCAA UCCUGUACAG GGAGGUAGUG ACAAUAAAUA ACAAUACAGG
+             AAUUACCCAA UCUCGUACGA GGAGGUAGUG ACAAGAAAUA ACAAUCCAGG
+             AAUUACCCAA UCCUGCACAG GGAGGUAGUG ACAAUAAAUA ACAAUGCAGA
+             AAUUACCCAA UCCUGCACAG GGAGGUAGU- --GACA-AUC AAUAAG----
+
+             GCUUUA-AGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUUCGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             NNNNNNNNNN NUCGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUUCGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GC-UUAG-GU CUUGGAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUCACGGU CUUGUAAUUG GAUUGGAGGG C-GGUNNNNN NNNNNNNNNN
+             GCCUACAGGU CUUGGAAUUG GAUUGGAGGG CAAGCCUGGU GCCAGCAGCC
+             GCU-UUUAGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU GCCAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUUCGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUCUAGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCU-UUUAGU CUUGGAAUUG UAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUCGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GUCAGCAGCC
+             GCUUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUUCGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUCGGU CCCGUAAUCG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUGCAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUAUGGU CAUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUCGGU CCUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUAUUGGU CUUAUAAUUG GACUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUCGGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUU-AGU UUCGGAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUAGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUCGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCAUUCGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCU-UAUGGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUACGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUCGGU CUCGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAUCC
+             GCCUCACGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUAUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU UUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCU-UUAAGU UUUGGAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             ACUAUAGGGU CUUACAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUAU-GGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUGUAAUCG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCCUUGGGU CUUGGGAUUG CAUUAGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUCGGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUACGGU CUCGUAAUUG GAUUGGAGGG NNNNNNNNNN NNNNNNNNNN
+             GCUUUUUGGC CUUGUAAUUG GACUGGAGGG CAAGUCUGGU GCCAGCWGCC
+             GCCUUA-GGU CAUAGAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUAUUUGGU CUCGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUAUGGU CUUGUAAUCG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUACAGGU CUUGGAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUCGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUUUGGU CCUACGAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUCGGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCAACUGGU CUUGGAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUCGGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUAUGGU CUUGUNAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUCGGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUAU-GU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUACGGU CUUGCAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCAUUCGGU CUUGUAAUUG GACUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCU-UUUAGU GUCGCAAUUG GAGUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUAUUGGU CUUGUAAUUG GACUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUUCGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GACUUUUGUC UUUGCAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUUUGGG C-UAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUACAGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUAUGGU CAUGGAAUUG GAUUGGAGGG CAAGUCUGGA GCCAGCAGCC
+             GCUUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GGUUUAUCCU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCC-AUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUACGGU CUUGCAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUAUUGGU CUUAUAAUUG GACUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUA-GGU CUUGCAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUAGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCCUUGGGU CUUGGAAUUG CAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUAUGGU CAUGGAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUCUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCC-UUUGCC AUCGCAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUAUGGU CUUGUGAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUAGGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUUCGGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUUAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GUC-UUUGGC CUGGCAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUCUCGGU CUUAUAAUUG GACUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUCGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUUCGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCCUUUGGU CAUAGAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCCUUGGGU CUGCGCAUUG CAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUGGU CUCAUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUACGGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GAGAUAAUUU GUUGUGAUUU -ACUGGAGGG CAACUCGGGU GCCAGCAGCC
+             CUGUAAAUUA GGGUGAAGCA -AUUGGAGGG CAAGUUUGGU GCCAGCAGCC
+             GUGUUAAAGC AGGGUUAAGA CAUUGGAGGG CAAGUUUGGU GCCAGCAGCC
+             UAUUAAGCAU AUUACAAGAU AAUCGGAGGG CAAAUCGAGU GCCAGCAGCC
+             CUGUAAAAAU AUUAUUAACU G-------GG AAAG-CUGGU GCCAGCAGCC
+             UAAGAUGAUU UCAAAUCAUG CACUGGAGGG CAAGGCUGGU GCCAGCAGCU
+             CAUUAAAUAU GUGAGCAGAU UAUUGGAGGG CAAAUCGAGU GCCAGCAGCC
+             CAAUAAAUCA GAUUUUUUUU -ACUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             CGAUAAAUUC GUGUAACGCA -AUUGGAGGG CAAGUUUGGU GCCAGCAGCC
+             GAGGCAAGGG GUCGCAUGUG -AUUGGAGGG CAAGUCGGGU GCCAGCAGCC
+             ---UAAA--- --GAGGGAUA GAUUGGAGGG CAAGUUUGGU GCCAGCAGCC
+             ---UAAA--- --GAAUGCAC UACAGGAGGA CAAGACUGGU GCCAGCACCC
+             GUUGUAUAGC AUAUCGAAGU -ACUGGAGGA CAAGUCUGGU GCCAGGAGCC
+             UAUUAAGUAU ACUACAAGAU AAUCGGAGGG CAAAUCGAGU GCCAGCAGCC
+             ---UAAA--- --GAAUGCUC UACAGGAGGU CAAGACUGGU GCCAGCAUCC
+             GUGUUAAAGC AGGGUUAAGA CAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             ---UAAA--- --GAGAAGCA GAUUGGAGGG CAAGUUUGGU GCCAGCAGCC
+             ---CAAA--- --AAACGCAC UACAGGAGGA CAAGACUGGU GCCAGCACCC
+             ACGGCAAGGA GUGCGUAGCG -ACUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             CUUUAG-CAU GGUCCAUAGC GACUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             UAUUAAAUAU AUGAGGUGAU UAUUGGAGGG CAAAUCAAGU GCCAGCAGCC
+             ---GAGUAAG GAGUCGAGAU UAUUGGAGGG CAAGUCGGGU GCCAGCAGCC
+             UAUUAAAUAU AUGAGGUGAU UAUUGGAGGG CAAAUCAAGU GCCAGCAGCC
+             UGA-AAAACU UAACGAGAGC GACUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             ---UAAA--- --AUAUGCAC UACAGGAGGU CAAGACUGGU GCCAGCAUCC
+             GUGAAA-AGC AUACUGAAGU -ACUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             UGUAAAACAC AUGAGUAACU G--UGGAGGG UAAGGCUGGU GCCAGCAUCC
+             C--UUUU-GC UUUGCAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUU-GGU UUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             CGGUUA-CG- -UUGGAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUU-AGC UUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUU-GGU UUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCCUUAUGGU CUCGCAAUCG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             CGC-AACGCU UCUGCAGUCG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             UCC-AAUGGU UCUGCAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             ACUUAACAGU CUUGCAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCU-AUGAGU CUGGCAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUCUUAGU CUGGCAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCUUUUUAGU CUUGUAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCU----AGU CUUGGAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             GCC----GGU UUUGCAAUUG GAUUGGAGGG CAAGUCUGGU GCCAGCAGCC
+             -GCUCUU--- AUUG------ -AUUGGAGGG C-AAUCUGGU GCCAGCAGCC
+
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCNGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUNAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAUA
+             NNNNNNNNNN NNNNNNNNNN NNNNNNAAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CCGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAA AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAG AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGNAAUUC CAGUUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAC
+             GCG-UAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CCGUUAAAAA
+             GCGGUAAUUC GAGCUCCAAU AGCGUAUAUU AAAGUUGUAG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGCUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAGU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGCUG CAGUUAAAAA
+             GCGNNNAUUC CAGCUCCAAU AGCGUAUAUU AAUGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGCAUAUU AAAGUUGUUG CCGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAC
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGCUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG UGGUUAAAAA
+             GCGGUAAUUC CAGCUCUAAU AGUGUAUAUU AAAGUUGCUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUNUAUU AAAGUUGUUG CAGUUAAAAC
+             NNNGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAGU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAC
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG UGGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CACUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CCGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AACAUUGUUG UCGUUAAAAA
+             GCG-UAAUUC CAGCUCCAGU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCACU AGCGUACAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAGU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAC
+             GCGGUAAUUC CAGCUCCAAG AGCGUAUGUA AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU A-CGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCG-UAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAC
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGCUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAC
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CCGUUAAAAA
+             GCGGUAAUUC CAGCUCCAGU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAC
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGUGUAUAUU AAAGUUGCUG CAGUUAAAAC
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAC
+             GCGGUAAUUC CAGCUCCAAU AACGUAUAUU AAAUUUGUUG ACGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG AGGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG ACGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGCUG CAGUUAAAAC
+             GCGGUAAUUC CAGCUCCAGU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAC
+             GCGGUAAUUC CAGCUCCAAU AGUGUAUAUU AAAGUUGCUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUAC CUGCUCCAGU AGAGUCUAUG GUGAAUGCUG CAGUUAAAAU
+             GCGGUAACUC CAACUCCAAG AGUGUCUAUG GUGGAUGCUG CAGUUAAAGG
+             GCGGUAAUUC CAGCUCCAAU AGCGUCUGUG UUUAUUGCUG CGGUUAAAAC
+             GCGGUAAUAC UUGUUCCGAU AGUGUGUAUG AUGAUUGAUG CAGUUAAAAA
+             GCGGUAAUAC UUGCUCCAGG AGCUUAUUCG AU--AUGUUG CGGUUAAAAC
+             GCGGUAAUUC CAGCUCCAGU AGUGUCUAUG UAAAUUGUUG CGGUUAAAAC
+             GCGGUAAUAC UUGUUCCAAG AGUGUGUAUG AUGAUUGAUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAGU AGUGCAUAUA C---AUGCUG UAGUUAGAAA
+             GCGGUAAUUC CAACUCCAAG AGUGCCCAUG GUGGAUGCUG CAGUUAAAAA
+             GCGGUAAUAC CUGCUCCAAU AGUGUCUAUG GUGGAUGCUG CAGUUAAAAU
+             GCGGUAAUAC CGACUCCAAG AGUGUGUAUG AGAGAUGCUG CAGUUAAAAA
+             GCUGUAAUAC CAGCUCCUGG AGUGUCUAUG AUGAUUGCUG CAGUUAAAGC
+             GCGGUAAUAC CAGCUCCAGU AGUGUCUGUG UUUUUUGCUG CGGUUAAAAU
+             GCGGUAAUAC UUGUUCCGAU AGUGUGUAUG AUGAUUGAUG CAGUUAAAAA
+             GC-GUAAUAC CAGCUCCUGG AGUGUCUAUG AUGAUUGCUG CAGUUAAAGA
+             GCGGUAAUUC CAGCUCCAAU AGCGUCUGUG UUUAUUGCUG CGGUUAAAAC
+             GCGGUAAUAC CGACUCCAAG AGUGUGUAUG AGAGAUGCUG CAGUUAAAAA
+             GCGGUAAUAC CAGCUCCUGG AGUGUCUAUG AUAUAUUCUG CAGUUAAAGA
+             GCGGUAAUUC CAGCUCCAGG AGCGCACAUG UGUGUUGCUG CAGUUAAAAC
+             GCGGUAAUUC CAGCUCCAGU AGUGCAUAUA C---AUGCUG UAGUUAGAAA
+             GCGGUAAUAC UUGUUCCAAG AGUGUGUAUG AUGAUUGAUG CAGUUAAAAA
+             GCCGUAAUAC CUGCUCCAAU AGUGUCUAUG GUGAAUGCUG CAGUUAAAAA
+             GCGGUAAUAC UUGUUCCAAG AGUGUGUAUG AUGAUUGAUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAGG GGCGUAUGUG UGUGUUGCUG CGGUUAAAAA
+             GCGGUAAUAC CAGCUCCUGG GGUGUCUAUG AUGAUUGUCG CAGUUAAAGA
+             GCGGUAAUAC CAGCUCCAGU AGCGUCUGUU UUUAUUGCUG CGGUUAAAAC
+             GCGGUAAUAC CAGCUCCAGG AGUGUCUAUG AUGAUUGCUG CGAUUAAAAG
+             GCGGUAAUUC CAGCUCCAAC GGCGUAUAUU AACGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUGAAAC
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAAA
+             GCGGUAAUUC CAGCUCCAAU AGCGUAUAUU AAAGUUGUUG CAGUUAAAA-
+
+             GCUCGUAGUU GAAACCUGGC UCGGUCCGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGUCUGGU CCGGUCUGAU GAUUAAUAGG GACGGUCGGG
+             GCUCGUAGUU GAAGCCUGGC CAGGUCCGAU GAUUAAUAGG GACAGUCGGG
+             GCUCGUAGUU GAAGCCUGGA GCGGUCCGAU GAUUAAUAGG GACAGUUGGG
+             GCUCGUAGUU GAAGAUUUGU UUGGUCGGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGCCUGGU CUGGUCCGAU GAUUAAUAGG GAUAGUCGGG
+             GCUCGUAGUU GAAGCCGGGU AAGGUCGUAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAUUU GAAGUCUGGC GCGGUCCAAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGGGUUUU CGGGUCUGAU GAUUAAUAGG GACAGUUGGG
+             GCUCGUAGUU GAAACUUGAC ACGAUUCUAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAACGGACC GCGGUCUGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGCCUGGC CC-GUCUGAU GAUUAAUAGG GACAGUCGGG
+             GCUCGUAGUU GAACUCUGGC GCGGUCCUAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGCCUGGC CCGGUCCGAU GAUUAAUAGG GACAGUCGGG
+             GCUCGUAGUU GAAGCUUGGC CCGGUCCAAU GAUUAAUAGG GACGGUCGGG
+             GCUCGUAGUU GAAAGGCGCC CCG-UCCGAU GAUUAAUAGG GACGGUCGGG
+             GCUCGUAGUU GAAGUCUGGC UCGGUCCUAU GAUUAAUAGG GAUAGUCGGG
+             GCUCGUAGUU GAAG-CCCGG ACGGUCUGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAACUAGAA GACAU-GGAU GAUUAAUAGG GACAGUUGGG
+             GCUCGUAGUU GAAGGUUUUA UUGGUCGGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAACCUCGG ACGGU-CUAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGCCUGGC CCGGUCCGAU GAUUAAUAGG GAUAGUCGGG
+             GCUCGUAGUU GAAA-CUGGU CCGGUC-GAU GAUUAACAGG GACAGUUGGG
+             GCUCGUAGUC GAACUCGGAC CCGGUCCGAU GAUGAAUAGG GGCAGUUGGG
+             GCCCGUAGUC GAAGACUACU UGUUAAUAAU GAUGAAUAGG GAUGGU-GGG
+             GCUCGUAGUU GAAGAUUGGU CCGGUCCUAU GAUUAAUAGG GACAGUUGGG
+             GCUCGUAGUU GAAGCCUGGC GCGGUCUGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUC GAAGCCUGGC ACGGUCUGAU GAUUAAUAGG AACGGUCGGG
+             GCUCGUAGUU GAAAUCUGGC GCGGUCUGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAACCUGGC GCGGUCUGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGCU GAACCUUGGU CUGGUCCGAU GAUUAAUAGG GACAGUUGGG
+             GCUCGUAGUU GAAGCGGGCU --------AU GAUUAAUAGG GACAGUCGGG
+             GCUCGUAGUU GAAGCCUGGU CCGGUCCGAU GAUUAAUAGG GAUAGUCGGG
+             GCUCGUAGUU GAAGUCUGGC CCGGUCCGAU GAUUAAUAGG GAUGGUCGGG
+             GCUCGUAGUU GAAGCCCGGU CCGGUCCGAU GAUUAAUAGG GACGGUCGGG
+             GCUCGUAGUU GAAGUCUGGU CCGGUCCGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAACC-UUGG UUGGUUUGAU GAUGAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAACCUGGC UCUGUCCUAU GAUUAAUAGG GAUAGUCGGG
+             GCUCGUAGUU GAAGCUGGCC GCGGUCACAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGGUUCUN UUGGUCGGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGCCUGGC CCGGUCCGAU GAUUAAUAGG GAUAGUUGGG
+             GCCCGUAGUU GAAGACUUGU C-GGGAUGAU GAUGAAUAGG GACAGUCGGG
+             GCUCGUAGUU GAAACUCGGU GUAGUCAAAU GAUUAAUAGG GGCAAUCGGG
+             GCUCGUAGUU GAAGCUUGGU UUGGUCCGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGCCUGGC CCGGUCCCAU GAUUAAUAGG GACAGUCGGG
+             GCCCGUAGUC GGAGGUGGUU GCGUUGGCAU GAUUAAUAGG AACAGUUGGG
+             GCUCGUAGUU GAAACCUGGC GCGGUCCCAU GAUUAAUAGG GACAGUUGGG
+             GCUCGUAGUU GAAGGUCUGU UCGGUCGGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUC GAAGUCUGGC GCGGUCCUAU GAUUAAUAGG GACGGUCGGG
+             GCCCGUAGUC GAAAAAUUGG GUUAGUUUAU GAUGAAUAGG GUUGGUUGGG
+             GCUCGUAGUU GAAGUCUGGC CGGGUCCGAU GAUUAACAGG AACAGUCGGG
+             GCUCGUAGUU GAAGGUUCAC UUGGUCAGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGCCUGGC CCGGUCCCAU GAUUAAUAGG GACAGUCGGG
+             GCUCGUAGUU GAAGGUCAUU CCGGCCUGAU GAUUAAUAGG GACAGUUGGG
+             GCUCGUAGUU GAAGCCUGGC CCGGUCCGAU GAUUAAUAGG GAUAGUCGGG
+             GCUCGUAGUU GAAGCCUGGC CCGGUCCGAU GAUUAAUAGG GAUAGUCGGG
+             GCUCGUAGUU GAAACCUGGC AUGGUCUGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAACGUUGGC GCGGUCUGAU GAUUAAUAGG GACAGUUGGG
+             GCCCGUAGUU GAAGCCUGGU GUGGUCCGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGUUUCGG UGUUGGAAAU GAUUAAUAGG GACAGUUGGG
+             GCUCGUAGUU GAAACCUGGC GCGGUCCGAU GAUUAAUAGG GAUAGUUGGG
+             GCUNNNAGUU GAAGCCUGGU CCGGUCCGAU GAUUAAUAGG GACGGUCGGG
+             GCUCGUAGUC GAACCUUUGC CCGGUCCGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAACCUGGU GUGGUCCGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGCUUGGA UCGGUCCAAU GAUUAAUAGG GACGGUCGGG
+             GCUCGUAGUC GAAGCCCUGC CCGGUCCGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGUCUGGU CCGGUCCGAU GAUUAAUAGG GACGGUCGGG
+             GCUCGUAGUU GGAGGAGGAA --GGUCUGAU GAUUAAGAGG GACGAGUGGG
+             GCUCGUAGUC GAAGCCUGGC ACGGUCCGAU GAUCAAUGGG GACGGUCGGG
+             GCUCGUAGUU GAAGCUUGGU CCGGUCCGAU GAUUAAUAGG GACGGUCGGG
+             GCUCGUAGUU GAAGGUUUUU GCUAGCCAAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAUCUCGGA UGGGUCUGAU GAUUAAAAGG GACAGCCGGG
+             GCUCGUAGUU GAAACCUGGC GCGGU-CGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAACCUGGC GCGGUCUUAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGCCUGGC GCGGUCUGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAACCUGGC GCGGUCCGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGCCUGGC CCGGUCCGAU GAUUAAUAGG GACAGUCGGG
+             GCUCGUAGUU GAAGCCUGGC CCGGUCCGAU GAUUAAUAGG GAUAGUCGGG
+             GCCCGUAGUC GAAGG-UAGG GUUAAGAGAU GAUGAAUAGG UUUGGUUGGG
+             GCUCGUAGUU GAAGCCUGGC CCGGUCCGAU GAUUAAUAGG GAUAGUCGGG
+             GCUCGUAGUU GAAGCCUGGC GCGGUCCGAU GAUUAAUAGG GACAGUUGGG
+             GCUCGUAGUU GAAACCUGCC CCGGUCUAAU GAUUAAUAGG GAUAGUCGGG
+             GCCCGUAGUC GAAGAAGGAU AC------AU GAUGAAUAGG GAUGGUUGGG
+             GCUCGUAGUU GAAGCCUGGC CCGGUCCGAU GAUUAAUAGG GAUAGUCGGG
+             GCUCGUAGUC GAAUCCCUGU CCGGUCCGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUC GAAGCUCGAU AUGGUCUGAU GAUUAAUAGG GACGGUCGGG
+             GUCCGUAGUC AAACCUUUAG GGGGCCUGAU GAUGAAUAGA AACGGUUGGG
+             GCUCGUAGUU GAAGCCUGGC CCGGUCCGAU GAUUAAUAGG GAUAGUCGGG
+             GCUCGUAGUC GGAGGU---- UGGGCCUGAU GAUUAAUAGG AACAGUUGGG
+             GCUCGUAGUU GAAGUCUGGC CAGGUCCGAU GAUUAAUAGG GACAGUCGGG
+             GCUCGUAGUU GAAGCCUGGC CGGGUCCGAU GAUUAACAGG AACAGUCGGG
+             GCCCGUAGUC GAAGAAC-GA UUUGAAAGAU GAUGAAUAGG UCUGGU-GGG
+             GCUCGUAGUC GACCCCUAGC CCGGUCCGAU GAGAAAUAGG GGCGGCUGGG
+             GCUCGUAGUU GAAGCCUUGU CGGGUGCCAU GAUUAAUAGG GAUAGUCGGG
+             GCUCGUAGUU GAAGCUCGGC -CGGUCCGAU GAUUAAUAGG GACAGUCGGG
+             GCUCGUAGUU GAAGCUGUCU GUCACCUGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGCUUGGU CCGGUCCGAU GAUUAAUAGG GACAGUCGGG
+             GCUCGUAGUC GAACCUCUGA CUGGUCCGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAACCUGGC ACGGUCUGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAACCUGGC GCGGUCUGAU GAUUAAUAGG GAUAGUUGGG
+             GUCCGUAGUC GAAGGCAGGA CGGGUU-GAU GAUGAAGAGG AACGGUUGGG
+             GCUCGUAGUC GAAGANUGGC AUGGUCCGAU GAUUAAUAGG GACGGUCGGG
+             GCUCGUAGUU GAAGUCUGGC CCGGUCCGAU GAUUAAUAGG GAUAGUCGGG
+             GCUCGUAGUU GAAGUCUGGC CCGGUCCGAU GAUUAAUAGG GAUAGUCGGG
+             GCCCGUAGUC GAAGAAUGAG GCGGUUUUAU GAUGAAUAGG GUUGGUUGGG
+             GUUCGUAGUC GGAGAGUUGG GCGUGGC-AU GAUUAACAGG AGCAGUUGGG
+             GCUCGUAGUU GAAACCUGGC GUGGUCUGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUC GAAGCCCCGU UCGGUCCGAU GAUUAAUAGG GACAGUUGGG
+             GUCCGUAGUU -GU--UAUGU UU-GAGUGUU UUAUUGUAGC AGAGGACGAG
+             GUCCGUAGUC GUG--AUGCA UAAUGUCGUA AUGUUUGCGG AACGGAUAGG
+             GU-CGUAGUC UGGGCUGAGU --------CU AGACCUUGAG ACGGGGAUGU
+             GUCUGUAGUU U--------- --------AU UUUAUAAUAA GCAUUGUAAG
+             GUCCGUAGUC GC-------- --------AA GUUGGAAAAG AGCAAUUUGG
+             GUGCGUAGUC UGA-UCGAGA UAGUAAAGAA AAAUCUUGAG ACAGAGGAGA
+             GUCCGUAGUU ---------- --------UA UUAUUAAGAA GCAAUAUGAG
+             GUUUGUAGCC GUAUUAUCAG AAGGAGGA-- ---UAUUCGA AGCGGAUGGA
+             GUCCGUAGUC GUA--AUGCA UAAGGGUGGA GUUGUAGCGG AGCGGAUAGG
+             GUCCGUAGUC UGU-GUAUGU UUUGUGUGGA UGUGUGUGGC AGAGGACGAG
+             GUCCGUAGUC AUA----GAA AAGAGAGA-G AUGAUGGAGG AGCCGAUGGG
+             GUUCGUAGUC GAAUUAUUGC ACGUCAGAUG GGGAAUAAGG AGUGUUUAGG
+             GUGCGUAGUC UGGGCUGAGG --------UU AUGCCUUGAG ACAGGGAAGA
+             GUCUGUAGUU ---------- --------UA UUAUUAAUAA GCAUUGUGAG
+             GUUCGUAGUC GGGGUCUGGC GAAGGCUUCA GAGGAUAAGG AGCGUUUUGG
+             GUGCGUAGUC UGGGCUGGGU --------CU AGACCUUGAG ACGGGGAUGU
+             GUCCGUAGUC GU----GGAG -AAGAGAGAU GCUCUGGAGA AGCCAACAGG
+             GUUCGUAGUC GAAUAACGGU ACGGCCUUCA UGGAAUAAGG AGCGUUUAGG
+             GUCCGUAGUC GGCGGCAGUG GAAGGGCUCG GGGCGAGAGG AACGGACGAC
+             GUUUGUAGCC UAUUUUUUAG AAGGACGA-- -GAAUGUAGA AGCGAUUGAA
+             GUCCGUAGUU ---------- --------UA UAUUUAAGAA GCAAUAUGAG
+             GUCCGUAGUC UUU--UAUGU UUUUUGGG-A GAGGUUUGGC AGAGGACGAG
+             GUCCGUAGUU U--------- --------AU UUUUUAAGAA GCAAUAUGAG
+             GCGCGUAGUU UGUUUGGGGC GGUCUGUGUC AUUGCUAGGG AGCGCGAGAC
+             GUUCGUAGUC GGGAUCCGGC GAGGCUCC-- -AGGAUGAGG AGCGGCCGGG
+             GUGCGUAGUC GGC-GUGAAU UGUUCGGGUU AUAGCUUGAG ACAGGGACGG
+             GUCCGUAGUC GAAGUCUUGU UAUGUGGCUU CAGAGUAAGG AGYGAAGGAG
+             GCUCGUAGUU GAAGG-CGUG AUUGUUCAAU GAUGAAUAGG GACAGUUGGG
+             GCUCGUAGUU GGAGUAAGCU GUGGUCCAAU GAUUAAUAGG GACAGUUGGG
+             GCUCGUAGUU GGAUGCCGCU UUCGGGCGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUC GGAGCCGUGA CGGGUCCGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GGAUUCUGGA GUGGUCCGAU GAUUAAUAGG GACAGUUGGG
+             GCUCGUAGUU GGAAGGGGCC UCGGUCCAAU GAUUAAGAGG GACAAACGGG
+             GCUCGUAGUU GGAAACGGCC UUGGUCCGAU GAUUAAUAGG GACAGUUGGG
+             GCUCGUAGUU GGAAGGGUCG UUGGUCCGAU GAUUAAUAGG GACAGUUGGG
+             GCUCGUAGUU GGAGAGGAGC ACGGUCCGAU GACYAAUAGG GACAGUUGGG
+             GCUCGUAGUU GGAGGGGCCU CUGGUCCGAU GAUUAAGAGG GACAGUUGGG
+             GCUCGUAGUU GGAGGAGGAG CCGGUCCGAU GAUUAAGAGG GACAGUUGGG
+             GCUCGUAGUU GAACCUUAGA CCAGAUUAAU GAUUAAUAGG GACAGUUGGG
+             GCUCGUAGUC GAACUCUGAA UAGGUACGAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGCACUGG CUGUUGUAAU GAUUAAUAGG GAUAGUUGGG
+             GCUCGUAGUU GAAGCCUUGU -AGACUUG-- ---------- -GUAGUUGGG
+
+             GGCAUUAGUA UUCACAUGCU AGAGGUGAAA UUCUUGGAUU UUGUGAAGAC
+             GGCAUCAGUA UUCAGUUGUC AGAGGUGAAA UUCUUGGAUU UACUGAAGAC
+             GGCAUCAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUUAGUA UUCAGUCGCU AGAGGUGAAA UUCUUGGAUU GACUGAAGAC
+             GGCAUUAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUUCGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUUUGUA UUAAAUUGUC AGAGGUGAAA UUCUUGGAUU UAAUUAAGAC
+             GGCAUUAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUUUGUA UCGGAUCGUU AGGGGUGAAA UCCUUGGAUC GGUCCGAGAC
+             GGCAUUAGUA UUUAAUUGUC AGAGGUGAAA UUCUUAGAUU UAUGAAAGAC
+             GGCAUUAGUA UUCAGUUGCU AGAGGUGAAA UUCUUGGAUU UACUGAAGAC
+             GGCAUCAGUA UUCAAUCGUC AGAGGUGAAA UUCUUGGAUC GAUUGAAGAC
+             GGCAUUAGUA UUUAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUGAAAGAC
+             GGCAUCAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGUAUCAGUA UUCAGUUGUC AGAGGUGAAA UUCUUGGAUU UACUGAAGAC
+             GGCAUCAGUA UUCAGUUGUC AGAGGUGAAA UUCUUGGAUU UACUGAAGAC
+             GGCAUCAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUUAGUA UUUAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUGAAAGAC
+             GGCAUUUGUA UGGCACUGUC AGUGGUGAAA UACUUGAACC AGUGCCAGAC
+             GGCAUUAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUUAGUA UUUAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUGAAAGAC
+             GGCAUCAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUUAGUA UUCGGCCGUC AGAGGUGAAA UUCUUGGAUC GGCCGAAGAC
+             GGCAUUCGUA UUCCGUUGCU AGAGGUGAAA UUCUUGGAUU GACGGAAGAC
+             GACAUUAGUA UUUAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUGAAAGAC
+             GGCAUUAGUA UUCAAUUGUC AGAGGUGAAA UUCUUAGAUU UAUUGAAGAC
+             GGCAUUGGUA UUGAGUCGCU AGAGGUGAAA UUCUUGGAUU GACUCAAGAC
+             GGCAUUAGUA UUCCGUUGCU AGAGGUGAAA UUCUUAGAUU UACGGAAGAC
+             GGCAUUAGUA UUCCGUUGCU AGAGGUGAAA UUCUUGGAUU UACGGAAGAC
+             GGCAUUAGUA UUCAGUUGCU AGAGGUGAAA UUCUUGGAUU UACUGAAGAC
+             GACAUUAGUA UUGAGUUGUC AGAGGUGAAA UUCUUGGAUU UACUCAAGAC
+             GGCGUCAGUA UUGUGUUGUC AGAGGUGAAA UUCUUGGAUU UACACAAGAC
+             GGCAUCAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCGUCAGUA UUCGGCUGUC AGAGGUGAAA UUCUUGGAUU UGCUGAAGAC
+             GGCAUCAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUUAGUA UUCAGUCGCU AGAGGUGAAA UUCUUGGAUU GACUGAAGAC
+             GACAUUAGUA UUCAAUUGUC AGAGGUGAUA UUCUUGGAUU UAUUGAAGAC
+             GGCGUCAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUUAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUUAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUCAGUA UUCAACUGUC AGAGGUGAAA UUCUUGGAUU UGUUGAAGAC
+             GGUAUUUGUA UUACAUAGUC AGAGGUGAAA UUCUUGGAUU UAUGUAGGAC
+             GGCAUUAGUA UUGAGACGGG AGGGGUGAAA UCCAGAGAUC GUCUCAAGAC
+             GGCAUUAGUA UUCAGUUGCU AGAGGUGAAA UUCUUGGAUU UACUGAAGAC
+             GGCAUCAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUC UAUUGAAGAC
+             GGCAUUUGAA UUGAGUGGUU AGAGGUGAAA UUCUUGGAUC CACUCAAGUC
+             GGCAUCAGUA UGGGGCUGCU AGAGGUGAAA UUCUUGGAUC AGCCUCAGAC
+             GGCAUUAGUA UUCANUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUUGGUA UUCCGUUGCU AGAGGUGAAA UUCUUAGAUU GACGGAAGAC
+             GUCAUUAGUA UUUUAUUGCU AGAGGUGAAA UUCUUGGAUU UGUGAAAGAC
+             GGCAUCAGUA UUCAGUUGUC AGAGGUGAAA UUCUUGGAUU UACUGAAGAC
+             GGCAUUAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUCAGUA UUCAGCUGUC AGAGGUGAAA UUCUUGGAUC UGCUGAAGAC
+             GGCAUUUGUA UCGGAUCGUU AGGGGUGAAA UCCUUGGAUC GGUCCGAGAC
+             GGCAUCAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCGUCCGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUUAGUA UUCAGUUGCU AGAGGUGAAA UUCUUGGAUU UACUGAAGAC
+             GGCAUUAGUA UUGAGUUGCU AGAGGUGAAA UUCUUGGAUU UACUCAAGAC
+             GGCAUUGGUA UUGAGUCGCU AGAGGUGAAA UUCUUGGAUU GACUCAAGAC
+             GGCAUUUGUA UGGCGUUGUC AGUGGUGAAA UACUUGAACC AAUGCCAGAC
+             GGCAUUGGUA UUGAGUCGCU AGAGGUGAAA UUCUUGGAUU GACUCAAGAC
+             GGCAUCAGUA UUCAGUUGUC AGAGGUGAAA UUCUUGGAUU UACUGANGAC
+             GGCAUUCGUA UUCAAUUGCU AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUUGGUA UUGAGUCGCU AGAGGUGAAA UUCUUGGAUU GACUCAAGAC
+             GGCAUCAGUA UUCAGUUGUC AGAGGUGAAA UUCUUGGAUU UACUGAAGAC
+             GGCAUUUGUA UUCCGUCGUC AGAGGUGAAA UUCUUGGAUU GCCGGAAGAC
+             GGCAUCAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUCAGUA UUCAAAAGUC AGAGGUGAAA UUCUUGGAUU UUUUGAAGAC
+             GGCAUUGGUA UUCCGUUGCU AGAGGUGAAA UUCUUAGAUU UACGGAAGAC
+             GGCAUCAGUA UUCAGUUGUC AGAGGUGAAA UUCUUGGAUU UACUGAAGAC
+             GGCAUUAGUA UUUAAUUGUC AGAGGUGAAA UUCUUGGAUU UAGGAAAGAC
+             GGCAUUAGUA UUUGCACGCU AGAGGUGAAA UUCUUGGAUU GUGCAAAGAC
+             GGCAUUGGUA UUGAGUCGCU AGAGGUGAAA UUCUUGGAUU GACUCAAGAC
+             GGCAUUAGUA UUUAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUGAAAGAC
+             GGCAUUAGUA UUGCGUUGCU AGAGGUGAAA UUCUUGGAUU UACGCAAGAC
+             GGCAUUCGUA UUGCGUUGCU AGAGGUGAAA UUCUUGGAUU UACGCAAGAC
+             GGCAUCAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GAUAUCAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GACAUUAGUA UUUAAUAGUC AGAGGUGAAA UUCUUGGAUU UAUGAAAGAC
+             GGCAUCAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUUAGUA UUCAGUUGCU AGAGGUGAAA UUCUUGGAUU UACUGAAGAC
+             GGCAUCAGUA UUCAAUCGUC AGAGGUGAAA UUCUUGGAUC GAUUGAAGAC
+             GUCAUUAGUA UUUAAUAGUC AGAGGUGAAA UUCUUGGAUU UAUUAAAGAC
+             GGCAUCAGUA YUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUUUGUA UUCCGUCGUC AGAGGUGAAA UUCUUGGAUU GCCGGAAGAC
+             GGCAUUAGUA UUCCGUUGCU AGAGGUGAAA UUCUUAGAUU UACGGAAGAC
+             GACAUUUGUA UUUGGUCGCU AGAGGUGAAA UUCUUGGAUU GACCGAAGAC
+             GGCGUCAGUA UUCGGCUGUC AGAGGUGAAA UUCUUGGAUU UGCCGAAGAC
+             GGCAUUUGAA UUGGGCGGUU AGAGGUGAAA UUCUUGGAUC CGCCCAAGUC
+             GGCAUCAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUCAGUA UUCAGUUGUC AGAGGUGAAA UUCUUGGAUU UACUGAAGAC
+             GAUAUUAGUA UUUAAUAGUC AGAGGUGAAA UUCUUGGAUU UAUGAAAGAC
+             GGCAUUUGUA UUCAAUUGCU AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUCAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUCAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUUAGUA UUUAAUUGUC AGAGGUGAAA UUCUUGGAUU UAGGAAAGAC
+             GGCAUCAGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GGCAUUUGUA UUACAUCGAC AGAGGUGAAA UUCUUGGAUU GAUGUAAGAC
+             GGCAUUAGUA UUCGGUUGCU AGAGGUGAAA UUCUUGGAUU UACCGAAGAC
+             GGCAUUCGUA UUGCGUUGCU AGAGGUGAAA UUCUUGGAUU UACGCAAGAC
+             GGCUUUUGUA UUUGGCCGCU AGAGGUGAAA UUCUUGGAUU GGCCAAAGAC
+             GGCAUUAGUA UUCAGUUGCU AGAGGUGAAA UUCUUAGAUU UACUGAAGAC
+             GGCGUCAGUA UUCAGCUGUC AGAGGUGAAA UUCUUGGAUU UGCUGAAGAC
+             GGCAUCCGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUUGAAGAC
+             GUCAUUAGUA UUUUAUUGCU AGAGGUGAAA UUCUUGGAUU UGUGAAAGAC
+             GGCAUUAGUA UUGGGCGGUU AGGGGUGAAA UCCUUGGAUC CGC-CAAGAC
+             GGCAUUAGUA UUCAGUUGCU AGAGGUGAAA UUCUUGGAUU UACUGAAGAC
+             GGCAUUCGUA UUCGGUUGCU AGAGGUGAAA UUCUUGGAUU UACCGAAGAC
+             GGGCACUGGA UAGUUGGGCG AGGGGUGAAA UACGAAGACC CUGACUGGAC
+             GAGUGUAGUA UAGACUGGCG AAGAAUGAAA UCUCAAGACC CAGUUUGGAC
+             GGUAAUGUUA UUUGGUAGCG AGAGGUGAAA UUCGAUGACC UACCAAGGAG
+             GUAUACUGUA UGGUUAGGAG AGAGAUGAAA UGUGAUAACC CUAACUGGAU
+             UGUCAGCUAA UGGUAUGGGG AGGGGUAAAG UCUGAGGAUC C-UGCAGGAG
+             GGUAACGAAA UUCGAUGGCG AGAGGUGAAA AUUGAUGACC CAUCGAGGAG
+             GUGUACUGUA UAGUUGGGAG AGAGAUGAAA UGUGACGACC CUGACUGGAC
+             GGCACUUGUA UUCAAUAGCG AGAGGUAAAA UUUGAUGACC UAUUGAGGAC
+             GAGCAUGGUA UAGGUUGGCG AAGAAUGAAA UCUCAAGACC CAACCUGGAC
+             GGGCACUGGA UAGUUGGGCG AGAGGUGAAA UGCGAAGACC CUGACUGGAC
+             GAACAUAGUA UACCAGGGCG AGAGAUGAAA UGCCAAGACC CCUGGUGGAC
+             GGCCAGGGUA UUAAACGGCA AGCGGUGAAA UGUGUUGACC CGUUUAGGAG
+             GGCAAUGAUA UUUGGUAGCG AGAGGUGAAA UUCGAUGACC UGCCAGGGAG
+             GUAUAUUGUA UGGUUAGGAG AGAGAUGAAA UGUGAUAACC CUAACUGGAU
+             GGCCAGGUUA UUAAGCGACG AGAGGUGAAA UUUGAUGACU CGCUUAGGAG
+             GGUAAUGUUA UUUGGUAGCG AGAGGUGAAA UUCGAUGACC UACCAAGGAG
+             GGGCACAGUA UACCAGGGCG AGAGAUGAAA UGCCAAGACC CCUGGUGGAC
+             GGCCAGGUUA UUAAGCGACG AGGGGUGAAA UCUGGUGACU CGCUUAGGAG
+             GGGCGCGGGA UCUGGGGGCG AGAGGUGAAA AUCGGGGACC CUCUGGGGAC
+             GGCGAUUGUA UUCACCAGCC AGAGGUAAAA UUUGAUGACC UGGUGAGGAC
+             GUGUACUGUA UAGUUGGGAG AGAGAUGAAA UGUGACGACC CUGACUGGAC
+             GGGCACCGGA UAGUUGGGCG AGGGGUGAAA UACGAAGACC CUGACUGGAC
+             GUGUACUGUA UAGUUGGGAG AAAGAUGAAA UGUGACGACC CUGACUGGAC
+             GCCGGUGGUA UUCGGUAGCG AGGGGUGAAA ACUGCAGACC UACCGAGGAG
+             GGCCAGGUUA UUAAGCGACG AGAGGUGAAA UUUAAUGACU CGCUUAGGAG
+             GGUAAUUUUA UUUGGUAGCG AGAGGUGACA AUCGAUGACC UACCAAGGAG
+             GGCUAGAUUA UUGAGCAGCG AGAGGUGAAA UUUGAUGACC UGUUUAGGAG
+             GGCAUUAGUA UUUAAUUGUC AGAGGUGAAA UUCGAGGAUU UAUGAAAGAC
+             GGCAUUAGUA UUUAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUGAAAGAC
+             GGCAUUAGUA UUGCACUGUC AGAGGUGAAA UUCUUGGAUU UGUGCAAGAC
+             GGCAUUAGUA UUUAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUGAAAGAC
+             GGCAUUAGUA UUUAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUGAAAGAC
+             GGCAUCUGUA UUUCGUUGUC AGAGGUGAAA UUCUUGGAUU UGCGAAAGAC
+             GGCAUUCGUA UUUCAUUGUC AGAGGUGAAA UUCUUGGAUU UAUGAAAGAC
+             GGCAUUCGUA UUUAAUUGUC AGAGGUGAAA UUCUUGGAUU UCUGAAAGAC
+             GGCAUUCGUA UUCAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUGGAAGAC
+             GGCAUUCGUA UUUAAUUGUC AGAGGUGAAA UUCUCGGAUU UAUGAAAGAC
+             GGCAUUCGUA UUCAAUUGUC AGAGGUGAAA UUCUCGGAUU UAUGGAAGAC
+             GGCAUUAGUA UUUAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUGAAAGAC
+             GGCAUUAGUA UUUAAUUGUC AGAGGUGAAA UUCUUGGAUU UAUGAAAGAC
+             GACGUUAGUA UUUAGUUGUC AGAGGUGAAA UUCUUAGAUU UACGAAAGAC
+             GGCAUUAGUA UUUAAUCGUC AGAGGUGAAA UUCUUGGAUU GA-UUAAGAC
+
+             UAACUACUGC GAAAGCGUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGACG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             GAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             AAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             AAACUAAUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAACUACUGC GAAAGCAUUU ACCAAGGACG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGACG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAACUUCUGC GAAAGCAUUU UCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             AAACUGAUGC GAAAGCGUCU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UGACGACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             GGACUACUGC GAAAGCAUCU GCCAAGGAUG CUCUCAUUGA UCAAGAACGA
+             UAACUUCUGC GAAAGCAUUU GUCAAGGACA UUCCCAUUGA UCAAGGACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             CGACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACAACUGC GAAAGCAUUU GCCAAGGACG UUUUCAUUGA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUAUUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GUCAAGGAUG UUUUCAUUAG UCAAGAACGA
+             UAACUACUGC GANAGCAUUC GCCAAGGAUG UAUUCAUUAA UCAAGANCGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAACUACUGC GAAAGCAUUC GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGACG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUUCUGC GAAAGCAUUU GUCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUC GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU UCCRAAGAUG UUUUCAUUAA UCAGGAACGA
+             AAACUAUUGC GAAGGCAUUU ACCAAGGAUG UUUUCAUUAA UCAAGGACGA
+             UCACUACUGC GAAAGCAUUU GCCAAGGGUG CUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUGA UAAGGAACGA
+             AAACUACUGC GAAAGCAUUU GCCCAGCAUG UGUCCAUUGA UCAAGGACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             CAACAACUGC GAAAGCAUUU GCCAAGGACG UUUUCAUUGA UCAAGAACGA
+             UAACUUCUGC GAAAGCAUUU GACAAGGACA AUCUCAUUGA UCAAGGACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAGCUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUGA UAAGGAACGA
+             AAACUAAUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             GAACUACUGC GAAAGCAUUC GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             CGACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGGACGA
+             AAACUGAUGC GAAAGCGUCU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             CGACUAUUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UANCUACUGC GAAAGCAUUU GCCAAGGACG UUUUCAUUAA UCAAGAACGA
+             GAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUGA UCAAGAACGA
+             CGACUAUUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GUCAAGGACG UUUUCAUUAA UCAAGAACGA
+             AAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUGA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGACG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGACG UUUUCAUUAA UCAAGAACGA
+             CAACAUCUGC GAAAGCAUUU GCCAAGGACG UUCUCGUCGA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGACG UUUUCAUUAA UCAAGAACGA
+             UAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UUCCUACUGC GAAAGCAUUU GCCAAGAAUG UUUUCAUUAA UCAAGAACGA
+             CAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             GAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCANNU GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAACUACUGC GAAAGCAUUU AUCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAACUUCUGC GAAAGCAUUU GUCAAGGACA AACCCAUUGA UCAAGGACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAACUAUUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAACUUAUGC GAAAGCAUUU GACAAAUCCA UUCCCAUUGA UCAAGGACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             AAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUGA UCAAGAACGA
+             UAACUUCUGC GAAAGCAUUU GCCAAGGACG UUUUCAUUGA UCAAGAACGA
+             AAACUACUGC GAAAGCAUUU GACCAGGACG UUUUCAUUGA UCAAGGUCUA
+             UAACUACUGC GAAAGCAUUC GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             AGACUAGUGC GAAAGCAUUU GCCCAGCAUG UGUCCAUUGA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAACUUCUGC GAAAGCAUUU AUCAAGGACA GGCUCAUUGA UCAAGGACGA
+             AAACUACUGC GAAAGCAUUU GCCAAGGACG CUUUCAUUGA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             AAACUACUGC GAAACGAUUU GCCAAGGAUG UUUUCAUUGA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             GAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             AAACUACUGC GAAAGCAUUA GACCAGGACG UUUCCAUUGA UCAAGGGCUA
+             UAACUUCUGC GAAAGCAUUU GCCAAGGACG UUUUCAUUGA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUC GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             GAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAGGAACGA
+             UAACUUCUGC GAAAGCAUUU GACAAGGACA AUCUCAUUGA U-AAGGACGA
+             UACCGGAUGC GAAAGCGUUU GCCCAGCAUG UCUCCAUUGA UCAGGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             GAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUGA UCAAGAACGA
+             GAAGAGAAGC GAAGGCUGUG UUCUUGGACU UUUGUGGUGA UGAAGGACGA
+             UAACGGAGGC GAAGGCGACA CUCUUAGACG UAUCUUAGGA UCAAGGACGA
+             CAACAGAGGC GAAAGCGAUU ACCAGGAACC GAUCUGACGA UCAAGCACGU
+             GAACAGAAGC GAAAGCUGUA UACUUAAAUG UAUUAUUAGA ACAAGGACGU
+             GAGCAAAGGC GUAAGCACUG ACAAAGAUUG AUUCUGUUGA UCAAGGACAG
+             AAACAGAGGC GAAAGCGGUU ACCAGAAGCU GUUCUGACGA UCAAGCACGU
+             GAACUGAAGC GAAAGCUGUA CACUUGUAUG UAUUUUUUGA ACAAGGACGU
+             AAUCAGUAGC GAAAGCGAGU GUCUAGUACG CGUUUGAGGG UCAAGAACGU
+             CAACUGAGGC GAAAGCGGUG CUCUUAUACG CAUCCGAGGA UCAAGGACGA
+             GAGCGGAAGC GAAGGCUGUG CUCUUGGACU AAUGUUGCGA UGAAGGACGA
+             UGAGCGAGGC GAAGGCGAUG UUCUUGUAGG CAUUCGGUGA UCAAGGACGA
+             CGACAGAGGC GAAAG-GCUG GCCAGGGGCA AAUCCGAUGA UAAAGGACGU
+             CACCAGAGGC GAAAGCGAUU GCCAGGAACU GUUCUGACGA UCAAGCACGU
+             GAACAGAAGC GAAAGCUAUA UACUUAAAUG UAUUAUUAGA ACAAGGACGU
+             GAACAGAGGC GAAAGC-CUG GCCAGGG-CG AAUCCGAUGA UAAAGGACGU
+             CAACAGAGGC GAAAGCGAUU ACCAGGAACC GAUCUGACGA UCAAGCGCGU
+             UGAGCGAGGC GAAAGCGGUG CUCUUGUGGG UGUUCGGUGA UCAAGGACGA
+             CAACAGAGGC GAAAGCGCUG GCCAGGAGCG AAUCCGAUGA UAAAGGACGU
+             GAGCGGAAGC GAAGGCGGCG CCCGAGGACG UGUCCGUUGA UCAAGGACGA
+             ACACGGAGGC GAAAGCGAUU GCCUAGAGCG UAUUCAGUGG UCAAGAACGU
+             GAACAGAAGC GAAAGCUGUA CACUUGUAUG UAUUUUUUGA ACAAGGACGU
+             GGACAGAAGC GAAGGCUGUG CUCUUGGACU UAUGUGACGA UGAAGGACGA
+             GAACAGAAGC GAAAGCUGUA CACUUGUAUG UAUUUUUUGA ACAAGGACGU
+             CGACAGAGGC GUAAGCGGCC GGCGAGUGCG GAUCCGACGA UCAAGCGCGU
+             CAGCAGAGGC GAAAGCGCUG GCCAGGGGCG AAUCCGAUGA UAAAGGACGU
+             GACCGGAGGC GAAAGCGAUU ACCAAGAACU GAUCUGACGA UCAAGCACGU
+             UAACAGAGGC GAAAGCGCUA GUCAAGAACG AAUCCGAUGA UCAAGGACGU
+             UAACUUCUGC GAAGGCAUUU GCCAAGGAUG UUUUCAUUGA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACGUGUGC GAAAGCGUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACAUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUGA UCAAGAACGA
+             UAACUACUGC GAAAGCAUUU GCCAAGGAUG UUUUCRUUAA UCAAGAACGA
+             AAACAACUGC GAAAGCACUU GCCAAGAGUG UUUUCAUUAA UCAAGAACGA
+             GAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             GAACAACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             GAACAACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             GAACAACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             GAACAACUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUGA UCAAGAACGA
+             UAACUUCUGC GAAAGCAUUC GUCAAGGAUG UUUUCAUUAA UCAAGAACGA
+             UAACUUCUGC GAAAGCAUUU GCCAAGGAUG UUUUCAUUAA UCAAGAACGA
+
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AAGUUAGGGG AUCGAAGAUG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUCAGGGG AUCGAAGAUG AUCAGAUACC GUCGUAGUCC UGACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUUAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AAGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGAUG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGAUG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UACCCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUUAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCC UAACAGUAAA
+             AGGUCGGGGG AUCGAAAACG AUUAGAUACC GUUGUAGUCU CGACAGUAAA
+             AAGUUGGGGG AUCGAAGAUG AUUAGAU--C GUCGUAGUCU CAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AGGUUAGGGG AUCAAAAACG AUUAGAUACC GUUGUAGUCU UAACAGUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCAAAGAUG AUCAGAUACC GUCGUAGUCU UAACCGUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGAUG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AGGUUAGGGG AUCGAAAACG AUUAGAUACC GUUGUAGUCU UAACAGUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             UAGUCAGGUG AUCAAAGACG AUUAGAUACC GUCGUAGUCU UGACCGUAAA
+             AGGUUCGGGG CUCGAAGACG AUUAGAUACC GUUGUAGUCC GAACAGUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACUAUAAA
+             AAGUCAGGGG AUCGAAGACG AUUAGAUACC GUCGUAGUCU UGACCAUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCC UAACAGUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AGGUUAGGGG AUCAAAAACG AUUAGAUACC GUUGUAGUCU UAACAGUAAA
+             AAGUUGGGGG AUCGAAGAUG AUUAGAUACC GUCGUAGUCU CAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCGUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUUAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUAGUAGUCU UAACCGUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AAGUUAGGGG AUCGAAGACG AUUAGAUACC GUCGUAGUCU UAACCAUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AAGUUAGGGG AUCGAAGNUG AUCAGNUACC GUCGUAGUCU UAACCAUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AAGUUAGGGG AUCGAAGAUG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AGGAAGGGGG AUCGAAAACG AUUAGAUACC GUUGUAGUCU CUUCUGUAAA
+             AAGUUAGGGG AUCGAAGAUG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGA AUCGAAGAUG AUCAGAUACC GUCGUAGUCU UAACCGUAAA
+             AGGUUAGGGG AUCAAAAACG AUUAGAUACC GUUGUAGUCU UAACAGUAAA
+             AAGUUAGGGG AUCGAAGAUG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAAGGG AUCGAAGAUG AUUAGAUACC AUCGUAGUCU UAACCAUAAA
+             AGGUUAGGGU AUCGAAAACG AUUAGAUACC GUUGUAGUCU UAACAGUAAA
+             AGGUUAGGGG AUCGAAAACG AUUAGAUACC GUUGUAGUCU UAACAGUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUGGGGG AUCGAAGAUG AUUAGAUACC GUCGUAGUCU CAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUGGGGG AUCGAAGAUG AUUAGAUACC GUCGUAGUCU CAACUAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AGGAAGGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU CUUCUGUAAA
+             AGGUUAGGGG AUCAAAAACG AUUAGAUACC GUUGUAGUCU UAACAGUAAA
+             AAGUUAAGGG AUCGAAGACG AUUAGAUACC GUCGUAGUCU UAACCACAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUUAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCGUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCGUAAA
+             AAGUUGGGGG AUCGAAGAUG AUUAGAU--C GUCGUAGUCU CAACCAUAAA
+             AGGUCGGGGG AUCGAAAACG AUUAGAUACC GUUGUAGUCU CGACAGUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAAGGG AUCGAAGAUG AUUAGAUACC AUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AGGUUAGGGG AUCAAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AGGUUAGGGG AUCGAAAACG AUCACAUACC GUUGUAGUCU UAACAGUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AAGUCAGGGG AUCGAAGACG AUUAGAUACC GUCGUAGUCC UGGCCAUAAA
+             AGGUUAGGGG AUCAAAAACG AUUAGAUACC GUUGUAGUCU UAACAGUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUGAA
+             AAGUUGAGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU CAACCAUAAA
+             AAGUUGGGG- AUCGAAGAUG AUUAGAUACC GUCGUAGUCU CAACCAUAAA
+             AAGCCAGGGG AGCAAAGUCG AUUAGAUACC GACGUAGUCU UGGCUGUAAA
+             AGGUUAGGGG AUCGAAAACG AUCAGAUACC GUUGUAGUCU UAACAGUAAA
+             AGGUUAGGGG AUCGAAAACG AUUAGAUACC GUUGUAGUCU UAACAGUAAA
+             AGGCUAGAGG AUCGAAAUCG AUUAGAUACC GUUUUAGUUC UAGCAGUAAA
+             AGGCAGGAGU AUCGAAAGUG AUUAGACACC GCUGUAGUUC CUGCAGUAAA
+             GAGCAGGAUU AUCGAAGAGG AUUAGAGACC CACGUAGUUC UUGCAGUAAA
+             AAGCUAGAGG AUCGAAGAUG AUUAGAUACC AUUGUAGUUC UAGCAGUAAA
+             AGGCUAGAGG AUCGAAUACG AUUAGAUACC GUAGUAGUUC UAGCAGUGAC
+             GAGCAGGAGU AUCGAAGGCG AUUAGACACC GUCGUAGUUC UUGCAGUAAA
+             AAGCUGGAGG AUCGAAGAUG AUUAGAUACC AUUGUAGUUC CAGCAGUAAA
+             UAGCCGGAGG AUCGAAGAUG AUUAGAUACC GUUGUAGUUC CGGCCGUAAA
+             AGGCUGGAGG AUCGAAAGUG AUUAGAUACC GCUGUAGUUC CAGCAGUAAA
+             AGGCUAGAGG AUCGAAAUCG AUUAGAUACC GUUUUAGUUC UAGCAGUAAA
+             AGGCUGGAGU AUCGAAAGUG AUUAGAUACC GCAGUAGUUC CAGCAGUAAA
+             AGGCUAGAGG AUCGAAGACG AUUAGAGACC GUUGUAGUUC UAGCAGUAAA
+             GAGCAGGAGU AUCGAAGAGG AUUAGAGACC CACGUAGUUC UUGCAGUCAA
+             AAGCUAGAGG AUCGAAGAUG AUUAGAUACC AUUGUAGUUC UAGCAGUAAA
+             AGGCUAGAGG AUCGAAGACG AUUAGAGACC GUUGUAGUUC UAGCAGUAAA
+             GAGCAGGAUU AUCGAAGAGG AUUAGAGACC CACGUAUUCC UUGCAGUAAA
+             AGGCUGGAGG AUCGAAAGUG AUUAGAUACC GCUGUAGUUC CAGCAGUAAA
+             AGGCUAGAGG AUCGAAGACG AUUAGAGACC GUUGUAGUUC UAGCAGUAAA
+             AGGCCGGAGG AUCAAAGAUG AUUAGAGACC GUCGUAGUUC CGGCAGUAAA
+             AAGCCGGAGG AUCAAAGAUG AUUAGAUACC GUUGUAGUUC CGGCCGUAAA
+             AAGCUGGAGG AGCGAAGAUG AUUAGAUACC AUUGUAGUUC CAGCAGUAAA
+             AGGCUAGAGG AUCGAAAUCG AUUAGAUACC GUUUUAGUUC UAGCAGUAAA
+             AAGCUGGAGG AGCGAAGAUG AUUAGAUACC AUUGUAGUUC CAGCAGUAAA
+             GGGCAGGAGU AUCGAAGACG AUUAGAGACC GUCGUAGUUC CUGCAGUAAA
+             AGGCUAGAGG AUCGAAGACG AUUAGAUACC GUUGUAGUUC UAGCAGUAAA
+             GAGCAGGAGU AUCGAAGAGG AUUAGAGACC CACGUAGUUC UUGCAGUCAA
+             AGGCUGGAGG AUCGAAGACG AUUAGAGAGC GUAGUAGUUC CAGCAGUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUUAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGAGG AUCGAAGACG AUCAGAUACC GUCCUAGUUC UAACCAUAAA
+             AAGUUGGAGG CUCGAAGACG AUCAGAUACC GUCCUAGUUC CAACCAUAAA
+             AAGUUAGGGG UUCGAAGACG AUCAGAUACC GUCGUAGUCC UAACCAUAAA
+             AAGUUGGAGG UUCGAAGACG AUCAGAUACC GUCGUAGUUC CAACCAUAAA
+             AAGUUAGGGG UUCGAAGACG AUCAGAUACC GUCGUAGUCC UAACCAUAAA
+             AAGUUGGGGG UUCGAAGACG AUCAGAUACC GUCGUAGUCC CAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUACC GUCGUAGUCU UAACCAUAAA
+             AAGUUAGGGG AUCGAAGACG AUCAGAUAC- GUCGUAGUCU A-ACCAUAAA
+
+             CUAUGCCGAC UAGGGAUUGG AAUCUUUCAG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAACGG GUUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUAUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUGCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGAAUCGG AUUUAUUCGG CACCUUAGGG AAACCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUACUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG AUUUAUUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGAAUCGG G-UUUCCCGG CGCCUUAGGG AAACCAAAGU
+             CUAUGCCGAC UGGGGAUCGG AUACAUUCGG CACCCUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG AAUUAUUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUGCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUCUUCUCGG CACCUUAACG AAAGUAAAGU
+             CUAUGCCGAC UAGGGAUCGG AUUACUUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG AUUAUUUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG UUUUAAUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUACUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG UAUAUAUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCAG AUUUUUUUGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UCGGGAUCAG GAUUUCUUGG CACCGUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG AUUUUUUCGG CGCCUUAGGG AAACCAAAGU
+             CUAUGCCGAC UUGGGAUCGG UUUUAAUCGG CACCAUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CCGUGCCGAC UAGGGAUCGG GAACGCCCGG CACCUUAGAG AAAUCAAAGU
+             CGAUGCCGAC UGGGGAUCAG UUUGAAUUGG CACCCAAGAG AAAUCUAAGU
+             CUAUGCCGAC UAGGGAUUAG AUAAAUUUAG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGAGAUCGG GUUUCCUCGG CAUCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG AUAUUUUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG UUUUUAUCGG CACCUUCGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUGCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUCCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UGAGAAUGGG UCUUAAUCCG CGCUCUAGAG AAAUCAAGGU
+             CUAUGCCGAC UAGGGAUCGG GCUUUCUCGG CACCUCAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG AUAUGUUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUACUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUCUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAAGGAUCGG AUUUAUUCGG CAUUUCAGCG AAAGCCAAGU
+             CUAUGCCGAC UAGGGAUCGG AUUUUUUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGAAUCGG GUUUGCCCGG CGCCUUAGGG AAACCAAAGU
+             CUAUGCCGAC UAGGGAUCGG AUUUUUUCGG CGCCUUAGGG AAACCAAAGU
+             CUAUGCCGAC UAGGGAUCGG AUAUUUUCGG CACCUUAGAG AAAUCAAAGU
+             CGAUGCCGAC UAGGGAUCGG AAUGAUUCGG CACCUUGGAG AAAUCAAAGU
+             UGAUGCCGUC UAGGGCUUGA GUCGCUCCAU GACCUCAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG AUCUUUUCGG CACCUUUGAG AAAUCAAAGU
+             CUAUGCCGAC UGGGGAUGGG CAAUUGUCCG GACUCUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GAUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG AUUUUUUCGG CGCCUUAGGG AAACCAAAGU
+             CGAUGCCGAC UAGGGAUCGG CUCUCGUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCAAC UAGGGAUCAG UUUAUAUUGG CACCUUGGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG AUUUAUUCGG CA-CUUAGGG AAACCAAAGU
+             CUAUGCCGAC UAGGGAUCGG AUUUUUUCGG CACCUUUGAG AAAUCAAAGU
+             CUAUGCCGAC UGGGGAUCGG ACUAUUUCGG CACCCUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG AUAUUUUCGG CACCUUAGAG AAAUCAAAGU
+             CCAUGCCGAC UAGGGAUCGG GUUGGCCCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GAUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUGCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UCGGGAUCAG GAUUUCCUGG CACCGUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUGCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GAAUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CGAUGCCGAC UAGGGAUCGG AUUUAUUCGG CACCUGAGAG AAAUCUAAGU
+             CUAUGCCGAC UAGGGAUCGG GUAUGCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUACUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCAAU UGGGGAUCAG CUUAAGUUGG CACCCGAGAG AAAUCUAAAU
+             CUAUGCCGAC UAGGGAUCGG GUCUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UGGGGAUGGG CUACAGCCCG CACCCACGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CGAUGCCGAC CAGGGAUCGG GCCAACCCGG CACCUUUGAG AAAUCAAAGU
+             CUAUGCCGAC UCCGAAUCGG UUUCAAUCGG CGCGGUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUGCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG ACUUAUUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGA-CGG GUUUACUUGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG AUUUUUUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUAUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCAAC UAGGGAUUGG GC-UGCUCAG CACCUUGGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUAUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GAUAACUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUUGG GUUUUCUCAG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC CAGGGAUUGG AAUAAUUCAG CACCUUGGUG AAAACAGAGU
+             CUAUGCCGAC UAGGGAUCGG GCAUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCAAU UGGGGAUUAG CUUUAGUUAG CACCCGAGAG AAAUCUAAAU
+             CUAUGCCGAC UAGGGAUCGG GUUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGAGAUUGG GAUUACUCAG CAUCUUAGCG AAAGUAAAGU
+             CUAUGCCGAC UAGGGAUCGG AUUUUUUCGG CACCUUAGAG AAAUCAAAGU
+             CGAUGCCGAC UGGGGAUGGG GUGCGCUCUG GACUCAAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCAAC UAGGGAUUGG GC-UUCUCAG CACCUUGGAG AAAUCAAAGU
+             CUAUGCCGAU GGGCGAUUGG CUUUAGUCAG CAGCCAAGAG AAAUCUGAAU
+             CUAUGCCGAC UAGGGAUCGG GUAUACUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAU UAGGGAUCGG AUUUUUUCGG CACCUUAGAU AAAUCAAAAU
+             CGAUGCCGAC CAGGGAUCGG GACAUCCCGG CACCUUUGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UGGGGAUCAG AUAUAUUUGG CACCCAAGGG AAACCUAAGU
+             CCAUGCCGAC UAGGGAUCGG GUUUUCCCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CGAUGCCGAC UAGGGAUUGG ACUAUUUCAG CACCUUAGCG AAAGUAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUUCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUCCUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCAAC UAGGGAUCAG GUAAUCUUGG CACCUUGGAG AAAUCAAAGU
+             CGAUGCCGAC CGGGGAUUAG GAAGAUCUAG UACUCUGGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG GUUUACUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGAGAUCGG AUUUAUUCGG CAUCUUGGAG AAAUCAAAGU
+             CGAUGCCGAC UGGACGGGAC U-UUUAG-GU UGUCCGAGAG AAAUCUAAGU
+             CUAUGCCGAC AGCCUGUGUG UGAGAAUACG UGGGCGGGAG AAAUCUUAGU
+             CGAUGCCUAC AGCGUGGUGU UUUAUAGCAU UACGCAAGCG AAAGCU-AGU
+             CUAUGUUGAA UCAUAGAUAU AUUGAUAUAU UUAUGUAGAG AAAUUAGAUU
+             CGAUGAUGAU UUUGCC---- -UUAU----- -GCAAUAGAG AAAUCAAAAU
+             CGAUGCCCAC ACUGAUGUGC UUAAC-GCAU GUCAGACGCA AAAGUUAAGU
+             CUAUGCCGAC GAUGUGAUAU GGAUGUGUAU UACAUUAUAG AAAUUAGAGU
+             CCAUGCCUAC UUGCCUUGUA C-AUAGUAUG AAGCAUAGAG AAAUUAGAGU
+             CUAUGCCGAC AUUCUCUGUC C-AGCGGACG GGGAAGGGAG AAAUCUUAGU
+             CGAUGCCGAC UGGACGGGAC A-GUGUG-GU UGUCCAUGAG AAAUCUGAGU
+             AGAUGCCGAC AUGCUCAUUG -GACA-CAGU GGGCAGGGAG AAAUCUGAGU
+             CAAUGCCGAU GUUGUGGUGC CUAA-GG-AC -GCAAAAGAG AAAUCU-AGU
+             CAAUGCCAAC ACUGUGGUGA UAGCGAUCAU UGCAGAAGCG AAAGCU-AGU
+             CUAUGUUAAA UCAUAGAUAC AAUUAUGUAU UUAUGUAGAG AAAUUAGAUU
+             CGAUGCCGAU GCCGUGGUGC --GUG-GCGA CGCGGAGGAG AAAUUG-AGU
+             CGAUGCCUAC AGUGUGGUGC UUAAUUGCAU UGCGCGAACG AAAGCU-AGU
+             AGAUGCCGAC AUGCUCGGUG -GCAA-CACG GGGCAGGGAG AAAUCUGAGU
+             CGAUGCCGAU ACCGUGGUGC GGAUACGCGA CGCGGAAGAG AAAUCG-AGU
+             CGAUGCCAAC GGGGCGAAGC CAAGGGGCUG UGUCCGGGAG AAAUUGGAGU
+             UUAUGCCAAC UUGUGCUUCU GUUCUCGGAG GCGCAUAGAG AAAUCAGAGU
+             CUAUGCCGAC GAUGUGAUAU GAUUAUGUAU UAGAUGAUAG AAAUUUGAGU
+             CGAUGCCGAC UGGACGGGAC UAUAUAG-GU UGUGCAUGAG AAAUCUGAGU
+             CUAUGCCGAC GAUGUGAUAU GAUAUUGUAU UACAUAAUAG AAAUUUGAGU
+             CGAUGCCGAC AUGGUUGAA- -UAGA--AUU GACCAAAGGG AAACUG-AGU
+             CGAUGCCGAU GCCGUGGGGC GGUGCAGCCA GGCG-AGGAG AAAUUG-AGU
+             CGAUGCCAAC GUAGUGGUGA UUUUGGUCAU UGCUAGAGCG AAAGCU-AGU
+             CGAUGCCUAC GCUGUUGUGG UUAUGAGCAC GGCAGAAGAG AAAUCU-AGU
+             CGAUGCCGAC UAGGGCUGAG GUUAUCUUCG GACCUUUGAG AAAUCGAAGU
+             CUAUGCCGAC UCAGGAUCAU CUUUUGGUGG CACUGUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG UUAUCAUCGG CACCUUGGGG AAACCAAAGU
+             CUAUGCCGAC UAGGGAUCAG UUGUAAUUGG CACCUUAGGG AAACCAAAGU
+             CUAUGCCGAC UCGGGAUCGG UAAUUAUCGG CACCGUAGAG AAAUCAAAGU
+             CGAUGUCGAC UAGGGAUCGG C-UUUGUCGG CACCUUAGGG AAACCAAAGU
+             CGAUGCCGUC UGCGGAUCGG AAAUUUUCGG CACGCUAGAG AAAUCAAAGA
+             CAAUGCCGAC UAGGGAUCAG CUUUGGUUGG CACCUUAGAG AAAUCAGAGU
+             CGAUGCCGAC UAGGGAUCGG U-UAAAUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG U-CGUAUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG C-CGAGUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUUGG AGUUUUUCAG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCAGC UCCGGAUCGG CGUUAGUCGG CACGGUGGAG AAAUCAAAGC
+             CUAUGCCGAC UAGGGAUCGG AUUAUUUCGG CACCUUAGAG AAAUCAAAGU
+             CUAUGCCGAC UAGGGAUCGG A--G------ UUCAAUAGA- -----C----
+
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             GUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             GUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUACCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGANNNNNN NNNNNNNNNN
+             UUAGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCGG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             UUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCCG GGGGGAGUAU GGGCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             GUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUAGGUUCGG GGGGGAGUAC GAUCGCAAGG UUGAAACUUA AAGGAAUUGA
+             UUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CCGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             GCAGGUUCUG GGGGGAGNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             GUGGGCUCGG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             UUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             GUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCCCAAGG CUGAAACUUA AAGACAUUGA
+             UUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUG AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             GUGGGCUCCA GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             GUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             GUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAUUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             GUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             GUGGGCUCCA GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             UUAGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGACAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGNGUUCUG GGGGGAGUNU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUAGGUUCGG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             G-AGGUUCGG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UU-GGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             CUGGGUUCUG GGG-GGGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUAGGUUCUG GGGGGAGUAU AUUCGCAAGU AUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             G-AGGUUCGG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGACGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             GUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUG-AACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAUUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             U-AGGUUCGU GGGGGAGUAC GGUCACAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             GUGGGCUCCU GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUAGGUUCGU GGGGGAGUAC GGUCACAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUAGGUUCUG GGGGGAGUAU GGACGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGAAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             GUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             AUGGGUUCUG GGGAUAGUAU GCUCGCAAGA GUGAAACUUG AAGAGAUUGA
+             GCGGGCUCUG GGGAUAGUAC GCUCGCAAGG GUGAAACUUA AAGAAAUUGA
+             GUGGGCUCCG GGGAUAGUAC GGACGCAAGU UUGAAACUUG AAGAAAUUGA
+             AUUGACUCUG GGGAUAGUAU GAUCGCAAGA UUGAAAAUUA AAGAAAUUGA
+             A-GAUCUCCG GGGA--GUAC AUGCGCA--- CAGGAACUU- AAGAA-UUGA
+             G-AGGCUCCG GGGAUAGUAC GGUCGCAAGA UUGAAACUUG AAGAAAUUGA
+             UUUGGCUCUG GGGAUAGUAU GAUCGCAAGA UUGAAAAUUA AAGAAAUUGA
+             UUGGGCUCUA GGGAUAGUAA UCCGGCAACG GACAAACUUA AAGAAAUUGG
+             UCGGGCUCUG GGGAUAGUAC GCUUGCAAGA GUGAAACUUA AAGAAAUUGA
+             ACGGGUUCUG GGGAUAGUAU GCUCGCAAGA GUGAAACUUG AAGAGAUUGA
+             UCGGGCUCUG GGGAUAGUAU GCUCGCAAGG GUGAAAAUUA AAGAAAUUGA
+             A-GGGCCCUG GGGAGAGUAC ACGCGCAA-C AGGAAAUUUA AAGAAAUUGA
+             GUGGGCUCCG GGGAUAGUAC GGACGCAAGU UUGAAACUUG AAGAAAUUGA
+             AUUGACUCUG GGGAUAGUAU GAUCGCAAGA UUGAAAAUUA AAGAAAUUGA
+             A-GGGCCCUG GGGAGAGUAC ACG-GCAAGC GAGAAAUUUA AAGAAAUUGA
+             GUGGGCUCCG GGGAUAGUAC GGACGCAAGU UU-AAACUUG AAGAAAUUGA
+             UCGGGCUCUG GGGAUAGUAU GCUCGCAAGG GUGAAAAUUA AAGAAAUUGA
+             A-GGGCCCUG GGGAGAGUAC ACGCGCAAGC GAGAAAUUUA AAGAAAUUGA
+             GUAGGCUCUG GGGAUAGUAC GGUCGCAAGA CAGAAACUUA AAGAAAUUGA
+             UUGGGCUCUA GGGAUAGUAA UCCGGCAACG GACAAACUUA AAGAAAUUGG
+             UUUGGCUCUG GGGAUAGUAU GAUCGCAAGA UUGAAAAUUA AAGAAAUUGA
+             AUGGGUUCUG GGGAUAGUAU GCUCGCAAGA GUGAAACUUG AAGAGAUUGA
+             UUUGGCUCUG GGGAUAGUAU GAUCGCAAGA UUGAAAAUUA AAGAAAUUGA
+             GCGGGCUCCG GGGAGAGUAC GGGCGCAAGC CAGAAACUUG AAGAAAUUGA
+             A-GGGCCCUG GGGAGAGUAC ACGCGCAA-C -AGAAAUUUA AAGAAAUUGA
+             GUGGGCUCCG GGGAUAGUAC GGACGCAAGU UUGAAACUUG AAGAAAUUGA
+             A-GGGCUUUG GGGAGAGUAC GCGCGCAAGC GAUAAAUUUA AAGAAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             GUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGAUUCCG GGGGUAGUAU GGUUGCAAAG CUGAAACUUA AAGGAAUUGA
+             CCGGGUUCCG GGGGGAGUAU GUUCGCAAGA AUGAAACUUA AAGGAAUUGA
+             UUGGGUUCUG GGGGGAGUAU GGUCACAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCCG GGGGGAGUAU AAUCGCAAGA UCGGAACUUA AAGGAAUUGA
+             CUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             CUGGGUUCCG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCCG GG-------- ---------- ---------- ----------
+             UUGGGUUCUG GGGGGAGUAU GGUCGCAAGG CUGAAACUUA AAGGAAUUGA
+             UUGGGUUCCG G--------- ---------- ---------- ----------
+             ---------- ----UCGU-- ------UCGG CACUUAUGAG AAAUCAAAGU
+
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNAC
+             CGGAAGGGCA CCACCAGGCG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGGG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACAAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             NNNNNNGGCA CCACCAGGGG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGGG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGCGCA CCACCAGGAG UGCGACGUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGGG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUCAAUUC GACUCAACAC
+             CGGAAGGGCA CCACCAGGGG UGGAGCCUGC GGCUUAAUUU GACUCRACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACAAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCA-CAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGA-CCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UUGAGCCUGC GGCUUAAUUU GACUCAACAC
+             NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNCAACAC
+             CGGAAAGGCA CCACCAGGCG UGGAGCCUGC G-CUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACAAGGCG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGCG UGGAGCCUCC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGGG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGGG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGCG UGGAACCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACAAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGGG UGGAACCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGAGCA CCACCAGGAA UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGGG UGGAGCCUGC NGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGUCA CCACCAGGCG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGACA CCACCAGGGG UGGACCGUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGGG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGCG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGCG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUCAAUUC GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC G-CUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGACGCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UNGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGG-CA CCACCAGGAG UGGACGCUGC GGCUUAAUUU GAUCUAACAC
+             CGGAAGGGCA CCACCAGGAG UG--GCGUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UAGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGCG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGC-UGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGCG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGCG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGAAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAACGGCA CCACCAGGCG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGUCA CCACCAGGCG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG YGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGGG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGUG UGGAGCCUGC -GCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACAAGGCG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG U---GCCGGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGAAA UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGACA CCACAAGGAG UGGAGUGUGC GGCUUAAUUU GACUCAACGC
+             CGGAAGGACA CUACCAGGAG UGGAUUGUGC UGCUUAAUUU AACUCAACGC
+             CGGAAGGACA CCACAAGGAG UGGAGUGU-C GGGUUAAUUU GACUCAACGC
+             CGGAAGAAUA CCACAAGGAG UGGAUUGUGC GGCUUAAUUU GACUCAACGC
+             CGGAAGCUAG CCACAAGGGU UGGAUUGUGC GGCUUAAUUU GACUCAAAGC
+             CGGAAGGACA CCACCAGGAG UGGAGUGUGC GGGUUAAUUU GACUCAACGC
+             CGGAAGAAUA CCACAAGGAG UGGAUUGUGC GGCUUAAUUU GACUCAACGC
+             CGGAAGGACA CCACAAGGAG UGGAUUGUGC GGCUCAACUU GACUCAACAC
+             CGGAAGGACA CUACCAGGAG UGGAUUGUAC UGCUUAAUUU GACUCAACGC
+             CGGAAGGACA CCACAAGGAG UGGAGUGUGC GGCUUAAUUU GACUCAACGC
+             CGGAGCUACA CCACAAGGAG UGGAUUGUGC GGCUUAAUUU GACUCAACGC
+             CGGAAGAACA CCACAAGGAG UGGAGUGUGC GGCUUAAUUU GACUCAACGC
+             CGGAAGGACA CCACAAGGAG UGGAGUGUCC GGGUUAAUUU GACUCAACGC
+             CGGAAGAAUA CCACAAGGAG UGGAUUGUGC GGCUUAAUUU GACUCAACGC
+             CGGAAGAACA CCACAAGGAG UGGAGUGUGC GGCUUAAUUU GACUCAACGC
+             CGGAAGGACA CCACAAGGAG UGGAGUGUGC GGGUUAAUUU GACUCAACGC
+             CGGAGCUACA CCACAAGGAG UGGAUUGUGC GGCUUAAUUU GACUCAACGC
+             CGGAAGAACA CCACAAGGAG UGGAGUGUGC GGCUUAAUUU GACUCAACGC
+             CGGAAGGACA CCACAAGGAG UGGAGUGUGC GGCUUAAUUU GACUCAACGC
+             CGGAAGGACA CCACAAGGAG UGGAUUAUGC GGCUUAAUUU GACUCAACGC
+             CGGAAGAAUA CCAGAAGGAG UGGAUUGUGC GGCUUAAUUU GACUCAACGC
+             CGGAAGGACA CCACAAGGAG UGGAGUGUGC GGCUUAAUUU GACUCAACGC
+             CGGAAGAAUA CCACAAGGAG UGGAUUGUGC GGCUUAAUUU GACUCAACGC
+             CGGAAGGACA CCACCAGGCG UGGAGUGUGC GGGUUAAUUU GACUCAACGC
+             CGGAAGAACA CCACAAGGAG UGGAGUGUGC GGCUUAAUUU GACUCAACGC
+             CGGAAGGACA CCACAAGGAG UGGAGUGUGC GGGUUAAUUU GACUCAACGC
+             CGGAAGAACA CCACAAGGAG UGGAGUGUGC GGCUUAAUUU GACUCAACGC
+             CGGAAGGGCA CCACCAGAAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC G-CUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UG-AGCCUGC -GCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC G-CUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAACCUGC GGUUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             --------CA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             CGGAAGGGCA CCACCAGGAG UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             ---------- ---------G UGGAGCCUGC GGCUUAAUUU GACUCAACAC
+             UUUUAGGGGA CCACCAGGAG UGGAGCCUGC GGCU-UAUUU GACUCAACAC
+
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACACAAUAA GGAUUGACAU UUCUNGANUU
+             GGGGAAACUC ACCAGGUCCA GAUGAAAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUGACUA GGAUUGACAU UUCAUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUAGUUA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUU ACCAGGUCCA GACAUAGUAA GGANUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAACUA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACACAACUA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUGGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACACAAUGA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACACAAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACACAAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACACAUUAA GGAUUGACAU UUCUUGAUCA
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGAAAACUC ACCAGGUCCA GACAUAGUGA GGAUUGACAU UUCUUGAUUC
+             GGGAAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACACAUUAA GGAUUGACAU UUCUUGAUCA
+             GGGGAAACUC ACCAGGUCCA GACAUGACUA GGAUUGACAU UUCAUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACACAAAAA GGAUUGACAU UUCUUGAUCU
+             GGGAAAACUU ACCAGGUCCA GACAUAGUGA GGAUUGACAU UUCUUGAUUC
+             GGGAAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAACUA GGAUUGACAU UUCAUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUGACUA GGAUUGACAU UUCAUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUAACUA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAAAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACACAAUAA GGAUNGACAU UUCUUGAUUU
+             GGG--AACUC ACCAGGUCCA GACACAAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAAAAUAA GGAUUGACAU UUCUUGAUCU
+             GGGGAAACUC ACCAGGUCCA GACACAAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAAUAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACUUACCUA GGAUUGACAU UUCUUGAUUG
+             GGGAAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGAAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GAUUUGAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGAAAACUC ACCAGGUCAG GACAUGGCUA GGAUUGACAU UUCAUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAAUAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACACAGUGA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAGUGA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUGACUA GGAUUGACAU UUCAUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAGUGA GGAUUGACAU UUCUUGAUUC
+             GGGAAAACUU ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUUCA GAUGAAAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACACAGUGA GGAUUGACAU UUCUUGAUUC
+             GGGAAAACUC ACCAGGUCCA GACAUAGUGA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACACAAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCGGGUCCA GACACAAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUGACUA GGAUUGACAU UUCAUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUAGCUA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAACUA GGAUUGACAU UUCAUGAUUU
+             GGGAAAACUC ACCAGGUCCA GACAUAGUGA GGAUUGAC-U UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAACUA GGAUUGACAU UUCAUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACACAAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACACGACAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUAACUA GGAUUGACAU UUCAUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACACAAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACACAAUAA GGAUUGACAU UUCUUGAUCU
+             GGGGAAACUC ACCAGGUCCA GACACAAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACACAAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUAGUGA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACACAAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUGGUAA GGAUUGACAU UUCUUGAUUC
+             GGGAAAACUC ACCGGGUCCG GACAUAGUAA GGAUUGACAU UUCAUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAACUA GGAUUGACAU UUCAUGAUUU
+             GGGAAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAACUA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUGACUA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUUCA GACACAAUGA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACA------ GGAUUGACAU UUCUUGAUNN
+             GGGAAACCUU ACCAGGUCCA GACAUAGUAA GGAUUGACAU U-CUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACACAUUAA GGAUUGACAU UUCUUGAUUA
+             GGGGAAACUC ACCAGGUCCA GACAUAACUA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACACAUUAA GGAUUGACAU UUCUUGAUUA
+             GGGAAAUCUC ACCAGGUCCA GACAUAAGAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACACAAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACACAAUAA GGAUUGACAU UUCUUGAUCU
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUAGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAAAAUAA GGAUUGACAU UUCUUGAUCU
+             GGGGAAACUC ACCAGGUCCA GACAUAGUGA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GAUGAAAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GAUGAAAUAA GGAUUGACAU UUCUUGAUUU
+             GGGAAACCUU ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACACAAAAA GGAUUGACAU UUCUUGAUCU
+             GGGGAAACUC ACCAGGUCCA GACACAUUAA GGAUUGACAU UUCUUGAUCA
+             GGGGAAACUC ACCAGGUCCA GACACGAUGA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUGGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAUCUC ACCAGGUCCA GACACAAUAA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACACAAUAA GGAUUGACAU UUCUUGAUCU
+             GGGGAAACUC ACCAGGUCCA GACAUGACUA GGAUUGACAU UUCAUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUAACUA GGAUUGACAU UUCUUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUAAGAA GGAUUGACAU UUCAUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAAAAUAA GGAUUGACAU UUCUUGAUCU
+             GGGGAAACUC ACCAGGUCCA GACACAUUAA GGAUUGACAU UUCUUGAUCA
+             GGGAAAACUU ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGAAACCUC ACCAGGUCCA GACAUAGUGA GGAUUGACAU UUCUUGAU-C
+             GGGGAAACUC ACCAGGUCCA GACAUGACUA GGAUUGACAU UUCAUGAUUU
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCAUGAUUC
+             GGGGCAACUU ACCGGUUCUG AAGUGAGUGU GAGAGUGUUU UACAUGAUGC
+             GGGAAAACUU ACCAGGGU-C AAGUCAUUCG UUGAUCGAA- UACGUGAGAA
+             GGGAAACCUU ACCCGGGCAG UAAUAGUCGU GAGAUGUAUU GGCAGAAGCA
+             GGGGUAAUUU ACCAGGUA-U AACAUGAUAU AAU------- ---AUUUUAU
+             GGAAAAGCUU ACCAAGCU-U AUUUAUUCAA CGAGUAU--U UAUCCGAG-A
+             GGGAAAACUU ACCAGUACAG AUUAUAUCGU AUGAAGGAAU ACCUG-AUGA
+             GAGGUAACUU ACCAAUAU-U UUAUUGUUCU GCGAGGAUA- GAUCUGAGGA
+             GGGAAAUCUU ACCAGGGUCU G-UAUAUGUG AGACUGUCCG UACACGAUAA
+             GGGAAAACUU ACCAGGGU-C AAGUUCUCCG UAGAUCGAG- UACGUGAGGG
+             GGGGCAACUU ACCGGCUCUG AAGGAUGCCU GUGAGUGCA- GGCAUGAGGC
+             GAGGAAACUU ACCAGGGC-C AAGUAUUGUG UAGA------ --AACGAGCA
+             GGGACACCUU ACCGGGCC-C -ACGGCCACA CGAGUGUGA- CACACGAUA-
+             GGGAAAACUU ACCCGGGCGG CAAUUGUCGG GAGAAGCUAC AGCUGAUGAU
+             GGGGUAAUUU ACCAGAUA-U CACAUGGUAU AAU------- ---AUUUUAU
+             GGGACAGCUU ACCAGGCC-C GACGACCGCA CGAGUGUUG- UACACGAUAG
+             GG-AAACCUU ACCCGAGCAG UAAUAGUCCU AAGAUGUAUG AGCAG-AGCA
+             GAGGAAGCUU ACCAGGGC-C AAGUGCUGUG GAGA------ --AAGGAGCA
+             GGGACAGCUU ACCAGGCC-C GACGGCCGGA CGAGUGUUG- UACACGAUAG
+             GGGGCAGCUU ACCAGUGCCG CAUGCGCGGG AGAUUGGCGC CCCGAGAUUG
+             GGGACAACUC ACCAGAGCCU AU-GUGCAGG AGACAGUGAG GACUGGAUAG
+             GAGGUAACUU ACCAAUAU-U UUAUU---CA GAGAAGAUUC GAUCUGAGAA
+             GGGGCAACUU ACCGGUUCUG AAGCGGGCAG GAGAACGAG- GACGGGAUGC
+             GAGGUAACUU ACCAAUAU-U UUAUUAUUUU GAGAGAACGU UGUUUGAGAA
+             GGGGCAACUU ACCCGGGCCG CAGCCUCUUG AGAGGA---- -AACCGAU-G
+             GGGACAGCUU ACCAGGCC-C GACGGUCGCA CGAGUGUGG- UACACGAUAG
+             GGGAAAACUU ACCCGGGCGG CGAUUGUUGU GAGAAGGAAU ACCUG-AUGA
+             GGGACAGCUU ACCAUACC-C GAUGGCCGUG UGAGCGUAG- UACGCGAUAG
+             GGGGAAACUC ACCAGGUCCA GACAUAGAGA GGAUUGACAU UUCUCGAUCC
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGAAAACUC ACCAGGUCCA GACAUAGGAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAGGAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGAAGACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGAAAACUC ACCAGGUCCA GACAUAGGAA GGAUUGACAU UUCUUGAUUC
+             GGGAAAACUC ACCAGGUCCG GACAUAGUGA GGAUUGACAU UUCUUGAUUC
+             GGGAAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUGGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+             GGGGAAACUC ACCAGGUCCA GACAUGGGAA GGAUUGACAU UUCUUGAUUC
+             GGGA-AACUC ACCAGGUCCA GACAUAGUAA GGAUUGACAU UUCUUGAUUC
+
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UGUGGGUGGU NGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UUCAGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AU-UGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUG-CUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGCG AUUUGUCUGG
+             UGUGGUUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGAAGUG AUUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UUUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UGUGGGUGGN NGUGCAUGGC CGUUCNUAGU UGGUGGAGUG AUUUGUCUGC
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UUUGGAUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             AUUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCU-AGU UCGUGGAGUG AUUUGUCUGG
+             UAAGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             CAAAGUUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UCGUGGACUG AUUUGUCUGG
+             AUUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UAUGGGUGGU GGUGC-UGGC CGUUCUUAGU UCGUGGAUUC AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UUCAGGUGGU GGUGCAUGGC CGUUCUUAGU UCGUGGGGUG ACUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UAUGGUUGGU GGUGC-UGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UUGGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             CGUGGUUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUG-C CGUUCUUAG- UGGUGGAGUG AUUUGUCUGG
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UGUGGUUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UCGUGGAUUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUCGAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUGUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UGUGGGUGGU GGUGCAUGGN CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             NGUGGGUGGU GGUGCAUGGC CGUUCUUACU UGGUGGAGUG AUUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UGUGGUUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UCGUGGAGUG AUUUGUCUGG
+             UUUGGAUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UAUGGGU-GU GGUGCAUGGC CGUUCUUAGU UCGUGGAUUC AUUUGUCUGG
+             UUCAGGUGGU GGUGCAUGGC CGUUCUUAGU UCGUGGAGUG AUUUGUCUGC
+             UUCAGGUGGU GGUGCAUGGC CGUUCUUAGA UCGUGGGGUG ACUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UGUGGUUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             CGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UCGUGGAUUG AUUUGUCUGG
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UGUGGUUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGAC CGUUCUUAGU C-GUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UUUGGAUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGC
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UCGUGGACUC AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UGUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UUACGGCGGU GGUGCAUGGC CGUUUUAAAU GGAUGGCGUG AGCUUUG-GA
+             UGGCAGGAGU GGUGCAUGGC CGUUGGAAAU UGAUGGGGCG ACCUUUA-GC
+             UUAC--GCGU GGUGCAUGGC CGUUCUUAAC ACGUGGAGUG AUCUGUCUGG
+             CAUGA-UAGU GGUGCAUGGC CGUUUCCAAU GGAUGCUGUG AAGUAAU-GA
+             GUAAAAUGGU -GUGCAUGGC CGUUCCUAAC ACAUGGAGUG AUUUUGU-GU
+             UGUAAUACGU GGUGCAUGGC CGUUCUUAAC ACGUGAAGUG AUUCCUCGUG
+             UGAUAAUAGU GGUGCAUGGC CGUUUUCAAU GGAUGCUGUG AAGUUUU-GA
+             UAUACUGAGU GGUGCAUGGC CGUUUUCAAC ACGUGGGGUG ACCUGUCAGG
+             GAACGAGAGU GGUGCAUGGC CGUUGGAAAU UGAUGGGAUG ACUUUUA-GC
+             AUGCGGCGGU GGUGCAUGGC CGUUUUAAAU GGAUGGCGUG AGCUUUG-UC
+             AUACAGGAGU GGUGCAUGGU CGUUGGAAAU UGAUGGGAUG ACUUUGA-CC
+             GCCGAGGAGU GGUGCAUGGC CCUUAACGAC AAGU-GAGUG AUCUU-UGGG
+             UUGC--GCGU GGUGCAUGGC CGUUCUUAAA CCGUGGAGUG AUCUGUCGAG
+             CAUGA-UAGU GGUGCAUGGC CGUUUCCAAU GGAUGCUGUG AAGUAAU-GA
+             GUCGAAGAGU GGUGCAUGGC CGUUAACGAC AAGUGGGGUG ACCUU-UGGG
+             UUAC---CGU GGUGCAUGGC CGUCGUUAAC ACCUGGAGUG AUCUGUCUGA
+             GUACAGAAGU GGUGCAUGGU CGUUGGAAAU UGAUGGGAUG ACUUUGG-CC
+             GUCGAAGAGU GGUGCAUGGC CGUUAACGAC GAGUGAGGUG ACUUU-UGGG
+             CGCAGGGAGU GGUGCAUGGC CGUUUGCAAC ACGUGGGGUG ACCUGUCUGG
+             UACUUUGAGU GGUGCAUGGC CGUUUGCAAC ACGUGAGGUG ACUUGUCAGG
+             UGAUAAUAGU GGUGCAUGGC CGUUUUCAAU GGAUGCUGUG AAGUUUU-GA
+             GCGCGGCGGU GGUGCAUGGC CGUUUGAAAU GGAUGGCGUG AGCUUUG-GA
+             UGAUAAUAGU GGUGCAUGGC CGUUUUCAAU GGAUGCUGUG AAGUUUU-GA
+             GGGCC-UCGU GGUGCAUGGC CGUUCUCAAC GCGAGGGGUG ACCAC-UGAG
+             GCCGGAGAGU GGUGCAUGGC CGUUAACGAC AAGUGGGGUG ACCUU-UGGG
+             UGAUCGGUGU GGUGCAUGGC CGUUCUUAAC ACGUGGAGUG AUCUGUCUGG
+             GUCAGAGAGU GGUGCAUGGC CGUUAACGAC GAGUGGGGUG ACCUU-UGGG
+             UAUGGAAAGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGCG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUUUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAUGGGUGGU GGUGCAUGGC CGUUCUUAGU UGGUGGAGUG AUUUGUCUGG
+             UAU-GGUGGU GGUGCAUGGC CGUC--UAGU UGGUGGAGUG AUUUGUC-UG
+
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUAU UGGCUCUGCU
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGUUCAGCC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGCUCAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGU CGGCUCUGCC
+             UUAAUUCCGU UAACGAACGA GACCUUAACC UCGGGACUAU CGGCUUUGCC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU UGGCUAAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAAUC UUGAGACUAU GUACUUUGUA
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UCGGGACUGU UGGCAUUGCC
+             UUAAUUCCGU UAACGAACGA GACCUUAACC UUGGGACUAU UGACAUUGUC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUAU AGAUUUUAUC
+             UUAAUUCCGA UAACGAACGA GACCUUCCCG UCCGGACUAU CAGCUUUGCU
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UAGGGACUAU CGGCUCAGCC
+             UUAAUUCCGU UAACGAACGA GACCUUAACC UUGGGACUAU UGACACUGUC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CCGCUCAGCG
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGACUCAGUC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU UGACUGAGUC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGCUCAGCC
+             UUAAUUCCGU UAACGAACGA GACCUUAACC UUGGGACUAU UGACAUUGUC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUAU CAGUGUUACU
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGCUUUGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGC UGAUUUUAUC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UAGGGACUAU UGGCUCAGCC
+             UUAAUUCCGA UNACGAACGA NACCUUGACC CAGGGACCGU CCACUCCGUG
+             UUAAUUCCGA UAACGAACGA GACCUUGACC UUGGGACUGA CAUCUUUGGU
+             UUAAUUCCGA UAACGAACGA GACCUUUAUC UUGAGACUAU UGACUUUGUC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UCGGGACUGU UGGCUGAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGU AGGCUCUGCU
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUUU UGGCUUUGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGU CUGCUCUGCA
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGU CAGCUCUGCU
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU UGGCUAAGCC
+             UUAAUUGCGA UAACGAACGA GACCUUGACC UUGGGACUAU CUAUACAGUA
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGCUCAGCC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UCGGGACUAU CGGCUCAGCC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGUUCAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUAU CUGUUUUGCA
+             UUAAUUCCGA UAACGAACGA GACCUUAUUC UUGAGACUAU CAAUUUUAUU
+             UUAAUUGCGA UAACGAACGA GACCUUGACC UUGGGACUUU UGGCUCAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUAU UGGCAUUACC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGCUUUGCC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGCUCAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUGACC UUGGGACUGU AGACUAAGUC
+             UCGAUUCCGU UAACGAACGA GAUCUUAACC UUGGGACUGU CGAUUCUAUC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUAU CAGCUCUGCU
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGCUCAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGC UGGCAAAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUACCC UUGGGACCGU CUGCUCUGCA
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UCGGGACUAU CGGCUUUGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGU CGGCUCUGUC
+             UUAAUUCCGA UAACGAACGA GACCUUUUUC UUGAGACUGU UGAUUUUAUU
+             UUAAUUGCGA UAACGAGCGA GACCUUACUC UUGAGACUAU CAACUCAGUU
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUAU UGGCUUUGUC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGCUCAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGC CAGUUCUACU
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGCUCAGCC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGCUCAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAUCC UUGGGACUGC GGGCUCUNCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGU CAGCUCUGCU
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGU CAGCUCUGCU
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACAGU UAGUGUUACU
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGU CAGUUCUACU
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGUUCAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUAU CAGCUUUGCU
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGU CAGCUCUGCU
+             UUAAUUGCGA UAACGAACGA GACCUUAGCC CUGGGACUAU CGAUUCAGUC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUAU CAGCUUUGCU
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGUUCAGCC
+             UUAAUUGCGA UAACGAACGA GACCUUGAGC GUGCGACAAC UGGCGCAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGU CGGCUCUGUC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGAUUCAGUC
+             UUAAUUCCGA UAACGAACGA GACCUUUUCC UUGGGACUGC UGGCUUUGCC
+             UUAAUUCCGA UAACGAACGA GACCUUGACC UUGGGACAAU CGCCUCUGGU
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGU CAGCUCUGCU
+             UUAAUUCCGU UAACGAACGA GACCUUAACC UAGGGACUGU GGAUUUUAUC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGU CAGCUCUGCU
+             UUAAUUCCGA UAACGAACGA GCCCUUAACC UCGGGACUAU CAGCUCUGU-
+             UUAAUUGCGA UAACGAACGA GACAUUUACC UUGGGACUAU CCGCUUAGCG
+             UUAAUUGCGA UAACGAACGA GACCUUGACC UUGGGACUUU UGGCUCAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUUAUC UUGAGACUAU UAACUUUGUU
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGCUCAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGU CGACUCUGUC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UCGGGACUAU CGGCUCAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UCGGGUCUGU UGAUUUUAUC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGCUCAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUAU CAGCUUUGCU
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUAA CAGCUUUGCU
+             UUAAUUCCGA UAACGAACGA GACCUUAUUC UUGAGACUAU CGGCUCAGCC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UCGGGACUAU CGACUCAGUC
+             UUAAUUCCGA UAACGAACGA GACCUUAGCC UUGGGACUGC UAGUCUAGCU
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGCUCAGCC
+             UUAAUUGCGA UAACGAGCGA GACCUUACUC UUGAGACUAU CAACUCAGUU
+             UUAAUUCCGA UAACGAACGA GACCUUUAUU UUGAGACUAU UAACUUUGUU
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUUU CAGCUUUGCU
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGCUCAGCC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGCUCAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUGAUC UUGAGACUGC UGGCUUUGCC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGCUAAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUCUCC UCGGGACUAU CGACUUUGUC
+             UUAAUUCCGA UAACGAACGA GACCUUAUCC UUGGGACUGC GGGCUCUGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGU CGGCUCUGCN
+             UUAAUUCCGA UAACGAACGA GACCUUGAUC CGGAGACUUU UGGCUGAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UCGGGACUGU CGGCUUUGCC
+             UUAAUUGCGA UAACGAACGA GACCUCGGCC CCGGGACUAU CGCCUCAGCC
+             UUAAUUGCGA UAACGAACGA GACCUUAACC UUGGGACUAU CGGUUCAGAC
+             UUAAUUCCGA UAACGAACGA GACCUUUUUC UUGAGACUGU UAACUUUGUU
+             UUAAUUCCGA UAACGAACGA GACCUUUGCU GUAGGACUGC UGGUUGAGCC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGU CUGCUCUGCA
+             UUAAUUCCGA UAACGAACGA GACCUUAACC UUGGGACUGU CAGCACUGCU
+             UUAAGUUACG UAAGAUGUGA GACCCUUUUG -----ACUGU GCUCAUGGGG
+             UUAAAUGCUU AAACCAGUGA GACCUCCUG- -----ACAGG UGUUUGUAAC
+             UUAAAUCCGG UAACGUGUGA GAGGUUGACC CAGGGACUGC AUGUUGAACA
+             UUAAUUUCAA CAAGAUGUGA GACCCUCAUU A----ACAGA UGUAUGAUAC
+             AACCUUCCGU -AAUCUGUG- ---UAAAU-- -----CUCAU AAUAUUGUGA
+             UCAAAUCAGC UAACGCGUGA GAGGCGAGUC UUGAGACGGC AUAGCAACUA
+             UUAAUUUCAA CAAGACGUGA GACCCUUUUU A----ACUGA CACUUU-AGU
+             UUUAUUCCGG UAACGUGUGA GGUCACAGUA UUUAGACAGC UAAUGUAAUU
+             UUAAAUGCUG AAACCAGUGA GAUCUUCUG- -----ACAGG UGCCUCCGGC
+             UUAAGUUGCG UAAGAUGUGA GACCCUUU-- -----ACGGU GUUCACGGAG
+             UUAAAUGGUU GAAUGAGUGA GAUCUUUUG- -----ACAUG UUCCCACGGA
+             UUAAGUCCGU AAAUUAGUGA GACCCCAGC- -A-G-ACAGG UGCGAA-AGC
+             UCAAAUCUGA UAACGCGUGA GACGGUGAUG UACAGACGGU GUAUUAAAUA
+             UUAAUUUCAA CAAGAUGUGA GACCCUCUUU A----ACAGA UGUAUGAUAC
+             UUAAGUCCGG GAAGUAGUGA GACCCCUGCC UGGG-ACAGG UGCUAA-AGC
+             UUAAAUUCGG UAACGUGUGA GAGGUUGACC CCGGGACUGC AUGUUGAGCA
+             UUAAAUGGCU GAAUGAGUGA GAUCUUUG-- -----ACAUG UUCCAC-GGA
+             UUAAAUCCGG GAAGUAGUGA GACCCCUACC -AGGGACAGG UGCCAA-AGC
+             UUGAUUCCGA CAACGCGUGA GGCCUAGGCG CCCG-ACGGG CCGCGCAGCG
+             UUUACUCCGG UAACGUGUGA UGUGCUGUAU GAGAGACUGC AGGCGUAGCC
+             UUAAUUUCAC CAAGACGUGA GACCCUUUUA -A-AGACAGA CACAUC-AGU
+             UUAAGUUGCG UAAGAUGUGA GACCCUUU-- -----ACAGU GCUCUUGGGG
+             UUAAUUUCAA CAAGACGUGA GACCCUUAUU UUAAGACAGA CACAUC-AGU
+             UUAGUUCUGG CAAGCCGUGA GGCCCCUGUA CUUAGACGGC GGACGCAGUC
+             UUAAGUCCGG GAAGUAGUGA GACCCCUGCC GGGGGACAGG UGCUAA-AGC
+             UCAAAUCUGA UAACGCGUGA GAGGUGAGUG GUCAGACGAU GUGUUAAGCA
+             UUAAGUCCGC CAAGUAGUGA GAUCCCUAGA UAUCGACAGG UGUUAA-AAC
+             UUAAUUCCGU UAACGAACGA GACCUCAAGA GUUCGACUAU CGGUCUUGCC
+             YUAAUUCCGU UAACGAACGA GACCUUAACC UCGGGACUAU CGAUUUUAUC
+             UUAAUUCCGU UAACGAACGA GACCUUAACC U-GGGACCCC CGGCGUUGCC
+             UUAAUUCCGU UAACGAACGA GACCUUAACC UCGGGACUAU CGGCUUUGCC
+             UUAAUUCCGU UAACGAACGA GACCWUAACC UCGGGACUAU CGGUUUUACC
+             UUAAUUCCGU UAACGAACGA GACCUUAACC GCGGGACUGU UGGUUUUACC
+             UUAAUUCCGU UAACGAACGA GACCUUAACC UUGGGACUAU CGGUUCAACC
+             UUAAUUCCGU UAACGAACGA GACCUUAGCC UCGGGACAGU UGGUCCUAUC
+             UUAAUUCCGU UAACGAACGA GACCUUAACC UCGGGACUAU UGGUUUUACC
+             UUAAUUCCGU UAACGAACGA GACCUUAACC UCGGGACAAC UGGCCCGGCC
+             UUAAUUCCGU UAACGAACGA GACCUUAACC UCGGGACUAC UGGUUUGGCC
+             UUAAUUCCGU UAACGAACGA GACCUUAACC UUGGGACUAU AG-AUUU-UC
+             UUAAUUCCGU UAACGAACGA GACCUUAACC U-GGGACUAU GG-AUUU-UC
+             UUAAUUCCGA UAACGAACGA GACCUUAACC U-GGGACUCG AA--GUUAUC
+             UUAAUUCCGU UAACGAACGA GACCUUAACC U--------- ----------
+
+             AAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACANGUCUGU GAUGCCCUUA GACGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             CGUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AACUGAAGUU UGAGGCAAUA ACAAGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             UAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU GGAGGCAAUA ACAGGUCUGU GAUGCCCUUA NAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GACGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GACGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AGUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GUCGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AAUGGAAGUU GAAGGCAAUA ACAGGUCUGU GAUGCCCUUA RAUGUUCUGG
+             AAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             UACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AAAGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU CGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GACGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GACGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AAUGGAAGUA CGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAAGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             UACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GACUGAAGAG UAAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUCCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUCCUGG
+             AGCGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUG GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AACGGAAGUU GAAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GGCGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCCGG
+             CGCGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GACGGANNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNUCUGG
+             GACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA AAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GACGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GACGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUCA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GACGUUCUGG
+             AGCGGAAG-- CGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GACGUUCUGG
+             GACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GACGUUCUGG
+             AGAGGAAGUU CGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAGGCA AAAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCCGG
+             GACGGAAG-U UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             CACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCGGUUA GAUGUUCUGG
+             -AUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GGUGGAAGUU GGAUGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             NAUGGAAGUA CGAGGCAAUA ACAGGUCUGU GAUGCCCUUA UAUGUUCUGG
+             AAUGGAAGUU GAAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA -AUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GUUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAAGGAAGUU UUAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AGCGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AAUGGAAGUU GAAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAAGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AGAGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU GGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             CGCGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNCUGG
+             AAAGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUG CGCGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GACGGAAGUU GAAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AGAGGAAGUU GGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GACGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             CAAGGGAGGA AUGGAACAGA ACAGGUCCGU UAUGCCCUGA GAUGAAGCGG
+             ACAGGAGGGU GGAGGCUAUA ACAGGUCCGU GAUGCCCUUA GAUAUCCUGG
+             UGAGGAAGUA CGCC-CGAUA ACAGGUCUGU GAUGCCCGUA GAUGUCCGGG
+             AUAUGAAGGA GAGGAUUAAA ACAGGUCCGU UAUGCCCUAA GAUAAUCUGG
+             AAAGAACAAU UCGAGCAAGA ACAGGUCAGU GAUGUCCUUU GAUAGCUUGG
+             UGAGGAAGCA ACGCCCAAUA ACAGGUCCGU GAUGCCCGUA GAUGUUCUGG
+             GUAGGAAGGA AAGGACUAAA ACAGGUCAGU UAUGCCCUCU GACAUUUUGG
+             AGAGGAAG-- UGUGACGAUA ACAGGUCAGU GAUGCCCUUA GAUACCCUGG
+             ACAGGAGGGC GAAGGCGAUA ACAGGUCCGU GAUGCCCUUA GAUAUCCUGG
+             CAAGGAGGGG AUGGAAAAGA ACAGGUCCGU UAUGCCCUGA GAUGAGGCGG
+             ACAGGAAGGA AAAGGCUAUA ACAGAUCCGA GAUGCCCUCA GAUGCCCUGG
+             ACAGGAAGGA UGGGUCAAGG ACAGGUCAGU GAUGCCCUUA GAUGGUCCGG
+             CAAGGAAGCA CACC-CAAUA ACAGGUCUGU GAUGCCCGUA GAUGUUCGGG
+             AUAUGAAGGA GAGGAUUAAA ACAGGUCCGU UAUGCCCUAA GAUAAUCUGG
+             ACAGGAAGGA AGGGUCAAGA ACAGGUCAGU GAUGCCCUUA GAUGGCGUGG
+             UGAGGAAGUA CGCC-CGAUA ACAGGUCUGU GAUGCCCGUA GAUGUCCGGG
+             ACAGGAAGG- GGAGGCUAUA ACAGAUCAGA GAUGCCCUUA GAUGCCCUGG
+             ACAGGAAGGA AGGGUCAAGA ACAGGUCAGU GAUGCCCUCA GAUGGUCUGG
+             GCAGGAAGGG --AGGCGAUA ACAGGUCAGU GAUGCCCUCA GAUGCACUGG
+             UGAUGAAG-- CGGCGCUAUA ACAGGUCAGU GAUGCCCUUG GAUGUUCUGG
+             GUAGGAAGGA AAGGAUUAAA ACAGGUCCGU UAUGCCCUCA GACAUUUUGG
+             CAAGGGAGGA AUGGAACAGA ACAGGUCCGU UAUGCCCUGA GAUGAAGCGG
+             GUAGGAAGGA AAGGAUUAAA ACAGGUCCGU UAUGCCCUCU GACAUUUUGG
+             CGAGGAAGCG AGGGCGUAUA ACAGGUCUGU GAUGCCCGCA GAUGUCCGGG
+             ACAGGAAGGA AGGGUCAAGA ACAGGUCAGU GAUGCCCUUA GAUGGUCUGG
+             CAAGGAAGAG ACACCCAAUA ACAGGUCUGU GAUGCCCGUA GAUGUUCGGG
+             ACAGGAAGGA AGGGGCAAGA ACAGGUCAGU GAUGCCCUUA GAUGGUAUGG
+             GAAGGAAGGU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GGUGGAAGUA UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAACA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AAAGUCAG-G A-AG-CAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AAAGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             GAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AGUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             AGUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             UAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             CAUGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             G-UGGAAGUU UGAGGCAAUA ACAGGUCUGU GAUGCCCUUA GAUGUUCUGG
+             ---------- UGAGGCAAUA AC-GGUCUGU GAUGCCCUUA GAUGUUCUG-
+
+             GCCGCACGCG CGCUACACUG ACGGAGCCAA GAGGAAACUU GACUUUGUCG
+             GCCGCACGCG CGCUACACUG ACGGAGCCAA GAGGAGACUU GACUCCGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAA GAGGAAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG AUGAAGUCAU AAGGGAACUU UACUUCAUCG
+             GCCGCACGCG CGCUACACUG ACGGAGCCAA GAGGGAACUU GACUCCGUCG
+             GCCGCACGCG CGCUACACUG ACAAUGGCAG AAGGGAACUU CACAUUGUCG
+             GCCGCACGCG CGCUACACUG AUGAAGUCAA GAGGGAACUU GACUUCAUCG
+             GCCGCACGCG CGCUACACUG AUCAAGUCAA GAGGGAACUU UACUUGGUCG
+             GCCGCACGCG CGCUACACUG AUGAAGUCAA GAGGGAACUU UACUUCAUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACGAAGUCAG AAGGGAACUU UACUUCGUCG
+             GCCGCACGCG CGUUACACUG ACGGAGCCAG GAGGAGACUU GACUCCGUCG
+             GCCGCACGCG CGCUACACUG ACGGAGCCAG GAGGAGACUU GACUCCGUCG
+             GCCGCACGCG CGCUACACUG ACGGAGCCAG GAGGAGACUU GACUCCGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAA GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG AUCAAGUCAG GAGGGAACUU UACUUGAUCG
+             GCCGCACGCG CGCUACACUG AUGAAGUCAA GAGGAAACUU AACUU-AUCG
+             GCCGCACGCG CGCUACACUG AUGAAGUCAU GAGGGAACUU UACUUCAUCG
+             GCCGCACGCG CGCUACACUG AUGAAAUCAA GAGGGAACUU GAUUUCAUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAA GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACAGGGCCAG GAGGGAACUU GACCCUGUCG
+             GCCGCACGCG CGCUACACUG ACUGAUCCAG GAGGGAACUU GACUCAGUCG
+             GCCGCACGCG CGCUACACUG AUGAAUUCAA GAGGUAACUU UACUUCAUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAG AAGGAAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGGCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACUGAGCCAG GAGGAGACUU GACUCAGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACGGAGCCAG GAGGGAACUU GACUCCGUCG
+             GCCGCACGCG CGCUACACUG ACGGAGCCAG GAGGAGACUU GACUCCGUNG
+             G-CGCACGCG CGCUACACUG ACAGAGCCAA GAGGAAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACAGGGCCAG GAGGAGACUU GACCCUGUCG
+             GCCGCACGCG CGCUACACUG ACGGAGCCAG GAGGAGACUU GACUCCGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG AUGAAGUCAA GAGGGAACUU UACUUCAUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAG GAGGAAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG AUGAAGUCAA GAGGGAACCU UACUUCAUCG
+             GCCGCACGCG AGAUACACUG AUGAAGUCAU GAGGGAACUU UACUUCAUCG
+             GCCGCACGCG CGUUACACUG ACAGAGACAA GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACAUGGGCAA GAGGAAACUU UACCAUGUCG
+             GCCGCACGCG CGCUACACUG AUGAGACCAA AAGGAGACUU GUUCUCAUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGUUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG AUGAGGUCAG GAGGACACAC UACCUCAUCG
+             GCCGCACGCG CGCUACACUG ACAGAACCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG AUGAAGUCAU GAGGGAACUU UACUUCAUCG
+             GCCGCACGCG CGCUACACUG ACUGAGCCAG GAGGAGACUU GACUCAGUCG
+             GCCGCACGCG CGCUACACUG AUGAAUUCAA AAGGUAACUU UACUUCAUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAA GAGGAAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG AUGAAGUCAU GAGGNAACUU UACUUCAUCG
+             GCCGCACGCG CGUUACACUG ACACAGCCAG GAGGAGACUU GACUGUGUCG
+             GCCGCACGCG CGCUACACUG AUGAAGUCAG GAGGGAACUU GACUUCAUCG
+             GCCGCACGCG CGCUACACUG ACAGAGACAA GAGGGAACUU GACUCUGUCG
+             GCUGCACGCG CGCUACACUG ACAGGGCCAA GAGGAAACUG GACCCUGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACAGGGCCAG GAGGAAACUU GACCUUGUCG
+             GUCGCACGCG CGCUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACAC-G AUGAAGUCAA GAGGAAACUU GACUUCAUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACGGAGCCAG GAGGAGACUU GACUCCGUCG
+             GCCGCACGCG CGCUACACUG ACCGAACCAG GAGGGAACUU GACUCGGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACGGAGCCAG GAGGAGACUU GACUCCGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCG-ACGCG CGCUACACUG ACGGAGCCAG GAGGAGACUU GCCUCCGUCG
+             GCCGCACGCG CGCUACACUG ACGCAGCCAG GAGGAGACUU GACUGCGUCG
+             GCCGCACGCG CGCUACACUG ACUGAGCCAG GAGGAGACUU GACUCAGUCG
+             GCCGCACGCG CGCUACACUG ACGGAGCCAA GAGGAGACUU GACUCCGUCG
+             GC-GCACGCG CGCUACACUG AUGCAGUCAG AAGGAAACUU UACUGCAUCG
+             GCUGCACGCG CGCUACACUG ACAGAGACAA GAGGAAACUU GACUUUGUCG
+             GC-GCACG-G UGCUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG AUGAAGGCAG AAGGGAACUU CACUUCAUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCGAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCNACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGUUACACUG CAAGAGACAG GAGGAGACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAA GAGGAAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG AUAAAUUCAA AAGGAAACUU UACUUUAUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAA GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAA GAGGAAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG AUGAAGGCAG GAGGGAACUU GACUUCAUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAA GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACUGAGCCAG GAGGAAACUU GACUCAGUCG
+             GCCGCACGCG CGCUACACUG AUGAAAUCAG GAGGGAACUU UAUUUCAUCG
+             GCCGCACGCG CGCUACACUG ACAGGGCCAG GAGGAGACUU GACCCUGUCG
+             GCCGCACGCG CGCUACACUG AUGAGGCCAG GAGGAGACUG UCCCUCAUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAA GAGGAAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAA GAGGAAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG AUAAAUUCAA AAGGAAACUU UACUUUAUCG
+             GCCGCACGCG CGCUACACUG ACAGAGACAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAA GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACACAGCCAG GAGGGAACUU GACUGUGUCG
+             GCCGCACGCG CGCUACACUG AUAAGGUCAG GAGGUGACUU UACCUUAUCG
+             GCCGCACGCG CGCUACACUG ACGGAGCCAG GAGGAGACUU GACUCCGUCG
+             GCCGCACGCG AGCUACACUG ACCGAGCCAG GAGGGAACUU GACUCGGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAG GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACCAAGGCAA GAGGAAACUU -ACUUGGUCG
+             GCCGCACGCG CGCUACACUG ACUGAGCCAG GAGGAGACUU GACUCAGUCG
+             GCCGCACGCG CGCUACACUG ACAGGGGCAG GAGGAGACUU GACCCUGUCG
+             GCCGCACGCG CGCUACACUG ACAGAGCCAA GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG AUAAAUUCAA AAGGUAACUU UACUUUAUCG
+             GCCGCACGCG CGCUACAAUG GCGAGGCCAG GAGGAGACUU UCCCUCGUCG
+             GCCGCACGCG CGCUACACUG ACAGAUCCAA GAGGGAACUU GACUCUGUCG
+             GCCGCACGCG CGCUACACUG ACGGAGCCAG GAGGGAACUU GACUUCGUCG
+             -CGGCACGCG CACUACGAUA GAUGCCU--- ---AUGU--- -GGGCUACUG
+             GCAGCAAGCG CAAUACAAUA UCUCUUCAGU GACAAA-GUG AUUUGAGAUG
+             GCUCCACGCG CACUACAAUG AGGUGAGGUU UAUCUU-GUG UAACACCUCG
+             GUUGCACGCG CAAUACAAUA AUAU------ ----UUG--- ----AUAUUA
+             GCUGCACGCG CAAUACAAUU UUUAUGUA-- ---GUAA--- -GAUAUAGAU
+             GCUCCACGCG CACUACAAUU AUAAAUACU- AU-UUU--GU A-AUUUAUAA
+             GCAGCACGCG CAAUACAAUA GAC------- ---UUUA--- -----AUCUU
+             GCUGCACGCG CAAUACAUUG AGUAAGUCAU ACAGUAAUGA AACUUACUCG
+             GCUGCAAGUG CAAUACAAUA UCCAUGUCGA GA-AAGG-UG AUUAUGGAUG
+             GCUGCACGCG CACUACGAUA GAUGGCG--- ---CUUC--- -UGCCUGCUG
+             GCUGCACGCG CAAUACAAUA GCAGGUAGA- GAGGAGACAG GAAGGUGCUC
+             GCUGCACGCG CACUACAGUG GUCGCCGAAA UAGAUAGCUA AAGGCGAUCG
+             GCUCCUCGCG CACUACAAUG AAUGGUGCUU UUUAUA-GAG UGCCAGGUCG
+             GUUGCACGCG CAAUACAAUA AUAU------ ----UUA--- ----AUAUUA
+             GCUGCACGCG CACUACAGUG GUCACAGAA- AGACGGAACA AUGGUGAUCG
+             GCUCCACGCG CACUACAAUG AGGUGUGGUU UAUCUUAGUG UAACACCUCG
+             GCUGCACGCG CAAUACAAUA GCACGUAGA- CGUGAGAACA ACACGUGCUG
+             GCUGCACGCG CACUACAGUG GUCAUAGAAA AAAAUAGUUA AAGAUGAUCG
+             GCUGCACGCG CACUACAAUG GCGGGGCGAG AGUGAGAGCG AGCCUGGCUG
+             GCUGCACGCG UAAUACAGUG GGAGCUGUAG AUGAUAGUGG AAAGUUCCCG
+             GCUGCACGCG CAAUACAAUA GAU------- ---AUAU--- ----AAUCUU
+             GCGGCACGCG CACUACGAUA GAUGGCG--- ---AGGG--- -AGCCUGCUG
+             GCUGCACGCG CAAUACAAUA GAU------- ---AUAU--- ----AAUCUU
+             GCUCCACGCG CACUACAAUA GCAAAUGGUA AC-GAGA-GU AAGUUUGUUG
+             GCUGCACGCG CACUACAGUG GUCGCAGAAA AGUCGAGGCA AUGGCGAUCG
+             GCUCCACGCG CACUACAAUG AGUGGUGGU- GCUAUA-AGU AAGCCAGUCG
+             GCUGCACGCG CACUACAGUG GUCACAGCAG AACAUAGGUA AAUGUGAUCG
+             GCUGCACGCG CGCUACACUG AUGGGGGCAA AAGGGAACUU GAACUCAUCG
+             GCCGCACGCG CGCUACACUG ACAGGGCCAA GAGGGUACUU UACCUUGUCG
+             GCCGCACGCG CGCUACACUG GCGGGAGCAA GGGGAAACCU GACCCCGUCG
+             GCCGCACGCG CGCUACACUG ACGGAGUCAA GAGGAAACUU UACUUUGUCG
+             GCCGCACGCG CGCUACACUG ACAAGGACAA GAGGGUACUU UCCCUUGYCG
+             G--GCACGCG CGCUACACUG UCGAAUGCAG GAGGAAACUU AAGUUCGACG
+             GCCACACGCG CGUUACACUG AUGAAGCCAG GAGGGAACUU GACUUCAUCG
+             GCCGCACGCG CGCUACACUG AUCAAGUCAA GAGGAAACUU GACUUGAUCG
+             GCCGCACGCG CGCUACACUG AUGAAGUCAG GAGGAUACUU GACUUCAUCG
+             GCCGCACGCG CGCUACACUG ACAGAGUCAG GAGGAUACUU GACUCUGUCG
+             GCUGCACGCG CGCUACACUG ACGAAGUCAG GAGGGAACUU GACUUCGUCG
+             GCCGCACGCG CGCUACACUG AUAAAGGCAG AAGGGAACUU GACUUUAUCG
+             GCCGCACGCG CGCUACACUG AUGAAGUCAG GAGGGAACUU GACUUCAUCG
+             GCCGCACGCG CGCUACACUG ACGAAGGCAG GAGGGAACUU CACUUUGUCG
+             GCCGCACGCG CGCUACACUG AUGAAGGCAA UAA----UUG AACUUCAUCG
+
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU GCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGAUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU CCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUUG UCCCUUGCAA UUUGGACAUG AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU CCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG UCCCUUGCAA UUUGGACUUA AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAGG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU CCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU CCCUAGUAAG
+             UGCUGGAUAG AGCAUUGUAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG UCCAUUGC-A UUUGGACUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG ACCAUUGCAA UUUGGUCUUG AACGAGGAAU UCCUAGUAAG
+             UGAUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU CCCUAGUAAG
+             UGCUGGAUUG UCCAUUGCAA UUUGGACAUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAGG
+             UGAUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUAG UCCAUUGCAA UUUGGACUUC AACGAGGAAU UCCUAGUAAG
+             UGAUGGAUAG AGCAUUGCAA UUUGCUCUUC AACAAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGAUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU GCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU GCCUAGUAGG
+             UGCUGGAUAG AGCAUUGUAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             U-CUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU GCCUAGUAAG
+             --CUGGAUAG GGCAUUGCAA UUUGCUCUUC AACGAGGAAU CCCUAGUAAG
+             UGAUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU CCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU GCCUAGUAAG
+             UGCUGGAUUG UCCUUUGUAA UUUGGACAUG AACGAGGAAU UCCUAGUAAG
+             UGAUGGAUAG AGCAUUGCAA UUUGCUCUUG AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU CCCUAGUAAG
+             UGCUGGAUAG UCCUUUGCAA UUCGGACUUG AACGAGGAAU UCCUAGUAAU
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAAG
+             UGAUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU CCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAAG
+             UGAUGGAUUA UCCAUUGCAA UUUGGAUAUG AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU GCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU CCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU CCCUAGUAAG
+             UGCUGGAUAG UCCUUUGCAA UUUGGACUUG AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU GCCUAGUAAG
+             UGCUGGAUAG AGAAUUGCAA UUUGCUCUUC AACGAGGAAU GCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUAG UCCAUUGCAA UUUGGACUUG AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUAG AGCAUUGGAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGAUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUAG AGCAUUGUAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGAUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUAG AGCAUUGUAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGUAA UUUGCUCUUG AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUAG AGCAUUGUAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGAUGGAUCG ACCUUUGUAA UUCGGUCGUG AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUGG AGCUUUGUAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUUG UCCAUUGCAA UUUGGACAUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UGUCAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAGG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU GCCUAGUAAG
+             UGCUGGAUAG UACAUUGCAA UUUGUACUUG AACGAGGAAU UCCUAGUAAA
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUA- AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAA UCCAUUGCAA UUUGGAUUUG AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU GCCUAGUAAG
+             UGAUGGAUAG AACAUUGCAA UUUGUUCUUC AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUAG AGCAUUGUAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU GCCUAGUAGG
+             UGCUGGAUAG UCCUUUGCAA UUCGGACUUG AACGAGGAAC UUCUAGUAAU
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU GCCUAGUAAG
+             UGCUGGAUAA AGCAUUGCAA UUUGCUUUUC AACGAGGAAU GCCUAGUAAG
+             UGCUGGAUAG UACAUUGCAA UUUGUACUUG AACGAGGAAU UCCUAGUAAA
+             UGAUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUUGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU CCCUAGUAAG
+             UGAUGGAUUG ACCUUUGUAA UUCGGUCAUG AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGAUGGAUAG AGCAUAGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUAA AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAN AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUUG AGCAUUGCAA UUUGCUCAUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU ACCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU GCCUAGUAGG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGAUGGAUUA UCCAUUGCAA UUUGGAUAUG AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG CCCUUUGCAA UUCGGGCUUG AACGAGGAAU UUCUAGUAAU
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAGG
+             UGAGGGAUGA AGCUGUGUAA UGGGCUUCUG AACGUGGAAU UCCUAGUAAG
+             AGUAGGAUCU ACGUUUGUAA AUACGUAGUG AAUAAGGAAU UCCUAGUAAC
+             UAGUGGAUUG AUGCUUGUAA UAGUGUCAUG AACGUGGAAU UCCUAGUAGU
+             UAAGGGAUAA UAUAAUGUAA GAUAUAUUUG AACAUGGAAU UGCUAGUAAA
+             AG--GGAUUG AGGGCU-GAA AGCGCUCAUG AACACGGAAU AGCUAGUAAC
+             CAGUGGAUUG UUUGUUGUAA AACUUACAUG AACGUGGAAU UCCUAGUAUA
+             UAUGGGAUAA UAUUUUGUAA GAGAUAUUUG AACUUGGAAU UGCUAGUAAA
+             CUACGGAUCA UCCUUUGUAA UUGGGAUGUG AACGUGGAAU UCCUAGUAAU
+             AGCAGGAUUA GCUCUUGUAA AUGAGCUAUG AAUGAGGAAU UCCUAGUAAC
+             UGAGGGAUGA AGCUGUGUAA GGGGCUUCUG AACGUGGAAU UCCUAGUAAU
+             AGAUGGACUA UGUGCUGUAA GGCACAUACG AAAGAGGAAU UCCUAGUAAG
+             AGAGGGAAUG AGCUUUGGAA GAGGCUCAGG AACGUGGAAU UGCUAGUAAU
+             UAGUGGAUUG ACAUAUGUAA UUAUGUCAUG AACGUGGAAU UCCUAGUAGU
+             UAAGGGAUAA UAUAAUGUAA GAUAUAUUUG AACAUGGAAU UGCUAGUAAA
+             AGAGGGAAUG AGCUUUGCAA GAGGCUCAGG AACGAGGAAU UGCU-GUAAU
+             UAGUGGAUUG AUGCUUGUAA CAGUGUCAUG AACGUGGAAU UCCUAGUAGU
+             AGGUGGACUG UGCUCUGCAA GGGGCACACG AAAGAGGAAU UCCUAGUAAG
+             AGAGGGAAUG AGCUUUGUAA GAGGCUCAGG AACGAGGAAU UGCUAGUAAU
+             CAGCGGAUGG GUGCCUGGAA GGGCGCCCUG AACGAGGAAU UCCUAGUAGC
+             AGACGGAUCA UGCUUUGUAA GAAGGAUGUG AACGUGGAAU UCCUAGUAAU
+             UAUGGGAUAA UAUUUUGUAA GAGAUAUUUG AACUUGGAAU UGCUAGUAAA
+             UGAGGGAUGA AGCUGUGUAA UGGGCUUCUG AACGUGGAAU UCCUAGUAAU
+             UAUGGGAUAA UAUUUUGUAA GAGAUAUUUG AACUUGGAAU UGCUAGUAAA
+             UGGUGGAUUG ACGCUUGUAA AUGCGUCAUG AACGAGGAAU GCCUAGUAGU
+             AGAGGGAACG AGCUCUGGAA GGGGCUCGGG AACGAGGAAU UGCUAGUAAU
+             UAGUGGAUUG ACAUAUGUAA UUAUGUCAUG AACGUGGAAU UCCUAGUAGU
+             AGAGGGAAUG AGCACUGUAA UGUGCACAGG AACGAGGAAU UGCUAGUAAU
+             UGCUGGAUAG AUCUUUGUAA UUCGAUCUUC AACGAGGAAU UCCUAGUAAG
+             UGUUGGCUAG AUCUUUGUAA UUCGAUCUCA AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AUCUUUGCAA UUCGAUCUUG AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AUCUUUGCAA UUCGAUCUUG AACGAGGAAU UCCUAGUAAG
+             UGCUGGCUAG AUCUUUGUAA UUCGAUCUUC AACGAGGAAU UCCUAGUAAG
+             UGAUGGAUUG AUCAUUGCAA UUUGAUCAUG AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG ACCAUUGCAA UUUGGUCUUG AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AUCCUUGCAA UUUGAUCUUG AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG ACCAUUGCAA UUUGGUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUUG AUUUUUGAAA UUUGAUCAUG AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AUCAUUGCAA UUUGAUCUUG AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG UCCAUUGCAA UUUGGACUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG AGCAUUGCAA UUUGCUCUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGGAUAG UGCAUUGCAA UUUGCACUUC AACGAGGAAU UCCUAGUAAG
+             UGCUGG--AG UCCUUUGCAA UUUGGACUUC AACGAGGAAU UCCUAGUAAG
+
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUNCCCUUU GUACACACCG
+             CGCGUGUCAU CAGCACGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCACGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAAUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CAUAACUCAU CAGGUUGUGC UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAACUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU CGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CAUGAGUCAU CAGCUCAUGC UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCGAGUCAU CAGCUCGCGU CGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUUUGUCAU CAGCAAGCGU UGAUUACGU- ----CCCUUU GUACACACCG
+             CGUAUGUCAU CAGCAUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUAUGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAC CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACUAC CCUGCCUUUU GUACACACCG
+             CACAAGUCAU CAGCUUGUGC CGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CAUGAGUCAU CAGCUCGUGC UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CAUGAGUCAU CAGCUCGUGC UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGACUAUGUC CCUGCCCUUU GUACACACCG
+             CGCGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGACUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGA UGAUUACGUC CCUGCUCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCACGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAC CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CAUAUGUCAU CAGCAUAUGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCGUGUCAU CAGCAUGCGU UGAUUACGUC CCUGACCUUU GUACACACCG
+             UACAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUAUGUCAU CAGCAUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAGUUCAU CAGAUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAAUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAUUCAU CAGAUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAC CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             UGUGGGUCAU CAGCCCACGC UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGACUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUAAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU CGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUAAGUCAU CAACUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCGUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAUGUCAU CAGCAUGUGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGC UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGACUACGUC CCUGCCCUUU GUACACACCG
+             CAUGUGUCAU CAGCACAUGC UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUACGUCAU CAGCGUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAUUCAU CAGAUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CACAAGUCAU CAGCUUGUGC CGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGA UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCGUGUCAU CAGCAUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCGUGUCAU CAGCAUGCGU UGAUUACGUC CCUGACCUUU GUACACACCG
+             CGCAUGUCAU CAGCAUGUGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGACUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             UGUGGGUCAU CAACCCACGC UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUAUGUCAU CAGCAUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CAUAACUCAU CAGGUUGUGC UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAC CAACUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CACGAGUCAU CAGCUGCUGC CGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CACAUGUCAU CAGCAUGUGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCCGGUCAU CACCCGGCGA UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU CGAUUACGUC CCUGCCCUUU GUACACACCG
+             AAUGAUUGAA CAAGUUAUUU UGAAUGUGUC CCUGUCCUUU GUACACACCG
+             GGUGCCUCAU CAAGGCAUGG UGAAUGUGUC CCUGUUCUUU GUACACACCG
+             UGGUAGUCAC UAACGACCAG CGAAUGCGUC CCUGUUCUUU GUACACACCG
+             UUUUAUUUAA UAAGUAGAAU UGAAUGAGUC CCUGUUCUUU GUACACACCG
+             GUGAGUUCAA UAUACGGCGA UGAAUAUGUC CCUGUUCUUU GUACACACCG
+             UAGAUGUAAG CAACGUCUAU UGAAUAUGUC CCUGUUCUUU GUACACACCG
+             UUUUAUUAAA UAAGUAGAAU UGAAUGUGUC CCUGUUCUUU GUACACACCG
+             CGUAGCUCAC UAAGUUACGA UGAAUGUGUC CCUGUUCUUU GCACACACCG
+             AGUGUCUCAC UAAGGCAUUG UGAAUGCGUC CCUGUUCUUU GUACACACCG
+             AGCGGCUGAC GAAGCUGCUU UGAAUGUGUC CCUGUCCUUU GUACACACCG
+             UGUGUAUCAA CAAUGGAUAU UGAAUAAGUC CCUGUAGCUU GUACACACCG
+             CGCGACUCAU UAAGACGCGA UGAAUACGUC CCUGUUCUUU GUACACACCG
+             UGGUAGUCAC UAACGACUAA CGAAUGUGUC CCUGUUCUUU GUACACACCG
+             UUUUAUUUAA UAAGUAGAAU UGAAUGUGUC CCUGUUCUUU GUACACACCG
+             CNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             UGGUAGUCAC UAACGACUAA CGAAUGCGUC CCUGUUCUUU GUACACACCG
+             CGCCCAUCAC CAGUGGGCGU UGAAUCAGUC CCUGUAGCUU GUACACACCG
+             CGCGACUCAU UAAGACGCGA UGAAUACGUC CCUGUUCUUU GUACACACCG
+             CGCGGGUCAC CAAGCCGCGG CGAAUGUGUC CCUGUUCUUU GUACACACCG
+             CGCUGCUCAC UAAGUAGCGA UGAAUGAGUC CCUGUUCUUU GCACACACCG
+             UUUUAUUAAA UAAGUAGAAU UGAAUGUGUC CCUGUUCUUU GUACACACCG
+             AACGAUUGAA CAAGUUGUUU UGAAUGGGUC CCUGUCCUUU GUACACACCG
+             UUUUAUUAAA UAAGUAGAAU UGAAUGUGUC CCUGUUCUUU GUACACACCG
+             UGUCUGUCAG CAGCGGACAA CGAAUAAGUC CCUGUUCUUU GUACACACCG
+             CGUGGCUCAU UAAGACACGG UGAAUACGUC CCUGUUCUUU GUACACACCG
+             UGGUAGUCAC UAACGACUAA CGAAUGAGUC CCUGUUCUUU GUACACACCG
+             CGUUUCUCAU UAAGAAGCGA UGAAUGUGUC CCUGUUCUUU GUACACACCG
+             CGCGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAUUCAU CAGAUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAUUCAU CAGAUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAUUCAU CAGAUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CG-AAGUCAC --AUNCGCGC UGAUUACGUC CCUGCCCUUU GUACACAC-G
+             CACGAGUCAU CAACUCGUGC UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CACCUUGCGC UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAU CAGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAAGUCAG CRGCUUGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCGGGUCAG CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGCAUGUCAU CAGCAUGCGU UGAUUACGU- ---------- ----------
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+             CGUGAGUCAU CAGCUCGCGU UGAUUACGUC CCUGCCCUUU GUACACACCG
+
+             CCUGUCGCUA CUACCGAUGA AUGACUUAGU GAGCCUUUGC AAUUAUGCAA
+             CCCNUCGCUA GUACCGAUGA AUGGCUUAGU GAGGCUUCGC AACUAGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGGCCAUCC AAUUGUACGA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUCGC GACUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGACUCUGA AAUUUGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGCCUCGC AAUUGGACAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGACCUCGC AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA ACGGUUUAGU AAGACUCUGC AAUUAGUCAA
+             CCCGUCGCUA CUACCGAUGG AUGGUUUGUC CAGUACGUGC AAUAGUGCCA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAAUCCUUGC AAUUGGGCAA
+             CCCGUCGCUA CUACCGAUGA ACGGCUUAGU GAGGUCUUGC AAUUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGUUCAGU GAGGCUUUGC AAUUAUCCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGUCCCUGC AAUCGGGCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGGCUUUGC AAUUAUCCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGCCUCGC AACUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGCCUCGC ACCUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGGUCAGU GAGGCCUUGA AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGCUUUGC AAUUAUCCAA
+             CCCGUCGCUA CUACCGAUGG AUGGCUUAGU GAGCCCUCCC AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGACCCUUC ACUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGACCUUGC AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGGCCUUGA GAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCGGU GAGGUCUUGC AAUCGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUCGC GAUUGAACGA
+             CCCGUCGCUA CUACCGAUGA AUGGUUUAGU GAGACUUCGC AAUUAGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUUGG AAUUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUUGC AAUUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGACCCUGC AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUUGC AAUUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGCCUCGC AACUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGACCUCGC AAUUGGUCAA
+             CCNGUCGCUA CUACCGAUGA AUGGUUUAGU GAGACCUUGC AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUAAGU GAGGCUUUGC AAUUAUCCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGGCCUUGC AAUUGGUCAA
+             CCCGUCGCUA GUACCGAUGA AUGGCUUAGU GAGGCCUCGC AAUUGGACAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUUUCGC AAUUACCCAA
+             CCCGUCGCUA CUACCGAUGA ACGGCUUAGU GAGUCCUUGC AAUUGGGCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGGCCUUGC AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGACCCUGA AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGACCCUUC ACUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGGCCUUGC AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGACCUUGU GACUGGUCAA
+             CCCGUCGCUA CUACCGAUGA ACGGCUCAGU GAGGCCUUGU AAUUGACCGA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGAUCUCGC AACUGCUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGACCUCGC AAUUGUUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGUCCUCUC ACCUGGGCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUUGA AAUUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGACUCUUA AAUUUGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGAUCUCGC AACUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGUUUAGU GAGACUUUGC AAUUAGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGGCGUUGC AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGCCCUUC AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGG AUGGCUCAGU GAGACCUCGA AACUGUUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGUCCUCGC AAUUGGGCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGGCUU-GC AANNNNNNNN
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGCCUUGC AAUUUGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUUGA AAUUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUCGC AAUUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUCGC AACUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUCGC AAUUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUCGC AACUGAUCAA
+             CCCGUCGCUA GNACCGAGGA AUGGCUUAGU GAGGCCUCGC AAUUGGACAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUCGC AAUUGAACGA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUCGC AACUGAUCAA
+             CCCGUCGCUA GUACCGAUGA AUGGCUUAGU GAGGCUUCGC AACUAGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGCCUCGC GAUUGUACGA
+             CCCGUCGCUA GUACCGAUGA AUGGCUUAGU GAGGCCUCGC AACUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGCUCCGU GAUCAUCCAA
+             CCUGUCGCUA CUACCGAUGA AUGGCUUAGU GAGAUCUCGC GACUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGCUUCGC AACUGGUCAA
+             CCCGUCGCUA CUACCGAUGG AUGGCUUAGU GAGAUUUUGC AAUUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGACUUGC AAUCUUACAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUCGC AACUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGC-CUCGC AAUUGGGCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGACCUCGC AACUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUCGC AACUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGGCUUCGC AAUUAUCCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGGCCUCGC AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGUUUAGU GAGACUUCGC UGUUAGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGGCCUUGC AAUUCGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGCCUUGC AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGGCCUUGC AANNNNNNNN
+             CCCGUCGCUA CUACCGAUGA AUGGUUUAGU GAGGCCUCGC AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUGAGU GAGGCCUUGC AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGCCUCUU GCUUGUACGA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGAUCUCGC AACUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGUUUAGU GAGCAUAUGC AAUAUGGCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGGCCUUGA AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGUCCUCUC ACUUGGCCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGGCCUUGC AAUUCGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGGCCUUGC AAUUCGCCAA
+             CCCGUCGCUA CUACCGAUGA AUGGUUUAGU GAGACUUCUU U-UUAGUCAA
+             CCCGUCGCUA CUACCGAUGA GUGGCUUAGU GAGGUCUUGC AAUUGCACGA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGGCCUUGC GAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUCAGU GAGGCUUCGC AACUAUCCAA
+             CCCGUCGCUA CUACCGAUGG AUGGCUUAGU GAGAUUUUGC AAUUGCUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGCCUUGA AAUUGGUCAA
+             CCCGUCG-UG CUACCGAUGA AUGGCUUAGU GAGGCGUNNN NNNNNNNNNN
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGAUCUUGC AAUCNAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUANU GAGACCUCGC AACUGGUCAA
+             CCCGUCGCUA CUACCGAUGG AUGGUUUGUC CAGUACGUGC AAUAGUCCCA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUGGU GAGAUCUCGC AACUGAUCAA
+             CCUGUCGCUA CUACCGAUGA AUGGCUCGGU GAGGCCUCGC AACUGGUUAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGCCUUGC AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGUUUAGU GAGACUUUGC AAUUAGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGUCCUUUU ACACUGGCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUUGC AAUUGAUCUA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUUGC AAUUGAUCAA
+             CCCGUCGCUA UCUAAGAUGA CGCAGUGGAC GAAGAUU-GA GA-GGUCUGA
+             CCCGUCACUA UUUCAGAUGG UCAUAGGGAU GAAGAGC-UU CG-GCUCUGA
+             CCCGUCGUUA UCUAAGAUGG AAGU-CGGGU GAAGACACUU AAGUGGAAGA
+             CCCGUCGCUA UCUAAGAUGG UAUUAUCUAU GAACAAA-UU UAUAAAGUGA
+             CCCGUCGUUA UCGAAGAUGG AGUGAUUUUU GAGUCAAUUA AUGUACUUGA
+             CCCGUCGUUA UCUAAGAUGG UUAUUAGGGG GAAGCUGAAU U-UCAGAAGA
+             CCCGUCGCUA UCUAAGAUGA UAUGUGUUGU GAAAUUAGGC AACUACUUGA
+             CCCGUCGCUA UCUAAGAUGG AUGUUGAUAU GAAAUUGCGA AUGUACUUGA
+             CCCGUCACUA UUUCAGAUGG CCAUGAAGAU GAAGAGC-UU CG-GUUCUGA
+             CCCGUCGCUA UCUAAGAUGA CGCACUGGAC GAAGAUC-GG AA-GGUCUGA
+             CCCGUCACUA UCUCAGAUGU UUUUCAGGAU GAAGAGU-CC AG-GCUCUGA
+             CCCGUCGUUA UCGAAUACGG UGCUCGGCGC GAGCAAGGAA AUCUGAGCGA
+             CCCGUCGUUA UCUAAGAUGG CCGUGCGGGU GAAGAUGUGU AGGCAUAAGA
+             CCCGUCGCUA UCUAAGAUGG UAUUAUCUAU GAACAAA-UU UAUAAAGUGA
+             NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             CCCGUCGUUA UCUAAGAUGG AAGUGCGGGU GAAGACACGU AAGUGGAAGA
+             UCCGUCACUA UCUCAGAUGU UUUUCGGGAU GAAGAGU-CC AG-GCUCUGA
+             CCCGUCGUUA UCGAAGAUGG AGUCAGGCGC GAACAAGCGA GAGCGAGUGA
+             CCCGUCACUA CCUAAGAUGG AUGUGCAGGC GAGGUGGCAG GGGCAGCCGA
+             CCCGUCGCUA UCUGAGAUGG AUGUUUUUAU GAAGAUGCGU U-GCAUUUGA
+             CCCGUCGCUA UCUAAGAUGA UAUGUGUUGU GAAAUUAGGA AACUACUUGA
+             CCCGUCGCUA UCUAAGAUGA CGCAGUGGAC GAAGAUU-GG AA-GGUCUGA
+             CCCGUCGCUA UCUAAGAUGA UAUAUGUUGU GAAAUUAGGA AACUACUUAA
+             CCCGUCGUUA UCUAAGAUGG CGGUGCGGAU GAAGCUGCUA C-GUGGAAGA
+             CCCGUCGUUA UCGAAGAUGG AGUCAGGCGC GAACAAGCGA GAG---GUGA
+             CCCGUCGUUA UCUAAGAUGG AGGUGCGGGU GAAGAUGUUU AGGCAUAAGA
+             CCCGUCGUUA UCGAAGAUGG AACCAGGUGC GAACAAGUGA AAGCGAGUGA
+             CCCGUCGCUA CUACCGAUGA AUGGUUUAGU GAGGUUGGUA CUUUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGUUUAGU GAGAUCUCGC AACUGCUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGUUUAGU GAGGCCUCGC AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGUUUAGU GAGGCCUCGC AAUUGGUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGUUUAGU GAGAUUUUGC AAUUGCUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGUUUAGU GAGAUCUCUC ACUUGCUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGUUUAGU GAGAUCUCGC GAUUGCUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGUUUAGU GAGGUCUUUC ACUUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGUUUAGU GAGAUCUUUU GUUUGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGAGUCGC GAUUCUCCUA
+             CCCGUCGCUA CUACCGAUGA AUGGUUUAGU GAGAUCUUGC AAUCGAUCAA
+             ---------- ---------- ---------- ---------- ----------
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGGUCUUGC GAUCGAUCAA
+             CCCGUCGCUA CUACCGAUGA AUGGCUUAGU GAGACCUCGC AACUGGUCAA
+             C-CGUCGCUA GUACCGAUGA AUGG-CUAG- ---------- ----------
+
+             ACUUGGCCAU UUAGAGGAAG UAAAAGUCAU AACAAGGUUU CCGUAGGUGA
+             ACUNNGUCAU UUAGAGGAAN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUCGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCGU UUAGAGGAAG UAAAAGUCGU AACAAGGUAU CCGUAGGUGN
+             GCCCGAUCGU CUAGAGGAAG UAAAAGUCGU AACANNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             AUUUGGUCGU UUAGAGGAAG UAAAA-UCCU AACAA-GUUU CCGUAG-UNN
+             ACUCGAUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUCU CCGUUGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUNNNNNN
+             ACUCGGUCAU UUAGAGGAAG UAANNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGCUCAU UUAGAGGAAG UANNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACANNNNNN NNNNNNNNNN
+             ACUUGGUCAU CUAGAGGAAG UAAAAGUCGU AACANNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUANNNNN
+             ACUUGGUCAU UUAGAGGAAN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUCGGUCAU UUAGAGGWAN UAAAAGUCNU AACAAGGUUU CCGUANGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU UCGUANNNNN
+             ACUUGAUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUANNNNN
+             AUUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCNNNNNNNN
+             ACUUGGUCAU UUAGAG-AAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAANNNNN NNNNNNNNNN
+             ACUNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAC UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUANNNNN
+             ACUUGGUCGU UUAGAGGAAG UAAAAGUCGU AACANNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUCU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAANNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAANNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAUAGUCGN NNNNNNNNNN NNNNNNNNNN
+             ACUGGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUANNNNN
+             ACUCGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUCU CNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACANNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAANUCGU AACAAGGUUU CCGUAGGUGA
+             ACUCGGUCAU UUAGAGGAAG UAAAAGUCGU AACAANNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGAUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUANNNNN
+             ACUCGGUNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU NNNNNNNNNN
+             ACUCGGUCAU CUAGAGGAAG UAAAANNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACANNNNNN NNNNNNNNNN
+             NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ANUUGGUCAU UUAGAGGAAG UAAAAGUCCU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAANUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CYGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACANNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAC UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUANNNNN
+             ACUUGGUCAU UUAGAGGAAG UNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAC UAAAAGCUGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAC UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUANNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCAU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAG-UGA
+             ACUUGGUCAU CUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUAU CUGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACA-GGUUU CCGUAGNNNN
+             ACUCGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUCU CCGUUGGUGA
+             ACUUGGUCAU UUACAGGAAG UAAAAGUCGU CACAAGGUCU CCGUAGGUGA
+             ACUUGAUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUANNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAA-UCGU AACAAGGUUU CCGUAGGUGA
+             NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUANNNNN
+             ACUCCGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU ANNNNNNNNN NNNNNNNNNN
+             ACUAGGCUAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUCGGUCAU UUAGAGGAAG NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACANNNNNN NNNNNNNNNN
+             ACUCGGUCAU UUAGANNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUCGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUCU CCGUAGGUGA
+             ACUUGAUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUANNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUN NNNNNNNNNN
+             ACUUGGUCAU UUAGAAGAAG UAAAAGUCGU AACAAGGUUU CCGUAGUNNN
+             ACUCGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUCU CCGUUGGUGA
+             ACUUGGUCAU CUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCNU AACAAGGUUU CCGUAGGUAC
+             CCCCUCCCGU CUAGAGGAAG UAAAAGUCGU AACANNNNNN NNNNNNNNNN
+             ACCUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACCCGNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUNN NNNNNNNNNN
+             ACUUGAUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             A-UUGGACAU UUAGAGGAAG UAAAAGUCGU AANANNNNNN NNNNNNNNNN
+             ACUUGGUNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AACAANNNNN NNNNNNNNNN
+             GUCUUUCGUG UUAGAUAAGA UAUAAGUCGU AACAUGGCUG CUGUUGGANN
+             AUAUCUAUGG CUAGAUAAAG UACAAGUCGU AACAAGGUUU CAGUUGGNNN
+             AUCCGUGCAC GUAAAUUGGA UGUNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             AUAGAUAGUA CUAGAUCUGA UAUAAGUCGU AACAUGGUUG CUGUUGGAGA
+             AUGAGUUAUU CUAAAACCGG UACAAGUCGU AACAAGGCUA CGGUUGAAGA
+             CUUCUGGUAA CUAGAUUGGA UGUAAGUCGU AACAUGGUUG CAGUAGGUGA
+             ACAAUAUGUA UUAGAUCUGA UAUAAGUCGU AACAUGGUUG CUGUNNNNNN
+             GUAUUAACAA CUAGAUAAGA UAUAAGUCGU AACAAGGCUG CUAUAGAAGA
+             AUAUUCAUGU CUAGAUAAAG UACNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             GUCCUGAGUG UUAGAUAAGA UAUAAGUCGU AACAUGGCUG CUGUUNNNNN
+             AUAAUGAAAA GUAGAUAAGA UGUNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             GCGCAAGGUA CCGGAUCUGA UACAAGUCGU AACAAGGUAG CUGUAGGANN
+             ACCCGUGCAG CUAGAUUGGA UGUAAGUCGU AACANNNNNN NNNNNNNNNN
+             AUAGAUAGUA CUAGAUCUGA UAUAAGUCGU AACAUGGUUG CUGUUGGAGA
+             NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             AUCCGUGCAC GUAAAUUGG- UNNNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             AUAACGGAAA GUAGAUAAGA UGUAAGUCGU AGCAAGGUUG CGGUCGGUGN
+             GUGCAGGAUU CUAGAUGUGA UACNNNNNNN NNNNNNNNNN NNNNNNNNNN
+             GCCGGUGCAA CUAGAUAAGG UAUAAGUCGU AACAAGGCUA CGGUUGANNN
+             GUAAGGACGA CUAGAUUAGA UAUAAGUCGU AACAAGGCUA CGGUUGANNN
+             ACAAUAUGUA UUAGAUCUGA UAUAAGUCGU AACAUGGUUG CUGUUGGAGA
+             GUCCUUCGUG UUAGAUAAGA UAUAAGUCGU AACAUGGCUG CUGUUGGAGA
+             ACAAUAUGUA UUAGAUCUGA UAUAAGUCGU AACAUGGUUG CUGUUGGAGA
+             AUCCGUGCUG CUAGAUUGGA UACAAGUCGU AACAUGGUUG CAGUAGGUGA
+             GUGCAGGGUU CUAGAUGUGA UACAAGUCGU AACAUGGUUG CUGUNNNNNN
+             ACCCGUGCAG CUAGAUUGGA UGUAAGUCGU AACANNNNNN NNNNNNNNNN
+             GUGCAGGGUU CYAGAUCUGA UACAAGUCGU AACAAGGCAG CUGUAGGNNN
+             ACUUGAUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGAUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGAUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGAUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGAUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             AC-UGAUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUANNNNN
+             ACUUGAUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGAUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CYGUAGGUGA
+             ACUUGAUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUGAUUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUAGGUGA
+             ACUUGAUCAU UUAGAGGAAG UAAAAGUCGU AACAAGGUUU CCGUANNNNN
+             ---------- ---------- ---------- ---------- ----------
+             ACUUGGUCAU UUAGAGGAAG UAAAAGUCGU AA-------- ----------
+             ACUUGGU--- ---------- ---------- ---------- ----------
+             ---------- ---------- ---------- ---------- ----------
+
+             ACCUNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCNNNNNNN NNNNNNNNN
+             ACCUGCGGAN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCGGAA GGAUCAUUA
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCAGCGGAG GGANNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCGGAA GGAUCAUUA
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCGGNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCGGAA GGAUCAUUA
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCGGAA GGAUCAUUA
+             ACCUGCGGAA GGAUCAUUA
+             ACCUGCGGAA GGAUCAUUA
+             NNNNNNNNNN NNNNNNNNN
+             A-CUGCNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCGGAA GGAUCAUUA
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCGGAA GGAUCAUUA
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCAGCGGAG GGAUCAUUA
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCGGAN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCGGAA GGAUCAUUG
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCAGAA GGAUCAAGC
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCGGAA GGAUCAUUA
+             ACCUGCGNNN NNNNNNNNN
+             ACCUGCGNNN NNNNNNNNN
+             ACCUGCAGAN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCNNNN NNNNNNNNN
+             ACCUGCGGAA GGAUCAUUA
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCGGAA GGAUCAUUA
+             NNNNNNNNNN NNNNNNNNN
+             A-CUGCGGAA GGAUCAUUA
+             NNNNNNNNNN NNNNNNNNN
+             ACCUNNNNNN NNNNNNNNN
+             ACCUGCGGAA GGAUCAUUA
+             ACCUGCGGAA GGAUCAUUA
+             ACCUGCAGAU GGAUCAUUU
+             ACCUGCGGAA GGAUCAUUA
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACU-GCGGAA GGAUCNNNN
+             ACCUGCAGAN GGAUCAUUA
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCGGAA GGAUCAUUA
+             ACCUNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCAGAA GGAUCAAGC
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCGGAA GGAUCAUUA
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCGGAG GGAUCAUUA
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCAGCGGAG GGAUCAUUA
+             ACCUGCGGAA GGAUCAUUA
+             ACCUGCGGNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUCNNNNN NNNNNNNNN
+             GNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCGGAA GGAUCAUUA
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCGGAA GGAUCAUUA
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCAUUAGCA GGAUCAUAA
+             AUCAGCAGUA GGAUUAGCG
+             ACCUGCCGCA GAUCAGUAG
+             NNNNNNNNNN NNNNNNNNN
+             AUCUGUGGCA AGAUCAUAC
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCAUUAGCA GGAUCAUAA
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCAUUAGCA GGAUCAUAA
+             ACCAGCAGCA GGAUCAGUA
+             ACCAUUAGCA GGAUCAUAA
+             ACCUGCCGCA GAUCAAGCU
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCAGAA GGAUCANNN
+             ACCUGCAGAA GGAUCAANN
+             ACCUGCAGAA NNNNNNNNN
+             ACCUGCAGAN NNNNNNNNN
+             ACCUGCAGAA GGAUCAANN
+             NNNNNNNNNN NNNNNNNNN
+             ACCUGCAGAA GGAUCAANN
+             ACCUGCAGAA GGAUCAAGC
+             ACCUGCAGAA GGAUCAANN
+             ACCUGCAGAA GGAUCAANN
+             NNNNNNNNNN NNNNNNNNN
+             ---------- ---------
+             ---------- ---------
+             ---------- ---------
+             ---------- ---------
+
diff --git a/examples/dna-partitioned/call-parallel.sh b/examples/dna-partitioned/call-parallel.sh
new file mode 100755
index 0000000..5dbc1ae
--- /dev/null
+++ b/examples/dna-partitioned/call-parallel.sh
@@ -0,0 +1,22 @@
+#! /bin/bash
+
+binname=exabayes
+
+if [ $# != 1 ]; then
+    echo -e  "Usage: Please enter path to $binname"
+    echo -e  "Example: ./call.sh ../$binname"
+    exit
+fi
+
+bin=$1
+
+if [ ! -x $bin ]; then
+    echo -e  "Error: $bin is not an executable file."
+    exit
+fi
+
+
+# this is a pretty memory intensive dataset. Let's trade as much runtime for memory as possible:
+cmd="$mpi -np 8  $bin -R 2 -C 2  -f aln.phy -q aln.part -c config.nex -n myRun -s 123"
+echo -e   "\n\ncommandline:\n$cmd\n\n"
+eval "$cmd"
diff --git a/examples/dna-partitioned/call.sh b/examples/dna-partitioned/call.sh
new file mode 100755
index 0000000..d9f3dbe
--- /dev/null
+++ b/examples/dna-partitioned/call.sh
@@ -0,0 +1,22 @@
+#! /bin/bash
+
+binname=yggdrasil
+
+if [ $# != 1 ]; then
+    echo -e  "Usage: Please enter path to $binname"
+    echo -e  "Example: ./call.sh ../$binname"
+    exit
+fi
+
+bin=$1
+
+if [ ! -x $bin ]; then
+    echo -e  "Error: $bin is not an executable file."
+    exit
+fi
+
+
+# this is a pretty memory intensive dataset. Let's trade as much runtime for memory as possible: 
+cmd="$bin -f aln.phy -q aln.part -c config.nex -n myRun -s 123"
+echo -e   "\n\commandline:\n$cmd\n\n"
+eval "$cmd"
diff --git a/examples/dna-partitioned/config.nex b/examples/dna-partitioned/config.nex
new file mode 100644
index 0000000..b748a5a
--- /dev/null
+++ b/examples/dna-partitioned/config.nex
@@ -0,0 +1,19 @@
+#NEXUS
+
+begin params; 
+ [ apply an arbitrary linking scheme here ] 
+
+  stateFreq = (0+1+2) 
+  brlens = (0+1,2+3)
+  ratehet = (0-3)
+
+end;  
+
+begin run; 
+ numruns 4 
+ numCoupledChains 4 
+ numgen 1e4 
+ numswapspergen 4 
+ parsimonyStart  true
+end; 
+
diff --git a/examples/dna-unpartitioned/aln.phy b/examples/dna-unpartitioned/aln.phy
new file mode 120000
index 0000000..fe82f20
--- /dev/null
+++ b/examples/dna-unpartitioned/aln.phy
@@ -0,0 +1 @@
+../dna-partitioned/aln.phy
\ No newline at end of file
diff --git a/examples/dna-unpartitioned/call-parallel.sh b/examples/dna-unpartitioned/call-parallel.sh
new file mode 100755
index 0000000..7900e69
--- /dev/null
+++ b/examples/dna-unpartitioned/call-parallel.sh
@@ -0,0 +1,21 @@
+#! /bin/bash
+
+binname=exabayes
+
+if [ $# != 1 ]; then
+    echo -e  "Usage: Please enter path to $binname"
+    echo -e  "Example: ./call.sh ../$binname"
+    exit
+fi
+
+bin=$1
+
+if [ ! -x $bin ]; then
+    echo -e  "Error: $bin is not an executable file."
+    exit
+fi
+
+# this is a pretty memory intensive dataset. Let's trade as much runtime for memory as possible:
+cmd="$mpi -np 2 $bin -f aln.phy -m DNA -c config.nex -n myRun -s 123"
+echo -e   "\n\ncommandline:\n$cmd\n\n"
+eval "$cmd"
diff --git a/examples/dna-unpartitioned/call.sh b/examples/dna-unpartitioned/call.sh
new file mode 100755
index 0000000..4bbb913
--- /dev/null
+++ b/examples/dna-unpartitioned/call.sh
@@ -0,0 +1,22 @@
+#! /bin/bash
+
+binname=yggdrasil
+
+if [ $# != 1 ]; then
+    echo -e  "Usage: Please enter path to $binname"
+    echo -e  "Example: ./call.sh ../$binname"
+    exit
+fi
+
+bin=$1
+
+if [ ! -x $bin ]; then
+    echo -e  "Error: $bin is not an executable file."
+    exit
+fi
+
+
+# this is a pretty memory intensive dataset. Let's trade as much runtime for memory as possible: 
+cmd="$bin -f aln.phy -m DNA -c config.nex -n myRun -s 123"
+echo -e   "\n\commandline:\n$cmd\n\n"
+eval "$cmd"
diff --git a/examples/dna-unpartitioned/config.nex b/examples/dna-unpartitioned/config.nex
new file mode 100644
index 0000000..4287ce4
--- /dev/null
+++ b/examples/dna-unpartitioned/config.nex
@@ -0,0 +1,7 @@
+#NEXUS
+
+begin run; 
+ numruns 2 
+ numCoupledChains 2 
+end; 
+
diff --git a/lib/Random123-1.08/LICENSE b/lib/Random123-1.08/LICENSE
new file mode 100644
index 0000000..c6094ac
--- /dev/null
+++ b/lib/Random123-1.08/LICENSE
@@ -0,0 +1,31 @@
+/** @page LICENSE
+Copyright 2010-2012, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
diff --git a/lib/Random123-1.08/docs/Doxyfile b/lib/Random123-1.08/docs/Doxyfile
new file mode 100644
index 0000000..89f93a8
--- /dev/null
+++ b/lib/Random123-1.08/docs/Doxyfile
@@ -0,0 +1,1648 @@
+# Doxyfile 1.7.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = Random123
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER         =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       =
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH        = ../include ..
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = ../include/
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given extension.
+# Doxygen has a built-in mapping, but you can override or extend it using this
+# tag. The format is ext=language, where ext is a file extension, and language
+# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,
+# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions
+# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      = .h=C++
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter
+# and setter methods for a property. Setting this option to YES (the default)
+# will make doxygen to replace the get and set methods by a property in the
+# documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penality.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will rougly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+# will list include files with double quotes in the documentation
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+# will sort the (brief and detailed) documentation of class members so that
+# constructors and destructors are listed first. If set to NO (the default)
+# the constructors will appear in the respective orders defined by
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page.
+# This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. The create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option.
+# You can optionally specify a file name after the option, if omitted
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE            =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT                  = main.dox cbrng.dox releasenotes.dox \
+		../include/Random123 \
+		../include/Random123/conventional \
+		../include/Random123/features/sse.h \
+		../include/Random123/features/compilerfeatures.h \
+		../examples/README \
+                ../LICENSE
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS          =
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE              = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+# If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.
+# Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.
+# The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER            = header.html
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+# Doxygen will adjust the colors in the stylesheet and background images
+# according to this color. Hue is specified as an angle on a colorwheel,
+# see http://en.wikipedia.org/wiki/Hue for more information.
+# For instance the value 0 represents red, 60 is yellow, 120 is green,
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+# the colors in the HTML output. For a value of 0 the output will use
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+# the luminance component of the colors in the HTML output. Values below
+# 100 gradually make the output lighter, whereas values above 100 make
+# the output darker. The value divided by 100 is the actual gamma applied,
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE               =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING     =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
+# that can be used as input for Qt's qhelpgenerator to generate a
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
+# add. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+#  will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have
+# this name.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = NO
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES       = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are
+# not supported properly for IE 6.0, but are supported on all modern browsers.
+# Note that when changing this option you need to delete any form_*.png files
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT    = YES
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should
+# typically be disabled. For large projects the javascript based search engine
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a PHP enabled web server instead of at the web client
+# using Javascript. Doxygen will generate the search PHP script and index
+# file to put on the web server. The advantage of the server
+# based approach is that it scales better to large projects and allows
+# full text search. The disadvances is that it is more difficult to setup
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.
+# This is useful
+# if you want to understand what is going on.
+# On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED             = \
+  "R123_STATIC_ASSERT(e,m)= " \
+  "R123_FORCE_INLINE(decl)= decl " \
+  "R123_STATIC_INLINE= static inline " \
+  "R123_CUDA_DEVICE= " \
+  "__cplusplus " \
+  "R123_USE_SSE= 1" \
+  "R123_USE_AES_NI= 1" \
+  "R123_USE_U01_DOUBLE= 1" \
+  "R123_USE_PHILOX_64BIT= 1"
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = \
+    R123_ULONG_LONG \
+    R123_STATIC_INLINE \
+    R123_CUDA_DEVICE
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+#
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+# allowed to run in parallel. When set to 0 (the default) doxygen will
+# base this on the number of processors available in the system. You can set it
+# explicitly to a value larger than 0 to get control over the balance
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS        = 0
+
+# By default doxygen will write a font called FreeSans.ttf to the output
+# directory and reference it in all dot files that doxygen generates. This
+# font does not include all possible unicode characters however, so when you need
+# these (or just want a differently looking font) you can specify the font name
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font,
+# which can be done by putting it in a standard location or by setting the
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
+# containing the font.
+
+DOT_FONTNAME           = FreeSans.ttf
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a
+# different font using DOT_FONTNAME you can set the path where dot
+# can find it using this tag.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS           =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP            = YES
diff --git a/lib/Random123-1.08/docs/cbrng.dox b/lib/Random123-1.08/docs/cbrng.dox
new file mode 100644
index 0000000..ccbb02e
--- /dev/null
+++ b/lib/Random123-1.08/docs/cbrng.dox
@@ -0,0 +1,198 @@
+/**
+ at page CBRNG Counter Based RNGs (CBRNGs).
+
+The counter-based random number generators (CBRNGs)
+in the Random123 library are described in more detail in
+<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers:  As Easy as 1, 2, 3</i> </a>,
+which was named the Best Paper at the ACM SC'11 International Conference on High Performance Computing, Networking,
+Storage, and Analysis.
+All the CBRNGs in the library conform to a  consistent
+interface.  Basically:
+\verbatim
+    value = CBRNGname(counter, key)
+\endverbatim
+
+Thus, with some care, they can be used
+interchangeably in applications. (Since code
+compiled with AES-NI instructions will result
+in an illegal instruction exception on processors
+without those instructions, Random123 provides a
+ at ref haveAESNI function that can be used
+to detect the existence of AES at run-time;
+user code could use it to either report an
+error or substitute an alternative compatible
+CBRNG.)
+
+The API descriptions below are generic, but apply to
+all the different @ref families "families" of 
+Random123 CBRNGs.
+
+\section arrays Fixed-size Array Types
+
+Data is passed into and back from the Random123 functions as
+ at ref arrayNxW "r123arrayNxW"
+types; these types
+contain fixed-size arrays of W-bit types (\c uintW_t for the
+most part, but also a special r123m128i wrapper for the @ref
+AESNI "ARS and AESNI" CBRNGs). The counter argument
+and the return value have the same type, 
+referred to as \c ctr_type in C++, and \c ctr_t in C.  The
+type of the key argument is referred to as \c key_type in C++,
+and \c key_t in C.
+For an  @ref arrayNxW "r123arrayNxW", \c r, the data member \c r.v is an array of N elements,
+each of width W (each element is
+type \c uintW_t or an r123m128i wrapper object).
+C programs can access these elements as \c r.v[0], ... \c r.v[N-1] for
+the \c uintW_t types.
+
+In C++, these array types closely resemble the C++0x std::array<N, uintW_t> template, but do not
+require C++0x libraries or compiler features. 
+C++ programs can access array elements via operator[]
+\c r[0], ... \c r[N-1], or via most of the capabilities
+of a C++ "Container" e.g. \c at(), \c begin(), \c end(),
+\c size() and others.  In addition, containers have <c> incr() </c> and <c> incr(unsigned long long)</c>
+member function that do increment-with-carry, which facilitate
+using r123arrays as very-long-period counters.
+
+If the compiler environment supports it,
+\c Random123/array.h also declares \c r123array1xm128i, which contains an array of one
+\c r123m128i, which in turn is a class wrapping a single element
+of \c __m128i SSE type, which can be accessed as \c r.v[0].m.
+The @ref r123::ARS1xm128i_R RNGs
+use \c r123array1xm128i for both \c ctr_type and \c key_type.
+For the @ref AESNI "AESNI" RNG, \c ctr_type is an \c r123array1xm128i, but 
+\c key_type is an opaque type, which must be initialized
+by assignment from a <c>userkey_type</c> (an r123array1xm128i).
+
+\section aliasing A note on aliasing and type-punning
+It is easiest (though not necessarily fastest) to choose a CBRNG whose
+\c ctr_type matches the width of the random data needed by the
+application, e.g., Philox4x32 for applications that need random data in
+32-bit words.  If the application's needs don't match the counter's value_type,
+it is tempting to use "type punning" and pointer casts to interconvert between
+types.  Such conversions require great care and are very difficult to do
+safely without use of unions or memcpy.  
+See <a
+href="http://blog.worldofcoding.com/2010/02/solving-gcc-44-strict-aliasing-problems.html">
+here</a>
+and 
+<a href="http://dbp-consulting.com/tutorials/StrictAliasing.html">
+here</a>
+for discussions of the pitfalls related to aliasing.
+The C++
+ at ref r123::ReinterpretCtr template is a safe way to reinterpret \c CBRNG
+counter types.
+Gcc's \c
+-Wstrict-aliasing=2 warning level will warn if strict aliasing
+violations are detected.  If you find yourself ignoring or disabling
+warnings about strict aliasing, you should strongly consider adding something
+like gcc's \c -fnostrict-aliasing option to your compiler
+flags.
+
+\section cxxapi C++ API
+
+There are four families of CBRNGs in the library:
+<ul>
+<li> @ref ThreefryNxW "Threefry": @ref r123::Threefry2x32, @ref r123::Threefry4x32, @ref r123::Threefry2x64, @ref r123::Threefry4x64
+<li> @ref PhiloxNxW "Philox": @ref r123::Philox2x32, @ref r123::Philox4x32, @ref r123::Philox2x64, @ref r123::Philox4x64
+<li> @ref r123::AESNI4x32, r123::AESNI1xm128i
+<li> @ref r123::ARS4x32_R
+</ul>
+
+A <i> counter based RNG </i> (CBRNG) with a name of the form
+<i>FamilynameN</i>x<i>W</i> is a type G
+with the three member typedefs:
+
+<ul>
+<li> G::ctr_type, which is an @ref arrayNxW "r123arrayNxW" container class.
+<li> G::ukey_type, which is an @ref arrayNxW "r123arrayMxV" container class.
+Note that the width, \c MxV of the key
+may not be the same as the width \c NxW of
+the ctr_type (@ref PhiloxNxW "Philox" keys are half as wide as the counter,
+and future CBRNGs may well have different widths).
+<li> G::key_type, which in most cases is identical to
+G::ukey_type, but is different for the @ref AESNI "AESNI" types.
+In all cases, there is a G::key_type(G::ukey_type) constructor
+and a G::key_type assignment operator for a G::ukey_type
+right-hand-side.  In general, one can always write:
+ at code
+  G::ukey_type uk1, uk2;
+  // user code initializes uk1 and uk2
+  G::key_type  k1(uk1), k2;
+  k2 = uk2;
+ at endcode
+</ul>
+For most CBRNG's, i.e., any one not in the @ref AESNI "AESNI" family, it is also
+perfectly acceptable to set the elements of a G::key_type directly from application variables.
+The quality of the results will not be compromised by using highly correlated
+or "non-random" keys.
+
+A value \c g of type \c G can be invoked as <c>g(c,k)</c>, where \c c
+is a value of type \c G::ctr_type and \c k is a value of type \c G::key_type,
+and <c>g(c,k)</c> returns a value of type \c G::ctr_type.
+
+<ul>
+<li> g() is a stateless, pure function.  That is, g(c,k) may be called
+any number of times in any context and always returns the same result
+for the same inputs.  In particular, c1==c2 and k1==k2 implies that g(c1,k1)
+== g(c2,k2).  
+<li> For constant k, g(*,k) is a bijection.  That is, 
+g(c1,k) == g(c2,k) if and only if c1 == c2.
+<li> g "randomizes" its inputs.  That is,
+for most sequences of inputs (c1,k1),
+(c2, k2), ...  (including those obtained by following highly
+regular patterns of incrementing and striding 
+through the counter and user key spaces) the output sequence, g(c1, k1),
+g(c2, k2), ...  looks like a a sequence of uniformly distributed
+random variables drawn from the set of all ctr_types.
+</ul>
+
+All the CBRNGs in the library work by iterating a randomization function for a specific number of \e rounds.
+Too few rounds and the CBRNG is a poor (perhaps
+catastrophically poor) random number generator.  Too many rounds and time is wasted
+with little or no improvement in the randomness of the output.  Each of the CBRNGs
+has a specific number of rounds which the authors believe is a reasonable compromise
+between speed and quality.  In all cases, the default number of rounds includes a margin
+of safety above the minimum number of rounds that have passed all of the SmallCrush, Crush and BigCrush 
+tests in the <a href="http://www.iro.umontreal.ca/~simardr/testu01/tu01.html"> TestU01</a> suite.
+
+Users may, however wish to employ a different numbers of rounds.  Each of the above
+classes is actually a typedef of a more general class with a template parameter that
+specifies the number of rounds as <i>name</i>_rounds.  The template classes all end in \c _R:
+
+<ul>
+<li> @ref ThreefryNxW "Threefry": @ref r123::Threefry2x32_R, @ref r123::Threefry4x32_R, @ref r123::Threefry2x64_R, @ref r123::Threefry4x64_R
+<li> @ref PhiloxNxW "Philox": @ref r123::Philox2x32_R, @ref r123::Philox4x32_R, @ref r123::Philox2x64_R, @ref r123::Philox4x64_R
+<li> @ref r123::AESNI4x32_R, r123::AESNI1xm128i_R
+<li> @ref r123::ARS4x32_R
+</ul>
+
+\section capi C API
+
+A subset of the C++ interface
+is also directly usable by C programs.  All header files may be
+safely included in C files.  The C API to each of the
+supported RNGs consists of two typedefs, <i>name</i>_ctr_t,
+<i>name</i>_key_t, two functions <i>name</i>() and <i>name</i>_R(), and
+the enum <i>name</i>_rounds which specifies the recommended number of rounds.
+<ul>
+<li> <i>name</i>(c, k), performs the recommended number of rounds of the <i>name</i> CBRNG.
+<li> <i>name_R</i>(R,c,k), performs an R-round version of the <i>name</i> CBRNG.
+<i>name</i>(c,k) is equivalent to
+<i>name</i>_R(<i>name</i>_rounds, c, k).
+</ul>
+
+The \c _R functions are designed and implemented so that an optimizing compiler can achieve good performance
+when the number of rounds is a compile-time constant.  It is likely that <c>philox4x32_R(10,c,k) </c>
+will perform much better than <c>philox4x32_R(r,c,k)</c> if \c r cannot be
+evaluated at compile-time.
+
+The supported names for the C API are
+<ul>
+<li> @ref ThreefryNxW "threefry": @ref threefry2x32, @ref threefry4x32, @ref threefry2x64, @ref threefry4x64.
+<li> @ref PhiloxNxW "philox": @ref philox2x32, @ref philox4x32, @ref philox2x64, @ref philox4x64.
+<li> @ref ars4x32_R, @ref ars1xm128i_R
+<li> @ref aesni4x32, @ref aesni1xm128i
+</ul>
+
+*/
diff --git a/lib/Random123-1.08/docs/header.html b/lib/Random123-1.08/docs/header.html
new file mode 100644
index 0000000..f566c2f
--- /dev/null
+++ b/lib/Random123-1.08/docs/header.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>$title</title>
+<link href="$relpath$tabs.css" rel="stylesheet" type="text/css"/>
+<link href="$relpath$search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="$relpath$search/search.js"></script>
+<link href="$relpath$doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">$projectname $projectnumber Documentation</li></ul></div>
diff --git a/lib/Random123-1.08/docs/html/CBRNG.html b/lib/Random123-1.08/docs/html/CBRNG.html
new file mode 100644
index 0000000..12c2dbc
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/CBRNG.html
@@ -0,0 +1,151 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Counter Based RNGs (CBRNGs).</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li class="current"><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Counter Based RNGs (CBRNGs). </h1>  </div>
+</div>
+<div class="contents">
+<p>The counter-based random number generators (CBRNGs) in the Random123 library are described in more detail in <a href="http://dl.acm.org/citation.cfm?doid=2063405"><em>Parallel Random Numbers: As Easy as 1, 2, 3</em> </a>, which was named the Best Paper at the ACM SC'11 International Conference on High Performance Computing, Networking, Storage, and Analysis. All the CBRNGs in the library conform to a consistent interface. Basically: </p>
+<div class="fragment"><pre class="fragment">
+    value = CBRNGname(counter, key)
+</pre></div><p>Thus, with some care, they can be used interchangeably in applications. (Since code compiled with AES-NI instructions will result in an illegal instruction exception on processors without those instructions, Random123 provides a <a class="el" href="sse_8h.html#a0b35a046e85316295476d7d552411044">haveAESNI</a> function that can be used to detect the existence of AES at run-time; user code could use it to either report an error or substitute an alternative compatible CBRNG.)</p>
+<p>The API descriptions below are generic, but apply to all the different <a class="el" href="index.html#families">families</a> of Random123 CBRNGs.</p>
+<h2><a class="anchor" id="arrays"></a>
+Fixed-size Array Types</h2>
+<p>Data is passed into and back from the Random123 functions as <a class="el" href="group__arrayNxW.html">r123arrayNxW</a> types; these types contain fixed-size arrays of W-bit types (<code>uintW_t</code> for the most part, but also a special <a class="el" href="structr123m128i.html">r123m128i</a> wrapper for the <a class="el" href="group__AESNI.html">ARS and AESNI</a> CBRNGs). The counter argument and the return value have the same type, referred to as <code>ctr_type</code> in C++, and  [...]
+<p>In C++, these array types closely resemble the C++0x std::array<N, uintW_t> template, but do not require C++0x libraries or compiler features. C++ programs can access array elements via operator[] <code>r</code>[0], ... <code>r</code>[N-1], or via most of the capabilities of a C++ "Container" e.g. <code>at()</code>, <code>begin()</code>, <code>end()</code>, <code>size()</code> and others. In addition, containers have <code> incr() </code> and <code> incr(unsigned long long)</cod [...]
+<p>If the compiler environment supports it, <code><a class="el" href="array_8h.html">Random123/array.h</a></code> also declares <code><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></code>, which contains an array of one <code><a class="el" href="structr123m128i.html">r123m128i</a></code>, which in turn is a class wrapping a single element of <code>__m128i</code> SSE type, which can be accessed as <code>r.v</code>[0].m. The <a class="el" href="structr123_1_1ARS1xm12 [...]
+<h2><a class="anchor" id="aliasing"></a>
+A note on aliasing and type-punning</h2>
+<p>It is easiest (though not necessarily fastest) to choose a CBRNG whose <code>ctr_type</code> matches the width of the random data needed by the application, e.g., Philox4x32 for applications that need random data in 32-bit words. If the application's needs don't match the counter's value_type, it is tempting to use "type punning" and pointer casts to interconvert between types. Such conversions require great care and are very difficult to do safely without use of unions or memcpy. See [...]
+<h2><a class="anchor" id="cxxapi"></a>
+C++ API</h2>
+<p>There are four families of CBRNGs in the library: </p>
+<ul>
+<li>
+<a class="el" href="group__ThreefryNxW.html">Threefry</a>: <a class="el" href="group__ThreefryNxW.html#ga1c32939b65f84966c93677f4382ea36d">r123::Threefry2x32</a>, <a class="el" href="group__ThreefryNxW.html#gacb09a2dcfb7389769f0c58f45f132aaa">r123::Threefry4x32</a>, <a class="el" href="group__ThreefryNxW.html#ga2b54dd1b0d20f09239be5f8757f1f3db">r123::Threefry2x64</a>, <a class="el" href="group__ThreefryNxW.html#gae17c98bddf067365508ed0717f865e8b">r123::Threefry4x64</a> </li>
+<li>
+<a class="el" href="group__PhiloxNxW.html">Philox</a>: <a class="el" href="group__PhiloxNxW.html#ga81659a3ee5a1ca9e2e85c5d725a1ea4f">r123::Philox2x32</a>, <a class="el" href="group__PhiloxNxW.html#gaafd54060af05012db410034e3c0ecdc4">r123::Philox4x32</a>, <a class="el" href="group__PhiloxNxW.html#ga616a669079ac25119353416c14d46426">r123::Philox2x64</a>, <a class="el" href="group__PhiloxNxW.html#ga7776f4d481b7c0ac00db70272a1c77f0">r123::Philox4x64</a> </li>
+<li>
+<a class="el" href="structr123_1_1AESNI4x32.html">r123::AESNI4x32</a>, <a class="el" href="structr123_1_1AESNI1xm128i.html">r123::AESNI1xm128i</a> </li>
+<li>
+<a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R</a> </li>
+</ul>
+<p>A <em> counter based RNG </em> (CBRNG) with a name of the form <em>FamilynameN</em>x<em>W</em> is a type G with the three member typedefs:</p>
+<ul>
+<li>
+G::ctr_type, which is an <a class="el" href="group__arrayNxW.html">r123arrayNxW</a> container class. </li>
+<li>
+G::ukey_type, which is an <a class="el" href="group__arrayNxW.html">r123arrayMxV</a> container class. Note that the width, <code>MxV</code> of the key may not be the same as the width <code>NxW</code> of the ctr_type (<a class="el" href="group__PhiloxNxW.html">Philox</a> keys are half as wide as the counter, and future CBRNGs may well have different widths). </li>
+<li>
+G::key_type, which in most cases is identical to G::ukey_type, but is different for the <a class="el" href="group__AESNI.html">AESNI</a> types. In all cases, there is a G::key_type(G::ukey_type) constructor and a G::key_type assignment operator for a G::ukey_type right-hand-side. In general, one can always write: <div class="fragment"><pre class="fragment">  G::ukey_type uk1, uk2;
+  <span class="comment">// user code initializes uk1 and uk2</span>
+  G::key_type  k1(uk1), k2;
+  k2 = uk2;
+</pre></div> </li>
+</ul>
+<p>For most CBRNG's, i.e., any one not in the <a class="el" href="group__AESNI.html">AESNI</a> family, it is also perfectly acceptable to set the elements of a G::key_type directly from application variables. The quality of the results will not be compromised by using highly correlated or "non-random" keys.</p>
+<p>A value <code>g</code> of type <code>G</code> can be invoked as <code>g(c,k)</code>, where <code>c</code> is a value of type <code>G::ctr_type</code> and <code>k</code> is a value of type <code>G::key_type</code>, and <code>g(c,k)</code> returns a value of type <code>G::ctr_type</code>.</p>
+<ul>
+<li>
+g() is a stateless, pure function. That is, g(c,k) may be called any number of times in any context and always returns the same result for the same inputs. In particular, c1==c2 and k1==k2 implies that g(c1,k1) == g(c2,k2). </li>
+<li>
+For constant k, g(*,k) is a bijection. That is, g(c1,k) == g(c2,k) if and only if c1 == c2. </li>
+<li>
+g "randomizes" its inputs. That is, for most sequences of inputs (c1,k1), (c2, k2), ... (including those obtained by following highly regular patterns of incrementing and striding through the counter and user key spaces) the output sequence, g(c1, k1), g(c2, k2), ... looks like a a sequence of uniformly distributed random variables drawn from the set of all ctr_types. </li>
+</ul>
+<p>All the CBRNGs in the library work by iterating a randomization function for a specific number of <em>rounds</em>. Too few rounds and the CBRNG is a poor (perhaps catastrophically poor) random number generator. Too many rounds and time is wasted with little or no improvement in the randomness of the output. Each of the CBRNGs has a specific number of rounds which the authors believe is a reasonable compromise between speed and quality. In all cases, the default number of rounds includ [...]
+<p>Users may, however wish to employ a different numbers of rounds. Each of the above classes is actually a typedef of a more general class with a template parameter that specifies the number of rounds as <em>name</em>_rounds. The template classes all end in <code>_R:</code> </p>
+<ul>
+<li>
+<a class="el" href="group__ThreefryNxW.html">Threefry</a>: <a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32_R</a>, <a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32_R</a>, <a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64_R</a>, <a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64_R</a> </li>
+<li>
+<a class="el" href="group__PhiloxNxW.html">Philox</a>: <a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32_R</a>, <a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32_R</a>, <a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64_R</a>, <a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64_R</a> </li>
+<li>
+<a class="el" href="structr123_1_1AESNI4x32__R.html">r123::AESNI4x32_R</a>, <a class="el" href="structr123_1_1AESNI1xm128i__R.html">r123::AESNI1xm128i_R</a> </li>
+<li>
+<a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R</a> </li>
+</ul>
+<h2><a class="anchor" id="capi"></a>
+C API</h2>
+<p>A subset of the C++ interface is also directly usable by C programs. All header files may be safely included in C files. The C API to each of the supported RNGs consists of two typedefs, <em>name</em>_ctr_t, <em>name</em>_key_t, two functions <em>name</em>() and <em>name</em>_R(), and the enum <em>name</em>_rounds which specifies the recommended number of rounds. </p>
+<ul>
+<li>
+<em>name</em>(c, k), performs the recommended number of rounds of the <em>name</em> CBRNG. </li>
+<li>
+<em>name_R</em>(R,c,k), performs an R-round version of the <em>name</em> CBRNG. <em>name</em>(c,k) is equivalent to <em>name</em>_R(<em>name</em>_rounds, c, k). </li>
+</ul>
+<p>The <code>_R</code> functions are designed and implemented so that an optimizing compiler can achieve good performance when the number of rounds is a compile-time constant. It is likely that <code>philox4x32_R(10,c,k) </code> will perform much better than <code>philox4x32_R(r,c,k)</code> if <code>r</code> cannot be evaluated at compile-time.</p>
+<p>The supported names for the C API are </p>
+<ul>
+<li>
+<a class="el" href="group__ThreefryNxW.html">threefry</a>: <a class="el" href="threefry_8h.html#af98f648fb8e458ff0c6825cb903734f2">threefry2x32</a>, <a class="el" href="threefry_8h.html#a1636cce9de54f919e8952a42b7f397fd">threefry4x32</a>, <a class="el" href="threefry_8h.html#aea6a4bd5c80354a4f575c9bec2702172">threefry2x64</a>, <a class="el" href="threefry_8h.html#a382d18a49002d2a5e2b2f06d58669d70">threefry4x64</a>. </li>
+<li>
+<a class="el" href="group__PhiloxNxW.html">philox</a>: <a class="el" href="philox_8h.html#ab2496424917f063a4990f01943a07fe0">philox2x32</a>, <a class="el" href="philox_8h.html#a432a3df828dd51acd0b7ec2fee1d4d7e">philox4x32</a>, <a class="el" href="philox_8h.html#ae6b57a71e4efa369cc19416fc088b5a5">philox2x64</a>, <a class="el" href="philox_8h.html#a62fb1b4d9775396303ebb2a801fea8e6">philox4x64</a>. </li>
+<li>
+<a class="el" href="group__AESNI.html#gab13b093252d4bb3389d27d4e3b04dae8">ars4x32_R</a>, <a class="el" href="group__AESNI.html#gaddc6efc2007f6f66ee914eb7074cff1e">ars1xm128i_R</a> </li>
+<li>
+<a class="el" href="group__AESNI.html#gae3950c524818b49d1cdfad481880a33a">aesni4x32</a>, <a class="el" href="group__AESNI.html#ga3ba5daca2d4d076ece24900084e71311">aesni1xm128i</a> </li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/Engine_8hpp.html b/lib/Random123-1.08/docs/html/Engine_8hpp.html
new file mode 100644
index 0000000..13edb70
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/Engine_8hpp.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/conventional/Engine.hpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> |
+<a href="#namespaces">Namespaces</a>  </div>
+  <div class="headertitle">
+<h1>Random123/conventional/Engine.hpp File Reference</h1>  </div>
+</div>
+<div class="contents">
+<code>#include "../features/compilerfeatures.h"</code><br/>
+<code>#include "../array.h"</code><br/>
+<code>#include <limits></code><br/>
+<code>#include <stdexcept></code><br/>
+<code>#include <sstream></code><br/>
+<code>#include <algorithm></code><br/>
+<code>#include <vector></code><br/>
+
+<p><a href="Engine_8hpp_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td></tr>
+<tr><td colspan="2"><h2><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html">r123</a></td></tr>
+</table>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/Engine_8hpp_source.html b/lib/Random123-1.08/docs/html/Engine_8hpp_source.html
new file mode 100644
index 0000000..eeb0461
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/Engine_8hpp_source.html
@@ -0,0 +1,305 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/conventional/Engine.hpp Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>Random123/conventional/Engine.hpp</h1>  </div>
+</div>
+<div class="contents">
+<a href="Engine_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">Copyright 2010-2011, D. E. Shaw Research.</span>
+<a name="l00003"></a>00003 <span class="comment">All rights reserved.</span>
+<a name="l00004"></a>00004 <span class="comment"></span>
+<a name="l00005"></a>00005 <span class="comment">Redistribution and use in source and binary forms, with or without</span>
+<a name="l00006"></a>00006 <span class="comment">modification, are permitted provided that the following conditions are</span>
+<a name="l00007"></a>00007 <span class="comment">met:</span>
+<a name="l00008"></a>00008 <span class="comment"></span>
+<a name="l00009"></a>00009 <span class="comment">* Redistributions of source code must retain the above copyright</span>
+<a name="l00010"></a>00010 <span class="comment">  notice, this list of conditions, and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"></span>
+<a name="l00012"></a>00012 <span class="comment">* Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00013"></a>00013 <span class="comment">  notice, this list of conditions, and the following disclaimer in the</span>
+<a name="l00014"></a>00014 <span class="comment">  documentation and/or other materials provided with the distribution.</span>
+<a name="l00015"></a>00015 <span class="comment"></span>
+<a name="l00016"></a>00016 <span class="comment">* Neither the name of D. E. Shaw Research nor the names of its</span>
+<a name="l00017"></a>00017 <span class="comment">  contributors may be used to endorse or promote products derived from</span>
+<a name="l00018"></a>00018 <span class="comment">  this software without specific prior written permission.</span>
+<a name="l00019"></a>00019 <span class="comment"></span>
+<a name="l00020"></a>00020 <span class="comment">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span>
+<a name="l00021"></a>00021 <span class="comment">"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span>
+<a name="l00022"></a>00022 <span class="comment">LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span>
+<a name="l00023"></a>00023 <span class="comment">A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span>
+<a name="l00024"></a>00024 <span class="comment">OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
+<a name="l00025"></a>00025 <span class="comment">SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span>
+<a name="l00026"></a>00026 <span class="comment">LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span>
+<a name="l00027"></a>00027 <span class="comment">DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span>
+<a name="l00028"></a>00028 <span class="comment">THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00029"></a>00029 <span class="comment">(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span>
+<a name="l00030"></a>00030 <span class="comment">OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00031"></a>00031 <span class="comment">*/</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#ifndef __Engine_dot_hpp_</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#define __Engine_dot_hpp_</span>
+<a name="l00034"></a>00034 <span class="preprocessor"></span>
+<a name="l00035"></a>00035 <span class="preprocessor">#include "../features/compilerfeatures.h"</span>
+<a name="l00036"></a>00036 <span class="preprocessor">#include "../array.h"</span>
+<a name="l00037"></a>00037 <span class="preprocessor">#include <limits></span>
+<a name="l00038"></a>00038 <span class="preprocessor">#include <stdexcept></span>
+<a name="l00039"></a>00039 <span class="preprocessor">#include <sstream></span>
+<a name="l00040"></a>00040 <span class="preprocessor">#include <algorithm></span>
+<a name="l00041"></a>00041 <span class="preprocessor">#include <vector></span>
+<a name="l00042"></a>00042 <span class="preprocessor">#if R123_USE_CXX11_TYPE_TRAITS</span>
+<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#include <type_traits></span>
+<a name="l00044"></a>00044 <span class="preprocessor">#endif</span>
+<a name="l00045"></a>00045 <span class="preprocessor"></span>
+<a name="l00046"></a>00046 <span class="keyword">namespace </span>r123{
+<a name="l00067"></a>00067 <span class="keyword">template</span><<span class="keyword">typename</span> CBRNG>
+<a name="l00068"></a><a class="code" href="structr123_1_1Engine.html">00068</a> <span class="keyword">struct </span><a class="code" href="structr123_1_1Engine.html">Engine</a> {
+<a name="l00069"></a><a class="code" href="structr123_1_1Engine.html#a45ee0086cf8cd6d10febb76dc88f8b22">00069</a>     <span class="keyword">typedef</span> CBRNG cbrng_type;
+<a name="l00070"></a><a class="code" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">00070</a>     <span class="keyword">typedef</span> <span class="keyword">typename</span> CBRNG::ctr_type ctr_type;
+<a name="l00071"></a><a class="code" href="structr123_1_1Engine.html#a18132a79d2327990c4809b37300eddc3">00071</a>     <span class="keyword">typedef</span> <span class="keyword">typename</span> CBRNG::key_type key_type;
+<a name="l00072"></a><a class="code" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">00072</a>     <span class="keyword">typedef</span> <span class="keyword">typename</span> CBRNG::ukey_type ukey_type;
+<a name="l00073"></a><a class="code" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">00073</a>     <span class="keyword">typedef</span> <span class="keyword">typename</span> ctr_type::value_type result_type;
+<a name="l00074"></a><a class="code" href="structr123_1_1Engine.html#a8fb9eb1ab76ad9b5374a47cf84ecd306">00074</a>     <span class="keyword">typedef</span> <span class="keywordtype">size_t</span> elem_type;
+<a name="l00075"></a>00075 
+<a name="l00076"></a>00076 <span class="keyword">protected</span>:
+<a name="l00077"></a><a class="code" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">00077</a>     <a class="code" href="structr123_1_1Engine.html#a45ee0086cf8cd6d10febb76dc88f8b22">cbrng_type</a> <a class="code" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">b</a>;
+<a name="l00078"></a><a class="code" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">00078</a>     <a class="code" href="structr123_1_1Engine.html#a18132a79d2327990c4809b37300eddc3">key_type</a> <a class="code" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">key</a>;
+<a name="l00079"></a><a class="code" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">00079</a>     <a class="code" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> <a class="code" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">ukey</a>;
+<a name="l00080"></a><a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">00080</a>     <a class="code" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a> <a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a>;
+<a name="l00081"></a><a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">00081</a>     <a class="code" href="structr123_1_1Engine.html#a8fb9eb1ab76ad9b5374a47cf84ecd306">elem_type</a> <a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a>;
+<a name="l00082"></a><a class="code" href="structr123_1_1Engine.html#a6169d4fbce1fd7725fabda4c693bf250">00082</a>     <a class="code" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a> <a class="code" href="structr123_1_1Engine.html#a6169d4fbce1fd7725fabda4c693bf250">v</a>;
+<a name="l00083"></a>00083 
+<a name="l00084"></a><a class="code" href="structr123_1_1Engine.html#aa7ad87d7238a0f820ee37640071dee7d">00084</a>     <span class="keywordtype">void</span> <a class="code" href="structr123_1_1Engine.html#aa7ad87d7238a0f820ee37640071dee7d">fix_invariant</a>(){
+<a name="l00085"></a>00085         <span class="keywordflow">if</span>( <a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a> != 0 ) {
+<a name="l00086"></a>00086             <a class="code" href="structr123_1_1Engine.html#a6169d4fbce1fd7725fabda4c693bf250">v</a> = <a class="code" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">b</a>(<a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a>, <a class="code" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">key</a>);
+<a name="l00087"></a>00087         }
+<a name="l00088"></a>00088     }        
+<a name="l00089"></a>00089 <span class="keyword">public</span>:
+<a name="l00090"></a><a class="code" href="structr123_1_1Engine.html#ac5676bbe189b0cdc1bef0dd812262ccd">00090</a>     <span class="keyword">explicit</span> <a class="code" href="structr123_1_1Engine.html#ac5676bbe189b0cdc1bef0dd812262ccd">Engine</a>() : <a class="code" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">b</a>(), <a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a>(), <a class="code" href="structr123_1_1Engine.html#a7b401 [...]
+<a name="l00091"></a>00091         <a class="code" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> x = {{}};
+<a name="l00092"></a>00092         <a class="code" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">ukey</a> = x;
+<a name="l00093"></a>00093         <a class="code" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">key</a> = <a class="code" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">ukey</a>;
+<a name="l00094"></a>00094     }
+<a name="l00095"></a><a class="code" href="structr123_1_1Engine.html#ae1a249af828cfdac77db6c16e3f8f8eb">00095</a>     <span class="keyword">explicit</span> <a class="code" href="structr123_1_1Engine.html#ae1a249af828cfdac77db6c16e3f8f8eb">Engine</a>(<a class="code" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> r) : <a class="code" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">b</a>(), <a class="code" href="structr123_1_1Engine.htm [...]
+<a name="l00096"></a>00096         <a class="code" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> x = {{<span class="keyword">typename</span> ukey_type::value_type(r)}};
+<a name="l00097"></a>00097         <a class="code" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">ukey</a> = x;
+<a name="l00098"></a>00098         <a class="code" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">key</a> = <a class="code" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">ukey</a>;
+<a name="l00099"></a>00099     }
+<a name="l00100"></a>00100     <span class="comment">// 26.5.3 says that the SeedSeq templates shouldn't particpate in</span>
+<a name="l00101"></a>00101     <span class="comment">// overload resolution unless the type qualifies as a SeedSeq.</span>
+<a name="l00102"></a>00102     <span class="comment">// How that is determined is unspecified, except that "as a</span>
+<a name="l00103"></a>00103     <span class="comment">// minimum a type shall not qualify as a SeedSeq if it is</span>
+<a name="l00104"></a>00104     <span class="comment">// implicitly convertible to a result_type."  </span>
+<a name="l00105"></a>00105     <span class="comment">//</span>
+<a name="l00106"></a>00106     <span class="comment">// First, we make sure that even the non-const copy constructor</span>
+<a name="l00107"></a>00107     <span class="comment">// works as expected.  In addition, if we've got C++0x</span>
+<a name="l00108"></a>00108     <span class="comment">// type_traits, we use enable_if and is_convertible to implement</span>
+<a name="l00109"></a>00109     <span class="comment">// the convertible-to-result_type restriction.  Otherwise, the</span>
+<a name="l00110"></a>00110     <span class="comment">// template is unconditional and will match in some surpirsing</span>
+<a name="l00111"></a>00111     <span class="comment">// and undesirable situations.</span>
+<a name="l00112"></a><a class="code" href="structr123_1_1Engine.html#a37dd55cee849b59d678f74780f785672">00112</a>     <a class="code" href="structr123_1_1Engine.html#a37dd55cee849b59d678f74780f785672">Engine</a>(<a class="code" href="structr123_1_1Engine.html">Engine</a>& e) : <a class="code" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">b</a>(e.<a class="code" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">b</a>), <a class="code" href="struct [...]
+<a name="l00113"></a>00113         <a class="code" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">key</a> = <a class="code" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">ukey</a>;
+<a name="l00114"></a>00114         <a class="code" href="structr123_1_1Engine.html#aa7ad87d7238a0f820ee37640071dee7d">fix_invariant</a>();
+<a name="l00115"></a>00115     }
+<a name="l00116"></a><a class="code" href="structr123_1_1Engine.html#a478b486b166316597a51ffdd7b5b2d0c">00116</a>     <a class="code" href="structr123_1_1Engine.html#a478b486b166316597a51ffdd7b5b2d0c">Engine</a>(<span class="keyword">const</span> <a class="code" href="structr123_1_1Engine.html">Engine</a>& e) : <a class="code" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">b</a>(e.<a class="code" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">b [...]
+<a name="l00117"></a>00117         <a class="code" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">key</a> = <a class="code" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">ukey</a>;
+<a name="l00118"></a>00118         <a class="code" href="structr123_1_1Engine.html#aa7ad87d7238a0f820ee37640071dee7d">fix_invariant</a>();
+<a name="l00119"></a>00119     }
+<a name="l00120"></a>00120 
+<a name="l00121"></a>00121     <span class="keyword">template</span> <<span class="keyword">typename</span> SeedSeq>
+<a name="l00122"></a><a class="code" href="structr123_1_1Engine.html#a52b968cfefe413441d668b3013de023a">00122</a>     <span class="keyword">explicit</span> <a class="code" href="structr123_1_1Engine.html#ac5676bbe189b0cdc1bef0dd812262ccd">Engine</a>(SeedSeq &s
+<a name="l00123"></a>00123 #<span class="keywordflow">if</span> R123_USE_CXX11_TYPE_TRAITS
+<a name="l00124"></a>00124                     , <span class="keyword">typename</span> std::enable_if<!std::is_convertible<SeedSeq, result_type>::value>::type* =0
+<a name="l00125"></a>00125 #endif
+<a name="l00126"></a>00126                     )
+<a name="l00127"></a>00127         : <a class="code" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">b</a>(), <a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a>(), <a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a>() {
+<a name="l00128"></a>00128         <a class="code" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">ukey</a> = <a class="code" href="structr123_1_1Engine.html#aff36bc97d11bc66f6c0edb75d8dc88e5">ukey_type::seed</a>(s);
+<a name="l00129"></a>00129         <a class="code" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">key</a> = <a class="code" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">ukey</a>;
+<a name="l00130"></a>00130     }
+<a name="l00131"></a><a class="code" href="structr123_1_1Engine.html#a93429593bdb12b202b4b8ed38fe08bc4">00131</a>     <span class="keywordtype">void</span> <a class="code" href="structr123_1_1Engine.html#a93429593bdb12b202b4b8ed38fe08bc4">seed</a>(<a class="code" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> r){
+<a name="l00132"></a>00132         *<span class="keyword">this</span> = <a class="code" href="structr123_1_1Engine.html#ac5676bbe189b0cdc1bef0dd812262ccd">Engine</a>(r);
+<a name="l00133"></a>00133     }
+<a name="l00134"></a>00134     <span class="keyword">template</span> <<span class="keyword">typename</span> SeedSeq>
+<a name="l00135"></a><a class="code" href="structr123_1_1Engine.html#ac4d05ee820a1eb70e76cabb14645dad4">00135</a>     <span class="keywordtype">void</span> <a class="code" href="structr123_1_1Engine.html#aff36bc97d11bc66f6c0edb75d8dc88e5">seed</a>(SeedSeq &s
+<a name="l00136"></a>00136 #<span class="keywordflow">if</span> R123_USE_CXX11_TYPE_TRAITS
+<a name="l00137"></a>00137                     , <span class="keyword">typename</span> std::enable_if<!std::is_convertible<SeedSeq, result_type>::value>::type* =0
+<a name="l00138"></a>00138 #endif
+<a name="l00139"></a>00139               ){ 
+<a name="l00140"></a>00140         *<span class="keyword">this</span> = <a class="code" href="structr123_1_1Engine.html#ac5676bbe189b0cdc1bef0dd812262ccd">Engine</a>(s);
+<a name="l00141"></a>00141     }
+<a name="l00142"></a><a class="code" href="structr123_1_1Engine.html#aff36bc97d11bc66f6c0edb75d8dc88e5">00142</a>     <span class="keywordtype">void</span> <a class="code" href="structr123_1_1Engine.html#aff36bc97d11bc66f6c0edb75d8dc88e5">seed</a>(){
+<a name="l00143"></a>00143         *<span class="keyword">this</span> = <a class="code" href="structr123_1_1Engine.html#ac5676bbe189b0cdc1bef0dd812262ccd">Engine</a>();
+<a name="l00144"></a>00144     }
+<a name="l00145"></a><a class="code" href="structr123_1_1Engine.html#a606e3ba824542e52f12df1345126e721">00145</a>     <span class="keyword">friend</span> <span class="keywordtype">bool</span> <a class="code" href="structr123_1_1Engine.html#a606e3ba824542e52f12df1345126e721">operator==</a>(<span class="keyword">const</span> <a class="code" href="structr123_1_1Engine.html">Engine</a>& lhs, <span class="keyword">const</span> <a class="code" href="structr123_1_1Engine.html">Engine</a>&am [...]
+<a name="l00146"></a>00146         <span class="keywordflow">return</span> lhs.<a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a>==rhs.<a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a> && lhs.<a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a> == rhs.<a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a> && lhs.<a class= [...]
+<a name="l00147"></a>00147     }
+<a name="l00148"></a><a class="code" href="structr123_1_1Engine.html#af0947cdcfc03aef7ec30c9fafa660445">00148</a>     <span class="keyword">friend</span> <span class="keywordtype">bool</span> <a class="code" href="structr123_1_1Engine.html#af0947cdcfc03aef7ec30c9fafa660445">operator!=</a>(<span class="keyword">const</span> <a class="code" href="structr123_1_1Engine.html">Engine</a>& lhs, <span class="keyword">const</span> <a class="code" href="structr123_1_1Engine.html">Engine</a>&am [...]
+<a name="l00149"></a>00149         <span class="keywordflow">return</span> lhs.<a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a>!=rhs.<a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a> || lhs.<a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a> != rhs.<a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a> || lhs.<a class="code" href="str [...]
+<a name="l00150"></a>00150     }
+<a name="l00151"></a>00151 
+<a name="l00152"></a><a class="code" href="structr123_1_1Engine.html#ae0321571f689fca00c608d11ecad7d8d">00152</a>     <span class="keyword">friend</span> std::ostream& <a class="code" href="structr123_1_1Engine.html#ae0321571f689fca00c608d11ecad7d8d">operator<<</a>(std::ostream& os, <span class="keyword">const</span> <a class="code" href="structr123_1_1Engine.html">Engine</a>& be){
+<a name="l00153"></a>00153         <span class="keywordflow">return</span> os << be.<a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a> << <span class="stringliteral">" "</span> << be.<a class="code" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">ukey</a> << <span class="stringliteral">" "</span> << be.<a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319 [...]
+<a name="l00154"></a>00154     }
+<a name="l00155"></a>00155 
+<a name="l00156"></a><a class="code" href="structr123_1_1Engine.html#ae708b771ab5ac17700d34bad875a16d9">00156</a>     <span class="keyword">friend</span> std::istream& <a class="code" href="structr123_1_1Engine.html#ae708b771ab5ac17700d34bad875a16d9">operator>></a>(std::istream& is, <a class="code" href="structr123_1_1Engine.html">Engine</a>& be){
+<a name="l00157"></a>00157         is >> be.<a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a> >> be.<a class="code" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">ukey</a> >> be.<a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a>;
+<a name="l00158"></a>00158         be.<a class="code" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">key</a> = be.<a class="code" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">ukey</a>;
+<a name="l00159"></a>00159         be.<a class="code" href="structr123_1_1Engine.html#aa7ad87d7238a0f820ee37640071dee7d">fix_invariant</a>();
+<a name="l00160"></a>00160         <span class="keywordflow">return</span> is;
+<a name="l00161"></a>00161     }
+<a name="l00162"></a>00162 
+<a name="l00163"></a>00163     <span class="comment">// The <random> shipped with MacOS Xcode 4.5.2 imposes a</span>
+<a name="l00164"></a>00164     <span class="comment">// non-standard requirement that URNGs also have static data</span>
+<a name="l00165"></a>00165     <span class="comment">// members: _Min and _Max.  Later versions of libc++ impose the</span>
+<a name="l00166"></a>00166     <span class="comment">// requirement only when constexpr isn't supported.  Although the</span>
+<a name="l00167"></a>00167     <span class="comment">// Xcode 4.5.2 requirement is clearly non-standard, it is unlikely</span>
+<a name="l00168"></a>00168     <span class="comment">// to be fixed and it is very easy work around.  We certainly</span>
+<a name="l00169"></a>00169     <span class="comment">// don't want to go to great lengths to accommodate every buggy</span>
+<a name="l00170"></a>00170     <span class="comment">// library we come across, but in this particular case, the effort</span>
+<a name="l00171"></a>00171     <span class="comment">// is low and the benefit is high, so it's worth doing.  Thanks to</span>
+<a name="l00172"></a>00172     <span class="comment">// Yan Zhou for pointing this out to us.  See similar code in</span>
+<a name="l00173"></a>00173     <span class="comment">// ../MicroURNG.hpp</span>
+<a name="l00174"></a><a class="code" href="structr123_1_1Engine.html#aa73e4d27847915f1438fd37b30777111">00174</a>     <span class="keyword">const</span> <span class="keyword">static</span> <a class="code" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> <a class="code" href="structr123_1_1Engine.html#aa73e4d27847915f1438fd37b30777111">_Min</a> = 0;
+<a name="l00175"></a><a class="code" href="structr123_1_1Engine.html#ae549f81e966b0414bcaf0f24b566ebd8">00175</a>     <span class="keyword">const</span> <span class="keyword">static</span> <a class="code" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> <a class="code" href="structr123_1_1Engine.html#ae549f81e966b0414bcaf0f24b566ebd8">_Max</a> = ~((result_type)0);
+<a name="l00176"></a>00176 
+<a name="l00177"></a><a class="code" href="structr123_1_1Engine.html#af5441fc62932c3d099f8b16150d2aa81">00177</a>     <span class="keyword">static</span> R123_CONSTEXPR <a class="code" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> min <a class="code" href="structr123_1_1Engine.html#af5441fc62932c3d099f8b16150d2aa81">R123_NO_MACRO_SUBST</a> () { <span class="keywordflow">return</span> <a class="code" href="structr123_1_1Engine.html#aa73e4d27847915f1438 [...]
+<a name="l00178"></a><a class="code" href="structr123_1_1Engine.html#a112318f7d0015ecf4c3c6a8a5c76371b">00178</a>     <span class="keyword">static</span> R123_CONSTEXPR <a class="code" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> max <a class="code" href="structr123_1_1Engine.html#a112318f7d0015ecf4c3c6a8a5c76371b">R123_NO_MACRO_SUBST</a> () { <span class="keywordflow">return</span> <a class="code" href="structr123_1_1Engine.html#ae549f81e966b0414bca [...]
+<a name="l00179"></a>00179 
+<a name="l00180"></a><a class="code" href="structr123_1_1Engine.html#aca309d0b4f2a8fff1f6f2ab38c6caf93">00180</a>     <a class="code" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> <a class="code" href="structr123_1_1Engine.html#aca309d0b4f2a8fff1f6f2ab38c6caf93">operator()</a>(){
+<a name="l00181"></a>00181         <span class="keywordflow">if</span>( <a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a>.size() == 1 )     <span class="comment">// short-circuit the scalar case.  Compilers aren't mind-readers.</span>
+<a name="l00182"></a>00182             <span class="keywordflow">return</span> <a class="code" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">b</a>(<a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a>.incr(), <a class="code" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">key</a>)[0];
+<a name="l00183"></a>00183         <span class="keywordflow">if</span>( <a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a> == 0 ){
+<a name="l00184"></a>00184             <a class="code" href="structr123_1_1Engine.html#a6169d4fbce1fd7725fabda4c693bf250">v</a> = <a class="code" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">b</a>(<a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a>.incr(), <a class="code" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">key</a>);
+<a name="l00185"></a>00185             <a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a> = <a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a>.size();
+<a name="l00186"></a>00186         }
+<a name="l00187"></a>00187         <span class="keywordflow">return</span> <a class="code" href="structr123_1_1Engine.html#a6169d4fbce1fd7725fabda4c693bf250">v</a>[--<a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a>];
+<a name="l00188"></a>00188     }
+<a name="l00189"></a>00189 
+<a name="l00190"></a><a class="code" href="structr123_1_1Engine.html#a82a56c2c02b146dceb68ef3fd0a969fb">00190</a>     <span class="keywordtype">void</span> <a class="code" href="structr123_1_1Engine.html#a82a56c2c02b146dceb68ef3fd0a969fb">discard</a>(R123_ULONG_LONG skip){
+<a name="l00191"></a>00191         <span class="comment">// don't forget:  elem counts down</span>
+<a name="l00192"></a>00192         <span class="keywordtype">size_t</span> nelem = <a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a>.size();
+<a name="l00193"></a>00193         <span class="keywordtype">size_t</span> sub = skip % nelem;
+<a name="l00194"></a>00194         skip /= nelem;
+<a name="l00195"></a>00195         <span class="keywordflow">if</span> (<a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a> < sub) {
+<a name="l00196"></a>00196             <a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a> += nelem;
+<a name="l00197"></a>00197             skip++;
+<a name="l00198"></a>00198         }
+<a name="l00199"></a>00199         <a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a> -= sub;
+<a name="l00200"></a>00200         <a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a>.incr(skip);
+<a name="l00201"></a>00201         <a class="code" href="structr123_1_1Engine.html#aa7ad87d7238a0f820ee37640071dee7d">fix_invariant</a>();
+<a name="l00202"></a>00202     }
+<a name="l00203"></a>00203          
+<a name="l00204"></a>00204     <span class="comment">//--------------------------</span>
+<a name="l00205"></a>00205     <span class="comment">// Some bonus methods, not required for a Random Number</span>
+<a name="l00206"></a>00206     <span class="comment">// Engine</span>
+<a name="l00207"></a>00207 
+<a name="l00208"></a>00208     <span class="comment">// Constructors and seed() method for ukey_type seem useful</span>
+<a name="l00209"></a>00209     <span class="comment">// We need const and non-const to supersede the SeedSeq template.</span>
+<a name="l00210"></a><a class="code" href="structr123_1_1Engine.html#ab5f45b4eb97995cc45350abee3ec8388">00210</a>     <span class="keyword">explicit</span> <a class="code" href="structr123_1_1Engine.html#ab5f45b4eb97995cc45350abee3ec8388">Engine</a>(<span class="keyword">const</span> <a class="code" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> &uk) : <a class="code" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">key</a>(uk), <a  [...]
+<a name="l00211"></a><a class="code" href="structr123_1_1Engine.html#aeb178b9305cbf1fb7e11e8e33a631ba7">00211</a>     <span class="keyword">explicit</span> <a class="code" href="structr123_1_1Engine.html#aeb178b9305cbf1fb7e11e8e33a631ba7">Engine</a>(<a class="code" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> &uk) : <a class="code" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">key</a>(uk), <a class="code" href="structr123_1_1En [...]
+<a name="l00212"></a><a class="code" href="structr123_1_1Engine.html#a5c4d68dbbccfc71f467f3c902f5b93da">00212</a>     <span class="keywordtype">void</span> <a class="code" href="structr123_1_1Engine.html#a5c4d68dbbccfc71f467f3c902f5b93da">seed</a>(<span class="keyword">const</span> <a class="code" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a>& uk){
+<a name="l00213"></a>00213         *<span class="keyword">this</span> = <a class="code" href="structr123_1_1Engine.html#ac5676bbe189b0cdc1bef0dd812262ccd">Engine</a>(uk);
+<a name="l00214"></a>00214     }        
+<a name="l00215"></a><a class="code" href="structr123_1_1Engine.html#a7bd6d3417cefb904c879f41d2c29e15e">00215</a>     <span class="keywordtype">void</span> <a class="code" href="structr123_1_1Engine.html#a7bd6d3417cefb904c879f41d2c29e15e">seed</a>(<a class="code" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a>& uk){
+<a name="l00216"></a>00216         *<span class="keyword">this</span> = <a class="code" href="structr123_1_1Engine.html#ac5676bbe189b0cdc1bef0dd812262ccd">Engine</a>(uk);
+<a name="l00217"></a>00217     }        
+<a name="l00218"></a>00218 
+<a name="l00219"></a>00219     <span class="comment">// Forward the e(counter) to the CBRNG we are templated</span>
+<a name="l00220"></a>00220     <span class="comment">// on, using the current value of the key.</span>
+<a name="l00221"></a><a class="code" href="structr123_1_1Engine.html#af396a7d1656af55805e38f3d9c0fbef7">00221</a>     <a class="code" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a> <a class="code" href="structr123_1_1Engine.html#af396a7d1656af55805e38f3d9c0fbef7">operator()</a>(<span class="keyword">const</span> <a class="code" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a>& <a class="code" href="structr123_1_1Engine.h [...]
+<a name="l00222"></a>00222         <span class="keywordflow">return</span> <a class="code" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">b</a>(c, <a class="code" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">key</a>);
+<a name="l00223"></a>00223     }
+<a name="l00224"></a>00224 
+<a name="l00225"></a>00225     <span class="comment">// Since you can seed *this with a ukey_type, it seems reasonable</span>
+<a name="l00226"></a>00226     <span class="comment">// to allow the caller to know what seed/ukey *this is using.</span>
+<a name="l00227"></a><a class="code" href="structr123_1_1Engine.html#aa7812a494fdb677c2e325db0acfe924a">00227</a>     <a class="code" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> <a class="code" href="structr123_1_1Engine.html#aa7812a494fdb677c2e325db0acfe924a">getseed</a>()<span class="keyword"> const</span>{
+<a name="l00228"></a>00228         <span class="keywordflow">return</span> <a class="code" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">ukey</a>;
+<a name="l00229"></a>00229     }
+<a name="l00230"></a>00230 
+<a name="l00231"></a>00231     <span class="comment">// Maybe the caller want's to know the details of</span>
+<a name="l00232"></a>00232     <span class="comment">// the internal state, e.g., so it can call a different</span>
+<a name="l00233"></a>00233     <span class="comment">// bijection with the same counter.</span>
+<a name="l00234"></a><a class="code" href="structr123_1_1Engine.html#a621df886f2a21ffb22e63d9094389173">00234</a>     std::pair<ctr_type, elem_type> <a class="code" href="structr123_1_1Engine.html#a621df886f2a21ffb22e63d9094389173">getcounter</a>()<span class="keyword"> const </span>{
+<a name="l00235"></a>00235         <span class="keywordflow">return</span> make_pair(<a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a>,  <a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a>);
+<a name="l00236"></a>00236     }
+<a name="l00237"></a>00237 
+<a name="l00238"></a>00238     <span class="comment">// And the inverse.</span>
+<a name="l00239"></a><a class="code" href="structr123_1_1Engine.html#a6104bf5ee89450403379d5680bfae172">00239</a>     <span class="keywordtype">void</span> <a class="code" href="structr123_1_1Engine.html#a6104bf5ee89450403379d5680bfae172">setcounter</a>(<span class="keyword">const</span> <a class="code" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a>& _c, <a class="code" href="structr123_1_1Engine.html#a8fb9eb1ab76ad9b5374a47cf84ecd306">elem_type</a> _elem){
+<a name="l00240"></a>00240         <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> nelem = <a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a>.size();
+<a name="l00241"></a>00241         <span class="keywordflow">if</span>( <a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a> > nelem )
+<a name="l00242"></a>00242             <span class="keywordflow">throw</span> std::range_error(<span class="stringliteral">"Engine::setcounter called  with elem out of range"</span>);
+<a name="l00243"></a>00243         <a class="code" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a> = _c;
+<a name="l00244"></a>00244         <a class="code" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a> = _elem;
+<a name="l00245"></a>00245         <a class="code" href="structr123_1_1Engine.html#aa7ad87d7238a0f820ee37640071dee7d">fix_invariant</a>();
+<a name="l00246"></a>00246     }
+<a name="l00247"></a>00247 };
+<a name="l00248"></a>00248 } <span class="comment">// namespace r123</span>
+<a name="l00249"></a>00249 
+<a name="l00250"></a>00250 <span class="preprocessor">#endif</span>
+</pre></div></div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/ExamplesREADME.html b/lib/Random123-1.08/docs/html/ExamplesREADME.html
new file mode 100644
index 0000000..3f3ee57
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/ExamplesREADME.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Examples, Tests and Benchmarks</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li class="current"><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Examples, Tests and Benchmarks </h1>  </div>
+</div>
+<div class="contents">
+<p>The examples/ directory contains tests, examples and timing harnesses for the components of the Random123 library.</p>
+<h2><a class="anchor" id="building"></a>
+Compiling and Running the code</h2>
+<p>Installing and using Random123 requires only the use of the header files, and has no prerequisites other than a reasonable C99 or C++98 compiler.</p>
+<p>With a modern GNU make (3.80 or newer), building and running the core tests and examples can be as easy as running gmake with no arguments. Note, though, that the provided examples/GNUmakefile intentionally avoids setting any of the standard make variables: CC, CXX, CPPFLAGS, CFLAGS, CXXFLAGS, TARGET_ARCH, LDFLAGS, LOADLIBES, LDLIBS. GNU make will inherit settings for these variables from the environment, or they may be set on the command line. If none are set, compilation will procee [...]
+<p>Before putting the Random123 library to use in an application, it is important to test it using the same compiler flags and features that the application will use. In other words, the conventional make variables should be set the same way when testing the library as they will be set when the library is actually compiled into your application. Something like: </p>
+<div class="fragment"><pre class="fragment">gmake CFLAGS=<span class="stringliteral">"-std=c99"</span> CXXFLAGS=<span class="stringliteral">"-std=c++0x"</span> CPPFLAGS=<span class="stringliteral">"/alternate/location/include -O3 -Wall -Wstrict-aliasing=2"</span> TARGET_ARCH=<span class="stringliteral">"-march=native"</span>
+</pre></div><p> would confirm that all is well with optimization on, and output targeted at an architecture with the same capabilities as the machine running the compilation.</p>
+<p>Very old versions of GNU make (pre-2002) or non-GNU make will not work with examples/GNUmakefile.. Lacking a suitably modern GNU make, our advice is to invoke the C or C++ compiler directly on the source files in the examples/ directory. The <a href="file:">file:</a> examples/BUILD.LOG contains a list of sample build commands. They will almost certainly need to be adapted to the target system. For Windows users, BUILDVC.BAT invokes the Microsoft Visual Studio compiler. Edit it as need [...]
+<h2><a class="anchor" id="tests"></a>
+Tests</h2>
+<p>It is recommended that Random123 be tested <b> on the target system, with the target compiler, intended optimization levels, options, target architectures, etc.</b> before relying it. The library uses architecture- and compiler-specific intrinsics, features and assembly language. We have seen cases where one compiler (open64 version 4.2.4) masquerades as another compiler (it defines __GNUC__) accepts extensions specific to the other compiler (__uint128_t) without error or warning, and [...]
+<h3><a class="anchor" id="kat"></a>
+Known Answer Tests</h3>
+<p>Testing that your compiled code computes the same "Known Answers" as the reference implementation which has been subjected to the Crush batteries of statistical tests is critically important.</p>
+<p>The file <code>examples/kat_vectors</code> contains a few thousand "Known Answer
+Test" vectors, i.e., tuples of (method, counter, key, answer). The source file katc.c is incorporated into kat_c.c (C), kat_cpp.cpp (C++), kat_cuda.cu (CUDA) and kat_opencl.c (OpenCL), which are compiled into kat_c, kat_cpp, kat_cuda and kat_opencl, respectively. Each of these will read kat_vectors and verify that the compiled code obtains the same "known answers".</p>
+<p>The kat vectors are not language-specific. Implementations of CBRNGs in other languages could also be validated against <code>kat_vectors</code>. The kat vectors are also byte-order independent. In other words, the CBRNGs in the library should produce the same numerical results on little-endian and big-endian hardware, but this behavior is largely untested.</p>
+<h3><a class="anchor" id="ut"></a>
+Unit Tests</h3>
+<p>examples/ also contains tests of specific components of the library. While not exhaustive, these tests verify that a variety of invariants are satisfied by the public methods (e.g., that incr(N) is the same as incr() N times). They also serve to verify some of the compile-time feature-test logic which, if incorrect can lead to mysterious errors (e.g., is it necessary to <code>include <smmintrin.h></code>). Unit tests include:</p>
+<ul>
+<li>
+ut_features - verifies compile-time feature-test logic. </li>
+<li>
+ut_carray - verifies the capabilities of the <a class="el" href="group__arrayNxW.html">r123arrayNxW</a> types. </li>
+<li>
+ut_M128 - verifies the capabilities of the <a class="el" href="structr123m128i.html">r123m128i</a> type (only when SSE2 is available). </li>
+<li>
+ut_ReinterpretCtr - verifies the <a class="el" href="structr123_1_1ReinterpretCtr.html">r123::ReinterpretCtr</a> wrapper template. </li>
+<li>
+ut_Engine - verifies the capabilities of the <a class="el" href="structr123_1_1Engine.html">r123::Engine</a> wrapper template. </li>
+<li>
+ut_aes - verifies that the <a class="el" href="group__AESNI.html">AESNI</a> cbrngs match known answers from FIPS-197. </li>
+<li>
+ut_gsl - tests the <a class="el" href="gsl__cbrng_8h.html#af561a004eef8e93cdfd6b255a8a1eb75">GSL_CBRNG</a> adapter <b>Requires the GNU Scientific Library</b>. </li>
+</ul>
+<h2><a class="anchor" id="examples"></a>
+Examples</h2>
+<h3><a class="anchor" id="simple"></a>
+Simple examples in C and C++</h3>
+<p>There are two extremely short examples that show all the code necessary to obtain and print a few random numbers in C and C++: </p>
+<ul>
+<li>
+simple.c </li>
+<li>
+simplepp.cpp </li>
+</ul>
+<h3><a class="anchor" id="generation"></a>
+Generation of uniformly distributed real values.</h3>
+<p>The uniformly distributed integers that the CBRNGs produce are rarely what is required by applications. Sampling other distributions is beyond the scope of Random123. Many distributions can be sampled with GSL (using <<a class="el" href="gsl__cbrng_8h.html">Random123/conventional/gsl_cbrng.h</a>> or with C++11's <random> (using <<a class="el" href="MicroURNG_8hpp.html">Random123/MicroURNG.hpp</a>> or <<a class="el" href="Engine_8hpp.html">Random123/conventional/En [...]
+<ul>
+<li>
+uniform.hpp </li>
+<li>
+u01fixedpt.h </li>
+</ul>
+<p>We encourage you to copy these header files and use them (or modify them) to suit your needs. They are not as thoroughly tested or as portable as the headers in the library itself, but they should be safe to use on any platform with IEEE-754 floating point support. They are documented in comments in the files themselves.</p>
+<h3><a class="anchor" id="pi"></a>
+Estimating pi using different APIs</h3>
+<p>Using random numbers to estimate pi is a classic example. The idea is to choose points at random in a square and to count how many of them lie within the inscribed circle. Since the area of the square is 4*r^2 and the area of the circle is pi*r^2, the ratio of the number of points in the circle to the total number of points should approach pi/4 as the number of points grows.</p>
+<p>We give several examples of pi estimation, each of which illustrates a slightly different API</p>
+<ul>
+<li>
+pi_capi - using only the basic C API </li>
+<li>
+pi_cppapi - using only the basic C++ API </li>
+<li>
+pi_u01 - using the C++ API and uniform.hpp </li>
+<li>
+pi_gsl - using a Random123 generator, but a gsl distribution to obtain real-valued random numbers. <b>Requires the GNU Scientific Library</b> </li>
+<li>
+pi_microurng - using a Random123 generator, but a C++0x <random> distribution to obtain real-valued random numbers </li>
+<li>
+pi_cuda - using the Random123 library with CUDA, runnable on an NVIDIA GPU </li>
+<li>
+pi_cudapp - using the C++ API with CUDA, runnable on an NVIDIA GPU </li>
+<li>
+pi_opencl - using the Random123 library with OpenCL, runnable on any OpenCL platform: e.g. NVIDIA or ATI GPUs or Intel or AMD CPUs. The actual compute kernel lives in the <code>pi_opencl_kernel.ocl</code> file and is transformed by <code>gencl.sh</code> into strings that get included in <code>pi_opencl.c</code>, since the OpenCL kernels get compiled for the target OpenCL platform at run-time </li>
+<li>
+pi_aes - uses the AESNI4x32 Random123 generator </li>
+</ul>
+<h2><a class="anchor" id="timers"></a>
+Measuring performance</h2>
+<p>We include some timing harnesses that can be used to measure the performance of these CBRNGs on various platforms. These timing harnesses report a cycles-per-byte (cpB) metric, which should be independent of clock-rate or number of cores, but depends on compilers and the architecture of the processor being run on. They also report aggregate throughput in GB/sec: a more direct measure of performance, but one that depends on clock speed and number of cores being used. The timing harness [...]
+<ul>
+<li>
+time_serial - uses the C API and reports performance for a single core. </li>
+<li>
+timers - uses the C++ API, and is the only tool that reports AESNI1xm128i and ARS1xm128i performance (if your CPU supports the AES-NI instruction extensions). </li>
+<li>
+time_thread - uses the C API and pthreads to report multithreaded performance, uses all cores available on the platform. </li>
+<li>
+time_cuda - uses the C API within NVIDIA CUDA to run on NVIDIA GPUs. </li>
+<li>
+time_opencl - uses the C API within OpenCL to run on GPUs or CPUs. </li>
+</ul>
+<p>time_serial, time_thread, time_cuda, time_opencl all use a common kernel defined in time_random123.h. They all use various util_* header files for utility functions and platform-related boilerplate (also used by the pi_* examples). </p>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/LICENSE.html b/lib/Random123-1.08/docs/html/LICENSE.html
new file mode 100644
index 0000000..db5282f
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/LICENSE.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: </title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li class="current"><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<p>Copyright 2010-2012, D. E. Shaw Research. All rights reserved.</p>
+<p>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p>
+<p>Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer.</p>
+<p>Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the following disclaimer in the documentation and/or other materials provided with the distribution.</p>
+<p>Neither the name of D. E. Shaw Research nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.</p>
+<p>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PR [...]
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/MicroURNG_8hpp.html b/lib/Random123-1.08/docs/html/MicroURNG_8hpp.html
new file mode 100644
index 0000000..da98471
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/MicroURNG_8hpp.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/MicroURNG.hpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> |
+<a href="#namespaces">Namespaces</a>  </div>
+  <div class="headertitle">
+<h1>Random123/MicroURNG.hpp File Reference</h1>  </div>
+</div>
+<div class="contents">
+<code>#include <stdexcept></code><br/>
+<code>#include <limits></code><br/>
+
+<p><a href="MicroURNG_8hpp_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></td></tr>
+<tr><td colspan="2"><h2><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html">r123</a></td></tr>
+</table>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/MicroURNG_8hpp_source.html b/lib/Random123-1.08/docs/html/MicroURNG_8hpp_source.html
new file mode 100644
index 0000000..1ee0ca0
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/MicroURNG_8hpp_source.html
@@ -0,0 +1,182 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/MicroURNG.hpp Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>Random123/MicroURNG.hpp</h1>  </div>
+</div>
+<div class="contents">
+<a href="MicroURNG_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">Copyright 2010-2011, D. E. Shaw Research.</span>
+<a name="l00003"></a>00003 <span class="comment">All rights reserved.</span>
+<a name="l00004"></a>00004 <span class="comment"></span>
+<a name="l00005"></a>00005 <span class="comment">Redistribution and use in source and binary forms, with or without</span>
+<a name="l00006"></a>00006 <span class="comment">modification, are permitted provided that the following conditions are</span>
+<a name="l00007"></a>00007 <span class="comment">met:</span>
+<a name="l00008"></a>00008 <span class="comment"></span>
+<a name="l00009"></a>00009 <span class="comment">* Redistributions of source code must retain the above copyright</span>
+<a name="l00010"></a>00010 <span class="comment">  notice, this list of conditions, and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"></span>
+<a name="l00012"></a>00012 <span class="comment">* Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00013"></a>00013 <span class="comment">  notice, this list of conditions, and the following disclaimer in the</span>
+<a name="l00014"></a>00014 <span class="comment">  documentation and/or other materials provided with the distribution.</span>
+<a name="l00015"></a>00015 <span class="comment"></span>
+<a name="l00016"></a>00016 <span class="comment">* Neither the name of D. E. Shaw Research nor the names of its</span>
+<a name="l00017"></a>00017 <span class="comment">  contributors may be used to endorse or promote products derived from</span>
+<a name="l00018"></a>00018 <span class="comment">  this software without specific prior written permission.</span>
+<a name="l00019"></a>00019 <span class="comment"></span>
+<a name="l00020"></a>00020 <span class="comment">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span>
+<a name="l00021"></a>00021 <span class="comment">"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span>
+<a name="l00022"></a>00022 <span class="comment">LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span>
+<a name="l00023"></a>00023 <span class="comment">A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span>
+<a name="l00024"></a>00024 <span class="comment">OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
+<a name="l00025"></a>00025 <span class="comment">SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span>
+<a name="l00026"></a>00026 <span class="comment">LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span>
+<a name="l00027"></a>00027 <span class="comment">DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span>
+<a name="l00028"></a>00028 <span class="comment">THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00029"></a>00029 <span class="comment">(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span>
+<a name="l00030"></a>00030 <span class="comment">OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00031"></a>00031 <span class="comment">*/</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#ifndef __MicroURNG_dot_hpp__</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#define __MicroURNG_dot_hpp__</span>
+<a name="l00034"></a>00034 <span class="preprocessor"></span>
+<a name="l00035"></a>00035 <span class="preprocessor">#include <stdexcept></span>
+<a name="l00036"></a>00036 <span class="preprocessor">#include <limits></span>
+<a name="l00037"></a>00037 
+<a name="l00038"></a>00038 <span class="keyword">namespace </span>r123{
+<a name="l00078"></a>00078 <span class="keyword">template</span><<span class="keyword">typename</span> CBRNG>
+<a name="l00079"></a><a class="code" href="classr123_1_1MicroURNG.html">00079</a> <span class="keyword">class </span><a class="code" href="classr123_1_1MicroURNG.html">MicroURNG</a>{
+<a name="l00080"></a>00080     <span class="comment">// According to C++0x, a URNG requires only a result_type,</span>
+<a name="l00081"></a>00081     <span class="comment">// operator()(), min() and max() methods.  Everything else</span>
+<a name="l00082"></a>00082     <span class="comment">// (ctr_type, key_type, reset() method, etc.) is "value added"</span>
+<a name="l00083"></a>00083     <span class="comment">// for the benefit of users that "know" that they're dealing with</span>
+<a name="l00084"></a>00084     <span class="comment">// a MicroURNG.</span>
+<a name="l00085"></a>00085 <span class="keyword">public</span>:
+<a name="l00086"></a><a class="code" href="classr123_1_1MicroURNG.html#ab0b3a77c9408dbcb2f9d6b5c67e9c3f7">00086</a>     <span class="keyword">typedef</span> CBRNG cbrng_type;
+<a name="l00087"></a><a class="code" href="classr123_1_1MicroURNG.html#ac55cddda8fe0808f922f39beee587b27">00087</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="classr123_1_1MicroURNG.html#ac55cddda8fe0808f922f39beee587b27">BITS</a> = 32;
+<a name="l00088"></a><a class="code" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">00088</a>     <span class="keyword">typedef</span> <span class="keyword">typename</span> cbrng_type::ctr_type ctr_type;
+<a name="l00089"></a><a class="code" href="classr123_1_1MicroURNG.html#aef90e6157f360434342ad0df4ce5f364">00089</a>     <span class="keyword">typedef</span> <span class="keyword">typename</span> cbrng_type::key_type key_type;
+<a name="l00090"></a><a class="code" href="classr123_1_1MicroURNG.html#a7e6fd93fec2fe138ee36b401ff376cfc">00090</a>     <span class="keyword">typedef</span> <span class="keyword">typename</span> cbrng_type::ukey_type ukey_type;
+<a name="l00091"></a><a class="code" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">00091</a>     <span class="keyword">typedef</span> <span class="keyword">typename</span> ctr_type::value_type result_type;
+<a name="l00092"></a>00092 
+<a name="l00093"></a>00093     R123_STATIC_ASSERT( std::numeric_limits<result_type>::digits >= <a class="code" href="classr123_1_1MicroURNG.html#ac55cddda8fe0808f922f39beee587b27">BITS</a>, <span class="stringliteral">"The result_type must have at least 32 bits"</span> );
+<a name="l00094"></a>00094 
+<a name="l00095"></a><a class="code" href="classr123_1_1MicroURNG.html#a64cd4d33b4cab5d3d9c556db68407b77">00095</a>     <a class="code" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> <a class="code" href="classr123_1_1MicroURNG.html#a64cd4d33b4cab5d3d9c556db68407b77">operator()</a>(){
+<a name="l00096"></a>00096         <span class="keywordflow">if</span>(last_elem == 0){
+<a name="l00097"></a>00097             <span class="comment">// jam n into the high bits of c</span>
+<a name="l00098"></a>00098             <span class="keyword">const</span> <span class="keywordtype">size_t</span> W = std::numeric_limits<result_type>::digits;
+<a name="l00099"></a>00099             <a class="code" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a> c = c0;
+<a name="l00100"></a>00100             c[c0.size()-1] |= n<<(W-<a class="code" href="classr123_1_1MicroURNG.html#ac55cddda8fe0808f922f39beee587b27">BITS</a>);
+<a name="l00101"></a>00101             rdata = b(c,k);
+<a name="l00102"></a>00102             n++;
+<a name="l00103"></a>00103             last_elem = rdata.size();
+<a name="l00104"></a>00104         }
+<a name="l00105"></a>00105         <span class="keywordflow">return</span> rdata[--last_elem];
+<a name="l00106"></a>00106     }
+<a name="l00107"></a><a class="code" href="classr123_1_1MicroURNG.html#a19afb80312c370e1670bf8afc73d802e">00107</a>     <a class="code" href="classr123_1_1MicroURNG.html#a19afb80312c370e1670bf8afc73d802e">MicroURNG</a>(<a class="code" href="classr123_1_1MicroURNG.html#ab0b3a77c9408dbcb2f9d6b5c67e9c3f7">cbrng_type</a> _b, <a class="code" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a> _c0, <a class="code" href="classr123_1_1MicroURNG.html#a7e6fd93fec2fe13 [...]
+<a name="l00108"></a>00108         chkhighbits();
+<a name="l00109"></a>00109     }
+<a name="l00110"></a><a class="code" href="classr123_1_1MicroURNG.html#a7ecf43819bc96804892a78c6715f587b">00110</a>     <a class="code" href="classr123_1_1MicroURNG.html#a7ecf43819bc96804892a78c6715f587b">MicroURNG</a>(<a class="code" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a> _c0, <a class="code" href="classr123_1_1MicroURNG.html#a7e6fd93fec2fe138ee36b401ff376cfc">ukey_type</a> _uk) : b(), c0(_c0), k(_uk), n(0), last_elem(0) {
+<a name="l00111"></a>00111         chkhighbits();
+<a name="l00112"></a>00112     }
+<a name="l00113"></a>00113 
+<a name="l00114"></a>00114     <span class="comment">// _Min and _Max work around a bug in the library shipped with MacOS Xcode 4.5.2.</span>
+<a name="l00115"></a>00115     <span class="comment">// See the commment in conventional/Engine.hpp.  </span>
+<a name="l00116"></a><a class="code" href="classr123_1_1MicroURNG.html#a1f2787f136a8a807d14eab8cb1ca8c14">00116</a>     <span class="keyword">const</span> <span class="keyword">static</span> <a class="code" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> <a class="code" href="classr123_1_1MicroURNG.html#a1f2787f136a8a807d14eab8cb1ca8c14">_Min</a> = 0;
+<a name="l00117"></a><a class="code" href="classr123_1_1MicroURNG.html#a4faecd7ab54c7678ee66c413bb984bf0">00117</a>     <span class="keyword">const</span> <span class="keyword">static</span> <a class="code" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> <a class="code" href="classr123_1_1MicroURNG.html#a4faecd7ab54c7678ee66c413bb984bf0">_Max</a> = ~((result_type)0);
+<a name="l00118"></a>00118 
+<a name="l00119"></a><a class="code" href="classr123_1_1MicroURNG.html#aa05c857c01053cf9185406d69757b101">00119</a>     <span class="keyword">static</span> R123_CONSTEXPR <a class="code" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> min <a class="code" href="classr123_1_1MicroURNG.html#aa05c857c01053cf9185406d69757b101">R123_NO_MACRO_SUBST</a> () { <span class="keywordflow">return</span> <a class="code" href="classr123_1_1MicroURNG.html#a1f2787f136a [...]
+<a name="l00120"></a><a class="code" href="classr123_1_1MicroURNG.html#a3af623b6366d6e848d67d72e4b0f363c">00120</a>     <span class="keyword">static</span> R123_CONSTEXPR <a class="code" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> max <a class="code" href="classr123_1_1MicroURNG.html#a3af623b6366d6e848d67d72e4b0f363c">R123_NO_MACRO_SUBST</a> () { <span class="keywordflow">return</span> <a class="code" href="classr123_1_1MicroURNG.html#a4faecd7ab54 [...]
+<a name="l00121"></a>00121     <span class="comment">// extra methods:</span>
+<a name="l00122"></a><a class="code" href="classr123_1_1MicroURNG.html#a30f52334b7cfcbe6d86870496ca57ea6">00122</a>     <span class="keyword">const</span> <a class="code" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a>& <a class="code" href="classr123_1_1MicroURNG.html#a30f52334b7cfcbe6d86870496ca57ea6">counter</a>()<span class="keyword"> const</span>{ <span class="keywordflow">return</span> c0; }
+<a name="l00123"></a><a class="code" href="classr123_1_1MicroURNG.html#add2f214254ddc2291e3b2c8b5dbe791a">00123</a>     <span class="keywordtype">void</span> <a class="code" href="classr123_1_1MicroURNG.html#add2f214254ddc2291e3b2c8b5dbe791a">reset</a>(<a class="code" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a> _c0, <a class="code" href="classr123_1_1MicroURNG.html#a7e6fd93fec2fe138ee36b401ff376cfc">ukey_type</a> _uk){
+<a name="l00124"></a>00124         c0 = _c0;
+<a name="l00125"></a>00125         chkhighbits();
+<a name="l00126"></a>00126         k = _uk;
+<a name="l00127"></a>00127         n = 0;
+<a name="l00128"></a>00128         last_elem = 0;
+<a name="l00129"></a>00129     }
+<a name="l00130"></a>00130 
+<a name="l00131"></a>00131 <span class="keyword">private</span>:
+<a name="l00132"></a>00132     <a class="code" href="classr123_1_1MicroURNG.html#ab0b3a77c9408dbcb2f9d6b5c67e9c3f7">cbrng_type</a> b;
+<a name="l00133"></a>00133     <a class="code" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a> c0;
+<a name="l00134"></a>00134     <a class="code" href="classr123_1_1MicroURNG.html#aef90e6157f360434342ad0df4ce5f364">key_type</a> k;
+<a name="l00135"></a>00135     R123_ULONG_LONG n;
+<a name="l00136"></a>00136     <span class="keywordtype">size_t</span> last_elem;
+<a name="l00137"></a>00137     <a class="code" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a> rdata;
+<a name="l00138"></a>00138     <span class="keywordtype">void</span> chkhighbits(){
+<a name="l00139"></a>00139         <a class="code" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> r = c0[c0.size()-1];
+<a name="l00140"></a>00140         <a class="code" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> mask = ((uint64_t)std::numeric_limits<result_type>::max <a class="code" href="classr123_1_1MicroURNG.html#aa05c857c01053cf9185406d69757b101">R123_NO_MACRO_SUBST</a> ())>><a class="code" href="classr123_1_1MicroURNG.html#ac55cddda8fe0808f922f39beee587b27">BITS</a>;
+<a name="l00141"></a>00141         <span class="keywordflow">if</span>((r&mask) != r)
+<a name="l00142"></a>00142             <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"MicroURNG: c0, does not have high bits clear"</span>);
+<a name="l00143"></a>00143     }
+<a name="l00144"></a>00144 };
+<a name="l00145"></a>00145 } <span class="comment">// namespace r123</span>
+<a name="l00146"></a>00146 <span class="preprocessor">#endif</span>
+</pre></div></div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/README.html b/lib/Random123-1.08/docs/html/README.html
new file mode 100644
index 0000000..3838ad1
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/README.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: examples/README File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>examples/README File Reference</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+</table>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/ReinterpretCtr_8hpp.html b/lib/Random123-1.08/docs/html/ReinterpretCtr_8hpp.html
new file mode 100644
index 0000000..8f3ffed
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/ReinterpretCtr_8hpp.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/ReinterpretCtr.hpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> |
+<a href="#namespaces">Namespaces</a>  </div>
+  <div class="headertitle">
+<h1>Random123/ReinterpretCtr.hpp File Reference</h1>  </div>
+</div>
+<div class="contents">
+<code>#include "<a class="el" href="compilerfeatures_8h_source.html">features/compilerfeatures.h</a>"</code><br/>
+<code>#include <cstring></code><br/>
+
+<p><a href="ReinterpretCtr_8hpp_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ReinterpretCtr.html">r123::ReinterpretCtr< ToType, CBRNG ></a></td></tr>
+<tr><td colspan="2"><h2><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html">r123</a></td></tr>
+</table>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/ReinterpretCtr_8hpp_source.html b/lib/Random123-1.08/docs/html/ReinterpretCtr_8hpp_source.html
new file mode 100644
index 0000000..3708f91
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/ReinterpretCtr_8hpp_source.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/ReinterpretCtr.hpp Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>Random123/ReinterpretCtr.hpp</h1>  </div>
+</div>
+<div class="contents">
+<a href="ReinterpretCtr_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">Copyright 2010-2011, D. E. Shaw Research.</span>
+<a name="l00003"></a>00003 <span class="comment">All rights reserved.</span>
+<a name="l00004"></a>00004 <span class="comment"></span>
+<a name="l00005"></a>00005 <span class="comment">Redistribution and use in source and binary forms, with or without</span>
+<a name="l00006"></a>00006 <span class="comment">modification, are permitted provided that the following conditions are</span>
+<a name="l00007"></a>00007 <span class="comment">met:</span>
+<a name="l00008"></a>00008 <span class="comment"></span>
+<a name="l00009"></a>00009 <span class="comment">* Redistributions of source code must retain the above copyright</span>
+<a name="l00010"></a>00010 <span class="comment">  notice, this list of conditions, and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"></span>
+<a name="l00012"></a>00012 <span class="comment">* Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00013"></a>00013 <span class="comment">  notice, this list of conditions, and the following disclaimer in the</span>
+<a name="l00014"></a>00014 <span class="comment">  documentation and/or other materials provided with the distribution.</span>
+<a name="l00015"></a>00015 <span class="comment"></span>
+<a name="l00016"></a>00016 <span class="comment">* Neither the name of D. E. Shaw Research nor the names of its</span>
+<a name="l00017"></a>00017 <span class="comment">  contributors may be used to endorse or promote products derived from</span>
+<a name="l00018"></a>00018 <span class="comment">  this software without specific prior written permission.</span>
+<a name="l00019"></a>00019 <span class="comment"></span>
+<a name="l00020"></a>00020 <span class="comment">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span>
+<a name="l00021"></a>00021 <span class="comment">"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span>
+<a name="l00022"></a>00022 <span class="comment">LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span>
+<a name="l00023"></a>00023 <span class="comment">A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span>
+<a name="l00024"></a>00024 <span class="comment">OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
+<a name="l00025"></a>00025 <span class="comment">SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span>
+<a name="l00026"></a>00026 <span class="comment">LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span>
+<a name="l00027"></a>00027 <span class="comment">DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span>
+<a name="l00028"></a>00028 <span class="comment">THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00029"></a>00029 <span class="comment">(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span>
+<a name="l00030"></a>00030 <span class="comment">OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00031"></a>00031 <span class="comment">*/</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#ifndef __ReinterpretCtr_dot_hpp__</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#define __ReinterpretCtr_dot_hpp__</span>
+<a name="l00034"></a>00034 <span class="preprocessor"></span>
+<a name="l00035"></a>00035 <span class="preprocessor">#include "<a class="code" href="compilerfeatures_8h.html">features/compilerfeatures.h</a>"</span>
+<a name="l00036"></a>00036 <span class="preprocessor">#include <cstring></span>
+<a name="l00037"></a>00037 
+<a name="l00038"></a>00038 <span class="keyword">namespace </span>r123{
+<a name="l00053"></a>00053 <span class="keyword">template</span> <<span class="keyword">typename</span> ToType, <span class="keyword">typename</span> CBRNG>
+<a name="l00054"></a><a class="code" href="structr123_1_1ReinterpretCtr.html">00054</a> <span class="keyword">struct </span><a class="code" href="structr123_1_1ReinterpretCtr.html">ReinterpretCtr</a>{
+<a name="l00055"></a><a class="code" href="structr123_1_1ReinterpretCtr.html#a26cf9e933b35411c37070c948085ba02">00055</a>     <span class="keyword">typedef</span> ToType ctr_type;
+<a name="l00056"></a><a class="code" href="structr123_1_1ReinterpretCtr.html#a470b21676ed709aa9d9ad524a67410f1">00056</a>     <span class="keyword">typedef</span> <span class="keyword">typename</span> CBRNG::key_type key_type;
+<a name="l00057"></a><a class="code" href="structr123_1_1ReinterpretCtr.html#ae0accaee618b5eb28a24acd516b3a4c6">00057</a>     <span class="keyword">typedef</span> <span class="keyword">typename</span> CBRNG::ctr_type bctype;
+<a name="l00058"></a><a class="code" href="structr123_1_1ReinterpretCtr.html#a4b0b69c1aa58d62bb22e51e16c586bee">00058</a>     <span class="keyword">typedef</span> <span class="keyword">typename</span> CBRNG::ukey_type ukey_type;
+<a name="l00059"></a>00059     R123_STATIC_ASSERT(<span class="keyword">sizeof</span>(ToType) == <span class="keyword">sizeof</span>(<a class="code" href="structr123_1_1ReinterpretCtr.html#ae0accaee618b5eb28a24acd516b3a4c6">bctype</a>) && <span class="keyword">sizeof</span>(<span class="keyword">typename</span> bctype::value_type) != 16, 
+<a name="l00060"></a>00060                        <span class="stringliteral">"ReinterpretCtr:  sizeof(ToType) is not the same as sizeof(CBRNG::ctr_type) or CBRNG::ctr_type::value_type looks like it might be __m128i"</span>);
+<a name="l00061"></a>00061     <span class="comment">// It's amazingly difficult to safely do conversions with __m128i.</span>
+<a name="l00062"></a>00062     <span class="comment">// If we use the operator() implementation below with a CBRNG</span>
+<a name="l00063"></a>00063     <span class="comment">// whose ctr_type is r123array1xm128i, gcc4.6 optimizes away the</span>
+<a name="l00064"></a>00064     <span class="comment">// memcpys, inlines the operator()(c,k), and produces assembly</span>
+<a name="l00065"></a>00065     <span class="comment">// language that ends with an aesenclast instruction with a</span>
+<a name="l00066"></a>00066     <span class="comment">// destination operand pointing to an unaligned memory address ...</span>
+<a name="l00067"></a>00067     <span class="comment">// Segfault!  See:  http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50444</span>
+<a name="l00068"></a>00068     <span class="comment">// MSVC also produces code that crashes.  We suspect a</span>
+<a name="l00069"></a>00069     <span class="comment">// similar mechanism but haven't done the debugging necessary to</span>
+<a name="l00070"></a>00070     <span class="comment">// be sure.  We were able to 'fix' gcc4.6 by making bc a mutable</span>
+<a name="l00071"></a>00071     <span class="comment">// data member rather than declaring it in the scope of</span>
+<a name="l00072"></a>00072     <span class="comment">// operator().  That didn't fix the MSVC problems, though.</span>
+<a name="l00073"></a>00073     <span class="comment">//</span>
+<a name="l00074"></a>00074     <span class="comment">// Conclusion - don't touch __m128i, at least for now.  The</span>
+<a name="l00075"></a>00075     <span class="comment">// easiest (but highly imprecise) way to do that is the static</span>
+<a name="l00076"></a>00076     <span class="comment">// assertion above that rejects bctype::value_types of size 16. -</span>
+<a name="l00077"></a>00077     <span class="comment">// Sep 2011.</span>
+<a name="l00078"></a><a class="code" href="structr123_1_1ReinterpretCtr.html#a91edc5103397372cc5509ad17c0fc83a">00078</a>     <a class="code" href="structr123_1_1ReinterpretCtr.html#a26cf9e933b35411c37070c948085ba02">ctr_type</a>  <a class="code" href="structr123_1_1ReinterpretCtr.html#a91edc5103397372cc5509ad17c0fc83a">operator()</a>(<a class="code" href="structr123_1_1ReinterpretCtr.html#a26cf9e933b35411c37070c948085ba02">ctr_type</a> c, <a class="code" href="structr123_1_1ReinterpretC [...]
+<a name="l00079"></a>00079         <a class="code" href="structr123_1_1ReinterpretCtr.html#ae0accaee618b5eb28a24acd516b3a4c6">bctype</a> bc;
+<a name="l00080"></a>00080         std::memcpy(&bc, &c, <span class="keyword">sizeof</span>(c));
+<a name="l00081"></a>00081         CBRNG b;
+<a name="l00082"></a>00082         bc = b(bc, k);
+<a name="l00083"></a>00083         std::memcpy(&c, &bc, <span class="keyword">sizeof</span>(bc));
+<a name="l00084"></a>00084         <span class="keywordflow">return</span> c;
+<a name="l00085"></a>00085     }
+<a name="l00086"></a>00086 };
+<a name="l00087"></a>00087 } <span class="comment">// namespace r123</span>
+<a name="l00088"></a>00088 <span class="preprocessor">#endif</span>
+</pre></div></div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/Release_01Notes.html b/lib/Random123-1.08/docs/html/Release_01Notes.html
new file mode 100644
index 0000000..eb06a07
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/Release_01Notes.html
@@ -0,0 +1,198 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: </title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li class="current"><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+<dl>
+<dt>1.08 - Aug 20, 2013  </dt>
+<dd><ul>
+<li>
+Fix a bug in threefry2xW whereby rotation constants were chosen incorrectly after the 20th round. There is no reason to suspect that the incorrectly chosen rotation constants were "bad" or "deficient" so there is no reason to suspect the quality of the random numbers produced. Using threefry with R>20 would have been rare in any case. The fix simply makes the implementation correspond correctly to the description in the paper. </li>
+<li>
+Add examples/uniform.hpp, examples/boxmuller.hpp and examples/ua.hpp, containing example code to generate uniformly and gaussian distributed floats and doubles. Also add unit tests (ut_uniform.cpp, ut_uniform_IEEEkat.cpp) and timing harnesses (time_boxmuller.cpp and time_boxmuller_cuda.cpp). </li>
+<li>
+Demote u01.h from the include/Random123/ to examples/ufixed01.h, but examples/uniform.hpp is preferred. </li>
+<li>
+Add kat_vectors for threefry2xW_32 and threefry4xW_72, i.e., the largest number of supported rounds in each case. </li>
+<li>
+Mention ukey on the first page of docs. </li>
+<li>
+Fix typos in documentation and comments and in gccfeatures.h. </li>
+<li>
+Don't include <x86intrin.h> unless (defined(__x86_64__)||defined(__i386__)). </li>
+<li>
+Use __clang__ rather than __llvm__ in the predicate that decides whether to include clangfeatures.h. </li>
+<li>
+Add support for Portland Group compilers. </li>
+<li>
+Add support for gcc and IBM XL compilers on powerpc64, e.g. BlueGene/Q. </li>
+<li>
+Refuse to build with CUDA before 4.1 to avoid namespace bug. </li>
+</ul>
+<p class="enddd"></p>
+</dd>
+<dt>1.07 - Nov 7, 2012  </dt>
+<dd><ul>
+<li>
+Provide const static data members: _Min and _Max in Engine and MicroURNG, which work around a non-standard requirement imposed by the MacOS Xcode 4.5.2 <random> library. </li>
+<li>
+Fine-grained test macros for specific features of C++11 rather than an all-or-none USE_CXX0X macro. Features tested: constexpr, unrestricted unions, explicit conversions, <random> and <type_traits>. </li>
+<li>
+Declare max() and min() methods with the R123_CONSTEXPR attribute in Engine and MicroURNG. </li>
+<li>
+Improved clang support </li>
+<li>
+Works with Solaris Sun CC now (requires -library=stlport4) </li>
+<li>
+NVIDIA GTX6x0 should report correct core count </li>
+<li>
+ut_features prints the list of features that compile on the build platform </li>
+<li>
+Compiles cleanly with -Wall -Wextra (implying -Wunused-parameter -Wsign-compare) </li>
+</ul>
+<p class="enddd"></p>
+</dd>
+<dt>1.06 - Apr 5, 2012  </dt>
+<dd><ul>
+<li>
+Added a known answer test for the u01 functions (kat_u01). </li>
+<li>
+Defend headers against possible max and min macros in "system" header files. </li>
+</ul>
+<p class="enddd"></p>
+</dd>
+<dt>1.05 - Mar 20, 2012 </dt>
+<dd><ul>
+<li>
+MicroURNG and GSL_MICROURNG no longer give the programmer control over the number bits in the internal counter via a template or macro argument. Such flexibility is too easy to misuse, with the possible consequence of repeating random values. Now, all MicroURNGs have a period in excess of 2^32, and MicroURNG<CBRNG>(c1, k1) and MicroURNG<CBRNG>(c2, k2) "collide" if and only if c1==c2 and k1==k2. </li>
+<li>
+Added <Random123/u01.h> header file with static functions for conversion of integers to uniformly distributed floating point values. </li>
+<li>
+Make operator<<(ostream&, const r123array&) and operator>>(ostream&, r123array&) inline. This should work around ODR violations when the header files are included in more than one file in a project. </li>
+<li>
+Recognize that icpc has an _mm_set_epi64x intrinsic as of version 12.1. </li>
+<li>
+The gsl adapters always return 32-bits of random data, regardless of the width of counter type. </li>
+<li>
+Works around lack of anonymous enums in Intel OpenCL 1.5 </li>
+<li>
+gencl.sh works on MacOS and systems with "classic" BSD indent. </li>
+<li>
+Tests run on AMD Radeon 7970 (Tahiti). </li>
+</ul>
+<p></p>
+<p class="enddd"></p>
+</dd>
+<dt>1.04 - Dec 5, 2011</dt>
+<dd><ul>
+<li>
+new kat_vectors - there are now three tests for each tested generator: gen(ctr=0, key=0), gen(ctr=fff, key=0xfff), and gen(ctr=digits-of-pi, key=more-digits-of-pi). There are fewer tests overall, but they provide better coverage, especially of non-zero keys. </li>
+</ul>
+<p class="enddd"></p>
+</dd>
+<dt>1.03 - Nov 30, 2011</dt>
+<dd><ul>
+<li>
+overhaul known answer tests (kat) <ul>
+<li>
+common source for serial C, C++, cuda and opencl replaces katc and katpp  </li>
+<li>
+add missing kat_vectors for threefry2x32  </li>
+</ul>
+</li>
+<li>
+make keyinit functions device/kernel functions in CUDA/OpenCL  </li>
+<li>
+replace r123array::assemble methods with r123array::seed(SeedSeq) template  </li>
+<li>
+cleanup of signatures of Engine and MicroURNG methods: <ul>
+<li>
+Engine(ukey_type&) and MicroURNG(ctr_type, ukey_type) constructors. </li>
+<li>
+Engine(SeedSeq&) takes a reference argument, and, when C++0x <type_traits> are available the SeedSeq templates don't participate in "surprising" overloads.  </li>
+</ul>
+</li>
+</ul>
+<p class="enddd"></p>
+</dd>
+<dt>1.02 - Nov 21, 2011</dt>
+<dd><ul>
+<li>
+<b> BUG FIXED </b> in threefry2xW_R(R<20, ...). Earlier implementations of threefry2x32_R and threfry2x64_R produced incorrect results when called with the number of rounds less than 20. The bug caused extra work to be done in every call, possibly resulting in <em>more</em> mixing than the correct implementation delivers. Both old (buggy, more mixing) and new (bug-fixed, less mixing) implementations have been rechecked and are fully "Crush-Resistant".  </li>
+<li>
+worked around problems with argument marshalling in version 2.4 of the AMDAPPSDK OpenCL implementation </li>
+</ul>
+<p class="enddd"></p>
+</dd>
+<dt>1.01 - Nov 11, 2011</dt>
+<dd><ul>
+<li>
+allow the user to define __STDC_CONSTANT_MACROS </li>
+<li>
+allow r123arrayNxW::incr(larger_than_largest_value_type) </li>
+</ul>
+<p class="enddd"></p>
+</dd>
+<dt>1.00 - Sep 26, 2011</dt>
+<dd>Initial release </dd>
+</dl>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/aes_8h.html b/lib/Random123-1.08/docs/html/aes_8h.html
new file mode 100644
index 0000000..8be4d04
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/aes_8h.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/aes.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> |
+<a href="#namespaces">Namespaces</a> |
+<a href="#define-members">Defines</a> |
+<a href="#typedef-members">Typedefs</a> |
+<a href="#enum-members">Enumerations</a> |
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<h1>Random123/aes.h File Reference</h1>  </div>
+</div>
+<div class="contents">
+<code>#include "<a class="el" href="compilerfeatures_8h_source.html">features/compilerfeatures.h</a>"</code><br/>
+<code>#include "<a class="el" href="array_8h_source.html">array.h</a>"</code><br/>
+
+<p><a href="aes_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI1xm128i.html">r123::AESNI1xm128i</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI4x32.html">r123::AESNI4x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI1xm128i__R.html">r123::AESNI1xm128i_R< ROUNDS ></a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI4x32__R.html">r123::AESNI4x32_R< ROUNDS ></a></td></tr>
+<tr><td colspan="2"><h2><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html">r123</a></td></tr>
+<tr><td colspan="2"><h2><a name="define-members"></a>
+Defines</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="aes_8h.html#a0e4c28ad2773dac7eb59004947c9e02b">aesni4x32_rounds</a>   aesni1xm128i_rounds</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gae3950c524818b49d1cdfad481880a33a">aesni4x32</a>(c, k)   aesni4x32_R(aesni4x32_rounds, c, k)</td></tr>
+<tr><td colspan="2"><h2><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gaab0f809a22e01e6cb6135f6af73bb532">aesni1xm128i_ctr_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gaf4fa221e6387d0454e2e6399245bdead">aesni1xm128i_ukey_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gac2c3248ec3b03591d442cf634fb51af5">aesni4x32_ukey_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gae7459b3f4ee0e424cb4f13b4d5efc1fe">aesni4x32_ctr_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga6d88accdcfa339b48e14021a572e269b">aesni4x32_key_t</a></td></tr>
+<tr><td colspan="2"><h2><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga2814629101926e23001d564630ba7b86">r123_enum_aesni1xm128i</a> { <a class="el" href="group__AESNI.html#gga2814629101926e23001d564630ba7b86a2c404c51fea10eeacb032081dbab2408">aesni1xm128i_rounds</a> =  10
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga1557a9d6e95543a3c4ca9082a4c14b0d">r123_enum_aesni4x32</a> { <a class="el" href="group__AESNI.html#gga1557a9d6e95543a3c4ca9082a4c14b0dad65178990d928071f958bf2413ebdb4b">aesni4x32_rounds</a> =  10
+ }</td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga3ba5daca2d4d076ece24900084e71311">aesni1xm128i</a> (<a class="el" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> in, <a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga89d9042c08ae5eef4c98bfb9609ebd34">aesni1xm128i_R</a> (unsigned R, <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> in, <a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structaesni1xm128i__key__t.html">aesni4x32_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga2aa21ba4a3d3850faa96e7834114d8e1">aesni4x32keyinit</a> (<a class="el" href="structr123array4x32.html">aesni4x32_ukey_t</a> uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array4x32.html">aesni4x32_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gae28b030e9786a6f36a47df8f211a750b">aesni4x32_R</a> (unsigned int Nrounds, <a class="el" href="structr123array4x32.html">aesni4x32_ctr_t</a> c, <a class="el" href="structaesni1xm128i__key__t.html">aesni4x32_key_t</a> k)</td></tr>
+</table>
+<hr/><h2>Define Documentation</h2>
+<a class="anchor" id="a0e4c28ad2773dac7eb59004947c9e02b"></a><!-- doxytag: member="aes.h::aesni4x32_rounds" ref="a0e4c28ad2773dac7eb59004947c9e02b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define aesni4x32_rounds   aesni1xm128i_rounds</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/aes_8h_source.html b/lib/Random123-1.08/docs/html/aes_8h_source.html
new file mode 100644
index 0000000..ebce8c6
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/aes_8h_source.html
@@ -0,0 +1,364 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/aes.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>Random123/aes.h</h1>  </div>
+</div>
+<div class="contents">
+<a href="aes_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">Copyright 2010-2011, D. E. Shaw Research.</span>
+<a name="l00003"></a>00003 <span class="comment">All rights reserved.</span>
+<a name="l00004"></a>00004 <span class="comment"></span>
+<a name="l00005"></a>00005 <span class="comment">Redistribution and use in source and binary forms, with or without</span>
+<a name="l00006"></a>00006 <span class="comment">modification, are permitted provided that the following conditions are</span>
+<a name="l00007"></a>00007 <span class="comment">met:</span>
+<a name="l00008"></a>00008 <span class="comment"></span>
+<a name="l00009"></a>00009 <span class="comment">* Redistributions of source code must retain the above copyright</span>
+<a name="l00010"></a>00010 <span class="comment">  notice, this list of conditions, and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"></span>
+<a name="l00012"></a>00012 <span class="comment">* Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00013"></a>00013 <span class="comment">  notice, this list of conditions, and the following disclaimer in the</span>
+<a name="l00014"></a>00014 <span class="comment">  documentation and/or other materials provided with the distribution.</span>
+<a name="l00015"></a>00015 <span class="comment"></span>
+<a name="l00016"></a>00016 <span class="comment">* Neither the name of D. E. Shaw Research nor the names of its</span>
+<a name="l00017"></a>00017 <span class="comment">  contributors may be used to endorse or promote products derived from</span>
+<a name="l00018"></a>00018 <span class="comment">  this software without specific prior written permission.</span>
+<a name="l00019"></a>00019 <span class="comment"></span>
+<a name="l00020"></a>00020 <span class="comment">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span>
+<a name="l00021"></a>00021 <span class="comment">"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span>
+<a name="l00022"></a>00022 <span class="comment">LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span>
+<a name="l00023"></a>00023 <span class="comment">A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span>
+<a name="l00024"></a>00024 <span class="comment">OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
+<a name="l00025"></a>00025 <span class="comment">SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span>
+<a name="l00026"></a>00026 <span class="comment">LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span>
+<a name="l00027"></a>00027 <span class="comment">DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span>
+<a name="l00028"></a>00028 <span class="comment">THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00029"></a>00029 <span class="comment">(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span>
+<a name="l00030"></a>00030 <span class="comment">OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00031"></a>00031 <span class="comment">*/</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#ifndef __Random123_aes_dot_hpp__</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#define __Random123_aes_dot_hpp__</span>
+<a name="l00034"></a>00034 <span class="preprocessor"></span>
+<a name="l00035"></a>00035 <span class="preprocessor">#include "<a class="code" href="compilerfeatures_8h.html">features/compilerfeatures.h</a>"</span>
+<a name="l00036"></a>00036 <span class="preprocessor">#include "<a class="code" href="array_8h.html">array.h</a>"</span>
+<a name="l00037"></a>00037 
+<a name="l00038"></a>00038 <span class="comment">/* Implement a bona fide AES block cipher.  It's minimally</span>
+<a name="l00039"></a>00039 <span class="comment">// checked against the test vector in FIPS-197 in ut_aes.cpp. */</span>
+<a name="l00040"></a>00040 <span class="preprocessor">#if R123_USE_AES_NI</span>
+<a name="l00041"></a>00041 <span class="preprocessor"></span>
+<a name="l00043"></a><a class="code" href="group__AESNI.html#gaab0f809a22e01e6cb6135f6af73bb532">00043</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structr123array1xm128i.html">r123array1xm128i</a> <a class="code" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a>;
+<a name="l00045"></a><a class="code" href="group__AESNI.html#gaf4fa221e6387d0454e2e6399245bdead">00045</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structr123array1xm128i.html">r123array1xm128i</a> <a class="code" href="structr123array1xm128i.html">aesni1xm128i_ukey_t</a>;
+<a name="l00047"></a><a class="code" href="group__AESNI.html#gac2c3248ec3b03591d442cf634fb51af5">00047</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structr123array4x32.html">r123array4x32</a> <a class="code" href="structr123array4x32.html">aesni4x32_ukey_t</a>;
+<a name="l00049"></a><a class="code" href="group__AESNI.html#ga2814629101926e23001d564630ba7b86">00049</a> <span class="keyword">enum</span> <a class="code" href="group__AESNI.html#ga2814629101926e23001d564630ba7b86">r123_enum_aesni1xm128i</a> { <a class="code" href="group__AESNI.html#gga2814629101926e23001d564630ba7b86a2c404c51fea10eeacb032081dbab2408">aesni1xm128i_rounds</a> = 10 };
+<a name="l00050"></a>00050 
+<a name="l00052"></a>00052 R123_STATIC_INLINE __m128i AES_128_ASSIST (__m128i temp1, __m128i temp2) { 
+<a name="l00053"></a>00053     __m128i temp3; 
+<a name="l00054"></a>00054     temp2 = _mm_shuffle_epi32 (temp2 ,0xff); 
+<a name="l00055"></a>00055     temp3 = _mm_slli_si128 (temp1, 0x4);
+<a name="l00056"></a>00056     temp1 = _mm_xor_si128 (temp1, temp3);
+<a name="l00057"></a>00057     temp3 = _mm_slli_si128 (temp3, 0x4);
+<a name="l00058"></a>00058     temp1 = _mm_xor_si128 (temp1, temp3);
+<a name="l00059"></a>00059     temp3 = _mm_slli_si128 (temp3, 0x4);
+<a name="l00060"></a>00060     temp1 = _mm_xor_si128 (temp1, temp3);
+<a name="l00061"></a>00061     temp1 = _mm_xor_si128 (temp1, temp2); 
+<a name="l00062"></a>00062     <span class="keywordflow">return</span> temp1; 
+<a name="l00063"></a>00063 }
+<a name="l00064"></a>00064 
+<a name="l00065"></a>00065 R123_STATIC_INLINE <span class="keywordtype">void</span> aesni1xm128iexpand(<a class="code" href="structr123array1xm128i.html">aesni1xm128i_ukey_t</a> uk, __m128i ret[11])
+<a name="l00066"></a>00066 {
+<a name="l00067"></a>00067     __m128i rkey = uk.<a class="code" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a>[0].<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a>;
+<a name="l00068"></a>00068     __m128i tmp2;
+<a name="l00069"></a>00069 
+<a name="l00070"></a>00070     ret[0] = rkey;
+<a name="l00071"></a>00071     tmp2 = _mm_aeskeygenassist_si128(rkey, 0x1);
+<a name="l00072"></a>00072     rkey = AES_128_ASSIST(rkey, tmp2);
+<a name="l00073"></a>00073     ret[1] = rkey;
+<a name="l00074"></a>00074 
+<a name="l00075"></a>00075     tmp2 = _mm_aeskeygenassist_si128(rkey, 0x2);
+<a name="l00076"></a>00076     rkey = AES_128_ASSIST(rkey, tmp2);
+<a name="l00077"></a>00077     ret[2] = rkey;
+<a name="l00078"></a>00078 
+<a name="l00079"></a>00079     tmp2 = _mm_aeskeygenassist_si128(rkey, 0x4);
+<a name="l00080"></a>00080     rkey = AES_128_ASSIST(rkey, tmp2);
+<a name="l00081"></a>00081     ret[3] = rkey;
+<a name="l00082"></a>00082 
+<a name="l00083"></a>00083     tmp2 = _mm_aeskeygenassist_si128(rkey, 0x8);
+<a name="l00084"></a>00084     rkey = AES_128_ASSIST(rkey, tmp2);
+<a name="l00085"></a>00085     ret[4] = rkey;
+<a name="l00086"></a>00086 
+<a name="l00087"></a>00087     tmp2 = _mm_aeskeygenassist_si128(rkey, 0x10);
+<a name="l00088"></a>00088     rkey = AES_128_ASSIST(rkey, tmp2);
+<a name="l00089"></a>00089     ret[5] = rkey;
+<a name="l00090"></a>00090 
+<a name="l00091"></a>00091     tmp2 = _mm_aeskeygenassist_si128(rkey, 0x20);
+<a name="l00092"></a>00092     rkey = AES_128_ASSIST(rkey, tmp2);
+<a name="l00093"></a>00093     ret[6] = rkey;
+<a name="l00094"></a>00094 
+<a name="l00095"></a>00095     tmp2 = _mm_aeskeygenassist_si128(rkey, 0x40);
+<a name="l00096"></a>00096     rkey = AES_128_ASSIST(rkey, tmp2);
+<a name="l00097"></a>00097     ret[7] = rkey;
+<a name="l00098"></a>00098 
+<a name="l00099"></a>00099     tmp2 = _mm_aeskeygenassist_si128(rkey, 0x80);
+<a name="l00100"></a>00100     rkey = AES_128_ASSIST(rkey, tmp2);
+<a name="l00101"></a>00101     ret[8] = rkey;
+<a name="l00102"></a>00102 
+<a name="l00103"></a>00103     tmp2 = _mm_aeskeygenassist_si128(rkey, 0x1b);
+<a name="l00104"></a>00104     rkey = AES_128_ASSIST(rkey, tmp2);
+<a name="l00105"></a>00105     ret[9] = rkey;
+<a name="l00106"></a>00106 
+<a name="l00107"></a>00107     tmp2 = _mm_aeskeygenassist_si128(rkey, 0x36);
+<a name="l00108"></a>00108     rkey = AES_128_ASSIST(rkey, tmp2);
+<a name="l00109"></a>00109     ret[10] = rkey;
+<a name="l00110"></a>00110 }
+<a name="l00113"></a>00113 <span class="preprocessor">#ifdef __cplusplus</span>
+<a name="l00114"></a>00114 <span class="preprocessor"></span>
+<a name="l00115"></a><a class="code" href="structaesni1xm128i__key__t.html">00115</a> <span class="keyword">struct </span><a class="code" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a>{ 
+<a name="l00116"></a><a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">00116</a>     __m128i <a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>[11]; 
+<a name="l00117"></a><a class="code" href="structaesni1xm128i__key__t.html#af1002e5b771616db8f12c793fc994c41">00117</a>     <a class="code" href="structaesni1xm128i__key__t.html#af1002e5b771616db8f12c793fc994c41">aesni1xm128i_key_t</a>(){
+<a name="l00118"></a>00118         <a class="code" href="structr123array1xm128i.html">aesni1xm128i_ukey_t</a> uk;
+<a name="l00119"></a>00119         uk.<a class="code" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a>[0].<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a> = _mm_setzero_si128();
+<a name="l00120"></a>00120         aesni1xm128iexpand(uk, <a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>);
+<a name="l00121"></a>00121     }
+<a name="l00122"></a><a class="code" href="structaesni1xm128i__key__t.html#a2076072522f671a8596a831cc93dc616">00122</a>     <a class="code" href="structaesni1xm128i__key__t.html#a2076072522f671a8596a831cc93dc616">aesni1xm128i_key_t</a>(<span class="keyword">const</span> <a class="code" href="structr123array1xm128i.html">aesni1xm128i_ukey_t</a>& uk){
+<a name="l00123"></a>00123         aesni1xm128iexpand(uk, <a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>);
+<a name="l00124"></a>00124     }
+<a name="l00125"></a><a class="code" href="structaesni1xm128i__key__t.html#a43d53407125d4cec0d6a14586c0357e3">00125</a>     <a class="code" href="structaesni1xm128i__key__t.html#a43d53407125d4cec0d6a14586c0357e3">aesni1xm128i_key_t</a>(<span class="keyword">const</span> <a class="code" href="structr123array4x32.html">aesni4x32_ukey_t</a>& uk){
+<a name="l00126"></a>00126         <a class="code" href="structr123array1xm128i.html">aesni1xm128i_ukey_t</a> uk128;
+<a name="l00127"></a>00127         uk128.<a class="code" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a>[0].<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a> = _mm_set_epi32(uk.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a>[3], uk.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a>[2], uk.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b [...]
+<a name="l00128"></a>00128         aesni1xm128iexpand(uk128, <a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>);
+<a name="l00129"></a>00129     }
+<a name="l00130"></a><a class="code" href="structaesni1xm128i__key__t.html#acb24fef68c539f1a6ea217ee8ada185d">00130</a>     <a class="code" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a>& <a class="code" href="structaesni1xm128i__key__t.html#acb24fef68c539f1a6ea217ee8ada185d">operator=</a>(<span class="keyword">const</span> <a class="code" href="structr123array1xm128i.html">aesni1xm128i_ukey_t</a>& uk){
+<a name="l00131"></a>00131         aesni1xm128iexpand(uk, <a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>);
+<a name="l00132"></a>00132         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00133"></a>00133     }
+<a name="l00134"></a><a class="code" href="structaesni1xm128i__key__t.html#a0290dac35d6f14706247217fb49bcd60">00134</a>     <a class="code" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a>& <a class="code" href="structaesni1xm128i__key__t.html#a0290dac35d6f14706247217fb49bcd60">operator=</a>(<span class="keyword">const</span> <a class="code" href="structr123array4x32.html">aesni4x32_ukey_t</a>& uk){
+<a name="l00135"></a>00135         <a class="code" href="structr123array1xm128i.html">aesni1xm128i_ukey_t</a> uk128;
+<a name="l00136"></a>00136         uk128.<a class="code" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a>[0].<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a> = _mm_set_epi32(uk.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a>[3], uk.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a>[2], uk.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b [...]
+<a name="l00137"></a>00137         aesni1xm128iexpand(uk128, <a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>);
+<a name="l00138"></a>00138         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00139"></a>00139     }
+<a name="l00140"></a>00140 };
+<a name="l00141"></a>00141 <span class="preprocessor">#else</span>
+<a name="l00142"></a>00142 <span class="preprocessor"></span><span class="keyword">typedef</span> <span class="keyword">struct </span>{ 
+<a name="l00143"></a>00143     __m128i k[11]; 
+<a name="l00144"></a>00144 }<a class="code" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a>;
+<a name="l00145"></a>00145 
+<a name="l00147"></a>00147 R123_STATIC_INLINE <a class="code" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> aesni1xm128ikeyinit(<a class="code" href="structr123array1xm128i.html">aesni1xm128i_ukey_t</a> uk){
+<a name="l00148"></a>00148     <a class="code" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> ret;
+<a name="l00149"></a>00149     aesni1xm128iexpand(uk, ret.<a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>);
+<a name="l00150"></a>00150     <span class="keywordflow">return</span> ret;
+<a name="l00151"></a>00151 }
+<a name="l00152"></a>00152 <span class="preprocessor">#endif</span>
+<a name="l00153"></a>00153 <span class="preprocessor"></span>
+<a name="l00155"></a><a class="code" href="group__AESNI.html#ga3ba5daca2d4d076ece24900084e71311">00155</a> R123_STATIC_INLINE <a class="code" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> <a class="code" href="group__AESNI.html#ga3ba5daca2d4d076ece24900084e71311">aesni1xm128i</a>(<a class="code" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> in, <a class="code" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> k) {
+<a name="l00156"></a>00156     __m128i x = _mm_xor_si128(k.<a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>[0], in.<a class="code" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a>[0].<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a>);
+<a name="l00157"></a>00157     x = _mm_aesenc_si128(x, k.<a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>[1]);
+<a name="l00158"></a>00158     x = _mm_aesenc_si128(x, k.<a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>[2]);
+<a name="l00159"></a>00159     x = _mm_aesenc_si128(x, k.<a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>[3]);
+<a name="l00160"></a>00160     x = _mm_aesenc_si128(x, k.<a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>[4]);
+<a name="l00161"></a>00161     x = _mm_aesenc_si128(x, k.<a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>[5]);
+<a name="l00162"></a>00162     x = _mm_aesenc_si128(x, k.<a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>[6]);
+<a name="l00163"></a>00163     x = _mm_aesenc_si128(x, k.<a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>[7]);
+<a name="l00164"></a>00164     x = _mm_aesenc_si128(x, k.<a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>[8]);
+<a name="l00165"></a>00165     x = _mm_aesenc_si128(x, k.<a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>[9]);
+<a name="l00166"></a>00166     x = _mm_aesenclast_si128(x, k.<a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>[10]);
+<a name="l00167"></a>00167     {
+<a name="l00168"></a>00168       <a class="code" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> ret;
+<a name="l00169"></a>00169       ret.<a class="code" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a>[0].<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a> = x;
+<a name="l00170"></a>00170       <span class="keywordflow">return</span> ret;
+<a name="l00171"></a>00171     }
+<a name="l00172"></a>00172 }
+<a name="l00173"></a>00173 
+<a name="l00175"></a><a class="code" href="group__AESNI.html#ga89d9042c08ae5eef4c98bfb9609ebd34">00175</a> R123_STATIC_INLINE <a class="code" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> <a class="code" href="group__AESNI.html#ga89d9042c08ae5eef4c98bfb9609ebd34">aesni1xm128i_R</a>(<span class="keywordtype">unsigned</span> R, <a class="code" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> in, <a class="code" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> k){
+<a name="l00176"></a>00176     R123_ASSERT(R==10);
+<a name="l00177"></a>00177     <span class="keywordflow">return</span> <a class="code" href="group__AESNI.html#ga3ba5daca2d4d076ece24900084e71311">aesni1xm128i</a>(in, k);
+<a name="l00178"></a>00178 }
+<a name="l00179"></a>00179 
+<a name="l00180"></a>00180 
+<a name="l00182"></a><a class="code" href="group__AESNI.html#gae7459b3f4ee0e424cb4f13b4d5efc1fe">00182</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structr123array4x32.html">r123array4x32</a> <a class="code" href="structr123array4x32.html">aesni4x32_ctr_t</a>;
+<a name="l00184"></a><a class="code" href="group__AESNI.html#ga6d88accdcfa339b48e14021a572e269b">00184</a> <span class="keyword">typedef</span> <a class="code" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> <a class="code" href="structaesni1xm128i__key__t.html">aesni4x32_key_t</a>;
+<a name="l00186"></a><a class="code" href="group__AESNI.html#ga1557a9d6e95543a3c4ca9082a4c14b0d">00186</a> <span class="keyword">enum</span> <a class="code" href="group__AESNI.html#ga1557a9d6e95543a3c4ca9082a4c14b0d">r123_enum_aesni4x32</a> { <a class="code" href="aes_8h.html#a0e4c28ad2773dac7eb59004947c9e02b">aesni4x32_rounds</a> = 10 };
+<a name="l00188"></a><a class="code" href="group__AESNI.html#ga2aa21ba4a3d3850faa96e7834114d8e1">00188</a> R123_STATIC_INLINE <a class="code" href="structaesni1xm128i__key__t.html">aesni4x32_key_t</a> <a class="code" href="group__AESNI.html#ga2aa21ba4a3d3850faa96e7834114d8e1">aesni4x32keyinit</a>(<a class="code" href="structr123array4x32.html">aesni4x32_ukey_t</a> uk){
+<a name="l00189"></a>00189     <a class="code" href="structr123array1xm128i.html">aesni1xm128i_ukey_t</a> uk128;
+<a name="l00190"></a>00190     <a class="code" href="structaesni1xm128i__key__t.html">aesni4x32_key_t</a> ret;
+<a name="l00191"></a>00191     uk128.<a class="code" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a>[0].<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a> = _mm_set_epi32(uk.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a>[3], uk.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a>[2], uk.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211f [...]
+<a name="l00192"></a>00192     aesni1xm128iexpand(uk128, ret.<a class="code" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a>);
+<a name="l00193"></a>00193     <span class="keywordflow">return</span> ret;
+<a name="l00194"></a>00194 }
+<a name="l00195"></a>00195 
+<a name="l00198"></a><a class="code" href="group__AESNI.html#gae28b030e9786a6f36a47df8f211a750b">00198</a> R123_STATIC_INLINE <a class="code" href="structr123array4x32.html">aesni4x32_ctr_t</a> <a class="code" href="group__AESNI.html#gae28b030e9786a6f36a47df8f211a750b">aesni4x32_R</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Nrounds, <a class="code" href="structr123array4x32.html">aesni4x32_ctr_t</a> c, <a class="code" href="structaesni1xm128i__key__ [...]
+<a name="l00199"></a>00199     <a class="code" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> c128;
+<a name="l00200"></a>00200     c128.<a class="code" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a>[0].<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a> = _mm_set_epi32(c.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a>[3], c.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a>[2], c.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa [...]
+<a name="l00201"></a>00201     c128 = <a class="code" href="group__AESNI.html#ga89d9042c08ae5eef4c98bfb9609ebd34">aesni1xm128i_R</a>(Nrounds, c128, k);
+<a name="l00202"></a>00202     _mm_storeu_si128((__m128i*)&c.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a>[0], c128.<a class="code" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a>[0].<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a>);
+<a name="l00203"></a>00203     <span class="keywordflow">return</span> c;
+<a name="l00204"></a>00204 }
+<a name="l00205"></a>00205 
+<a name="l00206"></a><a class="code" href="aes_8h.html#a0e4c28ad2773dac7eb59004947c9e02b">00206</a> <span class="preprocessor">#define aesni4x32_rounds aesni1xm128i_rounds</span>
+<a name="l00207"></a>00207 <span class="preprocessor"></span>
+<a name="l00210"></a><a class="code" href="group__AESNI.html#gae3950c524818b49d1cdfad481880a33a">00210</a> <span class="preprocessor">#define aesni4x32(c,k) aesni4x32_R(aesni4x32_rounds, c, k)</span>
+<a name="l00211"></a>00211 <span class="preprocessor"></span>
+<a name="l00212"></a>00212 <span class="preprocessor">#ifdef __cplusplus</span>
+<a name="l00213"></a><a class="code" href="namespacer123.html">00213</a> <span class="preprocessor"></span><span class="keyword">namespace </span>r123{
+<a name="l00245"></a><a class="code" href="structr123_1_1AESNI1xm128i.html">00245</a> <span class="keyword">struct </span><a class="code" href="structr123_1_1AESNI1xm128i.html">AESNI1xm128i</a>{
+<a name="l00246"></a><a class="code" href="structr123_1_1AESNI1xm128i.html#aaa136c21db9806859fa7cd4e2dbaaaa6">00246</a>     <span class="keyword">typedef</span> <a class="code" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> <a class="code" href="structr123array1xm128i.html">ctr_type</a>;
+<a name="l00247"></a><a class="code" href="structr123_1_1AESNI1xm128i.html#a1f405533da84d98b938030190a63cec5">00247</a>     <span class="keyword">typedef</span> <a class="code" href="structr123array1xm128i.html">aesni1xm128i_ukey_t</a> <a class="code" href="structr123array1xm128i.html">ukey_type</a>;
+<a name="l00248"></a><a class="code" href="structr123_1_1AESNI1xm128i.html#a7dc33fd5abf509d9d16b571b23867a6b">00248</a>     <span class="keyword">typedef</span> <a class="code" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> <a class="code" href="structaesni1xm128i__key__t.html">key_type</a>;
+<a name="l00249"></a><a class="code" href="structr123_1_1AESNI1xm128i.html#a1b5a44afde814ba844d8f5442e2a3a5f">00249</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structr123_1_1AESNI1xm128i.html#a1b5a44afde814ba844d8f5442e2a3a5f">rounds</a>=10;
+<a name="l00250"></a><a class="code" href="structr123_1_1AESNI1xm128i.html#a9bff0ac8478400c1006136e9bde91dc3">00250</a>     <a class="code" href="structr123array1xm128i.html">ctr_type</a> <a class="code" href="structr123_1_1AESNI1xm128i.html#a9bff0ac8478400c1006136e9bde91dc3">operator()</a>(<a class="code" href="structr123array1xm128i.html">ctr_type</a> ctr, <a class="code" href="structaesni1xm128i__key__t.html">key_type</a> key)<span class="keyword"> const</span>{
+<a name="l00251"></a>00251         <span class="keywordflow">return</span> <a class="code" href="group__AESNI.html#ga3ba5daca2d4d076ece24900084e71311">aesni1xm128i</a>(ctr, key);
+<a name="l00252"></a>00252     }
+<a name="l00253"></a>00253 };
+<a name="l00254"></a>00254 
+<a name="l00255"></a>00255 <span class="comment">/* @class AESNI4x32 */</span>
+<a name="l00256"></a><a class="code" href="structr123_1_1AESNI4x32.html">00256</a> <span class="keyword">struct </span><a class="code" href="structr123_1_1AESNI4x32.html">AESNI4x32</a>{
+<a name="l00257"></a><a class="code" href="structr123_1_1AESNI4x32.html#ab8a1f8a822eecfc9e587bad76792df32">00257</a>     <span class="keyword">typedef</span> <a class="code" href="structr123array4x32.html">aesni4x32_ctr_t</a> <a class="code" href="structr123array4x32.html">ctr_type</a>;
+<a name="l00258"></a><a class="code" href="structr123_1_1AESNI4x32.html#a3fbb6113e70575dce3b6047a22a751f4">00258</a>     <span class="keyword">typedef</span> <a class="code" href="structr123array4x32.html">aesni4x32_ukey_t</a> <a class="code" href="structr123array4x32.html">ukey_type</a>;
+<a name="l00259"></a><a class="code" href="structr123_1_1AESNI4x32.html#a3f47cb319d03ede5fd557800b618d28a">00259</a>     <span class="keyword">typedef</span> <a class="code" href="structaesni1xm128i__key__t.html">aesni4x32_key_t</a> <a class="code" href="structaesni1xm128i__key__t.html">key_type</a>;
+<a name="l00260"></a><a class="code" href="structr123_1_1AESNI4x32.html#a725aad79b8d496d97bed24390f624be6">00260</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structr123_1_1AESNI4x32.html#a725aad79b8d496d97bed24390f624be6">rounds</a>=10;
+<a name="l00261"></a><a class="code" href="structr123_1_1AESNI4x32.html#a981102e5bc0a7df916a95a40af8fd4c0">00261</a>     <a class="code" href="structr123array4x32.html">ctr_type</a> <a class="code" href="structr123_1_1AESNI4x32.html#a981102e5bc0a7df916a95a40af8fd4c0">operator()</a>(<a class="code" href="structr123array4x32.html">ctr_type</a> ctr, <a class="code" href="structaesni1xm128i__key__t.html">key_type</a> key)<span class="keyword"> const</span>{
+<a name="l00262"></a>00262         <span class="keywordflow">return</span> <a class="code" href="group__AESNI.html#gae3950c524818b49d1cdfad481880a33a">aesni4x32</a>(ctr, key);
+<a name="l00263"></a>00263     }
+<a name="l00264"></a>00264 };
+<a name="l00265"></a>00265 
+<a name="l00271"></a>00271 <span class="keyword">template</span> <<span class="keywordtype">unsigned</span> ROUNDS=10> 
+<a name="l00272"></a><a class="code" href="structr123_1_1AESNI1xm128i__R.html">00272</a> <span class="keyword">struct </span><a class="code" href="structr123_1_1AESNI1xm128i__R.html">AESNI1xm128i_R</a> : <span class="keyword">public</span> <a class="code" href="structr123_1_1AESNI1xm128i.html">AESNI1xm128i</a>{
+<a name="l00273"></a>00273     R123_STATIC_ASSERT(ROUNDS==10, <span class="stringliteral">"AESNI1xm128i_R<R> is only valid with R=10"</span>);
+<a name="l00274"></a>00274 };
+<a name="l00275"></a>00275 
+<a name="l00277"></a>00277 <span class="keyword">template</span> <<span class="keywordtype">unsigned</span> ROUNDS=10> 
+<a name="l00278"></a><a class="code" href="structr123_1_1AESNI4x32__R.html">00278</a> <span class="keyword">struct </span><a class="code" href="structr123_1_1AESNI4x32__R.html">AESNI4x32_R</a> : <span class="keyword">public</span> <a class="code" href="structr123_1_1AESNI4x32.html">AESNI4x32</a>{
+<a name="l00279"></a>00279     R123_STATIC_ASSERT(ROUNDS==10, <span class="stringliteral">"AESNI4x32_R<R> is only valid with R=10"</span>);
+<a name="l00280"></a>00280 };
+<a name="l00281"></a>00281 } <span class="comment">// namespace r123</span>
+<a name="l00282"></a>00282 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
+<a name="l00283"></a>00283 
+<a name="l00284"></a>00284 <span class="preprocessor">#endif </span><span class="comment">/* R123_USE_AES_NI */</span>
+<a name="l00285"></a>00285 
+<a name="l00286"></a>00286 <span class="preprocessor">#if R123_USE_AES_OPENSSL</span>
+<a name="l00287"></a>00287 <span class="preprocessor"></span><span class="preprocessor">#include <openssl/aes.h></span>
+<a name="l00288"></a>00288 <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structr123array16x8.html">r123array16x8</a> aesopenssl16x8_ctr_t;
+<a name="l00289"></a>00289 <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structr123array16x8.html">r123array16x8</a> aesopenssl16x8_ukey_t;
+<a name="l00290"></a>00290 <span class="preprocessor">#ifdef __cplusplus</span>
+<a name="l00291"></a>00291 <span class="preprocessor"></span><span class="keyword">struct </span>aesopenssl16x8_key_t{
+<a name="l00292"></a>00292     AES_KEY k;
+<a name="l00293"></a>00293     aesopenssl16x8_key_t(){
+<a name="l00294"></a>00294         aesopenssl16x8_ukey_t ukey={{}};
+<a name="l00295"></a>00295         AES_set_encrypt_key((<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)&ukey.v[0], 128, &k);
+<a name="l00296"></a>00296     }
+<a name="l00297"></a>00297     aesopenssl16x8_key_t(<span class="keyword">const</span> aesopenssl16x8_ukey_t& ukey){
+<a name="l00298"></a>00298         AES_set_encrypt_key((<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)&ukey.v[0], 128, &k);
+<a name="l00299"></a>00299     }
+<a name="l00300"></a>00300     aesopenssl16x8_key_t& operator=(<span class="keyword">const</span> aesopenssl16x8_ukey_t& ukey){
+<a name="l00301"></a>00301         AES_set_encrypt_key((<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)&ukey.v[0], 128, &k);
+<a name="l00302"></a>00302         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00303"></a>00303     }
+<a name="l00304"></a>00304 };
+<a name="l00305"></a>00305 <span class="preprocessor">#else</span>
+<a name="l00306"></a>00306 <span class="preprocessor"></span><span class="keyword">typedef</span> <span class="keyword">struct </span>aesopenssl16x8_key_t{
+<a name="l00307"></a>00307     AES_KEY k;
+<a name="l00308"></a>00308 }aesopenssl16x8_key_t;
+<a name="l00309"></a>00309 R123_STATIC_INLINE <span class="keyword">struct </span>aesopenssl16x8_key_t aesopenssl16x8keyinit(aesopenssl16x8_ukey_t uk){
+<a name="l00310"></a>00310     aesopenssl16x8_key_t ret;
+<a name="l00311"></a>00311     AES_set_encrypt_key((<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)&uk.v[0], 128, &ret.k);
+<a name="l00312"></a>00312     <span class="keywordflow">return</span> ret;
+<a name="l00313"></a>00313 }
+<a name="l00314"></a>00314 <span class="preprocessor">#endif</span>
+<a name="l00315"></a>00315 <span class="preprocessor"></span>
+<a name="l00316"></a>00316 R123_STATIC_INLINE R123_FORCE_INLINE(aesopenssl16x8_ctr_t aesopenssl16x8_R(aesopenssl16x8_ctr_t ctr, aesopenssl16x8_key_t key));
+<a name="l00317"></a>00317 R123_STATIC_INLINE
+<a name="l00318"></a>00318 aesopenssl16x8_ctr_t aesopenssl16x8_R(aesopenssl16x8_ctr_t ctr, aesopenssl16x8_key_t key){
+<a name="l00319"></a>00319     aesopenssl16x8_ctr_t ret;
+<a name="l00320"></a>00320     AES_encrypt((<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*)&ctr.v[0], (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)&ret.v[0], &key.k);
+<a name="l00321"></a>00321     <span class="keywordflow">return</span> ret;
+<a name="l00322"></a>00322 }
+<a name="l00323"></a>00323 
+<a name="l00324"></a>00324 <span class="preprocessor">#define aesopenssl16x8_rounds aesni4x32_rounds</span>
+<a name="l00325"></a>00325 <span class="preprocessor"></span><span class="preprocessor">#define aesopenssl16x8(c,k) aesopenssl16x8_R(aesopenssl16x8_rounds)</span>
+<a name="l00326"></a>00326 <span class="preprocessor"></span>
+<a name="l00327"></a>00327 <span class="preprocessor">#ifdef __cplusplus</span>
+<a name="l00328"></a>00328 <span class="preprocessor"></span><span class="keyword">namespace </span>r123{
+<a name="l00329"></a>00329 <span class="keyword">struct </span>AESOpenSSL16x8{
+<a name="l00330"></a>00330     <span class="keyword">typedef</span> aesopenssl16x8_ctr_t ctr_type;
+<a name="l00331"></a>00331     <span class="keyword">typedef</span> aesopenssl16x8_key_t key_type;
+<a name="l00332"></a>00332     <span class="keyword">typedef</span> aesopenssl16x8_ukey_t ukey_type;
+<a name="l00333"></a>00333     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> rounds=10;
+<a name="l00334"></a>00334     ctr_type operator()(<span class="keyword">const</span> ctr_type& in, <span class="keyword">const</span> key_type& k){
+<a name="l00335"></a>00335         ctr_type out;
+<a name="l00336"></a>00336         AES_encrypt((<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)&in[0], (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)&out[0], &k.k);
+<a name="l00337"></a>00337         <span class="keywordflow">return</span> out;
+<a name="l00338"></a>00338     }
+<a name="l00339"></a>00339 };
+<a name="l00340"></a>00340 } <span class="comment">// namespace r123</span>
+<a name="l00341"></a>00341 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
+<a name="l00342"></a>00342 <span class="preprocessor">#endif </span><span class="comment">/* R123_USE_AES_OPENSSL */</span>
+<a name="l00343"></a>00343 
+<a name="l00344"></a>00344 <span class="preprocessor">#endif</span>
+</pre></div></div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/annotated.html b/lib/Random123-1.08/docs/html/annotated.html
new file mode 100644
index 0000000..41ea69a
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/annotated.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Class List</h1>  </div>
+</div>
+<div class="contents">
+Here are the classes, structs, unions and interfaces with brief descriptions:<table>
+  <tr><td class="indexkey"><a class="el" href="structr123_1_1AESNI1xm128i.html">r123::AESNI1xm128i</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123_1_1AESNI1xm128i__R.html">r123::AESNI1xm128i_R< ROUNDS ></a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123_1_1AESNI4x32.html">r123::AESNI4x32</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123_1_1AESNI4x32__R.html">r123::AESNI4x32_R< ROUNDS ></a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i_R< ROUNDS ></a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R< ROUNDS ></a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32_R< ROUNDS ></a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64_R< ROUNDS ></a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32_R< ROUNDS ></a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64_R< ROUNDS ></a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123m128i.html">r123m128i</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123_1_1ReinterpretCtr.html">r123::ReinterpretCtr< ToType, CBRNG ></a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32_R< R ></a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64_R< R ></a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32_R< R ></a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64_R< R ></a></td><td class="indexvalue"></td></tr>
+</table>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/array_8h.html b/lib/Random123-1.08/docs/html/array_8h.html
new file mode 100644
index 0000000..99ab613
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/array_8h.html
@@ -0,0 +1,647 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/array.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> |
+<a href="#namespaces">Namespaces</a> |
+<a href="#define-members">Defines</a> |
+<a href="#typedef-members">Typedefs</a> |
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<h1>Random123/array.h File Reference</h1>  </div>
+</div>
+<div class="contents">
+<code>#include "<a class="el" href="compilerfeatures_8h_source.html">features/compilerfeatures.h</a>"</code><br/>
+<code>#include "<a class="el" href="sse_8h_source.html">features/sse.h</a>"</code><br/>
+<code>#include <stddef.h></code><br/>
+<code>#include <algorithm></code><br/>
+<code>#include <stdexcept></code><br/>
+<code>#include <iterator></code><br/>
+<code>#include <limits></code><br/>
+<code>#include <iostream></code><br/>
+
+<p><a href="array_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html">r123array1x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html">r123array2x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html">r123array4x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html">r123array8x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html">r123array1x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html">r123array2x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html">r123array4x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html">r123array16x8</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td></tr>
+<tr><td colspan="2"><h2><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html">r123</a></td></tr>
+<tr><td colspan="2"><h2><a name="define-members"></a>
+Defines</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a9b64205709c0daaea3b05bbf7ea5a322">R123_W</a>(a)   (8*sizeof(((a *)0)->v[0]))</td></tr>
+<tr><td colspan="2"><h2><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array1x32.html">r123array1x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#acc1b0ed919ef806de26f5ff5b934b313">r123::Array1x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x32.html">r123array2x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#ab853ac55f8188e4a09d12ab23f2d8dea">r123::Array2x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#a0c352c3ea265e7fd182559e557113195">r123::Array4x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array8x32.html">r123array8x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#aea31cf23efbfcc11808b7e394922f4d2">r123::Array8x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array1x64.html">r123array1x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#aeb81c4265759fad9993e09fda21ff4fa">r123::Array1x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x64.html">r123array2x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#ad3b670563762f605a6fce61b5bab8412">r123::Array2x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x64.html">r123array4x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#a54c1a72670974c11acff37279eb23147">r123::Array4x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array16x8.html">r123array16x8</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#ac3148aed79e81051d40e9b29a8914cf4">r123::Array16x8</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#adbb729a97ee41e7cb075058b55a58c5d">r123::Array1xm128i</a></td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::ostream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#af29a19da89789058ead246fdef153ce0">operator<<</a> (std::ostream &os, const <a class="el" href="structr123array1x32.html">r123array1x32</a> &a)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::istream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#ace3112deae6709884feac904b1c260a1">operator>></a> (std::istream &is, <a class="el" href="structr123array1x32.html">r123array1x32</a> &a)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::ostream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a9c1f24a8b73925bc24a5acf09fd4e305">operator<<</a> (std::ostream &os, const <a class="el" href="structr123array2x32.html">r123array2x32</a> &a)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::istream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a41bb2d7e99cf51ca5927a074d1424a03">operator>></a> (std::istream &is, <a class="el" href="structr123array2x32.html">r123array2x32</a> &a)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::ostream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#ab2b41774a3888c0bc9697fd79383eae4">operator<<</a> (std::ostream &os, const <a class="el" href="structr123array4x32.html">r123array4x32</a> &a)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::istream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a2782402f8b3941e104e01c317fd4b099">operator>></a> (std::istream &is, <a class="el" href="structr123array4x32.html">r123array4x32</a> &a)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::ostream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a8339351efe6ba804aacd3d97632e2bdf">operator<<</a> (std::ostream &os, const <a class="el" href="structr123array8x32.html">r123array8x32</a> &a)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::istream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#ae63a28cc2f1e69f63a4402c8b83663b4">operator>></a> (std::istream &is, <a class="el" href="structr123array8x32.html">r123array8x32</a> &a)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::ostream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#ae87e390bd8c0cadc74bd08dfffd0101f">operator<<</a> (std::ostream &os, const <a class="el" href="structr123array1x64.html">r123array1x64</a> &a)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::istream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a3cdf7b897463996d6eda01443dd669c5">operator>></a> (std::istream &is, <a class="el" href="structr123array1x64.html">r123array1x64</a> &a)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::ostream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a06634d010d5cde0afe278031c7597cc3">operator<<</a> (std::ostream &os, const <a class="el" href="structr123array2x64.html">r123array2x64</a> &a)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::istream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a7b32dd7601d0a11b72583a841abc8fca">operator>></a> (std::istream &is, <a class="el" href="structr123array2x64.html">r123array2x64</a> &a)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::ostream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#acff68189292ea886eed0f24b5146566d">operator<<</a> (std::ostream &os, const <a class="el" href="structr123array4x64.html">r123array4x64</a> &a)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::istream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a60aa3cdbb34ced56c0c7c82371f2b30c">operator>></a> (std::istream &is, <a class="el" href="structr123array4x64.html">r123array4x64</a> &a)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::ostream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a8b82ce828fcb9bb530870dd2919975e9">operator<<</a> (std::ostream &os, const <a class="el" href="structr123array16x8.html">r123array16x8</a> &a)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::istream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#abb64305331045d211dfa35be0d0cc6a9">operator>></a> (std::istream &is, <a class="el" href="structr123array16x8.html">r123array16x8</a> &a)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::ostream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#af4437aa49ff7855c60ca4ddacf2e48e5">operator<<</a> (std::ostream &os, const <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> &a)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::istream & </td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#af831caf1f33e800dad6a659523525a78">operator>></a> (std::istream &is, <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> &a)</td></tr>
+</table>
+<hr/><h2>Define Documentation</h2>
+<a class="anchor" id="a9b64205709c0daaea3b05bbf7ea5a322"></a><!-- doxytag: member="array.h::R123_W" ref="a9b64205709c0daaea3b05bbf7ea5a322" args="(a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define R123_W</td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname">a</td>
+          <td> ) </td>
+          <td>   (8*sizeof(((a *)0)->v[0]))</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="af29a19da89789058ead246fdef153ce0"></a><!-- doxytag: member="array.h::operator<<" ref="af29a19da89789058ead246fdef153ce0" args="(std::ostream &os, const r123array1x32 &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::ostream& operator<< </td>
+          <td>(</td>
+          <td class="paramtype">std::ostream & </td>
+          <td class="paramname"> <em>os</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123array1x32.html">r123array1x32</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab2b41774a3888c0bc9697fd79383eae4"></a><!-- doxytag: member="array.h::operator<<" ref="ab2b41774a3888c0bc9697fd79383eae4" args="(std::ostream &os, const r123array4x32 &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::ostream& operator<< </td>
+          <td>(</td>
+          <td class="paramtype">std::ostream & </td>
+          <td class="paramname"> <em>os</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123array4x32.html">r123array4x32</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae87e390bd8c0cadc74bd08dfffd0101f"></a><!-- doxytag: member="array.h::operator<<" ref="ae87e390bd8c0cadc74bd08dfffd0101f" args="(std::ostream &os, const r123array1x64 &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::ostream& operator<< </td>
+          <td>(</td>
+          <td class="paramtype">std::ostream & </td>
+          <td class="paramname"> <em>os</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123array1x64.html">r123array1x64</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af4437aa49ff7855c60ca4ddacf2e48e5"></a><!-- doxytag: member="array.h::operator<<" ref="af4437aa49ff7855c60ca4ddacf2e48e5" args="(std::ostream &os, const r123array1xm128i &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::ostream& operator<< </td>
+          <td>(</td>
+          <td class="paramtype">std::ostream & </td>
+          <td class="paramname"> <em>os</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8b82ce828fcb9bb530870dd2919975e9"></a><!-- doxytag: member="array.h::operator<<" ref="a8b82ce828fcb9bb530870dd2919975e9" args="(std::ostream &os, const r123array16x8 &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::ostream& operator<< </td>
+          <td>(</td>
+          <td class="paramtype">std::ostream & </td>
+          <td class="paramname"> <em>os</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123array16x8.html">r123array16x8</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a06634d010d5cde0afe278031c7597cc3"></a><!-- doxytag: member="array.h::operator<<" ref="a06634d010d5cde0afe278031c7597cc3" args="(std::ostream &os, const r123array2x64 &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::ostream& operator<< </td>
+          <td>(</td>
+          <td class="paramtype">std::ostream & </td>
+          <td class="paramname"> <em>os</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123array2x64.html">r123array2x64</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9c1f24a8b73925bc24a5acf09fd4e305"></a><!-- doxytag: member="array.h::operator<<" ref="a9c1f24a8b73925bc24a5acf09fd4e305" args="(std::ostream &os, const r123array2x32 &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::ostream& operator<< </td>
+          <td>(</td>
+          <td class="paramtype">std::ostream & </td>
+          <td class="paramname"> <em>os</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123array2x32.html">r123array2x32</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acff68189292ea886eed0f24b5146566d"></a><!-- doxytag: member="array.h::operator<<" ref="acff68189292ea886eed0f24b5146566d" args="(std::ostream &os, const r123array4x64 &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::ostream& operator<< </td>
+          <td>(</td>
+          <td class="paramtype">std::ostream & </td>
+          <td class="paramname"> <em>os</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123array4x64.html">r123array4x64</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8339351efe6ba804aacd3d97632e2bdf"></a><!-- doxytag: member="array.h::operator<<" ref="a8339351efe6ba804aacd3d97632e2bdf" args="(std::ostream &os, const r123array8x32 &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::ostream& operator<< </td>
+          <td>(</td>
+          <td class="paramtype">std::ostream & </td>
+          <td class="paramname"> <em>os</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123array8x32.html">r123array8x32</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3cdf7b897463996d6eda01443dd669c5"></a><!-- doxytag: member="array.h::operator>>" ref="a3cdf7b897463996d6eda01443dd669c5" args="(std::istream &is, r123array1x64 &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::istream& operator>> </td>
+          <td>(</td>
+          <td class="paramtype">std::istream & </td>
+          <td class="paramname"> <em>is</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array1x64.html">r123array1x64</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a41bb2d7e99cf51ca5927a074d1424a03"></a><!-- doxytag: member="array.h::operator>>" ref="a41bb2d7e99cf51ca5927a074d1424a03" args="(std::istream &is, r123array2x32 &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::istream& operator>> </td>
+          <td>(</td>
+          <td class="paramtype">std::istream & </td>
+          <td class="paramname"> <em>is</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html">r123array2x32</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af831caf1f33e800dad6a659523525a78"></a><!-- doxytag: member="array.h::operator>>" ref="af831caf1f33e800dad6a659523525a78" args="(std::istream &is, r123array1xm128i &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::istream& operator>> </td>
+          <td>(</td>
+          <td class="paramtype">std::istream & </td>
+          <td class="paramname"> <em>is</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7b32dd7601d0a11b72583a841abc8fca"></a><!-- doxytag: member="array.h::operator>>" ref="a7b32dd7601d0a11b72583a841abc8fca" args="(std::istream &is, r123array2x64 &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::istream& operator>> </td>
+          <td>(</td>
+          <td class="paramtype">std::istream & </td>
+          <td class="paramname"> <em>is</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html">r123array2x64</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2782402f8b3941e104e01c317fd4b099"></a><!-- doxytag: member="array.h::operator>>" ref="a2782402f8b3941e104e01c317fd4b099" args="(std::istream &is, r123array4x32 &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::istream& operator>> </td>
+          <td>(</td>
+          <td class="paramtype">std::istream & </td>
+          <td class="paramname"> <em>is</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">r123array4x32</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abb64305331045d211dfa35be0d0cc6a9"></a><!-- doxytag: member="array.h::operator>>" ref="abb64305331045d211dfa35be0d0cc6a9" args="(std::istream &is, r123array16x8 &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::istream& operator>> </td>
+          <td>(</td>
+          <td class="paramtype">std::istream & </td>
+          <td class="paramname"> <em>is</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array16x8.html">r123array16x8</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae63a28cc2f1e69f63a4402c8b83663b4"></a><!-- doxytag: member="array.h::operator>>" ref="ae63a28cc2f1e69f63a4402c8b83663b4" args="(std::istream &is, r123array8x32 &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::istream& operator>> </td>
+          <td>(</td>
+          <td class="paramtype">std::istream & </td>
+          <td class="paramname"> <em>is</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array8x32.html">r123array8x32</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ace3112deae6709884feac904b1c260a1"></a><!-- doxytag: member="array.h::operator>>" ref="ace3112deae6709884feac904b1c260a1" args="(std::istream &is, r123array1x32 &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::istream& operator>> </td>
+          <td>(</td>
+          <td class="paramtype">std::istream & </td>
+          <td class="paramname"> <em>is</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array1x32.html">r123array1x32</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a60aa3cdbb34ced56c0c7c82371f2b30c"></a><!-- doxytag: member="array.h::operator>>" ref="a60aa3cdbb34ced56c0c7c82371f2b30c" args="(std::istream &is, r123array4x64 &a)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::istream& operator>> </td>
+          <td>(</td>
+          <td class="paramtype">std::istream & </td>
+          <td class="paramname"> <em>is</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array4x64.html">r123array4x64</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/array_8h_source.html b/lib/Random123-1.08/docs/html/array_8h_source.html
new file mode 100644
index 0000000..e1ec1a2
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/array_8h_source.html
@@ -0,0 +1,376 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/array.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>Random123/array.h</h1>  </div>
+</div>
+<div class="contents">
+<a href="array_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">Copyright 2010-2011, D. E. Shaw Research.</span>
+<a name="l00003"></a>00003 <span class="comment">All rights reserved.</span>
+<a name="l00004"></a>00004 <span class="comment"></span>
+<a name="l00005"></a>00005 <span class="comment">Redistribution and use in source and binary forms, with or without</span>
+<a name="l00006"></a>00006 <span class="comment">modification, are permitted provided that the following conditions are</span>
+<a name="l00007"></a>00007 <span class="comment">met:</span>
+<a name="l00008"></a>00008 <span class="comment"></span>
+<a name="l00009"></a>00009 <span class="comment">* Redistributions of source code must retain the above copyright</span>
+<a name="l00010"></a>00010 <span class="comment">  notice, this list of conditions, and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"></span>
+<a name="l00012"></a>00012 <span class="comment">* Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00013"></a>00013 <span class="comment">  notice, this list of conditions, and the following disclaimer in the</span>
+<a name="l00014"></a>00014 <span class="comment">  documentation and/or other materials provided with the distribution.</span>
+<a name="l00015"></a>00015 <span class="comment"></span>
+<a name="l00016"></a>00016 <span class="comment">* Neither the name of D. E. Shaw Research nor the names of its</span>
+<a name="l00017"></a>00017 <span class="comment">  contributors may be used to endorse or promote products derived from</span>
+<a name="l00018"></a>00018 <span class="comment">  this software without specific prior written permission.</span>
+<a name="l00019"></a>00019 <span class="comment"></span>
+<a name="l00020"></a>00020 <span class="comment">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span>
+<a name="l00021"></a>00021 <span class="comment">"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span>
+<a name="l00022"></a>00022 <span class="comment">LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span>
+<a name="l00023"></a>00023 <span class="comment">A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span>
+<a name="l00024"></a>00024 <span class="comment">OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
+<a name="l00025"></a>00025 <span class="comment">SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span>
+<a name="l00026"></a>00026 <span class="comment">LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span>
+<a name="l00027"></a>00027 <span class="comment">DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span>
+<a name="l00028"></a>00028 <span class="comment">THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00029"></a>00029 <span class="comment">(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span>
+<a name="l00030"></a>00030 <span class="comment">OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00031"></a>00031 <span class="comment">*/</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#ifndef _r123array_dot_h__</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#define _r123array_dot_h__</span>
+<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="compilerfeatures_8h.html">features/compilerfeatures.h</a>"</span>
+<a name="l00035"></a>00035 <span class="preprocessor">#include "<a class="code" href="sse_8h.html">features/sse.h</a>"</span>
+<a name="l00036"></a>00036 
+<a name="l00037"></a>00037 <span class="preprocessor">#ifndef __cplusplus</span>
+<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#define CXXMETHODS(_N, W, T)</span>
+<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#define CXXOVERLOADS(_N, W, T)</span>
+<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00041"></a>00041 <span class="preprocessor"></span>
+<a name="l00042"></a>00042 <span class="preprocessor">#include <stddef.h></span>
+<a name="l00043"></a>00043 <span class="preprocessor">#include <algorithm></span>
+<a name="l00044"></a>00044 <span class="preprocessor">#include <stdexcept></span>
+<a name="l00045"></a>00045 <span class="preprocessor">#include <iterator></span>
+<a name="l00046"></a>00046 <span class="preprocessor">#include <limits></span>
+<a name="l00047"></a>00047 <span class="preprocessor">#include <iostream></span>
+<a name="l00048"></a>00048 
+<a name="l00068"></a>00068 <span class="keyword">template</span> <<span class="keyword">typename</span> value_type>
+<a name="l00069"></a>00069 <span class="keyword">inline</span> R123_CUDA_DEVICE value_type <a class="code" href="sse_8h.html#a99c42d1da8da3a4a273556a7817b5c1f">assemble_from_u32</a>(uint32_t *p32){
+<a name="l00070"></a>00070     value_type v=0;
+<a name="l00071"></a>00071     <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i=0; i<(3+<span class="keyword">sizeof</span>(value_type))/4; ++i)
+<a name="l00072"></a>00072         v |= ((value_type)(*p32++)) << (32*i);
+<a name="l00073"></a>00073     <span class="keywordflow">return</span> v;
+<a name="l00074"></a>00074 }
+<a name="l00075"></a>00075 
+<a name="l00076"></a>00076 <span class="comment">// Work-alike methods and typedefs modeled on std::array:</span>
+<a name="l00077"></a>00077 <span class="preprocessor">#define CXXMETHODS(_N, W, T)                                            \</span>
+<a name="l00078"></a>00078 <span class="preprocessor">    typedef T value_type;                                               \</span>
+<a name="l00079"></a>00079 <span class="preprocessor">    typedef T* iterator;                                                \</span>
+<a name="l00080"></a>00080 <span class="preprocessor">    typedef const T* const_iterator;                                    \</span>
+<a name="l00081"></a>00081 <span class="preprocessor">    typedef value_type& reference;                                      \</span>
+<a name="l00082"></a>00082 <span class="preprocessor">    typedef const value_type& const_reference;                          \</span>
+<a name="l00083"></a>00083 <span class="preprocessor">    typedef size_t size_type;                                           \</span>
+<a name="l00084"></a>00084 <span class="preprocessor">    typedef ptrdiff_t difference_type;                                  \</span>
+<a name="l00085"></a>00085 <span class="preprocessor">    typedef T* pointer;                                                 \</span>
+<a name="l00086"></a>00086 <span class="preprocessor">    typedef const T* const_pointer;                                     \</span>
+<a name="l00087"></a>00087 <span class="preprocessor">    typedef std::reverse_iterator<iterator> reverse_iterator;           \</span>
+<a name="l00088"></a>00088 <span class="preprocessor">    typedef std::reverse_iterator<const_iterator> const_reverse_iterator; \</span>
+<a name="l00089"></a>00089 <span class="preprocessor">    </span><span class="comment">/* Boost.array has static_size.  C++11 specializes tuple_size */</span>    \
+<a name="l00090"></a>00090     enum {static_size = _N};                                            \
+<a name="l00091"></a>00091     R123_CUDA_DEVICE reference operator[](size_type i){return v[i];}                     \
+<a name="l00092"></a>00092     R123_CUDA_DEVICE const_reference operator[](size_type i) const {return v[i];}        \
+<a name="l00093"></a>00093     R123_CUDA_DEVICE reference at(size_type i){ if(i >=  _N) R123_THROW(std::out_of_range("array index out of range")); return (*this)[i]; } \
+<a name="l00094"></a>00094     R123_CUDA_DEVICE const_reference at(size_type i) const { if(i >=  _N) R123_THROW(std::out_of_range("array index out of range")); return (*this)[i]; } \
+<a name="l00095"></a>00095     R123_CUDA_DEVICE size_type size() const { return  _N; }                              \
+<a name="l00096"></a>00096     R123_CUDA_DEVICE size_type max_size() const { return _N; }                           \
+<a name="l00097"></a>00097     R123_CUDA_DEVICE bool empty() const { return _N==0; };                               \
+<a name="l00098"></a>00098     R123_CUDA_DEVICE iterator begin() { return &v[0]; }                                  \
+<a name="l00099"></a>00099     R123_CUDA_DEVICE iterator end() { return &v[_N]; }                                   \
+<a name="l00100"></a>00100     R123_CUDA_DEVICE const_iterator begin() const { return &v[0]; }                      \
+<a name="l00101"></a>00101     R123_CUDA_DEVICE const_iterator end() const { return &v[_N]; }                       \
+<a name="l00102"></a>00102     R123_CUDA_DEVICE const_iterator cbegin() const { return &v[0]; }                     \
+<a name="l00103"></a>00103     R123_CUDA_DEVICE const_iterator cend() const { return &v[_N]; }                      \
+<a name="l00104"></a>00104     R123_CUDA_DEVICE reverse_iterator rbegin(){ return reverse_iterator(end()); }        \
+<a name="l00105"></a>00105     R123_CUDA_DEVICE const_reverse_iterator rbegin() const{ return const_reverse_iterator(end()); } \
+<a name="l00106"></a>00106     R123_CUDA_DEVICE reverse_iterator rend(){ return reverse_iterator(begin()); }        \
+<a name="l00107"></a>00107     R123_CUDA_DEVICE const_reverse_iterator rend() const{ return const_reverse_iterator(begin()); } \
+<a name="l00108"></a>00108     R123_CUDA_DEVICE const_reverse_iterator crbegin() const{ return const_reverse_iterator(cend()); } \
+<a name="l00109"></a>00109     R123_CUDA_DEVICE const_reverse_iterator crend() const{ return const_reverse_iterator(cbegin()); } \
+<a name="l00110"></a>00110     R123_CUDA_DEVICE pointer data(){ return &v[0]; }                                     \
+<a name="l00111"></a>00111     R123_CUDA_DEVICE const_pointer data() const{ return &v[0]; }                         \
+<a name="l00112"></a>00112     R123_CUDA_DEVICE reference front(){ return v[0]; }                                   \
+<a name="l00113"></a>00113     R123_CUDA_DEVICE const_reference front() const{ return v[0]; }                       \
+<a name="l00114"></a>00114     R123_CUDA_DEVICE reference back(){ return v[_N-1]; }                                 \
+<a name="l00115"></a>00115     R123_CUDA_DEVICE const_reference back() const{ return v[_N-1]; }                     \
+<a name="l00116"></a>00116     R123_CUDA_DEVICE bool operator==(const r123array##_N##x##W& rhs) const{ \
+<a name="l00117"></a>00117         <span class="comment">/* CUDA3 does not have std::equal */</span> \
+<a name="l00118"></a>00118         for (size_t i = 0; i < _N; ++i) \
+<a name="l00119"></a>00119             if (v[i] != rhs.v[i]) return false; \
+<a name="l00120"></a>00120         return true; \
+<a name="l00121"></a>00121     } \
+<a name="l00122"></a>00122     R123_CUDA_DEVICE bool operator!=(const r123array##_N##x##W& rhs) const{ return !(*this == rhs); } \
+<a name="l00123"></a>00123     <span class="comment">/* CUDA3 does not have std::fill_n */</span> \
+<a name="l00124"></a>00124     R123_CUDA_DEVICE void fill(const value_type& val){ for (size_t i = 0; i < _N; ++i) v[i] = val; } \
+<a name="l00125"></a>00125     R123_CUDA_DEVICE void swap(r123array##_N##x##W& rhs){ \
+<a name="l00126"></a>00126         <span class="comment">/* CUDA3 does not have std::swap_ranges */</span> \
+<a name="l00127"></a>00127         for (size_t i = 0; i < _N; ++i) { \
+<a name="l00128"></a>00128             T tmp = v[i]; \
+<a name="l00129"></a>00129             v[i] = rhs.v[i]; \
+<a name="l00130"></a>00130             rhs.v[i] = tmp; \
+<a name="l00131"></a>00131         } \
+<a name="l00132"></a>00132     } \
+<a name="l00133"></a>00133     R123_CUDA_DEVICE r123array##_N##x##W& incr(R123_ULONG_LONG n=1){                         \
+<a name="l00134"></a>00134         <span class="comment">/* This test is tricky because we're trying to avoid spurious   \</span>
+<a name="l00135"></a>00135 <span class="comment">           complaints about illegal shifts, yet still be compile-time   \</span>
+<a name="l00136"></a>00136 <span class="comment">           evaulated. */</span>                                                \
+<a name="l00137"></a>00137         if(sizeof(T)<sizeof(n) && n>>((sizeof(T)<sizeof(n))?8*sizeof(T):0) ) \
+<a name="l00138"></a>00138             return incr_carefully(n);                                   \
+<a name="l00139"></a>00139         if(n==1){                                                       \
+<a name="l00140"></a>00140             ++v[0];                                                     \
+<a name="l00141"></a>00141             if(_N==1 || R123_BUILTIN_EXPECT(!!v[0], 1)) return *this;   \
+<a name="l00142"></a>00142         }else{                                                          \
+<a name="l00143"></a>00143             v[0] += n;                                                  \
+<a name="l00144"></a>00144             if(_N==1 || R123_BUILTIN_EXPECT(n<=v[0], 1)) return *this;  \
+<a name="l00145"></a>00145         }                                                               \
+<a name="l00146"></a>00146         <span class="comment">/* We expect that the N==?? tests will be                       \</span>
+<a name="l00147"></a>00147 <span class="comment">           constant-folded/optimized away by the compiler, so only the  \</span>
+<a name="l00148"></a>00148 <span class="comment">           overflow tests (!!v[i]) remain to be done at runtime.  For  \</span>
+<a name="l00149"></a>00149 <span class="comment">           small values of N, it would be better to do this as an       \</span>
+<a name="l00150"></a>00150 <span class="comment">           uncondtional sequence of adc.  An experiment/optimization    \</span>
+<a name="l00151"></a>00151 <span class="comment">           for another day...                                           \</span>
+<a name="l00152"></a>00152 <span class="comment">           N.B.  The weird subscripting: v[_N>3?3:0] is to silence      \</span>
+<a name="l00153"></a>00153 <span class="comment">           a spurious error from icpc                                   \</span>
+<a name="l00154"></a>00154 <span class="comment">           */</span>                                                           \
+<a name="l00155"></a>00155         ++v[_N>1?1:0];                                                  \
+<a name="l00156"></a>00156         if(_N==2 || R123_BUILTIN_EXPECT(!!v[_N>1?1:0], 1)) return *this; \
+<a name="l00157"></a>00157         ++v[_N>2?2:0];                                                  \
+<a name="l00158"></a>00158         if(_N==3 || R123_BUILTIN_EXPECT(!!v[_N>2?2:0], 1)) return *this;  \
+<a name="l00159"></a>00159         ++v[_N>3?3:0];                                                  \
+<a name="l00160"></a>00160         for(size_t i=4; i<_N; ++i){                                     \
+<a name="l00161"></a>00161             if( R123_BUILTIN_EXPECT(!!v[i-1], 1) ) return *this;        \
+<a name="l00162"></a>00162             ++v[i];                                                     \
+<a name="l00163"></a>00163         }                                                               \
+<a name="l00164"></a>00164         return *this;                                                   \
+<a name="l00165"></a>00165     }                                                                   \
+<a name="l00166"></a>00166     <span class="comment">/* seed(SeedSeq) would be a constructor if having a constructor */</span>  \
+<a name="l00167"></a>00167     <span class="comment">/* didn't cause headaches with defaults */</span>                          \
+<a name="l00168"></a>00168     template <typename SeedSeq>                                         \
+<a name="l00169"></a>00169     R123_CUDA_DEVICE static r123array##_N##x##W seed(SeedSeq &ss){      \
+<a name="l00170"></a>00170         r123array##_N##x##W ret;                                        \
+<a name="l00171"></a>00171         const size_t Ngen = _N*((3+sizeof(value_type))/4);              \
+<a name="l00172"></a>00172         uint32_t u32[Ngen];                                             \
+<a name="l00173"></a>00173         uint32_t *p32 = &u32[0];                                        \
+<a name="l00174"></a>00174         ss.generate(&u32[0], &u32[Ngen]);                               \
+<a name="l00175"></a>00175         for(size_t i=0; i<_N; ++i){                                     \
+<a name="l00176"></a>00176             ret.v[i] = assemble_from_u32<value_type>(p32);              \
+<a name="l00177"></a>00177             p32 += (3+sizeof(value_type))/4;                            \
+<a name="l00178"></a>00178         }                                                               \
+<a name="l00179"></a>00179         return ret;                                                     \
+<a name="l00180"></a>00180     }                                                                   \
+<a name="l00181"></a>00181 protected:                                                              \
+<a name="l00182"></a>00182     R123_CUDA_DEVICE r123array##_N##x##W& incr_carefully(R123_ULONG_LONG n){ \
+<a name="l00183"></a>00183         <span class="comment">/* n may be greater than the maximum value of a single value_type */</span> \
+<a name="l00184"></a>00184         value_type vtn;                                                 \
+<a name="l00185"></a>00185         vtn = n;                                                        \
+<a name="l00186"></a>00186         v[0] += n;                                                      \
+<a name="l00187"></a>00187         const unsigned rshift = 8* ((sizeof(n)>sizeof(value_type))? sizeof(value_type) : 0); \
+<a name="l00188"></a>00188         for(size_t i=1; i<_N; ++i){                                     \
+<a name="l00189"></a>00189             if(rshift){                                                 \
+<a name="l00190"></a>00190                 n >>= rshift;                                           \
+<a name="l00191"></a>00191             }else{                                                      \
+<a name="l00192"></a>00192                 n=0;                                                    \
+<a name="l00193"></a>00193             }                                                           \
+<a name="l00194"></a>00194             if( v[i-1] < vtn )                                          \
+<a name="l00195"></a>00195                 ++n;                                                    \
+<a name="l00196"></a>00196             if( n==0 ) break;                                           \
+<a name="l00197"></a>00197             vtn = n;                                                    \
+<a name="l00198"></a>00198             v[i] += n;                                                  \
+<a name="l00199"></a>00199         }                                                               \
+<a name="l00200"></a>00200         return *this;                                                   \
+<a name="l00201"></a>00201     }                                                                   \
+<a name="l00202"></a>00202     
+<a name="l00203"></a>00203                                                                         
+<a name="l00204"></a>00204 <span class="comment">// There are several tricky considerations for the insertion and extraction</span>
+<a name="l00205"></a>00205 <span class="comment">// operators:</span>
+<a name="l00206"></a>00206 <span class="comment">// - we would like to be able to print r123array16x8 as a sequence of 16 integers,</span>
+<a name="l00207"></a>00207 <span class="comment">//   not as 16 bytes.</span>
+<a name="l00208"></a>00208 <span class="comment">// - we would like to be able to print r123array1xm128i.</span>
+<a name="l00209"></a>00209 <span class="comment">// - we do not want an int conversion operator in r123m128i because it causes</span>
+<a name="l00210"></a>00210 <span class="comment">//   lots of ambiguity problems with automatic promotions.</span>
+<a name="l00211"></a>00211 <span class="comment">// Solution: r123arrayinsertable and r123arrayextractable</span>
+<a name="l00212"></a>00212 
+<a name="l00213"></a>00213 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00214"></a>00214 <span class="keyword">struct </span>r123arrayinsertable{
+<a name="l00215"></a>00215     <span class="keyword">const</span> T& v;
+<a name="l00216"></a>00216     r123arrayinsertable(<span class="keyword">const</span> T& t_) : v(t_) {} 
+<a name="l00217"></a>00217     <span class="keyword">friend</span> std::ostream& operator<<(std::ostream& os, const r123arrayinsertable<T>& t){
+<a name="l00218"></a>00218         <span class="keywordflow">return</span> os << t.v;
+<a name="l00219"></a>00219     }
+<a name="l00220"></a>00220 };
+<a name="l00221"></a>00221 
+<a name="l00222"></a>00222 <span class="keyword">template</span><>
+<a name="l00223"></a>00223 <span class="keyword">struct </span>r123arrayinsertable<uint8_t>{
+<a name="l00224"></a>00224     <span class="keyword">const</span> uint8_t& v;
+<a name="l00225"></a>00225     r123arrayinsertable(<span class="keyword">const</span> uint8_t& t_) : v(t_) {} 
+<a name="l00226"></a>00226     <span class="keyword">friend</span> std::ostream& operator<<(std::ostream& os, const r123arrayinsertable<uint8_t>& t){
+<a name="l00227"></a>00227         <span class="keywordflow">return</span> os << (int)t.v;
+<a name="l00228"></a>00228     }
+<a name="l00229"></a>00229 };
+<a name="l00230"></a>00230 
+<a name="l00231"></a>00231 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00232"></a>00232 <span class="keyword">struct </span>r123arrayextractable{
+<a name="l00233"></a>00233     T& v;
+<a name="l00234"></a>00234     r123arrayextractable(T& t_) : v(t_) {}
+<a name="l00235"></a>00235     <span class="keyword">friend</span> std::istream& <a class="code" href="array_8h.html#ace3112deae6709884feac904b1c260a1">operator>></a>(std::istream& is, r123arrayextractable<T>& t){
+<a name="l00236"></a>00236         <span class="keywordflow">return</span> is >> t.v;
+<a name="l00237"></a>00237     }
+<a name="l00238"></a>00238 };
+<a name="l00239"></a>00239 
+<a name="l00240"></a>00240 <span class="keyword">template</span><>
+<a name="l00241"></a>00241 <span class="keyword">struct </span>r123arrayextractable<uint8_t>{
+<a name="l00242"></a>00242     uint8_t& v;
+<a name="l00243"></a>00243     r123arrayextractable(uint8_t& t_) : v(t_) {} 
+<a name="l00244"></a>00244     <span class="keyword">friend</span> std::istream& <a class="code" href="array_8h.html#ace3112deae6709884feac904b1c260a1">operator>></a>(std::istream& is, r123arrayextractable<uint8_t>& t){
+<a name="l00245"></a>00245         <span class="keywordtype">int</span> i;
+<a name="l00246"></a>00246         is >>  i;
+<a name="l00247"></a>00247         t.v = i;
+<a name="l00248"></a>00248         <span class="keywordflow">return</span> is;
+<a name="l00249"></a>00249     }
+<a name="l00250"></a>00250 };
+<a name="l00251"></a>00251 
+<a name="l00252"></a>00252 <span class="preprocessor">#define CXXOVERLOADS(_N, W, T)                                          \</span>
+<a name="l00253"></a>00253 <span class="preprocessor">                                                                        \</span>
+<a name="l00254"></a>00254 <span class="preprocessor">inline std::ostream& operator<<(std::ostream& os, const r123array##_N##x##W& a){   \</span>
+<a name="l00255"></a>00255 <span class="preprocessor">    os << r123arrayinsertable<T>(a.v[0]);                                  \</span>
+<a name="l00256"></a>00256 <span class="preprocessor">    for(size_t i=1; i<_N; ++i)                                          \</span>
+<a name="l00257"></a>00257 <span class="preprocessor">        os << " " << r123arrayinsertable<T>(a.v[i]);                       \</span>
+<a name="l00258"></a>00258 <span class="preprocessor">    return os;                                                          \</span>
+<a name="l00259"></a>00259 <span class="preprocessor">}                                                                       \</span>
+<a name="l00260"></a>00260 <span class="preprocessor">                                                                        \</span>
+<a name="l00261"></a>00261 <span class="preprocessor">inline std::istream& operator>>(std::istream& is, r123array##_N##x##W& a){         \</span>
+<a name="l00262"></a>00262 <span class="preprocessor">    for(size_t i=0; i<_N; ++i){                                         \</span>
+<a name="l00263"></a>00263 <span class="preprocessor">        r123arrayextractable<T> x(a.v[i]);                                 \</span>
+<a name="l00264"></a>00264 <span class="preprocessor">        is >> x;                                                        \</span>
+<a name="l00265"></a>00265 <span class="preprocessor">    }                                                                   \</span>
+<a name="l00266"></a>00266 <span class="preprocessor">    return is;                                                          \</span>
+<a name="l00267"></a>00267 <span class="preprocessor">}                                                                       \</span>
+<a name="l00268"></a>00268 <span class="preprocessor">                                                                        \</span>
+<a name="l00269"></a>00269 <span class="preprocessor">namespace r123{                                                        \</span>
+<a name="l00270"></a>00270 <span class="preprocessor"> typedef r123array##_N##x##W Array##_N##x##W;                          \</span>
+<a name="l00271"></a>00271 <span class="preprocessor">}</span>
+<a name="l00272"></a>00272 <span class="preprocessor"></span>                                                                        
+<a name="l00273"></a>00273 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
+<a name="l00274"></a>00274 
+<a name="l00275"></a>00275 <span class="comment">/* _r123array_tpl expands to a declaration of struct r123arrayNxW.  </span>
+<a name="l00276"></a>00276 <span class="comment"></span>
+<a name="l00277"></a>00277 <span class="comment">   In C, it's nothing more than a struct containing an array of N</span>
+<a name="l00278"></a>00278 <span class="comment">   objects of type T.</span>
+<a name="l00279"></a>00279 <span class="comment"></span>
+<a name="l00280"></a>00280 <span class="comment">   In C++ it's the same, but endowed with an assortment of member</span>
+<a name="l00281"></a>00281 <span class="comment">   functions, typedefs and friends.  In C++, r123arrayNxW looks a lot</span>
+<a name="l00282"></a>00282 <span class="comment">   like std::array<T,N>, has most of the capabilities of a container,</span>
+<a name="l00283"></a>00283 <span class="comment">   and satisfies the requirements outlined in compat/Engine.hpp for</span>
+<a name="l00284"></a>00284 <span class="comment">   counter and key types.  ArrayNxW, in the r123 namespace is</span>
+<a name="l00285"></a>00285 <span class="comment">   a typedef equivalent to r123arrayNxW.</span>
+<a name="l00286"></a>00286 <span class="comment">*/</span>
+<a name="l00287"></a>00287 
+<a name="l00288"></a>00288 <span class="preprocessor">#define _r123array_tpl(_N, W, T)                   \</span>
+<a name="l00289"></a>00289 <span class="preprocessor">                        \</span>
+<a name="l00290"></a><a class="code" href="array_8h.html#ace3112deae6709884feac904b1c260a1">00290</a> <span class="preprocessor">                            \</span>
+<a name="l00291"></a><a class="code" href="array_8h.html#a41bb2d7e99cf51ca5927a074d1424a03">00291</a> <span class="preprocessor">struct r123array##_N##x##W{                         \</span>
+<a name="l00292"></a><a class="code" href="array_8h.html#a2782402f8b3941e104e01c317fd4b099">00292</a> <span class="preprocessor"> T v[_N];                                       \</span>
+<a name="l00293"></a><a class="code" href="array_8h.html#ae63a28cc2f1e69f63a4402c8b83663b4">00293</a> <span class="preprocessor"> CXXMETHODS(_N, W, T)                           \</span>
+<a name="l00294"></a>00294 <span class="preprocessor">};                                              \</span>
+<a name="l00295"></a><a class="code" href="array_8h.html#a3cdf7b897463996d6eda01443dd669c5">00295</a> <span class="preprocessor">                                                \</span>
+<a name="l00296"></a><a class="code" href="array_8h.html#a7b32dd7601d0a11b72583a841abc8fca">00296</a> <span class="preprocessor">CXXOVERLOADS(_N, W, T)</span>
+<a name="l00297"></a><a class="code" href="array_8h.html#a60aa3cdbb34ced56c0c7c82371f2b30c">00297</a> <span class="preprocessor"></span>
+<a name="l00300"></a>00300 _r123array_tpl(1, 32, uint32_t)  <span class="comment">/* r123array1x32 */</span>
+<a name="l00301"></a>00301 _r123array_tpl(2, 32, uint32_t)  <span class="comment">/* r123array2x32 */</span>
+<a name="l00302"></a><a class="code" href="array_8h.html#af831caf1f33e800dad6a659523525a78">00302</a> _r123array_tpl(4, 32, uint32_t)  <span class="comment">/* r123array4x32 */</span>
+<a name="l00303"></a>00303 _r123array_tpl(8, 32, uint32_t)  <span class="comment">/* r123array8x32 */</span>
+<a name="l00304"></a>00304 
+<a name="l00305"></a>00305 _r123array_tpl(1, 64, uint64_t)  <span class="comment">/* r123array1x64 */</span>
+<a name="l00306"></a>00306 _r123array_tpl(2, 64, uint64_t)  <span class="comment">/* r123array2x64 */</span>
+<a name="l00307"></a>00307 _r123array_tpl(4, 64, uint64_t)  <span class="comment">/* r123array4x64 */</span>
+<a name="l00308"></a>00308 
+<a name="l00309"></a><a class="code" href="array_8h.html#a9b64205709c0daaea3b05bbf7ea5a322">00309</a> _r123array_tpl(16, 8, uint8_t)  <span class="comment">/* r123array16x8 for ARSsw, AESsw */</span>
+<a name="l00310"></a>00310 
+<a name="l00311"></a>00311 <span class="preprocessor">#if R123_USE_SSE</span>
+<a name="l00312"></a>00312 <span class="preprocessor"></span>_r123array_tpl(1, m128i, <a class="code" href="structr123m128i.html">r123m128i</a>) <span class="comment">/* r123array1x128i for ARSni, AESni */</span>
+<a name="l00313"></a>00313 <span class="preprocessor">#endif</span>
+<a name="l00314"></a>00314 <span class="preprocessor"></span>
+<a name="l00315"></a>00315 <span class="comment">/* In C++, it's natural to use sizeof(a::value_type), but in C it's</span>
+<a name="l00316"></a>00316 <span class="comment">   pretty convoluted to figure out the width of the value_type of an</span>
+<a name="l00317"></a>00317 <span class="comment">   r123arrayNxW:</span>
+<a name="l00318"></a>00318 <span class="comment">*/</span>
+<a name="l00319"></a>00319 <span class="preprocessor">#define R123_W(a)   (8*sizeof(((a *)0)->v[0]))</span>
+<a name="l00320"></a>00320 <span class="preprocessor"></span>
+<a name="l00325"></a>00325 <span class="preprocessor">#endif</span>
+<a name="l00326"></a>00326 <span class="preprocessor"></span>
+</pre></div></div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/ars_8h.html b/lib/Random123-1.08/docs/html/ars_8h.html
new file mode 100644
index 0000000..f072d2c
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/ars_8h.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/ars.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> |
+<a href="#namespaces">Namespaces</a> |
+<a href="#define-members">Defines</a> |
+<a href="#typedef-members">Typedefs</a> |
+<a href="#enum-members">Enumerations</a> |
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<h1>Random123/ars.h File Reference</h1>  </div>
+</div>
+<div class="contents">
+<code>#include "<a class="el" href="compilerfeatures_8h_source.html">features/compilerfeatures.h</a>"</code><br/>
+<code>#include "<a class="el" href="array_8h_source.html">array.h</a>"</code><br/>
+
+<p><a href="ars_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i_R< ROUNDS ></a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R< ROUNDS ></a></td></tr>
+<tr><td colspan="2"><h2><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html">r123</a></td></tr>
+<tr><td colspan="2"><h2><a name="define-members"></a>
+Defines</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="ars_8h.html#aa1e31853c7493df739897205eb4f4a82">ARS1xm128i_DEFAULT_ROUNDS</a>   7</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga22e0a9c885b544115d44d26cc7777303">ars1xm128i</a>(c, k)   ars1xm128i_R(ars1xm128i_rounds, c, k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga088ecbf341caf05e491ce246f2ea2d30">ars4x32</a>(c, k)   ars4x32_R(ars4x32_rounds, c, k)</td></tr>
+<tr><td colspan="2"><h2><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga23ddf8109ce08f2bc14401c5f269d2a9">ars1xm128i_ctr_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga2c5b351a47bb39f4d1769506c98c06e2">ars1xm128i_key_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gaeaa234225e7dcec2ffcdb32a0faad4f0">ars1xm128i_ukey_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga61721da91a455cb587ce6bc4a0f56117">ars4x32_ctr_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga3a1426aa6aaa06330d48ec8173cd3e7b">ars4x32_key_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga54cb318ff6bd4df405897b2b9a4b109f">ars4x32_ukey_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef ARS1xm128i_R<br class="typebreak"/>
+< ars1xm128i_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#a964aa9123913d1f8cf535e0caaa4155f">r123::ARS1xm128i</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef ARS4x32_R< ars4x32_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#afd2070dc979024a14317bd57c3a4c352">r123::ARS4x32</a></td></tr>
+<tr><td colspan="2"><h2><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gabf0a537666d4d1421144cb0a5e67666c">r123_enum_ars1xm128i</a> { <a class="el" href="group__AESNI.html#ggabf0a537666d4d1421144cb0a5e67666cade1fd46524355ec1d7ce63fd13b54992">ars1xm128i_rounds</a> =  7
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gaa623b038fa0c8d8d2864fdc0e45884d6">r123_enum_ars4x32</a> { <a class="el" href="group__AESNI.html#ggaa623b038fa0c8d8d2864fdc0e45884d6a5e715f357770a0f188ef493e6e63d31d">ars4x32_rounds</a> =  7
+ }</td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array1xm128i.html">ars1xm128i_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gae307c205a2ad19142bbe70919abfbfc2">ars1xm128ikeyinit</a> (<a class="el" href="structr123array1xm128i.html">ars1xm128i_ukey_t</a> uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array1xm128i.html">ars1xm128i_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gaddc6efc2007f6f66ee914eb7074cff1e">ars1xm128i_R</a> (unsigned int Nrounds, <a class="el" href="structr123array1xm128i.html">ars1xm128i_ctr_t</a> in, <a class="el" href="structr123array1xm128i.html">ars1xm128i_key_t</a> k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array4x32.html">ars4x32_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga1f3a02ea711ae6bacb0875f11a255516">ars4x32keyinit</a> (<a class="el" href="structr123array4x32.html">ars4x32_ukey_t</a> uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array4x32.html">ars4x32_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gab13b093252d4bb3389d27d4e3b04dae8">ars4x32_R</a> (unsigned int Nrounds, <a class="el" href="structr123array4x32.html">ars4x32_ctr_t</a> c, <a class="el" href="structr123array4x32.html">ars4x32_key_t</a> k)</td></tr>
+</table>
+<hr/><h2>Define Documentation</h2>
+<a class="anchor" id="aa1e31853c7493df739897205eb4f4a82"></a><!-- doxytag: member="ars.h::ARS1xm128i_DEFAULT_ROUNDS" ref="aa1e31853c7493df739897205eb4f4a82" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ARS1xm128i_DEFAULT_ROUNDS   7</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/ars_8h_source.html b/lib/Random123-1.08/docs/html/ars_8h_source.html
new file mode 100644
index 0000000..eda722a
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/ars_8h_source.html
@@ -0,0 +1,228 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/ars.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>Random123/ars.h</h1>  </div>
+</div>
+<div class="contents">
+<a href="ars_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">Copyright 2010-2011, D. E. Shaw Research.</span>
+<a name="l00003"></a>00003 <span class="comment">All rights reserved.</span>
+<a name="l00004"></a>00004 <span class="comment"></span>
+<a name="l00005"></a>00005 <span class="comment">Redistribution and use in source and binary forms, with or without</span>
+<a name="l00006"></a>00006 <span class="comment">modification, are permitted provided that the following conditions are</span>
+<a name="l00007"></a>00007 <span class="comment">met:</span>
+<a name="l00008"></a>00008 <span class="comment"></span>
+<a name="l00009"></a>00009 <span class="comment">* Redistributions of source code must retain the above copyright</span>
+<a name="l00010"></a>00010 <span class="comment">  notice, this list of conditions, and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"></span>
+<a name="l00012"></a>00012 <span class="comment">* Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00013"></a>00013 <span class="comment">  notice, this list of conditions, and the following disclaimer in the</span>
+<a name="l00014"></a>00014 <span class="comment">  documentation and/or other materials provided with the distribution.</span>
+<a name="l00015"></a>00015 <span class="comment"></span>
+<a name="l00016"></a>00016 <span class="comment">* Neither the name of D. E. Shaw Research nor the names of its</span>
+<a name="l00017"></a>00017 <span class="comment">  contributors may be used to endorse or promote products derived from</span>
+<a name="l00018"></a>00018 <span class="comment">  this software without specific prior written permission.</span>
+<a name="l00019"></a>00019 <span class="comment"></span>
+<a name="l00020"></a>00020 <span class="comment">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span>
+<a name="l00021"></a>00021 <span class="comment">"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span>
+<a name="l00022"></a>00022 <span class="comment">LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span>
+<a name="l00023"></a>00023 <span class="comment">A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span>
+<a name="l00024"></a>00024 <span class="comment">OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
+<a name="l00025"></a>00025 <span class="comment">SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span>
+<a name="l00026"></a>00026 <span class="comment">LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span>
+<a name="l00027"></a>00027 <span class="comment">DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span>
+<a name="l00028"></a>00028 <span class="comment">THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00029"></a>00029 <span class="comment">(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span>
+<a name="l00030"></a>00030 <span class="comment">OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00031"></a>00031 <span class="comment">*/</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#ifndef __Random123_ars_dot_hpp__</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#define __Random123_ars_dot_hpp__</span>
+<a name="l00034"></a>00034 <span class="preprocessor"></span>
+<a name="l00035"></a>00035 <span class="preprocessor">#include "<a class="code" href="compilerfeatures_8h.html">features/compilerfeatures.h</a>"</span>
+<a name="l00036"></a>00036 <span class="preprocessor">#include "<a class="code" href="array_8h.html">array.h</a>"</span>
+<a name="l00037"></a>00037 
+<a name="l00038"></a>00038 <span class="preprocessor">#if R123_USE_AES_NI</span>
+<a name="l00039"></a>00039 <span class="preprocessor"></span>
+<a name="l00040"></a>00040 <span class="preprocessor">#ifndef ARS1xm128i_DEFAULT_ROUNDS</span>
+<a name="l00041"></a><a class="code" href="ars_8h.html#aa1e31853c7493df739897205eb4f4a82">00041</a> <span class="preprocessor"></span><span class="preprocessor">#define ARS1xm128i_DEFAULT_ROUNDS 7</span>
+<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00043"></a>00043 <span class="preprocessor"></span>
+<a name="l00045"></a><a class="code" href="group__AESNI.html#gabf0a537666d4d1421144cb0a5e67666c">00045</a> <span class="keyword">enum</span> <a class="code" href="group__AESNI.html#gabf0a537666d4d1421144cb0a5e67666c">r123_enum_ars1xm128i</a> {<a class="code" href="group__AESNI.html#ggabf0a537666d4d1421144cb0a5e67666cade1fd46524355ec1d7ce63fd13b54992">ars1xm128i_rounds</a> = <a class="code" href="ars_8h.html#aa1e31853c7493df739897205eb4f4a82">ARS1xm128i_DEFAULT_ROUNDS</a>};
+<a name="l00046"></a>00046 
+<a name="l00047"></a>00047 <span class="comment">/* ARS1xm128i with Weyl keys.  Fast, and Crush-resistant, but NOT CRYPTO. */</span>
+<a name="l00049"></a><a class="code" href="group__AESNI.html#ga23ddf8109ce08f2bc14401c5f269d2a9">00049</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structr123array1xm128i.html">r123array1xm128i</a> <a class="code" href="structr123array1xm128i.html">ars1xm128i_ctr_t</a>;
+<a name="l00051"></a><a class="code" href="group__AESNI.html#ga2c5b351a47bb39f4d1769506c98c06e2">00051</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structr123array1xm128i.html">r123array1xm128i</a> <a class="code" href="structr123array1xm128i.html">ars1xm128i_key_t</a>;
+<a name="l00053"></a><a class="code" href="group__AESNI.html#gaeaa234225e7dcec2ffcdb32a0faad4f0">00053</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structr123array1xm128i.html">r123array1xm128i</a> <a class="code" href="structr123array1xm128i.html">ars1xm128i_ukey_t</a>;
+<a name="l00055"></a><a class="code" href="group__AESNI.html#gae307c205a2ad19142bbe70919abfbfc2">00055</a> R123_STATIC_INLINE <a class="code" href="structr123array1xm128i.html">ars1xm128i_key_t</a> <a class="code" href="group__AESNI.html#gae307c205a2ad19142bbe70919abfbfc2">ars1xm128ikeyinit</a>(<a class="code" href="structr123array1xm128i.html">ars1xm128i_ukey_t</a> uk) { <span class="keywordflow">return</span> uk; }
+<a name="l00057"></a><a class="code" href="group__AESNI.html#gaddc6efc2007f6f66ee914eb7074cff1e">00057</a> R123_STATIC_INLINE <a class="code" href="structr123array1xm128i.html">ars1xm128i_ctr_t</a> <a class="code" href="group__AESNI.html#gaddc6efc2007f6f66ee914eb7074cff1e">ars1xm128i_R</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Nrounds, <a class="code" href="structr123array1xm128i.html">ars1xm128i_ctr_t</a> in, <a class="code" href="structr123array [...]
+<a name="l00058"></a>00058     __m128i kweyl = _mm_set_epi64x(R123_64BIT(0xBB67AE8584CAA73B), <span class="comment">/* sqrt(3) - 1.0 */</span>
+<a name="l00059"></a>00059                                    R123_64BIT(0x9E3779B97F4A7C15)); <span class="comment">/* golden ratio */</span>
+<a name="l00060"></a>00060     <span class="comment">/* N.B.  the aesenc instructions do the xor *after*</span>
+<a name="l00061"></a>00061 <span class="comment">    // so if we want to follow the AES pattern, we</span>
+<a name="l00062"></a>00062 <span class="comment">    // have to do the initial xor explicitly */</span>
+<a name="l00063"></a>00063     __m128i kk = k.<a class="code" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a>[0].<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a>;
+<a name="l00064"></a>00064     __m128i <a class="code" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a> = _mm_xor_si128(in.<a class="code" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a>[0].<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a>, kk);
+<a name="l00065"></a>00065     <a class="code" href="structr123array1xm128i.html">ars1xm128i_ctr_t</a> ret;
+<a name="l00066"></a>00066     R123_ASSERT(Nrounds<=10);
+<a name="l00067"></a>00067     <span class="keywordflow">if</span>( Nrounds>1 ){
+<a name="l00068"></a>00068         kk = _mm_add_epi64(kk, kweyl);
+<a name="l00069"></a>00069         v = _mm_aesenc_si128(v, kk);
+<a name="l00070"></a>00070     }
+<a name="l00071"></a>00071     <span class="keywordflow">if</span>( Nrounds>2 ){
+<a name="l00072"></a>00072         kk = _mm_add_epi64(kk, kweyl);
+<a name="l00073"></a>00073         v = _mm_aesenc_si128(v, kk);
+<a name="l00074"></a>00074     }
+<a name="l00075"></a>00075     <span class="keywordflow">if</span>( Nrounds>3 ){
+<a name="l00076"></a>00076         kk = _mm_add_epi64(kk, kweyl);
+<a name="l00077"></a>00077         v = _mm_aesenc_si128(v, kk);
+<a name="l00078"></a>00078     }
+<a name="l00079"></a>00079     <span class="keywordflow">if</span>( Nrounds>4 ){
+<a name="l00080"></a>00080         kk = _mm_add_epi64(kk, kweyl);
+<a name="l00081"></a>00081         v = _mm_aesenc_si128(v, kk);
+<a name="l00082"></a>00082     }
+<a name="l00083"></a>00083     <span class="keywordflow">if</span>( Nrounds>5 ){
+<a name="l00084"></a>00084         kk = _mm_add_epi64(kk, kweyl);
+<a name="l00085"></a>00085         v = _mm_aesenc_si128(v, kk);
+<a name="l00086"></a>00086     }
+<a name="l00087"></a>00087     <span class="keywordflow">if</span>( Nrounds>6 ){
+<a name="l00088"></a>00088         kk = _mm_add_epi64(kk, kweyl);
+<a name="l00089"></a>00089         v = _mm_aesenc_si128(v, kk);
+<a name="l00090"></a>00090     }
+<a name="l00091"></a>00091     <span class="keywordflow">if</span>( Nrounds>7 ){
+<a name="l00092"></a>00092         kk = _mm_add_epi64(kk, kweyl);
+<a name="l00093"></a>00093         v = _mm_aesenc_si128(v, kk);
+<a name="l00094"></a>00094     }
+<a name="l00095"></a>00095     <span class="keywordflow">if</span>( Nrounds>8 ){
+<a name="l00096"></a>00096         kk = _mm_add_epi64(kk, kweyl);
+<a name="l00097"></a>00097         v = _mm_aesenc_si128(v, kk);
+<a name="l00098"></a>00098     }
+<a name="l00099"></a>00099     <span class="keywordflow">if</span>( Nrounds>9 ){
+<a name="l00100"></a>00100         kk = _mm_add_epi64(kk, kweyl);
+<a name="l00101"></a>00101         v = _mm_aesenc_si128(v, kk);
+<a name="l00102"></a>00102     }
+<a name="l00103"></a>00103     kk = _mm_add_epi64(kk, kweyl);
+<a name="l00104"></a>00104     v = _mm_aesenclast_si128(v, kk);
+<a name="l00105"></a>00105     ret.<a class="code" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a>[0].<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a> = v;
+<a name="l00106"></a>00106     <span class="keywordflow">return</span> ret;
+<a name="l00107"></a>00107 }
+<a name="l00108"></a>00108 
+<a name="l00112"></a><a class="code" href="group__AESNI.html#ga22e0a9c885b544115d44d26cc7777303">00112</a> <span class="preprocessor">#define ars1xm128i(c,k) ars1xm128i_R(ars1xm128i_rounds, c, k)</span>
+<a name="l00113"></a>00113 <span class="preprocessor"></span>
+<a name="l00115"></a><a class="code" href="group__AESNI.html#ga61721da91a455cb587ce6bc4a0f56117">00115</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structr123array4x32.html">r123array4x32</a> <a class="code" href="structr123array4x32.html">ars4x32_ctr_t</a>;
+<a name="l00117"></a><a class="code" href="group__AESNI.html#ga3a1426aa6aaa06330d48ec8173cd3e7b">00117</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structr123array4x32.html">r123array4x32</a> <a class="code" href="structr123array4x32.html">ars4x32_key_t</a>;
+<a name="l00119"></a><a class="code" href="group__AESNI.html#ga54cb318ff6bd4df405897b2b9a4b109f">00119</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structr123array4x32.html">r123array4x32</a> <a class="code" href="structr123array4x32.html">ars4x32_ukey_t</a>;
+<a name="l00121"></a><a class="code" href="group__AESNI.html#gaa623b038fa0c8d8d2864fdc0e45884d6">00121</a> <span class="keyword">enum</span> <a class="code" href="group__AESNI.html#gaa623b038fa0c8d8d2864fdc0e45884d6">r123_enum_ars4x32</a> {<a class="code" href="group__AESNI.html#ggaa623b038fa0c8d8d2864fdc0e45884d6a5e715f357770a0f188ef493e6e63d31d">ars4x32_rounds</a> = <a class="code" href="ars_8h.html#aa1e31853c7493df739897205eb4f4a82">ARS1xm128i_DEFAULT_ROUNDS</a>};
+<a name="l00123"></a><a class="code" href="group__AESNI.html#ga1f3a02ea711ae6bacb0875f11a255516">00123</a> R123_STATIC_INLINE <a class="code" href="structr123array4x32.html">ars4x32_key_t</a> <a class="code" href="group__AESNI.html#ga1f3a02ea711ae6bacb0875f11a255516">ars4x32keyinit</a>(<a class="code" href="structr123array4x32.html">ars4x32_ukey_t</a> uk) { <span class="keywordflow">return</span> uk; }
+<a name="l00125"></a><a class="code" href="group__AESNI.html#gab13b093252d4bb3389d27d4e3b04dae8">00125</a> R123_STATIC_INLINE <a class="code" href="structr123array4x32.html">ars4x32_ctr_t</a> <a class="code" href="group__AESNI.html#gab13b093252d4bb3389d27d4e3b04dae8">ars4x32_R</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Nrounds, <a class="code" href="structr123array4x32.html">ars4x32_ctr_t</a> c, <a class="code" href="structr123array4x32.html">ars4x [...]
+<a name="l00126"></a>00126     <a class="code" href="structr123array1xm128i.html">ars1xm128i_ctr_t</a> c128;
+<a name="l00127"></a>00127     <a class="code" href="structr123array1xm128i.html">ars1xm128i_key_t</a> k128;
+<a name="l00128"></a>00128     c128.<a class="code" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a>[0].<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a> = _mm_set_epi32(c.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a>[3], c.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a>[2], c.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa [...]
+<a name="l00129"></a>00129     k128.<a class="code" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a>[0].<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a> = _mm_set_epi32(k.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a>[3], k.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a>[2], k.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa [...]
+<a name="l00130"></a>00130     c128 = <a class="code" href="group__AESNI.html#gaddc6efc2007f6f66ee914eb7074cff1e">ars1xm128i_R</a>(Nrounds, c128, k128);
+<a name="l00131"></a>00131     _mm_storeu_si128((__m128i*)&c.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a>[0], c128.<a class="code" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a>[0].<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a>);
+<a name="l00132"></a>00132     <span class="keywordflow">return</span> c;
+<a name="l00133"></a>00133 }
+<a name="l00134"></a>00134 
+<a name="l00138"></a><a class="code" href="group__AESNI.html#ga088ecbf341caf05e491ce246f2ea2d30">00138</a> <span class="preprocessor">#define ars4x32(c,k) ars4x32_R(ars4x32_rounds, c, k)</span>
+<a name="l00139"></a>00139 <span class="preprocessor"></span>
+<a name="l00140"></a>00140 <span class="preprocessor">#ifdef __cplusplus</span>
+<a name="l00141"></a>00141 <span class="preprocessor"></span><span class="keyword">namespace </span>r123{
+<a name="l00163"></a>00163 <span class="keyword">template</span><<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ROUNDS>
+<a name="l00164"></a><a class="code" href="structr123_1_1ARS1xm128i__R.html">00164</a> <span class="keyword">struct </span><a class="code" href="structr123_1_1ARS1xm128i__R.html">ARS1xm128i_R</a>{
+<a name="l00165"></a><a class="code" href="structr123_1_1ARS1xm128i__R.html#a13a62c94f63054828c6960979f42a268">00165</a>     <span class="keyword">typedef</span> <a class="code" href="structr123array1xm128i.html">ars1xm128i_ctr_t</a> <a class="code" href="structr123array1xm128i.html">ctr_type</a>;
+<a name="l00166"></a><a class="code" href="structr123_1_1ARS1xm128i__R.html#a8454d6de92379d9a6551d11828fbebc3">00166</a>     <span class="keyword">typedef</span> <a class="code" href="structr123array1xm128i.html">ars1xm128i_key_t</a> <a class="code" href="structr123array1xm128i.html">key_type</a>;
+<a name="l00167"></a><a class="code" href="structr123_1_1ARS1xm128i__R.html#ab26c7029e347e6b1e17dad795e462aeb">00167</a>     <span class="keyword">typedef</span> <a class="code" href="structr123array1xm128i.html">ars1xm128i_key_t</a> <a class="code" href="structr123array1xm128i.html">ukey_type</a>;
+<a name="l00168"></a><a class="code" href="structr123_1_1ARS1xm128i__R.html#abe167a93280140e424d722c1ac47a8e9">00168</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structr123_1_1ARS1xm128i__R.html#abe167a93280140e424d722c1ac47a8e9">rounds</a>=ROUNDS;
+<a name="l00169"></a><a class="code" href="structr123_1_1ARS1xm128i__R.html#a89c0fc4e1c90ee684fc88dde05d8d82c">00169</a>     R123_FORCE_INLINE(<a class="code" href="structr123array1xm128i.html">ctr_type</a> <span class="keyword">operator</span>()(<a class="code" href="structr123array1xm128i.html">ctr_type</a> ctr, <a class="code" href="structr123array1xm128i.html">key_type</a> key) <span class="keyword">const</span>){
+<a name="l00170"></a>00170         <span class="keywordflow">return</span> <a class="code" href="group__AESNI.html#gaddc6efc2007f6f66ee914eb7074cff1e">ars1xm128i_R</a>(ROUNDS, ctr, key);
+<a name="l00171"></a>00171     }
+<a name="l00172"></a>00172 };
+<a name="l00173"></a>00173 
+<a name="l00178"></a>00178 <span class="keyword">template</span><<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ROUNDS>
+<a name="l00179"></a><a class="code" href="structr123_1_1ARS4x32__R.html">00179</a> <span class="keyword">struct </span><a class="code" href="structr123_1_1ARS4x32__R.html">ARS4x32_R</a>{
+<a name="l00180"></a><a class="code" href="structr123_1_1ARS4x32__R.html#a9951dbcb50de849ded7177109b344045">00180</a>     <span class="keyword">typedef</span> <a class="code" href="structr123array4x32.html">ars4x32_ctr_t</a> <a class="code" href="structr123array4x32.html">ctr_type</a>;
+<a name="l00181"></a><a class="code" href="structr123_1_1ARS4x32__R.html#a7a651b6747b9e7c038bc6d11ffa2863e">00181</a>     <span class="keyword">typedef</span> <a class="code" href="structr123array4x32.html">ars4x32_key_t</a> <a class="code" href="structr123array4x32.html">key_type</a>;
+<a name="l00182"></a><a class="code" href="structr123_1_1ARS4x32__R.html#aa4bd7be98acb8b0299fb0ffce3db69ee">00182</a>     <span class="keyword">typedef</span> <a class="code" href="structr123array4x32.html">ars4x32_key_t</a> <a class="code" href="structr123array4x32.html">ukey_type</a>;
+<a name="l00183"></a><a class="code" href="structr123_1_1ARS4x32__R.html#a710e59a54794b4cd5e55689dd906b9ba">00183</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structr123_1_1ARS4x32__R.html#a710e59a54794b4cd5e55689dd906b9ba">rounds</a>=ROUNDS;
+<a name="l00184"></a><a class="code" href="structr123_1_1ARS4x32__R.html#afcd326e150925e30de22166e727567df">00184</a>     R123_FORCE_INLINE(<a class="code" href="structr123array4x32.html">ctr_type</a> <span class="keyword">operator</span>()(<a class="code" href="structr123array4x32.html">ctr_type</a> ctr, <a class="code" href="structr123array4x32.html">key_type</a> key) <span class="keyword">const</span>){
+<a name="l00185"></a>00185         <span class="keywordflow">return</span> <a class="code" href="group__AESNI.html#gab13b093252d4bb3389d27d4e3b04dae8">ars4x32_R</a>(ROUNDS, ctr, key);
+<a name="l00186"></a>00186     }
+<a name="l00187"></a>00187 };
+<a name="l00196"></a><a class="code" href="namespacer123.html#a964aa9123913d1f8cf535e0caaa4155f">00196</a> <span class="keyword">typedef</span> <a class="code" href="structr123_1_1ARS1xm128i__R.html">ARS1xm128i_R<ars1xm128i_rounds></a> <a class="code" href="structr123_1_1ARS1xm128i__R.html">ARS1xm128i</a>;
+<a name="l00197"></a><a class="code" href="namespacer123.html#afd2070dc979024a14317bd57c3a4c352">00197</a> <span class="keyword">typedef</span> <a class="code" href="structr123_1_1ARS4x32__R.html">ARS4x32_R<ars4x32_rounds></a> <a class="code" href="structr123_1_1ARS4x32__R.html">ARS4x32</a>;
+<a name="l00198"></a>00198 } <span class="comment">// namespace r123</span>
+<a name="l00199"></a>00199 
+<a name="l00200"></a>00200 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
+<a name="l00201"></a>00201 
+<a name="l00202"></a>00202 <span class="preprocessor">#endif </span><span class="comment">/* R123_USE_AES_NI */</span>
+<a name="l00203"></a>00203 
+<a name="l00204"></a>00204 <span class="preprocessor">#endif</span>
+</pre></div></div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/bc_s.png b/lib/Random123-1.08/docs/html/bc_s.png
new file mode 100644
index 0000000..e401862
Binary files /dev/null and b/lib/Random123-1.08/docs/html/bc_s.png differ
diff --git a/lib/Random123-1.08/docs/html/cbrng_8dox.html b/lib/Random123-1.08/docs/html/cbrng_8dox.html
new file mode 100644
index 0000000..c02c789
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/cbrng_8dox.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: docs/cbrng.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/cbrng.dox File Reference</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+</table>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/classes.html b/lib/Random123-1.08/docs/html/classes.html
new file mode 100644
index 0000000..f9384b4
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/classes.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Alphabetical List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li class="current"><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Class Index</h1>  </div>
+</div>
+<div class="contents">
+<div class="qindex"><a class="qindex" href="#letter_A">A</a> | <a class="qindex" href="#letter_E">E</a> | <a class="qindex" href="#letter_M">M</a> | <a class="qindex" href="#letter_P">P</a> | <a class="qindex" href="#letter_R">R</a> | <a class="qindex" href="#letter_T">T</a></div>
+<table align="center" width="95%" border="0" cellspacing="0" cellpadding="0">
+<tr><td><a name="letter_A"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  A  </div></td></tr></table>
+</td><td><a class="el" href="structr123_1_1ARS4x32__R.html">ARS4x32_R</a> (<a class="el" href="namespacer123.html">r123</a>)   </td><td><a class="el" href="structr123_1_1Philox2x64__R.html">Philox2x64_R</a> (<a class="el" href="namespacer123.html">r123</a>)   </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a>   </td><td><a class="el" href="structr123_1_1ReinterpretCtr.html">ReinterpretCtr</a> (<a class="el" href="na [...]
+</td><td><a class="el" href="structr123_1_1Philox4x32__R.html">Philox4x32_R</a> (<a class="el" href="namespacer123.html">r123</a>)   </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a>   </td><td><a name="letter_T"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  T  </div></td></tr></table>
+</td></tr><tr><td><a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a>   </td><td><a class="el" href="structr123_1_1Engine.html">Engine</a> (<a class="el" href="namespacer123.html">r123</a>)   </td><td><a class="el" href="structr123_1_1Philox4x64__R.html">Philox4x64_R</a> (<a class="el" href="namespacer123.html">r123</a>)   </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a>   </td><td [...]
+</td><td><a name="letter_R"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  R  </div></td></tr></table>
+</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a>   </td><td><a class="el" href="structr123_1_1Threefry2x64__R.html">Threefry2x64_R</a> (<a class="el" href="namespacer123.html">r123</a>)   </td></tr><tr><td><a class="el" href="structr123_1_1AESNI4x32.html">AESNI4x32</a> (<a class="el" href="namespacer123.html">r123</a>)   </td><td><a class="el" href="classr123_1_1MicroURNG.html">MicroURNG</a> (<a class="el" href="namespa [...]
+</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a>   </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a>   </td><td><a class="el" href="structr123_1_1Threefry4x64__R.html">Threefry4x64_R</a> (<a class="el" href="namespacer123.html">r123</a>)   </td></tr><tr><td><a class="el" href="structr123_1_1ARS1xm128i__R.html">ARS1xm128i_R</a> (<a class="el" href="namespacer123.html">r123</a>)   </t [...]
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/classr123_1_1AESNI1xm128i-members.html b/lib/Random123-1.08/docs/html/classr123_1_1AESNI1xm128i-members.html
new file mode 100644
index 0000000..dfd23c2
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/classr123_1_1AESNI1xm128i-members.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::AESNI1xm128i Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123_1_1AESNI1xm128i.html">r123::AESNI1xm128i</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI1xm128i.html#aaa136c21db9806859fa7cd4e2dbaaaa6">ctr_type</a> typedef</td><td><a class="el" href="structr123_1_1AESNI1xm128i.html">r123::AESNI1xm128i</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI1xm128i.html#a7dc33fd5abf509d9d16b571b23867a6b">key_type</a> typedef</td><td><a class="el" href="structr123_1_1AESNI1xm128i.html">r123::AESNI1xm128i</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI1xm128i.html#a9bff0ac8478400c1006136e9bde91dc3">operator()</a>(ctr_type ctr, key_type key) const </td><td><a class="el" href="structr123_1_1AESNI1xm128i.html">r123::AESNI1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI1xm128i.html#a1b5a44afde814ba844d8f5442e2a3a5f">rounds</a></td><td><a class="el" href="structr123_1_1AESNI1xm128i.html">r123::AESNI1xm128i</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI1xm128i.html#a1f405533da84d98b938030190a63cec5">ukey_type</a> typedef</td><td><a class="el" href="structr123_1_1AESNI1xm128i.html">r123::AESNI1xm128i</a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/classr123_1_1AESNI1xm128i__R-members.html b/lib/Random123-1.08/docs/html/classr123_1_1AESNI1xm128i__R-members.html
new file mode 100644
index 0000000..eead156
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/classr123_1_1AESNI1xm128i__R-members.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::AESNI1xm128i_R< ROUNDS > Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123_1_1AESNI1xm128i__R.html">r123::AESNI1xm128i_R< ROUNDS ></a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI1xm128i.html#aaa136c21db9806859fa7cd4e2dbaaaa6">ctr_type</a> typedef</td><td><a class="el" href="structr123_1_1AESNI1xm128i.html">r123::AESNI1xm128i</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI1xm128i.html#a7dc33fd5abf509d9d16b571b23867a6b">key_type</a> typedef</td><td><a class="el" href="structr123_1_1AESNI1xm128i.html">r123::AESNI1xm128i</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI1xm128i.html#a9bff0ac8478400c1006136e9bde91dc3">operator()</a>(ctr_type ctr, key_type key) const </td><td><a class="el" href="structr123_1_1AESNI1xm128i.html">r123::AESNI1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI1xm128i.html#a1b5a44afde814ba844d8f5442e2a3a5f">rounds</a></td><td><a class="el" href="structr123_1_1AESNI1xm128i.html">r123::AESNI1xm128i</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI1xm128i.html#a1f405533da84d98b938030190a63cec5">ukey_type</a> typedef</td><td><a class="el" href="structr123_1_1AESNI1xm128i.html">r123::AESNI1xm128i</a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/classr123_1_1AESNI4x32__R-members.html b/lib/Random123-1.08/docs/html/classr123_1_1AESNI4x32__R-members.html
new file mode 100644
index 0000000..a42683e
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/classr123_1_1AESNI4x32__R-members.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::AESNI4x32_R< ROUNDS > Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123_1_1AESNI4x32__R.html">r123::AESNI4x32_R< ROUNDS ></a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI4x32.html#ab8a1f8a822eecfc9e587bad76792df32">ctr_type</a> typedef</td><td><a class="el" href="structr123_1_1AESNI4x32.html">r123::AESNI4x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI4x32.html#a3f47cb319d03ede5fd557800b618d28a">key_type</a> typedef</td><td><a class="el" href="structr123_1_1AESNI4x32.html">r123::AESNI4x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI4x32.html#a981102e5bc0a7df916a95a40af8fd4c0">operator()</a>(ctr_type ctr, key_type key) const </td><td><a class="el" href="structr123_1_1AESNI4x32.html">r123::AESNI4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI4x32.html#a725aad79b8d496d97bed24390f624be6">rounds</a></td><td><a class="el" href="structr123_1_1AESNI4x32.html">r123::AESNI4x32</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI4x32.html#a3fbb6113e70575dce3b6047a22a751f4">ukey_type</a> typedef</td><td><a class="el" href="structr123_1_1AESNI4x32.html">r123::AESNI4x32</a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/classr123_1_1ARS1xm128i__R-members.html b/lib/Random123-1.08/docs/html/classr123_1_1ARS1xm128i__R-members.html
new file mode 100644
index 0000000..3c84ade
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/classr123_1_1ARS1xm128i__R-members.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::ARS1xm128i_R< ROUNDS > Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i_R< ROUNDS ></a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1ARS1xm128i__R.html#a13a62c94f63054828c6960979f42a268">ctr_type</a> typedef</td><td><a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i_R< ROUNDS ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1ARS1xm128i__R.html#a8454d6de92379d9a6551d11828fbebc3">key_type</a> typedef</td><td><a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i_R< ROUNDS ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1ARS1xm128i__R.html#a89c0fc4e1c90ee684fc88dde05d8d82c">operator()</a>(ctr_type ctr, key_type key) const </td><td><a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i_R< ROUNDS ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1ARS1xm128i__R.html#abe167a93280140e424d722c1ac47a8e9">rounds</a></td><td><a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i_R< ROUNDS ></a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1ARS1xm128i__R.html#ab26c7029e347e6b1e17dad795e462aeb">ukey_type</a> typedef</td><td><a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i_R< ROUNDS ></a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/classr123_1_1ARS4x32__R-members.html b/lib/Random123-1.08/docs/html/classr123_1_1ARS4x32__R-members.html
new file mode 100644
index 0000000..35f5157
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/classr123_1_1ARS4x32__R-members.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::ARS4x32_R< ROUNDS > Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R< ROUNDS ></a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1ARS4x32__R.html#a9951dbcb50de849ded7177109b344045">ctr_type</a> typedef</td><td><a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R< ROUNDS ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1ARS4x32__R.html#a7a651b6747b9e7c038bc6d11ffa2863e">key_type</a> typedef</td><td><a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R< ROUNDS ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1ARS4x32__R.html#afcd326e150925e30de22166e727567df">operator()</a>(ctr_type ctr, key_type key) const </td><td><a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R< ROUNDS ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1ARS4x32__R.html#a710e59a54794b4cd5e55689dd906b9ba">rounds</a></td><td><a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R< ROUNDS ></a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1ARS4x32__R.html#aa4bd7be98acb8b0299fb0ffce3db69ee">ukey_type</a> typedef</td><td><a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R< ROUNDS ></a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/classr123_1_1MicroURNG-members.html b/lib/Random123-1.08/docs/html/classr123_1_1MicroURNG-members.html
new file mode 100644
index 0000000..8197fb1
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/classr123_1_1MicroURNG-members.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::MicroURNG< CBRNG > Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="classr123_1_1MicroURNG.html#a4faecd7ab54c7678ee66c413bb984bf0">_Max</a></td><td><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classr123_1_1MicroURNG.html#a1f2787f136a8a807d14eab8cb1ca8c14">_Min</a></td><td><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classr123_1_1MicroURNG.html#ac55cddda8fe0808f922f39beee587b27">BITS</a></td><td><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classr123_1_1MicroURNG.html#ab0b3a77c9408dbcb2f9d6b5c67e9c3f7">cbrng_type</a> typedef</td><td><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classr123_1_1MicroURNG.html#a30f52334b7cfcbe6d86870496ca57ea6">counter</a>() const </td><td><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a> typedef</td><td><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classr123_1_1MicroURNG.html#aef90e6157f360434342ad0df4ce5f364">key_type</a> typedef</td><td><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classr123_1_1MicroURNG.html#a19afb80312c370e1670bf8afc73d802e">MicroURNG</a>(cbrng_type _b, ctr_type _c0, ukey_type _uk)</td><td><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classr123_1_1MicroURNG.html#a7ecf43819bc96804892a78c6715f587b">MicroURNG</a>(ctr_type _c0, ukey_type _uk)</td><td><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classr123_1_1MicroURNG.html#a64cd4d33b4cab5d3d9c556db68407b77">operator()</a>()</td><td><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classr123_1_1MicroURNG.html#aa05c857c01053cf9185406d69757b101">R123_NO_MACRO_SUBST</a>()</td><td><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classr123_1_1MicroURNG.html#a3af623b6366d6e848d67d72e4b0f363c">R123_NO_MACRO_SUBST</a>()</td><td><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classr123_1_1MicroURNG.html#add2f214254ddc2291e3b2c8b5dbe791a">reset</a>(ctr_type _c0, ukey_type _uk)</td><td><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> typedef</td><td><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classr123_1_1MicroURNG.html#a7e6fd93fec2fe138ee36b401ff376cfc">ukey_type</a> typedef</td><td><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/classr123_1_1MicroURNG.html b/lib/Random123-1.08/docs/html/classr123_1_1MicroURNG.html
new file mode 100644
index 0000000..97758d9
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/classr123_1_1MicroURNG.html
@@ -0,0 +1,436 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123::MicroURNG< CBRNG > Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath">
+    <ul>
+      <li><a class="el" href="namespacer123.html">r123</a>      </li>
+      <li><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-methods">Static Public Member Functions</a> |
+<a href="#pub-static-attribs">Static Public Attributes</a>  </div>
+  <div class="headertitle">
+<h1>r123::MicroURNG< CBRNG > Class Template Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123::MicroURNG" -->
+<p><code>#include <<a class="el" href="MicroURNG_8hpp_source.html">Random123/MicroURNG.hpp</a>></code></p>
+
+<p><a href="classr123_1_1MicroURNG-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef CBRNG </td><td class="memItemRight" valign="bottom"><a class="el" href="classr123_1_1MicroURNG.html#ab0b3a77c9408dbcb2f9d6b5c67e9c3f7">cbrng_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef cbrng_type::ctr_type </td><td class="memItemRight" valign="bottom"><a class="el" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef cbrng_type::key_type </td><td class="memItemRight" valign="bottom"><a class="el" href="classr123_1_1MicroURNG.html#aef90e6157f360434342ad0df4ce5f364">key_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef cbrng_type::ukey_type </td><td class="memItemRight" valign="bottom"><a class="el" href="classr123_1_1MicroURNG.html#a7e6fd93fec2fe138ee36b401ff376cfc">ukey_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef ctr_type::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="classr123_1_1MicroURNG.html#a64cd4d33b4cab5d3d9c556db68407b77">operator()</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classr123_1_1MicroURNG.html#a19afb80312c370e1670bf8afc73d802e">MicroURNG</a> (<a class="el" href="classr123_1_1MicroURNG.html#ab0b3a77c9408dbcb2f9d6b5c67e9c3f7">cbrng_type</a> _b, <a class="el" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a> _c0, <a class="el" href="classr123_1_1MicroURNG.html#a7e6fd93fec2fe138ee36b401ff376cfc">u [...]
+<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classr123_1_1MicroURNG.html#a7ecf43819bc96804892a78c6715f587b">MicroURNG</a> (<a class="el" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a> _c0, <a class="el" href="classr123_1_1MicroURNG.html#a7e6fd93fec2fe138ee36b401ff376cfc">ukey_type</a> _uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="classr123_1_1MicroURNG.html#a30f52334b7cfcbe6d86870496ca57ea6">counter</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classr123_1_1MicroURNG.html#add2f214254ddc2291e3b2c8b5dbe791a">reset</a> (<a class="el" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a> _c0, <a class="el" href="classr123_1_1MicroURNG.html#a7e6fd93fec2fe138ee36b401ff376cfc">ukey_type</a> _uk)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static R123_CONSTEXPR <br class="typebreak"/>
+<a class="el" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> min </td><td class="memItemRight" valign="bottom"><a class="el" href="classr123_1_1MicroURNG.html#aa05c857c01053cf9185406d69757b101">R123_NO_MACRO_SUBST</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static R123_CONSTEXPR <br class="typebreak"/>
+<a class="el" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> max </td><td class="memItemRight" valign="bottom"><a class="el" href="classr123_1_1MicroURNG.html#a3af623b6366d6e848d67d72e4b0f363c">R123_NO_MACRO_SUBST</a> ()</td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="classr123_1_1MicroURNG.html#ac55cddda8fe0808f922f39beee587b27">BITS</a> = 32</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="classr123_1_1MicroURNG.html#a1f2787f136a8a807d14eab8cb1ca8c14">_Min</a> = 0</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="classr123_1_1MicroURNG.html#a4faecd7ab54c7678ee66c413bb984bf0">_Max</a> = ~((<a class="el" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a>)0)</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template<typename CBRNG><br/>
+ class r123::MicroURNG< CBRNG ></h3>
+
+<p>Given a CBRNG whose ctr_type has an unsigned integral value_type, MicroURNG<CBRNG>(c, k) is a type that satisfies the requirements of a C++0x Uniform Random Number Generator.</p>
+<p>The intended purpose is for a <a class="el" href="classr123_1_1MicroURNG.html">MicroURNG</a> to be passed as an argument to a C++0x Distribution, e.g., std::normal_distribution. See examples/MicroURNG.cpp.</p>
+<p>The <a class="el" href="classr123_1_1MicroURNG.html">MicroURNG</a> functor has a period of "only"</p>
+<p>ctr_type.size()*2^32,</p>
+<p>after which it will silently repeat.</p>
+<p>The high 32 bits of the highest word in the counter c, passed to the constructor must be zero. <a class="el" href="classr123_1_1MicroURNG.html">MicroURNG</a> uses these bits to "count".</p>
+<p>Older versions of the library permitted a second template parameter by which the caller could control the number of bits devoted to the URNG's internal counter. This flexibility has been disabled because URNGs created with different numbers of counter bits could, conceivably "collide".</p>
+<div class="fragment"><pre class="fragment">       <span class="keyword">typedef</span> ?someCBRNG? RNG;
+       RNG::ctr_type c = ...; <span class="comment">// under application control</span>
+       RNG::key_type k = ...; <span class="comment">// </span>
+       std::normal_distribution<float> nd;
+       MicroURNG<RNG> urng(c, k);
+       <span class="keywordflow">for</span>(???){
+         ...
+         nd(urng);  <span class="comment">// may be called several hundred times with BITS=10</span>
+         ...
+       }
+</pre></div> <hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="ab0b3a77c9408dbcb2f9d6b5c67e9c3f7"></a><!-- doxytag: member="r123::MicroURNG::cbrng_type" ref="ab0b3a77c9408dbcb2f9d6b5c67e9c3f7" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef CBRNG <a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG</a>< CBRNG >::<a class="el" href="classr123_1_1MicroURNG.html#ab0b3a77c9408dbcb2f9d6b5c67e9c3f7">cbrng_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5aba882fd21e4d8f1a445f546e1e4476"></a><!-- doxytag: member="r123::MicroURNG::ctr_type" ref="a5aba882fd21e4d8f1a445f546e1e4476" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef cbrng_type::ctr_type <a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG</a>< CBRNG >::<a class="el" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aef90e6157f360434342ad0df4ce5f364"></a><!-- doxytag: member="r123::MicroURNG::key_type" ref="aef90e6157f360434342ad0df4ce5f364" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef cbrng_type::key_type <a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG</a>< CBRNG >::<a class="el" href="classr123_1_1MicroURNG.html#aef90e6157f360434342ad0df4ce5f364">key_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a512957c3e7b3d22741ef0a436b973c2b"></a><!-- doxytag: member="r123::MicroURNG::result_type" ref="a512957c3e7b3d22741ef0a436b973c2b" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef ctr_type::value_type <a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG</a>< CBRNG >::<a class="el" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7e6fd93fec2fe138ee36b401ff376cfc"></a><!-- doxytag: member="r123::MicroURNG::ukey_type" ref="a7e6fd93fec2fe138ee36b401ff376cfc" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef cbrng_type::ukey_type <a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG</a>< CBRNG >::<a class="el" href="classr123_1_1MicroURNG.html#a7e6fd93fec2fe138ee36b401ff376cfc">ukey_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" id="a19afb80312c370e1670bf8afc73d802e"></a><!-- doxytag: member="r123::MicroURNG::MicroURNG" ref="a19afb80312c370e1670bf8afc73d802e" args="(cbrng_type _b, ctr_type _c0, ukey_type _uk)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG</a>< CBRNG >::<a class="el" href="classr123_1_1MicroURNG.html">MicroURNG</a> </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="classr123_1_1MicroURNG.html#ab0b3a77c9408dbcb2f9d6b5c67e9c3f7">cbrng_type</a> </td>
+          <td class="paramname"> <em>_b</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a> </td>
+          <td class="paramname"> <em>_c0</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="classr123_1_1MicroURNG.html#a7e6fd93fec2fe138ee36b401ff376cfc">ukey_type</a> </td>
+          <td class="paramname"> <em>_uk</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7ecf43819bc96804892a78c6715f587b"></a><!-- doxytag: member="r123::MicroURNG::MicroURNG" ref="a7ecf43819bc96804892a78c6715f587b" args="(ctr_type _c0, ukey_type _uk)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG</a>< CBRNG >::<a class="el" href="classr123_1_1MicroURNG.html">MicroURNG</a> </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a> </td>
+          <td class="paramname"> <em>_c0</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="classr123_1_1MicroURNG.html#a7e6fd93fec2fe138ee36b401ff376cfc">ukey_type</a> </td>
+          <td class="paramname"> <em>_uk</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a30f52334b7cfcbe6d86870496ca57ea6"></a><!-- doxytag: member="r123::MicroURNG::counter" ref="a30f52334b7cfcbe6d86870496ca57ea6" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">const <a class="el" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a>& <a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG</a>< CBRNG >::counter </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a64cd4d33b4cab5d3d9c556db68407b77"></a><!-- doxytag: member="r123::MicroURNG::operator()" ref="a64cd4d33b4cab5d3d9c556db68407b77" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> <a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG</a>< CBRNG >::operator() </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa05c857c01053cf9185406d69757b101"></a><!-- doxytag: member="r123::MicroURNG::R123_NO_MACRO_SUBST" ref="aa05c857c01053cf9185406d69757b101" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">static R123_CONSTEXPR <a class="el" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> min <a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG</a>< CBRNG >::R123_NO_MACRO_SUBST </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3af623b6366d6e848d67d72e4b0f363c"></a><!-- doxytag: member="r123::MicroURNG::R123_NO_MACRO_SUBST" ref="a3af623b6366d6e848d67d72e4b0f363c" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">static R123_CONSTEXPR <a class="el" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> max <a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG</a>< CBRNG >::R123_NO_MACRO_SUBST </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="add2f214254ddc2291e3b2c8b5dbe791a"></a><!-- doxytag: member="r123::MicroURNG::reset" ref="add2f214254ddc2291e3b2c8b5dbe791a" args="(ctr_type _c0, ukey_type _uk)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void <a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG</a>< CBRNG >::reset </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">ctr_type</a> </td>
+          <td class="paramname"> <em>_c0</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="classr123_1_1MicroURNG.html#a7e6fd93fec2fe138ee36b401ff376cfc">ukey_type</a> </td>
+          <td class="paramname"> <em>_uk</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="a4faecd7ab54c7678ee66c413bb984bf0"></a><!-- doxytag: member="r123::MicroURNG::_Max" ref="a4faecd7ab54c7678ee66c413bb984bf0" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">const <a class="el" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> <a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG</a>< CBRNG >::<a class="el" href="classr123_1_1MicroURNG.html#a4faecd7ab54c7678ee66c413bb984bf0">_Max</a> = ~((<a class="el" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a>)0)<code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1f2787f136a8a807d14eab8cb1ca8c14"></a><!-- doxytag: member="r123::MicroURNG::_Min" ref="a1f2787f136a8a807d14eab8cb1ca8c14" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">const <a class="el" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">result_type</a> <a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG</a>< CBRNG >::<a class="el" href="classr123_1_1MicroURNG.html#a1f2787f136a8a807d14eab8cb1ca8c14">_Min</a> = 0<code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac55cddda8fe0808f922f39beee587b27"></a><!-- doxytag: member="r123::MicroURNG::BITS" ref="ac55cddda8fe0808f922f39beee587b27" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">const int <a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG</a>< CBRNG >::<a class="el" href="classr123_1_1MicroURNG.html#ac55cddda8fe0808f922f39beee587b27">BITS</a> = 32<code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>Random123/<a class="el" href="MicroURNG_8hpp_source.html">MicroURNG.hpp</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/classr123_1_1Philox2x32__R-members.html b/lib/Random123-1.08/docs/html/classr123_1_1Philox2x32__R-members.html
new file mode 100644
index 0000000..d1ff45c
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/classr123_1_1Philox2x32__R-members.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::Philox2x32_R< ROUNDS > Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32_R< ROUNDS ></a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox2x32__R.html#af00c84c482900fbeca6bd2043395e599">ctr_type</a> typedef</td><td><a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32_R< ROUNDS ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox2x32__R.html#a37dac768d36ef39e0228369e91b9f0ab">key_type</a> typedef</td><td><a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32_R< ROUNDS ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox2x32__R.html#ab610a200c9fa62d090f31466b655c780">operator()</a>(ctr_type ctr, key_type key) const </td><td><a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32_R< ROUNDS ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox2x32__R.html#a52ee7b34688fc2e5315152a10d7df5f0">rounds</a></td><td><a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32_R< ROUNDS ></a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox2x32__R.html#a8982960eb5a3b5afc26c8e8d6639275e">ukey_type</a> typedef</td><td><a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32_R< ROUNDS ></a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/classr123_1_1Philox2x64__R-members.html b/lib/Random123-1.08/docs/html/classr123_1_1Philox2x64__R-members.html
new file mode 100644
index 0000000..68fcace
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/classr123_1_1Philox2x64__R-members.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::Philox2x64_R< ROUNDS > Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64_R< ROUNDS ></a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox2x64__R.html#a8e615e3f4680b9e1b986ea071fd173fc">ctr_type</a> typedef</td><td><a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64_R< ROUNDS ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox2x64__R.html#adb8a638d3d96ef0ab594b0320bae329f">key_type</a> typedef</td><td><a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64_R< ROUNDS ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox2x64__R.html#a04f6039e87a958593ac011d9304d7ec9">operator()</a>(ctr_type ctr, key_type key) const </td><td><a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64_R< ROUNDS ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox2x64__R.html#ac0764d78e07bf6d311b47d0f3ce92450">rounds</a></td><td><a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64_R< ROUNDS ></a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox2x64__R.html#a0c4cfeb8c3f00d1755ee047790c9da1c">ukey_type</a> typedef</td><td><a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64_R< ROUNDS ></a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/classr123_1_1Philox4x32__R-members.html b/lib/Random123-1.08/docs/html/classr123_1_1Philox4x32__R-members.html
new file mode 100644
index 0000000..71bdd60
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/classr123_1_1Philox4x32__R-members.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::Philox4x32_R< ROUNDS > Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32_R< ROUNDS ></a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox4x32__R.html#a23adf0320faed0fe4d12ebececdba50a">ctr_type</a> typedef</td><td><a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32_R< ROUNDS ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox4x32__R.html#afa2e99f3e0b635f17ba9e16c186af63b">key_type</a> typedef</td><td><a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32_R< ROUNDS ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox4x32__R.html#adf05bdc0c856c9541db656711fd8c7d1">operator()</a>(ctr_type ctr, key_type key) const </td><td><a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32_R< ROUNDS ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox4x32__R.html#a90d6a86bff4dc6e5e24209423f125140">rounds</a></td><td><a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32_R< ROUNDS ></a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox4x32__R.html#a804c8700155da93039c339ac83df99dd">ukey_type</a> typedef</td><td><a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32_R< ROUNDS ></a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/classr123_1_1Philox4x64__R-members.html b/lib/Random123-1.08/docs/html/classr123_1_1Philox4x64__R-members.html
new file mode 100644
index 0000000..a09f147
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/classr123_1_1Philox4x64__R-members.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::Philox4x64_R< ROUNDS > Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64_R< ROUNDS ></a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox4x64__R.html#afd5f78b34ae7c478ebe16eb601f7b202">ctr_type</a> typedef</td><td><a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64_R< ROUNDS ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox4x64__R.html#a9947ce12e3d03f9a60396d79bb56ba1c">key_type</a> typedef</td><td><a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64_R< ROUNDS ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox4x64__R.html#aa5a0488aa6e16c55b7647c155b18462c">operator()</a>(ctr_type ctr, key_type key) const </td><td><a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64_R< ROUNDS ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox4x64__R.html#ac51193ab00b118b75784f86cf3470876">rounds</a></td><td><a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64_R< ROUNDS ></a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Philox4x64__R.html#a4715e37129fb4ca9d7671cb9df4fa8c5">ukey_type</a> typedef</td><td><a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64_R< ROUNDS ></a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/classr123_1_1Threefry2x32__R-members.html b/lib/Random123-1.08/docs/html/classr123_1_1Threefry2x32__R-members.html
new file mode 100644
index 0000000..34b1923
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/classr123_1_1Threefry2x32__R-members.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::Threefry2x32_R< R > Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32_R< R ></a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry2x32__R.html#a60b1b58aeaa05d467607dc570aed1357">ctr_type</a> typedef</td><td><a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32_R< R ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry2x32__R.html#abfaaff871ef5e2e2cf397884ddab4cdc">key_type</a> typedef</td><td><a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32_R< R ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry2x32__R.html#a64b8018e82f3e7a0e252166b15b42a71">operator()</a>(ctr_type ctr, key_type key)</td><td><a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32_R< R ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry2x32__R.html#af5be46f8426cfcd86e75327e4b3750b0">rounds</a></td><td><a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32_R< R ></a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry2x32__R.html#a3ab3969f7445f9fe935566fdc017c5ca">ukey_type</a> typedef</td><td><a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32_R< R ></a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/classr123_1_1Threefry2x64__R-members.html b/lib/Random123-1.08/docs/html/classr123_1_1Threefry2x64__R-members.html
new file mode 100644
index 0000000..16d134f
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/classr123_1_1Threefry2x64__R-members.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::Threefry2x64_R< R > Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64_R< R ></a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry2x64__R.html#a6b151f30bc5544671596b9df91e896d8">ctr_type</a> typedef</td><td><a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64_R< R ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry2x64__R.html#ae652f0e9ca6ec234fd2f4fc9afb1007c">key_type</a> typedef</td><td><a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64_R< R ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry2x64__R.html#ab654a85f2c4ec65548ddfc85dc00f27e">operator()</a>(ctr_type ctr, key_type key)</td><td><a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64_R< R ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry2x64__R.html#aa994d756504284e6a59cc8d3c57f16c6">rounds</a></td><td><a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64_R< R ></a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry2x64__R.html#a57db271865ab1889c8f569fb053ee66d">ukey_type</a> typedef</td><td><a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64_R< R ></a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/classr123_1_1Threefry4x32__R-members.html b/lib/Random123-1.08/docs/html/classr123_1_1Threefry4x32__R-members.html
new file mode 100644
index 0000000..9aaec83
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/classr123_1_1Threefry4x32__R-members.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::Threefry4x32_R< R > Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32_R< R ></a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry4x32__R.html#ae89dabc0060c62e0d9e5c4ac34a8550f">ctr_type</a> typedef</td><td><a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32_R< R ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry4x32__R.html#a140f5cf20bde7784d778b82f0ebf8778">key_type</a> typedef</td><td><a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32_R< R ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry4x32__R.html#ae0dfbf399015fab602c769ad90256231">operator()</a>(ctr_type ctr, key_type key)</td><td><a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32_R< R ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry4x32__R.html#af63fd38ba9acf04ee56d75e96b413291">rounds</a></td><td><a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32_R< R ></a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry4x32__R.html#aab22e360de3f5e13f018ccf3a6754a8f">ukey_type</a> typedef</td><td><a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32_R< R ></a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/classr123_1_1Threefry4x64__R-members.html b/lib/Random123-1.08/docs/html/classr123_1_1Threefry4x64__R-members.html
new file mode 100644
index 0000000..8242140
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/classr123_1_1Threefry4x64__R-members.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::Threefry4x64_R< R > Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64_R< R ></a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry4x64__R.html#a6c93334cb8a8b53ef01cc79b5296af0d">ctr_type</a> typedef</td><td><a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64_R< R ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry4x64__R.html#adb406d1af0e757bd8058582ee39f21dc">key_type</a> typedef</td><td><a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64_R< R ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry4x64__R.html#a09e7fb82f9b7bcf6ccb4d849116b6ec1">operator()</a>(ctr_type ctr, key_type key)</td><td><a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64_R< R ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry4x64__R.html#ab8807960eec8fc2198055ec2a971e116">rounds</a></td><td><a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64_R< R ></a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Threefry4x64__R.html#a087ff88f84d115a6a726e008c6dcc325">ukey_type</a> typedef</td><td><a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64_R< R ></a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/closed.png b/lib/Random123-1.08/docs/html/closed.png
new file mode 100644
index 0000000..b7d4bd9
Binary files /dev/null and b/lib/Random123-1.08/docs/html/closed.png differ
diff --git a/lib/Random123-1.08/docs/html/compilerfeatures_8h.html b/lib/Random123-1.08/docs/html/compilerfeatures_8h.html
new file mode 100644
index 0000000..954ab72
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/compilerfeatures_8h.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/features/compilerfeatures.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Random123/features/compilerfeatures.h File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="compilerfeatures_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+</table>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/compilerfeatures_8h_source.html b/lib/Random123-1.08/docs/html/compilerfeatures_8h_source.html
new file mode 100644
index 0000000..ca520a4
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/compilerfeatures_8h_source.html
@@ -0,0 +1,236 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/features/compilerfeatures.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>Random123/features/compilerfeatures.h</h1>  </div>
+</div>
+<div class="contents">
+<a href="compilerfeatures_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">Copyright 2010-2011, D. E. Shaw Research.</span>
+<a name="l00003"></a>00003 <span class="comment">All rights reserved.</span>
+<a name="l00004"></a>00004 <span class="comment"></span>
+<a name="l00005"></a>00005 <span class="comment">Redistribution and use in source and binary forms, with or without</span>
+<a name="l00006"></a>00006 <span class="comment">modification, are permitted provided that the following conditions are</span>
+<a name="l00007"></a>00007 <span class="comment">met:</span>
+<a name="l00008"></a>00008 <span class="comment"></span>
+<a name="l00009"></a>00009 <span class="comment">* Redistributions of source code must retain the above copyright</span>
+<a name="l00010"></a>00010 <span class="comment">  notice, this list of conditions, and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"></span>
+<a name="l00012"></a>00012 <span class="comment">* Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00013"></a>00013 <span class="comment">  notice, this list of conditions, and the following disclaimer in the</span>
+<a name="l00014"></a>00014 <span class="comment">  documentation and/or other materials provided with the distribution.</span>
+<a name="l00015"></a>00015 <span class="comment"></span>
+<a name="l00016"></a>00016 <span class="comment">* Neither the name of D. E. Shaw Research nor the names of its</span>
+<a name="l00017"></a>00017 <span class="comment">  contributors may be used to endorse or promote products derived from</span>
+<a name="l00018"></a>00018 <span class="comment">  this software without specific prior written permission.</span>
+<a name="l00019"></a>00019 <span class="comment"></span>
+<a name="l00020"></a>00020 <span class="comment">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span>
+<a name="l00021"></a>00021 <span class="comment">"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span>
+<a name="l00022"></a>00022 <span class="comment">LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span>
+<a name="l00023"></a>00023 <span class="comment">A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span>
+<a name="l00024"></a>00024 <span class="comment">OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
+<a name="l00025"></a>00025 <span class="comment">SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span>
+<a name="l00026"></a>00026 <span class="comment">LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span>
+<a name="l00027"></a>00027 <span class="comment">DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span>
+<a name="l00028"></a>00028 <span class="comment">THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00029"></a>00029 <span class="comment">(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span>
+<a name="l00030"></a>00030 <span class="comment">OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00031"></a>00031 <span class="comment">*/</span>
+<a name="l00190"></a>00190 <span class="comment">/* </span>
+<a name="l00191"></a>00191 <span class="comment">N.B.  When something is added to the list of features, it should be</span>
+<a name="l00192"></a>00192 <span class="comment">added to each of the *features.h files, AND to examples/ut_features.cpp.</span>
+<a name="l00193"></a>00193 <span class="comment">*/</span>
+<a name="l00194"></a>00194 
+<a name="l00195"></a>00195 <span class="comment">/* N.B.  most other compilers (icc, nvcc, open64, llvm) will also define __GNUC__, so order matters. */</span>
+<a name="l00196"></a>00196 <span class="preprocessor">#if defined(__OPENCL_VERSION__) && __OPENCL_VERSION__ > 0</span>
+<a name="l00197"></a>00197 <span class="preprocessor"></span><span class="preprocessor">#include "openclfeatures.h"</span>
+<a name="l00198"></a>00198 <span class="preprocessor">#elif defined(__CUDACC__)</span>
+<a name="l00199"></a>00199 <span class="preprocessor"></span><span class="preprocessor">#include "nvccfeatures.h"</span>
+<a name="l00200"></a>00200 <span class="preprocessor">#elif defined(__ICC)</span>
+<a name="l00201"></a>00201 <span class="preprocessor"></span><span class="preprocessor">#include "iccfeatures.h"</span>
+<a name="l00202"></a>00202 <span class="preprocessor">#elif defined(__xlC__)</span>
+<a name="l00203"></a>00203 <span class="preprocessor"></span><span class="preprocessor">#include "xlcfeatures.h"</span>
+<a name="l00204"></a>00204 <span class="preprocessor">#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)</span>
+<a name="l00205"></a>00205 <span class="preprocessor"></span><span class="preprocessor">#include "sunprofeatures.h"</span>
+<a name="l00206"></a>00206 <span class="preprocessor">#elif defined(__OPEN64__)</span>
+<a name="l00207"></a>00207 <span class="preprocessor"></span><span class="preprocessor">#include "open64features.h"</span>
+<a name="l00208"></a>00208 <span class="preprocessor">#elif defined(__clang__)</span>
+<a name="l00209"></a>00209 <span class="preprocessor"></span><span class="preprocessor">#include "clangfeatures.h"</span>
+<a name="l00210"></a>00210 <span class="preprocessor">#elif defined(__GNUC__)</span>
+<a name="l00211"></a>00211 <span class="preprocessor"></span><span class="preprocessor">#include "gccfeatures.h"</span>
+<a name="l00212"></a>00212 <span class="preprocessor">#elif defined(__PGI)</span>
+<a name="l00213"></a>00213 <span class="preprocessor"></span><span class="preprocessor">#include "pgccfeatures.h"</span>
+<a name="l00214"></a>00214 <span class="preprocessor">#elif defined(_MSC_FULL_VER)</span>
+<a name="l00215"></a>00215 <span class="preprocessor"></span><span class="preprocessor">#include "msvcfeatures.h"</span>
+<a name="l00216"></a>00216 <span class="preprocessor">#else</span>
+<a name="l00217"></a>00217 <span class="preprocessor"></span><span class="preprocessor">#error "Can't identify compiler.  You'll need to add a new xxfeatures.hpp"</span>
+<a name="l00218"></a>00218 <span class="preprocessor"></span>{ <span class="comment">/* maybe an unbalanced brace will terminate the compilation */</span>
+<a name="l00219"></a>00219 <span class="preprocessor">#endif</span>
+<a name="l00220"></a>00220 <span class="preprocessor"></span>
+<a name="l00221"></a>00221 <span class="preprocessor">#ifndef R123_USE_CXX11</span>
+<a name="l00222"></a>00222 <span class="preprocessor"></span><span class="preprocessor">#define R123_USE_CXX11 (__cplusplus >= 201103L)</span>
+<a name="l00223"></a>00223 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00224"></a>00224 <span class="preprocessor"></span>
+<a name="l00225"></a>00225 <span class="preprocessor">#ifndef R123_USE_CXX11_UNRESTRICTED_UNIONS</span>
+<a name="l00226"></a>00226 <span class="preprocessor"></span><span class="preprocessor">#define R123_USE_CXX11_UNRESTRICTED_UNIONS R123_USE_CXX11</span>
+<a name="l00227"></a>00227 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00228"></a>00228 <span class="preprocessor"></span>
+<a name="l00229"></a>00229 <span class="preprocessor">#ifndef R123_USE_CXX11_STATIC_ASSERT</span>
+<a name="l00230"></a>00230 <span class="preprocessor"></span><span class="preprocessor">#define R123_USE_CXX11_STATIC_ASSERT R123_USE_CXX11</span>
+<a name="l00231"></a>00231 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00232"></a>00232 <span class="preprocessor"></span>
+<a name="l00233"></a>00233 <span class="preprocessor">#ifndef R123_USE_CXX11_CONSTEXPR</span>
+<a name="l00234"></a>00234 <span class="preprocessor"></span><span class="preprocessor">#define R123_USE_CXX11_CONSTEXPR R123_USE_CXX11</span>
+<a name="l00235"></a>00235 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00236"></a>00236 <span class="preprocessor"></span>
+<a name="l00237"></a>00237 <span class="preprocessor">#ifndef R123_USE_CXX11_EXPLICIT_CONVERSIONS</span>
+<a name="l00238"></a>00238 <span class="preprocessor"></span><span class="preprocessor">#define R123_USE_CXX11_EXPLICIT_CONVERSIONS R123_USE_CXX11</span>
+<a name="l00239"></a>00239 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00240"></a>00240 <span class="preprocessor"></span>
+<a name="l00241"></a>00241 <span class="preprocessor">#ifndef R123_USE_CXX11_RANDOM</span>
+<a name="l00242"></a>00242 <span class="preprocessor"></span><span class="preprocessor">#define R123_USE_CXX11_RANDOM R123_USE_CXX11</span>
+<a name="l00243"></a>00243 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00244"></a>00244 <span class="preprocessor"></span>
+<a name="l00245"></a>00245 <span class="preprocessor">#ifndef R123_USE_CXX11_TYPE_TRAITS</span>
+<a name="l00246"></a>00246 <span class="preprocessor"></span><span class="preprocessor">#define R123_USE_CXX11_TYPE_TRAITS R123_USE_CXX11</span>
+<a name="l00247"></a>00247 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00248"></a>00248 <span class="preprocessor"></span>
+<a name="l00249"></a>00249 <span class="preprocessor">#ifndef R123_USE_CXX11_LONG_LONG</span>
+<a name="l00250"></a>00250 <span class="preprocessor"></span><span class="preprocessor">#define R123_USE_CXX11_LONG_LONG R123_USE_CXX11</span>
+<a name="l00251"></a>00251 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00252"></a>00252 <span class="preprocessor"></span>
+<a name="l00253"></a>00253 <span class="preprocessor">#ifndef R123_USE_MULHILO64_C99</span>
+<a name="l00254"></a>00254 <span class="preprocessor"></span><span class="preprocessor">#define R123_USE_MULHILO64_C99 0</span>
+<a name="l00255"></a>00255 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00256"></a>00256 <span class="preprocessor"></span>
+<a name="l00257"></a>00257 <span class="preprocessor">#ifndef R123_USE_MULHILO64_MULHI_INTRIN</span>
+<a name="l00258"></a>00258 <span class="preprocessor"></span><span class="preprocessor">#define R123_USE_MULHILO64_MULHI_INTRIN 0</span>
+<a name="l00259"></a>00259 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00260"></a>00260 <span class="preprocessor"></span>
+<a name="l00261"></a>00261 <span class="preprocessor">#ifndef R123_USE_MULHILO32_MULHI_INTRIN</span>
+<a name="l00262"></a>00262 <span class="preprocessor"></span><span class="preprocessor">#define R123_USE_MULHILO32_MULHI_INTRIN 0</span>
+<a name="l00263"></a>00263 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00264"></a>00264 <span class="preprocessor"></span>
+<a name="l00265"></a>00265 <span class="preprocessor">#ifndef R123_STATIC_ASSERT</span>
+<a name="l00266"></a>00266 <span class="preprocessor"></span><span class="preprocessor">#if R123_USE_CXX11_STATIC_ASSERT</span>
+<a name="l00267"></a>00267 <span class="preprocessor"></span><span class="preprocessor">#define R123_STATIC_ASSERT(expr, msg) static_assert(expr, msg)</span>
+<a name="l00268"></a>00268 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00269"></a>00269 <span class="preprocessor"></span>    <span class="comment">/* if msg always_looked_like_this, we could paste it into the name.  Worth it? */</span>
+<a name="l00270"></a>00270 <span class="preprocessor">#define R123_STATIC_ASSERT(expr, msg) typedef char static_assertion[(!!(expr))*2-1]</span>
+<a name="l00271"></a>00271 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00272"></a>00272 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00273"></a>00273 <span class="preprocessor"></span>
+<a name="l00274"></a>00274 <span class="preprocessor">#ifndef R123_CONSTEXPR</span>
+<a name="l00275"></a>00275 <span class="preprocessor"></span><span class="preprocessor">#if R123_USE_CXX11_CONSTEXPR</span>
+<a name="l00276"></a>00276 <span class="preprocessor"></span><span class="preprocessor">#define R123_CONSTEXPR constexpr</span>
+<a name="l00277"></a>00277 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00278"></a>00278 <span class="preprocessor"></span><span class="preprocessor">#define R123_CONSTEXPR</span>
+<a name="l00279"></a>00279 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00280"></a>00280 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00281"></a>00281 <span class="preprocessor"></span>
+<a name="l00282"></a>00282 <span class="preprocessor">#ifndef R123_USE_PHILOX_64BIT</span>
+<a name="l00283"></a>00283 <span class="preprocessor"></span><span class="preprocessor">#define R123_USE_PHILOX_64BIT (R123_USE_MULHILO64_ASM || R123_USE_MULHILO64_MSVC_INTRIN || R123_USE_MULHILO64_CUDA_INTRIN || R123_USE_GNU_UINT128 || R123_USE_MULHILO64_C99 || R123_USE_MULHILO64_OPENCL_INTRIN || R123_USE_MULHILO64_MULHI_INTRIN)</span>
+<a name="l00284"></a>00284 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00285"></a>00285 <span class="preprocessor"></span>
+<a name="l00286"></a>00286 <span class="preprocessor">#ifndef R123_ULONG_LONG</span>
+<a name="l00287"></a>00287 <span class="preprocessor"></span><span class="preprocessor">#if defined(__cplusplus) && !R123_USE_CXX11_LONG_LONG</span>
+<a name="l00288"></a>00288 <span class="preprocessor"></span><span class="comment">/* C++98 doesn't have long long.  It doesn't have uint64_t either, but</span>
+<a name="l00289"></a>00289 <span class="comment">   we will have typedef'ed uint64_t to something in the xxxfeatures.h.</span>
+<a name="l00290"></a>00290 <span class="comment">   With luck, it won't elicit complaints from -pedantic.  Cross your</span>
+<a name="l00291"></a>00291 <span class="comment">   fingers... */</span>
+<a name="l00292"></a>00292 <span class="preprocessor">#define R123_ULONG_LONG uint64_t</span>
+<a name="l00293"></a>00293 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00294"></a>00294 <span class="preprocessor"></span><span class="preprocessor">#define R123_ULONG_LONG unsigned long long</span>
+<a name="l00295"></a>00295 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00296"></a>00296 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00297"></a>00297 <span class="preprocessor"></span>
+<a name="l00298"></a>00298 <span class="comment">/* UINT64_C should have been #defined by XXXfeatures.h, either by</span>
+<a name="l00299"></a>00299 <span class="comment">   #include <stdint.h> or through compiler-dependent hacks */</span>
+<a name="l00300"></a>00300 <span class="preprocessor">#ifndef R123_64BIT</span>
+<a name="l00301"></a>00301 <span class="preprocessor"></span><span class="preprocessor">#define R123_64BIT(x) UINT64_C(x)</span>
+<a name="l00302"></a>00302 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00303"></a>00303 <span class="preprocessor"></span>
+<a name="l00304"></a>00304 <span class="preprocessor">#ifndef R123_THROW</span>
+<a name="l00305"></a>00305 <span class="preprocessor"></span><span class="preprocessor">#define R123_THROW(x)    throw (x)</span>
+<a name="l00306"></a>00306 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00307"></a>00307 <span class="preprocessor"></span>
+<a name="l00308"></a>00308 <span class="comment">/*</span>
+<a name="l00309"></a>00309 <span class="comment"> * Windows.h (and perhaps other "well-meaning" code define min and</span>
+<a name="l00310"></a>00310 <span class="comment"> * max, so there's a high chance that our definition of min, max</span>
+<a name="l00311"></a>00311 <span class="comment"> * methods or use of std::numeric_limits min and max will cause</span>
+<a name="l00312"></a>00312 <span class="comment"> * complaints in any program that happened to include Windows.h or</span>
+<a name="l00313"></a>00313 <span class="comment"> * suchlike first.  We use the null macro below in our own header</span>
+<a name="l00314"></a>00314 <span class="comment"> * files definition or use of min, max to defensively preclude</span>
+<a name="l00315"></a>00315 <span class="comment"> * this problem.  It may not be enough; one might need to #define</span>
+<a name="l00316"></a>00316 <span class="comment"> * NOMINMAX before including Windows.h or compile with -DNOMINMAX.</span>
+<a name="l00317"></a>00317 <span class="comment"> */</span>
+<a name="l00318"></a>00318 <span class="preprocessor">#define R123_NO_MACRO_SUBST</span>
+<a name="l00319"></a>00319 <span class="preprocessor"></span>
+</pre></div></div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/doxygen.css b/lib/Random123-1.08/docs/html/doxygen.css
new file mode 100644
index 0000000..658686f
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/doxygen.css
@@ -0,0 +1,656 @@
+/* The standard CSS for doxygen */
+
+body, table, div, p, dl {
+	font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;
+	font-size: 12px;
+}
+
+/* @group Heading Levels */
+
+h1 {
+	font-size: 150%;
+}
+
+h2 {
+	font-size: 120%;
+}
+
+h3 {
+	font-size: 100%;
+}
+
+dt {
+	font-weight: bold;
+}
+
+div.multicol {
+	-moz-column-gap: 1em;
+	-webkit-column-gap: 1em;
+	-moz-column-count: 3;
+	-webkit-column-count: 3;
+}
+
+p.startli, p.startdd, p.starttd {
+	margin-top: 2px;
+}
+
+p.endli {
+	margin-bottom: 0px;
+}
+
+p.enddd {
+	margin-bottom: 4px;
+}
+
+p.endtd {
+	margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+	font-weight: bold;
+}
+
+span.legend {
+        font-size: 70%;
+        text-align: center;
+}
+
+h3.version {
+        font-size: 90%;
+        text-align: center;
+}
+
+div.qindex, div.navtab{
+	background-color: #EBEFF6;
+	border: 1px solid #A3B4D7;
+	text-align: center;
+	margin: 2px;
+	padding: 2px;
+}
+
+div.qindex, div.navpath {
+	width: 100%;
+	line-height: 140%;
+}
+
+div.navtab {
+	margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+	color: #3D578C;
+	font-weight: normal;
+	text-decoration: none;
+}
+
+.contents a:visited {
+	color: #4665A2;
+}
+
+a:hover {
+	text-decoration: underline;
+}
+
+a.qindex {
+	font-weight: bold;
+}
+
+a.qindexHL {
+	font-weight: bold;
+	background-color: #9CAFD4;
+	color: #ffffff;
+	border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+        color: #ffffff;
+}
+
+a.el {
+	font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code {
+	color: #4665A2;
+}
+
+a.codeRef {
+	color: #4665A2;
+}
+
+/* @end */
+
+dl.el {
+	margin-left: -1cm;
+}
+
+.fragment {
+	font-family: monospace, fixed;
+	font-size: 105%;
+}
+
+pre.fragment {
+	border: 1px solid #C4CFE5;
+	background-color: #FBFCFD;
+	padding: 4px 6px;
+	margin: 4px 8px 4px 2px;
+	overflow: auto;
+	word-wrap: break-word;
+	font-size:  9pt;
+	line-height: 125%;
+}
+
+div.ah {
+	background-color: black;
+	font-weight: bold;
+	color: #ffffff;
+	margin-bottom: 3px;
+	margin-top: 3px;
+	padding: 0.2em;
+	border: solid thin #333;
+	border-radius: 0.5em;
+	-webkit-border-radius: .5em;
+	-moz-border-radius: .5em;
+	-webkit-box-shadow: 2px 2px 3px #999;
+	-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+	background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+	background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+}
+
+div.groupHeader {
+	margin-left: 16px;
+	margin-top: 12px;
+	margin-bottom: 6px;
+	font-weight: bold;
+}
+
+div.groupText {
+	margin-left: 16px;
+	font-style: italic;
+}
+
+body {
+	background: white;
+	color: black;
+        margin: 0;
+}
+
+div.contents {
+	margin-top: 10px;
+	margin-left: 10px;
+	margin-right: 10px;
+}
+
+td.indexkey {
+	background-color: #EBEFF6;
+	font-weight: bold;
+	border: 1px solid #C4CFE5;
+	margin: 2px 0px 2px 0;
+	padding: 2px 10px;
+}
+
+td.indexvalue {
+	background-color: #EBEFF6;
+	border: 1px solid #C4CFE5;
+	padding: 2px 10px;
+	margin: 2px 0px;
+}
+
+tr.memlist {
+	background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+	text-align: center;
+}
+
+img.formulaDsp {
+	
+}
+
+img.formulaInl {
+	vertical-align: middle;
+}
+
+div.center {
+	text-align: center;
+        margin-top: 0px;
+        margin-bottom: 0px;
+        padding: 0px;
+}
+
+div.center img {
+	border: 0px;
+}
+
+address.footer {
+	text-align: right;
+	padding-right: 12px;
+}
+
+img.footer {
+	border: 0px;
+	vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+	color: #008000
+}
+
+span.keywordtype {
+	color: #604020
+}
+
+span.keywordflow {
+	color: #e08000
+}
+
+span.comment {
+	color: #800000
+}
+
+span.preprocessor {
+	color: #806020
+}
+
+span.stringliteral {
+	color: #002080
+}
+
+span.charliteral {
+	color: #008080
+}
+
+span.vhdldigit { 
+	color: #ff00ff 
+}
+
+span.vhdlchar { 
+	color: #000000 
+}
+
+span.vhdlkeyword { 
+	color: #700070 
+}
+
+span.vhdllogic { 
+	color: #ff0000 
+}
+
+/* @end */
+
+/*
+.search {
+	color: #003399;
+	font-weight: bold;
+}
+
+form.search {
+	margin-bottom: 0px;
+	margin-top: 0px;
+}
+
+input.search {
+	font-size: 75%;
+	color: #000080;
+	font-weight: normal;
+	background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+	font-size: 75%;
+}
+
+.dirtab {
+	padding: 4px;
+	border-collapse: collapse;
+	border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+	background: #EBEFF6;
+	font-weight: bold;
+}
+
+hr {
+	height: 0px;
+	border: none;
+	border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+	height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+	border-spacing: 0px;
+	padding: 0px;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+	background-color: #F9FAFC;
+	border: none;
+	margin: 4px;
+	padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+	padding: 0px 8px 4px 8px;
+	color: #555;
+}
+
+.memItemLeft, .memItemRight, .memTemplParams {
+	border-top: 1px solid #C4CFE5;
+}
+
+.memItemLeft, .memTemplItemLeft {
+        white-space: nowrap;
+}
+
+.memTemplParams {
+	color: #4665A2;
+        white-space: nowrap;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+	font-size: 80%;
+	color: #4665A2;
+	font-weight: normal;
+	margin-left: 3px;
+}
+
+.memnav {
+	background-color: #EBEFF6;
+	border: 1px solid #A3B4D7;
+	text-align: center;
+	margin: 2px;
+	margin-right: 15px;
+	padding: 2px;
+}
+
+.memitem {
+	padding: 0;
+	margin-bottom: 10px;
+}
+
+.memname {
+        white-space: nowrap;
+        font-weight: bold;
+        margin-left: 6px;
+}
+
+.memproto {
+        border-top: 1px solid #A8B8D9;
+        border-left: 1px solid #A8B8D9;
+        border-right: 1px solid #A8B8D9;
+        padding: 6px 0px 6px 0px;
+        color: #253555;
+        font-weight: bold;
+        text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+        /* firefox specific markup */
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        -moz-border-radius-topright: 8px;
+        -moz-border-radius-topleft: 8px;
+        /* webkit specific markup */
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        -webkit-border-top-right-radius: 8px;
+        -webkit-border-top-left-radius: 8px;
+        background-image:url('nav_f.png');
+        background-repeat:repeat-x;
+        background-color: #E2E8F2;
+
+}
+
+.memdoc {
+        border-bottom: 1px solid #A8B8D9;      
+        border-left: 1px solid #A8B8D9;      
+        border-right: 1px solid #A8B8D9; 
+        padding: 2px 5px;
+        background-color: #FBFCFD;
+        border-top-width: 0;
+        /* firefox specific markup */
+        -moz-border-radius-bottomleft: 8px;
+        -moz-border-radius-bottomright: 8px;
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7);
+        /* webkit specific markup */
+        -webkit-border-bottom-left-radius: 8px;
+        -webkit-border-bottom-right-radius: 8px;
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7));
+}
+
+.paramkey {
+	text-align: right;
+}
+
+.paramtype {
+	white-space: nowrap;
+}
+
+.paramname {
+	color: #602020;
+	white-space: nowrap;
+}
+.paramname em {
+	font-style: normal;
+}
+
+/* @end */
+
+/* @group Directory (tree) */
+
+/* for the tree view */
+
+.ftvtree {
+	font-family: sans-serif;
+	margin: 0px;
+}
+
+/* these are for tree view when used as main index */
+
+.directory {
+	font-size: 9pt;
+	font-weight: bold;
+	margin: 5px;
+}
+
+.directory h3 {
+	margin: 0px;
+	margin-top: 1em;
+	font-size: 11pt;
+}
+
+/*
+The following two styles can be used to replace the root node title
+with an image of your choice.  Simply uncomment the next two styles,
+specify the name of your image and be sure to set 'height' to the
+proper pixel height of your image.
+*/
+
+/*
+.directory h3.swap {
+	height: 61px;
+	background-repeat: no-repeat;
+	background-image: url("yourimage.gif");
+}
+.directory h3.swap span {
+	display: none;
+}
+*/
+
+.directory > h3 {
+	margin-top: 0;
+}
+
+.directory p {
+	margin: 0px;
+	white-space: nowrap;
+}
+
+.directory div {
+	display: none;
+	margin: 0px;
+}
+
+.directory img {
+	vertical-align: -30%;
+}
+
+/* these are for tree view when not used as main index */
+
+.directory-alt {
+	font-size: 100%;
+	font-weight: bold;
+}
+
+.directory-alt h3 {
+	margin: 0px;
+	margin-top: 1em;
+	font-size: 11pt;
+}
+
+.directory-alt > h3 {
+	margin-top: 0;
+}
+
+.directory-alt p {
+	margin: 0px;
+	white-space: nowrap;
+}
+
+.directory-alt div {
+	display: none;
+	margin: 0px;
+}
+
+.directory-alt img {
+	vertical-align: -30%;
+}
+
+/* @end */
+
+div.dynheader {
+        margin-top: 8px;
+}
+
+address {
+	font-style: normal;
+	color: #2A3D61;
+}
+
+table.doxtable {
+	border-collapse:collapse;
+}
+
+table.doxtable td, table.doxtable th {
+	border: 1px solid #2D4068;
+	padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+	background-color: #374F7F;
+	color: #FFFFFF;
+	font-size: 110%;
+	padding-bottom: 4px;
+	padding-top: 5px;
+	text-align:left;
+}
+
+.tabsearch {
+	top: 0px;
+	left: 10px;
+	height: 36px;
+	background-image: url('tab_b.png');
+	z-index: 101;
+	overflow: hidden;
+	font-size: 13px;
+}
+
+.navpath ul
+{
+	font-size: 11px;
+	background-image:url('tab_b.png');
+	background-repeat:repeat-x;
+	height:30px;
+	line-height:30px;
+	color:#8AA0CC;
+	border:solid 1px #C2CDE4;
+	overflow:hidden;
+	margin:0px;
+	padding:0px;
+}
+
+.navpath li
+{
+	list-style-type:none;
+	float:left;
+	padding-left:10px;
+	padding-right: 15px;
+	background-image:url('bc_s.png');
+	background-repeat:no-repeat;
+	background-position:right;
+	color:#364D7C;
+}
+
+.navpath a
+{
+	height:32px;
+	display:block;
+	text-decoration: none;
+	outline: none;
+}
+
+.navpath a:hover
+{
+	color:#6884BD;
+}
+
+div.summary
+{
+	float: right;
+	font-size: 8pt;
+	padding-right: 5px;
+	width: 50%;
+	text-align: right;
+}       
+
+div.summary a
+{
+	white-space: nowrap;
+}
+
+div.header
+{
+        background-image:url('nav_h.png');
+        background-repeat:repeat-x;
+	background-color: #F9FAFC;
+	margin:  0px;
+	border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+	padding: 5px 5px 5px 10px;
+}
+
diff --git a/lib/Random123-1.08/docs/html/doxygen.png b/lib/Random123-1.08/docs/html/doxygen.png
new file mode 100644
index 0000000..635ed52
Binary files /dev/null and b/lib/Random123-1.08/docs/html/doxygen.png differ
diff --git a/lib/Random123-1.08/docs/html/files.html b/lib/Random123-1.08/docs/html/files.html
new file mode 100644
index 0000000..1ae3265
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/files.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: File Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>File List</h1>  </div>
+</div>
+<div class="contents">
+Here is a list of all files with brief descriptions:<table>
+  <tr><td class="indexkey"><a class="el" href="LICENSE.html">LICENSE</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">examples/<a class="el" href="README.html">README</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">Random123/<a class="el" href="aes_8h.html">aes.h</a> <a href="aes_8h_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">Random123/<a class="el" href="array_8h.html">array.h</a> <a href="array_8h_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">Random123/<a class="el" href="ars_8h.html">ars.h</a> <a href="ars_8h_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">Random123/<a class="el" href="gsl__microrng_8h.html">gsl_microrng.h</a> <a href="gsl__microrng_8h_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">Random123/<a class="el" href="MicroURNG_8hpp.html">MicroURNG.hpp</a> <a href="MicroURNG_8hpp_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">Random123/<a class="el" href="philox_8h.html">philox.h</a> <a href="philox_8h_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">Random123/<a class="el" href="ReinterpretCtr_8hpp.html">ReinterpretCtr.hpp</a> <a href="ReinterpretCtr_8hpp_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">Random123/<a class="el" href="threefry_8h.html">threefry.h</a> <a href="threefry_8h_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">Random123/conventional/<a class="el" href="Engine_8hpp.html">Engine.hpp</a> <a href="Engine_8hpp_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">Random123/conventional/<a class="el" href="gsl__cbrng_8h.html">gsl_cbrng.h</a> <a href="gsl__cbrng_8h_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">Random123/features/<a class="el" href="compilerfeatures_8h.html">compilerfeatures.h</a> <a href="compilerfeatures_8h_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">Random123/features/<a class="el" href="sse_8h.html">sse.h</a> <a href="sse_8h_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+</table>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions.html b/lib/Random123-1.08/docs/html/functions.html
new file mode 100644
index 0000000..cf51850
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6b.html#index_k"><span>k</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x75.html#index_u"><span>u</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<li>_Max
+: <a class="el" href="classr123_1_1MicroURNG.html#a4faecd7ab54c7678ee66c413bb984bf0">r123::MicroURNG< CBRNG ></a>
+, <a class="el" href="structr123_1_1Engine.html#ae549f81e966b0414bcaf0f24b566ebd8">r123::Engine< CBRNG ></a>
+</li>
+<li>_Min
+: <a class="el" href="classr123_1_1MicroURNG.html#a1f2787f136a8a807d14eab8cb1ca8c14">r123::MicroURNG< CBRNG ></a>
+, <a class="el" href="structr123_1_1Engine.html#aa73e4d27847915f1438fd37b30777111">r123::Engine< CBRNG ></a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_0x61.html b/lib/Random123-1.08/docs/html/functions_0x61.html
new file mode 100644
index 0000000..78efcda
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_0x61.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index__"><span>_</span></a></li>
+      <li class="current"><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6b.html#index_k"><span>k</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x75.html#index_u"><span>u</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>aesni1xm128i_key_t()
+: <a class="el" href="structaesni1xm128i__key__t.html#af1002e5b771616db8f12c793fc994c41">aesni1xm128i_key_t</a>
+</li>
+<li>at()
+: <a class="el" href="structr123array16x8.html#a088dbabe23cf873de370af292052905e">r123array16x8</a>
+, <a class="el" href="structr123array4x64.html#a893d3db3d274fc15ac32bc7cbab0e82a">r123array4x64</a>
+, <a class="el" href="structr123array2x64.html#a971ddfa7c395d161028e16c829179f3c">r123array2x64</a>
+, <a class="el" href="structr123array1x64.html#af6cf7706792eb1e44902dd94df388726">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#a79f982be8c435215a5e812e88e500216">r123array8x32</a>
+, <a class="el" href="structr123array4x32.html#abdb3253eb03291895f89885298e17169">r123array4x32</a>
+, <a class="el" href="structr123array2x32.html#ae985b8811e4e8849d5f28dae76231dca">r123array2x32</a>
+, <a class="el" href="structr123array1x32.html#a1d57048b43ee45e2a94ef372b4707783">r123array1x32</a>
+, <a class="el" href="structr123array1xm128i.html#a5e8a81ee3f7c3b022554c0023a686700">r123array1xm128i</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_0x62.html b/lib/Random123-1.08/docs/html/functions_0x62.html
new file mode 100644
index 0000000..102b532
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_0x62.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li class="current"><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6b.html#index_k"><span>k</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x75.html#index_u"><span>u</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<li>b
+: <a class="el" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">r123::Engine< CBRNG ></a>
+</li>
+<li>back()
+: <a class="el" href="structr123array1x32.html#a3738a65a648899db793e81b53c252785">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#a3da7214b9946a3c8653312dcfa42a288">r123array2x32</a>
+, <a class="el" href="structr123array8x32.html#a1d4176e4ad6d70c98805e0c924d2df37">r123array8x32</a>
+, <a class="el" href="structr123array16x8.html#ae607d3b3d068aec88672241fc97948cb">r123array16x8</a>
+, <a class="el" href="structr123array8x32.html#a73f5b5012b1e6595f727ef88e60a53ac">r123array8x32</a>
+, <a class="el" href="structr123array1xm128i.html#a082b7b75374d69149ee03d1d228e2508">r123array1xm128i</a>
+, <a class="el" href="structr123array2x32.html#ae176c02299531373a0fff9a5f55226e5">r123array2x32</a>
+, <a class="el" href="structr123array1x64.html#ab85790fdee269501a80fe31179efc9f8">r123array1x64</a>
+, <a class="el" href="structr123array1x32.html#a32b89fb1c75e3cc26ff3b5acdd40af99">r123array1x32</a>
+, <a class="el" href="structr123array4x32.html#a70fd9b24cb3b126eb15c23049f786653">r123array4x32</a>
+, <a class="el" href="structr123array2x64.html#a9beb3e776cb4f3cbee6846518749cb03">r123array2x64</a>
+, <a class="el" href="structr123array4x32.html#a4e1cba8583b2fac8cc3bf854956191c4">r123array4x32</a>
+, <a class="el" href="structr123array4x64.html#abb40868277e8a943a0b5464985baceb5">r123array4x64</a>
+</li>
+<li>bctype
+: <a class="el" href="structr123_1_1ReinterpretCtr.html#ae0accaee618b5eb28a24acd516b3a4c6">r123::ReinterpretCtr< ToType, CBRNG ></a>
+</li>
+<li>begin()
+: <a class="el" href="structr123array1x32.html#a86b7d754ff8dd69e0565edfdbd060cb4">r123array1x32</a>
+, <a class="el" href="structr123array16x8.html#a43182e95cb41660de5511bb5a3968cb8">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#ae9102a4387a7b2013f5098c6c7c14e74">r123array1xm128i</a>
+, <a class="el" href="structr123array4x64.html#ab78c67c429da6405f9d1ed5054635961">r123array4x64</a>
+, <a class="el" href="structr123array2x32.html#aa52b394a0c44b755e5c0d0409dc2c4ea">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a96a9c7e3ece3d2b128cf7f264af6ea3c">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#a7ae561c4d544e31f7bd2f256cb32f878">r123array8x32</a>
+, <a class="el" href="structr123array2x64.html#a0fcc60a49efd917a3b630cf53c526311">r123array2x64</a>
+, <a class="el" href="structr123array1x64.html#a0fddc6603fe2eb4547aeb57498ffe3c2">r123array1x64</a>
+, <a class="el" href="structr123array4x64.html#acd133812dbe01892199683e003921b8b">r123array4x64</a>
+, <a class="el" href="structr123array1xm128i.html#a275c9837db101efb234c36cff3e7562f">r123array1xm128i</a>
+, <a class="el" href="structr123array2x32.html#a96730b28149000a3ea4c6b0f05e1777b">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a830254ee0db7bf12facf67f23428d2d9">r123array4x32</a>
+, <a class="el" href="structr123array1x64.html#af9150347761c6df32673bbd2411e67d0">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#a8cf4fadef6bdc6d438db173bc1d31165">r123array2x64</a>
+, <a class="el" href="structr123array1x32.html#a19089b8de6c637803408512407a4da91">r123array1x32</a>
+</li>
+<li>BITS
+: <a class="el" href="classr123_1_1MicroURNG.html#ac55cddda8fe0808f922f39beee587b27">r123::MicroURNG< CBRNG ></a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_0x63.html b/lib/Random123-1.08/docs/html/functions_0x63.html
new file mode 100644
index 0000000..69541ef
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_0x63.html
@@ -0,0 +1,223 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li class="current"><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6b.html#index_k"><span>k</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x75.html#index_u"><span>u</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>c
+: <a class="el" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">r123::Engine< CBRNG ></a>
+</li>
+<li>cbegin()
+: <a class="el" href="structr123array1x32.html#a4b0a02537590babd835dd16405775efe">r123array1x32</a>
+, <a class="el" href="structr123array4x32.html#a4881e99f7b0ff88e2a3082b9e2464bf5">r123array4x32</a>
+, <a class="el" href="structr123array4x64.html#af716d2b14d1243870e8544ea2a3cece6">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#a80520b3d7040a8d6ec7068c8a143ba6f">r123array16x8</a>
+, <a class="el" href="structr123array8x32.html#a06c19ba6155e9c98892f5b98fb482c21">r123array8x32</a>
+, <a class="el" href="structr123array1xm128i.html#a335bab18a8bc904e34de0b3d9d1ce596">r123array1xm128i</a>
+, <a class="el" href="structr123array2x32.html#a9687a1e6cdb6b6c9a1ffd8f3c7d2ce45">r123array2x32</a>
+, <a class="el" href="structr123array1x64.html#a33d1c19a63dec48f63f7c30c758fca0c">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#ad1ccbda4186dbb8c0a673db1ec0957c0">r123array2x64</a>
+</li>
+<li>cbrng_type
+: <a class="el" href="classr123_1_1MicroURNG.html#ab0b3a77c9408dbcb2f9d6b5c67e9c3f7">r123::MicroURNG< CBRNG ></a>
+, <a class="el" href="structr123_1_1Engine.html#a45ee0086cf8cd6d10febb76dc88f8b22">r123::Engine< CBRNG ></a>
+</li>
+<li>cend()
+: <a class="el" href="structr123array8x32.html#a0e1dfc305279a3439789dbdda8bfb6ae">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#aa959a7054efa0d53f83f2d712d8d9049">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#ac80c7ce6fe5bd9ca8baf03db1e67a7e9">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#af970ab87ce987c91097316bc0a0836ef">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#ad7919a7f772fda7d3fe3b476ac1e058f">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#aa05003cae74984b777610702d27d66d2">r123array1xm128i</a>
+, <a class="el" href="structr123array1x32.html#aa0f83d3e29c452d23c3660c98e3bd0e9">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#a9bb4382830c6feb49573b82bb9a18efc">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a0045f9134801ed79d31f65c7d224d72c">r123array4x32</a>
+</li>
+<li>const_iterator
+: <a class="el" href="structr123array1x32.html#ac7f82e8848759ec5b0026dce8830274e">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#a7963141a4af4c4aa74708909312a8644">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a1078ba2cd13bb2a4f83e1b089c816ba7">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#aa026dfdf1e2741c96db4343ceffd3c9f">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#a28ff01c0fefda1d81112ec9812156164">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#ae4f249e82506274b19e6077c3d3f03af">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a2aa5637bebf5c9c753edbce62e889d77">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#adda842a447360852f2ffa28fb97eb40c">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#af6be8b009459737fa25d9d2ac7c4e6aa">r123array1xm128i</a>
+</li>
+<li>const_pointer
+: <a class="el" href="structr123array2x32.html#accf098ed49f9d84cfa3831a9fe183885">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a28d13183d1bfcc05854dc39bebbcdf51">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#a621f6293254c6300b1d1b9835b7f30ba">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#a2b23f2aa3edf21084ece97a03367bff5">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#a3a13a452ca15f62f8ddcd8b7de9efa08">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#aa268882d3b4fb43ec9d82baf22d58cc5">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#adbe5a6feb583ce6a682496e14cec9cca">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#acc3f6ecf7e6a6bc98c3681c80120ed61">r123array1xm128i</a>
+, <a class="el" href="structr123array1x32.html#ab4a82a1e5300814272528a05587d555b">r123array1x32</a>
+</li>
+<li>const_reference
+: <a class="el" href="structr123array1x32.html#adfa6614a8b20cd30c192458c8c2874da">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#a9d71cce3d7ccea7f48da94cf023e1486">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a09d7e0d7b1572fc5fe2be119870a39bc">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#a2e7eda7e8940b37e17aef9b0efec3685">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#af75ba9dbfe38e0a6c143f446b7e4b995">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#a5d80c6b28d869a5422d99541ee1fb93f">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#ac2f21a458bf9008b831c553c5ae77508">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#a7252c320f8b0fb4d66a17acd9e94b4ad">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a84d0123f4376cb6ab77cf817a0cea9cb">r123array1xm128i</a>
+</li>
+<li>const_reverse_iterator
+: <a class="el" href="structr123array4x64.html#a8405a219a9c81f8f298298cffbfd46ac">r123array4x64</a>
+, <a class="el" href="structr123array1x32.html#a2642ed91a9c6c91ace3b91add2a4feae">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#af298f85ad6bda860232465c5abc33618">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a2926ff865e9dcbc3c20e6639aa8d0b1b">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#a207923147148d154b1659e257db44033">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#a61535adf62580285c3182a713ea0f3b1">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#aa37f04aef8a808c76715b3b2d49c3c30">r123array2x64</a>
+, <a class="el" href="structr123array16x8.html#a7a774fcb52f452f832e11e13dbde6dea">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a6bf98ce6373b157b87c6fd4a7006ed68">r123array1xm128i</a>
+</li>
+<li>counter()
+: <a class="el" href="classr123_1_1MicroURNG.html#a30f52334b7cfcbe6d86870496ca57ea6">r123::MicroURNG< CBRNG ></a>
+</li>
+<li>crbegin()
+: <a class="el" href="structr123array2x64.html#a198ff47db0778d88db4fabe5f7721564">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a7712a006a2b567321a6ac9e84bb267d8">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#a2ecc3c23f3ae3939a386b334f0556d73">r123array16x8</a>
+, <a class="el" href="structr123array8x32.html#a4ad5f793478a9658c52dc085b6c504ae">r123array8x32</a>
+, <a class="el" href="structr123array4x32.html#ad65e3e63740dc2301442718b3b8aa440">r123array4x32</a>
+, <a class="el" href="structr123array1x32.html#abe59890575233ef259a69d38bea4b5d9">r123array1x32</a>
+, <a class="el" href="structr123array1xm128i.html#a673c6cd3131269febe9a985dc76a2e08">r123array1xm128i</a>
+, <a class="el" href="structr123array1x64.html#adac6c38fef501a997b39229f54a6459c">r123array1x64</a>
+, <a class="el" href="structr123array2x32.html#a09b34692bd41a710bf75e19af2353afb">r123array2x32</a>
+</li>
+<li>crend()
+: <a class="el" href="structr123array1x32.html#a7f0211b995c536c540c6b175d9433c74">r123array1x32</a>
+, <a class="el" href="structr123array1x64.html#a250e375c11846dc2635c7690f283cc20">r123array1x64</a>
+, <a class="el" href="structr123array1xm128i.html#aad72d00c81c8f6b9e8fb6b6be98056c6">r123array1xm128i</a>
+, <a class="el" href="structr123array8x32.html#ace0b6344aa8f0b9812a2610b6949a6b7">r123array8x32</a>
+, <a class="el" href="structr123array2x32.html#a458da2536084746b5f3face73c9f962d">r123array2x32</a>
+, <a class="el" href="structr123array16x8.html#a2a98e77e851e130a98d44a14ce673ffd">r123array16x8</a>
+, <a class="el" href="structr123array4x32.html#a13322be3844d39f9de76d263fa8d1f75">r123array4x32</a>
+, <a class="el" href="structr123array2x64.html#a5bddb882c7c9a493c382d3ce0d6d6079">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a907eb18b7392479a8ad6b2ddfaaecbd2">r123array4x64</a>
+</li>
+<li>ctr_type
+: <a class="el" href="structr123_1_1Threefry2x32__R.html#a60b1b58aeaa05d467607dc570aed1357">r123::Threefry2x32_R< R ></a>
+, <a class="el" href="structr123_1_1ARS1xm128i__R.html#a13a62c94f63054828c6960979f42a268">r123::ARS1xm128i_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1AESNI1xm128i.html#aaa136c21db9806859fa7cd4e2dbaaaa6">r123::AESNI1xm128i</a>
+, <a class="el" href="structr123_1_1Threefry4x32__R.html#ae89dabc0060c62e0d9e5c4ac34a8550f">r123::Threefry4x32_R< R ></a>
+, <a class="el" href="structr123_1_1ReinterpretCtr.html#a26cf9e933b35411c37070c948085ba02">r123::ReinterpretCtr< ToType, CBRNG ></a>
+, <a class="el" href="structr123_1_1Threefry4x64__R.html#a6c93334cb8a8b53ef01cc79b5296af0d">r123::Threefry4x64_R< R ></a>
+, <a class="el" href="structr123_1_1ARS4x32__R.html#a9951dbcb50de849ded7177109b344045">r123::ARS4x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox4x64__R.html#afd5f78b34ae7c478ebe16eb601f7b202">r123::Philox4x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">r123::Engine< CBRNG ></a>
+, <a class="el" href="structr123_1_1Philox2x64__R.html#a8e615e3f4680b9e1b986ea071fd173fc">r123::Philox2x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox2x32__R.html#af00c84c482900fbeca6bd2043395e599">r123::Philox2x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox4x32__R.html#a23adf0320faed0fe4d12ebececdba50a">r123::Philox4x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Threefry2x64__R.html#a6b151f30bc5544671596b9df91e896d8">r123::Threefry2x64_R< R ></a>
+, <a class="el" href="structr123_1_1AESNI4x32.html#ab8a1f8a822eecfc9e587bad76792df32">r123::AESNI4x32</a>
+, <a class="el" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">r123::MicroURNG< CBRNG ></a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_0x64.html b/lib/Random123-1.08/docs/html/functions_0x64.html
new file mode 100644
index 0000000..9e8c99a
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_0x64.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li class="current"><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6b.html#index_k"><span>k</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x75.html#index_u"><span>u</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>data()
+: <a class="el" href="structr123array1x32.html#a71529eccd6d52d7c396d58fd71214d0b">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#a15d5bce0ea3596ad5f7b5aa7432a33df">r123array2x32</a>
+, <a class="el" href="structr123array8x32.html#a0e2eb8cfaf36664411f19a6828339553">r123array8x32</a>
+, <a class="el" href="structr123array16x8.html#aced4f7455fcc853a4e947b9bf892c45e">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#acb25bc645e95f975ca6cbcb692add4b4">r123array1xm128i</a>
+, <a class="el" href="structr123array1x64.html#a2ecd5718a0fd863dd7a3eb724e07a540">r123array1x64</a>
+, <a class="el" href="structr123array1xm128i.html#ac66f2efebe9e32433b25f96ea3cf34fe">r123array1xm128i</a>
+, <a class="el" href="structr123array4x32.html#a72ee678cce1fa539f44480eb269a01f9">r123array4x32</a>
+, <a class="el" href="structr123array1x64.html#a02cd843e927803bd09f00b1a5541c72c">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#a9a6eb23f15f9ee3a55f39b951798a739">r123array2x64</a>
+, <a class="el" href="structr123array2x32.html#a76f2b3cd04d0502121b3c7894663e178">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a20dd9fc18f9db8fe8e8eb08311398d22">r123array4x32</a>
+, <a class="el" href="structr123array2x64.html#a9cdb592780378bdcc8a560e31e11f084">r123array2x64</a>
+, <a class="el" href="structr123array16x8.html#aac0eda610fbd60cdaae5d1e2aa4eb03f">r123array16x8</a>
+, <a class="el" href="structr123array4x64.html#a31591d0bca18339d42c3a182a30457a0">r123array4x64</a>
+, <a class="el" href="structr123array8x32.html#a78448bbbef69b3383eec4d78a814b4b2">r123array8x32</a>
+</li>
+<li>difference_type
+: <a class="el" href="structr123array4x32.html#a3c690c039797cafe4718c03377937fb7">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#af8029821cb8a7b5a3500adb30d4f2326">r123array8x32</a>
+, <a class="el" href="structr123array2x64.html#a4227cd6be973fdb0d72398d0b5604da8">r123array2x64</a>
+, <a class="el" href="structr123array16x8.html#aaae0b6c18de6ce92ea55bf1b9bdbdf69">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a319811ed6105c3050135d8ec3ba36f7a">r123array1xm128i</a>
+, <a class="el" href="structr123array1x32.html#a1084c78861e725e58c14c67af242952f">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#aa3dfe31d2483fb629a9e3ac304b24d07">r123array2x32</a>
+, <a class="el" href="structr123array1x64.html#a2abaa7dd6823b724ec6038b504c77011">r123array1x64</a>
+, <a class="el" href="structr123array4x64.html#a3b1c7395f17992d8760fe93d3930db12">r123array4x64</a>
+</li>
+<li>discard()
+: <a class="el" href="structr123_1_1Engine.html#a82a56c2c02b146dceb68ef3fd0a969fb">r123::Engine< CBRNG ></a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_0x65.html b/lib/Random123-1.08/docs/html/functions_0x65.html
new file mode 100644
index 0000000..61dee38
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_0x65.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li class="current"><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6b.html#index_k"><span>k</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x75.html#index_u"><span>u</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>elem
+: <a class="el" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">r123::Engine< CBRNG ></a>
+</li>
+<li>elem_type
+: <a class="el" href="structr123_1_1Engine.html#a8fb9eb1ab76ad9b5374a47cf84ecd306">r123::Engine< CBRNG ></a>
+</li>
+<li>empty()
+: <a class="el" href="structr123array2x32.html#acc67c9fedcddd77fdb2727c088eaab9d">r123array2x32</a>
+, <a class="el" href="structr123array2x64.html#a60ed2f5af6357930b50a8de8f294f5c2">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a51e4ded187a3f1ebadd6b915da039c3f">r123array4x64</a>
+, <a class="el" href="structr123array4x32.html#a4bc944eee354be2b258c0991d3cc61e1">r123array4x32</a>
+, <a class="el" href="structr123array16x8.html#a5f07441771ec90cd05a2c26fb64e575e">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#aa3e59f1626f2cadab5bc66e415ff0c72">r123array1xm128i</a>
+, <a class="el" href="structr123array1x32.html#ae791cf5ce80a35610c3b4d52ea533651">r123array1x32</a>
+, <a class="el" href="structr123array8x32.html#af2276e84924345efab98214be1691c83">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#af8636ea61389dcf15e94a5da70bd6bc0">r123array1x64</a>
+</li>
+<li>end()
+: <a class="el" href="structr123array16x8.html#aa0d2b0c70133dde0535b0a5e12283626">r123array16x8</a>
+, <a class="el" href="structr123array4x64.html#a9fed923c39000c81f7f6b608d88953f9">r123array4x64</a>
+, <a class="el" href="structr123array2x64.html#af16f99514770cb88a57e36b1b849e80d">r123array2x64</a>
+, <a class="el" href="structr123array4x32.html#a83dd3d17e17bb6a93b7cd544b0e9a403">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#a40c40a7a86150ec0e9d29739e0e649c3">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#a18a5fa64dbe73dc4f9fd0b6c45fe283f">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#a24679f6a101d9d25b339106a771c4e68">r123array2x64</a>
+, <a class="el" href="structr123array2x32.html#ad64dc05d5114c74d104bca45f21992fd">r123array2x32</a>
+, <a class="el" href="structr123array1x32.html#a5bda32a4f4e8e783744ed7f183dde0b2">r123array1x32</a>
+, <a class="el" href="structr123array16x8.html#aee42dddf2a59858114a31d760f2c1227">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#ae8ddb01064f8cdfbb7314d2f1fbd0dfd">r123array1xm128i</a>
+</li>
+<li>Engine()
+: <a class="el" href="structr123_1_1Engine.html#ac5676bbe189b0cdc1bef0dd812262ccd">r123::Engine< CBRNG ></a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_0x66.html b/lib/Random123-1.08/docs/html/functions_0x66.html
new file mode 100644
index 0000000..99a3e56
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_0x66.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li class="current"><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6b.html#index_k"><span>k</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x75.html#index_u"><span>u</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>fill()
+: <a class="el" href="structr123array1x32.html#a973dbecc59b1d5f5a95bda92d25e5e73">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#af7ea9ed8a064e9cab59ee97885bb459e">r123array2x32</a>
+, <a class="el" href="structr123array8x32.html#a86481aecfb276687e9389cb6c43e1e8c">r123array8x32</a>
+, <a class="el" href="structr123array16x8.html#a883d42092ab4bae2eac132706ed06103">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a7eba15dc035724245f70b4a3a98c6a52">r123array1xm128i</a>
+, <a class="el" href="structr123array1x64.html#ac9a372e0980632a4db29bb243b672039">r123array1x64</a>
+, <a class="el" href="structr123array4x32.html#ae362d7908c2ecc308f6fd4e085ace980">r123array4x32</a>
+, <a class="el" href="structr123array2x64.html#a30d20bbf203dbd0b592c6cb58cb6dcdb">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a6580c77b7d68c0a76b5bef33e59ac662">r123array4x64</a>
+</li>
+<li>fix_invariant()
+: <a class="el" href="structr123_1_1Engine.html#aa7ad87d7238a0f820ee37640071dee7d">r123::Engine< CBRNG ></a>
+</li>
+<li>front()
+: <a class="el" href="structr123array1x64.html#a7d205216932e36303f62b38d233247d5">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#aee2127f4a99f86b3fc7a9059e7d84e76">r123array8x32</a>
+, <a class="el" href="structr123array4x32.html#ab3434550aea3d2e04579cb255b0b4e9e">r123array4x32</a>
+, <a class="el" href="structr123array2x32.html#a933676c34296b74eeea8a56a3c904a2c">r123array2x32</a>
+, <a class="el" href="structr123array1x32.html#af94d0df621b1de0b6a3ed904c276eb84">r123array1x32</a>
+, <a class="el" href="structr123array16x8.html#ad293e6494e131ff96941e963d9208586">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a7efd9b7ccf35c3730fbdafb147e11660">r123array1xm128i</a>
+, <a class="el" href="structr123array2x64.html#a21cf5457f945f5c00b16ce4a73797c1b">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a975ecaf4c5332fc400dfc8d6d60d9035">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#a85528130b6941b3f7b57265c201345c2">r123array16x8</a>
+, <a class="el" href="structr123array2x64.html#a95b79f70de75c8346dbae7c5f933d076">r123array2x64</a>
+, <a class="el" href="structr123array1x64.html#a7c0a3159492b3405a8019ce52cdf2c69">r123array1x64</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_0x67.html b/lib/Random123-1.08/docs/html/functions_0x67.html
new file mode 100644
index 0000000..4fd0225
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_0x67.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li class="current"><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6b.html#index_k"><span>k</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x75.html#index_u"><span>u</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>getcounter()
+: <a class="el" href="structr123_1_1Engine.html#a621df886f2a21ffb22e63d9094389173">r123::Engine< CBRNG ></a>
+</li>
+<li>getseed()
+: <a class="el" href="structr123_1_1Engine.html#aa7812a494fdb677c2e325db0acfe924a">r123::Engine< CBRNG ></a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_0x69.html b/lib/Random123-1.08/docs/html/functions_0x69.html
new file mode 100644
index 0000000..18ec3b6
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_0x69.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li class="current"><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6b.html#index_k"><span>k</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x75.html#index_u"><span>u</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>incr()
+: <a class="el" href="structr123array1x32.html#aae5fbc153a37b06ea466f2283551622f">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#a7b295f3a299c8cf24a75ab7f9edfe46f">r123array2x32</a>
+, <a class="el" href="structr123array8x32.html#a92ded324d4b7e2602766fa0c71fa5985">r123array8x32</a>
+, <a class="el" href="structr123array16x8.html#aaf2d677b347b7c7bf362a2b318f46e3c">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a62ee236dafcbfb81ef43d7aa82a66b47">r123array1xm128i</a>
+, <a class="el" href="structr123array1x64.html#ad44244e95f8937e0874dec9083071a85">r123array1x64</a>
+, <a class="el" href="structr123array4x32.html#a36515eb50711e36a88f1390bbd4e0e05">r123array4x32</a>
+, <a class="el" href="structr123array2x64.html#ac33e6336c8aee10e38259510ef76e5cf">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#ac4187b4ae44913183b1c8f9b7654f8a9">r123array4x64</a>
+</li>
+<li>incr_carefully()
+: <a class="el" href="structr123array4x64.html#af629d14b454f406cae4d128d9e05554d">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#abbc6c2d9cdc2187cdfdea759951498a0">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#ab35cfd8e9221c294ab7546855373a38c">r123array1xm128i</a>
+, <a class="el" href="structr123array1x32.html#a9c919289274ced376086f1110c8b6384">r123array1x32</a>
+, <a class="el" href="structr123array2x64.html#a52ddbfa3edbd9fa7f30e1402a9240da1">r123array2x64</a>
+, <a class="el" href="structr123array2x32.html#adf128cb5c0abaaa4f119d4bcef47ead9">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#acec3775361651e6f8dea517f07d7a8b8">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#a9e73ed67b7c577ebdb6c5e1f121fdc4f">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#ad848dc3e868f8195ee3eb5029698c976">r123array1x64</a>
+</li>
+<li>iterator
+: <a class="el" href="structr123array2x64.html#ac0fc5019e017f50e29d26df233085e56">r123array2x64</a>
+, <a class="el" href="structr123array1x32.html#ad17f00c1dbff151f91d381f7c0b99dc8">r123array1x32</a>
+, <a class="el" href="structr123array1x64.html#a486a75094513f75c268901b3bb6666ad">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#aad8ff34e784d954a05f3f058facfb2be">r123array8x32</a>
+, <a class="el" href="structr123array2x32.html#a4b447adc28d536d9b7ad7e33d5081a8e">r123array2x32</a>
+, <a class="el" href="structr123array1xm128i.html#af9db87a7c1ae4c7ba1e355af89b4d22d">r123array1xm128i</a>
+, <a class="el" href="structr123array16x8.html#a36bdba5b2d96c8dfe9b7e59b203d5047">r123array16x8</a>
+, <a class="el" href="structr123array4x64.html#adfc9f1209d12f855b9330ecccc8b6dd2">r123array4x64</a>
+, <a class="el" href="structr123array4x32.html#a73a2a55a200af374d7299d2de13aa5cc">r123array4x32</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_0x6b.html b/lib/Random123-1.08/docs/html/functions_0x6b.html
new file mode 100644
index 0000000..c843258
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_0x6b.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li class="current"><a href="functions_0x6b.html#index_k"><span>k</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x75.html#index_u"><span>u</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_k"></a>- k -</h3><ul>
+<li>k
+: <a class="el" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">aesni1xm128i_key_t</a>
+</li>
+<li>key
+: <a class="el" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">r123::Engine< CBRNG ></a>
+</li>
+<li>key_type
+: <a class="el" href="structr123_1_1Threefry4x64__R.html#adb406d1af0e757bd8058582ee39f21dc">r123::Threefry4x64_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry2x64__R.html#ae652f0e9ca6ec234fd2f4fc9afb1007c">r123::Threefry2x64_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry4x32__R.html#a140f5cf20bde7784d778b82f0ebf8778">r123::Threefry4x32_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry2x32__R.html#abfaaff871ef5e2e2cf397884ddab4cdc">r123::Threefry2x32_R< R ></a>
+, <a class="el" href="structr123_1_1ReinterpretCtr.html#a470b21676ed709aa9d9ad524a67410f1">r123::ReinterpretCtr< ToType, CBRNG ></a>
+, <a class="el" href="structr123_1_1Philox4x64__R.html#a9947ce12e3d03f9a60396d79bb56ba1c">r123::Philox4x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox2x64__R.html#adb8a638d3d96ef0ab594b0320bae329f">r123::Philox2x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox4x32__R.html#afa2e99f3e0b635f17ba9e16c186af63b">r123::Philox4x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox2x32__R.html#a37dac768d36ef39e0228369e91b9f0ab">r123::Philox2x32_R< ROUNDS ></a>
+, <a class="el" href="classr123_1_1MicroURNG.html#aef90e6157f360434342ad0df4ce5f364">r123::MicroURNG< CBRNG ></a>
+, <a class="el" href="structr123_1_1ARS4x32__R.html#a7a651b6747b9e7c038bc6d11ffa2863e">r123::ARS4x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1ARS1xm128i__R.html#a8454d6de92379d9a6551d11828fbebc3">r123::ARS1xm128i_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1AESNI4x32.html#a3f47cb319d03ede5fd557800b618d28a">r123::AESNI4x32</a>
+, <a class="el" href="structr123_1_1AESNI1xm128i.html#a7dc33fd5abf509d9d16b571b23867a6b">r123::AESNI1xm128i</a>
+, <a class="el" href="structr123_1_1Engine.html#a18132a79d2327990c4809b37300eddc3">r123::Engine< CBRNG ></a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_0x6d.html b/lib/Random123-1.08/docs/html/functions_0x6d.html
new file mode 100644
index 0000000..3d72362
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_0x6d.html
@@ -0,0 +1,125 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6b.html#index_k"><span>k</span></a></li>
+      <li class="current"><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x75.html#index_u"><span>u</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
+<li>m
+: <a class="el" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">r123m128i</a>
+</li>
+<li>max_size()
+: <a class="el" href="structr123array1x32.html#a707c532168670ad508723d057f712928">r123array1x32</a>
+, <a class="el" href="structr123array4x32.html#afddfc77eea0f5f4c53dc075425f96ab3">r123array4x32</a>
+, <a class="el" href="structr123array1xm128i.html#a04e2b8952459b7aeabc011532fe3f8fa">r123array1xm128i</a>
+, <a class="el" href="structr123array4x64.html#aad1329f21e3fdd5d25a29148db564b8a">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#a3f59fb2b338aa8e33879e8d2d22840ed">r123array16x8</a>
+, <a class="el" href="structr123array2x64.html#a03f7c9e37e59210b1d2b9390e415e289">r123array2x64</a>
+, <a class="el" href="structr123array1x64.html#a1b02d097ca118866b7f696b7c1c5681f">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#a0ea0af65a3b0a51c090ab6ef11f20c63">r123array8x32</a>
+, <a class="el" href="structr123array2x32.html#a07345b400c5a81e6cd55689d1e38122f">r123array2x32</a>
+</li>
+<li>MicroURNG()
+: <a class="el" href="classr123_1_1MicroURNG.html#a19afb80312c370e1670bf8afc73d802e">r123::MicroURNG< CBRNG ></a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_0x6f.html b/lib/Random123-1.08/docs/html/functions_0x6f.html
new file mode 100644
index 0000000..b90dac1
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_0x6f.html
@@ -0,0 +1,185 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6b.html#index_k"><span>k</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li class="current"><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x75.html#index_u"><span>u</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>operator __m128i()
+: <a class="el" href="structr123m128i.html#a80a5c24f76fec61b3ab0ed0e0353cfb7">r123m128i</a>
+</li>
+<li>operator const void *()
+: <a class="el" href="structr123m128i.html#ae5788785c2ce7f7ca6ff8dd4377771f3">r123m128i</a>
+</li>
+<li>operator!=()
+: <a class="el" href="structr123array2x32.html#aa0c7e561ddeb475329ea8d8178fca2a1">r123array2x32</a>
+, <a class="el" href="structr123array2x64.html#a1ddc25ec182ac3b119e420f5e21c3f87">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#abf2fc58ddb163708c087f72921dfd11d">r123array4x64</a>
+, <a class="el" href="structr123array4x32.html#a1a7aa47c8dd7db5146e54cc54d1d4358">r123array4x32</a>
+, <a class="el" href="structr123array16x8.html#af48be55844748a0f6406b2ae437398b5">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a60cf5b0e8283c20c386a7935f9ae0a60">r123array1xm128i</a>
+, <a class="el" href="structr123array1x32.html#af293f370d083051f6cf24408e07feff1">r123array1x32</a>
+, <a class="el" href="structr123array8x32.html#aed510e0472db9b00490c468d88e14bac">r123array8x32</a>
+, <a class="el" href="structr123_1_1Engine.html#af0947cdcfc03aef7ec30c9fafa660445">r123::Engine< CBRNG ></a>
+, <a class="el" href="structr123array1x64.html#a0969493a7aac290e5ab2a5135380bc3d">r123array1x64</a>
+</li>
+<li>operator()()
+: <a class="el" href="structr123_1_1ARS4x32__R.html#afcd326e150925e30de22166e727567df">r123::ARS4x32_R< ROUNDS ></a>
+, <a class="el" href="classr123_1_1MicroURNG.html#a64cd4d33b4cab5d3d9c556db68407b77">r123::MicroURNG< CBRNG ></a>
+, <a class="el" href="structr123_1_1Philox2x32__R.html#ab610a200c9fa62d090f31466b655c780">r123::Philox2x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox4x32__R.html#adf05bdc0c856c9541db656711fd8c7d1">r123::Philox4x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox2x64__R.html#a04f6039e87a958593ac011d9304d7ec9">r123::Philox2x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox4x64__R.html#aa5a0488aa6e16c55b7647c155b18462c">r123::Philox4x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1ReinterpretCtr.html#a91edc5103397372cc5509ad17c0fc83a">r123::ReinterpretCtr< ToType, CBRNG ></a>
+, <a class="el" href="structr123_1_1Threefry2x32__R.html#a64b8018e82f3e7a0e252166b15b42a71">r123::Threefry2x32_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry4x32__R.html#ae0dfbf399015fab602c769ad90256231">r123::Threefry4x32_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry2x64__R.html#ab654a85f2c4ec65548ddfc85dc00f27e">r123::Threefry2x64_R< R ></a>
+, <a class="el" href="structr123_1_1AESNI1xm128i.html#a9bff0ac8478400c1006136e9bde91dc3">r123::AESNI1xm128i</a>
+, <a class="el" href="structr123_1_1Threefry4x64__R.html#a09e7fb82f9b7bcf6ccb4d849116b6ec1">r123::Threefry4x64_R< R ></a>
+, <a class="el" href="structr123_1_1Engine.html#aca309d0b4f2a8fff1f6f2ab38c6caf93">r123::Engine< CBRNG ></a>
+, <a class="el" href="structr123_1_1AESNI4x32.html#a981102e5bc0a7df916a95a40af8fd4c0">r123::AESNI4x32</a>
+, <a class="el" href="structr123_1_1Engine.html#af396a7d1656af55805e38f3d9c0fbef7">r123::Engine< CBRNG ></a>
+, <a class="el" href="structr123_1_1ARS1xm128i__R.html#a89c0fc4e1c90ee684fc88dde05d8d82c">r123::ARS1xm128i_R< ROUNDS ></a>
+</li>
+<li>operator<<
+: <a class="el" href="structr123_1_1Engine.html#ae0321571f689fca00c608d11ecad7d8d">r123::Engine< CBRNG ></a>
+</li>
+<li>operator=()
+: <a class="el" href="structr123m128i.html#a9842fbc85102e0019cc58d97c28e2d02">r123m128i</a>
+, <a class="el" href="structaesni1xm128i__key__t.html#acb24fef68c539f1a6ea217ee8ada185d">aesni1xm128i_key_t</a>
+</li>
+<li>operator==()
+: <a class="el" href="structr123array1x32.html#a61140a0fb8983a3018a2b98903d14047">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#aa8723e5786c66137e82405a532459b2d">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a14123fe9160e559a83e61ab6c2901759">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#ae9ffa98997557c87b0a08b6ed2835155">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#a65018edc8a8596e8bdb7500926544a4a">r123array1x64</a>
+, <a class="el" href="structr123array4x64.html#afada659cc4a54a1416dca2522885cef1">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#a4d3ed48f2b716382ea874a968a2b7174">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#aa459abf9fe8d15019860de5b3b0cddf8">r123array1xm128i</a>
+, <a class="el" href="structr123_1_1Engine.html#a606e3ba824542e52f12df1345126e721">r123::Engine< CBRNG ></a>
+, <a class="el" href="structr123array2x64.html#aa690f425f846ff9908a734eb720df573">r123array2x64</a>
+</li>
+<li>operator>>
+: <a class="el" href="structr123_1_1Engine.html#ae708b771ab5ac17700d34bad875a16d9">r123::Engine< CBRNG ></a>
+</li>
+<li>operator[]()
+: <a class="el" href="structr123array4x32.html#a3161a139a59a1196398d5d4b81d740df">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#a2b0d17077d419e9f296318161fcc0470">r123array8x32</a>
+, <a class="el" href="structr123array16x8.html#a013713c00f6e8a5adb7be77388c22d8f">r123array16x8</a>
+, <a class="el" href="structr123array4x32.html#aa1fef4a0eb551a70d1ec5d766efcffb5">r123array4x32</a>
+, <a class="el" href="structr123array4x64.html#a27c2001bf5af042aa450f17637646bd3">r123array4x64</a>
+, <a class="el" href="structr123array1xm128i.html#aaa3ccbe6c0838b5bdafcd0dfa3c2c074">r123array1xm128i</a>
+, <a class="el" href="structr123array16x8.html#abe9f2b18e2e3b89e00725f6fa69b8236">r123array16x8</a>
+, <a class="el" href="structr123array8x32.html#ace7ad1b4aca1ad419c373d9cff872805">r123array8x32</a>
+, <a class="el" href="structr123array2x64.html#a7352cdb2c025b0373ece5c84409a1b1d">r123array2x64</a>
+, <a class="el" href="structr123array1x64.html#aa13b237c78d719ecfb5a59cdd557c889">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#ae534a7e32afae58303ccc8379408551b">r123array2x64</a>
+, <a class="el" href="structr123array1x32.html#a05cf21fa6a647c73763da02d4b7e2f2a">r123array1x32</a>
+, <a class="el" href="structr123array1xm128i.html#aba0d6532c59c3c879bcfbad16cab5748">r123array1xm128i</a>
+, <a class="el" href="structr123array2x32.html#a9926f6938472682c5d31a742378f17de">r123array2x32</a>
+, <a class="el" href="structr123array4x64.html#adf867ee2ffc437a3f358431d3729a33d">r123array4x64</a>
+, <a class="el" href="structr123array2x32.html#a0ae33a5edf89f9f12edec38209b02464">r123array2x32</a>
+, <a class="el" href="structr123array1x32.html#aa47bb157c60858c1b0ef69df79646a3b">r123array1x32</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_0x70.html b/lib/Random123-1.08/docs/html/functions_0x70.html
new file mode 100644
index 0000000..49fe7da
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_0x70.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6b.html#index_k"><span>k</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li class="current"><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x75.html#index_u"><span>u</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>pointer
+: <a class="el" href="structr123array1x32.html#a85ce46c2e10ab3d9c4f60aebe6268898">r123array1x32</a>
+, <a class="el" href="structr123array1xm128i.html#a4f78260ba2ec595bdc56fc21fd45e45a">r123array1xm128i</a>
+, <a class="el" href="structr123array16x8.html#aa6ae2e4843b3bb1b66425afa7da9e281">r123array16x8</a>
+, <a class="el" href="structr123array4x64.html#a08c39c2f70f4198a82cba99c0162e67c">r123array4x64</a>
+, <a class="el" href="structr123array2x64.html#a3b0b967b9ae134da266448c190f59c3a">r123array2x64</a>
+, <a class="el" href="structr123array1x64.html#a1c104fabb72d6c72c51348ac72bd419f">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#aeaf3b46bbc571a21d61ad6ee6e760291">r123array8x32</a>
+, <a class="el" href="structr123array4x32.html#adcef39f1e3989578b4c0a92524a15df2">r123array4x32</a>
+, <a class="el" href="structr123array2x32.html#ac884bcbd1063811354bfac66262a0b42">r123array2x32</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_0x72.html b/lib/Random123-1.08/docs/html/functions_0x72.html
new file mode 100644
index 0000000..515ce96
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_0x72.html
@@ -0,0 +1,190 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6b.html#index_k"><span>k</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li class="current"><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x75.html#index_u"><span>u</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>R123_NO_MACRO_SUBST()
+: <a class="el" href="classr123_1_1MicroURNG.html#aa05c857c01053cf9185406d69757b101">r123::MicroURNG< CBRNG ></a>
+, <a class="el" href="structr123_1_1Engine.html#a112318f7d0015ecf4c3c6a8a5c76371b">r123::Engine< CBRNG ></a>
+</li>
+<li>rbegin()
+: <a class="el" href="structr123array2x32.html#a00afca78e25bbb9e0b00e6ab95ecb162">r123array2x32</a>
+, <a class="el" href="structr123array2x64.html#ad6720531d85d0c284ce32cde3b82a9da">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a102f75427ce01bea725da02b975834b5">r123array4x64</a>
+, <a class="el" href="structr123array4x32.html#aea9aae067d8347aa53a12a4c9948ae9a">r123array4x32</a>
+, <a class="el" href="structr123array4x64.html#a7ccc255ba0e1803080b117703dc3dc70">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#a5023769f3e418e15a707501aaaac5487">r123array16x8</a>
+, <a class="el" href="structr123array1x32.html#a0c91373623da349c09b952f616b7f5e9">r123array1x32</a>
+, <a class="el" href="structr123array4x32.html#aadb177f7f316ae47deeea20a686e7909">r123array4x32</a>
+, <a class="el" href="structr123array16x8.html#a5da4b6af6ebaf8cc8204713a993a860c">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a78034de911e765ed64162c894fe2ce05">r123array1xm128i</a>
+, <a class="el" href="structr123array8x32.html#a0a143a573df3282ba5b9cb2190047cca">r123array8x32</a>
+, <a class="el" href="structr123array1xm128i.html#acd4e73f214be1dfaae5d2e20559083eb">r123array1xm128i</a>
+, <a class="el" href="structr123array1x32.html#aacb0604c956b8e50b057a6034c78069c">r123array1x32</a>
+, <a class="el" href="structr123array8x32.html#a959345559456fbc9e7e72d03a72a032c">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#a56196452051f26a10a4bb3c3d7b75fd0">r123array1x64</a>
+, <a class="el" href="structr123array2x32.html#a54e96198e6cd511dc147348f274b0784">r123array2x32</a>
+, <a class="el" href="structr123array1x64.html#a5b080aafd94d77efda03730b6f853334">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#a6888b98627db6056afe3f4ee3396a9a6">r123array2x64</a>
+</li>
+<li>reference
+: <a class="el" href="structr123array1x32.html#ae5aa4e3a65528495ea71371529ade7d7">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#aacd028d9f97ec8a2f484f0eff815abd5">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a620f00f67215ab7fd344ec551c596712">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#a4027cd913ec90428d5d0dcad23a5dc2b">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#a6b196cbfb84a28a57f24cd976c6fd6e6">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#a7150b3ad865d00ca1f753accd8165336">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a14ea48b972d46d9424c317db9698224f">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#adf010ea54bc2f9dceb8568d59c6dde8a">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a34f0cbdac5eb89118ecf2ab5939fbf83">r123array1xm128i</a>
+</li>
+<li>rend()
+: <a class="el" href="structr123array2x64.html#ad96f87786a8a277bf553d0c5584c20c1">r123array2x64</a>
+, <a class="el" href="structr123array1x32.html#a7a55225361d3e9e6f037daa13d340fc4">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#a383edbf33737eb3e5098d6da4ed326f8">r123array2x32</a>
+, <a class="el" href="structr123array8x32.html#afcf1ea68c3cd0ce7ff6de11d3030eb93">r123array8x32</a>
+, <a class="el" href="structr123array2x32.html#ab3f0841dcd9cea6255406b7bc6363621">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a368f69bdd03a9af1c6254daf98496dbd">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#aa84fc75185aedca379d23c0220b5c64a">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#aa0f756e941d0e417355d940fd0ed3a33">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#ad1e373b457921fc672ed8892180431eb">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a71f59163070cb4cfd7ddda6f4f8576a1">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#a252b937d65e7b04e5bc507d43643441f">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#aeb47d483223e3e29f6ad156e5c356a20">r123array1xm128i</a>
+, <a class="el" href="structr123array16x8.html#a286fef704fcf11e9f00d73703b7ab36b">r123array16x8</a>
+</li>
+<li>reset()
+: <a class="el" href="classr123_1_1MicroURNG.html#add2f214254ddc2291e3b2c8b5dbe791a">r123::MicroURNG< CBRNG ></a>
+</li>
+<li>result_type
+: <a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">r123::Engine< CBRNG ></a>
+, <a class="el" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">r123::MicroURNG< CBRNG ></a>
+</li>
+<li>reverse_iterator
+: <a class="el" href="structr123array2x32.html#ad0b05bbfee2d432dfef71342f14b8430">r123array2x32</a>
+, <a class="el" href="structr123array2x64.html#abcbf25662447a5241ed4d19c202f647a">r123array2x64</a>
+, <a class="el" href="structr123array4x32.html#aaabdf758fb4a56eaf4cf256654f41314">r123array4x32</a>
+, <a class="el" href="structr123array4x64.html#acc93aa79ca040ce8fd0957ac86caa2f9">r123array4x64</a>
+, <a class="el" href="structr123array1xm128i.html#a6a507944eb872540e73e7a839cbc8e30">r123array1xm128i</a>
+, <a class="el" href="structr123array1x32.html#a21cb520afa483ae177c469f3940e7ed2">r123array1x32</a>
+, <a class="el" href="structr123array1x64.html#ac9c44218c6761d9e6f422435e49acb17">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#acab5de900b99bad5f69009f48fa72235">r123array8x32</a>
+, <a class="el" href="structr123array16x8.html#aeeb5d6d55c07a515e4c7d01cb5c5351b">r123array16x8</a>
+</li>
+<li>rounds
+: <a class="el" href="structr123_1_1Threefry4x64__R.html#ab8807960eec8fc2198055ec2a971e116">r123::Threefry4x64_R< R ></a>
+, <a class="el" href="structr123_1_1AESNI1xm128i.html#a1b5a44afde814ba844d8f5442e2a3a5f">r123::AESNI1xm128i</a>
+, <a class="el" href="structr123_1_1Threefry2x64__R.html#aa994d756504284e6a59cc8d3c57f16c6">r123::Threefry2x64_R< R ></a>
+, <a class="el" href="structr123_1_1ARS1xm128i__R.html#abe167a93280140e424d722c1ac47a8e9">r123::ARS1xm128i_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox4x32__R.html#a90d6a86bff4dc6e5e24209423f125140">r123::Philox4x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox4x64__R.html#ac51193ab00b118b75784f86cf3470876">r123::Philox4x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox2x32__R.html#a52ee7b34688fc2e5315152a10d7df5f0">r123::Philox2x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1AESNI4x32.html#a725aad79b8d496d97bed24390f624be6">r123::AESNI4x32</a>
+, <a class="el" href="structr123_1_1Philox2x64__R.html#ac0764d78e07bf6d311b47d0f3ce92450">r123::Philox2x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Threefry2x32__R.html#af5be46f8426cfcd86e75327e4b3750b0">r123::Threefry2x32_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry4x32__R.html#af63fd38ba9acf04ee56d75e96b413291">r123::Threefry4x32_R< R ></a>
+, <a class="el" href="structr123_1_1ARS4x32__R.html#a710e59a54794b4cd5e55689dd906b9ba">r123::ARS4x32_R< ROUNDS ></a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_0x73.html b/lib/Random123-1.08/docs/html/functions_0x73.html
new file mode 100644
index 0000000..d50604d
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_0x73.html
@@ -0,0 +1,169 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6b.html#index_k"><span>k</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li class="current"><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x75.html#index_u"><span>u</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>seed()
+: <a class="el" href="structr123array1x32.html#adf914fa4384acfcfa1750fd47b758f42">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#a31cf9b80bbcc3c976681b878b7afa046">r123array2x32</a>
+, <a class="el" href="structr123array8x32.html#a93139b379ce88e16f75eb9edcf40b357">r123array8x32</a>
+, <a class="el" href="structr123array16x8.html#aef0741829d359c31ad913a6770661895">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a6645aeddeb992559150089c49ac335c8">r123array1xm128i</a>
+, <a class="el" href="structr123array1x64.html#a69be3aa9c2588ce86b5ebb72649ce684">r123array1x64</a>
+, <a class="el" href="structr123_1_1Engine.html#a93429593bdb12b202b4b8ed38fe08bc4">r123::Engine< CBRNG ></a>
+, <a class="el" href="structr123array4x32.html#acdaad089dc0e44da5818ebda8404bd16">r123array4x32</a>
+, <a class="el" href="structr123array2x64.html#a3e5afc5e4c6886611630cec365d8397b">r123array2x64</a>
+, <a class="el" href="structr123_1_1Engine.html#aff36bc97d11bc66f6c0edb75d8dc88e5">r123::Engine< CBRNG ></a>
+, <a class="el" href="structr123array4x64.html#a6f0133930367a2260ed5a132bf737131">r123array4x64</a>
+, <a class="el" href="structr123_1_1Engine.html#a7bd6d3417cefb904c879f41d2c29e15e">r123::Engine< CBRNG ></a>
+</li>
+<li>setcounter()
+: <a class="el" href="structr123_1_1Engine.html#a6104bf5ee89450403379d5680bfae172">r123::Engine< CBRNG ></a>
+</li>
+<li>size()
+: <a class="el" href="structr123array1x32.html#a4cbaf3feeaad0bb7227d065294240561">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#ad3d7310bd3ced1bfb05cbe4f3e753490">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a1da4bfacdcd4a520a227bc5c2cff6a4b">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#aa4025fb7c1ef2c3376bdc9ae88b91553">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#a81dba857004f49f48cb0712edaa39e76">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#a10e19c13a970156c4fc18fa070dc9756">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a303c3feaf0783e99292c3220613ea903">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#a9a31da5cdf154eba3e44af4e51002a15">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a3f272a3884d1d5ca7a207fb31a270617">r123array1xm128i</a>
+</li>
+<li>size_type
+: <a class="el" href="structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c">r123array1xm128i</a>
+, <a class="el" href="structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af">r123array4x64</a>
+, <a class="el" href="structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#aacb6269c183cc408285dca02e3b55526">r123array2x64</a>
+</li>
+<li>static_size
+: <a class="el" href="structr123array8x32.html#aae848a29e2a9b3229fc7063440885c4fa2270c17b2a56aea106facc9a22b62be6">r123array8x32</a>
+, <a class="el" href="structr123array16x8.html#a7b2912a12e57bc62644a8ce57e2301b2af0ee079d4b47a988dcd2b8b8457f266f">r123array16x8</a>
+, <a class="el" href="structr123array2x32.html#ad6e438ec0d5a08bfb0b71a3ff96ea7e8a5ae3e9837bb88660b088443c1a6fb47a">r123array2x32</a>
+, <a class="el" href="structr123array1x32.html#a2cdb0e09b7e8ba20de255ddcb54ea9baae9556d9b93643fe1f7e56e973200177a">r123array1x32</a>
+, <a class="el" href="structr123array4x32.html#a3d387fea63ac50668e75faa8ebe4594aa80d43f91cd038fece63f219b9f4a36c6">r123array4x32</a>
+, <a class="el" href="structr123array2x64.html#aa8ed42c5bf709f879674643a70e71dbca6219dc89b2a7ffde9b00364177f5b846">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a904abc16c5828698aa8af5824b6a69c1aa1363fd51fd3dae2d8989711a11817ff">r123array4x64</a>
+, <a class="el" href="structr123array1x64.html#ab7fb5f41ed3716bce19489deb1dd4149a0c25e6a56a2c69eb7641adb24765e6af">r123array1x64</a>
+, <a class="el" href="structr123array1xm128i.html#a130e9722020433db562761a8e51bed2ca32ec6b84a0fa2dd836b04e0ffa69b2bc">r123array1xm128i</a>
+</li>
+<li>swap()
+: <a class="el" href="structr123array1x64.html#a6f929a34461c49c9571eedc1df65fd20">r123array1x64</a>
+, <a class="el" href="structr123array1x32.html#afdd8df41333430593d31350bd12db11a">r123array1x32</a>
+, <a class="el" href="structr123array16x8.html#a2de9273e9c4b4c47315cb20885e9c6ed">r123array16x8</a>
+, <a class="el" href="structr123array2x32.html#a1eac99d2198007201b9c0040a18b258c">r123array2x32</a>
+, <a class="el" href="structr123array4x64.html#a9845020f8799cbf04156e3114a4c9314">r123array4x64</a>
+, <a class="el" href="structr123array4x32.html#a3e6f9b7de70de3386bcd2ba44ad68fb5">r123array4x32</a>
+, <a class="el" href="structr123array2x64.html#a78ea0dba10b77c9f228108df9ab09c9d">r123array2x64</a>
+, <a class="el" href="structr123array1xm128i.html#a05f536079732d192e572bcf395ab6b4e">r123array1xm128i</a>
+, <a class="el" href="structr123array8x32.html#a04c88fca3a8cc3b579e9fc480629888e">r123array8x32</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_0x75.html b/lib/Random123-1.08/docs/html/functions_0x75.html
new file mode 100644
index 0000000..156f7b8
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_0x75.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6b.html#index_k"><span>k</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li class="current"><a href="functions_0x75.html#index_u"><span>u</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_u"></a>- u -</h3><ul>
+<li>ukey
+: <a class="el" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">r123::Engine< CBRNG ></a>
+</li>
+<li>ukey_type
+: <a class="el" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">r123::Engine< CBRNG ></a>
+, <a class="el" href="structr123_1_1Threefry4x64__R.html#a087ff88f84d115a6a726e008c6dcc325">r123::Threefry4x64_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry2x64__R.html#a57db271865ab1889c8f569fb053ee66d">r123::Threefry2x64_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry4x32__R.html#aab22e360de3f5e13f018ccf3a6754a8f">r123::Threefry4x32_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry2x32__R.html#a3ab3969f7445f9fe935566fdc017c5ca">r123::Threefry2x32_R< R ></a>
+, <a class="el" href="structr123_1_1ReinterpretCtr.html#a4b0b69c1aa58d62bb22e51e16c586bee">r123::ReinterpretCtr< ToType, CBRNG ></a>
+, <a class="el" href="structr123_1_1Philox4x64__R.html#a4715e37129fb4ca9d7671cb9df4fa8c5">r123::Philox4x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox2x64__R.html#a0c4cfeb8c3f00d1755ee047790c9da1c">r123::Philox2x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox4x32__R.html#a804c8700155da93039c339ac83df99dd">r123::Philox4x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox2x32__R.html#a8982960eb5a3b5afc26c8e8d6639275e">r123::Philox2x32_R< ROUNDS ></a>
+, <a class="el" href="classr123_1_1MicroURNG.html#a7e6fd93fec2fe138ee36b401ff376cfc">r123::MicroURNG< CBRNG ></a>
+, <a class="el" href="structr123_1_1ARS4x32__R.html#aa4bd7be98acb8b0299fb0ffce3db69ee">r123::ARS4x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1ARS1xm128i__R.html#ab26c7029e347e6b1e17dad795e462aeb">r123::ARS1xm128i_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1AESNI4x32.html#a3fbb6113e70575dce3b6047a22a751f4">r123::AESNI4x32</a>
+, <a class="el" href="structr123_1_1AESNI1xm128i.html#a1f405533da84d98b938030190a63cec5">r123::AESNI1xm128i</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_0x76.html b/lib/Random123-1.08/docs/html/functions_0x76.html
new file mode 100644
index 0000000..7158aaf
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_0x76.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6b.html#index_k"><span>k</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x75.html#index_u"><span>u</span></a></li>
+      <li class="current"><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
+<li>v
+: <a class="el" href="structr123array1x32.html#a1123ac44ecadd52dae06d2c8df86764a">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#a65524bf06568073021117ef196d6b45f">r123array2x32</a>
+, <a class="el" href="structr123array8x32.html#a7a84d2a924a271cc7b5f748023517d10">r123array8x32</a>
+, <a class="el" href="structr123array16x8.html#a703776a5f85fb222e16b739309489783">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">r123array1xm128i</a>
+, <a class="el" href="structr123array1x64.html#a951c4b651e15e5ad4f66d81027c8e1b5">r123array1x64</a>
+, <a class="el" href="structr123_1_1Engine.html#a6169d4fbce1fd7725fabda4c693bf250">r123::Engine< CBRNG ></a>
+, <a class="el" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">r123array4x32</a>
+, <a class="el" href="structr123array2x64.html#a547e4a51e531cf36eef885fbf20a7048">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#aae3a18410877c49f1058bc4d78a62f48">r123array4x64</a>
+</li>
+<li>value_type
+: <a class="el" href="structr123array2x64.html#acefd9fb46661254e17877844c545e15f">r123array2x64</a>
+, <a class="el" href="structr123array16x8.html#ad1d7184f51cafaff4714a2dcf60c9ae2">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a70ab4e530c7cce9481e07aa0b21dd96b">r123array1xm128i</a>
+, <a class="el" href="structr123array2x32.html#ab669df8d33d32ee3571210eb090c6cb2">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a5ba59b507edcf793ba186a9a4e8c56d5">r123array4x32</a>
+, <a class="el" href="structr123array1x64.html#a4d8280ccd7087d5c3faba27641e8fbe7">r123array1x64</a>
+, <a class="el" href="structr123array4x64.html#ae4a79be3ab80944a8bb6bc7ec7907061">r123array4x64</a>
+, <a class="el" href="structr123array1x32.html#a9c8e0d672be32b52eef639f1a3b2b98a">r123array1x32</a>
+, <a class="el" href="structr123array8x32.html#af47fd0d348b68dd7a2853c68eb32d8b7">r123array8x32</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_eval.html b/lib/Random123-1.08/docs/html/functions_eval.html
new file mode 100644
index 0000000..22a0949
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_eval.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members - Enumerator</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li class="current"><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ <ul>
+<li>static_size
+: <a class="el" href="structr123array1x32.html#a2cdb0e09b7e8ba20de255ddcb54ea9baae9556d9b93643fe1f7e56e973200177a">r123array1x32</a>
+, <a class="el" href="structr123array1xm128i.html#a130e9722020433db562761a8e51bed2ca32ec6b84a0fa2dd836b04e0ffa69b2bc">r123array1xm128i</a>
+, <a class="el" href="structr123array16x8.html#a7b2912a12e57bc62644a8ce57e2301b2af0ee079d4b47a988dcd2b8b8457f266f">r123array16x8</a>
+, <a class="el" href="structr123array4x64.html#a904abc16c5828698aa8af5824b6a69c1aa1363fd51fd3dae2d8989711a11817ff">r123array4x64</a>
+, <a class="el" href="structr123array2x64.html#aa8ed42c5bf709f879674643a70e71dbca6219dc89b2a7ffde9b00364177f5b846">r123array2x64</a>
+, <a class="el" href="structr123array1x64.html#ab7fb5f41ed3716bce19489deb1dd4149a0c25e6a56a2c69eb7641adb24765e6af">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#aae848a29e2a9b3229fc7063440885c4fa2270c17b2a56aea106facc9a22b62be6">r123array8x32</a>
+, <a class="el" href="structr123array4x32.html#a3d387fea63ac50668e75faa8ebe4594aa80d43f91cd038fece63f219b9f4a36c6">r123array4x32</a>
+, <a class="el" href="structr123array2x32.html#ad6e438ec0d5a08bfb0b71a3ff96ea7e8a5ae3e9837bb88660b088443c1a6fb47a">r123array2x32</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_func.html b/lib/Random123-1.08/docs/html/functions_func.html
new file mode 100644
index 0000000..102c030
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_func.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li class="current"><a href="functions_func.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>aesni1xm128i_key_t()
+: <a class="el" href="structaesni1xm128i__key__t.html#af1002e5b771616db8f12c793fc994c41">aesni1xm128i_key_t</a>
+</li>
+<li>at()
+: <a class="el" href="structr123array16x8.html#a088dbabe23cf873de370af292052905e">r123array16x8</a>
+, <a class="el" href="structr123array4x64.html#a893d3db3d274fc15ac32bc7cbab0e82a">r123array4x64</a>
+, <a class="el" href="structr123array2x64.html#a971ddfa7c395d161028e16c829179f3c">r123array2x64</a>
+, <a class="el" href="structr123array1x64.html#af6cf7706792eb1e44902dd94df388726">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#a79f982be8c435215a5e812e88e500216">r123array8x32</a>
+, <a class="el" href="structr123array4x32.html#abdb3253eb03291895f89885298e17169">r123array4x32</a>
+, <a class="el" href="structr123array2x32.html#ae985b8811e4e8849d5f28dae76231dca">r123array2x32</a>
+, <a class="el" href="structr123array1x32.html#a1d57048b43ee45e2a94ef372b4707783">r123array1x32</a>
+, <a class="el" href="structr123array1xm128i.html#a5e8a81ee3f7c3b022554c0023a686700">r123array1xm128i</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_func_0x62.html b/lib/Random123-1.08/docs/html/functions_func_0x62.html
new file mode 100644
index 0000000..6e8789e
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_func_0x62.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index_a"><span>a</span></a></li>
+      <li class="current"><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<li>back()
+: <a class="el" href="structr123array1x32.html#a3738a65a648899db793e81b53c252785">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#ae176c02299531373a0fff9a5f55226e5">r123array2x32</a>
+, <a class="el" href="structr123array8x32.html#a73f5b5012b1e6595f727ef88e60a53ac">r123array8x32</a>
+, <a class="el" href="structr123array16x8.html#a6e5e98c20ae0e6bf4f8a897c08b0700e">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a082b7b75374d69149ee03d1d228e2508">r123array1xm128i</a>
+, <a class="el" href="structr123array1x64.html#ab85790fdee269501a80fe31179efc9f8">r123array1x64</a>
+, <a class="el" href="structr123array1xm128i.html#a458be25b18c6e59d5c72e2c4d4ea6354">r123array1xm128i</a>
+, <a class="el" href="structr123array4x32.html#a70fd9b24cb3b126eb15c23049f786653">r123array4x32</a>
+, <a class="el" href="structr123array1x64.html#a2cd091b3015befa2b954ddab91271e39">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#a9beb3e776cb4f3cbee6846518749cb03">r123array2x64</a>
+, <a class="el" href="structr123array2x32.html#a3da7214b9946a3c8653312dcfa42a288">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a4e1cba8583b2fac8cc3bf854956191c4">r123array4x32</a>
+, <a class="el" href="structr123array2x64.html#ac72fd3a39821ca25f94258f97da371c5">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#abb40868277e8a943a0b5464985baceb5">r123array4x64</a>
+, <a class="el" href="structr123array8x32.html#a1d4176e4ad6d70c98805e0c924d2df37">r123array8x32</a>
+, <a class="el" href="structr123array4x64.html#a9006cfe7882bbc791a81a52f7cc0fd2d">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#ae607d3b3d068aec88672241fc97948cb">r123array16x8</a>
+</li>
+<li>begin()
+: <a class="el" href="structr123array1x32.html#a86b7d754ff8dd69e0565edfdbd060cb4">r123array1x32</a>
+, <a class="el" href="structr123array16x8.html#a43182e95cb41660de5511bb5a3968cb8">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a275c9837db101efb234c36cff3e7562f">r123array1xm128i</a>
+, <a class="el" href="structr123array2x32.html#aa52b394a0c44b755e5c0d0409dc2c4ea">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a96a9c7e3ece3d2b128cf7f264af6ea3c">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#a7ae561c4d544e31f7bd2f256cb32f878">r123array8x32</a>
+, <a class="el" href="structr123array2x64.html#a0fcc60a49efd917a3b630cf53c526311">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#acd133812dbe01892199683e003921b8b">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#acef590bcf52e4a167c2388f4d1e0b20e">r123array16x8</a>
+, <a class="el" href="structr123array2x32.html#a96730b28149000a3ea4c6b0f05e1777b">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a830254ee0db7bf12facf67f23428d2d9">r123array4x32</a>
+, <a class="el" href="structr123array1x64.html#a0fddc6603fe2eb4547aeb57498ffe3c2">r123array1x64</a>
+, <a class="el" href="structr123array4x64.html#ab78c67c429da6405f9d1ed5054635961">r123array4x64</a>
+, <a class="el" href="structr123array1x32.html#a19089b8de6c637803408512407a4da91">r123array1x32</a>
+, <a class="el" href="structr123array1x64.html#af9150347761c6df32673bbd2411e67d0">r123array1x64</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_func_0x63.html b/lib/Random123-1.08/docs/html/functions_func_0x63.html
new file mode 100644
index 0000000..077d82f
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_func_0x63.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li class="current"><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>cbegin()
+: <a class="el" href="structr123array1x32.html#a4b0a02537590babd835dd16405775efe">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#a9687a1e6cdb6b6c9a1ffd8f3c7d2ce45">r123array2x32</a>
+, <a class="el" href="structr123array8x32.html#a06c19ba6155e9c98892f5b98fb482c21">r123array8x32</a>
+, <a class="el" href="structr123array16x8.html#a80520b3d7040a8d6ec7068c8a143ba6f">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a335bab18a8bc904e34de0b3d9d1ce596">r123array1xm128i</a>
+, <a class="el" href="structr123array1x64.html#a33d1c19a63dec48f63f7c30c758fca0c">r123array1x64</a>
+, <a class="el" href="structr123array4x32.html#a4881e99f7b0ff88e2a3082b9e2464bf5">r123array4x32</a>
+, <a class="el" href="structr123array2x64.html#ad1ccbda4186dbb8c0a673db1ec0957c0">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#af716d2b14d1243870e8544ea2a3cece6">r123array4x64</a>
+</li>
+<li>cend()
+: <a class="el" href="structr123array4x64.html#af970ab87ce987c91097316bc0a0836ef">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#ad7919a7f772fda7d3fe3b476ac1e058f">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#aa05003cae74984b777610702d27d66d2">r123array1xm128i</a>
+, <a class="el" href="structr123array1x32.html#aa0f83d3e29c452d23c3660c98e3bd0e9">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#a9bb4382830c6feb49573b82bb9a18efc">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a0045f9134801ed79d31f65c7d224d72c">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#a0e1dfc305279a3439789dbdda8bfb6ae">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#aa959a7054efa0d53f83f2d712d8d9049">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#ac80c7ce6fe5bd9ca8baf03db1e67a7e9">r123array2x64</a>
+</li>
+<li>counter()
+: <a class="el" href="classr123_1_1MicroURNG.html#a30f52334b7cfcbe6d86870496ca57ea6">r123::MicroURNG< CBRNG ></a>
+</li>
+<li>crbegin()
+: <a class="el" href="structr123array2x64.html#a198ff47db0778d88db4fabe5f7721564">r123array2x64</a>
+, <a class="el" href="structr123array1x32.html#abe59890575233ef259a69d38bea4b5d9">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#a09b34692bd41a710bf75e19af2353afb">r123array2x32</a>
+, <a class="el" href="structr123array16x8.html#a2ecc3c23f3ae3939a386b334f0556d73">r123array16x8</a>
+, <a class="el" href="structr123array8x32.html#a4ad5f793478a9658c52dc085b6c504ae">r123array8x32</a>
+, <a class="el" href="structr123array1xm128i.html#a673c6cd3131269febe9a985dc76a2e08">r123array1xm128i</a>
+, <a class="el" href="structr123array1x64.html#adac6c38fef501a997b39229f54a6459c">r123array1x64</a>
+, <a class="el" href="structr123array4x64.html#a7712a006a2b567321a6ac9e84bb267d8">r123array4x64</a>
+, <a class="el" href="structr123array4x32.html#ad65e3e63740dc2301442718b3b8aa440">r123array4x32</a>
+</li>
+<li>crend()
+: <a class="el" href="structr123array1x32.html#a7f0211b995c536c540c6b175d9433c74">r123array1x32</a>
+, <a class="el" href="structr123array4x32.html#a13322be3844d39f9de76d263fa8d1f75">r123array4x32</a>
+, <a class="el" href="structr123array1x64.html#a250e375c11846dc2635c7690f283cc20">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#ace0b6344aa8f0b9812a2610b6949a6b7">r123array8x32</a>
+, <a class="el" href="structr123array2x32.html#a458da2536084746b5f3face73c9f962d">r123array2x32</a>
+, <a class="el" href="structr123array4x64.html#a907eb18b7392479a8ad6b2ddfaaecbd2">r123array4x64</a>
+, <a class="el" href="structr123array2x64.html#a5bddb882c7c9a493c382d3ce0d6d6079">r123array2x64</a>
+, <a class="el" href="structr123array16x8.html#a2a98e77e851e130a98d44a14ce673ffd">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#aad72d00c81c8f6b9e8fb6b6be98056c6">r123array1xm128i</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_func_0x64.html b/lib/Random123-1.08/docs/html/functions_func_0x64.html
new file mode 100644
index 0000000..819135e
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_func_0x64.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li class="current"><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>data()
+: <a class="el" href="structr123array1x32.html#a71529eccd6d52d7c396d58fd71214d0b">r123array1x32</a>
+, <a class="el" href="structr123array1xm128i.html#ac66f2efebe9e32433b25f96ea3cf34fe">r123array1xm128i</a>
+, <a class="el" href="structr123array2x32.html#a15d5bce0ea3596ad5f7b5aa7432a33df">r123array2x32</a>
+, <a class="el" href="structr123array16x8.html#aac0eda610fbd60cdaae5d1e2aa4eb03f">r123array16x8</a>
+, <a class="el" href="structr123array4x64.html#a31591d0bca18339d42c3a182a30457a0">r123array4x64</a>
+, <a class="el" href="structr123array2x64.html#a9cdb592780378bdcc8a560e31e11f084">r123array2x64</a>
+, <a class="el" href="structr123array1x64.html#a02cd843e927803bd09f00b1a5541c72c">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#a0e2eb8cfaf36664411f19a6828339553">r123array8x32</a>
+, <a class="el" href="structr123array4x32.html#a20dd9fc18f9db8fe8e8eb08311398d22">r123array4x32</a>
+, <a class="el" href="structr123array16x8.html#aced4f7455fcc853a4e947b9bf892c45e">r123array16x8</a>
+, <a class="el" href="structr123array2x32.html#a76f2b3cd04d0502121b3c7894663e178">r123array2x32</a>
+</li>
+<li>discard()
+: <a class="el" href="structr123_1_1Engine.html#a82a56c2c02b146dceb68ef3fd0a969fb">r123::Engine< CBRNG ></a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_func_0x65.html b/lib/Random123-1.08/docs/html/functions_func_0x65.html
new file mode 100644
index 0000000..453a170
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_func_0x65.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li class="current"><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>empty()
+: <a class="el" href="structr123array1x32.html#ae791cf5ce80a35610c3b4d52ea533651">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#acc67c9fedcddd77fdb2727c088eaab9d">r123array2x32</a>
+, <a class="el" href="structr123array8x32.html#af2276e84924345efab98214be1691c83">r123array8x32</a>
+, <a class="el" href="structr123array16x8.html#a5f07441771ec90cd05a2c26fb64e575e">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#aa3e59f1626f2cadab5bc66e415ff0c72">r123array1xm128i</a>
+, <a class="el" href="structr123array1x64.html#af8636ea61389dcf15e94a5da70bd6bc0">r123array1x64</a>
+, <a class="el" href="structr123array4x32.html#a4bc944eee354be2b258c0991d3cc61e1">r123array4x32</a>
+, <a class="el" href="structr123array2x64.html#a60ed2f5af6357930b50a8de8f294f5c2">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a51e4ded187a3f1ebadd6b915da039c3f">r123array4x64</a>
+</li>
+<li>end()
+: <a class="el" href="structr123array1xm128i.html#a7383241079a4eae9fee0e184261174fd">r123array1xm128i</a>
+, <a class="el" href="structr123array16x8.html#aee42dddf2a59858114a31d760f2c1227">r123array16x8</a>
+, <a class="el" href="structr123array8x32.html#a40c40a7a86150ec0e9d29739e0e649c3">r123array8x32</a>
+, <a class="el" href="structr123array4x64.html#a9fed923c39000c81f7f6b608d88953f9">r123array4x64</a>
+, <a class="el" href="structr123array2x64.html#af16f99514770cb88a57e36b1b849e80d">r123array2x64</a>
+, <a class="el" href="structr123array8x32.html#acc1aa99ed89deb63c3ba7f71319ac10c">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#a18a5fa64dbe73dc4f9fd0b6c45fe283f">r123array1x64</a>
+, <a class="el" href="structr123array1x32.html#ac2b5032395c448c4598321f5a37ec29c">r123array1x32</a>
+, <a class="el" href="structr123array2x64.html#a24679f6a101d9d25b339106a771c4e68">r123array2x64</a>
+, <a class="el" href="structr123array4x32.html#ac6e732c58b1a5ad954c3b6f2be8385a1">r123array4x32</a>
+, <a class="el" href="structr123array1x32.html#a5bda32a4f4e8e783744ed7f183dde0b2">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#ad64dc05d5114c74d104bca45f21992fd">r123array2x32</a>
+, <a class="el" href="structr123array16x8.html#aa0d2b0c70133dde0535b0a5e12283626">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#ae8ddb01064f8cdfbb7314d2f1fbd0dfd">r123array1xm128i</a>
+, <a class="el" href="structr123array2x32.html#a0d98e92b198e8a314d46f9c6fd0771a7">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a83dd3d17e17bb6a93b7cd544b0e9a403">r123array4x32</a>
+</li>
+<li>Engine()
+: <a class="el" href="structr123_1_1Engine.html#a37dd55cee849b59d678f74780f785672">r123::Engine< CBRNG ></a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_func_0x66.html b/lib/Random123-1.08/docs/html/functions_func_0x66.html
new file mode 100644
index 0000000..db4bfc7
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_func_0x66.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li class="current"><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>fill()
+: <a class="el" href="structr123array1x32.html#a973dbecc59b1d5f5a95bda92d25e5e73">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#af7ea9ed8a064e9cab59ee97885bb459e">r123array2x32</a>
+, <a class="el" href="structr123array8x32.html#a86481aecfb276687e9389cb6c43e1e8c">r123array8x32</a>
+, <a class="el" href="structr123array16x8.html#a883d42092ab4bae2eac132706ed06103">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a7eba15dc035724245f70b4a3a98c6a52">r123array1xm128i</a>
+, <a class="el" href="structr123array1x64.html#ac9a372e0980632a4db29bb243b672039">r123array1x64</a>
+, <a class="el" href="structr123array4x32.html#ae362d7908c2ecc308f6fd4e085ace980">r123array4x32</a>
+, <a class="el" href="structr123array2x64.html#a30d20bbf203dbd0b592c6cb58cb6dcdb">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a6580c77b7d68c0a76b5bef33e59ac662">r123array4x64</a>
+</li>
+<li>fix_invariant()
+: <a class="el" href="structr123_1_1Engine.html#aa7ad87d7238a0f820ee37640071dee7d">r123::Engine< CBRNG ></a>
+</li>
+<li>front()
+: <a class="el" href="structr123array1x64.html#a7d205216932e36303f62b38d233247d5">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#aee2127f4a99f86b3fc7a9059e7d84e76">r123array8x32</a>
+, <a class="el" href="structr123array4x32.html#ab3434550aea3d2e04579cb255b0b4e9e">r123array4x32</a>
+, <a class="el" href="structr123array2x32.html#a933676c34296b74eeea8a56a3c904a2c">r123array2x32</a>
+, <a class="el" href="structr123array1x32.html#af94d0df621b1de0b6a3ed904c276eb84">r123array1x32</a>
+, <a class="el" href="structr123array16x8.html#ad293e6494e131ff96941e963d9208586">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a7efd9b7ccf35c3730fbdafb147e11660">r123array1xm128i</a>
+, <a class="el" href="structr123array2x64.html#a21cf5457f945f5c00b16ce4a73797c1b">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a975ecaf4c5332fc400dfc8d6d60d9035">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#a85528130b6941b3f7b57265c201345c2">r123array16x8</a>
+, <a class="el" href="structr123array2x64.html#a95b79f70de75c8346dbae7c5f933d076">r123array2x64</a>
+, <a class="el" href="structr123array1x64.html#a7c0a3159492b3405a8019ce52cdf2c69">r123array1x64</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_func_0x67.html b/lib/Random123-1.08/docs/html/functions_func_0x67.html
new file mode 100644
index 0000000..529df5a
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_func_0x67.html
@@ -0,0 +1,109 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li class="current"><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>getcounter()
+: <a class="el" href="structr123_1_1Engine.html#a621df886f2a21ffb22e63d9094389173">r123::Engine< CBRNG ></a>
+</li>
+<li>getseed()
+: <a class="el" href="structr123_1_1Engine.html#aa7812a494fdb677c2e325db0acfe924a">r123::Engine< CBRNG ></a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_func_0x69.html b/lib/Random123-1.08/docs/html/functions_func_0x69.html
new file mode 100644
index 0000000..fc334dc
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_func_0x69.html
@@ -0,0 +1,125 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li class="current"><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>incr()
+: <a class="el" href="structr123array1x32.html#aae5fbc153a37b06ea466f2283551622f">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#a7b295f3a299c8cf24a75ab7f9edfe46f">r123array2x32</a>
+, <a class="el" href="structr123array8x32.html#a92ded324d4b7e2602766fa0c71fa5985">r123array8x32</a>
+, <a class="el" href="structr123array16x8.html#aaf2d677b347b7c7bf362a2b318f46e3c">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a62ee236dafcbfb81ef43d7aa82a66b47">r123array1xm128i</a>
+, <a class="el" href="structr123array1x64.html#ad44244e95f8937e0874dec9083071a85">r123array1x64</a>
+, <a class="el" href="structr123array4x32.html#a36515eb50711e36a88f1390bbd4e0e05">r123array4x32</a>
+, <a class="el" href="structr123array2x64.html#ac33e6336c8aee10e38259510ef76e5cf">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#ac4187b4ae44913183b1c8f9b7654f8a9">r123array4x64</a>
+</li>
+<li>incr_carefully()
+: <a class="el" href="structr123array1x32.html#a9c919289274ced376086f1110c8b6384">r123array1x32</a>
+, <a class="el" href="structr123array16x8.html#abbc6c2d9cdc2187cdfdea759951498a0">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#ab35cfd8e9221c294ab7546855373a38c">r123array1xm128i</a>
+, <a class="el" href="structr123array4x32.html#acec3775361651e6f8dea517f07d7a8b8">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#a9e73ed67b7c577ebdb6c5e1f121fdc4f">r123array8x32</a>
+, <a class="el" href="structr123array2x64.html#a52ddbfa3edbd9fa7f30e1402a9240da1">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#af629d14b454f406cae4d128d9e05554d">r123array4x64</a>
+, <a class="el" href="structr123array2x32.html#adf128cb5c0abaaa4f119d4bcef47ead9">r123array2x32</a>
+, <a class="el" href="structr123array1x64.html#ad848dc3e868f8195ee3eb5029698c976">r123array1x64</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_func_0x6d.html b/lib/Random123-1.08/docs/html/functions_func_0x6d.html
new file mode 100644
index 0000000..53e324f
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_func_0x6d.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li class="current"><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
+<li>max_size()
+: <a class="el" href="structr123array1x32.html#a707c532168670ad508723d057f712928">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#a07345b400c5a81e6cd55689d1e38122f">r123array2x32</a>
+, <a class="el" href="structr123array8x32.html#a0ea0af65a3b0a51c090ab6ef11f20c63">r123array8x32</a>
+, <a class="el" href="structr123array16x8.html#a3f59fb2b338aa8e33879e8d2d22840ed">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a04e2b8952459b7aeabc011532fe3f8fa">r123array1xm128i</a>
+, <a class="el" href="structr123array4x64.html#aad1329f21e3fdd5d25a29148db564b8a">r123array4x64</a>
+, <a class="el" href="structr123array2x64.html#a03f7c9e37e59210b1d2b9390e415e289">r123array2x64</a>
+, <a class="el" href="structr123array1x64.html#a1b02d097ca118866b7f696b7c1c5681f">r123array1x64</a>
+, <a class="el" href="structr123array4x32.html#afddfc77eea0f5f4c53dc075425f96ab3">r123array4x32</a>
+</li>
+<li>MicroURNG()
+: <a class="el" href="classr123_1_1MicroURNG.html#a19afb80312c370e1670bf8afc73d802e">r123::MicroURNG< CBRNG ></a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_func_0x6f.html b/lib/Random123-1.08/docs/html/functions_func_0x6f.html
new file mode 100644
index 0000000..2bc04d3
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_func_0x6f.html
@@ -0,0 +1,172 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li class="current"><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>operator __m128i()
+: <a class="el" href="structr123m128i.html#a80a5c24f76fec61b3ab0ed0e0353cfb7">r123m128i</a>
+</li>
+<li>operator const void *()
+: <a class="el" href="structr123m128i.html#ae5788785c2ce7f7ca6ff8dd4377771f3">r123m128i</a>
+</li>
+<li>operator!=()
+: <a class="el" href="structr123array2x32.html#aa0c7e561ddeb475329ea8d8178fca2a1">r123array2x32</a>
+, <a class="el" href="structr123array2x64.html#a1ddc25ec182ac3b119e420f5e21c3f87">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#abf2fc58ddb163708c087f72921dfd11d">r123array4x64</a>
+, <a class="el" href="structr123array4x32.html#a1a7aa47c8dd7db5146e54cc54d1d4358">r123array4x32</a>
+, <a class="el" href="structr123array16x8.html#af48be55844748a0f6406b2ae437398b5">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a60cf5b0e8283c20c386a7935f9ae0a60">r123array1xm128i</a>
+, <a class="el" href="structr123array1x32.html#af293f370d083051f6cf24408e07feff1">r123array1x32</a>
+, <a class="el" href="structr123array8x32.html#aed510e0472db9b00490c468d88e14bac">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#a0969493a7aac290e5ab2a5135380bc3d">r123array1x64</a>
+</li>
+<li>operator()()
+: <a class="el" href="classr123_1_1MicroURNG.html#a64cd4d33b4cab5d3d9c556db68407b77">r123::MicroURNG< CBRNG ></a>
+, <a class="el" href="structr123_1_1Philox2x32__R.html#ab610a200c9fa62d090f31466b655c780">r123::Philox2x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox4x32__R.html#adf05bdc0c856c9541db656711fd8c7d1">r123::Philox4x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox2x64__R.html#a04f6039e87a958593ac011d9304d7ec9">r123::Philox2x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox4x64__R.html#aa5a0488aa6e16c55b7647c155b18462c">r123::Philox4x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1ReinterpretCtr.html#a91edc5103397372cc5509ad17c0fc83a">r123::ReinterpretCtr< ToType, CBRNG ></a>
+, <a class="el" href="structr123_1_1Threefry2x32__R.html#a64b8018e82f3e7a0e252166b15b42a71">r123::Threefry2x32_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry4x32__R.html#ae0dfbf399015fab602c769ad90256231">r123::Threefry4x32_R< R ></a>
+, <a class="el" href="structr123_1_1AESNI1xm128i.html#a9bff0ac8478400c1006136e9bde91dc3">r123::AESNI1xm128i</a>
+, <a class="el" href="structr123_1_1Threefry2x64__R.html#ab654a85f2c4ec65548ddfc85dc00f27e">r123::Threefry2x64_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry4x64__R.html#a09e7fb82f9b7bcf6ccb4d849116b6ec1">r123::Threefry4x64_R< R ></a>
+, <a class="el" href="structr123_1_1AESNI4x32.html#a981102e5bc0a7df916a95a40af8fd4c0">r123::AESNI4x32</a>
+, <a class="el" href="structr123_1_1Engine.html#aca309d0b4f2a8fff1f6f2ab38c6caf93">r123::Engine< CBRNG ></a>
+, <a class="el" href="structr123_1_1ARS1xm128i__R.html#a89c0fc4e1c90ee684fc88dde05d8d82c">r123::ARS1xm128i_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1ARS4x32__R.html#afcd326e150925e30de22166e727567df">r123::ARS4x32_R< ROUNDS ></a>
+</li>
+<li>operator=()
+: <a class="el" href="structaesni1xm128i__key__t.html#acb24fef68c539f1a6ea217ee8ada185d">aesni1xm128i_key_t</a>
+, <a class="el" href="structr123m128i.html#a9842fbc85102e0019cc58d97c28e2d02">r123m128i</a>
+</li>
+<li>operator==()
+: <a class="el" href="structr123array1x32.html#a61140a0fb8983a3018a2b98903d14047">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#aa8723e5786c66137e82405a532459b2d">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a14123fe9160e559a83e61ab6c2901759">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#ae9ffa98997557c87b0a08b6ed2835155">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#a65018edc8a8596e8bdb7500926544a4a">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#aa690f425f846ff9908a734eb720df573">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#afada659cc4a54a1416dca2522885cef1">r123array4x64</a>
+, <a class="el" href="structr123array1xm128i.html#aa459abf9fe8d15019860de5b3b0cddf8">r123array1xm128i</a>
+, <a class="el" href="structr123array16x8.html#a4d3ed48f2b716382ea874a968a2b7174">r123array16x8</a>
+</li>
+<li>operator[]()
+: <a class="el" href="structr123array1x64.html#a10fbaabd5223f286d6e396e15227569c">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#a2b0d17077d419e9f296318161fcc0470">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#aa13b237c78d719ecfb5a59cdd557c889">r123array1x64</a>
+, <a class="el" href="structr123array4x32.html#a3161a139a59a1196398d5d4b81d740df">r123array4x32</a>
+, <a class="el" href="structr123array1xm128i.html#aaa3ccbe6c0838b5bdafcd0dfa3c2c074">r123array1xm128i</a>
+, <a class="el" href="structr123array2x64.html#ae534a7e32afae58303ccc8379408551b">r123array2x64</a>
+, <a class="el" href="structr123array1xm128i.html#aba0d6532c59c3c879bcfbad16cab5748">r123array1xm128i</a>
+, <a class="el" href="structr123array16x8.html#abe9f2b18e2e3b89e00725f6fa69b8236">r123array16x8</a>
+, <a class="el" href="structr123array2x32.html#a9926f6938472682c5d31a742378f17de">r123array2x32</a>
+, <a class="el" href="structr123array1x32.html#a05cf21fa6a647c73763da02d4b7e2f2a">r123array1x32</a>
+, <a class="el" href="structr123array2x64.html#a7352cdb2c025b0373ece5c84409a1b1d">r123array2x64</a>
+, <a class="el" href="structr123array8x32.html#ace7ad1b4aca1ad419c373d9cff872805">r123array8x32</a>
+, <a class="el" href="structr123array1x32.html#aa47bb157c60858c1b0ef69df79646a3b">r123array1x32</a>
+, <a class="el" href="structr123array16x8.html#a013713c00f6e8a5adb7be77388c22d8f">r123array16x8</a>
+, <a class="el" href="structr123array4x64.html#a27c2001bf5af042aa450f17637646bd3">r123array4x64</a>
+, <a class="el" href="structr123array2x32.html#a0ae33a5edf89f9f12edec38209b02464">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#aa1fef4a0eb551a70d1ec5d766efcffb5">r123array4x32</a>
+, <a class="el" href="structr123array4x64.html#adf867ee2ffc437a3f358431d3729a33d">r123array4x64</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_func_0x72.html b/lib/Random123-1.08/docs/html/functions_func_0x72.html
new file mode 100644
index 0000000..5331df5
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_func_0x72.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li class="current"><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>R123_NO_MACRO_SUBST()
+: <a class="el" href="classr123_1_1MicroURNG.html#aa05c857c01053cf9185406d69757b101">r123::MicroURNG< CBRNG ></a>
+, <a class="el" href="structr123_1_1Engine.html#a112318f7d0015ecf4c3c6a8a5c76371b">r123::Engine< CBRNG ></a>
+</li>
+<li>rbegin()
+: <a class="el" href="structr123array2x32.html#a00afca78e25bbb9e0b00e6ab95ecb162">r123array2x32</a>
+, <a class="el" href="structr123array2x64.html#ad6720531d85d0c284ce32cde3b82a9da">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a102f75427ce01bea725da02b975834b5">r123array4x64</a>
+, <a class="el" href="structr123array4x32.html#aea9aae067d8347aa53a12a4c9948ae9a">r123array4x32</a>
+, <a class="el" href="structr123array4x64.html#a7ccc255ba0e1803080b117703dc3dc70">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#a5023769f3e418e15a707501aaaac5487">r123array16x8</a>
+, <a class="el" href="structr123array1x32.html#a0c91373623da349c09b952f616b7f5e9">r123array1x32</a>
+, <a class="el" href="structr123array4x32.html#aadb177f7f316ae47deeea20a686e7909">r123array4x32</a>
+, <a class="el" href="structr123array16x8.html#a5da4b6af6ebaf8cc8204713a993a860c">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a78034de911e765ed64162c894fe2ce05">r123array1xm128i</a>
+, <a class="el" href="structr123array8x32.html#a0a143a573df3282ba5b9cb2190047cca">r123array8x32</a>
+, <a class="el" href="structr123array1xm128i.html#acd4e73f214be1dfaae5d2e20559083eb">r123array1xm128i</a>
+, <a class="el" href="structr123array1x32.html#aacb0604c956b8e50b057a6034c78069c">r123array1x32</a>
+, <a class="el" href="structr123array8x32.html#a959345559456fbc9e7e72d03a72a032c">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#a56196452051f26a10a4bb3c3d7b75fd0">r123array1x64</a>
+, <a class="el" href="structr123array2x32.html#a54e96198e6cd511dc147348f274b0784">r123array2x32</a>
+, <a class="el" href="structr123array1x64.html#a5b080aafd94d77efda03730b6f853334">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#a6888b98627db6056afe3f4ee3396a9a6">r123array2x64</a>
+</li>
+<li>rend()
+: <a class="el" href="structr123array2x64.html#ad1e373b457921fc672ed8892180431eb">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a25538a452f6e709bacfc9f49b7216280">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#a252b937d65e7b04e5bc507d43643441f">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a1599d2154e1f407bef2d556c985b0c21">r123array1xm128i</a>
+, <a class="el" href="structr123array1x64.html#a19f9d7dd7371c20fc5001d864da453ff">r123array1x64</a>
+, <a class="el" href="structr123array1x32.html#a7a55225361d3e9e6f037daa13d340fc4">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#ab3f0841dcd9cea6255406b7bc6363621">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a368f69bdd03a9af1c6254daf98496dbd">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#aa84fc75185aedca379d23c0220b5c64a">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#aa0f756e941d0e417355d940fd0ed3a33">r123array1x64</a>
+, <a class="el" href="structr123array4x64.html#a71f59163070cb4cfd7ddda6f4f8576a1">r123array4x64</a>
+, <a class="el" href="structr123array2x64.html#ad96f87786a8a277bf553d0c5584c20c1">r123array2x64</a>
+, <a class="el" href="structr123array8x32.html#afcf1ea68c3cd0ce7ff6de11d3030eb93">r123array8x32</a>
+, <a class="el" href="structr123array1xm128i.html#aeb47d483223e3e29f6ad156e5c356a20">r123array1xm128i</a>
+, <a class="el" href="structr123array4x32.html#a7b2af2db2af5f90c8a3f5f7014193d72">r123array4x32</a>
+, <a class="el" href="structr123array16x8.html#a286fef704fcf11e9f00d73703b7ab36b">r123array16x8</a>
+, <a class="el" href="structr123array2x32.html#a383edbf33737eb3e5098d6da4ed326f8">r123array2x32</a>
+</li>
+<li>reset()
+: <a class="el" href="classr123_1_1MicroURNG.html#add2f214254ddc2291e3b2c8b5dbe791a">r123::MicroURNG< CBRNG ></a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_func_0x73.html b/lib/Random123-1.08/docs/html/functions_func_0x73.html
new file mode 100644
index 0000000..23e727e
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_func_0x73.html
@@ -0,0 +1,142 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li class="current"><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>seed()
+: <a class="el" href="structr123array1x32.html#adf914fa4384acfcfa1750fd47b758f42">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#a31cf9b80bbcc3c976681b878b7afa046">r123array2x32</a>
+, <a class="el" href="structr123array8x32.html#a93139b379ce88e16f75eb9edcf40b357">r123array8x32</a>
+, <a class="el" href="structr123array16x8.html#aef0741829d359c31ad913a6770661895">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a6645aeddeb992559150089c49ac335c8">r123array1xm128i</a>
+, <a class="el" href="structr123array1x64.html#a69be3aa9c2588ce86b5ebb72649ce684">r123array1x64</a>
+, <a class="el" href="structr123_1_1Engine.html#a93429593bdb12b202b4b8ed38fe08bc4">r123::Engine< CBRNG ></a>
+, <a class="el" href="structr123array4x32.html#acdaad089dc0e44da5818ebda8404bd16">r123array4x32</a>
+, <a class="el" href="structr123array2x64.html#a3e5afc5e4c6886611630cec365d8397b">r123array2x64</a>
+, <a class="el" href="structr123_1_1Engine.html#aff36bc97d11bc66f6c0edb75d8dc88e5">r123::Engine< CBRNG ></a>
+, <a class="el" href="structr123array4x64.html#a6f0133930367a2260ed5a132bf737131">r123array4x64</a>
+, <a class="el" href="structr123_1_1Engine.html#a7bd6d3417cefb904c879f41d2c29e15e">r123::Engine< CBRNG ></a>
+</li>
+<li>setcounter()
+: <a class="el" href="structr123_1_1Engine.html#a6104bf5ee89450403379d5680bfae172">r123::Engine< CBRNG ></a>
+</li>
+<li>size()
+: <a class="el" href="structr123array8x32.html#aa4025fb7c1ef2c3376bdc9ae88b91553">r123array8x32</a>
+, <a class="el" href="structr123array1x32.html#a4cbaf3feeaad0bb7227d065294240561">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#ad3d7310bd3ced1bfb05cbe4f3e753490">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a1da4bfacdcd4a520a227bc5c2cff6a4b">r123array4x32</a>
+, <a class="el" href="structr123array1x64.html#a81dba857004f49f48cb0712edaa39e76">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#a10e19c13a970156c4fc18fa070dc9756">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a303c3feaf0783e99292c3220613ea903">r123array4x64</a>
+, <a class="el" href="structr123array1xm128i.html#a3f272a3884d1d5ca7a207fb31a270617">r123array1xm128i</a>
+, <a class="el" href="structr123array16x8.html#a9a31da5cdf154eba3e44af4e51002a15">r123array16x8</a>
+</li>
+<li>swap()
+: <a class="el" href="structr123array1xm128i.html#a05f536079732d192e572bcf395ab6b4e">r123array1xm128i</a>
+, <a class="el" href="structr123array16x8.html#a2de9273e9c4b4c47315cb20885e9c6ed">r123array16x8</a>
+, <a class="el" href="structr123array4x32.html#a3e6f9b7de70de3386bcd2ba44ad68fb5">r123array4x32</a>
+, <a class="el" href="structr123array2x32.html#a1eac99d2198007201b9c0040a18b258c">r123array2x32</a>
+, <a class="el" href="structr123array2x64.html#a78ea0dba10b77c9f228108df9ab09c9d">r123array2x64</a>
+, <a class="el" href="structr123array8x32.html#a04c88fca3a8cc3b579e9fc480629888e">r123array8x32</a>
+, <a class="el" href="structr123array4x64.html#a9845020f8799cbf04156e3114a4c9314">r123array4x64</a>
+, <a class="el" href="structr123array1x64.html#a6f929a34461c49c9571eedc1df65fd20">r123array1x64</a>
+, <a class="el" href="structr123array1x32.html#afdd8df41333430593d31350bd12db11a">r123array1x32</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_rela.html b/lib/Random123-1.08/docs/html/functions_rela.html
new file mode 100644
index 0000000..e49139c
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_rela.html
@@ -0,0 +1,97 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members - Related Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li class="current"><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ <ul>
+<li>operator!=
+: <a class="el" href="structr123_1_1Engine.html#af0947cdcfc03aef7ec30c9fafa660445">r123::Engine< CBRNG ></a>
+</li>
+<li>operator<<
+: <a class="el" href="structr123_1_1Engine.html#ae0321571f689fca00c608d11ecad7d8d">r123::Engine< CBRNG ></a>
+</li>
+<li>operator==
+: <a class="el" href="structr123_1_1Engine.html#a606e3ba824542e52f12df1345126e721">r123::Engine< CBRNG ></a>
+</li>
+<li>operator>>
+: <a class="el" href="structr123_1_1Engine.html#ae708b771ab5ac17700d34bad875a16d9">r123::Engine< CBRNG ></a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_type.html b/lib/Random123-1.08/docs/html/functions_type.html
new file mode 100644
index 0000000..95c98a9
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_type.html
@@ -0,0 +1,328 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members - Typedefs</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li class="current"><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="#index_b"><span>b</span></a></li>
+      <li><a href="#index_c"><span>c</span></a></li>
+      <li><a href="#index_d"><span>d</span></a></li>
+      <li><a href="#index_e"><span>e</span></a></li>
+      <li><a href="#index_i"><span>i</span></a></li>
+      <li><a href="#index_k"><span>k</span></a></li>
+      <li><a href="#index_p"><span>p</span></a></li>
+      <li><a href="#index_r"><span>r</span></a></li>
+      <li><a href="#index_s"><span>s</span></a></li>
+      <li><a href="#index_u"><span>u</span></a></li>
+      <li><a href="#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<li>bctype
+: <a class="el" href="structr123_1_1ReinterpretCtr.html#ae0accaee618b5eb28a24acd516b3a4c6">r123::ReinterpretCtr< ToType, CBRNG ></a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>cbrng_type
+: <a class="el" href="classr123_1_1MicroURNG.html#ab0b3a77c9408dbcb2f9d6b5c67e9c3f7">r123::MicroURNG< CBRNG ></a>
+, <a class="el" href="structr123_1_1Engine.html#a45ee0086cf8cd6d10febb76dc88f8b22">r123::Engine< CBRNG ></a>
+</li>
+<li>const_iterator
+: <a class="el" href="structr123array2x32.html#a7963141a4af4c4aa74708909312a8644">r123array2x32</a>
+, <a class="el" href="structr123array2x64.html#ae4f249e82506274b19e6077c3d3f03af">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a2aa5637bebf5c9c753edbce62e889d77">r123array4x64</a>
+, <a class="el" href="structr123array4x32.html#a1078ba2cd13bb2a4f83e1b089c816ba7">r123array4x32</a>
+, <a class="el" href="structr123array16x8.html#adda842a447360852f2ffa28fb97eb40c">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#af6be8b009459737fa25d9d2ac7c4e6aa">r123array1xm128i</a>
+, <a class="el" href="structr123array1x32.html#ac7f82e8848759ec5b0026dce8830274e">r123array1x32</a>
+, <a class="el" href="structr123array8x32.html#aa026dfdf1e2741c96db4343ceffd3c9f">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#a28ff01c0fefda1d81112ec9812156164">r123array1x64</a>
+</li>
+<li>const_pointer
+: <a class="el" href="structr123array1x64.html#a2b23f2aa3edf21084ece97a03367bff5">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#a3a13a452ca15f62f8ddcd8b7de9efa08">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#aa268882d3b4fb43ec9d82baf22d58cc5">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#adbe5a6feb583ce6a682496e14cec9cca">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#acc3f6ecf7e6a6bc98c3681c80120ed61">r123array1xm128i</a>
+, <a class="el" href="structr123array1x32.html#ab4a82a1e5300814272528a05587d555b">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#accf098ed49f9d84cfa3831a9fe183885">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a28d13183d1bfcc05854dc39bebbcdf51">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#a621f6293254c6300b1d1b9835b7f30ba">r123array8x32</a>
+</li>
+<li>const_reference
+: <a class="el" href="structr123array1x32.html#adfa6614a8b20cd30c192458c8c2874da">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#a9d71cce3d7ccea7f48da94cf023e1486">r123array2x32</a>
+, <a class="el" href="structr123array4x32.html#a09d7e0d7b1572fc5fe2be119870a39bc">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#a2e7eda7e8940b37e17aef9b0efec3685">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#af75ba9dbfe38e0a6c143f446b7e4b995">r123array1x64</a>
+, <a class="el" href="structr123array2x64.html#a5d80c6b28d869a5422d99541ee1fb93f">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#ac2f21a458bf9008b831c553c5ae77508">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#a7252c320f8b0fb4d66a17acd9e94b4ad">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a84d0123f4376cb6ab77cf817a0cea9cb">r123array1xm128i</a>
+</li>
+<li>const_reverse_iterator
+: <a class="el" href="structr123array4x32.html#a2926ff865e9dcbc3c20e6639aa8d0b1b">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#a207923147148d154b1659e257db44033">r123array8x32</a>
+, <a class="el" href="structr123array1x64.html#a61535adf62580285c3182a713ea0f3b1">r123array1x64</a>
+, <a class="el" href="structr123array4x64.html#a8405a219a9c81f8f298298cffbfd46ac">r123array4x64</a>
+, <a class="el" href="structr123array16x8.html#a7a774fcb52f452f832e11e13dbde6dea">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a6bf98ce6373b157b87c6fd4a7006ed68">r123array1xm128i</a>
+, <a class="el" href="structr123array2x64.html#aa37f04aef8a808c76715b3b2d49c3c30">r123array2x64</a>
+, <a class="el" href="structr123array2x32.html#af298f85ad6bda860232465c5abc33618">r123array2x32</a>
+, <a class="el" href="structr123array1x32.html#a2642ed91a9c6c91ace3b91add2a4feae">r123array1x32</a>
+</li>
+<li>ctr_type
+: <a class="el" href="structr123_1_1ARS1xm128i__R.html#a13a62c94f63054828c6960979f42a268">r123::ARS1xm128i_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1ARS4x32__R.html#a9951dbcb50de849ded7177109b344045">r123::ARS4x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox4x32__R.html#a23adf0320faed0fe4d12ebececdba50a">r123::Philox4x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox2x32__R.html#af00c84c482900fbeca6bd2043395e599">r123::Philox2x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Threefry4x64__R.html#a6c93334cb8a8b53ef01cc79b5296af0d">r123::Threefry4x64_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry2x64__R.html#a6b151f30bc5544671596b9df91e896d8">r123::Threefry2x64_R< R ></a>
+, <a class="el" href="structr123_1_1AESNI4x32.html#ab8a1f8a822eecfc9e587bad76792df32">r123::AESNI4x32</a>
+, <a class="el" href="structr123_1_1Threefry2x32__R.html#a60b1b58aeaa05d467607dc570aed1357">r123::Threefry2x32_R< R ></a>
+, <a class="el" href="classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476">r123::MicroURNG< CBRNG ></a>
+, <a class="el" href="structr123_1_1Philox2x64__R.html#a8e615e3f4680b9e1b986ea071fd173fc">r123::Philox2x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1AESNI1xm128i.html#aaa136c21db9806859fa7cd4e2dbaaaa6">r123::AESNI1xm128i</a>
+, <a class="el" href="structr123_1_1Philox4x64__R.html#afd5f78b34ae7c478ebe16eb601f7b202">r123::Philox4x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1ReinterpretCtr.html#a26cf9e933b35411c37070c948085ba02">r123::ReinterpretCtr< ToType, CBRNG ></a>
+, <a class="el" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">r123::Engine< CBRNG ></a>
+, <a class="el" href="structr123_1_1Threefry4x32__R.html#ae89dabc0060c62e0d9e5c4ac34a8550f">r123::Threefry4x32_R< R ></a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>difference_type
+: <a class="el" href="structr123array1x32.html#a1084c78861e725e58c14c67af242952f">r123array1x32</a>
+, <a class="el" href="structr123array1xm128i.html#a319811ed6105c3050135d8ec3ba36f7a">r123array1xm128i</a>
+, <a class="el" href="structr123array16x8.html#aaae0b6c18de6ce92ea55bf1b9bdbdf69">r123array16x8</a>
+, <a class="el" href="structr123array4x64.html#a3b1c7395f17992d8760fe93d3930db12">r123array4x64</a>
+, <a class="el" href="structr123array2x64.html#a4227cd6be973fdb0d72398d0b5604da8">r123array2x64</a>
+, <a class="el" href="structr123array1x64.html#a2abaa7dd6823b724ec6038b504c77011">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#af8029821cb8a7b5a3500adb30d4f2326">r123array8x32</a>
+, <a class="el" href="structr123array4x32.html#a3c690c039797cafe4718c03377937fb7">r123array4x32</a>
+, <a class="el" href="structr123array2x32.html#aa3dfe31d2483fb629a9e3ac304b24d07">r123array2x32</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>elem_type
+: <a class="el" href="structr123_1_1Engine.html#a8fb9eb1ab76ad9b5374a47cf84ecd306">r123::Engine< CBRNG ></a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>iterator
+: <a class="el" href="structr123array1x32.html#ad17f00c1dbff151f91d381f7c0b99dc8">r123array1x32</a>
+, <a class="el" href="structr123array1xm128i.html#af9db87a7c1ae4c7ba1e355af89b4d22d">r123array1xm128i</a>
+, <a class="el" href="structr123array16x8.html#a36bdba5b2d96c8dfe9b7e59b203d5047">r123array16x8</a>
+, <a class="el" href="structr123array4x64.html#adfc9f1209d12f855b9330ecccc8b6dd2">r123array4x64</a>
+, <a class="el" href="structr123array2x64.html#ac0fc5019e017f50e29d26df233085e56">r123array2x64</a>
+, <a class="el" href="structr123array1x64.html#a486a75094513f75c268901b3bb6666ad">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#aad8ff34e784d954a05f3f058facfb2be">r123array8x32</a>
+, <a class="el" href="structr123array4x32.html#a73a2a55a200af374d7299d2de13aa5cc">r123array4x32</a>
+, <a class="el" href="structr123array2x32.html#a4b447adc28d536d9b7ad7e33d5081a8e">r123array2x32</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_k"></a>- k -</h3><ul>
+<li>key_type
+: <a class="el" href="structr123_1_1AESNI1xm128i.html#a7dc33fd5abf509d9d16b571b23867a6b">r123::AESNI1xm128i</a>
+, <a class="el" href="structr123_1_1Engine.html#a18132a79d2327990c4809b37300eddc3">r123::Engine< CBRNG ></a>
+, <a class="el" href="structr123_1_1Threefry4x64__R.html#adb406d1af0e757bd8058582ee39f21dc">r123::Threefry4x64_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry2x64__R.html#ae652f0e9ca6ec234fd2f4fc9afb1007c">r123::Threefry2x64_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry4x32__R.html#a140f5cf20bde7784d778b82f0ebf8778">r123::Threefry4x32_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry2x32__R.html#abfaaff871ef5e2e2cf397884ddab4cdc">r123::Threefry2x32_R< R ></a>
+, <a class="el" href="structr123_1_1ReinterpretCtr.html#a470b21676ed709aa9d9ad524a67410f1">r123::ReinterpretCtr< ToType, CBRNG ></a>
+, <a class="el" href="structr123_1_1Philox4x64__R.html#a9947ce12e3d03f9a60396d79bb56ba1c">r123::Philox4x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox2x64__R.html#adb8a638d3d96ef0ab594b0320bae329f">r123::Philox2x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox4x32__R.html#afa2e99f3e0b635f17ba9e16c186af63b">r123::Philox4x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox2x32__R.html#a37dac768d36ef39e0228369e91b9f0ab">r123::Philox2x32_R< ROUNDS ></a>
+, <a class="el" href="classr123_1_1MicroURNG.html#aef90e6157f360434342ad0df4ce5f364">r123::MicroURNG< CBRNG ></a>
+, <a class="el" href="structr123_1_1ARS4x32__R.html#a7a651b6747b9e7c038bc6d11ffa2863e">r123::ARS4x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1ARS1xm128i__R.html#a8454d6de92379d9a6551d11828fbebc3">r123::ARS1xm128i_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1AESNI4x32.html#a3f47cb319d03ede5fd557800b618d28a">r123::AESNI4x32</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>pointer
+: <a class="el" href="structr123array1x32.html#a85ce46c2e10ab3d9c4f60aebe6268898">r123array1x32</a>
+, <a class="el" href="structr123array1xm128i.html#a4f78260ba2ec595bdc56fc21fd45e45a">r123array1xm128i</a>
+, <a class="el" href="structr123array16x8.html#aa6ae2e4843b3bb1b66425afa7da9e281">r123array16x8</a>
+, <a class="el" href="structr123array4x64.html#a08c39c2f70f4198a82cba99c0162e67c">r123array4x64</a>
+, <a class="el" href="structr123array2x64.html#a3b0b967b9ae134da266448c190f59c3a">r123array2x64</a>
+, <a class="el" href="structr123array1x64.html#a1c104fabb72d6c72c51348ac72bd419f">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#aeaf3b46bbc571a21d61ad6ee6e760291">r123array8x32</a>
+, <a class="el" href="structr123array4x32.html#adcef39f1e3989578b4c0a92524a15df2">r123array4x32</a>
+, <a class="el" href="structr123array2x32.html#ac884bcbd1063811354bfac66262a0b42">r123array2x32</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>reference
+: <a class="el" href="structr123array1x32.html#ae5aa4e3a65528495ea71371529ade7d7">r123array1x32</a>
+, <a class="el" href="structr123array2x32.html#aacd028d9f97ec8a2f484f0eff815abd5">r123array2x32</a>
+, <a class="el" href="structr123array8x32.html#a4027cd913ec90428d5d0dcad23a5dc2b">r123array8x32</a>
+, <a class="el" href="structr123array16x8.html#adf010ea54bc2f9dceb8568d59c6dde8a">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a34f0cbdac5eb89118ecf2ab5939fbf83">r123array1xm128i</a>
+, <a class="el" href="structr123array1x64.html#a6b196cbfb84a28a57f24cd976c6fd6e6">r123array1x64</a>
+, <a class="el" href="structr123array4x32.html#a620f00f67215ab7fd344ec551c596712">r123array4x32</a>
+, <a class="el" href="structr123array2x64.html#a7150b3ad865d00ca1f753accd8165336">r123array2x64</a>
+, <a class="el" href="structr123array4x64.html#a14ea48b972d46d9424c317db9698224f">r123array4x64</a>
+</li>
+<li>result_type
+: <a class="el" href="classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b">r123::MicroURNG< CBRNG ></a>
+, <a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">r123::Engine< CBRNG ></a>
+</li>
+<li>reverse_iterator
+: <a class="el" href="structr123array2x64.html#abcbf25662447a5241ed4d19c202f647a">r123array2x64</a>
+, <a class="el" href="structr123array16x8.html#aeeb5d6d55c07a515e4c7d01cb5c5351b">r123array16x8</a>
+, <a class="el" href="structr123array1xm128i.html#a6a507944eb872540e73e7a839cbc8e30">r123array1xm128i</a>
+, <a class="el" href="structr123array4x32.html#aaabdf758fb4a56eaf4cf256654f41314">r123array4x32</a>
+, <a class="el" href="structr123array8x32.html#acab5de900b99bad5f69009f48fa72235">r123array8x32</a>
+, <a class="el" href="structr123array1x32.html#a21cb520afa483ae177c469f3940e7ed2">r123array1x32</a>
+, <a class="el" href="structr123array4x64.html#acc93aa79ca040ce8fd0957ac86caa2f9">r123array4x64</a>
+, <a class="el" href="structr123array2x32.html#ad0b05bbfee2d432dfef71342f14b8430">r123array2x32</a>
+, <a class="el" href="structr123array1x64.html#ac9c44218c6761d9e6f422435e49acb17">r123array1x64</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>size_type
+: <a class="el" href="structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53">r123array1x32</a>
+, <a class="el" href="structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c">r123array1xm128i</a>
+, <a class="el" href="structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952">r123array16x8</a>
+, <a class="el" href="structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af">r123array4x64</a>
+, <a class="el" href="structr123array2x64.html#aacb6269c183cc408285dca02e3b55526">r123array2x64</a>
+, <a class="el" href="structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17">r123array8x32</a>
+, <a class="el" href="structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af">r123array4x32</a>
+, <a class="el" href="structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91">r123array2x32</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_u"></a>- u -</h3><ul>
+<li>ukey_type
+: <a class="el" href="structr123_1_1AESNI1xm128i.html#a1f405533da84d98b938030190a63cec5">r123::AESNI1xm128i</a>
+, <a class="el" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">r123::Engine< CBRNG ></a>
+, <a class="el" href="structr123_1_1Threefry4x64__R.html#a087ff88f84d115a6a726e008c6dcc325">r123::Threefry4x64_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry2x64__R.html#a57db271865ab1889c8f569fb053ee66d">r123::Threefry2x64_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry4x32__R.html#aab22e360de3f5e13f018ccf3a6754a8f">r123::Threefry4x32_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry2x32__R.html#a3ab3969f7445f9fe935566fdc017c5ca">r123::Threefry2x32_R< R ></a>
+, <a class="el" href="structr123_1_1ReinterpretCtr.html#a4b0b69c1aa58d62bb22e51e16c586bee">r123::ReinterpretCtr< ToType, CBRNG ></a>
+, <a class="el" href="structr123_1_1Philox4x64__R.html#a4715e37129fb4ca9d7671cb9df4fa8c5">r123::Philox4x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox2x64__R.html#a0c4cfeb8c3f00d1755ee047790c9da1c">r123::Philox2x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox4x32__R.html#a804c8700155da93039c339ac83df99dd">r123::Philox4x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox2x32__R.html#a8982960eb5a3b5afc26c8e8d6639275e">r123::Philox2x32_R< ROUNDS ></a>
+, <a class="el" href="classr123_1_1MicroURNG.html#a7e6fd93fec2fe138ee36b401ff376cfc">r123::MicroURNG< CBRNG ></a>
+, <a class="el" href="structr123_1_1ARS4x32__R.html#aa4bd7be98acb8b0299fb0ffce3db69ee">r123::ARS4x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1ARS1xm128i__R.html#ab26c7029e347e6b1e17dad795e462aeb">r123::ARS1xm128i_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1AESNI4x32.html#a3fbb6113e70575dce3b6047a22a751f4">r123::AESNI4x32</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
+<li>value_type
+: <a class="el" href="structr123array1x32.html#a9c8e0d672be32b52eef639f1a3b2b98a">r123array1x32</a>
+, <a class="el" href="structr123array1xm128i.html#a70ab4e530c7cce9481e07aa0b21dd96b">r123array1xm128i</a>
+, <a class="el" href="structr123array16x8.html#ad1d7184f51cafaff4714a2dcf60c9ae2">r123array16x8</a>
+, <a class="el" href="structr123array4x64.html#ae4a79be3ab80944a8bb6bc7ec7907061">r123array4x64</a>
+, <a class="el" href="structr123array2x64.html#acefd9fb46661254e17877844c545e15f">r123array2x64</a>
+, <a class="el" href="structr123array1x64.html#a4d8280ccd7087d5c3faba27641e8fbe7">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#af47fd0d348b68dd7a2853c68eb32d8b7">r123array8x32</a>
+, <a class="el" href="structr123array4x32.html#a5ba59b507edcf793ba186a9a4e8c56d5">r123array4x32</a>
+, <a class="el" href="structr123array2x32.html#ab669df8d33d32ee3571210eb090c6cb2">r123array2x32</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/functions_vars.html b/lib/Random123-1.08/docs/html/functions_vars.html
new file mode 100644
index 0000000..e05b3f0
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/functions_vars.html
@@ -0,0 +1,190 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li class="current"><a href="functions_vars.html"><span>Variables</span></a></li>
+      <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="functions_rela.html"><span>Related Functions</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="#index__"><span>_</span></a></li>
+      <li><a href="#index_b"><span>b</span></a></li>
+      <li><a href="#index_c"><span>c</span></a></li>
+      <li><a href="#index_e"><span>e</span></a></li>
+      <li><a href="#index_k"><span>k</span></a></li>
+      <li><a href="#index_m"><span>m</span></a></li>
+      <li><a href="#index_r"><span>r</span></a></li>
+      <li><a href="#index_u"><span>u</span></a></li>
+      <li><a href="#index_v"><span>v</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<li>_Max
+: <a class="el" href="classr123_1_1MicroURNG.html#a4faecd7ab54c7678ee66c413bb984bf0">r123::MicroURNG< CBRNG ></a>
+, <a class="el" href="structr123_1_1Engine.html#ae549f81e966b0414bcaf0f24b566ebd8">r123::Engine< CBRNG ></a>
+</li>
+<li>_Min
+: <a class="el" href="classr123_1_1MicroURNG.html#a1f2787f136a8a807d14eab8cb1ca8c14">r123::MicroURNG< CBRNG ></a>
+, <a class="el" href="structr123_1_1Engine.html#aa73e4d27847915f1438fd37b30777111">r123::Engine< CBRNG ></a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<li>b
+: <a class="el" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">r123::Engine< CBRNG ></a>
+</li>
+<li>BITS
+: <a class="el" href="classr123_1_1MicroURNG.html#ac55cddda8fe0808f922f39beee587b27">r123::MicroURNG< CBRNG ></a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>c
+: <a class="el" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">r123::Engine< CBRNG ></a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>elem
+: <a class="el" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">r123::Engine< CBRNG ></a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_k"></a>- k -</h3><ul>
+<li>k
+: <a class="el" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">aesni1xm128i_key_t</a>
+</li>
+<li>key
+: <a class="el" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">r123::Engine< CBRNG ></a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
+<li>m
+: <a class="el" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">r123m128i</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>rounds
+: <a class="el" href="structr123_1_1AESNI1xm128i.html#a1b5a44afde814ba844d8f5442e2a3a5f">r123::AESNI1xm128i</a>
+, <a class="el" href="structr123_1_1Threefry4x64__R.html#ab8807960eec8fc2198055ec2a971e116">r123::Threefry4x64_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry2x64__R.html#aa994d756504284e6a59cc8d3c57f16c6">r123::Threefry2x64_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry4x32__R.html#af63fd38ba9acf04ee56d75e96b413291">r123::Threefry4x32_R< R ></a>
+, <a class="el" href="structr123_1_1Threefry2x32__R.html#af5be46f8426cfcd86e75327e4b3750b0">r123::Threefry2x32_R< R ></a>
+, <a class="el" href="structr123_1_1Philox4x64__R.html#ac51193ab00b118b75784f86cf3470876">r123::Philox4x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox2x64__R.html#ac0764d78e07bf6d311b47d0f3ce92450">r123::Philox2x64_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox4x32__R.html#a90d6a86bff4dc6e5e24209423f125140">r123::Philox4x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1Philox2x32__R.html#a52ee7b34688fc2e5315152a10d7df5f0">r123::Philox2x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1ARS4x32__R.html#a710e59a54794b4cd5e55689dd906b9ba">r123::ARS4x32_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1ARS1xm128i__R.html#abe167a93280140e424d722c1ac47a8e9">r123::ARS1xm128i_R< ROUNDS ></a>
+, <a class="el" href="structr123_1_1AESNI4x32.html#a725aad79b8d496d97bed24390f624be6">r123::AESNI4x32</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_u"></a>- u -</h3><ul>
+<li>ukey
+: <a class="el" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">r123::Engine< CBRNG ></a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
+<li>v
+: <a class="el" href="structr123array1x32.html#a1123ac44ecadd52dae06d2c8df86764a">r123array1x32</a>
+, <a class="el" href="structr123_1_1Engine.html#a6169d4fbce1fd7725fabda4c693bf250">r123::Engine< CBRNG ></a>
+, <a class="el" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">r123array1xm128i</a>
+, <a class="el" href="structr123array16x8.html#a703776a5f85fb222e16b739309489783">r123array16x8</a>
+, <a class="el" href="structr123array4x64.html#aae3a18410877c49f1058bc4d78a62f48">r123array4x64</a>
+, <a class="el" href="structr123array2x64.html#a547e4a51e531cf36eef885fbf20a7048">r123array2x64</a>
+, <a class="el" href="structr123array1x64.html#a951c4b651e15e5ad4f66d81027c8e1b5">r123array1x64</a>
+, <a class="el" href="structr123array8x32.html#a7a84d2a924a271cc7b5f748023517d10">r123array8x32</a>
+, <a class="el" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">r123array4x32</a>
+, <a class="el" href="structr123array2x32.html#a65524bf06568073021117ef196d6b45f">r123array2x32</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/globals.html b/lib/Random123-1.08/docs/html/globals.html
new file mode 100644
index 0000000..5c0b20e
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/globals.html
@@ -0,0 +1,464 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li class="current"><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="globals.html"><span>All</span></a></li>
+      <li><a href="globals_func.html"><span>Functions</span></a></li>
+      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
+      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
+      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="globals_defs.html"><span>Defines</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="#index__"><span>_</span></a></li>
+      <li><a href="#index_a"><span>a</span></a></li>
+      <li><a href="#index_g"><span>g</span></a></li>
+      <li><a href="#index_h"><span>h</span></a></li>
+      <li><a href="#index_o"><span>o</span></a></li>
+      <li><a href="#index_p"><span>p</span></a></li>
+      <li><a href="#index_r"><span>r</span></a></li>
+      <li><a href="#index_t"><span>t</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all file members with links to the files they belong to:
+
+<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<li>_mm_extract_lo64()
+: <a class="el" href="sse_8h.html#adac6aaf79c4428abcd30bf583eeb5450">sse.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>aesni1xm128i()
+: <a class="el" href="group__AESNI.html#ga3ba5daca2d4d076ece24900084e71311">aes.h</a>
+</li>
+<li>aesni1xm128i_ctr_t
+: <a class="el" href="group__AESNI.html#gaab0f809a22e01e6cb6135f6af73bb532">aes.h</a>
+</li>
+<li>aesni1xm128i_R()
+: <a class="el" href="group__AESNI.html#ga89d9042c08ae5eef4c98bfb9609ebd34">aes.h</a>
+</li>
+<li>aesni1xm128i_rounds
+: <a class="el" href="group__AESNI.html#gga2814629101926e23001d564630ba7b86a2c404c51fea10eeacb032081dbab2408">aes.h</a>
+</li>
+<li>aesni1xm128i_ukey_t
+: <a class="el" href="group__AESNI.html#gaf4fa221e6387d0454e2e6399245bdead">aes.h</a>
+</li>
+<li>aesni4x32
+: <a class="el" href="group__AESNI.html#gae3950c524818b49d1cdfad481880a33a">aes.h</a>
+</li>
+<li>aesni4x32_ctr_t
+: <a class="el" href="group__AESNI.html#gae7459b3f4ee0e424cb4f13b4d5efc1fe">aes.h</a>
+</li>
+<li>aesni4x32_key_t
+: <a class="el" href="group__AESNI.html#ga6d88accdcfa339b48e14021a572e269b">aes.h</a>
+</li>
+<li>aesni4x32_R()
+: <a class="el" href="group__AESNI.html#gae28b030e9786a6f36a47df8f211a750b">aes.h</a>
+</li>
+<li>aesni4x32_rounds
+: <a class="el" href="aes_8h.html#a0e4c28ad2773dac7eb59004947c9e02b">aes.h</a>
+</li>
+<li>aesni4x32_ukey_t
+: <a class="el" href="group__AESNI.html#gac2c3248ec3b03591d442cf634fb51af5">aes.h</a>
+</li>
+<li>aesni4x32keyinit()
+: <a class="el" href="group__AESNI.html#ga2aa21ba4a3d3850faa96e7834114d8e1">aes.h</a>
+</li>
+<li>ars1xm128i
+: <a class="el" href="group__AESNI.html#ga22e0a9c885b544115d44d26cc7777303">ars.h</a>
+</li>
+<li>ars1xm128i_ctr_t
+: <a class="el" href="group__AESNI.html#ga23ddf8109ce08f2bc14401c5f269d2a9">ars.h</a>
+</li>
+<li>ARS1xm128i_DEFAULT_ROUNDS
+: <a class="el" href="ars_8h.html#aa1e31853c7493df739897205eb4f4a82">ars.h</a>
+</li>
+<li>ars1xm128i_key_t
+: <a class="el" href="group__AESNI.html#ga2c5b351a47bb39f4d1769506c98c06e2">ars.h</a>
+</li>
+<li>ars1xm128i_R()
+: <a class="el" href="group__AESNI.html#gaddc6efc2007f6f66ee914eb7074cff1e">ars.h</a>
+</li>
+<li>ars1xm128i_rounds
+: <a class="el" href="group__AESNI.html#ggabf0a537666d4d1421144cb0a5e67666cade1fd46524355ec1d7ce63fd13b54992">ars.h</a>
+</li>
+<li>ars1xm128i_ukey_t
+: <a class="el" href="group__AESNI.html#gaeaa234225e7dcec2ffcdb32a0faad4f0">ars.h</a>
+</li>
+<li>ars1xm128ikeyinit()
+: <a class="el" href="group__AESNI.html#gae307c205a2ad19142bbe70919abfbfc2">ars.h</a>
+</li>
+<li>ars4x32
+: <a class="el" href="group__AESNI.html#ga088ecbf341caf05e491ce246f2ea2d30">ars.h</a>
+</li>
+<li>ars4x32_ctr_t
+: <a class="el" href="group__AESNI.html#ga61721da91a455cb587ce6bc4a0f56117">ars.h</a>
+</li>
+<li>ars4x32_key_t
+: <a class="el" href="group__AESNI.html#ga3a1426aa6aaa06330d48ec8173cd3e7b">ars.h</a>
+</li>
+<li>ars4x32_R()
+: <a class="el" href="group__AESNI.html#gab13b093252d4bb3389d27d4e3b04dae8">ars.h</a>
+</li>
+<li>ars4x32_rounds
+: <a class="el" href="group__AESNI.html#ggaa623b038fa0c8d8d2864fdc0e45884d6a5e715f357770a0f188ef493e6e63d31d">ars.h</a>
+</li>
+<li>ars4x32_ukey_t
+: <a class="el" href="group__AESNI.html#ga54cb318ff6bd4df405897b2b9a4b109f">ars.h</a>
+</li>
+<li>ars4x32keyinit()
+: <a class="el" href="group__AESNI.html#ga1f3a02ea711ae6bacb0875f11a255516">ars.h</a>
+</li>
+<li>assemble_from_u32()
+: <a class="el" href="sse_8h.html#a99c42d1da8da3a4a273556a7817b5c1f">sse.h</a>
+</li>
+<li>assemble_from_u32< r123m128i >()
+: <a class="el" href="sse_8h.html#a0cd6ca87c67023d7afda38319ab40e43">sse.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>GSL_CBRNG
+: <a class="el" href="gsl__cbrng_8h.html#af561a004eef8e93cdfd6b255a8a1eb75">gsl_cbrng.h</a>
+</li>
+<li>GSL_MICRORNG
+: <a class="el" href="gsl__microrng_8h.html#a21c7bb64a536a1704c6dc96856b78297">gsl_microrng.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<li>haveAESNI()
+: <a class="el" href="sse_8h.html#a0b35a046e85316295476d7d552411044">sse.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>operator!=()
+: <a class="el" href="sse_8h.html#a9fc5dd462afc043229ab800abb8f7d64">sse.h</a>
+</li>
+<li>operator++()
+: <a class="el" href="sse_8h.html#a2ffeb79e1a2cbb9cb35b0daf514a06a5">sse.h</a>
+</li>
+<li>operator+=()
+: <a class="el" href="sse_8h.html#a436d4467bb1389d42bfa67686218fd98">sse.h</a>
+</li>
+<li>operator<()
+: <a class="el" href="sse_8h.html#ac2c263fa443dd074fe4ff96710219eb8">sse.h</a>
+</li>
+<li>operator<<()
+: <a class="el" href="array_8h.html#ab2b41774a3888c0bc9697fd79383eae4">array.h</a>
+, <a class="el" href="sse_8h.html#af965b43e09e7305795c7b5a35d20c75f">sse.h</a>
+</li>
+<li>operator<=()
+: <a class="el" href="sse_8h.html#a43e11de33821f27448feb163162ec895">sse.h</a>
+</li>
+<li>operator==()
+: <a class="el" href="sse_8h.html#ab1389a6d8b14bc380c6d6a6d4de8853e">sse.h</a>
+</li>
+<li>operator>()
+: <a class="el" href="sse_8h.html#ad07b59f8110eac57511ee8c2fa697f93">sse.h</a>
+</li>
+<li>operator>=()
+: <a class="el" href="sse_8h.html#aa7bb0ad8bfceb39a1b71262b9476e151">sse.h</a>
+</li>
+<li>operator>>()
+: <a class="el" href="array_8h.html#a3cdf7b897463996d6eda01443dd669c5">array.h</a>
+, <a class="el" href="sse_8h.html#a202aef4bea97c2203a82676cb6abba40">sse.h</a>
+, <a class="el" href="array_8h.html#ae63a28cc2f1e69f63a4402c8b83663b4">array.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>philox2x32
+: <a class="el" href="philox_8h.html#ab2496424917f063a4990f01943a07fe0">philox.h</a>
+</li>
+<li>philox2x32_ctr_t
+: <a class="el" href="philox_8h.html#a5fad831cdbd677bc6e53d37c0191f5e3">philox.h</a>
+</li>
+<li>philox2x32_key_t
+: <a class="el" href="philox_8h.html#a55c0e4adeab3387915f966a0e40dc036">philox.h</a>
+</li>
+<li>philox2x32_R()
+: <a class="el" href="philox_8h.html#acf0a4b82a9fd3f4695c04210df0cbefe">philox.h</a>
+</li>
+<li>philox2x32_rounds
+: <a class="el" href="group__PhiloxNxW.html#ggae7443e1a57429154124943b6a7c0bd08ad08568b592cd076441505eed926d929c">philox.h</a>
+</li>
+<li>philox2x32_ukey_t
+: <a class="el" href="philox_8h.html#abf96b0e95504989c58e6d3436b013a6b">philox.h</a>
+</li>
+<li>philox2x32keyinit()
+: <a class="el" href="philox_8h.html#ae5dd55c0697c37598c1fbce66457e124">philox.h</a>
+</li>
+<li>philox2x64
+: <a class="el" href="philox_8h.html#ae6b57a71e4efa369cc19416fc088b5a5">philox.h</a>
+</li>
+<li>philox2x64_ctr_t
+: <a class="el" href="philox_8h.html#a33fa626a4198f38d87713ae9504e53f2">philox.h</a>
+</li>
+<li>philox2x64_key_t
+: <a class="el" href="philox_8h.html#a190087c2584155a936ec7d7b9e8d7f34">philox.h</a>
+</li>
+<li>philox2x64_R()
+: <a class="el" href="philox_8h.html#a03c068219ecebcc870afa14a330c0735">philox.h</a>
+</li>
+<li>philox2x64_rounds
+: <a class="el" href="group__PhiloxNxW.html#ggaca9df5cdadde758a63952daa97ddff91ae15befbf8ae3f2e93d6e49ea9e05b636">philox.h</a>
+</li>
+<li>philox2x64_ukey_t
+: <a class="el" href="philox_8h.html#a419cc7ebdeeaa1fc8249c638eac3d00b">philox.h</a>
+</li>
+<li>philox2x64keyinit()
+: <a class="el" href="philox_8h.html#a36b9225fcb73f91d116b424f721275f1">philox.h</a>
+</li>
+<li>philox4x32
+: <a class="el" href="philox_8h.html#a432a3df828dd51acd0b7ec2fee1d4d7e">philox.h</a>
+</li>
+<li>philox4x32_ctr_t
+: <a class="el" href="philox_8h.html#a96f2a94ebcd7aba28aaeb0aba6543d2d">philox.h</a>
+</li>
+<li>philox4x32_key_t
+: <a class="el" href="philox_8h.html#ab1e74b78fcee751b43739b2b4415c592">philox.h</a>
+</li>
+<li>philox4x32_R()
+: <a class="el" href="philox_8h.html#a205fdd66786445b3e1c4157bd96d0967">philox.h</a>
+</li>
+<li>philox4x32_rounds
+: <a class="el" href="group__PhiloxNxW.html#gga67fd1bf4ed858d01663a7d6b219b97a2ac9dec73e096a7afb5d82f2388a7a5412">philox.h</a>
+</li>
+<li>philox4x32_ukey_t
+: <a class="el" href="philox_8h.html#a82e1d60f98bfbb600bde2bd939de4573">philox.h</a>
+</li>
+<li>philox4x32keyinit()
+: <a class="el" href="philox_8h.html#a5a012bb440c039eda46802b447c31851">philox.h</a>
+</li>
+<li>philox4x64
+: <a class="el" href="philox_8h.html#a62fb1b4d9775396303ebb2a801fea8e6">philox.h</a>
+</li>
+<li>philox4x64_ctr_t
+: <a class="el" href="philox_8h.html#a4d2063cc89bf13153ddeff0d94371986">philox.h</a>
+</li>
+<li>philox4x64_key_t
+: <a class="el" href="philox_8h.html#a0c8c9410e9d88d4c94e8093007e39b0c">philox.h</a>
+</li>
+<li>philox4x64_R()
+: <a class="el" href="philox_8h.html#ac72571943d83caf2f79b7bd309a2ae92">philox.h</a>
+</li>
+<li>philox4x64_rounds
+: <a class="el" href="group__PhiloxNxW.html#ggaf603860d055cee96c75f6986641e9cada3407accddb6e873c1005a4ab2edcef67">philox.h</a>
+</li>
+<li>philox4x64_ukey_t
+: <a class="el" href="philox_8h.html#a689ed8276d25fe0c983c4eb5b9a32fd4">philox.h</a>
+</li>
+<li>philox4x64keyinit()
+: <a class="el" href="philox_8h.html#a101674ffc206e3bd600f9544de0c3c4a">philox.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>r123_enum_aesni1xm128i
+: <a class="el" href="group__AESNI.html#ga2814629101926e23001d564630ba7b86">aes.h</a>
+</li>
+<li>r123_enum_aesni4x32
+: <a class="el" href="group__AESNI.html#ga1557a9d6e95543a3c4ca9082a4c14b0d">aes.h</a>
+</li>
+<li>r123_enum_ars1xm128i
+: <a class="el" href="group__AESNI.html#gabf0a537666d4d1421144cb0a5e67666c">ars.h</a>
+</li>
+<li>r123_enum_ars4x32
+: <a class="el" href="group__AESNI.html#gaa623b038fa0c8d8d2864fdc0e45884d6">ars.h</a>
+</li>
+<li>r123_enum_philox2x32
+: <a class="el" href="group__PhiloxNxW.html#gae7443e1a57429154124943b6a7c0bd08">philox.h</a>
+</li>
+<li>r123_enum_philox2x64
+: <a class="el" href="group__PhiloxNxW.html#gaca9df5cdadde758a63952daa97ddff91">philox.h</a>
+</li>
+<li>r123_enum_philox4x32
+: <a class="el" href="group__PhiloxNxW.html#ga67fd1bf4ed858d01663a7d6b219b97a2">philox.h</a>
+</li>
+<li>r123_enum_philox4x64
+: <a class="el" href="group__PhiloxNxW.html#gaf603860d055cee96c75f6986641e9cad">philox.h</a>
+</li>
+<li>r123_enum_threefry2x32
+: <a class="el" href="group__ThreefryNxW.html#gae1c47baba4367dd47d68025d23ae4775">threefry.h</a>
+</li>
+<li>r123_enum_threefry2x64
+: <a class="el" href="group__ThreefryNxW.html#gae4df1e52db01acafb28d9c6c25a41071">threefry.h</a>
+</li>
+<li>r123_enum_threefry4x32
+: <a class="el" href="group__ThreefryNxW.html#ga027cd15620ecab867c6af8bb065b189b">threefry.h</a>
+</li>
+<li>r123_enum_threefry4x64
+: <a class="el" href="group__ThreefryNxW.html#ga6379a4a73e85bc36235907a326945acc">threefry.h</a>
+</li>
+<li>R123_W
+: <a class="el" href="array_8h.html#a9b64205709c0daaea3b05bbf7ea5a322">array.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>threefry2x32
+: <a class="el" href="threefry_8h.html#a52e1635889bbf08009646f22897e07fc">threefry.h</a>
+</li>
+<li>threefry2x32_ctr_t
+: <a class="el" href="threefry_8h.html#ac0724455e1e9218f982501247d384833">threefry.h</a>
+</li>
+<li>threefry2x32_key_t
+: <a class="el" href="threefry_8h.html#a9ebab1ff37a7c983a4d5af114fb8f1c7">threefry.h</a>
+</li>
+<li>threefry2x32_R()
+: <a class="el" href="threefry_8h.html#ae8eee0d74a087c6cbc112af11b884501">threefry.h</a>
+</li>
+<li>threefry2x32_rounds
+: <a class="el" href="group__ThreefryNxW.html#ggae1c47baba4367dd47d68025d23ae4775a5c6f9a5f3ae1c3700938a3fca5f5821b">threefry.h</a>
+</li>
+<li>threefry2x32_ukey_t
+: <a class="el" href="threefry_8h.html#a642ffe8cacdd9e8f6b376bdffff36d24">threefry.h</a>
+</li>
+<li>threefry2x32keyinit()
+: <a class="el" href="threefry_8h.html#a5dbdf6e314925cd676da9f97013aefe4">threefry.h</a>
+</li>
+<li>threefry2x64
+: <a class="el" href="threefry_8h.html#acda3cc1cd02719e1e3d6cfdf7ce0c4c8">threefry.h</a>
+</li>
+<li>threefry2x64_ctr_t
+: <a class="el" href="threefry_8h.html#a13c6df8879e7c13605fc1dc67cb2173b">threefry.h</a>
+</li>
+<li>threefry2x64_key_t
+: <a class="el" href="threefry_8h.html#a31a08f696af23b0e339126bc64a78812">threefry.h</a>
+</li>
+<li>threefry2x64_R()
+: <a class="el" href="threefry_8h.html#abe5e028454aef3f2bc459e5db05e0e04">threefry.h</a>
+</li>
+<li>threefry2x64_rounds
+: <a class="el" href="group__ThreefryNxW.html#ggae4df1e52db01acafb28d9c6c25a41071a61579c86759ab497dbfc895f2fe6ec7c">threefry.h</a>
+</li>
+<li>threefry2x64_ukey_t
+: <a class="el" href="threefry_8h.html#abb918225d16fcdf0b2659e2096d182b9">threefry.h</a>
+</li>
+<li>threefry2x64keyinit()
+: <a class="el" href="threefry_8h.html#ac14fcf731b175a1cec85a80606ed5f04">threefry.h</a>
+</li>
+<li>threefry4x32
+: <a class="el" href="threefry_8h.html#aaaecd189b32b0081c6a3c2cb46577e23">threefry.h</a>
+</li>
+<li>threefry4x32_ctr_t
+: <a class="el" href="threefry_8h.html#aa72e480598b54b5bbc640a101f9cbe6e">threefry.h</a>
+</li>
+<li>threefry4x32_key_t
+: <a class="el" href="threefry_8h.html#af332bdaec196cee5378cab4fd049ecde">threefry.h</a>
+</li>
+<li>threefry4x32_R()
+: <a class="el" href="threefry_8h.html#a79eb6922e7404e224893f7f723fc240c">threefry.h</a>
+</li>
+<li>threefry4x32_rounds
+: <a class="el" href="group__ThreefryNxW.html#gga027cd15620ecab867c6af8bb065b189ba36063dd986ca2ccd28209c7b4bf711d7">threefry.h</a>
+</li>
+<li>threefry4x32_ukey_t
+: <a class="el" href="threefry_8h.html#ad65418f4e2c8d8df38059aabc2cc98b6">threefry.h</a>
+</li>
+<li>threefry4x32keyinit()
+: <a class="el" href="threefry_8h.html#a458f442301e620096d73efd479ab8591">threefry.h</a>
+</li>
+<li>threefry4x64()
+: <a class="el" href="threefry_8h.html#a382d18a49002d2a5e2b2f06d58669d70">threefry.h</a>
+</li>
+<li>threefry4x64_ctr_t
+: <a class="el" href="threefry_8h.html#a3296098832bc3a243f40078c1b93592e">threefry.h</a>
+</li>
+<li>threefry4x64_key_t
+: <a class="el" href="threefry_8h.html#ad51f07c7dc47238532cbc05e89f5cef9">threefry.h</a>
+</li>
+<li>threefry4x64_R()
+: <a class="el" href="threefry_8h.html#a2e04c3f1ae28c4833444bfafcf22c47f">threefry.h</a>
+</li>
+<li>threefry4x64_rounds
+: <a class="el" href="group__ThreefryNxW.html#gga6379a4a73e85bc36235907a326945acca9cdd4629047775ebe339ac9e9dd0ad65">threefry.h</a>
+</li>
+<li>threefry4x64_ukey_t
+: <a class="el" href="threefry_8h.html#a6b4db94d5185220d4fcec72f92a391ad">threefry.h</a>
+</li>
+<li>threefry4x64keyinit()
+: <a class="el" href="threefry_8h.html#aeed27be75e75bfffb0bf8c6333f71b10">threefry.h</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/globals_defs.html b/lib/Random123-1.08/docs/html/globals_defs.html
new file mode 100644
index 0000000..352a943
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/globals_defs.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li class="current"><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="globals.html"><span>All</span></a></li>
+      <li><a href="globals_func.html"><span>Functions</span></a></li>
+      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
+      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
+      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
+      <li class="current"><a href="globals_defs.html"><span>Defines</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ <ul>
+<li>aesni4x32
+: <a class="el" href="group__AESNI.html#gae3950c524818b49d1cdfad481880a33a">aes.h</a>
+</li>
+<li>aesni4x32_rounds
+: <a class="el" href="aes_8h.html#a0e4c28ad2773dac7eb59004947c9e02b">aes.h</a>
+</li>
+<li>ars1xm128i
+: <a class="el" href="group__AESNI.html#ga22e0a9c885b544115d44d26cc7777303">ars.h</a>
+</li>
+<li>ARS1xm128i_DEFAULT_ROUNDS
+: <a class="el" href="ars_8h.html#aa1e31853c7493df739897205eb4f4a82">ars.h</a>
+</li>
+<li>ars4x32
+: <a class="el" href="group__AESNI.html#ga088ecbf341caf05e491ce246f2ea2d30">ars.h</a>
+</li>
+<li>GSL_CBRNG
+: <a class="el" href="gsl__cbrng_8h.html#af561a004eef8e93cdfd6b255a8a1eb75">gsl_cbrng.h</a>
+</li>
+<li>GSL_MICRORNG
+: <a class="el" href="gsl__microrng_8h.html#a21c7bb64a536a1704c6dc96856b78297">gsl_microrng.h</a>
+</li>
+<li>philox2x32
+: <a class="el" href="philox_8h.html#ab2496424917f063a4990f01943a07fe0">philox.h</a>
+</li>
+<li>philox2x64
+: <a class="el" href="philox_8h.html#ae6b57a71e4efa369cc19416fc088b5a5">philox.h</a>
+</li>
+<li>philox4x32
+: <a class="el" href="philox_8h.html#a432a3df828dd51acd0b7ec2fee1d4d7e">philox.h</a>
+</li>
+<li>philox4x64
+: <a class="el" href="philox_8h.html#a62fb1b4d9775396303ebb2a801fea8e6">philox.h</a>
+</li>
+<li>R123_W
+: <a class="el" href="array_8h.html#a9b64205709c0daaea3b05bbf7ea5a322">array.h</a>
+</li>
+<li>threefry2x32
+: <a class="el" href="threefry_8h.html#a52e1635889bbf08009646f22897e07fc">threefry.h</a>
+</li>
+<li>threefry2x64
+: <a class="el" href="threefry_8h.html#acda3cc1cd02719e1e3d6cfdf7ce0c4c8">threefry.h</a>
+</li>
+<li>threefry4x32
+: <a class="el" href="threefry_8h.html#aaaecd189b32b0081c6a3c2cb46577e23">threefry.h</a>
+</li>
+<li>threefry4x64
+: <a class="el" href="threefry_8h.html#a992029974a22f14e0ef29a862ede2b8d">threefry.h</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/globals_enum.html b/lib/Random123-1.08/docs/html/globals_enum.html
new file mode 100644
index 0000000..567f48a
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/globals_enum.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li class="current"><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="globals.html"><span>All</span></a></li>
+      <li><a href="globals_func.html"><span>Functions</span></a></li>
+      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
+      <li class="current"><a href="globals_enum.html"><span>Enumerations</span></a></li>
+      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="globals_defs.html"><span>Defines</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ <ul>
+<li>r123_enum_aesni1xm128i
+: <a class="el" href="group__AESNI.html#ga2814629101926e23001d564630ba7b86">aes.h</a>
+</li>
+<li>r123_enum_aesni4x32
+: <a class="el" href="group__AESNI.html#ga1557a9d6e95543a3c4ca9082a4c14b0d">aes.h</a>
+</li>
+<li>r123_enum_ars1xm128i
+: <a class="el" href="group__AESNI.html#gabf0a537666d4d1421144cb0a5e67666c">ars.h</a>
+</li>
+<li>r123_enum_ars4x32
+: <a class="el" href="group__AESNI.html#gaa623b038fa0c8d8d2864fdc0e45884d6">ars.h</a>
+</li>
+<li>r123_enum_philox2x32
+: <a class="el" href="group__PhiloxNxW.html#gae7443e1a57429154124943b6a7c0bd08">philox.h</a>
+</li>
+<li>r123_enum_philox2x64
+: <a class="el" href="group__PhiloxNxW.html#gaca9df5cdadde758a63952daa97ddff91">philox.h</a>
+</li>
+<li>r123_enum_philox4x32
+: <a class="el" href="group__PhiloxNxW.html#ga67fd1bf4ed858d01663a7d6b219b97a2">philox.h</a>
+</li>
+<li>r123_enum_philox4x64
+: <a class="el" href="group__PhiloxNxW.html#gaf603860d055cee96c75f6986641e9cad">philox.h</a>
+</li>
+<li>r123_enum_threefry2x32
+: <a class="el" href="group__ThreefryNxW.html#gae1c47baba4367dd47d68025d23ae4775">threefry.h</a>
+</li>
+<li>r123_enum_threefry2x64
+: <a class="el" href="group__ThreefryNxW.html#gae4df1e52db01acafb28d9c6c25a41071">threefry.h</a>
+</li>
+<li>r123_enum_threefry4x32
+: <a class="el" href="group__ThreefryNxW.html#ga027cd15620ecab867c6af8bb065b189b">threefry.h</a>
+</li>
+<li>r123_enum_threefry4x64
+: <a class="el" href="group__ThreefryNxW.html#ga6379a4a73e85bc36235907a326945acc">threefry.h</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/globals_eval.html b/lib/Random123-1.08/docs/html/globals_eval.html
new file mode 100644
index 0000000..9a8370f
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/globals_eval.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li class="current"><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="globals.html"><span>All</span></a></li>
+      <li><a href="globals_func.html"><span>Functions</span></a></li>
+      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
+      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
+      <li class="current"><a href="globals_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="globals_defs.html"><span>Defines</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ <ul>
+<li>aesni1xm128i_rounds
+: <a class="el" href="group__AESNI.html#gga2814629101926e23001d564630ba7b86a2c404c51fea10eeacb032081dbab2408">aes.h</a>
+</li>
+<li>aesni4x32_rounds
+: <a class="el" href="group__AESNI.html#gga1557a9d6e95543a3c4ca9082a4c14b0dad65178990d928071f958bf2413ebdb4b">aes.h</a>
+</li>
+<li>ars1xm128i_rounds
+: <a class="el" href="group__AESNI.html#ggabf0a537666d4d1421144cb0a5e67666cade1fd46524355ec1d7ce63fd13b54992">ars.h</a>
+</li>
+<li>ars4x32_rounds
+: <a class="el" href="group__AESNI.html#ggaa623b038fa0c8d8d2864fdc0e45884d6a5e715f357770a0f188ef493e6e63d31d">ars.h</a>
+</li>
+<li>philox2x32_rounds
+: <a class="el" href="group__PhiloxNxW.html#ggae7443e1a57429154124943b6a7c0bd08ad08568b592cd076441505eed926d929c">philox.h</a>
+</li>
+<li>philox2x64_rounds
+: <a class="el" href="group__PhiloxNxW.html#ggaca9df5cdadde758a63952daa97ddff91ae15befbf8ae3f2e93d6e49ea9e05b636">philox.h</a>
+</li>
+<li>philox4x32_rounds
+: <a class="el" href="group__PhiloxNxW.html#gga67fd1bf4ed858d01663a7d6b219b97a2ac9dec73e096a7afb5d82f2388a7a5412">philox.h</a>
+</li>
+<li>philox4x64_rounds
+: <a class="el" href="group__PhiloxNxW.html#ggaf603860d055cee96c75f6986641e9cada3407accddb6e873c1005a4ab2edcef67">philox.h</a>
+</li>
+<li>threefry2x32_rounds
+: <a class="el" href="group__ThreefryNxW.html#ggae1c47baba4367dd47d68025d23ae4775a5c6f9a5f3ae1c3700938a3fca5f5821b">threefry.h</a>
+</li>
+<li>threefry2x64_rounds
+: <a class="el" href="group__ThreefryNxW.html#ggae4df1e52db01acafb28d9c6c25a41071a61579c86759ab497dbfc895f2fe6ec7c">threefry.h</a>
+</li>
+<li>threefry4x32_rounds
+: <a class="el" href="group__ThreefryNxW.html#gga027cd15620ecab867c6af8bb065b189ba36063dd986ca2ccd28209c7b4bf711d7">threefry.h</a>
+</li>
+<li>threefry4x64_rounds
+: <a class="el" href="group__ThreefryNxW.html#gga6379a4a73e85bc36235907a326945acca9cdd4629047775ebe339ac9e9dd0ad65">threefry.h</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/globals_func.html b/lib/Random123-1.08/docs/html/globals_func.html
new file mode 100644
index 0000000..330a2b2
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/globals_func.html
@@ -0,0 +1,244 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li class="current"><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="globals.html"><span>All</span></a></li>
+      <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+      <li><a href="globals_type.html"><span>Typedefs</span></a></li>
+      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
+      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="globals_defs.html"><span>Defines</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="#index__"><span>_</span></a></li>
+      <li><a href="#index_a"><span>a</span></a></li>
+      <li><a href="#index_h"><span>h</span></a></li>
+      <li><a href="#index_o"><span>o</span></a></li>
+      <li><a href="#index_p"><span>p</span></a></li>
+      <li><a href="#index_t"><span>t</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<li>_mm_extract_lo64()
+: <a class="el" href="sse_8h.html#adac6aaf79c4428abcd30bf583eeb5450">sse.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>aesni1xm128i()
+: <a class="el" href="group__AESNI.html#ga3ba5daca2d4d076ece24900084e71311">aes.h</a>
+</li>
+<li>aesni1xm128i_R()
+: <a class="el" href="group__AESNI.html#ga89d9042c08ae5eef4c98bfb9609ebd34">aes.h</a>
+</li>
+<li>aesni4x32_R()
+: <a class="el" href="group__AESNI.html#gae28b030e9786a6f36a47df8f211a750b">aes.h</a>
+</li>
+<li>aesni4x32keyinit()
+: <a class="el" href="group__AESNI.html#ga2aa21ba4a3d3850faa96e7834114d8e1">aes.h</a>
+</li>
+<li>ars1xm128i_R()
+: <a class="el" href="group__AESNI.html#gaddc6efc2007f6f66ee914eb7074cff1e">ars.h</a>
+</li>
+<li>ars1xm128ikeyinit()
+: <a class="el" href="group__AESNI.html#gae307c205a2ad19142bbe70919abfbfc2">ars.h</a>
+</li>
+<li>ars4x32_R()
+: <a class="el" href="group__AESNI.html#gab13b093252d4bb3389d27d4e3b04dae8">ars.h</a>
+</li>
+<li>ars4x32keyinit()
+: <a class="el" href="group__AESNI.html#ga1f3a02ea711ae6bacb0875f11a255516">ars.h</a>
+</li>
+<li>assemble_from_u32()
+: <a class="el" href="sse_8h.html#a99c42d1da8da3a4a273556a7817b5c1f">sse.h</a>
+</li>
+<li>assemble_from_u32< r123m128i >()
+: <a class="el" href="sse_8h.html#a0cd6ca87c67023d7afda38319ab40e43">sse.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<li>haveAESNI()
+: <a class="el" href="sse_8h.html#a0b35a046e85316295476d7d552411044">sse.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>operator!=()
+: <a class="el" href="sse_8h.html#a9fc5dd462afc043229ab800abb8f7d64">sse.h</a>
+</li>
+<li>operator++()
+: <a class="el" href="sse_8h.html#a2ffeb79e1a2cbb9cb35b0daf514a06a5">sse.h</a>
+</li>
+<li>operator+=()
+: <a class="el" href="sse_8h.html#a436d4467bb1389d42bfa67686218fd98">sse.h</a>
+</li>
+<li>operator<()
+: <a class="el" href="sse_8h.html#ac2c263fa443dd074fe4ff96710219eb8">sse.h</a>
+</li>
+<li>operator<<()
+: <a class="el" href="array_8h.html#ab2b41774a3888c0bc9697fd79383eae4">array.h</a>
+, <a class="el" href="sse_8h.html#af965b43e09e7305795c7b5a35d20c75f">sse.h</a>
+</li>
+<li>operator<=()
+: <a class="el" href="sse_8h.html#a43e11de33821f27448feb163162ec895">sse.h</a>
+</li>
+<li>operator==()
+: <a class="el" href="sse_8h.html#ab1389a6d8b14bc380c6d6a6d4de8853e">sse.h</a>
+</li>
+<li>operator>()
+: <a class="el" href="sse_8h.html#ad07b59f8110eac57511ee8c2fa697f93">sse.h</a>
+</li>
+<li>operator>=()
+: <a class="el" href="sse_8h.html#aa7bb0ad8bfceb39a1b71262b9476e151">sse.h</a>
+</li>
+<li>operator>>()
+: <a class="el" href="array_8h.html#a3cdf7b897463996d6eda01443dd669c5">array.h</a>
+, <a class="el" href="sse_8h.html#a202aef4bea97c2203a82676cb6abba40">sse.h</a>
+, <a class="el" href="array_8h.html#ae63a28cc2f1e69f63a4402c8b83663b4">array.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>philox2x32_R()
+: <a class="el" href="philox_8h.html#acf0a4b82a9fd3f4695c04210df0cbefe">philox.h</a>
+</li>
+<li>philox2x32keyinit()
+: <a class="el" href="philox_8h.html#ae5dd55c0697c37598c1fbce66457e124">philox.h</a>
+</li>
+<li>philox2x64_R()
+: <a class="el" href="philox_8h.html#a03c068219ecebcc870afa14a330c0735">philox.h</a>
+</li>
+<li>philox2x64keyinit()
+: <a class="el" href="philox_8h.html#a36b9225fcb73f91d116b424f721275f1">philox.h</a>
+</li>
+<li>philox4x32_R()
+: <a class="el" href="philox_8h.html#a205fdd66786445b3e1c4157bd96d0967">philox.h</a>
+</li>
+<li>philox4x32keyinit()
+: <a class="el" href="philox_8h.html#a5a012bb440c039eda46802b447c31851">philox.h</a>
+</li>
+<li>philox4x64_R()
+: <a class="el" href="philox_8h.html#ac72571943d83caf2f79b7bd309a2ae92">philox.h</a>
+</li>
+<li>philox4x64keyinit()
+: <a class="el" href="philox_8h.html#a101674ffc206e3bd600f9544de0c3c4a">philox.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>threefry2x32()
+: <a class="el" href="threefry_8h.html#af98f648fb8e458ff0c6825cb903734f2">threefry.h</a>
+</li>
+<li>threefry2x32_R()
+: <a class="el" href="threefry_8h.html#ae8eee0d74a087c6cbc112af11b884501">threefry.h</a>
+</li>
+<li>threefry2x32keyinit()
+: <a class="el" href="threefry_8h.html#a5dbdf6e314925cd676da9f97013aefe4">threefry.h</a>
+</li>
+<li>threefry2x64()
+: <a class="el" href="threefry_8h.html#aea6a4bd5c80354a4f575c9bec2702172">threefry.h</a>
+</li>
+<li>threefry2x64_R()
+: <a class="el" href="threefry_8h.html#abe5e028454aef3f2bc459e5db05e0e04">threefry.h</a>
+</li>
+<li>threefry2x64keyinit()
+: <a class="el" href="threefry_8h.html#ac14fcf731b175a1cec85a80606ed5f04">threefry.h</a>
+</li>
+<li>threefry4x32()
+: <a class="el" href="threefry_8h.html#a1636cce9de54f919e8952a42b7f397fd">threefry.h</a>
+</li>
+<li>threefry4x32_R()
+: <a class="el" href="threefry_8h.html#a79eb6922e7404e224893f7f723fc240c">threefry.h</a>
+</li>
+<li>threefry4x32keyinit()
+: <a class="el" href="threefry_8h.html#a458f442301e620096d73efd479ab8591">threefry.h</a>
+</li>
+<li>threefry4x64()
+: <a class="el" href="threefry_8h.html#a382d18a49002d2a5e2b2f06d58669d70">threefry.h</a>
+</li>
+<li>threefry4x64_R()
+: <a class="el" href="threefry_8h.html#a2e04c3f1ae28c4833444bfafcf22c47f">threefry.h</a>
+</li>
+<li>threefry4x64keyinit()
+: <a class="el" href="threefry_8h.html#aeed27be75e75bfffb0bf8c6333f71b10">threefry.h</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/globals_type.html b/lib/Random123-1.08/docs/html/globals_type.html
new file mode 100644
index 0000000..a7cc381
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/globals_type.html
@@ -0,0 +1,205 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li class="current"><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="globals.html"><span>All</span></a></li>
+      <li><a href="globals_func.html"><span>Functions</span></a></li>
+      <li class="current"><a href="globals_type.html"><span>Typedefs</span></a></li>
+      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
+      <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
+      <li><a href="globals_defs.html"><span>Defines</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="#index_a"><span>a</span></a></li>
+      <li><a href="#index_p"><span>p</span></a></li>
+      <li><a href="#index_t"><span>t</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>aesni1xm128i_ctr_t
+: <a class="el" href="group__AESNI.html#gaab0f809a22e01e6cb6135f6af73bb532">aes.h</a>
+</li>
+<li>aesni1xm128i_ukey_t
+: <a class="el" href="group__AESNI.html#gaf4fa221e6387d0454e2e6399245bdead">aes.h</a>
+</li>
+<li>aesni4x32_ctr_t
+: <a class="el" href="group__AESNI.html#gae7459b3f4ee0e424cb4f13b4d5efc1fe">aes.h</a>
+</li>
+<li>aesni4x32_key_t
+: <a class="el" href="group__AESNI.html#ga6d88accdcfa339b48e14021a572e269b">aes.h</a>
+</li>
+<li>aesni4x32_ukey_t
+: <a class="el" href="group__AESNI.html#gac2c3248ec3b03591d442cf634fb51af5">aes.h</a>
+</li>
+<li>ars1xm128i_ctr_t
+: <a class="el" href="group__AESNI.html#ga23ddf8109ce08f2bc14401c5f269d2a9">ars.h</a>
+</li>
+<li>ars1xm128i_key_t
+: <a class="el" href="group__AESNI.html#ga2c5b351a47bb39f4d1769506c98c06e2">ars.h</a>
+</li>
+<li>ars1xm128i_ukey_t
+: <a class="el" href="group__AESNI.html#gaeaa234225e7dcec2ffcdb32a0faad4f0">ars.h</a>
+</li>
+<li>ars4x32_ctr_t
+: <a class="el" href="group__AESNI.html#ga61721da91a455cb587ce6bc4a0f56117">ars.h</a>
+</li>
+<li>ars4x32_key_t
+: <a class="el" href="group__AESNI.html#ga3a1426aa6aaa06330d48ec8173cd3e7b">ars.h</a>
+</li>
+<li>ars4x32_ukey_t
+: <a class="el" href="group__AESNI.html#ga54cb318ff6bd4df405897b2b9a4b109f">ars.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>philox2x32_ctr_t
+: <a class="el" href="philox_8h.html#a5fad831cdbd677bc6e53d37c0191f5e3">philox.h</a>
+</li>
+<li>philox2x32_key_t
+: <a class="el" href="philox_8h.html#a55c0e4adeab3387915f966a0e40dc036">philox.h</a>
+</li>
+<li>philox2x32_ukey_t
+: <a class="el" href="philox_8h.html#abf96b0e95504989c58e6d3436b013a6b">philox.h</a>
+</li>
+<li>philox2x64_ctr_t
+: <a class="el" href="philox_8h.html#a33fa626a4198f38d87713ae9504e53f2">philox.h</a>
+</li>
+<li>philox2x64_key_t
+: <a class="el" href="philox_8h.html#a190087c2584155a936ec7d7b9e8d7f34">philox.h</a>
+</li>
+<li>philox2x64_ukey_t
+: <a class="el" href="philox_8h.html#a419cc7ebdeeaa1fc8249c638eac3d00b">philox.h</a>
+</li>
+<li>philox4x32_ctr_t
+: <a class="el" href="philox_8h.html#a96f2a94ebcd7aba28aaeb0aba6543d2d">philox.h</a>
+</li>
+<li>philox4x32_key_t
+: <a class="el" href="philox_8h.html#ab1e74b78fcee751b43739b2b4415c592">philox.h</a>
+</li>
+<li>philox4x32_ukey_t
+: <a class="el" href="philox_8h.html#a82e1d60f98bfbb600bde2bd939de4573">philox.h</a>
+</li>
+<li>philox4x64_ctr_t
+: <a class="el" href="philox_8h.html#a4d2063cc89bf13153ddeff0d94371986">philox.h</a>
+</li>
+<li>philox4x64_key_t
+: <a class="el" href="philox_8h.html#a0c8c9410e9d88d4c94e8093007e39b0c">philox.h</a>
+</li>
+<li>philox4x64_ukey_t
+: <a class="el" href="philox_8h.html#a689ed8276d25fe0c983c4eb5b9a32fd4">philox.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>threefry2x32_ctr_t
+: <a class="el" href="threefry_8h.html#ac0724455e1e9218f982501247d384833">threefry.h</a>
+</li>
+<li>threefry2x32_key_t
+: <a class="el" href="threefry_8h.html#a9ebab1ff37a7c983a4d5af114fb8f1c7">threefry.h</a>
+</li>
+<li>threefry2x32_ukey_t
+: <a class="el" href="threefry_8h.html#a642ffe8cacdd9e8f6b376bdffff36d24">threefry.h</a>
+</li>
+<li>threefry2x64_ctr_t
+: <a class="el" href="threefry_8h.html#a13c6df8879e7c13605fc1dc67cb2173b">threefry.h</a>
+</li>
+<li>threefry2x64_key_t
+: <a class="el" href="threefry_8h.html#a31a08f696af23b0e339126bc64a78812">threefry.h</a>
+</li>
+<li>threefry2x64_ukey_t
+: <a class="el" href="threefry_8h.html#abb918225d16fcdf0b2659e2096d182b9">threefry.h</a>
+</li>
+<li>threefry4x32_ctr_t
+: <a class="el" href="threefry_8h.html#aa72e480598b54b5bbc640a101f9cbe6e">threefry.h</a>
+</li>
+<li>threefry4x32_key_t
+: <a class="el" href="threefry_8h.html#af332bdaec196cee5378cab4fd049ecde">threefry.h</a>
+</li>
+<li>threefry4x32_ukey_t
+: <a class="el" href="threefry_8h.html#ad65418f4e2c8d8df38059aabc2cc98b6">threefry.h</a>
+</li>
+<li>threefry4x64_ctr_t
+: <a class="el" href="threefry_8h.html#a3296098832bc3a243f40078c1b93592e">threefry.h</a>
+</li>
+<li>threefry4x64_key_t
+: <a class="el" href="threefry_8h.html#ad51f07c7dc47238532cbc05e89f5cef9">threefry.h</a>
+</li>
+<li>threefry4x64_ukey_t
+: <a class="el" href="threefry_8h.html#a6b4db94d5185220d4fcec72f92a391ad">threefry.h</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/group__AESNI.html b/lib/Random123-1.08/docs/html/group__AESNI.html
new file mode 100644
index 0000000..e051680
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/group__AESNI.html
@@ -0,0 +1,647 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: ARS and AESNI Classes and Typedefs</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> |
+<a href="#define-members">Defines</a> |
+<a href="#typedef-members">Typedefs</a> |
+<a href="#enum-members">Enumerations</a> |
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<h1>ARS and AESNI Classes and Typedefs</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI1xm128i.html">r123::AESNI1xm128i</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI1xm128i__R.html">r123::AESNI1xm128i_R< ROUNDS ></a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i_R< ROUNDS ></a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R< ROUNDS ></a></td></tr>
+<tr><td colspan="2"><h2><a name="define-members"></a>
+Defines</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gae3950c524818b49d1cdfad481880a33a">aesni4x32</a>(c, k)   aesni4x32_R(aesni4x32_rounds, c, k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga22e0a9c885b544115d44d26cc7777303">ars1xm128i</a>(c, k)   ars1xm128i_R(ars1xm128i_rounds, c, k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga088ecbf341caf05e491ce246f2ea2d30">ars4x32</a>(c, k)   ars4x32_R(ars4x32_rounds, c, k)</td></tr>
+<tr><td colspan="2"><h2><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gaab0f809a22e01e6cb6135f6af73bb532">aesni1xm128i_ctr_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gaf4fa221e6387d0454e2e6399245bdead">aesni1xm128i_ukey_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gac2c3248ec3b03591d442cf634fb51af5">aesni4x32_ukey_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gae7459b3f4ee0e424cb4f13b4d5efc1fe">aesni4x32_ctr_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga6d88accdcfa339b48e14021a572e269b">aesni4x32_key_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga23ddf8109ce08f2bc14401c5f269d2a9">ars1xm128i_ctr_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga2c5b351a47bb39f4d1769506c98c06e2">ars1xm128i_key_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gaeaa234225e7dcec2ffcdb32a0faad4f0">ars1xm128i_ukey_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga61721da91a455cb587ce6bc4a0f56117">ars4x32_ctr_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga3a1426aa6aaa06330d48ec8173cd3e7b">ars4x32_key_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga54cb318ff6bd4df405897b2b9a4b109f">ars4x32_ukey_t</a></td></tr>
+<tr><td colspan="2"><h2><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga2814629101926e23001d564630ba7b86">r123_enum_aesni1xm128i</a> { <a class="el" href="group__AESNI.html#gga2814629101926e23001d564630ba7b86a2c404c51fea10eeacb032081dbab2408">aesni1xm128i_rounds</a> =  10
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga1557a9d6e95543a3c4ca9082a4c14b0d">r123_enum_aesni4x32</a> { <a class="el" href="group__AESNI.html#gga1557a9d6e95543a3c4ca9082a4c14b0dad65178990d928071f958bf2413ebdb4b">aesni4x32_rounds</a> =  10
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gabf0a537666d4d1421144cb0a5e67666c">r123_enum_ars1xm128i</a> { <a class="el" href="group__AESNI.html#ggabf0a537666d4d1421144cb0a5e67666cade1fd46524355ec1d7ce63fd13b54992">ars1xm128i_rounds</a> =  7
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gaa623b038fa0c8d8d2864fdc0e45884d6">r123_enum_ars4x32</a> { <a class="el" href="group__AESNI.html#ggaa623b038fa0c8d8d2864fdc0e45884d6a5e715f357770a0f188ef493e6e63d31d">ars4x32_rounds</a> =  7
+ }</td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga3ba5daca2d4d076ece24900084e71311">aesni1xm128i</a> (<a class="el" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> in, <a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga89d9042c08ae5eef4c98bfb9609ebd34">aesni1xm128i_R</a> (unsigned R, <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> in, <a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structaesni1xm128i__key__t.html">aesni4x32_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga2aa21ba4a3d3850faa96e7834114d8e1">aesni4x32keyinit</a> (<a class="el" href="structr123array4x32.html">aesni4x32_ukey_t</a> uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array4x32.html">aesni4x32_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gae28b030e9786a6f36a47df8f211a750b">aesni4x32_R</a> (unsigned int Nrounds, <a class="el" href="structr123array4x32.html">aesni4x32_ctr_t</a> c, <a class="el" href="structaesni1xm128i__key__t.html">aesni4x32_key_t</a> k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array1xm128i.html">ars1xm128i_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gae307c205a2ad19142bbe70919abfbfc2">ars1xm128ikeyinit</a> (<a class="el" href="structr123array1xm128i.html">ars1xm128i_ukey_t</a> uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array1xm128i.html">ars1xm128i_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gaddc6efc2007f6f66ee914eb7074cff1e">ars1xm128i_R</a> (unsigned int Nrounds, <a class="el" href="structr123array1xm128i.html">ars1xm128i_ctr_t</a> in, <a class="el" href="structr123array1xm128i.html">ars1xm128i_key_t</a> k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array4x32.html">ars4x32_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#ga1f3a02ea711ae6bacb0875f11a255516">ars4x32keyinit</a> (<a class="el" href="structr123array4x32.html">ars4x32_ukey_t</a> uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array4x32.html">ars4x32_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__AESNI.html#gab13b093252d4bb3389d27d4e3b04dae8">ars4x32_R</a> (unsigned int Nrounds, <a class="el" href="structr123array4x32.html">ars4x32_ctr_t</a> c, <a class="el" href="structr123array4x32.html">ars4x32_key_t</a> k)</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>The ARS4x32, ARS1xm128i, <a class="el" href="structr123_1_1AESNI4x32.html">AESNI4x32</a> and <a class="el" href="structr123_1_1AESNI1xm128i.html">AESNI1xm128i</a> classes export the member functions, typedefs and operator overloads required by a <a class="el" href="CBRNG.html">CBRNG</a> class.</p>
+<p>ARS1xm128i and <a class="el" href="structr123_1_1AESNI1xm128i.html">AESNI1xm128i</a> are based on the AES block cipher and rely on the AES-NI hardware instructions available on some some new (2011) CPUs.</p>
+<p>The ARS1xm128i CBRNG and the use of AES for random number generation are described in <a href="http://dl.acm.org/citation.cfm?doid=2063405"><em>Parallel Random Numbers: As Easy as 1, 2, 3</em> </a>. Although it uses some cryptographic primitives, ARS1xm128i uses a cryptographically weak key schedule and is <b>not</b> suitable for cryptographic use. </p>
+<hr/><h2>Define Documentation</h2>
+<a class="anchor" id="gae3950c524818b49d1cdfad481880a33a"></a><!-- doxytag: member="aes.h::aesni4x32" ref="gae3950c524818b49d1cdfad481880a33a" args="(c, k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define aesni4x32</td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname">k</td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td>   aesni4x32_R(aesni4x32_rounds, c, k)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The aesni4x32 macro provides a C API to the <a class="el" href="group__AESNI.html">AESNI</a> CBRNG, uses the default number of rounds i.e. <code>aesni4x32_rounds</code> </p>
+
+</div>
+</div>
+<a class="anchor" id="ga22e0a9c885b544115d44d26cc7777303"></a><!-- doxytag: member="ars.h::ars1xm128i" ref="ga22e0a9c885b544115d44d26cc7777303" args="(c, k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ars1xm128i</td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname">k</td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td>   ars1xm128i_R(ars1xm128i_rounds, c, k)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The ars1mx128i macro provides a C API interface to the <a class="el" href="group__AESNI.html">ARS</a> CBRNG with the default number of rounds i.e. <code>ars1xm128i_rounds</code> </p>
+
+</div>
+</div>
+<a class="anchor" id="ga088ecbf341caf05e491ce246f2ea2d30"></a><!-- doxytag: member="ars.h::ars4x32" ref="ga088ecbf341caf05e491ce246f2ea2d30" args="(c, k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ars4x32</td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname">k</td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td>   ars4x32_R(ars4x32_rounds, c, k)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The ars4x32 macro provides a C API interface to the <a class="el" href="group__AESNI.html">ARS</a> CBRNG with the default number of rounds i.e. <code>ars4x32_rounds</code> </p>
+
+</div>
+</div>
+<hr/><h2>Typedef Documentation</h2>
+<a class="anchor" id="gaab0f809a22e01e6cb6135f6af73bb532"></a><!-- doxytag: member="aes.h::aesni1xm128i_ctr_t" ref="gaab0f809a22e01e6cb6135f6af73bb532" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="gaf4fa221e6387d0454e2e6399245bdead"></a><!-- doxytag: member="aes.h::aesni1xm128i_ukey_t" ref="gaf4fa221e6387d0454e2e6399245bdead" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ukey_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="gae7459b3f4ee0e424cb4f13b4d5efc1fe"></a><!-- doxytag: member="aes.h::aesni4x32_ctr_t" ref="gae7459b3f4ee0e424cb4f13b4d5efc1fe" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> <a class="el" href="structr123array4x32.html">aesni4x32_ctr_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ga6d88accdcfa339b48e14021a572e269b"></a><!-- doxytag: member="aes.h::aesni4x32_key_t" ref="ga6d88accdcfa339b48e14021a572e269b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> <a class="el" href="structaesni1xm128i__key__t.html">aesni4x32_key_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="gac2c3248ec3b03591d442cf634fb51af5"></a><!-- doxytag: member="aes.h::aesni4x32_ukey_t" ref="gac2c3248ec3b03591d442cf634fb51af5" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> <a class="el" href="structr123array4x32.html">aesni4x32_ukey_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ga23ddf8109ce08f2bc14401c5f269d2a9"></a><!-- doxytag: member="ars.h::ars1xm128i_ctr_t" ref="ga23ddf8109ce08f2bc14401c5f269d2a9" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> <a class="el" href="structr123array1xm128i.html">ars1xm128i_ctr_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ga2c5b351a47bb39f4d1769506c98c06e2"></a><!-- doxytag: member="ars.h::ars1xm128i_key_t" ref="ga2c5b351a47bb39f4d1769506c98c06e2" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> <a class="el" href="structr123array1xm128i.html">ars1xm128i_key_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="gaeaa234225e7dcec2ffcdb32a0faad4f0"></a><!-- doxytag: member="ars.h::ars1xm128i_ukey_t" ref="gaeaa234225e7dcec2ffcdb32a0faad4f0" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> <a class="el" href="structr123array1xm128i.html">ars1xm128i_ukey_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ga61721da91a455cb587ce6bc4a0f56117"></a><!-- doxytag: member="ars.h::ars4x32_ctr_t" ref="ga61721da91a455cb587ce6bc4a0f56117" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> <a class="el" href="structr123array4x32.html">ars4x32_ctr_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ga3a1426aa6aaa06330d48ec8173cd3e7b"></a><!-- doxytag: member="ars.h::ars4x32_key_t" ref="ga3a1426aa6aaa06330d48ec8173cd3e7b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> <a class="el" href="structr123array4x32.html">ars4x32_key_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ga54cb318ff6bd4df405897b2b9a4b109f"></a><!-- doxytag: member="ars.h::ars4x32_ukey_t" ref="ga54cb318ff6bd4df405897b2b9a4b109f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> <a class="el" href="structr123array4x32.html">ars4x32_ukey_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Enumeration Type Documentation</h2>
+<a class="anchor" id="ga2814629101926e23001d564630ba7b86"></a><!-- doxytag: member="aes.h::r123_enum_aesni1xm128i" ref="ga2814629101926e23001d564630ba7b86" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__AESNI.html#ga2814629101926e23001d564630ba7b86">r123_enum_aesni1xm128i</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="gga2814629101926e23001d564630ba7b86a2c404c51fea10eeacb032081dbab2408"></a><!-- doxytag: member="aesni1xm128i_rounds" ref="gga2814629101926e23001d564630ba7b86a2c404c51fea10eeacb032081dbab2408" args="" -->aesni1xm128i_rounds</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga1557a9d6e95543a3c4ca9082a4c14b0d"></a><!-- doxytag: member="aes.h::r123_enum_aesni4x32" ref="ga1557a9d6e95543a3c4ca9082a4c14b0d" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__AESNI.html#ga1557a9d6e95543a3c4ca9082a4c14b0d">r123_enum_aesni4x32</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="gga1557a9d6e95543a3c4ca9082a4c14b0dad65178990d928071f958bf2413ebdb4b"></a><!-- doxytag: member="aesni4x32_rounds" ref="gga1557a9d6e95543a3c4ca9082a4c14b0dad65178990d928071f958bf2413ebdb4b" args="" -->aesni4x32_rounds</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="gabf0a537666d4d1421144cb0a5e67666c"></a><!-- doxytag: member="ars.h::r123_enum_ars1xm128i" ref="gabf0a537666d4d1421144cb0a5e67666c" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__AESNI.html#gabf0a537666d4d1421144cb0a5e67666c">r123_enum_ars1xm128i</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="ggabf0a537666d4d1421144cb0a5e67666cade1fd46524355ec1d7ce63fd13b54992"></a><!-- doxytag: member="ars1xm128i_rounds" ref="ggabf0a537666d4d1421144cb0a5e67666cade1fd46524355ec1d7ce63fd13b54992" args="" -->ars1xm128i_rounds</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="gaa623b038fa0c8d8d2864fdc0e45884d6"></a><!-- doxytag: member="ars.h::r123_enum_ars4x32" ref="gaa623b038fa0c8d8d2864fdc0e45884d6" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__AESNI.html#gaa623b038fa0c8d8d2864fdc0e45884d6">r123_enum_ars4x32</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="ggaa623b038fa0c8d8d2864fdc0e45884d6a5e715f357770a0f188ef493e6e63d31d"></a><!-- doxytag: member="ars4x32_rounds" ref="ggaa623b038fa0c8d8d2864fdc0e45884d6a5e715f357770a0f188ef493e6e63d31d" args="" -->ars4x32_rounds</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="ga3ba5daca2d4d076ece24900084e71311"></a><!-- doxytag: member="aes.h::aesni1xm128i" ref="ga3ba5daca2d4d076ece24900084e71311" args="(aesni1xm128i_ctr_t in, aesni1xm128i_key_t k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> aesni1xm128i </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> </td>
+          <td class="paramname"> <em>in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> </td>
+          <td class="paramname"> <em>k</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ga89d9042c08ae5eef4c98bfb9609ebd34"></a><!-- doxytag: member="aes.h::aesni1xm128i_R" ref="ga89d9042c08ae5eef4c98bfb9609ebd34" args="(unsigned R, aesni1xm128i_ctr_t in, aesni1xm128i_key_t k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> aesni1xm128i_R </td>
+          <td>(</td>
+          <td class="paramtype">unsigned </td>
+          <td class="paramname"> <em>R</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> </td>
+          <td class="paramname"> <em>in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> </td>
+          <td class="paramname"> <em>k</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="gae28b030e9786a6f36a47df8f211a750b"></a><!-- doxytag: member="aes.h::aesni4x32_R" ref="gae28b030e9786a6f36a47df8f211a750b" args="(unsigned int Nrounds, aesni4x32_ctr_t c, aesni4x32_key_t k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array4x32.html">aesni4x32_ctr_t</a> aesni4x32_R </td>
+          <td>(</td>
+          <td class="paramtype">unsigned int </td>
+          <td class="paramname"> <em>Nrounds</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">aesni4x32_ctr_t</a> </td>
+          <td class="paramname"> <em>c</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structaesni1xm128i__key__t.html">aesni4x32_key_t</a> </td>
+          <td class="paramname"> <em>k</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The aesni4x32_R function provides a C API to the <a class="el" href="group__AESNI.html">AESNI</a> CBRNG, allowing the number of rounds to be specified explicitly </p>
+
+</div>
+</div>
+<a class="anchor" id="ga2aa21ba4a3d3850faa96e7834114d8e1"></a><!-- doxytag: member="aes.h::aesni4x32keyinit" ref="ga2aa21ba4a3d3850faa96e7834114d8e1" args="(aesni4x32_ukey_t uk)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structaesni1xm128i__key__t.html">aesni4x32_key_t</a> aesni4x32keyinit </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">aesni4x32_ukey_t</a> </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="gaddc6efc2007f6f66ee914eb7074cff1e"></a><!-- doxytag: member="ars.h::ars1xm128i_R" ref="gaddc6efc2007f6f66ee914eb7074cff1e" args="(unsigned int Nrounds, ars1xm128i_ctr_t in, ars1xm128i_key_t k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array1xm128i.html">ars1xm128i_ctr_t</a> ars1xm128i_R </td>
+          <td>(</td>
+          <td class="paramtype">unsigned int </td>
+          <td class="paramname"> <em>Nrounds</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array1xm128i.html">ars1xm128i_ctr_t</a> </td>
+          <td class="paramname"> <em>in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array1xm128i.html">ars1xm128i_key_t</a> </td>
+          <td class="paramname"> <em>k</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="gae307c205a2ad19142bbe70919abfbfc2"></a><!-- doxytag: member="ars.h::ars1xm128ikeyinit" ref="gae307c205a2ad19142bbe70919abfbfc2" args="(ars1xm128i_ukey_t uk)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array1xm128i.html">ars1xm128i_key_t</a> ars1xm128ikeyinit </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1xm128i.html">ars1xm128i_ukey_t</a> </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="gab13b093252d4bb3389d27d4e3b04dae8"></a><!-- doxytag: member="ars.h::ars4x32_R" ref="gab13b093252d4bb3389d27d4e3b04dae8" args="(unsigned int Nrounds, ars4x32_ctr_t c, ars4x32_key_t k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array4x32.html">ars4x32_ctr_t</a> ars4x32_R </td>
+          <td>(</td>
+          <td class="paramtype">unsigned int </td>
+          <td class="paramname"> <em>Nrounds</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">ars4x32_ctr_t</a> </td>
+          <td class="paramname"> <em>c</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">ars4x32_key_t</a> </td>
+          <td class="paramname"> <em>k</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ga1f3a02ea711ae6bacb0875f11a255516"></a><!-- doxytag: member="ars.h::ars4x32keyinit" ref="ga1f3a02ea711ae6bacb0875f11a255516" args="(ars4x32_ukey_t uk)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array4x32.html">ars4x32_key_t</a> ars4x32keyinit </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">ars4x32_ukey_t</a> </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/group__PhiloxNxW.html b/lib/Random123-1.08/docs/html/group__PhiloxNxW.html
new file mode 100644
index 0000000..5cc72ee
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/group__PhiloxNxW.html
@@ -0,0 +1,238 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Philox Classes and Typedefs</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> |
+<a href="#typedef-members">Typedefs</a> |
+<a href="#enum-members">Enumerations</a>  </div>
+  <div class="headertitle">
+<h1>Philox Classes and Typedefs</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32_R< ROUNDS ></a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64_R< ROUNDS ></a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32_R< ROUNDS ></a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64_R< ROUNDS ></a></td></tr>
+<tr><td colspan="2"><h2><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef Philox2x32_R<br class="typebreak"/>
+< philox2x32_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#ga81659a3ee5a1ca9e2e85c5d725a1ea4f">r123::Philox2x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef Philox2x64_R<br class="typebreak"/>
+< philox2x64_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#ga616a669079ac25119353416c14d46426">r123::Philox2x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef Philox4x32_R<br class="typebreak"/>
+< philox4x32_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#gaafd54060af05012db410034e3c0ecdc4">r123::Philox4x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef Philox4x64_R<br class="typebreak"/>
+< philox4x64_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#ga7776f4d481b7c0ac00db70272a1c77f0">r123::Philox4x64</a></td></tr>
+<tr><td colspan="2"><h2><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#gae7443e1a57429154124943b6a7c0bd08">r123_enum_philox2x32</a> { <a class="el" href="group__PhiloxNxW.html#ggae7443e1a57429154124943b6a7c0bd08ad08568b592cd076441505eed926d929c">philox2x32_rounds</a> =  10
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#ga67fd1bf4ed858d01663a7d6b219b97a2">r123_enum_philox4x32</a> { <a class="el" href="group__PhiloxNxW.html#gga67fd1bf4ed858d01663a7d6b219b97a2ac9dec73e096a7afb5d82f2388a7a5412">philox4x32_rounds</a> =  10
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#gaca9df5cdadde758a63952daa97ddff91">r123_enum_philox2x64</a> { <a class="el" href="group__PhiloxNxW.html#ggaca9df5cdadde758a63952daa97ddff91ae15befbf8ae3f2e93d6e49ea9e05b636">philox2x64_rounds</a> =  10
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#gaf603860d055cee96c75f6986641e9cad">r123_enum_philox4x64</a> { <a class="el" href="group__PhiloxNxW.html#ggaf603860d055cee96c75f6986641e9cada3407accddb6e873c1005a4ab2edcef67">philox4x64_rounds</a> =  10
+ }</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>The PhiloxNxW classes export the member functions, typedefs and operator overloads required by a <a class="el" href="CBRNG.html">CBRNG</a> class.</p>
+<p>As described in <a href="http://dl.acm.org/citation.cfm?doid=2063405"><em>Parallel Random Numbers: As Easy as 1, 2, 3</em> </a>. The Philox family of counter-based RNGs use integer multiplication, xor and permutation of W-bit words to scramble its N-word input key. Philox is a mnemonic for Product HI LO Xor). </p>
+<hr/><h2>Typedef Documentation</h2>
+<a class="anchor" id="ga81659a3ee5a1ca9e2e85c5d725a1ea4f"></a><!-- doxytag: member="r123::Philox2x32" ref="ga81659a3ee5a1ca9e2e85c5d725a1ea4f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Philox2x32 is equivalent to Philox2x32_R<10>. With 10 rounds, Philox2x32 has a considerable safety margin over the minimum number of rounds with no known statistical flaws, but still has excellent performance. </p>
+
+</div>
+</div>
+<a class="anchor" id="ga616a669079ac25119353416c14d46426"></a><!-- doxytag: member="r123::Philox2x64" ref="ga616a669079ac25119353416c14d46426" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Philox2x64 is equivalent to Philox2x64_R<10>. With 10 rounds, Philox2x64 has a considerable safety margin over the minimum number of rounds with no known statistical flaws, but still has excellent performance. </p>
+
+</div>
+</div>
+<a class="anchor" id="gaafd54060af05012db410034e3c0ecdc4"></a><!-- doxytag: member="r123::Philox4x32" ref="gaafd54060af05012db410034e3c0ecdc4" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Philox4x32 is equivalent to Philox4x32_R<10>. With 10 rounds, Philox4x32 has a considerable safety margin over the minimum number of rounds with no known statistical flaws, but still has excellent performance. </p>
+
+</div>
+</div>
+<a class="anchor" id="ga7776f4d481b7c0ac00db70272a1c77f0"></a><!-- doxytag: member="r123::Philox4x64" ref="ga7776f4d481b7c0ac00db70272a1c77f0" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Philox4x64 is equivalent to Philox4x64_R<10>. With 10 rounds, Philox4x64 has a considerable safety margin over the minimum number of rounds with no known statistical flaws, but still has excellent performance. </p>
+
+</div>
+</div>
+<hr/><h2>Enumeration Type Documentation</h2>
+<a class="anchor" id="gae7443e1a57429154124943b6a7c0bd08"></a><!-- doxytag: member="philox.h::r123_enum_philox2x32" ref="gae7443e1a57429154124943b6a7c0bd08" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__PhiloxNxW.html#gae7443e1a57429154124943b6a7c0bd08">r123_enum_philox2x32</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="ggae7443e1a57429154124943b6a7c0bd08ad08568b592cd076441505eed926d929c"></a><!-- doxytag: member="philox2x32_rounds" ref="ggae7443e1a57429154124943b6a7c0bd08ad08568b592cd076441505eed926d929c" args="" -->philox2x32_rounds</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="gaca9df5cdadde758a63952daa97ddff91"></a><!-- doxytag: member="philox.h::r123_enum_philox2x64" ref="gaca9df5cdadde758a63952daa97ddff91" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__PhiloxNxW.html#gaca9df5cdadde758a63952daa97ddff91">r123_enum_philox2x64</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="ggaca9df5cdadde758a63952daa97ddff91ae15befbf8ae3f2e93d6e49ea9e05b636"></a><!-- doxytag: member="philox2x64_rounds" ref="ggaca9df5cdadde758a63952daa97ddff91ae15befbf8ae3f2e93d6e49ea9e05b636" args="" -->philox2x64_rounds</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga67fd1bf4ed858d01663a7d6b219b97a2"></a><!-- doxytag: member="philox.h::r123_enum_philox4x32" ref="ga67fd1bf4ed858d01663a7d6b219b97a2" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__PhiloxNxW.html#ga67fd1bf4ed858d01663a7d6b219b97a2">r123_enum_philox4x32</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="gga67fd1bf4ed858d01663a7d6b219b97a2ac9dec73e096a7afb5d82f2388a7a5412"></a><!-- doxytag: member="philox4x32_rounds" ref="gga67fd1bf4ed858d01663a7d6b219b97a2ac9dec73e096a7afb5d82f2388a7a5412" args="" -->philox4x32_rounds</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="gaf603860d055cee96c75f6986641e9cad"></a><!-- doxytag: member="philox.h::r123_enum_philox4x64" ref="gaf603860d055cee96c75f6986641e9cad" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__PhiloxNxW.html#gaf603860d055cee96c75f6986641e9cad">r123_enum_philox4x64</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="ggaf603860d055cee96c75f6986641e9cada3407accddb6e873c1005a4ab2edcef67"></a><!-- doxytag: member="philox4x64_rounds" ref="ggaf603860d055cee96c75f6986641e9cada3407accddb6e873c1005a4ab2edcef67" args="" -->philox4x64_rounds</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/group__ThreefryNxW.html b/lib/Random123-1.08/docs/html/group__ThreefryNxW.html
new file mode 100644
index 0000000..6c1b9eb
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/group__ThreefryNxW.html
@@ -0,0 +1,239 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Threefry Classes and Typedefs</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> |
+<a href="#typedef-members">Typedefs</a> |
+<a href="#enum-members">Enumerations</a>  </div>
+  <div class="headertitle">
+<h1>Threefry Classes and Typedefs</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32_R< R ></a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64_R< R ></a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32_R< R ></a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64_R< R ></a></td></tr>
+<tr><td colspan="2"><h2><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef Threefry2x32_R<br class="typebreak"/>
+< threefry2x32_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#ga1c32939b65f84966c93677f4382ea36d">r123::Threefry2x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef Threefry2x64_R<br class="typebreak"/>
+< threefry2x64_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#ga2b54dd1b0d20f09239be5f8757f1f3db">r123::Threefry2x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef Threefry4x32_R<br class="typebreak"/>
+< threefry4x32_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#gacb09a2dcfb7389769f0c58f45f132aaa">r123::Threefry4x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef Threefry4x64_R<br class="typebreak"/>
+< threefry4x64_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#gae17c98bddf067365508ed0717f865e8b">r123::Threefry4x64</a></td></tr>
+<tr><td colspan="2"><h2><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#gae4df1e52db01acafb28d9c6c25a41071">r123_enum_threefry2x64</a> { <a class="el" href="group__ThreefryNxW.html#ggae4df1e52db01acafb28d9c6c25a41071a61579c86759ab497dbfc895f2fe6ec7c">threefry2x64_rounds</a> =  20
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#gae1c47baba4367dd47d68025d23ae4775">r123_enum_threefry2x32</a> { <a class="el" href="group__ThreefryNxW.html#ggae1c47baba4367dd47d68025d23ae4775a5c6f9a5f3ae1c3700938a3fca5f5821b">threefry2x32_rounds</a> =  20
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#ga6379a4a73e85bc36235907a326945acc">r123_enum_threefry4x64</a> { <a class="el" href="group__ThreefryNxW.html#gga6379a4a73e85bc36235907a326945acca9cdd4629047775ebe339ac9e9dd0ad65">threefry4x64_rounds</a> =  20
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#ga027cd15620ecab867c6af8bb065b189b">r123_enum_threefry4x32</a> { <a class="el" href="group__ThreefryNxW.html#gga027cd15620ecab867c6af8bb065b189ba36063dd986ca2ccd28209c7b4bf711d7">threefry4x32_rounds</a> =  20
+ }</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>The ThreefryNxW classes export the member functions, typedefs and operator overloads required by a <a class="el" href="CBRNG.html">CBRNG</a> class.</p>
+<p>As described in <a href="http://dl.acm.org/citation.cfm?doid=2063405"><em>Parallel Random Numbers: As Easy as 1, 2, 3</em> </a>, the Threefry family is closely related to the Threefish block cipher from <a href="http://www.skein-hash.info/">Skein Hash Function</a>. Threefry is <b>not</b> suitable for cryptographic use.</p>
+<p>Threefry uses integer addition, bitwise rotation, xor and permutation of words to randomize its output. </p>
+<hr/><h2>Typedef Documentation</h2>
+<a class="anchor" id="ga1c32939b65f84966c93677f4382ea36d"></a><!-- doxytag: member="r123::Threefry2x32" ref="ga1c32939b65f84966c93677f4382ea36d" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Threefry2x32 is equivalent to Threefry2x32_R<20>. With 20 rounds, Threefry2x32 has a considerable safety margin over the minimum number of rounds with no known statistical flaws, but still has excellent performance. </p>
+
+</div>
+</div>
+<a class="anchor" id="ga2b54dd1b0d20f09239be5f8757f1f3db"></a><!-- doxytag: member="r123::Threefry2x64" ref="ga2b54dd1b0d20f09239be5f8757f1f3db" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Threefry2x64 is equivalent to Threefry2x64_R<20>. With 20 rounds, Threefry2x64 has a considerable safety margin over the minimum number of rounds with no known statistical flaws, but still has excellent performance. </p>
+
+</div>
+</div>
+<a class="anchor" id="gacb09a2dcfb7389769f0c58f45f132aaa"></a><!-- doxytag: member="r123::Threefry4x32" ref="gacb09a2dcfb7389769f0c58f45f132aaa" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Threefry4x32 is equivalent to Threefry4x32_R<20>. With 20 rounds, Threefry4x32 has a considerable safety margin over the minimum number of rounds with no known statistical flaws, but still has excellent performance. </p>
+
+</div>
+</div>
+<a class="anchor" id="gae17c98bddf067365508ed0717f865e8b"></a><!-- doxytag: member="r123::Threefry4x64" ref="gae17c98bddf067365508ed0717f865e8b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Threefry4x64 is equivalent to Threefry4x64_R<20>. With 20 rounds, Threefry4x64 has a considerable safety margin over the minimum number of rounds with no known statistical flaws, but still has excellent performance. </p>
+
+</div>
+</div>
+<hr/><h2>Enumeration Type Documentation</h2>
+<a class="anchor" id="gae1c47baba4367dd47d68025d23ae4775"></a><!-- doxytag: member="threefry.h::r123_enum_threefry2x32" ref="gae1c47baba4367dd47d68025d23ae4775" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__ThreefryNxW.html#gae1c47baba4367dd47d68025d23ae4775">r123_enum_threefry2x32</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="ggae1c47baba4367dd47d68025d23ae4775a5c6f9a5f3ae1c3700938a3fca5f5821b"></a><!-- doxytag: member="threefry2x32_rounds" ref="ggae1c47baba4367dd47d68025d23ae4775a5c6f9a5f3ae1c3700938a3fca5f5821b" args="" -->threefry2x32_rounds</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="gae4df1e52db01acafb28d9c6c25a41071"></a><!-- doxytag: member="threefry.h::r123_enum_threefry2x64" ref="gae4df1e52db01acafb28d9c6c25a41071" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__ThreefryNxW.html#gae4df1e52db01acafb28d9c6c25a41071">r123_enum_threefry2x64</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="ggae4df1e52db01acafb28d9c6c25a41071a61579c86759ab497dbfc895f2fe6ec7c"></a><!-- doxytag: member="threefry2x64_rounds" ref="ggae4df1e52db01acafb28d9c6c25a41071a61579c86759ab497dbfc895f2fe6ec7c" args="" -->threefry2x64_rounds</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga027cd15620ecab867c6af8bb065b189b"></a><!-- doxytag: member="threefry.h::r123_enum_threefry4x32" ref="ga027cd15620ecab867c6af8bb065b189b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__ThreefryNxW.html#ga027cd15620ecab867c6af8bb065b189b">r123_enum_threefry4x32</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="gga027cd15620ecab867c6af8bb065b189ba36063dd986ca2ccd28209c7b4bf711d7"></a><!-- doxytag: member="threefry4x32_rounds" ref="gga027cd15620ecab867c6af8bb065b189ba36063dd986ca2ccd28209c7b4bf711d7" args="" -->threefry4x32_rounds</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga6379a4a73e85bc36235907a326945acc"></a><!-- doxytag: member="threefry.h::r123_enum_threefry4x64" ref="ga6379a4a73e85bc36235907a326945acc" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__ThreefryNxW.html#ga6379a4a73e85bc36235907a326945acc">r123_enum_threefry4x64</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="gga6379a4a73e85bc36235907a326945acca9cdd4629047775ebe339ac9e9dd0ad65"></a><!-- doxytag: member="threefry4x64_rounds" ref="gga6379a4a73e85bc36235907a326945acca9cdd4629047775ebe339ac9e9dd0ad65" args="" -->threefry4x64_rounds</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/group__arrayNxW.html b/lib/Random123-1.08/docs/html/group__arrayNxW.html
new file mode 100644
index 0000000..ab7e05e
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/group__arrayNxW.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: The r123arrayNxW classes</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>The r123arrayNxW classes</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html">r123array1x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html">r123array2x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html">r123array4x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html">r123array8x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html">r123array1x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html">r123array2x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html">r123array4x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html">r123array16x8</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>Each of the r123arrayNxW is a fixed size array of N W-bit unsigned integers. It is functionally equivalent to the C++0x std::array<N, uintW_t>, but does not require C++0x features or libraries.</p>
+<p>In addition to meeting most of the requirements of a Container, it also has a member function, incr(), which increments the zero-th element and carrys overflows into higher indexed elements. Thus, by using incr(), sequences of up to 2^(N*W) distinct values can be produced.</p>
+<p>If SSE is supported by the compiler, then the class <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> is also defined, in which the data member is an array of one r123128i object. </p>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/gsl__cbrng_8h.html b/lib/Random123-1.08/docs/html/gsl__cbrng_8h.html
new file mode 100644
index 0000000..2d5cc58
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/gsl__cbrng_8h.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/conventional/gsl_cbrng.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Defines</a>  </div>
+  <div class="headertitle">
+<h1>Random123/conventional/gsl_cbrng.h File Reference</h1>  </div>
+</div>
+<div class="contents">
+<code>#include <gsl/gsl_rng.h></code><br/>
+<code>#include <string.h></code><br/>
+
+<p><a href="gsl__cbrng_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="define-members"></a>
+Defines</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="gsl__cbrng_8h.html#af561a004eef8e93cdfd6b255a8a1eb75">GSL_CBRNG</a>(NAME, CBRNGNAME)</td></tr>
+</table>
+<hr/><h2>Define Documentation</h2>
+<a class="anchor" id="af561a004eef8e93cdfd6b255a8a1eb75"></a><!-- doxytag: member="gsl_cbrng.h::GSL_CBRNG" ref="af561a004eef8e93cdfd6b255a8a1eb75" args="(NAME, CBRNGNAME)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define GSL_CBRNG</td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname">NAME, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname">CBRNGNAME</td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The macro: <a class="el" href="gsl__cbrng_8h.html#af561a004eef8e93cdfd6b255a8a1eb75">GSL_CBRNG(NAME, CBRNGNAME)</a> declares the necessary structs and constants that define a gsl_rng_NAME type based on the counter-based RNG CBRNGNAME. For example:</p>
+<p>Usage:</p>
+<div class="fragment"><pre class="fragment"><span class="preprocessor">   #include <<a class="code" href="threefry_8h.html">Random123/threefry.h</a>></span>
+<span class="preprocessor">   #include <<a class="code" href="gsl__cbrng_8h.html">Random123/conventional/gsl_cbrng.h</a>></span>  <span class="comment">// this file</span>
+   <a class="code" href="gsl__cbrng_8h.html#af561a004eef8e93cdfd6b255a8a1eb75">GSL_CBRNG</a>(cbrng, <a class="code" href="threefry_8h.html#aaaecd189b32b0081c6a3c2cb46577e23">threefry4x32</a>); <span class="comment">// creates gsl_rng_cbrng</span>
+
+   <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv){
+       gsl_rng *r = gsl_rng_alloc(gsl_rng_cbrng);
+       ... use r as you would use any other gsl_rng ...   
+    }
+</pre></div><p>It requires that NAME be the name of a CBRNG that follows the naming and stylistic conventions of the Random123 library.</p>
+<p>Note that wrapping a <a class="el" href="CBRNG.html">counter-based PRNG</a> with a traditional API in this way obscures much of the power of the CBRNG API. Nevertheless, it may be of value to applications that are already coded to work with GSL random number generators, and that wish to use the RNGs in the Random123 library. </p>
+
+</div>
+</div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/gsl__cbrng_8h_source.html b/lib/Random123-1.08/docs/html/gsl__cbrng_8h_source.html
new file mode 100644
index 0000000..c0a2e39
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/gsl__cbrng_8h_source.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/conventional/gsl_cbrng.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>Random123/conventional/gsl_cbrng.h</h1>  </div>
+</div>
+<div class="contents">
+<a href="gsl__cbrng_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">Copyright 2010-2011, D. E. Shaw Research.</span>
+<a name="l00003"></a>00003 <span class="comment">All rights reserved.</span>
+<a name="l00004"></a>00004 <span class="comment"></span>
+<a name="l00005"></a>00005 <span class="comment">Redistribution and use in source and binary forms, with or without</span>
+<a name="l00006"></a>00006 <span class="comment">modification, are permitted provided that the following conditions are</span>
+<a name="l00007"></a>00007 <span class="comment">met:</span>
+<a name="l00008"></a>00008 <span class="comment"></span>
+<a name="l00009"></a>00009 <span class="comment">* Redistributions of source code must retain the above copyright</span>
+<a name="l00010"></a>00010 <span class="comment">  notice, this list of conditions, and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"></span>
+<a name="l00012"></a>00012 <span class="comment">* Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00013"></a>00013 <span class="comment">  notice, this list of conditions, and the following disclaimer in the</span>
+<a name="l00014"></a>00014 <span class="comment">  documentation and/or other materials provided with the distribution.</span>
+<a name="l00015"></a>00015 <span class="comment"></span>
+<a name="l00016"></a>00016 <span class="comment">* Neither the name of D. E. Shaw Research nor the names of its</span>
+<a name="l00017"></a>00017 <span class="comment">  contributors may be used to endorse or promote products derived from</span>
+<a name="l00018"></a>00018 <span class="comment">  this software without specific prior written permission.</span>
+<a name="l00019"></a>00019 <span class="comment"></span>
+<a name="l00020"></a>00020 <span class="comment">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span>
+<a name="l00021"></a>00021 <span class="comment">"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span>
+<a name="l00022"></a>00022 <span class="comment">LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span>
+<a name="l00023"></a>00023 <span class="comment">A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span>
+<a name="l00024"></a>00024 <span class="comment">OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
+<a name="l00025"></a>00025 <span class="comment">SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span>
+<a name="l00026"></a>00026 <span class="comment">LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span>
+<a name="l00027"></a>00027 <span class="comment">DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span>
+<a name="l00028"></a>00028 <span class="comment">THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00029"></a>00029 <span class="comment">(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span>
+<a name="l00030"></a>00030 <span class="comment">OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00031"></a>00031 <span class="comment">*/</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#ifndef __r123_compat_gslrng_dot_h__</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#define __r123_compat_gslrng_dot_h__</span>
+<a name="l00034"></a>00034 <span class="preprocessor"></span>
+<a name="l00035"></a>00035 <span class="preprocessor">#include <gsl/gsl_rng.h></span>
+<a name="l00036"></a>00036 <span class="preprocessor">#include <string.h></span>
+<a name="l00037"></a>00037 
+<a name="l00067"></a><a class="code" href="gsl__cbrng_8h.html#af561a004eef8e93cdfd6b255a8a1eb75">00067</a> <span class="preprocessor">#define GSL_CBRNG(NAME, CBRNGNAME)                                      \</span>
+<a name="l00068"></a>00068 <span class="preprocessor">const gsl_rng_type *gsl_rng_##NAME;                                     \</span>
+<a name="l00069"></a>00069 <span class="preprocessor">                                                                        \</span>
+<a name="l00070"></a>00070 <span class="preprocessor">typedef struct{                                                         \</span>
+<a name="l00071"></a>00071 <span class="preprocessor">    CBRNGNAME##_ctr_t ctr;                                                   \</span>
+<a name="l00072"></a>00072 <span class="preprocessor">    CBRNGNAME##_ctr_t r;                                                     \</span>
+<a name="l00073"></a>00073 <span class="preprocessor">    CBRNGNAME##_key_t key;                                                   \</span>
+<a name="l00074"></a>00074 <span class="preprocessor">    int elem;                                                           \</span>
+<a name="l00075"></a>00075 <span class="preprocessor">} NAME##_state;                                                         \</span>
+<a name="l00076"></a>00076 <span class="preprocessor">                                                                        \</span>
+<a name="l00077"></a>00077 <span class="preprocessor">static unsigned long int NAME##_get(void *vstate){                      \</span>
+<a name="l00078"></a>00078 <span class="preprocessor">    NAME##_state *st = (NAME##_state *)vstate;                          \</span>
+<a name="l00079"></a>00079 <span class="preprocessor">    const int N=sizeof(st->ctr.v)/sizeof(st->ctr.v[0]);                 \</span>
+<a name="l00080"></a>00080 <span class="preprocessor">    if( st->elem == 0 ){                                                \</span>
+<a name="l00081"></a>00081 <span class="preprocessor">        ++st->ctr.v[0];                                                 \</span>
+<a name="l00082"></a>00082 <span class="preprocessor">        if( N>1 && st->ctr.v[0] == 0 ) ++st->ctr.v[1];                  \</span>
+<a name="l00083"></a>00083 <span class="preprocessor">        if( N>2 && st->ctr.v[1] == 0 ) ++st->ctr.v[2];                  \</span>
+<a name="l00084"></a>00084 <span class="preprocessor">        if( N>3 && st->ctr.v[2] == 0 ) ++st->ctr.v[3];                  \</span>
+<a name="l00085"></a>00085 <span class="preprocessor">        st->r = CBRNGNAME(st->ctr, st->key);                                 \</span>
+<a name="l00086"></a>00086 <span class="preprocessor">        st->elem = N;                                                   \</span>
+<a name="l00087"></a>00087 <span class="preprocessor">    }                                                                   \</span>
+<a name="l00088"></a>00088 <span class="preprocessor">    return 0xffffffffUL & st->r.v[--st->elem];                          \</span>
+<a name="l00089"></a>00089 <span class="preprocessor">}                                                                       \</span>
+<a name="l00090"></a>00090 <span class="preprocessor">                                                                        \</span>
+<a name="l00091"></a>00091 <span class="preprocessor">static double                                                           \</span>
+<a name="l00092"></a>00092 <span class="preprocessor">NAME##_get_double (void * vstate)                                       \</span>
+<a name="l00093"></a>00093 <span class="preprocessor">{                                                                       \</span>
+<a name="l00094"></a>00094 <span class="preprocessor">    return NAME##_get (vstate)/4294967296.0;                            \</span>
+<a name="l00095"></a>00095 <span class="preprocessor">}                                                                       \</span>
+<a name="l00096"></a>00096 <span class="preprocessor">                                                                        \</span>
+<a name="l00097"></a>00097 <span class="preprocessor">static void NAME##_set(void *vstate, unsigned long int s){              \</span>
+<a name="l00098"></a>00098 <span class="preprocessor">    NAME##_state *st = (NAME##_state *)vstate;                          \</span>
+<a name="l00099"></a>00099 <span class="preprocessor">    st->elem = 0;                                                       \</span>
+<a name="l00100"></a>00100 <span class="preprocessor">    </span><span class="comment">/* Assume that key and ctr have an array member, v,                 \</span>
+<a name="l00101"></a>00101 <span class="comment">       as if they are r123arrayNxW.  If not, this will fail             \</span>
+<a name="l00102"></a>00102 <span class="comment">       to compile.  In particular, this macro fails to compile          \</span>
+<a name="l00103"></a>00103 <span class="comment">       when the underlying CBRNG requires use of keyinit */</span>             \
+<a name="l00104"></a>00104     memset(&st->ctr.v[0], 0, sizeof(st->ctr.v));                        \
+<a name="l00105"></a>00105     memset(&st->key.v[0], 0, sizeof(st->key.v));                        \
+<a name="l00106"></a>00106     <span class="comment">/* GSL 1.15 documentation says this about gsl_rng_set:              \</span>
+<a name="l00107"></a>00107 <span class="comment">         Note that the most generators only accept 32-bit seeds, with higher \</span>
+<a name="l00108"></a>00108 <span class="comment">         values being reduced modulo 2^32.  For generators with smaller \</span>
+<a name="l00109"></a>00109 <span class="comment">         ranges the maximum seed value will typically be lower.         \</span>
+<a name="l00110"></a>00110 <span class="comment">     so we won't jump through any hoops here to deal with               \</span>
+<a name="l00111"></a>00111 <span class="comment">     high bits if sizeof(unsigned long) > sizeof(uint32_t). */</span>          \
+<a name="l00112"></a>00112     st->key.v[0] = s;                                                   \
+<a name="l00113"></a>00113 }                                                                       \
+<a name="l00114"></a>00114                                                                         \
+<a name="l00115"></a>00115 static const gsl_rng_type NAME##_type = {                               \
+<a name="l00116"></a>00116     #NAME,                                                              \
+<a name="l00117"></a>00117     0xffffffffUL,                                                       \
+<a name="l00118"></a>00118     0,                                                                  \
+<a name="l00119"></a>00119     sizeof(NAME##_state),                                               \
+<a name="l00120"></a>00120     &NAME##_set,                                                        \
+<a name="l00121"></a>00121     &NAME##_get,                                                        \
+<a name="l00122"></a>00122     &NAME##_get_double                                                  \
+<a name="l00123"></a>00123 };                                                                      \
+<a name="l00124"></a>00124                                                                         \
+<a name="l00125"></a>00125 const gsl_rng_type *gsl_rng_##NAME = &NAME##_type
+<a name="l00126"></a>00126 
+<a name="l00127"></a>00127 <span class="preprocessor">#endif</span>
+<a name="l00128"></a>00128 <span class="preprocessor"></span>
+</pre></div></div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/gsl__microrng_8h.html b/lib/Random123-1.08/docs/html/gsl__microrng_8h.html
new file mode 100644
index 0000000..dc90cb3
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/gsl__microrng_8h.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/gsl_microrng.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Defines</a>  </div>
+  <div class="headertitle">
+<h1>Random123/gsl_microrng.h File Reference</h1>  </div>
+</div>
+<div class="contents">
+<code>#include <gsl/gsl_rng.h></code><br/>
+<code>#include <string.h></code><br/>
+
+<p><a href="gsl__microrng_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="define-members"></a>
+Defines</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="gsl__microrng_8h.html#a21c7bb64a536a1704c6dc96856b78297">GSL_MICRORNG</a>(NAME, CBRNGNAME)</td></tr>
+</table>
+<hr/><h2>Define Documentation</h2>
+<a class="anchor" id="a21c7bb64a536a1704c6dc96856b78297"></a><!-- doxytag: member="gsl_microrng.h::GSL_MICRORNG" ref="a21c7bb64a536a1704c6dc96856b78297" args="(NAME, CBRNGNAME)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define GSL_MICRORNG</td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname">NAME, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname">CBRNGNAME</td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The macro: <a class="el" href="gsl__microrng_8h.html#a21c7bb64a536a1704c6dc96856b78297">GSL_MICRORNG(NAME, CBRNGNAME)</a> is the GSL analog analog of the C++ <a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG</a> template. It declares a gsl_rng type named gsl_rng_NAME which uses the underlying CBRNGNAME and can be invoked a limited number of times between calls to NAME_reset.</p>
+<p>When the underlying CBRNG's <code>ctr_t</code> is an <a class="el" href="group__arrayNxW.html">r123arrayNxW</a>, and the gsl_rng_NAME may called up to <code>N*2^32</code> times between calls to <code>NAME_reset</code>.</p>
+<p><code>NAME_reset</code> takes a gsl_rng_NAME type, a counter and a key as arguments. It restarts the micro-rng with a new base counter and key.</p>
+<p>Note that you must call NAME_reset before the first use of a gsl_rng. NAME_reset is not called automatically by gsl_rng_alloc().</p>
+<div class="fragment"><pre class="fragment"><span class="preprocessor">   #include <<a class="code" href="threefry_8h.html">Random123/threefry.h</a>></span>
+<span class="preprocessor">   #include <<a class="code" href="gsl__microrng_8h.html">Random123/gsl_microrng.h</a>></span> <span class="comment">// this file</span>
+   <a class="code" href="gsl__microrng_8h.html#a21c7bb64a536a1704c6dc96856b78297">GSL_MICRORNG</a>(microcbrng, <a class="code" href="threefry_8h.html#a992029974a22f14e0ef29a862ede2b8d">threefry4x64</a>, 20)   <span class="comment">// creates gsl_rng_microcbrng</span>
+
+   int main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span>** argv) {
+        gsl_rng *r = gsl_rng_alloc(gsl_rng_microcbrng);
+        <a class="code" href="structr123array4x64.html">threefry4x64_ctr_t</a> c = {{}};
+        <a class="code" href="structr123array4x64.html">threefry4x64_key_t</a> k = {{}};
+
+        <span class="keywordflow">for</span> (...) {
+            c.<a class="code" href="structr123array4x64.html#aae3a18410877c49f1058bc4d78a62f48">v</a>[0] = ??; <span class="comment">//  some application variable</span>
+            microcbrng_reset(r, c, k);
+            <span class="keywordflow">for</span> (...) {
+                <span class="comment">// gaussian calls r several times.  It is safe for</span>
+                <span class="comment">// r to be used upto 2^20 times in this loop</span>
+                something[i] = gsl_ran_gaussian(r, 1.5);
+            }
+        }
+   }
+</pre></div> 
+</div>
+</div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/gsl__microrng_8h_source.html b/lib/Random123-1.08/docs/html/gsl__microrng_8h_source.html
new file mode 100644
index 0000000..d69b182
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/gsl__microrng_8h_source.html
@@ -0,0 +1,171 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/gsl_microrng.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>Random123/gsl_microrng.h</h1>  </div>
+</div>
+<div class="contents">
+<a href="gsl__microrng_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">Copyright 2010-2011, D. E. Shaw Research.</span>
+<a name="l00003"></a>00003 <span class="comment">All rights reserved.</span>
+<a name="l00004"></a>00004 <span class="comment"></span>
+<a name="l00005"></a>00005 <span class="comment">Redistribution and use in source and binary forms, with or without</span>
+<a name="l00006"></a>00006 <span class="comment">modification, are permitted provided that the following conditions are</span>
+<a name="l00007"></a>00007 <span class="comment">met:</span>
+<a name="l00008"></a>00008 <span class="comment"></span>
+<a name="l00009"></a>00009 <span class="comment">* Redistributions of source code must retain the above copyright</span>
+<a name="l00010"></a>00010 <span class="comment">  notice, this list of conditions, and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"></span>
+<a name="l00012"></a>00012 <span class="comment">* Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00013"></a>00013 <span class="comment">  notice, this list of conditions, and the following disclaimer in the</span>
+<a name="l00014"></a>00014 <span class="comment">  documentation and/or other materials provided with the distribution.</span>
+<a name="l00015"></a>00015 <span class="comment"></span>
+<a name="l00016"></a>00016 <span class="comment">* Neither the name of D. E. Shaw Research nor the names of its</span>
+<a name="l00017"></a>00017 <span class="comment">  contributors may be used to endorse or promote products derived from</span>
+<a name="l00018"></a>00018 <span class="comment">  this software without specific prior written permission.</span>
+<a name="l00019"></a>00019 <span class="comment"></span>
+<a name="l00020"></a>00020 <span class="comment">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span>
+<a name="l00021"></a>00021 <span class="comment">"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span>
+<a name="l00022"></a>00022 <span class="comment">LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span>
+<a name="l00023"></a>00023 <span class="comment">A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span>
+<a name="l00024"></a>00024 <span class="comment">OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
+<a name="l00025"></a>00025 <span class="comment">SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span>
+<a name="l00026"></a>00026 <span class="comment">LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span>
+<a name="l00027"></a>00027 <span class="comment">DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span>
+<a name="l00028"></a>00028 <span class="comment">THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00029"></a>00029 <span class="comment">(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span>
+<a name="l00030"></a>00030 <span class="comment">OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00031"></a>00031 <span class="comment">*/</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#ifndef __r123_gslmicrorng_dot_h__</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#define __r123_gslmicrorng_dot_h__</span>
+<a name="l00034"></a>00034 <span class="preprocessor"></span>
+<a name="l00035"></a>00035 
+<a name="l00036"></a>00036 <span class="preprocessor">#include <gsl/gsl_rng.h></span>
+<a name="l00037"></a>00037 <span class="preprocessor">#include <string.h></span>
+<a name="l00038"></a>00038 
+<a name="l00079"></a><a class="code" href="gsl__microrng_8h.html#a21c7bb64a536a1704c6dc96856b78297">00079</a> <span class="preprocessor">#define GSL_MICRORNG(NAME, CBRNGNAME)                                   \</span>
+<a name="l00080"></a>00080 <span class="preprocessor">const gsl_rng_type *gsl_rng_##NAME;                                     \</span>
+<a name="l00081"></a>00081 <span class="preprocessor">                                                                        \</span>
+<a name="l00082"></a>00082 <span class="preprocessor">typedef struct{                                                         \</span>
+<a name="l00083"></a>00083 <span class="preprocessor">    CBRNGNAME##_ctr_t ctr;                                              \</span>
+<a name="l00084"></a>00084 <span class="preprocessor">    CBRNGNAME##_ctr_t r;                                                \</span>
+<a name="l00085"></a>00085 <span class="preprocessor">    CBRNGNAME##_key_t key;                                              \</span>
+<a name="l00086"></a>00086 <span class="preprocessor">    R123_ULONG_LONG n;                                                  \</span>
+<a name="l00087"></a>00087 <span class="preprocessor">    int elem;                                                           \</span>
+<a name="l00088"></a>00088 <span class="preprocessor">} NAME##_state;                                                         \</span>
+<a name="l00089"></a>00089 <span class="preprocessor">                                                                        \</span>
+<a name="l00090"></a>00090 <span class="preprocessor">static unsigned long int NAME##_get(void *vstate){                      \</span>
+<a name="l00091"></a>00091 <span class="preprocessor">    NAME##_state *st = (NAME##_state *)vstate;                          \</span>
+<a name="l00092"></a>00092 <span class="preprocessor">    const int N=sizeof(st->ctr.v)/sizeof(st->ctr.v[0]);                 \</span>
+<a name="l00093"></a>00093 <span class="preprocessor">    if( st->elem == 0 ){                                                \</span>
+<a name="l00094"></a>00094 <span class="preprocessor">        CBRNGNAME##_ctr_t c = st->ctr;                                  \</span>
+<a name="l00095"></a>00095 <span class="preprocessor">        c.v[N-1] |= st->n<<(R123_W(CBRNGNAME##_ctr_t)-32);              \</span>
+<a name="l00096"></a>00096 <span class="preprocessor">        st->n++;                                                        \</span>
+<a name="l00097"></a>00097 <span class="preprocessor">        st->r = CBRNGNAME(c, st->key);                                  \</span>
+<a name="l00098"></a>00098 <span class="preprocessor">        st->elem = N;                                                   \</span>
+<a name="l00099"></a>00099 <span class="preprocessor">    }                                                                   \</span>
+<a name="l00100"></a>00100 <span class="preprocessor">    return 0xffffffff & st->r.v[--st->elem];                            \</span>
+<a name="l00101"></a>00101 <span class="preprocessor">}                                                                       \</span>
+<a name="l00102"></a>00102 <span class="preprocessor">                                                                        \</span>
+<a name="l00103"></a>00103 <span class="preprocessor">static double                                                           \</span>
+<a name="l00104"></a>00104 <span class="preprocessor">NAME##_get_double (void * vstate)                                       \</span>
+<a name="l00105"></a>00105 <span class="preprocessor">{                                                                       \</span>
+<a name="l00106"></a>00106 <span class="preprocessor">    return NAME##_get (vstate)/4294967296.;                             \</span>
+<a name="l00107"></a>00107 <span class="preprocessor">}                                                                       \</span>
+<a name="l00108"></a>00108 <span class="preprocessor">                                                                        \</span>
+<a name="l00109"></a>00109 <span class="preprocessor">static void NAME##_set(void *vstate, unsigned long int s){              \</span>
+<a name="l00110"></a>00110 <span class="preprocessor">    NAME##_state *st = (NAME##_state *)vstate;                          \</span>
+<a name="l00111"></a>00111 <span class="preprocessor">    (void)s; </span><span class="comment">/* ignored */</span>                                              \
+<a name="l00112"></a>00112     st->elem = 0;                                                       \
+<a name="l00113"></a>00113     st->n = ~0; <span class="comment">/* will abort if _reset is not called */</span>                \
+<a name="l00114"></a>00114 }                                                                       \
+<a name="l00115"></a>00115                                                                         \
+<a name="l00116"></a>00116 static const gsl_rng_type NAME##_type = {                               \
+<a name="l00117"></a>00117     #NAME,                                                              \
+<a name="l00118"></a>00118     0xffffffffUL,                                                       \
+<a name="l00119"></a>00119     0,                                                                  \
+<a name="l00120"></a>00120     sizeof(NAME##_state),                                               \
+<a name="l00121"></a>00121     &NAME##_set,                                                        \
+<a name="l00122"></a>00122     &NAME##_get,                                                        \
+<a name="l00123"></a>00123     &NAME##_get_double                                                  \
+<a name="l00124"></a>00124 };                                                                      \
+<a name="l00125"></a>00125                                                                         \
+<a name="l00126"></a>00126 R123_STATIC_INLINE void NAME##_reset(const gsl_rng* gr, CBRNGNAME##_ctr_t c, CBRNGNAME##_key_t k) { \
+<a name="l00127"></a>00127     NAME##_state* state = (NAME##_state *)gr->state;                    \
+<a name="l00128"></a>00128     state->ctr = c;                                                     \
+<a name="l00129"></a>00129     state->key = k;                                                     \
+<a name="l00130"></a>00130     state->n = 0;                                                       \
+<a name="l00131"></a>00131     state->elem = 0;                                                    \
+<a name="l00132"></a>00132 }                                                                       \
+<a name="l00133"></a>00133                                                                         \
+<a name="l00134"></a>00134 const gsl_rng_type *gsl_rng_##NAME = &NAME##_type
+<a name="l00135"></a>00135 
+<a name="l00136"></a>00136 <span class="preprocessor">#endif</span>
+</pre></div></div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/hierarchy.html b/lib/Random123-1.08/docs/html/hierarchy.html
new file mode 100644
index 0000000..b44dfd6
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/hierarchy.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Hierarchical Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li class="current"><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Class Hierarchy</h1>  </div>
+</div>
+<div class="contents">
+This inheritance list is sorted roughly, but not completely, alphabetically:<ul>
+<li><a class="el" href="structr123_1_1AESNI1xm128i.html">r123::AESNI1xm128i</a><ul>
+<li><a class="el" href="structr123_1_1AESNI1xm128i__R.html">r123::AESNI1xm128i_R< ROUNDS ></a></li>
+</ul>
+</li>
+<li><a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a></li>
+<li><a class="el" href="structr123_1_1AESNI4x32.html">r123::AESNI4x32</a><ul>
+<li><a class="el" href="structr123_1_1AESNI4x32__R.html">r123::AESNI4x32_R< ROUNDS ></a></li>
+</ul>
+</li>
+<li><a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i_R< ROUNDS ></a></li>
+<li><a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R< ROUNDS ></a></li>
+<li><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></li>
+<li><a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG< CBRNG ></a></li>
+<li><a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32_R< ROUNDS ></a></li>
+<li><a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64_R< ROUNDS ></a></li>
+<li><a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32_R< ROUNDS ></a></li>
+<li><a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64_R< ROUNDS ></a></li>
+<li><a class="el" href="structr123array16x8.html">r123array16x8</a></li>
+<li><a class="el" href="structr123array1x32.html">r123array1x32</a></li>
+<li><a class="el" href="structr123array1x64.html">r123array1x64</a></li>
+<li><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></li>
+<li><a class="el" href="structr123array2x32.html">r123array2x32</a></li>
+<li><a class="el" href="structr123array2x64.html">r123array2x64</a></li>
+<li><a class="el" href="structr123array4x32.html">r123array4x32</a></li>
+<li><a class="el" href="structr123array4x64.html">r123array4x64</a></li>
+<li><a class="el" href="structr123array8x32.html">r123array8x32</a></li>
+<li><a class="el" href="structr123m128i.html">r123m128i</a></li>
+<li><a class="el" href="structr123_1_1ReinterpretCtr.html">r123::ReinterpretCtr< ToType, CBRNG ></a></li>
+<li><a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32_R< R ></a></li>
+<li><a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64_R< R ></a></li>
+<li><a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32_R< R ></a></li>
+<li><a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64_R< R ></a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/index.html b/lib/Random123-1.08/docs/html/index.html
new file mode 100644
index 0000000..1aa0c23
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/index.html
@@ -0,0 +1,244 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123: a Library of Counter-Based Random Number Generators</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li class="current"><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Random123: a Library of Counter-Based Random Number Generators </h1>  </div>
+</div>
+<div class="contents">
+<p>The Random123 library is a collection of counter-based random number generators (<a class="el" href="CBRNG.html">CBRNGs</a>) for CPUs (C and C++) and GPUs (CUDA and OpenCL), as described in <a href="http://dl.acm.org/citation.cfm?doid=2063405"><em>Parallel Random Numbers: As Easy as 1, 2, 3</em>, Salmon, Moraes, Dror & Shaw, SC11, Seattle, Washington, USA, 2011, ACM </a>. They are intended for use in statistical applications and Monte Carlo simulation and have passed all of the ri [...]
+<p>CBRNGs are as fast as, or faster than conventional RNGs, much easier to parallelize, use minimal memory/cache resources, and require very little code. On modern architectures, the Random123 CBRNGs require a few cycles per byte of random data returned and return random data in convenient sizes (arrays of two or four elements, each element is an unsigned integer of 32 or 64 bits. The range of random numbers is the full representable range of the 32 or 64 bit unsigned integer) The <code> [...]
+<p>The Random123 library was written by John Salmon and Mark Moraes. It is available from <a href="http://deshawresearch.com/resources_random123.html">http://deshawresearch.com/resources_random123.html.</a> Please see the <a class="el" href="LICENSE.html">license</a> for terms and conditions. Please send feedback, including bug reports, suggestions, patches, etc. to <a href="mailto:random123 at deshawresearch.com">random123 at deshawresearch.com</a>.</p>
+<h2><a class="anchor" id="overview"></a>
+Overview</h2>
+<p>Unlike conventional RNGs, counter-based RNGs are <b>stateless</b> functions (or function classes i.e. functors) whose arguments are a <em>counter</em>, and a <em>key</em> and returns a result of the same type as the counter.</p>
+<p>result = CBRNGname(counter, key)</p>
+<p>The returned result is a deterministic function of the key and counter, i.e. a unique (counter, key) tuple will always produce the same result. The result is highly sensitive to small changes in the inputs, so that the sequence of values produced by simply incrementing the counter (or key) is effectively indistinguishable from a sequence of samples of a uniformly distributed random variable.</p>
+<p>For all the CBRNGs in the Random123 library, the result and counter are the same type, specifically an array of <em>N</em> words, where words have a width of <em>W</em> bits, encapsulated in <a class="el" href="group__arrayNxW.html">r123arrayNxW</a> structs, or equivalently, for C++, in the <a class="el" href="namespacer123.html#acc1b0ed919ef806de26f5ff5b934b313">ArrayNxW</a> typedefs in the <a class="el" href="namespacer123.html">r123</a> namespace. Keys are usually also arrayMxW typ [...]
+<p>In C++, all public names (classes, structs, typedefs, etc) are in the <code><a class="el" href="namespacer123.html">r123</a></code> namespace. In C, the public names (functions, enums, structs, typedefs) begin either with <code>r123</code> or with one of the RNG family names, e.g., <code>threefry</code>, <code>philox</code>, <code>ars</code>, <code>aesni</code>. The RNG functions themselves have names like <code>philox4x32</code>. C++ class names are capitalized, e.g., <code>Threefry4 [...]
+<h2><a class="anchor" id="families"></a>
+The different families of Random123 generators</h2>
+<p>Several families of CBRNGs are available in this version of the library: </p>
+<ul>
+<li>
+<a class="el" href="group__ThreefryNxW.html">Threefry</a> is a <b>non-cryptographic</b> adaptation of the Threefish block cipher from the <a href="http://www.skein-hash.info/">Skein Hash Function</a>. See <a class="el" href="group__ThreefryNxW.html#ga1c32939b65f84966c93677f4382ea36d">r123::Threefry2x32</a>, <a class="el" href="group__ThreefryNxW.html#gacb09a2dcfb7389769f0c58f45f132aaa">r123::Threefry4x32</a>, <a class="el" href="group__ThreefryNxW.html#ga2b54dd1b0d20f09239be5f8757f1f3db" [...]
+<li>
+<a class="el" href="group__PhiloxNxW.html">Philox</a> uses a Feistel network and integer multiplication. See <a class="el" href="group__PhiloxNxW.html#ga81659a3ee5a1ca9e2e85c5d725a1ea4f">r123::Philox2x32</a>, <a class="el" href="group__PhiloxNxW.html#gaafd54060af05012db410034e3c0ecdc4">r123::Philox4x32</a>, <a class="el" href="group__PhiloxNxW.html#ga616a669079ac25119353416c14d46426">r123::Philox2x64</a>, <a class="el" href="group__PhiloxNxW.html#ga7776f4d481b7c0ac00db70272a1c77f0">r123: [...]
+<li>
+<a class="el" href="group__AESNI.html">AESNI</a> uses the Advanced Encryption Standard (AES) New Instruction, available on certain modern x86 processors (some models of Intel Westmere and Sandy Bridge, and AMD Interlagos, as of 2011). AESNI CBRNGs can operate on four 32bit words (internally converting them to the 128bit SSE type needed by the AES-NI instructions, or on a single m128i "word", which holds the SSE type. See <a class="el" href="structr123_1_1AESNI4x32.html">r123::AESNI4x32</ [...]
+<li>
+<a class="el" href="group__AESNI.html">ARS</a> (Advanced Randomization System) is a <b>non-cryptographic</b> simplification of <a class="el" href="group__AESNI.html">AESNI</a>. See <a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R</a>, <a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i_R</a>. </li>
+</ul>
+<h2><a class="anchor" id="install"></a>
+Installation and Testing</h2>
+<p>The Random123 library is implemented entirely in header files. Thus, there is nothing to compile before using it and nothing to link after you have <code>#include</code>d it in your source files. Simply direct your C or C++ compiler to find the header files in the <code>include/</code> directory that was unpacked from the distribution tar file and use the Random123 header files, types and functions in your application.</p>
+<p>In addition to the <code>include/</code> files which implement the library the distribution also contains an <code>examples/</code> directory. Users are <b> STRONGLY ADVISED </b> to compile and run the tests in examples/ before using Random123 in an application (see <code> <a class="el" href="ExamplesREADME.html">examples/README</a></code>). Do not use the library if any tests fail. (It is not a failure for a test to report that it cannot run because of missing hardware capabilities l [...]
+<h2><a class="anchor" id="usage"></a>
+Usage</h2>
+<h3><a class="anchor" id="CxxAPI"></a>
+C++ API</h3>
+<p>A typical C++ use case might look like:</p>
+<div class="fragment"><pre class="fragment"><span class="preprocessor">#include <<a class="code" href="philox_8h.html">Random123/philox.h</a>></span>
+
+<span class="keyword">typedef</span> <a class="code" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32</a> RNG;
+RNG rng;
+RNG::ctr_type c={{}};
+RNG::ukey_type uk={{}};
+uk[0] = ???; <span class="comment">// some user_supplied_seed</span>
+RNG::key_type k=uk;
+
+<span class="keywordflow">for</span>(...){
+   c[0] = ???; <span class="comment">// some loop-dependent application variable </span>
+   c[1] = ???; <span class="comment">// another loop-dependent application variable </span>
+   RNG::ctr_type r = rng(c, k);
+   <span class="comment">// use the random values in r for some operation related to</span>
+   <span class="comment">// this iteration on objectid</span>
+}
+</pre></div><p>On each iteration,<code>r</code> contains an array of 4 32-bit random values that will not be repeated by any other call to <code>rng</code> as long as <code>c</code> and <code>k</code> are not reused.</p>
+<p>In the example above, we use the <a class="el" href="group__PhiloxNxW.html#gaafd54060af05012db410034e3c0ecdc4">r123::Philox4x32</a>, but any of the other <a class="el" href="CBRNG.html">CBRNGs</a> would serve equally well. Also note that for most CBRNGs, the ukey_type and the key_type are identical; the code could just as well ignore the ukey_type and directly construct the key_type. However, for the <a class="el" href="group__AESNI.html">AESNI</a> CBRNGs, the key_type is opaque, and  [...]
+<h3><a class="anchor" id="Capi"></a>
+The C API</h3>
+<p>In C, the example above could be written as: </p>
+<div class="fragment"><pre class="fragment"><span class="preprocessor">#include <<a class="code" href="philox_8h.html">Random123/philox.h</a>></span>
+
+<a class="code" href="structr123array4x32.html">philox4x32_ctr_t</a> c={{}};
+<a class="code" href="structr123array2x32.html">philox4x32_ukey_t</a> uk={{}};
+
+uk.<a class="code" href="structr123array2x32.html#a65524bf06568073021117ef196d6b45f">v</a>[0] = user_supplied_seed;
+<a class="code" href="structr123array2x32.html">philox4x32_key_t</a> k = <a class="code" href="philox_8h.html#a5a012bb440c039eda46802b447c31851">philox4x32keyinit</a>(uk);
+
+<span class="keywordflow">for</span>(...){
+    c.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a>[0] = ???; <span class="comment">/* some loop-dependent application variable */</span>
+    c.<a class="code" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a>[1] = ???; <span class="comment">/* another loop-dependent application variable */</span>
+    <a class="code" href="structr123array4x32.html">philox4x32_ctr_t</a> r = <a class="code" href="philox_8h.html#a432a3df828dd51acd0b7ec2fee1d4d7e">philox4x32</a>(c, k);
+}
+</pre></div><p>In C, access to the contents of the counter and key is through the fixed-size array member <code>v</code>.</p>
+<h2><a class="anchor" id="cuda"></a>
+The CUDA platform</h2>
+<p>All relevant functions in the C and C++ APIs for Random123 are declared as CUDA device functions if they are included in a CUDA kernel source file and compiled with a CUDA compiler (nvcc). They can be used exactly as described/documented for regular C or C++ programs. Note that CUDA device functions and host functions share the same namespace, so it is not currently possible to use Random123 functions in both the host portion and the device portion of the same .cu source file. To work [...]
+<p>It has been reported that Random123 uses 16 bytes of static memory per thread. This is undesirable and not intentional, but we do not have a workaround other than to suggest adjusting memory allocation accordingly.</p>
+<p>The pi_cuda.cu and pi_cudapp.cu examples illustrate the use of CUDA.</p>
+<h2><a class="anchor" id="opencl"></a>
+The OpenCL platform</h2>
+<p>The functions in the Random123 C API can all be used in OpenCL kernels, just as in regular C functions. As with CUDA, the Nx32 forms are faster than the Nx64 variants on current (2011) 32-bit GPU architectures.</p>
+<p>The pi_opencl.c and pi_opencl_kernel.ocl examples illustrate the use of OpenCL.</p>
+<h2><a class="anchor" id="cplusplus0x"></a>
+C++0X <random> interface</h2>
+<p>In addition to the stateless ("pure/functional") C++ API above, the Random123 package includes two C++ classes that leverage the C++0X <random> API.</p>
+<ul>
+<li>
+<a class="el" href="classr123_1_1MicroURNG.html">r123::MicroURNG</a> provides an adapter class that provides a more conventional interface compatible with the C++0X URNG (uniform random number generator) API; the MicroURNG adapter can be used with C++0x random number distributions and is fast/lightweight enough that a new MicroURNG can be instantiated with a unique key,counter tuple and used for each call to a distribution, there is little or no overhead to creating billions of unique Mi [...]
+<li>
+<a class="el" href="structr123_1_1Engine.html">r123::Engine</a> provides the C++0x Random Engine API. This can also be used with any of the C++0X random distributions, but sacrifices the application control over RNG state that is a defining characteristic of CBRNGs. </li>
+</ul>
+<h2><a class="anchor" id="gsl"></a>
+The GNU Scientific Library (GSL) interface</h2>
+<p>In addition to the stateless ("pure/functional") C API above, the Random123 package includes two C adapter interfaces to the <a href="http://www.gnu.org/s/gsl/">GNU Scientific Library (GSL).</a></p>
+<ul>
+<li>
+The <a class="el" href="gsl__microrng_8h.html#a21c7bb64a536a1704c6dc96856b78297">GSL_MICRORNG</a> macro allows the application to define a GSL random number generator. It can be used with GSL random distributions but still provides the application with complete control over the RNG state (it is analogous to the MicroURNG class, in that it uses shorter periods, and is intended to be instantiated in large numbers for a few calls to the random distribution). </li>
+<li>
+The <a class="el" href="gsl__cbrng_8h.html#af561a004eef8e93cdfd6b255a8a1eb75">GSL_CBRNG</a> macro allows the application to create a GSL RNG with a completely conventional interface, sacrificing application control over the internal RNG state. </li>
+</ul>
+<h2><a class="anchor" id="u01"></a>
+Generating uniformly distributed and Gaussian distributed floats and doubles</h2>
+<p>The Random123 library provides generators for uniformly distributed random <b>integers</b>. Often, applications want random <b>real</b> values or samples from other distributions. The general problem of generating samples from arbitrary distributions is beyond the scope of the Random123 library. One can, of course, use GSL or MicroURNG and the distributions in the C++11 <random> library, but a few simple cases are common enough that all that extra machinery seems like overkill.  [...]
+<ul>
+<li>
+examples/uniform.hpp - C++ functions that convert random integers to random, uniformly distributed floating point values. </li>
+<li>
+examples/u01fixedpt.h - C functions that convert random integers to random, uniformly distributed, equi-spaced, i.e., fixed point, values. </li>
+<li>
+examples/ua.hpp - C++11 functions that convert r123arrays of uniformly distributed integers into std::arrays of uniformly distributed floating point types. The return type is std::array because it is far easier, with template logic, to return a std::array of the correct size than an r123array of the correct size. </li>
+<li>
+examples/boxmuller.hpp - C++ functions that take two uniformly distributed integers (32 or 64 bit) and return a pair of Gaussian distributed floats or doubles. </li>
+</ul>
+<p>The Box-Muller method of generating Gaussian random variables is particularly well suited to Random123 because it deterministically consumes exactly two uniform randoms to generate exactly two gaussian randoms. It uses math library functions: sincos, log and sqrt which may be slow on some platforms, but which are surprisingly fast on others. Notably, on GPUs, the lack of branching in the Box-Muller method and hardware support for math functions overcomes the transcendental function ov [...]
+<h3><a class="anchor" id="Examples"></a>
+Tests and Benchmarks</h3>
+<p>The <a class="el" href="ExamplesREADME.html">examples/</a> directory, contains tests, examples and benchmarks.</p>
+<ul>
+<li>
+Unit tests for individual components and "known-answer-tests", which should be run to ensure that these RNGs build correctly on desired platforms. These help to provide assurance that the code is being compiled correctly. </li>
+<li>
+Complete, short programs estimate pi by counting the number of random points that fall inside a circle inscribed in a square, demonstrating the C, C++, AES, GSL, OpenCL, CUDA and C++0x APIs. </li>
+<li>
+Header files, including uniform.hpp, ufixed01.h, ua.hpp, and boxmuller.hpp containing code that users may find useful but that are outside the scope of the Random123 library itself. </li>
+<li>
+Some highly abstracted timing harnesses are provided which measure performance of a variety of generators in different programming environments. </li>
+</ul>
+<h2><a class="anchor" id="portability"></a>
+Portability</h2>
+<p>Although we have done our best to make Random123 portable and standards conforming, it is an unfortunate fact that there is no portable code. There is only code that has been ported. We have tested the Random123 library with the following infrastructure</p>
+<ul>
+<li>
+Linux, gcc (multiple versions from 3.4.3 through 4.8.1), on x86_64. </li>
+<li>
+Linux, clang-2.9, 3.0, 3.1 and 3.3 on x86_64. </li>
+<li>
+Linux, clang-3.0 and 3.1 with lib++ (2012-04-19 svn checkout) on x86_64. </li>
+<li>
+Linux, open64-4.2.4 on x86_64. </li>
+<li>
+Linux, Intel icc and icpc 12.0.2 on x86_64. </li>
+<li>
+Linux, OpenCL (NVIDIA SDK 4.0.17) on GTX480, M2090, GTX580 and GTX680 GPUs. </li>
+<li>
+Linux, OpenCL (AMD APP SDK 2.4 or 2.5), on x86_64 CPUs and Radeon HD6970 GPUs. </li>
+<li>
+Linux, OpenCL (Intel OpenCL 1.5), on x86_64 CPUs. </li>
+<li>
+Linux, NVIDIA CUDA 4.1.15, 4.2.6 and 5.5.22. (NOTE: We recommend against the use of CUDA before 4.1) </li>
+<li>
+Linux, gcc-4.1.2 and 4.4.1 on x86. </li>
+<li>
+Solaris, both gcc-3.4.3 and Sun C/C++ 5.8, on x86_64. </li>
+<li>
+FreeBSD 8.2, gcc-4.2.1, on x86_64. </li>
+<li>
+MacOS X 5.8, gcc-4.0.1, on x86. </li>
+<li>
+MacOS X 5.8, llvm-2.9.1 on x86 (problems with catching C++ exceptions). </li>
+<li>
+Windows 7, Microsoft Visual Studio, version 10.0, Microsoft C/C++ compiler 16.00. </li>
+</ul>
+<p>Others have reported success on </p>
+<ul>
+<li>
+MacOS, OpenCL on x86_64 CPUs </li>
+<li>
+Linux, gcc-4.7.2 on Powerpc64 (BlueGene/Q) </li>
+<li>
+Linux, Portland Group Compiler on Powerpc64 (BlueGene/Q) </li>
+<li>
+Linux, IBM xlc on Powerpc64 (BlueGene/Q) </li>
+</ul>
+<p>We welcome feedback to <a href="mailto:random123 at deshawresearch.com">random123 at deshawresearch.com</a> about ports to other environments.</p>
+<p>We are grateful for contributions from the following users: </p>
+<ul>
+<li>
+Geoffrey Irving and Gabriel Rockefeller - BlueGene/Q and powerpc ports </li>
+<li>
+Yan Zhou - MacOS and clang ports </li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/installdox b/lib/Random123-1.08/docs/html/installdox
new file mode 100755
index 0000000..2697a81
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/installdox
@@ -0,0 +1,117 @@
+#!/usr/bin/perl
+
+%subst = ( );
+$quiet   = 0;
+
+if (open(F,"search.cfg"))
+{
+  $_=<F> ; s/[ \t\n]*$//g ; $subst{"_doc"} = $_;
+  $_=<F> ; s/[ \t\n]*$//g ; $subst{"_cgi"} = $_;
+}
+
+while ( @ARGV ) {
+  $_ = shift @ARGV;
+  if ( s/^-// ) {
+    if ( /^l(.*)/ ) {
+      $v = ($1 eq "") ? shift @ARGV : $1;
+      ($v =~ /\/$/) || ($v .= "/");
+      $_ = $v;
+      if ( /(.+)\@(.+)/ ) {
+        if ( exists $subst{$1} ) {
+          $subst{$1} = $2;
+        } else {
+          print STDERR "Unknown tag file $1 given with option -l\n";
+          &usage();
+        }
+      } else {
+        print STDERR "Argument $_ is invalid for option -l\n";
+        &usage();
+      }
+    }
+    elsif ( /^q/ ) {
+      $quiet = 1;
+    }
+    elsif ( /^\?|^h/ ) {
+      &usage();
+    }
+    else {
+      print STDERR "Illegal option -$_\n";
+      &usage();
+    }
+  }
+  else {
+    push (@files, $_ );
+  }
+}
+
+foreach $sub (keys %subst)
+{
+  if ( $subst{$sub} eq "" ) 
+  {
+    print STDERR "No substitute given for tag file `$sub'\n";
+    &usage();
+  }
+  elsif ( ! $quiet && $sub ne "_doc" && $sub ne "_cgi" )
+  {
+    print "Substituting $subst{$sub} for each occurrence of tag file $sub\n"; 
+  }
+}
+
+if ( ! @files ) {
+  if (opendir(D,".")) {
+    foreach $file ( readdir(D) ) {
+      $match = ".html";
+      next if ( $file =~ /^\.\.?$/ );
+      ($file =~ /$match/) && (push @files, $file);
+      ($file =~ "tree.js") && (push @files, $file);
+    }
+    closedir(D);
+  }
+}
+
+if ( ! @files ) {
+  print STDERR "Warning: No input files given and none found!\n";
+}
+
+foreach $f (@files)
+{
+  if ( ! $quiet ) {
+    print "Editing: $f...\n";
+  }
+  $oldf = $f;
+  $f   .= ".bak";
+  unless (rename $oldf,$f) {
+    print STDERR "Error: cannot rename file $oldf\n";
+    exit 1;
+  }
+  if (open(F,"<$f")) {
+    unless (open(G,">$oldf")) {
+      print STDERR "Error: opening file $oldf for writing\n";
+      exit 1;
+    }
+    if ($oldf ne "tree.js") {
+      while (<F>) {
+        s/doxygen\=\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\" (href|src)=\"\2/doxygen\=\"$1:$subst{$1}\" \3=\"$subst{$1}/g;
+        print G "$_";
+      }
+    }
+    else {
+      while (<F>) {
+        s/\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\", \"\2/\"$1:$subst{$1}\" ,\"$subst{$1}/g;
+        print G "$_";
+      }
+    }
+  } 
+  else {
+    print STDERR "Warning file $f does not exist\n";
+  }
+  unlink $f;
+}
+
+sub usage {
+  print STDERR "Usage: installdox [options] [html-file [html-file ...]]\n";
+  print STDERR "Options:\n";
+  print STDERR "     -l tagfile\@linkName   tag file + URL or directory \n";
+  print STDERR "     -q                    Quiet mode\n\n";
+  exit 1;
+}
diff --git a/lib/Random123-1.08/docs/html/main_8dox.html b/lib/Random123-1.08/docs/html/main_8dox.html
new file mode 100644
index 0000000..4c96119
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/main_8dox.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: docs/main.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/main.dox File Reference</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+</table>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/modules.html b/lib/Random123-1.08/docs/html/modules.html
new file mode 100644
index 0000000..18a1ce0
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/modules.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Module Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Modules</h1>  </div>
+</div>
+<div class="contents">
+Here is a list of all modules:<ul>
+<li><a class="el" href="group__AESNI.html">ARS and AESNI Classes and Typedefs</a></li>
+<li><a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a></li>
+<li><a class="el" href="group__PhiloxNxW.html">Philox Classes and Typedefs</a></li>
+<li><a class="el" href="group__ThreefryNxW.html">Threefry Classes and Typedefs</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/namespacemembers.html b/lib/Random123-1.08/docs/html/namespacemembers.html
new file mode 100644
index 0000000..964baf3
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/namespacemembers.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="namespaces.html"><span>Namespace List</span></a></li>
+      <li class="current"><a href="namespacemembers.html"><span>Namespace Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="namespacemembers.html"><span>All</span></a></li>
+      <li><a href="namespacemembers_type.html"><span>Typedefs</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all namespace members with links to the namespace documentation for each member:<ul>
+<li>Array16x8
+: <a class="el" href="namespacer123.html#ac3148aed79e81051d40e9b29a8914cf4">r123</a>
+</li>
+<li>Array1x32
+: <a class="el" href="namespacer123.html#acc1b0ed919ef806de26f5ff5b934b313">r123</a>
+</li>
+<li>Array1x64
+: <a class="el" href="namespacer123.html#aeb81c4265759fad9993e09fda21ff4fa">r123</a>
+</li>
+<li>Array1xm128i
+: <a class="el" href="namespacer123.html#adbb729a97ee41e7cb075058b55a58c5d">r123</a>
+</li>
+<li>Array2x32
+: <a class="el" href="namespacer123.html#ab853ac55f8188e4a09d12ab23f2d8dea">r123</a>
+</li>
+<li>Array2x64
+: <a class="el" href="namespacer123.html#ad3b670563762f605a6fce61b5bab8412">r123</a>
+</li>
+<li>Array4x32
+: <a class="el" href="namespacer123.html#a0c352c3ea265e7fd182559e557113195">r123</a>
+</li>
+<li>Array4x64
+: <a class="el" href="namespacer123.html#a54c1a72670974c11acff37279eb23147">r123</a>
+</li>
+<li>Array8x32
+: <a class="el" href="namespacer123.html#aea31cf23efbfcc11808b7e394922f4d2">r123</a>
+</li>
+<li>ARS1xm128i
+: <a class="el" href="namespacer123.html#a964aa9123913d1f8cf535e0caaa4155f">r123</a>
+</li>
+<li>ARS4x32
+: <a class="el" href="namespacer123.html#afd2070dc979024a14317bd57c3a4c352">r123</a>
+</li>
+<li>Philox2x32
+: <a class="el" href="group__PhiloxNxW.html#ga81659a3ee5a1ca9e2e85c5d725a1ea4f">r123</a>
+</li>
+<li>Philox2x64
+: <a class="el" href="group__PhiloxNxW.html#ga616a669079ac25119353416c14d46426">r123</a>
+</li>
+<li>Philox4x32
+: <a class="el" href="group__PhiloxNxW.html#gaafd54060af05012db410034e3c0ecdc4">r123</a>
+</li>
+<li>Philox4x64
+: <a class="el" href="group__PhiloxNxW.html#ga7776f4d481b7c0ac00db70272a1c77f0">r123</a>
+</li>
+<li>Threefry2x32
+: <a class="el" href="group__ThreefryNxW.html#ga1c32939b65f84966c93677f4382ea36d">r123</a>
+</li>
+<li>Threefry2x64
+: <a class="el" href="group__ThreefryNxW.html#ga2b54dd1b0d20f09239be5f8757f1f3db">r123</a>
+</li>
+<li>Threefry4x32
+: <a class="el" href="group__ThreefryNxW.html#gacb09a2dcfb7389769f0c58f45f132aaa">r123</a>
+</li>
+<li>Threefry4x64
+: <a class="el" href="group__ThreefryNxW.html#gae17c98bddf067365508ed0717f865e8b">r123</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/namespacemembers_type.html b/lib/Random123-1.08/docs/html/namespacemembers_type.html
new file mode 100644
index 0000000..c5c89fe
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/namespacemembers_type.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="namespaces.html"><span>Namespace List</span></a></li>
+      <li class="current"><a href="namespacemembers.html"><span>Namespace Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="namespacemembers.html"><span>All</span></a></li>
+      <li class="current"><a href="namespacemembers_type.html"><span>Typedefs</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+ <ul>
+<li>Array16x8
+: <a class="el" href="namespacer123.html#ac3148aed79e81051d40e9b29a8914cf4">r123</a>
+</li>
+<li>Array1x32
+: <a class="el" href="namespacer123.html#acc1b0ed919ef806de26f5ff5b934b313">r123</a>
+</li>
+<li>Array1x64
+: <a class="el" href="namespacer123.html#aeb81c4265759fad9993e09fda21ff4fa">r123</a>
+</li>
+<li>Array1xm128i
+: <a class="el" href="namespacer123.html#adbb729a97ee41e7cb075058b55a58c5d">r123</a>
+</li>
+<li>Array2x32
+: <a class="el" href="namespacer123.html#ab853ac55f8188e4a09d12ab23f2d8dea">r123</a>
+</li>
+<li>Array2x64
+: <a class="el" href="namespacer123.html#ad3b670563762f605a6fce61b5bab8412">r123</a>
+</li>
+<li>Array4x32
+: <a class="el" href="namespacer123.html#a0c352c3ea265e7fd182559e557113195">r123</a>
+</li>
+<li>Array4x64
+: <a class="el" href="namespacer123.html#a54c1a72670974c11acff37279eb23147">r123</a>
+</li>
+<li>Array8x32
+: <a class="el" href="namespacer123.html#aea31cf23efbfcc11808b7e394922f4d2">r123</a>
+</li>
+<li>ARS1xm128i
+: <a class="el" href="namespacer123.html#a964aa9123913d1f8cf535e0caaa4155f">r123</a>
+</li>
+<li>ARS4x32
+: <a class="el" href="namespacer123.html#afd2070dc979024a14317bd57c3a4c352">r123</a>
+</li>
+<li>Philox2x32
+: <a class="el" href="group__PhiloxNxW.html#ga81659a3ee5a1ca9e2e85c5d725a1ea4f">r123</a>
+</li>
+<li>Philox2x64
+: <a class="el" href="group__PhiloxNxW.html#ga616a669079ac25119353416c14d46426">r123</a>
+</li>
+<li>Philox4x32
+: <a class="el" href="group__PhiloxNxW.html#gaafd54060af05012db410034e3c0ecdc4">r123</a>
+</li>
+<li>Philox4x64
+: <a class="el" href="group__PhiloxNxW.html#ga7776f4d481b7c0ac00db70272a1c77f0">r123</a>
+</li>
+<li>Threefry2x32
+: <a class="el" href="group__ThreefryNxW.html#ga1c32939b65f84966c93677f4382ea36d">r123</a>
+</li>
+<li>Threefry2x64
+: <a class="el" href="group__ThreefryNxW.html#ga2b54dd1b0d20f09239be5f8757f1f3db">r123</a>
+</li>
+<li>Threefry4x32
+: <a class="el" href="group__ThreefryNxW.html#gacb09a2dcfb7389769f0c58f45f132aaa">r123</a>
+</li>
+<li>Threefry4x64
+: <a class="el" href="group__ThreefryNxW.html#gae17c98bddf067365508ed0717f865e8b">r123</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/namespacer123.html b/lib/Random123-1.08/docs/html/namespacer123.html
new file mode 100644
index 0000000..af02d32
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/namespacer123.html
@@ -0,0 +1,275 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123 Namespace Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="namespaces.html"><span>Namespace List</span></a></li>
+      <li><a href="namespacemembers.html"><span>Namespace Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> |
+<a href="#typedef-members">Typedefs</a>  </div>
+  <div class="headertitle">
+<h1>r123 Namespace Reference</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI1xm128i.html">AESNI1xm128i</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI4x32.html">AESNI4x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI1xm128i__R.html">AESNI1xm128i_R</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI4x32__R.html">AESNI4x32_R</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ARS1xm128i__R.html">ARS1xm128i_R</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ARS4x32__R.html">ARS4x32_R</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classr123_1_1MicroURNG.html">MicroURNG</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox2x32__R.html">Philox2x32_R</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox4x32__R.html">Philox4x32_R</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox2x64__R.html">Philox2x64_R</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox4x64__R.html">Philox4x64_R</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ReinterpretCtr.html">ReinterpretCtr</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry2x32__R.html">Threefry2x32_R</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry4x32__R.html">Threefry4x32_R</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry2x64__R.html">Threefry2x64_R</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry4x64__R.html">Threefry4x64_R</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html">Engine</a></td></tr>
+<tr><td colspan="2"><h2><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array1x32.html">r123array1x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#acc1b0ed919ef806de26f5ff5b934b313">Array1x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x32.html">r123array2x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#ab853ac55f8188e4a09d12ab23f2d8dea">Array2x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#a0c352c3ea265e7fd182559e557113195">Array4x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array8x32.html">r123array8x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#aea31cf23efbfcc11808b7e394922f4d2">Array8x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array1x64.html">r123array1x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#aeb81c4265759fad9993e09fda21ff4fa">Array1x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x64.html">r123array2x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#ad3b670563762f605a6fce61b5bab8412">Array2x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x64.html">r123array4x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#a54c1a72670974c11acff37279eb23147">Array4x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array16x8.html">r123array16x8</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#ac3148aed79e81051d40e9b29a8914cf4">Array16x8</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#adbb729a97ee41e7cb075058b55a58c5d">Array1xm128i</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123_1_1ARS1xm128i__R.html">ARS1xm128i_R</a><br class="typebreak"/>
+< ars1xm128i_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#a964aa9123913d1f8cf535e0caaa4155f">ARS1xm128i</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123_1_1ARS4x32__R.html">ARS4x32_R</a>< ars4x32_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html#afd2070dc979024a14317bd57c3a4c352">ARS4x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123_1_1Philox2x32__R.html">Philox2x32_R</a><br class="typebreak"/>
+< philox2x32_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#ga81659a3ee5a1ca9e2e85c5d725a1ea4f">Philox2x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123_1_1Philox4x32__R.html">Philox4x32_R</a><br class="typebreak"/>
+< philox4x32_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#gaafd54060af05012db410034e3c0ecdc4">Philox4x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123_1_1Philox2x64__R.html">Philox2x64_R</a><br class="typebreak"/>
+< philox2x64_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#ga616a669079ac25119353416c14d46426">Philox2x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123_1_1Philox4x64__R.html">Philox4x64_R</a><br class="typebreak"/>
+< philox4x64_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#ga7776f4d481b7c0ac00db70272a1c77f0">Philox4x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123_1_1Threefry2x32__R.html">Threefry2x32_R</a><br class="typebreak"/>
+< threefry2x32_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#ga1c32939b65f84966c93677f4382ea36d">Threefry2x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123_1_1Threefry4x32__R.html">Threefry4x32_R</a><br class="typebreak"/>
+< threefry4x32_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#gacb09a2dcfb7389769f0c58f45f132aaa">Threefry4x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123_1_1Threefry2x64__R.html">Threefry2x64_R</a><br class="typebreak"/>
+< threefry2x64_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#ga2b54dd1b0d20f09239be5f8757f1f3db">Threefry2x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123_1_1Threefry4x64__R.html">Threefry4x64_R</a><br class="typebreak"/>
+< threefry4x64_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#gae17c98bddf067365508ed0717f865e8b">Threefry4x64</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>Most of the Random123 C++ API is contained in the <a class="el" href="namespacer123.html">r123</a> namespace.</p>
+<hr/><h2>Typedef Documentation</h2>
+<a class="anchor" id="ac3148aed79e81051d40e9b29a8914cf4"></a><!-- doxytag: member="r123::Array16x8" ref="ac3148aed79e81051d40e9b29a8914cf4" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array16x8.html">r123array16x8</a> <a class="el" href="structr123array16x8.html">r123::Array16x8</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acc1b0ed919ef806de26f5ff5b934b313"></a><!-- doxytag: member="r123::Array1x32" ref="acc1b0ed919ef806de26f5ff5b934b313" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array1x32.html">r123array1x32</a> <a class="el" href="structr123array1x32.html">r123::Array1x32</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aeb81c4265759fad9993e09fda21ff4fa"></a><!-- doxytag: member="r123::Array1x64" ref="aeb81c4265759fad9993e09fda21ff4fa" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array1x64.html">r123array1x64</a> <a class="el" href="structr123array1x64.html">r123::Array1x64</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adbb729a97ee41e7cb075058b55a58c5d"></a><!-- doxytag: member="r123::Array1xm128i" ref="adbb729a97ee41e7cb075058b55a58c5d" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> <a class="el" href="structr123array1xm128i.html">r123::Array1xm128i</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab853ac55f8188e4a09d12ab23f2d8dea"></a><!-- doxytag: member="r123::Array2x32" ref="ab853ac55f8188e4a09d12ab23f2d8dea" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array2x32.html">r123array2x32</a> <a class="el" href="structr123array2x32.html">r123::Array2x32</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad3b670563762f605a6fce61b5bab8412"></a><!-- doxytag: member="r123::Array2x64" ref="ad3b670563762f605a6fce61b5bab8412" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array2x64.html">r123array2x64</a> <a class="el" href="structr123array2x64.html">r123::Array2x64</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0c352c3ea265e7fd182559e557113195"></a><!-- doxytag: member="r123::Array4x32" ref="a0c352c3ea265e7fd182559e557113195" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array4x32.html">r123array4x32</a> <a class="el" href="structr123array4x32.html">r123::Array4x32</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a54c1a72670974c11acff37279eb23147"></a><!-- doxytag: member="r123::Array4x64" ref="a54c1a72670974c11acff37279eb23147" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array4x64.html">r123array4x64</a> <a class="el" href="structr123array4x64.html">r123::Array4x64</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aea31cf23efbfcc11808b7e394922f4d2"></a><!-- doxytag: member="r123::Array8x32" ref="aea31cf23efbfcc11808b7e394922f4d2" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array8x32.html">r123array8x32</a> <a class="el" href="structr123array8x32.html">r123::Array8x32</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a964aa9123913d1f8cf535e0caaa4155f"></a><!-- doxytag: member="r123::ARS1xm128i" ref="a964aa9123913d1f8cf535e0caaa4155f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123_1_1ARS1xm128i__R.html">ARS1xm128i_R</a><ars1xm128i_rounds> <a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afd2070dc979024a14317bd57c3a4c352"></a><!-- doxytag: member="r123::ARS4x32" ref="afd2070dc979024a14317bd57c3a4c352" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123_1_1ARS4x32__R.html">ARS4x32_R</a><ars4x32_rounds> <a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/namespaces.html b/lib/Random123-1.08/docs/html/namespaces.html
new file mode 100644
index 0000000..cc4b8fc
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/namespaces.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Namespace Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="namespaces.html"><span>Namespace List</span></a></li>
+      <li><a href="namespacemembers.html"><span>Namespace Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Namespace List</h1>  </div>
+</div>
+<div class="contents">
+Here is a list of all namespaces with brief descriptions:<table>
+  <tr><td class="indexkey"><a class="el" href="namespacer123.html">r123</a></td><td class="indexvalue"></td></tr>
+</table>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/nav_f.png b/lib/Random123-1.08/docs/html/nav_f.png
new file mode 100644
index 0000000..1b07a16
Binary files /dev/null and b/lib/Random123-1.08/docs/html/nav_f.png differ
diff --git a/lib/Random123-1.08/docs/html/nav_h.png b/lib/Random123-1.08/docs/html/nav_h.png
new file mode 100644
index 0000000..01f5fa6
Binary files /dev/null and b/lib/Random123-1.08/docs/html/nav_h.png differ
diff --git a/lib/Random123-1.08/docs/html/open.png b/lib/Random123-1.08/docs/html/open.png
new file mode 100644
index 0000000..7b35d2c
Binary files /dev/null and b/lib/Random123-1.08/docs/html/open.png differ
diff --git a/lib/Random123-1.08/docs/html/pages.html b/lib/Random123-1.08/docs/html/pages.html
new file mode 100644
index 0000000..1216bdd
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/pages.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Page Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li class="current"><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Related Pages</h1>  </div>
+</div>
+<div class="contents">
+Here is a list of all related documentation pages:<ul>
+<li><a class="el" href="CBRNG.html">Counter Based RNGs (CBRNGs).</a>
+</li>
+<li><a class="el" href="Release_01Notes.html">Release Notes</a>
+</li>
+<li><a class="el" href="porting.html">Preprocessor symbols for porting Random123 to different platforms.</a>
+</li>
+<li><a class="el" href="ExamplesREADME.html">Examples, Tests and Benchmarks</a>
+</li>
+<li><a class="el" href="LICENSE.html">LICENSE</a>
+</li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/philox_8h.html b/lib/Random123-1.08/docs/html/philox_8h.html
new file mode 100644
index 0000000..1cd5dd9
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/philox_8h.html
@@ -0,0 +1,617 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/philox.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> |
+<a href="#namespaces">Namespaces</a> |
+<a href="#define-members">Defines</a> |
+<a href="#typedef-members">Typedefs</a> |
+<a href="#enum-members">Enumerations</a> |
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<h1>Random123/philox.h File Reference</h1>  </div>
+</div>
+<div class="contents">
+<code>#include "<a class="el" href="compilerfeatures_8h_source.html">features/compilerfeatures.h</a>"</code><br/>
+<code>#include "<a class="el" href="array_8h_source.html">array.h</a>"</code><br/>
+<code>#include <stdexcept></code><br/>
+
+<p><a href="philox_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32_R< ROUNDS ></a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32_R< ROUNDS ></a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64_R< ROUNDS ></a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64_R< ROUNDS ></a></td></tr>
+<tr><td colspan="2"><h2><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html">r123</a></td></tr>
+<tr><td colspan="2"><h2><a name="define-members"></a>
+Defines</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#ab2496424917f063a4990f01943a07fe0">philox2x32</a>(c, k)   philox2x32_R(philox2x32_rounds, c, k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#a432a3df828dd51acd0b7ec2fee1d4d7e">philox4x32</a>(c, k)   philox4x32_R(philox4x32_rounds, c, k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#ae6b57a71e4efa369cc19416fc088b5a5">philox2x64</a>(c, k)   philox2x64_R(philox2x64_rounds, c, k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#a62fb1b4d9775396303ebb2a801fea8e6">philox4x64</a>(c, k)   philox4x64_R(philox4x64_rounds, c, k)</td></tr>
+<tr><td colspan="2"><h2><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array2x32.html">r123array2x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#a5fad831cdbd677bc6e53d37c0191f5e3">philox2x32_ctr_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array1x32.html">r123array1x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#a55c0e4adeab3387915f966a0e40dc036">philox2x32_key_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array1x32.html">r123array1x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#abf96b0e95504989c58e6d3436b013a6b">philox2x32_ukey_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#a96f2a94ebcd7aba28aaeb0aba6543d2d">philox4x32_ctr_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array2x32.html">r123array2x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#ab1e74b78fcee751b43739b2b4415c592">philox4x32_key_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array2x32.html">r123array2x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#a82e1d60f98bfbb600bde2bd939de4573">philox4x32_ukey_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array2x64.html">r123array2x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#a33fa626a4198f38d87713ae9504e53f2">philox2x64_ctr_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array1x64.html">r123array1x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#a190087c2584155a936ec7d7b9e8d7f34">philox2x64_key_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array1x64.html">r123array1x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#a419cc7ebdeeaa1fc8249c638eac3d00b">philox2x64_ukey_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x64.html">r123array4x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#a4d2063cc89bf13153ddeff0d94371986">philox4x64_ctr_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array2x64.html">r123array2x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#a0c8c9410e9d88d4c94e8093007e39b0c">philox4x64_key_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array2x64.html">r123array2x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#a689ed8276d25fe0c983c4eb5b9a32fd4">philox4x64_ukey_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef Philox2x32_R<br class="typebreak"/>
+< philox2x32_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#ga81659a3ee5a1ca9e2e85c5d725a1ea4f">r123::Philox2x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef Philox4x32_R<br class="typebreak"/>
+< philox4x32_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#gaafd54060af05012db410034e3c0ecdc4">r123::Philox4x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef Philox2x64_R<br class="typebreak"/>
+< philox2x64_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#ga616a669079ac25119353416c14d46426">r123::Philox2x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef Philox4x64_R<br class="typebreak"/>
+< philox4x64_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#ga7776f4d481b7c0ac00db70272a1c77f0">r123::Philox4x64</a></td></tr>
+<tr><td colspan="2"><h2><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#gae7443e1a57429154124943b6a7c0bd08">r123_enum_philox2x32</a> { <a class="el" href="group__PhiloxNxW.html#ggae7443e1a57429154124943b6a7c0bd08ad08568b592cd076441505eed926d929c">philox2x32_rounds</a> =  10
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#ga67fd1bf4ed858d01663a7d6b219b97a2">r123_enum_philox4x32</a> { <a class="el" href="group__PhiloxNxW.html#gga67fd1bf4ed858d01663a7d6b219b97a2ac9dec73e096a7afb5d82f2388a7a5412">philox4x32_rounds</a> =  10
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#gaca9df5cdadde758a63952daa97ddff91">r123_enum_philox2x64</a> { <a class="el" href="group__PhiloxNxW.html#ggaca9df5cdadde758a63952daa97ddff91ae15befbf8ae3f2e93d6e49ea9e05b636">philox2x64_rounds</a> =  10
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__PhiloxNxW.html#gaf603860d055cee96c75f6986641e9cad">r123_enum_philox4x64</a> { <a class="el" href="group__PhiloxNxW.html#ggaf603860d055cee96c75f6986641e9cada3407accddb6e873c1005a4ab2edcef67">philox4x64_rounds</a> =  10
+ }</td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array1x32.html">philox2x32_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#ae5dd55c0697c37598c1fbce66457e124">philox2x32keyinit</a> (<a class="el" href="structr123array1x32.html">philox2x32_ukey_t</a> uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array2x32.html">philox2x32_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#acf0a4b82a9fd3f4695c04210df0cbefe">philox2x32_R</a> (unsigned int R, <a class="el" href="structr123array2x32.html">philox2x32_ctr_t</a> ctr, <a class="el" href="structr123array1x32.html">philox2x32_key_t</a> key)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array2x32.html">philox4x32_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#a5a012bb440c039eda46802b447c31851">philox4x32keyinit</a> (<a class="el" href="structr123array2x32.html">philox4x32_ukey_t</a> uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array4x32.html">philox4x32_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#a205fdd66786445b3e1c4157bd96d0967">philox4x32_R</a> (unsigned int R, <a class="el" href="structr123array4x32.html">philox4x32_ctr_t</a> ctr, <a class="el" href="structr123array2x32.html">philox4x32_key_t</a> key)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array1x64.html">philox2x64_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#a36b9225fcb73f91d116b424f721275f1">philox2x64keyinit</a> (<a class="el" href="structr123array1x64.html">philox2x64_ukey_t</a> uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array2x64.html">philox2x64_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#a03c068219ecebcc870afa14a330c0735">philox2x64_R</a> (unsigned int R, <a class="el" href="structr123array2x64.html">philox2x64_ctr_t</a> ctr, <a class="el" href="structr123array1x64.html">philox2x64_key_t</a> key)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array2x64.html">philox4x64_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#a101674ffc206e3bd600f9544de0c3c4a">philox4x64keyinit</a> (<a class="el" href="structr123array2x64.html">philox4x64_ukey_t</a> uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array4x64.html">philox4x64_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="philox_8h.html#ac72571943d83caf2f79b7bd309a2ae92">philox4x64_R</a> (unsigned int R, <a class="el" href="structr123array4x64.html">philox4x64_ctr_t</a> ctr, <a class="el" href="structr123array2x64.html">philox4x64_key_t</a> key)</td></tr>
+</table>
+<hr/><h2>Define Documentation</h2>
+<a class="anchor" id="ab2496424917f063a4990f01943a07fe0"></a><!-- doxytag: member="philox.h::philox2x32" ref="ab2496424917f063a4990f01943a07fe0" args="(c, k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define philox2x32</td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname">k</td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td>   philox2x32_R(philox2x32_rounds, c, k)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae6b57a71e4efa369cc19416fc088b5a5"></a><!-- doxytag: member="philox.h::philox2x64" ref="ae6b57a71e4efa369cc19416fc088b5a5" args="(c, k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define philox2x64</td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname">k</td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td>   philox2x64_R(philox2x64_rounds, c, k)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a432a3df828dd51acd0b7ec2fee1d4d7e"></a><!-- doxytag: member="philox.h::philox4x32" ref="a432a3df828dd51acd0b7ec2fee1d4d7e" args="(c, k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define philox4x32</td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname">k</td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td>   philox4x32_R(philox4x32_rounds, c, k)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a62fb1b4d9775396303ebb2a801fea8e6"></a><!-- doxytag: member="philox.h::philox4x64" ref="a62fb1b4d9775396303ebb2a801fea8e6" args="(c, k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define philox4x64</td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname">k</td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td>   philox4x64_R(philox4x64_rounds, c, k)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Typedef Documentation</h2>
+<a class="anchor" id="a5fad831cdbd677bc6e53d37c0191f5e3"></a><!-- doxytag: member="philox.h::philox2x32_ctr_t" ref="a5fad831cdbd677bc6e53d37c0191f5e3" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array2x32.html">r123array2x32</a> <a class="el" href="structr123array2x32.html">philox2x32_ctr_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a55c0e4adeab3387915f966a0e40dc036"></a><!-- doxytag: member="philox.h::philox2x32_key_t" ref="a55c0e4adeab3387915f966a0e40dc036" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array1x32.html">r123array1x32</a> <a class="el" href="structr123array1x32.html">philox2x32_key_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abf96b0e95504989c58e6d3436b013a6b"></a><!-- doxytag: member="philox.h::philox2x32_ukey_t" ref="abf96b0e95504989c58e6d3436b013a6b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array1x32.html">r123array1x32</a> <a class="el" href="structr123array1x32.html">philox2x32_ukey_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a33fa626a4198f38d87713ae9504e53f2"></a><!-- doxytag: member="philox.h::philox2x64_ctr_t" ref="a33fa626a4198f38d87713ae9504e53f2" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array2x64.html">r123array2x64</a> <a class="el" href="structr123array2x64.html">philox2x64_ctr_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a190087c2584155a936ec7d7b9e8d7f34"></a><!-- doxytag: member="philox.h::philox2x64_key_t" ref="a190087c2584155a936ec7d7b9e8d7f34" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array1x64.html">r123array1x64</a> <a class="el" href="structr123array1x64.html">philox2x64_key_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a419cc7ebdeeaa1fc8249c638eac3d00b"></a><!-- doxytag: member="philox.h::philox2x64_ukey_t" ref="a419cc7ebdeeaa1fc8249c638eac3d00b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array1x64.html">r123array1x64</a> <a class="el" href="structr123array1x64.html">philox2x64_ukey_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a96f2a94ebcd7aba28aaeb0aba6543d2d"></a><!-- doxytag: member="philox.h::philox4x32_ctr_t" ref="a96f2a94ebcd7aba28aaeb0aba6543d2d" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> <a class="el" href="structr123array4x32.html">philox4x32_ctr_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab1e74b78fcee751b43739b2b4415c592"></a><!-- doxytag: member="philox.h::philox4x32_key_t" ref="ab1e74b78fcee751b43739b2b4415c592" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array2x32.html">r123array2x32</a> <a class="el" href="structr123array2x32.html">philox4x32_key_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a82e1d60f98bfbb600bde2bd939de4573"></a><!-- doxytag: member="philox.h::philox4x32_ukey_t" ref="a82e1d60f98bfbb600bde2bd939de4573" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array2x32.html">r123array2x32</a> <a class="el" href="structr123array2x32.html">philox4x32_ukey_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4d2063cc89bf13153ddeff0d94371986"></a><!-- doxytag: member="philox.h::philox4x64_ctr_t" ref="a4d2063cc89bf13153ddeff0d94371986" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array4x64.html">r123array4x64</a> <a class="el" href="structr123array4x64.html">philox4x64_ctr_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0c8c9410e9d88d4c94e8093007e39b0c"></a><!-- doxytag: member="philox.h::philox4x64_key_t" ref="a0c8c9410e9d88d4c94e8093007e39b0c" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array2x64.html">r123array2x64</a> <a class="el" href="structr123array2x64.html">philox4x64_key_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a689ed8276d25fe0c983c4eb5b9a32fd4"></a><!-- doxytag: member="philox.h::philox4x64_ukey_t" ref="a689ed8276d25fe0c983c4eb5b9a32fd4" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array2x64.html">r123array2x64</a> <a class="el" href="structr123array2x64.html">philox4x64_ukey_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="acf0a4b82a9fd3f4695c04210df0cbefe"></a><!-- doxytag: member="philox.h::philox2x32_R" ref="acf0a4b82a9fd3f4695c04210df0cbefe" args="(unsigned int R, philox2x32_ctr_t ctr, philox2x32_key_t key)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array2x32.html">philox2x32_ctr_t</a> philox2x32_R </td>
+          <td>(</td>
+          <td class="paramtype">unsigned int </td>
+          <td class="paramname"> <em>R</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html">philox2x32_ctr_t</a> </td>
+          <td class="paramname"> <em>ctr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array1x32.html">philox2x32_key_t</a> </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae5dd55c0697c37598c1fbce66457e124"></a><!-- doxytag: member="philox.h::philox2x32keyinit" ref="ae5dd55c0697c37598c1fbce66457e124" args="(philox2x32_ukey_t uk)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array1x32.html">philox2x32_key_t</a> philox2x32keyinit </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1x32.html">philox2x32_ukey_t</a> </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a03c068219ecebcc870afa14a330c0735"></a><!-- doxytag: member="philox.h::philox2x64_R" ref="a03c068219ecebcc870afa14a330c0735" args="(unsigned int R, philox2x64_ctr_t ctr, philox2x64_key_t key)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array2x64.html">philox2x64_ctr_t</a> philox2x64_R </td>
+          <td>(</td>
+          <td class="paramtype">unsigned int </td>
+          <td class="paramname"> <em>R</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html">philox2x64_ctr_t</a> </td>
+          <td class="paramname"> <em>ctr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array1x64.html">philox2x64_key_t</a> </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a36b9225fcb73f91d116b424f721275f1"></a><!-- doxytag: member="philox.h::philox2x64keyinit" ref="a36b9225fcb73f91d116b424f721275f1" args="(philox2x64_ukey_t uk)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array1x64.html">philox2x64_key_t</a> philox2x64keyinit </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1x64.html">philox2x64_ukey_t</a> </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a205fdd66786445b3e1c4157bd96d0967"></a><!-- doxytag: member="philox.h::philox4x32_R" ref="a205fdd66786445b3e1c4157bd96d0967" args="(unsigned int R, philox4x32_ctr_t ctr, philox4x32_key_t key)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array4x32.html">philox4x32_ctr_t</a> philox4x32_R </td>
+          <td>(</td>
+          <td class="paramtype">unsigned int </td>
+          <td class="paramname"> <em>R</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">philox4x32_ctr_t</a> </td>
+          <td class="paramname"> <em>ctr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html">philox4x32_key_t</a> </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5a012bb440c039eda46802b447c31851"></a><!-- doxytag: member="philox.h::philox4x32keyinit" ref="a5a012bb440c039eda46802b447c31851" args="(philox4x32_ukey_t uk)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array2x32.html">philox4x32_key_t</a> philox4x32keyinit </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html">philox4x32_ukey_t</a> </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac72571943d83caf2f79b7bd309a2ae92"></a><!-- doxytag: member="philox.h::philox4x64_R" ref="ac72571943d83caf2f79b7bd309a2ae92" args="(unsigned int R, philox4x64_ctr_t ctr, philox4x64_key_t key)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array4x64.html">philox4x64_ctr_t</a> philox4x64_R </td>
+          <td>(</td>
+          <td class="paramtype">unsigned int </td>
+          <td class="paramname"> <em>R</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array4x64.html">philox4x64_ctr_t</a> </td>
+          <td class="paramname"> <em>ctr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html">philox4x64_key_t</a> </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a101674ffc206e3bd600f9544de0c3c4a"></a><!-- doxytag: member="philox.h::philox4x64keyinit" ref="a101674ffc206e3bd600f9544de0c3c4a" args="(philox4x64_ukey_t uk)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array2x64.html">philox4x64_key_t</a> philox4x64keyinit </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html">philox4x64_ukey_t</a> </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/philox_8h_source.html b/lib/Random123-1.08/docs/html/philox_8h_source.html
new file mode 100644
index 0000000..ee59708
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/philox_8h_source.html
@@ -0,0 +1,460 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/philox.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>Random123/philox.h</h1>  </div>
+</div>
+<div class="contents">
+<a href="philox_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">Copyright 2010-2011, D. E. Shaw Research.</span>
+<a name="l00003"></a>00003 <span class="comment">All rights reserved.</span>
+<a name="l00004"></a>00004 <span class="comment"></span>
+<a name="l00005"></a>00005 <span class="comment">Redistribution and use in source and binary forms, with or without</span>
+<a name="l00006"></a>00006 <span class="comment">modification, are permitted provided that the following conditions are</span>
+<a name="l00007"></a>00007 <span class="comment">met:</span>
+<a name="l00008"></a>00008 <span class="comment"></span>
+<a name="l00009"></a>00009 <span class="comment">* Redistributions of source code must retain the above copyright</span>
+<a name="l00010"></a>00010 <span class="comment">  notice, this list of conditions, and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"></span>
+<a name="l00012"></a>00012 <span class="comment">* Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00013"></a>00013 <span class="comment">  notice, this list of conditions, and the following disclaimer in the</span>
+<a name="l00014"></a>00014 <span class="comment">  documentation and/or other materials provided with the distribution.</span>
+<a name="l00015"></a>00015 <span class="comment"></span>
+<a name="l00016"></a>00016 <span class="comment">* Neither the name of D. E. Shaw Research nor the names of its</span>
+<a name="l00017"></a>00017 <span class="comment">  contributors may be used to endorse or promote products derived from</span>
+<a name="l00018"></a>00018 <span class="comment">  this software without specific prior written permission.</span>
+<a name="l00019"></a>00019 <span class="comment"></span>
+<a name="l00020"></a>00020 <span class="comment">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span>
+<a name="l00021"></a>00021 <span class="comment">"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span>
+<a name="l00022"></a>00022 <span class="comment">LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span>
+<a name="l00023"></a>00023 <span class="comment">A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span>
+<a name="l00024"></a>00024 <span class="comment">OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
+<a name="l00025"></a>00025 <span class="comment">SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span>
+<a name="l00026"></a>00026 <span class="comment">LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span>
+<a name="l00027"></a>00027 <span class="comment">DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span>
+<a name="l00028"></a>00028 <span class="comment">THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00029"></a>00029 <span class="comment">(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span>
+<a name="l00030"></a>00030 <span class="comment">OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00031"></a>00031 <span class="comment">*/</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#ifndef _philox_dot_h_</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#define _philox_dot_h_</span>
+<a name="l00034"></a>00034 <span class="preprocessor"></span>
+<a name="l00037"></a>00037 <span class="preprocessor">#include "<a class="code" href="compilerfeatures_8h.html">features/compilerfeatures.h</a>"</span>
+<a name="l00038"></a>00038 <span class="preprocessor">#include "<a class="code" href="array_8h.html">array.h</a>"</span>
+<a name="l00039"></a>00039 
+<a name="l00040"></a>00040 
+<a name="l00041"></a>00041 <span class="comment">/*</span>
+<a name="l00042"></a>00042 <span class="comment">// Macros _Foo_tpl are code generation 'templates'  They define</span>
+<a name="l00043"></a>00043 <span class="comment">// inline functions with names obtained by mangling Foo and the</span>
+<a name="l00044"></a>00044 <span class="comment">// macro arguments.  E.g.,</span>
+<a name="l00045"></a>00045 <span class="comment">//   _mulhilo_tpl(32, uint32_t, uint64_t)</span>
+<a name="l00046"></a>00046 <span class="comment">// expands to a definition of:</span>
+<a name="l00047"></a>00047 <span class="comment">//   mulhilo32(uint32_t, uint32_t, uint32_t *, uint32_t *)</span>
+<a name="l00048"></a>00048 <span class="comment">// We then 'instantiate the template' to define</span>
+<a name="l00049"></a>00049 <span class="comment">// several different functions, e.g.,</span>
+<a name="l00050"></a>00050 <span class="comment">//   mulhilo32</span>
+<a name="l00051"></a>00051 <span class="comment">//   mulhilo64</span>
+<a name="l00052"></a>00052 <span class="comment">// These functions will be visible to user code, and may</span>
+<a name="l00053"></a>00053 <span class="comment">// also be used later in subsequent templates and definitions.</span>
+<a name="l00054"></a>00054 <span class="comment"></span>
+<a name="l00055"></a>00055 <span class="comment">// A template for mulhilo using a temporary of twice the word-width.</span>
+<a name="l00056"></a>00056 <span class="comment">// Gcc figures out that this can be reduced to a single 'mul' instruction,</span>
+<a name="l00057"></a>00057 <span class="comment">// despite the apparent use of double-wide variables, shifts, etc.  It's</span>
+<a name="l00058"></a>00058 <span class="comment">// obviously not guaranteed that all compilers will be that smart, so</span>
+<a name="l00059"></a>00059 <span class="comment">// other implementations might be preferable, e.g., using an intrinsic</span>
+<a name="l00060"></a>00060 <span class="comment">// or an asm block.  On the other hand, for 32-bit multiplies,</span>
+<a name="l00061"></a>00061 <span class="comment">// this *is* perfectly standard C99 - any C99 compiler should </span>
+<a name="l00062"></a>00062 <span class="comment">// understand it and produce correct code.  For 64-bit multiplies,</span>
+<a name="l00063"></a>00063 <span class="comment">// it's only usable if the compiler recognizes that it can do</span>
+<a name="l00064"></a>00064 <span class="comment">// arithmetic on a 128-bit type.  That happens to be true for gcc on</span>
+<a name="l00065"></a>00065 <span class="comment">// x86-64, and powerpc64 but not much else.</span>
+<a name="l00066"></a>00066 <span class="comment">*/</span>
+<a name="l00067"></a>00067 <span class="preprocessor">#define _mulhilo_dword_tpl(W, Word, Dword)                              \</span>
+<a name="l00068"></a>00068 <span class="preprocessor">R123_CUDA_DEVICE R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word* hip){ \</span>
+<a name="l00069"></a>00069 <span class="preprocessor">    Dword product = ((Dword)a)*((Dword)b);                              \</span>
+<a name="l00070"></a>00070 <span class="preprocessor">    *hip = product>>W;                                                  \</span>
+<a name="l00071"></a>00071 <span class="preprocessor">    return (Word)product;                                               \</span>
+<a name="l00072"></a>00072 <span class="preprocessor">}</span>
+<a name="l00073"></a>00073 <span class="preprocessor"></span>
+<a name="l00074"></a>00074 <span class="comment">/*</span>
+<a name="l00075"></a>00075 <span class="comment">// A template for mulhilo using gnu-style asm syntax.</span>
+<a name="l00076"></a>00076 <span class="comment">// INSN can be "mulw", "mull" or "mulq".  </span>
+<a name="l00077"></a>00077 <span class="comment">// FIXME - porting to other architectures, we'll need still-more conditional</span>
+<a name="l00078"></a>00078 <span class="comment">// branching here.  Note that intrinsics are usually preferable.</span>
+<a name="l00079"></a>00079 <span class="comment">*/</span>
+<a name="l00080"></a>00080 <span class="preprocessor">#ifdef __powerpc__</span>
+<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="preprocessor">#define _mulhilo_asm_tpl(W, Word, INSN)                         \</span>
+<a name="l00082"></a>00082 <span class="preprocessor">R123_STATIC_INLINE Word mulhilo##W(Word ax, Word b, Word *hip){ \</span>
+<a name="l00083"></a>00083 <span class="preprocessor">    Word dx = 0;                                                \</span>
+<a name="l00084"></a>00084 <span class="preprocessor">    __asm__("\n\t"                                              \</span>
+<a name="l00085"></a>00085 <span class="preprocessor">        INSN " %0,%1,%2\n\t"                                    \</span>
+<a name="l00086"></a>00086 <span class="preprocessor">        : "=r"(dx)                                              \</span>
+<a name="l00087"></a>00087 <span class="preprocessor">        : "r"(b), "r"(ax)                                       \</span>
+<a name="l00088"></a>00088 <span class="preprocessor">        );                                                      \</span>
+<a name="l00089"></a>00089 <span class="preprocessor">    *hip = dx;                                                  \</span>
+<a name="l00090"></a>00090 <span class="preprocessor">    return ax*b;                                                \</span>
+<a name="l00091"></a>00091 <span class="preprocessor">}</span>
+<a name="l00092"></a>00092 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00093"></a>00093 <span class="preprocessor"></span><span class="preprocessor">#define _mulhilo_asm_tpl(W, Word, INSN)                         \</span>
+<a name="l00094"></a>00094 <span class="preprocessor">R123_STATIC_INLINE Word mulhilo##W(Word ax, Word b, Word *hip){      \</span>
+<a name="l00095"></a>00095 <span class="preprocessor">    Word dx;                                                    \</span>
+<a name="l00096"></a>00096 <span class="preprocessor">    __asm__("\n\t"                                              \</span>
+<a name="l00097"></a>00097 <span class="preprocessor">        INSN " %2\n\t"                                          \</span>
+<a name="l00098"></a>00098 <span class="preprocessor">        : "=a"(ax), "=d"(dx)                                    \</span>
+<a name="l00099"></a>00099 <span class="preprocessor">        : "r"(b), "0"(ax)                                       \</span>
+<a name="l00100"></a>00100 <span class="preprocessor">        );                                                      \</span>
+<a name="l00101"></a>00101 <span class="preprocessor">    *hip = dx;                                                  \</span>
+<a name="l00102"></a>00102 <span class="preprocessor">    return ax;                                                  \</span>
+<a name="l00103"></a>00103 <span class="preprocessor">}</span>
+<a name="l00104"></a>00104 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __powerpc__ */</span>
+<a name="l00105"></a>00105 
+<a name="l00106"></a>00106 <span class="comment">/*</span>
+<a name="l00107"></a>00107 <span class="comment">// A template for mulhilo using MSVC-style intrinsics</span>
+<a name="l00108"></a>00108 <span class="comment">// For example,_umul128 is an msvc intrinsic, c.f.</span>
+<a name="l00109"></a>00109 <span class="comment">// http://msdn.microsoft.com/en-us/library/3dayytw9.aspx</span>
+<a name="l00110"></a>00110 <span class="comment">*/</span>
+<a name="l00111"></a>00111 <span class="preprocessor">#define _mulhilo_msvc_intrin_tpl(W, Word, INTRIN)               \</span>
+<a name="l00112"></a>00112 <span class="preprocessor">R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word* hip){       \</span>
+<a name="l00113"></a>00113 <span class="preprocessor">    return INTRIN(a, b, hip);                                   \</span>
+<a name="l00114"></a>00114 <span class="preprocessor">}</span>
+<a name="l00115"></a>00115 <span class="preprocessor"></span>
+<a name="l00116"></a>00116 <span class="comment">/* N.B.  This really should be called _mulhilo_mulhi_intrin.  It just</span>
+<a name="l00117"></a>00117 <span class="comment">   happens that CUDA was the first time we used the idiom. */</span>
+<a name="l00118"></a>00118 <span class="preprocessor">#define _mulhilo_cuda_intrin_tpl(W, Word, INTRIN)                       \</span>
+<a name="l00119"></a>00119 <span class="preprocessor">R123_CUDA_DEVICE R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word* hip){ \</span>
+<a name="l00120"></a>00120 <span class="preprocessor">    *hip = INTRIN(a, b);                                                \</span>
+<a name="l00121"></a>00121 <span class="preprocessor">    return a*b;                                                         \</span>
+<a name="l00122"></a>00122 <span class="preprocessor">}</span>
+<a name="l00123"></a>00123 <span class="preprocessor"></span>
+<a name="l00124"></a>00124 <span class="comment">/*</span>
+<a name="l00125"></a>00125 <span class="comment">// A template for mulhilo using only word-size operations and</span>
+<a name="l00126"></a>00126 <span class="comment">// C99 operators (no adc, no mulhi).  It</span>
+<a name="l00127"></a>00127 <span class="comment">// requires four multiplies and a dozen or so shifts, adds</span>
+<a name="l00128"></a>00128 <span class="comment">// and tests.  It's not clear what this is good for, other than</span>
+<a name="l00129"></a>00129 <span class="comment">// completeness.  On 32-bit platforms, it could be used to</span>
+<a name="l00130"></a>00130 <span class="comment">// implement philoxNx64, but on such platforms both the philoxNx32</span>
+<a name="l00131"></a>00131 <span class="comment">// and the threefryNx64 cbrngs are going to have much better</span>
+<a name="l00132"></a>00132 <span class="comment">// performance.  It is enabled below by R123_USE_MULHILO64_C99,</span>
+<a name="l00133"></a>00133 <span class="comment">// but that is currently (Sep 2011) not set by any of the</span>
+<a name="l00134"></a>00134 <span class="comment">// features/XXfeatures.h headers.  It can, of course, be</span>
+<a name="l00135"></a>00135 <span class="comment">// set with a compile-time -D option.</span>
+<a name="l00136"></a>00136 <span class="comment">*/</span>
+<a name="l00137"></a>00137 <span class="preprocessor">#define _mulhilo_c99_tpl(W, Word) \</span>
+<a name="l00138"></a>00138 <span class="preprocessor">R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word *hip){ \</span>
+<a name="l00139"></a>00139 <span class="preprocessor">    const unsigned WHALF = W/2;                                    \</span>
+<a name="l00140"></a>00140 <span class="preprocessor">    const Word LOMASK = ((((Word)1)<<WHALF)-1);                    \</span>
+<a name="l00141"></a>00141 <span class="preprocessor">    Word lo = a*b;               </span><span class="comment">/* full low multiply */</span>           \
+<a name="l00142"></a>00142     Word ahi = a>>WHALF;                                           \
+<a name="l00143"></a>00143     Word alo = a& LOMASK;                                          \
+<a name="l00144"></a>00144     Word bhi = b>>WHALF;                                           \
+<a name="l00145"></a>00145     Word blo = b& LOMASK;                                          \
+<a name="l00146"></a>00146                                                                    \
+<a name="l00147"></a>00147     Word ahbl = ahi*blo;                                           \
+<a name="l00148"></a>00148     Word albh = alo*bhi;                                           \
+<a name="l00149"></a>00149                                                                    \
+<a name="l00150"></a>00150     Word ahbl_albh = ((ahbl&LOMASK) + (albh&LOMASK));                   \
+<a name="l00151"></a>00151     Word hi = ahi*bhi + (ahbl>>WHALF) +  (albh>>WHALF);                 \
+<a name="l00152"></a>00152     hi += ahbl_albh >> WHALF; <span class="comment">/* carry from the sum of lo(ahbl) + lo(albh) ) */</span> \
+<a name="l00153"></a>00153     <span class="comment">/* carry from the sum with alo*blo */</span>                               \
+<a name="l00154"></a>00154     hi += ((lo >> WHALF) < (ahbl_albh&LOMASK));                         \
+<a name="l00155"></a>00155     *hip = hi;                                                          \
+<a name="l00156"></a>00156     return lo;                                                          \
+<a name="l00157"></a>00157 }
+<a name="l00158"></a>00158 
+<a name="l00159"></a>00159 <span class="comment">/*</span>
+<a name="l00160"></a>00160 <span class="comment">// A template for mulhilo on a platform that can't do it</span>
+<a name="l00161"></a>00161 <span class="comment">// We could put a C version here, but is it better to run *VERY*</span>
+<a name="l00162"></a>00162 <span class="comment">// slowly or to just stop and force the user to find another CBRNG?</span>
+<a name="l00163"></a>00163 <span class="comment">*/</span>
+<a name="l00164"></a>00164 <span class="preprocessor">#define _mulhilo_fail_tpl(W, Word)                                      \</span>
+<a name="l00165"></a>00165 <span class="preprocessor">R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word *hip){               \</span>
+<a name="l00166"></a>00166 <span class="preprocessor">    R123_STATIC_ASSERT(0, "mulhilo" #W " is not implemented on this machine\n"); \</span>
+<a name="l00167"></a>00167 <span class="preprocessor">}</span>
+<a name="l00168"></a>00168 <span class="preprocessor"></span>
+<a name="l00169"></a>00169 <span class="comment">/*</span>
+<a name="l00170"></a>00170 <span class="comment">// N.B.  There's an MSVC intrinsic called _emul,</span>
+<a name="l00171"></a>00171 <span class="comment">// which *might* compile into better code than</span>
+<a name="l00172"></a>00172 <span class="comment">// _mulhilo_dword_tpl </span>
+<a name="l00173"></a>00173 <span class="comment">*/</span>
+<a name="l00174"></a>00174 <span class="preprocessor">#if R123_USE_MULHILO32_ASM</span>
+<a name="l00175"></a>00175 <span class="preprocessor"></span><span class="preprocessor">#ifdef __powerpc__</span>
+<a name="l00176"></a>00176 <span class="preprocessor"></span>_mulhilo_asm_tpl(32, uint32_t, <span class="stringliteral">"mulhwu"</span>)
+<a name="l00177"></a>00177 <span class="preprocessor">#else</span>
+<a name="l00178"></a>00178 <span class="preprocessor"></span>_mulhilo_asm_tpl(32, uint32_t, <span class="stringliteral">"mull"</span>)
+<a name="l00179"></a>00179 <span class="preprocessor">#endif </span><span class="comment">/* __powerpc__ */</span>
+<a name="l00180"></a>00180 <span class="preprocessor">#else</span>
+<a name="l00181"></a>00181 <span class="preprocessor"></span>_mulhilo_dword_tpl(32, uint32_t, uint64_t)
+<a name="l00182"></a>00182 <span class="preprocessor">#endif</span>
+<a name="l00183"></a>00183 <span class="preprocessor"></span>
+<a name="l00184"></a>00184 <span class="preprocessor">#if R123_USE_PHILOX_64BIT</span>
+<a name="l00185"></a>00185 <span class="preprocessor"></span><span class="preprocessor">#if R123_USE_MULHILO64_ASM</span>
+<a name="l00186"></a>00186 <span class="preprocessor"></span><span class="preprocessor">#ifdef __powerpc64__</span>
+<a name="l00187"></a>00187 <span class="preprocessor"></span>_mulhilo_asm_tpl(64, uint64_t, <span class="stringliteral">"mulhdu"</span>)
+<a name="l00188"></a>00188 <span class="preprocessor">#else</span>
+<a name="l00189"></a>00189 <span class="preprocessor"></span>_mulhilo_asm_tpl(64, uint64_t, <span class="stringliteral">"mulq"</span>)
+<a name="l00190"></a>00190 <span class="preprocessor">#endif </span><span class="comment">/* __powerpc64__ */</span>
+<a name="l00191"></a>00191 <span class="preprocessor">#elif R123_USE_MULHILO64_MSVC_INTRIN</span>
+<a name="l00192"></a>00192 <span class="preprocessor"></span>_mulhilo_msvc_intrin_tpl(64, uint64_t, _umul128)
+<a name="l00193"></a>00193 <span class="preprocessor">#elif R123_USE_MULHILO64_CUDA_INTRIN</span>
+<a name="l00194"></a>00194 <span class="preprocessor"></span>_mulhilo_cuda_intrin_tpl(64, uint64_t, __umul64hi)
+<a name="l00195"></a>00195 <span class="preprocessor">#elif R123_USE_MULHILO64_OPENCL_INTRIN</span>
+<a name="l00196"></a>00196 <span class="preprocessor"></span>_mulhilo_cuda_intrin_tpl(64, uint64_t, mul_hi)
+<a name="l00197"></a>00197 <span class="preprocessor">#elif R123_USE_MULHILO64_MULHI_INTRIN</span>
+<a name="l00198"></a>00198 <span class="preprocessor"></span>_mulhilo_cuda_intrin_tpl(64, uint64_t, R123_MULHILO64_MULHI_INTRIN)
+<a name="l00199"></a>00199 <span class="preprocessor">#elif R123_USE_GNU_UINT128</span>
+<a name="l00200"></a>00200 <span class="preprocessor"></span>_mulhilo_dword_tpl(64, uint64_t, __uint128_t)
+<a name="l00201"></a>00201 <span class="preprocessor">#elif R123_USE_MULHILO64_C99</span>
+<a name="l00202"></a>00202 <span class="preprocessor"></span>_mulhilo_c99_tpl(64, uint64_t)
+<a name="l00203"></a>00203 <span class="preprocessor">#else</span>
+<a name="l00204"></a>00204 <span class="preprocessor"></span>_mulhilo_fail_tpl(64, uint64_t)
+<a name="l00205"></a>00205 <span class="preprocessor">#endif</span>
+<a name="l00206"></a>00206 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00207"></a>00207 <span class="preprocessor"></span>
+<a name="l00208"></a>00208 <span class="comment">/*</span>
+<a name="l00209"></a>00209 <span class="comment">// The multipliers and Weyl constants are "hard coded".</span>
+<a name="l00210"></a>00210 <span class="comment">// To change them, you can #define them with different</span>
+<a name="l00211"></a>00211 <span class="comment">// values before #include-ing this file. </span>
+<a name="l00212"></a>00212 <span class="comment">// This isn't terribly elegant, but it works for C as</span>
+<a name="l00213"></a>00213 <span class="comment">// well as C++.  A nice C++-only solution would be to</span>
+<a name="l00214"></a>00214 <span class="comment">// use template parameters in the style of <random></span>
+<a name="l00215"></a>00215 <span class="comment">*/</span>
+<a name="l00216"></a>00216 <span class="preprocessor">#ifndef PHILOX_M2x64_0</span>
+<a name="l00217"></a>00217 <span class="preprocessor"></span><span class="preprocessor">#define PHILOX_M2x64_0 R123_64BIT(0xD2B74407B1CE6E93)</span>
+<a name="l00218"></a>00218 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00219"></a>00219 <span class="preprocessor"></span>
+<a name="l00220"></a>00220 <span class="preprocessor">#ifndef PHILOX_M4x64_0</span>
+<a name="l00221"></a>00221 <span class="preprocessor"></span><span class="preprocessor">#define PHILOX_M4x64_0 R123_64BIT(0xD2E7470EE14C6C93)</span>
+<a name="l00222"></a>00222 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00223"></a>00223 <span class="preprocessor"></span>
+<a name="l00224"></a>00224 <span class="preprocessor">#ifndef PHILOX_M4x64_1</span>
+<a name="l00225"></a>00225 <span class="preprocessor"></span><span class="preprocessor">#define PHILOX_M4x64_1 R123_64BIT(0xCA5A826395121157)</span>
+<a name="l00226"></a>00226 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00227"></a>00227 <span class="preprocessor"></span>
+<a name="l00228"></a>00228 <span class="preprocessor">#ifndef PHILOX_M2x32_0</span>
+<a name="l00229"></a>00229 <span class="preprocessor"></span><span class="preprocessor">#define PHILOX_M2x32_0 ((uint32_t)0xd256d193)</span>
+<a name="l00230"></a>00230 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00231"></a>00231 <span class="preprocessor"></span>
+<a name="l00232"></a>00232 <span class="preprocessor">#ifndef PHILOX_M4x32_0</span>
+<a name="l00233"></a>00233 <span class="preprocessor"></span><span class="preprocessor">#define PHILOX_M4x32_0 ((uint32_t)0xD2511F53)</span>
+<a name="l00234"></a>00234 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00235"></a>00235 <span class="preprocessor"></span><span class="preprocessor">#ifndef PHILOX_M4x32_1</span>
+<a name="l00236"></a>00236 <span class="preprocessor"></span><span class="preprocessor">#define PHILOX_M4x32_1 ((uint32_t)0xCD9E8D57)</span>
+<a name="l00237"></a>00237 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00238"></a>00238 <span class="preprocessor"></span>
+<a name="l00239"></a>00239 <span class="preprocessor">#ifndef PHILOX_W64_0</span>
+<a name="l00240"></a>00240 <span class="preprocessor"></span><span class="preprocessor">#define PHILOX_W64_0 R123_64BIT(0x9E3779B97F4A7C15)  </span><span class="comment">/* golden ratio */</span>
+<a name="l00241"></a>00241 <span class="preprocessor">#endif</span>
+<a name="l00242"></a>00242 <span class="preprocessor"></span><span class="preprocessor">#ifndef PHILOX_W64_1</span>
+<a name="l00243"></a>00243 <span class="preprocessor"></span><span class="preprocessor">#define PHILOX_W64_1 R123_64BIT(0xBB67AE8584CAA73B)  </span><span class="comment">/* sqrt(3)-1 */</span>
+<a name="l00244"></a>00244 <span class="preprocessor">#endif</span>
+<a name="l00245"></a>00245 <span class="preprocessor"></span>
+<a name="l00246"></a>00246 <span class="preprocessor">#ifndef PHILOX_W32_0</span>
+<a name="l00247"></a>00247 <span class="preprocessor"></span><span class="preprocessor">#define PHILOX_W32_0 ((uint32_t)0x9E3779B9)</span>
+<a name="l00248"></a>00248 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00249"></a>00249 <span class="preprocessor"></span><span class="preprocessor">#ifndef PHILOX_W32_1</span>
+<a name="l00250"></a>00250 <span class="preprocessor"></span><span class="preprocessor">#define PHILOX_W32_1 ((uint32_t)0xBB67AE85)</span>
+<a name="l00251"></a>00251 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00252"></a>00252 <span class="preprocessor"></span>
+<a name="l00253"></a>00253 <span class="preprocessor">#ifndef PHILOX2x32_DEFAULT_ROUNDS</span>
+<a name="l00254"></a>00254 <span class="preprocessor"></span><span class="preprocessor">#define PHILOX2x32_DEFAULT_ROUNDS 10</span>
+<a name="l00255"></a>00255 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00256"></a>00256 <span class="preprocessor"></span>
+<a name="l00257"></a>00257 <span class="preprocessor">#ifndef PHILOX2x64_DEFAULT_ROUNDS</span>
+<a name="l00258"></a>00258 <span class="preprocessor"></span><span class="preprocessor">#define PHILOX2x64_DEFAULT_ROUNDS 10</span>
+<a name="l00259"></a>00259 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00260"></a>00260 <span class="preprocessor"></span>
+<a name="l00261"></a>00261 <span class="preprocessor">#ifndef PHILOX4x32_DEFAULT_ROUNDS</span>
+<a name="l00262"></a>00262 <span class="preprocessor"></span><span class="preprocessor">#define PHILOX4x32_DEFAULT_ROUNDS 10</span>
+<a name="l00263"></a>00263 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00264"></a>00264 <span class="preprocessor"></span>
+<a name="l00265"></a>00265 <span class="preprocessor">#ifndef PHILOX4x64_DEFAULT_ROUNDS</span>
+<a name="l00266"></a>00266 <span class="preprocessor"></span><span class="preprocessor">#define PHILOX4x64_DEFAULT_ROUNDS 10</span>
+<a name="l00267"></a>00267 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00268"></a>00268 <span class="preprocessor"></span>
+<a name="l00269"></a>00269 <span class="comment">/* The ignored fourth argument allows us to instantiate the</span>
+<a name="l00270"></a>00270 <span class="comment">   same macro regardless of N. */</span>
+<a name="l00271"></a>00271 <span class="preprocessor">#define _philox2xWround_tpl(W, T)                                       \</span>
+<a name="l00272"></a>00272 <span class="preprocessor">R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(struct r123array2x##W _philox2x##W##round(struct r123array2x##W ctr, struct r123array1x##W key)); \</span>
+<a name="l00273"></a>00273 <span class="preprocessor">R123_CUDA_DEVICE R123_STATIC_INLINE struct r123array2x##W _philox2x##W##round(struct r123array2x##W ctr, struct r123array1x##W key){ \</span>
+<a name="l00274"></a>00274 <span class="preprocessor">    T hi;                                                               \</span>
+<a name="l00275"></a>00275 <span class="preprocessor">    T lo = mulhilo##W(PHILOX_M2x##W##_0, ctr.v[0], &hi);                \</span>
+<a name="l00276"></a>00276 <span class="preprocessor">    struct r123array2x##W out = {{hi^key.v[0]^ctr.v[1], lo}};               \</span>
+<a name="l00277"></a>00277 <span class="preprocessor">    return out;                                                         \</span>
+<a name="l00278"></a>00278 <span class="preprocessor">}</span>
+<a name="l00279"></a>00279 <span class="preprocessor"></span><span class="preprocessor">#define _philox2xWbumpkey_tpl(W)                                        \</span>
+<a name="l00280"></a>00280 <span class="preprocessor">R123_CUDA_DEVICE R123_STATIC_INLINE struct r123array1x##W _philox2x##W##bumpkey( struct r123array1x##W key) { \</span>
+<a name="l00281"></a>00281 <span class="preprocessor">    key.v[0] += PHILOX_W##W##_0;                                        \</span>
+<a name="l00282"></a>00282 <span class="preprocessor">    return key;                                                         \</span>
+<a name="l00283"></a>00283 <span class="preprocessor">}</span>
+<a name="l00284"></a>00284 <span class="preprocessor"></span>
+<a name="l00285"></a>00285 <span class="preprocessor">#define _philox4xWround_tpl(W, T)                                       \</span>
+<a name="l00286"></a>00286 <span class="preprocessor">R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(struct r123array4x##W _philox4x##W##round(struct r123array4x##W ctr, struct r123array2x##W key)); \</span>
+<a name="l00287"></a>00287 <span class="preprocessor">R123_CUDA_DEVICE R123_STATIC_INLINE struct r123array4x##W _philox4x##W##round(struct r123array4x##W ctr, struct r123array2x##W key){ \</span>
+<a name="l00288"></a>00288 <span class="preprocessor">    T hi0;                                                              \</span>
+<a name="l00289"></a>00289 <span class="preprocessor">    T hi1;                                                              \</span>
+<a name="l00290"></a>00290 <span class="preprocessor">    T lo0 = mulhilo##W(PHILOX_M4x##W##_0, ctr.v[0], &hi0);              \</span>
+<a name="l00291"></a>00291 <span class="preprocessor">    T lo1 = mulhilo##W(PHILOX_M4x##W##_1, ctr.v[2], &hi1);              \</span>
+<a name="l00292"></a>00292 <span class="preprocessor">    struct r123array4x##W out = {{hi1^ctr.v[1]^key.v[0], lo1,               \</span>
+<a name="l00293"></a>00293 <span class="preprocessor">                              hi0^ctr.v[3]^key.v[1], lo0}};             \</span>
+<a name="l00294"></a>00294 <span class="preprocessor">    return out;                                                         \</span>
+<a name="l00295"></a>00295 <span class="preprocessor">}</span>
+<a name="l00296"></a>00296 <span class="preprocessor"></span>
+<a name="l00297"></a>00297 <span class="preprocessor">#define _philox4xWbumpkey_tpl(W)                                        \</span>
+<a name="l00298"></a>00298 <span class="preprocessor">R123_CUDA_DEVICE R123_STATIC_INLINE struct r123array2x##W _philox4x##W##bumpkey( struct r123array2x##W key) { \</span>
+<a name="l00299"></a>00299 <span class="preprocessor">    key.v[0] += PHILOX_W##W##_0;                                        \</span>
+<a name="l00300"></a>00300 <span class="preprocessor">    key.v[1] += PHILOX_W##W##_1;                                        \</span>
+<a name="l00301"></a>00301 <span class="preprocessor">    return key;                                                         \</span>
+<a name="l00302"></a>00302 <span class="preprocessor">}</span>
+<a name="l00303"></a>00303 <span class="preprocessor"></span>
+<a name="l00304"></a>00304 <span class="preprocessor">#define _philoxNxW_tpl(N, Nhalf, W, T)                         \</span>
+<a name="l00305"></a>00305 <span class="preprocessor">                                       \</span>
+<a name="l00306"></a>00306 <span class="preprocessor">enum r123_enum_philox##N##x##W { philox##N##x##W##_rounds = PHILOX##N##x##W##_DEFAULT_ROUNDS }; \</span>
+<a name="l00307"></a>00307 <span class="preprocessor">typedef struct r123array##N##x##W philox##N##x##W##_ctr_t;                  \</span>
+<a name="l00308"></a>00308 <span class="preprocessor">typedef struct r123array##Nhalf##x##W philox##N##x##W##_key_t;              \</span>
+<a name="l00309"></a>00309 <span class="preprocessor">typedef struct r123array##Nhalf##x##W philox##N##x##W##_ukey_t;              \</span>
+<a name="l00310"></a>00310 <span class="preprocessor">R123_CUDA_DEVICE R123_STATIC_INLINE philox##N##x##W##_key_t philox##N##x##W##keyinit(philox##N##x##W##_ukey_t uk) { return uk; } \</span>
+<a name="l00311"></a>00311 <span class="preprocessor">R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(philox##N##x##W##_ctr_t philox##N##x##W##_R(unsigned int R, philox##N##x##W##_ctr_t ctr, philox##N##x##W##_key_t key)); \</span>
+<a name="l00312"></a>00312 <span class="preprocessor">R123_CUDA_DEVICE R123_STATIC_INLINE philox##N##x##W##_ctr_t philox##N##x##W##_R(unsigned int R, philox##N##x##W##_ctr_t ctr, philox##N##x##W##_key_t key) { \</span>
+<a name="l00313"></a>00313 <span class="preprocessor">    R123_ASSERT(R<=16);                                                 \</span>
+<a name="l00314"></a>00314 <span class="preprocessor">    if(R>0){                                       ctr = _philox##N##x##W##round(ctr, key); } \</span>
+<a name="l00315"></a>00315 <span class="preprocessor">    if(R>1){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \</span>
+<a name="l00316"></a>00316 <span class="preprocessor">    if(R>2){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \</span>
+<a name="l00317"></a>00317 <span class="preprocessor">    if(R>3){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \</span>
+<a name="l00318"></a>00318 <span class="preprocessor">    if(R>4){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \</span>
+<a name="l00319"></a>00319 <span class="preprocessor">    if(R>5){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \</span>
+<a name="l00320"></a>00320 <span class="preprocessor">    if(R>6){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \</span>
+<a name="l00321"></a>00321 <span class="preprocessor">    if(R>7){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \</span>
+<a name="l00322"></a>00322 <span class="preprocessor">    if(R>8){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \</span>
+<a name="l00323"></a>00323 <span class="preprocessor">    if(R>9){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \</span>
+<a name="l00324"></a>00324 <span class="preprocessor">    if(R>10){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \</span>
+<a name="l00325"></a>00325 <span class="preprocessor">    if(R>11){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \</span>
+<a name="l00326"></a>00326 <span class="preprocessor">    if(R>12){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \</span>
+<a name="l00327"></a>00327 <span class="preprocessor">    if(R>13){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \</span>
+<a name="l00328"></a>00328 <span class="preprocessor">    if(R>14){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \</span>
+<a name="l00329"></a>00329 <span class="preprocessor">    if(R>15){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \</span>
+<a name="l00330"></a>00330 <span class="preprocessor">    return ctr;                                                         \</span>
+<a name="l00331"></a>00331 <span class="preprocessor">}</span>
+<a name="l00332"></a>00332 <span class="preprocessor"></span>         
+<a name="l00333"></a>00333 _philox2xWbumpkey_tpl(32)
+<a name="l00334"></a>00334 _philox4xWbumpkey_tpl(32)
+<a name="l00335"></a>00335 _philox2xWround_tpl(32, uint32_t) <span class="comment">/* philo2x32round */</span>
+<a name="l00336"></a>00336 _philox4xWround_tpl(32, uint32_t)            <span class="comment">/* philo4x32round */</span>
+<a name="l00338"></a><a class="code" href="group__PhiloxNxW.html#gae7443e1a57429154124943b6a7c0bd08">00338</a> _philoxNxW_tpl(2, 1, 32, uint32_t)    <span class="comment">/* philox2x32bijection */</span>
+<a name="l00339"></a><a class="code" href="group__PhiloxNxW.html#ga67fd1bf4ed858d01663a7d6b219b97a2">00339</a> _philoxNxW_tpl(4, 2, 32, uint32_t)    <span class="comment">/* philox4x32bijection */</span>
+<a name="l00340"></a>00340 <span class="preprocessor">#if R123_USE_PHILOX_64BIT</span>
+<a name="l00341"></a>00341 <span class="preprocessor"></span>
+<a name="l00342"></a>00342 _philox2xWbumpkey_tpl(64)
+<a name="l00343"></a>00343 _philox4xWbumpkey_tpl(64)
+<a name="l00344"></a>00344 _philox2xWround_tpl(64, uint64_t) <span class="comment">/* philo2x64round */</span>
+<a name="l00345"></a>00345 _philox4xWround_tpl(64, uint64_t) <span class="comment">/* philo4x64round */</span>
+<a name="l00347"></a><a class="code" href="group__PhiloxNxW.html#gaca9df5cdadde758a63952daa97ddff91">00347</a> _philoxNxW_tpl(2, 1, 64, uint64_t)    <span class="comment">/* philox2x64bijection */</span>
+<a name="l00348"></a><a class="code" href="group__PhiloxNxW.html#gaf603860d055cee96c75f6986641e9cad">00348</a> _philoxNxW_tpl(4, 2, 64, uint64_t)    <span class="comment">/* philox4x64bijection */</span>
+<a name="l00349"></a>00349 <span class="preprocessor">#endif </span><span class="comment">/* R123_USE_PHILOX_64BIT */</span>
+<a name="l00350"></a>00350 
+<a name="l00351"></a><a class="code" href="philox_8h.html#ab2496424917f063a4990f01943a07fe0">00351</a> <span class="preprocessor">#define philox2x32(c,k) philox2x32_R(philox2x32_rounds, c, k)</span>
+<a name="l00352"></a><a class="code" href="philox_8h.html#a432a3df828dd51acd0b7ec2fee1d4d7e">00352</a> <span class="preprocessor"></span><span class="preprocessor">#define philox4x32(c,k) philox4x32_R(philox4x32_rounds, c, k)</span>
+<a name="l00353"></a>00353 <span class="preprocessor"></span><span class="preprocessor">#if R123_USE_PHILOX_64BIT</span>
+<a name="l00354"></a><a class="code" href="philox_8h.html#ae6b57a71e4efa369cc19416fc088b5a5">00354</a> <span class="preprocessor"></span><span class="preprocessor">#define philox2x64(c,k) philox2x64_R(philox2x64_rounds, c, k)</span>
+<a name="l00355"></a><a class="code" href="philox_8h.html#a62fb1b4d9775396303ebb2a801fea8e6">00355</a> <span class="preprocessor"></span><span class="preprocessor">#define philox4x64(c,k) philox4x64_R(philox4x64_rounds, c, k)</span>
+<a name="l00356"></a>00356 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* R123_USE_PHILOX_64BIT */</span>
+<a name="l00357"></a>00357 
+<a name="l00358"></a>00358 <span class="preprocessor">#ifdef __cplusplus</span>
+<a name="l00359"></a>00359 <span class="preprocessor"></span><span class="preprocessor">#include <stdexcept></span>
+<a name="l00360"></a>00360 
+<a name="l00363"></a>00363 <span class="preprocessor">#define _PhiloxNxW_base_tpl(CType, KType, N, W)                         \</span>
+<a name="l00364"></a>00364 <span class="preprocessor">namespace r123{                                                          \</span>
+<a name="l00365"></a>00365 <span class="preprocessor">template<unsigned int ROUNDS>                                             \</span>
+<a name="l00366"></a>00366 <span class="preprocessor">struct Philox##N##x##W##_R{                                             \</span>
+<a name="l00367"></a>00367 <span class="preprocessor">    typedef CType ctr_type;                                         \</span>
+<a name="l00368"></a>00368 <span class="preprocessor">    typedef KType key_type;                                             \</span>
+<a name="l00369"></a>00369 <span class="preprocessor">    typedef KType ukey_type;                                         \</span>
+<a name="l00370"></a>00370 <span class="preprocessor">    static const unsigned int rounds=ROUNDS;                                 \</span>
+<a name="l00371"></a>00371 <span class="preprocessor">    inline R123_CUDA_DEVICE R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key) const){ \</span>
+<a name="l00372"></a>00372 <span class="preprocessor">        R123_STATIC_ASSERT(ROUNDS<=16, "philox is only unrolled up to 16 rounds\n"); \</span>
+<a name="l00373"></a>00373 <span class="preprocessor">        return philox##N##x##W##_R(ROUNDS, ctr, key);                       \</span>
+<a name="l00374"></a>00374 <span class="preprocessor">    }                                                                   \</span>
+<a name="l00375"></a>00375 <span class="preprocessor">};                                                                      \</span>
+<a name="l00376"></a>00376 <span class="preprocessor">typedef Philox##N##x##W##_R<philox##N##x##W##_rounds> Philox##N##x##W; \</span>
+<a name="l00377"></a>00377 <span class="preprocessor"> } // namespace r123</span>
+<a name="l00378"></a>00378 <span class="preprocessor"></span>
+<a name="l00380"></a><a class="code" href="group__PhiloxNxW.html#ga81659a3ee5a1ca9e2e85c5d725a1ea4f">00380</a> _PhiloxNxW_base_tpl(<a class="code" href="structr123array2x32.html">r123array2x32</a>, <a class="code" href="structr123array1x32.html">r123array1x32</a>, 2, 32) <span class="comment">// Philox2x32_R<R></span>
+<a name="l00381"></a><a class="code" href="group__PhiloxNxW.html#gaafd54060af05012db410034e3c0ecdc4">00381</a> _PhiloxNxW_base_tpl(<a class="code" href="structr123array4x32.html">r123array4x32</a>, <a class="code" href="structr123array2x32.html">r123array2x32</a>, 4, 32) <span class="comment">// Philox4x32_R<R></span>
+<a name="l00382"></a>00382 <span class="preprocessor">#if R123_USE_PHILOX_64BIT</span>
+<a name="l00383"></a><a class="code" href="group__PhiloxNxW.html#ga616a669079ac25119353416c14d46426">00383</a> <span class="preprocessor"></span>_PhiloxNxW_base_tpl(<a class="code" href="structr123array2x64.html">r123array2x64</a>, <a class="code" href="structr123array1x64.html">r123array1x64</a>, 2, 64) <span class="comment">// Philox2x64_R<R></span>
+<a name="l00384"></a><a class="code" href="group__PhiloxNxW.html#ga7776f4d481b7c0ac00db70272a1c77f0">00384</a> _PhiloxNxW_base_tpl(<a class="code" href="structr123array4x64.html">r123array4x64</a>, <a class="code" href="structr123array2x64.html">r123array2x64</a>, 4, 64) <span class="comment">// Philox4x64_R<R></span>
+<a name="l00385"></a>00385 <span class="preprocessor">#endif</span>
+<a name="l00386"></a>00386 <span class="preprocessor"></span>
+<a name="l00387"></a>00387 <span class="comment">/* The _tpl macros don't quite work to do string-pasting inside comments.</span>
+<a name="l00388"></a>00388 <span class="comment">   so we just write out the boilerplate documentation four times... */</span>
+<a name="l00389"></a>00389 
+<a name="l00484"></a>00484 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
+<a name="l00485"></a>00485 
+<a name="l00486"></a>00486 <span class="preprocessor">#endif </span><span class="comment">/* _philox_dot_h_ */</span>
+</pre></div></div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/porting.html b/lib/Random123-1.08/docs/html/porting.html
new file mode 100644
index 0000000..da09d41
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/porting.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Preprocessor symbols for porting Random123 to different platforms.</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li class="current"><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Preprocessor symbols for porting Random123 to different platforms. </h1>  </div>
+</div>
+<div class="contents">
+<p>The Random123 library is portable across C, C++, CUDA, OpenCL environments, and multiple operating systems (Linux, Windows 7, Mac OS X, FreeBSD, Solaris). This level of portability requires the abstraction of some features and idioms that are either not standardized (e.g., asm statments), or for which different vendors have their own standards (e.g., SSE intrinsics) or for which vendors simply refuse to conform to well-established standards (e.g., <inttypes.h>).</p>
+<p><a class="el" href="compilerfeatures_8h.html">Random123/features/compilerfeatures.h</a> conditionally includes a compiler-or-OS-specific Random123/featires/XXXfeatures.h file which defines appropriate values for the preprocessor symbols which can be used with a specific compiler or OS. Those symbols will then be used by other header files and source files in the Random123 library (and may be used by applications) to control what actually gets presented to the compiler.</p>
+<p>Most of the symbols are boolean valued. In general, they will <b>always</b> be defined with value either 1 or 0, so do <b>NOT</b> use #ifdef. Use #if R123_USE_SOMETHING instead.</p>
+<p>Library users can override any value by defining the pp-symbol with a compiler option, e.g.,</p>
+<p>cc -DR123_USE_MULHILO64_C99</p>
+<p>will use a strictly c99 version of the full-width 64x64->128-bit multiplication function, even if it would be disabled by default.</p>
+<p>All boolean-valued pre-processor symbols in <a class="el" href="compilerfeatures_8h.html">Random123/features/compilerfeatures.h</a> start with the prefix R123_USE_ </p>
+<div class="fragment"><pre class="fragment">
+         AES_NI
+         AES_OPENSSL
+         SSE4_2
+         SSE4_1
+         SSE
+
+         STD_RANDOM
+
+         GNU_UINT128
+         ASM_GNU
+         ASM_MSASM
+
+         CPUID_MSVC
+
+         CXX11_RANDOM
+         CXX11_TYPE_TRAITS
+         CXX11_STATIC_ASSERT
+         CXX11_CONSTEXPR
+         CXX11_UNRESTRICTED_UNIONS
+         CXX11_EXPLICIT_CONVERSIONS
+         CXX11_LONG_LONG
+         CXX11 
+   
+         X86INTRIN_H
+         IA32INTRIN_H
+         XMMINTRIN_H
+         EMMINTRIN_H
+         SMMINTRIN_H
+         WMMINTRIN_H
+         INTRIN_H
+
+         MULHILO32_ASM
+         MULHILO64_ASM
+         MULHILO64_MSVC_INTRIN
+         MULHILO64_CUDA_INTRIN
+         MULHILO64_OPENCL_INTRIN
+         MULHILO64_C99
+
+         U01_DOUBLE
+	 
+</pre></div><p> Most have obvious meanings. Some non-obvious ones:</p>
+<p>AES_NI and AES_OPENSSL are not mutually exclusive. You can have one, both or neither.</p>
+<p>GNU_UINT128 says that it's safe to use __uint128_t, but it does not require its use. In particular, it should be used in mulhilo<uint64_t> only if MULHILO64_ASM is unset.</p>
+<p>If the XXXINTRIN_H macros are true, then one should </p>
+<div class="fragment"><pre class="fragment"><span class="preprocessor">#include <xxxintrin.h></span>
+</pre></div><p> to gain accesss to compiler intrinsics.</p>
+<p>The CXX11_SOME_FEATURE macros allow the code to use specific features of the C++11 language and library. The catchall In the absence of a specific CXX11_SOME_FEATURE, the feature is controlled by the catch-all R123_USE_CXX11 macro.</p>
+<p>U01_DOUBLE defaults on, and can be turned off (set to 0) if one does not want the utility functions that convert to double (i.e. u01_*_53()), e.g. on OpenCL without the cl_khr_fp64 extension.</p>
+<p>There are a number of invariants that are always true. Application code may choose to rely on these:</p>
+<ul>
+<li>
+ASM_GNU and ASM_MASM are mutually exclusive </li>
+<li>
+The "higher" SSE values imply the lower ones. </li>
+</ul>
+<p>There are also non-boolean valued symbols:</p>
+<ul>
+<li>
+<p class="startli">R123_STATIC_INLINE - According to both C99 and GNU99, the 'static inline' declaration allows the compiler to not emit code if the function is not used. Note that the semantics of 'inline', 'static' and 'extern' in gcc have changed over time and are subject to modification by command line options, e.g., -std=gnu89, -fgnu-inline. Nevertheless, it appears that the meaning of 'static inline' has not changed over time and (with a little luck) the use of 'static inline' here [...]
+<p class="endli"></p>
+</li>
+<li>
+<p class="startli">R123_FORCE_INLINE(decl) - which expands to 'decl', adorned with the compiler-specific embellishments to strongly encourage that the declared function be inlined. If there is no such compiler-specific magic, it should expand to decl, unadorned.</p>
+<p class="endli"></p>
+</li>
+<li>
+<p class="startli">R123_CUDA_DEVICE - which expands to __device__ (or something else with sufficiently similar semantics) when CUDA is in use, and expands to nothing in other cases.</p>
+<p class="endli"></p>
+</li>
+<li>
+<p class="startli">R123_ASSERT(x) - which expands to assert(x), or maybe to nothing at all if we're in an environment so feature-poor that you can't even call assert (I'm looking at you, CUDA and OpenCL), or even include assert.h safely (OpenCL).</p>
+<p class="endli"></p>
+</li>
+<li>
+<p class="startli">R123_STATIC_ASSERT(expr,msg) - which expands to static_assert(expr,msg), or to an expression that will raise a compile-time exception if expr is not true.</p>
+<p class="endli"></p>
+</li>
+<li>
+<p class="startli">R123_ULONG_LONG - which expands to a declaration of the longest available unsigned integer.</p>
+<p class="endli"></p>
+</li>
+<li>
+<p class="startli">R123_64BIT(x) - expands to something equivalent to UINT64_C(x) from <stdint.h>, even in environments where <stdint.h> is not available, e.g., MSVC and OpenCL.</p>
+<p class="endli"></p>
+</li>
+<li>
+R123_BUILTIN_EXPECT(expr,likely_value) - expands to something with the semantics of gcc's __builtin_expect(expr,likely_value). If the environment has nothing like __builtin_expect, it should expand to just expr. </li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/releasenotes_8dox.html b/lib/Random123-1.08/docs/html/releasenotes_8dox.html
new file mode 100644
index 0000000..890dce6
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/releasenotes_8dox.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: docs/releasenotes.dox File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/releasenotes.dox File Reference</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+</table>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_5f.html b/lib/Random123-1.08/docs/html/search/all_5f.html
new file mode 100644
index 0000000..1b4ad5a
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_5f.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR__5fmax">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR__5fmax')">_Max</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../classr123_1_1MicroURNG.html#a4faecd7ab54c7678ee66c413bb984bf0" target="_parent">r123::MicroURNG::_Max()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123_1_1Engine.html#ae549f81e966b0414bcaf0f24b566ebd8" target="_parent">r123::Engine::_Max()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR__5fmin">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR__5fmin')">_Min</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../classr123_1_1MicroURNG.html#a1f2787f136a8a807d14eab8cb1ca8c14" target="_parent">r123::MicroURNG::_Min()</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../structr123_1_1Engine.html#aa73e4d27847915f1438fd37b30777111" target="_parent">r123::Engine::_Min()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR__5fmm_5fextract_5flo64">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../sse_8h.html#adac6aaf79c4428abcd30bf583eeb5450" target="_parent">_mm_extract_lo64</a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_61.html b/lib/Random123-1.08/docs/html/search/all_61.html
new file mode 100644
index 0000000..029fc8f
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_61.html
@@ -0,0 +1,344 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_aes_2eh">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../aes_8h.html" target="_parent">aes.h</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni1xm128i">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structr123_1_1AESNI1xm128i.html" target="_parent">AESNI1xm128i</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni1xm128i">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../group__AESNI.html#ga3ba5daca2d4d076ece24900084e71311" target="_parent">aesni1xm128i</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni1xm128i_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../group__AESNI.html#gaab0f809a22e01e6cb6135f6af73bb532" target="_parent">aesni1xm128i_ctr_t</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni1xm128i_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_aesni1xm128i_5fkey_5ft')">aesni1xm128i_key_t</a>
+  <div class="SRChildren">
+    <a id="Item4_c0" onkeydown="return searchResults.NavChild(event,4,0)" onkeypress="return searchResults.NavChild(event,4,0)" onkeyup="return searchResults.NavChild(event,4,0)" class="SRScope" href="../structaesni1xm128i__key__t.html" target="_parent">aesni1xm128i_key_t</a>
+    <a id="Item4_c1" onkeydown="return searchResults.NavChild(event,4,1)" onkeypress="return searchResults.NavChild(event,4,1)" onkeyup="return searchResults.NavChild(event,4,1)" class="SRScope" href="../structaesni1xm128i__key__t.html#af1002e5b771616db8f12c793fc994c41" target="_parent">aesni1xm128i_key_t::aesni1xm128i_key_t()</a>
+    <a id="Item4_c2" onkeydown="return searchResults.NavChild(event,4,2)" onkeypress="return searchResults.NavChild(event,4,2)" onkeyup="return searchResults.NavChild(event,4,2)" class="SRScope" href="../structaesni1xm128i__key__t.html#a2076072522f671a8596a831cc93dc616" target="_parent">aesni1xm128i_key_t::aesni1xm128i_key_t(const aesni1xm128i_ukey_t &uk)</a>
+    <a id="Item4_c3" onkeydown="return searchResults.NavChild(event,4,3)" onkeypress="return searchResults.NavChild(event,4,3)" onkeyup="return searchResults.NavChild(event,4,3)" class="SRScope" href="../structaesni1xm128i__key__t.html#a43d53407125d4cec0d6a14586c0357e3" target="_parent">aesni1xm128i_key_t::aesni1xm128i_key_t(const aesni4x32_ukey_t &uk)</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni1xm128i_5fr">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../structr123_1_1AESNI1xm128i__R.html" target="_parent">AESNI1xm128i_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni1xm128i_5fr">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="../group__AESNI.html#ga89d9042c08ae5eef4c98bfb9609ebd34" target="_parent">aesni1xm128i_R</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni1xm128i_5frounds">
+ <div class="SREntry">
+  <a id="Item7" onkeydown="return searchResults.Nav(event,7)" onkeypress="return searchResults.Nav(event,7)" onkeyup="return searchResults.Nav(event,7)" class="SRSymbol" href="../group__AESNI.html#gga2814629101926e23001d564630ba7b86a2c404c51fea10eeacb032081dbab2408" target="_parent">aesni1xm128i_rounds</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni1xm128i_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item8" onkeydown="return searchResults.Nav(event,8)" onkeypress="return searchResults.Nav(event,8)" onkeyup="return searchResults.Nav(event,8)" class="SRSymbol" href="../group__AESNI.html#gaf4fa221e6387d0454e2e6399245bdead" target="_parent">aesni1xm128i_ukey_t</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32">
+ <div class="SREntry">
+  <a id="Item9" onkeydown="return searchResults.Nav(event,9)" onkeypress="return searchResults.Nav(event,9)" onkeyup="return searchResults.Nav(event,9)" class="SRSymbol" href="../structr123_1_1AESNI4x32.html" target="_parent">AESNI4x32</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32">
+ <div class="SREntry">
+  <a id="Item10" onkeydown="return searchResults.Nav(event,10)" onkeypress="return searchResults.Nav(event,10)" onkeyup="return searchResults.Nav(event,10)" class="SRSymbol" href="../group__AESNI.html#gae3950c524818b49d1cdfad481880a33a" target="_parent">aesni4x32</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item11" onkeydown="return searchResults.Nav(event,11)" onkeypress="return searchResults.Nav(event,11)" onkeyup="return searchResults.Nav(event,11)" class="SRSymbol" href="../group__AESNI.html#gae7459b3f4ee0e424cb4f13b4d5efc1fe" target="_parent">aesni4x32_ctr_t</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item12" onkeydown="return searchResults.Nav(event,12)" onkeypress="return searchResults.Nav(event,12)" onkeyup="return searchResults.Nav(event,12)" class="SRSymbol" href="../group__AESNI.html#ga6d88accdcfa339b48e14021a572e269b" target="_parent">aesni4x32_key_t</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32_5fr">
+ <div class="SREntry">
+  <a id="Item13" onkeydown="return searchResults.Nav(event,13)" onkeypress="return searchResults.Nav(event,13)" onkeyup="return searchResults.Nav(event,13)" class="SRSymbol" href="../structr123_1_1AESNI4x32__R.html" target="_parent">AESNI4x32_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32_5fr">
+ <div class="SREntry">
+  <a id="Item14" onkeydown="return searchResults.Nav(event,14)" onkeypress="return searchResults.Nav(event,14)" onkeyup="return searchResults.Nav(event,14)" class="SRSymbol" href="../group__AESNI.html#gae28b030e9786a6f36a47df8f211a750b" target="_parent">aesni4x32_R</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32_5frounds">
+ <div class="SREntry">
+  <a id="Item15" onkeydown="return searchResults.Nav(event,15)" onkeypress="return searchResults.Nav(event,15)" onkeyup="return searchResults.Nav(event,15)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_aesni4x32_5frounds')">aesni4x32_rounds</a>
+  <div class="SRChildren">
+    <a id="Item15_c0" onkeydown="return searchResults.NavChild(event,15,0)" onkeypress="return searchResults.NavChild(event,15,0)" onkeyup="return searchResults.NavChild(event,15,0)" class="SRScope" href="../aes_8h.html#a0e4c28ad2773dac7eb59004947c9e02b" target="_parent">aesni4x32_rounds(): aes.h</a>
+    <a id="Item15_c1" onkeydown="return searchResults.NavChild(event,15,1)" onkeypress="return searchResults.NavChild(event,15,1)" onkeyup="return searchResults.NavChild(event,15,1)" class="SRScope" href="../group__AESNI.html#gga1557a9d6e95543a3c4ca9082a4c14b0dad65178990d928071f958bf2413ebdb4b" target="_parent">aesni4x32_rounds(): aes.h</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item16" onkeydown="return searchResults.Nav(event,16)" onkeypress="return searchResults.Nav(event,16)" onkeyup="return searchResults.Nav(event,16)" class="SRSymbol" href="../group__AESNI.html#gac2c3248ec3b03591d442cf634fb51af5" target="_parent">aesni4x32_ukey_t</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32keyinit">
+ <div class="SREntry">
+  <a id="Item17" onkeydown="return searchResults.Nav(event,17)" onkeypress="return searchResults.Nav(event,17)" onkeyup="return searchResults.Nav(event,17)" class="SRSymbol" href="../group__AESNI.html#ga2aa21ba4a3d3850faa96e7834114d8e1" target="_parent">aesni4x32keyinit</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array_2eh">
+ <div class="SREntry">
+  <a id="Item18" onkeydown="return searchResults.Nav(event,18)" onkeypress="return searchResults.Nav(event,18)" onkeyup="return searchResults.Nav(event,18)" class="SRSymbol" href="../array_8h.html" target="_parent">array.h</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_array16x8">
+ <div class="SREntry">
+  <a id="Item19" onkeydown="return searchResults.Nav(event,19)" onkeypress="return searchResults.Nav(event,19)" onkeyup="return searchResults.Nav(event,19)" class="SRSymbol" href="../namespacer123.html#ac3148aed79e81051d40e9b29a8914cf4" target="_parent">Array16x8</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array1x32">
+ <div class="SREntry">
+  <a id="Item20" onkeydown="return searchResults.Nav(event,20)" onkeypress="return searchResults.Nav(event,20)" onkeyup="return searchResults.Nav(event,20)" class="SRSymbol" href="../namespacer123.html#acc1b0ed919ef806de26f5ff5b934b313" target="_parent">Array1x32</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array1x64">
+ <div class="SREntry">
+  <a id="Item21" onkeydown="return searchResults.Nav(event,21)" onkeypress="return searchResults.Nav(event,21)" onkeyup="return searchResults.Nav(event,21)" class="SRSymbol" href="../namespacer123.html#aeb81c4265759fad9993e09fda21ff4fa" target="_parent">Array1x64</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array1xm128i">
+ <div class="SREntry">
+  <a id="Item22" onkeydown="return searchResults.Nav(event,22)" onkeypress="return searchResults.Nav(event,22)" onkeyup="return searchResults.Nav(event,22)" class="SRSymbol" href="../namespacer123.html#adbb729a97ee41e7cb075058b55a58c5d" target="_parent">Array1xm128i</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array2x32">
+ <div class="SREntry">
+  <a id="Item23" onkeydown="return searchResults.Nav(event,23)" onkeypress="return searchResults.Nav(event,23)" onkeyup="return searchResults.Nav(event,23)" class="SRSymbol" href="../namespacer123.html#ab853ac55f8188e4a09d12ab23f2d8dea" target="_parent">Array2x32</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array2x64">
+ <div class="SREntry">
+  <a id="Item24" onkeydown="return searchResults.Nav(event,24)" onkeypress="return searchResults.Nav(event,24)" onkeyup="return searchResults.Nav(event,24)" class="SRSymbol" href="../namespacer123.html#ad3b670563762f605a6fce61b5bab8412" target="_parent">Array2x64</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array4x32">
+ <div class="SREntry">
+  <a id="Item25" onkeydown="return searchResults.Nav(event,25)" onkeypress="return searchResults.Nav(event,25)" onkeyup="return searchResults.Nav(event,25)" class="SRSymbol" href="../namespacer123.html#a0c352c3ea265e7fd182559e557113195" target="_parent">Array4x32</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array4x64">
+ <div class="SREntry">
+  <a id="Item26" onkeydown="return searchResults.Nav(event,26)" onkeypress="return searchResults.Nav(event,26)" onkeyup="return searchResults.Nav(event,26)" class="SRSymbol" href="../namespacer123.html#a54c1a72670974c11acff37279eb23147" target="_parent">Array4x64</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array8x32">
+ <div class="SREntry">
+  <a id="Item27" onkeydown="return searchResults.Nav(event,27)" onkeypress="return searchResults.Nav(event,27)" onkeyup="return searchResults.Nav(event,27)" class="SRSymbol" href="../namespacer123.html#aea31cf23efbfcc11808b7e394922f4d2" target="_parent">Array8x32</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars_2eh">
+ <div class="SREntry">
+  <a id="Item28" onkeydown="return searchResults.Nav(event,28)" onkeypress="return searchResults.Nav(event,28)" onkeyup="return searchResults.Nav(event,28)" class="SRSymbol" href="../ars_8h.html" target="_parent">ars.h</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128i">
+ <div class="SREntry">
+  <a id="Item29" onkeydown="return searchResults.Nav(event,29)" onkeypress="return searchResults.Nav(event,29)" onkeyup="return searchResults.Nav(event,29)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_ars1xm128i')">ars1xm128i</a>
+  <div class="SRChildren">
+    <a id="Item29_c0" onkeydown="return searchResults.NavChild(event,29,0)" onkeypress="return searchResults.NavChild(event,29,0)" onkeyup="return searchResults.NavChild(event,29,0)" class="SRScope" href="../group__AESNI.html#ga22e0a9c885b544115d44d26cc7777303" target="_parent">ars1xm128i(): ars.h</a>
+    <a id="Item29_c1" onkeydown="return searchResults.NavChild(event,29,1)" onkeypress="return searchResults.NavChild(event,29,1)" onkeyup="return searchResults.NavChild(event,29,1)" class="SRScope" href="../namespacer123.html#a964aa9123913d1f8cf535e0caaa4155f" target="_parent">r123::ARS1xm128i()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128i_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item30" onkeydown="return searchResults.Nav(event,30)" onkeypress="return searchResults.Nav(event,30)" onkeyup="return searchResults.Nav(event,30)" class="SRSymbol" href="../group__AESNI.html#ga23ddf8109ce08f2bc14401c5f269d2a9" target="_parent">ars1xm128i_ctr_t</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128i_5fdefault_5frounds">
+ <div class="SREntry">
+  <a id="Item31" onkeydown="return searchResults.Nav(event,31)" onkeypress="return searchResults.Nav(event,31)" onkeyup="return searchResults.Nav(event,31)" class="SRSymbol" href="../ars_8h.html#aa1e31853c7493df739897205eb4f4a82" target="_parent">ARS1xm128i_DEFAULT_ROUNDS</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128i_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item32" onkeydown="return searchResults.Nav(event,32)" onkeypress="return searchResults.Nav(event,32)" onkeyup="return searchResults.Nav(event,32)" class="SRSymbol" href="../group__AESNI.html#ga2c5b351a47bb39f4d1769506c98c06e2" target="_parent">ars1xm128i_key_t</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128i_5fr">
+ <div class="SREntry">
+  <a id="Item33" onkeydown="return searchResults.Nav(event,33)" onkeypress="return searchResults.Nav(event,33)" onkeyup="return searchResults.Nav(event,33)" class="SRSymbol" href="../group__AESNI.html#gaddc6efc2007f6f66ee914eb7074cff1e" target="_parent">ars1xm128i_R</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128i_5fr">
+ <div class="SREntry">
+  <a id="Item34" onkeydown="return searchResults.Nav(event,34)" onkeypress="return searchResults.Nav(event,34)" onkeyup="return searchResults.Nav(event,34)" class="SRSymbol" href="../structr123_1_1ARS1xm128i__R.html" target="_parent">ARS1xm128i_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128i_5frounds">
+ <div class="SREntry">
+  <a id="Item35" onkeydown="return searchResults.Nav(event,35)" onkeypress="return searchResults.Nav(event,35)" onkeyup="return searchResults.Nav(event,35)" class="SRSymbol" href="../group__AESNI.html#ggabf0a537666d4d1421144cb0a5e67666cade1fd46524355ec1d7ce63fd13b54992" target="_parent">ars1xm128i_rounds</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128i_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item36" onkeydown="return searchResults.Nav(event,36)" onkeypress="return searchResults.Nav(event,36)" onkeyup="return searchResults.Nav(event,36)" class="SRSymbol" href="../group__AESNI.html#gaeaa234225e7dcec2ffcdb32a0faad4f0" target="_parent">ars1xm128i_ukey_t</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128ikeyinit">
+ <div class="SREntry">
+  <a id="Item37" onkeydown="return searchResults.Nav(event,37)" onkeypress="return searchResults.Nav(event,37)" onkeyup="return searchResults.Nav(event,37)" class="SRSymbol" href="../group__AESNI.html#gae307c205a2ad19142bbe70919abfbfc2" target="_parent">ars1xm128ikeyinit</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars4x32">
+ <div class="SREntry">
+  <a id="Item38" onkeydown="return searchResults.Nav(event,38)" onkeypress="return searchResults.Nav(event,38)" onkeyup="return searchResults.Nav(event,38)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_ars4x32')">ARS4x32</a>
+  <div class="SRChildren">
+    <a id="Item38_c0" onkeydown="return searchResults.NavChild(event,38,0)" onkeypress="return searchResults.NavChild(event,38,0)" onkeyup="return searchResults.NavChild(event,38,0)" class="SRScope" href="../namespacer123.html#afd2070dc979024a14317bd57c3a4c352" target="_parent">r123::ARS4x32()</a>
+    <a id="Item38_c1" onkeydown="return searchResults.NavChild(event,38,1)" onkeypress="return searchResults.NavChild(event,38,1)" onkeyup="return searchResults.NavChild(event,38,1)" class="SRScope" href="../group__AESNI.html#ga088ecbf341caf05e491ce246f2ea2d30" target="_parent">ars4x32(): ars.h</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars4x32_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item39" onkeydown="return searchResults.Nav(event,39)" onkeypress="return searchResults.Nav(event,39)" onkeyup="return searchResults.Nav(event,39)" class="SRSymbol" href="../group__AESNI.html#ga61721da91a455cb587ce6bc4a0f56117" target="_parent">ars4x32_ctr_t</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars4x32_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item40" onkeydown="return searchResults.Nav(event,40)" onkeypress="return searchResults.Nav(event,40)" onkeyup="return searchResults.Nav(event,40)" class="SRSymbol" href="../group__AESNI.html#ga3a1426aa6aaa06330d48ec8173cd3e7b" target="_parent">ars4x32_key_t</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars4x32_5fr">
+ <div class="SREntry">
+  <a id="Item41" onkeydown="return searchResults.Nav(event,41)" onkeypress="return searchResults.Nav(event,41)" onkeyup="return searchResults.Nav(event,41)" class="SRSymbol" href="../group__AESNI.html#gab13b093252d4bb3389d27d4e3b04dae8" target="_parent">ars4x32_R</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars4x32_5fr">
+ <div class="SREntry">
+  <a id="Item42" onkeydown="return searchResults.Nav(event,42)" onkeypress="return searchResults.Nav(event,42)" onkeyup="return searchResults.Nav(event,42)" class="SRSymbol" href="../structr123_1_1ARS4x32__R.html" target="_parent">ARS4x32_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars4x32_5frounds">
+ <div class="SREntry">
+  <a id="Item43" onkeydown="return searchResults.Nav(event,43)" onkeypress="return searchResults.Nav(event,43)" onkeyup="return searchResults.Nav(event,43)" class="SRSymbol" href="../group__AESNI.html#ggaa623b038fa0c8d8d2864fdc0e45884d6a5e715f357770a0f188ef493e6e63d31d" target="_parent">ars4x32_rounds</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars4x32_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item44" onkeydown="return searchResults.Nav(event,44)" onkeypress="return searchResults.Nav(event,44)" onkeyup="return searchResults.Nav(event,44)" class="SRSymbol" href="../group__AESNI.html#ga54cb318ff6bd4df405897b2b9a4b109f" target="_parent">ars4x32_ukey_t</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars4x32keyinit">
+ <div class="SREntry">
+  <a id="Item45" onkeydown="return searchResults.Nav(event,45)" onkeypress="return searchResults.Nav(event,45)" onkeyup="return searchResults.Nav(event,45)" class="SRSymbol" href="../group__AESNI.html#ga1f3a02ea711ae6bacb0875f11a255516" target="_parent">ars4x32keyinit</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_assemble_5ffrom_5fu32">
+ <div class="SREntry">
+  <a id="Item46" onkeydown="return searchResults.Nav(event,46)" onkeypress="return searchResults.Nav(event,46)" onkeyup="return searchResults.Nav(event,46)" class="SRSymbol" href="../sse_8h.html#a99c42d1da8da3a4a273556a7817b5c1f" target="_parent">assemble_from_u32</a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_assemble_5ffrom_5fu32_3c_20r123m128i_20_3e">
+ <div class="SREntry">
+  <a id="Item47" onkeydown="return searchResults.Nav(event,47)" onkeypress="return searchResults.Nav(event,47)" onkeyup="return searchResults.Nav(event,47)" class="SRSymbol" href="../sse_8h.html#a0cd6ca87c67023d7afda38319ab40e43" target="_parent">assemble_from_u32< r123m128i ></a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_at">
+ <div class="SREntry">
+  <a id="Item48" onkeydown="return searchResults.Nav(event,48)" onkeypress="return searchResults.Nav(event,48)" onkeyup="return searchResults.Nav(event,48)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_at')">at</a>
+  <div class="SRChildren">
+    <a id="Item48_c0" onkeydown="return searchResults.NavChild(event,48,0)" onkeypress="return searchResults.NavChild(event,48,0)" onkeyup="return searchResults.NavChild(event,48,0)" class="SRScope" href="../structr123array1x32.html#a300f163f4293879003e6831b1180350d" target="_parent">r123array1x32::at(size_type i)</a>
+    <a id="Item48_c1" onkeydown="return searchResults.NavChild(event,48,1)" onkeypress="return searchResults.NavChild(event,48,1)" onkeyup="return searchResults.NavChild(event,48,1)" class="SRScope" href="../structr123array1x32.html#a1d57048b43ee45e2a94ef372b4707783" target="_parent">r123array1x32::at(size_type i) const </a>
+    <a id="Item48_c2" onkeydown="return searchResults.NavChild(event,48,2)" onkeypress="return searchResults.NavChild(event,48,2)" onkeyup="return searchResults.NavChild(event,48,2)" class="SRScope" href="../structr123array2x32.html#aa29e0ae21be47bda2ac83e6c945b5719" target="_parent">r123array2x32::at(size_type i)</a>
+    <a id="Item48_c3" onkeydown="return searchResults.NavChild(event,48,3)" onkeypress="return searchResults.NavChild(event,48,3)" onkeyup="return searchResults.NavChild(event,48,3)" class="SRScope" href="../structr123array2x32.html#ae985b8811e4e8849d5f28dae76231dca" target="_parent">r123array2x32::at(size_type i) const </a>
+    <a id="Item48_c4" onkeydown="return searchResults.NavChild(event,48,4)" onkeypress="return searchResults.NavChild(event,48,4)" onkeyup="return searchResults.NavChild(event,48,4)" class="SRScope" href="../structr123array4x32.html#ac44f12891effca2d069a3a3a8173dd62" target="_parent">r123array4x32::at(size_type i)</a>
+    <a id="Item48_c5" onkeydown="return searchResults.NavChild(event,48,5)" onkeypress="return searchResults.NavChild(event,48,5)" onkeyup="return searchResults.NavChild(event,48,5)" class="SRScope" href="../structr123array4x32.html#abdb3253eb03291895f89885298e17169" target="_parent">r123array4x32::at(size_type i) const </a>
+    <a id="Item48_c6" onkeydown="return searchResults.NavChild(event,48,6)" onkeypress="return searchResults.NavChild(event,48,6)" onkeyup="return searchResults.NavChild(event,48,6)" class="SRScope" href="../structr123array8x32.html#aa6c0788063f7e7b717aae2d9606cf302" target="_parent">r123array8x32::at(size_type i)</a>
+    <a id="Item48_c7" onkeydown="return searchResults.NavChild(event,48,7)" onkeypress="return searchResults.NavChild(event,48,7)" onkeyup="return searchResults.NavChild(event,48,7)" class="SRScope" href="../structr123array8x32.html#a79f982be8c435215a5e812e88e500216" target="_parent">r123array8x32::at(size_type i) const </a>
+    <a id="Item48_c8" onkeydown="return searchResults.NavChild(event,48,8)" onkeypress="return searchResults.NavChild(event,48,8)" onkeyup="return searchResults.NavChild(event,48,8)" class="SRScope" href="../structr123array1x64.html#a6575299135436acf90fcb8da262d623c" target="_parent">r123array1x64::at(size_type i)</a>
+    <a id="Item48_c9" onkeydown="return searchResults.NavChild(event,48,9)" onkeypress="return searchResults.NavChild(event,48,9)" onkeyup="return searchResults.NavChild(event,48,9)" class="SRScope" href="../structr123array1x64.html#af6cf7706792eb1e44902dd94df388726" target="_parent">r123array1x64::at(size_type i) const </a>
+    <a id="Item48_c10" onkeydown="return searchResults.NavChild(event,48,10)" onkeypress="return searchResults.NavChild(event,48,10)" onkeyup="return searchResults.NavChild(event,48,10)" class="SRScope" href="../structr123array2x64.html#a46789872cf0f3a6310f864b2a35b2ea7" target="_parent">r123array2x64::at(size_type i)</a>
+    <a id="Item48_c11" onkeydown="return searchResults.NavChild(event,48,11)" onkeypress="return searchResults.NavChild(event,48,11)" onkeyup="return searchResults.NavChild(event,48,11)" class="SRScope" href="../structr123array2x64.html#a971ddfa7c395d161028e16c829179f3c" target="_parent">r123array2x64::at(size_type i) const </a>
+    <a id="Item48_c12" onkeydown="return searchResults.NavChild(event,48,12)" onkeypress="return searchResults.NavChild(event,48,12)" onkeyup="return searchResults.NavChild(event,48,12)" class="SRScope" href="../structr123array4x64.html#a5b60c8dcd20ce894109e346fdb4cbdb2" target="_parent">r123array4x64::at(size_type i)</a>
+    <a id="Item48_c13" onkeydown="return searchResults.NavChild(event,48,13)" onkeypress="return searchResults.NavChild(event,48,13)" onkeyup="return searchResults.NavChild(event,48,13)" class="SRScope" href="../structr123array4x64.html#a893d3db3d274fc15ac32bc7cbab0e82a" target="_parent">r123array4x64::at(size_type i) const </a>
+    <a id="Item48_c14" onkeydown="return searchResults.NavChild(event,48,14)" onkeypress="return searchResults.NavChild(event,48,14)" onkeyup="return searchResults.NavChild(event,48,14)" class="SRScope" href="../structr123array16x8.html#a7742edac513767b0f3ca6abe1a3eabb7" target="_parent">r123array16x8::at(size_type i)</a>
+    <a id="Item48_c15" onkeydown="return searchResults.NavChild(event,48,15)" onkeypress="return searchResults.NavChild(event,48,15)" onkeyup="return searchResults.NavChild(event,48,15)" class="SRScope" href="../structr123array16x8.html#a088dbabe23cf873de370af292052905e" target="_parent">r123array16x8::at(size_type i) const </a>
+    <a id="Item48_c16" onkeydown="return searchResults.NavChild(event,48,16)" onkeypress="return searchResults.NavChild(event,48,16)" onkeyup="return searchResults.NavChild(event,48,16)" class="SRScope" href="../structr123array1xm128i.html#a5e8a81ee3f7c3b022554c0023a686700" target="_parent">r123array1xm128i::at(size_type i)</a>
+    <a id="Item48_c17" onkeydown="return searchResults.NavChild(event,48,17)" onkeypress="return searchResults.NavChild(event,48,17)" onkeyup="return searchResults.NavChild(event,48,17)" class="SRScope" href="../structr123array1xm128i.html#a53ad470978c3105c97f502959d31ffa0" target="_parent">r123array1xm128i::at(size_type i) const </a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_62.html b/lib/Random123-1.08/docs/html/search/all_62.html
new file mode 100644
index 0000000..bb75812
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_62.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_b">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b" target="_parent">b</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_back">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_back')">back</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../structr123array1x32.html#a3738a65a648899db793e81b53c252785" target="_parent">r123array1x32::back()</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../structr123array1x32.html#a32b89fb1c75e3cc26ff3b5acdd40af99" target="_parent">r123array1x32::back() const </a>
+    <a id="Item1_c2" onkeydown="return searchResults.NavChild(event,1,2)" onkeypress="return searchResults.NavChild(event,1,2)" onkeyup="return searchResults.NavChild(event,1,2)" class="SRScope" href="../structr123array2x32.html#a3da7214b9946a3c8653312dcfa42a288" target="_parent">r123array2x32::back()</a>
+    <a id="Item1_c3" onkeydown="return searchResults.NavChild(event,1,3)" onkeypress="return searchResults.NavChild(event,1,3)" onkeyup="return searchResults.NavChild(event,1,3)" class="SRScope" href="../structr123array2x32.html#ae176c02299531373a0fff9a5f55226e5" target="_parent">r123array2x32::back() const </a>
+    <a id="Item1_c4" onkeydown="return searchResults.NavChild(event,1,4)" onkeypress="return searchResults.NavChild(event,1,4)" onkeyup="return searchResults.NavChild(event,1,4)" class="SRScope" href="../structr123array4x32.html#a70fd9b24cb3b126eb15c23049f786653" target="_parent">r123array4x32::back()</a>
+    <a id="Item1_c5" onkeydown="return searchResults.NavChild(event,1,5)" onkeypress="return searchResults.NavChild(event,1,5)" onkeyup="return searchResults.NavChild(event,1,5)" class="SRScope" href="../structr123array4x32.html#a4e1cba8583b2fac8cc3bf854956191c4" target="_parent">r123array4x32::back() const </a>
+    <a id="Item1_c6" onkeydown="return searchResults.NavChild(event,1,6)" onkeypress="return searchResults.NavChild(event,1,6)" onkeyup="return searchResults.NavChild(event,1,6)" class="SRScope" href="../structr123array8x32.html#a1d4176e4ad6d70c98805e0c924d2df37" target="_parent">r123array8x32::back()</a>
+    <a id="Item1_c7" onkeydown="return searchResults.NavChild(event,1,7)" onkeypress="return searchResults.NavChild(event,1,7)" onkeyup="return searchResults.NavChild(event,1,7)" class="SRScope" href="../structr123array8x32.html#a73f5b5012b1e6595f727ef88e60a53ac" target="_parent">r123array8x32::back() const </a>
+    <a id="Item1_c8" onkeydown="return searchResults.NavChild(event,1,8)" onkeypress="return searchResults.NavChild(event,1,8)" onkeyup="return searchResults.NavChild(event,1,8)" class="SRScope" href="../structr123array1x64.html#ab85790fdee269501a80fe31179efc9f8" target="_parent">r123array1x64::back()</a>
+    <a id="Item1_c9" onkeydown="return searchResults.NavChild(event,1,9)" onkeypress="return searchResults.NavChild(event,1,9)" onkeyup="return searchResults.NavChild(event,1,9)" class="SRScope" href="../structr123array1x64.html#a2cd091b3015befa2b954ddab91271e39" target="_parent">r123array1x64::back() const </a>
+    <a id="Item1_c10" onkeydown="return searchResults.NavChild(event,1,10)" onkeypress="return searchResults.NavChild(event,1,10)" onkeyup="return searchResults.NavChild(event,1,10)" class="SRScope" href="../structr123array2x64.html#a9beb3e776cb4f3cbee6846518749cb03" target="_parent">r123array2x64::back()</a>
+    <a id="Item1_c11" onkeydown="return searchResults.NavChild(event,1,11)" onkeypress="return searchResults.NavChild(event,1,11)" onkeyup="return searchResults.NavChild(event,1,11)" class="SRScope" href="../structr123array2x64.html#ac72fd3a39821ca25f94258f97da371c5" target="_parent">r123array2x64::back() const </a>
+    <a id="Item1_c12" onkeydown="return searchResults.NavChild(event,1,12)" onkeypress="return searchResults.NavChild(event,1,12)" onkeyup="return searchResults.NavChild(event,1,12)" class="SRScope" href="../structr123array4x64.html#abb40868277e8a943a0b5464985baceb5" target="_parent">r123array4x64::back()</a>
+    <a id="Item1_c13" onkeydown="return searchResults.NavChild(event,1,13)" onkeypress="return searchResults.NavChild(event,1,13)" onkeyup="return searchResults.NavChild(event,1,13)" class="SRScope" href="../structr123array4x64.html#a9006cfe7882bbc791a81a52f7cc0fd2d" target="_parent">r123array4x64::back() const </a>
+    <a id="Item1_c14" onkeydown="return searchResults.NavChild(event,1,14)" onkeypress="return searchResults.NavChild(event,1,14)" onkeyup="return searchResults.NavChild(event,1,14)" class="SRScope" href="../structr123array16x8.html#ae607d3b3d068aec88672241fc97948cb" target="_parent">r123array16x8::back()</a>
+    <a id="Item1_c15" onkeydown="return searchResults.NavChild(event,1,15)" onkeypress="return searchResults.NavChild(event,1,15)" onkeyup="return searchResults.NavChild(event,1,15)" class="SRScope" href="../structr123array16x8.html#a6e5e98c20ae0e6bf4f8a897c08b0700e" target="_parent">r123array16x8::back() const </a>
+    <a id="Item1_c16" onkeydown="return searchResults.NavChild(event,1,16)" onkeypress="return searchResults.NavChild(event,1,16)" onkeyup="return searchResults.NavChild(event,1,16)" class="SRScope" href="../structr123array1xm128i.html#a082b7b75374d69149ee03d1d228e2508" target="_parent">r123array1xm128i::back()</a>
+    <a id="Item1_c17" onkeydown="return searchResults.NavChild(event,1,17)" onkeypress="return searchResults.NavChild(event,1,17)" onkeyup="return searchResults.NavChild(event,1,17)" class="SRScope" href="../structr123array1xm128i.html#a458be25b18c6e59d5c72e2c4d4ea6354" target="_parent">r123array1xm128i::back() const </a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_bctype">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../structr123_1_1ReinterpretCtr.html#ae0accaee618b5eb28a24acd516b3a4c6" target="_parent">bctype</a>
+  <span class="SRScope">r123::ReinterpretCtr</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_begin">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_begin')">begin</a>
+  <div class="SRChildren">
+    <a id="Item3_c0" onkeydown="return searchResults.NavChild(event,3,0)" onkeypress="return searchResults.NavChild(event,3,0)" onkeyup="return searchResults.NavChild(event,3,0)" class="SRScope" href="../structr123array1x32.html#a86b7d754ff8dd69e0565edfdbd060cb4" target="_parent">r123array1x32::begin()</a>
+    <a id="Item3_c1" onkeydown="return searchResults.NavChild(event,3,1)" onkeypress="return searchResults.NavChild(event,3,1)" onkeyup="return searchResults.NavChild(event,3,1)" class="SRScope" href="../structr123array1x32.html#a19089b8de6c637803408512407a4da91" target="_parent">r123array1x32::begin() const </a>
+    <a id="Item3_c2" onkeydown="return searchResults.NavChild(event,3,2)" onkeypress="return searchResults.NavChild(event,3,2)" onkeyup="return searchResults.NavChild(event,3,2)" class="SRScope" href="../structr123array2x32.html#a96730b28149000a3ea4c6b0f05e1777b" target="_parent">r123array2x32::begin()</a>
+    <a id="Item3_c3" onkeydown="return searchResults.NavChild(event,3,3)" onkeypress="return searchResults.NavChild(event,3,3)" onkeyup="return searchResults.NavChild(event,3,3)" class="SRScope" href="../structr123array2x32.html#aa52b394a0c44b755e5c0d0409dc2c4ea" target="_parent">r123array2x32::begin() const </a>
+    <a id="Item3_c4" onkeydown="return searchResults.NavChild(event,3,4)" onkeypress="return searchResults.NavChild(event,3,4)" onkeyup="return searchResults.NavChild(event,3,4)" class="SRScope" href="../structr123array4x32.html#a96a9c7e3ece3d2b128cf7f264af6ea3c" target="_parent">r123array4x32::begin()</a>
+    <a id="Item3_c5" onkeydown="return searchResults.NavChild(event,3,5)" onkeypress="return searchResults.NavChild(event,3,5)" onkeyup="return searchResults.NavChild(event,3,5)" class="SRScope" href="../structr123array4x32.html#a830254ee0db7bf12facf67f23428d2d9" target="_parent">r123array4x32::begin() const </a>
+    <a id="Item3_c6" onkeydown="return searchResults.NavChild(event,3,6)" onkeypress="return searchResults.NavChild(event,3,6)" onkeyup="return searchResults.NavChild(event,3,6)" class="SRScope" href="../structr123array8x32.html#a7ae561c4d544e31f7bd2f256cb32f878" target="_parent">r123array8x32::begin()</a>
+    <a id="Item3_c7" onkeydown="return searchResults.NavChild(event,3,7)" onkeypress="return searchResults.NavChild(event,3,7)" onkeyup="return searchResults.NavChild(event,3,7)" class="SRScope" href="../structr123array8x32.html#ad924bdaf9facc3271ca2ae727cda23a3" target="_parent">r123array8x32::begin() const </a>
+    <a id="Item3_c8" onkeydown="return searchResults.NavChild(event,3,8)" onkeypress="return searchResults.NavChild(event,3,8)" onkeyup="return searchResults.NavChild(event,3,8)" class="SRScope" href="../structr123array1x64.html#af9150347761c6df32673bbd2411e67d0" target="_parent">r123array1x64::begin()</a>
+    <a id="Item3_c9" onkeydown="return searchResults.NavChild(event,3,9)" onkeypress="return searchResults.NavChild(event,3,9)" onkeyup="return searchResults.NavChild(event,3,9)" class="SRScope" href="../structr123array1x64.html#a0fddc6603fe2eb4547aeb57498ffe3c2" target="_parent">r123array1x64::begin() const </a>
+    <a id="Item3_c10" onkeydown="return searchResults.NavChild(event,3,10)" onkeypress="return searchResults.NavChild(event,3,10)" onkeyup="return searchResults.NavChild(event,3,10)" class="SRScope" href="../structr123array2x64.html#a0fcc60a49efd917a3b630cf53c526311" target="_parent">r123array2x64::begin()</a>
+    <a id="Item3_c11" onkeydown="return searchResults.NavChild(event,3,11)" onkeypress="return searchResults.NavChild(event,3,11)" onkeyup="return searchResults.NavChild(event,3,11)" class="SRScope" href="../structr123array2x64.html#a8cf4fadef6bdc6d438db173bc1d31165" target="_parent">r123array2x64::begin() const </a>
+    <a id="Item3_c12" onkeydown="return searchResults.NavChild(event,3,12)" onkeypress="return searchResults.NavChild(event,3,12)" onkeyup="return searchResults.NavChild(event,3,12)" class="SRScope" href="../structr123array4x64.html#ab78c67c429da6405f9d1ed5054635961" target="_parent">r123array4x64::begin()</a>
+    <a id="Item3_c13" onkeydown="return searchResults.NavChild(event,3,13)" onkeypress="return searchResults.NavChild(event,3,13)" onkeyup="return searchResults.NavChild(event,3,13)" class="SRScope" href="../structr123array4x64.html#acd133812dbe01892199683e003921b8b" target="_parent">r123array4x64::begin() const </a>
+    <a id="Item3_c14" onkeydown="return searchResults.NavChild(event,3,14)" onkeypress="return searchResults.NavChild(event,3,14)" onkeyup="return searchResults.NavChild(event,3,14)" class="SRScope" href="../structr123array16x8.html#a43182e95cb41660de5511bb5a3968cb8" target="_parent">r123array16x8::begin()</a>
+    <a id="Item3_c15" onkeydown="return searchResults.NavChild(event,3,15)" onkeypress="return searchResults.NavChild(event,3,15)" onkeyup="return searchResults.NavChild(event,3,15)" class="SRScope" href="../structr123array16x8.html#acef590bcf52e4a167c2388f4d1e0b20e" target="_parent">r123array16x8::begin() const </a>
+    <a id="Item3_c16" onkeydown="return searchResults.NavChild(event,3,16)" onkeypress="return searchResults.NavChild(event,3,16)" onkeyup="return searchResults.NavChild(event,3,16)" class="SRScope" href="../structr123array1xm128i.html#a275c9837db101efb234c36cff3e7562f" target="_parent">r123array1xm128i::begin()</a>
+    <a id="Item3_c17" onkeydown="return searchResults.NavChild(event,3,17)" onkeypress="return searchResults.NavChild(event,3,17)" onkeyup="return searchResults.NavChild(event,3,17)" class="SRScope" href="../structr123array1xm128i.html#ae9102a4387a7b2013f5098c6c7c14e74" target="_parent">r123array1xm128i::begin() const </a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_bits">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../classr123_1_1MicroURNG.html#ac55cddda8fe0808f922f39beee587b27" target="_parent">BITS</a>
+  <span class="SRScope">r123::MicroURNG</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_63.html b/lib/Random123-1.08/docs/html/search/all_63.html
new file mode 100644
index 0000000..103ac6c
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_63.html
@@ -0,0 +1,201 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_c">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d" target="_parent">c</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_cbegin">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_cbegin')">cbegin</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../structr123array1x32.html#a4b0a02537590babd835dd16405775efe" target="_parent">r123array1x32::cbegin()</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../structr123array2x32.html#a9687a1e6cdb6b6c9a1ffd8f3c7d2ce45" target="_parent">r123array2x32::cbegin()</a>
+    <a id="Item1_c2" onkeydown="return searchResults.NavChild(event,1,2)" onkeypress="return searchResults.NavChild(event,1,2)" onkeyup="return searchResults.NavChild(event,1,2)" class="SRScope" href="../structr123array4x32.html#a4881e99f7b0ff88e2a3082b9e2464bf5" target="_parent">r123array4x32::cbegin()</a>
+    <a id="Item1_c3" onkeydown="return searchResults.NavChild(event,1,3)" onkeypress="return searchResults.NavChild(event,1,3)" onkeyup="return searchResults.NavChild(event,1,3)" class="SRScope" href="../structr123array8x32.html#a06c19ba6155e9c98892f5b98fb482c21" target="_parent">r123array8x32::cbegin()</a>
+    <a id="Item1_c4" onkeydown="return searchResults.NavChild(event,1,4)" onkeypress="return searchResults.NavChild(event,1,4)" onkeyup="return searchResults.NavChild(event,1,4)" class="SRScope" href="../structr123array1x64.html#a33d1c19a63dec48f63f7c30c758fca0c" target="_parent">r123array1x64::cbegin()</a>
+    <a id="Item1_c5" onkeydown="return searchResults.NavChild(event,1,5)" onkeypress="return searchResults.NavChild(event,1,5)" onkeyup="return searchResults.NavChild(event,1,5)" class="SRScope" href="../structr123array2x64.html#ad1ccbda4186dbb8c0a673db1ec0957c0" target="_parent">r123array2x64::cbegin()</a>
+    <a id="Item1_c6" onkeydown="return searchResults.NavChild(event,1,6)" onkeypress="return searchResults.NavChild(event,1,6)" onkeyup="return searchResults.NavChild(event,1,6)" class="SRScope" href="../structr123array4x64.html#af716d2b14d1243870e8544ea2a3cece6" target="_parent">r123array4x64::cbegin()</a>
+    <a id="Item1_c7" onkeydown="return searchResults.NavChild(event,1,7)" onkeypress="return searchResults.NavChild(event,1,7)" onkeyup="return searchResults.NavChild(event,1,7)" class="SRScope" href="../structr123array16x8.html#a80520b3d7040a8d6ec7068c8a143ba6f" target="_parent">r123array16x8::cbegin()</a>
+    <a id="Item1_c8" onkeydown="return searchResults.NavChild(event,1,8)" onkeypress="return searchResults.NavChild(event,1,8)" onkeyup="return searchResults.NavChild(event,1,8)" class="SRScope" href="../structr123array1xm128i.html#a335bab18a8bc904e34de0b3d9d1ce596" target="_parent">r123array1xm128i::cbegin()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_cbrng_2edox">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../cbrng_8dox.html" target="_parent">cbrng.dox</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_cbrng_5ftype">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_cbrng_5ftype')">cbrng_type</a>
+  <div class="SRChildren">
+    <a id="Item3_c0" onkeydown="return searchResults.NavChild(event,3,0)" onkeypress="return searchResults.NavChild(event,3,0)" onkeyup="return searchResults.NavChild(event,3,0)" class="SRScope" href="../classr123_1_1MicroURNG.html#ab0b3a77c9408dbcb2f9d6b5c67e9c3f7" target="_parent">r123::MicroURNG::cbrng_type()</a>
+    <a id="Item3_c1" onkeydown="return searchResults.NavChild(event,3,1)" onkeypress="return searchResults.NavChild(event,3,1)" onkeyup="return searchResults.NavChild(event,3,1)" class="SRScope" href="../structr123_1_1Engine.html#a45ee0086cf8cd6d10febb76dc88f8b22" target="_parent">r123::Engine::cbrng_type()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_cend">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_cend')">cend</a>
+  <div class="SRChildren">
+    <a id="Item4_c0" onkeydown="return searchResults.NavChild(event,4,0)" onkeypress="return searchResults.NavChild(event,4,0)" onkeyup="return searchResults.NavChild(event,4,0)" class="SRScope" href="../structr123array1x32.html#aa0f83d3e29c452d23c3660c98e3bd0e9" target="_parent">r123array1x32::cend()</a>
+    <a id="Item4_c1" onkeydown="return searchResults.NavChild(event,4,1)" onkeypress="return searchResults.NavChild(event,4,1)" onkeyup="return searchResults.NavChild(event,4,1)" class="SRScope" href="../structr123array2x32.html#a9bb4382830c6feb49573b82bb9a18efc" target="_parent">r123array2x32::cend()</a>
+    <a id="Item4_c2" onkeydown="return searchResults.NavChild(event,4,2)" onkeypress="return searchResults.NavChild(event,4,2)" onkeyup="return searchResults.NavChild(event,4,2)" class="SRScope" href="../structr123array4x32.html#a0045f9134801ed79d31f65c7d224d72c" target="_parent">r123array4x32::cend()</a>
+    <a id="Item4_c3" onkeydown="return searchResults.NavChild(event,4,3)" onkeypress="return searchResults.NavChild(event,4,3)" onkeyup="return searchResults.NavChild(event,4,3)" class="SRScope" href="../structr123array8x32.html#a0e1dfc305279a3439789dbdda8bfb6ae" target="_parent">r123array8x32::cend()</a>
+    <a id="Item4_c4" onkeydown="return searchResults.NavChild(event,4,4)" onkeypress="return searchResults.NavChild(event,4,4)" onkeyup="return searchResults.NavChild(event,4,4)" class="SRScope" href="../structr123array1x64.html#aa959a7054efa0d53f83f2d712d8d9049" target="_parent">r123array1x64::cend()</a>
+    <a id="Item4_c5" onkeydown="return searchResults.NavChild(event,4,5)" onkeypress="return searchResults.NavChild(event,4,5)" onkeyup="return searchResults.NavChild(event,4,5)" class="SRScope" href="../structr123array2x64.html#ac80c7ce6fe5bd9ca8baf03db1e67a7e9" target="_parent">r123array2x64::cend()</a>
+    <a id="Item4_c6" onkeydown="return searchResults.NavChild(event,4,6)" onkeypress="return searchResults.NavChild(event,4,6)" onkeyup="return searchResults.NavChild(event,4,6)" class="SRScope" href="../structr123array4x64.html#af970ab87ce987c91097316bc0a0836ef" target="_parent">r123array4x64::cend()</a>
+    <a id="Item4_c7" onkeydown="return searchResults.NavChild(event,4,7)" onkeypress="return searchResults.NavChild(event,4,7)" onkeyup="return searchResults.NavChild(event,4,7)" class="SRScope" href="../structr123array16x8.html#ad7919a7f772fda7d3fe3b476ac1e058f" target="_parent">r123array16x8::cend()</a>
+    <a id="Item4_c8" onkeydown="return searchResults.NavChild(event,4,8)" onkeypress="return searchResults.NavChild(event,4,8)" onkeyup="return searchResults.NavChild(event,4,8)" class="SRScope" href="../structr123array1xm128i.html#aa05003cae74984b777610702d27d66d2" target="_parent">r123array1xm128i::cend()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_compilerfeatures_2eh">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../compilerfeatures_8h.html" target="_parent">compilerfeatures.h</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_const_5fiterator">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_const_5fiterator')">const_iterator</a>
+  <div class="SRChildren">
+    <a id="Item6_c0" onkeydown="return searchResults.NavChild(event,6,0)" onkeypress="return searchResults.NavChild(event,6,0)" onkeyup="return searchResults.NavChild(event,6,0)" class="SRScope" href="../structr123array1x32.html#ac7f82e8848759ec5b0026dce8830274e" target="_parent">r123array1x32::const_iterator()</a>
+    <a id="Item6_c1" onkeydown="return searchResults.NavChild(event,6,1)" onkeypress="return searchResults.NavChild(event,6,1)" onkeyup="return searchResults.NavChild(event,6,1)" class="SRScope" href="../structr123array2x32.html#a7963141a4af4c4aa74708909312a8644" target="_parent">r123array2x32::const_iterator()</a>
+    <a id="Item6_c2" onkeydown="return searchResults.NavChild(event,6,2)" onkeypress="return searchResults.NavChild(event,6,2)" onkeyup="return searchResults.NavChild(event,6,2)" class="SRScope" href="../structr123array4x32.html#a1078ba2cd13bb2a4f83e1b089c816ba7" target="_parent">r123array4x32::const_iterator()</a>
+    <a id="Item6_c3" onkeydown="return searchResults.NavChild(event,6,3)" onkeypress="return searchResults.NavChild(event,6,3)" onkeyup="return searchResults.NavChild(event,6,3)" class="SRScope" href="../structr123array8x32.html#aa026dfdf1e2741c96db4343ceffd3c9f" target="_parent">r123array8x32::const_iterator()</a>
+    <a id="Item6_c4" onkeydown="return searchResults.NavChild(event,6,4)" onkeypress="return searchResults.NavChild(event,6,4)" onkeyup="return searchResults.NavChild(event,6,4)" class="SRScope" href="../structr123array1x64.html#a28ff01c0fefda1d81112ec9812156164" target="_parent">r123array1x64::const_iterator()</a>
+    <a id="Item6_c5" onkeydown="return searchResults.NavChild(event,6,5)" onkeypress="return searchResults.NavChild(event,6,5)" onkeyup="return searchResults.NavChild(event,6,5)" class="SRScope" href="../structr123array2x64.html#ae4f249e82506274b19e6077c3d3f03af" target="_parent">r123array2x64::const_iterator()</a>
+    <a id="Item6_c6" onkeydown="return searchResults.NavChild(event,6,6)" onkeypress="return searchResults.NavChild(event,6,6)" onkeyup="return searchResults.NavChild(event,6,6)" class="SRScope" href="../structr123array4x64.html#a2aa5637bebf5c9c753edbce62e889d77" target="_parent">r123array4x64::const_iterator()</a>
+    <a id="Item6_c7" onkeydown="return searchResults.NavChild(event,6,7)" onkeypress="return searchResults.NavChild(event,6,7)" onkeyup="return searchResults.NavChild(event,6,7)" class="SRScope" href="../structr123array16x8.html#adda842a447360852f2ffa28fb97eb40c" target="_parent">r123array16x8::const_iterator()</a>
+    <a id="Item6_c8" onkeydown="return searchResults.NavChild(event,6,8)" onkeypress="return searchResults.NavChild(event,6,8)" onkeyup="return searchResults.NavChild(event,6,8)" class="SRScope" href="../structr123array1xm128i.html#af6be8b009459737fa25d9d2ac7c4e6aa" target="_parent">r123array1xm128i::const_iterator()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_const_5fpointer">
+ <div class="SREntry">
+  <a id="Item7" onkeydown="return searchResults.Nav(event,7)" onkeypress="return searchResults.Nav(event,7)" onkeyup="return searchResults.Nav(event,7)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_const_5fpointer')">const_pointer</a>
+  <div class="SRChildren">
+    <a id="Item7_c0" onkeydown="return searchResults.NavChild(event,7,0)" onkeypress="return searchResults.NavChild(event,7,0)" onkeyup="return searchResults.NavChild(event,7,0)" class="SRScope" href="../structr123array1x32.html#ab4a82a1e5300814272528a05587d555b" target="_parent">r123array1x32::const_pointer()</a>
+    <a id="Item7_c1" onkeydown="return searchResults.NavChild(event,7,1)" onkeypress="return searchResults.NavChild(event,7,1)" onkeyup="return searchResults.NavChild(event,7,1)" class="SRScope" href="../structr123array2x32.html#accf098ed49f9d84cfa3831a9fe183885" target="_parent">r123array2x32::const_pointer()</a>
+    <a id="Item7_c2" onkeydown="return searchResults.NavChild(event,7,2)" onkeypress="return searchResults.NavChild(event,7,2)" onkeyup="return searchResults.NavChild(event,7,2)" class="SRScope" href="../structr123array4x32.html#a28d13183d1bfcc05854dc39bebbcdf51" target="_parent">r123array4x32::const_pointer()</a>
+    <a id="Item7_c3" onkeydown="return searchResults.NavChild(event,7,3)" onkeypress="return searchResults.NavChild(event,7,3)" onkeyup="return searchResults.NavChild(event,7,3)" class="SRScope" href="../structr123array8x32.html#a621f6293254c6300b1d1b9835b7f30ba" target="_parent">r123array8x32::const_pointer()</a>
+    <a id="Item7_c4" onkeydown="return searchResults.NavChild(event,7,4)" onkeypress="return searchResults.NavChild(event,7,4)" onkeyup="return searchResults.NavChild(event,7,4)" class="SRScope" href="../structr123array1x64.html#a2b23f2aa3edf21084ece97a03367bff5" target="_parent">r123array1x64::const_pointer()</a>
+    <a id="Item7_c5" onkeydown="return searchResults.NavChild(event,7,5)" onkeypress="return searchResults.NavChild(event,7,5)" onkeyup="return searchResults.NavChild(event,7,5)" class="SRScope" href="../structr123array2x64.html#a3a13a452ca15f62f8ddcd8b7de9efa08" target="_parent">r123array2x64::const_pointer()</a>
+    <a id="Item7_c6" onkeydown="return searchResults.NavChild(event,7,6)" onkeypress="return searchResults.NavChild(event,7,6)" onkeyup="return searchResults.NavChild(event,7,6)" class="SRScope" href="../structr123array4x64.html#aa268882d3b4fb43ec9d82baf22d58cc5" target="_parent">r123array4x64::const_pointer()</a>
+    <a id="Item7_c7" onkeydown="return searchResults.NavChild(event,7,7)" onkeypress="return searchResults.NavChild(event,7,7)" onkeyup="return searchResults.NavChild(event,7,7)" class="SRScope" href="../structr123array16x8.html#adbe5a6feb583ce6a682496e14cec9cca" target="_parent">r123array16x8::const_pointer()</a>
+    <a id="Item7_c8" onkeydown="return searchResults.NavChild(event,7,8)" onkeypress="return searchResults.NavChild(event,7,8)" onkeyup="return searchResults.NavChild(event,7,8)" class="SRScope" href="../structr123array1xm128i.html#acc3f6ecf7e6a6bc98c3681c80120ed61" target="_parent">r123array1xm128i::const_pointer()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_const_5freference">
+ <div class="SREntry">
+  <a id="Item8" onkeydown="return searchResults.Nav(event,8)" onkeypress="return searchResults.Nav(event,8)" onkeyup="return searchResults.Nav(event,8)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_const_5freference')">const_reference</a>
+  <div class="SRChildren">
+    <a id="Item8_c0" onkeydown="return searchResults.NavChild(event,8,0)" onkeypress="return searchResults.NavChild(event,8,0)" onkeyup="return searchResults.NavChild(event,8,0)" class="SRScope" href="../structr123array1x32.html#adfa6614a8b20cd30c192458c8c2874da" target="_parent">r123array1x32::const_reference()</a>
+    <a id="Item8_c1" onkeydown="return searchResults.NavChild(event,8,1)" onkeypress="return searchResults.NavChild(event,8,1)" onkeyup="return searchResults.NavChild(event,8,1)" class="SRScope" href="../structr123array2x32.html#a9d71cce3d7ccea7f48da94cf023e1486" target="_parent">r123array2x32::const_reference()</a>
+    <a id="Item8_c2" onkeydown="return searchResults.NavChild(event,8,2)" onkeypress="return searchResults.NavChild(event,8,2)" onkeyup="return searchResults.NavChild(event,8,2)" class="SRScope" href="../structr123array4x32.html#a09d7e0d7b1572fc5fe2be119870a39bc" target="_parent">r123array4x32::const_reference()</a>
+    <a id="Item8_c3" onkeydown="return searchResults.NavChild(event,8,3)" onkeypress="return searchResults.NavChild(event,8,3)" onkeyup="return searchResults.NavChild(event,8,3)" class="SRScope" href="../structr123array8x32.html#a2e7eda7e8940b37e17aef9b0efec3685" target="_parent">r123array8x32::const_reference()</a>
+    <a id="Item8_c4" onkeydown="return searchResults.NavChild(event,8,4)" onkeypress="return searchResults.NavChild(event,8,4)" onkeyup="return searchResults.NavChild(event,8,4)" class="SRScope" href="../structr123array1x64.html#af75ba9dbfe38e0a6c143f446b7e4b995" target="_parent">r123array1x64::const_reference()</a>
+    <a id="Item8_c5" onkeydown="return searchResults.NavChild(event,8,5)" onkeypress="return searchResults.NavChild(event,8,5)" onkeyup="return searchResults.NavChild(event,8,5)" class="SRScope" href="../structr123array2x64.html#a5d80c6b28d869a5422d99541ee1fb93f" target="_parent">r123array2x64::const_reference()</a>
+    <a id="Item8_c6" onkeydown="return searchResults.NavChild(event,8,6)" onkeypress="return searchResults.NavChild(event,8,6)" onkeyup="return searchResults.NavChild(event,8,6)" class="SRScope" href="../structr123array4x64.html#ac2f21a458bf9008b831c553c5ae77508" target="_parent">r123array4x64::const_reference()</a>
+    <a id="Item8_c7" onkeydown="return searchResults.NavChild(event,8,7)" onkeypress="return searchResults.NavChild(event,8,7)" onkeyup="return searchResults.NavChild(event,8,7)" class="SRScope" href="../structr123array16x8.html#a7252c320f8b0fb4d66a17acd9e94b4ad" target="_parent">r123array16x8::const_reference()</a>
+    <a id="Item8_c8" onkeydown="return searchResults.NavChild(event,8,8)" onkeypress="return searchResults.NavChild(event,8,8)" onkeyup="return searchResults.NavChild(event,8,8)" class="SRScope" href="../structr123array1xm128i.html#a84d0123f4376cb6ab77cf817a0cea9cb" target="_parent">r123array1xm128i::const_reference()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_const_5freverse_5fiterator">
+ <div class="SREntry">
+  <a id="Item9" onkeydown="return searchResults.Nav(event,9)" onkeypress="return searchResults.Nav(event,9)" onkeyup="return searchResults.Nav(event,9)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_const_5freverse_5fiterator')">const_reverse_iterator</a>
+  <div class="SRChildren">
+    <a id="Item9_c0" onkeydown="return searchResults.NavChild(event,9,0)" onkeypress="return searchResults.NavChild(event,9,0)" onkeyup="return searchResults.NavChild(event,9,0)" class="SRScope" href="../structr123array1x32.html#a2642ed91a9c6c91ace3b91add2a4feae" target="_parent">r123array1x32::const_reverse_iterator()</a>
+    <a id="Item9_c1" onkeydown="return searchResults.NavChild(event,9,1)" onkeypress="return searchResults.NavChild(event,9,1)" onkeyup="return searchResults.NavChild(event,9,1)" class="SRScope" href="../structr123array2x32.html#af298f85ad6bda860232465c5abc33618" target="_parent">r123array2x32::const_reverse_iterator()</a>
+    <a id="Item9_c2" onkeydown="return searchResults.NavChild(event,9,2)" onkeypress="return searchResults.NavChild(event,9,2)" onkeyup="return searchResults.NavChild(event,9,2)" class="SRScope" href="../structr123array4x32.html#a2926ff865e9dcbc3c20e6639aa8d0b1b" target="_parent">r123array4x32::const_reverse_iterator()</a>
+    <a id="Item9_c3" onkeydown="return searchResults.NavChild(event,9,3)" onkeypress="return searchResults.NavChild(event,9,3)" onkeyup="return searchResults.NavChild(event,9,3)" class="SRScope" href="../structr123array8x32.html#a207923147148d154b1659e257db44033" target="_parent">r123array8x32::const_reverse_iterator()</a>
+    <a id="Item9_c4" onkeydown="return searchResults.NavChild(event,9,4)" onkeypress="return searchResults.NavChild(event,9,4)" onkeyup="return searchResults.NavChild(event,9,4)" class="SRScope" href="../structr123array1x64.html#a61535adf62580285c3182a713ea0f3b1" target="_parent">r123array1x64::const_reverse_iterator()</a>
+    <a id="Item9_c5" onkeydown="return searchResults.NavChild(event,9,5)" onkeypress="return searchResults.NavChild(event,9,5)" onkeyup="return searchResults.NavChild(event,9,5)" class="SRScope" href="../structr123array2x64.html#aa37f04aef8a808c76715b3b2d49c3c30" target="_parent">r123array2x64::const_reverse_iterator()</a>
+    <a id="Item9_c6" onkeydown="return searchResults.NavChild(event,9,6)" onkeypress="return searchResults.NavChild(event,9,6)" onkeyup="return searchResults.NavChild(event,9,6)" class="SRScope" href="../structr123array4x64.html#a8405a219a9c81f8f298298cffbfd46ac" target="_parent">r123array4x64::const_reverse_iterator()</a>
+    <a id="Item9_c7" onkeydown="return searchResults.NavChild(event,9,7)" onkeypress="return searchResults.NavChild(event,9,7)" onkeyup="return searchResults.NavChild(event,9,7)" class="SRScope" href="../structr123array16x8.html#a7a774fcb52f452f832e11e13dbde6dea" target="_parent">r123array16x8::const_reverse_iterator()</a>
+    <a id="Item9_c8" onkeydown="return searchResults.NavChild(event,9,8)" onkeypress="return searchResults.NavChild(event,9,8)" onkeyup="return searchResults.NavChild(event,9,8)" class="SRScope" href="../structr123array1xm128i.html#a6bf98ce6373b157b87c6fd4a7006ed68" target="_parent">r123array1xm128i::const_reverse_iterator()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_counter">
+ <div class="SREntry">
+  <a id="Item10" onkeydown="return searchResults.Nav(event,10)" onkeypress="return searchResults.Nav(event,10)" onkeyup="return searchResults.Nav(event,10)" class="SRSymbol" href="../classr123_1_1MicroURNG.html#a30f52334b7cfcbe6d86870496ca57ea6" target="_parent">counter</a>
+  <span class="SRScope">r123::MicroURNG</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_crbegin">
+ <div class="SREntry">
+  <a id="Item11" onkeydown="return searchResults.Nav(event,11)" onkeypress="return searchResults.Nav(event,11)" onkeyup="return searchResults.Nav(event,11)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_crbegin')">crbegin</a>
+  <div class="SRChildren">
+    <a id="Item11_c0" onkeydown="return searchResults.NavChild(event,11,0)" onkeypress="return searchResults.NavChild(event,11,0)" onkeyup="return searchResults.NavChild(event,11,0)" class="SRScope" href="../structr123array1x32.html#abe59890575233ef259a69d38bea4b5d9" target="_parent">r123array1x32::crbegin()</a>
+    <a id="Item11_c1" onkeydown="return searchResults.NavChild(event,11,1)" onkeypress="return searchResults.NavChild(event,11,1)" onkeyup="return searchResults.NavChild(event,11,1)" class="SRScope" href="../structr123array2x32.html#a09b34692bd41a710bf75e19af2353afb" target="_parent">r123array2x32::crbegin()</a>
+    <a id="Item11_c2" onkeydown="return searchResults.NavChild(event,11,2)" onkeypress="return searchResults.NavChild(event,11,2)" onkeyup="return searchResults.NavChild(event,11,2)" class="SRScope" href="../structr123array4x32.html#ad65e3e63740dc2301442718b3b8aa440" target="_parent">r123array4x32::crbegin()</a>
+    <a id="Item11_c3" onkeydown="return searchResults.NavChild(event,11,3)" onkeypress="return searchResults.NavChild(event,11,3)" onkeyup="return searchResults.NavChild(event,11,3)" class="SRScope" href="../structr123array8x32.html#a4ad5f793478a9658c52dc085b6c504ae" target="_parent">r123array8x32::crbegin()</a>
+    <a id="Item11_c4" onkeydown="return searchResults.NavChild(event,11,4)" onkeypress="return searchResults.NavChild(event,11,4)" onkeyup="return searchResults.NavChild(event,11,4)" class="SRScope" href="../structr123array1x64.html#adac6c38fef501a997b39229f54a6459c" target="_parent">r123array1x64::crbegin()</a>
+    <a id="Item11_c5" onkeydown="return searchResults.NavChild(event,11,5)" onkeypress="return searchResults.NavChild(event,11,5)" onkeyup="return searchResults.NavChild(event,11,5)" class="SRScope" href="../structr123array2x64.html#a198ff47db0778d88db4fabe5f7721564" target="_parent">r123array2x64::crbegin()</a>
+    <a id="Item11_c6" onkeydown="return searchResults.NavChild(event,11,6)" onkeypress="return searchResults.NavChild(event,11,6)" onkeyup="return searchResults.NavChild(event,11,6)" class="SRScope" href="../structr123array4x64.html#a7712a006a2b567321a6ac9e84bb267d8" target="_parent">r123array4x64::crbegin()</a>
+    <a id="Item11_c7" onkeydown="return searchResults.NavChild(event,11,7)" onkeypress="return searchResults.NavChild(event,11,7)" onkeyup="return searchResults.NavChild(event,11,7)" class="SRScope" href="../structr123array16x8.html#a2ecc3c23f3ae3939a386b334f0556d73" target="_parent">r123array16x8::crbegin()</a>
+    <a id="Item11_c8" onkeydown="return searchResults.NavChild(event,11,8)" onkeypress="return searchResults.NavChild(event,11,8)" onkeyup="return searchResults.NavChild(event,11,8)" class="SRScope" href="../structr123array1xm128i.html#a673c6cd3131269febe9a985dc76a2e08" target="_parent">r123array1xm128i::crbegin()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_crend">
+ <div class="SREntry">
+  <a id="Item12" onkeydown="return searchResults.Nav(event,12)" onkeypress="return searchResults.Nav(event,12)" onkeyup="return searchResults.Nav(event,12)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_crend')">crend</a>
+  <div class="SRChildren">
+    <a id="Item12_c0" onkeydown="return searchResults.NavChild(event,12,0)" onkeypress="return searchResults.NavChild(event,12,0)" onkeyup="return searchResults.NavChild(event,12,0)" class="SRScope" href="../structr123array1x32.html#a7f0211b995c536c540c6b175d9433c74" target="_parent">r123array1x32::crend()</a>
+    <a id="Item12_c1" onkeydown="return searchResults.NavChild(event,12,1)" onkeypress="return searchResults.NavChild(event,12,1)" onkeyup="return searchResults.NavChild(event,12,1)" class="SRScope" href="../structr123array2x32.html#a458da2536084746b5f3face73c9f962d" target="_parent">r123array2x32::crend()</a>
+    <a id="Item12_c2" onkeydown="return searchResults.NavChild(event,12,2)" onkeypress="return searchResults.NavChild(event,12,2)" onkeyup="return searchResults.NavChild(event,12,2)" class="SRScope" href="../structr123array4x32.html#a13322be3844d39f9de76d263fa8d1f75" target="_parent">r123array4x32::crend()</a>
+    <a id="Item12_c3" onkeydown="return searchResults.NavChild(event,12,3)" onkeypress="return searchResults.NavChild(event,12,3)" onkeyup="return searchResults.NavChild(event,12,3)" class="SRScope" href="../structr123array8x32.html#ace0b6344aa8f0b9812a2610b6949a6b7" target="_parent">r123array8x32::crend()</a>
+    <a id="Item12_c4" onkeydown="return searchResults.NavChild(event,12,4)" onkeypress="return searchResults.NavChild(event,12,4)" onkeyup="return searchResults.NavChild(event,12,4)" class="SRScope" href="../structr123array1x64.html#a250e375c11846dc2635c7690f283cc20" target="_parent">r123array1x64::crend()</a>
+    <a id="Item12_c5" onkeydown="return searchResults.NavChild(event,12,5)" onkeypress="return searchResults.NavChild(event,12,5)" onkeyup="return searchResults.NavChild(event,12,5)" class="SRScope" href="../structr123array2x64.html#a5bddb882c7c9a493c382d3ce0d6d6079" target="_parent">r123array2x64::crend()</a>
+    <a id="Item12_c6" onkeydown="return searchResults.NavChild(event,12,6)" onkeypress="return searchResults.NavChild(event,12,6)" onkeyup="return searchResults.NavChild(event,12,6)" class="SRScope" href="../structr123array4x64.html#a907eb18b7392479a8ad6b2ddfaaecbd2" target="_parent">r123array4x64::crend()</a>
+    <a id="Item12_c7" onkeydown="return searchResults.NavChild(event,12,7)" onkeypress="return searchResults.NavChild(event,12,7)" onkeyup="return searchResults.NavChild(event,12,7)" class="SRScope" href="../structr123array16x8.html#a2a98e77e851e130a98d44a14ce673ffd" target="_parent">r123array16x8::crend()</a>
+    <a id="Item12_c8" onkeydown="return searchResults.NavChild(event,12,8)" onkeypress="return searchResults.NavChild(event,12,8)" onkeyup="return searchResults.NavChild(event,12,8)" class="SRScope" href="../structr123array1xm128i.html#aad72d00c81c8f6b9e8fb6b6be98056c6" target="_parent">r123array1xm128i::crend()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_ctr_5ftype">
+ <div class="SREntry">
+  <a id="Item13" onkeydown="return searchResults.Nav(event,13)" onkeypress="return searchResults.Nav(event,13)" onkeyup="return searchResults.Nav(event,13)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_ctr_5ftype')">ctr_type</a>
+  <div class="SRChildren">
+    <a id="Item13_c0" onkeydown="return searchResults.NavChild(event,13,0)" onkeypress="return searchResults.NavChild(event,13,0)" onkeyup="return searchResults.NavChild(event,13,0)" class="SRScope" href="../structr123_1_1AESNI1xm128i.html#aaa136c21db9806859fa7cd4e2dbaaaa6" target="_parent">r123::AESNI1xm128i::ctr_type()</a>
+    <a id="Item13_c1" onkeydown="return searchResults.NavChild(event,13,1)" onkeypress="return searchResults.NavChild(event,13,1)" onkeyup="return searchResults.NavChild(event,13,1)" class="SRScope" href="../structr123_1_1AESNI4x32.html#ab8a1f8a822eecfc9e587bad76792df32" target="_parent">r123::AESNI4x32::ctr_type()</a>
+    <a id="Item13_c2" onkeydown="return searchResults.NavChild(event,13,2)" onkeypress="return searchResults.NavChild(event,13,2)" onkeyup="return searchResults.NavChild(event,13,2)" class="SRScope" href="../structr123_1_1ARS1xm128i__R.html#a13a62c94f63054828c6960979f42a268" target="_parent">r123::ARS1xm128i_R::ctr_type()</a>
+    <a id="Item13_c3" onkeydown="return searchResults.NavChild(event,13,3)" onkeypress="return searchResults.NavChild(event,13,3)" onkeyup="return searchResults.NavChild(event,13,3)" class="SRScope" href="../structr123_1_1ARS4x32__R.html#a9951dbcb50de849ded7177109b344045" target="_parent">r123::ARS4x32_R::ctr_type()</a>
+    <a id="Item13_c4" onkeydown="return searchResults.NavChild(event,13,4)" onkeypress="return searchResults.NavChild(event,13,4)" onkeyup="return searchResults.NavChild(event,13,4)" class="SRScope" href="../classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476" target="_parent">r123::MicroURNG::ctr_type()</a>
+    <a id="Item13_c5" onkeydown="return searchResults.NavChild(event,13,5)" onkeypress="return searchResults.NavChild(event,13,5)" onkeyup="return searchResults.NavChild(event,13,5)" class="SRScope" href="../structr123_1_1Philox2x32__R.html#af00c84c482900fbeca6bd2043395e599" target="_parent">r123::Philox2x32_R::ctr_type()</a>
+    <a id="Item13_c6" onkeydown="return searchResults.NavChild(event,13,6)" onkeypress="return searchResults.NavChild(event,13,6)" onkeyup="return searchResults.NavChild(event,13,6)" class="SRScope" href="../structr123_1_1Philox4x32__R.html#a23adf0320faed0fe4d12ebececdba50a" target="_parent">r123::Philox4x32_R::ctr_type()</a>
+    <a id="Item13_c7" onkeydown="return searchResults.NavChild(event,13,7)" onkeypress="return searchResults.NavChild(event,13,7)" onkeyup="return searchResults.NavChild(event,13,7)" class="SRScope" href="../structr123_1_1Philox2x64__R.html#a8e615e3f4680b9e1b986ea071fd173fc" target="_parent">r123::Philox2x64_R::ctr_type()</a>
+    <a id="Item13_c8" onkeydown="return searchResults.NavChild(event,13,8)" onkeypress="return searchResults.NavChild(event,13,8)" onkeyup="return searchResults.NavChild(event,13,8)" class="SRScope" href="../structr123_1_1Philox4x64__R.html#afd5f78b34ae7c478ebe16eb601f7b202" target="_parent">r123::Philox4x64_R::ctr_type()</a>
+    <a id="Item13_c9" onkeydown="return searchResults.NavChild(event,13,9)" onkeypress="return searchResults.NavChild(event,13,9)" onkeyup="return searchResults.NavChild(event,13,9)" class="SRScope" href="../structr123_1_1ReinterpretCtr.html#a26cf9e933b35411c37070c948085ba02" target="_parent">r123::ReinterpretCtr::ctr_type()</a>
+    <a id="Item13_c10" onkeydown="return searchResults.NavChild(event,13,10)" onkeypress="return searchResults.NavChild(event,13,10)" onkeyup="return searchResults.NavChild(event,13,10)" class="SRScope" href="../structr123_1_1Threefry2x32__R.html#a60b1b58aeaa05d467607dc570aed1357" target="_parent">r123::Threefry2x32_R::ctr_type()</a>
+    <a id="Item13_c11" onkeydown="return searchResults.NavChild(event,13,11)" onkeypress="return searchResults.NavChild(event,13,11)" onkeyup="return searchResults.NavChild(event,13,11)" class="SRScope" href="../structr123_1_1Threefry4x32__R.html#ae89dabc0060c62e0d9e5c4ac34a8550f" target="_parent">r123::Threefry4x32_R::ctr_type()</a>
+    <a id="Item13_c12" onkeydown="return searchResults.NavChild(event,13,12)" onkeypress="return searchResults.NavChild(event,13,12)" onkeyup="return searchResults.NavChild(event,13,12)" class="SRScope" href="../structr123_1_1Threefry2x64__R.html#a6b151f30bc5544671596b9df91e896d8" target="_parent">r123::Threefry2x64_R::ctr_type()</a>
+    <a id="Item13_c13" onkeydown="return searchResults.NavChild(event,13,13)" onkeypress="return searchResults.NavChild(event,13,13)" onkeyup="return searchResults.NavChild(event,13,13)" class="SRScope" href="../structr123_1_1Threefry4x64__R.html#a6c93334cb8a8b53ef01cc79b5296af0d" target="_parent">r123::Threefry4x64_R::ctr_type()</a>
+    <a id="Item13_c14" onkeydown="return searchResults.NavChild(event,13,14)" onkeypress="return searchResults.NavChild(event,13,14)" onkeyup="return searchResults.NavChild(event,13,14)" class="SRScope" href="../structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90" target="_parent">r123::Engine::ctr_type()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_64.html b/lib/Random123-1.08/docs/html/search/all_64.html
new file mode 100644
index 0000000..4328d7d
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_64.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_data">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_data')">data</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#a71529eccd6d52d7c396d58fd71214d0b" target="_parent">r123array1x32::data()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array1x32.html#a8ca295876693f207df52a7cce6f96241" target="_parent">r123array1x32::data() const </a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array2x32.html#a76f2b3cd04d0502121b3c7894663e178" target="_parent">r123array2x32::data()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array2x32.html#a15d5bce0ea3596ad5f7b5aa7432a33df" target="_parent">r123array2x32::data() const </a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array4x32.html#a72ee678cce1fa539f44480eb269a01f9" target="_parent">r123array4x32::data()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array4x32.html#a20dd9fc18f9db8fe8e8eb08311398d22" target="_parent">r123array4x32::data() const </a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array8x32.html#a78448bbbef69b3383eec4d78a814b4b2" target="_parent">r123array8x32::data()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array8x32.html#a0e2eb8cfaf36664411f19a6828339553" target="_parent">r123array8x32::data() const </a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1x64.html#a2ecd5718a0fd863dd7a3eb724e07a540" target="_parent">r123array1x64::data()</a>
+    <a id="Item0_c9" onkeydown="return searchResults.NavChild(event,0,9)" onkeypress="return searchResults.NavChild(event,0,9)" onkeyup="return searchResults.NavChild(event,0,9)" class="SRScope" href="../structr123array1x64.html#a02cd843e927803bd09f00b1a5541c72c" target="_parent">r123array1x64::data() const </a>
+    <a id="Item0_c10" onkeydown="return searchResults.NavChild(event,0,10)" onkeypress="return searchResults.NavChild(event,0,10)" onkeyup="return searchResults.NavChild(event,0,10)" class="SRScope" href="../structr123array2x64.html#a9a6eb23f15f9ee3a55f39b951798a739" target="_parent">r123array2x64::data()</a>
+    <a id="Item0_c11" onkeydown="return searchResults.NavChild(event,0,11)" onkeypress="return searchResults.NavChild(event,0,11)" onkeyup="return searchResults.NavChild(event,0,11)" class="SRScope" href="../structr123array2x64.html#a9cdb592780378bdcc8a560e31e11f084" target="_parent">r123array2x64::data() const </a>
+    <a id="Item0_c12" onkeydown="return searchResults.NavChild(event,0,12)" onkeypress="return searchResults.NavChild(event,0,12)" onkeyup="return searchResults.NavChild(event,0,12)" class="SRScope" href="../structr123array4x64.html#a8567c3d6c4ee6c9cc2d8770d26e7fee9" target="_parent">r123array4x64::data()</a>
+    <a id="Item0_c13" onkeydown="return searchResults.NavChild(event,0,13)" onkeypress="return searchResults.NavChild(event,0,13)" onkeyup="return searchResults.NavChild(event,0,13)" class="SRScope" href="../structr123array4x64.html#a31591d0bca18339d42c3a182a30457a0" target="_parent">r123array4x64::data() const </a>
+    <a id="Item0_c14" onkeydown="return searchResults.NavChild(event,0,14)" onkeypress="return searchResults.NavChild(event,0,14)" onkeyup="return searchResults.NavChild(event,0,14)" class="SRScope" href="../structr123array16x8.html#aac0eda610fbd60cdaae5d1e2aa4eb03f" target="_parent">r123array16x8::data()</a>
+    <a id="Item0_c15" onkeydown="return searchResults.NavChild(event,0,15)" onkeypress="return searchResults.NavChild(event,0,15)" onkeyup="return searchResults.NavChild(event,0,15)" class="SRScope" href="../structr123array16x8.html#aced4f7455fcc853a4e947b9bf892c45e" target="_parent">r123array16x8::data() const </a>
+    <a id="Item0_c16" onkeydown="return searchResults.NavChild(event,0,16)" onkeypress="return searchResults.NavChild(event,0,16)" onkeyup="return searchResults.NavChild(event,0,16)" class="SRScope" href="../structr123array1xm128i.html#acb25bc645e95f975ca6cbcb692add4b4" target="_parent">r123array1xm128i::data()</a>
+    <a id="Item0_c17" onkeydown="return searchResults.NavChild(event,0,17)" onkeypress="return searchResults.NavChild(event,0,17)" onkeyup="return searchResults.NavChild(event,0,17)" class="SRScope" href="../structr123array1xm128i.html#ac66f2efebe9e32433b25f96ea3cf34fe" target="_parent">r123array1xm128i::data() const </a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_difference_5ftype">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_difference_5ftype')">difference_type</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../structr123array1x32.html#a1084c78861e725e58c14c67af242952f" target="_parent">r123array1x32::difference_type()</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../structr123array2x32.html#aa3dfe31d2483fb629a9e3ac304b24d07" target="_parent">r123array2x32::difference_type()</a>
+    <a id="Item1_c2" onkeydown="return searchResults.NavChild(event,1,2)" onkeypress="return searchResults.NavChild(event,1,2)" onkeyup="return searchResults.NavChild(event,1,2)" class="SRScope" href="../structr123array4x32.html#a3c690c039797cafe4718c03377937fb7" target="_parent">r123array4x32::difference_type()</a>
+    <a id="Item1_c3" onkeydown="return searchResults.NavChild(event,1,3)" onkeypress="return searchResults.NavChild(event,1,3)" onkeyup="return searchResults.NavChild(event,1,3)" class="SRScope" href="../structr123array8x32.html#af8029821cb8a7b5a3500adb30d4f2326" target="_parent">r123array8x32::difference_type()</a>
+    <a id="Item1_c4" onkeydown="return searchResults.NavChild(event,1,4)" onkeypress="return searchResults.NavChild(event,1,4)" onkeyup="return searchResults.NavChild(event,1,4)" class="SRScope" href="../structr123array1x64.html#a2abaa7dd6823b724ec6038b504c77011" target="_parent">r123array1x64::difference_type()</a>
+    <a id="Item1_c5" onkeydown="return searchResults.NavChild(event,1,5)" onkeypress="return searchResults.NavChild(event,1,5)" onkeyup="return searchResults.NavChild(event,1,5)" class="SRScope" href="../structr123array2x64.html#a4227cd6be973fdb0d72398d0b5604da8" target="_parent">r123array2x64::difference_type()</a>
+    <a id="Item1_c6" onkeydown="return searchResults.NavChild(event,1,6)" onkeypress="return searchResults.NavChild(event,1,6)" onkeyup="return searchResults.NavChild(event,1,6)" class="SRScope" href="../structr123array4x64.html#a3b1c7395f17992d8760fe93d3930db12" target="_parent">r123array4x64::difference_type()</a>
+    <a id="Item1_c7" onkeydown="return searchResults.NavChild(event,1,7)" onkeypress="return searchResults.NavChild(event,1,7)" onkeyup="return searchResults.NavChild(event,1,7)" class="SRScope" href="../structr123array16x8.html#aaae0b6c18de6ce92ea55bf1b9bdbdf69" target="_parent">r123array16x8::difference_type()</a>
+    <a id="Item1_c8" onkeydown="return searchResults.NavChild(event,1,8)" onkeypress="return searchResults.NavChild(event,1,8)" onkeyup="return searchResults.NavChild(event,1,8)" class="SRScope" href="../structr123array1xm128i.html#a319811ed6105c3050135d8ec3ba36f7a" target="_parent">r123array1xm128i::difference_type()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_discard">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../structr123_1_1Engine.html#a82a56c2c02b146dceb68ef3fd0a969fb" target="_parent">discard</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_65.html b/lib/Random123-1.08/docs/html/search/all_65.html
new file mode 100644
index 0000000..18bf573
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_65.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_elem">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319" target="_parent">elem</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_elem_5ftype">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structr123_1_1Engine.html#a8fb9eb1ab76ad9b5374a47cf84ecd306" target="_parent">elem_type</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_empty">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_empty')">empty</a>
+  <div class="SRChildren">
+    <a id="Item2_c0" onkeydown="return searchResults.NavChild(event,2,0)" onkeypress="return searchResults.NavChild(event,2,0)" onkeyup="return searchResults.NavChild(event,2,0)" class="SRScope" href="../structr123array1x32.html#ae791cf5ce80a35610c3b4d52ea533651" target="_parent">r123array1x32::empty()</a>
+    <a id="Item2_c1" onkeydown="return searchResults.NavChild(event,2,1)" onkeypress="return searchResults.NavChild(event,2,1)" onkeyup="return searchResults.NavChild(event,2,1)" class="SRScope" href="../structr123array2x32.html#acc67c9fedcddd77fdb2727c088eaab9d" target="_parent">r123array2x32::empty()</a>
+    <a id="Item2_c2" onkeydown="return searchResults.NavChild(event,2,2)" onkeypress="return searchResults.NavChild(event,2,2)" onkeyup="return searchResults.NavChild(event,2,2)" class="SRScope" href="../structr123array4x32.html#a4bc944eee354be2b258c0991d3cc61e1" target="_parent">r123array4x32::empty()</a>
+    <a id="Item2_c3" onkeydown="return searchResults.NavChild(event,2,3)" onkeypress="return searchResults.NavChild(event,2,3)" onkeyup="return searchResults.NavChild(event,2,3)" class="SRScope" href="../structr123array8x32.html#af2276e84924345efab98214be1691c83" target="_parent">r123array8x32::empty()</a>
+    <a id="Item2_c4" onkeydown="return searchResults.NavChild(event,2,4)" onkeypress="return searchResults.NavChild(event,2,4)" onkeyup="return searchResults.NavChild(event,2,4)" class="SRScope" href="../structr123array1x64.html#af8636ea61389dcf15e94a5da70bd6bc0" target="_parent">r123array1x64::empty()</a>
+    <a id="Item2_c5" onkeydown="return searchResults.NavChild(event,2,5)" onkeypress="return searchResults.NavChild(event,2,5)" onkeyup="return searchResults.NavChild(event,2,5)" class="SRScope" href="../structr123array2x64.html#a60ed2f5af6357930b50a8de8f294f5c2" target="_parent">r123array2x64::empty()</a>
+    <a id="Item2_c6" onkeydown="return searchResults.NavChild(event,2,6)" onkeypress="return searchResults.NavChild(event,2,6)" onkeyup="return searchResults.NavChild(event,2,6)" class="SRScope" href="../structr123array4x64.html#a51e4ded187a3f1ebadd6b915da039c3f" target="_parent">r123array4x64::empty()</a>
+    <a id="Item2_c7" onkeydown="return searchResults.NavChild(event,2,7)" onkeypress="return searchResults.NavChild(event,2,7)" onkeyup="return searchResults.NavChild(event,2,7)" class="SRScope" href="../structr123array16x8.html#a5f07441771ec90cd05a2c26fb64e575e" target="_parent">r123array16x8::empty()</a>
+    <a id="Item2_c8" onkeydown="return searchResults.NavChild(event,2,8)" onkeypress="return searchResults.NavChild(event,2,8)" onkeyup="return searchResults.NavChild(event,2,8)" class="SRScope" href="../structr123array1xm128i.html#aa3e59f1626f2cadab5bc66e415ff0c72" target="_parent">r123array1xm128i::empty()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_end">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_end')">end</a>
+  <div class="SRChildren">
+    <a id="Item3_c0" onkeydown="return searchResults.NavChild(event,3,0)" onkeypress="return searchResults.NavChild(event,3,0)" onkeyup="return searchResults.NavChild(event,3,0)" class="SRScope" href="../structr123array1x32.html#ac2b5032395c448c4598321f5a37ec29c" target="_parent">r123array1x32::end()</a>
+    <a id="Item3_c1" onkeydown="return searchResults.NavChild(event,3,1)" onkeypress="return searchResults.NavChild(event,3,1)" onkeyup="return searchResults.NavChild(event,3,1)" class="SRScope" href="../structr123array1x32.html#a5bda32a4f4e8e783744ed7f183dde0b2" target="_parent">r123array1x32::end() const </a>
+    <a id="Item3_c2" onkeydown="return searchResults.NavChild(event,3,2)" onkeypress="return searchResults.NavChild(event,3,2)" onkeyup="return searchResults.NavChild(event,3,2)" class="SRScope" href="../structr123array2x32.html#a0d98e92b198e8a314d46f9c6fd0771a7" target="_parent">r123array2x32::end()</a>
+    <a id="Item3_c3" onkeydown="return searchResults.NavChild(event,3,3)" onkeypress="return searchResults.NavChild(event,3,3)" onkeyup="return searchResults.NavChild(event,3,3)" class="SRScope" href="../structr123array2x32.html#ad64dc05d5114c74d104bca45f21992fd" target="_parent">r123array2x32::end() const </a>
+    <a id="Item3_c4" onkeydown="return searchResults.NavChild(event,3,4)" onkeypress="return searchResults.NavChild(event,3,4)" onkeyup="return searchResults.NavChild(event,3,4)" class="SRScope" href="../structr123array4x32.html#a83dd3d17e17bb6a93b7cd544b0e9a403" target="_parent">r123array4x32::end()</a>
+    <a id="Item3_c5" onkeydown="return searchResults.NavChild(event,3,5)" onkeypress="return searchResults.NavChild(event,3,5)" onkeyup="return searchResults.NavChild(event,3,5)" class="SRScope" href="../structr123array4x32.html#ac6e732c58b1a5ad954c3b6f2be8385a1" target="_parent">r123array4x32::end() const </a>
+    <a id="Item3_c6" onkeydown="return searchResults.NavChild(event,3,6)" onkeypress="return searchResults.NavChild(event,3,6)" onkeyup="return searchResults.NavChild(event,3,6)" class="SRScope" href="../structr123array8x32.html#a40c40a7a86150ec0e9d29739e0e649c3" target="_parent">r123array8x32::end()</a>
+    <a id="Item3_c7" onkeydown="return searchResults.NavChild(event,3,7)" onkeypress="return searchResults.NavChild(event,3,7)" onkeyup="return searchResults.NavChild(event,3,7)" class="SRScope" href="../structr123array8x32.html#acc1aa99ed89deb63c3ba7f71319ac10c" target="_parent">r123array8x32::end() const </a>
+    <a id="Item3_c8" onkeydown="return searchResults.NavChild(event,3,8)" onkeypress="return searchResults.NavChild(event,3,8)" onkeyup="return searchResults.NavChild(event,3,8)" class="SRScope" href="../structr123array1x64.html#a18a5fa64dbe73dc4f9fd0b6c45fe283f" target="_parent">r123array1x64::end()</a>
+    <a id="Item3_c9" onkeydown="return searchResults.NavChild(event,3,9)" onkeypress="return searchResults.NavChild(event,3,9)" onkeyup="return searchResults.NavChild(event,3,9)" class="SRScope" href="../structr123array1x64.html#a595e77ff43ac41c4937e91f6d109a46a" target="_parent">r123array1x64::end() const </a>
+    <a id="Item3_c10" onkeydown="return searchResults.NavChild(event,3,10)" onkeypress="return searchResults.NavChild(event,3,10)" onkeyup="return searchResults.NavChild(event,3,10)" class="SRScope" href="../structr123array2x64.html#a24679f6a101d9d25b339106a771c4e68" target="_parent">r123array2x64::end()</a>
+    <a id="Item3_c11" onkeydown="return searchResults.NavChild(event,3,11)" onkeypress="return searchResults.NavChild(event,3,11)" onkeyup="return searchResults.NavChild(event,3,11)" class="SRScope" href="../structr123array2x64.html#af16f99514770cb88a57e36b1b849e80d" target="_parent">r123array2x64::end() const </a>
+    <a id="Item3_c12" onkeydown="return searchResults.NavChild(event,3,12)" onkeypress="return searchResults.NavChild(event,3,12)" onkeyup="return searchResults.NavChild(event,3,12)" class="SRScope" href="../structr123array4x64.html#a298a04608a19dd91cb30bd7980ad796f" target="_parent">r123array4x64::end()</a>
+    <a id="Item3_c13" onkeydown="return searchResults.NavChild(event,3,13)" onkeypress="return searchResults.NavChild(event,3,13)" onkeyup="return searchResults.NavChild(event,3,13)" class="SRScope" href="../structr123array4x64.html#a9fed923c39000c81f7f6b608d88953f9" target="_parent">r123array4x64::end() const </a>
+    <a id="Item3_c14" onkeydown="return searchResults.NavChild(event,3,14)" onkeypress="return searchResults.NavChild(event,3,14)" onkeyup="return searchResults.NavChild(event,3,14)" class="SRScope" href="../structr123array16x8.html#aa0d2b0c70133dde0535b0a5e12283626" target="_parent">r123array16x8::end()</a>
+    <a id="Item3_c15" onkeydown="return searchResults.NavChild(event,3,15)" onkeypress="return searchResults.NavChild(event,3,15)" onkeyup="return searchResults.NavChild(event,3,15)" class="SRScope" href="../structr123array16x8.html#aee42dddf2a59858114a31d760f2c1227" target="_parent">r123array16x8::end() const </a>
+    <a id="Item3_c16" onkeydown="return searchResults.NavChild(event,3,16)" onkeypress="return searchResults.NavChild(event,3,16)" onkeyup="return searchResults.NavChild(event,3,16)" class="SRScope" href="../structr123array1xm128i.html#a7383241079a4eae9fee0e184261174fd" target="_parent">r123array1xm128i::end()</a>
+    <a id="Item3_c17" onkeydown="return searchResults.NavChild(event,3,17)" onkeypress="return searchResults.NavChild(event,3,17)" onkeyup="return searchResults.NavChild(event,3,17)" class="SRScope" href="../structr123array1xm128i.html#ae8ddb01064f8cdfbb7314d2f1fbd0dfd" target="_parent">r123array1xm128i::end() const </a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_engine">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../structr123_1_1Engine.html" target="_parent">Engine</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_engine">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_engine')">Engine</a>
+  <div class="SRChildren">
+    <a id="Item5_c0" onkeydown="return searchResults.NavChild(event,5,0)" onkeypress="return searchResults.NavChild(event,5,0)" onkeyup="return searchResults.NavChild(event,5,0)" class="SRScope" href="../structr123_1_1Engine.html#ac5676bbe189b0cdc1bef0dd812262ccd" target="_parent">r123::Engine::Engine()</a>
+    <a id="Item5_c1" onkeydown="return searchResults.NavChild(event,5,1)" onkeypress="return searchResults.NavChild(event,5,1)" onkeyup="return searchResults.NavChild(event,5,1)" class="SRScope" href="../structr123_1_1Engine.html#ae1a249af828cfdac77db6c16e3f8f8eb" target="_parent">r123::Engine::Engine(result_type r)</a>
+    <a id="Item5_c2" onkeydown="return searchResults.NavChild(event,5,2)" onkeypress="return searchResults.NavChild(event,5,2)" onkeyup="return searchResults.NavChild(event,5,2)" class="SRScope" href="../structr123_1_1Engine.html#a37dd55cee849b59d678f74780f785672" target="_parent">r123::Engine::Engine(Engine &e)</a>
+    <a id="Item5_c3" onkeydown="return searchResults.NavChild(event,5,3)" onkeypress="return searchResults.NavChild(event,5,3)" onkeyup="return searchResults.NavChild(event,5,3)" class="SRScope" href="../structr123_1_1Engine.html#a478b486b166316597a51ffdd7b5b2d0c" target="_parent">r123::Engine::Engine(const Engine &e)</a>
+    <a id="Item5_c4" onkeydown="return searchResults.NavChild(event,5,4)" onkeypress="return searchResults.NavChild(event,5,4)" onkeyup="return searchResults.NavChild(event,5,4)" class="SRScope" href="../structr123_1_1Engine.html#a52b968cfefe413441d668b3013de023a" target="_parent">r123::Engine::Engine(SeedSeq &s)</a>
+    <a id="Item5_c5" onkeydown="return searchResults.NavChild(event,5,5)" onkeypress="return searchResults.NavChild(event,5,5)" onkeyup="return searchResults.NavChild(event,5,5)" class="SRScope" href="../structr123_1_1Engine.html#ab5f45b4eb97995cc45350abee3ec8388" target="_parent">r123::Engine::Engine(const ukey_type &uk)</a>
+    <a id="Item5_c6" onkeydown="return searchResults.NavChild(event,5,6)" onkeypress="return searchResults.NavChild(event,5,6)" onkeyup="return searchResults.NavChild(event,5,6)" class="SRScope" href="../structr123_1_1Engine.html#aeb178b9305cbf1fb7e11e8e33a631ba7" target="_parent">r123::Engine::Engine(ukey_type &uk)</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_engine_2ehpp">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="../Engine_8hpp.html" target="_parent">Engine.hpp</a>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_66.html b/lib/Random123-1.08/docs/html/search/all_66.html
new file mode 100644
index 0000000..a27f2ff
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_66.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_fill">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_fill')">fill</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#a973dbecc59b1d5f5a95bda92d25e5e73" target="_parent">r123array1x32::fill()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array2x32.html#af7ea9ed8a064e9cab59ee97885bb459e" target="_parent">r123array2x32::fill()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array4x32.html#ae362d7908c2ecc308f6fd4e085ace980" target="_parent">r123array4x32::fill()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array8x32.html#a86481aecfb276687e9389cb6c43e1e8c" target="_parent">r123array8x32::fill()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array1x64.html#ac9a372e0980632a4db29bb243b672039" target="_parent">r123array1x64::fill()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array2x64.html#a30d20bbf203dbd0b592c6cb58cb6dcdb" target="_parent">r123array2x64::fill()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array4x64.html#a6580c77b7d68c0a76b5bef33e59ac662" target="_parent">r123array4x64::fill()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array16x8.html#a883d42092ab4bae2eac132706ed06103" target="_parent">r123array16x8::fill()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1xm128i.html#a7eba15dc035724245f70b4a3a98c6a52" target="_parent">r123array1xm128i::fill()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_fix_5finvariant">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structr123_1_1Engine.html#aa7ad87d7238a0f820ee37640071dee7d" target="_parent">fix_invariant</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_front">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_front')">front</a>
+  <div class="SRChildren">
+    <a id="Item2_c0" onkeydown="return searchResults.NavChild(event,2,0)" onkeypress="return searchResults.NavChild(event,2,0)" onkeyup="return searchResults.NavChild(event,2,0)" class="SRScope" href="../structr123array1x32.html#a69727e5b1c14fcc2f7c9b6af4410cc16" target="_parent">r123array1x32::front()</a>
+    <a id="Item2_c1" onkeydown="return searchResults.NavChild(event,2,1)" onkeypress="return searchResults.NavChild(event,2,1)" onkeyup="return searchResults.NavChild(event,2,1)" class="SRScope" href="../structr123array1x32.html#af94d0df621b1de0b6a3ed904c276eb84" target="_parent">r123array1x32::front() const </a>
+    <a id="Item2_c2" onkeydown="return searchResults.NavChild(event,2,2)" onkeypress="return searchResults.NavChild(event,2,2)" onkeyup="return searchResults.NavChild(event,2,2)" class="SRScope" href="../structr123array2x32.html#ad5e3ba16c4d22c3ac0775337bef3cc70" target="_parent">r123array2x32::front()</a>
+    <a id="Item2_c3" onkeydown="return searchResults.NavChild(event,2,3)" onkeypress="return searchResults.NavChild(event,2,3)" onkeyup="return searchResults.NavChild(event,2,3)" class="SRScope" href="../structr123array2x32.html#a933676c34296b74eeea8a56a3c904a2c" target="_parent">r123array2x32::front() const </a>
+    <a id="Item2_c4" onkeydown="return searchResults.NavChild(event,2,4)" onkeypress="return searchResults.NavChild(event,2,4)" onkeyup="return searchResults.NavChild(event,2,4)" class="SRScope" href="../structr123array4x32.html#a82b3fdeacb835bb64765def4bef92751" target="_parent">r123array4x32::front()</a>
+    <a id="Item2_c5" onkeydown="return searchResults.NavChild(event,2,5)" onkeypress="return searchResults.NavChild(event,2,5)" onkeyup="return searchResults.NavChild(event,2,5)" class="SRScope" href="../structr123array4x32.html#ab3434550aea3d2e04579cb255b0b4e9e" target="_parent">r123array4x32::front() const </a>
+    <a id="Item2_c6" onkeydown="return searchResults.NavChild(event,2,6)" onkeypress="return searchResults.NavChild(event,2,6)" onkeyup="return searchResults.NavChild(event,2,6)" class="SRScope" href="../structr123array8x32.html#aeab7da4db40303e2104b79c2d8f3eced" target="_parent">r123array8x32::front()</a>
+    <a id="Item2_c7" onkeydown="return searchResults.NavChild(event,2,7)" onkeypress="return searchResults.NavChild(event,2,7)" onkeyup="return searchResults.NavChild(event,2,7)" class="SRScope" href="../structr123array8x32.html#aee2127f4a99f86b3fc7a9059e7d84e76" target="_parent">r123array8x32::front() const </a>
+    <a id="Item2_c8" onkeydown="return searchResults.NavChild(event,2,8)" onkeypress="return searchResults.NavChild(event,2,8)" onkeyup="return searchResults.NavChild(event,2,8)" class="SRScope" href="../structr123array1x64.html#a7d205216932e36303f62b38d233247d5" target="_parent">r123array1x64::front()</a>
+    <a id="Item2_c9" onkeydown="return searchResults.NavChild(event,2,9)" onkeypress="return searchResults.NavChild(event,2,9)" onkeyup="return searchResults.NavChild(event,2,9)" class="SRScope" href="../structr123array1x64.html#a7c0a3159492b3405a8019ce52cdf2c69" target="_parent">r123array1x64::front() const </a>
+    <a id="Item2_c10" onkeydown="return searchResults.NavChild(event,2,10)" onkeypress="return searchResults.NavChild(event,2,10)" onkeyup="return searchResults.NavChild(event,2,10)" class="SRScope" href="../structr123array2x64.html#a95b79f70de75c8346dbae7c5f933d076" target="_parent">r123array2x64::front()</a>
+    <a id="Item2_c11" onkeydown="return searchResults.NavChild(event,2,11)" onkeypress="return searchResults.NavChild(event,2,11)" onkeyup="return searchResults.NavChild(event,2,11)" class="SRScope" href="../structr123array2x64.html#a21cf5457f945f5c00b16ce4a73797c1b" target="_parent">r123array2x64::front() const </a>
+    <a id="Item2_c12" onkeydown="return searchResults.NavChild(event,2,12)" onkeypress="return searchResults.NavChild(event,2,12)" onkeyup="return searchResults.NavChild(event,2,12)" class="SRScope" href="../structr123array4x64.html#a975ecaf4c5332fc400dfc8d6d60d9035" target="_parent">r123array4x64::front()</a>
+    <a id="Item2_c13" onkeydown="return searchResults.NavChild(event,2,13)" onkeypress="return searchResults.NavChild(event,2,13)" onkeyup="return searchResults.NavChild(event,2,13)" class="SRScope" href="../structr123array4x64.html#a256920b96d1d3a4c61489b145da7383e" target="_parent">r123array4x64::front() const </a>
+    <a id="Item2_c14" onkeydown="return searchResults.NavChild(event,2,14)" onkeypress="return searchResults.NavChild(event,2,14)" onkeyup="return searchResults.NavChild(event,2,14)" class="SRScope" href="../structr123array16x8.html#ad293e6494e131ff96941e963d9208586" target="_parent">r123array16x8::front()</a>
+    <a id="Item2_c15" onkeydown="return searchResults.NavChild(event,2,15)" onkeypress="return searchResults.NavChild(event,2,15)" onkeyup="return searchResults.NavChild(event,2,15)" class="SRScope" href="../structr123array16x8.html#a85528130b6941b3f7b57265c201345c2" target="_parent">r123array16x8::front() const </a>
+    <a id="Item2_c16" onkeydown="return searchResults.NavChild(event,2,16)" onkeypress="return searchResults.NavChild(event,2,16)" onkeyup="return searchResults.NavChild(event,2,16)" class="SRScope" href="../structr123array1xm128i.html#a7efd9b7ccf35c3730fbdafb147e11660" target="_parent">r123array1xm128i::front()</a>
+    <a id="Item2_c17" onkeydown="return searchResults.NavChild(event,2,17)" onkeypress="return searchResults.NavChild(event,2,17)" onkeyup="return searchResults.NavChild(event,2,17)" class="SRScope" href="../structr123array1xm128i.html#a0b5a33169ae87744ab353bfa7dc8f710" target="_parent">r123array1xm128i::front() const </a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_67.html b/lib/Random123-1.08/docs/html/search/all_67.html
new file mode 100644
index 0000000..e24721d
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_67.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_getcounter">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123_1_1Engine.html#a621df886f2a21ffb22e63d9094389173" target="_parent">getcounter</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_getseed">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structr123_1_1Engine.html#aa7812a494fdb677c2e325db0acfe924a" target="_parent">getseed</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_gsl_5fcbrng">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../gsl__cbrng_8h.html#af561a004eef8e93cdfd6b255a8a1eb75" target="_parent">GSL_CBRNG</a>
+  <span class="SRScope">gsl_cbrng.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_gsl_5fcbrng_2eh">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../gsl__cbrng_8h.html" target="_parent">gsl_cbrng.h</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_gsl_5fmicrorng">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../gsl__microrng_8h.html#a21c7bb64a536a1704c6dc96856b78297" target="_parent">GSL_MICRORNG</a>
+  <span class="SRScope">gsl_microrng.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_gsl_5fmicrorng_2eh">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../gsl__microrng_8h.html" target="_parent">gsl_microrng.h</a>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_68.html b/lib/Random123-1.08/docs/html/search/all_68.html
new file mode 100644
index 0000000..d4c1545
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_68.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_haveaesni">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../sse_8h.html#a0b35a046e85316295476d7d552411044" target="_parent">haveAESNI</a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_69.html b/lib/Random123-1.08/docs/html/search/all_69.html
new file mode 100644
index 0000000..35f5b17
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_69.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_incr">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_incr')">incr</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#aae5fbc153a37b06ea466f2283551622f" target="_parent">r123array1x32::incr()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array2x32.html#a7b295f3a299c8cf24a75ab7f9edfe46f" target="_parent">r123array2x32::incr()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array4x32.html#a36515eb50711e36a88f1390bbd4e0e05" target="_parent">r123array4x32::incr()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array8x32.html#a92ded324d4b7e2602766fa0c71fa5985" target="_parent">r123array8x32::incr()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array1x64.html#ad44244e95f8937e0874dec9083071a85" target="_parent">r123array1x64::incr()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array2x64.html#ac33e6336c8aee10e38259510ef76e5cf" target="_parent">r123array2x64::incr()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array4x64.html#ac4187b4ae44913183b1c8f9b7654f8a9" target="_parent">r123array4x64::incr()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array16x8.html#aaf2d677b347b7c7bf362a2b318f46e3c" target="_parent">r123array16x8::incr()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1xm128i.html#a62ee236dafcbfb81ef43d7aa82a66b47" target="_parent">r123array1xm128i::incr()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_incr_5fcarefully">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_incr_5fcarefully')">incr_carefully</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../structr123array1x32.html#a9c919289274ced376086f1110c8b6384" target="_parent">r123array1x32::incr_carefully()</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../structr123array2x32.html#adf128cb5c0abaaa4f119d4bcef47ead9" target="_parent">r123array2x32::incr_carefully()</a>
+    <a id="Item1_c2" onkeydown="return searchResults.NavChild(event,1,2)" onkeypress="return searchResults.NavChild(event,1,2)" onkeyup="return searchResults.NavChild(event,1,2)" class="SRScope" href="../structr123array4x32.html#acec3775361651e6f8dea517f07d7a8b8" target="_parent">r123array4x32::incr_carefully()</a>
+    <a id="Item1_c3" onkeydown="return searchResults.NavChild(event,1,3)" onkeypress="return searchResults.NavChild(event,1,3)" onkeyup="return searchResults.NavChild(event,1,3)" class="SRScope" href="../structr123array8x32.html#a9e73ed67b7c577ebdb6c5e1f121fdc4f" target="_parent">r123array8x32::incr_carefully()</a>
+    <a id="Item1_c4" onkeydown="return searchResults.NavChild(event,1,4)" onkeypress="return searchResults.NavChild(event,1,4)" onkeyup="return searchResults.NavChild(event,1,4)" class="SRScope" href="../structr123array1x64.html#ad848dc3e868f8195ee3eb5029698c976" target="_parent">r123array1x64::incr_carefully()</a>
+    <a id="Item1_c5" onkeydown="return searchResults.NavChild(event,1,5)" onkeypress="return searchResults.NavChild(event,1,5)" onkeyup="return searchResults.NavChild(event,1,5)" class="SRScope" href="../structr123array2x64.html#a52ddbfa3edbd9fa7f30e1402a9240da1" target="_parent">r123array2x64::incr_carefully()</a>
+    <a id="Item1_c6" onkeydown="return searchResults.NavChild(event,1,6)" onkeypress="return searchResults.NavChild(event,1,6)" onkeyup="return searchResults.NavChild(event,1,6)" class="SRScope" href="../structr123array4x64.html#af629d14b454f406cae4d128d9e05554d" target="_parent">r123array4x64::incr_carefully()</a>
+    <a id="Item1_c7" onkeydown="return searchResults.NavChild(event,1,7)" onkeypress="return searchResults.NavChild(event,1,7)" onkeyup="return searchResults.NavChild(event,1,7)" class="SRScope" href="../structr123array16x8.html#abbc6c2d9cdc2187cdfdea759951498a0" target="_parent">r123array16x8::incr_carefully()</a>
+    <a id="Item1_c8" onkeydown="return searchResults.NavChild(event,1,8)" onkeypress="return searchResults.NavChild(event,1,8)" onkeyup="return searchResults.NavChild(event,1,8)" class="SRScope" href="../structr123array1xm128i.html#ab35cfd8e9221c294ab7546855373a38c" target="_parent">r123array1xm128i::incr_carefully()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_iterator">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_iterator')">iterator</a>
+  <div class="SRChildren">
+    <a id="Item2_c0" onkeydown="return searchResults.NavChild(event,2,0)" onkeypress="return searchResults.NavChild(event,2,0)" onkeyup="return searchResults.NavChild(event,2,0)" class="SRScope" href="../structr123array1x32.html#ad17f00c1dbff151f91d381f7c0b99dc8" target="_parent">r123array1x32::iterator()</a>
+    <a id="Item2_c1" onkeydown="return searchResults.NavChild(event,2,1)" onkeypress="return searchResults.NavChild(event,2,1)" onkeyup="return searchResults.NavChild(event,2,1)" class="SRScope" href="../structr123array2x32.html#a4b447adc28d536d9b7ad7e33d5081a8e" target="_parent">r123array2x32::iterator()</a>
+    <a id="Item2_c2" onkeydown="return searchResults.NavChild(event,2,2)" onkeypress="return searchResults.NavChild(event,2,2)" onkeyup="return searchResults.NavChild(event,2,2)" class="SRScope" href="../structr123array4x32.html#a73a2a55a200af374d7299d2de13aa5cc" target="_parent">r123array4x32::iterator()</a>
+    <a id="Item2_c3" onkeydown="return searchResults.NavChild(event,2,3)" onkeypress="return searchResults.NavChild(event,2,3)" onkeyup="return searchResults.NavChild(event,2,3)" class="SRScope" href="../structr123array8x32.html#aad8ff34e784d954a05f3f058facfb2be" target="_parent">r123array8x32::iterator()</a>
+    <a id="Item2_c4" onkeydown="return searchResults.NavChild(event,2,4)" onkeypress="return searchResults.NavChild(event,2,4)" onkeyup="return searchResults.NavChild(event,2,4)" class="SRScope" href="../structr123array1x64.html#a486a75094513f75c268901b3bb6666ad" target="_parent">r123array1x64::iterator()</a>
+    <a id="Item2_c5" onkeydown="return searchResults.NavChild(event,2,5)" onkeypress="return searchResults.NavChild(event,2,5)" onkeyup="return searchResults.NavChild(event,2,5)" class="SRScope" href="../structr123array2x64.html#ac0fc5019e017f50e29d26df233085e56" target="_parent">r123array2x64::iterator()</a>
+    <a id="Item2_c6" onkeydown="return searchResults.NavChild(event,2,6)" onkeypress="return searchResults.NavChild(event,2,6)" onkeyup="return searchResults.NavChild(event,2,6)" class="SRScope" href="../structr123array4x64.html#adfc9f1209d12f855b9330ecccc8b6dd2" target="_parent">r123array4x64::iterator()</a>
+    <a id="Item2_c7" onkeydown="return searchResults.NavChild(event,2,7)" onkeypress="return searchResults.NavChild(event,2,7)" onkeyup="return searchResults.NavChild(event,2,7)" class="SRScope" href="../structr123array16x8.html#a36bdba5b2d96c8dfe9b7e59b203d5047" target="_parent">r123array16x8::iterator()</a>
+    <a id="Item2_c8" onkeydown="return searchResults.NavChild(event,2,8)" onkeypress="return searchResults.NavChild(event,2,8)" onkeyup="return searchResults.NavChild(event,2,8)" class="SRScope" href="../structr123array1xm128i.html#af9db87a7c1ae4c7ba1e355af89b4d22d" target="_parent">r123array1xm128i::iterator()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_6b.html b/lib/Random123-1.08/docs/html/search/all_6b.html
new file mode 100644
index 0000000..f67b39b
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_6b.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_k">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54" target="_parent">k</a>
+  <span class="SRScope">aesni1xm128i_key_t</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_key">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654" target="_parent">key</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_key_5ftype">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_key_5ftype')">key_type</a>
+  <div class="SRChildren">
+    <a id="Item2_c0" onkeydown="return searchResults.NavChild(event,2,0)" onkeypress="return searchResults.NavChild(event,2,0)" onkeyup="return searchResults.NavChild(event,2,0)" class="SRScope" href="../structr123_1_1AESNI1xm128i.html#a7dc33fd5abf509d9d16b571b23867a6b" target="_parent">r123::AESNI1xm128i::key_type()</a>
+    <a id="Item2_c1" onkeydown="return searchResults.NavChild(event,2,1)" onkeypress="return searchResults.NavChild(event,2,1)" onkeyup="return searchResults.NavChild(event,2,1)" class="SRScope" href="../structr123_1_1AESNI4x32.html#a3f47cb319d03ede5fd557800b618d28a" target="_parent">r123::AESNI4x32::key_type()</a>
+    <a id="Item2_c2" onkeydown="return searchResults.NavChild(event,2,2)" onkeypress="return searchResults.NavChild(event,2,2)" onkeyup="return searchResults.NavChild(event,2,2)" class="SRScope" href="../structr123_1_1ARS1xm128i__R.html#a8454d6de92379d9a6551d11828fbebc3" target="_parent">r123::ARS1xm128i_R::key_type()</a>
+    <a id="Item2_c3" onkeydown="return searchResults.NavChild(event,2,3)" onkeypress="return searchResults.NavChild(event,2,3)" onkeyup="return searchResults.NavChild(event,2,3)" class="SRScope" href="../structr123_1_1ARS4x32__R.html#a7a651b6747b9e7c038bc6d11ffa2863e" target="_parent">r123::ARS4x32_R::key_type()</a>
+    <a id="Item2_c4" onkeydown="return searchResults.NavChild(event,2,4)" onkeypress="return searchResults.NavChild(event,2,4)" onkeyup="return searchResults.NavChild(event,2,4)" class="SRScope" href="../classr123_1_1MicroURNG.html#aef90e6157f360434342ad0df4ce5f364" target="_parent">r123::MicroURNG::key_type()</a>
+    <a id="Item2_c5" onkeydown="return searchResults.NavChild(event,2,5)" onkeypress="return searchResults.NavChild(event,2,5)" onkeyup="return searchResults.NavChild(event,2,5)" class="SRScope" href="../structr123_1_1Philox2x32__R.html#a37dac768d36ef39e0228369e91b9f0ab" target="_parent">r123::Philox2x32_R::key_type()</a>
+    <a id="Item2_c6" onkeydown="return searchResults.NavChild(event,2,6)" onkeypress="return searchResults.NavChild(event,2,6)" onkeyup="return searchResults.NavChild(event,2,6)" class="SRScope" href="../structr123_1_1Philox4x32__R.html#afa2e99f3e0b635f17ba9e16c186af63b" target="_parent">r123::Philox4x32_R::key_type()</a>
+    <a id="Item2_c7" onkeydown="return searchResults.NavChild(event,2,7)" onkeypress="return searchResults.NavChild(event,2,7)" onkeyup="return searchResults.NavChild(event,2,7)" class="SRScope" href="../structr123_1_1Philox2x64__R.html#adb8a638d3d96ef0ab594b0320bae329f" target="_parent">r123::Philox2x64_R::key_type()</a>
+    <a id="Item2_c8" onkeydown="return searchResults.NavChild(event,2,8)" onkeypress="return searchResults.NavChild(event,2,8)" onkeyup="return searchResults.NavChild(event,2,8)" class="SRScope" href="../structr123_1_1Philox4x64__R.html#a9947ce12e3d03f9a60396d79bb56ba1c" target="_parent">r123::Philox4x64_R::key_type()</a>
+    <a id="Item2_c9" onkeydown="return searchResults.NavChild(event,2,9)" onkeypress="return searchResults.NavChild(event,2,9)" onkeyup="return searchResults.NavChild(event,2,9)" class="SRScope" href="../structr123_1_1ReinterpretCtr.html#a470b21676ed709aa9d9ad524a67410f1" target="_parent">r123::ReinterpretCtr::key_type()</a>
+    <a id="Item2_c10" onkeydown="return searchResults.NavChild(event,2,10)" onkeypress="return searchResults.NavChild(event,2,10)" onkeyup="return searchResults.NavChild(event,2,10)" class="SRScope" href="../structr123_1_1Threefry2x32__R.html#abfaaff871ef5e2e2cf397884ddab4cdc" target="_parent">r123::Threefry2x32_R::key_type()</a>
+    <a id="Item2_c11" onkeydown="return searchResults.NavChild(event,2,11)" onkeypress="return searchResults.NavChild(event,2,11)" onkeyup="return searchResults.NavChild(event,2,11)" class="SRScope" href="../structr123_1_1Threefry4x32__R.html#a140f5cf20bde7784d778b82f0ebf8778" target="_parent">r123::Threefry4x32_R::key_type()</a>
+    <a id="Item2_c12" onkeydown="return searchResults.NavChild(event,2,12)" onkeypress="return searchResults.NavChild(event,2,12)" onkeyup="return searchResults.NavChild(event,2,12)" class="SRScope" href="../structr123_1_1Threefry2x64__R.html#ae652f0e9ca6ec234fd2f4fc9afb1007c" target="_parent">r123::Threefry2x64_R::key_type()</a>
+    <a id="Item2_c13" onkeydown="return searchResults.NavChild(event,2,13)" onkeypress="return searchResults.NavChild(event,2,13)" onkeyup="return searchResults.NavChild(event,2,13)" class="SRScope" href="../structr123_1_1Threefry4x64__R.html#adb406d1af0e757bd8058582ee39f21dc" target="_parent">r123::Threefry4x64_R::key_type()</a>
+    <a id="Item2_c14" onkeydown="return searchResults.NavChild(event,2,14)" onkeypress="return searchResults.NavChild(event,2,14)" onkeyup="return searchResults.NavChild(event,2,14)" class="SRScope" href="../structr123_1_1Engine.html#a18132a79d2327990c4809b37300eddc3" target="_parent">r123::Engine::key_type()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_6c.html b/lib/Random123-1.08/docs/html/search/all_6c.html
new file mode 100644
index 0000000..68eda1b
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_6c.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_license">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../LICENSE.html" target="_parent">LICENSE</a>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_6d.html b/lib/Random123-1.08/docs/html/search/all_6d.html
new file mode 100644
index 0000000..de8d187
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_6d.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_m">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123m128i.html#a9b9908268281aace8028a3f34980634d" target="_parent">m</a>
+  <span class="SRScope">r123m128i</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_main_2edox">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../main_8dox.html" target="_parent">main.dox</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_max_5fsize">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_max_5fsize')">max_size</a>
+  <div class="SRChildren">
+    <a id="Item2_c0" onkeydown="return searchResults.NavChild(event,2,0)" onkeypress="return searchResults.NavChild(event,2,0)" onkeyup="return searchResults.NavChild(event,2,0)" class="SRScope" href="../structr123array1x32.html#a707c532168670ad508723d057f712928" target="_parent">r123array1x32::max_size()</a>
+    <a id="Item2_c1" onkeydown="return searchResults.NavChild(event,2,1)" onkeypress="return searchResults.NavChild(event,2,1)" onkeyup="return searchResults.NavChild(event,2,1)" class="SRScope" href="../structr123array2x32.html#a07345b400c5a81e6cd55689d1e38122f" target="_parent">r123array2x32::max_size()</a>
+    <a id="Item2_c2" onkeydown="return searchResults.NavChild(event,2,2)" onkeypress="return searchResults.NavChild(event,2,2)" onkeyup="return searchResults.NavChild(event,2,2)" class="SRScope" href="../structr123array4x32.html#afddfc77eea0f5f4c53dc075425f96ab3" target="_parent">r123array4x32::max_size()</a>
+    <a id="Item2_c3" onkeydown="return searchResults.NavChild(event,2,3)" onkeypress="return searchResults.NavChild(event,2,3)" onkeyup="return searchResults.NavChild(event,2,3)" class="SRScope" href="../structr123array8x32.html#a0ea0af65a3b0a51c090ab6ef11f20c63" target="_parent">r123array8x32::max_size()</a>
+    <a id="Item2_c4" onkeydown="return searchResults.NavChild(event,2,4)" onkeypress="return searchResults.NavChild(event,2,4)" onkeyup="return searchResults.NavChild(event,2,4)" class="SRScope" href="../structr123array1x64.html#a1b02d097ca118866b7f696b7c1c5681f" target="_parent">r123array1x64::max_size()</a>
+    <a id="Item2_c5" onkeydown="return searchResults.NavChild(event,2,5)" onkeypress="return searchResults.NavChild(event,2,5)" onkeyup="return searchResults.NavChild(event,2,5)" class="SRScope" href="../structr123array2x64.html#a03f7c9e37e59210b1d2b9390e415e289" target="_parent">r123array2x64::max_size()</a>
+    <a id="Item2_c6" onkeydown="return searchResults.NavChild(event,2,6)" onkeypress="return searchResults.NavChild(event,2,6)" onkeyup="return searchResults.NavChild(event,2,6)" class="SRScope" href="../structr123array4x64.html#aad1329f21e3fdd5d25a29148db564b8a" target="_parent">r123array4x64::max_size()</a>
+    <a id="Item2_c7" onkeydown="return searchResults.NavChild(event,2,7)" onkeypress="return searchResults.NavChild(event,2,7)" onkeyup="return searchResults.NavChild(event,2,7)" class="SRScope" href="../structr123array16x8.html#a3f59fb2b338aa8e33879e8d2d22840ed" target="_parent">r123array16x8::max_size()</a>
+    <a id="Item2_c8" onkeydown="return searchResults.NavChild(event,2,8)" onkeypress="return searchResults.NavChild(event,2,8)" onkeyup="return searchResults.NavChild(event,2,8)" class="SRScope" href="../structr123array1xm128i.html#a04e2b8952459b7aeabc011532fe3f8fa" target="_parent">r123array1xm128i::max_size()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_microurng">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../classr123_1_1MicroURNG.html" target="_parent">MicroURNG</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_microurng">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_microurng')">MicroURNG</a>
+  <div class="SRChildren">
+    <a id="Item4_c0" onkeydown="return searchResults.NavChild(event,4,0)" onkeypress="return searchResults.NavChild(event,4,0)" onkeyup="return searchResults.NavChild(event,4,0)" class="SRScope" href="../classr123_1_1MicroURNG.html#a19afb80312c370e1670bf8afc73d802e" target="_parent">r123::MicroURNG::MicroURNG(cbrng_type _b, ctr_type _c0, ukey_type _uk)</a>
+    <a id="Item4_c1" onkeydown="return searchResults.NavChild(event,4,1)" onkeypress="return searchResults.NavChild(event,4,1)" onkeyup="return searchResults.NavChild(event,4,1)" class="SRScope" href="../classr123_1_1MicroURNG.html#a7ecf43819bc96804892a78c6715f587b" target="_parent">r123::MicroURNG::MicroURNG(ctr_type _c0, ukey_type _uk)</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_microurng_2ehpp">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../MicroURNG_8hpp.html" target="_parent">MicroURNG.hpp</a>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_6f.html b/lib/Random123-1.08/docs/html/search/all_6f.html
new file mode 100644
index 0000000..b30ebbb
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_6f.html
@@ -0,0 +1,204 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_operator_20_5f_5fm128i">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123m128i.html#a80a5c24f76fec61b3ab0ed0e0353cfb7" target="_parent">operator __m128i</a>
+  <span class="SRScope">r123m128i</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_20const_20void_20_2a">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structr123m128i.html#ae5788785c2ce7f7ca6ff8dd4377771f3" target="_parent">operator const void *</a>
+  <span class="SRScope">r123m128i</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_21_3d">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_operator_21_3d')">operator!=</a>
+  <div class="SRChildren">
+    <a id="Item2_c0" onkeydown="return searchResults.NavChild(event,2,0)" onkeypress="return searchResults.NavChild(event,2,0)" onkeyup="return searchResults.NavChild(event,2,0)" class="SRScope" href="../structr123array1x32.html#af293f370d083051f6cf24408e07feff1" target="_parent">r123array1x32::operator!=()</a>
+    <a id="Item2_c1" onkeydown="return searchResults.NavChild(event,2,1)" onkeypress="return searchResults.NavChild(event,2,1)" onkeyup="return searchResults.NavChild(event,2,1)" class="SRScope" href="../structr123array2x32.html#aa0c7e561ddeb475329ea8d8178fca2a1" target="_parent">r123array2x32::operator!=()</a>
+    <a id="Item2_c2" onkeydown="return searchResults.NavChild(event,2,2)" onkeypress="return searchResults.NavChild(event,2,2)" onkeyup="return searchResults.NavChild(event,2,2)" class="SRScope" href="../structr123array4x32.html#a1a7aa47c8dd7db5146e54cc54d1d4358" target="_parent">r123array4x32::operator!=()</a>
+    <a id="Item2_c3" onkeydown="return searchResults.NavChild(event,2,3)" onkeypress="return searchResults.NavChild(event,2,3)" onkeyup="return searchResults.NavChild(event,2,3)" class="SRScope" href="../structr123array8x32.html#aed510e0472db9b00490c468d88e14bac" target="_parent">r123array8x32::operator!=()</a>
+    <a id="Item2_c4" onkeydown="return searchResults.NavChild(event,2,4)" onkeypress="return searchResults.NavChild(event,2,4)" onkeyup="return searchResults.NavChild(event,2,4)" class="SRScope" href="../structr123array1x64.html#a0969493a7aac290e5ab2a5135380bc3d" target="_parent">r123array1x64::operator!=()</a>
+    <a id="Item2_c5" onkeydown="return searchResults.NavChild(event,2,5)" onkeypress="return searchResults.NavChild(event,2,5)" onkeyup="return searchResults.NavChild(event,2,5)" class="SRScope" href="../structr123array2x64.html#a1ddc25ec182ac3b119e420f5e21c3f87" target="_parent">r123array2x64::operator!=()</a>
+    <a id="Item2_c6" onkeydown="return searchResults.NavChild(event,2,6)" onkeypress="return searchResults.NavChild(event,2,6)" onkeyup="return searchResults.NavChild(event,2,6)" class="SRScope" href="../structr123array4x64.html#abf2fc58ddb163708c087f72921dfd11d" target="_parent">r123array4x64::operator!=()</a>
+    <a id="Item2_c7" onkeydown="return searchResults.NavChild(event,2,7)" onkeypress="return searchResults.NavChild(event,2,7)" onkeyup="return searchResults.NavChild(event,2,7)" class="SRScope" href="../structr123array16x8.html#af48be55844748a0f6406b2ae437398b5" target="_parent">r123array16x8::operator!=()</a>
+    <a id="Item2_c8" onkeydown="return searchResults.NavChild(event,2,8)" onkeypress="return searchResults.NavChild(event,2,8)" onkeyup="return searchResults.NavChild(event,2,8)" class="SRScope" href="../structr123array1xm128i.html#a60cf5b0e8283c20c386a7935f9ae0a60" target="_parent">r123array1xm128i::operator!=()</a>
+    <a id="Item2_c9" onkeydown="return searchResults.NavChild(event,2,9)" onkeypress="return searchResults.NavChild(event,2,9)" onkeyup="return searchResults.NavChild(event,2,9)" class="SRScope" href="../structr123_1_1Engine.html#af0947cdcfc03aef7ec30c9fafa660445" target="_parent">r123::Engine::operator!=()</a>
+    <a id="Item2_c10" onkeydown="return searchResults.NavChild(event,2,10)" onkeypress="return searchResults.NavChild(event,2,10)" onkeyup="return searchResults.NavChild(event,2,10)" class="SRScope" href="../sse_8h.html#a9fc5dd462afc043229ab800abb8f7d64" target="_parent">operator!=(const r123m128i &lhs, const r123m128i &rhs): sse.h</a>
+    <a id="Item2_c11" onkeydown="return searchResults.NavChild(event,2,11)" onkeypress="return searchResults.NavChild(event,2,11)" onkeyup="return searchResults.NavChild(event,2,11)" class="SRScope" href="../sse_8h.html#a76ef724b020add862a911a699a21451b" target="_parent">operator!=(uint64_t lhs, const r123m128i &rhs): sse.h</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_28_29">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_operator_28_29')">operator()</a>
+  <div class="SRChildren">
+    <a id="Item3_c0" onkeydown="return searchResults.NavChild(event,3,0)" onkeypress="return searchResults.NavChild(event,3,0)" onkeyup="return searchResults.NavChild(event,3,0)" class="SRScope" href="../structr123_1_1AESNI1xm128i.html#a9bff0ac8478400c1006136e9bde91dc3" target="_parent">r123::AESNI1xm128i::operator()()</a>
+    <a id="Item3_c1" onkeydown="return searchResults.NavChild(event,3,1)" onkeypress="return searchResults.NavChild(event,3,1)" onkeyup="return searchResults.NavChild(event,3,1)" class="SRScope" href="../structr123_1_1AESNI4x32.html#a981102e5bc0a7df916a95a40af8fd4c0" target="_parent">r123::AESNI4x32::operator()()</a>
+    <a id="Item3_c2" onkeydown="return searchResults.NavChild(event,3,2)" onkeypress="return searchResults.NavChild(event,3,2)" onkeyup="return searchResults.NavChild(event,3,2)" class="SRScope" href="../structr123_1_1ARS1xm128i__R.html#a89c0fc4e1c90ee684fc88dde05d8d82c" target="_parent">r123::ARS1xm128i_R::operator()()</a>
+    <a id="Item3_c3" onkeydown="return searchResults.NavChild(event,3,3)" onkeypress="return searchResults.NavChild(event,3,3)" onkeyup="return searchResults.NavChild(event,3,3)" class="SRScope" href="../structr123_1_1ARS4x32__R.html#afcd326e150925e30de22166e727567df" target="_parent">r123::ARS4x32_R::operator()()</a>
+    <a id="Item3_c4" onkeydown="return searchResults.NavChild(event,3,4)" onkeypress="return searchResults.NavChild(event,3,4)" onkeyup="return searchResults.NavChild(event,3,4)" class="SRScope" href="../classr123_1_1MicroURNG.html#a64cd4d33b4cab5d3d9c556db68407b77" target="_parent">r123::MicroURNG::operator()()</a>
+    <a id="Item3_c5" onkeydown="return searchResults.NavChild(event,3,5)" onkeypress="return searchResults.NavChild(event,3,5)" onkeyup="return searchResults.NavChild(event,3,5)" class="SRScope" href="../structr123_1_1Philox2x32__R.html#ab610a200c9fa62d090f31466b655c780" target="_parent">r123::Philox2x32_R::operator()()</a>
+    <a id="Item3_c6" onkeydown="return searchResults.NavChild(event,3,6)" onkeypress="return searchResults.NavChild(event,3,6)" onkeyup="return searchResults.NavChild(event,3,6)" class="SRScope" href="../structr123_1_1Philox4x32__R.html#adf05bdc0c856c9541db656711fd8c7d1" target="_parent">r123::Philox4x32_R::operator()()</a>
+    <a id="Item3_c7" onkeydown="return searchResults.NavChild(event,3,7)" onkeypress="return searchResults.NavChild(event,3,7)" onkeyup="return searchResults.NavChild(event,3,7)" class="SRScope" href="../structr123_1_1Philox2x64__R.html#a04f6039e87a958593ac011d9304d7ec9" target="_parent">r123::Philox2x64_R::operator()()</a>
+    <a id="Item3_c8" onkeydown="return searchResults.NavChild(event,3,8)" onkeypress="return searchResults.NavChild(event,3,8)" onkeyup="return searchResults.NavChild(event,3,8)" class="SRScope" href="../structr123_1_1Philox4x64__R.html#aa5a0488aa6e16c55b7647c155b18462c" target="_parent">r123::Philox4x64_R::operator()()</a>
+    <a id="Item3_c9" onkeydown="return searchResults.NavChild(event,3,9)" onkeypress="return searchResults.NavChild(event,3,9)" onkeyup="return searchResults.NavChild(event,3,9)" class="SRScope" href="../structr123_1_1ReinterpretCtr.html#a91edc5103397372cc5509ad17c0fc83a" target="_parent">r123::ReinterpretCtr::operator()()</a>
+    <a id="Item3_c10" onkeydown="return searchResults.NavChild(event,3,10)" onkeypress="return searchResults.NavChild(event,3,10)" onkeyup="return searchResults.NavChild(event,3,10)" class="SRScope" href="../structr123_1_1Threefry2x32__R.html#a64b8018e82f3e7a0e252166b15b42a71" target="_parent">r123::Threefry2x32_R::operator()()</a>
+    <a id="Item3_c11" onkeydown="return searchResults.NavChild(event,3,11)" onkeypress="return searchResults.NavChild(event,3,11)" onkeyup="return searchResults.NavChild(event,3,11)" class="SRScope" href="../structr123_1_1Threefry4x32__R.html#ae0dfbf399015fab602c769ad90256231" target="_parent">r123::Threefry4x32_R::operator()()</a>
+    <a id="Item3_c12" onkeydown="return searchResults.NavChild(event,3,12)" onkeypress="return searchResults.NavChild(event,3,12)" onkeyup="return searchResults.NavChild(event,3,12)" class="SRScope" href="../structr123_1_1Threefry2x64__R.html#ab654a85f2c4ec65548ddfc85dc00f27e" target="_parent">r123::Threefry2x64_R::operator()()</a>
+    <a id="Item3_c13" onkeydown="return searchResults.NavChild(event,3,13)" onkeypress="return searchResults.NavChild(event,3,13)" onkeyup="return searchResults.NavChild(event,3,13)" class="SRScope" href="../structr123_1_1Threefry4x64__R.html#a09e7fb82f9b7bcf6ccb4d849116b6ec1" target="_parent">r123::Threefry4x64_R::operator()()</a>
+    <a id="Item3_c14" onkeydown="return searchResults.NavChild(event,3,14)" onkeypress="return searchResults.NavChild(event,3,14)" onkeyup="return searchResults.NavChild(event,3,14)" class="SRScope" href="../structr123_1_1Engine.html#aca309d0b4f2a8fff1f6f2ab38c6caf93" target="_parent">r123::Engine::operator()()</a>
+    <a id="Item3_c15" onkeydown="return searchResults.NavChild(event,3,15)" onkeypress="return searchResults.NavChild(event,3,15)" onkeyup="return searchResults.NavChild(event,3,15)" class="SRScope" href="../structr123_1_1Engine.html#af396a7d1656af55805e38f3d9c0fbef7" target="_parent">r123::Engine::operator()(const ctr_type &c) const </a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_2b_2b">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../sse_8h.html#a2ffeb79e1a2cbb9cb35b0daf514a06a5" target="_parent">operator++</a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_2b_3d">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../sse_8h.html#a436d4467bb1389d42bfa67686218fd98" target="_parent">operator+=</a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3c">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="../sse_8h.html#ac2c263fa443dd074fe4ff96710219eb8" target="_parent">operator<</a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3c_3c">
+ <div class="SREntry">
+  <a id="Item7" onkeydown="return searchResults.Nav(event,7)" onkeypress="return searchResults.Nav(event,7)" onkeyup="return searchResults.Nav(event,7)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_operator_3c_3c')">operator<<</a>
+  <div class="SRChildren">
+    <a id="Item7_c0" onkeydown="return searchResults.NavChild(event,7,0)" onkeypress="return searchResults.NavChild(event,7,0)" onkeyup="return searchResults.NavChild(event,7,0)" class="SRScope" href="../structr123_1_1Engine.html#ae0321571f689fca00c608d11ecad7d8d" target="_parent">r123::Engine::operator<<()</a>
+    <a id="Item7_c1" onkeydown="return searchResults.NavChild(event,7,1)" onkeypress="return searchResults.NavChild(event,7,1)" onkeyup="return searchResults.NavChild(event,7,1)" class="SRScope" href="../array_8h.html#af29a19da89789058ead246fdef153ce0" target="_parent">operator<<(std::ostream &os, const r123array1x32 &a): array.h</a>
+    <a id="Item7_c2" onkeydown="return searchResults.NavChild(event,7,2)" onkeypress="return searchResults.NavChild(event,7,2)" onkeyup="return searchResults.NavChild(event,7,2)" class="SRScope" href="../array_8h.html#a9c1f24a8b73925bc24a5acf09fd4e305" target="_parent">operator<<(std::ostream &os, const r123array2x32 &a): array.h</a>
+    <a id="Item7_c3" onkeydown="return searchResults.NavChild(event,7,3)" onkeypress="return searchResults.NavChild(event,7,3)" onkeyup="return searchResults.NavChild(event,7,3)" class="SRScope" href="../array_8h.html#ab2b41774a3888c0bc9697fd79383eae4" target="_parent">operator<<(std::ostream &os, const r123array4x32 &a): array.h</a>
+    <a id="Item7_c4" onkeydown="return searchResults.NavChild(event,7,4)" onkeypress="return searchResults.NavChild(event,7,4)" onkeyup="return searchResults.NavChild(event,7,4)" class="SRScope" href="../array_8h.html#a8339351efe6ba804aacd3d97632e2bdf" target="_parent">operator<<(std::ostream &os, const r123array8x32 &a): array.h</a>
+    <a id="Item7_c5" onkeydown="return searchResults.NavChild(event,7,5)" onkeypress="return searchResults.NavChild(event,7,5)" onkeyup="return searchResults.NavChild(event,7,5)" class="SRScope" href="../array_8h.html#ae87e390bd8c0cadc74bd08dfffd0101f" target="_parent">operator<<(std::ostream &os, const r123array1x64 &a): array.h</a>
+    <a id="Item7_c6" onkeydown="return searchResults.NavChild(event,7,6)" onkeypress="return searchResults.NavChild(event,7,6)" onkeyup="return searchResults.NavChild(event,7,6)" class="SRScope" href="../array_8h.html#a06634d010d5cde0afe278031c7597cc3" target="_parent">operator<<(std::ostream &os, const r123array2x64 &a): array.h</a>
+    <a id="Item7_c7" onkeydown="return searchResults.NavChild(event,7,7)" onkeypress="return searchResults.NavChild(event,7,7)" onkeyup="return searchResults.NavChild(event,7,7)" class="SRScope" href="../array_8h.html#acff68189292ea886eed0f24b5146566d" target="_parent">operator<<(std::ostream &os, const r123array4x64 &a): array.h</a>
+    <a id="Item7_c8" onkeydown="return searchResults.NavChild(event,7,8)" onkeypress="return searchResults.NavChild(event,7,8)" onkeyup="return searchResults.NavChild(event,7,8)" class="SRScope" href="../array_8h.html#a8b82ce828fcb9bb530870dd2919975e9" target="_parent">operator<<(std::ostream &os, const r123array16x8 &a): array.h</a>
+    <a id="Item7_c9" onkeydown="return searchResults.NavChild(event,7,9)" onkeypress="return searchResults.NavChild(event,7,9)" onkeyup="return searchResults.NavChild(event,7,9)" class="SRScope" href="../array_8h.html#af4437aa49ff7855c60ca4ddacf2e48e5" target="_parent">operator<<(std::ostream &os, const r123array1xm128i &a): array.h</a>
+    <a id="Item7_c10" onkeydown="return searchResults.NavChild(event,7,10)" onkeypress="return searchResults.NavChild(event,7,10)" onkeyup="return searchResults.NavChild(event,7,10)" class="SRScope" href="../sse_8h.html#af965b43e09e7305795c7b5a35d20c75f" target="_parent">operator<<(std::ostream &os, const r123m128i &m): sse.h</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3c_3d">
+ <div class="SREntry">
+  <a id="Item8" onkeydown="return searchResults.Nav(event,8)" onkeypress="return searchResults.Nav(event,8)" onkeyup="return searchResults.Nav(event,8)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_operator_3c_3d')">operator<=</a>
+  <div class="SRChildren">
+    <a id="Item8_c0" onkeydown="return searchResults.NavChild(event,8,0)" onkeypress="return searchResults.NavChild(event,8,0)" onkeyup="return searchResults.NavChild(event,8,0)" class="SRScope" href="../sse_8h.html#a43e11de33821f27448feb163162ec895" target="_parent">operator<=(uint64_t, const r123m128i &): sse.h</a>
+    <a id="Item8_c1" onkeydown="return searchResults.NavChild(event,8,1)" onkeypress="return searchResults.NavChild(event,8,1)" onkeyup="return searchResults.NavChild(event,8,1)" class="SRScope" href="../sse_8h.html#a9ce245b77f0638255e7138190d0ff4fd" target="_parent">operator<=(const r123m128i &, const r123m128i &): sse.h</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3d">
+ <div class="SREntry">
+  <a id="Item9" onkeydown="return searchResults.Nav(event,9)" onkeypress="return searchResults.Nav(event,9)" onkeyup="return searchResults.Nav(event,9)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_operator_3d')">operator=</a>
+  <div class="SRChildren">
+    <a id="Item9_c0" onkeydown="return searchResults.NavChild(event,9,0)" onkeypress="return searchResults.NavChild(event,9,0)" onkeyup="return searchResults.NavChild(event,9,0)" class="SRScope" href="../structaesni1xm128i__key__t.html#acb24fef68c539f1a6ea217ee8ada185d" target="_parent">aesni1xm128i_key_t::operator=(const aesni1xm128i_ukey_t &uk)</a>
+    <a id="Item9_c1" onkeydown="return searchResults.NavChild(event,9,1)" onkeypress="return searchResults.NavChild(event,9,1)" onkeyup="return searchResults.NavChild(event,9,1)" class="SRScope" href="../structaesni1xm128i__key__t.html#a0290dac35d6f14706247217fb49bcd60" target="_parent">aesni1xm128i_key_t::operator=(const aesni4x32_ukey_t &uk)</a>
+    <a id="Item9_c2" onkeydown="return searchResults.NavChild(event,9,2)" onkeypress="return searchResults.NavChild(event,9,2)" onkeyup="return searchResults.NavChild(event,9,2)" class="SRScope" href="../structr123m128i.html#a9842fbc85102e0019cc58d97c28e2d02" target="_parent">r123m128i::operator=(const __m128i &rhs)</a>
+    <a id="Item9_c3" onkeydown="return searchResults.NavChild(event,9,3)" onkeypress="return searchResults.NavChild(event,9,3)" onkeyup="return searchResults.NavChild(event,9,3)" class="SRScope" href="../structr123m128i.html#a0da7ae920bce1b75efb91017ab6bc37c" target="_parent">r123m128i::operator=(uint64_t n)</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3d_3d">
+ <div class="SREntry">
+  <a id="Item10" onkeydown="return searchResults.Nav(event,10)" onkeypress="return searchResults.Nav(event,10)" onkeyup="return searchResults.Nav(event,10)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_operator_3d_3d')">operator==</a>
+  <div class="SRChildren">
+    <a id="Item10_c0" onkeydown="return searchResults.NavChild(event,10,0)" onkeypress="return searchResults.NavChild(event,10,0)" onkeyup="return searchResults.NavChild(event,10,0)" class="SRScope" href="../structr123array1x32.html#a61140a0fb8983a3018a2b98903d14047" target="_parent">r123array1x32::operator==()</a>
+    <a id="Item10_c1" onkeydown="return searchResults.NavChild(event,10,1)" onkeypress="return searchResults.NavChild(event,10,1)" onkeyup="return searchResults.NavChild(event,10,1)" class="SRScope" href="../structr123array2x32.html#aa8723e5786c66137e82405a532459b2d" target="_parent">r123array2x32::operator==()</a>
+    <a id="Item10_c2" onkeydown="return searchResults.NavChild(event,10,2)" onkeypress="return searchResults.NavChild(event,10,2)" onkeyup="return searchResults.NavChild(event,10,2)" class="SRScope" href="../structr123array4x32.html#a14123fe9160e559a83e61ab6c2901759" target="_parent">r123array4x32::operator==()</a>
+    <a id="Item10_c3" onkeydown="return searchResults.NavChild(event,10,3)" onkeypress="return searchResults.NavChild(event,10,3)" onkeyup="return searchResults.NavChild(event,10,3)" class="SRScope" href="../structr123array8x32.html#ae9ffa98997557c87b0a08b6ed2835155" target="_parent">r123array8x32::operator==()</a>
+    <a id="Item10_c4" onkeydown="return searchResults.NavChild(event,10,4)" onkeypress="return searchResults.NavChild(event,10,4)" onkeyup="return searchResults.NavChild(event,10,4)" class="SRScope" href="../structr123array1x64.html#a65018edc8a8596e8bdb7500926544a4a" target="_parent">r123array1x64::operator==()</a>
+    <a id="Item10_c5" onkeydown="return searchResults.NavChild(event,10,5)" onkeypress="return searchResults.NavChild(event,10,5)" onkeyup="return searchResults.NavChild(event,10,5)" class="SRScope" href="../structr123array2x64.html#aa690f425f846ff9908a734eb720df573" target="_parent">r123array2x64::operator==()</a>
+    <a id="Item10_c6" onkeydown="return searchResults.NavChild(event,10,6)" onkeypress="return searchResults.NavChild(event,10,6)" onkeyup="return searchResults.NavChild(event,10,6)" class="SRScope" href="../structr123array4x64.html#afada659cc4a54a1416dca2522885cef1" target="_parent">r123array4x64::operator==()</a>
+    <a id="Item10_c7" onkeydown="return searchResults.NavChild(event,10,7)" onkeypress="return searchResults.NavChild(event,10,7)" onkeyup="return searchResults.NavChild(event,10,7)" class="SRScope" href="../structr123array16x8.html#a4d3ed48f2b716382ea874a968a2b7174" target="_parent">r123array16x8::operator==()</a>
+    <a id="Item10_c8" onkeydown="return searchResults.NavChild(event,10,8)" onkeypress="return searchResults.NavChild(event,10,8)" onkeyup="return searchResults.NavChild(event,10,8)" class="SRScope" href="../structr123array1xm128i.html#aa459abf9fe8d15019860de5b3b0cddf8" target="_parent">r123array1xm128i::operator==()</a>
+    <a id="Item10_c9" onkeydown="return searchResults.NavChild(event,10,9)" onkeypress="return searchResults.NavChild(event,10,9)" onkeyup="return searchResults.NavChild(event,10,9)" class="SRScope" href="../structr123_1_1Engine.html#a606e3ba824542e52f12df1345126e721" target="_parent">r123::Engine::operator==()</a>
+    <a id="Item10_c10" onkeydown="return searchResults.NavChild(event,10,10)" onkeypress="return searchResults.NavChild(event,10,10)" onkeyup="return searchResults.NavChild(event,10,10)" class="SRScope" href="../sse_8h.html#ab1389a6d8b14bc380c6d6a6d4de8853e" target="_parent">operator==(const r123m128i &lhs, const r123m128i &rhs): sse.h</a>
+    <a id="Item10_c11" onkeydown="return searchResults.NavChild(event,10,11)" onkeypress="return searchResults.NavChild(event,10,11)" onkeyup="return searchResults.NavChild(event,10,11)" class="SRScope" href="../sse_8h.html#a01fbbba16839c5938b3fa29668870db2" target="_parent">operator==(uint64_t lhs, const r123m128i &rhs): sse.h</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3e">
+ <div class="SREntry">
+  <a id="Item11" onkeydown="return searchResults.Nav(event,11)" onkeypress="return searchResults.Nav(event,11)" onkeyup="return searchResults.Nav(event,11)" class="SRSymbol" href="../sse_8h.html#ad07b59f8110eac57511ee8c2fa697f93" target="_parent">operator></a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3e_3d">
+ <div class="SREntry">
+  <a id="Item12" onkeydown="return searchResults.Nav(event,12)" onkeypress="return searchResults.Nav(event,12)" onkeyup="return searchResults.Nav(event,12)" class="SRSymbol" href="../sse_8h.html#aa7bb0ad8bfceb39a1b71262b9476e151" target="_parent">operator>=</a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3e_3e">
+ <div class="SREntry">
+  <a id="Item13" onkeydown="return searchResults.Nav(event,13)" onkeypress="return searchResults.Nav(event,13)" onkeyup="return searchResults.Nav(event,13)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_operator_3e_3e')">operator>></a>
+  <div class="SRChildren">
+    <a id="Item13_c0" onkeydown="return searchResults.NavChild(event,13,0)" onkeypress="return searchResults.NavChild(event,13,0)" onkeyup="return searchResults.NavChild(event,13,0)" class="SRScope" href="../structr123_1_1Engine.html#ae708b771ab5ac17700d34bad875a16d9" target="_parent">r123::Engine::operator>>()</a>
+    <a id="Item13_c1" onkeydown="return searchResults.NavChild(event,13,1)" onkeypress="return searchResults.NavChild(event,13,1)" onkeyup="return searchResults.NavChild(event,13,1)" class="SRScope" href="../array_8h.html#ace3112deae6709884feac904b1c260a1" target="_parent">operator>>(std::istream &is, r123array1x32 &a): array.h</a>
+    <a id="Item13_c2" onkeydown="return searchResults.NavChild(event,13,2)" onkeypress="return searchResults.NavChild(event,13,2)" onkeyup="return searchResults.NavChild(event,13,2)" class="SRScope" href="../array_8h.html#a41bb2d7e99cf51ca5927a074d1424a03" target="_parent">operator>>(std::istream &is, r123array2x32 &a): array.h</a>
+    <a id="Item13_c3" onkeydown="return searchResults.NavChild(event,13,3)" onkeypress="return searchResults.NavChild(event,13,3)" onkeyup="return searchResults.NavChild(event,13,3)" class="SRScope" href="../array_8h.html#a2782402f8b3941e104e01c317fd4b099" target="_parent">operator>>(std::istream &is, r123array4x32 &a): array.h</a>
+    <a id="Item13_c4" onkeydown="return searchResults.NavChild(event,13,4)" onkeypress="return searchResults.NavChild(event,13,4)" onkeyup="return searchResults.NavChild(event,13,4)" class="SRScope" href="../array_8h.html#ae63a28cc2f1e69f63a4402c8b83663b4" target="_parent">operator>>(std::istream &is, r123array8x32 &a): array.h</a>
+    <a id="Item13_c5" onkeydown="return searchResults.NavChild(event,13,5)" onkeypress="return searchResults.NavChild(event,13,5)" onkeyup="return searchResults.NavChild(event,13,5)" class="SRScope" href="../array_8h.html#a3cdf7b897463996d6eda01443dd669c5" target="_parent">operator>>(std::istream &is, r123array1x64 &a): array.h</a>
+    <a id="Item13_c6" onkeydown="return searchResults.NavChild(event,13,6)" onkeypress="return searchResults.NavChild(event,13,6)" onkeyup="return searchResults.NavChild(event,13,6)" class="SRScope" href="../array_8h.html#a7b32dd7601d0a11b72583a841abc8fca" target="_parent">operator>>(std::istream &is, r123array2x64 &a): array.h</a>
+    <a id="Item13_c7" onkeydown="return searchResults.NavChild(event,13,7)" onkeypress="return searchResults.NavChild(event,13,7)" onkeyup="return searchResults.NavChild(event,13,7)" class="SRScope" href="../array_8h.html#a60aa3cdbb34ced56c0c7c82371f2b30c" target="_parent">operator>>(std::istream &is, r123array4x64 &a): array.h</a>
+    <a id="Item13_c8" onkeydown="return searchResults.NavChild(event,13,8)" onkeypress="return searchResults.NavChild(event,13,8)" onkeyup="return searchResults.NavChild(event,13,8)" class="SRScope" href="../array_8h.html#abb64305331045d211dfa35be0d0cc6a9" target="_parent">operator>>(std::istream &is, r123array16x8 &a): array.h</a>
+    <a id="Item13_c9" onkeydown="return searchResults.NavChild(event,13,9)" onkeypress="return searchResults.NavChild(event,13,9)" onkeyup="return searchResults.NavChild(event,13,9)" class="SRScope" href="../array_8h.html#af831caf1f33e800dad6a659523525a78" target="_parent">operator>>(std::istream &is, r123array1xm128i &a): array.h</a>
+    <a id="Item13_c10" onkeydown="return searchResults.NavChild(event,13,10)" onkeypress="return searchResults.NavChild(event,13,10)" onkeyup="return searchResults.NavChild(event,13,10)" class="SRScope" href="../sse_8h.html#a202aef4bea97c2203a82676cb6abba40" target="_parent">operator>>(std::istream &is, r123m128i &m): sse.h</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_5b_5d">
+ <div class="SREntry">
+  <a id="Item14" onkeydown="return searchResults.Nav(event,14)" onkeypress="return searchResults.Nav(event,14)" onkeyup="return searchResults.Nav(event,14)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_operator_5b_5d')">operator[]</a>
+  <div class="SRChildren">
+    <a id="Item14_c0" onkeydown="return searchResults.NavChild(event,14,0)" onkeypress="return searchResults.NavChild(event,14,0)" onkeyup="return searchResults.NavChild(event,14,0)" class="SRScope" href="../structr123array1x32.html#aa47bb157c60858c1b0ef69df79646a3b" target="_parent">r123array1x32::operator[](size_type i)</a>
+    <a id="Item14_c1" onkeydown="return searchResults.NavChild(event,14,1)" onkeypress="return searchResults.NavChild(event,14,1)" onkeyup="return searchResults.NavChild(event,14,1)" class="SRScope" href="../structr123array1x32.html#a05cf21fa6a647c73763da02d4b7e2f2a" target="_parent">r123array1x32::operator[](size_type i) const </a>
+    <a id="Item14_c2" onkeydown="return searchResults.NavChild(event,14,2)" onkeypress="return searchResults.NavChild(event,14,2)" onkeyup="return searchResults.NavChild(event,14,2)" class="SRScope" href="../structr123array2x32.html#a9926f6938472682c5d31a742378f17de" target="_parent">r123array2x32::operator[](size_type i)</a>
+    <a id="Item14_c3" onkeydown="return searchResults.NavChild(event,14,3)" onkeypress="return searchResults.NavChild(event,14,3)" onkeyup="return searchResults.NavChild(event,14,3)" class="SRScope" href="../structr123array2x32.html#a0ae33a5edf89f9f12edec38209b02464" target="_parent">r123array2x32::operator[](size_type i) const </a>
+    <a id="Item14_c4" onkeydown="return searchResults.NavChild(event,14,4)" onkeypress="return searchResults.NavChild(event,14,4)" onkeyup="return searchResults.NavChild(event,14,4)" class="SRScope" href="../structr123array4x32.html#aa1fef4a0eb551a70d1ec5d766efcffb5" target="_parent">r123array4x32::operator[](size_type i)</a>
+    <a id="Item14_c5" onkeydown="return searchResults.NavChild(event,14,5)" onkeypress="return searchResults.NavChild(event,14,5)" onkeyup="return searchResults.NavChild(event,14,5)" class="SRScope" href="../structr123array4x32.html#a3161a139a59a1196398d5d4b81d740df" target="_parent">r123array4x32::operator[](size_type i) const </a>
+    <a id="Item14_c6" onkeydown="return searchResults.NavChild(event,14,6)" onkeypress="return searchResults.NavChild(event,14,6)" onkeyup="return searchResults.NavChild(event,14,6)" class="SRScope" href="../structr123array8x32.html#a2b0d17077d419e9f296318161fcc0470" target="_parent">r123array8x32::operator[](size_type i)</a>
+    <a id="Item14_c7" onkeydown="return searchResults.NavChild(event,14,7)" onkeypress="return searchResults.NavChild(event,14,7)" onkeyup="return searchResults.NavChild(event,14,7)" class="SRScope" href="../structr123array8x32.html#ace7ad1b4aca1ad419c373d9cff872805" target="_parent">r123array8x32::operator[](size_type i) const </a>
+    <a id="Item14_c8" onkeydown="return searchResults.NavChild(event,14,8)" onkeypress="return searchResults.NavChild(event,14,8)" onkeyup="return searchResults.NavChild(event,14,8)" class="SRScope" href="../structr123array1x64.html#a10fbaabd5223f286d6e396e15227569c" target="_parent">r123array1x64::operator[](size_type i)</a>
+    <a id="Item14_c9" onkeydown="return searchResults.NavChild(event,14,9)" onkeypress="return searchResults.NavChild(event,14,9)" onkeyup="return searchResults.NavChild(event,14,9)" class="SRScope" href="../structr123array1x64.html#aa13b237c78d719ecfb5a59cdd557c889" target="_parent">r123array1x64::operator[](size_type i) const </a>
+    <a id="Item14_c10" onkeydown="return searchResults.NavChild(event,14,10)" onkeypress="return searchResults.NavChild(event,14,10)" onkeyup="return searchResults.NavChild(event,14,10)" class="SRScope" href="../structr123array2x64.html#a7352cdb2c025b0373ece5c84409a1b1d" target="_parent">r123array2x64::operator[](size_type i)</a>
+    <a id="Item14_c11" onkeydown="return searchResults.NavChild(event,14,11)" onkeypress="return searchResults.NavChild(event,14,11)" onkeyup="return searchResults.NavChild(event,14,11)" class="SRScope" href="../structr123array2x64.html#ae534a7e32afae58303ccc8379408551b" target="_parent">r123array2x64::operator[](size_type i) const </a>
+    <a id="Item14_c12" onkeydown="return searchResults.NavChild(event,14,12)" onkeypress="return searchResults.NavChild(event,14,12)" onkeyup="return searchResults.NavChild(event,14,12)" class="SRScope" href="../structr123array4x64.html#adf867ee2ffc437a3f358431d3729a33d" target="_parent">r123array4x64::operator[](size_type i)</a>
+    <a id="Item14_c13" onkeydown="return searchResults.NavChild(event,14,13)" onkeypress="return searchResults.NavChild(event,14,13)" onkeyup="return searchResults.NavChild(event,14,13)" class="SRScope" href="../structr123array4x64.html#a27c2001bf5af042aa450f17637646bd3" target="_parent">r123array4x64::operator[](size_type i) const </a>
+    <a id="Item14_c14" onkeydown="return searchResults.NavChild(event,14,14)" onkeypress="return searchResults.NavChild(event,14,14)" onkeyup="return searchResults.NavChild(event,14,14)" class="SRScope" href="../structr123array16x8.html#abe9f2b18e2e3b89e00725f6fa69b8236" target="_parent">r123array16x8::operator[](size_type i)</a>
+    <a id="Item14_c15" onkeydown="return searchResults.NavChild(event,14,15)" onkeypress="return searchResults.NavChild(event,14,15)" onkeyup="return searchResults.NavChild(event,14,15)" class="SRScope" href="../structr123array16x8.html#a013713c00f6e8a5adb7be77388c22d8f" target="_parent">r123array16x8::operator[](size_type i) const </a>
+    <a id="Item14_c16" onkeydown="return searchResults.NavChild(event,14,16)" onkeypress="return searchResults.NavChild(event,14,16)" onkeyup="return searchResults.NavChild(event,14,16)" class="SRScope" href="../structr123array1xm128i.html#aba0d6532c59c3c879bcfbad16cab5748" target="_parent">r123array1xm128i::operator[](size_type i)</a>
+    <a id="Item14_c17" onkeydown="return searchResults.NavChild(event,14,17)" onkeypress="return searchResults.NavChild(event,14,17)" onkeyup="return searchResults.NavChild(event,14,17)" class="SRScope" href="../structr123array1xm128i.html#aaa3ccbe6c0838b5bdafcd0dfa3c2c074" target="_parent">r123array1xm128i::operator[](size_type i) const </a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_70.html b/lib/Random123-1.08/docs/html/search/all_70.html
new file mode 100644
index 0000000..5b697e7
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_70.html
@@ -0,0 +1,245 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_philox_2eh">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../philox_8h.html" target="_parent">philox.h</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x32">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_philox2x32')">philox2x32</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../philox_8h.html#ab2496424917f063a4990f01943a07fe0" target="_parent">philox2x32(): philox.h</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../group__PhiloxNxW.html#ga81659a3ee5a1ca9e2e85c5d725a1ea4f" target="_parent">r123::Philox2x32()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x32_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../philox_8h.html#a5fad831cdbd677bc6e53d37c0191f5e3" target="_parent">philox2x32_ctr_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x32_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../philox_8h.html#a55c0e4adeab3387915f966a0e40dc036" target="_parent">philox2x32_key_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x32_5fr">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../structr123_1_1Philox2x32__R.html" target="_parent">Philox2x32_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x32_5fr">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../philox_8h.html#acf0a4b82a9fd3f4695c04210df0cbefe" target="_parent">philox2x32_R</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x32_5frounds">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="../group__PhiloxNxW.html#ggae7443e1a57429154124943b6a7c0bd08ad08568b592cd076441505eed926d929c" target="_parent">philox2x32_rounds</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x32_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item7" onkeydown="return searchResults.Nav(event,7)" onkeypress="return searchResults.Nav(event,7)" onkeyup="return searchResults.Nav(event,7)" class="SRSymbol" href="../philox_8h.html#abf96b0e95504989c58e6d3436b013a6b" target="_parent">philox2x32_ukey_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x32keyinit">
+ <div class="SREntry">
+  <a id="Item8" onkeydown="return searchResults.Nav(event,8)" onkeypress="return searchResults.Nav(event,8)" onkeyup="return searchResults.Nav(event,8)" class="SRSymbol" href="../philox_8h.html#ae5dd55c0697c37598c1fbce66457e124" target="_parent">philox2x32keyinit</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x64">
+ <div class="SREntry">
+  <a id="Item9" onkeydown="return searchResults.Nav(event,9)" onkeypress="return searchResults.Nav(event,9)" onkeyup="return searchResults.Nav(event,9)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_philox2x64')">philox2x64</a>
+  <div class="SRChildren">
+    <a id="Item9_c0" onkeydown="return searchResults.NavChild(event,9,0)" onkeypress="return searchResults.NavChild(event,9,0)" onkeyup="return searchResults.NavChild(event,9,0)" class="SRScope" href="../philox_8h.html#ae6b57a71e4efa369cc19416fc088b5a5" target="_parent">philox2x64(): philox.h</a>
+    <a id="Item9_c1" onkeydown="return searchResults.NavChild(event,9,1)" onkeypress="return searchResults.NavChild(event,9,1)" onkeyup="return searchResults.NavChild(event,9,1)" class="SRScope" href="../group__PhiloxNxW.html#ga616a669079ac25119353416c14d46426" target="_parent">r123::Philox2x64()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x64_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item10" onkeydown="return searchResults.Nav(event,10)" onkeypress="return searchResults.Nav(event,10)" onkeyup="return searchResults.Nav(event,10)" class="SRSymbol" href="../philox_8h.html#a33fa626a4198f38d87713ae9504e53f2" target="_parent">philox2x64_ctr_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x64_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item11" onkeydown="return searchResults.Nav(event,11)" onkeypress="return searchResults.Nav(event,11)" onkeyup="return searchResults.Nav(event,11)" class="SRSymbol" href="../philox_8h.html#a190087c2584155a936ec7d7b9e8d7f34" target="_parent">philox2x64_key_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x64_5fr">
+ <div class="SREntry">
+  <a id="Item12" onkeydown="return searchResults.Nav(event,12)" onkeypress="return searchResults.Nav(event,12)" onkeyup="return searchResults.Nav(event,12)" class="SRSymbol" href="../philox_8h.html#a03c068219ecebcc870afa14a330c0735" target="_parent">philox2x64_R</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x64_5fr">
+ <div class="SREntry">
+  <a id="Item13" onkeydown="return searchResults.Nav(event,13)" onkeypress="return searchResults.Nav(event,13)" onkeyup="return searchResults.Nav(event,13)" class="SRSymbol" href="../structr123_1_1Philox2x64__R.html" target="_parent">Philox2x64_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x64_5frounds">
+ <div class="SREntry">
+  <a id="Item14" onkeydown="return searchResults.Nav(event,14)" onkeypress="return searchResults.Nav(event,14)" onkeyup="return searchResults.Nav(event,14)" class="SRSymbol" href="../group__PhiloxNxW.html#ggaca9df5cdadde758a63952daa97ddff91ae15befbf8ae3f2e93d6e49ea9e05b636" target="_parent">philox2x64_rounds</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x64_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item15" onkeydown="return searchResults.Nav(event,15)" onkeypress="return searchResults.Nav(event,15)" onkeyup="return searchResults.Nav(event,15)" class="SRSymbol" href="../philox_8h.html#a419cc7ebdeeaa1fc8249c638eac3d00b" target="_parent">philox2x64_ukey_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x64keyinit">
+ <div class="SREntry">
+  <a id="Item16" onkeydown="return searchResults.Nav(event,16)" onkeypress="return searchResults.Nav(event,16)" onkeyup="return searchResults.Nav(event,16)" class="SRSymbol" href="../philox_8h.html#a36b9225fcb73f91d116b424f721275f1" target="_parent">philox2x64keyinit</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x32">
+ <div class="SREntry">
+  <a id="Item17" onkeydown="return searchResults.Nav(event,17)" onkeypress="return searchResults.Nav(event,17)" onkeyup="return searchResults.Nav(event,17)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_philox4x32')">philox4x32</a>
+  <div class="SRChildren">
+    <a id="Item17_c0" onkeydown="return searchResults.NavChild(event,17,0)" onkeypress="return searchResults.NavChild(event,17,0)" onkeyup="return searchResults.NavChild(event,17,0)" class="SRScope" href="../philox_8h.html#a432a3df828dd51acd0b7ec2fee1d4d7e" target="_parent">philox4x32(): philox.h</a>
+    <a id="Item17_c1" onkeydown="return searchResults.NavChild(event,17,1)" onkeypress="return searchResults.NavChild(event,17,1)" onkeyup="return searchResults.NavChild(event,17,1)" class="SRScope" href="../group__PhiloxNxW.html#gaafd54060af05012db410034e3c0ecdc4" target="_parent">r123::Philox4x32()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x32_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item18" onkeydown="return searchResults.Nav(event,18)" onkeypress="return searchResults.Nav(event,18)" onkeyup="return searchResults.Nav(event,18)" class="SRSymbol" href="../philox_8h.html#a96f2a94ebcd7aba28aaeb0aba6543d2d" target="_parent">philox4x32_ctr_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x32_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item19" onkeydown="return searchResults.Nav(event,19)" onkeypress="return searchResults.Nav(event,19)" onkeyup="return searchResults.Nav(event,19)" class="SRSymbol" href="../philox_8h.html#ab1e74b78fcee751b43739b2b4415c592" target="_parent">philox4x32_key_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x32_5fr">
+ <div class="SREntry">
+  <a id="Item20" onkeydown="return searchResults.Nav(event,20)" onkeypress="return searchResults.Nav(event,20)" onkeyup="return searchResults.Nav(event,20)" class="SRSymbol" href="../philox_8h.html#a205fdd66786445b3e1c4157bd96d0967" target="_parent">philox4x32_R</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x32_5fr">
+ <div class="SREntry">
+  <a id="Item21" onkeydown="return searchResults.Nav(event,21)" onkeypress="return searchResults.Nav(event,21)" onkeyup="return searchResults.Nav(event,21)" class="SRSymbol" href="../structr123_1_1Philox4x32__R.html" target="_parent">Philox4x32_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x32_5frounds">
+ <div class="SREntry">
+  <a id="Item22" onkeydown="return searchResults.Nav(event,22)" onkeypress="return searchResults.Nav(event,22)" onkeyup="return searchResults.Nav(event,22)" class="SRSymbol" href="../group__PhiloxNxW.html#gga67fd1bf4ed858d01663a7d6b219b97a2ac9dec73e096a7afb5d82f2388a7a5412" target="_parent">philox4x32_rounds</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x32_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item23" onkeydown="return searchResults.Nav(event,23)" onkeypress="return searchResults.Nav(event,23)" onkeyup="return searchResults.Nav(event,23)" class="SRSymbol" href="../philox_8h.html#a82e1d60f98bfbb600bde2bd939de4573" target="_parent">philox4x32_ukey_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x32keyinit">
+ <div class="SREntry">
+  <a id="Item24" onkeydown="return searchResults.Nav(event,24)" onkeypress="return searchResults.Nav(event,24)" onkeyup="return searchResults.Nav(event,24)" class="SRSymbol" href="../philox_8h.html#a5a012bb440c039eda46802b447c31851" target="_parent">philox4x32keyinit</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x64">
+ <div class="SREntry">
+  <a id="Item25" onkeydown="return searchResults.Nav(event,25)" onkeypress="return searchResults.Nav(event,25)" onkeyup="return searchResults.Nav(event,25)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_philox4x64')">Philox4x64</a>
+  <div class="SRChildren">
+    <a id="Item25_c0" onkeydown="return searchResults.NavChild(event,25,0)" onkeypress="return searchResults.NavChild(event,25,0)" onkeyup="return searchResults.NavChild(event,25,0)" class="SRScope" href="../group__PhiloxNxW.html#ga7776f4d481b7c0ac00db70272a1c77f0" target="_parent">r123::Philox4x64()</a>
+    <a id="Item25_c1" onkeydown="return searchResults.NavChild(event,25,1)" onkeypress="return searchResults.NavChild(event,25,1)" onkeyup="return searchResults.NavChild(event,25,1)" class="SRScope" href="../philox_8h.html#a62fb1b4d9775396303ebb2a801fea8e6" target="_parent">philox4x64(): philox.h</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x64_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item26" onkeydown="return searchResults.Nav(event,26)" onkeypress="return searchResults.Nav(event,26)" onkeyup="return searchResults.Nav(event,26)" class="SRSymbol" href="../philox_8h.html#a4d2063cc89bf13153ddeff0d94371986" target="_parent">philox4x64_ctr_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x64_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item27" onkeydown="return searchResults.Nav(event,27)" onkeypress="return searchResults.Nav(event,27)" onkeyup="return searchResults.Nav(event,27)" class="SRSymbol" href="../philox_8h.html#a0c8c9410e9d88d4c94e8093007e39b0c" target="_parent">philox4x64_key_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x64_5fr">
+ <div class="SREntry">
+  <a id="Item28" onkeydown="return searchResults.Nav(event,28)" onkeypress="return searchResults.Nav(event,28)" onkeyup="return searchResults.Nav(event,28)" class="SRSymbol" href="../structr123_1_1Philox4x64__R.html" target="_parent">Philox4x64_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x64_5fr">
+ <div class="SREntry">
+  <a id="Item29" onkeydown="return searchResults.Nav(event,29)" onkeypress="return searchResults.Nav(event,29)" onkeyup="return searchResults.Nav(event,29)" class="SRSymbol" href="../philox_8h.html#ac72571943d83caf2f79b7bd309a2ae92" target="_parent">philox4x64_R</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x64_5frounds">
+ <div class="SREntry">
+  <a id="Item30" onkeydown="return searchResults.Nav(event,30)" onkeypress="return searchResults.Nav(event,30)" onkeyup="return searchResults.Nav(event,30)" class="SRSymbol" href="../group__PhiloxNxW.html#ggaf603860d055cee96c75f6986641e9cada3407accddb6e873c1005a4ab2edcef67" target="_parent">philox4x64_rounds</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x64_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item31" onkeydown="return searchResults.Nav(event,31)" onkeypress="return searchResults.Nav(event,31)" onkeyup="return searchResults.Nav(event,31)" class="SRSymbol" href="../philox_8h.html#a689ed8276d25fe0c983c4eb5b9a32fd4" target="_parent">philox4x64_ukey_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x64keyinit">
+ <div class="SREntry">
+  <a id="Item32" onkeydown="return searchResults.Nav(event,32)" onkeypress="return searchResults.Nav(event,32)" onkeyup="return searchResults.Nav(event,32)" class="SRSymbol" href="../philox_8h.html#a101674ffc206e3bd600f9544de0c3c4a" target="_parent">philox4x64keyinit</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_pointer">
+ <div class="SREntry">
+  <a id="Item33" onkeydown="return searchResults.Nav(event,33)" onkeypress="return searchResults.Nav(event,33)" onkeyup="return searchResults.Nav(event,33)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_pointer')">pointer</a>
+  <div class="SRChildren">
+    <a id="Item33_c0" onkeydown="return searchResults.NavChild(event,33,0)" onkeypress="return searchResults.NavChild(event,33,0)" onkeyup="return searchResults.NavChild(event,33,0)" class="SRScope" href="../structr123array1x32.html#a85ce46c2e10ab3d9c4f60aebe6268898" target="_parent">r123array1x32::pointer()</a>
+    <a id="Item33_c1" onkeydown="return searchResults.NavChild(event,33,1)" onkeypress="return searchResults.NavChild(event,33,1)" onkeyup="return searchResults.NavChild(event,33,1)" class="SRScope" href="../structr123array2x32.html#ac884bcbd1063811354bfac66262a0b42" target="_parent">r123array2x32::pointer()</a>
+    <a id="Item33_c2" onkeydown="return searchResults.NavChild(event,33,2)" onkeypress="return searchResults.NavChild(event,33,2)" onkeyup="return searchResults.NavChild(event,33,2)" class="SRScope" href="../structr123array4x32.html#adcef39f1e3989578b4c0a92524a15df2" target="_parent">r123array4x32::pointer()</a>
+    <a id="Item33_c3" onkeydown="return searchResults.NavChild(event,33,3)" onkeypress="return searchResults.NavChild(event,33,3)" onkeyup="return searchResults.NavChild(event,33,3)" class="SRScope" href="../structr123array8x32.html#aeaf3b46bbc571a21d61ad6ee6e760291" target="_parent">r123array8x32::pointer()</a>
+    <a id="Item33_c4" onkeydown="return searchResults.NavChild(event,33,4)" onkeypress="return searchResults.NavChild(event,33,4)" onkeyup="return searchResults.NavChild(event,33,4)" class="SRScope" href="../structr123array1x64.html#a1c104fabb72d6c72c51348ac72bd419f" target="_parent">r123array1x64::pointer()</a>
+    <a id="Item33_c5" onkeydown="return searchResults.NavChild(event,33,5)" onkeypress="return searchResults.NavChild(event,33,5)" onkeyup="return searchResults.NavChild(event,33,5)" class="SRScope" href="../structr123array2x64.html#a3b0b967b9ae134da266448c190f59c3a" target="_parent">r123array2x64::pointer()</a>
+    <a id="Item33_c6" onkeydown="return searchResults.NavChild(event,33,6)" onkeypress="return searchResults.NavChild(event,33,6)" onkeyup="return searchResults.NavChild(event,33,6)" class="SRScope" href="../structr123array4x64.html#a08c39c2f70f4198a82cba99c0162e67c" target="_parent">r123array4x64::pointer()</a>
+    <a id="Item33_c7" onkeydown="return searchResults.NavChild(event,33,7)" onkeypress="return searchResults.NavChild(event,33,7)" onkeyup="return searchResults.NavChild(event,33,7)" class="SRScope" href="../structr123array16x8.html#aa6ae2e4843b3bb1b66425afa7da9e281" target="_parent">r123array16x8::pointer()</a>
+    <a id="Item33_c8" onkeydown="return searchResults.NavChild(event,33,8)" onkeypress="return searchResults.NavChild(event,33,8)" onkeyup="return searchResults.NavChild(event,33,8)" class="SRScope" href="../structr123array1xm128i.html#a4f78260ba2ec595bdc56fc21fd45e45a" target="_parent">r123array1xm128i::pointer()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_72.html b/lib/Random123-1.08/docs/html/search/all_72.html
new file mode 100644
index 0000000..49e3421
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_72.html
@@ -0,0 +1,301 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_r123">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../namespacer123.html" target="_parent">r123</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5faesni1xm128i">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../group__AESNI.html#ga2814629101926e23001d564630ba7b86" target="_parent">r123_enum_aesni1xm128i</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5faesni4x32">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../group__AESNI.html#ga1557a9d6e95543a3c4ca9082a4c14b0d" target="_parent">r123_enum_aesni4x32</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fars1xm128i">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../group__AESNI.html#gabf0a537666d4d1421144cb0a5e67666c" target="_parent">r123_enum_ars1xm128i</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fars4x32">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../group__AESNI.html#gaa623b038fa0c8d8d2864fdc0e45884d6" target="_parent">r123_enum_ars4x32</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fphilox2x32">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../group__PhiloxNxW.html#gae7443e1a57429154124943b6a7c0bd08" target="_parent">r123_enum_philox2x32</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fphilox2x64">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="../group__PhiloxNxW.html#gaca9df5cdadde758a63952daa97ddff91" target="_parent">r123_enum_philox2x64</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fphilox4x32">
+ <div class="SREntry">
+  <a id="Item7" onkeydown="return searchResults.Nav(event,7)" onkeypress="return searchResults.Nav(event,7)" onkeyup="return searchResults.Nav(event,7)" class="SRSymbol" href="../group__PhiloxNxW.html#ga67fd1bf4ed858d01663a7d6b219b97a2" target="_parent">r123_enum_philox4x32</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fphilox4x64">
+ <div class="SREntry">
+  <a id="Item8" onkeydown="return searchResults.Nav(event,8)" onkeypress="return searchResults.Nav(event,8)" onkeyup="return searchResults.Nav(event,8)" class="SRSymbol" href="../group__PhiloxNxW.html#gaf603860d055cee96c75f6986641e9cad" target="_parent">r123_enum_philox4x64</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fthreefry2x32">
+ <div class="SREntry">
+  <a id="Item9" onkeydown="return searchResults.Nav(event,9)" onkeypress="return searchResults.Nav(event,9)" onkeyup="return searchResults.Nav(event,9)" class="SRSymbol" href="../group__ThreefryNxW.html#gae1c47baba4367dd47d68025d23ae4775" target="_parent">r123_enum_threefry2x32</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fthreefry2x64">
+ <div class="SREntry">
+  <a id="Item10" onkeydown="return searchResults.Nav(event,10)" onkeypress="return searchResults.Nav(event,10)" onkeyup="return searchResults.Nav(event,10)" class="SRSymbol" href="../group__ThreefryNxW.html#gae4df1e52db01acafb28d9c6c25a41071" target="_parent">r123_enum_threefry2x64</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fthreefry4x32">
+ <div class="SREntry">
+  <a id="Item11" onkeydown="return searchResults.Nav(event,11)" onkeypress="return searchResults.Nav(event,11)" onkeyup="return searchResults.Nav(event,11)" class="SRSymbol" href="../group__ThreefryNxW.html#ga027cd15620ecab867c6af8bb065b189b" target="_parent">r123_enum_threefry4x32</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fthreefry4x64">
+ <div class="SREntry">
+  <a id="Item12" onkeydown="return searchResults.Nav(event,12)" onkeypress="return searchResults.Nav(event,12)" onkeyup="return searchResults.Nav(event,12)" class="SRSymbol" href="../group__ThreefryNxW.html#ga6379a4a73e85bc36235907a326945acc" target="_parent">r123_enum_threefry4x64</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fno_5fmacro_5fsubst">
+ <div class="SREntry">
+  <a id="Item13" onkeydown="return searchResults.Nav(event,13)" onkeypress="return searchResults.Nav(event,13)" onkeyup="return searchResults.Nav(event,13)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_r123_5fno_5fmacro_5fsubst')">R123_NO_MACRO_SUBST</a>
+  <div class="SRChildren">
+    <a id="Item13_c0" onkeydown="return searchResults.NavChild(event,13,0)" onkeypress="return searchResults.NavChild(event,13,0)" onkeyup="return searchResults.NavChild(event,13,0)" class="SRScope" href="../classr123_1_1MicroURNG.html#aa05c857c01053cf9185406d69757b101" target="_parent">r123::MicroURNG::R123_NO_MACRO_SUBST()</a>
+    <a id="Item13_c1" onkeydown="return searchResults.NavChild(event,13,1)" onkeypress="return searchResults.NavChild(event,13,1)" onkeyup="return searchResults.NavChild(event,13,1)" class="SRScope" href="../classr123_1_1MicroURNG.html#a3af623b6366d6e848d67d72e4b0f363c" target="_parent">r123::MicroURNG::R123_NO_MACRO_SUBST()</a>
+    <a id="Item13_c2" onkeydown="return searchResults.NavChild(event,13,2)" onkeypress="return searchResults.NavChild(event,13,2)" onkeyup="return searchResults.NavChild(event,13,2)" class="SRScope" href="../structr123_1_1Engine.html#af5441fc62932c3d099f8b16150d2aa81" target="_parent">r123::Engine::R123_NO_MACRO_SUBST()</a>
+    <a id="Item13_c3" onkeydown="return searchResults.NavChild(event,13,3)" onkeypress="return searchResults.NavChild(event,13,3)" onkeyup="return searchResults.NavChild(event,13,3)" class="SRScope" href="../structr123_1_1Engine.html#a112318f7d0015ecf4c3c6a8a5c76371b" target="_parent">r123::Engine::R123_NO_MACRO_SUBST()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fw">
+ <div class="SREntry">
+  <a id="Item14" onkeydown="return searchResults.Nav(event,14)" onkeypress="return searchResults.Nav(event,14)" onkeyup="return searchResults.Nav(event,14)" class="SRSymbol" href="../array_8h.html#a9b64205709c0daaea3b05bbf7ea5a322" target="_parent">R123_W</a>
+  <span class="SRScope">array.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123array16x8">
+ <div class="SREntry">
+  <a id="Item15" onkeydown="return searchResults.Nav(event,15)" onkeypress="return searchResults.Nav(event,15)" onkeyup="return searchResults.Nav(event,15)" class="SRSymbol" href="../structr123array16x8.html" target="_parent">r123array16x8</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123array1x32">
+ <div class="SREntry">
+  <a id="Item16" onkeydown="return searchResults.Nav(event,16)" onkeypress="return searchResults.Nav(event,16)" onkeyup="return searchResults.Nav(event,16)" class="SRSymbol" href="../structr123array1x32.html" target="_parent">r123array1x32</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123array1x64">
+ <div class="SREntry">
+  <a id="Item17" onkeydown="return searchResults.Nav(event,17)" onkeypress="return searchResults.Nav(event,17)" onkeyup="return searchResults.Nav(event,17)" class="SRSymbol" href="../structr123array1x64.html" target="_parent">r123array1x64</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123array1xm128i">
+ <div class="SREntry">
+  <a id="Item18" onkeydown="return searchResults.Nav(event,18)" onkeypress="return searchResults.Nav(event,18)" onkeyup="return searchResults.Nav(event,18)" class="SRSymbol" href="../structr123array1xm128i.html" target="_parent">r123array1xm128i</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123array2x32">
+ <div class="SREntry">
+  <a id="Item19" onkeydown="return searchResults.Nav(event,19)" onkeypress="return searchResults.Nav(event,19)" onkeyup="return searchResults.Nav(event,19)" class="SRSymbol" href="../structr123array2x32.html" target="_parent">r123array2x32</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123array2x64">
+ <div class="SREntry">
+  <a id="Item20" onkeydown="return searchResults.Nav(event,20)" onkeypress="return searchResults.Nav(event,20)" onkeyup="return searchResults.Nav(event,20)" class="SRSymbol" href="../structr123array2x64.html" target="_parent">r123array2x64</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123array4x32">
+ <div class="SREntry">
+  <a id="Item21" onkeydown="return searchResults.Nav(event,21)" onkeypress="return searchResults.Nav(event,21)" onkeyup="return searchResults.Nav(event,21)" class="SRSymbol" href="../structr123array4x32.html" target="_parent">r123array4x32</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123array4x64">
+ <div class="SREntry">
+  <a id="Item22" onkeydown="return searchResults.Nav(event,22)" onkeypress="return searchResults.Nav(event,22)" onkeyup="return searchResults.Nav(event,22)" class="SRSymbol" href="../structr123array4x64.html" target="_parent">r123array4x64</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123array8x32">
+ <div class="SREntry">
+  <a id="Item23" onkeydown="return searchResults.Nav(event,23)" onkeypress="return searchResults.Nav(event,23)" onkeyup="return searchResults.Nav(event,23)" class="SRSymbol" href="../structr123array8x32.html" target="_parent">r123array8x32</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123m128i">
+ <div class="SREntry">
+  <a id="Item24" onkeydown="return searchResults.Nav(event,24)" onkeypress="return searchResults.Nav(event,24)" onkeyup="return searchResults.Nav(event,24)" class="SRSymbol" href="../structr123m128i.html" target="_parent">r123m128i</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_rbegin">
+ <div class="SREntry">
+  <a id="Item25" onkeydown="return searchResults.Nav(event,25)" onkeypress="return searchResults.Nav(event,25)" onkeyup="return searchResults.Nav(event,25)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_rbegin')">rbegin</a>
+  <div class="SRChildren">
+    <a id="Item25_c0" onkeydown="return searchResults.NavChild(event,25,0)" onkeypress="return searchResults.NavChild(event,25,0)" onkeyup="return searchResults.NavChild(event,25,0)" class="SRScope" href="../structr123array1x32.html#a0c91373623da349c09b952f616b7f5e9" target="_parent">r123array1x32::rbegin()</a>
+    <a id="Item25_c1" onkeydown="return searchResults.NavChild(event,25,1)" onkeypress="return searchResults.NavChild(event,25,1)" onkeyup="return searchResults.NavChild(event,25,1)" class="SRScope" href="../structr123array1x32.html#aacb0604c956b8e50b057a6034c78069c" target="_parent">r123array1x32::rbegin() const </a>
+    <a id="Item25_c2" onkeydown="return searchResults.NavChild(event,25,2)" onkeypress="return searchResults.NavChild(event,25,2)" onkeyup="return searchResults.NavChild(event,25,2)" class="SRScope" href="../structr123array2x32.html#a54e96198e6cd511dc147348f274b0784" target="_parent">r123array2x32::rbegin()</a>
+    <a id="Item25_c3" onkeydown="return searchResults.NavChild(event,25,3)" onkeypress="return searchResults.NavChild(event,25,3)" onkeyup="return searchResults.NavChild(event,25,3)" class="SRScope" href="../structr123array2x32.html#a00afca78e25bbb9e0b00e6ab95ecb162" target="_parent">r123array2x32::rbegin() const </a>
+    <a id="Item25_c4" onkeydown="return searchResults.NavChild(event,25,4)" onkeypress="return searchResults.NavChild(event,25,4)" onkeyup="return searchResults.NavChild(event,25,4)" class="SRScope" href="../structr123array4x32.html#aea9aae067d8347aa53a12a4c9948ae9a" target="_parent">r123array4x32::rbegin()</a>
+    <a id="Item25_c5" onkeydown="return searchResults.NavChild(event,25,5)" onkeypress="return searchResults.NavChild(event,25,5)" onkeyup="return searchResults.NavChild(event,25,5)" class="SRScope" href="../structr123array4x32.html#aadb177f7f316ae47deeea20a686e7909" target="_parent">r123array4x32::rbegin() const </a>
+    <a id="Item25_c6" onkeydown="return searchResults.NavChild(event,25,6)" onkeypress="return searchResults.NavChild(event,25,6)" onkeyup="return searchResults.NavChild(event,25,6)" class="SRScope" href="../structr123array8x32.html#a0a143a573df3282ba5b9cb2190047cca" target="_parent">r123array8x32::rbegin()</a>
+    <a id="Item25_c7" onkeydown="return searchResults.NavChild(event,25,7)" onkeypress="return searchResults.NavChild(event,25,7)" onkeyup="return searchResults.NavChild(event,25,7)" class="SRScope" href="../structr123array8x32.html#a959345559456fbc9e7e72d03a72a032c" target="_parent">r123array8x32::rbegin() const </a>
+    <a id="Item25_c8" onkeydown="return searchResults.NavChild(event,25,8)" onkeypress="return searchResults.NavChild(event,25,8)" onkeyup="return searchResults.NavChild(event,25,8)" class="SRScope" href="../structr123array1x64.html#a56196452051f26a10a4bb3c3d7b75fd0" target="_parent">r123array1x64::rbegin()</a>
+    <a id="Item25_c9" onkeydown="return searchResults.NavChild(event,25,9)" onkeypress="return searchResults.NavChild(event,25,9)" onkeyup="return searchResults.NavChild(event,25,9)" class="SRScope" href="../structr123array1x64.html#a5b080aafd94d77efda03730b6f853334" target="_parent">r123array1x64::rbegin() const </a>
+    <a id="Item25_c10" onkeydown="return searchResults.NavChild(event,25,10)" onkeypress="return searchResults.NavChild(event,25,10)" onkeyup="return searchResults.NavChild(event,25,10)" class="SRScope" href="../structr123array2x64.html#a6888b98627db6056afe3f4ee3396a9a6" target="_parent">r123array2x64::rbegin()</a>
+    <a id="Item25_c11" onkeydown="return searchResults.NavChild(event,25,11)" onkeypress="return searchResults.NavChild(event,25,11)" onkeyup="return searchResults.NavChild(event,25,11)" class="SRScope" href="../structr123array2x64.html#ad6720531d85d0c284ce32cde3b82a9da" target="_parent">r123array2x64::rbegin() const </a>
+    <a id="Item25_c12" onkeydown="return searchResults.NavChild(event,25,12)" onkeypress="return searchResults.NavChild(event,25,12)" onkeyup="return searchResults.NavChild(event,25,12)" class="SRScope" href="../structr123array4x64.html#a102f75427ce01bea725da02b975834b5" target="_parent">r123array4x64::rbegin()</a>
+    <a id="Item25_c13" onkeydown="return searchResults.NavChild(event,25,13)" onkeypress="return searchResults.NavChild(event,25,13)" onkeyup="return searchResults.NavChild(event,25,13)" class="SRScope" href="../structr123array4x64.html#a7ccc255ba0e1803080b117703dc3dc70" target="_parent">r123array4x64::rbegin() const </a>
+    <a id="Item25_c14" onkeydown="return searchResults.NavChild(event,25,14)" onkeypress="return searchResults.NavChild(event,25,14)" onkeyup="return searchResults.NavChild(event,25,14)" class="SRScope" href="../structr123array16x8.html#a5023769f3e418e15a707501aaaac5487" target="_parent">r123array16x8::rbegin()</a>
+    <a id="Item25_c15" onkeydown="return searchResults.NavChild(event,25,15)" onkeypress="return searchResults.NavChild(event,25,15)" onkeyup="return searchResults.NavChild(event,25,15)" class="SRScope" href="../structr123array16x8.html#a5da4b6af6ebaf8cc8204713a993a860c" target="_parent">r123array16x8::rbegin() const </a>
+    <a id="Item25_c16" onkeydown="return searchResults.NavChild(event,25,16)" onkeypress="return searchResults.NavChild(event,25,16)" onkeyup="return searchResults.NavChild(event,25,16)" class="SRScope" href="../structr123array1xm128i.html#a78034de911e765ed64162c894fe2ce05" target="_parent">r123array1xm128i::rbegin()</a>
+    <a id="Item25_c17" onkeydown="return searchResults.NavChild(event,25,17)" onkeypress="return searchResults.NavChild(event,25,17)" onkeyup="return searchResults.NavChild(event,25,17)" class="SRScope" href="../structr123array1xm128i.html#acd4e73f214be1dfaae5d2e20559083eb" target="_parent">r123array1xm128i::rbegin() const </a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_readme">
+ <div class="SREntry">
+  <a id="Item26" onkeydown="return searchResults.Nav(event,26)" onkeypress="return searchResults.Nav(event,26)" onkeyup="return searchResults.Nav(event,26)" class="SRSymbol" href="../README.html" target="_parent">README</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_reference">
+ <div class="SREntry">
+  <a id="Item27" onkeydown="return searchResults.Nav(event,27)" onkeypress="return searchResults.Nav(event,27)" onkeyup="return searchResults.Nav(event,27)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_reference')">reference</a>
+  <div class="SRChildren">
+    <a id="Item27_c0" onkeydown="return searchResults.NavChild(event,27,0)" onkeypress="return searchResults.NavChild(event,27,0)" onkeyup="return searchResults.NavChild(event,27,0)" class="SRScope" href="../structr123array1x32.html#ae5aa4e3a65528495ea71371529ade7d7" target="_parent">r123array1x32::reference()</a>
+    <a id="Item27_c1" onkeydown="return searchResults.NavChild(event,27,1)" onkeypress="return searchResults.NavChild(event,27,1)" onkeyup="return searchResults.NavChild(event,27,1)" class="SRScope" href="../structr123array2x32.html#aacd028d9f97ec8a2f484f0eff815abd5" target="_parent">r123array2x32::reference()</a>
+    <a id="Item27_c2" onkeydown="return searchResults.NavChild(event,27,2)" onkeypress="return searchResults.NavChild(event,27,2)" onkeyup="return searchResults.NavChild(event,27,2)" class="SRScope" href="../structr123array4x32.html#a620f00f67215ab7fd344ec551c596712" target="_parent">r123array4x32::reference()</a>
+    <a id="Item27_c3" onkeydown="return searchResults.NavChild(event,27,3)" onkeypress="return searchResults.NavChild(event,27,3)" onkeyup="return searchResults.NavChild(event,27,3)" class="SRScope" href="../structr123array8x32.html#a4027cd913ec90428d5d0dcad23a5dc2b" target="_parent">r123array8x32::reference()</a>
+    <a id="Item27_c4" onkeydown="return searchResults.NavChild(event,27,4)" onkeypress="return searchResults.NavChild(event,27,4)" onkeyup="return searchResults.NavChild(event,27,4)" class="SRScope" href="../structr123array1x64.html#a6b196cbfb84a28a57f24cd976c6fd6e6" target="_parent">r123array1x64::reference()</a>
+    <a id="Item27_c5" onkeydown="return searchResults.NavChild(event,27,5)" onkeypress="return searchResults.NavChild(event,27,5)" onkeyup="return searchResults.NavChild(event,27,5)" class="SRScope" href="../structr123array2x64.html#a7150b3ad865d00ca1f753accd8165336" target="_parent">r123array2x64::reference()</a>
+    <a id="Item27_c6" onkeydown="return searchResults.NavChild(event,27,6)" onkeypress="return searchResults.NavChild(event,27,6)" onkeyup="return searchResults.NavChild(event,27,6)" class="SRScope" href="../structr123array4x64.html#a14ea48b972d46d9424c317db9698224f" target="_parent">r123array4x64::reference()</a>
+    <a id="Item27_c7" onkeydown="return searchResults.NavChild(event,27,7)" onkeypress="return searchResults.NavChild(event,27,7)" onkeyup="return searchResults.NavChild(event,27,7)" class="SRScope" href="../structr123array16x8.html#adf010ea54bc2f9dceb8568d59c6dde8a" target="_parent">r123array16x8::reference()</a>
+    <a id="Item27_c8" onkeydown="return searchResults.NavChild(event,27,8)" onkeypress="return searchResults.NavChild(event,27,8)" onkeyup="return searchResults.NavChild(event,27,8)" class="SRScope" href="../structr123array1xm128i.html#a34f0cbdac5eb89118ecf2ab5939fbf83" target="_parent">r123array1xm128i::reference()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_reinterpretctr">
+ <div class="SREntry">
+  <a id="Item28" onkeydown="return searchResults.Nav(event,28)" onkeypress="return searchResults.Nav(event,28)" onkeyup="return searchResults.Nav(event,28)" class="SRSymbol" href="../structr123_1_1ReinterpretCtr.html" target="_parent">ReinterpretCtr</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_reinterpretctr_2ehpp">
+ <div class="SREntry">
+  <a id="Item29" onkeydown="return searchResults.Nav(event,29)" onkeypress="return searchResults.Nav(event,29)" onkeyup="return searchResults.Nav(event,29)" class="SRSymbol" href="../ReinterpretCtr_8hpp.html" target="_parent">ReinterpretCtr.hpp</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_releasenotes_2edox">
+ <div class="SREntry">
+  <a id="Item30" onkeydown="return searchResults.Nav(event,30)" onkeypress="return searchResults.Nav(event,30)" onkeyup="return searchResults.Nav(event,30)" class="SRSymbol" href="../releasenotes_8dox.html" target="_parent">releasenotes.dox</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_rend">
+ <div class="SREntry">
+  <a id="Item31" onkeydown="return searchResults.Nav(event,31)" onkeypress="return searchResults.Nav(event,31)" onkeyup="return searchResults.Nav(event,31)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_rend')">rend</a>
+  <div class="SRChildren">
+    <a id="Item31_c0" onkeydown="return searchResults.NavChild(event,31,0)" onkeypress="return searchResults.NavChild(event,31,0)" onkeyup="return searchResults.NavChild(event,31,0)" class="SRScope" href="../structr123array1x32.html#a7a55225361d3e9e6f037daa13d340fc4" target="_parent">r123array1x32::rend()</a>
+    <a id="Item31_c1" onkeydown="return searchResults.NavChild(event,31,1)" onkeypress="return searchResults.NavChild(event,31,1)" onkeyup="return searchResults.NavChild(event,31,1)" class="SRScope" href="../structr123array1x32.html#aad87615e3d9d32467d2f139be5be08ce" target="_parent">r123array1x32::rend() const </a>
+    <a id="Item31_c2" onkeydown="return searchResults.NavChild(event,31,2)" onkeypress="return searchResults.NavChild(event,31,2)" onkeyup="return searchResults.NavChild(event,31,2)" class="SRScope" href="../structr123array2x32.html#a383edbf33737eb3e5098d6da4ed326f8" target="_parent">r123array2x32::rend()</a>
+    <a id="Item31_c3" onkeydown="return searchResults.NavChild(event,31,3)" onkeypress="return searchResults.NavChild(event,31,3)" onkeyup="return searchResults.NavChild(event,31,3)" class="SRScope" href="../structr123array2x32.html#ab3f0841dcd9cea6255406b7bc6363621" target="_parent">r123array2x32::rend() const </a>
+    <a id="Item31_c4" onkeydown="return searchResults.NavChild(event,31,4)" onkeypress="return searchResults.NavChild(event,31,4)" onkeyup="return searchResults.NavChild(event,31,4)" class="SRScope" href="../structr123array4x32.html#a368f69bdd03a9af1c6254daf98496dbd" target="_parent">r123array4x32::rend()</a>
+    <a id="Item31_c5" onkeydown="return searchResults.NavChild(event,31,5)" onkeypress="return searchResults.NavChild(event,31,5)" onkeyup="return searchResults.NavChild(event,31,5)" class="SRScope" href="../structr123array4x32.html#a7b2af2db2af5f90c8a3f5f7014193d72" target="_parent">r123array4x32::rend() const </a>
+    <a id="Item31_c6" onkeydown="return searchResults.NavChild(event,31,6)" onkeypress="return searchResults.NavChild(event,31,6)" onkeyup="return searchResults.NavChild(event,31,6)" class="SRScope" href="../structr123array8x32.html#aa84fc75185aedca379d23c0220b5c64a" target="_parent">r123array8x32::rend()</a>
+    <a id="Item31_c7" onkeydown="return searchResults.NavChild(event,31,7)" onkeypress="return searchResults.NavChild(event,31,7)" onkeyup="return searchResults.NavChild(event,31,7)" class="SRScope" href="../structr123array8x32.html#afcf1ea68c3cd0ce7ff6de11d3030eb93" target="_parent">r123array8x32::rend() const </a>
+    <a id="Item31_c8" onkeydown="return searchResults.NavChild(event,31,8)" onkeypress="return searchResults.NavChild(event,31,8)" onkeyup="return searchResults.NavChild(event,31,8)" class="SRScope" href="../structr123array1x64.html#aa0f756e941d0e417355d940fd0ed3a33" target="_parent">r123array1x64::rend()</a>
+    <a id="Item31_c9" onkeydown="return searchResults.NavChild(event,31,9)" onkeypress="return searchResults.NavChild(event,31,9)" onkeyup="return searchResults.NavChild(event,31,9)" class="SRScope" href="../structr123array1x64.html#a19f9d7dd7371c20fc5001d864da453ff" target="_parent">r123array1x64::rend() const </a>
+    <a id="Item31_c10" onkeydown="return searchResults.NavChild(event,31,10)" onkeypress="return searchResults.NavChild(event,31,10)" onkeyup="return searchResults.NavChild(event,31,10)" class="SRScope" href="../structr123array2x64.html#ad1e373b457921fc672ed8892180431eb" target="_parent">r123array2x64::rend()</a>
+    <a id="Item31_c11" onkeydown="return searchResults.NavChild(event,31,11)" onkeypress="return searchResults.NavChild(event,31,11)" onkeyup="return searchResults.NavChild(event,31,11)" class="SRScope" href="../structr123array2x64.html#ad96f87786a8a277bf553d0c5584c20c1" target="_parent">r123array2x64::rend() const </a>
+    <a id="Item31_c12" onkeydown="return searchResults.NavChild(event,31,12)" onkeypress="return searchResults.NavChild(event,31,12)" onkeyup="return searchResults.NavChild(event,31,12)" class="SRScope" href="../structr123array4x64.html#a71f59163070cb4cfd7ddda6f4f8576a1" target="_parent">r123array4x64::rend()</a>
+    <a id="Item31_c13" onkeydown="return searchResults.NavChild(event,31,13)" onkeypress="return searchResults.NavChild(event,31,13)" onkeyup="return searchResults.NavChild(event,31,13)" class="SRScope" href="../structr123array4x64.html#a25538a452f6e709bacfc9f49b7216280" target="_parent">r123array4x64::rend() const </a>
+    <a id="Item31_c14" onkeydown="return searchResults.NavChild(event,31,14)" onkeypress="return searchResults.NavChild(event,31,14)" onkeyup="return searchResults.NavChild(event,31,14)" class="SRScope" href="../structr123array16x8.html#a252b937d65e7b04e5bc507d43643441f" target="_parent">r123array16x8::rend()</a>
+    <a id="Item31_c15" onkeydown="return searchResults.NavChild(event,31,15)" onkeypress="return searchResults.NavChild(event,31,15)" onkeyup="return searchResults.NavChild(event,31,15)" class="SRScope" href="../structr123array16x8.html#a286fef704fcf11e9f00d73703b7ab36b" target="_parent">r123array16x8::rend() const </a>
+    <a id="Item31_c16" onkeydown="return searchResults.NavChild(event,31,16)" onkeypress="return searchResults.NavChild(event,31,16)" onkeyup="return searchResults.NavChild(event,31,16)" class="SRScope" href="../structr123array1xm128i.html#aeb47d483223e3e29f6ad156e5c356a20" target="_parent">r123array1xm128i::rend()</a>
+    <a id="Item31_c17" onkeydown="return searchResults.NavChild(event,31,17)" onkeypress="return searchResults.NavChild(event,31,17)" onkeyup="return searchResults.NavChild(event,31,17)" class="SRScope" href="../structr123array1xm128i.html#a1599d2154e1f407bef2d556c985b0c21" target="_parent">r123array1xm128i::rend() const </a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_reset">
+ <div class="SREntry">
+  <a id="Item32" onkeydown="return searchResults.Nav(event,32)" onkeypress="return searchResults.Nav(event,32)" onkeyup="return searchResults.Nav(event,32)" class="SRSymbol" href="../classr123_1_1MicroURNG.html#add2f214254ddc2291e3b2c8b5dbe791a" target="_parent">reset</a>
+  <span class="SRScope">r123::MicroURNG</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_result_5ftype">
+ <div class="SREntry">
+  <a id="Item33" onkeydown="return searchResults.Nav(event,33)" onkeypress="return searchResults.Nav(event,33)" onkeyup="return searchResults.Nav(event,33)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_result_5ftype')">result_type</a>
+  <div class="SRChildren">
+    <a id="Item33_c0" onkeydown="return searchResults.NavChild(event,33,0)" onkeypress="return searchResults.NavChild(event,33,0)" onkeyup="return searchResults.NavChild(event,33,0)" class="SRScope" href="../classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b" target="_parent">r123::MicroURNG::result_type()</a>
+    <a id="Item33_c1" onkeydown="return searchResults.NavChild(event,33,1)" onkeypress="return searchResults.NavChild(event,33,1)" onkeyup="return searchResults.NavChild(event,33,1)" class="SRScope" href="../structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45" target="_parent">r123::Engine::result_type()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_reverse_5fiterator">
+ <div class="SREntry">
+  <a id="Item34" onkeydown="return searchResults.Nav(event,34)" onkeypress="return searchResults.Nav(event,34)" onkeyup="return searchResults.Nav(event,34)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_reverse_5fiterator')">reverse_iterator</a>
+  <div class="SRChildren">
+    <a id="Item34_c0" onkeydown="return searchResults.NavChild(event,34,0)" onkeypress="return searchResults.NavChild(event,34,0)" onkeyup="return searchResults.NavChild(event,34,0)" class="SRScope" href="../structr123array1x32.html#a21cb520afa483ae177c469f3940e7ed2" target="_parent">r123array1x32::reverse_iterator()</a>
+    <a id="Item34_c1" onkeydown="return searchResults.NavChild(event,34,1)" onkeypress="return searchResults.NavChild(event,34,1)" onkeyup="return searchResults.NavChild(event,34,1)" class="SRScope" href="../structr123array2x32.html#ad0b05bbfee2d432dfef71342f14b8430" target="_parent">r123array2x32::reverse_iterator()</a>
+    <a id="Item34_c2" onkeydown="return searchResults.NavChild(event,34,2)" onkeypress="return searchResults.NavChild(event,34,2)" onkeyup="return searchResults.NavChild(event,34,2)" class="SRScope" href="../structr123array4x32.html#aaabdf758fb4a56eaf4cf256654f41314" target="_parent">r123array4x32::reverse_iterator()</a>
+    <a id="Item34_c3" onkeydown="return searchResults.NavChild(event,34,3)" onkeypress="return searchResults.NavChild(event,34,3)" onkeyup="return searchResults.NavChild(event,34,3)" class="SRScope" href="../structr123array8x32.html#acab5de900b99bad5f69009f48fa72235" target="_parent">r123array8x32::reverse_iterator()</a>
+    <a id="Item34_c4" onkeydown="return searchResults.NavChild(event,34,4)" onkeypress="return searchResults.NavChild(event,34,4)" onkeyup="return searchResults.NavChild(event,34,4)" class="SRScope" href="../structr123array1x64.html#ac9c44218c6761d9e6f422435e49acb17" target="_parent">r123array1x64::reverse_iterator()</a>
+    <a id="Item34_c5" onkeydown="return searchResults.NavChild(event,34,5)" onkeypress="return searchResults.NavChild(event,34,5)" onkeyup="return searchResults.NavChild(event,34,5)" class="SRScope" href="../structr123array2x64.html#abcbf25662447a5241ed4d19c202f647a" target="_parent">r123array2x64::reverse_iterator()</a>
+    <a id="Item34_c6" onkeydown="return searchResults.NavChild(event,34,6)" onkeypress="return searchResults.NavChild(event,34,6)" onkeyup="return searchResults.NavChild(event,34,6)" class="SRScope" href="../structr123array4x64.html#acc93aa79ca040ce8fd0957ac86caa2f9" target="_parent">r123array4x64::reverse_iterator()</a>
+    <a id="Item34_c7" onkeydown="return searchResults.NavChild(event,34,7)" onkeypress="return searchResults.NavChild(event,34,7)" onkeyup="return searchResults.NavChild(event,34,7)" class="SRScope" href="../structr123array16x8.html#aeeb5d6d55c07a515e4c7d01cb5c5351b" target="_parent">r123array16x8::reverse_iterator()</a>
+    <a id="Item34_c8" onkeydown="return searchResults.NavChild(event,34,8)" onkeypress="return searchResults.NavChild(event,34,8)" onkeyup="return searchResults.NavChild(event,34,8)" class="SRScope" href="../structr123array1xm128i.html#a6a507944eb872540e73e7a839cbc8e30" target="_parent">r123array1xm128i::reverse_iterator()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_rounds">
+ <div class="SREntry">
+  <a id="Item35" onkeydown="return searchResults.Nav(event,35)" onkeypress="return searchResults.Nav(event,35)" onkeyup="return searchResults.Nav(event,35)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_rounds')">rounds</a>
+  <div class="SRChildren">
+    <a id="Item35_c0" onkeydown="return searchResults.NavChild(event,35,0)" onkeypress="return searchResults.NavChild(event,35,0)" onkeyup="return searchResults.NavChild(event,35,0)" class="SRScope" href="../structr123_1_1AESNI1xm128i.html#a1b5a44afde814ba844d8f5442e2a3a5f" target="_parent">r123::AESNI1xm128i::rounds()</a>
+    <a id="Item35_c1" onkeydown="return searchResults.NavChild(event,35,1)" onkeypress="return searchResults.NavChild(event,35,1)" onkeyup="return searchResults.NavChild(event,35,1)" class="SRScope" href="../structr123_1_1AESNI4x32.html#a725aad79b8d496d97bed24390f624be6" target="_parent">r123::AESNI4x32::rounds()</a>
+    <a id="Item35_c2" onkeydown="return searchResults.NavChild(event,35,2)" onkeypress="return searchResults.NavChild(event,35,2)" onkeyup="return searchResults.NavChild(event,35,2)" class="SRScope" href="../structr123_1_1ARS1xm128i__R.html#abe167a93280140e424d722c1ac47a8e9" target="_parent">r123::ARS1xm128i_R::rounds()</a>
+    <a id="Item35_c3" onkeydown="return searchResults.NavChild(event,35,3)" onkeypress="return searchResults.NavChild(event,35,3)" onkeyup="return searchResults.NavChild(event,35,3)" class="SRScope" href="../structr123_1_1ARS4x32__R.html#a710e59a54794b4cd5e55689dd906b9ba" target="_parent">r123::ARS4x32_R::rounds()</a>
+    <a id="Item35_c4" onkeydown="return searchResults.NavChild(event,35,4)" onkeypress="return searchResults.NavChild(event,35,4)" onkeyup="return searchResults.NavChild(event,35,4)" class="SRScope" href="../structr123_1_1Philox2x32__R.html#a52ee7b34688fc2e5315152a10d7df5f0" target="_parent">r123::Philox2x32_R::rounds()</a>
+    <a id="Item35_c5" onkeydown="return searchResults.NavChild(event,35,5)" onkeypress="return searchResults.NavChild(event,35,5)" onkeyup="return searchResults.NavChild(event,35,5)" class="SRScope" href="../structr123_1_1Philox4x32__R.html#a90d6a86bff4dc6e5e24209423f125140" target="_parent">r123::Philox4x32_R::rounds()</a>
+    <a id="Item35_c6" onkeydown="return searchResults.NavChild(event,35,6)" onkeypress="return searchResults.NavChild(event,35,6)" onkeyup="return searchResults.NavChild(event,35,6)" class="SRScope" href="../structr123_1_1Philox2x64__R.html#ac0764d78e07bf6d311b47d0f3ce92450" target="_parent">r123::Philox2x64_R::rounds()</a>
+    <a id="Item35_c7" onkeydown="return searchResults.NavChild(event,35,7)" onkeypress="return searchResults.NavChild(event,35,7)" onkeyup="return searchResults.NavChild(event,35,7)" class="SRScope" href="../structr123_1_1Philox4x64__R.html#ac51193ab00b118b75784f86cf3470876" target="_parent">r123::Philox4x64_R::rounds()</a>
+    <a id="Item35_c8" onkeydown="return searchResults.NavChild(event,35,8)" onkeypress="return searchResults.NavChild(event,35,8)" onkeyup="return searchResults.NavChild(event,35,8)" class="SRScope" href="../structr123_1_1Threefry2x32__R.html#af5be46f8426cfcd86e75327e4b3750b0" target="_parent">r123::Threefry2x32_R::rounds()</a>
+    <a id="Item35_c9" onkeydown="return searchResults.NavChild(event,35,9)" onkeypress="return searchResults.NavChild(event,35,9)" onkeyup="return searchResults.NavChild(event,35,9)" class="SRScope" href="../structr123_1_1Threefry4x32__R.html#af63fd38ba9acf04ee56d75e96b413291" target="_parent">r123::Threefry4x32_R::rounds()</a>
+    <a id="Item35_c10" onkeydown="return searchResults.NavChild(event,35,10)" onkeypress="return searchResults.NavChild(event,35,10)" onkeyup="return searchResults.NavChild(event,35,10)" class="SRScope" href="../structr123_1_1Threefry2x64__R.html#aa994d756504284e6a59cc8d3c57f16c6" target="_parent">r123::Threefry2x64_R::rounds()</a>
+    <a id="Item35_c11" onkeydown="return searchResults.NavChild(event,35,11)" onkeypress="return searchResults.NavChild(event,35,11)" onkeyup="return searchResults.NavChild(event,35,11)" class="SRScope" href="../structr123_1_1Threefry4x64__R.html#ab8807960eec8fc2198055ec2a971e116" target="_parent">r123::Threefry4x64_R::rounds()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_73.html b/lib/Random123-1.08/docs/html/search/all_73.html
new file mode 100644
index 0000000..1ebc6d5
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_73.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_seed">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_seed')">seed</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#adf914fa4384acfcfa1750fd47b758f42" target="_parent">r123array1x32::seed()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array2x32.html#a31cf9b80bbcc3c976681b878b7afa046" target="_parent">r123array2x32::seed()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array4x32.html#acdaad089dc0e44da5818ebda8404bd16" target="_parent">r123array4x32::seed()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array8x32.html#a93139b379ce88e16f75eb9edcf40b357" target="_parent">r123array8x32::seed()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array1x64.html#a69be3aa9c2588ce86b5ebb72649ce684" target="_parent">r123array1x64::seed()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array2x64.html#a3e5afc5e4c6886611630cec365d8397b" target="_parent">r123array2x64::seed()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array4x64.html#a6f0133930367a2260ed5a132bf737131" target="_parent">r123array4x64::seed()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array16x8.html#aef0741829d359c31ad913a6770661895" target="_parent">r123array16x8::seed()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1xm128i.html#a6645aeddeb992559150089c49ac335c8" target="_parent">r123array1xm128i::seed()</a>
+    <a id="Item0_c9" onkeydown="return searchResults.NavChild(event,0,9)" onkeypress="return searchResults.NavChild(event,0,9)" onkeyup="return searchResults.NavChild(event,0,9)" class="SRScope" href="../structr123_1_1Engine.html#a93429593bdb12b202b4b8ed38fe08bc4" target="_parent">r123::Engine::seed(result_type r)</a>
+    <a id="Item0_c10" onkeydown="return searchResults.NavChild(event,0,10)" onkeypress="return searchResults.NavChild(event,0,10)" onkeyup="return searchResults.NavChild(event,0,10)" class="SRScope" href="../structr123_1_1Engine.html#ac4d05ee820a1eb70e76cabb14645dad4" target="_parent">r123::Engine::seed(SeedSeq &s)</a>
+    <a id="Item0_c11" onkeydown="return searchResults.NavChild(event,0,11)" onkeypress="return searchResults.NavChild(event,0,11)" onkeyup="return searchResults.NavChild(event,0,11)" class="SRScope" href="../structr123_1_1Engine.html#aff36bc97d11bc66f6c0edb75d8dc88e5" target="_parent">r123::Engine::seed()</a>
+    <a id="Item0_c12" onkeydown="return searchResults.NavChild(event,0,12)" onkeypress="return searchResults.NavChild(event,0,12)" onkeyup="return searchResults.NavChild(event,0,12)" class="SRScope" href="../structr123_1_1Engine.html#a5c4d68dbbccfc71f467f3c902f5b93da" target="_parent">r123::Engine::seed(const ukey_type &uk)</a>
+    <a id="Item0_c13" onkeydown="return searchResults.NavChild(event,0,13)" onkeypress="return searchResults.NavChild(event,0,13)" onkeyup="return searchResults.NavChild(event,0,13)" class="SRScope" href="../structr123_1_1Engine.html#a7bd6d3417cefb904c879f41d2c29e15e" target="_parent">r123::Engine::seed(ukey_type &uk)</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_setcounter">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structr123_1_1Engine.html#a6104bf5ee89450403379d5680bfae172" target="_parent">setcounter</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_size">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_size')">size</a>
+  <div class="SRChildren">
+    <a id="Item2_c0" onkeydown="return searchResults.NavChild(event,2,0)" onkeypress="return searchResults.NavChild(event,2,0)" onkeyup="return searchResults.NavChild(event,2,0)" class="SRScope" href="../structr123array1x32.html#a4cbaf3feeaad0bb7227d065294240561" target="_parent">r123array1x32::size()</a>
+    <a id="Item2_c1" onkeydown="return searchResults.NavChild(event,2,1)" onkeypress="return searchResults.NavChild(event,2,1)" onkeyup="return searchResults.NavChild(event,2,1)" class="SRScope" href="../structr123array2x32.html#ad3d7310bd3ced1bfb05cbe4f3e753490" target="_parent">r123array2x32::size()</a>
+    <a id="Item2_c2" onkeydown="return searchResults.NavChild(event,2,2)" onkeypress="return searchResults.NavChild(event,2,2)" onkeyup="return searchResults.NavChild(event,2,2)" class="SRScope" href="../structr123array4x32.html#a1da4bfacdcd4a520a227bc5c2cff6a4b" target="_parent">r123array4x32::size()</a>
+    <a id="Item2_c3" onkeydown="return searchResults.NavChild(event,2,3)" onkeypress="return searchResults.NavChild(event,2,3)" onkeyup="return searchResults.NavChild(event,2,3)" class="SRScope" href="../structr123array8x32.html#aa4025fb7c1ef2c3376bdc9ae88b91553" target="_parent">r123array8x32::size()</a>
+    <a id="Item2_c4" onkeydown="return searchResults.NavChild(event,2,4)" onkeypress="return searchResults.NavChild(event,2,4)" onkeyup="return searchResults.NavChild(event,2,4)" class="SRScope" href="../structr123array1x64.html#a81dba857004f49f48cb0712edaa39e76" target="_parent">r123array1x64::size()</a>
+    <a id="Item2_c5" onkeydown="return searchResults.NavChild(event,2,5)" onkeypress="return searchResults.NavChild(event,2,5)" onkeyup="return searchResults.NavChild(event,2,5)" class="SRScope" href="../structr123array2x64.html#a10e19c13a970156c4fc18fa070dc9756" target="_parent">r123array2x64::size()</a>
+    <a id="Item2_c6" onkeydown="return searchResults.NavChild(event,2,6)" onkeypress="return searchResults.NavChild(event,2,6)" onkeyup="return searchResults.NavChild(event,2,6)" class="SRScope" href="../structr123array4x64.html#a303c3feaf0783e99292c3220613ea903" target="_parent">r123array4x64::size()</a>
+    <a id="Item2_c7" onkeydown="return searchResults.NavChild(event,2,7)" onkeypress="return searchResults.NavChild(event,2,7)" onkeyup="return searchResults.NavChild(event,2,7)" class="SRScope" href="../structr123array16x8.html#a9a31da5cdf154eba3e44af4e51002a15" target="_parent">r123array16x8::size()</a>
+    <a id="Item2_c8" onkeydown="return searchResults.NavChild(event,2,8)" onkeypress="return searchResults.NavChild(event,2,8)" onkeyup="return searchResults.NavChild(event,2,8)" class="SRScope" href="../structr123array1xm128i.html#a3f272a3884d1d5ca7a207fb31a270617" target="_parent">r123array1xm128i::size()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_size_5ftype">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_size_5ftype')">size_type</a>
+  <div class="SRChildren">
+    <a id="Item3_c0" onkeydown="return searchResults.NavChild(event,3,0)" onkeypress="return searchResults.NavChild(event,3,0)" onkeyup="return searchResults.NavChild(event,3,0)" class="SRScope" href="../structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53" target="_parent">r123array1x32::size_type()</a>
+    <a id="Item3_c1" onkeydown="return searchResults.NavChild(event,3,1)" onkeypress="return searchResults.NavChild(event,3,1)" onkeyup="return searchResults.NavChild(event,3,1)" class="SRScope" href="../structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91" target="_parent">r123array2x32::size_type()</a>
+    <a id="Item3_c2" onkeydown="return searchResults.NavChild(event,3,2)" onkeypress="return searchResults.NavChild(event,3,2)" onkeyup="return searchResults.NavChild(event,3,2)" class="SRScope" href="../structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af" target="_parent">r123array4x32::size_type()</a>
+    <a id="Item3_c3" onkeydown="return searchResults.NavChild(event,3,3)" onkeypress="return searchResults.NavChild(event,3,3)" onkeyup="return searchResults.NavChild(event,3,3)" class="SRScope" href="../structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17" target="_parent">r123array8x32::size_type()</a>
+    <a id="Item3_c4" onkeydown="return searchResults.NavChild(event,3,4)" onkeypress="return searchResults.NavChild(event,3,4)" onkeyup="return searchResults.NavChild(event,3,4)" class="SRScope" href="../structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7" target="_parent">r123array1x64::size_type()</a>
+    <a id="Item3_c5" onkeydown="return searchResults.NavChild(event,3,5)" onkeypress="return searchResults.NavChild(event,3,5)" onkeyup="return searchResults.NavChild(event,3,5)" class="SRScope" href="../structr123array2x64.html#aacb6269c183cc408285dca02e3b55526" target="_parent">r123array2x64::size_type()</a>
+    <a id="Item3_c6" onkeydown="return searchResults.NavChild(event,3,6)" onkeypress="return searchResults.NavChild(event,3,6)" onkeyup="return searchResults.NavChild(event,3,6)" class="SRScope" href="../structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af" target="_parent">r123array4x64::size_type()</a>
+    <a id="Item3_c7" onkeydown="return searchResults.NavChild(event,3,7)" onkeypress="return searchResults.NavChild(event,3,7)" onkeyup="return searchResults.NavChild(event,3,7)" class="SRScope" href="../structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952" target="_parent">r123array16x8::size_type()</a>
+    <a id="Item3_c8" onkeydown="return searchResults.NavChild(event,3,8)" onkeypress="return searchResults.NavChild(event,3,8)" onkeyup="return searchResults.NavChild(event,3,8)" class="SRScope" href="../structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c" target="_parent">r123array1xm128i::size_type()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_sse_2eh">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../sse_8h.html" target="_parent">sse.h</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_static_5fsize">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_static_5fsize')">static_size</a>
+  <div class="SRChildren">
+    <a id="Item5_c0" onkeydown="return searchResults.NavChild(event,5,0)" onkeypress="return searchResults.NavChild(event,5,0)" onkeyup="return searchResults.NavChild(event,5,0)" class="SRScope" href="../structr123array1x32.html#a2cdb0e09b7e8ba20de255ddcb54ea9baae9556d9b93643fe1f7e56e973200177a" target="_parent">r123array1x32::static_size()</a>
+    <a id="Item5_c1" onkeydown="return searchResults.NavChild(event,5,1)" onkeypress="return searchResults.NavChild(event,5,1)" onkeyup="return searchResults.NavChild(event,5,1)" class="SRScope" href="../structr123array2x32.html#ad6e438ec0d5a08bfb0b71a3ff96ea7e8a5ae3e9837bb88660b088443c1a6fb47a" target="_parent">r123array2x32::static_size()</a>
+    <a id="Item5_c2" onkeydown="return searchResults.NavChild(event,5,2)" onkeypress="return searchResults.NavChild(event,5,2)" onkeyup="return searchResults.NavChild(event,5,2)" class="SRScope" href="../structr123array4x32.html#a3d387fea63ac50668e75faa8ebe4594aa80d43f91cd038fece63f219b9f4a36c6" target="_parent">r123array4x32::static_size()</a>
+    <a id="Item5_c3" onkeydown="return searchResults.NavChild(event,5,3)" onkeypress="return searchResults.NavChild(event,5,3)" onkeyup="return searchResults.NavChild(event,5,3)" class="SRScope" href="../structr123array8x32.html#aae848a29e2a9b3229fc7063440885c4fa2270c17b2a56aea106facc9a22b62be6" target="_parent">r123array8x32::static_size()</a>
+    <a id="Item5_c4" onkeydown="return searchResults.NavChild(event,5,4)" onkeypress="return searchResults.NavChild(event,5,4)" onkeyup="return searchResults.NavChild(event,5,4)" class="SRScope" href="../structr123array1x64.html#ab7fb5f41ed3716bce19489deb1dd4149a0c25e6a56a2c69eb7641adb24765e6af" target="_parent">r123array1x64::static_size()</a>
+    <a id="Item5_c5" onkeydown="return searchResults.NavChild(event,5,5)" onkeypress="return searchResults.NavChild(event,5,5)" onkeyup="return searchResults.NavChild(event,5,5)" class="SRScope" href="../structr123array2x64.html#aa8ed42c5bf709f879674643a70e71dbca6219dc89b2a7ffde9b00364177f5b846" target="_parent">r123array2x64::static_size()</a>
+    <a id="Item5_c6" onkeydown="return searchResults.NavChild(event,5,6)" onkeypress="return searchResults.NavChild(event,5,6)" onkeyup="return searchResults.NavChild(event,5,6)" class="SRScope" href="../structr123array4x64.html#a904abc16c5828698aa8af5824b6a69c1aa1363fd51fd3dae2d8989711a11817ff" target="_parent">r123array4x64::static_size()</a>
+    <a id="Item5_c7" onkeydown="return searchResults.NavChild(event,5,7)" onkeypress="return searchResults.NavChild(event,5,7)" onkeyup="return searchResults.NavChild(event,5,7)" class="SRScope" href="../structr123array16x8.html#a7b2912a12e57bc62644a8ce57e2301b2af0ee079d4b47a988dcd2b8b8457f266f" target="_parent">r123array16x8::static_size()</a>
+    <a id="Item5_c8" onkeydown="return searchResults.NavChild(event,5,8)" onkeypress="return searchResults.NavChild(event,5,8)" onkeyup="return searchResults.NavChild(event,5,8)" class="SRScope" href="../structr123array1xm128i.html#a130e9722020433db562761a8e51bed2ca32ec6b84a0fa2dd836b04e0ffa69b2bc" target="_parent">r123array1xm128i::static_size()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_swap">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_swap')">swap</a>
+  <div class="SRChildren">
+    <a id="Item6_c0" onkeydown="return searchResults.NavChild(event,6,0)" onkeypress="return searchResults.NavChild(event,6,0)" onkeyup="return searchResults.NavChild(event,6,0)" class="SRScope" href="../structr123array1x32.html#afdd8df41333430593d31350bd12db11a" target="_parent">r123array1x32::swap()</a>
+    <a id="Item6_c1" onkeydown="return searchResults.NavChild(event,6,1)" onkeypress="return searchResults.NavChild(event,6,1)" onkeyup="return searchResults.NavChild(event,6,1)" class="SRScope" href="../structr123array2x32.html#a1eac99d2198007201b9c0040a18b258c" target="_parent">r123array2x32::swap()</a>
+    <a id="Item6_c2" onkeydown="return searchResults.NavChild(event,6,2)" onkeypress="return searchResults.NavChild(event,6,2)" onkeyup="return searchResults.NavChild(event,6,2)" class="SRScope" href="../structr123array4x32.html#a3e6f9b7de70de3386bcd2ba44ad68fb5" target="_parent">r123array4x32::swap()</a>
+    <a id="Item6_c3" onkeydown="return searchResults.NavChild(event,6,3)" onkeypress="return searchResults.NavChild(event,6,3)" onkeyup="return searchResults.NavChild(event,6,3)" class="SRScope" href="../structr123array8x32.html#a04c88fca3a8cc3b579e9fc480629888e" target="_parent">r123array8x32::swap()</a>
+    <a id="Item6_c4" onkeydown="return searchResults.NavChild(event,6,4)" onkeypress="return searchResults.NavChild(event,6,4)" onkeyup="return searchResults.NavChild(event,6,4)" class="SRScope" href="../structr123array1x64.html#a6f929a34461c49c9571eedc1df65fd20" target="_parent">r123array1x64::swap()</a>
+    <a id="Item6_c5" onkeydown="return searchResults.NavChild(event,6,5)" onkeypress="return searchResults.NavChild(event,6,5)" onkeyup="return searchResults.NavChild(event,6,5)" class="SRScope" href="../structr123array2x64.html#a78ea0dba10b77c9f228108df9ab09c9d" target="_parent">r123array2x64::swap()</a>
+    <a id="Item6_c6" onkeydown="return searchResults.NavChild(event,6,6)" onkeypress="return searchResults.NavChild(event,6,6)" onkeyup="return searchResults.NavChild(event,6,6)" class="SRScope" href="../structr123array4x64.html#a9845020f8799cbf04156e3114a4c9314" target="_parent">r123array4x64::swap()</a>
+    <a id="Item6_c7" onkeydown="return searchResults.NavChild(event,6,7)" onkeypress="return searchResults.NavChild(event,6,7)" onkeyup="return searchResults.NavChild(event,6,7)" class="SRScope" href="../structr123array16x8.html#a2de9273e9c4b4c47315cb20885e9c6ed" target="_parent">r123array16x8::swap()</a>
+    <a id="Item6_c8" onkeydown="return searchResults.NavChild(event,6,8)" onkeypress="return searchResults.NavChild(event,6,8)" onkeyup="return searchResults.NavChild(event,6,8)" class="SRScope" href="../structr123array1xm128i.html#a05f536079732d192e572bcf395ab6b4e" target="_parent">r123array1xm128i::swap()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_74.html b/lib/Random123-1.08/docs/html/search/all_74.html
new file mode 100644
index 0000000..fee6a41
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_74.html
@@ -0,0 +1,233 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_threefry_2eh">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../threefry_8h.html" target="_parent">threefry.h</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x32">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_threefry2x32')">threefry2x32</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../threefry_8h.html#a52e1635889bbf08009646f22897e07fc" target="_parent">threefry2x32(): threefry.h</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../threefry_8h.html#af98f648fb8e458ff0c6825cb903734f2" target="_parent">threefry2x32(threefry2x32_ctr_t in, threefry2x32_key_t k): threefry.h</a>
+    <a id="Item1_c2" onkeydown="return searchResults.NavChild(event,1,2)" onkeypress="return searchResults.NavChild(event,1,2)" onkeyup="return searchResults.NavChild(event,1,2)" class="SRScope" href="../group__ThreefryNxW.html#ga1c32939b65f84966c93677f4382ea36d" target="_parent">r123::Threefry2x32()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x32_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../threefry_8h.html#ac0724455e1e9218f982501247d384833" target="_parent">threefry2x32_ctr_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x32_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../threefry_8h.html#a9ebab1ff37a7c983a4d5af114fb8f1c7" target="_parent">threefry2x32_key_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x32_5fr">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../structr123_1_1Threefry2x32__R.html" target="_parent">Threefry2x32_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x32_5fr">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../threefry_8h.html#ae8eee0d74a087c6cbc112af11b884501" target="_parent">threefry2x32_R</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x32_5frounds">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="../group__ThreefryNxW.html#ggae1c47baba4367dd47d68025d23ae4775a5c6f9a5f3ae1c3700938a3fca5f5821b" target="_parent">threefry2x32_rounds</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x32_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item7" onkeydown="return searchResults.Nav(event,7)" onkeypress="return searchResults.Nav(event,7)" onkeyup="return searchResults.Nav(event,7)" class="SRSymbol" href="../threefry_8h.html#a642ffe8cacdd9e8f6b376bdffff36d24" target="_parent">threefry2x32_ukey_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x32keyinit">
+ <div class="SREntry">
+  <a id="Item8" onkeydown="return searchResults.Nav(event,8)" onkeypress="return searchResults.Nav(event,8)" onkeyup="return searchResults.Nav(event,8)" class="SRSymbol" href="../threefry_8h.html#a5dbdf6e314925cd676da9f97013aefe4" target="_parent">threefry2x32keyinit</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64">
+ <div class="SREntry">
+  <a id="Item9" onkeydown="return searchResults.Nav(event,9)" onkeypress="return searchResults.Nav(event,9)" onkeyup="return searchResults.Nav(event,9)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_threefry2x64')">Threefry2x64</a>
+  <div class="SRChildren">
+    <a id="Item9_c0" onkeydown="return searchResults.NavChild(event,9,0)" onkeypress="return searchResults.NavChild(event,9,0)" onkeyup="return searchResults.NavChild(event,9,0)" class="SRScope" href="../group__ThreefryNxW.html#ga2b54dd1b0d20f09239be5f8757f1f3db" target="_parent">r123::Threefry2x64()</a>
+    <a id="Item9_c1" onkeydown="return searchResults.NavChild(event,9,1)" onkeypress="return searchResults.NavChild(event,9,1)" onkeyup="return searchResults.NavChild(event,9,1)" class="SRScope" href="../threefry_8h.html#acda3cc1cd02719e1e3d6cfdf7ce0c4c8" target="_parent">threefry2x64(): threefry.h</a>
+    <a id="Item9_c2" onkeydown="return searchResults.NavChild(event,9,2)" onkeypress="return searchResults.NavChild(event,9,2)" onkeyup="return searchResults.NavChild(event,9,2)" class="SRScope" href="../threefry_8h.html#aea6a4bd5c80354a4f575c9bec2702172" target="_parent">threefry2x64(threefry2x64_ctr_t in, threefry2x64_key_t k): threefry.h</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item10" onkeydown="return searchResults.Nav(event,10)" onkeypress="return searchResults.Nav(event,10)" onkeyup="return searchResults.Nav(event,10)" class="SRSymbol" href="../threefry_8h.html#a13c6df8879e7c13605fc1dc67cb2173b" target="_parent">threefry2x64_ctr_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item11" onkeydown="return searchResults.Nav(event,11)" onkeypress="return searchResults.Nav(event,11)" onkeyup="return searchResults.Nav(event,11)" class="SRSymbol" href="../threefry_8h.html#a31a08f696af23b0e339126bc64a78812" target="_parent">threefry2x64_key_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64_5fr">
+ <div class="SREntry">
+  <a id="Item12" onkeydown="return searchResults.Nav(event,12)" onkeypress="return searchResults.Nav(event,12)" onkeyup="return searchResults.Nav(event,12)" class="SRSymbol" href="../threefry_8h.html#abe5e028454aef3f2bc459e5db05e0e04" target="_parent">threefry2x64_R</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64_5fr">
+ <div class="SREntry">
+  <a id="Item13" onkeydown="return searchResults.Nav(event,13)" onkeypress="return searchResults.Nav(event,13)" onkeyup="return searchResults.Nav(event,13)" class="SRSymbol" href="../structr123_1_1Threefry2x64__R.html" target="_parent">Threefry2x64_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64_5frounds">
+ <div class="SREntry">
+  <a id="Item14" onkeydown="return searchResults.Nav(event,14)" onkeypress="return searchResults.Nav(event,14)" onkeyup="return searchResults.Nav(event,14)" class="SRSymbol" href="../group__ThreefryNxW.html#ggae4df1e52db01acafb28d9c6c25a41071a61579c86759ab497dbfc895f2fe6ec7c" target="_parent">threefry2x64_rounds</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item15" onkeydown="return searchResults.Nav(event,15)" onkeypress="return searchResults.Nav(event,15)" onkeyup="return searchResults.Nav(event,15)" class="SRSymbol" href="../threefry_8h.html#abb918225d16fcdf0b2659e2096d182b9" target="_parent">threefry2x64_ukey_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64keyinit">
+ <div class="SREntry">
+  <a id="Item16" onkeydown="return searchResults.Nav(event,16)" onkeypress="return searchResults.Nav(event,16)" onkeyup="return searchResults.Nav(event,16)" class="SRSymbol" href="../threefry_8h.html#ac14fcf731b175a1cec85a80606ed5f04" target="_parent">threefry2x64keyinit</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32">
+ <div class="SREntry">
+  <a id="Item17" onkeydown="return searchResults.Nav(event,17)" onkeypress="return searchResults.Nav(event,17)" onkeyup="return searchResults.Nav(event,17)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_threefry4x32')">threefry4x32</a>
+  <div class="SRChildren">
+    <a id="Item17_c0" onkeydown="return searchResults.NavChild(event,17,0)" onkeypress="return searchResults.NavChild(event,17,0)" onkeyup="return searchResults.NavChild(event,17,0)" class="SRScope" href="../threefry_8h.html#aaaecd189b32b0081c6a3c2cb46577e23" target="_parent">threefry4x32(): threefry.h</a>
+    <a id="Item17_c1" onkeydown="return searchResults.NavChild(event,17,1)" onkeypress="return searchResults.NavChild(event,17,1)" onkeyup="return searchResults.NavChild(event,17,1)" class="SRScope" href="../threefry_8h.html#a1636cce9de54f919e8952a42b7f397fd" target="_parent">threefry4x32(threefry4x32_ctr_t in, threefry4x32_key_t k): threefry.h</a>
+    <a id="Item17_c2" onkeydown="return searchResults.NavChild(event,17,2)" onkeypress="return searchResults.NavChild(event,17,2)" onkeyup="return searchResults.NavChild(event,17,2)" class="SRScope" href="../group__ThreefryNxW.html#gacb09a2dcfb7389769f0c58f45f132aaa" target="_parent">r123::Threefry4x32()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item18" onkeydown="return searchResults.Nav(event,18)" onkeypress="return searchResults.Nav(event,18)" onkeyup="return searchResults.Nav(event,18)" class="SRSymbol" href="../threefry_8h.html#aa72e480598b54b5bbc640a101f9cbe6e" target="_parent">threefry4x32_ctr_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item19" onkeydown="return searchResults.Nav(event,19)" onkeypress="return searchResults.Nav(event,19)" onkeyup="return searchResults.Nav(event,19)" class="SRSymbol" href="../threefry_8h.html#af332bdaec196cee5378cab4fd049ecde" target="_parent">threefry4x32_key_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32_5fr">
+ <div class="SREntry">
+  <a id="Item20" onkeydown="return searchResults.Nav(event,20)" onkeypress="return searchResults.Nav(event,20)" onkeyup="return searchResults.Nav(event,20)" class="SRSymbol" href="../threefry_8h.html#a79eb6922e7404e224893f7f723fc240c" target="_parent">threefry4x32_R</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32_5fr">
+ <div class="SREntry">
+  <a id="Item21" onkeydown="return searchResults.Nav(event,21)" onkeypress="return searchResults.Nav(event,21)" onkeyup="return searchResults.Nav(event,21)" class="SRSymbol" href="../structr123_1_1Threefry4x32__R.html" target="_parent">Threefry4x32_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32_5frounds">
+ <div class="SREntry">
+  <a id="Item22" onkeydown="return searchResults.Nav(event,22)" onkeypress="return searchResults.Nav(event,22)" onkeyup="return searchResults.Nav(event,22)" class="SRSymbol" href="../group__ThreefryNxW.html#gga027cd15620ecab867c6af8bb065b189ba36063dd986ca2ccd28209c7b4bf711d7" target="_parent">threefry4x32_rounds</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item23" onkeydown="return searchResults.Nav(event,23)" onkeypress="return searchResults.Nav(event,23)" onkeyup="return searchResults.Nav(event,23)" class="SRSymbol" href="../threefry_8h.html#ad65418f4e2c8d8df38059aabc2cc98b6" target="_parent">threefry4x32_ukey_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32keyinit">
+ <div class="SREntry">
+  <a id="Item24" onkeydown="return searchResults.Nav(event,24)" onkeypress="return searchResults.Nav(event,24)" onkeyup="return searchResults.Nav(event,24)" class="SRSymbol" href="../threefry_8h.html#a458f442301e620096d73efd479ab8591" target="_parent">threefry4x32keyinit</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64">
+ <div class="SREntry">
+  <a id="Item25" onkeydown="return searchResults.Nav(event,25)" onkeypress="return searchResults.Nav(event,25)" onkeyup="return searchResults.Nav(event,25)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_threefry4x64')">Threefry4x64</a>
+  <div class="SRChildren">
+    <a id="Item25_c0" onkeydown="return searchResults.NavChild(event,25,0)" onkeypress="return searchResults.NavChild(event,25,0)" onkeyup="return searchResults.NavChild(event,25,0)" class="SRScope" href="../group__ThreefryNxW.html#gae17c98bddf067365508ed0717f865e8b" target="_parent">r123::Threefry4x64()</a>
+    <a id="Item25_c1" onkeydown="return searchResults.NavChild(event,25,1)" onkeypress="return searchResults.NavChild(event,25,1)" onkeyup="return searchResults.NavChild(event,25,1)" class="SRScope" href="../threefry_8h.html#a992029974a22f14e0ef29a862ede2b8d" target="_parent">threefry4x64(): threefry.h</a>
+    <a id="Item25_c2" onkeydown="return searchResults.NavChild(event,25,2)" onkeypress="return searchResults.NavChild(event,25,2)" onkeyup="return searchResults.NavChild(event,25,2)" class="SRScope" href="../threefry_8h.html#a382d18a49002d2a5e2b2f06d58669d70" target="_parent">threefry4x64(threefry4x64_ctr_t in, threefry4x64_key_t k): threefry.h</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item26" onkeydown="return searchResults.Nav(event,26)" onkeypress="return searchResults.Nav(event,26)" onkeyup="return searchResults.Nav(event,26)" class="SRSymbol" href="../threefry_8h.html#a3296098832bc3a243f40078c1b93592e" target="_parent">threefry4x64_ctr_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item27" onkeydown="return searchResults.Nav(event,27)" onkeypress="return searchResults.Nav(event,27)" onkeyup="return searchResults.Nav(event,27)" class="SRSymbol" href="../threefry_8h.html#ad51f07c7dc47238532cbc05e89f5cef9" target="_parent">threefry4x64_key_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64_5fr">
+ <div class="SREntry">
+  <a id="Item28" onkeydown="return searchResults.Nav(event,28)" onkeypress="return searchResults.Nav(event,28)" onkeyup="return searchResults.Nav(event,28)" class="SRSymbol" href="../structr123_1_1Threefry4x64__R.html" target="_parent">Threefry4x64_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64_5fr">
+ <div class="SREntry">
+  <a id="Item29" onkeydown="return searchResults.Nav(event,29)" onkeypress="return searchResults.Nav(event,29)" onkeyup="return searchResults.Nav(event,29)" class="SRSymbol" href="../threefry_8h.html#a2e04c3f1ae28c4833444bfafcf22c47f" target="_parent">threefry4x64_R</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64_5frounds">
+ <div class="SREntry">
+  <a id="Item30" onkeydown="return searchResults.Nav(event,30)" onkeypress="return searchResults.Nav(event,30)" onkeyup="return searchResults.Nav(event,30)" class="SRSymbol" href="../group__ThreefryNxW.html#gga6379a4a73e85bc36235907a326945acca9cdd4629047775ebe339ac9e9dd0ad65" target="_parent">threefry4x64_rounds</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item31" onkeydown="return searchResults.Nav(event,31)" onkeypress="return searchResults.Nav(event,31)" onkeyup="return searchResults.Nav(event,31)" class="SRSymbol" href="../threefry_8h.html#a6b4db94d5185220d4fcec72f92a391ad" target="_parent">threefry4x64_ukey_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64keyinit">
+ <div class="SREntry">
+  <a id="Item32" onkeydown="return searchResults.Nav(event,32)" onkeypress="return searchResults.Nav(event,32)" onkeyup="return searchResults.Nav(event,32)" class="SRSymbol" href="../threefry_8h.html#aeed27be75e75bfffb0bf8c6333f71b10" target="_parent">threefry4x64keyinit</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_75.html b/lib/Random123-1.08/docs/html/search/all_75.html
new file mode 100644
index 0000000..d698cf5
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_75.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_ukey">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f" target="_parent">ukey</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ukey_5ftype">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_ukey_5ftype')">ukey_type</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../structr123_1_1AESNI1xm128i.html#a1f405533da84d98b938030190a63cec5" target="_parent">r123::AESNI1xm128i::ukey_type()</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../structr123_1_1AESNI4x32.html#a3fbb6113e70575dce3b6047a22a751f4" target="_parent">r123::AESNI4x32::ukey_type()</a>
+    <a id="Item1_c2" onkeydown="return searchResults.NavChild(event,1,2)" onkeypress="return searchResults.NavChild(event,1,2)" onkeyup="return searchResults.NavChild(event,1,2)" class="SRScope" href="../structr123_1_1ARS1xm128i__R.html#ab26c7029e347e6b1e17dad795e462aeb" target="_parent">r123::ARS1xm128i_R::ukey_type()</a>
+    <a id="Item1_c3" onkeydown="return searchResults.NavChild(event,1,3)" onkeypress="return searchResults.NavChild(event,1,3)" onkeyup="return searchResults.NavChild(event,1,3)" class="SRScope" href="../structr123_1_1ARS4x32__R.html#aa4bd7be98acb8b0299fb0ffce3db69ee" target="_parent">r123::ARS4x32_R::ukey_type()</a>
+    <a id="Item1_c4" onkeydown="return searchResults.NavChild(event,1,4)" onkeypress="return searchResults.NavChild(event,1,4)" onkeyup="return searchResults.NavChild(event,1,4)" class="SRScope" href="../classr123_1_1MicroURNG.html#a7e6fd93fec2fe138ee36b401ff376cfc" target="_parent">r123::MicroURNG::ukey_type()</a>
+    <a id="Item1_c5" onkeydown="return searchResults.NavChild(event,1,5)" onkeypress="return searchResults.NavChild(event,1,5)" onkeyup="return searchResults.NavChild(event,1,5)" class="SRScope" href="../structr123_1_1Philox2x32__R.html#a8982960eb5a3b5afc26c8e8d6639275e" target="_parent">r123::Philox2x32_R::ukey_type()</a>
+    <a id="Item1_c6" onkeydown="return searchResults.NavChild(event,1,6)" onkeypress="return searchResults.NavChild(event,1,6)" onkeyup="return searchResults.NavChild(event,1,6)" class="SRScope" href="../structr123_1_1Philox4x32__R.html#a804c8700155da93039c339ac83df99dd" target="_parent">r123::Philox4x32_R::ukey_type()</a>
+    <a id="Item1_c7" onkeydown="return searchResults.NavChild(event,1,7)" onkeypress="return searchResults.NavChild(event,1,7)" onkeyup="return searchResults.NavChild(event,1,7)" class="SRScope" href="../structr123_1_1Philox2x64__R.html#a0c4cfeb8c3f00d1755ee047790c9da1c" target="_parent">r123::Philox2x64_R::ukey_type()</a>
+    <a id="Item1_c8" onkeydown="return searchResults.NavChild(event,1,8)" onkeypress="return searchResults.NavChild(event,1,8)" onkeyup="return searchResults.NavChild(event,1,8)" class="SRScope" href="../structr123_1_1Philox4x64__R.html#a4715e37129fb4ca9d7671cb9df4fa8c5" target="_parent">r123::Philox4x64_R::ukey_type()</a>
+    <a id="Item1_c9" onkeydown="return searchResults.NavChild(event,1,9)" onkeypress="return searchResults.NavChild(event,1,9)" onkeyup="return searchResults.NavChild(event,1,9)" class="SRScope" href="../structr123_1_1ReinterpretCtr.html#a4b0b69c1aa58d62bb22e51e16c586bee" target="_parent">r123::ReinterpretCtr::ukey_type()</a>
+    <a id="Item1_c10" onkeydown="return searchResults.NavChild(event,1,10)" onkeypress="return searchResults.NavChild(event,1,10)" onkeyup="return searchResults.NavChild(event,1,10)" class="SRScope" href="../structr123_1_1Threefry2x32__R.html#a3ab3969f7445f9fe935566fdc017c5ca" target="_parent">r123::Threefry2x32_R::ukey_type()</a>
+    <a id="Item1_c11" onkeydown="return searchResults.NavChild(event,1,11)" onkeypress="return searchResults.NavChild(event,1,11)" onkeyup="return searchResults.NavChild(event,1,11)" class="SRScope" href="../structr123_1_1Threefry4x32__R.html#aab22e360de3f5e13f018ccf3a6754a8f" target="_parent">r123::Threefry4x32_R::ukey_type()</a>
+    <a id="Item1_c12" onkeydown="return searchResults.NavChild(event,1,12)" onkeypress="return searchResults.NavChild(event,1,12)" onkeyup="return searchResults.NavChild(event,1,12)" class="SRScope" href="../structr123_1_1Threefry2x64__R.html#a57db271865ab1889c8f569fb053ee66d" target="_parent">r123::Threefry2x64_R::ukey_type()</a>
+    <a id="Item1_c13" onkeydown="return searchResults.NavChild(event,1,13)" onkeypress="return searchResults.NavChild(event,1,13)" onkeyup="return searchResults.NavChild(event,1,13)" class="SRScope" href="../structr123_1_1Threefry4x64__R.html#a087ff88f84d115a6a726e008c6dcc325" target="_parent">r123::Threefry4x64_R::ukey_type()</a>
+    <a id="Item1_c14" onkeydown="return searchResults.NavChild(event,1,14)" onkeypress="return searchResults.NavChild(event,1,14)" onkeyup="return searchResults.NavChild(event,1,14)" class="SRScope" href="../structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3" target="_parent">r123::Engine::ukey_type()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/all_76.html b/lib/Random123-1.08/docs/html/search/all_76.html
new file mode 100644
index 0000000..2184f87
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/all_76.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_v">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_v')">v</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#a1123ac44ecadd52dae06d2c8df86764a" target="_parent">r123array1x32::v()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array2x32.html#a65524bf06568073021117ef196d6b45f" target="_parent">r123array2x32::v()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f" target="_parent">r123array4x32::v()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array8x32.html#a7a84d2a924a271cc7b5f748023517d10" target="_parent">r123array8x32::v()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array1x64.html#a951c4b651e15e5ad4f66d81027c8e1b5" target="_parent">r123array1x64::v()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array2x64.html#a547e4a51e531cf36eef885fbf20a7048" target="_parent">r123array2x64::v()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array4x64.html#aae3a18410877c49f1058bc4d78a62f48" target="_parent">r123array4x64::v()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array16x8.html#a703776a5f85fb222e16b739309489783" target="_parent">r123array16x8::v()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5" target="_parent">r123array1xm128i::v()</a>
+    <a id="Item0_c9" onkeydown="return searchResults.NavChild(event,0,9)" onkeypress="return searchResults.NavChild(event,0,9)" onkeyup="return searchResults.NavChild(event,0,9)" class="SRScope" href="../structr123_1_1Engine.html#a6169d4fbce1fd7725fabda4c693bf250" target="_parent">r123::Engine::v()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_value_5ftype">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_value_5ftype')">value_type</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../structr123array1x32.html#a9c8e0d672be32b52eef639f1a3b2b98a" target="_parent">r123array1x32::value_type()</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../structr123array2x32.html#ab669df8d33d32ee3571210eb090c6cb2" target="_parent">r123array2x32::value_type()</a>
+    <a id="Item1_c2" onkeydown="return searchResults.NavChild(event,1,2)" onkeypress="return searchResults.NavChild(event,1,2)" onkeyup="return searchResults.NavChild(event,1,2)" class="SRScope" href="../structr123array4x32.html#a5ba59b507edcf793ba186a9a4e8c56d5" target="_parent">r123array4x32::value_type()</a>
+    <a id="Item1_c3" onkeydown="return searchResults.NavChild(event,1,3)" onkeypress="return searchResults.NavChild(event,1,3)" onkeyup="return searchResults.NavChild(event,1,3)" class="SRScope" href="../structr123array8x32.html#af47fd0d348b68dd7a2853c68eb32d8b7" target="_parent">r123array8x32::value_type()</a>
+    <a id="Item1_c4" onkeydown="return searchResults.NavChild(event,1,4)" onkeypress="return searchResults.NavChild(event,1,4)" onkeyup="return searchResults.NavChild(event,1,4)" class="SRScope" href="../structr123array1x64.html#a4d8280ccd7087d5c3faba27641e8fbe7" target="_parent">r123array1x64::value_type()</a>
+    <a id="Item1_c5" onkeydown="return searchResults.NavChild(event,1,5)" onkeypress="return searchResults.NavChild(event,1,5)" onkeyup="return searchResults.NavChild(event,1,5)" class="SRScope" href="../structr123array2x64.html#acefd9fb46661254e17877844c545e15f" target="_parent">r123array2x64::value_type()</a>
+    <a id="Item1_c6" onkeydown="return searchResults.NavChild(event,1,6)" onkeypress="return searchResults.NavChild(event,1,6)" onkeyup="return searchResults.NavChild(event,1,6)" class="SRScope" href="../structr123array4x64.html#ae4a79be3ab80944a8bb6bc7ec7907061" target="_parent">r123array4x64::value_type()</a>
+    <a id="Item1_c7" onkeydown="return searchResults.NavChild(event,1,7)" onkeypress="return searchResults.NavChild(event,1,7)" onkeyup="return searchResults.NavChild(event,1,7)" class="SRScope" href="../structr123array16x8.html#ad1d7184f51cafaff4714a2dcf60c9ae2" target="_parent">r123array16x8::value_type()</a>
+    <a id="Item1_c8" onkeydown="return searchResults.NavChild(event,1,8)" onkeypress="return searchResults.NavChild(event,1,8)" onkeyup="return searchResults.NavChild(event,1,8)" class="SRScope" href="../structr123array1xm128i.html#a70ab4e530c7cce9481e07aa0b21dd96b" target="_parent">r123array1xm128i::value_type()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/classes_61.html b/lib/Random123-1.08/docs/html/search/classes_61.html
new file mode 100644
index 0000000..d3cd05c
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/classes_61.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_aesni1xm128i">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123_1_1AESNI1xm128i.html" target="_parent">AESNI1xm128i</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni1xm128i_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structaesni1xm128i__key__t.html" target="_parent">aesni1xm128i_key_t</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni1xm128i_5fr">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../structr123_1_1AESNI1xm128i__R.html" target="_parent">AESNI1xm128i_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../structr123_1_1AESNI4x32.html" target="_parent">AESNI4x32</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32_5fr">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../structr123_1_1AESNI4x32__R.html" target="_parent">AESNI4x32_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128i_5fr">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../structr123_1_1ARS1xm128i__R.html" target="_parent">ARS1xm128i_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars4x32_5fr">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="../structr123_1_1ARS4x32__R.html" target="_parent">ARS4x32_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/classes_65.html b/lib/Random123-1.08/docs/html/search/classes_65.html
new file mode 100644
index 0000000..31adc8b
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/classes_65.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_engine">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123_1_1Engine.html" target="_parent">Engine</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/classes_6d.html b/lib/Random123-1.08/docs/html/search/classes_6d.html
new file mode 100644
index 0000000..54fdf45
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/classes_6d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_microurng">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../classr123_1_1MicroURNG.html" target="_parent">MicroURNG</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/classes_70.html b/lib/Random123-1.08/docs/html/search/classes_70.html
new file mode 100644
index 0000000..b16ad5a
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/classes_70.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_philox2x32_5fr">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123_1_1Philox2x32__R.html" target="_parent">Philox2x32_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x64_5fr">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structr123_1_1Philox2x64__R.html" target="_parent">Philox2x64_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x32_5fr">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../structr123_1_1Philox4x32__R.html" target="_parent">Philox4x32_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x64_5fr">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../structr123_1_1Philox4x64__R.html" target="_parent">Philox4x64_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/classes_72.html b/lib/Random123-1.08/docs/html/search/classes_72.html
new file mode 100644
index 0000000..ea550c9
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/classes_72.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_r123array16x8">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123array16x8.html" target="_parent">r123array16x8</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123array1x32">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structr123array1x32.html" target="_parent">r123array1x32</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123array1x64">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../structr123array1x64.html" target="_parent">r123array1x64</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123array1xm128i">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../structr123array1xm128i.html" target="_parent">r123array1xm128i</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123array2x32">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../structr123array2x32.html" target="_parent">r123array2x32</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123array2x64">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../structr123array2x64.html" target="_parent">r123array2x64</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123array4x32">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="../structr123array4x32.html" target="_parent">r123array4x32</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123array4x64">
+ <div class="SREntry">
+  <a id="Item7" onkeydown="return searchResults.Nav(event,7)" onkeypress="return searchResults.Nav(event,7)" onkeyup="return searchResults.Nav(event,7)" class="SRSymbol" href="../structr123array4x64.html" target="_parent">r123array4x64</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123array8x32">
+ <div class="SREntry">
+  <a id="Item8" onkeydown="return searchResults.Nav(event,8)" onkeypress="return searchResults.Nav(event,8)" onkeyup="return searchResults.Nav(event,8)" class="SRSymbol" href="../structr123array8x32.html" target="_parent">r123array8x32</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123m128i">
+ <div class="SREntry">
+  <a id="Item9" onkeydown="return searchResults.Nav(event,9)" onkeypress="return searchResults.Nav(event,9)" onkeyup="return searchResults.Nav(event,9)" class="SRSymbol" href="../structr123m128i.html" target="_parent">r123m128i</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_reinterpretctr">
+ <div class="SREntry">
+  <a id="Item10" onkeydown="return searchResults.Nav(event,10)" onkeypress="return searchResults.Nav(event,10)" onkeyup="return searchResults.Nav(event,10)" class="SRSymbol" href="../structr123_1_1ReinterpretCtr.html" target="_parent">ReinterpretCtr</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/classes_74.html b/lib/Random123-1.08/docs/html/search/classes_74.html
new file mode 100644
index 0000000..2b70932
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/classes_74.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_threefry2x32_5fr">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123_1_1Threefry2x32__R.html" target="_parent">Threefry2x32_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64_5fr">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structr123_1_1Threefry2x64__R.html" target="_parent">Threefry2x64_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32_5fr">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../structr123_1_1Threefry4x32__R.html" target="_parent">Threefry4x32_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64_5fr">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../structr123_1_1Threefry4x64__R.html" target="_parent">Threefry4x64_R</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/close.png b/lib/Random123-1.08/docs/html/search/close.png
new file mode 100644
index 0000000..9342d3d
Binary files /dev/null and b/lib/Random123-1.08/docs/html/search/close.png differ
diff --git a/lib/Random123-1.08/docs/html/search/defines_61.html b/lib/Random123-1.08/docs/html/search/defines_61.html
new file mode 100644
index 0000000..1cf27c6
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/defines_61.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_aesni4x32">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../group__AESNI.html#gae3950c524818b49d1cdfad481880a33a" target="_parent">aesni4x32</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32_5frounds">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../aes_8h.html#a0e4c28ad2773dac7eb59004947c9e02b" target="_parent">aesni4x32_rounds</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128i">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../group__AESNI.html#ga22e0a9c885b544115d44d26cc7777303" target="_parent">ars1xm128i</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128i_5fdefault_5frounds">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../ars_8h.html#aa1e31853c7493df739897205eb4f4a82" target="_parent">ARS1xm128i_DEFAULT_ROUNDS</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars4x32">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../group__AESNI.html#ga088ecbf341caf05e491ce246f2ea2d30" target="_parent">ars4x32</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/defines_67.html b/lib/Random123-1.08/docs/html/search/defines_67.html
new file mode 100644
index 0000000..1c14e72
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/defines_67.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_gsl_5fcbrng">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../gsl__cbrng_8h.html#af561a004eef8e93cdfd6b255a8a1eb75" target="_parent">GSL_CBRNG</a>
+  <span class="SRScope">gsl_cbrng.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_gsl_5fmicrorng">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../gsl__microrng_8h.html#a21c7bb64a536a1704c6dc96856b78297" target="_parent">GSL_MICRORNG</a>
+  <span class="SRScope">gsl_microrng.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/defines_70.html b/lib/Random123-1.08/docs/html/search/defines_70.html
new file mode 100644
index 0000000..959d639
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/defines_70.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_philox2x32">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../philox_8h.html#ab2496424917f063a4990f01943a07fe0" target="_parent">philox2x32</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x64">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../philox_8h.html#ae6b57a71e4efa369cc19416fc088b5a5" target="_parent">philox2x64</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x32">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../philox_8h.html#a432a3df828dd51acd0b7ec2fee1d4d7e" target="_parent">philox4x32</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x64">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../philox_8h.html#a62fb1b4d9775396303ebb2a801fea8e6" target="_parent">philox4x64</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/defines_72.html b/lib/Random123-1.08/docs/html/search/defines_72.html
new file mode 100644
index 0000000..7e1e935
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/defines_72.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_r123_5fw">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../array_8h.html#a9b64205709c0daaea3b05bbf7ea5a322" target="_parent">R123_W</a>
+  <span class="SRScope">array.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/defines_74.html b/lib/Random123-1.08/docs/html/search/defines_74.html
new file mode 100644
index 0000000..a9461fa
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/defines_74.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_threefry2x32">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../threefry_8h.html#a52e1635889bbf08009646f22897e07fc" target="_parent">threefry2x32</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../threefry_8h.html#acda3cc1cd02719e1e3d6cfdf7ce0c4c8" target="_parent">threefry2x64</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../threefry_8h.html#aaaecd189b32b0081c6a3c2cb46577e23" target="_parent">threefry4x32</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../threefry_8h.html#a992029974a22f14e0ef29a862ede2b8d" target="_parent">threefry4x64</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/enums_72.html b/lib/Random123-1.08/docs/html/search/enums_72.html
new file mode 100644
index 0000000..6351151
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/enums_72.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_r123_5fenum_5faesni1xm128i">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../group__AESNI.html#ga2814629101926e23001d564630ba7b86" target="_parent">r123_enum_aesni1xm128i</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5faesni4x32">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../group__AESNI.html#ga1557a9d6e95543a3c4ca9082a4c14b0d" target="_parent">r123_enum_aesni4x32</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fars1xm128i">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../group__AESNI.html#gabf0a537666d4d1421144cb0a5e67666c" target="_parent">r123_enum_ars1xm128i</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fars4x32">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../group__AESNI.html#gaa623b038fa0c8d8d2864fdc0e45884d6" target="_parent">r123_enum_ars4x32</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fphilox2x32">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../group__PhiloxNxW.html#gae7443e1a57429154124943b6a7c0bd08" target="_parent">r123_enum_philox2x32</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fphilox2x64">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../group__PhiloxNxW.html#gaca9df5cdadde758a63952daa97ddff91" target="_parent">r123_enum_philox2x64</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fphilox4x32">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="../group__PhiloxNxW.html#ga67fd1bf4ed858d01663a7d6b219b97a2" target="_parent">r123_enum_philox4x32</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fphilox4x64">
+ <div class="SREntry">
+  <a id="Item7" onkeydown="return searchResults.Nav(event,7)" onkeypress="return searchResults.Nav(event,7)" onkeyup="return searchResults.Nav(event,7)" class="SRSymbol" href="../group__PhiloxNxW.html#gaf603860d055cee96c75f6986641e9cad" target="_parent">r123_enum_philox4x64</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fthreefry2x32">
+ <div class="SREntry">
+  <a id="Item8" onkeydown="return searchResults.Nav(event,8)" onkeypress="return searchResults.Nav(event,8)" onkeyup="return searchResults.Nav(event,8)" class="SRSymbol" href="../group__ThreefryNxW.html#gae1c47baba4367dd47d68025d23ae4775" target="_parent">r123_enum_threefry2x32</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fthreefry2x64">
+ <div class="SREntry">
+  <a id="Item9" onkeydown="return searchResults.Nav(event,9)" onkeypress="return searchResults.Nav(event,9)" onkeyup="return searchResults.Nav(event,9)" class="SRSymbol" href="../group__ThreefryNxW.html#gae4df1e52db01acafb28d9c6c25a41071" target="_parent">r123_enum_threefry2x64</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fthreefry4x32">
+ <div class="SREntry">
+  <a id="Item10" onkeydown="return searchResults.Nav(event,10)" onkeypress="return searchResults.Nav(event,10)" onkeyup="return searchResults.Nav(event,10)" class="SRSymbol" href="../group__ThreefryNxW.html#ga027cd15620ecab867c6af8bb065b189b" target="_parent">r123_enum_threefry4x32</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_r123_5fenum_5fthreefry4x64">
+ <div class="SREntry">
+  <a id="Item11" onkeydown="return searchResults.Nav(event,11)" onkeypress="return searchResults.Nav(event,11)" onkeyup="return searchResults.Nav(event,11)" class="SRSymbol" href="../group__ThreefryNxW.html#ga6379a4a73e85bc36235907a326945acc" target="_parent">r123_enum_threefry4x64</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/enumvalues_61.html b/lib/Random123-1.08/docs/html/search/enumvalues_61.html
new file mode 100644
index 0000000..bcc9b7c
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/enumvalues_61.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_aesni1xm128i_5frounds">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../group__AESNI.html#gga2814629101926e23001d564630ba7b86a2c404c51fea10eeacb032081dbab2408" target="_parent">aesni1xm128i_rounds</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32_5frounds">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../group__AESNI.html#gga1557a9d6e95543a3c4ca9082a4c14b0dad65178990d928071f958bf2413ebdb4b" target="_parent">aesni4x32_rounds</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128i_5frounds">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../group__AESNI.html#ggabf0a537666d4d1421144cb0a5e67666cade1fd46524355ec1d7ce63fd13b54992" target="_parent">ars1xm128i_rounds</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars4x32_5frounds">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../group__AESNI.html#ggaa623b038fa0c8d8d2864fdc0e45884d6a5e715f357770a0f188ef493e6e63d31d" target="_parent">ars4x32_rounds</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/enumvalues_70.html b/lib/Random123-1.08/docs/html/search/enumvalues_70.html
new file mode 100644
index 0000000..91fc18c
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/enumvalues_70.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_philox2x32_5frounds">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../group__PhiloxNxW.html#ggae7443e1a57429154124943b6a7c0bd08ad08568b592cd076441505eed926d929c" target="_parent">philox2x32_rounds</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x64_5frounds">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../group__PhiloxNxW.html#ggaca9df5cdadde758a63952daa97ddff91ae15befbf8ae3f2e93d6e49ea9e05b636" target="_parent">philox2x64_rounds</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x32_5frounds">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../group__PhiloxNxW.html#gga67fd1bf4ed858d01663a7d6b219b97a2ac9dec73e096a7afb5d82f2388a7a5412" target="_parent">philox4x32_rounds</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x64_5frounds">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../group__PhiloxNxW.html#ggaf603860d055cee96c75f6986641e9cada3407accddb6e873c1005a4ab2edcef67" target="_parent">philox4x64_rounds</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/enumvalues_73.html b/lib/Random123-1.08/docs/html/search/enumvalues_73.html
new file mode 100644
index 0000000..29834fe
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/enumvalues_73.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_static_5fsize">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_static_5fsize')">static_size</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#a2cdb0e09b7e8ba20de255ddcb54ea9baae9556d9b93643fe1f7e56e973200177a" target="_parent">r123array1x32::static_size()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array2x32.html#ad6e438ec0d5a08bfb0b71a3ff96ea7e8a5ae3e9837bb88660b088443c1a6fb47a" target="_parent">r123array2x32::static_size()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array4x32.html#a3d387fea63ac50668e75faa8ebe4594aa80d43f91cd038fece63f219b9f4a36c6" target="_parent">r123array4x32::static_size()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array8x32.html#aae848a29e2a9b3229fc7063440885c4fa2270c17b2a56aea106facc9a22b62be6" target="_parent">r123array8x32::static_size()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array1x64.html#ab7fb5f41ed3716bce19489deb1dd4149a0c25e6a56a2c69eb7641adb24765e6af" target="_parent">r123array1x64::static_size()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array2x64.html#aa8ed42c5bf709f879674643a70e71dbca6219dc89b2a7ffde9b00364177f5b846" target="_parent">r123array2x64::static_size()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array4x64.html#a904abc16c5828698aa8af5824b6a69c1aa1363fd51fd3dae2d8989711a11817ff" target="_parent">r123array4x64::static_size()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array16x8.html#a7b2912a12e57bc62644a8ce57e2301b2af0ee079d4b47a988dcd2b8b8457f266f" target="_parent">r123array16x8::static_size()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1xm128i.html#a130e9722020433db562761a8e51bed2ca32ec6b84a0fa2dd836b04e0ffa69b2bc" target="_parent">r123array1xm128i::static_size()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/enumvalues_74.html b/lib/Random123-1.08/docs/html/search/enumvalues_74.html
new file mode 100644
index 0000000..5b31e02
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/enumvalues_74.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_threefry2x32_5frounds">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../group__ThreefryNxW.html#ggae1c47baba4367dd47d68025d23ae4775a5c6f9a5f3ae1c3700938a3fca5f5821b" target="_parent">threefry2x32_rounds</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64_5frounds">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../group__ThreefryNxW.html#ggae4df1e52db01acafb28d9c6c25a41071a61579c86759ab497dbfc895f2fe6ec7c" target="_parent">threefry2x64_rounds</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32_5frounds">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../group__ThreefryNxW.html#gga027cd15620ecab867c6af8bb065b189ba36063dd986ca2ccd28209c7b4bf711d7" target="_parent">threefry4x32_rounds</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64_5frounds">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../group__ThreefryNxW.html#gga6379a4a73e85bc36235907a326945acca9cdd4629047775ebe339ac9e9dd0ad65" target="_parent">threefry4x64_rounds</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/files_61.html b/lib/Random123-1.08/docs/html/search/files_61.html
new file mode 100644
index 0000000..c8f5bf1
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/files_61.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_aes_2eh">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../aes_8h.html" target="_parent">aes.h</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_array_2eh">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../array_8h.html" target="_parent">array.h</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars_2eh">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../ars_8h.html" target="_parent">ars.h</a>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/files_63.html b/lib/Random123-1.08/docs/html/search/files_63.html
new file mode 100644
index 0000000..fb7da82
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/files_63.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_cbrng_2edox">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../cbrng_8dox.html" target="_parent">cbrng.dox</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_compilerfeatures_2eh">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../compilerfeatures_8h.html" target="_parent">compilerfeatures.h</a>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/files_65.html b/lib/Random123-1.08/docs/html/search/files_65.html
new file mode 100644
index 0000000..9db3a06
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/files_65.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_engine_2ehpp">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../Engine_8hpp.html" target="_parent">Engine.hpp</a>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/files_67.html b/lib/Random123-1.08/docs/html/search/files_67.html
new file mode 100644
index 0000000..33c2dbd
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/files_67.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_gsl_5fcbrng_2eh">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../gsl__cbrng_8h.html" target="_parent">gsl_cbrng.h</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_gsl_5fmicrorng_2eh">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../gsl__microrng_8h.html" target="_parent">gsl_microrng.h</a>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/files_6c.html b/lib/Random123-1.08/docs/html/search/files_6c.html
new file mode 100644
index 0000000..68eda1b
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/files_6c.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_license">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../LICENSE.html" target="_parent">LICENSE</a>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/files_6d.html b/lib/Random123-1.08/docs/html/search/files_6d.html
new file mode 100644
index 0000000..059ffc9
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/files_6d.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_main_2edox">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../main_8dox.html" target="_parent">main.dox</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_microurng_2ehpp">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../MicroURNG_8hpp.html" target="_parent">MicroURNG.hpp</a>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/files_70.html b/lib/Random123-1.08/docs/html/search/files_70.html
new file mode 100644
index 0000000..d3762f2
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/files_70.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_philox_2eh">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../philox_8h.html" target="_parent">philox.h</a>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/files_72.html b/lib/Random123-1.08/docs/html/search/files_72.html
new file mode 100644
index 0000000..3e07f1b
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/files_72.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_readme">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../README.html" target="_parent">README</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_reinterpretctr_2ehpp">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../ReinterpretCtr_8hpp.html" target="_parent">ReinterpretCtr.hpp</a>
+ </div>
+</div>
+<div class="SRResult" id="SR_releasenotes_2edox">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../releasenotes_8dox.html" target="_parent">releasenotes.dox</a>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/files_73.html b/lib/Random123-1.08/docs/html/search/files_73.html
new file mode 100644
index 0000000..182b818
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/files_73.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_sse_2eh">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../sse_8h.html" target="_parent">sse.h</a>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/files_74.html b/lib/Random123-1.08/docs/html/search/files_74.html
new file mode 100644
index 0000000..96b3493
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/files_74.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_threefry_2eh">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../threefry_8h.html" target="_parent">threefry.h</a>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/functions_5f.html b/lib/Random123-1.08/docs/html/search/functions_5f.html
new file mode 100644
index 0000000..958bceb
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/functions_5f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR__5fmm_5fextract_5flo64">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../sse_8h.html#adac6aaf79c4428abcd30bf583eeb5450" target="_parent">_mm_extract_lo64</a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/functions_61.html b/lib/Random123-1.08/docs/html/search/functions_61.html
new file mode 100644
index 0000000..4eabb5a
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/functions_61.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_aesni1xm128i">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../group__AESNI.html#ga3ba5daca2d4d076ece24900084e71311" target="_parent">aesni1xm128i</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni1xm128i_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_aesni1xm128i_5fkey_5ft')">aesni1xm128i_key_t</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../structaesni1xm128i__key__t.html#af1002e5b771616db8f12c793fc994c41" target="_parent">aesni1xm128i_key_t::aesni1xm128i_key_t()</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../structaesni1xm128i__key__t.html#a2076072522f671a8596a831cc93dc616" target="_parent">aesni1xm128i_key_t::aesni1xm128i_key_t(const aesni1xm128i_ukey_t &uk)</a>
+    <a id="Item1_c2" onkeydown="return searchResults.NavChild(event,1,2)" onkeypress="return searchResults.NavChild(event,1,2)" onkeyup="return searchResults.NavChild(event,1,2)" class="SRScope" href="../structaesni1xm128i__key__t.html#a43d53407125d4cec0d6a14586c0357e3" target="_parent">aesni1xm128i_key_t::aesni1xm128i_key_t(const aesni4x32_ukey_t &uk)</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni1xm128i_5fr">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../group__AESNI.html#ga89d9042c08ae5eef4c98bfb9609ebd34" target="_parent">aesni1xm128i_R</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32_5fr">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../group__AESNI.html#gae28b030e9786a6f36a47df8f211a750b" target="_parent">aesni4x32_R</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32keyinit">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../group__AESNI.html#ga2aa21ba4a3d3850faa96e7834114d8e1" target="_parent">aesni4x32keyinit</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128i_5fr">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../group__AESNI.html#gaddc6efc2007f6f66ee914eb7074cff1e" target="_parent">ars1xm128i_R</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128ikeyinit">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="../group__AESNI.html#gae307c205a2ad19142bbe70919abfbfc2" target="_parent">ars1xm128ikeyinit</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars4x32_5fr">
+ <div class="SREntry">
+  <a id="Item7" onkeydown="return searchResults.Nav(event,7)" onkeypress="return searchResults.Nav(event,7)" onkeyup="return searchResults.Nav(event,7)" class="SRSymbol" href="../group__AESNI.html#gab13b093252d4bb3389d27d4e3b04dae8" target="_parent">ars4x32_R</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars4x32keyinit">
+ <div class="SREntry">
+  <a id="Item8" onkeydown="return searchResults.Nav(event,8)" onkeypress="return searchResults.Nav(event,8)" onkeyup="return searchResults.Nav(event,8)" class="SRSymbol" href="../group__AESNI.html#ga1f3a02ea711ae6bacb0875f11a255516" target="_parent">ars4x32keyinit</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_assemble_5ffrom_5fu32">
+ <div class="SREntry">
+  <a id="Item9" onkeydown="return searchResults.Nav(event,9)" onkeypress="return searchResults.Nav(event,9)" onkeyup="return searchResults.Nav(event,9)" class="SRSymbol" href="../sse_8h.html#a99c42d1da8da3a4a273556a7817b5c1f" target="_parent">assemble_from_u32</a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_assemble_5ffrom_5fu32_3c_20r123m128i_20_3e">
+ <div class="SREntry">
+  <a id="Item10" onkeydown="return searchResults.Nav(event,10)" onkeypress="return searchResults.Nav(event,10)" onkeyup="return searchResults.Nav(event,10)" class="SRSymbol" href="../sse_8h.html#a0cd6ca87c67023d7afda38319ab40e43" target="_parent">assemble_from_u32< r123m128i ></a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_at">
+ <div class="SREntry">
+  <a id="Item11" onkeydown="return searchResults.Nav(event,11)" onkeypress="return searchResults.Nav(event,11)" onkeyup="return searchResults.Nav(event,11)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_at')">at</a>
+  <div class="SRChildren">
+    <a id="Item11_c0" onkeydown="return searchResults.NavChild(event,11,0)" onkeypress="return searchResults.NavChild(event,11,0)" onkeyup="return searchResults.NavChild(event,11,0)" class="SRScope" href="../structr123array1x32.html#a300f163f4293879003e6831b1180350d" target="_parent">r123array1x32::at(size_type i)</a>
+    <a id="Item11_c1" onkeydown="return searchResults.NavChild(event,11,1)" onkeypress="return searchResults.NavChild(event,11,1)" onkeyup="return searchResults.NavChild(event,11,1)" class="SRScope" href="../structr123array1x32.html#a1d57048b43ee45e2a94ef372b4707783" target="_parent">r123array1x32::at(size_type i) const </a>
+    <a id="Item11_c2" onkeydown="return searchResults.NavChild(event,11,2)" onkeypress="return searchResults.NavChild(event,11,2)" onkeyup="return searchResults.NavChild(event,11,2)" class="SRScope" href="../structr123array2x32.html#aa29e0ae21be47bda2ac83e6c945b5719" target="_parent">r123array2x32::at(size_type i)</a>
+    <a id="Item11_c3" onkeydown="return searchResults.NavChild(event,11,3)" onkeypress="return searchResults.NavChild(event,11,3)" onkeyup="return searchResults.NavChild(event,11,3)" class="SRScope" href="../structr123array2x32.html#ae985b8811e4e8849d5f28dae76231dca" target="_parent">r123array2x32::at(size_type i) const </a>
+    <a id="Item11_c4" onkeydown="return searchResults.NavChild(event,11,4)" onkeypress="return searchResults.NavChild(event,11,4)" onkeyup="return searchResults.NavChild(event,11,4)" class="SRScope" href="../structr123array4x32.html#ac44f12891effca2d069a3a3a8173dd62" target="_parent">r123array4x32::at(size_type i)</a>
+    <a id="Item11_c5" onkeydown="return searchResults.NavChild(event,11,5)" onkeypress="return searchResults.NavChild(event,11,5)" onkeyup="return searchResults.NavChild(event,11,5)" class="SRScope" href="../structr123array4x32.html#abdb3253eb03291895f89885298e17169" target="_parent">r123array4x32::at(size_type i) const </a>
+    <a id="Item11_c6" onkeydown="return searchResults.NavChild(event,11,6)" onkeypress="return searchResults.NavChild(event,11,6)" onkeyup="return searchResults.NavChild(event,11,6)" class="SRScope" href="../structr123array8x32.html#aa6c0788063f7e7b717aae2d9606cf302" target="_parent">r123array8x32::at(size_type i)</a>
+    <a id="Item11_c7" onkeydown="return searchResults.NavChild(event,11,7)" onkeypress="return searchResults.NavChild(event,11,7)" onkeyup="return searchResults.NavChild(event,11,7)" class="SRScope" href="../structr123array8x32.html#a79f982be8c435215a5e812e88e500216" target="_parent">r123array8x32::at(size_type i) const </a>
+    <a id="Item11_c8" onkeydown="return searchResults.NavChild(event,11,8)" onkeypress="return searchResults.NavChild(event,11,8)" onkeyup="return searchResults.NavChild(event,11,8)" class="SRScope" href="../structr123array1x64.html#a6575299135436acf90fcb8da262d623c" target="_parent">r123array1x64::at(size_type i)</a>
+    <a id="Item11_c9" onkeydown="return searchResults.NavChild(event,11,9)" onkeypress="return searchResults.NavChild(event,11,9)" onkeyup="return searchResults.NavChild(event,11,9)" class="SRScope" href="../structr123array1x64.html#af6cf7706792eb1e44902dd94df388726" target="_parent">r123array1x64::at(size_type i) const </a>
+    <a id="Item11_c10" onkeydown="return searchResults.NavChild(event,11,10)" onkeypress="return searchResults.NavChild(event,11,10)" onkeyup="return searchResults.NavChild(event,11,10)" class="SRScope" href="../structr123array2x64.html#a46789872cf0f3a6310f864b2a35b2ea7" target="_parent">r123array2x64::at(size_type i)</a>
+    <a id="Item11_c11" onkeydown="return searchResults.NavChild(event,11,11)" onkeypress="return searchResults.NavChild(event,11,11)" onkeyup="return searchResults.NavChild(event,11,11)" class="SRScope" href="../structr123array2x64.html#a971ddfa7c395d161028e16c829179f3c" target="_parent">r123array2x64::at(size_type i) const </a>
+    <a id="Item11_c12" onkeydown="return searchResults.NavChild(event,11,12)" onkeypress="return searchResults.NavChild(event,11,12)" onkeyup="return searchResults.NavChild(event,11,12)" class="SRScope" href="../structr123array4x64.html#a5b60c8dcd20ce894109e346fdb4cbdb2" target="_parent">r123array4x64::at(size_type i)</a>
+    <a id="Item11_c13" onkeydown="return searchResults.NavChild(event,11,13)" onkeypress="return searchResults.NavChild(event,11,13)" onkeyup="return searchResults.NavChild(event,11,13)" class="SRScope" href="../structr123array4x64.html#a893d3db3d274fc15ac32bc7cbab0e82a" target="_parent">r123array4x64::at(size_type i) const </a>
+    <a id="Item11_c14" onkeydown="return searchResults.NavChild(event,11,14)" onkeypress="return searchResults.NavChild(event,11,14)" onkeyup="return searchResults.NavChild(event,11,14)" class="SRScope" href="../structr123array16x8.html#a7742edac513767b0f3ca6abe1a3eabb7" target="_parent">r123array16x8::at(size_type i)</a>
+    <a id="Item11_c15" onkeydown="return searchResults.NavChild(event,11,15)" onkeypress="return searchResults.NavChild(event,11,15)" onkeyup="return searchResults.NavChild(event,11,15)" class="SRScope" href="../structr123array16x8.html#a088dbabe23cf873de370af292052905e" target="_parent">r123array16x8::at(size_type i) const </a>
+    <a id="Item11_c16" onkeydown="return searchResults.NavChild(event,11,16)" onkeypress="return searchResults.NavChild(event,11,16)" onkeyup="return searchResults.NavChild(event,11,16)" class="SRScope" href="../structr123array1xm128i.html#a5e8a81ee3f7c3b022554c0023a686700" target="_parent">r123array1xm128i::at(size_type i)</a>
+    <a id="Item11_c17" onkeydown="return searchResults.NavChild(event,11,17)" onkeypress="return searchResults.NavChild(event,11,17)" onkeyup="return searchResults.NavChild(event,11,17)" class="SRScope" href="../structr123array1xm128i.html#a53ad470978c3105c97f502959d31ffa0" target="_parent">r123array1xm128i::at(size_type i) const </a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/functions_62.html b/lib/Random123-1.08/docs/html/search/functions_62.html
new file mode 100644
index 0000000..73241d8
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/functions_62.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_back">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_back')">back</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#a3738a65a648899db793e81b53c252785" target="_parent">r123array1x32::back()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array1x32.html#a32b89fb1c75e3cc26ff3b5acdd40af99" target="_parent">r123array1x32::back() const </a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array2x32.html#a3da7214b9946a3c8653312dcfa42a288" target="_parent">r123array2x32::back()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array2x32.html#ae176c02299531373a0fff9a5f55226e5" target="_parent">r123array2x32::back() const </a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array4x32.html#a70fd9b24cb3b126eb15c23049f786653" target="_parent">r123array4x32::back()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array4x32.html#a4e1cba8583b2fac8cc3bf854956191c4" target="_parent">r123array4x32::back() const </a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array8x32.html#a1d4176e4ad6d70c98805e0c924d2df37" target="_parent">r123array8x32::back()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array8x32.html#a73f5b5012b1e6595f727ef88e60a53ac" target="_parent">r123array8x32::back() const </a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1x64.html#ab85790fdee269501a80fe31179efc9f8" target="_parent">r123array1x64::back()</a>
+    <a id="Item0_c9" onkeydown="return searchResults.NavChild(event,0,9)" onkeypress="return searchResults.NavChild(event,0,9)" onkeyup="return searchResults.NavChild(event,0,9)" class="SRScope" href="../structr123array1x64.html#a2cd091b3015befa2b954ddab91271e39" target="_parent">r123array1x64::back() const </a>
+    <a id="Item0_c10" onkeydown="return searchResults.NavChild(event,0,10)" onkeypress="return searchResults.NavChild(event,0,10)" onkeyup="return searchResults.NavChild(event,0,10)" class="SRScope" href="../structr123array2x64.html#a9beb3e776cb4f3cbee6846518749cb03" target="_parent">r123array2x64::back()</a>
+    <a id="Item0_c11" onkeydown="return searchResults.NavChild(event,0,11)" onkeypress="return searchResults.NavChild(event,0,11)" onkeyup="return searchResults.NavChild(event,0,11)" class="SRScope" href="../structr123array2x64.html#ac72fd3a39821ca25f94258f97da371c5" target="_parent">r123array2x64::back() const </a>
+    <a id="Item0_c12" onkeydown="return searchResults.NavChild(event,0,12)" onkeypress="return searchResults.NavChild(event,0,12)" onkeyup="return searchResults.NavChild(event,0,12)" class="SRScope" href="../structr123array4x64.html#abb40868277e8a943a0b5464985baceb5" target="_parent">r123array4x64::back()</a>
+    <a id="Item0_c13" onkeydown="return searchResults.NavChild(event,0,13)" onkeypress="return searchResults.NavChild(event,0,13)" onkeyup="return searchResults.NavChild(event,0,13)" class="SRScope" href="../structr123array4x64.html#a9006cfe7882bbc791a81a52f7cc0fd2d" target="_parent">r123array4x64::back() const </a>
+    <a id="Item0_c14" onkeydown="return searchResults.NavChild(event,0,14)" onkeypress="return searchResults.NavChild(event,0,14)" onkeyup="return searchResults.NavChild(event,0,14)" class="SRScope" href="../structr123array16x8.html#ae607d3b3d068aec88672241fc97948cb" target="_parent">r123array16x8::back()</a>
+    <a id="Item0_c15" onkeydown="return searchResults.NavChild(event,0,15)" onkeypress="return searchResults.NavChild(event,0,15)" onkeyup="return searchResults.NavChild(event,0,15)" class="SRScope" href="../structr123array16x8.html#a6e5e98c20ae0e6bf4f8a897c08b0700e" target="_parent">r123array16x8::back() const </a>
+    <a id="Item0_c16" onkeydown="return searchResults.NavChild(event,0,16)" onkeypress="return searchResults.NavChild(event,0,16)" onkeyup="return searchResults.NavChild(event,0,16)" class="SRScope" href="../structr123array1xm128i.html#a082b7b75374d69149ee03d1d228e2508" target="_parent">r123array1xm128i::back()</a>
+    <a id="Item0_c17" onkeydown="return searchResults.NavChild(event,0,17)" onkeypress="return searchResults.NavChild(event,0,17)" onkeyup="return searchResults.NavChild(event,0,17)" class="SRScope" href="../structr123array1xm128i.html#a458be25b18c6e59d5c72e2c4d4ea6354" target="_parent">r123array1xm128i::back() const </a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_begin">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_begin')">begin</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../structr123array1x32.html#a86b7d754ff8dd69e0565edfdbd060cb4" target="_parent">r123array1x32::begin()</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../structr123array1x32.html#a19089b8de6c637803408512407a4da91" target="_parent">r123array1x32::begin() const </a>
+    <a id="Item1_c2" onkeydown="return searchResults.NavChild(event,1,2)" onkeypress="return searchResults.NavChild(event,1,2)" onkeyup="return searchResults.NavChild(event,1,2)" class="SRScope" href="../structr123array2x32.html#a96730b28149000a3ea4c6b0f05e1777b" target="_parent">r123array2x32::begin()</a>
+    <a id="Item1_c3" onkeydown="return searchResults.NavChild(event,1,3)" onkeypress="return searchResults.NavChild(event,1,3)" onkeyup="return searchResults.NavChild(event,1,3)" class="SRScope" href="../structr123array2x32.html#aa52b394a0c44b755e5c0d0409dc2c4ea" target="_parent">r123array2x32::begin() const </a>
+    <a id="Item1_c4" onkeydown="return searchResults.NavChild(event,1,4)" onkeypress="return searchResults.NavChild(event,1,4)" onkeyup="return searchResults.NavChild(event,1,4)" class="SRScope" href="../structr123array4x32.html#a96a9c7e3ece3d2b128cf7f264af6ea3c" target="_parent">r123array4x32::begin()</a>
+    <a id="Item1_c5" onkeydown="return searchResults.NavChild(event,1,5)" onkeypress="return searchResults.NavChild(event,1,5)" onkeyup="return searchResults.NavChild(event,1,5)" class="SRScope" href="../structr123array4x32.html#a830254ee0db7bf12facf67f23428d2d9" target="_parent">r123array4x32::begin() const </a>
+    <a id="Item1_c6" onkeydown="return searchResults.NavChild(event,1,6)" onkeypress="return searchResults.NavChild(event,1,6)" onkeyup="return searchResults.NavChild(event,1,6)" class="SRScope" href="../structr123array8x32.html#a7ae561c4d544e31f7bd2f256cb32f878" target="_parent">r123array8x32::begin()</a>
+    <a id="Item1_c7" onkeydown="return searchResults.NavChild(event,1,7)" onkeypress="return searchResults.NavChild(event,1,7)" onkeyup="return searchResults.NavChild(event,1,7)" class="SRScope" href="../structr123array8x32.html#ad924bdaf9facc3271ca2ae727cda23a3" target="_parent">r123array8x32::begin() const </a>
+    <a id="Item1_c8" onkeydown="return searchResults.NavChild(event,1,8)" onkeypress="return searchResults.NavChild(event,1,8)" onkeyup="return searchResults.NavChild(event,1,8)" class="SRScope" href="../structr123array1x64.html#af9150347761c6df32673bbd2411e67d0" target="_parent">r123array1x64::begin()</a>
+    <a id="Item1_c9" onkeydown="return searchResults.NavChild(event,1,9)" onkeypress="return searchResults.NavChild(event,1,9)" onkeyup="return searchResults.NavChild(event,1,9)" class="SRScope" href="../structr123array1x64.html#a0fddc6603fe2eb4547aeb57498ffe3c2" target="_parent">r123array1x64::begin() const </a>
+    <a id="Item1_c10" onkeydown="return searchResults.NavChild(event,1,10)" onkeypress="return searchResults.NavChild(event,1,10)" onkeyup="return searchResults.NavChild(event,1,10)" class="SRScope" href="../structr123array2x64.html#a0fcc60a49efd917a3b630cf53c526311" target="_parent">r123array2x64::begin()</a>
+    <a id="Item1_c11" onkeydown="return searchResults.NavChild(event,1,11)" onkeypress="return searchResults.NavChild(event,1,11)" onkeyup="return searchResults.NavChild(event,1,11)" class="SRScope" href="../structr123array2x64.html#a8cf4fadef6bdc6d438db173bc1d31165" target="_parent">r123array2x64::begin() const </a>
+    <a id="Item1_c12" onkeydown="return searchResults.NavChild(event,1,12)" onkeypress="return searchResults.NavChild(event,1,12)" onkeyup="return searchResults.NavChild(event,1,12)" class="SRScope" href="../structr123array4x64.html#ab78c67c429da6405f9d1ed5054635961" target="_parent">r123array4x64::begin()</a>
+    <a id="Item1_c13" onkeydown="return searchResults.NavChild(event,1,13)" onkeypress="return searchResults.NavChild(event,1,13)" onkeyup="return searchResults.NavChild(event,1,13)" class="SRScope" href="../structr123array4x64.html#acd133812dbe01892199683e003921b8b" target="_parent">r123array4x64::begin() const </a>
+    <a id="Item1_c14" onkeydown="return searchResults.NavChild(event,1,14)" onkeypress="return searchResults.NavChild(event,1,14)" onkeyup="return searchResults.NavChild(event,1,14)" class="SRScope" href="../structr123array16x8.html#a43182e95cb41660de5511bb5a3968cb8" target="_parent">r123array16x8::begin()</a>
+    <a id="Item1_c15" onkeydown="return searchResults.NavChild(event,1,15)" onkeypress="return searchResults.NavChild(event,1,15)" onkeyup="return searchResults.NavChild(event,1,15)" class="SRScope" href="../structr123array16x8.html#acef590bcf52e4a167c2388f4d1e0b20e" target="_parent">r123array16x8::begin() const </a>
+    <a id="Item1_c16" onkeydown="return searchResults.NavChild(event,1,16)" onkeypress="return searchResults.NavChild(event,1,16)" onkeyup="return searchResults.NavChild(event,1,16)" class="SRScope" href="../structr123array1xm128i.html#a275c9837db101efb234c36cff3e7562f" target="_parent">r123array1xm128i::begin()</a>
+    <a id="Item1_c17" onkeydown="return searchResults.NavChild(event,1,17)" onkeypress="return searchResults.NavChild(event,1,17)" onkeyup="return searchResults.NavChild(event,1,17)" class="SRScope" href="../structr123array1xm128i.html#ae9102a4387a7b2013f5098c6c7c14e74" target="_parent">r123array1xm128i::begin() const </a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/functions_63.html b/lib/Random123-1.08/docs/html/search/functions_63.html
new file mode 100644
index 0000000..8218ee6
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/functions_63.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_cbegin">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_cbegin')">cbegin</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#a4b0a02537590babd835dd16405775efe" target="_parent">r123array1x32::cbegin()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array2x32.html#a9687a1e6cdb6b6c9a1ffd8f3c7d2ce45" target="_parent">r123array2x32::cbegin()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array4x32.html#a4881e99f7b0ff88e2a3082b9e2464bf5" target="_parent">r123array4x32::cbegin()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array8x32.html#a06c19ba6155e9c98892f5b98fb482c21" target="_parent">r123array8x32::cbegin()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array1x64.html#a33d1c19a63dec48f63f7c30c758fca0c" target="_parent">r123array1x64::cbegin()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array2x64.html#ad1ccbda4186dbb8c0a673db1ec0957c0" target="_parent">r123array2x64::cbegin()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array4x64.html#af716d2b14d1243870e8544ea2a3cece6" target="_parent">r123array4x64::cbegin()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array16x8.html#a80520b3d7040a8d6ec7068c8a143ba6f" target="_parent">r123array16x8::cbegin()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1xm128i.html#a335bab18a8bc904e34de0b3d9d1ce596" target="_parent">r123array1xm128i::cbegin()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_cend">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_cend')">cend</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../structr123array1x32.html#aa0f83d3e29c452d23c3660c98e3bd0e9" target="_parent">r123array1x32::cend()</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../structr123array2x32.html#a9bb4382830c6feb49573b82bb9a18efc" target="_parent">r123array2x32::cend()</a>
+    <a id="Item1_c2" onkeydown="return searchResults.NavChild(event,1,2)" onkeypress="return searchResults.NavChild(event,1,2)" onkeyup="return searchResults.NavChild(event,1,2)" class="SRScope" href="../structr123array4x32.html#a0045f9134801ed79d31f65c7d224d72c" target="_parent">r123array4x32::cend()</a>
+    <a id="Item1_c3" onkeydown="return searchResults.NavChild(event,1,3)" onkeypress="return searchResults.NavChild(event,1,3)" onkeyup="return searchResults.NavChild(event,1,3)" class="SRScope" href="../structr123array8x32.html#a0e1dfc305279a3439789dbdda8bfb6ae" target="_parent">r123array8x32::cend()</a>
+    <a id="Item1_c4" onkeydown="return searchResults.NavChild(event,1,4)" onkeypress="return searchResults.NavChild(event,1,4)" onkeyup="return searchResults.NavChild(event,1,4)" class="SRScope" href="../structr123array1x64.html#aa959a7054efa0d53f83f2d712d8d9049" target="_parent">r123array1x64::cend()</a>
+    <a id="Item1_c5" onkeydown="return searchResults.NavChild(event,1,5)" onkeypress="return searchResults.NavChild(event,1,5)" onkeyup="return searchResults.NavChild(event,1,5)" class="SRScope" href="../structr123array2x64.html#ac80c7ce6fe5bd9ca8baf03db1e67a7e9" target="_parent">r123array2x64::cend()</a>
+    <a id="Item1_c6" onkeydown="return searchResults.NavChild(event,1,6)" onkeypress="return searchResults.NavChild(event,1,6)" onkeyup="return searchResults.NavChild(event,1,6)" class="SRScope" href="../structr123array4x64.html#af970ab87ce987c91097316bc0a0836ef" target="_parent">r123array4x64::cend()</a>
+    <a id="Item1_c7" onkeydown="return searchResults.NavChild(event,1,7)" onkeypress="return searchResults.NavChild(event,1,7)" onkeyup="return searchResults.NavChild(event,1,7)" class="SRScope" href="../structr123array16x8.html#ad7919a7f772fda7d3fe3b476ac1e058f" target="_parent">r123array16x8::cend()</a>
+    <a id="Item1_c8" onkeydown="return searchResults.NavChild(event,1,8)" onkeypress="return searchResults.NavChild(event,1,8)" onkeyup="return searchResults.NavChild(event,1,8)" class="SRScope" href="../structr123array1xm128i.html#aa05003cae74984b777610702d27d66d2" target="_parent">r123array1xm128i::cend()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_counter">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../classr123_1_1MicroURNG.html#a30f52334b7cfcbe6d86870496ca57ea6" target="_parent">counter</a>
+  <span class="SRScope">r123::MicroURNG</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_crbegin">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_crbegin')">crbegin</a>
+  <div class="SRChildren">
+    <a id="Item3_c0" onkeydown="return searchResults.NavChild(event,3,0)" onkeypress="return searchResults.NavChild(event,3,0)" onkeyup="return searchResults.NavChild(event,3,0)" class="SRScope" href="../structr123array1x32.html#abe59890575233ef259a69d38bea4b5d9" target="_parent">r123array1x32::crbegin()</a>
+    <a id="Item3_c1" onkeydown="return searchResults.NavChild(event,3,1)" onkeypress="return searchResults.NavChild(event,3,1)" onkeyup="return searchResults.NavChild(event,3,1)" class="SRScope" href="../structr123array2x32.html#a09b34692bd41a710bf75e19af2353afb" target="_parent">r123array2x32::crbegin()</a>
+    <a id="Item3_c2" onkeydown="return searchResults.NavChild(event,3,2)" onkeypress="return searchResults.NavChild(event,3,2)" onkeyup="return searchResults.NavChild(event,3,2)" class="SRScope" href="../structr123array4x32.html#ad65e3e63740dc2301442718b3b8aa440" target="_parent">r123array4x32::crbegin()</a>
+    <a id="Item3_c3" onkeydown="return searchResults.NavChild(event,3,3)" onkeypress="return searchResults.NavChild(event,3,3)" onkeyup="return searchResults.NavChild(event,3,3)" class="SRScope" href="../structr123array8x32.html#a4ad5f793478a9658c52dc085b6c504ae" target="_parent">r123array8x32::crbegin()</a>
+    <a id="Item3_c4" onkeydown="return searchResults.NavChild(event,3,4)" onkeypress="return searchResults.NavChild(event,3,4)" onkeyup="return searchResults.NavChild(event,3,4)" class="SRScope" href="../structr123array1x64.html#adac6c38fef501a997b39229f54a6459c" target="_parent">r123array1x64::crbegin()</a>
+    <a id="Item3_c5" onkeydown="return searchResults.NavChild(event,3,5)" onkeypress="return searchResults.NavChild(event,3,5)" onkeyup="return searchResults.NavChild(event,3,5)" class="SRScope" href="../structr123array2x64.html#a198ff47db0778d88db4fabe5f7721564" target="_parent">r123array2x64::crbegin()</a>
+    <a id="Item3_c6" onkeydown="return searchResults.NavChild(event,3,6)" onkeypress="return searchResults.NavChild(event,3,6)" onkeyup="return searchResults.NavChild(event,3,6)" class="SRScope" href="../structr123array4x64.html#a7712a006a2b567321a6ac9e84bb267d8" target="_parent">r123array4x64::crbegin()</a>
+    <a id="Item3_c7" onkeydown="return searchResults.NavChild(event,3,7)" onkeypress="return searchResults.NavChild(event,3,7)" onkeyup="return searchResults.NavChild(event,3,7)" class="SRScope" href="../structr123array16x8.html#a2ecc3c23f3ae3939a386b334f0556d73" target="_parent">r123array16x8::crbegin()</a>
+    <a id="Item3_c8" onkeydown="return searchResults.NavChild(event,3,8)" onkeypress="return searchResults.NavChild(event,3,8)" onkeyup="return searchResults.NavChild(event,3,8)" class="SRScope" href="../structr123array1xm128i.html#a673c6cd3131269febe9a985dc76a2e08" target="_parent">r123array1xm128i::crbegin()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_crend">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_crend')">crend</a>
+  <div class="SRChildren">
+    <a id="Item4_c0" onkeydown="return searchResults.NavChild(event,4,0)" onkeypress="return searchResults.NavChild(event,4,0)" onkeyup="return searchResults.NavChild(event,4,0)" class="SRScope" href="../structr123array1x32.html#a7f0211b995c536c540c6b175d9433c74" target="_parent">r123array1x32::crend()</a>
+    <a id="Item4_c1" onkeydown="return searchResults.NavChild(event,4,1)" onkeypress="return searchResults.NavChild(event,4,1)" onkeyup="return searchResults.NavChild(event,4,1)" class="SRScope" href="../structr123array2x32.html#a458da2536084746b5f3face73c9f962d" target="_parent">r123array2x32::crend()</a>
+    <a id="Item4_c2" onkeydown="return searchResults.NavChild(event,4,2)" onkeypress="return searchResults.NavChild(event,4,2)" onkeyup="return searchResults.NavChild(event,4,2)" class="SRScope" href="../structr123array4x32.html#a13322be3844d39f9de76d263fa8d1f75" target="_parent">r123array4x32::crend()</a>
+    <a id="Item4_c3" onkeydown="return searchResults.NavChild(event,4,3)" onkeypress="return searchResults.NavChild(event,4,3)" onkeyup="return searchResults.NavChild(event,4,3)" class="SRScope" href="../structr123array8x32.html#ace0b6344aa8f0b9812a2610b6949a6b7" target="_parent">r123array8x32::crend()</a>
+    <a id="Item4_c4" onkeydown="return searchResults.NavChild(event,4,4)" onkeypress="return searchResults.NavChild(event,4,4)" onkeyup="return searchResults.NavChild(event,4,4)" class="SRScope" href="../structr123array1x64.html#a250e375c11846dc2635c7690f283cc20" target="_parent">r123array1x64::crend()</a>
+    <a id="Item4_c5" onkeydown="return searchResults.NavChild(event,4,5)" onkeypress="return searchResults.NavChild(event,4,5)" onkeyup="return searchResults.NavChild(event,4,5)" class="SRScope" href="../structr123array2x64.html#a5bddb882c7c9a493c382d3ce0d6d6079" target="_parent">r123array2x64::crend()</a>
+    <a id="Item4_c6" onkeydown="return searchResults.NavChild(event,4,6)" onkeypress="return searchResults.NavChild(event,4,6)" onkeyup="return searchResults.NavChild(event,4,6)" class="SRScope" href="../structr123array4x64.html#a907eb18b7392479a8ad6b2ddfaaecbd2" target="_parent">r123array4x64::crend()</a>
+    <a id="Item4_c7" onkeydown="return searchResults.NavChild(event,4,7)" onkeypress="return searchResults.NavChild(event,4,7)" onkeyup="return searchResults.NavChild(event,4,7)" class="SRScope" href="../structr123array16x8.html#a2a98e77e851e130a98d44a14ce673ffd" target="_parent">r123array16x8::crend()</a>
+    <a id="Item4_c8" onkeydown="return searchResults.NavChild(event,4,8)" onkeypress="return searchResults.NavChild(event,4,8)" onkeyup="return searchResults.NavChild(event,4,8)" class="SRScope" href="../structr123array1xm128i.html#aad72d00c81c8f6b9e8fb6b6be98056c6" target="_parent">r123array1xm128i::crend()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/functions_64.html b/lib/Random123-1.08/docs/html/search/functions_64.html
new file mode 100644
index 0000000..9babe63
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/functions_64.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_data">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_data')">data</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#a71529eccd6d52d7c396d58fd71214d0b" target="_parent">r123array1x32::data()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array1x32.html#a8ca295876693f207df52a7cce6f96241" target="_parent">r123array1x32::data() const </a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array2x32.html#a76f2b3cd04d0502121b3c7894663e178" target="_parent">r123array2x32::data()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array2x32.html#a15d5bce0ea3596ad5f7b5aa7432a33df" target="_parent">r123array2x32::data() const </a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array4x32.html#a72ee678cce1fa539f44480eb269a01f9" target="_parent">r123array4x32::data()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array4x32.html#a20dd9fc18f9db8fe8e8eb08311398d22" target="_parent">r123array4x32::data() const </a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array8x32.html#a78448bbbef69b3383eec4d78a814b4b2" target="_parent">r123array8x32::data()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array8x32.html#a0e2eb8cfaf36664411f19a6828339553" target="_parent">r123array8x32::data() const </a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1x64.html#a2ecd5718a0fd863dd7a3eb724e07a540" target="_parent">r123array1x64::data()</a>
+    <a id="Item0_c9" onkeydown="return searchResults.NavChild(event,0,9)" onkeypress="return searchResults.NavChild(event,0,9)" onkeyup="return searchResults.NavChild(event,0,9)" class="SRScope" href="../structr123array1x64.html#a02cd843e927803bd09f00b1a5541c72c" target="_parent">r123array1x64::data() const </a>
+    <a id="Item0_c10" onkeydown="return searchResults.NavChild(event,0,10)" onkeypress="return searchResults.NavChild(event,0,10)" onkeyup="return searchResults.NavChild(event,0,10)" class="SRScope" href="../structr123array2x64.html#a9a6eb23f15f9ee3a55f39b951798a739" target="_parent">r123array2x64::data()</a>
+    <a id="Item0_c11" onkeydown="return searchResults.NavChild(event,0,11)" onkeypress="return searchResults.NavChild(event,0,11)" onkeyup="return searchResults.NavChild(event,0,11)" class="SRScope" href="../structr123array2x64.html#a9cdb592780378bdcc8a560e31e11f084" target="_parent">r123array2x64::data() const </a>
+    <a id="Item0_c12" onkeydown="return searchResults.NavChild(event,0,12)" onkeypress="return searchResults.NavChild(event,0,12)" onkeyup="return searchResults.NavChild(event,0,12)" class="SRScope" href="../structr123array4x64.html#a8567c3d6c4ee6c9cc2d8770d26e7fee9" target="_parent">r123array4x64::data()</a>
+    <a id="Item0_c13" onkeydown="return searchResults.NavChild(event,0,13)" onkeypress="return searchResults.NavChild(event,0,13)" onkeyup="return searchResults.NavChild(event,0,13)" class="SRScope" href="../structr123array4x64.html#a31591d0bca18339d42c3a182a30457a0" target="_parent">r123array4x64::data() const </a>
+    <a id="Item0_c14" onkeydown="return searchResults.NavChild(event,0,14)" onkeypress="return searchResults.NavChild(event,0,14)" onkeyup="return searchResults.NavChild(event,0,14)" class="SRScope" href="../structr123array16x8.html#aac0eda610fbd60cdaae5d1e2aa4eb03f" target="_parent">r123array16x8::data()</a>
+    <a id="Item0_c15" onkeydown="return searchResults.NavChild(event,0,15)" onkeypress="return searchResults.NavChild(event,0,15)" onkeyup="return searchResults.NavChild(event,0,15)" class="SRScope" href="../structr123array16x8.html#aced4f7455fcc853a4e947b9bf892c45e" target="_parent">r123array16x8::data() const </a>
+    <a id="Item0_c16" onkeydown="return searchResults.NavChild(event,0,16)" onkeypress="return searchResults.NavChild(event,0,16)" onkeyup="return searchResults.NavChild(event,0,16)" class="SRScope" href="../structr123array1xm128i.html#acb25bc645e95f975ca6cbcb692add4b4" target="_parent">r123array1xm128i::data()</a>
+    <a id="Item0_c17" onkeydown="return searchResults.NavChild(event,0,17)" onkeypress="return searchResults.NavChild(event,0,17)" onkeyup="return searchResults.NavChild(event,0,17)" class="SRScope" href="../structr123array1xm128i.html#ac66f2efebe9e32433b25f96ea3cf34fe" target="_parent">r123array1xm128i::data() const </a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_discard">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structr123_1_1Engine.html#a82a56c2c02b146dceb68ef3fd0a969fb" target="_parent">discard</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/functions_65.html b/lib/Random123-1.08/docs/html/search/functions_65.html
new file mode 100644
index 0000000..51ddaac
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/functions_65.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_empty">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_empty')">empty</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#ae791cf5ce80a35610c3b4d52ea533651" target="_parent">r123array1x32::empty()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array2x32.html#acc67c9fedcddd77fdb2727c088eaab9d" target="_parent">r123array2x32::empty()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array4x32.html#a4bc944eee354be2b258c0991d3cc61e1" target="_parent">r123array4x32::empty()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array8x32.html#af2276e84924345efab98214be1691c83" target="_parent">r123array8x32::empty()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array1x64.html#af8636ea61389dcf15e94a5da70bd6bc0" target="_parent">r123array1x64::empty()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array2x64.html#a60ed2f5af6357930b50a8de8f294f5c2" target="_parent">r123array2x64::empty()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array4x64.html#a51e4ded187a3f1ebadd6b915da039c3f" target="_parent">r123array4x64::empty()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array16x8.html#a5f07441771ec90cd05a2c26fb64e575e" target="_parent">r123array16x8::empty()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1xm128i.html#aa3e59f1626f2cadab5bc66e415ff0c72" target="_parent">r123array1xm128i::empty()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_end">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_end')">end</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../structr123array1x32.html#ac2b5032395c448c4598321f5a37ec29c" target="_parent">r123array1x32::end()</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../structr123array1x32.html#a5bda32a4f4e8e783744ed7f183dde0b2" target="_parent">r123array1x32::end() const </a>
+    <a id="Item1_c2" onkeydown="return searchResults.NavChild(event,1,2)" onkeypress="return searchResults.NavChild(event,1,2)" onkeyup="return searchResults.NavChild(event,1,2)" class="SRScope" href="../structr123array2x32.html#a0d98e92b198e8a314d46f9c6fd0771a7" target="_parent">r123array2x32::end()</a>
+    <a id="Item1_c3" onkeydown="return searchResults.NavChild(event,1,3)" onkeypress="return searchResults.NavChild(event,1,3)" onkeyup="return searchResults.NavChild(event,1,3)" class="SRScope" href="../structr123array2x32.html#ad64dc05d5114c74d104bca45f21992fd" target="_parent">r123array2x32::end() const </a>
+    <a id="Item1_c4" onkeydown="return searchResults.NavChild(event,1,4)" onkeypress="return searchResults.NavChild(event,1,4)" onkeyup="return searchResults.NavChild(event,1,4)" class="SRScope" href="../structr123array4x32.html#a83dd3d17e17bb6a93b7cd544b0e9a403" target="_parent">r123array4x32::end()</a>
+    <a id="Item1_c5" onkeydown="return searchResults.NavChild(event,1,5)" onkeypress="return searchResults.NavChild(event,1,5)" onkeyup="return searchResults.NavChild(event,1,5)" class="SRScope" href="../structr123array4x32.html#ac6e732c58b1a5ad954c3b6f2be8385a1" target="_parent">r123array4x32::end() const </a>
+    <a id="Item1_c6" onkeydown="return searchResults.NavChild(event,1,6)" onkeypress="return searchResults.NavChild(event,1,6)" onkeyup="return searchResults.NavChild(event,1,6)" class="SRScope" href="../structr123array8x32.html#a40c40a7a86150ec0e9d29739e0e649c3" target="_parent">r123array8x32::end()</a>
+    <a id="Item1_c7" onkeydown="return searchResults.NavChild(event,1,7)" onkeypress="return searchResults.NavChild(event,1,7)" onkeyup="return searchResults.NavChild(event,1,7)" class="SRScope" href="../structr123array8x32.html#acc1aa99ed89deb63c3ba7f71319ac10c" target="_parent">r123array8x32::end() const </a>
+    <a id="Item1_c8" onkeydown="return searchResults.NavChild(event,1,8)" onkeypress="return searchResults.NavChild(event,1,8)" onkeyup="return searchResults.NavChild(event,1,8)" class="SRScope" href="../structr123array1x64.html#a18a5fa64dbe73dc4f9fd0b6c45fe283f" target="_parent">r123array1x64::end()</a>
+    <a id="Item1_c9" onkeydown="return searchResults.NavChild(event,1,9)" onkeypress="return searchResults.NavChild(event,1,9)" onkeyup="return searchResults.NavChild(event,1,9)" class="SRScope" href="../structr123array1x64.html#a595e77ff43ac41c4937e91f6d109a46a" target="_parent">r123array1x64::end() const </a>
+    <a id="Item1_c10" onkeydown="return searchResults.NavChild(event,1,10)" onkeypress="return searchResults.NavChild(event,1,10)" onkeyup="return searchResults.NavChild(event,1,10)" class="SRScope" href="../structr123array2x64.html#a24679f6a101d9d25b339106a771c4e68" target="_parent">r123array2x64::end()</a>
+    <a id="Item1_c11" onkeydown="return searchResults.NavChild(event,1,11)" onkeypress="return searchResults.NavChild(event,1,11)" onkeyup="return searchResults.NavChild(event,1,11)" class="SRScope" href="../structr123array2x64.html#af16f99514770cb88a57e36b1b849e80d" target="_parent">r123array2x64::end() const </a>
+    <a id="Item1_c12" onkeydown="return searchResults.NavChild(event,1,12)" onkeypress="return searchResults.NavChild(event,1,12)" onkeyup="return searchResults.NavChild(event,1,12)" class="SRScope" href="../structr123array4x64.html#a298a04608a19dd91cb30bd7980ad796f" target="_parent">r123array4x64::end()</a>
+    <a id="Item1_c13" onkeydown="return searchResults.NavChild(event,1,13)" onkeypress="return searchResults.NavChild(event,1,13)" onkeyup="return searchResults.NavChild(event,1,13)" class="SRScope" href="../structr123array4x64.html#a9fed923c39000c81f7f6b608d88953f9" target="_parent">r123array4x64::end() const </a>
+    <a id="Item1_c14" onkeydown="return searchResults.NavChild(event,1,14)" onkeypress="return searchResults.NavChild(event,1,14)" onkeyup="return searchResults.NavChild(event,1,14)" class="SRScope" href="../structr123array16x8.html#aa0d2b0c70133dde0535b0a5e12283626" target="_parent">r123array16x8::end()</a>
+    <a id="Item1_c15" onkeydown="return searchResults.NavChild(event,1,15)" onkeypress="return searchResults.NavChild(event,1,15)" onkeyup="return searchResults.NavChild(event,1,15)" class="SRScope" href="../structr123array16x8.html#aee42dddf2a59858114a31d760f2c1227" target="_parent">r123array16x8::end() const </a>
+    <a id="Item1_c16" onkeydown="return searchResults.NavChild(event,1,16)" onkeypress="return searchResults.NavChild(event,1,16)" onkeyup="return searchResults.NavChild(event,1,16)" class="SRScope" href="../structr123array1xm128i.html#a7383241079a4eae9fee0e184261174fd" target="_parent">r123array1xm128i::end()</a>
+    <a id="Item1_c17" onkeydown="return searchResults.NavChild(event,1,17)" onkeypress="return searchResults.NavChild(event,1,17)" onkeyup="return searchResults.NavChild(event,1,17)" class="SRScope" href="../structr123array1xm128i.html#ae8ddb01064f8cdfbb7314d2f1fbd0dfd" target="_parent">r123array1xm128i::end() const </a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_engine">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_engine')">Engine</a>
+  <div class="SRChildren">
+    <a id="Item2_c0" onkeydown="return searchResults.NavChild(event,2,0)" onkeypress="return searchResults.NavChild(event,2,0)" onkeyup="return searchResults.NavChild(event,2,0)" class="SRScope" href="../structr123_1_1Engine.html#ac5676bbe189b0cdc1bef0dd812262ccd" target="_parent">r123::Engine::Engine()</a>
+    <a id="Item2_c1" onkeydown="return searchResults.NavChild(event,2,1)" onkeypress="return searchResults.NavChild(event,2,1)" onkeyup="return searchResults.NavChild(event,2,1)" class="SRScope" href="../structr123_1_1Engine.html#ae1a249af828cfdac77db6c16e3f8f8eb" target="_parent">r123::Engine::Engine(result_type r)</a>
+    <a id="Item2_c2" onkeydown="return searchResults.NavChild(event,2,2)" onkeypress="return searchResults.NavChild(event,2,2)" onkeyup="return searchResults.NavChild(event,2,2)" class="SRScope" href="../structr123_1_1Engine.html#a37dd55cee849b59d678f74780f785672" target="_parent">r123::Engine::Engine(Engine &e)</a>
+    <a id="Item2_c3" onkeydown="return searchResults.NavChild(event,2,3)" onkeypress="return searchResults.NavChild(event,2,3)" onkeyup="return searchResults.NavChild(event,2,3)" class="SRScope" href="../structr123_1_1Engine.html#a478b486b166316597a51ffdd7b5b2d0c" target="_parent">r123::Engine::Engine(const Engine &e)</a>
+    <a id="Item2_c4" onkeydown="return searchResults.NavChild(event,2,4)" onkeypress="return searchResults.NavChild(event,2,4)" onkeyup="return searchResults.NavChild(event,2,4)" class="SRScope" href="../structr123_1_1Engine.html#a52b968cfefe413441d668b3013de023a" target="_parent">r123::Engine::Engine(SeedSeq &s)</a>
+    <a id="Item2_c5" onkeydown="return searchResults.NavChild(event,2,5)" onkeypress="return searchResults.NavChild(event,2,5)" onkeyup="return searchResults.NavChild(event,2,5)" class="SRScope" href="../structr123_1_1Engine.html#ab5f45b4eb97995cc45350abee3ec8388" target="_parent">r123::Engine::Engine(const ukey_type &uk)</a>
+    <a id="Item2_c6" onkeydown="return searchResults.NavChild(event,2,6)" onkeypress="return searchResults.NavChild(event,2,6)" onkeyup="return searchResults.NavChild(event,2,6)" class="SRScope" href="../structr123_1_1Engine.html#aeb178b9305cbf1fb7e11e8e33a631ba7" target="_parent">r123::Engine::Engine(ukey_type &uk)</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/functions_66.html b/lib/Random123-1.08/docs/html/search/functions_66.html
new file mode 100644
index 0000000..a27f2ff
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/functions_66.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_fill">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_fill')">fill</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#a973dbecc59b1d5f5a95bda92d25e5e73" target="_parent">r123array1x32::fill()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array2x32.html#af7ea9ed8a064e9cab59ee97885bb459e" target="_parent">r123array2x32::fill()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array4x32.html#ae362d7908c2ecc308f6fd4e085ace980" target="_parent">r123array4x32::fill()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array8x32.html#a86481aecfb276687e9389cb6c43e1e8c" target="_parent">r123array8x32::fill()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array1x64.html#ac9a372e0980632a4db29bb243b672039" target="_parent">r123array1x64::fill()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array2x64.html#a30d20bbf203dbd0b592c6cb58cb6dcdb" target="_parent">r123array2x64::fill()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array4x64.html#a6580c77b7d68c0a76b5bef33e59ac662" target="_parent">r123array4x64::fill()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array16x8.html#a883d42092ab4bae2eac132706ed06103" target="_parent">r123array16x8::fill()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1xm128i.html#a7eba15dc035724245f70b4a3a98c6a52" target="_parent">r123array1xm128i::fill()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_fix_5finvariant">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structr123_1_1Engine.html#aa7ad87d7238a0f820ee37640071dee7d" target="_parent">fix_invariant</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_front">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_front')">front</a>
+  <div class="SRChildren">
+    <a id="Item2_c0" onkeydown="return searchResults.NavChild(event,2,0)" onkeypress="return searchResults.NavChild(event,2,0)" onkeyup="return searchResults.NavChild(event,2,0)" class="SRScope" href="../structr123array1x32.html#a69727e5b1c14fcc2f7c9b6af4410cc16" target="_parent">r123array1x32::front()</a>
+    <a id="Item2_c1" onkeydown="return searchResults.NavChild(event,2,1)" onkeypress="return searchResults.NavChild(event,2,1)" onkeyup="return searchResults.NavChild(event,2,1)" class="SRScope" href="../structr123array1x32.html#af94d0df621b1de0b6a3ed904c276eb84" target="_parent">r123array1x32::front() const </a>
+    <a id="Item2_c2" onkeydown="return searchResults.NavChild(event,2,2)" onkeypress="return searchResults.NavChild(event,2,2)" onkeyup="return searchResults.NavChild(event,2,2)" class="SRScope" href="../structr123array2x32.html#ad5e3ba16c4d22c3ac0775337bef3cc70" target="_parent">r123array2x32::front()</a>
+    <a id="Item2_c3" onkeydown="return searchResults.NavChild(event,2,3)" onkeypress="return searchResults.NavChild(event,2,3)" onkeyup="return searchResults.NavChild(event,2,3)" class="SRScope" href="../structr123array2x32.html#a933676c34296b74eeea8a56a3c904a2c" target="_parent">r123array2x32::front() const </a>
+    <a id="Item2_c4" onkeydown="return searchResults.NavChild(event,2,4)" onkeypress="return searchResults.NavChild(event,2,4)" onkeyup="return searchResults.NavChild(event,2,4)" class="SRScope" href="../structr123array4x32.html#a82b3fdeacb835bb64765def4bef92751" target="_parent">r123array4x32::front()</a>
+    <a id="Item2_c5" onkeydown="return searchResults.NavChild(event,2,5)" onkeypress="return searchResults.NavChild(event,2,5)" onkeyup="return searchResults.NavChild(event,2,5)" class="SRScope" href="../structr123array4x32.html#ab3434550aea3d2e04579cb255b0b4e9e" target="_parent">r123array4x32::front() const </a>
+    <a id="Item2_c6" onkeydown="return searchResults.NavChild(event,2,6)" onkeypress="return searchResults.NavChild(event,2,6)" onkeyup="return searchResults.NavChild(event,2,6)" class="SRScope" href="../structr123array8x32.html#aeab7da4db40303e2104b79c2d8f3eced" target="_parent">r123array8x32::front()</a>
+    <a id="Item2_c7" onkeydown="return searchResults.NavChild(event,2,7)" onkeypress="return searchResults.NavChild(event,2,7)" onkeyup="return searchResults.NavChild(event,2,7)" class="SRScope" href="../structr123array8x32.html#aee2127f4a99f86b3fc7a9059e7d84e76" target="_parent">r123array8x32::front() const </a>
+    <a id="Item2_c8" onkeydown="return searchResults.NavChild(event,2,8)" onkeypress="return searchResults.NavChild(event,2,8)" onkeyup="return searchResults.NavChild(event,2,8)" class="SRScope" href="../structr123array1x64.html#a7d205216932e36303f62b38d233247d5" target="_parent">r123array1x64::front()</a>
+    <a id="Item2_c9" onkeydown="return searchResults.NavChild(event,2,9)" onkeypress="return searchResults.NavChild(event,2,9)" onkeyup="return searchResults.NavChild(event,2,9)" class="SRScope" href="../structr123array1x64.html#a7c0a3159492b3405a8019ce52cdf2c69" target="_parent">r123array1x64::front() const </a>
+    <a id="Item2_c10" onkeydown="return searchResults.NavChild(event,2,10)" onkeypress="return searchResults.NavChild(event,2,10)" onkeyup="return searchResults.NavChild(event,2,10)" class="SRScope" href="../structr123array2x64.html#a95b79f70de75c8346dbae7c5f933d076" target="_parent">r123array2x64::front()</a>
+    <a id="Item2_c11" onkeydown="return searchResults.NavChild(event,2,11)" onkeypress="return searchResults.NavChild(event,2,11)" onkeyup="return searchResults.NavChild(event,2,11)" class="SRScope" href="../structr123array2x64.html#a21cf5457f945f5c00b16ce4a73797c1b" target="_parent">r123array2x64::front() const </a>
+    <a id="Item2_c12" onkeydown="return searchResults.NavChild(event,2,12)" onkeypress="return searchResults.NavChild(event,2,12)" onkeyup="return searchResults.NavChild(event,2,12)" class="SRScope" href="../structr123array4x64.html#a975ecaf4c5332fc400dfc8d6d60d9035" target="_parent">r123array4x64::front()</a>
+    <a id="Item2_c13" onkeydown="return searchResults.NavChild(event,2,13)" onkeypress="return searchResults.NavChild(event,2,13)" onkeyup="return searchResults.NavChild(event,2,13)" class="SRScope" href="../structr123array4x64.html#a256920b96d1d3a4c61489b145da7383e" target="_parent">r123array4x64::front() const </a>
+    <a id="Item2_c14" onkeydown="return searchResults.NavChild(event,2,14)" onkeypress="return searchResults.NavChild(event,2,14)" onkeyup="return searchResults.NavChild(event,2,14)" class="SRScope" href="../structr123array16x8.html#ad293e6494e131ff96941e963d9208586" target="_parent">r123array16x8::front()</a>
+    <a id="Item2_c15" onkeydown="return searchResults.NavChild(event,2,15)" onkeypress="return searchResults.NavChild(event,2,15)" onkeyup="return searchResults.NavChild(event,2,15)" class="SRScope" href="../structr123array16x8.html#a85528130b6941b3f7b57265c201345c2" target="_parent">r123array16x8::front() const </a>
+    <a id="Item2_c16" onkeydown="return searchResults.NavChild(event,2,16)" onkeypress="return searchResults.NavChild(event,2,16)" onkeyup="return searchResults.NavChild(event,2,16)" class="SRScope" href="../structr123array1xm128i.html#a7efd9b7ccf35c3730fbdafb147e11660" target="_parent">r123array1xm128i::front()</a>
+    <a id="Item2_c17" onkeydown="return searchResults.NavChild(event,2,17)" onkeypress="return searchResults.NavChild(event,2,17)" onkeyup="return searchResults.NavChild(event,2,17)" class="SRScope" href="../structr123array1xm128i.html#a0b5a33169ae87744ab353bfa7dc8f710" target="_parent">r123array1xm128i::front() const </a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/functions_67.html b/lib/Random123-1.08/docs/html/search/functions_67.html
new file mode 100644
index 0000000..0823a4e
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/functions_67.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_getcounter">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123_1_1Engine.html#a621df886f2a21ffb22e63d9094389173" target="_parent">getcounter</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_getseed">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structr123_1_1Engine.html#aa7812a494fdb677c2e325db0acfe924a" target="_parent">getseed</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/functions_68.html b/lib/Random123-1.08/docs/html/search/functions_68.html
new file mode 100644
index 0000000..d4c1545
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/functions_68.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_haveaesni">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../sse_8h.html#a0b35a046e85316295476d7d552411044" target="_parent">haveAESNI</a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/functions_69.html b/lib/Random123-1.08/docs/html/search/functions_69.html
new file mode 100644
index 0000000..247af39
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/functions_69.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_incr">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_incr')">incr</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#aae5fbc153a37b06ea466f2283551622f" target="_parent">r123array1x32::incr()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array2x32.html#a7b295f3a299c8cf24a75ab7f9edfe46f" target="_parent">r123array2x32::incr()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array4x32.html#a36515eb50711e36a88f1390bbd4e0e05" target="_parent">r123array4x32::incr()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array8x32.html#a92ded324d4b7e2602766fa0c71fa5985" target="_parent">r123array8x32::incr()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array1x64.html#ad44244e95f8937e0874dec9083071a85" target="_parent">r123array1x64::incr()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array2x64.html#ac33e6336c8aee10e38259510ef76e5cf" target="_parent">r123array2x64::incr()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array4x64.html#ac4187b4ae44913183b1c8f9b7654f8a9" target="_parent">r123array4x64::incr()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array16x8.html#aaf2d677b347b7c7bf362a2b318f46e3c" target="_parent">r123array16x8::incr()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1xm128i.html#a62ee236dafcbfb81ef43d7aa82a66b47" target="_parent">r123array1xm128i::incr()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_incr_5fcarefully">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_incr_5fcarefully')">incr_carefully</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../structr123array1x32.html#a9c919289274ced376086f1110c8b6384" target="_parent">r123array1x32::incr_carefully()</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../structr123array2x32.html#adf128cb5c0abaaa4f119d4bcef47ead9" target="_parent">r123array2x32::incr_carefully()</a>
+    <a id="Item1_c2" onkeydown="return searchResults.NavChild(event,1,2)" onkeypress="return searchResults.NavChild(event,1,2)" onkeyup="return searchResults.NavChild(event,1,2)" class="SRScope" href="../structr123array4x32.html#acec3775361651e6f8dea517f07d7a8b8" target="_parent">r123array4x32::incr_carefully()</a>
+    <a id="Item1_c3" onkeydown="return searchResults.NavChild(event,1,3)" onkeypress="return searchResults.NavChild(event,1,3)" onkeyup="return searchResults.NavChild(event,1,3)" class="SRScope" href="../structr123array8x32.html#a9e73ed67b7c577ebdb6c5e1f121fdc4f" target="_parent">r123array8x32::incr_carefully()</a>
+    <a id="Item1_c4" onkeydown="return searchResults.NavChild(event,1,4)" onkeypress="return searchResults.NavChild(event,1,4)" onkeyup="return searchResults.NavChild(event,1,4)" class="SRScope" href="../structr123array1x64.html#ad848dc3e868f8195ee3eb5029698c976" target="_parent">r123array1x64::incr_carefully()</a>
+    <a id="Item1_c5" onkeydown="return searchResults.NavChild(event,1,5)" onkeypress="return searchResults.NavChild(event,1,5)" onkeyup="return searchResults.NavChild(event,1,5)" class="SRScope" href="../structr123array2x64.html#a52ddbfa3edbd9fa7f30e1402a9240da1" target="_parent">r123array2x64::incr_carefully()</a>
+    <a id="Item1_c6" onkeydown="return searchResults.NavChild(event,1,6)" onkeypress="return searchResults.NavChild(event,1,6)" onkeyup="return searchResults.NavChild(event,1,6)" class="SRScope" href="../structr123array4x64.html#af629d14b454f406cae4d128d9e05554d" target="_parent">r123array4x64::incr_carefully()</a>
+    <a id="Item1_c7" onkeydown="return searchResults.NavChild(event,1,7)" onkeypress="return searchResults.NavChild(event,1,7)" onkeyup="return searchResults.NavChild(event,1,7)" class="SRScope" href="../structr123array16x8.html#abbc6c2d9cdc2187cdfdea759951498a0" target="_parent">r123array16x8::incr_carefully()</a>
+    <a id="Item1_c8" onkeydown="return searchResults.NavChild(event,1,8)" onkeypress="return searchResults.NavChild(event,1,8)" onkeyup="return searchResults.NavChild(event,1,8)" class="SRScope" href="../structr123array1xm128i.html#ab35cfd8e9221c294ab7546855373a38c" target="_parent">r123array1xm128i::incr_carefully()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/functions_6d.html b/lib/Random123-1.08/docs/html/search/functions_6d.html
new file mode 100644
index 0000000..1a18e3d
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/functions_6d.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_max_5fsize">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_max_5fsize')">max_size</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#a707c532168670ad508723d057f712928" target="_parent">r123array1x32::max_size()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array2x32.html#a07345b400c5a81e6cd55689d1e38122f" target="_parent">r123array2x32::max_size()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array4x32.html#afddfc77eea0f5f4c53dc075425f96ab3" target="_parent">r123array4x32::max_size()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array8x32.html#a0ea0af65a3b0a51c090ab6ef11f20c63" target="_parent">r123array8x32::max_size()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array1x64.html#a1b02d097ca118866b7f696b7c1c5681f" target="_parent">r123array1x64::max_size()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array2x64.html#a03f7c9e37e59210b1d2b9390e415e289" target="_parent">r123array2x64::max_size()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array4x64.html#aad1329f21e3fdd5d25a29148db564b8a" target="_parent">r123array4x64::max_size()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array16x8.html#a3f59fb2b338aa8e33879e8d2d22840ed" target="_parent">r123array16x8::max_size()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1xm128i.html#a04e2b8952459b7aeabc011532fe3f8fa" target="_parent">r123array1xm128i::max_size()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_microurng">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_microurng')">MicroURNG</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../classr123_1_1MicroURNG.html#a19afb80312c370e1670bf8afc73d802e" target="_parent">r123::MicroURNG::MicroURNG(cbrng_type _b, ctr_type _c0, ukey_type _uk)</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../classr123_1_1MicroURNG.html#a7ecf43819bc96804892a78c6715f587b" target="_parent">r123::MicroURNG::MicroURNG(ctr_type _c0, ukey_type _uk)</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/functions_6f.html b/lib/Random123-1.08/docs/html/search/functions_6f.html
new file mode 100644
index 0000000..444bcd6
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/functions_6f.html
@@ -0,0 +1,200 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_operator_20_5f_5fm128i">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123m128i.html#a80a5c24f76fec61b3ab0ed0e0353cfb7" target="_parent">operator __m128i</a>
+  <span class="SRScope">r123m128i</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_20const_20void_20_2a">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structr123m128i.html#ae5788785c2ce7f7ca6ff8dd4377771f3" target="_parent">operator const void *</a>
+  <span class="SRScope">r123m128i</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_21_3d">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_operator_21_3d')">operator!=</a>
+  <div class="SRChildren">
+    <a id="Item2_c0" onkeydown="return searchResults.NavChild(event,2,0)" onkeypress="return searchResults.NavChild(event,2,0)" onkeyup="return searchResults.NavChild(event,2,0)" class="SRScope" href="../structr123array1x32.html#af293f370d083051f6cf24408e07feff1" target="_parent">r123array1x32::operator!=()</a>
+    <a id="Item2_c1" onkeydown="return searchResults.NavChild(event,2,1)" onkeypress="return searchResults.NavChild(event,2,1)" onkeyup="return searchResults.NavChild(event,2,1)" class="SRScope" href="../structr123array2x32.html#aa0c7e561ddeb475329ea8d8178fca2a1" target="_parent">r123array2x32::operator!=()</a>
+    <a id="Item2_c2" onkeydown="return searchResults.NavChild(event,2,2)" onkeypress="return searchResults.NavChild(event,2,2)" onkeyup="return searchResults.NavChild(event,2,2)" class="SRScope" href="../structr123array4x32.html#a1a7aa47c8dd7db5146e54cc54d1d4358" target="_parent">r123array4x32::operator!=()</a>
+    <a id="Item2_c3" onkeydown="return searchResults.NavChild(event,2,3)" onkeypress="return searchResults.NavChild(event,2,3)" onkeyup="return searchResults.NavChild(event,2,3)" class="SRScope" href="../structr123array8x32.html#aed510e0472db9b00490c468d88e14bac" target="_parent">r123array8x32::operator!=()</a>
+    <a id="Item2_c4" onkeydown="return searchResults.NavChild(event,2,4)" onkeypress="return searchResults.NavChild(event,2,4)" onkeyup="return searchResults.NavChild(event,2,4)" class="SRScope" href="../structr123array1x64.html#a0969493a7aac290e5ab2a5135380bc3d" target="_parent">r123array1x64::operator!=()</a>
+    <a id="Item2_c5" onkeydown="return searchResults.NavChild(event,2,5)" onkeypress="return searchResults.NavChild(event,2,5)" onkeyup="return searchResults.NavChild(event,2,5)" class="SRScope" href="../structr123array2x64.html#a1ddc25ec182ac3b119e420f5e21c3f87" target="_parent">r123array2x64::operator!=()</a>
+    <a id="Item2_c6" onkeydown="return searchResults.NavChild(event,2,6)" onkeypress="return searchResults.NavChild(event,2,6)" onkeyup="return searchResults.NavChild(event,2,6)" class="SRScope" href="../structr123array4x64.html#abf2fc58ddb163708c087f72921dfd11d" target="_parent">r123array4x64::operator!=()</a>
+    <a id="Item2_c7" onkeydown="return searchResults.NavChild(event,2,7)" onkeypress="return searchResults.NavChild(event,2,7)" onkeyup="return searchResults.NavChild(event,2,7)" class="SRScope" href="../structr123array16x8.html#af48be55844748a0f6406b2ae437398b5" target="_parent">r123array16x8::operator!=()</a>
+    <a id="Item2_c8" onkeydown="return searchResults.NavChild(event,2,8)" onkeypress="return searchResults.NavChild(event,2,8)" onkeyup="return searchResults.NavChild(event,2,8)" class="SRScope" href="../structr123array1xm128i.html#a60cf5b0e8283c20c386a7935f9ae0a60" target="_parent">r123array1xm128i::operator!=()</a>
+    <a id="Item2_c9" onkeydown="return searchResults.NavChild(event,2,9)" onkeypress="return searchResults.NavChild(event,2,9)" onkeyup="return searchResults.NavChild(event,2,9)" class="SRScope" href="../sse_8h.html#a9fc5dd462afc043229ab800abb8f7d64" target="_parent">operator!=(const r123m128i &lhs, const r123m128i &rhs): sse.h</a>
+    <a id="Item2_c10" onkeydown="return searchResults.NavChild(event,2,10)" onkeypress="return searchResults.NavChild(event,2,10)" onkeyup="return searchResults.NavChild(event,2,10)" class="SRScope" href="../sse_8h.html#a76ef724b020add862a911a699a21451b" target="_parent">operator!=(uint64_t lhs, const r123m128i &rhs): sse.h</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_28_29">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_operator_28_29')">operator()</a>
+  <div class="SRChildren">
+    <a id="Item3_c0" onkeydown="return searchResults.NavChild(event,3,0)" onkeypress="return searchResults.NavChild(event,3,0)" onkeyup="return searchResults.NavChild(event,3,0)" class="SRScope" href="../structr123_1_1AESNI1xm128i.html#a9bff0ac8478400c1006136e9bde91dc3" target="_parent">r123::AESNI1xm128i::operator()()</a>
+    <a id="Item3_c1" onkeydown="return searchResults.NavChild(event,3,1)" onkeypress="return searchResults.NavChild(event,3,1)" onkeyup="return searchResults.NavChild(event,3,1)" class="SRScope" href="../structr123_1_1AESNI4x32.html#a981102e5bc0a7df916a95a40af8fd4c0" target="_parent">r123::AESNI4x32::operator()()</a>
+    <a id="Item3_c2" onkeydown="return searchResults.NavChild(event,3,2)" onkeypress="return searchResults.NavChild(event,3,2)" onkeyup="return searchResults.NavChild(event,3,2)" class="SRScope" href="../structr123_1_1ARS1xm128i__R.html#a89c0fc4e1c90ee684fc88dde05d8d82c" target="_parent">r123::ARS1xm128i_R::operator()()</a>
+    <a id="Item3_c3" onkeydown="return searchResults.NavChild(event,3,3)" onkeypress="return searchResults.NavChild(event,3,3)" onkeyup="return searchResults.NavChild(event,3,3)" class="SRScope" href="../structr123_1_1ARS4x32__R.html#afcd326e150925e30de22166e727567df" target="_parent">r123::ARS4x32_R::operator()()</a>
+    <a id="Item3_c4" onkeydown="return searchResults.NavChild(event,3,4)" onkeypress="return searchResults.NavChild(event,3,4)" onkeyup="return searchResults.NavChild(event,3,4)" class="SRScope" href="../classr123_1_1MicroURNG.html#a64cd4d33b4cab5d3d9c556db68407b77" target="_parent">r123::MicroURNG::operator()()</a>
+    <a id="Item3_c5" onkeydown="return searchResults.NavChild(event,3,5)" onkeypress="return searchResults.NavChild(event,3,5)" onkeyup="return searchResults.NavChild(event,3,5)" class="SRScope" href="../structr123_1_1Philox2x32__R.html#ab610a200c9fa62d090f31466b655c780" target="_parent">r123::Philox2x32_R::operator()()</a>
+    <a id="Item3_c6" onkeydown="return searchResults.NavChild(event,3,6)" onkeypress="return searchResults.NavChild(event,3,6)" onkeyup="return searchResults.NavChild(event,3,6)" class="SRScope" href="../structr123_1_1Philox4x32__R.html#adf05bdc0c856c9541db656711fd8c7d1" target="_parent">r123::Philox4x32_R::operator()()</a>
+    <a id="Item3_c7" onkeydown="return searchResults.NavChild(event,3,7)" onkeypress="return searchResults.NavChild(event,3,7)" onkeyup="return searchResults.NavChild(event,3,7)" class="SRScope" href="../structr123_1_1Philox2x64__R.html#a04f6039e87a958593ac011d9304d7ec9" target="_parent">r123::Philox2x64_R::operator()()</a>
+    <a id="Item3_c8" onkeydown="return searchResults.NavChild(event,3,8)" onkeypress="return searchResults.NavChild(event,3,8)" onkeyup="return searchResults.NavChild(event,3,8)" class="SRScope" href="../structr123_1_1Philox4x64__R.html#aa5a0488aa6e16c55b7647c155b18462c" target="_parent">r123::Philox4x64_R::operator()()</a>
+    <a id="Item3_c9" onkeydown="return searchResults.NavChild(event,3,9)" onkeypress="return searchResults.NavChild(event,3,9)" onkeyup="return searchResults.NavChild(event,3,9)" class="SRScope" href="../structr123_1_1ReinterpretCtr.html#a91edc5103397372cc5509ad17c0fc83a" target="_parent">r123::ReinterpretCtr::operator()()</a>
+    <a id="Item3_c10" onkeydown="return searchResults.NavChild(event,3,10)" onkeypress="return searchResults.NavChild(event,3,10)" onkeyup="return searchResults.NavChild(event,3,10)" class="SRScope" href="../structr123_1_1Threefry2x32__R.html#a64b8018e82f3e7a0e252166b15b42a71" target="_parent">r123::Threefry2x32_R::operator()()</a>
+    <a id="Item3_c11" onkeydown="return searchResults.NavChild(event,3,11)" onkeypress="return searchResults.NavChild(event,3,11)" onkeyup="return searchResults.NavChild(event,3,11)" class="SRScope" href="../structr123_1_1Threefry4x32__R.html#ae0dfbf399015fab602c769ad90256231" target="_parent">r123::Threefry4x32_R::operator()()</a>
+    <a id="Item3_c12" onkeydown="return searchResults.NavChild(event,3,12)" onkeypress="return searchResults.NavChild(event,3,12)" onkeyup="return searchResults.NavChild(event,3,12)" class="SRScope" href="../structr123_1_1Threefry2x64__R.html#ab654a85f2c4ec65548ddfc85dc00f27e" target="_parent">r123::Threefry2x64_R::operator()()</a>
+    <a id="Item3_c13" onkeydown="return searchResults.NavChild(event,3,13)" onkeypress="return searchResults.NavChild(event,3,13)" onkeyup="return searchResults.NavChild(event,3,13)" class="SRScope" href="../structr123_1_1Threefry4x64__R.html#a09e7fb82f9b7bcf6ccb4d849116b6ec1" target="_parent">r123::Threefry4x64_R::operator()()</a>
+    <a id="Item3_c14" onkeydown="return searchResults.NavChild(event,3,14)" onkeypress="return searchResults.NavChild(event,3,14)" onkeyup="return searchResults.NavChild(event,3,14)" class="SRScope" href="../structr123_1_1Engine.html#aca309d0b4f2a8fff1f6f2ab38c6caf93" target="_parent">r123::Engine::operator()()</a>
+    <a id="Item3_c15" onkeydown="return searchResults.NavChild(event,3,15)" onkeypress="return searchResults.NavChild(event,3,15)" onkeyup="return searchResults.NavChild(event,3,15)" class="SRScope" href="../structr123_1_1Engine.html#af396a7d1656af55805e38f3d9c0fbef7" target="_parent">r123::Engine::operator()(const ctr_type &c) const </a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_2b_2b">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../sse_8h.html#a2ffeb79e1a2cbb9cb35b0daf514a06a5" target="_parent">operator++</a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_2b_3d">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../sse_8h.html#a436d4467bb1389d42bfa67686218fd98" target="_parent">operator+=</a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3c">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="../sse_8h.html#ac2c263fa443dd074fe4ff96710219eb8" target="_parent">operator<</a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3c_3c">
+ <div class="SREntry">
+  <a id="Item7" onkeydown="return searchResults.Nav(event,7)" onkeypress="return searchResults.Nav(event,7)" onkeyup="return searchResults.Nav(event,7)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_operator_3c_3c')">operator<<</a>
+  <div class="SRChildren">
+    <a id="Item7_c0" onkeydown="return searchResults.NavChild(event,7,0)" onkeypress="return searchResults.NavChild(event,7,0)" onkeyup="return searchResults.NavChild(event,7,0)" class="SRScope" href="../array_8h.html#af29a19da89789058ead246fdef153ce0" target="_parent">operator<<(std::ostream &os, const r123array1x32 &a): array.h</a>
+    <a id="Item7_c1" onkeydown="return searchResults.NavChild(event,7,1)" onkeypress="return searchResults.NavChild(event,7,1)" onkeyup="return searchResults.NavChild(event,7,1)" class="SRScope" href="../array_8h.html#a9c1f24a8b73925bc24a5acf09fd4e305" target="_parent">operator<<(std::ostream &os, const r123array2x32 &a): array.h</a>
+    <a id="Item7_c2" onkeydown="return searchResults.NavChild(event,7,2)" onkeypress="return searchResults.NavChild(event,7,2)" onkeyup="return searchResults.NavChild(event,7,2)" class="SRScope" href="../array_8h.html#ab2b41774a3888c0bc9697fd79383eae4" target="_parent">operator<<(std::ostream &os, const r123array4x32 &a): array.h</a>
+    <a id="Item7_c3" onkeydown="return searchResults.NavChild(event,7,3)" onkeypress="return searchResults.NavChild(event,7,3)" onkeyup="return searchResults.NavChild(event,7,3)" class="SRScope" href="../array_8h.html#a8339351efe6ba804aacd3d97632e2bdf" target="_parent">operator<<(std::ostream &os, const r123array8x32 &a): array.h</a>
+    <a id="Item7_c4" onkeydown="return searchResults.NavChild(event,7,4)" onkeypress="return searchResults.NavChild(event,7,4)" onkeyup="return searchResults.NavChild(event,7,4)" class="SRScope" href="../array_8h.html#ae87e390bd8c0cadc74bd08dfffd0101f" target="_parent">operator<<(std::ostream &os, const r123array1x64 &a): array.h</a>
+    <a id="Item7_c5" onkeydown="return searchResults.NavChild(event,7,5)" onkeypress="return searchResults.NavChild(event,7,5)" onkeyup="return searchResults.NavChild(event,7,5)" class="SRScope" href="../array_8h.html#a06634d010d5cde0afe278031c7597cc3" target="_parent">operator<<(std::ostream &os, const r123array2x64 &a): array.h</a>
+    <a id="Item7_c6" onkeydown="return searchResults.NavChild(event,7,6)" onkeypress="return searchResults.NavChild(event,7,6)" onkeyup="return searchResults.NavChild(event,7,6)" class="SRScope" href="../array_8h.html#acff68189292ea886eed0f24b5146566d" target="_parent">operator<<(std::ostream &os, const r123array4x64 &a): array.h</a>
+    <a id="Item7_c7" onkeydown="return searchResults.NavChild(event,7,7)" onkeypress="return searchResults.NavChild(event,7,7)" onkeyup="return searchResults.NavChild(event,7,7)" class="SRScope" href="../array_8h.html#a8b82ce828fcb9bb530870dd2919975e9" target="_parent">operator<<(std::ostream &os, const r123array16x8 &a): array.h</a>
+    <a id="Item7_c8" onkeydown="return searchResults.NavChild(event,7,8)" onkeypress="return searchResults.NavChild(event,7,8)" onkeyup="return searchResults.NavChild(event,7,8)" class="SRScope" href="../array_8h.html#af4437aa49ff7855c60ca4ddacf2e48e5" target="_parent">operator<<(std::ostream &os, const r123array1xm128i &a): array.h</a>
+    <a id="Item7_c9" onkeydown="return searchResults.NavChild(event,7,9)" onkeypress="return searchResults.NavChild(event,7,9)" onkeyup="return searchResults.NavChild(event,7,9)" class="SRScope" href="../sse_8h.html#af965b43e09e7305795c7b5a35d20c75f" target="_parent">operator<<(std::ostream &os, const r123m128i &m): sse.h</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3c_3d">
+ <div class="SREntry">
+  <a id="Item8" onkeydown="return searchResults.Nav(event,8)" onkeypress="return searchResults.Nav(event,8)" onkeyup="return searchResults.Nav(event,8)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_operator_3c_3d')">operator<=</a>
+  <div class="SRChildren">
+    <a id="Item8_c0" onkeydown="return searchResults.NavChild(event,8,0)" onkeypress="return searchResults.NavChild(event,8,0)" onkeyup="return searchResults.NavChild(event,8,0)" class="SRScope" href="../sse_8h.html#a43e11de33821f27448feb163162ec895" target="_parent">operator<=(uint64_t, const r123m128i &): sse.h</a>
+    <a id="Item8_c1" onkeydown="return searchResults.NavChild(event,8,1)" onkeypress="return searchResults.NavChild(event,8,1)" onkeyup="return searchResults.NavChild(event,8,1)" class="SRScope" href="../sse_8h.html#a9ce245b77f0638255e7138190d0ff4fd" target="_parent">operator<=(const r123m128i &, const r123m128i &): sse.h</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3d">
+ <div class="SREntry">
+  <a id="Item9" onkeydown="return searchResults.Nav(event,9)" onkeypress="return searchResults.Nav(event,9)" onkeyup="return searchResults.Nav(event,9)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_operator_3d')">operator=</a>
+  <div class="SRChildren">
+    <a id="Item9_c0" onkeydown="return searchResults.NavChild(event,9,0)" onkeypress="return searchResults.NavChild(event,9,0)" onkeyup="return searchResults.NavChild(event,9,0)" class="SRScope" href="../structaesni1xm128i__key__t.html#acb24fef68c539f1a6ea217ee8ada185d" target="_parent">aesni1xm128i_key_t::operator=(const aesni1xm128i_ukey_t &uk)</a>
+    <a id="Item9_c1" onkeydown="return searchResults.NavChild(event,9,1)" onkeypress="return searchResults.NavChild(event,9,1)" onkeyup="return searchResults.NavChild(event,9,1)" class="SRScope" href="../structaesni1xm128i__key__t.html#a0290dac35d6f14706247217fb49bcd60" target="_parent">aesni1xm128i_key_t::operator=(const aesni4x32_ukey_t &uk)</a>
+    <a id="Item9_c2" onkeydown="return searchResults.NavChild(event,9,2)" onkeypress="return searchResults.NavChild(event,9,2)" onkeyup="return searchResults.NavChild(event,9,2)" class="SRScope" href="../structr123m128i.html#a9842fbc85102e0019cc58d97c28e2d02" target="_parent">r123m128i::operator=(const __m128i &rhs)</a>
+    <a id="Item9_c3" onkeydown="return searchResults.NavChild(event,9,3)" onkeypress="return searchResults.NavChild(event,9,3)" onkeyup="return searchResults.NavChild(event,9,3)" class="SRScope" href="../structr123m128i.html#a0da7ae920bce1b75efb91017ab6bc37c" target="_parent">r123m128i::operator=(uint64_t n)</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3d_3d">
+ <div class="SREntry">
+  <a id="Item10" onkeydown="return searchResults.Nav(event,10)" onkeypress="return searchResults.Nav(event,10)" onkeyup="return searchResults.Nav(event,10)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_operator_3d_3d')">operator==</a>
+  <div class="SRChildren">
+    <a id="Item10_c0" onkeydown="return searchResults.NavChild(event,10,0)" onkeypress="return searchResults.NavChild(event,10,0)" onkeyup="return searchResults.NavChild(event,10,0)" class="SRScope" href="../structr123array1x32.html#a61140a0fb8983a3018a2b98903d14047" target="_parent">r123array1x32::operator==()</a>
+    <a id="Item10_c1" onkeydown="return searchResults.NavChild(event,10,1)" onkeypress="return searchResults.NavChild(event,10,1)" onkeyup="return searchResults.NavChild(event,10,1)" class="SRScope" href="../structr123array2x32.html#aa8723e5786c66137e82405a532459b2d" target="_parent">r123array2x32::operator==()</a>
+    <a id="Item10_c2" onkeydown="return searchResults.NavChild(event,10,2)" onkeypress="return searchResults.NavChild(event,10,2)" onkeyup="return searchResults.NavChild(event,10,2)" class="SRScope" href="../structr123array4x32.html#a14123fe9160e559a83e61ab6c2901759" target="_parent">r123array4x32::operator==()</a>
+    <a id="Item10_c3" onkeydown="return searchResults.NavChild(event,10,3)" onkeypress="return searchResults.NavChild(event,10,3)" onkeyup="return searchResults.NavChild(event,10,3)" class="SRScope" href="../structr123array8x32.html#ae9ffa98997557c87b0a08b6ed2835155" target="_parent">r123array8x32::operator==()</a>
+    <a id="Item10_c4" onkeydown="return searchResults.NavChild(event,10,4)" onkeypress="return searchResults.NavChild(event,10,4)" onkeyup="return searchResults.NavChild(event,10,4)" class="SRScope" href="../structr123array1x64.html#a65018edc8a8596e8bdb7500926544a4a" target="_parent">r123array1x64::operator==()</a>
+    <a id="Item10_c5" onkeydown="return searchResults.NavChild(event,10,5)" onkeypress="return searchResults.NavChild(event,10,5)" onkeyup="return searchResults.NavChild(event,10,5)" class="SRScope" href="../structr123array2x64.html#aa690f425f846ff9908a734eb720df573" target="_parent">r123array2x64::operator==()</a>
+    <a id="Item10_c6" onkeydown="return searchResults.NavChild(event,10,6)" onkeypress="return searchResults.NavChild(event,10,6)" onkeyup="return searchResults.NavChild(event,10,6)" class="SRScope" href="../structr123array4x64.html#afada659cc4a54a1416dca2522885cef1" target="_parent">r123array4x64::operator==()</a>
+    <a id="Item10_c7" onkeydown="return searchResults.NavChild(event,10,7)" onkeypress="return searchResults.NavChild(event,10,7)" onkeyup="return searchResults.NavChild(event,10,7)" class="SRScope" href="../structr123array16x8.html#a4d3ed48f2b716382ea874a968a2b7174" target="_parent">r123array16x8::operator==()</a>
+    <a id="Item10_c8" onkeydown="return searchResults.NavChild(event,10,8)" onkeypress="return searchResults.NavChild(event,10,8)" onkeyup="return searchResults.NavChild(event,10,8)" class="SRScope" href="../structr123array1xm128i.html#aa459abf9fe8d15019860de5b3b0cddf8" target="_parent">r123array1xm128i::operator==()</a>
+    <a id="Item10_c9" onkeydown="return searchResults.NavChild(event,10,9)" onkeypress="return searchResults.NavChild(event,10,9)" onkeyup="return searchResults.NavChild(event,10,9)" class="SRScope" href="../sse_8h.html#ab1389a6d8b14bc380c6d6a6d4de8853e" target="_parent">operator==(const r123m128i &lhs, const r123m128i &rhs): sse.h</a>
+    <a id="Item10_c10" onkeydown="return searchResults.NavChild(event,10,10)" onkeypress="return searchResults.NavChild(event,10,10)" onkeyup="return searchResults.NavChild(event,10,10)" class="SRScope" href="../sse_8h.html#a01fbbba16839c5938b3fa29668870db2" target="_parent">operator==(uint64_t lhs, const r123m128i &rhs): sse.h</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3e">
+ <div class="SREntry">
+  <a id="Item11" onkeydown="return searchResults.Nav(event,11)" onkeypress="return searchResults.Nav(event,11)" onkeyup="return searchResults.Nav(event,11)" class="SRSymbol" href="../sse_8h.html#ad07b59f8110eac57511ee8c2fa697f93" target="_parent">operator></a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3e_3d">
+ <div class="SREntry">
+  <a id="Item12" onkeydown="return searchResults.Nav(event,12)" onkeypress="return searchResults.Nav(event,12)" onkeyup="return searchResults.Nav(event,12)" class="SRSymbol" href="../sse_8h.html#aa7bb0ad8bfceb39a1b71262b9476e151" target="_parent">operator>=</a>
+  <span class="SRScope">sse.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3e_3e">
+ <div class="SREntry">
+  <a id="Item13" onkeydown="return searchResults.Nav(event,13)" onkeypress="return searchResults.Nav(event,13)" onkeyup="return searchResults.Nav(event,13)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_operator_3e_3e')">operator>></a>
+  <div class="SRChildren">
+    <a id="Item13_c0" onkeydown="return searchResults.NavChild(event,13,0)" onkeypress="return searchResults.NavChild(event,13,0)" onkeyup="return searchResults.NavChild(event,13,0)" class="SRScope" href="../array_8h.html#ace3112deae6709884feac904b1c260a1" target="_parent">operator>>(std::istream &is, r123array1x32 &a): array.h</a>
+    <a id="Item13_c1" onkeydown="return searchResults.NavChild(event,13,1)" onkeypress="return searchResults.NavChild(event,13,1)" onkeyup="return searchResults.NavChild(event,13,1)" class="SRScope" href="../array_8h.html#a41bb2d7e99cf51ca5927a074d1424a03" target="_parent">operator>>(std::istream &is, r123array2x32 &a): array.h</a>
+    <a id="Item13_c2" onkeydown="return searchResults.NavChild(event,13,2)" onkeypress="return searchResults.NavChild(event,13,2)" onkeyup="return searchResults.NavChild(event,13,2)" class="SRScope" href="../array_8h.html#a2782402f8b3941e104e01c317fd4b099" target="_parent">operator>>(std::istream &is, r123array4x32 &a): array.h</a>
+    <a id="Item13_c3" onkeydown="return searchResults.NavChild(event,13,3)" onkeypress="return searchResults.NavChild(event,13,3)" onkeyup="return searchResults.NavChild(event,13,3)" class="SRScope" href="../array_8h.html#ae63a28cc2f1e69f63a4402c8b83663b4" target="_parent">operator>>(std::istream &is, r123array8x32 &a): array.h</a>
+    <a id="Item13_c4" onkeydown="return searchResults.NavChild(event,13,4)" onkeypress="return searchResults.NavChild(event,13,4)" onkeyup="return searchResults.NavChild(event,13,4)" class="SRScope" href="../array_8h.html#a3cdf7b897463996d6eda01443dd669c5" target="_parent">operator>>(std::istream &is, r123array1x64 &a): array.h</a>
+    <a id="Item13_c5" onkeydown="return searchResults.NavChild(event,13,5)" onkeypress="return searchResults.NavChild(event,13,5)" onkeyup="return searchResults.NavChild(event,13,5)" class="SRScope" href="../array_8h.html#a7b32dd7601d0a11b72583a841abc8fca" target="_parent">operator>>(std::istream &is, r123array2x64 &a): array.h</a>
+    <a id="Item13_c6" onkeydown="return searchResults.NavChild(event,13,6)" onkeypress="return searchResults.NavChild(event,13,6)" onkeyup="return searchResults.NavChild(event,13,6)" class="SRScope" href="../array_8h.html#a60aa3cdbb34ced56c0c7c82371f2b30c" target="_parent">operator>>(std::istream &is, r123array4x64 &a): array.h</a>
+    <a id="Item13_c7" onkeydown="return searchResults.NavChild(event,13,7)" onkeypress="return searchResults.NavChild(event,13,7)" onkeyup="return searchResults.NavChild(event,13,7)" class="SRScope" href="../array_8h.html#abb64305331045d211dfa35be0d0cc6a9" target="_parent">operator>>(std::istream &is, r123array16x8 &a): array.h</a>
+    <a id="Item13_c8" onkeydown="return searchResults.NavChild(event,13,8)" onkeypress="return searchResults.NavChild(event,13,8)" onkeyup="return searchResults.NavChild(event,13,8)" class="SRScope" href="../array_8h.html#af831caf1f33e800dad6a659523525a78" target="_parent">operator>>(std::istream &is, r123array1xm128i &a): array.h</a>
+    <a id="Item13_c9" onkeydown="return searchResults.NavChild(event,13,9)" onkeypress="return searchResults.NavChild(event,13,9)" onkeyup="return searchResults.NavChild(event,13,9)" class="SRScope" href="../sse_8h.html#a202aef4bea97c2203a82676cb6abba40" target="_parent">operator>>(std::istream &is, r123m128i &m): sse.h</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_5b_5d">
+ <div class="SREntry">
+  <a id="Item14" onkeydown="return searchResults.Nav(event,14)" onkeypress="return searchResults.Nav(event,14)" onkeyup="return searchResults.Nav(event,14)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_operator_5b_5d')">operator[]</a>
+  <div class="SRChildren">
+    <a id="Item14_c0" onkeydown="return searchResults.NavChild(event,14,0)" onkeypress="return searchResults.NavChild(event,14,0)" onkeyup="return searchResults.NavChild(event,14,0)" class="SRScope" href="../structr123array1x32.html#aa47bb157c60858c1b0ef69df79646a3b" target="_parent">r123array1x32::operator[](size_type i)</a>
+    <a id="Item14_c1" onkeydown="return searchResults.NavChild(event,14,1)" onkeypress="return searchResults.NavChild(event,14,1)" onkeyup="return searchResults.NavChild(event,14,1)" class="SRScope" href="../structr123array1x32.html#a05cf21fa6a647c73763da02d4b7e2f2a" target="_parent">r123array1x32::operator[](size_type i) const </a>
+    <a id="Item14_c2" onkeydown="return searchResults.NavChild(event,14,2)" onkeypress="return searchResults.NavChild(event,14,2)" onkeyup="return searchResults.NavChild(event,14,2)" class="SRScope" href="../structr123array2x32.html#a9926f6938472682c5d31a742378f17de" target="_parent">r123array2x32::operator[](size_type i)</a>
+    <a id="Item14_c3" onkeydown="return searchResults.NavChild(event,14,3)" onkeypress="return searchResults.NavChild(event,14,3)" onkeyup="return searchResults.NavChild(event,14,3)" class="SRScope" href="../structr123array2x32.html#a0ae33a5edf89f9f12edec38209b02464" target="_parent">r123array2x32::operator[](size_type i) const </a>
+    <a id="Item14_c4" onkeydown="return searchResults.NavChild(event,14,4)" onkeypress="return searchResults.NavChild(event,14,4)" onkeyup="return searchResults.NavChild(event,14,4)" class="SRScope" href="../structr123array4x32.html#aa1fef4a0eb551a70d1ec5d766efcffb5" target="_parent">r123array4x32::operator[](size_type i)</a>
+    <a id="Item14_c5" onkeydown="return searchResults.NavChild(event,14,5)" onkeypress="return searchResults.NavChild(event,14,5)" onkeyup="return searchResults.NavChild(event,14,5)" class="SRScope" href="../structr123array4x32.html#a3161a139a59a1196398d5d4b81d740df" target="_parent">r123array4x32::operator[](size_type i) const </a>
+    <a id="Item14_c6" onkeydown="return searchResults.NavChild(event,14,6)" onkeypress="return searchResults.NavChild(event,14,6)" onkeyup="return searchResults.NavChild(event,14,6)" class="SRScope" href="../structr123array8x32.html#a2b0d17077d419e9f296318161fcc0470" target="_parent">r123array8x32::operator[](size_type i)</a>
+    <a id="Item14_c7" onkeydown="return searchResults.NavChild(event,14,7)" onkeypress="return searchResults.NavChild(event,14,7)" onkeyup="return searchResults.NavChild(event,14,7)" class="SRScope" href="../structr123array8x32.html#ace7ad1b4aca1ad419c373d9cff872805" target="_parent">r123array8x32::operator[](size_type i) const </a>
+    <a id="Item14_c8" onkeydown="return searchResults.NavChild(event,14,8)" onkeypress="return searchResults.NavChild(event,14,8)" onkeyup="return searchResults.NavChild(event,14,8)" class="SRScope" href="../structr123array1x64.html#a10fbaabd5223f286d6e396e15227569c" target="_parent">r123array1x64::operator[](size_type i)</a>
+    <a id="Item14_c9" onkeydown="return searchResults.NavChild(event,14,9)" onkeypress="return searchResults.NavChild(event,14,9)" onkeyup="return searchResults.NavChild(event,14,9)" class="SRScope" href="../structr123array1x64.html#aa13b237c78d719ecfb5a59cdd557c889" target="_parent">r123array1x64::operator[](size_type i) const </a>
+    <a id="Item14_c10" onkeydown="return searchResults.NavChild(event,14,10)" onkeypress="return searchResults.NavChild(event,14,10)" onkeyup="return searchResults.NavChild(event,14,10)" class="SRScope" href="../structr123array2x64.html#a7352cdb2c025b0373ece5c84409a1b1d" target="_parent">r123array2x64::operator[](size_type i)</a>
+    <a id="Item14_c11" onkeydown="return searchResults.NavChild(event,14,11)" onkeypress="return searchResults.NavChild(event,14,11)" onkeyup="return searchResults.NavChild(event,14,11)" class="SRScope" href="../structr123array2x64.html#ae534a7e32afae58303ccc8379408551b" target="_parent">r123array2x64::operator[](size_type i) const </a>
+    <a id="Item14_c12" onkeydown="return searchResults.NavChild(event,14,12)" onkeypress="return searchResults.NavChild(event,14,12)" onkeyup="return searchResults.NavChild(event,14,12)" class="SRScope" href="../structr123array4x64.html#adf867ee2ffc437a3f358431d3729a33d" target="_parent">r123array4x64::operator[](size_type i)</a>
+    <a id="Item14_c13" onkeydown="return searchResults.NavChild(event,14,13)" onkeypress="return searchResults.NavChild(event,14,13)" onkeyup="return searchResults.NavChild(event,14,13)" class="SRScope" href="../structr123array4x64.html#a27c2001bf5af042aa450f17637646bd3" target="_parent">r123array4x64::operator[](size_type i) const </a>
+    <a id="Item14_c14" onkeydown="return searchResults.NavChild(event,14,14)" onkeypress="return searchResults.NavChild(event,14,14)" onkeyup="return searchResults.NavChild(event,14,14)" class="SRScope" href="../structr123array16x8.html#abe9f2b18e2e3b89e00725f6fa69b8236" target="_parent">r123array16x8::operator[](size_type i)</a>
+    <a id="Item14_c15" onkeydown="return searchResults.NavChild(event,14,15)" onkeypress="return searchResults.NavChild(event,14,15)" onkeyup="return searchResults.NavChild(event,14,15)" class="SRScope" href="../structr123array16x8.html#a013713c00f6e8a5adb7be77388c22d8f" target="_parent">r123array16x8::operator[](size_type i) const </a>
+    <a id="Item14_c16" onkeydown="return searchResults.NavChild(event,14,16)" onkeypress="return searchResults.NavChild(event,14,16)" onkeyup="return searchResults.NavChild(event,14,16)" class="SRScope" href="../structr123array1xm128i.html#aba0d6532c59c3c879bcfbad16cab5748" target="_parent">r123array1xm128i::operator[](size_type i)</a>
+    <a id="Item14_c17" onkeydown="return searchResults.NavChild(event,14,17)" onkeypress="return searchResults.NavChild(event,14,17)" onkeyup="return searchResults.NavChild(event,14,17)" class="SRScope" href="../structr123array1xm128i.html#aaa3ccbe6c0838b5bdafcd0dfa3c2c074" target="_parent">r123array1xm128i::operator[](size_type i) const </a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/functions_70.html b/lib/Random123-1.08/docs/html/search/functions_70.html
new file mode 100644
index 0000000..2d6da9c
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/functions_70.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_philox2x32_5fr">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../philox_8h.html#acf0a4b82a9fd3f4695c04210df0cbefe" target="_parent">philox2x32_R</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x32keyinit">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../philox_8h.html#ae5dd55c0697c37598c1fbce66457e124" target="_parent">philox2x32keyinit</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x64_5fr">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../philox_8h.html#a03c068219ecebcc870afa14a330c0735" target="_parent">philox2x64_R</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x64keyinit">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../philox_8h.html#a36b9225fcb73f91d116b424f721275f1" target="_parent">philox2x64keyinit</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x32_5fr">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../philox_8h.html#a205fdd66786445b3e1c4157bd96d0967" target="_parent">philox4x32_R</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x32keyinit">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../philox_8h.html#a5a012bb440c039eda46802b447c31851" target="_parent">philox4x32keyinit</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x64_5fr">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="../philox_8h.html#ac72571943d83caf2f79b7bd309a2ae92" target="_parent">philox4x64_R</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x64keyinit">
+ <div class="SREntry">
+  <a id="Item7" onkeydown="return searchResults.Nav(event,7)" onkeypress="return searchResults.Nav(event,7)" onkeyup="return searchResults.Nav(event,7)" class="SRSymbol" href="../philox_8h.html#a101674ffc206e3bd600f9544de0c3c4a" target="_parent">philox4x64keyinit</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/functions_72.html b/lib/Random123-1.08/docs/html/search/functions_72.html
new file mode 100644
index 0000000..6dbb56b
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/functions_72.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_r123_5fno_5fmacro_5fsubst">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_r123_5fno_5fmacro_5fsubst')">R123_NO_MACRO_SUBST</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../classr123_1_1MicroURNG.html#aa05c857c01053cf9185406d69757b101" target="_parent">r123::MicroURNG::R123_NO_MACRO_SUBST()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../classr123_1_1MicroURNG.html#a3af623b6366d6e848d67d72e4b0f363c" target="_parent">r123::MicroURNG::R123_NO_MACRO_SUBST()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123_1_1Engine.html#af5441fc62932c3d099f8b16150d2aa81" target="_parent">r123::Engine::R123_NO_MACRO_SUBST()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123_1_1Engine.html#a112318f7d0015ecf4c3c6a8a5c76371b" target="_parent">r123::Engine::R123_NO_MACRO_SUBST()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_rbegin">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_rbegin')">rbegin</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../structr123array1x32.html#a0c91373623da349c09b952f616b7f5e9" target="_parent">r123array1x32::rbegin()</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../structr123array1x32.html#aacb0604c956b8e50b057a6034c78069c" target="_parent">r123array1x32::rbegin() const </a>
+    <a id="Item1_c2" onkeydown="return searchResults.NavChild(event,1,2)" onkeypress="return searchResults.NavChild(event,1,2)" onkeyup="return searchResults.NavChild(event,1,2)" class="SRScope" href="../structr123array2x32.html#a54e96198e6cd511dc147348f274b0784" target="_parent">r123array2x32::rbegin()</a>
+    <a id="Item1_c3" onkeydown="return searchResults.NavChild(event,1,3)" onkeypress="return searchResults.NavChild(event,1,3)" onkeyup="return searchResults.NavChild(event,1,3)" class="SRScope" href="../structr123array2x32.html#a00afca78e25bbb9e0b00e6ab95ecb162" target="_parent">r123array2x32::rbegin() const </a>
+    <a id="Item1_c4" onkeydown="return searchResults.NavChild(event,1,4)" onkeypress="return searchResults.NavChild(event,1,4)" onkeyup="return searchResults.NavChild(event,1,4)" class="SRScope" href="../structr123array4x32.html#aea9aae067d8347aa53a12a4c9948ae9a" target="_parent">r123array4x32::rbegin()</a>
+    <a id="Item1_c5" onkeydown="return searchResults.NavChild(event,1,5)" onkeypress="return searchResults.NavChild(event,1,5)" onkeyup="return searchResults.NavChild(event,1,5)" class="SRScope" href="../structr123array4x32.html#aadb177f7f316ae47deeea20a686e7909" target="_parent">r123array4x32::rbegin() const </a>
+    <a id="Item1_c6" onkeydown="return searchResults.NavChild(event,1,6)" onkeypress="return searchResults.NavChild(event,1,6)" onkeyup="return searchResults.NavChild(event,1,6)" class="SRScope" href="../structr123array8x32.html#a0a143a573df3282ba5b9cb2190047cca" target="_parent">r123array8x32::rbegin()</a>
+    <a id="Item1_c7" onkeydown="return searchResults.NavChild(event,1,7)" onkeypress="return searchResults.NavChild(event,1,7)" onkeyup="return searchResults.NavChild(event,1,7)" class="SRScope" href="../structr123array8x32.html#a959345559456fbc9e7e72d03a72a032c" target="_parent">r123array8x32::rbegin() const </a>
+    <a id="Item1_c8" onkeydown="return searchResults.NavChild(event,1,8)" onkeypress="return searchResults.NavChild(event,1,8)" onkeyup="return searchResults.NavChild(event,1,8)" class="SRScope" href="../structr123array1x64.html#a56196452051f26a10a4bb3c3d7b75fd0" target="_parent">r123array1x64::rbegin()</a>
+    <a id="Item1_c9" onkeydown="return searchResults.NavChild(event,1,9)" onkeypress="return searchResults.NavChild(event,1,9)" onkeyup="return searchResults.NavChild(event,1,9)" class="SRScope" href="../structr123array1x64.html#a5b080aafd94d77efda03730b6f853334" target="_parent">r123array1x64::rbegin() const </a>
+    <a id="Item1_c10" onkeydown="return searchResults.NavChild(event,1,10)" onkeypress="return searchResults.NavChild(event,1,10)" onkeyup="return searchResults.NavChild(event,1,10)" class="SRScope" href="../structr123array2x64.html#a6888b98627db6056afe3f4ee3396a9a6" target="_parent">r123array2x64::rbegin()</a>
+    <a id="Item1_c11" onkeydown="return searchResults.NavChild(event,1,11)" onkeypress="return searchResults.NavChild(event,1,11)" onkeyup="return searchResults.NavChild(event,1,11)" class="SRScope" href="../structr123array2x64.html#ad6720531d85d0c284ce32cde3b82a9da" target="_parent">r123array2x64::rbegin() const </a>
+    <a id="Item1_c12" onkeydown="return searchResults.NavChild(event,1,12)" onkeypress="return searchResults.NavChild(event,1,12)" onkeyup="return searchResults.NavChild(event,1,12)" class="SRScope" href="../structr123array4x64.html#a102f75427ce01bea725da02b975834b5" target="_parent">r123array4x64::rbegin()</a>
+    <a id="Item1_c13" onkeydown="return searchResults.NavChild(event,1,13)" onkeypress="return searchResults.NavChild(event,1,13)" onkeyup="return searchResults.NavChild(event,1,13)" class="SRScope" href="../structr123array4x64.html#a7ccc255ba0e1803080b117703dc3dc70" target="_parent">r123array4x64::rbegin() const </a>
+    <a id="Item1_c14" onkeydown="return searchResults.NavChild(event,1,14)" onkeypress="return searchResults.NavChild(event,1,14)" onkeyup="return searchResults.NavChild(event,1,14)" class="SRScope" href="../structr123array16x8.html#a5023769f3e418e15a707501aaaac5487" target="_parent">r123array16x8::rbegin()</a>
+    <a id="Item1_c15" onkeydown="return searchResults.NavChild(event,1,15)" onkeypress="return searchResults.NavChild(event,1,15)" onkeyup="return searchResults.NavChild(event,1,15)" class="SRScope" href="../structr123array16x8.html#a5da4b6af6ebaf8cc8204713a993a860c" target="_parent">r123array16x8::rbegin() const </a>
+    <a id="Item1_c16" onkeydown="return searchResults.NavChild(event,1,16)" onkeypress="return searchResults.NavChild(event,1,16)" onkeyup="return searchResults.NavChild(event,1,16)" class="SRScope" href="../structr123array1xm128i.html#a78034de911e765ed64162c894fe2ce05" target="_parent">r123array1xm128i::rbegin()</a>
+    <a id="Item1_c17" onkeydown="return searchResults.NavChild(event,1,17)" onkeypress="return searchResults.NavChild(event,1,17)" onkeyup="return searchResults.NavChild(event,1,17)" class="SRScope" href="../structr123array1xm128i.html#acd4e73f214be1dfaae5d2e20559083eb" target="_parent">r123array1xm128i::rbegin() const </a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_rend">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_rend')">rend</a>
+  <div class="SRChildren">
+    <a id="Item2_c0" onkeydown="return searchResults.NavChild(event,2,0)" onkeypress="return searchResults.NavChild(event,2,0)" onkeyup="return searchResults.NavChild(event,2,0)" class="SRScope" href="../structr123array1x32.html#a7a55225361d3e9e6f037daa13d340fc4" target="_parent">r123array1x32::rend()</a>
+    <a id="Item2_c1" onkeydown="return searchResults.NavChild(event,2,1)" onkeypress="return searchResults.NavChild(event,2,1)" onkeyup="return searchResults.NavChild(event,2,1)" class="SRScope" href="../structr123array1x32.html#aad87615e3d9d32467d2f139be5be08ce" target="_parent">r123array1x32::rend() const </a>
+    <a id="Item2_c2" onkeydown="return searchResults.NavChild(event,2,2)" onkeypress="return searchResults.NavChild(event,2,2)" onkeyup="return searchResults.NavChild(event,2,2)" class="SRScope" href="../structr123array2x32.html#a383edbf33737eb3e5098d6da4ed326f8" target="_parent">r123array2x32::rend()</a>
+    <a id="Item2_c3" onkeydown="return searchResults.NavChild(event,2,3)" onkeypress="return searchResults.NavChild(event,2,3)" onkeyup="return searchResults.NavChild(event,2,3)" class="SRScope" href="../structr123array2x32.html#ab3f0841dcd9cea6255406b7bc6363621" target="_parent">r123array2x32::rend() const </a>
+    <a id="Item2_c4" onkeydown="return searchResults.NavChild(event,2,4)" onkeypress="return searchResults.NavChild(event,2,4)" onkeyup="return searchResults.NavChild(event,2,4)" class="SRScope" href="../structr123array4x32.html#a368f69bdd03a9af1c6254daf98496dbd" target="_parent">r123array4x32::rend()</a>
+    <a id="Item2_c5" onkeydown="return searchResults.NavChild(event,2,5)" onkeypress="return searchResults.NavChild(event,2,5)" onkeyup="return searchResults.NavChild(event,2,5)" class="SRScope" href="../structr123array4x32.html#a7b2af2db2af5f90c8a3f5f7014193d72" target="_parent">r123array4x32::rend() const </a>
+    <a id="Item2_c6" onkeydown="return searchResults.NavChild(event,2,6)" onkeypress="return searchResults.NavChild(event,2,6)" onkeyup="return searchResults.NavChild(event,2,6)" class="SRScope" href="../structr123array8x32.html#aa84fc75185aedca379d23c0220b5c64a" target="_parent">r123array8x32::rend()</a>
+    <a id="Item2_c7" onkeydown="return searchResults.NavChild(event,2,7)" onkeypress="return searchResults.NavChild(event,2,7)" onkeyup="return searchResults.NavChild(event,2,7)" class="SRScope" href="../structr123array8x32.html#afcf1ea68c3cd0ce7ff6de11d3030eb93" target="_parent">r123array8x32::rend() const </a>
+    <a id="Item2_c8" onkeydown="return searchResults.NavChild(event,2,8)" onkeypress="return searchResults.NavChild(event,2,8)" onkeyup="return searchResults.NavChild(event,2,8)" class="SRScope" href="../structr123array1x64.html#aa0f756e941d0e417355d940fd0ed3a33" target="_parent">r123array1x64::rend()</a>
+    <a id="Item2_c9" onkeydown="return searchResults.NavChild(event,2,9)" onkeypress="return searchResults.NavChild(event,2,9)" onkeyup="return searchResults.NavChild(event,2,9)" class="SRScope" href="../structr123array1x64.html#a19f9d7dd7371c20fc5001d864da453ff" target="_parent">r123array1x64::rend() const </a>
+    <a id="Item2_c10" onkeydown="return searchResults.NavChild(event,2,10)" onkeypress="return searchResults.NavChild(event,2,10)" onkeyup="return searchResults.NavChild(event,2,10)" class="SRScope" href="../structr123array2x64.html#ad1e373b457921fc672ed8892180431eb" target="_parent">r123array2x64::rend()</a>
+    <a id="Item2_c11" onkeydown="return searchResults.NavChild(event,2,11)" onkeypress="return searchResults.NavChild(event,2,11)" onkeyup="return searchResults.NavChild(event,2,11)" class="SRScope" href="../structr123array2x64.html#ad96f87786a8a277bf553d0c5584c20c1" target="_parent">r123array2x64::rend() const </a>
+    <a id="Item2_c12" onkeydown="return searchResults.NavChild(event,2,12)" onkeypress="return searchResults.NavChild(event,2,12)" onkeyup="return searchResults.NavChild(event,2,12)" class="SRScope" href="../structr123array4x64.html#a71f59163070cb4cfd7ddda6f4f8576a1" target="_parent">r123array4x64::rend()</a>
+    <a id="Item2_c13" onkeydown="return searchResults.NavChild(event,2,13)" onkeypress="return searchResults.NavChild(event,2,13)" onkeyup="return searchResults.NavChild(event,2,13)" class="SRScope" href="../structr123array4x64.html#a25538a452f6e709bacfc9f49b7216280" target="_parent">r123array4x64::rend() const </a>
+    <a id="Item2_c14" onkeydown="return searchResults.NavChild(event,2,14)" onkeypress="return searchResults.NavChild(event,2,14)" onkeyup="return searchResults.NavChild(event,2,14)" class="SRScope" href="../structr123array16x8.html#a252b937d65e7b04e5bc507d43643441f" target="_parent">r123array16x8::rend()</a>
+    <a id="Item2_c15" onkeydown="return searchResults.NavChild(event,2,15)" onkeypress="return searchResults.NavChild(event,2,15)" onkeyup="return searchResults.NavChild(event,2,15)" class="SRScope" href="../structr123array16x8.html#a286fef704fcf11e9f00d73703b7ab36b" target="_parent">r123array16x8::rend() const </a>
+    <a id="Item2_c16" onkeydown="return searchResults.NavChild(event,2,16)" onkeypress="return searchResults.NavChild(event,2,16)" onkeyup="return searchResults.NavChild(event,2,16)" class="SRScope" href="../structr123array1xm128i.html#aeb47d483223e3e29f6ad156e5c356a20" target="_parent">r123array1xm128i::rend()</a>
+    <a id="Item2_c17" onkeydown="return searchResults.NavChild(event,2,17)" onkeypress="return searchResults.NavChild(event,2,17)" onkeyup="return searchResults.NavChild(event,2,17)" class="SRScope" href="../structr123array1xm128i.html#a1599d2154e1f407bef2d556c985b0c21" target="_parent">r123array1xm128i::rend() const </a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_reset">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../classr123_1_1MicroURNG.html#add2f214254ddc2291e3b2c8b5dbe791a" target="_parent">reset</a>
+  <span class="SRScope">r123::MicroURNG</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/functions_73.html b/lib/Random123-1.08/docs/html/search/functions_73.html
new file mode 100644
index 0000000..6776037
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/functions_73.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_seed">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_seed')">seed</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#adf914fa4384acfcfa1750fd47b758f42" target="_parent">r123array1x32::seed()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array2x32.html#a31cf9b80bbcc3c976681b878b7afa046" target="_parent">r123array2x32::seed()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array4x32.html#acdaad089dc0e44da5818ebda8404bd16" target="_parent">r123array4x32::seed()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array8x32.html#a93139b379ce88e16f75eb9edcf40b357" target="_parent">r123array8x32::seed()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array1x64.html#a69be3aa9c2588ce86b5ebb72649ce684" target="_parent">r123array1x64::seed()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array2x64.html#a3e5afc5e4c6886611630cec365d8397b" target="_parent">r123array2x64::seed()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array4x64.html#a6f0133930367a2260ed5a132bf737131" target="_parent">r123array4x64::seed()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array16x8.html#aef0741829d359c31ad913a6770661895" target="_parent">r123array16x8::seed()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1xm128i.html#a6645aeddeb992559150089c49ac335c8" target="_parent">r123array1xm128i::seed()</a>
+    <a id="Item0_c9" onkeydown="return searchResults.NavChild(event,0,9)" onkeypress="return searchResults.NavChild(event,0,9)" onkeyup="return searchResults.NavChild(event,0,9)" class="SRScope" href="../structr123_1_1Engine.html#a93429593bdb12b202b4b8ed38fe08bc4" target="_parent">r123::Engine::seed(result_type r)</a>
+    <a id="Item0_c10" onkeydown="return searchResults.NavChild(event,0,10)" onkeypress="return searchResults.NavChild(event,0,10)" onkeyup="return searchResults.NavChild(event,0,10)" class="SRScope" href="../structr123_1_1Engine.html#ac4d05ee820a1eb70e76cabb14645dad4" target="_parent">r123::Engine::seed(SeedSeq &s)</a>
+    <a id="Item0_c11" onkeydown="return searchResults.NavChild(event,0,11)" onkeypress="return searchResults.NavChild(event,0,11)" onkeyup="return searchResults.NavChild(event,0,11)" class="SRScope" href="../structr123_1_1Engine.html#aff36bc97d11bc66f6c0edb75d8dc88e5" target="_parent">r123::Engine::seed()</a>
+    <a id="Item0_c12" onkeydown="return searchResults.NavChild(event,0,12)" onkeypress="return searchResults.NavChild(event,0,12)" onkeyup="return searchResults.NavChild(event,0,12)" class="SRScope" href="../structr123_1_1Engine.html#a5c4d68dbbccfc71f467f3c902f5b93da" target="_parent">r123::Engine::seed(const ukey_type &uk)</a>
+    <a id="Item0_c13" onkeydown="return searchResults.NavChild(event,0,13)" onkeypress="return searchResults.NavChild(event,0,13)" onkeyup="return searchResults.NavChild(event,0,13)" class="SRScope" href="../structr123_1_1Engine.html#a7bd6d3417cefb904c879f41d2c29e15e" target="_parent">r123::Engine::seed(ukey_type &uk)</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_setcounter">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structr123_1_1Engine.html#a6104bf5ee89450403379d5680bfae172" target="_parent">setcounter</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_size">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_size')">size</a>
+  <div class="SRChildren">
+    <a id="Item2_c0" onkeydown="return searchResults.NavChild(event,2,0)" onkeypress="return searchResults.NavChild(event,2,0)" onkeyup="return searchResults.NavChild(event,2,0)" class="SRScope" href="../structr123array1x32.html#a4cbaf3feeaad0bb7227d065294240561" target="_parent">r123array1x32::size()</a>
+    <a id="Item2_c1" onkeydown="return searchResults.NavChild(event,2,1)" onkeypress="return searchResults.NavChild(event,2,1)" onkeyup="return searchResults.NavChild(event,2,1)" class="SRScope" href="../structr123array2x32.html#ad3d7310bd3ced1bfb05cbe4f3e753490" target="_parent">r123array2x32::size()</a>
+    <a id="Item2_c2" onkeydown="return searchResults.NavChild(event,2,2)" onkeypress="return searchResults.NavChild(event,2,2)" onkeyup="return searchResults.NavChild(event,2,2)" class="SRScope" href="../structr123array4x32.html#a1da4bfacdcd4a520a227bc5c2cff6a4b" target="_parent">r123array4x32::size()</a>
+    <a id="Item2_c3" onkeydown="return searchResults.NavChild(event,2,3)" onkeypress="return searchResults.NavChild(event,2,3)" onkeyup="return searchResults.NavChild(event,2,3)" class="SRScope" href="../structr123array8x32.html#aa4025fb7c1ef2c3376bdc9ae88b91553" target="_parent">r123array8x32::size()</a>
+    <a id="Item2_c4" onkeydown="return searchResults.NavChild(event,2,4)" onkeypress="return searchResults.NavChild(event,2,4)" onkeyup="return searchResults.NavChild(event,2,4)" class="SRScope" href="../structr123array1x64.html#a81dba857004f49f48cb0712edaa39e76" target="_parent">r123array1x64::size()</a>
+    <a id="Item2_c5" onkeydown="return searchResults.NavChild(event,2,5)" onkeypress="return searchResults.NavChild(event,2,5)" onkeyup="return searchResults.NavChild(event,2,5)" class="SRScope" href="../structr123array2x64.html#a10e19c13a970156c4fc18fa070dc9756" target="_parent">r123array2x64::size()</a>
+    <a id="Item2_c6" onkeydown="return searchResults.NavChild(event,2,6)" onkeypress="return searchResults.NavChild(event,2,6)" onkeyup="return searchResults.NavChild(event,2,6)" class="SRScope" href="../structr123array4x64.html#a303c3feaf0783e99292c3220613ea903" target="_parent">r123array4x64::size()</a>
+    <a id="Item2_c7" onkeydown="return searchResults.NavChild(event,2,7)" onkeypress="return searchResults.NavChild(event,2,7)" onkeyup="return searchResults.NavChild(event,2,7)" class="SRScope" href="../structr123array16x8.html#a9a31da5cdf154eba3e44af4e51002a15" target="_parent">r123array16x8::size()</a>
+    <a id="Item2_c8" onkeydown="return searchResults.NavChild(event,2,8)" onkeypress="return searchResults.NavChild(event,2,8)" onkeyup="return searchResults.NavChild(event,2,8)" class="SRScope" href="../structr123array1xm128i.html#a3f272a3884d1d5ca7a207fb31a270617" target="_parent">r123array1xm128i::size()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_swap">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_swap')">swap</a>
+  <div class="SRChildren">
+    <a id="Item3_c0" onkeydown="return searchResults.NavChild(event,3,0)" onkeypress="return searchResults.NavChild(event,3,0)" onkeyup="return searchResults.NavChild(event,3,0)" class="SRScope" href="../structr123array1x32.html#afdd8df41333430593d31350bd12db11a" target="_parent">r123array1x32::swap()</a>
+    <a id="Item3_c1" onkeydown="return searchResults.NavChild(event,3,1)" onkeypress="return searchResults.NavChild(event,3,1)" onkeyup="return searchResults.NavChild(event,3,1)" class="SRScope" href="../structr123array2x32.html#a1eac99d2198007201b9c0040a18b258c" target="_parent">r123array2x32::swap()</a>
+    <a id="Item3_c2" onkeydown="return searchResults.NavChild(event,3,2)" onkeypress="return searchResults.NavChild(event,3,2)" onkeyup="return searchResults.NavChild(event,3,2)" class="SRScope" href="../structr123array4x32.html#a3e6f9b7de70de3386bcd2ba44ad68fb5" target="_parent">r123array4x32::swap()</a>
+    <a id="Item3_c3" onkeydown="return searchResults.NavChild(event,3,3)" onkeypress="return searchResults.NavChild(event,3,3)" onkeyup="return searchResults.NavChild(event,3,3)" class="SRScope" href="../structr123array8x32.html#a04c88fca3a8cc3b579e9fc480629888e" target="_parent">r123array8x32::swap()</a>
+    <a id="Item3_c4" onkeydown="return searchResults.NavChild(event,3,4)" onkeypress="return searchResults.NavChild(event,3,4)" onkeyup="return searchResults.NavChild(event,3,4)" class="SRScope" href="../structr123array1x64.html#a6f929a34461c49c9571eedc1df65fd20" target="_parent">r123array1x64::swap()</a>
+    <a id="Item3_c5" onkeydown="return searchResults.NavChild(event,3,5)" onkeypress="return searchResults.NavChild(event,3,5)" onkeyup="return searchResults.NavChild(event,3,5)" class="SRScope" href="../structr123array2x64.html#a78ea0dba10b77c9f228108df9ab09c9d" target="_parent">r123array2x64::swap()</a>
+    <a id="Item3_c6" onkeydown="return searchResults.NavChild(event,3,6)" onkeypress="return searchResults.NavChild(event,3,6)" onkeyup="return searchResults.NavChild(event,3,6)" class="SRScope" href="../structr123array4x64.html#a9845020f8799cbf04156e3114a4c9314" target="_parent">r123array4x64::swap()</a>
+    <a id="Item3_c7" onkeydown="return searchResults.NavChild(event,3,7)" onkeypress="return searchResults.NavChild(event,3,7)" onkeyup="return searchResults.NavChild(event,3,7)" class="SRScope" href="../structr123array16x8.html#a2de9273e9c4b4c47315cb20885e9c6ed" target="_parent">r123array16x8::swap()</a>
+    <a id="Item3_c8" onkeydown="return searchResults.NavChild(event,3,8)" onkeypress="return searchResults.NavChild(event,3,8)" onkeyup="return searchResults.NavChild(event,3,8)" class="SRScope" href="../structr123array1xm128i.html#a05f536079732d192e572bcf395ab6b4e" target="_parent">r123array1xm128i::swap()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/functions_74.html b/lib/Random123-1.08/docs/html/search/functions_74.html
new file mode 100644
index 0000000..ce2d928
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/functions_74.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_threefry2x32">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../threefry_8h.html#af98f648fb8e458ff0c6825cb903734f2" target="_parent">threefry2x32</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x32_5fr">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../threefry_8h.html#ae8eee0d74a087c6cbc112af11b884501" target="_parent">threefry2x32_R</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x32keyinit">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../threefry_8h.html#a5dbdf6e314925cd676da9f97013aefe4" target="_parent">threefry2x32keyinit</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../threefry_8h.html#aea6a4bd5c80354a4f575c9bec2702172" target="_parent">threefry2x64</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64_5fr">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../threefry_8h.html#abe5e028454aef3f2bc459e5db05e0e04" target="_parent">threefry2x64_R</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64keyinit">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../threefry_8h.html#ac14fcf731b175a1cec85a80606ed5f04" target="_parent">threefry2x64keyinit</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="../threefry_8h.html#a1636cce9de54f919e8952a42b7f397fd" target="_parent">threefry4x32</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32_5fr">
+ <div class="SREntry">
+  <a id="Item7" onkeydown="return searchResults.Nav(event,7)" onkeypress="return searchResults.Nav(event,7)" onkeyup="return searchResults.Nav(event,7)" class="SRSymbol" href="../threefry_8h.html#a79eb6922e7404e224893f7f723fc240c" target="_parent">threefry4x32_R</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32keyinit">
+ <div class="SREntry">
+  <a id="Item8" onkeydown="return searchResults.Nav(event,8)" onkeypress="return searchResults.Nav(event,8)" onkeyup="return searchResults.Nav(event,8)" class="SRSymbol" href="../threefry_8h.html#a458f442301e620096d73efd479ab8591" target="_parent">threefry4x32keyinit</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64">
+ <div class="SREntry">
+  <a id="Item9" onkeydown="return searchResults.Nav(event,9)" onkeypress="return searchResults.Nav(event,9)" onkeyup="return searchResults.Nav(event,9)" class="SRSymbol" href="../threefry_8h.html#a382d18a49002d2a5e2b2f06d58669d70" target="_parent">threefry4x64</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64_5fr">
+ <div class="SREntry">
+  <a id="Item10" onkeydown="return searchResults.Nav(event,10)" onkeypress="return searchResults.Nav(event,10)" onkeyup="return searchResults.Nav(event,10)" class="SRSymbol" href="../threefry_8h.html#a2e04c3f1ae28c4833444bfafcf22c47f" target="_parent">threefry4x64_R</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64keyinit">
+ <div class="SREntry">
+  <a id="Item11" onkeydown="return searchResults.Nav(event,11)" onkeypress="return searchResults.Nav(event,11)" onkeyup="return searchResults.Nav(event,11)" class="SRSymbol" href="../threefry_8h.html#aeed27be75e75bfffb0bf8c6333f71b10" target="_parent">threefry4x64keyinit</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/mag_sel.png b/lib/Random123-1.08/docs/html/search/mag_sel.png
new file mode 100644
index 0000000..81f6040
Binary files /dev/null and b/lib/Random123-1.08/docs/html/search/mag_sel.png differ
diff --git a/lib/Random123-1.08/docs/html/search/namespaces_72.html b/lib/Random123-1.08/docs/html/search/namespaces_72.html
new file mode 100644
index 0000000..16bc0ca
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/namespaces_72.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_r123">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../namespacer123.html" target="_parent">r123</a>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/nomatches.html b/lib/Random123-1.08/docs/html/search/nomatches.html
new file mode 100644
index 0000000..b1ded27
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/nomatches.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/related_6f.html b/lib/Random123-1.08/docs/html/search/related_6f.html
new file mode 100644
index 0000000..c944584
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/related_6f.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_operator_21_3d">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123_1_1Engine.html#af0947cdcfc03aef7ec30c9fafa660445" target="_parent">operator!=</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3c_3c">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structr123_1_1Engine.html#ae0321571f689fca00c608d11ecad7d8d" target="_parent">operator<<</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3d_3d">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../structr123_1_1Engine.html#a606e3ba824542e52f12df1345126e721" target="_parent">operator==</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_operator_3e_3e">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../structr123_1_1Engine.html#ae708b771ab5ac17700d34bad875a16d9" target="_parent">operator>></a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/search.css b/lib/Random123-1.08/docs/html/search/search.css
new file mode 100644
index 0000000..50249e5
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/search.css
@@ -0,0 +1,240 @@
+/*---------------- Search Box */
+
+#FSearchBox {
+    float: left;
+}
+
+#searchli {
+    float: right;
+    display: block;
+    width: 170px;
+    height: 36px;
+}
+
+#MSearchBox {
+    white-space : nowrap;
+    position: absolute;
+    float: none;
+    display: inline;
+    margin-top: 8px;
+    right: 0px;
+    width: 170px;
+    z-index: 102;
+}
+
+#MSearchBox .left
+{
+    display:block;
+    position:absolute;
+    left:10px;
+    width:20px;
+    height:19px;
+    background:url('search_l.png') no-repeat;
+    background-position:right;
+}
+
+#MSearchSelect {
+    display:block;
+    position:absolute;
+    width:20px;
+    height:19px;
+}
+
+.left #MSearchSelect {
+    left:4px;
+}
+
+.right #MSearchSelect {
+    right:5px;
+}
+
+#MSearchField {
+    display:block;
+    position:absolute;
+    height:19px;
+    background:url('search_m.png') repeat-x;
+    border:none;
+    width:116px;
+    margin-left:20px;
+    padding-left:4px;
+    color: #909090;
+    outline: none;
+    font: 9pt Arial, Verdana, sans-serif;
+}
+
+#FSearchBox #MSearchField {
+    margin-left:15px;
+}
+
+#MSearchBox .right {
+    display:block;
+    position:absolute;
+    right:10px;
+    top:0px;
+    width:20px;
+    height:19px;
+    background:url('search_r.png') no-repeat;
+    background-position:left;
+}
+
+#MSearchClose {
+    display: none;
+    position: absolute;
+    top: 4px;
+    background : none;
+    border: none;
+    margin: 0px 4px 0px 0px;
+    padding: 0px 0px;
+    outline: none;
+}
+
+.left #MSearchClose {
+    left: 6px;
+}
+
+.right #MSearchClose {
+    right: 2px;
+}
+
+.MSearchBoxActive #MSearchField {
+    color: #000000;
+}
+
+/*---------------- Search filter selection */
+
+#MSearchSelectWindow {
+    display: none;
+    position: absolute;
+    left: 0; top: 0;
+    border: 1px solid #90A5CE;
+    background-color: #F9FAFC;
+    z-index: 1;
+    padding-top: 4px;
+    padding-bottom: 4px;
+    -moz-border-radius: 4px;
+    -webkit-border-top-left-radius: 4px;
+    -webkit-border-top-right-radius: 4px;
+    -webkit-border-bottom-left-radius: 4px;
+    -webkit-border-bottom-right-radius: 4px;
+    -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+.SelectItem {
+    font: 8pt Arial, Verdana, sans-serif;
+    padding-left:  2px;
+    padding-right: 12px;
+    border: 0px;
+}
+
+span.SelectionMark {
+    margin-right: 4px;
+    font-family: monospace;
+    outline-style: none;
+    text-decoration: none;
+}
+
+a.SelectItem {
+    display: block;
+    outline-style: none;
+    color: #000000; 
+    text-decoration: none;
+    padding-left:   6px;
+    padding-right: 12px;
+}
+
+a.SelectItem:focus,
+a.SelectItem:active {
+    color: #000000; 
+    outline-style: none;
+    text-decoration: none;
+}
+
+a.SelectItem:hover {
+    color: #FFFFFF;
+    background-color: #3D578C;
+    outline-style: none;
+    text-decoration: none;
+    cursor: pointer;
+    display: block;
+}
+
+/*---------------- Search results window */
+
+iframe#MSearchResults {
+    width: 60ex;
+    height: 15em;
+}
+
+#MSearchResultsWindow {
+    display: none;
+    position: absolute;
+    left: 0; top: 0;
+    border: 1px solid #000;
+    background-color: #EEF1F7;
+}
+
+/* ----------------------------------- */
+
+
+#SRIndex {
+    clear:both; 
+    padding-bottom: 15px;
+}
+
+.SREntry {
+    font-size: 10pt;
+    padding-left: 1ex;
+}
+
+.SRPage .SREntry {
+    font-size: 8pt;
+    padding: 1px 5px;
+}
+
+body.SRPage {
+    margin: 5px 2px;
+}
+
+.SRChildren {
+    padding-left: 3ex; padding-bottom: .5em 
+}
+
+.SRPage .SRChildren {
+    display: none;
+}
+
+.SRSymbol {
+    font-weight: bold; 
+    color: #425E97;
+    font-family: Arial, Verdana, sans-serif;
+    text-decoration: none;
+    outline: none;
+}
+
+a.SRScope {
+    display: block;
+    color: #425E97; 
+    font-family: Arial, Verdana, sans-serif;
+    text-decoration: none;
+    outline: none;
+}
+
+a.SRSymbol:focus, a.SRSymbol:active,
+a.SRScope:focus, a.SRScope:active {
+    text-decoration: underline;
+}
+
+.SRPage .SRStatus {
+    padding: 2px 5px;
+    font-size: 8pt;
+    font-style: italic;
+}
+
+.SRResult {
+    display: none;
+}
+
+DIV.searchresults {
+    margin-left: 10px;
+    margin-right: 10px;
+}
diff --git a/lib/Random123-1.08/docs/html/search/search.js b/lib/Random123-1.08/docs/html/search/search.js
new file mode 100644
index 0000000..97b5bd3
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/search.js
@@ -0,0 +1,746 @@
+// Search script generated by doxygen
+// Copyright (C) 2009 by Dimitri van Heesch.
+
+// The code in this file is loosly based on main.js, part of Natural Docs,
+// which is Copyright (C) 2003-2008 Greg Valure
+// Natural Docs is licensed under the GPL.
+
+var indexSectionsWithContent =
+{
+  0: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010111111111011101101111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+  1: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100010000000100101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+  2: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+  3: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101010100001100101110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+  4: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010111111111000101101110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+  5: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010011010000010100001001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+  6: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111110001010000101111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+  7: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+  8: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000100110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+  9: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+  10: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000100000000101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
+};
+
+var indexSectionNames =
+{
+  0: "all",
+  1: "classes",
+  2: "namespaces",
+  3: "files",
+  4: "functions",
+  5: "variables",
+  6: "typedefs",
+  7: "enums",
+  8: "enumvalues",
+  9: "related",
+  10: "defines"
+};
+
+function convertToId(search)
+{
+  var result = '';
+  for (i=0;i<search.length;i++)
+  {
+    var c = search.charAt(i);
+    var cn = c.charCodeAt(0);
+    if (c.match(/[a-z0-9]/))
+    {
+      result+=c;
+    }
+    else if (cn<16) 
+    {
+      result+="_0"+cn.toString(16);
+    }
+    else 
+    {
+      result+="_"+cn.toString(16);
+    }
+  }
+  return result;
+}
+
+function getXPos(item)
+{
+  var x = 0;
+  if (item.offsetWidth)
+  {
+    while (item && item!=document.body)
+    {
+      x   += item.offsetLeft;
+      item = item.offsetParent;
+    }
+  }
+  return x;
+}
+
+function getYPos(item)
+{
+  var y = 0;
+  if (item.offsetWidth)
+  {
+     while (item && item!=document.body)
+     {
+       y   += item.offsetTop;
+       item = item.offsetParent;
+     }
+  }
+  return y;
+}
+
+/* A class handling everything associated with the search panel.
+
+   Parameters:
+   name - The name of the global variable that will be 
+          storing this instance.  Is needed to be able to set timeouts.
+   resultPath - path to use for external files
+*/
+function SearchBox(name, resultsPath, inFrame, label)
+{
+  if (!name || !resultsPath) {  alert("Missing parameters to SearchBox."); }
+   
+  // ---------- Instance variables
+  this.name                  = name;
+  this.resultsPath           = resultsPath;
+  this.keyTimeout            = 0;
+  this.keyTimeoutLength      = 500;
+  this.closeSelectionTimeout = 300;
+  this.lastSearchValue       = "";
+  this.lastResultsPage       = "";
+  this.hideTimeout           = 0;
+  this.searchIndex           = 0;
+  this.searchActive          = false;
+  this.insideFrame           = inFrame;
+  this.searchLabel           = label;
+
+  // ----------- DOM Elements
+
+  this.DOMSearchField = function()
+  {  return document.getElementById("MSearchField");  }
+
+  this.DOMSearchSelect = function()
+  {  return document.getElementById("MSearchSelect");  }
+
+  this.DOMSearchSelectWindow = function()
+  {  return document.getElementById("MSearchSelectWindow");  }
+
+  this.DOMPopupSearchResults = function()
+  {  return document.getElementById("MSearchResults");  }
+
+  this.DOMPopupSearchResultsWindow = function()
+  {  return document.getElementById("MSearchResultsWindow");  }
+
+  this.DOMSearchClose = function()
+  {  return document.getElementById("MSearchClose"); }
+
+  this.DOMSearchBox = function()
+  {  return document.getElementById("MSearchBox");  }
+
+  // ------------ Event Handlers
+
+  // Called when focus is added or removed from the search field.
+  this.OnSearchFieldFocus = function(isActive)
+  {
+    this.Activate(isActive);
+  }
+
+  this.OnSearchSelectShow = function()
+  {
+    var searchSelectWindow = this.DOMSearchSelectWindow();
+    var searchField        = this.DOMSearchSelect();
+
+    if (this.insideFrame)
+    {
+      var left = getXPos(searchField);
+      var top  = getYPos(searchField);
+      left += searchField.offsetWidth + 6;
+      top += searchField.offsetHeight;
+
+      // show search selection popup
+      searchSelectWindow.style.display='block';
+      left -= searchSelectWindow.offsetWidth;
+      searchSelectWindow.style.left =  left + 'px';
+      searchSelectWindow.style.top  =  top  + 'px';
+    }
+    else
+    {
+      var left = getXPos(searchField);
+      var top  = getYPos(searchField);
+      top += searchField.offsetHeight;
+
+      // show search selection popup
+      searchSelectWindow.style.display='block';
+      searchSelectWindow.style.left =  left + 'px';
+      searchSelectWindow.style.top  =  top  + 'px';
+    }
+
+    // stop selection hide timer
+    if (this.hideTimeout) 
+    {
+      clearTimeout(this.hideTimeout);
+      this.hideTimeout=0;
+    }
+    return false; // to avoid "image drag" default event
+  }
+
+  this.OnSearchSelectHide = function()
+  {
+    this.hideTimeout = setTimeout(this.name +".CloseSelectionWindow()",
+                                  this.closeSelectionTimeout);
+  }
+
+  // Called when the content of the search field is changed.
+  this.OnSearchFieldChange = function(evt)
+  {
+    if (this.keyTimeout) // kill running timer
+    {
+      clearTimeout(this.keyTimeout);
+      this.keyTimeout = 0;
+    }
+
+    var e  = (evt) ? evt : window.event; // for IE
+    if (e.keyCode==40 || e.keyCode==13)
+    {
+      if (e.shiftKey==1)
+      {
+        this.OnSearchSelectShow();
+        var win=this.DOMSearchSelectWindow(); 
+        for (i=0;i<win.childNodes.length;i++)
+        {
+          var child = win.childNodes[i]; // get span within a
+          if (child.className=='SelectItem')
+          {
+            child.focus();
+            return;
+          }
+        }
+        return;
+      }
+      else if (window.frames.MSearchResults.searchResults)
+      {
+        var elem = window.frames.MSearchResults.searchResults.NavNext(0);
+        if (elem) elem.focus();
+      }
+    }
+    else if (e.keyCode==27) // Escape out of the search field
+    {
+      this.DOMSearchField().blur();
+      this.DOMPopupSearchResultsWindow().style.display = 'none';
+      this.DOMSearchClose().style.display = 'none';
+      this.lastSearchValue = '';
+      this.Activate(false);
+      return;
+    }
+
+    // strip whitespaces
+    var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+
+    if (searchValue != this.lastSearchValue) // search value has changed
+    {
+      if (searchValue != "") // non-empty search
+      {
+        // set timer for search update
+        this.keyTimeout = setTimeout(this.name + '.Search()',
+                                     this.keyTimeoutLength);
+      }
+      else // empty search field
+      {
+        this.DOMPopupSearchResultsWindow().style.display = 'none';
+        this.DOMSearchClose().style.display = 'none';
+        this.lastSearchValue = '';
+      }
+    }
+  }
+
+  this.SelectItemCount = function(id)
+  {
+    var count=0;
+    var win=this.DOMSearchSelectWindow(); 
+    for (i=0;i<win.childNodes.length;i++)
+    {
+      var child = win.childNodes[i]; // get span within a
+      if (child.className=='SelectItem')
+      {
+        count++;
+      }
+    }
+    return count;
+  }
+
+  this.SelectItemSet = function(id)
+  {
+    var i,j=0;
+    var win=this.DOMSearchSelectWindow(); 
+    for (i=0;i<win.childNodes.length;i++)
+    {
+      var child = win.childNodes[i]; // get span within a
+      if (child.className=='SelectItem')
+      {
+        var node = child.firstChild;
+        if (j==id)
+        {
+          node.innerHTML='•';
+        }
+        else
+        {
+          node.innerHTML=' ';
+        }
+        j++;
+      }
+    }
+  }
+
+  // Called when an search filter selection is made.
+  // set item with index id as the active item
+  this.OnSelectItem = function(id)
+  {
+    this.searchIndex = id;
+    this.SelectItemSet(id);
+    var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+    if (searchValue!="" && this.searchActive) // something was found -> do a search
+    {
+      this.Search();
+    }
+  }
+
+  this.OnSearchSelectKey = function(evt)
+  {
+    var e = (evt) ? evt : window.event; // for IE
+    if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down
+    {
+      this.searchIndex++;
+      this.OnSelectItem(this.searchIndex);
+    }
+    else if (e.keyCode==38 && this.searchIndex>0) // Up
+    {
+      this.searchIndex--;
+      this.OnSelectItem(this.searchIndex);
+    }
+    else if (e.keyCode==13 || e.keyCode==27)
+    {
+      this.OnSelectItem(this.searchIndex);
+      this.CloseSelectionWindow();
+      this.DOMSearchField().focus();
+    }
+    return false;
+  }
+
+  // --------- Actions
+
+  // Closes the results window.
+  this.CloseResultsWindow = function()
+  {
+    this.DOMPopupSearchResultsWindow().style.display = 'none';
+    this.DOMSearchClose().style.display = 'none';
+    this.Activate(false);
+  }
+
+  this.CloseSelectionWindow = function()
+  {
+    this.DOMSearchSelectWindow().style.display = 'none';
+  }
+
+  // Performs a search.
+  this.Search = function()
+  {
+    this.keyTimeout = 0;
+
+    // strip leading whitespace
+    var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
+
+    var code = searchValue.toLowerCase().charCodeAt(0);
+    var hexCode;
+    if (code<16) 
+    {
+      hexCode="0"+code.toString(16);
+    }
+    else 
+    {
+      hexCode=code.toString(16);
+    }
+
+    var resultsPage;
+    var resultsPageWithSearch;
+    var hasResultsPage;
+
+    if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1')
+    {
+       resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
+       resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
+       hasResultsPage = true;
+    }
+    else // nothing available for this search term
+    {
+       resultsPage = this.resultsPath + '/nomatches.html';
+       resultsPageWithSearch = resultsPage;
+       hasResultsPage = false;
+    }
+
+    window.frames.MSearchResults.location.href = resultsPageWithSearch;  
+    var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
+
+    if (domPopupSearchResultsWindow.style.display!='block')
+    {
+       var domSearchBox = this.DOMSearchBox();
+       this.DOMSearchClose().style.display = 'inline';
+       if (this.insideFrame)
+       {
+         var domPopupSearchResults = this.DOMPopupSearchResults();
+         domPopupSearchResultsWindow.style.position = 'relative';
+         domPopupSearchResultsWindow.style.display  = 'block';
+         var width = document.body.clientWidth - 8; // the -8 is for IE :-(
+         domPopupSearchResultsWindow.style.width    = width + 'px';
+         domPopupSearchResults.style.width          = width + 'px';
+       }
+       else
+       {
+         var domPopupSearchResults = this.DOMPopupSearchResults();
+         var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
+         var top  = getYPos(domSearchBox) + 20;  // domSearchBox.offsetHeight + 1;
+         domPopupSearchResultsWindow.style.display = 'block';
+         left -= domPopupSearchResults.offsetWidth;
+         domPopupSearchResultsWindow.style.top     = top  + 'px';
+         domPopupSearchResultsWindow.style.left    = left + 'px';
+       }
+    }
+
+    this.lastSearchValue = searchValue;
+    this.lastResultsPage = resultsPage;
+  }
+
+  // -------- Activation Functions
+
+  // Activates or deactivates the search panel, resetting things to 
+  // their default values if necessary. 
+  this.Activate = function(isActive)
+  {
+    if (isActive || // open it
+        this.DOMPopupSearchResultsWindow().style.display == 'block' 
+       )
+    {
+      this.DOMSearchBox().className = 'MSearchBoxActive';
+
+      var searchField = this.DOMSearchField();
+
+      if (searchField.value == this.searchLabel) // clear "Search" term upon entry
+      {  
+        searchField.value = '';  
+        this.searchActive = true;
+      }
+    }
+    else if (!isActive) // directly remove the panel
+    {
+      this.DOMSearchBox().className = 'MSearchBoxInactive';
+      this.DOMSearchField().value   = this.searchLabel;
+      this.searchActive             = false;
+      this.lastSearchValue          = ''
+      this.lastResultsPage          = '';
+    }
+  }
+}
+
+// -----------------------------------------------------------------------
+
+// The class that handles everything on the search results page.
+function SearchResults(name)
+{
+    // The number of matches from the last run of <Search()>.
+    this.lastMatchCount = 0;
+    this.lastKey = 0;
+    this.repeatOn = false;
+
+    // Toggles the visibility of the passed element ID.
+    this.FindChildElement = function(id)
+    {
+      var parentElement = document.getElementById(id);
+      var element = parentElement.firstChild;
+
+      while (element && element!=parentElement)
+      {
+        if (element.nodeName == 'DIV' && element.className == 'SRChildren')
+        {
+          return element;
+        }
+
+        if (element.nodeName == 'DIV' && element.hasChildNodes())
+        {  
+           element = element.firstChild;  
+        }
+        else if (element.nextSibling)
+        {  
+           element = element.nextSibling;  
+        }
+        else
+        {
+          do
+          {
+            element = element.parentNode;
+          }
+          while (element && element!=parentElement && !element.nextSibling);
+
+          if (element && element!=parentElement)
+          {  
+            element = element.nextSibling;  
+          }
+        }
+      }
+    }
+
+    this.Toggle = function(id)
+    {
+      var element = this.FindChildElement(id);
+      if (element)
+      {
+        if (element.style.display == 'block')
+        {
+          element.style.display = 'none';
+        }
+        else
+        {
+          element.style.display = 'block';
+        }
+      }
+    }
+
+    // Searches for the passed string.  If there is no parameter,
+    // it takes it from the URL query.
+    //
+    // Always returns true, since other documents may try to call it
+    // and that may or may not be possible.
+    this.Search = function(search)
+    {
+      if (!search) // get search word from URL
+      {
+        search = window.location.search;
+        search = search.substring(1);  // Remove the leading '?'
+        search = unescape(search);
+      }
+
+      search = search.replace(/^ +/, ""); // strip leading spaces
+      search = search.replace(/ +$/, ""); // strip trailing spaces
+      search = search.toLowerCase();
+      search = convertToId(search);
+
+      var resultRows = document.getElementsByTagName("div");
+      var matches = 0;
+
+      var i = 0;
+      while (i < resultRows.length)
+      {
+        var row = resultRows.item(i);
+        if (row.className == "SRResult")
+        {
+          var rowMatchName = row.id.toLowerCase();
+          rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
+
+          if (search.length<=rowMatchName.length && 
+             rowMatchName.substr(0, search.length)==search)
+          {
+            row.style.display = 'block';
+            matches++;
+          }
+          else
+          {
+            row.style.display = 'none';
+          }
+        }
+        i++;
+      }
+      document.getElementById("Searching").style.display='none';
+      if (matches == 0) // no results
+      {
+        document.getElementById("NoMatches").style.display='block';
+      }
+      else // at least one result
+      {
+        document.getElementById("NoMatches").style.display='none';
+      }
+      this.lastMatchCount = matches;
+      return true;
+    }
+
+    // return the first item with index index or higher that is visible
+    this.NavNext = function(index)
+    {
+      var focusItem;
+      while (1)
+      {
+        var focusName = 'Item'+index;
+        focusItem = document.getElementById(focusName);
+        if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+        {
+          break;
+        }
+        else if (!focusItem) // last element
+        {
+          break;
+        }
+        focusItem=null;
+        index++;
+      }
+      return focusItem;
+    }
+
+    this.NavPrev = function(index)
+    {
+      var focusItem;
+      while (1)
+      {
+        var focusName = 'Item'+index;
+        focusItem = document.getElementById(focusName);
+        if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+        {
+          break;
+        }
+        else if (!focusItem) // last element
+        {
+          break;
+        }
+        focusItem=null;
+        index--;
+      }
+      return focusItem;
+    }
+
+    this.ProcessKeys = function(e)
+    {
+      if (e.type == "keydown") 
+      {
+        this.repeatOn = false;
+        this.lastKey = e.keyCode;
+      }
+      else if (e.type == "keypress")
+      {
+        if (!this.repeatOn)
+        {
+          if (this.lastKey) this.repeatOn = true;
+          return false; // ignore first keypress after keydown
+        }
+      }
+      else if (e.type == "keyup")
+      {
+        this.lastKey = 0;
+        this.repeatOn = false;
+      }
+      return this.lastKey!=0;
+    }
+
+    this.Nav = function(evt,itemIndex) 
+    {
+      var e  = (evt) ? evt : window.event; // for IE
+      if (e.keyCode==13) return true;
+      if (!this.ProcessKeys(e)) return false;
+
+      if (this.lastKey==38) // Up
+      {
+        var newIndex = itemIndex-1;
+        var focusItem = this.NavPrev(newIndex);
+        if (focusItem)
+        {
+          var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
+          if (child && child.style.display == 'block') // children visible
+          { 
+            var n=0;
+            var tmpElem;
+            while (1) // search for last child
+            {
+              tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
+              if (tmpElem)
+              {
+                focusItem = tmpElem;
+              }
+              else // found it!
+              {
+                break;
+              }
+              n++;
+            }
+          }
+        }
+        if (focusItem)
+        {
+          focusItem.focus();
+        }
+        else // return focus to search field
+        {
+           parent.document.getElementById("MSearchField").focus();
+        }
+      }
+      else if (this.lastKey==40) // Down
+      {
+        var newIndex = itemIndex+1;
+        var focusItem;
+        var item = document.getElementById('Item'+itemIndex);
+        var elem = this.FindChildElement(item.parentNode.parentNode.id);
+        if (elem && elem.style.display == 'block') // children visible
+        {
+          focusItem = document.getElementById('Item'+itemIndex+'_c0');
+        }
+        if (!focusItem) focusItem = this.NavNext(newIndex);
+        if (focusItem)  focusItem.focus();
+      }
+      else if (this.lastKey==39) // Right
+      {
+        var item = document.getElementById('Item'+itemIndex);
+        var elem = this.FindChildElement(item.parentNode.parentNode.id);
+        if (elem) elem.style.display = 'block';
+      }
+      else if (this.lastKey==37) // Left
+      {
+        var item = document.getElementById('Item'+itemIndex);
+        var elem = this.FindChildElement(item.parentNode.parentNode.id);
+        if (elem) elem.style.display = 'none';
+      }
+      else if (this.lastKey==27) // Escape
+      {
+        parent.searchBox.CloseResultsWindow();
+        parent.document.getElementById("MSearchField").focus();
+      }
+      else if (this.lastKey==13) // Enter
+      {
+        return true;
+      }
+      return false;
+    }
+
+    this.NavChild = function(evt,itemIndex,childIndex)
+    {
+      var e  = (evt) ? evt : window.event; // for IE
+      if (e.keyCode==13) return true;
+      if (!this.ProcessKeys(e)) return false;
+
+      if (this.lastKey==38) // Up
+      {
+        if (childIndex>0)
+        {
+          var newIndex = childIndex-1;
+          document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
+        }
+        else // already at first child, jump to parent
+        {
+          document.getElementById('Item'+itemIndex).focus();
+        }
+      }
+      else if (this.lastKey==40) // Down
+      {
+        var newIndex = childIndex+1;
+        var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
+        if (!elem) // last child, jump to parent next parent
+        {
+          elem = this.NavNext(itemIndex+1);
+        }
+        if (elem)
+        {
+          elem.focus();
+        } 
+      }
+      else if (this.lastKey==27) // Escape
+      {
+        parent.searchBox.CloseResultsWindow();
+        parent.document.getElementById("MSearchField").focus();
+      }
+      else if (this.lastKey==13) // Enter
+      {
+        return true;
+      }
+      return false;
+    }
+}
diff --git a/lib/Random123-1.08/docs/html/search/search_l.png b/lib/Random123-1.08/docs/html/search/search_l.png
new file mode 100644
index 0000000..c872f4d
Binary files /dev/null and b/lib/Random123-1.08/docs/html/search/search_l.png differ
diff --git a/lib/Random123-1.08/docs/html/search/search_m.png b/lib/Random123-1.08/docs/html/search/search_m.png
new file mode 100644
index 0000000..b429a16
Binary files /dev/null and b/lib/Random123-1.08/docs/html/search/search_m.png differ
diff --git a/lib/Random123-1.08/docs/html/search/search_r.png b/lib/Random123-1.08/docs/html/search/search_r.png
new file mode 100644
index 0000000..97ee8b4
Binary files /dev/null and b/lib/Random123-1.08/docs/html/search/search_r.png differ
diff --git a/lib/Random123-1.08/docs/html/search/typedefs_61.html b/lib/Random123-1.08/docs/html/search/typedefs_61.html
new file mode 100644
index 0000000..2577ee9
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/typedefs_61.html
@@ -0,0 +1,152 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_aesni1xm128i_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../group__AESNI.html#gaab0f809a22e01e6cb6135f6af73bb532" target="_parent">aesni1xm128i_ctr_t</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni1xm128i_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../group__AESNI.html#gaf4fa221e6387d0454e2e6399245bdead" target="_parent">aesni1xm128i_ukey_t</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../group__AESNI.html#gae7459b3f4ee0e424cb4f13b4d5efc1fe" target="_parent">aesni4x32_ctr_t</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../group__AESNI.html#ga6d88accdcfa339b48e14021a572e269b" target="_parent">aesni4x32_key_t</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_aesni4x32_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../group__AESNI.html#gac2c3248ec3b03591d442cf634fb51af5" target="_parent">aesni4x32_ukey_t</a>
+  <span class="SRScope">aes.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array16x8">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../namespacer123.html#ac3148aed79e81051d40e9b29a8914cf4" target="_parent">Array16x8</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array1x32">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="../namespacer123.html#acc1b0ed919ef806de26f5ff5b934b313" target="_parent">Array1x32</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array1x64">
+ <div class="SREntry">
+  <a id="Item7" onkeydown="return searchResults.Nav(event,7)" onkeypress="return searchResults.Nav(event,7)" onkeyup="return searchResults.Nav(event,7)" class="SRSymbol" href="../namespacer123.html#aeb81c4265759fad9993e09fda21ff4fa" target="_parent">Array1x64</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array1xm128i">
+ <div class="SREntry">
+  <a id="Item8" onkeydown="return searchResults.Nav(event,8)" onkeypress="return searchResults.Nav(event,8)" onkeyup="return searchResults.Nav(event,8)" class="SRSymbol" href="../namespacer123.html#adbb729a97ee41e7cb075058b55a58c5d" target="_parent">Array1xm128i</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array2x32">
+ <div class="SREntry">
+  <a id="Item9" onkeydown="return searchResults.Nav(event,9)" onkeypress="return searchResults.Nav(event,9)" onkeyup="return searchResults.Nav(event,9)" class="SRSymbol" href="../namespacer123.html#ab853ac55f8188e4a09d12ab23f2d8dea" target="_parent">Array2x32</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array2x64">
+ <div class="SREntry">
+  <a id="Item10" onkeydown="return searchResults.Nav(event,10)" onkeypress="return searchResults.Nav(event,10)" onkeyup="return searchResults.Nav(event,10)" class="SRSymbol" href="../namespacer123.html#ad3b670563762f605a6fce61b5bab8412" target="_parent">Array2x64</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array4x32">
+ <div class="SREntry">
+  <a id="Item11" onkeydown="return searchResults.Nav(event,11)" onkeypress="return searchResults.Nav(event,11)" onkeyup="return searchResults.Nav(event,11)" class="SRSymbol" href="../namespacer123.html#a0c352c3ea265e7fd182559e557113195" target="_parent">Array4x32</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array4x64">
+ <div class="SREntry">
+  <a id="Item12" onkeydown="return searchResults.Nav(event,12)" onkeypress="return searchResults.Nav(event,12)" onkeyup="return searchResults.Nav(event,12)" class="SRSymbol" href="../namespacer123.html#a54c1a72670974c11acff37279eb23147" target="_parent">Array4x64</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_array8x32">
+ <div class="SREntry">
+  <a id="Item13" onkeydown="return searchResults.Nav(event,13)" onkeypress="return searchResults.Nav(event,13)" onkeyup="return searchResults.Nav(event,13)" class="SRSymbol" href="../namespacer123.html#aea31cf23efbfcc11808b7e394922f4d2" target="_parent">Array8x32</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128i">
+ <div class="SREntry">
+  <a id="Item14" onkeydown="return searchResults.Nav(event,14)" onkeypress="return searchResults.Nav(event,14)" onkeyup="return searchResults.Nav(event,14)" class="SRSymbol" href="../namespacer123.html#a964aa9123913d1f8cf535e0caaa4155f" target="_parent">ARS1xm128i</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128i_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item15" onkeydown="return searchResults.Nav(event,15)" onkeypress="return searchResults.Nav(event,15)" onkeyup="return searchResults.Nav(event,15)" class="SRSymbol" href="../group__AESNI.html#ga23ddf8109ce08f2bc14401c5f269d2a9" target="_parent">ars1xm128i_ctr_t</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128i_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item16" onkeydown="return searchResults.Nav(event,16)" onkeypress="return searchResults.Nav(event,16)" onkeyup="return searchResults.Nav(event,16)" class="SRSymbol" href="../group__AESNI.html#ga2c5b351a47bb39f4d1769506c98c06e2" target="_parent">ars1xm128i_key_t</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars1xm128i_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item17" onkeydown="return searchResults.Nav(event,17)" onkeypress="return searchResults.Nav(event,17)" onkeyup="return searchResults.Nav(event,17)" class="SRSymbol" href="../group__AESNI.html#gaeaa234225e7dcec2ffcdb32a0faad4f0" target="_parent">ars1xm128i_ukey_t</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars4x32">
+ <div class="SREntry">
+  <a id="Item18" onkeydown="return searchResults.Nav(event,18)" onkeypress="return searchResults.Nav(event,18)" onkeyup="return searchResults.Nav(event,18)" class="SRSymbol" href="../namespacer123.html#afd2070dc979024a14317bd57c3a4c352" target="_parent">ARS4x32</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars4x32_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item19" onkeydown="return searchResults.Nav(event,19)" onkeypress="return searchResults.Nav(event,19)" onkeyup="return searchResults.Nav(event,19)" class="SRSymbol" href="../group__AESNI.html#ga61721da91a455cb587ce6bc4a0f56117" target="_parent">ars4x32_ctr_t</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars4x32_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item20" onkeydown="return searchResults.Nav(event,20)" onkeypress="return searchResults.Nav(event,20)" onkeyup="return searchResults.Nav(event,20)" class="SRSymbol" href="../group__AESNI.html#ga3a1426aa6aaa06330d48ec8173cd3e7b" target="_parent">ars4x32_key_t</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_ars4x32_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item21" onkeydown="return searchResults.Nav(event,21)" onkeypress="return searchResults.Nav(event,21)" onkeyup="return searchResults.Nav(event,21)" class="SRSymbol" href="../group__AESNI.html#ga54cb318ff6bd4df405897b2b9a4b109f" target="_parent">ars4x32_ukey_t</a>
+  <span class="SRScope">ars.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/typedefs_62.html b/lib/Random123-1.08/docs/html/search/typedefs_62.html
new file mode 100644
index 0000000..2cf1348
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/typedefs_62.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_bctype">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123_1_1ReinterpretCtr.html#ae0accaee618b5eb28a24acd516b3a4c6" target="_parent">bctype</a>
+  <span class="SRScope">r123::ReinterpretCtr</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/typedefs_63.html b/lib/Random123-1.08/docs/html/search/typedefs_63.html
new file mode 100644
index 0000000..59f0f2e
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/typedefs_63.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_cbrng_5ftype">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_cbrng_5ftype')">cbrng_type</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../classr123_1_1MicroURNG.html#ab0b3a77c9408dbcb2f9d6b5c67e9c3f7" target="_parent">r123::MicroURNG::cbrng_type()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123_1_1Engine.html#a45ee0086cf8cd6d10febb76dc88f8b22" target="_parent">r123::Engine::cbrng_type()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_const_5fiterator">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_const_5fiterator')">const_iterator</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../structr123array1x32.html#ac7f82e8848759ec5b0026dce8830274e" target="_parent">r123array1x32::const_iterator()</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../structr123array2x32.html#a7963141a4af4c4aa74708909312a8644" target="_parent">r123array2x32::const_iterator()</a>
+    <a id="Item1_c2" onkeydown="return searchResults.NavChild(event,1,2)" onkeypress="return searchResults.NavChild(event,1,2)" onkeyup="return searchResults.NavChild(event,1,2)" class="SRScope" href="../structr123array4x32.html#a1078ba2cd13bb2a4f83e1b089c816ba7" target="_parent">r123array4x32::const_iterator()</a>
+    <a id="Item1_c3" onkeydown="return searchResults.NavChild(event,1,3)" onkeypress="return searchResults.NavChild(event,1,3)" onkeyup="return searchResults.NavChild(event,1,3)" class="SRScope" href="../structr123array8x32.html#aa026dfdf1e2741c96db4343ceffd3c9f" target="_parent">r123array8x32::const_iterator()</a>
+    <a id="Item1_c4" onkeydown="return searchResults.NavChild(event,1,4)" onkeypress="return searchResults.NavChild(event,1,4)" onkeyup="return searchResults.NavChild(event,1,4)" class="SRScope" href="../structr123array1x64.html#a28ff01c0fefda1d81112ec9812156164" target="_parent">r123array1x64::const_iterator()</a>
+    <a id="Item1_c5" onkeydown="return searchResults.NavChild(event,1,5)" onkeypress="return searchResults.NavChild(event,1,5)" onkeyup="return searchResults.NavChild(event,1,5)" class="SRScope" href="../structr123array2x64.html#ae4f249e82506274b19e6077c3d3f03af" target="_parent">r123array2x64::const_iterator()</a>
+    <a id="Item1_c6" onkeydown="return searchResults.NavChild(event,1,6)" onkeypress="return searchResults.NavChild(event,1,6)" onkeyup="return searchResults.NavChild(event,1,6)" class="SRScope" href="../structr123array4x64.html#a2aa5637bebf5c9c753edbce62e889d77" target="_parent">r123array4x64::const_iterator()</a>
+    <a id="Item1_c7" onkeydown="return searchResults.NavChild(event,1,7)" onkeypress="return searchResults.NavChild(event,1,7)" onkeyup="return searchResults.NavChild(event,1,7)" class="SRScope" href="../structr123array16x8.html#adda842a447360852f2ffa28fb97eb40c" target="_parent">r123array16x8::const_iterator()</a>
+    <a id="Item1_c8" onkeydown="return searchResults.NavChild(event,1,8)" onkeypress="return searchResults.NavChild(event,1,8)" onkeyup="return searchResults.NavChild(event,1,8)" class="SRScope" href="../structr123array1xm128i.html#af6be8b009459737fa25d9d2ac7c4e6aa" target="_parent">r123array1xm128i::const_iterator()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_const_5fpointer">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_const_5fpointer')">const_pointer</a>
+  <div class="SRChildren">
+    <a id="Item2_c0" onkeydown="return searchResults.NavChild(event,2,0)" onkeypress="return searchResults.NavChild(event,2,0)" onkeyup="return searchResults.NavChild(event,2,0)" class="SRScope" href="../structr123array1x32.html#ab4a82a1e5300814272528a05587d555b" target="_parent">r123array1x32::const_pointer()</a>
+    <a id="Item2_c1" onkeydown="return searchResults.NavChild(event,2,1)" onkeypress="return searchResults.NavChild(event,2,1)" onkeyup="return searchResults.NavChild(event,2,1)" class="SRScope" href="../structr123array2x32.html#accf098ed49f9d84cfa3831a9fe183885" target="_parent">r123array2x32::const_pointer()</a>
+    <a id="Item2_c2" onkeydown="return searchResults.NavChild(event,2,2)" onkeypress="return searchResults.NavChild(event,2,2)" onkeyup="return searchResults.NavChild(event,2,2)" class="SRScope" href="../structr123array4x32.html#a28d13183d1bfcc05854dc39bebbcdf51" target="_parent">r123array4x32::const_pointer()</a>
+    <a id="Item2_c3" onkeydown="return searchResults.NavChild(event,2,3)" onkeypress="return searchResults.NavChild(event,2,3)" onkeyup="return searchResults.NavChild(event,2,3)" class="SRScope" href="../structr123array8x32.html#a621f6293254c6300b1d1b9835b7f30ba" target="_parent">r123array8x32::const_pointer()</a>
+    <a id="Item2_c4" onkeydown="return searchResults.NavChild(event,2,4)" onkeypress="return searchResults.NavChild(event,2,4)" onkeyup="return searchResults.NavChild(event,2,4)" class="SRScope" href="../structr123array1x64.html#a2b23f2aa3edf21084ece97a03367bff5" target="_parent">r123array1x64::const_pointer()</a>
+    <a id="Item2_c5" onkeydown="return searchResults.NavChild(event,2,5)" onkeypress="return searchResults.NavChild(event,2,5)" onkeyup="return searchResults.NavChild(event,2,5)" class="SRScope" href="../structr123array2x64.html#a3a13a452ca15f62f8ddcd8b7de9efa08" target="_parent">r123array2x64::const_pointer()</a>
+    <a id="Item2_c6" onkeydown="return searchResults.NavChild(event,2,6)" onkeypress="return searchResults.NavChild(event,2,6)" onkeyup="return searchResults.NavChild(event,2,6)" class="SRScope" href="../structr123array4x64.html#aa268882d3b4fb43ec9d82baf22d58cc5" target="_parent">r123array4x64::const_pointer()</a>
+    <a id="Item2_c7" onkeydown="return searchResults.NavChild(event,2,7)" onkeypress="return searchResults.NavChild(event,2,7)" onkeyup="return searchResults.NavChild(event,2,7)" class="SRScope" href="../structr123array16x8.html#adbe5a6feb583ce6a682496e14cec9cca" target="_parent">r123array16x8::const_pointer()</a>
+    <a id="Item2_c8" onkeydown="return searchResults.NavChild(event,2,8)" onkeypress="return searchResults.NavChild(event,2,8)" onkeyup="return searchResults.NavChild(event,2,8)" class="SRScope" href="../structr123array1xm128i.html#acc3f6ecf7e6a6bc98c3681c80120ed61" target="_parent">r123array1xm128i::const_pointer()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_const_5freference">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_const_5freference')">const_reference</a>
+  <div class="SRChildren">
+    <a id="Item3_c0" onkeydown="return searchResults.NavChild(event,3,0)" onkeypress="return searchResults.NavChild(event,3,0)" onkeyup="return searchResults.NavChild(event,3,0)" class="SRScope" href="../structr123array1x32.html#adfa6614a8b20cd30c192458c8c2874da" target="_parent">r123array1x32::const_reference()</a>
+    <a id="Item3_c1" onkeydown="return searchResults.NavChild(event,3,1)" onkeypress="return searchResults.NavChild(event,3,1)" onkeyup="return searchResults.NavChild(event,3,1)" class="SRScope" href="../structr123array2x32.html#a9d71cce3d7ccea7f48da94cf023e1486" target="_parent">r123array2x32::const_reference()</a>
+    <a id="Item3_c2" onkeydown="return searchResults.NavChild(event,3,2)" onkeypress="return searchResults.NavChild(event,3,2)" onkeyup="return searchResults.NavChild(event,3,2)" class="SRScope" href="../structr123array4x32.html#a09d7e0d7b1572fc5fe2be119870a39bc" target="_parent">r123array4x32::const_reference()</a>
+    <a id="Item3_c3" onkeydown="return searchResults.NavChild(event,3,3)" onkeypress="return searchResults.NavChild(event,3,3)" onkeyup="return searchResults.NavChild(event,3,3)" class="SRScope" href="../structr123array8x32.html#a2e7eda7e8940b37e17aef9b0efec3685" target="_parent">r123array8x32::const_reference()</a>
+    <a id="Item3_c4" onkeydown="return searchResults.NavChild(event,3,4)" onkeypress="return searchResults.NavChild(event,3,4)" onkeyup="return searchResults.NavChild(event,3,4)" class="SRScope" href="../structr123array1x64.html#af75ba9dbfe38e0a6c143f446b7e4b995" target="_parent">r123array1x64::const_reference()</a>
+    <a id="Item3_c5" onkeydown="return searchResults.NavChild(event,3,5)" onkeypress="return searchResults.NavChild(event,3,5)" onkeyup="return searchResults.NavChild(event,3,5)" class="SRScope" href="../structr123array2x64.html#a5d80c6b28d869a5422d99541ee1fb93f" target="_parent">r123array2x64::const_reference()</a>
+    <a id="Item3_c6" onkeydown="return searchResults.NavChild(event,3,6)" onkeypress="return searchResults.NavChild(event,3,6)" onkeyup="return searchResults.NavChild(event,3,6)" class="SRScope" href="../structr123array4x64.html#ac2f21a458bf9008b831c553c5ae77508" target="_parent">r123array4x64::const_reference()</a>
+    <a id="Item3_c7" onkeydown="return searchResults.NavChild(event,3,7)" onkeypress="return searchResults.NavChild(event,3,7)" onkeyup="return searchResults.NavChild(event,3,7)" class="SRScope" href="../structr123array16x8.html#a7252c320f8b0fb4d66a17acd9e94b4ad" target="_parent">r123array16x8::const_reference()</a>
+    <a id="Item3_c8" onkeydown="return searchResults.NavChild(event,3,8)" onkeypress="return searchResults.NavChild(event,3,8)" onkeyup="return searchResults.NavChild(event,3,8)" class="SRScope" href="../structr123array1xm128i.html#a84d0123f4376cb6ab77cf817a0cea9cb" target="_parent">r123array1xm128i::const_reference()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_const_5freverse_5fiterator">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_const_5freverse_5fiterator')">const_reverse_iterator</a>
+  <div class="SRChildren">
+    <a id="Item4_c0" onkeydown="return searchResults.NavChild(event,4,0)" onkeypress="return searchResults.NavChild(event,4,0)" onkeyup="return searchResults.NavChild(event,4,0)" class="SRScope" href="../structr123array1x32.html#a2642ed91a9c6c91ace3b91add2a4feae" target="_parent">r123array1x32::const_reverse_iterator()</a>
+    <a id="Item4_c1" onkeydown="return searchResults.NavChild(event,4,1)" onkeypress="return searchResults.NavChild(event,4,1)" onkeyup="return searchResults.NavChild(event,4,1)" class="SRScope" href="../structr123array2x32.html#af298f85ad6bda860232465c5abc33618" target="_parent">r123array2x32::const_reverse_iterator()</a>
+    <a id="Item4_c2" onkeydown="return searchResults.NavChild(event,4,2)" onkeypress="return searchResults.NavChild(event,4,2)" onkeyup="return searchResults.NavChild(event,4,2)" class="SRScope" href="../structr123array4x32.html#a2926ff865e9dcbc3c20e6639aa8d0b1b" target="_parent">r123array4x32::const_reverse_iterator()</a>
+    <a id="Item4_c3" onkeydown="return searchResults.NavChild(event,4,3)" onkeypress="return searchResults.NavChild(event,4,3)" onkeyup="return searchResults.NavChild(event,4,3)" class="SRScope" href="../structr123array8x32.html#a207923147148d154b1659e257db44033" target="_parent">r123array8x32::const_reverse_iterator()</a>
+    <a id="Item4_c4" onkeydown="return searchResults.NavChild(event,4,4)" onkeypress="return searchResults.NavChild(event,4,4)" onkeyup="return searchResults.NavChild(event,4,4)" class="SRScope" href="../structr123array1x64.html#a61535adf62580285c3182a713ea0f3b1" target="_parent">r123array1x64::const_reverse_iterator()</a>
+    <a id="Item4_c5" onkeydown="return searchResults.NavChild(event,4,5)" onkeypress="return searchResults.NavChild(event,4,5)" onkeyup="return searchResults.NavChild(event,4,5)" class="SRScope" href="../structr123array2x64.html#aa37f04aef8a808c76715b3b2d49c3c30" target="_parent">r123array2x64::const_reverse_iterator()</a>
+    <a id="Item4_c6" onkeydown="return searchResults.NavChild(event,4,6)" onkeypress="return searchResults.NavChild(event,4,6)" onkeyup="return searchResults.NavChild(event,4,6)" class="SRScope" href="../structr123array4x64.html#a8405a219a9c81f8f298298cffbfd46ac" target="_parent">r123array4x64::const_reverse_iterator()</a>
+    <a id="Item4_c7" onkeydown="return searchResults.NavChild(event,4,7)" onkeypress="return searchResults.NavChild(event,4,7)" onkeyup="return searchResults.NavChild(event,4,7)" class="SRScope" href="../structr123array16x8.html#a7a774fcb52f452f832e11e13dbde6dea" target="_parent">r123array16x8::const_reverse_iterator()</a>
+    <a id="Item4_c8" onkeydown="return searchResults.NavChild(event,4,8)" onkeypress="return searchResults.NavChild(event,4,8)" onkeyup="return searchResults.NavChild(event,4,8)" class="SRScope" href="../structr123array1xm128i.html#a6bf98ce6373b157b87c6fd4a7006ed68" target="_parent">r123array1xm128i::const_reverse_iterator()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_ctr_5ftype">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_ctr_5ftype')">ctr_type</a>
+  <div class="SRChildren">
+    <a id="Item5_c0" onkeydown="return searchResults.NavChild(event,5,0)" onkeypress="return searchResults.NavChild(event,5,0)" onkeyup="return searchResults.NavChild(event,5,0)" class="SRScope" href="../structr123_1_1AESNI1xm128i.html#aaa136c21db9806859fa7cd4e2dbaaaa6" target="_parent">r123::AESNI1xm128i::ctr_type()</a>
+    <a id="Item5_c1" onkeydown="return searchResults.NavChild(event,5,1)" onkeypress="return searchResults.NavChild(event,5,1)" onkeyup="return searchResults.NavChild(event,5,1)" class="SRScope" href="../structr123_1_1AESNI4x32.html#ab8a1f8a822eecfc9e587bad76792df32" target="_parent">r123::AESNI4x32::ctr_type()</a>
+    <a id="Item5_c2" onkeydown="return searchResults.NavChild(event,5,2)" onkeypress="return searchResults.NavChild(event,5,2)" onkeyup="return searchResults.NavChild(event,5,2)" class="SRScope" href="../structr123_1_1ARS1xm128i__R.html#a13a62c94f63054828c6960979f42a268" target="_parent">r123::ARS1xm128i_R::ctr_type()</a>
+    <a id="Item5_c3" onkeydown="return searchResults.NavChild(event,5,3)" onkeypress="return searchResults.NavChild(event,5,3)" onkeyup="return searchResults.NavChild(event,5,3)" class="SRScope" href="../structr123_1_1ARS4x32__R.html#a9951dbcb50de849ded7177109b344045" target="_parent">r123::ARS4x32_R::ctr_type()</a>
+    <a id="Item5_c4" onkeydown="return searchResults.NavChild(event,5,4)" onkeypress="return searchResults.NavChild(event,5,4)" onkeyup="return searchResults.NavChild(event,5,4)" class="SRScope" href="../classr123_1_1MicroURNG.html#a5aba882fd21e4d8f1a445f546e1e4476" target="_parent">r123::MicroURNG::ctr_type()</a>
+    <a id="Item5_c5" onkeydown="return searchResults.NavChild(event,5,5)" onkeypress="return searchResults.NavChild(event,5,5)" onkeyup="return searchResults.NavChild(event,5,5)" class="SRScope" href="../structr123_1_1Philox2x32__R.html#af00c84c482900fbeca6bd2043395e599" target="_parent">r123::Philox2x32_R::ctr_type()</a>
+    <a id="Item5_c6" onkeydown="return searchResults.NavChild(event,5,6)" onkeypress="return searchResults.NavChild(event,5,6)" onkeyup="return searchResults.NavChild(event,5,6)" class="SRScope" href="../structr123_1_1Philox4x32__R.html#a23adf0320faed0fe4d12ebececdba50a" target="_parent">r123::Philox4x32_R::ctr_type()</a>
+    <a id="Item5_c7" onkeydown="return searchResults.NavChild(event,5,7)" onkeypress="return searchResults.NavChild(event,5,7)" onkeyup="return searchResults.NavChild(event,5,7)" class="SRScope" href="../structr123_1_1Philox2x64__R.html#a8e615e3f4680b9e1b986ea071fd173fc" target="_parent">r123::Philox2x64_R::ctr_type()</a>
+    <a id="Item5_c8" onkeydown="return searchResults.NavChild(event,5,8)" onkeypress="return searchResults.NavChild(event,5,8)" onkeyup="return searchResults.NavChild(event,5,8)" class="SRScope" href="../structr123_1_1Philox4x64__R.html#afd5f78b34ae7c478ebe16eb601f7b202" target="_parent">r123::Philox4x64_R::ctr_type()</a>
+    <a id="Item5_c9" onkeydown="return searchResults.NavChild(event,5,9)" onkeypress="return searchResults.NavChild(event,5,9)" onkeyup="return searchResults.NavChild(event,5,9)" class="SRScope" href="../structr123_1_1ReinterpretCtr.html#a26cf9e933b35411c37070c948085ba02" target="_parent">r123::ReinterpretCtr::ctr_type()</a>
+    <a id="Item5_c10" onkeydown="return searchResults.NavChild(event,5,10)" onkeypress="return searchResults.NavChild(event,5,10)" onkeyup="return searchResults.NavChild(event,5,10)" class="SRScope" href="../structr123_1_1Threefry2x32__R.html#a60b1b58aeaa05d467607dc570aed1357" target="_parent">r123::Threefry2x32_R::ctr_type()</a>
+    <a id="Item5_c11" onkeydown="return searchResults.NavChild(event,5,11)" onkeypress="return searchResults.NavChild(event,5,11)" onkeyup="return searchResults.NavChild(event,5,11)" class="SRScope" href="../structr123_1_1Threefry4x32__R.html#ae89dabc0060c62e0d9e5c4ac34a8550f" target="_parent">r123::Threefry4x32_R::ctr_type()</a>
+    <a id="Item5_c12" onkeydown="return searchResults.NavChild(event,5,12)" onkeypress="return searchResults.NavChild(event,5,12)" onkeyup="return searchResults.NavChild(event,5,12)" class="SRScope" href="../structr123_1_1Threefry2x64__R.html#a6b151f30bc5544671596b9df91e896d8" target="_parent">r123::Threefry2x64_R::ctr_type()</a>
+    <a id="Item5_c13" onkeydown="return searchResults.NavChild(event,5,13)" onkeypress="return searchResults.NavChild(event,5,13)" onkeyup="return searchResults.NavChild(event,5,13)" class="SRScope" href="../structr123_1_1Threefry4x64__R.html#a6c93334cb8a8b53ef01cc79b5296af0d" target="_parent">r123::Threefry4x64_R::ctr_type()</a>
+    <a id="Item5_c14" onkeydown="return searchResults.NavChild(event,5,14)" onkeypress="return searchResults.NavChild(event,5,14)" onkeyup="return searchResults.NavChild(event,5,14)" class="SRScope" href="../structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90" target="_parent">r123::Engine::ctr_type()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/typedefs_64.html b/lib/Random123-1.08/docs/html/search/typedefs_64.html
new file mode 100644
index 0000000..b9054eb
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/typedefs_64.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_difference_5ftype">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_difference_5ftype')">difference_type</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#a1084c78861e725e58c14c67af242952f" target="_parent">r123array1x32::difference_type()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array2x32.html#aa3dfe31d2483fb629a9e3ac304b24d07" target="_parent">r123array2x32::difference_type()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array4x32.html#a3c690c039797cafe4718c03377937fb7" target="_parent">r123array4x32::difference_type()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array8x32.html#af8029821cb8a7b5a3500adb30d4f2326" target="_parent">r123array8x32::difference_type()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array1x64.html#a2abaa7dd6823b724ec6038b504c77011" target="_parent">r123array1x64::difference_type()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array2x64.html#a4227cd6be973fdb0d72398d0b5604da8" target="_parent">r123array2x64::difference_type()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array4x64.html#a3b1c7395f17992d8760fe93d3930db12" target="_parent">r123array4x64::difference_type()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array16x8.html#aaae0b6c18de6ce92ea55bf1b9bdbdf69" target="_parent">r123array16x8::difference_type()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1xm128i.html#a319811ed6105c3050135d8ec3ba36f7a" target="_parent">r123array1xm128i::difference_type()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/typedefs_65.html b/lib/Random123-1.08/docs/html/search/typedefs_65.html
new file mode 100644
index 0000000..df445a1
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/typedefs_65.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_elem_5ftype">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123_1_1Engine.html#a8fb9eb1ab76ad9b5374a47cf84ecd306" target="_parent">elem_type</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/typedefs_69.html b/lib/Random123-1.08/docs/html/search/typedefs_69.html
new file mode 100644
index 0000000..6864b68
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/typedefs_69.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_iterator">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_iterator')">iterator</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#ad17f00c1dbff151f91d381f7c0b99dc8" target="_parent">r123array1x32::iterator()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array2x32.html#a4b447adc28d536d9b7ad7e33d5081a8e" target="_parent">r123array2x32::iterator()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array4x32.html#a73a2a55a200af374d7299d2de13aa5cc" target="_parent">r123array4x32::iterator()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array8x32.html#aad8ff34e784d954a05f3f058facfb2be" target="_parent">r123array8x32::iterator()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array1x64.html#a486a75094513f75c268901b3bb6666ad" target="_parent">r123array1x64::iterator()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array2x64.html#ac0fc5019e017f50e29d26df233085e56" target="_parent">r123array2x64::iterator()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array4x64.html#adfc9f1209d12f855b9330ecccc8b6dd2" target="_parent">r123array4x64::iterator()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array16x8.html#a36bdba5b2d96c8dfe9b7e59b203d5047" target="_parent">r123array16x8::iterator()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1xm128i.html#af9db87a7c1ae4c7ba1e355af89b4d22d" target="_parent">r123array1xm128i::iterator()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/typedefs_6b.html b/lib/Random123-1.08/docs/html/search/typedefs_6b.html
new file mode 100644
index 0000000..98b0c20
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/typedefs_6b.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_key_5ftype">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_key_5ftype')">key_type</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123_1_1AESNI1xm128i.html#a7dc33fd5abf509d9d16b571b23867a6b" target="_parent">r123::AESNI1xm128i::key_type()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123_1_1AESNI4x32.html#a3f47cb319d03ede5fd557800b618d28a" target="_parent">r123::AESNI4x32::key_type()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123_1_1ARS1xm128i__R.html#a8454d6de92379d9a6551d11828fbebc3" target="_parent">r123::ARS1xm128i_R::key_type()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123_1_1ARS4x32__R.html#a7a651b6747b9e7c038bc6d11ffa2863e" target="_parent">r123::ARS4x32_R::key_type()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../classr123_1_1MicroURNG.html#aef90e6157f360434342ad0df4ce5f364" target="_parent">r123::MicroURNG::key_type()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123_1_1Philox2x32__R.html#a37dac768d36ef39e0228369e91b9f0ab" target="_parent">r123::Philox2x32_R::key_type()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123_1_1Philox4x32__R.html#afa2e99f3e0b635f17ba9e16c186af63b" target="_parent">r123::Philox4x32_R::key_type()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123_1_1Philox2x64__R.html#adb8a638d3d96ef0ab594b0320bae329f" target="_parent">r123::Philox2x64_R::key_type()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123_1_1Philox4x64__R.html#a9947ce12e3d03f9a60396d79bb56ba1c" target="_parent">r123::Philox4x64_R::key_type()</a>
+    <a id="Item0_c9" onkeydown="return searchResults.NavChild(event,0,9)" onkeypress="return searchResults.NavChild(event,0,9)" onkeyup="return searchResults.NavChild(event,0,9)" class="SRScope" href="../structr123_1_1ReinterpretCtr.html#a470b21676ed709aa9d9ad524a67410f1" target="_parent">r123::ReinterpretCtr::key_type()</a>
+    <a id="Item0_c10" onkeydown="return searchResults.NavChild(event,0,10)" onkeypress="return searchResults.NavChild(event,0,10)" onkeyup="return searchResults.NavChild(event,0,10)" class="SRScope" href="../structr123_1_1Threefry2x32__R.html#abfaaff871ef5e2e2cf397884ddab4cdc" target="_parent">r123::Threefry2x32_R::key_type()</a>
+    <a id="Item0_c11" onkeydown="return searchResults.NavChild(event,0,11)" onkeypress="return searchResults.NavChild(event,0,11)" onkeyup="return searchResults.NavChild(event,0,11)" class="SRScope" href="../structr123_1_1Threefry4x32__R.html#a140f5cf20bde7784d778b82f0ebf8778" target="_parent">r123::Threefry4x32_R::key_type()</a>
+    <a id="Item0_c12" onkeydown="return searchResults.NavChild(event,0,12)" onkeypress="return searchResults.NavChild(event,0,12)" onkeyup="return searchResults.NavChild(event,0,12)" class="SRScope" href="../structr123_1_1Threefry2x64__R.html#ae652f0e9ca6ec234fd2f4fc9afb1007c" target="_parent">r123::Threefry2x64_R::key_type()</a>
+    <a id="Item0_c13" onkeydown="return searchResults.NavChild(event,0,13)" onkeypress="return searchResults.NavChild(event,0,13)" onkeyup="return searchResults.NavChild(event,0,13)" class="SRScope" href="../structr123_1_1Threefry4x64__R.html#adb406d1af0e757bd8058582ee39f21dc" target="_parent">r123::Threefry4x64_R::key_type()</a>
+    <a id="Item0_c14" onkeydown="return searchResults.NavChild(event,0,14)" onkeypress="return searchResults.NavChild(event,0,14)" onkeyup="return searchResults.NavChild(event,0,14)" class="SRScope" href="../structr123_1_1Engine.html#a18132a79d2327990c4809b37300eddc3" target="_parent">r123::Engine::key_type()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/typedefs_70.html b/lib/Random123-1.08/docs/html/search/typedefs_70.html
new file mode 100644
index 0000000..164582a
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/typedefs_70.html
@@ -0,0 +1,132 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_philox2x32">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../group__PhiloxNxW.html#ga81659a3ee5a1ca9e2e85c5d725a1ea4f" target="_parent">Philox2x32</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x32_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../philox_8h.html#a5fad831cdbd677bc6e53d37c0191f5e3" target="_parent">philox2x32_ctr_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x32_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../philox_8h.html#a55c0e4adeab3387915f966a0e40dc036" target="_parent">philox2x32_key_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x32_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../philox_8h.html#abf96b0e95504989c58e6d3436b013a6b" target="_parent">philox2x32_ukey_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x64">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../group__PhiloxNxW.html#ga616a669079ac25119353416c14d46426" target="_parent">Philox2x64</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x64_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../philox_8h.html#a33fa626a4198f38d87713ae9504e53f2" target="_parent">philox2x64_ctr_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x64_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="../philox_8h.html#a190087c2584155a936ec7d7b9e8d7f34" target="_parent">philox2x64_key_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox2x64_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item7" onkeydown="return searchResults.Nav(event,7)" onkeypress="return searchResults.Nav(event,7)" onkeyup="return searchResults.Nav(event,7)" class="SRSymbol" href="../philox_8h.html#a419cc7ebdeeaa1fc8249c638eac3d00b" target="_parent">philox2x64_ukey_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x32">
+ <div class="SREntry">
+  <a id="Item8" onkeydown="return searchResults.Nav(event,8)" onkeypress="return searchResults.Nav(event,8)" onkeyup="return searchResults.Nav(event,8)" class="SRSymbol" href="../group__PhiloxNxW.html#gaafd54060af05012db410034e3c0ecdc4" target="_parent">Philox4x32</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x32_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item9" onkeydown="return searchResults.Nav(event,9)" onkeypress="return searchResults.Nav(event,9)" onkeyup="return searchResults.Nav(event,9)" class="SRSymbol" href="../philox_8h.html#a96f2a94ebcd7aba28aaeb0aba6543d2d" target="_parent">philox4x32_ctr_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x32_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item10" onkeydown="return searchResults.Nav(event,10)" onkeypress="return searchResults.Nav(event,10)" onkeyup="return searchResults.Nav(event,10)" class="SRSymbol" href="../philox_8h.html#ab1e74b78fcee751b43739b2b4415c592" target="_parent">philox4x32_key_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x32_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item11" onkeydown="return searchResults.Nav(event,11)" onkeypress="return searchResults.Nav(event,11)" onkeyup="return searchResults.Nav(event,11)" class="SRSymbol" href="../philox_8h.html#a82e1d60f98bfbb600bde2bd939de4573" target="_parent">philox4x32_ukey_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x64">
+ <div class="SREntry">
+  <a id="Item12" onkeydown="return searchResults.Nav(event,12)" onkeypress="return searchResults.Nav(event,12)" onkeyup="return searchResults.Nav(event,12)" class="SRSymbol" href="../group__PhiloxNxW.html#ga7776f4d481b7c0ac00db70272a1c77f0" target="_parent">Philox4x64</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x64_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item13" onkeydown="return searchResults.Nav(event,13)" onkeypress="return searchResults.Nav(event,13)" onkeyup="return searchResults.Nav(event,13)" class="SRSymbol" href="../philox_8h.html#a4d2063cc89bf13153ddeff0d94371986" target="_parent">philox4x64_ctr_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x64_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item14" onkeydown="return searchResults.Nav(event,14)" onkeypress="return searchResults.Nav(event,14)" onkeyup="return searchResults.Nav(event,14)" class="SRSymbol" href="../philox_8h.html#a0c8c9410e9d88d4c94e8093007e39b0c" target="_parent">philox4x64_key_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_philox4x64_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item15" onkeydown="return searchResults.Nav(event,15)" onkeypress="return searchResults.Nav(event,15)" onkeyup="return searchResults.Nav(event,15)" class="SRSymbol" href="../philox_8h.html#a689ed8276d25fe0c983c4eb5b9a32fd4" target="_parent">philox4x64_ukey_t</a>
+  <span class="SRScope">philox.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_pointer">
+ <div class="SREntry">
+  <a id="Item16" onkeydown="return searchResults.Nav(event,16)" onkeypress="return searchResults.Nav(event,16)" onkeyup="return searchResults.Nav(event,16)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_pointer')">pointer</a>
+  <div class="SRChildren">
+    <a id="Item16_c0" onkeydown="return searchResults.NavChild(event,16,0)" onkeypress="return searchResults.NavChild(event,16,0)" onkeyup="return searchResults.NavChild(event,16,0)" class="SRScope" href="../structr123array1x32.html#a85ce46c2e10ab3d9c4f60aebe6268898" target="_parent">r123array1x32::pointer()</a>
+    <a id="Item16_c1" onkeydown="return searchResults.NavChild(event,16,1)" onkeypress="return searchResults.NavChild(event,16,1)" onkeyup="return searchResults.NavChild(event,16,1)" class="SRScope" href="../structr123array2x32.html#ac884bcbd1063811354bfac66262a0b42" target="_parent">r123array2x32::pointer()</a>
+    <a id="Item16_c2" onkeydown="return searchResults.NavChild(event,16,2)" onkeypress="return searchResults.NavChild(event,16,2)" onkeyup="return searchResults.NavChild(event,16,2)" class="SRScope" href="../structr123array4x32.html#adcef39f1e3989578b4c0a92524a15df2" target="_parent">r123array4x32::pointer()</a>
+    <a id="Item16_c3" onkeydown="return searchResults.NavChild(event,16,3)" onkeypress="return searchResults.NavChild(event,16,3)" onkeyup="return searchResults.NavChild(event,16,3)" class="SRScope" href="../structr123array8x32.html#aeaf3b46bbc571a21d61ad6ee6e760291" target="_parent">r123array8x32::pointer()</a>
+    <a id="Item16_c4" onkeydown="return searchResults.NavChild(event,16,4)" onkeypress="return searchResults.NavChild(event,16,4)" onkeyup="return searchResults.NavChild(event,16,4)" class="SRScope" href="../structr123array1x64.html#a1c104fabb72d6c72c51348ac72bd419f" target="_parent">r123array1x64::pointer()</a>
+    <a id="Item16_c5" onkeydown="return searchResults.NavChild(event,16,5)" onkeypress="return searchResults.NavChild(event,16,5)" onkeyup="return searchResults.NavChild(event,16,5)" class="SRScope" href="../structr123array2x64.html#a3b0b967b9ae134da266448c190f59c3a" target="_parent">r123array2x64::pointer()</a>
+    <a id="Item16_c6" onkeydown="return searchResults.NavChild(event,16,6)" onkeypress="return searchResults.NavChild(event,16,6)" onkeyup="return searchResults.NavChild(event,16,6)" class="SRScope" href="../structr123array4x64.html#a08c39c2f70f4198a82cba99c0162e67c" target="_parent">r123array4x64::pointer()</a>
+    <a id="Item16_c7" onkeydown="return searchResults.NavChild(event,16,7)" onkeypress="return searchResults.NavChild(event,16,7)" onkeyup="return searchResults.NavChild(event,16,7)" class="SRScope" href="../structr123array16x8.html#aa6ae2e4843b3bb1b66425afa7da9e281" target="_parent">r123array16x8::pointer()</a>
+    <a id="Item16_c8" onkeydown="return searchResults.NavChild(event,16,8)" onkeypress="return searchResults.NavChild(event,16,8)" onkeyup="return searchResults.NavChild(event,16,8)" class="SRScope" href="../structr123array1xm128i.html#a4f78260ba2ec595bdc56fc21fd45e45a" target="_parent">r123array1xm128i::pointer()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/typedefs_72.html b/lib/Random123-1.08/docs/html/search/typedefs_72.html
new file mode 100644
index 0000000..8e35203
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/typedefs_72.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_reference">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_reference')">reference</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#ae5aa4e3a65528495ea71371529ade7d7" target="_parent">r123array1x32::reference()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array2x32.html#aacd028d9f97ec8a2f484f0eff815abd5" target="_parent">r123array2x32::reference()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array4x32.html#a620f00f67215ab7fd344ec551c596712" target="_parent">r123array4x32::reference()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array8x32.html#a4027cd913ec90428d5d0dcad23a5dc2b" target="_parent">r123array8x32::reference()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array1x64.html#a6b196cbfb84a28a57f24cd976c6fd6e6" target="_parent">r123array1x64::reference()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array2x64.html#a7150b3ad865d00ca1f753accd8165336" target="_parent">r123array2x64::reference()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array4x64.html#a14ea48b972d46d9424c317db9698224f" target="_parent">r123array4x64::reference()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array16x8.html#adf010ea54bc2f9dceb8568d59c6dde8a" target="_parent">r123array16x8::reference()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1xm128i.html#a34f0cbdac5eb89118ecf2ab5939fbf83" target="_parent">r123array1xm128i::reference()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_result_5ftype">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_result_5ftype')">result_type</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../classr123_1_1MicroURNG.html#a512957c3e7b3d22741ef0a436b973c2b" target="_parent">r123::MicroURNG::result_type()</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45" target="_parent">r123::Engine::result_type()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR_reverse_5fiterator">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_reverse_5fiterator')">reverse_iterator</a>
+  <div class="SRChildren">
+    <a id="Item2_c0" onkeydown="return searchResults.NavChild(event,2,0)" onkeypress="return searchResults.NavChild(event,2,0)" onkeyup="return searchResults.NavChild(event,2,0)" class="SRScope" href="../structr123array1x32.html#a21cb520afa483ae177c469f3940e7ed2" target="_parent">r123array1x32::reverse_iterator()</a>
+    <a id="Item2_c1" onkeydown="return searchResults.NavChild(event,2,1)" onkeypress="return searchResults.NavChild(event,2,1)" onkeyup="return searchResults.NavChild(event,2,1)" class="SRScope" href="../structr123array2x32.html#ad0b05bbfee2d432dfef71342f14b8430" target="_parent">r123array2x32::reverse_iterator()</a>
+    <a id="Item2_c2" onkeydown="return searchResults.NavChild(event,2,2)" onkeypress="return searchResults.NavChild(event,2,2)" onkeyup="return searchResults.NavChild(event,2,2)" class="SRScope" href="../structr123array4x32.html#aaabdf758fb4a56eaf4cf256654f41314" target="_parent">r123array4x32::reverse_iterator()</a>
+    <a id="Item2_c3" onkeydown="return searchResults.NavChild(event,2,3)" onkeypress="return searchResults.NavChild(event,2,3)" onkeyup="return searchResults.NavChild(event,2,3)" class="SRScope" href="../structr123array8x32.html#acab5de900b99bad5f69009f48fa72235" target="_parent">r123array8x32::reverse_iterator()</a>
+    <a id="Item2_c4" onkeydown="return searchResults.NavChild(event,2,4)" onkeypress="return searchResults.NavChild(event,2,4)" onkeyup="return searchResults.NavChild(event,2,4)" class="SRScope" href="../structr123array1x64.html#ac9c44218c6761d9e6f422435e49acb17" target="_parent">r123array1x64::reverse_iterator()</a>
+    <a id="Item2_c5" onkeydown="return searchResults.NavChild(event,2,5)" onkeypress="return searchResults.NavChild(event,2,5)" onkeyup="return searchResults.NavChild(event,2,5)" class="SRScope" href="../structr123array2x64.html#abcbf25662447a5241ed4d19c202f647a" target="_parent">r123array2x64::reverse_iterator()</a>
+    <a id="Item2_c6" onkeydown="return searchResults.NavChild(event,2,6)" onkeypress="return searchResults.NavChild(event,2,6)" onkeyup="return searchResults.NavChild(event,2,6)" class="SRScope" href="../structr123array4x64.html#acc93aa79ca040ce8fd0957ac86caa2f9" target="_parent">r123array4x64::reverse_iterator()</a>
+    <a id="Item2_c7" onkeydown="return searchResults.NavChild(event,2,7)" onkeypress="return searchResults.NavChild(event,2,7)" onkeyup="return searchResults.NavChild(event,2,7)" class="SRScope" href="../structr123array16x8.html#aeeb5d6d55c07a515e4c7d01cb5c5351b" target="_parent">r123array16x8::reverse_iterator()</a>
+    <a id="Item2_c8" onkeydown="return searchResults.NavChild(event,2,8)" onkeypress="return searchResults.NavChild(event,2,8)" onkeyup="return searchResults.NavChild(event,2,8)" class="SRScope" href="../structr123array1xm128i.html#a6a507944eb872540e73e7a839cbc8e30" target="_parent">r123array1xm128i::reverse_iterator()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/typedefs_73.html b/lib/Random123-1.08/docs/html/search/typedefs_73.html
new file mode 100644
index 0000000..006a314
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/typedefs_73.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_size_5ftype">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_size_5ftype')">size_type</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53" target="_parent">r123array1x32::size_type()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91" target="_parent">r123array2x32::size_type()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af" target="_parent">r123array4x32::size_type()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17" target="_parent">r123array8x32::size_type()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7" target="_parent">r123array1x64::size_type()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array2x64.html#aacb6269c183cc408285dca02e3b55526" target="_parent">r123array2x64::size_type()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af" target="_parent">r123array4x64::size_type()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952" target="_parent">r123array16x8::size_type()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c" target="_parent">r123array1xm128i::size_type()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/typedefs_74.html b/lib/Random123-1.08/docs/html/search/typedefs_74.html
new file mode 100644
index 0000000..ab87843
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/typedefs_74.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_threefry2x32">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../group__ThreefryNxW.html#ga1c32939b65f84966c93677f4382ea36d" target="_parent">Threefry2x32</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x32_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../threefry_8h.html#ac0724455e1e9218f982501247d384833" target="_parent">threefry2x32_ctr_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x32_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item2" onkeydown="return searchResults.Nav(event,2)" onkeypress="return searchResults.Nav(event,2)" onkeyup="return searchResults.Nav(event,2)" class="SRSymbol" href="../threefry_8h.html#a9ebab1ff37a7c983a4d5af114fb8f1c7" target="_parent">threefry2x32_key_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x32_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item3" onkeydown="return searchResults.Nav(event,3)" onkeypress="return searchResults.Nav(event,3)" onkeyup="return searchResults.Nav(event,3)" class="SRSymbol" href="../threefry_8h.html#a642ffe8cacdd9e8f6b376bdffff36d24" target="_parent">threefry2x32_ukey_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64">
+ <div class="SREntry">
+  <a id="Item4" onkeydown="return searchResults.Nav(event,4)" onkeypress="return searchResults.Nav(event,4)" onkeyup="return searchResults.Nav(event,4)" class="SRSymbol" href="../group__ThreefryNxW.html#ga2b54dd1b0d20f09239be5f8757f1f3db" target="_parent">Threefry2x64</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item5" onkeydown="return searchResults.Nav(event,5)" onkeypress="return searchResults.Nav(event,5)" onkeyup="return searchResults.Nav(event,5)" class="SRSymbol" href="../threefry_8h.html#a13c6df8879e7c13605fc1dc67cb2173b" target="_parent">threefry2x64_ctr_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item6" onkeydown="return searchResults.Nav(event,6)" onkeypress="return searchResults.Nav(event,6)" onkeyup="return searchResults.Nav(event,6)" class="SRSymbol" href="../threefry_8h.html#a31a08f696af23b0e339126bc64a78812" target="_parent">threefry2x64_key_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry2x64_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item7" onkeydown="return searchResults.Nav(event,7)" onkeypress="return searchResults.Nav(event,7)" onkeyup="return searchResults.Nav(event,7)" class="SRSymbol" href="../threefry_8h.html#abb918225d16fcdf0b2659e2096d182b9" target="_parent">threefry2x64_ukey_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32">
+ <div class="SREntry">
+  <a id="Item8" onkeydown="return searchResults.Nav(event,8)" onkeypress="return searchResults.Nav(event,8)" onkeyup="return searchResults.Nav(event,8)" class="SRSymbol" href="../group__ThreefryNxW.html#gacb09a2dcfb7389769f0c58f45f132aaa" target="_parent">Threefry4x32</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item9" onkeydown="return searchResults.Nav(event,9)" onkeypress="return searchResults.Nav(event,9)" onkeyup="return searchResults.Nav(event,9)" class="SRSymbol" href="../threefry_8h.html#aa72e480598b54b5bbc640a101f9cbe6e" target="_parent">threefry4x32_ctr_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item10" onkeydown="return searchResults.Nav(event,10)" onkeypress="return searchResults.Nav(event,10)" onkeyup="return searchResults.Nav(event,10)" class="SRSymbol" href="../threefry_8h.html#af332bdaec196cee5378cab4fd049ecde" target="_parent">threefry4x32_key_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x32_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item11" onkeydown="return searchResults.Nav(event,11)" onkeypress="return searchResults.Nav(event,11)" onkeyup="return searchResults.Nav(event,11)" class="SRSymbol" href="../threefry_8h.html#ad65418f4e2c8d8df38059aabc2cc98b6" target="_parent">threefry4x32_ukey_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64">
+ <div class="SREntry">
+  <a id="Item12" onkeydown="return searchResults.Nav(event,12)" onkeypress="return searchResults.Nav(event,12)" onkeyup="return searchResults.Nav(event,12)" class="SRSymbol" href="../group__ThreefryNxW.html#gae17c98bddf067365508ed0717f865e8b" target="_parent">Threefry4x64</a>
+  <span class="SRScope">r123</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64_5fctr_5ft">
+ <div class="SREntry">
+  <a id="Item13" onkeydown="return searchResults.Nav(event,13)" onkeypress="return searchResults.Nav(event,13)" onkeyup="return searchResults.Nav(event,13)" class="SRSymbol" href="../threefry_8h.html#a3296098832bc3a243f40078c1b93592e" target="_parent">threefry4x64_ctr_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64_5fkey_5ft">
+ <div class="SREntry">
+  <a id="Item14" onkeydown="return searchResults.Nav(event,14)" onkeypress="return searchResults.Nav(event,14)" onkeyup="return searchResults.Nav(event,14)" class="SRSymbol" href="../threefry_8h.html#ad51f07c7dc47238532cbc05e89f5cef9" target="_parent">threefry4x64_key_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_threefry4x64_5fukey_5ft">
+ <div class="SREntry">
+  <a id="Item15" onkeydown="return searchResults.Nav(event,15)" onkeypress="return searchResults.Nav(event,15)" onkeyup="return searchResults.Nav(event,15)" class="SRSymbol" href="../threefry_8h.html#a6b4db94d5185220d4fcec72f92a391ad" target="_parent">threefry4x64_ukey_t</a>
+  <span class="SRScope">threefry.h</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/typedefs_75.html b/lib/Random123-1.08/docs/html/search/typedefs_75.html
new file mode 100644
index 0000000..69a6f3c
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/typedefs_75.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_ukey_5ftype">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_ukey_5ftype')">ukey_type</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123_1_1AESNI1xm128i.html#a1f405533da84d98b938030190a63cec5" target="_parent">r123::AESNI1xm128i::ukey_type()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123_1_1AESNI4x32.html#a3fbb6113e70575dce3b6047a22a751f4" target="_parent">r123::AESNI4x32::ukey_type()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123_1_1ARS1xm128i__R.html#ab26c7029e347e6b1e17dad795e462aeb" target="_parent">r123::ARS1xm128i_R::ukey_type()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123_1_1ARS4x32__R.html#aa4bd7be98acb8b0299fb0ffce3db69ee" target="_parent">r123::ARS4x32_R::ukey_type()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../classr123_1_1MicroURNG.html#a7e6fd93fec2fe138ee36b401ff376cfc" target="_parent">r123::MicroURNG::ukey_type()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123_1_1Philox2x32__R.html#a8982960eb5a3b5afc26c8e8d6639275e" target="_parent">r123::Philox2x32_R::ukey_type()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123_1_1Philox4x32__R.html#a804c8700155da93039c339ac83df99dd" target="_parent">r123::Philox4x32_R::ukey_type()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123_1_1Philox2x64__R.html#a0c4cfeb8c3f00d1755ee047790c9da1c" target="_parent">r123::Philox2x64_R::ukey_type()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123_1_1Philox4x64__R.html#a4715e37129fb4ca9d7671cb9df4fa8c5" target="_parent">r123::Philox4x64_R::ukey_type()</a>
+    <a id="Item0_c9" onkeydown="return searchResults.NavChild(event,0,9)" onkeypress="return searchResults.NavChild(event,0,9)" onkeyup="return searchResults.NavChild(event,0,9)" class="SRScope" href="../structr123_1_1ReinterpretCtr.html#a4b0b69c1aa58d62bb22e51e16c586bee" target="_parent">r123::ReinterpretCtr::ukey_type()</a>
+    <a id="Item0_c10" onkeydown="return searchResults.NavChild(event,0,10)" onkeypress="return searchResults.NavChild(event,0,10)" onkeyup="return searchResults.NavChild(event,0,10)" class="SRScope" href="../structr123_1_1Threefry2x32__R.html#a3ab3969f7445f9fe935566fdc017c5ca" target="_parent">r123::Threefry2x32_R::ukey_type()</a>
+    <a id="Item0_c11" onkeydown="return searchResults.NavChild(event,0,11)" onkeypress="return searchResults.NavChild(event,0,11)" onkeyup="return searchResults.NavChild(event,0,11)" class="SRScope" href="../structr123_1_1Threefry4x32__R.html#aab22e360de3f5e13f018ccf3a6754a8f" target="_parent">r123::Threefry4x32_R::ukey_type()</a>
+    <a id="Item0_c12" onkeydown="return searchResults.NavChild(event,0,12)" onkeypress="return searchResults.NavChild(event,0,12)" onkeyup="return searchResults.NavChild(event,0,12)" class="SRScope" href="../structr123_1_1Threefry2x64__R.html#a57db271865ab1889c8f569fb053ee66d" target="_parent">r123::Threefry2x64_R::ukey_type()</a>
+    <a id="Item0_c13" onkeydown="return searchResults.NavChild(event,0,13)" onkeypress="return searchResults.NavChild(event,0,13)" onkeyup="return searchResults.NavChild(event,0,13)" class="SRScope" href="../structr123_1_1Threefry4x64__R.html#a087ff88f84d115a6a726e008c6dcc325" target="_parent">r123::Threefry4x64_R::ukey_type()</a>
+    <a id="Item0_c14" onkeydown="return searchResults.NavChild(event,0,14)" onkeypress="return searchResults.NavChild(event,0,14)" onkeyup="return searchResults.NavChild(event,0,14)" class="SRScope" href="../structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3" target="_parent">r123::Engine::ukey_type()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/typedefs_76.html b/lib/Random123-1.08/docs/html/search/typedefs_76.html
new file mode 100644
index 0000000..e9b9a32
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/typedefs_76.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_value_5ftype">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_value_5ftype')">value_type</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#a9c8e0d672be32b52eef639f1a3b2b98a" target="_parent">r123array1x32::value_type()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array2x32.html#ab669df8d33d32ee3571210eb090c6cb2" target="_parent">r123array2x32::value_type()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array4x32.html#a5ba59b507edcf793ba186a9a4e8c56d5" target="_parent">r123array4x32::value_type()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array8x32.html#af47fd0d348b68dd7a2853c68eb32d8b7" target="_parent">r123array8x32::value_type()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array1x64.html#a4d8280ccd7087d5c3faba27641e8fbe7" target="_parent">r123array1x64::value_type()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array2x64.html#acefd9fb46661254e17877844c545e15f" target="_parent">r123array2x64::value_type()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array4x64.html#ae4a79be3ab80944a8bb6bc7ec7907061" target="_parent">r123array4x64::value_type()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array16x8.html#ad1d7184f51cafaff4714a2dcf60c9ae2" target="_parent">r123array16x8::value_type()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1xm128i.html#a70ab4e530c7cce9481e07aa0b21dd96b" target="_parent">r123array1xm128i::value_type()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/variables_5f.html b/lib/Random123-1.08/docs/html/search/variables_5f.html
new file mode 100644
index 0000000..2269714
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/variables_5f.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR__5fmax">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR__5fmax')">_Max</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../classr123_1_1MicroURNG.html#a4faecd7ab54c7678ee66c413bb984bf0" target="_parent">r123::MicroURNG::_Max()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123_1_1Engine.html#ae549f81e966b0414bcaf0f24b566ebd8" target="_parent">r123::Engine::_Max()</a>
+  </div>
+ </div>
+</div>
+<div class="SRResult" id="SR__5fmin">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="javascript:searchResults.Toggle('SR__5fmin')">_Min</a>
+  <div class="SRChildren">
+    <a id="Item1_c0" onkeydown="return searchResults.NavChild(event,1,0)" onkeypress="return searchResults.NavChild(event,1,0)" onkeyup="return searchResults.NavChild(event,1,0)" class="SRScope" href="../classr123_1_1MicroURNG.html#a1f2787f136a8a807d14eab8cb1ca8c14" target="_parent">r123::MicroURNG::_Min()</a>
+    <a id="Item1_c1" onkeydown="return searchResults.NavChild(event,1,1)" onkeypress="return searchResults.NavChild(event,1,1)" onkeyup="return searchResults.NavChild(event,1,1)" class="SRScope" href="../structr123_1_1Engine.html#aa73e4d27847915f1438fd37b30777111" target="_parent">r123::Engine::_Min()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/variables_62.html b/lib/Random123-1.08/docs/html/search/variables_62.html
new file mode 100644
index 0000000..7444e62
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/variables_62.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_b">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b" target="_parent">b</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_bits">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../classr123_1_1MicroURNG.html#ac55cddda8fe0808f922f39beee587b27" target="_parent">BITS</a>
+  <span class="SRScope">r123::MicroURNG</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/variables_63.html b/lib/Random123-1.08/docs/html/search/variables_63.html
new file mode 100644
index 0000000..01b7a19
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/variables_63.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_c">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d" target="_parent">c</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/variables_65.html b/lib/Random123-1.08/docs/html/search/variables_65.html
new file mode 100644
index 0000000..5908bba
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/variables_65.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_elem">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319" target="_parent">elem</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/variables_6b.html b/lib/Random123-1.08/docs/html/search/variables_6b.html
new file mode 100644
index 0000000..df8c0d4
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/variables_6b.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_k">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54" target="_parent">k</a>
+  <span class="SRScope">aesni1xm128i_key_t</span>
+ </div>
+</div>
+<div class="SRResult" id="SR_key">
+ <div class="SREntry">
+  <a id="Item1" onkeydown="return searchResults.Nav(event,1)" onkeypress="return searchResults.Nav(event,1)" onkeyup="return searchResults.Nav(event,1)" class="SRSymbol" href="../structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654" target="_parent">key</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/variables_6d.html b/lib/Random123-1.08/docs/html/search/variables_6d.html
new file mode 100644
index 0000000..5206dad
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/variables_6d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_m">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123m128i.html#a9b9908268281aace8028a3f34980634d" target="_parent">m</a>
+  <span class="SRScope">r123m128i</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/variables_72.html b/lib/Random123-1.08/docs/html/search/variables_72.html
new file mode 100644
index 0000000..0d0963b
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/variables_72.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_rounds">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_rounds')">rounds</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123_1_1AESNI1xm128i.html#a1b5a44afde814ba844d8f5442e2a3a5f" target="_parent">r123::AESNI1xm128i::rounds()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123_1_1AESNI4x32.html#a725aad79b8d496d97bed24390f624be6" target="_parent">r123::AESNI4x32::rounds()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123_1_1ARS1xm128i__R.html#abe167a93280140e424d722c1ac47a8e9" target="_parent">r123::ARS1xm128i_R::rounds()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123_1_1ARS4x32__R.html#a710e59a54794b4cd5e55689dd906b9ba" target="_parent">r123::ARS4x32_R::rounds()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123_1_1Philox2x32__R.html#a52ee7b34688fc2e5315152a10d7df5f0" target="_parent">r123::Philox2x32_R::rounds()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123_1_1Philox4x32__R.html#a90d6a86bff4dc6e5e24209423f125140" target="_parent">r123::Philox4x32_R::rounds()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123_1_1Philox2x64__R.html#ac0764d78e07bf6d311b47d0f3ce92450" target="_parent">r123::Philox2x64_R::rounds()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123_1_1Philox4x64__R.html#ac51193ab00b118b75784f86cf3470876" target="_parent">r123::Philox4x64_R::rounds()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123_1_1Threefry2x32__R.html#af5be46f8426cfcd86e75327e4b3750b0" target="_parent">r123::Threefry2x32_R::rounds()</a>
+    <a id="Item0_c9" onkeydown="return searchResults.NavChild(event,0,9)" onkeypress="return searchResults.NavChild(event,0,9)" onkeyup="return searchResults.NavChild(event,0,9)" class="SRScope" href="../structr123_1_1Threefry4x32__R.html#af63fd38ba9acf04ee56d75e96b413291" target="_parent">r123::Threefry4x32_R::rounds()</a>
+    <a id="Item0_c10" onkeydown="return searchResults.NavChild(event,0,10)" onkeypress="return searchResults.NavChild(event,0,10)" onkeyup="return searchResults.NavChild(event,0,10)" class="SRScope" href="../structr123_1_1Threefry2x64__R.html#aa994d756504284e6a59cc8d3c57f16c6" target="_parent">r123::Threefry2x64_R::rounds()</a>
+    <a id="Item0_c11" onkeydown="return searchResults.NavChild(event,0,11)" onkeypress="return searchResults.NavChild(event,0,11)" onkeyup="return searchResults.NavChild(event,0,11)" class="SRScope" href="../structr123_1_1Threefry4x64__R.html#ab8807960eec8fc2198055ec2a971e116" target="_parent">r123::Threefry4x64_R::rounds()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/variables_75.html b/lib/Random123-1.08/docs/html/search/variables_75.html
new file mode 100644
index 0000000..694f9de
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/variables_75.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_ukey">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="../structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f" target="_parent">ukey</a>
+  <span class="SRScope">r123::Engine</span>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/search/variables_76.html b/lib/Random123-1.08/docs/html/search/variables_76.html
new file mode 100644
index 0000000..9487bd6
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/search/variables_76.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div class="SRResult" id="SR_v">
+ <div class="SREntry">
+  <a id="Item0" onkeydown="return searchResults.Nav(event,0)" onkeypress="return searchResults.Nav(event,0)" onkeyup="return searchResults.Nav(event,0)" class="SRSymbol" href="javascript:searchResults.Toggle('SR_v')">v</a>
+  <div class="SRChildren">
+    <a id="Item0_c0" onkeydown="return searchResults.NavChild(event,0,0)" onkeypress="return searchResults.NavChild(event,0,0)" onkeyup="return searchResults.NavChild(event,0,0)" class="SRScope" href="../structr123array1x32.html#a1123ac44ecadd52dae06d2c8df86764a" target="_parent">r123array1x32::v()</a>
+    <a id="Item0_c1" onkeydown="return searchResults.NavChild(event,0,1)" onkeypress="return searchResults.NavChild(event,0,1)" onkeyup="return searchResults.NavChild(event,0,1)" class="SRScope" href="../structr123array2x32.html#a65524bf06568073021117ef196d6b45f" target="_parent">r123array2x32::v()</a>
+    <a id="Item0_c2" onkeydown="return searchResults.NavChild(event,0,2)" onkeypress="return searchResults.NavChild(event,0,2)" onkeyup="return searchResults.NavChild(event,0,2)" class="SRScope" href="../structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f" target="_parent">r123array4x32::v()</a>
+    <a id="Item0_c3" onkeydown="return searchResults.NavChild(event,0,3)" onkeypress="return searchResults.NavChild(event,0,3)" onkeyup="return searchResults.NavChild(event,0,3)" class="SRScope" href="../structr123array8x32.html#a7a84d2a924a271cc7b5f748023517d10" target="_parent">r123array8x32::v()</a>
+    <a id="Item0_c4" onkeydown="return searchResults.NavChild(event,0,4)" onkeypress="return searchResults.NavChild(event,0,4)" onkeyup="return searchResults.NavChild(event,0,4)" class="SRScope" href="../structr123array1x64.html#a951c4b651e15e5ad4f66d81027c8e1b5" target="_parent">r123array1x64::v()</a>
+    <a id="Item0_c5" onkeydown="return searchResults.NavChild(event,0,5)" onkeypress="return searchResults.NavChild(event,0,5)" onkeyup="return searchResults.NavChild(event,0,5)" class="SRScope" href="../structr123array2x64.html#a547e4a51e531cf36eef885fbf20a7048" target="_parent">r123array2x64::v()</a>
+    <a id="Item0_c6" onkeydown="return searchResults.NavChild(event,0,6)" onkeypress="return searchResults.NavChild(event,0,6)" onkeyup="return searchResults.NavChild(event,0,6)" class="SRScope" href="../structr123array4x64.html#aae3a18410877c49f1058bc4d78a62f48" target="_parent">r123array4x64::v()</a>
+    <a id="Item0_c7" onkeydown="return searchResults.NavChild(event,0,7)" onkeypress="return searchResults.NavChild(event,0,7)" onkeyup="return searchResults.NavChild(event,0,7)" class="SRScope" href="../structr123array16x8.html#a703776a5f85fb222e16b739309489783" target="_parent">r123array16x8::v()</a>
+    <a id="Item0_c8" onkeydown="return searchResults.NavChild(event,0,8)" onkeypress="return searchResults.NavChild(event,0,8)" onkeyup="return searchResults.NavChild(event,0,8)" class="SRScope" href="../structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5" target="_parent">r123array1xm128i::v()</a>
+    <a id="Item0_c9" onkeydown="return searchResults.NavChild(event,0,9)" onkeypress="return searchResults.NavChild(event,0,9)" onkeyup="return searchResults.NavChild(event,0,9)" class="SRScope" href="../structr123_1_1Engine.html#a6169d4fbce1fd7725fabda4c693bf250" target="_parent">r123::Engine::v()</a>
+  </div>
+ </div>
+</div>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/sse_8h.html b/lib/Random123-1.08/docs/html/sse_8h.html
new file mode 100644
index 0000000..f3eae26
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/sse_8h.html
@@ -0,0 +1,527 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/features/sse.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> |
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<h1>Random123/features/sse.h File Reference</h1>  </div>
+</div>
+<div class="contents">
+<code>#include <iostream></code><br/>
+<code>#include <limits></code><br/>
+<code>#include <stdexcept></code><br/>
+
+<p><a href="sse_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123m128i.html">r123m128i</a></td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static int </td><td class="memItemRight" valign="bottom"><a class="el" href="sse_8h.html#a0b35a046e85316295476d7d552411044">haveAESNI</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="sse_8h.html#adac6aaf79c4428abcd30bf583eeb5450">_mm_extract_lo64</a> (__m128i si)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123m128i.html">r123m128i</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="sse_8h.html#a2ffeb79e1a2cbb9cb35b0daf514a06a5">operator++</a> (<a class="el" href="structr123m128i.html">r123m128i</a> &v)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123m128i.html">r123m128i</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="sse_8h.html#a436d4467bb1389d42bfa67686218fd98">operator+=</a> (<a class="el" href="structr123m128i.html">r123m128i</a> &lhs, uint64_t n)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static bool </td><td class="memItemRight" valign="bottom"><a class="el" href="sse_8h.html#a43e11de33821f27448feb163162ec895">operator<=</a> (uint64_t, const <a class="el" href="structr123m128i.html">r123m128i</a> &)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static bool </td><td class="memItemRight" valign="bottom"><a class="el" href="sse_8h.html#ac2c263fa443dd074fe4ff96710219eb8">operator<</a> (const <a class="el" href="structr123m128i.html">r123m128i</a> &, const <a class="el" href="structr123m128i.html">r123m128i</a> &)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static bool </td><td class="memItemRight" valign="bottom"><a class="el" href="sse_8h.html#a9ce245b77f0638255e7138190d0ff4fd">operator<=</a> (const <a class="el" href="structr123m128i.html">r123m128i</a> &, const <a class="el" href="structr123m128i.html">r123m128i</a> &)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static bool </td><td class="memItemRight" valign="bottom"><a class="el" href="sse_8h.html#ad07b59f8110eac57511ee8c2fa697f93">operator></a> (const <a class="el" href="structr123m128i.html">r123m128i</a> &, const <a class="el" href="structr123m128i.html">r123m128i</a> &)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static bool </td><td class="memItemRight" valign="bottom"><a class="el" href="sse_8h.html#aa7bb0ad8bfceb39a1b71262b9476e151">operator>=</a> (const <a class="el" href="structr123m128i.html">r123m128i</a> &, const <a class="el" href="structr123m128i.html">r123m128i</a> &)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static bool </td><td class="memItemRight" valign="bottom"><a class="el" href="sse_8h.html#ab1389a6d8b14bc380c6d6a6d4de8853e">operator==</a> (const <a class="el" href="structr123m128i.html">r123m128i</a> &lhs, const <a class="el" href="structr123m128i.html">r123m128i</a> &rhs)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static bool </td><td class="memItemRight" valign="bottom"><a class="el" href="sse_8h.html#a9fc5dd462afc043229ab800abb8f7d64">operator!=</a> (const <a class="el" href="structr123m128i.html">r123m128i</a> &lhs, const <a class="el" href="structr123m128i.html">r123m128i</a> &rhs)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static bool </td><td class="memItemRight" valign="bottom"><a class="el" href="sse_8h.html#a01fbbba16839c5938b3fa29668870db2">operator==</a> (uint64_t lhs, const <a class="el" href="structr123m128i.html">r123m128i</a> &rhs)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static bool </td><td class="memItemRight" valign="bottom"><a class="el" href="sse_8h.html#a76ef724b020add862a911a699a21451b">operator!=</a> (uint64_t lhs, const <a class="el" href="structr123m128i.html">r123m128i</a> &rhs)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static std::ostream & </td><td class="memItemRight" valign="bottom"><a class="el" href="sse_8h.html#af965b43e09e7305795c7b5a35d20c75f">operator<<</a> (std::ostream &os, const <a class="el" href="structr123m128i.html">r123m128i</a> &m)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static std::istream & </td><td class="memItemRight" valign="bottom"><a class="el" href="sse_8h.html#a202aef4bea97c2203a82676cb6abba40">operator>></a> (std::istream &is, <a class="el" href="structr123m128i.html">r123m128i</a> &m)</td></tr>
+<tr><td class="memTemplParams" colspan="2">template<typename T > </td></tr>
+<tr><td class="memTemplItemLeft" align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="sse_8h.html#a99c42d1da8da3a4a273556a7817b5c1f">assemble_from_u32</a> (uint32_t *p32)</td></tr>
+<tr><td class="memTemplParams" colspan="2">template<> </td></tr>
+<tr><td class="memTemplItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">r123m128i</a> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="sse_8h.html#a0cd6ca87c67023d7afda38319ab40e43">assemble_from_u32< r123m128i ></a> (uint32_t *p32)</td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="adac6aaf79c4428abcd30bf583eeb5450"></a><!-- doxytag: member="sse.h::_mm_extract_lo64" ref="adac6aaf79c4428abcd30bf583eeb5450" args="(__m128i si)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static uint64_t _mm_extract_lo64 </td>
+          <td>(</td>
+          <td class="paramtype">__m128i </td>
+          <td class="paramname"> <em>si</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a99c42d1da8da3a4a273556a7817b5c1f"></a><!-- doxytag: member="sse.h::assemble_from_u32" ref="a99c42d1da8da3a4a273556a7817b5c1f" args="(uint32_t *p32)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">T assemble_from_u32 </td>
+          <td>(</td>
+          <td class="paramtype">uint32_t * </td>
+          <td class="paramname"> <em>p32</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0cd6ca87c67023d7afda38319ab40e43"></a><!-- doxytag: member="sse.h::assemble_from_u32< r123m128i >" ref="a0cd6ca87c67023d7afda38319ab40e43" args="(uint32_t *p32)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">r123m128i</a> assemble_from_u32< <a class="el" href="structr123m128i.html">r123m128i</a> > </td>
+          <td>(</td>
+          <td class="paramtype">uint32_t * </td>
+          <td class="paramname"> <em>p32</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0b35a046e85316295476d7d552411044"></a><!-- doxytag: member="sse.h::haveAESNI" ref="a0b35a046e85316295476d7d552411044" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static int haveAESNI </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9fc5dd462afc043229ab800abb8f7d64"></a><!-- doxytag: member="sse.h::operator!=" ref="a9fc5dd462afc043229ab800abb8f7d64" args="(const r123m128i &lhs, const r123m128i &rhs)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static bool operator!= </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname"> <em>lhs</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname"> <em>rhs</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a76ef724b020add862a911a699a21451b"></a><!-- doxytag: member="sse.h::operator!=" ref="a76ef724b020add862a911a699a21451b" args="(uint64_t lhs, const r123m128i &rhs)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static bool operator!= </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>lhs</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname"> <em>rhs</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2ffeb79e1a2cbb9cb35b0daf514a06a5"></a><!-- doxytag: member="sse.h::operator++" ref="a2ffeb79e1a2cbb9cb35b0daf514a06a5" args="(r123m128i &v)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123m128i.html">r123m128i</a>& operator++ </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname"> <em>v</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a436d4467bb1389d42bfa67686218fd98"></a><!-- doxytag: member="sse.h::operator+=" ref="a436d4467bb1389d42bfa67686218fd98" args="(r123m128i &lhs, uint64_t n)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123m128i.html">r123m128i</a>& operator+= </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname"> <em>lhs</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac2c263fa443dd074fe4ff96710219eb8"></a><!-- doxytag: member="sse.h::operator<" ref="ac2c263fa443dd074fe4ff96710219eb8" args="(const r123m128i &, const r123m128i &)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static bool operator< </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname">, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname"></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af965b43e09e7305795c7b5a35d20c75f"></a><!-- doxytag: member="sse.h::operator<<" ref="af965b43e09e7305795c7b5a35d20c75f" args="(std::ostream &os, const r123m128i &m)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static std::ostream& operator<< </td>
+          <td>(</td>
+          <td class="paramtype">std::ostream & </td>
+          <td class="paramname"> <em>os</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname"> <em>m</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9ce245b77f0638255e7138190d0ff4fd"></a><!-- doxytag: member="sse.h::operator<=" ref="a9ce245b77f0638255e7138190d0ff4fd" args="(const r123m128i &, const r123m128i &)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static bool operator<= </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname">, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname"></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a43e11de33821f27448feb163162ec895"></a><!-- doxytag: member="sse.h::operator<=" ref="a43e11de33821f27448feb163162ec895" args="(uint64_t, const r123m128i &)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static bool operator<= </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname">, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname"></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab1389a6d8b14bc380c6d6a6d4de8853e"></a><!-- doxytag: member="sse.h::operator==" ref="ab1389a6d8b14bc380c6d6a6d4de8853e" args="(const r123m128i &lhs, const r123m128i &rhs)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static bool operator== </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname"> <em>lhs</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname"> <em>rhs</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a01fbbba16839c5938b3fa29668870db2"></a><!-- doxytag: member="sse.h::operator==" ref="a01fbbba16839c5938b3fa29668870db2" args="(uint64_t lhs, const r123m128i &rhs)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static bool operator== </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>lhs</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname"> <em>rhs</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad07b59f8110eac57511ee8c2fa697f93"></a><!-- doxytag: member="sse.h::operator>" ref="ad07b59f8110eac57511ee8c2fa697f93" args="(const r123m128i &, const r123m128i &)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static bool operator> </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname">, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname"></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa7bb0ad8bfceb39a1b71262b9476e151"></a><!-- doxytag: member="sse.h::operator>=" ref="aa7bb0ad8bfceb39a1b71262b9476e151" args="(const r123m128i &, const r123m128i &)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static bool operator>= </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname">, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname"></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a202aef4bea97c2203a82676cb6abba40"></a><!-- doxytag: member="sse.h::operator>>" ref="a202aef4bea97c2203a82676cb6abba40" args="(std::istream &is, r123m128i &m)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static std::istream& operator>> </td>
+          <td>(</td>
+          <td class="paramtype">std::istream & </td>
+          <td class="paramname"> <em>is</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123m128i.html">r123m128i</a> & </td>
+          <td class="paramname"> <em>m</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/sse_8h_source.html b/lib/Random123-1.08/docs/html/sse_8h_source.html
new file mode 100644
index 0000000..3226560
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/sse_8h_source.html
@@ -0,0 +1,355 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/features/sse.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>Random123/features/sse.h</h1>  </div>
+</div>
+<div class="contents">
+<a href="sse_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">Copyright 2010-2011, D. E. Shaw Research.</span>
+<a name="l00003"></a>00003 <span class="comment">All rights reserved.</span>
+<a name="l00004"></a>00004 <span class="comment"></span>
+<a name="l00005"></a>00005 <span class="comment">Redistribution and use in source and binary forms, with or without</span>
+<a name="l00006"></a>00006 <span class="comment">modification, are permitted provided that the following conditions are</span>
+<a name="l00007"></a>00007 <span class="comment">met:</span>
+<a name="l00008"></a>00008 <span class="comment"></span>
+<a name="l00009"></a>00009 <span class="comment">* Redistributions of source code must retain the above copyright</span>
+<a name="l00010"></a>00010 <span class="comment">  notice, this list of conditions, and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"></span>
+<a name="l00012"></a>00012 <span class="comment">* Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00013"></a>00013 <span class="comment">  notice, this list of conditions, and the following disclaimer in the</span>
+<a name="l00014"></a>00014 <span class="comment">  documentation and/or other materials provided with the distribution.</span>
+<a name="l00015"></a>00015 <span class="comment"></span>
+<a name="l00016"></a>00016 <span class="comment">* Neither the name of D. E. Shaw Research nor the names of its</span>
+<a name="l00017"></a>00017 <span class="comment">  contributors may be used to endorse or promote products derived from</span>
+<a name="l00018"></a>00018 <span class="comment">  this software without specific prior written permission.</span>
+<a name="l00019"></a>00019 <span class="comment"></span>
+<a name="l00020"></a>00020 <span class="comment">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span>
+<a name="l00021"></a>00021 <span class="comment">"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span>
+<a name="l00022"></a>00022 <span class="comment">LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span>
+<a name="l00023"></a>00023 <span class="comment">A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span>
+<a name="l00024"></a>00024 <span class="comment">OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
+<a name="l00025"></a>00025 <span class="comment">SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span>
+<a name="l00026"></a>00026 <span class="comment">LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span>
+<a name="l00027"></a>00027 <span class="comment">DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span>
+<a name="l00028"></a>00028 <span class="comment">THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00029"></a>00029 <span class="comment">(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span>
+<a name="l00030"></a>00030 <span class="comment">OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00031"></a>00031 <span class="comment">*/</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#ifndef _Random123_sse_dot_h__</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#define _Random123_sse_dot_h__</span>
+<a name="l00034"></a>00034 <span class="preprocessor"></span>
+<a name="l00035"></a>00035 <span class="preprocessor">#if R123_USE_SSE</span>
+<a name="l00036"></a>00036 <span class="preprocessor"></span>
+<a name="l00037"></a>00037 <span class="preprocessor">#if R123_USE_X86INTRIN_H</span>
+<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#include <x86intrin.h></span>
+<a name="l00039"></a>00039 <span class="preprocessor">#endif</span>
+<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#if R123_USE_IA32INTRIN_H</span>
+<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#include <ia32intrin.h></span>
+<a name="l00042"></a>00042 <span class="preprocessor">#endif</span>
+<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#if R123_USE_XMMINTRIN_H</span>
+<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor">#include <xmmintrin.h></span>
+<a name="l00045"></a>00045 <span class="preprocessor">#endif</span>
+<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor">#if R123_USE_EMMINTRIN_H</span>
+<a name="l00047"></a>00047 <span class="preprocessor"></span><span class="preprocessor">#include <emmintrin.h></span>
+<a name="l00048"></a>00048 <span class="preprocessor">#endif</span>
+<a name="l00049"></a>00049 <span class="preprocessor"></span><span class="preprocessor">#if R123_USE_SMMINTRIN_H</span>
+<a name="l00050"></a>00050 <span class="preprocessor"></span><span class="preprocessor">#include <smmintrin.h></span>
+<a name="l00051"></a>00051 <span class="preprocessor">#endif</span>
+<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#if R123_USE_WMMINTRIN_H</span>
+<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor">#include <wmmintrin.h></span>
+<a name="l00054"></a>00054 <span class="preprocessor">#endif</span>
+<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#if R123_USE_INTRIN_H</span>
+<a name="l00056"></a>00056 <span class="preprocessor"></span><span class="preprocessor">#include <intrin.h></span>
+<a name="l00057"></a>00057 <span class="preprocessor">#endif</span>
+<a name="l00058"></a>00058 <span class="preprocessor"></span><span class="preprocessor">#ifdef __cplusplus</span>
+<a name="l00059"></a>00059 <span class="preprocessor"></span><span class="preprocessor">#include <iostream></span>
+<a name="l00060"></a>00060 <span class="preprocessor">#include <limits></span>
+<a name="l00061"></a>00061 <span class="preprocessor">#include <stdexcept></span>
+<a name="l00062"></a>00062 <span class="preprocessor">#endif</span>
+<a name="l00063"></a>00063 <span class="preprocessor"></span>
+<a name="l00064"></a>00064 <span class="preprocessor">#if R123_USE_ASM_GNU</span>
+<a name="l00065"></a>00065 <span class="preprocessor"></span>
+<a name="l00066"></a>00066 <span class="comment">/* bit25 of CX tells us whether AES is enabled. */</span>
+<a name="l00067"></a>00067 R123_STATIC_INLINE <span class="keywordtype">int</span> <a class="code" href="sse_8h.html#a0b35a046e85316295476d7d552411044">haveAESNI</a>(){
+<a name="l00068"></a>00068     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> eax, ebx, ecx, edx;
+<a name="l00069"></a>00069     __asm__ __volatile__ (<span class="stringliteral">"cpuid"</span>: <span class="stringliteral">"=a"</span> (eax), <span class="stringliteral">"=b"</span> (ebx), <span class="stringliteral">"=c"</span> (ecx), <span class="stringliteral">"=d"</span> (edx) :
+<a name="l00070"></a>00070                       <span class="stringliteral">"a"</span> (1));
+<a name="l00071"></a>00071     <span class="keywordflow">return</span> (ecx>>25) & 1;
+<a name="l00072"></a>00072 }
+<a name="l00073"></a>00073 <span class="preprocessor">#elif R123_USE_CPUID_MSVC</span>
+<a name="l00074"></a>00074 <span class="preprocessor"></span>R123_STATIC_INLINE <span class="keywordtype">int</span> <a class="code" href="sse_8h.html#a0b35a046e85316295476d7d552411044">haveAESNI</a>(){
+<a name="l00075"></a>00075     <span class="keywordtype">int</span> CPUInfo[4];
+<a name="l00076"></a>00076     __cpuid(CPUInfo, 1);
+<a name="l00077"></a>00077     <span class="keywordflow">return</span> (CPUInfo[2]>>25)&1;
+<a name="l00078"></a>00078 }
+<a name="l00079"></a>00079 <span class="preprocessor">#else </span><span class="comment">/* R123_USE_CPUID_??? */</span>
+<a name="l00080"></a>00080 <span class="preprocessor">#warning "No R123_USE_CPUID_XXX method chosen.  haveAESNI will always return false"</span>
+<a name="l00081"></a><a class="code" href="sse_8h.html#a0b35a046e85316295476d7d552411044">00081</a> <span class="preprocessor"></span>R123_STATIC_INLINE <span class="keywordtype">int</span> <a class="code" href="sse_8h.html#a0b35a046e85316295476d7d552411044">haveAESNI</a>(){
+<a name="l00082"></a>00082     <span class="keywordflow">return</span> 0;
+<a name="l00083"></a>00083 }
+<a name="l00084"></a>00084 <span class="preprocessor">#endif </span><span class="comment">/* R123_USE_ASM_GNU || R123_USE_CPUID_MSVC */</span>
+<a name="l00085"></a>00085 
+<a name="l00086"></a>00086 <span class="comment">// There is a lot of annoying and inexplicable variation in the</span>
+<a name="l00087"></a>00087 <span class="comment">// SSE intrinsics available in different compilation environments.</span>
+<a name="l00088"></a>00088 <span class="comment">// The details seem to depend on the compiler, the version and</span>
+<a name="l00089"></a>00089 <span class="comment">// the target architecture.  Rather than insisting on</span>
+<a name="l00090"></a>00090 <span class="comment">// R123_USE_feature tests for each of these in each of the</span>
+<a name="l00091"></a>00091 <span class="comment">// compilerfeatures.h files we just keep the complexity localized</span>
+<a name="l00092"></a>00092 <span class="comment">// to here...</span>
+<a name="l00093"></a>00093 <span class="preprocessor">#if (defined(__ICC) && __ICC<1210) || (defined(_MSC_VER) && !defined(_WIN64))</span>
+<a name="l00094"></a>00094 <span class="preprocessor"></span><span class="comment">/* Is there an intrinsic to assemble an __m128i from two 64-bit words? </span>
+<a name="l00095"></a>00095 <span class="comment">   If not, use the 4x32-bit intrisic instead.  N.B.  It looks like Intel</span>
+<a name="l00096"></a>00096 <span class="comment">   added _mm_set_epi64x to icc version 12.1 in Jan 2012.</span>
+<a name="l00097"></a>00097 <span class="comment">*/</span>
+<a name="l00098"></a>00098 R123_STATIC_INLINE __m128i _mm_set_epi64x(uint64_t v1, uint64_t v0){
+<a name="l00099"></a>00099     <span class="keyword">union</span>{
+<a name="l00100"></a>00100         uint64_t u64;
+<a name="l00101"></a>00101         uint32_t u32[2];
+<a name="l00102"></a>00102     } u1, u0;
+<a name="l00103"></a>00103     u1.u64 = v1;
+<a name="l00104"></a>00104     u0.u64 = v0;
+<a name="l00105"></a>00105     <span class="keywordflow">return</span> _mm_set_epi32(u1.u32[1], u1.u32[0], u0.u32[1], u0.u32[0]);
+<a name="l00106"></a>00106 }
+<a name="l00107"></a>00107 <span class="preprocessor">#endif</span>
+<a name="l00108"></a>00108 <span class="preprocessor"></span><span class="comment">/* _mm_extract_lo64 abstracts the task of extracting the low 64-bit</span>
+<a name="l00109"></a>00109 <span class="comment">   word from an __m128i.  The _mm_cvtsi128_si64 intrinsic does the job</span>
+<a name="l00110"></a>00110 <span class="comment">   on 64-bit platforms.  Unfortunately, both MSVC and Open64 fail</span>
+<a name="l00111"></a>00111 <span class="comment">   assertions in ut_M128.cpp and ut_carray.cpp when we use the</span>
+<a name="l00112"></a>00112 <span class="comment">   _mm_cvtsi128_si64 intrinsic.  (See</span>
+<a name="l00113"></a>00113 <span class="comment">   https://bugs.open64.net/show_bug.cgi?id=873 for the Open64 bug).</span>
+<a name="l00114"></a>00114 <span class="comment">   On 32-bit platforms, there's no MOVQ, so there's no intrinsic.</span>
+<a name="l00115"></a>00115 <span class="comment">   Finally, even if the intrinsic exists, it may be spelled with or</span>
+<a name="l00116"></a>00116 <span class="comment">   without the 'x'.</span>
+<a name="l00117"></a>00117 <span class="comment">*/</span>
+<a name="l00118"></a>00118 <span class="preprocessor">#if !defined(__x86_64__) || defined(_MSC_VER) || defined(__OPEN64__)</span>
+<a name="l00119"></a><a class="code" href="sse_8h.html#adac6aaf79c4428abcd30bf583eeb5450">00119</a> <span class="preprocessor"></span>R123_STATIC_INLINE uint64_t <a class="code" href="sse_8h.html#adac6aaf79c4428abcd30bf583eeb5450">_mm_extract_lo64</a>(__m128i si){
+<a name="l00120"></a>00120     <span class="keyword">union</span>{
+<a name="l00121"></a>00121         uint64_t u64[2];
+<a name="l00122"></a>00122         __m128i m;
+<a name="l00123"></a>00123     }u;
+<a name="l00124"></a>00124     _mm_store_si128(&u.m, si);
+<a name="l00125"></a>00125     <span class="keywordflow">return</span> u.u64[0];
+<a name="l00126"></a>00126 }
+<a name="l00127"></a>00127 <span class="preprocessor">#elif defined(__llvm__) || defined(__ICC)</span>
+<a name="l00128"></a>00128 <span class="preprocessor"></span>R123_STATIC_INLINE uint64_t <a class="code" href="sse_8h.html#adac6aaf79c4428abcd30bf583eeb5450">_mm_extract_lo64</a>(__m128i si){
+<a name="l00129"></a>00129     <span class="keywordflow">return</span> (uint64_t)_mm_cvtsi128_si64(si);
+<a name="l00130"></a>00130 }
+<a name="l00131"></a>00131 <span class="preprocessor">#else </span><span class="comment">/* GNUC, others */</span>
+<a name="l00132"></a>00132 <span class="comment">/* FWIW, gcc's emmintrin.h has had the 'x' spelling</span>
+<a name="l00133"></a>00133 <span class="comment">   since at least gcc-3.4.4.  The no-'x' spelling showed up</span>
+<a name="l00134"></a>00134 <span class="comment">   around 4.2. */</span>
+<a name="l00135"></a>00135 R123_STATIC_INLINE uint64_t <a class="code" href="sse_8h.html#adac6aaf79c4428abcd30bf583eeb5450">_mm_extract_lo64</a>(__m128i si){
+<a name="l00136"></a>00136     <span class="keywordflow">return</span> (uint64_t)_mm_cvtsi128_si64x(si);
+<a name="l00137"></a>00137 }
+<a name="l00138"></a>00138 <span class="preprocessor">#endif</span>
+<a name="l00139"></a>00139 <span class="preprocessor"></span><span class="preprocessor">#if defined(__GNUC__) && __GNUC__ < 4</span>
+<a name="l00140"></a>00140 <span class="preprocessor"></span><span class="comment">/* the cast builtins showed up in gcc4. */</span>
+<a name="l00141"></a>00141 R123_STATIC_INLINE __m128 _mm_castsi128_ps(__m128i si){
+<a name="l00142"></a>00142     <span class="keywordflow">return</span> (__m128)si;
+<a name="l00143"></a>00143 }
+<a name="l00144"></a>00144 <span class="preprocessor">#endif</span>
+<a name="l00145"></a>00145 <span class="preprocessor"></span>
+<a name="l00146"></a>00146 <span class="preprocessor">#ifdef __cplusplus</span>
+<a name="l00147"></a>00147 <span class="preprocessor"></span>
+<a name="l00148"></a><a class="code" href="structr123m128i.html">00148</a> <span class="keyword">struct </span><a class="code" href="structr123m128i.html">r123m128i</a>{
+<a name="l00149"></a><a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">00149</a>     __m128i <a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a>;
+<a name="l00150"></a>00150 <span class="preprocessor">#if R123_USE_CXX11_UNRESTRICTED_UNIONS</span>
+<a name="l00151"></a>00151 <span class="preprocessor"></span>    <span class="comment">// C++98 forbids a union member from having *any* constructors.</span>
+<a name="l00152"></a>00152     <span class="comment">// C++11 relaxes this, and allows union members to have constructors</span>
+<a name="l00153"></a>00153     <span class="comment">// as long as there is a "trivial" default construtor.  So in C++11</span>
+<a name="l00154"></a>00154     <span class="comment">// we can provide a r123m128i constructor with an __m128i argument, and still</span>
+<a name="l00155"></a>00155     <span class="comment">// have the default (and hence trivial) default constructor.</span>
+<a name="l00156"></a>00156     <a class="code" href="structr123m128i.html">r123m128i</a>() = <span class="keywordflow">default</span>;
+<a name="l00157"></a>00157     <a class="code" href="structr123m128i.html">r123m128i</a>(__m128i _m): <a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a>(_m){}
+<a name="l00158"></a>00158 <span class="preprocessor">#endif</span>
+<a name="l00159"></a><a class="code" href="structr123m128i.html#a9842fbc85102e0019cc58d97c28e2d02">00159</a> <span class="preprocessor"></span>    <a class="code" href="structr123m128i.html">r123m128i</a>& <a class="code" href="structr123m128i.html#a9842fbc85102e0019cc58d97c28e2d02">operator=</a>(<span class="keyword">const</span> __m128i& rhs){ <a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a>=rhs; <span class="keywordflow">return</span> *<span  [...]
+<a name="l00160"></a><a class="code" href="structr123m128i.html#a0da7ae920bce1b75efb91017ab6bc37c">00160</a>     <a class="code" href="structr123m128i.html">r123m128i</a>& <a class="code" href="structr123m128i.html#a0da7ae920bce1b75efb91017ab6bc37c">operator=</a>(R123_ULONG_LONG n){ <a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a> = _mm_set_epi64x(0, n); <span class="keywordflow">return</span> *<span class="keyword">this</span>;}
+<a name="l00161"></a>00161 <span class="preprocessor">#if R123_USE_CXX11_EXPLICIT_CONVERSIONS</span>
+<a name="l00162"></a>00162 <span class="preprocessor"></span>    <span class="comment">// With C++0x we can attach explicit to the bool conversion operator</span>
+<a name="l00163"></a>00163     <span class="comment">// to disambiguate undesired promotions.  For g++, this works</span>
+<a name="l00164"></a>00164     <span class="comment">// only in 4.5 and above.</span>
+<a name="l00165"></a>00165     <span class="keyword">explicit</span> operator bool()<span class="keyword"> const </span>{<span class="keywordflow">return</span> _bool();}
+<a name="l00166"></a>00166 <span class="preprocessor">#else</span>
+<a name="l00167"></a>00167 <span class="preprocessor"></span>    <span class="comment">// Pre-C++0x, we have to do something else.  Google for the "safe bool"</span>
+<a name="l00168"></a>00168     <span class="comment">// idiom for other ideas...</span>
+<a name="l00169"></a><a class="code" href="structr123m128i.html#ae5788785c2ce7f7ca6ff8dd4377771f3">00169</a>     <a class="code" href="structr123m128i.html#ae5788785c2ce7f7ca6ff8dd4377771f3">operator const void*</a>()<span class="keyword"> const</span>{<span class="keywordflow">return</span> _bool()?<span class="keyword">this</span>:0;}
+<a name="l00170"></a>00170 <span class="preprocessor">#endif</span>
+<a name="l00171"></a><a class="code" href="structr123m128i.html#a80a5c24f76fec61b3ab0ed0e0353cfb7">00171</a> <span class="preprocessor"></span>    <a class="code" href="structr123m128i.html#a80a5c24f76fec61b3ab0ed0e0353cfb7">operator __m128i</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a>;}
+<a name="l00172"></a>00172 
+<a name="l00173"></a>00173 <span class="keyword">private</span>:
+<a name="l00174"></a>00174 <span class="preprocessor">#if R123_USE_SSE4_1</span>
+<a name="l00175"></a>00175 <span class="preprocessor"></span>    <span class="keywordtype">bool</span> _bool()<span class="keyword"> const</span>{ <span class="keywordflow">return</span> !_mm_testz_si128(<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a>,<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a>); }
+<a name="l00176"></a>00176 <span class="preprocessor">#else</span>
+<a name="l00177"></a>00177 <span class="preprocessor"></span>    <span class="keywordtype">bool</span> _bool()<span class="keyword"> const</span>{ <span class="keywordflow">return</span> 0xf != _mm_movemask_ps(_mm_castsi128_ps(_mm_cmpeq_epi32(<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a>, _mm_setzero_si128()))); }
+<a name="l00178"></a>00178 <span class="preprocessor">#endif</span>
+<a name="l00179"></a>00179 <span class="preprocessor"></span>};
+<a name="l00180"></a>00180 
+<a name="l00181"></a><a class="code" href="sse_8h.html#a2ffeb79e1a2cbb9cb35b0daf514a06a5">00181</a> R123_STATIC_INLINE <a class="code" href="structr123m128i.html">r123m128i</a>& <a class="code" href="sse_8h.html#a2ffeb79e1a2cbb9cb35b0daf514a06a5">operator++</a>(<a class="code" href="structr123m128i.html">r123m128i</a>& v){
+<a name="l00182"></a>00182     __m128i& c = v.<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a>;
+<a name="l00183"></a>00183     __m128i zeroone = _mm_set_epi64x(R123_64BIT(0), R123_64BIT(1));
+<a name="l00184"></a>00184     c = _mm_add_epi64(c, zeroone);
+<a name="l00185"></a>00185     <span class="comment">//return c;</span>
+<a name="l00186"></a>00186 <span class="preprocessor">#if R123_USE_SSE4_1</span>
+<a name="l00187"></a>00187 <span class="preprocessor"></span>    __m128i zerofff = _mm_set_epi64x(0, ~(R123_64BIT(0)));
+<a name="l00188"></a>00188     <span class="keywordflow">if</span>( R123_BUILTIN_EXPECT(_mm_testz_si128(c,zerofff), 0) ){
+<a name="l00189"></a>00189         __m128i onezero = _mm_set_epi64x(R123_64BIT(1), R123_64BIT(0));
+<a name="l00190"></a>00190         c = _mm_add_epi64(c, onezero);
+<a name="l00191"></a>00191     }
+<a name="l00192"></a>00192 <span class="preprocessor">#else</span>
+<a name="l00193"></a>00193 <span class="preprocessor"></span>    <span class="keywordtype">unsigned</span> mask  = _mm_movemask_ps( _mm_castsi128_ps(_mm_cmpeq_epi32(c, _mm_setzero_si128())));
+<a name="l00194"></a>00194     <span class="comment">// The low two bits of mask are 11 iff the low 64 bits of</span>
+<a name="l00195"></a>00195     <span class="comment">// c are zero.</span>
+<a name="l00196"></a>00196     <span class="keywordflow">if</span>( R123_BUILTIN_EXPECT((mask&0x3) == 0x3, 0) ){
+<a name="l00197"></a>00197         __m128i onezero = _mm_set_epi64x(1,0);
+<a name="l00198"></a>00198         c = _mm_add_epi64(c, onezero);
+<a name="l00199"></a>00199     }
+<a name="l00200"></a>00200 <span class="preprocessor">#endif</span>
+<a name="l00201"></a>00201 <span class="preprocessor"></span>    <span class="keywordflow">return</span> v;
+<a name="l00202"></a>00202 }
+<a name="l00203"></a>00203 
+<a name="l00204"></a><a class="code" href="sse_8h.html#a436d4467bb1389d42bfa67686218fd98">00204</a> R123_STATIC_INLINE <a class="code" href="structr123m128i.html">r123m128i</a>& <a class="code" href="sse_8h.html#a436d4467bb1389d42bfa67686218fd98">operator+=</a>(<a class="code" href="structr123m128i.html">r123m128i</a>& lhs, R123_ULONG_LONG n){ 
+<a name="l00205"></a>00205     __m128i c = lhs.<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a>;
+<a name="l00206"></a>00206     __m128i incr128 = _mm_set_epi64x(0, n);
+<a name="l00207"></a>00207     c = _mm_add_epi64(c, incr128);
+<a name="l00208"></a>00208     <span class="comment">// return c;     // NO CARRY!  </span>
+<a name="l00209"></a>00209 
+<a name="l00210"></a>00210     int64_t lo64 = <a class="code" href="sse_8h.html#adac6aaf79c4428abcd30bf583eeb5450">_mm_extract_lo64</a>(c);
+<a name="l00211"></a>00211     <span class="keywordflow">if</span>((uint64_t)lo64 < n)
+<a name="l00212"></a>00212         c = _mm_add_epi64(c, _mm_set_epi64x(1,0));
+<a name="l00213"></a>00213     lhs.<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a> = c;
+<a name="l00214"></a>00214     <span class="keywordflow">return</span> lhs; 
+<a name="l00215"></a>00215 }
+<a name="l00216"></a>00216 
+<a name="l00217"></a>00217 <span class="comment">// We need this one because it's present, but never used in r123array1xm128i::incr</span>
+<a name="l00218"></a><a class="code" href="sse_8h.html#a43e11de33821f27448feb163162ec895">00218</a> R123_STATIC_INLINE <span class="keywordtype">bool</span> <a class="code" href="sse_8h.html#a43e11de33821f27448feb163162ec895">operator<=</a>(R123_ULONG_LONG, <span class="keyword">const</span> <a class="code" href="structr123m128i.html">r123m128i</a> &){
+<a name="l00219"></a>00219     <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"operator<=(unsigned long long, r123m128i) is unimplemented."</span>);}
+<a name="l00220"></a>00220 
+<a name="l00221"></a>00221 <span class="comment">// The comparisons aren't implemented, but if we leave them out, and </span>
+<a name="l00222"></a>00222 <span class="comment">// somebody writes, e.g., M1 < M2, the compiler will do an implicit</span>
+<a name="l00223"></a>00223 <span class="comment">// conversion through void*.  Sigh...</span>
+<a name="l00224"></a><a class="code" href="sse_8h.html#ac2c263fa443dd074fe4ff96710219eb8">00224</a> R123_STATIC_INLINE <span class="keywordtype">bool</span> <a class="code" href="sse_8h.html#ac2c263fa443dd074fe4ff96710219eb8">operator<</a>(<span class="keyword">const</span> <a class="code" href="structr123m128i.html">r123m128i</a>&, <span class="keyword">const</span> <a class="code" href="structr123m128i.html">r123m128i</a>&){
+<a name="l00225"></a>00225     <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"operator<(r123m128i, r123m128i) is unimplemented."</span>);}
+<a name="l00226"></a><a class="code" href="sse_8h.html#a9ce245b77f0638255e7138190d0ff4fd">00226</a> R123_STATIC_INLINE <span class="keywordtype">bool</span> <a class="code" href="sse_8h.html#a43e11de33821f27448feb163162ec895">operator<=</a>(<span class="keyword">const</span> <a class="code" href="structr123m128i.html">r123m128i</a>&, <span class="keyword">const</span> <a class="code" href="structr123m128i.html">r123m128i</a>&){
+<a name="l00227"></a>00227     <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"operator<=(r123m128i, r123m128i) is unimplemented."</span>);}
+<a name="l00228"></a><a class="code" href="sse_8h.html#ad07b59f8110eac57511ee8c2fa697f93">00228</a> R123_STATIC_INLINE <span class="keywordtype">bool</span> <a class="code" href="sse_8h.html#ad07b59f8110eac57511ee8c2fa697f93">operator></a>(<span class="keyword">const</span> <a class="code" href="structr123m128i.html">r123m128i</a>&, <span class="keyword">const</span> <a class="code" href="structr123m128i.html">r123m128i</a>&){
+<a name="l00229"></a>00229     <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"operator>(r123m128i, r123m128i) is unimplemented."</span>);}
+<a name="l00230"></a><a class="code" href="sse_8h.html#aa7bb0ad8bfceb39a1b71262b9476e151">00230</a> R123_STATIC_INLINE <span class="keywordtype">bool</span> <a class="code" href="sse_8h.html#aa7bb0ad8bfceb39a1b71262b9476e151">operator>=</a>(<span class="keyword">const</span> <a class="code" href="structr123m128i.html">r123m128i</a>&, <span class="keyword">const</span> <a class="code" href="structr123m128i.html">r123m128i</a>&){
+<a name="l00231"></a>00231     <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"operator>=(r123m128i, r123m128i) is unimplemented."</span>);}
+<a name="l00232"></a>00232 
+<a name="l00233"></a><a class="code" href="sse_8h.html#ab1389a6d8b14bc380c6d6a6d4de8853e">00233</a> R123_STATIC_INLINE <span class="keywordtype">bool</span> <a class="code" href="sse_8h.html#ab1389a6d8b14bc380c6d6a6d4de8853e">operator==</a>(<span class="keyword">const</span> <a class="code" href="structr123m128i.html">r123m128i</a> &lhs, <span class="keyword">const</span> <a class="code" href="structr123m128i.html">r123m128i</a> &rhs){ 
+<a name="l00234"></a>00234     <span class="keywordflow">return</span> 0xf==_mm_movemask_ps(_mm_castsi128_ps(_mm_cmpeq_epi32(lhs, rhs))); }
+<a name="l00235"></a><a class="code" href="sse_8h.html#a9fc5dd462afc043229ab800abb8f7d64">00235</a> R123_STATIC_INLINE <span class="keywordtype">bool</span> <a class="code" href="sse_8h.html#a9fc5dd462afc043229ab800abb8f7d64">operator!=</a>(<span class="keyword">const</span> <a class="code" href="structr123m128i.html">r123m128i</a> &lhs, <span class="keyword">const</span> <a class="code" href="structr123m128i.html">r123m128i</a> &rhs){ 
+<a name="l00236"></a>00236     <span class="keywordflow">return</span> !(lhs==rhs);}
+<a name="l00237"></a><a class="code" href="sse_8h.html#a01fbbba16839c5938b3fa29668870db2">00237</a> R123_STATIC_INLINE <span class="keywordtype">bool</span> <a class="code" href="sse_8h.html#ab1389a6d8b14bc380c6d6a6d4de8853e">operator==</a>(R123_ULONG_LONG lhs, <span class="keyword">const</span> <a class="code" href="structr123m128i.html">r123m128i</a> &rhs){
+<a name="l00238"></a>00238     <a class="code" href="structr123m128i.html">r123m128i</a> LHS; LHS.<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a>=_mm_set_epi64x(0, lhs); <span class="keywordflow">return</span> LHS == rhs; }
+<a name="l00239"></a><a class="code" href="sse_8h.html#a76ef724b020add862a911a699a21451b">00239</a> R123_STATIC_INLINE <span class="keywordtype">bool</span> <a class="code" href="sse_8h.html#a9fc5dd462afc043229ab800abb8f7d64">operator!=</a>(R123_ULONG_LONG lhs, <span class="keyword">const</span> <a class="code" href="structr123m128i.html">r123m128i</a> &rhs){
+<a name="l00240"></a>00240     <span class="keywordflow">return</span> !(lhs==rhs);}
+<a name="l00241"></a><a class="code" href="sse_8h.html#af965b43e09e7305795c7b5a35d20c75f">00241</a> R123_STATIC_INLINE std::ostream& <a class="code" href="array_8h.html#af29a19da89789058ead246fdef153ce0">operator<<</a>(std::ostream& os, <span class="keyword">const</span> <a class="code" href="structr123m128i.html">r123m128i</a>& m){
+<a name="l00242"></a>00242     <span class="keyword">union</span>{
+<a name="l00243"></a>00243         uint64_t u64[2];
+<a name="l00244"></a>00244         __m128i m;
+<a name="l00245"></a>00245     }u;
+<a name="l00246"></a>00246     _mm_storeu_si128(&u.m, m.<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a>);
+<a name="l00247"></a>00247     <span class="keywordflow">return</span> os << u.u64[0] << <span class="stringliteral">" "</span> << u.u64[1];
+<a name="l00248"></a>00248 }
+<a name="l00249"></a>00249 
+<a name="l00250"></a><a class="code" href="sse_8h.html#a202aef4bea97c2203a82676cb6abba40">00250</a> R123_STATIC_INLINE std::istream& <a class="code" href="array_8h.html#ace3112deae6709884feac904b1c260a1">operator>></a>(std::istream& is, <a class="code" href="structr123m128i.html">r123m128i</a>& m){
+<a name="l00251"></a>00251     uint64_t u64[2];
+<a name="l00252"></a>00252     is >> u64[0] >> u64[1];
+<a name="l00253"></a>00253     m.<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a> = _mm_set_epi64x(u64[1], u64[0]);
+<a name="l00254"></a>00254     <span class="keywordflow">return</span> is;
+<a name="l00255"></a>00255 }
+<a name="l00256"></a>00256 
+<a name="l00257"></a>00257 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">inline</span> T <a class="code" href="sse_8h.html#a99c42d1da8da3a4a273556a7817b5c1f">assemble_from_u32</a>(uint32_t *p32); <span class="comment">// forward declaration</span>
+<a name="l00258"></a>00258 
+<a name="l00259"></a>00259 <span class="keyword">template</span> <>
+<a name="l00260"></a>00260 <span class="keyword">inline</span> <a class="code" href="structr123m128i.html">r123m128i</a> <a class="code" href="sse_8h.html#a0cd6ca87c67023d7afda38319ab40e43">assemble_from_u32<r123m128i></a>(uint32_t *p32){
+<a name="l00261"></a>00261     <a class="code" href="structr123m128i.html">r123m128i</a> ret;
+<a name="l00262"></a>00262     ret.<a class="code" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a> = _mm_set_epi32(p32[3], p32[2], p32[1], p32[0]);
+<a name="l00263"></a>00263     <span class="keywordflow">return</span> ret;
+<a name="l00264"></a>00264 }
+<a name="l00265"></a>00265 
+<a name="l00266"></a>00266 <span class="preprocessor">#else</span>
+<a name="l00267"></a>00267 <span class="preprocessor"></span>
+<a name="l00268"></a>00268 <span class="keyword">typedef</span> <span class="keyword">struct </span>{
+<a name="l00269"></a>00269     __m128i m;
+<a name="l00270"></a>00270 } <a class="code" href="structr123m128i.html">r123m128i</a>;
+<a name="l00271"></a>00271 
+<a name="l00272"></a>00272 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
+<a name="l00273"></a>00273 
+<a name="l00274"></a>00274 <span class="preprocessor">#else </span><span class="comment">/* !R123_USE_SSE */</span>
+<a name="l00275"></a>00275 R123_STATIC_INLINE <span class="keywordtype">int</span> <a class="code" href="sse_8h.html#a0b35a046e85316295476d7d552411044">haveAESNI</a>(){
+<a name="l00276"></a>00276     <span class="keywordflow">return</span> 0;
+<a name="l00277"></a>00277 }
+<a name="l00278"></a>00278 <span class="preprocessor">#endif </span><span class="comment">/* R123_USE_SSE */</span>
+<a name="l00279"></a>00279 
+<a name="l00280"></a>00280 <span class="preprocessor">#endif </span><span class="comment">/* _Random123_sse_dot_h__ */</span>
+</pre></div></div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structaesni1xm128i__key__t-members.html b/lib/Random123-1.08/docs/html/structaesni1xm128i__key__t-members.html
new file mode 100644
index 0000000..4ba0970
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structaesni1xm128i__key__t-members.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>aesni1xm128i_key_t Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structaesni1xm128i__key__t.html#af1002e5b771616db8f12c793fc994c41">aesni1xm128i_key_t</a>()</td><td><a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structaesni1xm128i__key__t.html#a2076072522f671a8596a831cc93dc616">aesni1xm128i_key_t</a>(const aesni1xm128i_ukey_t &uk)</td><td><a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structaesni1xm128i__key__t.html#a43d53407125d4cec0d6a14586c0357e3">aesni1xm128i_key_t</a>(const aesni4x32_ukey_t &uk)</td><td><a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a></td><td><a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structaesni1xm128i__key__t.html#acb24fef68c539f1a6ea217ee8ada185d">operator=</a>(const aesni1xm128i_ukey_t &uk)</td><td><a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structaesni1xm128i__key__t.html#a0290dac35d6f14706247217fb49bcd60">operator=</a>(const aesni4x32_ukey_t &uk)</td><td><a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a></td><td><code> [inline]</code></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structaesni1xm128i__key__t.html b/lib/Random123-1.08/docs/html/structaesni1xm128i__key__t.html
new file mode 100644
index 0000000..67e76b8
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structaesni1xm128i__key__t.html
@@ -0,0 +1,208 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: aesni1xm128i_key_t Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-attribs">Public Attributes</a>  </div>
+  <div class="headertitle">
+<h1>aesni1xm128i_key_t Struct Reference<br/>
+<small>
+[<a class="el" href="group__AESNI.html">ARS and AESNI Classes and Typedefs</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="aesni1xm128i_key_t" -->
+<p><code>#include <<a class="el" href="aes_8h_source.html">Random123/aes.h</a>></code></p>
+
+<p><a href="structaesni1xm128i__key__t-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="structaesni1xm128i__key__t.html#af1002e5b771616db8f12c793fc994c41">aesni1xm128i_key_t</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="structaesni1xm128i__key__t.html#a2076072522f671a8596a831cc93dc616">aesni1xm128i_key_t</a> (const <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ukey_t</a> &uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="structaesni1xm128i__key__t.html#a43d53407125d4cec0d6a14586c0357e3">aesni1xm128i_key_t</a> (const <a class="el" href="structr123array4x32.html">aesni4x32_ukey_t</a> &uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structaesni1xm128i__key__t.html#acb24fef68c539f1a6ea217ee8ada185d">operator=</a> (const <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ukey_t</a> &uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structaesni1xm128i__key__t.html#a0290dac35d6f14706247217fb49bcd60">operator=</a> (const <a class="el" href="structr123array4x32.html">aesni4x32_ukey_t</a> &uk)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">__m128i </td><td class="memItemRight" valign="bottom"><a class="el" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">k</a> [11]</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<hr/><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" id="af1002e5b771616db8f12c793fc994c41"></a><!-- doxytag: member="aesni1xm128i_key_t::aesni1xm128i_key_t" ref="af1002e5b771616db8f12c793fc994c41" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">aesni1xm128i_key_t::aesni1xm128i_key_t </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2076072522f671a8596a831cc93dc616"></a><!-- doxytag: member="aesni1xm128i_key_t::aesni1xm128i_key_t" ref="a2076072522f671a8596a831cc93dc616" args="(const aesni1xm128i_ukey_t &uk)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">aesni1xm128i_key_t::aesni1xm128i_key_t </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ukey_t</a> & </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a43d53407125d4cec0d6a14586c0357e3"></a><!-- doxytag: member="aesni1xm128i_key_t::aesni1xm128i_key_t" ref="a43d53407125d4cec0d6a14586c0357e3" args="(const aesni4x32_ukey_t &uk)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">aesni1xm128i_key_t::aesni1xm128i_key_t </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array4x32.html">aesni4x32_ukey_t</a> & </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="acb24fef68c539f1a6ea217ee8ada185d"></a><!-- doxytag: member="aesni1xm128i_key_t::operator=" ref="acb24fef68c539f1a6ea217ee8ada185d" args="(const aesni1xm128i_ukey_t &uk)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a>& aesni1xm128i_key_t::operator= </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ukey_t</a> & </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0290dac35d6f14706247217fb49bcd60"></a><!-- doxytag: member="aesni1xm128i_key_t::operator=" ref="a0290dac35d6f14706247217fb49bcd60" args="(const aesni4x32_ukey_t &uk)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a>& aesni1xm128i_key_t::operator= </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array4x32.html">aesni4x32_ukey_t</a> & </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="a60cefca96e55b73732f570e844efbe54"></a><!-- doxytag: member="aesni1xm128i_key_t::k" ref="a60cefca96e55b73732f570e844efbe54" args="[11]" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">__m128i <a class="el" href="structaesni1xm128i__key__t.html#a60cefca96e55b73732f570e844efbe54">aesni1xm128i_key_t::k</a>[11]</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>Random123/<a class="el" href="aes_8h_source.html">aes.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1AESNI1xm128i.html b/lib/Random123-1.08/docs/html/structr123_1_1AESNI1xm128i.html
new file mode 100644
index 0000000..aef3e85
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1AESNI1xm128i.html
@@ -0,0 +1,207 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123::AESNI1xm128i Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath">
+    <ul>
+      <li><a class="el" href="namespacer123.html">r123</a>      </li>
+      <li><a class="el" href="structr123_1_1AESNI1xm128i.html">r123::AESNI1xm128i</a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-attribs">Static Public Attributes</a>  </div>
+  <div class="headertitle">
+<h1>r123::AESNI1xm128i Class Reference<br/>
+<small>
+[<a class="el" href="group__AESNI.html">ARS and AESNI Classes and Typedefs</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123::AESNI1xm128i" -->
+<p><code>#include <<a class="el" href="aes_8h_source.html">Random123/aes.h</a>></code></p>
+<div class="dynheader">
+Inheritance diagram for r123::AESNI1xm128i:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="structr123_1_1AESNI1xm128i.png" usemap="#r123::AESNI1xm128i_map" alt=""/>
+  <map id="r123::AESNI1xm128i_map" name="r123::AESNI1xm128i_map">
+<area href="structr123_1_1AESNI1xm128i__R.html" alt="r123::AESNI1xm128i_R< ROUNDS >" shape="rect" coords="0,56,218,80"/>
+</map>
+</div>
+
+<p><a href="classr123_1_1AESNI1xm128i-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI1xm128i.html#aaa136c21db9806859fa7cd4e2dbaaaa6">ctr_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ukey_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI1xm128i.html#a1f405533da84d98b938030190a63cec5">ukey_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI1xm128i.html#a7dc33fd5abf509d9d16b571b23867a6b">key_type</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1xm128i.html">ctr_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI1xm128i.html#a9bff0ac8478400c1006136e9bde91dc3">operator()</a> (<a class="el" href="structr123array1xm128i.html">ctr_type</a> ctr, <a class="el" href="structaesni1xm128i__key__t.html">key_type</a> key) const </td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static const unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI1xm128i.html#a1b5a44afde814ba844d8f5442e2a3a5f">rounds</a> = 10</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>AESNI exports the member functions, typedefs and operator overloads required by a <a class="el" href="CBRNG.html">Counter Based RNGs (CBRNGs).</a> class.</p>
+<p><a class="el" href="structr123_1_1AESNI1xm128i.html">AESNI1xm128i</a> uses the crypotgraphic AES round function, including the cryptographic key schedule.</p>
+<p>In contrast to the other CBRNGs in the Random123 library, the <a class="el" href="structr123_1_1AESNI1xm128i.html#a7dc33fd5abf509d9d16b571b23867a6b">AESNI1xm128i_R::key_type</a> is opaque and is <b>not</b> identical to the <a class="el" href="structr123_1_1AESNI1xm128i.html#a1f405533da84d98b938030190a63cec5">AESNI1xm128i_R::ukey_type</a>. Creating a key_type, using either the constructor or assignment operator, is significantly more time-consuming than running the bijection (hundreds  [...]
+<p><a class="el" href="structr123_1_1AESNI1xm128i.html">AESNI1xm128i</a> is only available when the feature-test macro R123_USE_AES_NI is true, which should occur only when the compiler is configured to generate AES-NI instructions (or when defaults are overridden by compile-time, compiler-command-line options).</p>
+<p>As of September 2011, the authors know of no statistical flaws with <a class="el" href="structr123_1_1AESNI1xm128i.html">AESNI1xm128i</a>. It would be an event of major cryptographic note if any such flaws were ever found. </p>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="aaa136c21db9806859fa7cd4e2dbaaaa6"></a><!-- doxytag: member="r123::AESNI1xm128i::ctr_type" ref="aaa136c21db9806859fa7cd4e2dbaaaa6" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ctr_t</a> <a class="el" href="structr123array1xm128i.html">r123::AESNI1xm128i::ctr_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7dc33fd5abf509d9d16b571b23867a6b"></a><!-- doxytag: member="r123::AESNI1xm128i::key_type" ref="a7dc33fd5abf509d9d16b571b23867a6b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structaesni1xm128i__key__t.html">aesni1xm128i_key_t</a> <a class="el" href="structaesni1xm128i__key__t.html">r123::AESNI1xm128i::key_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1f405533da84d98b938030190a63cec5"></a><!-- doxytag: member="r123::AESNI1xm128i::ukey_type" ref="a1f405533da84d98b938030190a63cec5" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array1xm128i.html">aesni1xm128i_ukey_t</a> <a class="el" href="structr123array1xm128i.html">r123::AESNI1xm128i::ukey_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a9bff0ac8478400c1006136e9bde91dc3"></a><!-- doxytag: member="r123::AESNI1xm128i::operator()" ref="a9bff0ac8478400c1006136e9bde91dc3" args="(ctr_type ctr, key_type key) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1xm128i.html">ctr_type</a> r123::AESNI1xm128i::operator() </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1xm128i.html">ctr_type</a> </td>
+          <td class="paramname"> <em>ctr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structaesni1xm128i__key__t.html">key_type</a> </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="a1b5a44afde814ba844d8f5442e2a3a5f"></a><!-- doxytag: member="r123::AESNI1xm128i::rounds" ref="a1b5a44afde814ba844d8f5442e2a3a5f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const unsigned int <a class="el" href="structr123_1_1AESNI1xm128i.html#a1b5a44afde814ba844d8f5442e2a3a5f">r123::AESNI1xm128i::rounds</a> = 10<code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>Random123/<a class="el" href="aes_8h_source.html">aes.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1AESNI1xm128i.png b/lib/Random123-1.08/docs/html/structr123_1_1AESNI1xm128i.png
new file mode 100644
index 0000000..7e038ce
Binary files /dev/null and b/lib/Random123-1.08/docs/html/structr123_1_1AESNI1xm128i.png differ
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1AESNI1xm128i__R.html b/lib/Random123-1.08/docs/html/structr123_1_1AESNI1xm128i__R.html
new file mode 100644
index 0000000..6873dc1
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1AESNI1xm128i__R.html
@@ -0,0 +1,109 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123::AESNI1xm128i_R< ROUNDS > Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath">
+    <ul>
+      <li><a class="el" href="namespacer123.html">r123</a>      </li>
+      <li><a class="el" href="structr123_1_1AESNI1xm128i__R.html">r123::AESNI1xm128i_R< ROUNDS ></a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::AESNI1xm128i_R< ROUNDS > Class Template Reference<br/>
+<small>
+[<a class="el" href="group__AESNI.html">ARS and AESNI Classes and Typedefs</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123::AESNI1xm128i_R" --><!-- doxytag: inherits="r123::AESNI1xm128i" -->
+<p><code>#include <<a class="el" href="aes_8h_source.html">Random123/aes.h</a>></code></p>
+<div class="dynheader">
+Inheritance diagram for r123::AESNI1xm128i_R< ROUNDS >:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="structr123_1_1AESNI1xm128i__R.png" usemap="#r123::AESNI1xm128i_R< ROUNDS >_map" alt=""/>
+  <map id="r123::AESNI1xm128i_R< ROUNDS >_map" name="r123::AESNI1xm128i_R< ROUNDS >_map">
+<area href="structr123_1_1AESNI1xm128i.html" alt="r123::AESNI1xm128i" shape="rect" coords="0,0,218,24"/>
+</map>
+</div>
+
+<p><a href="classr123_1_1AESNI1xm128i__R-members.html">List of all members.</a></p>
+<table class="memberdecls">
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template<unsigned ROUNDS = 10><br/>
+ class r123::AESNI1xm128i_R< ROUNDS ></h3>
+
+<p><a class="el" href="structr123_1_1AESNI1xm128i__R.html">AESNI1xm128i_R</a> is provided for completeness, but is only instantiable with ROUNDS=10, in which case it is identical to <a class="el" href="structr123_1_1AESNI1xm128i.html">AESNI1xm128i</a> </p>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>Random123/<a class="el" href="aes_8h_source.html">aes.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1AESNI1xm128i__R.png b/lib/Random123-1.08/docs/html/structr123_1_1AESNI1xm128i__R.png
new file mode 100644
index 0000000..ce0390c
Binary files /dev/null and b/lib/Random123-1.08/docs/html/structr123_1_1AESNI1xm128i__R.png differ
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1AESNI4x32-members.html b/lib/Random123-1.08/docs/html/structr123_1_1AESNI4x32-members.html
new file mode 100644
index 0000000..eed681b
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1AESNI4x32-members.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::AESNI4x32 Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123_1_1AESNI4x32.html">r123::AESNI4x32</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI4x32.html#ab8a1f8a822eecfc9e587bad76792df32">ctr_type</a> typedef</td><td><a class="el" href="structr123_1_1AESNI4x32.html">r123::AESNI4x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI4x32.html#a3f47cb319d03ede5fd557800b618d28a">key_type</a> typedef</td><td><a class="el" href="structr123_1_1AESNI4x32.html">r123::AESNI4x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI4x32.html#a981102e5bc0a7df916a95a40af8fd4c0">operator()</a>(ctr_type ctr, key_type key) const </td><td><a class="el" href="structr123_1_1AESNI4x32.html">r123::AESNI4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI4x32.html#a725aad79b8d496d97bed24390f624be6">rounds</a></td><td><a class="el" href="structr123_1_1AESNI4x32.html">r123::AESNI4x32</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1AESNI4x32.html#a3fbb6113e70575dce3b6047a22a751f4">ukey_type</a> typedef</td><td><a class="el" href="structr123_1_1AESNI4x32.html">r123::AESNI4x32</a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1AESNI4x32.html b/lib/Random123-1.08/docs/html/structr123_1_1AESNI4x32.html
new file mode 100644
index 0000000..26cedcd
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1AESNI4x32.html
@@ -0,0 +1,198 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123::AESNI4x32 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath">
+    <ul>
+      <li><a class="el" href="namespacer123.html">r123</a>      </li>
+      <li><a class="el" href="structr123_1_1AESNI4x32.html">r123::AESNI4x32</a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-attribs">Static Public Attributes</a>  </div>
+  <div class="headertitle">
+<h1>r123::AESNI4x32 Struct Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123::AESNI4x32" -->
+<p><code>#include <<a class="el" href="aes_8h_source.html">Random123/aes.h</a>></code></p>
+<div class="dynheader">
+Inheritance diagram for r123::AESNI4x32:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="structr123_1_1AESNI4x32.png" usemap="#r123::AESNI4x32_map" alt=""/>
+  <map id="r123::AESNI4x32_map" name="r123::AESNI4x32_map">
+<area href="structr123_1_1AESNI4x32__R.html" alt="r123::AESNI4x32_R< ROUNDS >" shape="rect" coords="0,56,199,80"/>
+</map>
+</div>
+
+<p><a href="structr123_1_1AESNI4x32-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x32.html">aesni4x32_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI4x32.html#ab8a1f8a822eecfc9e587bad76792df32">ctr_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x32.html">aesni4x32_ukey_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI4x32.html#a3fbb6113e70575dce3b6047a22a751f4">ukey_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structaesni1xm128i__key__t.html">aesni4x32_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI4x32.html#a3f47cb319d03ede5fd557800b618d28a">key_type</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html">ctr_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI4x32.html#a981102e5bc0a7df916a95a40af8fd4c0">operator()</a> (<a class="el" href="structr123array4x32.html">ctr_type</a> ctr, <a class="el" href="structaesni1xm128i__key__t.html">key_type</a> key) const </td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static const unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1AESNI4x32.html#a725aad79b8d496d97bed24390f624be6">rounds</a> = 10</td></tr>
+</table>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="ab8a1f8a822eecfc9e587bad76792df32"></a><!-- doxytag: member="r123::AESNI4x32::ctr_type" ref="ab8a1f8a822eecfc9e587bad76792df32" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array4x32.html">aesni4x32_ctr_t</a> <a class="el" href="structr123array4x32.html">r123::AESNI4x32::ctr_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3f47cb319d03ede5fd557800b618d28a"></a><!-- doxytag: member="r123::AESNI4x32::key_type" ref="a3f47cb319d03ede5fd557800b618d28a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structaesni1xm128i__key__t.html">aesni4x32_key_t</a> <a class="el" href="structaesni1xm128i__key__t.html">r123::AESNI4x32::key_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3fbb6113e70575dce3b6047a22a751f4"></a><!-- doxytag: member="r123::AESNI4x32::ukey_type" ref="a3fbb6113e70575dce3b6047a22a751f4" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array4x32.html">aesni4x32_ukey_t</a> <a class="el" href="structr123array4x32.html">r123::AESNI4x32::ukey_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a981102e5bc0a7df916a95a40af8fd4c0"></a><!-- doxytag: member="r123::AESNI4x32::operator()" ref="a981102e5bc0a7df916a95a40af8fd4c0" args="(ctr_type ctr, key_type key) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html">ctr_type</a> r123::AESNI4x32::operator() </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">ctr_type</a> </td>
+          <td class="paramname"> <em>ctr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structaesni1xm128i__key__t.html">key_type</a> </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="a725aad79b8d496d97bed24390f624be6"></a><!-- doxytag: member="r123::AESNI4x32::rounds" ref="a725aad79b8d496d97bed24390f624be6" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const unsigned int <a class="el" href="structr123_1_1AESNI4x32.html#a725aad79b8d496d97bed24390f624be6">r123::AESNI4x32::rounds</a> = 10<code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>Random123/<a class="el" href="aes_8h_source.html">aes.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1AESNI4x32.png b/lib/Random123-1.08/docs/html/structr123_1_1AESNI4x32.png
new file mode 100644
index 0000000..135b61e
Binary files /dev/null and b/lib/Random123-1.08/docs/html/structr123_1_1AESNI4x32.png differ
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1AESNI4x32__R.html b/lib/Random123-1.08/docs/html/structr123_1_1AESNI4x32__R.html
new file mode 100644
index 0000000..969da42
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1AESNI4x32__R.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123::AESNI4x32_R< ROUNDS > Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath">
+    <ul>
+      <li><a class="el" href="namespacer123.html">r123</a>      </li>
+      <li><a class="el" href="structr123_1_1AESNI4x32__R.html">r123::AESNI4x32_R< ROUNDS ></a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::AESNI4x32_R< ROUNDS > Class Template Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123::AESNI4x32_R" --><!-- doxytag: inherits="r123::AESNI4x32" -->
+<p><code>#include <<a class="el" href="aes_8h_source.html">Random123/aes.h</a>></code></p>
+<div class="dynheader">
+Inheritance diagram for r123::AESNI4x32_R< ROUNDS >:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="structr123_1_1AESNI4x32__R.png" usemap="#r123::AESNI4x32_R< ROUNDS >_map" alt=""/>
+  <map id="r123::AESNI4x32_R< ROUNDS >_map" name="r123::AESNI4x32_R< ROUNDS >_map">
+<area href="structr123_1_1AESNI4x32.html" alt="r123::AESNI4x32" shape="rect" coords="0,0,199,24"/>
+</map>
+</div>
+
+<p><a href="classr123_1_1AESNI4x32__R-members.html">List of all members.</a></p>
+<table class="memberdecls">
+</table>
+<h3>template<unsigned ROUNDS = 10><br/>
+ class r123::AESNI4x32_R< ROUNDS ></h3>
+
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>Random123/<a class="el" href="aes_8h_source.html">aes.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1AESNI4x32__R.png b/lib/Random123-1.08/docs/html/structr123_1_1AESNI4x32__R.png
new file mode 100644
index 0000000..543d0ac
Binary files /dev/null and b/lib/Random123-1.08/docs/html/structr123_1_1AESNI4x32__R.png differ
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1ARS1xm128i__R.html b/lib/Random123-1.08/docs/html/structr123_1_1ARS1xm128i__R.html
new file mode 100644
index 0000000..3adb96b
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1ARS1xm128i__R.html
@@ -0,0 +1,212 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123::ARS1xm128i_R< ROUNDS > Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath">
+    <ul>
+      <li><a class="el" href="namespacer123.html">r123</a>      </li>
+      <li><a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i_R< ROUNDS ></a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-attribs">Static Public Attributes</a>  </div>
+  <div class="headertitle">
+<h1>r123::ARS1xm128i_R< ROUNDS > Class Template Reference<br/>
+<small>
+[<a class="el" href="group__AESNI.html">ARS and AESNI Classes and Typedefs</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123::ARS1xm128i_R" -->
+<p><code>#include <<a class="el" href="ars_8h_source.html">Random123/ars.h</a>></code></p>
+
+<p><a href="classr123_1_1ARS1xm128i__R-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array1xm128i.html">ars1xm128i_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ARS1xm128i__R.html#a13a62c94f63054828c6960979f42a268">ctr_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array1xm128i.html">ars1xm128i_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ARS1xm128i__R.html#a8454d6de92379d9a6551d11828fbebc3">key_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array1xm128i.html">ars1xm128i_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ARS1xm128i__R.html#ab26c7029e347e6b1e17dad795e462aeb">ukey_type</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1xm128i.html">ctr_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ARS1xm128i__R.html#a89c0fc4e1c90ee684fc88dde05d8d82c">operator()</a> (<a class="el" href="structr123array1xm128i.html">ctr_type</a> ctr, <a class="el" href="structr123array1xm128i.html">key_type</a> key) const </td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static const unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ARS1xm128i__R.html#abe167a93280140e424d722c1ac47a8e9">rounds</a> = ROUNDS</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template<unsigned int ROUNDS><br/>
+ class r123::ARS1xm128i_R< ROUNDS ></h3>
+
+<p><a class="el" href="structr123_1_1ARS1xm128i__R.html">ARS1xm128i_R</a> exports the member functions, typedefs and operator overloads required by a <a class="el" href="CBRNG.html">Counter Based RNGs (CBRNGs).</a> class.</p>
+<p>ARS1xm128i uses the crypotgraphic AES round function, but a <b>non-cryptographc</b> key schedule to save time and space.</p>
+<p>ARS1xm128i is only available when the feature-test macro R123_USE_AES_NI is true, which should occur only when the compiler is configured to generate AES-NI instructions (or when defaults are overridden by compile-time, compiler-command-line options).</p>
+<p>The template argument, ROUNDS, is the number of times the ARS round functions will be applied.</p>
+<p>As of September 2011, the authors know of no statistical flaws with ROUNDS=5 or more.</p>
+<p>ARS1xm128i is equivalent to ARS1xm128i_R<7>. With 7 rounds, the ARS1xm128i CBRNG has a considerable safety margin over the minimum number of rounds with no known statistical flaws, but still has excellent performance. </p>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="a13a62c94f63054828c6960979f42a268"></a><!-- doxytag: member="r123::ARS1xm128i_R::ctr_type" ref="a13a62c94f63054828c6960979f42a268" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array1xm128i.html">ars1xm128i_ctr_t</a> <a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i_R</a>< ROUNDS >::<a class="el" href="structr123array1xm128i.html">ctr_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8454d6de92379d9a6551d11828fbebc3"></a><!-- doxytag: member="r123::ARS1xm128i_R::key_type" ref="a8454d6de92379d9a6551d11828fbebc3" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array1xm128i.html">ars1xm128i_key_t</a> <a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i_R</a>< ROUNDS >::<a class="el" href="structr123array1xm128i.html">key_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab26c7029e347e6b1e17dad795e462aeb"></a><!-- doxytag: member="r123::ARS1xm128i_R::ukey_type" ref="ab26c7029e347e6b1e17dad795e462aeb" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array1xm128i.html">ars1xm128i_key_t</a> <a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i_R</a>< ROUNDS >::<a class="el" href="structr123array1xm128i.html">ukey_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a89c0fc4e1c90ee684fc88dde05d8d82c"></a><!-- doxytag: member="r123::ARS1xm128i_R::operator()" ref="a89c0fc4e1c90ee684fc88dde05d8d82c" args="(ctr_type ctr, key_type key) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1xm128i.html">ctr_type</a> <a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i_R</a>< ROUNDS >::operator() </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1xm128i.html">ctr_type</a> </td>
+          <td class="paramname"> <em>ctr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array1xm128i.html">key_type</a> </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="abe167a93280140e424d722c1ac47a8e9"></a><!-- doxytag: member="r123::ARS1xm128i_R::rounds" ref="abe167a93280140e424d722c1ac47a8e9" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">const unsigned int <a class="el" href="structr123_1_1ARS1xm128i__R.html">r123::ARS1xm128i_R</a>< ROUNDS >::<a class="el" href="structr123_1_1ARS1xm128i__R.html#abe167a93280140e424d722c1ac47a8e9">rounds</a> = ROUNDS<code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>Random123/<a class="el" href="ars_8h_source.html">ars.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1ARS4x32__R.html b/lib/Random123-1.08/docs/html/structr123_1_1ARS4x32__R.html
new file mode 100644
index 0000000..85bd0c1
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1ARS4x32__R.html
@@ -0,0 +1,205 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123::ARS4x32_R< ROUNDS > Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath">
+    <ul>
+      <li><a class="el" href="namespacer123.html">r123</a>      </li>
+      <li><a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R< ROUNDS ></a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-attribs">Static Public Attributes</a>  </div>
+  <div class="headertitle">
+<h1>r123::ARS4x32_R< ROUNDS > Class Template Reference<br/>
+<small>
+[<a class="el" href="group__AESNI.html">ARS and AESNI Classes and Typedefs</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123::ARS4x32_R" -->
+<p><code>#include <<a class="el" href="ars_8h_source.html">Random123/ars.h</a>></code></p>
+
+<p><a href="classr123_1_1ARS4x32__R-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x32.html">ars4x32_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ARS4x32__R.html#a9951dbcb50de849ded7177109b344045">ctr_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x32.html">ars4x32_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ARS4x32__R.html#a7a651b6747b9e7c038bc6d11ffa2863e">key_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x32.html">ars4x32_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ARS4x32__R.html#aa4bd7be98acb8b0299fb0ffce3db69ee">ukey_type</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html">ctr_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ARS4x32__R.html#afcd326e150925e30de22166e727567df">operator()</a> (<a class="el" href="structr123array4x32.html">ctr_type</a> ctr, <a class="el" href="structr123array4x32.html">key_type</a> key) const </td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static const unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ARS4x32__R.html#a710e59a54794b4cd5e55689dd906b9ba">rounds</a> = ROUNDS</td></tr>
+</table>
+<h3>template<unsigned int ROUNDS><br/>
+ class r123::ARS4x32_R< ROUNDS ></h3>
+
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="a9951dbcb50de849ded7177109b344045"></a><!-- doxytag: member="r123::ARS4x32_R::ctr_type" ref="a9951dbcb50de849ded7177109b344045" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array4x32.html">ars4x32_ctr_t</a> <a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R</a>< ROUNDS >::<a class="el" href="structr123array4x32.html">ctr_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7a651b6747b9e7c038bc6d11ffa2863e"></a><!-- doxytag: member="r123::ARS4x32_R::key_type" ref="a7a651b6747b9e7c038bc6d11ffa2863e" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array4x32.html">ars4x32_key_t</a> <a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R</a>< ROUNDS >::<a class="el" href="structr123array4x32.html">key_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa4bd7be98acb8b0299fb0ffce3db69ee"></a><!-- doxytag: member="r123::ARS4x32_R::ukey_type" ref="aa4bd7be98acb8b0299fb0ffce3db69ee" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array4x32.html">ars4x32_key_t</a> <a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R</a>< ROUNDS >::<a class="el" href="structr123array4x32.html">ukey_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="afcd326e150925e30de22166e727567df"></a><!-- doxytag: member="r123::ARS4x32_R::operator()" ref="afcd326e150925e30de22166e727567df" args="(ctr_type ctr, key_type key) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html">ctr_type</a> <a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R</a>< ROUNDS >::operator() </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">ctr_type</a> </td>
+          <td class="paramname"> <em>ctr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">key_type</a> </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="a710e59a54794b4cd5e55689dd906b9ba"></a><!-- doxytag: member="r123::ARS4x32_R::rounds" ref="a710e59a54794b4cd5e55689dd906b9ba" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">const unsigned int <a class="el" href="structr123_1_1ARS4x32__R.html">r123::ARS4x32_R</a>< ROUNDS >::<a class="el" href="structr123_1_1ARS4x32__R.html#a710e59a54794b4cd5e55689dd906b9ba">rounds</a> = ROUNDS<code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>Random123/<a class="el" href="ars_8h_source.html">ars.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1Engine-members.html b/lib/Random123-1.08/docs/html/structr123_1_1Engine-members.html
new file mode 100644
index 0000000..c32dd18
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1Engine-members.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::Engine< CBRNG > Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#ae549f81e966b0414bcaf0f24b566ebd8">_Max</a></td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#aa73e4d27847915f1438fd37b30777111">_Min</a></td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">b</a></td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a></td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a45ee0086cf8cd6d10febb76dc88f8b22">cbrng_type</a> typedef</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a> typedef</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a82a56c2c02b146dceb68ef3fd0a969fb">discard</a>(uint64_t skip)</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a></td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a8fb9eb1ab76ad9b5374a47cf84ecd306">elem_type</a> typedef</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#ac5676bbe189b0cdc1bef0dd812262ccd">Engine</a>()</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline, explicit]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#ae1a249af828cfdac77db6c16e3f8f8eb">Engine</a>(result_type r)</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline, explicit]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a37dd55cee849b59d678f74780f785672">Engine</a>(Engine &e)</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a478b486b166316597a51ffdd7b5b2d0c">Engine</a>(const Engine &e)</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a52b968cfefe413441d668b3013de023a">Engine</a>(SeedSeq &s)</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline, explicit]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#ab5f45b4eb97995cc45350abee3ec8388">Engine</a>(const ukey_type &uk)</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline, explicit]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#aeb178b9305cbf1fb7e11e8e33a631ba7">Engine</a>(ukey_type &uk)</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline, explicit]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#aa7ad87d7238a0f820ee37640071dee7d">fix_invariant</a>()</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a621df886f2a21ffb22e63d9094389173">getcounter</a>() const </td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#aa7812a494fdb677c2e325db0acfe924a">getseed</a>() const </td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">key</a></td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a18132a79d2327990c4809b37300eddc3">key_type</a> typedef</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#af0947cdcfc03aef7ec30c9fafa660445">operator!=</a>(const Engine &lhs, const Engine &rhs)</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#aca309d0b4f2a8fff1f6f2ab38c6caf93">operator()</a>()</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#af396a7d1656af55805e38f3d9c0fbef7">operator()</a>(const ctr_type &c) const </td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#ae0321571f689fca00c608d11ecad7d8d">operator<<</a>(std::ostream &os, const Engine &be)</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a606e3ba824542e52f12df1345126e721">operator==</a>(const Engine &lhs, const Engine &rhs)</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#ae708b771ab5ac17700d34bad875a16d9">operator>></a>(std::istream &is, Engine &be)</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#af5441fc62932c3d099f8b16150d2aa81">R123_NO_MACRO_SUBST</a>()</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a112318f7d0015ecf4c3c6a8a5c76371b">R123_NO_MACRO_SUBST</a>()</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> typedef</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a93429593bdb12b202b4b8ed38fe08bc4">seed</a>(result_type r)</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#ac4d05ee820a1eb70e76cabb14645dad4">seed</a>(SeedSeq &s)</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#aff36bc97d11bc66f6c0edb75d8dc88e5">seed</a>()</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a5c4d68dbbccfc71f467f3c902f5b93da">seed</a>(const ukey_type &uk)</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a7bd6d3417cefb904c879f41d2c29e15e">seed</a>(ukey_type &uk)</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a6104bf5ee89450403379d5680bfae172">setcounter</a>(const ctr_type &_c, elem_type _elem)</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">ukey</a></td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> typedef</td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1Engine.html#a6169d4fbce1fd7725fabda4c693bf250">v</a></td><td><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a></td><td><code> [protected]</code></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1Engine.html b/lib/Random123-1.08/docs/html/structr123_1_1Engine.html
new file mode 100644
index 0000000..98bd12e
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1Engine.html
@@ -0,0 +1,922 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123::Engine< CBRNG > Struct Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath">
+    <ul>
+      <li><a class="el" href="namespacer123.html">r123</a>      </li>
+      <li><a class="el" href="structr123_1_1Engine.html">r123::Engine< CBRNG ></a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-methods">Static Public Member Functions</a> |
+<a href="#pub-static-attribs">Static Public Attributes</a> |
+<a href="#pro-methods">Protected Member Functions</a> |
+<a href="#pro-attribs">Protected Attributes</a> |
+<a href="#friends">Friends</a>  </div>
+  <div class="headertitle">
+<h1>r123::Engine< CBRNG > Struct Template Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123::Engine" -->
+<p><code>#include <<a class="el" href="Engine_8hpp_source.html">Random123/conventional/Engine.hpp</a>></code></p>
+
+<p><a href="structr123_1_1Engine-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef CBRNG </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a45ee0086cf8cd6d10febb76dc88f8b22">cbrng_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef CBRNG::ctr_type </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef CBRNG::key_type </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a18132a79d2327990c4809b37300eddc3">key_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef CBRNG::ukey_type </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef ctr_type::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a8fb9eb1ab76ad9b5374a47cf84ecd306">elem_type</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#ac5676bbe189b0cdc1bef0dd812262ccd">Engine</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#ae1a249af828cfdac77db6c16e3f8f8eb">Engine</a> (<a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> r)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a37dd55cee849b59d678f74780f785672">Engine</a> (<a class="el" href="structr123_1_1Engine.html">Engine</a> &e)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a478b486b166316597a51ffdd7b5b2d0c">Engine</a> (const <a class="el" href="structr123_1_1Engine.html">Engine</a> &e)</td></tr>
+<tr><td class="memTemplParams" colspan="2">template<typename SeedSeq > </td></tr>
+<tr><td class="memTemplItemLeft" align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a52b968cfefe413441d668b3013de023a">Engine</a> (SeedSeq &s)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a93429593bdb12b202b4b8ed38fe08bc4">seed</a> (<a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> r)</td></tr>
+<tr><td class="memTemplParams" colspan="2">template<typename SeedSeq > </td></tr>
+<tr><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#ac4d05ee820a1eb70e76cabb14645dad4">seed</a> (SeedSeq &s)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#aff36bc97d11bc66f6c0edb75d8dc88e5">seed</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#aca309d0b4f2a8fff1f6f2ab38c6caf93">operator()</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a82a56c2c02b146dceb68ef3fd0a969fb">discard</a> (uint64_t skip)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#ab5f45b4eb97995cc45350abee3ec8388">Engine</a> (const <a class="el" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> &uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#aeb178b9305cbf1fb7e11e8e33a631ba7">Engine</a> (<a class="el" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> &uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a5c4d68dbbccfc71f467f3c902f5b93da">seed</a> (const <a class="el" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> &uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a7bd6d3417cefb904c879f41d2c29e15e">seed</a> (<a class="el" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> &uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#af396a7d1656af55805e38f3d9c0fbef7">operator()</a> (const <a class="el" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a> &<a class="el" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a>) co [...]
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#aa7812a494fdb677c2e325db0acfe924a">getseed</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::pair< <a class="el" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a>, <a class="el" href="structr123_1_1Engine.html#a8fb9eb1ab76ad9b5374a47cf84ecd306">elem_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a621df886f2a21ffb22e63d9094389173">getcounter</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a6104bf5ee89450403379d5680bfae172">setcounter</a> (const <a class="el" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a> &_c, <a class="el" href="structr123_1_1Engine.html#a8fb9eb1ab76ad9b5374a47cf84ecd306">elem_type</a> _elem)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static R123_CONSTEXPR <br class="typebreak"/>
+<a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> min </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#af5441fc62932c3d099f8b16150d2aa81">R123_NO_MACRO_SUBST</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static R123_CONSTEXPR <br class="typebreak"/>
+<a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> max </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a112318f7d0015ecf4c3c6a8a5c76371b">R123_NO_MACRO_SUBST</a> ()</td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#aa73e4d27847915f1438fd37b30777111">_Min</a> = 0</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#ae549f81e966b0414bcaf0f24b566ebd8">_Max</a> = ~((<a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a>)0)</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#aa7ad87d7238a0f820ee37640071dee7d">fix_invariant</a> ()</td></tr>
+<tr><td colspan="2"><h2><a name="pro-attribs"></a>
+Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123_1_1Engine.html#a45ee0086cf8cd6d10febb76dc88f8b22">cbrng_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">b</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123_1_1Engine.html#a18132a79d2327990c4809b37300eddc3">key_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">key</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">ukey</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123_1_1Engine.html#a8fb9eb1ab76ad9b5374a47cf84ecd306">elem_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a6169d4fbce1fd7725fabda4c693bf250">v</a></td></tr>
+<tr><td colspan="2"><h2><a name="friends"></a>
+Friends</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#a606e3ba824542e52f12df1345126e721">operator==</a> (const <a class="el" href="structr123_1_1Engine.html">Engine</a> &lhs, const <a class="el" href="structr123_1_1Engine.html">Engine</a> &rhs)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#af0947cdcfc03aef7ec30c9fafa660445">operator!=</a> (const <a class="el" href="structr123_1_1Engine.html">Engine</a> &lhs, const <a class="el" href="structr123_1_1Engine.html">Engine</a> &rhs)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::ostream & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#ae0321571f689fca00c608d11ecad7d8d">operator<<</a> (std::ostream &os, const <a class="el" href="structr123_1_1Engine.html">Engine</a> &be)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">std::istream & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Engine.html#ae708b771ab5ac17700d34bad875a16d9">operator>></a> (std::istream &is, <a class="el" href="structr123_1_1Engine.html">Engine</a> &be)</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template<typename CBRNG><br/>
+ struct r123::Engine< CBRNG ></h3>
+
+<p>If G satisfies the requirements of a CBRNG, and has a ctr_type whose value_type is an unsigned integral type, then Engine<G> satisfies the requirements of a C++0x "Uniform Random Number Engine" and can be used in any context where such an object is expected.</p>
+<p>Note that wrapping a counter based RNG with a traditional API in this way obscures much of the power of counter based PRNGs. Nevertheless, it may be of value in applications that are already coded to work with the C++0x random number engines.</p>
+<p>The <a class="el" href="classr123_1_1MicroURNG.html">MicroURNG</a> template in <a class="el" href="MicroURNG_8hpp.html">MicroURNG.hpp</a> provides the more limited functionality of a C++0x "Uniform
+  Random Number Generator", but leaves the application in control of counters and keys and hence may be preferable to the <a class="el" href="structr123_1_1Engine.html">Engine</a> template. For example, a <a class="el" href="classr123_1_1MicroURNG.html">MicroURNG</a> allows one to use C++0x "Random Number
+  Distributions" without giving up control over the counters and keys. </p>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="a45ee0086cf8cd6d10febb76dc88f8b22"></a><!-- doxytag: member="r123::Engine::cbrng_type" ref="a45ee0086cf8cd6d10febb76dc88f8b22" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef CBRNG <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html#a45ee0086cf8cd6d10febb76dc88f8b22">cbrng_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a96e0f5f039d5efd6aae77b63bafaad90"></a><!-- doxytag: member="r123::Engine::ctr_type" ref="a96e0f5f039d5efd6aae77b63bafaad90" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef CBRNG::ctr_type <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8fb9eb1ab76ad9b5374a47cf84ecd306"></a><!-- doxytag: member="r123::Engine::elem_type" ref="a8fb9eb1ab76ad9b5374a47cf84ecd306" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef size_t <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html#a8fb9eb1ab76ad9b5374a47cf84ecd306">elem_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a18132a79d2327990c4809b37300eddc3"></a><!-- doxytag: member="r123::Engine::key_type" ref="a18132a79d2327990c4809b37300eddc3" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef CBRNG::key_type <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html#a18132a79d2327990c4809b37300eddc3">key_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3d7cb66d43f99f5e227990af985ecb45"></a><!-- doxytag: member="r123::Engine::result_type" ref="a3d7cb66d43f99f5e227990af985ecb45" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef ctr_type::value_type <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a32973bdda8697bcbb4dde11c0366a5e3"></a><!-- doxytag: member="r123::Engine::ukey_type" ref="a32973bdda8697bcbb4dde11c0366a5e3" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef CBRNG::ukey_type <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" id="ac5676bbe189b0cdc1bef0dd812262ccd"></a><!-- doxytag: member="r123::Engine::Engine" ref="ac5676bbe189b0cdc1bef0dd812262ccd" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html">Engine</a> </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline, explicit]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae1a249af828cfdac77db6c16e3f8f8eb"></a><!-- doxytag: member="r123::Engine::Engine" ref="ae1a249af828cfdac77db6c16e3f8f8eb" args="(result_type r)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html">Engine</a> </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> </td>
+          <td class="paramname"> <em>r</em></td>
+          <td> ) </td>
+          <td><code> [inline, explicit]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a37dd55cee849b59d678f74780f785672"></a><!-- doxytag: member="r123::Engine::Engine" ref="a37dd55cee849b59d678f74780f785672" args="(Engine &e)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html">Engine</a> </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123_1_1Engine.html">Engine</a>< CBRNG > & </td>
+          <td class="paramname"> <em>e</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a478b486b166316597a51ffdd7b5b2d0c"></a><!-- doxytag: member="r123::Engine::Engine" ref="a478b486b166316597a51ffdd7b5b2d0c" args="(const Engine &e)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html">Engine</a> </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123_1_1Engine.html">Engine</a>< CBRNG > & </td>
+          <td class="paramname"> <em>e</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a52b968cfefe413441d668b3013de023a"></a><!-- doxytag: member="r123::Engine::Engine" ref="a52b968cfefe413441d668b3013de023a" args="(SeedSeq &s)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+<div class="memtemplate">
+template<typename SeedSeq > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html">Engine</a> </td>
+          <td>(</td>
+          <td class="paramtype">SeedSeq & </td>
+          <td class="paramname"> <em>s</em></td>
+          <td> ) </td>
+          <td><code> [inline, explicit]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab5f45b4eb97995cc45350abee3ec8388"></a><!-- doxytag: member="r123::Engine::Engine" ref="ab5f45b4eb97995cc45350abee3ec8388" args="(const ukey_type &uk)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html">Engine</a> </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> & </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline, explicit]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aeb178b9305cbf1fb7e11e8e33a631ba7"></a><!-- doxytag: member="r123::Engine::Engine" ref="aeb178b9305cbf1fb7e11e8e33a631ba7" args="(ukey_type &uk)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html">Engine</a> </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> & </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline, explicit]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a82a56c2c02b146dceb68ef3fd0a969fb"></a><!-- doxytag: member="r123::Engine::discard" ref="a82a56c2c02b146dceb68ef3fd0a969fb" args="(uint64_t skip)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::discard </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>skip</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa7ad87d7238a0f820ee37640071dee7d"></a><!-- doxytag: member="r123::Engine::fix_invariant" ref="aa7ad87d7238a0f820ee37640071dee7d" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::fix_invariant </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline, protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a621df886f2a21ffb22e63d9094389173"></a><!-- doxytag: member="r123::Engine::getcounter" ref="a621df886f2a21ffb22e63d9094389173" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">std::pair<<a class="el" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a>, <a class="el" href="structr123_1_1Engine.html#a8fb9eb1ab76ad9b5374a47cf84ecd306">elem_type</a>> <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::getcounter </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa7812a494fdb677c2e325db0acfe924a"></a><!-- doxytag: member="r123::Engine::getseed" ref="aa7812a494fdb677c2e325db0acfe924a" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::getseed </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af396a7d1656af55805e38f3d9c0fbef7"></a><!-- doxytag: member="r123::Engine::operator()" ref="af396a7d1656af55805e38f3d9c0fbef7" args="(const ctr_type &c) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a> <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::operator() </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a> & </td>
+          <td class="paramname"> <em>c</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aca309d0b4f2a8fff1f6f2ab38c6caf93"></a><!-- doxytag: member="r123::Engine::operator()" ref="aca309d0b4f2a8fff1f6f2ab38c6caf93" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::operator() </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af5441fc62932c3d099f8b16150d2aa81"></a><!-- doxytag: member="r123::Engine::R123_NO_MACRO_SUBST" ref="af5441fc62932c3d099f8b16150d2aa81" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">static R123_CONSTEXPR <a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> min <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::R123_NO_MACRO_SUBST </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a112318f7d0015ecf4c3c6a8a5c76371b"></a><!-- doxytag: member="r123::Engine::R123_NO_MACRO_SUBST" ref="a112318f7d0015ecf4c3c6a8a5c76371b" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">static R123_CONSTEXPR <a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> max <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::R123_NO_MACRO_SUBST </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5c4d68dbbccfc71f467f3c902f5b93da"></a><!-- doxytag: member="r123::Engine::seed" ref="a5c4d68dbbccfc71f467f3c902f5b93da" args="(const ukey_type &uk)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::seed </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> & </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac4d05ee820a1eb70e76cabb14645dad4"></a><!-- doxytag: member="r123::Engine::seed" ref="ac4d05ee820a1eb70e76cabb14645dad4" args="(SeedSeq &s)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+<div class="memtemplate">
+template<typename SeedSeq > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::seed </td>
+          <td>(</td>
+          <td class="paramtype">SeedSeq & </td>
+          <td class="paramname"> <em>s</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7bd6d3417cefb904c879f41d2c29e15e"></a><!-- doxytag: member="r123::Engine::seed" ref="a7bd6d3417cefb904c879f41d2c29e15e" args="(ukey_type &uk)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::seed </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> & </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a93429593bdb12b202b4b8ed38fe08bc4"></a><!-- doxytag: member="r123::Engine::seed" ref="a93429593bdb12b202b4b8ed38fe08bc4" args="(result_type r)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::seed </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> </td>
+          <td class="paramname"> <em>r</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aff36bc97d11bc66f6c0edb75d8dc88e5"></a><!-- doxytag: member="r123::Engine::seed" ref="aff36bc97d11bc66f6c0edb75d8dc88e5" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::seed </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6104bf5ee89450403379d5680bfae172"></a><!-- doxytag: member="r123::Engine::setcounter" ref="a6104bf5ee89450403379d5680bfae172" args="(const ctr_type &_c, elem_type _elem)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::setcounter </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a> & </td>
+          <td class="paramname"> <em>_c</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123_1_1Engine.html#a8fb9eb1ab76ad9b5374a47cf84ecd306">elem_type</a> </td>
+          <td class="paramname"> <em>_elem</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Friends And Related Function Documentation</h2>
+<a class="anchor" id="af0947cdcfc03aef7ec30c9fafa660445"></a><!-- doxytag: member="r123::Engine::operator!=" ref="af0947cdcfc03aef7ec30c9fafa660445" args="(const Engine &lhs, const Engine &rhs)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool operator!= </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123_1_1Engine.html">Engine</a>< CBRNG > & </td>
+          <td class="paramname"> <em>lhs</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123_1_1Engine.html">Engine</a>< CBRNG > & </td>
+          <td class="paramname"> <em>rhs</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [friend]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae0321571f689fca00c608d11ecad7d8d"></a><!-- doxytag: member="r123::Engine::operator<<" ref="ae0321571f689fca00c608d11ecad7d8d" args="(std::ostream &os, const Engine &be)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">std::ostream& operator<< </td>
+          <td>(</td>
+          <td class="paramtype">std::ostream & </td>
+          <td class="paramname"> <em>os</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123_1_1Engine.html">Engine</a>< CBRNG > & </td>
+          <td class="paramname"> <em>be</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [friend]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a606e3ba824542e52f12df1345126e721"></a><!-- doxytag: member="r123::Engine::operator==" ref="a606e3ba824542e52f12df1345126e721" args="(const Engine &lhs, const Engine &rhs)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool operator== </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123_1_1Engine.html">Engine</a>< CBRNG > & </td>
+          <td class="paramname"> <em>lhs</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structr123_1_1Engine.html">Engine</a>< CBRNG > & </td>
+          <td class="paramname"> <em>rhs</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [friend]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae708b771ab5ac17700d34bad875a16d9"></a><!-- doxytag: member="r123::Engine::operator>>" ref="ae708b771ab5ac17700d34bad875a16d9" args="(std::istream &is, Engine &be)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">std::istream& operator>> </td>
+          <td>(</td>
+          <td class="paramtype">std::istream & </td>
+          <td class="paramname"> <em>is</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123_1_1Engine.html">Engine</a>< CBRNG > & </td>
+          <td class="paramname"> <em>be</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [friend]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="ae549f81e966b0414bcaf0f24b566ebd8"></a><!-- doxytag: member="r123::Engine::_Max" ref="ae549f81e966b0414bcaf0f24b566ebd8" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">const <a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html#ae549f81e966b0414bcaf0f24b566ebd8">_Max</a> = ~((<a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a>)0)<code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa73e4d27847915f1438fd37b30777111"></a><!-- doxytag: member="r123::Engine::_Min" ref="aa73e4d27847915f1438fd37b30777111" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">const <a class="el" href="structr123_1_1Engine.html#a3d7cb66d43f99f5e227990af985ecb45">result_type</a> <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html#aa73e4d27847915f1438fd37b30777111">_Min</a> = 0<code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5e430e850badcc4fd0f74de4a49a673b"></a><!-- doxytag: member="r123::Engine::b" ref="a5e430e850badcc4fd0f74de4a49a673b" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Engine.html#a45ee0086cf8cd6d10febb76dc88f8b22">cbrng_type</a> <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html#a5e430e850badcc4fd0f74de4a49a673b">b</a><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afb056ed93053f4175aabc9f4e5dd7b8d"></a><!-- doxytag: member="r123::Engine::c" ref="afb056ed93053f4175aabc9f4e5dd7b8d" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a> <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html#afb056ed93053f4175aabc9f4e5dd7b8d">c</a><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7b40128e9dc7427cd13d27477647b319"></a><!-- doxytag: member="r123::Engine::elem" ref="a7b40128e9dc7427cd13d27477647b319" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Engine.html#a8fb9eb1ab76ad9b5374a47cf84ecd306">elem_type</a> <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html#a7b40128e9dc7427cd13d27477647b319">elem</a><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adb9e1841a81f213a115e9f092f5c4654"></a><!-- doxytag: member="r123::Engine::key" ref="adb9e1841a81f213a115e9f092f5c4654" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Engine.html#a18132a79d2327990c4809b37300eddc3">key_type</a> <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html#adb9e1841a81f213a115e9f092f5c4654">key</a><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a11a79253c3a7b07e697f7bf4c7edb52f"></a><!-- doxytag: member="r123::Engine::ukey" ref="a11a79253c3a7b07e697f7bf4c7edb52f" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Engine.html#a32973bdda8697bcbb4dde11c0366a5e3">ukey_type</a> <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html#a11a79253c3a7b07e697f7bf4c7edb52f">ukey</a><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6169d4fbce1fd7725fabda4c693bf250"></a><!-- doxytag: member="r123::Engine::v" ref="a6169d4fbce1fd7725fabda4c693bf250" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1Engine.html#a96e0f5f039d5efd6aae77b63bafaad90">ctr_type</a> <a class="el" href="structr123_1_1Engine.html">r123::Engine</a>< CBRNG >::<a class="el" href="structr123_1_1Engine.html#a6169d4fbce1fd7725fabda4c693bf250">v</a><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>Random123/conventional/<a class="el" href="Engine_8hpp_source.html">Engine.hpp</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1Philox2x32__R.html b/lib/Random123-1.08/docs/html/structr123_1_1Philox2x32__R.html
new file mode 100644
index 0000000..10c2536
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1Philox2x32__R.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123::Philox2x32_R< ROUNDS > Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath">
+    <ul>
+      <li><a class="el" href="namespacer123.html">r123</a>      </li>
+      <li><a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32_R< ROUNDS ></a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-attribs">Static Public Attributes</a>  </div>
+  <div class="headertitle">
+<h1>r123::Philox2x32_R< ROUNDS > Class Template Reference<br/>
+<small>
+[<a class="el" href="group__PhiloxNxW.html">Philox Classes and Typedefs</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123::Philox2x32_R" -->
+<p><code>#include <<a class="el" href="philox_8h_source.html">Random123/philox.h</a>></code></p>
+
+<p><a href="classr123_1_1Philox2x32__R-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x32.html">r123array2x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox2x32__R.html#af00c84c482900fbeca6bd2043395e599">ctr_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array1x32.html">r123array1x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox2x32__R.html#a37dac768d36ef39e0228369e91b9f0ab">key_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array1x32.html">r123array1x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox2x32__R.html#a8982960eb5a3b5afc26c8e8d6639275e">ukey_type</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html">ctr_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox2x32__R.html#ab610a200c9fa62d090f31466b655c780">operator()</a> (<a class="el" href="structr123array2x32.html">ctr_type</a> ctr, <a class="el" href="structr123array1x32.html">key_type</a> key) const </td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static const unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox2x32__R.html#a52ee7b34688fc2e5315152a10d7df5f0">rounds</a> = ROUNDS</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template<unsigned int ROUNDS><br/>
+ class r123::Philox2x32_R< ROUNDS ></h3>
+
+<p>exports the member functions, typedefs and operator overloads required by a <a class="el" href="CBRNG.html">CBRNG</a> class.</p>
+<p>The template argument, ROUNDS, is the number of times the Philox round function will be applied.</p>
+<p>As of November 2011, the authors know of no statistical flaws with ROUNDS=6 or more for Philox2x32. </p>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="af00c84c482900fbeca6bd2043395e599"></a><!-- doxytag: member="r123::Philox2x32_R::ctr_type" ref="af00c84c482900fbeca6bd2043395e599" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array2x32.html">r123array2x32</a> <a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32_R</a>< ROUNDS >::<a class="el" href="structr123array2x32.html">ctr_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a37dac768d36ef39e0228369e91b9f0ab"></a><!-- doxytag: member="r123::Philox2x32_R::key_type" ref="a37dac768d36ef39e0228369e91b9f0ab" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array1x32.html">r123array1x32</a> <a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32_R</a>< ROUNDS >::<a class="el" href="structr123array1x32.html">key_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8982960eb5a3b5afc26c8e8d6639275e"></a><!-- doxytag: member="r123::Philox2x32_R::ukey_type" ref="a8982960eb5a3b5afc26c8e8d6639275e" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array1x32.html">r123array1x32</a> <a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32_R</a>< ROUNDS >::<a class="el" href="structr123array1x32.html">ukey_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="ab610a200c9fa62d090f31466b655c780"></a><!-- doxytag: member="r123::Philox2x32_R::operator()" ref="ab610a200c9fa62d090f31466b655c780" args="(ctr_type ctr, key_type key) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html">ctr_type</a> <a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32_R</a>< ROUNDS >::operator() </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html">ctr_type</a> </td>
+          <td class="paramname"> <em>ctr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array1x32.html">key_type</a> </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="a52ee7b34688fc2e5315152a10d7df5f0"></a><!-- doxytag: member="r123::Philox2x32_R::rounds" ref="a52ee7b34688fc2e5315152a10d7df5f0" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">const unsigned int <a class="el" href="structr123_1_1Philox2x32__R.html">r123::Philox2x32_R</a>< ROUNDS >::<a class="el" href="structr123_1_1Philox2x32__R.html#a52ee7b34688fc2e5315152a10d7df5f0">rounds</a> = ROUNDS<code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>Random123/<a class="el" href="philox_8h_source.html">philox.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1Philox2x64__R.html b/lib/Random123-1.08/docs/html/structr123_1_1Philox2x64__R.html
new file mode 100644
index 0000000..5f34e29
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1Philox2x64__R.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123::Philox2x64_R< ROUNDS > Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath">
+    <ul>
+      <li><a class="el" href="namespacer123.html">r123</a>      </li>
+      <li><a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64_R< ROUNDS ></a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-attribs">Static Public Attributes</a>  </div>
+  <div class="headertitle">
+<h1>r123::Philox2x64_R< ROUNDS > Class Template Reference<br/>
+<small>
+[<a class="el" href="group__PhiloxNxW.html">Philox Classes and Typedefs</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123::Philox2x64_R" -->
+<p><code>#include <<a class="el" href="philox_8h_source.html">Random123/philox.h</a>></code></p>
+
+<p><a href="classr123_1_1Philox2x64__R-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x64.html">r123array2x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox2x64__R.html#a8e615e3f4680b9e1b986ea071fd173fc">ctr_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array1x64.html">r123array1x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox2x64__R.html#adb8a638d3d96ef0ab594b0320bae329f">key_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array1x64.html">r123array1x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox2x64__R.html#a0c4cfeb8c3f00d1755ee047790c9da1c">ukey_type</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html">ctr_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox2x64__R.html#a04f6039e87a958593ac011d9304d7ec9">operator()</a> (<a class="el" href="structr123array2x64.html">ctr_type</a> ctr, <a class="el" href="structr123array1x64.html">key_type</a> key) const </td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static const unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox2x64__R.html#ac0764d78e07bf6d311b47d0f3ce92450">rounds</a> = ROUNDS</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template<unsigned int ROUNDS><br/>
+ class r123::Philox2x64_R< ROUNDS ></h3>
+
+<p>exports the member functions, typedefs and operator overloads required by a <a class="el" href="CBRNG.html">CBRNG</a> class.</p>
+<p>The template argument, ROUNDS, is the number of times the Philox round function will be applied.</p>
+<p>As of September 2011, the authors know of no statistical flaws with ROUNDS=6 or more for Philox2x64. </p>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="a8e615e3f4680b9e1b986ea071fd173fc"></a><!-- doxytag: member="r123::Philox2x64_R::ctr_type" ref="a8e615e3f4680b9e1b986ea071fd173fc" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array2x64.html">r123array2x64</a> <a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64_R</a>< ROUNDS >::<a class="el" href="structr123array2x64.html">ctr_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adb8a638d3d96ef0ab594b0320bae329f"></a><!-- doxytag: member="r123::Philox2x64_R::key_type" ref="adb8a638d3d96ef0ab594b0320bae329f" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array1x64.html">r123array1x64</a> <a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64_R</a>< ROUNDS >::<a class="el" href="structr123array1x64.html">key_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0c4cfeb8c3f00d1755ee047790c9da1c"></a><!-- doxytag: member="r123::Philox2x64_R::ukey_type" ref="a0c4cfeb8c3f00d1755ee047790c9da1c" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array1x64.html">r123array1x64</a> <a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64_R</a>< ROUNDS >::<a class="el" href="structr123array1x64.html">ukey_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a04f6039e87a958593ac011d9304d7ec9"></a><!-- doxytag: member="r123::Philox2x64_R::operator()" ref="a04f6039e87a958593ac011d9304d7ec9" args="(ctr_type ctr, key_type key) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html">ctr_type</a> <a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64_R</a>< ROUNDS >::operator() </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html">ctr_type</a> </td>
+          <td class="paramname"> <em>ctr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array1x64.html">key_type</a> </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="ac0764d78e07bf6d311b47d0f3ce92450"></a><!-- doxytag: member="r123::Philox2x64_R::rounds" ref="ac0764d78e07bf6d311b47d0f3ce92450" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">const unsigned int <a class="el" href="structr123_1_1Philox2x64__R.html">r123::Philox2x64_R</a>< ROUNDS >::<a class="el" href="structr123_1_1Philox2x64__R.html#ac0764d78e07bf6d311b47d0f3ce92450">rounds</a> = ROUNDS<code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>Random123/<a class="el" href="philox_8h_source.html">philox.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1Philox4x32__R.html b/lib/Random123-1.08/docs/html/structr123_1_1Philox4x32__R.html
new file mode 100644
index 0000000..c99202b
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1Philox4x32__R.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123::Philox4x32_R< ROUNDS > Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath">
+    <ul>
+      <li><a class="el" href="namespacer123.html">r123</a>      </li>
+      <li><a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32_R< ROUNDS ></a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-attribs">Static Public Attributes</a>  </div>
+  <div class="headertitle">
+<h1>r123::Philox4x32_R< ROUNDS > Class Template Reference<br/>
+<small>
+[<a class="el" href="group__PhiloxNxW.html">Philox Classes and Typedefs</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123::Philox4x32_R" -->
+<p><code>#include <<a class="el" href="philox_8h_source.html">Random123/philox.h</a>></code></p>
+
+<p><a href="classr123_1_1Philox4x32__R-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox4x32__R.html#a23adf0320faed0fe4d12ebececdba50a">ctr_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x32.html">r123array2x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox4x32__R.html#afa2e99f3e0b635f17ba9e16c186af63b">key_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x32.html">r123array2x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox4x32__R.html#a804c8700155da93039c339ac83df99dd">ukey_type</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html">ctr_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox4x32__R.html#adf05bdc0c856c9541db656711fd8c7d1">operator()</a> (<a class="el" href="structr123array4x32.html">ctr_type</a> ctr, <a class="el" href="structr123array2x32.html">key_type</a> key) const </td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static const unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox4x32__R.html#a90d6a86bff4dc6e5e24209423f125140">rounds</a> = ROUNDS</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template<unsigned int ROUNDS><br/>
+ class r123::Philox4x32_R< ROUNDS ></h3>
+
+<p>exports the member functions, typedefs and operator overloads required by a <a class="el" href="CBRNG.html">CBRNG</a> class.</p>
+<p>The template argument, ROUNDS, is the number of times the Philox round function will be applied.</p>
+<p>In November 2011, the authors recorded some suspicious p-values (approximately 1.e-7) from some very long (longer than the default BigCrush length) SimpPoker tests. Despite the fact that even longer tests reverted to "passing" p-values, a cloud remains over Philox4x32 with 7 rounds. The authors know of no statistical flaws with ROUNDS=8 or more for Philox4x32. </p>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="a23adf0320faed0fe4d12ebececdba50a"></a><!-- doxytag: member="r123::Philox4x32_R::ctr_type" ref="a23adf0320faed0fe4d12ebececdba50a" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array4x32.html">r123array4x32</a> <a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32_R</a>< ROUNDS >::<a class="el" href="structr123array4x32.html">ctr_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afa2e99f3e0b635f17ba9e16c186af63b"></a><!-- doxytag: member="r123::Philox4x32_R::key_type" ref="afa2e99f3e0b635f17ba9e16c186af63b" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array2x32.html">r123array2x32</a> <a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32_R</a>< ROUNDS >::<a class="el" href="structr123array2x32.html">key_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a804c8700155da93039c339ac83df99dd"></a><!-- doxytag: member="r123::Philox4x32_R::ukey_type" ref="a804c8700155da93039c339ac83df99dd" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array2x32.html">r123array2x32</a> <a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32_R</a>< ROUNDS >::<a class="el" href="structr123array2x32.html">ukey_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="adf05bdc0c856c9541db656711fd8c7d1"></a><!-- doxytag: member="r123::Philox4x32_R::operator()" ref="adf05bdc0c856c9541db656711fd8c7d1" args="(ctr_type ctr, key_type key) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html">ctr_type</a> <a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32_R</a>< ROUNDS >::operator() </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">ctr_type</a> </td>
+          <td class="paramname"> <em>ctr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html">key_type</a> </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="a90d6a86bff4dc6e5e24209423f125140"></a><!-- doxytag: member="r123::Philox4x32_R::rounds" ref="a90d6a86bff4dc6e5e24209423f125140" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">const unsigned int <a class="el" href="structr123_1_1Philox4x32__R.html">r123::Philox4x32_R</a>< ROUNDS >::<a class="el" href="structr123_1_1Philox4x32__R.html#a90d6a86bff4dc6e5e24209423f125140">rounds</a> = ROUNDS<code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>Random123/<a class="el" href="philox_8h_source.html">philox.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1Philox4x64__R.html b/lib/Random123-1.08/docs/html/structr123_1_1Philox4x64__R.html
new file mode 100644
index 0000000..83a4d18
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1Philox4x64__R.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123::Philox4x64_R< ROUNDS > Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath">
+    <ul>
+      <li><a class="el" href="namespacer123.html">r123</a>      </li>
+      <li><a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64_R< ROUNDS ></a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-attribs">Static Public Attributes</a>  </div>
+  <div class="headertitle">
+<h1>r123::Philox4x64_R< ROUNDS > Class Template Reference<br/>
+<small>
+[<a class="el" href="group__PhiloxNxW.html">Philox Classes and Typedefs</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123::Philox4x64_R" -->
+<p><code>#include <<a class="el" href="philox_8h_source.html">Random123/philox.h</a>></code></p>
+
+<p><a href="classr123_1_1Philox4x64__R-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x64.html">r123array4x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox4x64__R.html#afd5f78b34ae7c478ebe16eb601f7b202">ctr_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x64.html">r123array2x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox4x64__R.html#a9947ce12e3d03f9a60396d79bb56ba1c">key_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x64.html">r123array2x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox4x64__R.html#a4715e37129fb4ca9d7671cb9df4fa8c5">ukey_type</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html">ctr_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox4x64__R.html#aa5a0488aa6e16c55b7647c155b18462c">operator()</a> (<a class="el" href="structr123array4x64.html">ctr_type</a> ctr, <a class="el" href="structr123array2x64.html">key_type</a> key) const </td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static const unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Philox4x64__R.html#ac51193ab00b118b75784f86cf3470876">rounds</a> = ROUNDS</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template<unsigned int ROUNDS><br/>
+ class r123::Philox4x64_R< ROUNDS ></h3>
+
+<p>exports the member functions, typedefs and operator overloads required by a <a class="el" href="CBRNG.html">CBRNG</a> class.</p>
+<p>The template argument, ROUNDS, is the number of times the Philox round function will be applied.</p>
+<p>As of September 2011, the authors know of no statistical flaws with ROUNDS=7 or more for Philox4x64. </p>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="afd5f78b34ae7c478ebe16eb601f7b202"></a><!-- doxytag: member="r123::Philox4x64_R::ctr_type" ref="afd5f78b34ae7c478ebe16eb601f7b202" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array4x64.html">r123array4x64</a> <a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64_R</a>< ROUNDS >::<a class="el" href="structr123array4x64.html">ctr_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9947ce12e3d03f9a60396d79bb56ba1c"></a><!-- doxytag: member="r123::Philox4x64_R::key_type" ref="a9947ce12e3d03f9a60396d79bb56ba1c" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array2x64.html">r123array2x64</a> <a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64_R</a>< ROUNDS >::<a class="el" href="structr123array2x64.html">key_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4715e37129fb4ca9d7671cb9df4fa8c5"></a><!-- doxytag: member="r123::Philox4x64_R::ukey_type" ref="a4715e37129fb4ca9d7671cb9df4fa8c5" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array2x64.html">r123array2x64</a> <a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64_R</a>< ROUNDS >::<a class="el" href="structr123array2x64.html">ukey_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="aa5a0488aa6e16c55b7647c155b18462c"></a><!-- doxytag: member="r123::Philox4x64_R::operator()" ref="aa5a0488aa6e16c55b7647c155b18462c" args="(ctr_type ctr, key_type key) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html">ctr_type</a> <a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64_R</a>< ROUNDS >::operator() </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x64.html">ctr_type</a> </td>
+          <td class="paramname"> <em>ctr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html">key_type</a> </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="ac51193ab00b118b75784f86cf3470876"></a><!-- doxytag: member="r123::Philox4x64_R::rounds" ref="ac51193ab00b118b75784f86cf3470876" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int ROUNDS> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">const unsigned int <a class="el" href="structr123_1_1Philox4x64__R.html">r123::Philox4x64_R</a>< ROUNDS >::<a class="el" href="structr123_1_1Philox4x64__R.html#ac51193ab00b118b75784f86cf3470876">rounds</a> = ROUNDS<code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>Random123/<a class="el" href="philox_8h_source.html">philox.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1ReinterpretCtr-members.html b/lib/Random123-1.08/docs/html/structr123_1_1ReinterpretCtr-members.html
new file mode 100644
index 0000000..763b04f
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1ReinterpretCtr-members.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123::ReinterpretCtr< ToType, CBRNG > Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123_1_1ReinterpretCtr.html">r123::ReinterpretCtr< ToType, CBRNG ></a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1ReinterpretCtr.html#ae0accaee618b5eb28a24acd516b3a4c6">bctype</a> typedef</td><td><a class="el" href="structr123_1_1ReinterpretCtr.html">r123::ReinterpretCtr< ToType, CBRNG ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1ReinterpretCtr.html#a26cf9e933b35411c37070c948085ba02">ctr_type</a> typedef</td><td><a class="el" href="structr123_1_1ReinterpretCtr.html">r123::ReinterpretCtr< ToType, CBRNG ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1ReinterpretCtr.html#a470b21676ed709aa9d9ad524a67410f1">key_type</a> typedef</td><td><a class="el" href="structr123_1_1ReinterpretCtr.html">r123::ReinterpretCtr< ToType, CBRNG ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1ReinterpretCtr.html#a91edc5103397372cc5509ad17c0fc83a">operator()</a>(ctr_type c, key_type k)</td><td><a class="el" href="structr123_1_1ReinterpretCtr.html">r123::ReinterpretCtr< ToType, CBRNG ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123_1_1ReinterpretCtr.html#a4b0b69c1aa58d62bb22e51e16c586bee">ukey_type</a> typedef</td><td><a class="el" href="structr123_1_1ReinterpretCtr.html">r123::ReinterpretCtr< ToType, CBRNG ></a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1ReinterpretCtr.html b/lib/Random123-1.08/docs/html/structr123_1_1ReinterpretCtr.html
new file mode 100644
index 0000000..19b0965
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1ReinterpretCtr.html
@@ -0,0 +1,203 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123::ReinterpretCtr< ToType, CBRNG > Struct Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath">
+    <ul>
+      <li><a class="el" href="namespacer123.html">r123</a>      </li>
+      <li><a class="el" href="structr123_1_1ReinterpretCtr.html">r123::ReinterpretCtr< ToType, CBRNG ></a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a>  </div>
+  <div class="headertitle">
+<h1>r123::ReinterpretCtr< ToType, CBRNG > Struct Template Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123::ReinterpretCtr" -->
+<p><code>#include <<a class="el" href="ReinterpretCtr_8hpp_source.html">Random123/ReinterpretCtr.hpp</a>></code></p>
+
+<p><a href="structr123_1_1ReinterpretCtr-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef ToType </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ReinterpretCtr.html#a26cf9e933b35411c37070c948085ba02">ctr_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef CBRNG::key_type </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ReinterpretCtr.html#a470b21676ed709aa9d9ad524a67410f1">key_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef CBRNG::ctr_type </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ReinterpretCtr.html#ae0accaee618b5eb28a24acd516b3a4c6">bctype</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef CBRNG::ukey_type </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ReinterpretCtr.html#a4b0b69c1aa58d62bb22e51e16c586bee">ukey_type</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123_1_1ReinterpretCtr.html#a26cf9e933b35411c37070c948085ba02">ctr_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1ReinterpretCtr.html#a91edc5103397372cc5509ad17c0fc83a">operator()</a> (<a class="el" href="structr123_1_1ReinterpretCtr.html#a26cf9e933b35411c37070c948085ba02">ctr_type</a> c, <a class="el" href="structr123_1_1ReinterpretCtr.html#a470b21676ed709aa9d9 [...]
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template<typename ToType, typename CBRNG><br/>
+ struct r123::ReinterpretCtr< ToType, CBRNG ></h3>
+
+<p><a class="el" href="structr123_1_1ReinterpretCtr.html">ReinterpretCtr</a> uses memcpy to map back and forth between a CBRNG's ctr_type and the specified ToType. For example, after:</p>
+<p>typedef ReinterpretCtr<r123array4x32, Philox2x64> G;</p>
+<p>G is a bona fide CBRNG with ctr_type <a class="el" href="structr123array4x32.html">r123array4x32</a>.</p>
+<p>WARNING: <a class="el" href="structr123_1_1ReinterpretCtr.html">ReinterpretCtr</a> is endian dependent. The values returned by G, declared as above, will depend on the endianness of the machine on which it runs. </p>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="ae0accaee618b5eb28a24acd516b3a4c6"></a><!-- doxytag: member="r123::ReinterpretCtr::bctype" ref="ae0accaee618b5eb28a24acd516b3a4c6" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename ToType , typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef CBRNG::ctr_type <a class="el" href="structr123_1_1ReinterpretCtr.html">r123::ReinterpretCtr</a>< ToType, CBRNG >::<a class="el" href="structr123_1_1ReinterpretCtr.html#ae0accaee618b5eb28a24acd516b3a4c6">bctype</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a26cf9e933b35411c37070c948085ba02"></a><!-- doxytag: member="r123::ReinterpretCtr::ctr_type" ref="a26cf9e933b35411c37070c948085ba02" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename ToType , typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef ToType <a class="el" href="structr123_1_1ReinterpretCtr.html">r123::ReinterpretCtr</a>< ToType, CBRNG >::<a class="el" href="structr123_1_1ReinterpretCtr.html#a26cf9e933b35411c37070c948085ba02">ctr_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a470b21676ed709aa9d9ad524a67410f1"></a><!-- doxytag: member="r123::ReinterpretCtr::key_type" ref="a470b21676ed709aa9d9ad524a67410f1" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename ToType , typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef CBRNG::key_type <a class="el" href="structr123_1_1ReinterpretCtr.html">r123::ReinterpretCtr</a>< ToType, CBRNG >::<a class="el" href="structr123_1_1ReinterpretCtr.html#a470b21676ed709aa9d9ad524a67410f1">key_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4b0b69c1aa58d62bb22e51e16c586bee"></a><!-- doxytag: member="r123::ReinterpretCtr::ukey_type" ref="a4b0b69c1aa58d62bb22e51e16c586bee" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename ToType , typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef CBRNG::ukey_type <a class="el" href="structr123_1_1ReinterpretCtr.html">r123::ReinterpretCtr</a>< ToType, CBRNG >::<a class="el" href="structr123_1_1ReinterpretCtr.html#a4b0b69c1aa58d62bb22e51e16c586bee">ukey_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a91edc5103397372cc5509ad17c0fc83a"></a><!-- doxytag: member="r123::ReinterpretCtr::operator()" ref="a91edc5103397372cc5509ad17c0fc83a" args="(ctr_type c, key_type k)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename ToType , typename CBRNG > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123_1_1ReinterpretCtr.html#a26cf9e933b35411c37070c948085ba02">ctr_type</a> <a class="el" href="structr123_1_1ReinterpretCtr.html">r123::ReinterpretCtr</a>< ToType, CBRNG >::operator() </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123_1_1ReinterpretCtr.html#a26cf9e933b35411c37070c948085ba02">ctr_type</a> </td>
+          <td class="paramname"> <em>c</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123_1_1ReinterpretCtr.html#a470b21676ed709aa9d9ad524a67410f1">key_type</a> </td>
+          <td class="paramname"> <em>k</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>Random123/<a class="el" href="ReinterpretCtr_8hpp_source.html">ReinterpretCtr.hpp</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1Threefry2x32__R.html b/lib/Random123-1.08/docs/html/structr123_1_1Threefry2x32__R.html
new file mode 100644
index 0000000..7a6338f
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1Threefry2x32__R.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123::Threefry2x32_R< R > Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath">
+    <ul>
+      <li><a class="el" href="namespacer123.html">r123</a>      </li>
+      <li><a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32_R< R ></a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-attribs">Static Public Attributes</a>  </div>
+  <div class="headertitle">
+<h1>r123::Threefry2x32_R< R > Class Template Reference<br/>
+<small>
+[<a class="el" href="group__ThreefryNxW.html">Threefry Classes and Typedefs</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123::Threefry2x32_R" -->
+<p><code>#include <<a class="el" href="threefry_8h_source.html">Random123/threefry.h</a>></code></p>
+
+<p><a href="classr123_1_1Threefry2x32__R-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x32.html">threefry2x32_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry2x32__R.html#a60b1b58aeaa05d467607dc570aed1357">ctr_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x32.html">threefry2x32_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry2x32__R.html#abfaaff871ef5e2e2cf397884ddab4cdc">key_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x32.html">threefry2x32_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry2x32__R.html#a3ab3969f7445f9fe935566fdc017c5ca">ukey_type</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html">ctr_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry2x32__R.html#a64b8018e82f3e7a0e252166b15b42a71">operator()</a> (<a class="el" href="structr123array2x32.html">ctr_type</a> ctr, <a class="el" href="structr123array2x32.html">key_type</a> key)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static const unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry2x32__R.html#af5be46f8426cfcd86e75327e4b3750b0">rounds</a> = R</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template<unsigned int R><br/>
+ class r123::Threefry2x32_R< R ></h3>
+
+<p>exports the member functions, typedefs and operator overloads required by a <a class="el" href="CBRNG.html">CBRNG</a> class.</p>
+<p>The template argument, ROUNDS, is the number of times the Threefry round function will be applied.</p>
+<p>As of September 2011, the authors know of no statistical flaws with ROUNDS=13 or more for Threefry2x32. </p>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="a60b1b58aeaa05d467607dc570aed1357"></a><!-- doxytag: member="r123::Threefry2x32_R::ctr_type" ref="a60b1b58aeaa05d467607dc570aed1357" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array2x32.html">threefry2x32_ctr_t</a> <a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32_R</a>< R >::<a class="el" href="structr123array2x32.html">ctr_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abfaaff871ef5e2e2cf397884ddab4cdc"></a><!-- doxytag: member="r123::Threefry2x32_R::key_type" ref="abfaaff871ef5e2e2cf397884ddab4cdc" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array2x32.html">threefry2x32_key_t</a> <a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32_R</a>< R >::<a class="el" href="structr123array2x32.html">key_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3ab3969f7445f9fe935566fdc017c5ca"></a><!-- doxytag: member="r123::Threefry2x32_R::ukey_type" ref="a3ab3969f7445f9fe935566fdc017c5ca" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array2x32.html">threefry2x32_key_t</a> <a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32_R</a>< R >::<a class="el" href="structr123array2x32.html">ukey_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a64b8018e82f3e7a0e252166b15b42a71"></a><!-- doxytag: member="r123::Threefry2x32_R::operator()" ref="a64b8018e82f3e7a0e252166b15b42a71" args="(ctr_type ctr, key_type key)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html">ctr_type</a> <a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32_R</a>< R >::operator() </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html">ctr_type</a> </td>
+          <td class="paramname"> <em>ctr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html">key_type</a> </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="af5be46f8426cfcd86e75327e4b3750b0"></a><!-- doxytag: member="r123::Threefry2x32_R::rounds" ref="af5be46f8426cfcd86e75327e4b3750b0" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">const unsigned int <a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32_R</a>< R >::<a class="el" href="structr123_1_1Threefry2x32__R.html#af5be46f8426cfcd86e75327e4b3750b0">rounds</a> = R<code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>Random123/<a class="el" href="threefry_8h_source.html">threefry.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1Threefry2x64__R.html b/lib/Random123-1.08/docs/html/structr123_1_1Threefry2x64__R.html
new file mode 100644
index 0000000..a51822b
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1Threefry2x64__R.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123::Threefry2x64_R< R > Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath">
+    <ul>
+      <li><a class="el" href="namespacer123.html">r123</a>      </li>
+      <li><a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64_R< R ></a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-attribs">Static Public Attributes</a>  </div>
+  <div class="headertitle">
+<h1>r123::Threefry2x64_R< R > Class Template Reference<br/>
+<small>
+[<a class="el" href="group__ThreefryNxW.html">Threefry Classes and Typedefs</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123::Threefry2x64_R" -->
+<p><code>#include <<a class="el" href="threefry_8h_source.html">Random123/threefry.h</a>></code></p>
+
+<p><a href="classr123_1_1Threefry2x64__R-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x64.html">threefry2x64_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry2x64__R.html#a6b151f30bc5544671596b9df91e896d8">ctr_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x64.html">threefry2x64_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry2x64__R.html#ae652f0e9ca6ec234fd2f4fc9afb1007c">key_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x64.html">threefry2x64_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry2x64__R.html#a57db271865ab1889c8f569fb053ee66d">ukey_type</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html">ctr_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry2x64__R.html#ab654a85f2c4ec65548ddfc85dc00f27e">operator()</a> (<a class="el" href="structr123array2x64.html">ctr_type</a> ctr, <a class="el" href="structr123array2x64.html">key_type</a> key)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static const unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry2x64__R.html#aa994d756504284e6a59cc8d3c57f16c6">rounds</a> = R</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template<unsigned int R><br/>
+ class r123::Threefry2x64_R< R ></h3>
+
+<p>exports the member functions, typedefs and operator overloads required by a <a class="el" href="CBRNG.html">CBRNG</a> class.</p>
+<p>The template argument, ROUNDS, is the number of times the Threefry round function will be applied.</p>
+<p>In November 2011, the authors discovered that 13 rounds of Threefry2x64 sequenced by strided, interleaved key and counter increments failed a very long (longer than the default BigCrush length) WeightDistrub test. At the same time, it was confirmed that 14 rounds passes much longer tests (up to 5x10^12 samples) of a similar nature. The authors know of no statistical flaws with ROUNDS=14 or more for Threefry2x64. </p>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="a6b151f30bc5544671596b9df91e896d8"></a><!-- doxytag: member="r123::Threefry2x64_R::ctr_type" ref="a6b151f30bc5544671596b9df91e896d8" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array2x64.html">threefry2x64_ctr_t</a> <a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64_R</a>< R >::<a class="el" href="structr123array2x64.html">ctr_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae652f0e9ca6ec234fd2f4fc9afb1007c"></a><!-- doxytag: member="r123::Threefry2x64_R::key_type" ref="ae652f0e9ca6ec234fd2f4fc9afb1007c" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array2x64.html">threefry2x64_key_t</a> <a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64_R</a>< R >::<a class="el" href="structr123array2x64.html">key_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a57db271865ab1889c8f569fb053ee66d"></a><!-- doxytag: member="r123::Threefry2x64_R::ukey_type" ref="a57db271865ab1889c8f569fb053ee66d" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array2x64.html">threefry2x64_key_t</a> <a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64_R</a>< R >::<a class="el" href="structr123array2x64.html">ukey_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="ab654a85f2c4ec65548ddfc85dc00f27e"></a><!-- doxytag: member="r123::Threefry2x64_R::operator()" ref="ab654a85f2c4ec65548ddfc85dc00f27e" args="(ctr_type ctr, key_type key)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html">ctr_type</a> <a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64_R</a>< R >::operator() </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html">ctr_type</a> </td>
+          <td class="paramname"> <em>ctr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html">key_type</a> </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="aa994d756504284e6a59cc8d3c57f16c6"></a><!-- doxytag: member="r123::Threefry2x64_R::rounds" ref="aa994d756504284e6a59cc8d3c57f16c6" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">const unsigned int <a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64_R</a>< R >::<a class="el" href="structr123_1_1Threefry2x64__R.html#aa994d756504284e6a59cc8d3c57f16c6">rounds</a> = R<code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>Random123/<a class="el" href="threefry_8h_source.html">threefry.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1Threefry4x32__R.html b/lib/Random123-1.08/docs/html/structr123_1_1Threefry4x32__R.html
new file mode 100644
index 0000000..d9e2bf5
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1Threefry4x32__R.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123::Threefry4x32_R< R > Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath">
+    <ul>
+      <li><a class="el" href="namespacer123.html">r123</a>      </li>
+      <li><a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32_R< R ></a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-attribs">Static Public Attributes</a>  </div>
+  <div class="headertitle">
+<h1>r123::Threefry4x32_R< R > Class Template Reference<br/>
+<small>
+[<a class="el" href="group__ThreefryNxW.html">Threefry Classes and Typedefs</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123::Threefry4x32_R" -->
+<p><code>#include <<a class="el" href="threefry_8h_source.html">Random123/threefry.h</a>></code></p>
+
+<p><a href="classr123_1_1Threefry4x32__R-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x32.html">threefry4x32_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry4x32__R.html#ae89dabc0060c62e0d9e5c4ac34a8550f">ctr_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x32.html">threefry4x32_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry4x32__R.html#a140f5cf20bde7784d778b82f0ebf8778">key_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x32.html">threefry4x32_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry4x32__R.html#aab22e360de3f5e13f018ccf3a6754a8f">ukey_type</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html">ctr_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry4x32__R.html#ae0dfbf399015fab602c769ad90256231">operator()</a> (<a class="el" href="structr123array4x32.html">ctr_type</a> ctr, <a class="el" href="structr123array4x32.html">key_type</a> key)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static const unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry4x32__R.html#af63fd38ba9acf04ee56d75e96b413291">rounds</a> = R</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template<unsigned int R><br/>
+ class r123::Threefry4x32_R< R ></h3>
+
+<p>exports the member functions, typedefs and operator overloads required by a <a class="el" href="CBRNG.html">CBRNG</a> class.</p>
+<p>The template argument, ROUNDS, is the number of times the Threefry round function will be applied.</p>
+<p>As of September 2011, the authors know of no statistical flaws with ROUNDS=12 or more for Threefry4x32. </p>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="ae89dabc0060c62e0d9e5c4ac34a8550f"></a><!-- doxytag: member="r123::Threefry4x32_R::ctr_type" ref="ae89dabc0060c62e0d9e5c4ac34a8550f" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array4x32.html">threefry4x32_ctr_t</a> <a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32_R</a>< R >::<a class="el" href="structr123array4x32.html">ctr_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a140f5cf20bde7784d778b82f0ebf8778"></a><!-- doxytag: member="r123::Threefry4x32_R::key_type" ref="a140f5cf20bde7784d778b82f0ebf8778" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array4x32.html">threefry4x32_key_t</a> <a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32_R</a>< R >::<a class="el" href="structr123array4x32.html">key_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aab22e360de3f5e13f018ccf3a6754a8f"></a><!-- doxytag: member="r123::Threefry4x32_R::ukey_type" ref="aab22e360de3f5e13f018ccf3a6754a8f" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array4x32.html">threefry4x32_key_t</a> <a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32_R</a>< R >::<a class="el" href="structr123array4x32.html">ukey_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="ae0dfbf399015fab602c769ad90256231"></a><!-- doxytag: member="r123::Threefry4x32_R::operator()" ref="ae0dfbf399015fab602c769ad90256231" args="(ctr_type ctr, key_type key)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html">ctr_type</a> <a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32_R</a>< R >::operator() </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">ctr_type</a> </td>
+          <td class="paramname"> <em>ctr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">key_type</a> </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="af63fd38ba9acf04ee56d75e96b413291"></a><!-- doxytag: member="r123::Threefry4x32_R::rounds" ref="af63fd38ba9acf04ee56d75e96b413291" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">const unsigned int <a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32_R</a>< R >::<a class="el" href="structr123_1_1Threefry4x32__R.html#af63fd38ba9acf04ee56d75e96b413291">rounds</a> = R<code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>Random123/<a class="el" href="threefry_8h_source.html">threefry.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123_1_1Threefry4x64__R.html b/lib/Random123-1.08/docs/html/structr123_1_1Threefry4x64__R.html
new file mode 100644
index 0000000..10910b8
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123_1_1Threefry4x64__R.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123::Threefry4x64_R< R > Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+  <div class="navpath">
+    <ul>
+      <li><a class="el" href="namespacer123.html">r123</a>      </li>
+      <li><a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64_R< R ></a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-attribs">Static Public Attributes</a>  </div>
+  <div class="headertitle">
+<h1>r123::Threefry4x64_R< R > Class Template Reference<br/>
+<small>
+[<a class="el" href="group__ThreefryNxW.html">Threefry Classes and Typedefs</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123::Threefry4x64_R" -->
+<p><code>#include <<a class="el" href="threefry_8h_source.html">Random123/threefry.h</a>></code></p>
+
+<p><a href="classr123_1_1Threefry4x64__R-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x64.html">threefry4x64_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry4x64__R.html#a6c93334cb8a8b53ef01cc79b5296af0d">ctr_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x64.html">threefry4x64_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry4x64__R.html#adb406d1af0e757bd8058582ee39f21dc">key_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x64.html">threefry4x64_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry4x64__R.html#a087ff88f84d115a6a726e008c6dcc325">ukey_type</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html">ctr_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry4x64__R.html#a09e7fb82f9b7bcf6ccb4d849116b6ec1">operator()</a> (<a class="el" href="structr123array4x64.html">ctr_type</a> ctr, <a class="el" href="structr123array4x64.html">key_type</a> key)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static const unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry4x64__R.html#ab8807960eec8fc2198055ec2a971e116">rounds</a> = R</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template<unsigned int R><br/>
+ class r123::Threefry4x64_R< R ></h3>
+
+<p>exports the member functions, typedefs and operator overloads required by a <a class="el" href="CBRNG.html">CBRNG</a> class.</p>
+<p>The template argument, ROUNDS, is the number of times the Threefry round function will be applied.</p>
+<p>As of September 2011, the authors know of no statistical flaws with ROUNDS=12 or more for Threefry4x64. </p>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="a6c93334cb8a8b53ef01cc79b5296af0d"></a><!-- doxytag: member="r123::Threefry4x64_R::ctr_type" ref="a6c93334cb8a8b53ef01cc79b5296af0d" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array4x64.html">threefry4x64_ctr_t</a> <a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64_R</a>< R >::<a class="el" href="structr123array4x64.html">ctr_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adb406d1af0e757bd8058582ee39f21dc"></a><!-- doxytag: member="r123::Threefry4x64_R::key_type" ref="adb406d1af0e757bd8058582ee39f21dc" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array4x64.html">threefry4x64_key_t</a> <a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64_R</a>< R >::<a class="el" href="structr123array4x64.html">key_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a087ff88f84d115a6a726e008c6dcc325"></a><!-- doxytag: member="r123::Threefry4x64_R::ukey_type" ref="a087ff88f84d115a6a726e008c6dcc325" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array4x64.html">threefry4x64_key_t</a> <a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64_R</a>< R >::<a class="el" href="structr123array4x64.html">ukey_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a09e7fb82f9b7bcf6ccb4d849116b6ec1"></a><!-- doxytag: member="r123::Threefry4x64_R::operator()" ref="a09e7fb82f9b7bcf6ccb4d849116b6ec1" args="(ctr_type ctr, key_type key)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html">ctr_type</a> <a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64_R</a>< R >::operator() </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x64.html">ctr_type</a> </td>
+          <td class="paramname"> <em>ctr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array4x64.html">key_type</a> </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="ab8807960eec8fc2198055ec2a971e116"></a><!-- doxytag: member="r123::Threefry4x64_R::rounds" ref="ab8807960eec8fc2198055ec2a971e116" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<unsigned int R> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">const unsigned int <a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64_R</a>< R >::<a class="el" href="structr123_1_1Threefry4x64__R.html#ab8807960eec8fc2198055ec2a971e116">rounds</a> = R<code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>Random123/<a class="el" href="threefry_8h_source.html">threefry.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array16x8-members.html b/lib/Random123-1.08/docs/html/structr123array16x8-members.html
new file mode 100644
index 0000000..c241d05
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array16x8-members.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123array16x8 Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123array16x8.html">r123array16x8</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a7742edac513767b0f3ca6abe1a3eabb7">at</a>(size_type i)</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a088dbabe23cf873de370af292052905e">at</a>(size_type i) const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#ae607d3b3d068aec88672241fc97948cb">back</a>()</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a6e5e98c20ae0e6bf4f8a897c08b0700e">back</a>() const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a43182e95cb41660de5511bb5a3968cb8">begin</a>()</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#acef590bcf52e4a167c2388f4d1e0b20e">begin</a>() const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a80520b3d7040a8d6ec7068c8a143ba6f">cbegin</a>() const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#ad7919a7f772fda7d3fe3b476ac1e058f">cend</a>() const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#adda842a447360852f2ffa28fb97eb40c">const_iterator</a> typedef</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#adbe5a6feb583ce6a682496e14cec9cca">const_pointer</a> typedef</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a7252c320f8b0fb4d66a17acd9e94b4ad">const_reference</a> typedef</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a7a774fcb52f452f832e11e13dbde6dea">const_reverse_iterator</a> typedef</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a2ecc3c23f3ae3939a386b334f0556d73">crbegin</a>() const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a2a98e77e851e130a98d44a14ce673ffd">crend</a>() const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#aac0eda610fbd60cdaae5d1e2aa4eb03f">data</a>()</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#aced4f7455fcc853a4e947b9bf892c45e">data</a>() const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#aaae0b6c18de6ce92ea55bf1b9bdbdf69">difference_type</a> typedef</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a5f07441771ec90cd05a2c26fb64e575e">empty</a>() const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#aa0d2b0c70133dde0535b0a5e12283626">end</a>()</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#aee42dddf2a59858114a31d760f2c1227">end</a>() const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a883d42092ab4bae2eac132706ed06103">fill</a>(const value_type &val)</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#ad293e6494e131ff96941e963d9208586">front</a>()</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a85528130b6941b3f7b57265c201345c2">front</a>() const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#aaf2d677b347b7c7bf362a2b318f46e3c">incr</a>(uint64_t n=1)</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#abbc6c2d9cdc2187cdfdea759951498a0">incr_carefully</a>(uint64_t n)</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a36bdba5b2d96c8dfe9b7e59b203d5047">iterator</a> typedef</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a3f59fb2b338aa8e33879e8d2d22840ed">max_size</a>() const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#af48be55844748a0f6406b2ae437398b5">operator!=</a>(const r123array16x8 &rhs) const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a4d3ed48f2b716382ea874a968a2b7174">operator==</a>(const r123array16x8 &rhs) const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#abe9f2b18e2e3b89e00725f6fa69b8236">operator[]</a>(size_type i)</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a013713c00f6e8a5adb7be77388c22d8f">operator[]</a>(size_type i) const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#aa6ae2e4843b3bb1b66425afa7da9e281">pointer</a> typedef</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a5023769f3e418e15a707501aaaac5487">rbegin</a>()</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a5da4b6af6ebaf8cc8204713a993a860c">rbegin</a>() const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#adf010ea54bc2f9dceb8568d59c6dde8a">reference</a> typedef</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a252b937d65e7b04e5bc507d43643441f">rend</a>()</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a286fef704fcf11e9f00d73703b7ab36b">rend</a>() const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#aeeb5d6d55c07a515e4c7d01cb5c5351b">reverse_iterator</a> typedef</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#aef0741829d359c31ad913a6770661895">seed</a>(SeedSeq &ss)</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a9a31da5cdf154eba3e44af4e51002a15">size</a>() const </td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952">size_type</a> typedef</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a7b2912a12e57bc62644a8ce57e2301b2af0ee079d4b47a988dcd2b8b8457f266f">static_size</a> enum value</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a2de9273e9c4b4c47315cb20885e9c6ed">swap</a>(r123array16x8 &rhs)</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#a703776a5f85fb222e16b739309489783">v</a></td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array16x8.html#ad1d7184f51cafaff4714a2dcf60c9ae2">value_type</a> typedef</td><td><a class="el" href="structr123array16x8.html">r123array16x8</a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array16x8.html b/lib/Random123-1.08/docs/html/structr123array16x8.html
new file mode 100644
index 0000000..29d4d9f
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array16x8.html
@@ -0,0 +1,892 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123array16x8 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-methods">Static Public Member Functions</a> |
+<a href="#pub-attribs">Public Attributes</a> |
+<a href="#pro-methods">Protected Member Functions</a>  </div>
+  <div class="headertitle">
+<h1>r123array16x8 Struct Reference<br/>
+<small>
+[<a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123array16x8" -->
+<p><code>#include <<a class="el" href="array_8h_source.html">Random123/array.h</a>></code></p>
+
+<p><a href="structr123array16x8-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom">{ <a class="el" href="structr123array16x8.html#a7b2912a12e57bc62644a8ce57e2301b2af0ee079d4b47a988dcd2b8b8457f266f">static_size</a> =  16
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint8_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#ad1d7184f51cafaff4714a2dcf60c9ae2">value_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint8_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a36bdba5b2d96c8dfe9b7e59b203d5047">iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const uint8_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#adda842a447360852f2ffa28fb97eb40c">const_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array16x8.html#ad1d7184f51cafaff4714a2dcf60c9ae2">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#adf010ea54bc2f9dceb8568d59c6dde8a">reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const <a class="el" href="structr123array16x8.html#ad1d7184f51cafaff4714a2dcf60c9ae2">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a7252c320f8b0fb4d66a17acd9e94b4ad">const_reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952">size_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#aaae0b6c18de6ce92ea55bf1b9bdbdf69">difference_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint8_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#aa6ae2e4843b3bb1b66425afa7da9e281">pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const uint8_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#adbe5a6feb583ce6a682496e14cec9cca">const_pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123array16x8.html#a36bdba5b2d96c8dfe9b7e59b203d5047">iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#aeeb5d6d55c07a515e4c7d01cb5c5351b">reverse_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123array16x8.html#adda842a447360852f2ffa28fb97eb40c">const_iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a7a774fcb52f452f832e11e13dbde6dea">const_reverse_iterator</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#adf010ea54bc2f9dceb8568d59c6dde8a">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#abe9f2b18e2e3b89e00725f6fa69b8236">operator[]</a> (<a class="el" href="structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#a7252c320f8b0fb4d66a17acd9e94b4ad">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a013713c00f6e8a5adb7be77388c22d8f">operator[]</a> (<a class="el" href="structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#adf010ea54bc2f9dceb8568d59c6dde8a">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a7742edac513767b0f3ca6abe1a3eabb7">at</a> (<a class="el" href="structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#a7252c320f8b0fb4d66a17acd9e94b4ad">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a088dbabe23cf873de370af292052905e">at</a> (<a class="el" href="structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a9a31da5cdf154eba3e44af4e51002a15">size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a3f59fb2b338aa8e33879e8d2d22840ed">max_size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a5f07441771ec90cd05a2c26fb64e575e">empty</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#a36bdba5b2d96c8dfe9b7e59b203d5047">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a43182e95cb41660de5511bb5a3968cb8">begin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#a36bdba5b2d96c8dfe9b7e59b203d5047">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#aa0d2b0c70133dde0535b0a5e12283626">end</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#adda842a447360852f2ffa28fb97eb40c">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#acef590bcf52e4a167c2388f4d1e0b20e">begin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#adda842a447360852f2ffa28fb97eb40c">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#aee42dddf2a59858114a31d760f2c1227">end</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#adda842a447360852f2ffa28fb97eb40c">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a80520b3d7040a8d6ec7068c8a143ba6f">cbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#adda842a447360852f2ffa28fb97eb40c">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#ad7919a7f772fda7d3fe3b476ac1e058f">cend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#aeeb5d6d55c07a515e4c7d01cb5c5351b">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a5023769f3e418e15a707501aaaac5487">rbegin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#a7a774fcb52f452f832e11e13dbde6dea">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a5da4b6af6ebaf8cc8204713a993a860c">rbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#aeeb5d6d55c07a515e4c7d01cb5c5351b">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a252b937d65e7b04e5bc507d43643441f">rend</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#a7a774fcb52f452f832e11e13dbde6dea">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a286fef704fcf11e9f00d73703b7ab36b">rend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#a7a774fcb52f452f832e11e13dbde6dea">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a2ecc3c23f3ae3939a386b334f0556d73">crbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#a7a774fcb52f452f832e11e13dbde6dea">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a2a98e77e851e130a98d44a14ce673ffd">crend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#aa6ae2e4843b3bb1b66425afa7da9e281">pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#aac0eda610fbd60cdaae5d1e2aa4eb03f">data</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#adbe5a6feb583ce6a682496e14cec9cca">const_pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#aced4f7455fcc853a4e947b9bf892c45e">data</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#adf010ea54bc2f9dceb8568d59c6dde8a">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#ad293e6494e131ff96941e963d9208586">front</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#a7252c320f8b0fb4d66a17acd9e94b4ad">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a85528130b6941b3f7b57265c201345c2">front</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#adf010ea54bc2f9dceb8568d59c6dde8a">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#ae607d3b3d068aec88672241fc97948cb">back</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html#a7252c320f8b0fb4d66a17acd9e94b4ad">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a6e5e98c20ae0e6bf4f8a897c08b0700e">back</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a4d3ed48f2b716382ea874a968a2b7174">operator==</a> (const <a class="el" href="structr123array16x8.html">r123array16x8</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#af48be55844748a0f6406b2ae437398b5">operator!=</a> (const <a class="el" href="structr123array16x8.html">r123array16x8</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a883d42092ab4bae2eac132706ed06103">fill</a> (const <a class="el" href="structr123array16x8.html#ad1d7184f51cafaff4714a2dcf60c9ae2">value_type</a> &val)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a2de9273e9c4b4c47315cb20885e9c6ed">swap</a> (<a class="el" href="structr123array16x8.html">r123array16x8</a> &rhs)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html">r123array16x8</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#aaf2d677b347b7c7bf362a2b318f46e3c">incr</a> (uint64_t n=1)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr><td class="memTemplParams" colspan="2">template<typename SeedSeq > </td></tr>
+<tr><td class="memTemplItemLeft" align="right" valign="top">static <a class="el" href="structr123array16x8.html">r123array16x8</a> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#aef0741829d359c31ad913a6770661895">seed</a> (SeedSeq &ss)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">uint8_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#a703776a5f85fb222e16b739309489783">v</a> [16]</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array16x8.html">r123array16x8</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array16x8.html#abbc6c2d9cdc2187cdfdea759951498a0">incr_carefully</a> (uint64_t n)</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a> </dd></dl>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="adda842a447360852f2ffa28fb97eb40c"></a><!-- doxytag: member="r123array16x8::const_iterator" ref="adda842a447360852f2ffa28fb97eb40c" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const uint8_t* <a class="el" href="structr123array16x8.html#adda842a447360852f2ffa28fb97eb40c">r123array16x8::const_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adbe5a6feb583ce6a682496e14cec9cca"></a><!-- doxytag: member="r123array16x8::const_pointer" ref="adbe5a6feb583ce6a682496e14cec9cca" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const uint8_t* <a class="el" href="structr123array16x8.html#adbe5a6feb583ce6a682496e14cec9cca">r123array16x8::const_pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7252c320f8b0fb4d66a17acd9e94b4ad"></a><!-- doxytag: member="r123array16x8::const_reference" ref="a7252c320f8b0fb4d66a17acd9e94b4ad" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const <a class="el" href="structr123array16x8.html#ad1d7184f51cafaff4714a2dcf60c9ae2">value_type</a>& <a class="el" href="structr123array16x8.html#a7252c320f8b0fb4d66a17acd9e94b4ad">r123array16x8::const_reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7a774fcb52f452f832e11e13dbde6dea"></a><!-- doxytag: member="r123array16x8::const_reverse_iterator" ref="a7a774fcb52f452f832e11e13dbde6dea" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123array16x8.html#adda842a447360852f2ffa28fb97eb40c">const_iterator</a>> <a class="el" href="structr123array16x8.html#a7a774fcb52f452f832e11e13dbde6dea">r123array16x8::const_reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aaae0b6c18de6ce92ea55bf1b9bdbdf69"></a><!-- doxytag: member="r123array16x8::difference_type" ref="aaae0b6c18de6ce92ea55bf1b9bdbdf69" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef ptrdiff_t <a class="el" href="structr123array16x8.html#aaae0b6c18de6ce92ea55bf1b9bdbdf69">r123array16x8::difference_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a36bdba5b2d96c8dfe9b7e59b203d5047"></a><!-- doxytag: member="r123array16x8::iterator" ref="a36bdba5b2d96c8dfe9b7e59b203d5047" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint8_t* <a class="el" href="structr123array16x8.html#a36bdba5b2d96c8dfe9b7e59b203d5047">r123array16x8::iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa6ae2e4843b3bb1b66425afa7da9e281"></a><!-- doxytag: member="r123array16x8::pointer" ref="aa6ae2e4843b3bb1b66425afa7da9e281" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint8_t* <a class="el" href="structr123array16x8.html#aa6ae2e4843b3bb1b66425afa7da9e281">r123array16x8::pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adf010ea54bc2f9dceb8568d59c6dde8a"></a><!-- doxytag: member="r123array16x8::reference" ref="adf010ea54bc2f9dceb8568d59c6dde8a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array16x8.html#ad1d7184f51cafaff4714a2dcf60c9ae2">value_type</a>& <a class="el" href="structr123array16x8.html#adf010ea54bc2f9dceb8568d59c6dde8a">r123array16x8::reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aeeb5d6d55c07a515e4c7d01cb5c5351b"></a><!-- doxytag: member="r123array16x8::reverse_iterator" ref="aeeb5d6d55c07a515e4c7d01cb5c5351b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123array16x8.html#a36bdba5b2d96c8dfe9b7e59b203d5047">iterator</a>> <a class="el" href="structr123array16x8.html#aeeb5d6d55c07a515e4c7d01cb5c5351b">r123array16x8::reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae892bee1409b006ec01597c0e1f22952"></a><!-- doxytag: member="r123array16x8::size_type" ref="ae892bee1409b006ec01597c0e1f22952" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef size_t <a class="el" href="structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952">r123array16x8::size_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad1d7184f51cafaff4714a2dcf60c9ae2"></a><!-- doxytag: member="r123array16x8::value_type" ref="ad1d7184f51cafaff4714a2dcf60c9ae2" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint8_t <a class="el" href="structr123array16x8.html#ad1d7184f51cafaff4714a2dcf60c9ae2">r123array16x8::value_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Enumeration Documentation</h2>
+<a class="anchor" id="a7b2912a12e57bc62644a8ce57e2301b2"></a><!-- doxytag: member="r123array16x8::@7" ref="a7b2912a12e57bc62644a8ce57e2301b2" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">anonymous enum</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="a7b2912a12e57bc62644a8ce57e2301b2af0ee079d4b47a988dcd2b8b8457f266f"></a><!-- doxytag: member="static_size" ref="a7b2912a12e57bc62644a8ce57e2301b2af0ee079d4b47a988dcd2b8b8457f266f" args="" -->static_size</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a7742edac513767b0f3ca6abe1a3eabb7"></a><!-- doxytag: member="r123array16x8::at" ref="a7742edac513767b0f3ca6abe1a3eabb7" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#adf010ea54bc2f9dceb8568d59c6dde8a">reference</a> r123array16x8::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a088dbabe23cf873de370af292052905e"></a><!-- doxytag: member="r123array16x8::at" ref="a088dbabe23cf873de370af292052905e" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#a7252c320f8b0fb4d66a17acd9e94b4ad">const_reference</a> r123array16x8::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae607d3b3d068aec88672241fc97948cb"></a><!-- doxytag: member="r123array16x8::back" ref="ae607d3b3d068aec88672241fc97948cb" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#adf010ea54bc2f9dceb8568d59c6dde8a">reference</a> r123array16x8::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6e5e98c20ae0e6bf4f8a897c08b0700e"></a><!-- doxytag: member="r123array16x8::back" ref="a6e5e98c20ae0e6bf4f8a897c08b0700e" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#a7252c320f8b0fb4d66a17acd9e94b4ad">const_reference</a> r123array16x8::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a43182e95cb41660de5511bb5a3968cb8"></a><!-- doxytag: member="r123array16x8::begin" ref="a43182e95cb41660de5511bb5a3968cb8" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#a36bdba5b2d96c8dfe9b7e59b203d5047">iterator</a> r123array16x8::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acef590bcf52e4a167c2388f4d1e0b20e"></a><!-- doxytag: member="r123array16x8::begin" ref="acef590bcf52e4a167c2388f4d1e0b20e" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#adda842a447360852f2ffa28fb97eb40c">const_iterator</a> r123array16x8::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a80520b3d7040a8d6ec7068c8a143ba6f"></a><!-- doxytag: member="r123array16x8::cbegin" ref="a80520b3d7040a8d6ec7068c8a143ba6f" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#adda842a447360852f2ffa28fb97eb40c">const_iterator</a> r123array16x8::cbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad7919a7f772fda7d3fe3b476ac1e058f"></a><!-- doxytag: member="r123array16x8::cend" ref="ad7919a7f772fda7d3fe3b476ac1e058f" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#adda842a447360852f2ffa28fb97eb40c">const_iterator</a> r123array16x8::cend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2ecc3c23f3ae3939a386b334f0556d73"></a><!-- doxytag: member="r123array16x8::crbegin" ref="a2ecc3c23f3ae3939a386b334f0556d73" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#a7a774fcb52f452f832e11e13dbde6dea">const_reverse_iterator</a> r123array16x8::crbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2a98e77e851e130a98d44a14ce673ffd"></a><!-- doxytag: member="r123array16x8::crend" ref="a2a98e77e851e130a98d44a14ce673ffd" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#a7a774fcb52f452f832e11e13dbde6dea">const_reverse_iterator</a> r123array16x8::crend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aac0eda610fbd60cdaae5d1e2aa4eb03f"></a><!-- doxytag: member="r123array16x8::data" ref="aac0eda610fbd60cdaae5d1e2aa4eb03f" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#aa6ae2e4843b3bb1b66425afa7da9e281">pointer</a> r123array16x8::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aced4f7455fcc853a4e947b9bf892c45e"></a><!-- doxytag: member="r123array16x8::data" ref="aced4f7455fcc853a4e947b9bf892c45e" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#adbe5a6feb583ce6a682496e14cec9cca">const_pointer</a> r123array16x8::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5f07441771ec90cd05a2c26fb64e575e"></a><!-- doxytag: member="r123array16x8::empty" ref="a5f07441771ec90cd05a2c26fb64e575e" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array16x8::empty </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa0d2b0c70133dde0535b0a5e12283626"></a><!-- doxytag: member="r123array16x8::end" ref="aa0d2b0c70133dde0535b0a5e12283626" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#a36bdba5b2d96c8dfe9b7e59b203d5047">iterator</a> r123array16x8::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aee42dddf2a59858114a31d760f2c1227"></a><!-- doxytag: member="r123array16x8::end" ref="aee42dddf2a59858114a31d760f2c1227" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#adda842a447360852f2ffa28fb97eb40c">const_iterator</a> r123array16x8::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a883d42092ab4bae2eac132706ed06103"></a><!-- doxytag: member="r123array16x8::fill" ref="a883d42092ab4bae2eac132706ed06103" args="(const value_type &val)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array16x8::fill </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array16x8.html#ad1d7184f51cafaff4714a2dcf60c9ae2">value_type</a> & </td>
+          <td class="paramname"> <em>val</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad293e6494e131ff96941e963d9208586"></a><!-- doxytag: member="r123array16x8::front" ref="ad293e6494e131ff96941e963d9208586" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#adf010ea54bc2f9dceb8568d59c6dde8a">reference</a> r123array16x8::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a85528130b6941b3f7b57265c201345c2"></a><!-- doxytag: member="r123array16x8::front" ref="a85528130b6941b3f7b57265c201345c2" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#a7252c320f8b0fb4d66a17acd9e94b4ad">const_reference</a> r123array16x8::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aaf2d677b347b7c7bf362a2b318f46e3c"></a><!-- doxytag: member="r123array16x8::incr" ref="aaf2d677b347b7c7bf362a2b318f46e3c" args="(uint64_t n=1)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html">r123array16x8</a>& r123array16x8::incr </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em> = <code>1</code></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abbc6c2d9cdc2187cdfdea759951498a0"></a><!-- doxytag: member="r123array16x8::incr_carefully" ref="abbc6c2d9cdc2187cdfdea759951498a0" args="(uint64_t n)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html">r123array16x8</a>& r123array16x8::incr_carefully </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em></td>
+          <td> ) </td>
+          <td><code> [inline, protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3f59fb2b338aa8e33879e8d2d22840ed"></a><!-- doxytag: member="r123array16x8::max_size" ref="a3f59fb2b338aa8e33879e8d2d22840ed" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952">size_type</a> r123array16x8::max_size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af48be55844748a0f6406b2ae437398b5"></a><!-- doxytag: member="r123array16x8::operator!=" ref="af48be55844748a0f6406b2ae437398b5" args="(const r123array16x8 &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array16x8::operator!= </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array16x8.html">r123array16x8</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4d3ed48f2b716382ea874a968a2b7174"></a><!-- doxytag: member="r123array16x8::operator==" ref="a4d3ed48f2b716382ea874a968a2b7174" args="(const r123array16x8 &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array16x8::operator== </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array16x8.html">r123array16x8</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a013713c00f6e8a5adb7be77388c22d8f"></a><!-- doxytag: member="r123array16x8::operator[]" ref="a013713c00f6e8a5adb7be77388c22d8f" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#a7252c320f8b0fb4d66a17acd9e94b4ad">const_reference</a> r123array16x8::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abe9f2b18e2e3b89e00725f6fa69b8236"></a><!-- doxytag: member="r123array16x8::operator[]" ref="abe9f2b18e2e3b89e00725f6fa69b8236" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#adf010ea54bc2f9dceb8568d59c6dde8a">reference</a> r123array16x8::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5023769f3e418e15a707501aaaac5487"></a><!-- doxytag: member="r123array16x8::rbegin" ref="a5023769f3e418e15a707501aaaac5487" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#aeeb5d6d55c07a515e4c7d01cb5c5351b">reverse_iterator</a> r123array16x8::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5da4b6af6ebaf8cc8204713a993a860c"></a><!-- doxytag: member="r123array16x8::rbegin" ref="a5da4b6af6ebaf8cc8204713a993a860c" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#a7a774fcb52f452f832e11e13dbde6dea">const_reverse_iterator</a> r123array16x8::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a286fef704fcf11e9f00d73703b7ab36b"></a><!-- doxytag: member="r123array16x8::rend" ref="a286fef704fcf11e9f00d73703b7ab36b" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#a7a774fcb52f452f832e11e13dbde6dea">const_reverse_iterator</a> r123array16x8::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a252b937d65e7b04e5bc507d43643441f"></a><!-- doxytag: member="r123array16x8::rend" ref="a252b937d65e7b04e5bc507d43643441f" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#aeeb5d6d55c07a515e4c7d01cb5c5351b">reverse_iterator</a> r123array16x8::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aef0741829d359c31ad913a6770661895"></a><!-- doxytag: member="r123array16x8::seed" ref="aef0741829d359c31ad913a6770661895" args="(SeedSeq &ss)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename SeedSeq > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array16x8.html">r123array16x8</a> r123array16x8::seed </td>
+          <td>(</td>
+          <td class="paramtype">SeedSeq & </td>
+          <td class="paramname"> <em>ss</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9a31da5cdf154eba3e44af4e51002a15"></a><!-- doxytag: member="r123array16x8::size" ref="a9a31da5cdf154eba3e44af4e51002a15" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array16x8.html#ae892bee1409b006ec01597c0e1f22952">size_type</a> r123array16x8::size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2de9273e9c4b4c47315cb20885e9c6ed"></a><!-- doxytag: member="r123array16x8::swap" ref="a2de9273e9c4b4c47315cb20885e9c6ed" args="(r123array16x8 &rhs)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array16x8::swap </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array16x8.html">r123array16x8</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="a703776a5f85fb222e16b739309489783"></a><!-- doxytag: member="r123array16x8::v" ref="a703776a5f85fb222e16b739309489783" args="[16]" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">uint8_t <a class="el" href="structr123array16x8.html#a703776a5f85fb222e16b739309489783">r123array16x8::v</a>[16]</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>Random123/<a class="el" href="array_8h_source.html">array.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array1x32-members.html b/lib/Random123-1.08/docs/html/structr123array1x32-members.html
new file mode 100644
index 0000000..07a5e67
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array1x32-members.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123array1x32 Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123array1x32.html">r123array1x32</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a300f163f4293879003e6831b1180350d">at</a>(size_type i)</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a1d57048b43ee45e2a94ef372b4707783">at</a>(size_type i) const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a3738a65a648899db793e81b53c252785">back</a>()</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a32b89fb1c75e3cc26ff3b5acdd40af99">back</a>() const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a86b7d754ff8dd69e0565edfdbd060cb4">begin</a>()</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a19089b8de6c637803408512407a4da91">begin</a>() const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a4b0a02537590babd835dd16405775efe">cbegin</a>() const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#aa0f83d3e29c452d23c3660c98e3bd0e9">cend</a>() const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#ac7f82e8848759ec5b0026dce8830274e">const_iterator</a> typedef</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#ab4a82a1e5300814272528a05587d555b">const_pointer</a> typedef</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#adfa6614a8b20cd30c192458c8c2874da">const_reference</a> typedef</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a2642ed91a9c6c91ace3b91add2a4feae">const_reverse_iterator</a> typedef</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#abe59890575233ef259a69d38bea4b5d9">crbegin</a>() const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a7f0211b995c536c540c6b175d9433c74">crend</a>() const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a71529eccd6d52d7c396d58fd71214d0b">data</a>()</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a8ca295876693f207df52a7cce6f96241">data</a>() const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a1084c78861e725e58c14c67af242952f">difference_type</a> typedef</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#ae791cf5ce80a35610c3b4d52ea533651">empty</a>() const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#ac2b5032395c448c4598321f5a37ec29c">end</a>()</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a5bda32a4f4e8e783744ed7f183dde0b2">end</a>() const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a973dbecc59b1d5f5a95bda92d25e5e73">fill</a>(const value_type &val)</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a69727e5b1c14fcc2f7c9b6af4410cc16">front</a>()</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#af94d0df621b1de0b6a3ed904c276eb84">front</a>() const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#aae5fbc153a37b06ea466f2283551622f">incr</a>(uint64_t n=1)</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a9c919289274ced376086f1110c8b6384">incr_carefully</a>(uint64_t n)</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#ad17f00c1dbff151f91d381f7c0b99dc8">iterator</a> typedef</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a707c532168670ad508723d057f712928">max_size</a>() const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#af293f370d083051f6cf24408e07feff1">operator!=</a>(const r123array1x32 &rhs) const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a61140a0fb8983a3018a2b98903d14047">operator==</a>(const r123array1x32 &rhs) const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#aa47bb157c60858c1b0ef69df79646a3b">operator[]</a>(size_type i)</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a05cf21fa6a647c73763da02d4b7e2f2a">operator[]</a>(size_type i) const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a85ce46c2e10ab3d9c4f60aebe6268898">pointer</a> typedef</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a0c91373623da349c09b952f616b7f5e9">rbegin</a>()</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#aacb0604c956b8e50b057a6034c78069c">rbegin</a>() const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#ae5aa4e3a65528495ea71371529ade7d7">reference</a> typedef</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a7a55225361d3e9e6f037daa13d340fc4">rend</a>()</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#aad87615e3d9d32467d2f139be5be08ce">rend</a>() const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a21cb520afa483ae177c469f3940e7ed2">reverse_iterator</a> typedef</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#adf914fa4384acfcfa1750fd47b758f42">seed</a>(SeedSeq &ss)</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a4cbaf3feeaad0bb7227d065294240561">size</a>() const </td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53">size_type</a> typedef</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a2cdb0e09b7e8ba20de255ddcb54ea9baae9556d9b93643fe1f7e56e973200177a">static_size</a> enum value</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#afdd8df41333430593d31350bd12db11a">swap</a>(r123array1x32 &rhs)</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a1123ac44ecadd52dae06d2c8df86764a">v</a></td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x32.html#a9c8e0d672be32b52eef639f1a3b2b98a">value_type</a> typedef</td><td><a class="el" href="structr123array1x32.html">r123array1x32</a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array1x32.html b/lib/Random123-1.08/docs/html/structr123array1x32.html
new file mode 100644
index 0000000..0f92af3
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array1x32.html
@@ -0,0 +1,892 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123array1x32 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-methods">Static Public Member Functions</a> |
+<a href="#pub-attribs">Public Attributes</a> |
+<a href="#pro-methods">Protected Member Functions</a>  </div>
+  <div class="headertitle">
+<h1>r123array1x32 Struct Reference<br/>
+<small>
+[<a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123array1x32" -->
+<p><code>#include <<a class="el" href="array_8h_source.html">Random123/array.h</a>></code></p>
+
+<p><a href="structr123array1x32-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom">{ <a class="el" href="structr123array1x32.html#a2cdb0e09b7e8ba20de255ddcb54ea9baae9556d9b93643fe1f7e56e973200177a">static_size</a> =  1
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a9c8e0d672be32b52eef639f1a3b2b98a">value_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint32_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#ad17f00c1dbff151f91d381f7c0b99dc8">iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const uint32_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#ac7f82e8848759ec5b0026dce8830274e">const_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array1x32.html#a9c8e0d672be32b52eef639f1a3b2b98a">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#ae5aa4e3a65528495ea71371529ade7d7">reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const <a class="el" href="structr123array1x32.html#a9c8e0d672be32b52eef639f1a3b2b98a">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#adfa6614a8b20cd30c192458c8c2874da">const_reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53">size_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a1084c78861e725e58c14c67af242952f">difference_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint32_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a85ce46c2e10ab3d9c4f60aebe6268898">pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const uint32_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#ab4a82a1e5300814272528a05587d555b">const_pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123array1x32.html#ad17f00c1dbff151f91d381f7c0b99dc8">iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a21cb520afa483ae177c469f3940e7ed2">reverse_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123array1x32.html#ac7f82e8848759ec5b0026dce8830274e">const_iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a2642ed91a9c6c91ace3b91add2a4feae">const_reverse_iterator</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#ae5aa4e3a65528495ea71371529ade7d7">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#aa47bb157c60858c1b0ef69df79646a3b">operator[]</a> (<a class="el" href="structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#adfa6614a8b20cd30c192458c8c2874da">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a05cf21fa6a647c73763da02d4b7e2f2a">operator[]</a> (<a class="el" href="structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#ae5aa4e3a65528495ea71371529ade7d7">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a300f163f4293879003e6831b1180350d">at</a> (<a class="el" href="structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#adfa6614a8b20cd30c192458c8c2874da">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a1d57048b43ee45e2a94ef372b4707783">at</a> (<a class="el" href="structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a4cbaf3feeaad0bb7227d065294240561">size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a707c532168670ad508723d057f712928">max_size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#ae791cf5ce80a35610c3b4d52ea533651">empty</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#ad17f00c1dbff151f91d381f7c0b99dc8">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a86b7d754ff8dd69e0565edfdbd060cb4">begin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#ad17f00c1dbff151f91d381f7c0b99dc8">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#ac2b5032395c448c4598321f5a37ec29c">end</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#ac7f82e8848759ec5b0026dce8830274e">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a19089b8de6c637803408512407a4da91">begin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#ac7f82e8848759ec5b0026dce8830274e">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a5bda32a4f4e8e783744ed7f183dde0b2">end</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#ac7f82e8848759ec5b0026dce8830274e">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a4b0a02537590babd835dd16405775efe">cbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#ac7f82e8848759ec5b0026dce8830274e">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#aa0f83d3e29c452d23c3660c98e3bd0e9">cend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#a21cb520afa483ae177c469f3940e7ed2">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a0c91373623da349c09b952f616b7f5e9">rbegin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#a2642ed91a9c6c91ace3b91add2a4feae">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#aacb0604c956b8e50b057a6034c78069c">rbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#a21cb520afa483ae177c469f3940e7ed2">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a7a55225361d3e9e6f037daa13d340fc4">rend</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#a2642ed91a9c6c91ace3b91add2a4feae">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#aad87615e3d9d32467d2f139be5be08ce">rend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#a2642ed91a9c6c91ace3b91add2a4feae">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#abe59890575233ef259a69d38bea4b5d9">crbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#a2642ed91a9c6c91ace3b91add2a4feae">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a7f0211b995c536c540c6b175d9433c74">crend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#a85ce46c2e10ab3d9c4f60aebe6268898">pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a71529eccd6d52d7c396d58fd71214d0b">data</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#ab4a82a1e5300814272528a05587d555b">const_pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a8ca295876693f207df52a7cce6f96241">data</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#ae5aa4e3a65528495ea71371529ade7d7">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a69727e5b1c14fcc2f7c9b6af4410cc16">front</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#adfa6614a8b20cd30c192458c8c2874da">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#af94d0df621b1de0b6a3ed904c276eb84">front</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#ae5aa4e3a65528495ea71371529ade7d7">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a3738a65a648899db793e81b53c252785">back</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html#adfa6614a8b20cd30c192458c8c2874da">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a32b89fb1c75e3cc26ff3b5acdd40af99">back</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a61140a0fb8983a3018a2b98903d14047">operator==</a> (const <a class="el" href="structr123array1x32.html">r123array1x32</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#af293f370d083051f6cf24408e07feff1">operator!=</a> (const <a class="el" href="structr123array1x32.html">r123array1x32</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a973dbecc59b1d5f5a95bda92d25e5e73">fill</a> (const <a class="el" href="structr123array1x32.html#a9c8e0d672be32b52eef639f1a3b2b98a">value_type</a> &val)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#afdd8df41333430593d31350bd12db11a">swap</a> (<a class="el" href="structr123array1x32.html">r123array1x32</a> &rhs)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html">r123array1x32</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#aae5fbc153a37b06ea466f2283551622f">incr</a> (uint64_t n=1)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr><td class="memTemplParams" colspan="2">template<typename SeedSeq > </td></tr>
+<tr><td class="memTemplItemLeft" align="right" valign="top">static <a class="el" href="structr123array1x32.html">r123array1x32</a> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#adf914fa4384acfcfa1750fd47b758f42">seed</a> (SeedSeq &ss)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a1123ac44ecadd52dae06d2c8df86764a">v</a> [1]</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x32.html">r123array1x32</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x32.html#a9c919289274ced376086f1110c8b6384">incr_carefully</a> (uint64_t n)</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a> </dd></dl>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="ac7f82e8848759ec5b0026dce8830274e"></a><!-- doxytag: member="r123array1x32::const_iterator" ref="ac7f82e8848759ec5b0026dce8830274e" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const uint32_t* <a class="el" href="structr123array1x32.html#ac7f82e8848759ec5b0026dce8830274e">r123array1x32::const_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab4a82a1e5300814272528a05587d555b"></a><!-- doxytag: member="r123array1x32::const_pointer" ref="ab4a82a1e5300814272528a05587d555b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const uint32_t* <a class="el" href="structr123array1x32.html#ab4a82a1e5300814272528a05587d555b">r123array1x32::const_pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adfa6614a8b20cd30c192458c8c2874da"></a><!-- doxytag: member="r123array1x32::const_reference" ref="adfa6614a8b20cd30c192458c8c2874da" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const <a class="el" href="structr123array1x32.html#a9c8e0d672be32b52eef639f1a3b2b98a">value_type</a>& <a class="el" href="structr123array1x32.html#adfa6614a8b20cd30c192458c8c2874da">r123array1x32::const_reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2642ed91a9c6c91ace3b91add2a4feae"></a><!-- doxytag: member="r123array1x32::const_reverse_iterator" ref="a2642ed91a9c6c91ace3b91add2a4feae" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123array1x32.html#ac7f82e8848759ec5b0026dce8830274e">const_iterator</a>> <a class="el" href="structr123array1x32.html#a2642ed91a9c6c91ace3b91add2a4feae">r123array1x32::const_reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1084c78861e725e58c14c67af242952f"></a><!-- doxytag: member="r123array1x32::difference_type" ref="a1084c78861e725e58c14c67af242952f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef ptrdiff_t <a class="el" href="structr123array1x32.html#a1084c78861e725e58c14c67af242952f">r123array1x32::difference_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad17f00c1dbff151f91d381f7c0b99dc8"></a><!-- doxytag: member="r123array1x32::iterator" ref="ad17f00c1dbff151f91d381f7c0b99dc8" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint32_t* <a class="el" href="structr123array1x32.html#ad17f00c1dbff151f91d381f7c0b99dc8">r123array1x32::iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a85ce46c2e10ab3d9c4f60aebe6268898"></a><!-- doxytag: member="r123array1x32::pointer" ref="a85ce46c2e10ab3d9c4f60aebe6268898" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint32_t* <a class="el" href="structr123array1x32.html#a85ce46c2e10ab3d9c4f60aebe6268898">r123array1x32::pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae5aa4e3a65528495ea71371529ade7d7"></a><!-- doxytag: member="r123array1x32::reference" ref="ae5aa4e3a65528495ea71371529ade7d7" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array1x32.html#a9c8e0d672be32b52eef639f1a3b2b98a">value_type</a>& <a class="el" href="structr123array1x32.html#ae5aa4e3a65528495ea71371529ade7d7">r123array1x32::reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a21cb520afa483ae177c469f3940e7ed2"></a><!-- doxytag: member="r123array1x32::reverse_iterator" ref="a21cb520afa483ae177c469f3940e7ed2" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123array1x32.html#ad17f00c1dbff151f91d381f7c0b99dc8">iterator</a>> <a class="el" href="structr123array1x32.html#a21cb520afa483ae177c469f3940e7ed2">r123array1x32::reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a30405dcf03997aaf3f981c05d1fa1e53"></a><!-- doxytag: member="r123array1x32::size_type" ref="a30405dcf03997aaf3f981c05d1fa1e53" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef size_t <a class="el" href="structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53">r123array1x32::size_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9c8e0d672be32b52eef639f1a3b2b98a"></a><!-- doxytag: member="r123array1x32::value_type" ref="a9c8e0d672be32b52eef639f1a3b2b98a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint32_t <a class="el" href="structr123array1x32.html#a9c8e0d672be32b52eef639f1a3b2b98a">r123array1x32::value_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Enumeration Documentation</h2>
+<a class="anchor" id="a2cdb0e09b7e8ba20de255ddcb54ea9ba"></a><!-- doxytag: member="r123array1x32::@0" ref="a2cdb0e09b7e8ba20de255ddcb54ea9ba" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">anonymous enum</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="a2cdb0e09b7e8ba20de255ddcb54ea9baae9556d9b93643fe1f7e56e973200177a"></a><!-- doxytag: member="static_size" ref="a2cdb0e09b7e8ba20de255ddcb54ea9baae9556d9b93643fe1f7e56e973200177a" args="" -->static_size</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a300f163f4293879003e6831b1180350d"></a><!-- doxytag: member="r123array1x32::at" ref="a300f163f4293879003e6831b1180350d" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#ae5aa4e3a65528495ea71371529ade7d7">reference</a> r123array1x32::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1d57048b43ee45e2a94ef372b4707783"></a><!-- doxytag: member="r123array1x32::at" ref="a1d57048b43ee45e2a94ef372b4707783" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#adfa6614a8b20cd30c192458c8c2874da">const_reference</a> r123array1x32::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3738a65a648899db793e81b53c252785"></a><!-- doxytag: member="r123array1x32::back" ref="a3738a65a648899db793e81b53c252785" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#ae5aa4e3a65528495ea71371529ade7d7">reference</a> r123array1x32::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a32b89fb1c75e3cc26ff3b5acdd40af99"></a><!-- doxytag: member="r123array1x32::back" ref="a32b89fb1c75e3cc26ff3b5acdd40af99" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#adfa6614a8b20cd30c192458c8c2874da">const_reference</a> r123array1x32::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a86b7d754ff8dd69e0565edfdbd060cb4"></a><!-- doxytag: member="r123array1x32::begin" ref="a86b7d754ff8dd69e0565edfdbd060cb4" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#ad17f00c1dbff151f91d381f7c0b99dc8">iterator</a> r123array1x32::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a19089b8de6c637803408512407a4da91"></a><!-- doxytag: member="r123array1x32::begin" ref="a19089b8de6c637803408512407a4da91" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#ac7f82e8848759ec5b0026dce8830274e">const_iterator</a> r123array1x32::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4b0a02537590babd835dd16405775efe"></a><!-- doxytag: member="r123array1x32::cbegin" ref="a4b0a02537590babd835dd16405775efe" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#ac7f82e8848759ec5b0026dce8830274e">const_iterator</a> r123array1x32::cbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa0f83d3e29c452d23c3660c98e3bd0e9"></a><!-- doxytag: member="r123array1x32::cend" ref="aa0f83d3e29c452d23c3660c98e3bd0e9" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#ac7f82e8848759ec5b0026dce8830274e">const_iterator</a> r123array1x32::cend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abe59890575233ef259a69d38bea4b5d9"></a><!-- doxytag: member="r123array1x32::crbegin" ref="abe59890575233ef259a69d38bea4b5d9" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#a2642ed91a9c6c91ace3b91add2a4feae">const_reverse_iterator</a> r123array1x32::crbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7f0211b995c536c540c6b175d9433c74"></a><!-- doxytag: member="r123array1x32::crend" ref="a7f0211b995c536c540c6b175d9433c74" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#a2642ed91a9c6c91ace3b91add2a4feae">const_reverse_iterator</a> r123array1x32::crend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a71529eccd6d52d7c396d58fd71214d0b"></a><!-- doxytag: member="r123array1x32::data" ref="a71529eccd6d52d7c396d58fd71214d0b" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#a85ce46c2e10ab3d9c4f60aebe6268898">pointer</a> r123array1x32::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8ca295876693f207df52a7cce6f96241"></a><!-- doxytag: member="r123array1x32::data" ref="a8ca295876693f207df52a7cce6f96241" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#ab4a82a1e5300814272528a05587d555b">const_pointer</a> r123array1x32::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae791cf5ce80a35610c3b4d52ea533651"></a><!-- doxytag: member="r123array1x32::empty" ref="ae791cf5ce80a35610c3b4d52ea533651" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array1x32::empty </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac2b5032395c448c4598321f5a37ec29c"></a><!-- doxytag: member="r123array1x32::end" ref="ac2b5032395c448c4598321f5a37ec29c" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#ad17f00c1dbff151f91d381f7c0b99dc8">iterator</a> r123array1x32::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5bda32a4f4e8e783744ed7f183dde0b2"></a><!-- doxytag: member="r123array1x32::end" ref="a5bda32a4f4e8e783744ed7f183dde0b2" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#ac7f82e8848759ec5b0026dce8830274e">const_iterator</a> r123array1x32::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a973dbecc59b1d5f5a95bda92d25e5e73"></a><!-- doxytag: member="r123array1x32::fill" ref="a973dbecc59b1d5f5a95bda92d25e5e73" args="(const value_type &val)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array1x32::fill </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array1x32.html#a9c8e0d672be32b52eef639f1a3b2b98a">value_type</a> & </td>
+          <td class="paramname"> <em>val</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a69727e5b1c14fcc2f7c9b6af4410cc16"></a><!-- doxytag: member="r123array1x32::front" ref="a69727e5b1c14fcc2f7c9b6af4410cc16" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#ae5aa4e3a65528495ea71371529ade7d7">reference</a> r123array1x32::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af94d0df621b1de0b6a3ed904c276eb84"></a><!-- doxytag: member="r123array1x32::front" ref="af94d0df621b1de0b6a3ed904c276eb84" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#adfa6614a8b20cd30c192458c8c2874da">const_reference</a> r123array1x32::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aae5fbc153a37b06ea466f2283551622f"></a><!-- doxytag: member="r123array1x32::incr" ref="aae5fbc153a37b06ea466f2283551622f" args="(uint64_t n=1)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html">r123array1x32</a>& r123array1x32::incr </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em> = <code>1</code></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9c919289274ced376086f1110c8b6384"></a><!-- doxytag: member="r123array1x32::incr_carefully" ref="a9c919289274ced376086f1110c8b6384" args="(uint64_t n)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html">r123array1x32</a>& r123array1x32::incr_carefully </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em></td>
+          <td> ) </td>
+          <td><code> [inline, protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a707c532168670ad508723d057f712928"></a><!-- doxytag: member="r123array1x32::max_size" ref="a707c532168670ad508723d057f712928" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53">size_type</a> r123array1x32::max_size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af293f370d083051f6cf24408e07feff1"></a><!-- doxytag: member="r123array1x32::operator!=" ref="af293f370d083051f6cf24408e07feff1" args="(const r123array1x32 &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array1x32::operator!= </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array1x32.html">r123array1x32</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a61140a0fb8983a3018a2b98903d14047"></a><!-- doxytag: member="r123array1x32::operator==" ref="a61140a0fb8983a3018a2b98903d14047" args="(const r123array1x32 &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array1x32::operator== </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array1x32.html">r123array1x32</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a05cf21fa6a647c73763da02d4b7e2f2a"></a><!-- doxytag: member="r123array1x32::operator[]" ref="a05cf21fa6a647c73763da02d4b7e2f2a" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#adfa6614a8b20cd30c192458c8c2874da">const_reference</a> r123array1x32::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa47bb157c60858c1b0ef69df79646a3b"></a><!-- doxytag: member="r123array1x32::operator[]" ref="aa47bb157c60858c1b0ef69df79646a3b" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#ae5aa4e3a65528495ea71371529ade7d7">reference</a> r123array1x32::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0c91373623da349c09b952f616b7f5e9"></a><!-- doxytag: member="r123array1x32::rbegin" ref="a0c91373623da349c09b952f616b7f5e9" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#a21cb520afa483ae177c469f3940e7ed2">reverse_iterator</a> r123array1x32::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aacb0604c956b8e50b057a6034c78069c"></a><!-- doxytag: member="r123array1x32::rbegin" ref="aacb0604c956b8e50b057a6034c78069c" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#a2642ed91a9c6c91ace3b91add2a4feae">const_reverse_iterator</a> r123array1x32::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aad87615e3d9d32467d2f139be5be08ce"></a><!-- doxytag: member="r123array1x32::rend" ref="aad87615e3d9d32467d2f139be5be08ce" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#a2642ed91a9c6c91ace3b91add2a4feae">const_reverse_iterator</a> r123array1x32::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7a55225361d3e9e6f037daa13d340fc4"></a><!-- doxytag: member="r123array1x32::rend" ref="a7a55225361d3e9e6f037daa13d340fc4" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#a21cb520afa483ae177c469f3940e7ed2">reverse_iterator</a> r123array1x32::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adf914fa4384acfcfa1750fd47b758f42"></a><!-- doxytag: member="r123array1x32::seed" ref="adf914fa4384acfcfa1750fd47b758f42" args="(SeedSeq &ss)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename SeedSeq > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array1x32.html">r123array1x32</a> r123array1x32::seed </td>
+          <td>(</td>
+          <td class="paramtype">SeedSeq & </td>
+          <td class="paramname"> <em>ss</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4cbaf3feeaad0bb7227d065294240561"></a><!-- doxytag: member="r123array1x32::size" ref="a4cbaf3feeaad0bb7227d065294240561" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x32.html#a30405dcf03997aaf3f981c05d1fa1e53">size_type</a> r123array1x32::size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afdd8df41333430593d31350bd12db11a"></a><!-- doxytag: member="r123array1x32::swap" ref="afdd8df41333430593d31350bd12db11a" args="(r123array1x32 &rhs)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array1x32::swap </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1x32.html">r123array1x32</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="a1123ac44ecadd52dae06d2c8df86764a"></a><!-- doxytag: member="r123array1x32::v" ref="a1123ac44ecadd52dae06d2c8df86764a" args="[1]" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">uint32_t <a class="el" href="structr123array1x32.html#a1123ac44ecadd52dae06d2c8df86764a">r123array1x32::v</a>[1]</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>Random123/<a class="el" href="array_8h_source.html">array.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array1x64-members.html b/lib/Random123-1.08/docs/html/structr123array1x64-members.html
new file mode 100644
index 0000000..eca857f
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array1x64-members.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123array1x64 Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123array1x64.html">r123array1x64</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a6575299135436acf90fcb8da262d623c">at</a>(size_type i)</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#af6cf7706792eb1e44902dd94df388726">at</a>(size_type i) const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#ab85790fdee269501a80fe31179efc9f8">back</a>()</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a2cd091b3015befa2b954ddab91271e39">back</a>() const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#af9150347761c6df32673bbd2411e67d0">begin</a>()</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a0fddc6603fe2eb4547aeb57498ffe3c2">begin</a>() const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a33d1c19a63dec48f63f7c30c758fca0c">cbegin</a>() const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#aa959a7054efa0d53f83f2d712d8d9049">cend</a>() const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a28ff01c0fefda1d81112ec9812156164">const_iterator</a> typedef</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a2b23f2aa3edf21084ece97a03367bff5">const_pointer</a> typedef</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#af75ba9dbfe38e0a6c143f446b7e4b995">const_reference</a> typedef</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a61535adf62580285c3182a713ea0f3b1">const_reverse_iterator</a> typedef</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#adac6c38fef501a997b39229f54a6459c">crbegin</a>() const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a250e375c11846dc2635c7690f283cc20">crend</a>() const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a2ecd5718a0fd863dd7a3eb724e07a540">data</a>()</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a02cd843e927803bd09f00b1a5541c72c">data</a>() const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a2abaa7dd6823b724ec6038b504c77011">difference_type</a> typedef</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#af8636ea61389dcf15e94a5da70bd6bc0">empty</a>() const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a18a5fa64dbe73dc4f9fd0b6c45fe283f">end</a>()</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a595e77ff43ac41c4937e91f6d109a46a">end</a>() const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#ac9a372e0980632a4db29bb243b672039">fill</a>(const value_type &val)</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a7d205216932e36303f62b38d233247d5">front</a>()</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a7c0a3159492b3405a8019ce52cdf2c69">front</a>() const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#ad44244e95f8937e0874dec9083071a85">incr</a>(uint64_t n=1)</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#ad848dc3e868f8195ee3eb5029698c976">incr_carefully</a>(uint64_t n)</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a486a75094513f75c268901b3bb6666ad">iterator</a> typedef</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a1b02d097ca118866b7f696b7c1c5681f">max_size</a>() const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a0969493a7aac290e5ab2a5135380bc3d">operator!=</a>(const r123array1x64 &rhs) const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a65018edc8a8596e8bdb7500926544a4a">operator==</a>(const r123array1x64 &rhs) const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a10fbaabd5223f286d6e396e15227569c">operator[]</a>(size_type i)</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#aa13b237c78d719ecfb5a59cdd557c889">operator[]</a>(size_type i) const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a1c104fabb72d6c72c51348ac72bd419f">pointer</a> typedef</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a56196452051f26a10a4bb3c3d7b75fd0">rbegin</a>()</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a5b080aafd94d77efda03730b6f853334">rbegin</a>() const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a6b196cbfb84a28a57f24cd976c6fd6e6">reference</a> typedef</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#aa0f756e941d0e417355d940fd0ed3a33">rend</a>()</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a19f9d7dd7371c20fc5001d864da453ff">rend</a>() const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#ac9c44218c6761d9e6f422435e49acb17">reverse_iterator</a> typedef</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a69be3aa9c2588ce86b5ebb72649ce684">seed</a>(SeedSeq &ss)</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a81dba857004f49f48cb0712edaa39e76">size</a>() const </td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7">size_type</a> typedef</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#ab7fb5f41ed3716bce19489deb1dd4149a0c25e6a56a2c69eb7641adb24765e6af">static_size</a> enum value</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a6f929a34461c49c9571eedc1df65fd20">swap</a>(r123array1x64 &rhs)</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a951c4b651e15e5ad4f66d81027c8e1b5">v</a></td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1x64.html#a4d8280ccd7087d5c3faba27641e8fbe7">value_type</a> typedef</td><td><a class="el" href="structr123array1x64.html">r123array1x64</a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array1x64.html b/lib/Random123-1.08/docs/html/structr123array1x64.html
new file mode 100644
index 0000000..c9a4fc1
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array1x64.html
@@ -0,0 +1,892 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123array1x64 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-methods">Static Public Member Functions</a> |
+<a href="#pub-attribs">Public Attributes</a> |
+<a href="#pro-methods">Protected Member Functions</a>  </div>
+  <div class="headertitle">
+<h1>r123array1x64 Struct Reference<br/>
+<small>
+[<a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123array1x64" -->
+<p><code>#include <<a class="el" href="array_8h_source.html">Random123/array.h</a>></code></p>
+
+<p><a href="structr123array1x64-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom">{ <a class="el" href="structr123array1x64.html#ab7fb5f41ed3716bce19489deb1dd4149a0c25e6a56a2c69eb7641adb24765e6af">static_size</a> =  1
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a4d8280ccd7087d5c3faba27641e8fbe7">value_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint64_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a486a75094513f75c268901b3bb6666ad">iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const uint64_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a28ff01c0fefda1d81112ec9812156164">const_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array1x64.html#a4d8280ccd7087d5c3faba27641e8fbe7">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a6b196cbfb84a28a57f24cd976c6fd6e6">reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const <a class="el" href="structr123array1x64.html#a4d8280ccd7087d5c3faba27641e8fbe7">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#af75ba9dbfe38e0a6c143f446b7e4b995">const_reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7">size_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a2abaa7dd6823b724ec6038b504c77011">difference_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint64_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a1c104fabb72d6c72c51348ac72bd419f">pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const uint64_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a2b23f2aa3edf21084ece97a03367bff5">const_pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123array1x64.html#a486a75094513f75c268901b3bb6666ad">iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#ac9c44218c6761d9e6f422435e49acb17">reverse_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123array1x64.html#a28ff01c0fefda1d81112ec9812156164">const_iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a61535adf62580285c3182a713ea0f3b1">const_reverse_iterator</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#a6b196cbfb84a28a57f24cd976c6fd6e6">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a10fbaabd5223f286d6e396e15227569c">operator[]</a> (<a class="el" href="structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#af75ba9dbfe38e0a6c143f446b7e4b995">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#aa13b237c78d719ecfb5a59cdd557c889">operator[]</a> (<a class="el" href="structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#a6b196cbfb84a28a57f24cd976c6fd6e6">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a6575299135436acf90fcb8da262d623c">at</a> (<a class="el" href="structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#af75ba9dbfe38e0a6c143f446b7e4b995">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#af6cf7706792eb1e44902dd94df388726">at</a> (<a class="el" href="structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a81dba857004f49f48cb0712edaa39e76">size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a1b02d097ca118866b7f696b7c1c5681f">max_size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#af8636ea61389dcf15e94a5da70bd6bc0">empty</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#a486a75094513f75c268901b3bb6666ad">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#af9150347761c6df32673bbd2411e67d0">begin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#a486a75094513f75c268901b3bb6666ad">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a18a5fa64dbe73dc4f9fd0b6c45fe283f">end</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#a28ff01c0fefda1d81112ec9812156164">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a0fddc6603fe2eb4547aeb57498ffe3c2">begin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#a28ff01c0fefda1d81112ec9812156164">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a595e77ff43ac41c4937e91f6d109a46a">end</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#a28ff01c0fefda1d81112ec9812156164">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a33d1c19a63dec48f63f7c30c758fca0c">cbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#a28ff01c0fefda1d81112ec9812156164">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#aa959a7054efa0d53f83f2d712d8d9049">cend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#ac9c44218c6761d9e6f422435e49acb17">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a56196452051f26a10a4bb3c3d7b75fd0">rbegin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#a61535adf62580285c3182a713ea0f3b1">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a5b080aafd94d77efda03730b6f853334">rbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#ac9c44218c6761d9e6f422435e49acb17">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#aa0f756e941d0e417355d940fd0ed3a33">rend</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#a61535adf62580285c3182a713ea0f3b1">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a19f9d7dd7371c20fc5001d864da453ff">rend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#a61535adf62580285c3182a713ea0f3b1">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#adac6c38fef501a997b39229f54a6459c">crbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#a61535adf62580285c3182a713ea0f3b1">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a250e375c11846dc2635c7690f283cc20">crend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#a1c104fabb72d6c72c51348ac72bd419f">pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a2ecd5718a0fd863dd7a3eb724e07a540">data</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#a2b23f2aa3edf21084ece97a03367bff5">const_pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a02cd843e927803bd09f00b1a5541c72c">data</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#a6b196cbfb84a28a57f24cd976c6fd6e6">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a7d205216932e36303f62b38d233247d5">front</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#af75ba9dbfe38e0a6c143f446b7e4b995">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a7c0a3159492b3405a8019ce52cdf2c69">front</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#a6b196cbfb84a28a57f24cd976c6fd6e6">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#ab85790fdee269501a80fe31179efc9f8">back</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html#af75ba9dbfe38e0a6c143f446b7e4b995">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a2cd091b3015befa2b954ddab91271e39">back</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a65018edc8a8596e8bdb7500926544a4a">operator==</a> (const <a class="el" href="structr123array1x64.html">r123array1x64</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a0969493a7aac290e5ab2a5135380bc3d">operator!=</a> (const <a class="el" href="structr123array1x64.html">r123array1x64</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#ac9a372e0980632a4db29bb243b672039">fill</a> (const <a class="el" href="structr123array1x64.html#a4d8280ccd7087d5c3faba27641e8fbe7">value_type</a> &val)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a6f929a34461c49c9571eedc1df65fd20">swap</a> (<a class="el" href="structr123array1x64.html">r123array1x64</a> &rhs)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html">r123array1x64</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#ad44244e95f8937e0874dec9083071a85">incr</a> (uint64_t n=1)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr><td class="memTemplParams" colspan="2">template<typename SeedSeq > </td></tr>
+<tr><td class="memTemplItemLeft" align="right" valign="top">static <a class="el" href="structr123array1x64.html">r123array1x64</a> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a69be3aa9c2588ce86b5ebb72649ce684">seed</a> (SeedSeq &ss)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#a951c4b651e15e5ad4f66d81027c8e1b5">v</a> [1]</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1x64.html">r123array1x64</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1x64.html#ad848dc3e868f8195ee3eb5029698c976">incr_carefully</a> (uint64_t n)</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a> </dd></dl>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="a28ff01c0fefda1d81112ec9812156164"></a><!-- doxytag: member="r123array1x64::const_iterator" ref="a28ff01c0fefda1d81112ec9812156164" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const uint64_t* <a class="el" href="structr123array1x64.html#a28ff01c0fefda1d81112ec9812156164">r123array1x64::const_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2b23f2aa3edf21084ece97a03367bff5"></a><!-- doxytag: member="r123array1x64::const_pointer" ref="a2b23f2aa3edf21084ece97a03367bff5" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const uint64_t* <a class="el" href="structr123array1x64.html#a2b23f2aa3edf21084ece97a03367bff5">r123array1x64::const_pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af75ba9dbfe38e0a6c143f446b7e4b995"></a><!-- doxytag: member="r123array1x64::const_reference" ref="af75ba9dbfe38e0a6c143f446b7e4b995" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const <a class="el" href="structr123array1x64.html#a4d8280ccd7087d5c3faba27641e8fbe7">value_type</a>& <a class="el" href="structr123array1x64.html#af75ba9dbfe38e0a6c143f446b7e4b995">r123array1x64::const_reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a61535adf62580285c3182a713ea0f3b1"></a><!-- doxytag: member="r123array1x64::const_reverse_iterator" ref="a61535adf62580285c3182a713ea0f3b1" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123array1x64.html#a28ff01c0fefda1d81112ec9812156164">const_iterator</a>> <a class="el" href="structr123array1x64.html#a61535adf62580285c3182a713ea0f3b1">r123array1x64::const_reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2abaa7dd6823b724ec6038b504c77011"></a><!-- doxytag: member="r123array1x64::difference_type" ref="a2abaa7dd6823b724ec6038b504c77011" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef ptrdiff_t <a class="el" href="structr123array1x64.html#a2abaa7dd6823b724ec6038b504c77011">r123array1x64::difference_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a486a75094513f75c268901b3bb6666ad"></a><!-- doxytag: member="r123array1x64::iterator" ref="a486a75094513f75c268901b3bb6666ad" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint64_t* <a class="el" href="structr123array1x64.html#a486a75094513f75c268901b3bb6666ad">r123array1x64::iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1c104fabb72d6c72c51348ac72bd419f"></a><!-- doxytag: member="r123array1x64::pointer" ref="a1c104fabb72d6c72c51348ac72bd419f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint64_t* <a class="el" href="structr123array1x64.html#a1c104fabb72d6c72c51348ac72bd419f">r123array1x64::pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6b196cbfb84a28a57f24cd976c6fd6e6"></a><!-- doxytag: member="r123array1x64::reference" ref="a6b196cbfb84a28a57f24cd976c6fd6e6" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array1x64.html#a4d8280ccd7087d5c3faba27641e8fbe7">value_type</a>& <a class="el" href="structr123array1x64.html#a6b196cbfb84a28a57f24cd976c6fd6e6">r123array1x64::reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac9c44218c6761d9e6f422435e49acb17"></a><!-- doxytag: member="r123array1x64::reverse_iterator" ref="ac9c44218c6761d9e6f422435e49acb17" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123array1x64.html#a486a75094513f75c268901b3bb6666ad">iterator</a>> <a class="el" href="structr123array1x64.html#ac9c44218c6761d9e6f422435e49acb17">r123array1x64::reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa37d85a97cfe1f3f63b1ef1c33497cb7"></a><!-- doxytag: member="r123array1x64::size_type" ref="aa37d85a97cfe1f3f63b1ef1c33497cb7" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef size_t <a class="el" href="structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7">r123array1x64::size_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4d8280ccd7087d5c3faba27641e8fbe7"></a><!-- doxytag: member="r123array1x64::value_type" ref="a4d8280ccd7087d5c3faba27641e8fbe7" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint64_t <a class="el" href="structr123array1x64.html#a4d8280ccd7087d5c3faba27641e8fbe7">r123array1x64::value_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Enumeration Documentation</h2>
+<a class="anchor" id="ab7fb5f41ed3716bce19489deb1dd4149"></a><!-- doxytag: member="r123array1x64::@4" ref="ab7fb5f41ed3716bce19489deb1dd4149" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">anonymous enum</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="ab7fb5f41ed3716bce19489deb1dd4149a0c25e6a56a2c69eb7641adb24765e6af"></a><!-- doxytag: member="static_size" ref="ab7fb5f41ed3716bce19489deb1dd4149a0c25e6a56a2c69eb7641adb24765e6af" args="" -->static_size</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a6575299135436acf90fcb8da262d623c"></a><!-- doxytag: member="r123array1x64::at" ref="a6575299135436acf90fcb8da262d623c" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#a6b196cbfb84a28a57f24cd976c6fd6e6">reference</a> r123array1x64::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af6cf7706792eb1e44902dd94df388726"></a><!-- doxytag: member="r123array1x64::at" ref="af6cf7706792eb1e44902dd94df388726" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#af75ba9dbfe38e0a6c143f446b7e4b995">const_reference</a> r123array1x64::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab85790fdee269501a80fe31179efc9f8"></a><!-- doxytag: member="r123array1x64::back" ref="ab85790fdee269501a80fe31179efc9f8" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#a6b196cbfb84a28a57f24cd976c6fd6e6">reference</a> r123array1x64::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2cd091b3015befa2b954ddab91271e39"></a><!-- doxytag: member="r123array1x64::back" ref="a2cd091b3015befa2b954ddab91271e39" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#af75ba9dbfe38e0a6c143f446b7e4b995">const_reference</a> r123array1x64::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af9150347761c6df32673bbd2411e67d0"></a><!-- doxytag: member="r123array1x64::begin" ref="af9150347761c6df32673bbd2411e67d0" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#a486a75094513f75c268901b3bb6666ad">iterator</a> r123array1x64::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0fddc6603fe2eb4547aeb57498ffe3c2"></a><!-- doxytag: member="r123array1x64::begin" ref="a0fddc6603fe2eb4547aeb57498ffe3c2" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#a28ff01c0fefda1d81112ec9812156164">const_iterator</a> r123array1x64::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a33d1c19a63dec48f63f7c30c758fca0c"></a><!-- doxytag: member="r123array1x64::cbegin" ref="a33d1c19a63dec48f63f7c30c758fca0c" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#a28ff01c0fefda1d81112ec9812156164">const_iterator</a> r123array1x64::cbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa959a7054efa0d53f83f2d712d8d9049"></a><!-- doxytag: member="r123array1x64::cend" ref="aa959a7054efa0d53f83f2d712d8d9049" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#a28ff01c0fefda1d81112ec9812156164">const_iterator</a> r123array1x64::cend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adac6c38fef501a997b39229f54a6459c"></a><!-- doxytag: member="r123array1x64::crbegin" ref="adac6c38fef501a997b39229f54a6459c" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#a61535adf62580285c3182a713ea0f3b1">const_reverse_iterator</a> r123array1x64::crbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a250e375c11846dc2635c7690f283cc20"></a><!-- doxytag: member="r123array1x64::crend" ref="a250e375c11846dc2635c7690f283cc20" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#a61535adf62580285c3182a713ea0f3b1">const_reverse_iterator</a> r123array1x64::crend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2ecd5718a0fd863dd7a3eb724e07a540"></a><!-- doxytag: member="r123array1x64::data" ref="a2ecd5718a0fd863dd7a3eb724e07a540" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#a1c104fabb72d6c72c51348ac72bd419f">pointer</a> r123array1x64::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a02cd843e927803bd09f00b1a5541c72c"></a><!-- doxytag: member="r123array1x64::data" ref="a02cd843e927803bd09f00b1a5541c72c" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#a2b23f2aa3edf21084ece97a03367bff5">const_pointer</a> r123array1x64::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af8636ea61389dcf15e94a5da70bd6bc0"></a><!-- doxytag: member="r123array1x64::empty" ref="af8636ea61389dcf15e94a5da70bd6bc0" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array1x64::empty </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a18a5fa64dbe73dc4f9fd0b6c45fe283f"></a><!-- doxytag: member="r123array1x64::end" ref="a18a5fa64dbe73dc4f9fd0b6c45fe283f" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#a486a75094513f75c268901b3bb6666ad">iterator</a> r123array1x64::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a595e77ff43ac41c4937e91f6d109a46a"></a><!-- doxytag: member="r123array1x64::end" ref="a595e77ff43ac41c4937e91f6d109a46a" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#a28ff01c0fefda1d81112ec9812156164">const_iterator</a> r123array1x64::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac9a372e0980632a4db29bb243b672039"></a><!-- doxytag: member="r123array1x64::fill" ref="ac9a372e0980632a4db29bb243b672039" args="(const value_type &val)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array1x64::fill </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array1x64.html#a4d8280ccd7087d5c3faba27641e8fbe7">value_type</a> & </td>
+          <td class="paramname"> <em>val</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7d205216932e36303f62b38d233247d5"></a><!-- doxytag: member="r123array1x64::front" ref="a7d205216932e36303f62b38d233247d5" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#a6b196cbfb84a28a57f24cd976c6fd6e6">reference</a> r123array1x64::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7c0a3159492b3405a8019ce52cdf2c69"></a><!-- doxytag: member="r123array1x64::front" ref="a7c0a3159492b3405a8019ce52cdf2c69" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#af75ba9dbfe38e0a6c143f446b7e4b995">const_reference</a> r123array1x64::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad44244e95f8937e0874dec9083071a85"></a><!-- doxytag: member="r123array1x64::incr" ref="ad44244e95f8937e0874dec9083071a85" args="(uint64_t n=1)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html">r123array1x64</a>& r123array1x64::incr </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em> = <code>1</code></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad848dc3e868f8195ee3eb5029698c976"></a><!-- doxytag: member="r123array1x64::incr_carefully" ref="ad848dc3e868f8195ee3eb5029698c976" args="(uint64_t n)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html">r123array1x64</a>& r123array1x64::incr_carefully </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em></td>
+          <td> ) </td>
+          <td><code> [inline, protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1b02d097ca118866b7f696b7c1c5681f"></a><!-- doxytag: member="r123array1x64::max_size" ref="a1b02d097ca118866b7f696b7c1c5681f" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7">size_type</a> r123array1x64::max_size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0969493a7aac290e5ab2a5135380bc3d"></a><!-- doxytag: member="r123array1x64::operator!=" ref="a0969493a7aac290e5ab2a5135380bc3d" args="(const r123array1x64 &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array1x64::operator!= </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array1x64.html">r123array1x64</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a65018edc8a8596e8bdb7500926544a4a"></a><!-- doxytag: member="r123array1x64::operator==" ref="a65018edc8a8596e8bdb7500926544a4a" args="(const r123array1x64 &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array1x64::operator== </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array1x64.html">r123array1x64</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa13b237c78d719ecfb5a59cdd557c889"></a><!-- doxytag: member="r123array1x64::operator[]" ref="aa13b237c78d719ecfb5a59cdd557c889" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#af75ba9dbfe38e0a6c143f446b7e4b995">const_reference</a> r123array1x64::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a10fbaabd5223f286d6e396e15227569c"></a><!-- doxytag: member="r123array1x64::operator[]" ref="a10fbaabd5223f286d6e396e15227569c" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#a6b196cbfb84a28a57f24cd976c6fd6e6">reference</a> r123array1x64::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a56196452051f26a10a4bb3c3d7b75fd0"></a><!-- doxytag: member="r123array1x64::rbegin" ref="a56196452051f26a10a4bb3c3d7b75fd0" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#ac9c44218c6761d9e6f422435e49acb17">reverse_iterator</a> r123array1x64::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5b080aafd94d77efda03730b6f853334"></a><!-- doxytag: member="r123array1x64::rbegin" ref="a5b080aafd94d77efda03730b6f853334" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#a61535adf62580285c3182a713ea0f3b1">const_reverse_iterator</a> r123array1x64::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a19f9d7dd7371c20fc5001d864da453ff"></a><!-- doxytag: member="r123array1x64::rend" ref="a19f9d7dd7371c20fc5001d864da453ff" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#a61535adf62580285c3182a713ea0f3b1">const_reverse_iterator</a> r123array1x64::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa0f756e941d0e417355d940fd0ed3a33"></a><!-- doxytag: member="r123array1x64::rend" ref="aa0f756e941d0e417355d940fd0ed3a33" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#ac9c44218c6761d9e6f422435e49acb17">reverse_iterator</a> r123array1x64::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a69be3aa9c2588ce86b5ebb72649ce684"></a><!-- doxytag: member="r123array1x64::seed" ref="a69be3aa9c2588ce86b5ebb72649ce684" args="(SeedSeq &ss)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename SeedSeq > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array1x64.html">r123array1x64</a> r123array1x64::seed </td>
+          <td>(</td>
+          <td class="paramtype">SeedSeq & </td>
+          <td class="paramname"> <em>ss</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a81dba857004f49f48cb0712edaa39e76"></a><!-- doxytag: member="r123array1x64::size" ref="a81dba857004f49f48cb0712edaa39e76" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1x64.html#aa37d85a97cfe1f3f63b1ef1c33497cb7">size_type</a> r123array1x64::size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6f929a34461c49c9571eedc1df65fd20"></a><!-- doxytag: member="r123array1x64::swap" ref="a6f929a34461c49c9571eedc1df65fd20" args="(r123array1x64 &rhs)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array1x64::swap </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1x64.html">r123array1x64</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="a951c4b651e15e5ad4f66d81027c8e1b5"></a><!-- doxytag: member="r123array1x64::v" ref="a951c4b651e15e5ad4f66d81027c8e1b5" args="[1]" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">uint64_t <a class="el" href="structr123array1x64.html#a951c4b651e15e5ad4f66d81027c8e1b5">r123array1x64::v</a>[1]</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>Random123/<a class="el" href="array_8h_source.html">array.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array1xm128i-members.html b/lib/Random123-1.08/docs/html/structr123array1xm128i-members.html
new file mode 100644
index 0000000..a2635c8
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array1xm128i-members.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123array1xm128i Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a5e8a81ee3f7c3b022554c0023a686700">at</a>(size_type i)</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a53ad470978c3105c97f502959d31ffa0">at</a>(size_type i) const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a082b7b75374d69149ee03d1d228e2508">back</a>()</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a458be25b18c6e59d5c72e2c4d4ea6354">back</a>() const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a275c9837db101efb234c36cff3e7562f">begin</a>()</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#ae9102a4387a7b2013f5098c6c7c14e74">begin</a>() const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a335bab18a8bc904e34de0b3d9d1ce596">cbegin</a>() const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#aa05003cae74984b777610702d27d66d2">cend</a>() const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#af6be8b009459737fa25d9d2ac7c4e6aa">const_iterator</a> typedef</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#acc3f6ecf7e6a6bc98c3681c80120ed61">const_pointer</a> typedef</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a84d0123f4376cb6ab77cf817a0cea9cb">const_reference</a> typedef</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a6bf98ce6373b157b87c6fd4a7006ed68">const_reverse_iterator</a> typedef</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a673c6cd3131269febe9a985dc76a2e08">crbegin</a>() const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#aad72d00c81c8f6b9e8fb6b6be98056c6">crend</a>() const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#acb25bc645e95f975ca6cbcb692add4b4">data</a>()</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#ac66f2efebe9e32433b25f96ea3cf34fe">data</a>() const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a319811ed6105c3050135d8ec3ba36f7a">difference_type</a> typedef</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#aa3e59f1626f2cadab5bc66e415ff0c72">empty</a>() const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a7383241079a4eae9fee0e184261174fd">end</a>()</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#ae8ddb01064f8cdfbb7314d2f1fbd0dfd">end</a>() const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a7eba15dc035724245f70b4a3a98c6a52">fill</a>(const value_type &val)</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a7efd9b7ccf35c3730fbdafb147e11660">front</a>()</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a0b5a33169ae87744ab353bfa7dc8f710">front</a>() const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a62ee236dafcbfb81ef43d7aa82a66b47">incr</a>(uint64_t n=1)</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#ab35cfd8e9221c294ab7546855373a38c">incr_carefully</a>(uint64_t n)</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#af9db87a7c1ae4c7ba1e355af89b4d22d">iterator</a> typedef</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a04e2b8952459b7aeabc011532fe3f8fa">max_size</a>() const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a60cf5b0e8283c20c386a7935f9ae0a60">operator!=</a>(const r123array1xm128i &rhs) const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#aa459abf9fe8d15019860de5b3b0cddf8">operator==</a>(const r123array1xm128i &rhs) const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#aba0d6532c59c3c879bcfbad16cab5748">operator[]</a>(size_type i)</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#aaa3ccbe6c0838b5bdafcd0dfa3c2c074">operator[]</a>(size_type i) const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a4f78260ba2ec595bdc56fc21fd45e45a">pointer</a> typedef</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a78034de911e765ed64162c894fe2ce05">rbegin</a>()</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#acd4e73f214be1dfaae5d2e20559083eb">rbegin</a>() const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a34f0cbdac5eb89118ecf2ab5939fbf83">reference</a> typedef</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#aeb47d483223e3e29f6ad156e5c356a20">rend</a>()</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a1599d2154e1f407bef2d556c985b0c21">rend</a>() const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a6a507944eb872540e73e7a839cbc8e30">reverse_iterator</a> typedef</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a6645aeddeb992559150089c49ac335c8">seed</a>(SeedSeq &ss)</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a3f272a3884d1d5ca7a207fb31a270617">size</a>() const </td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c">size_type</a> typedef</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a130e9722020433db562761a8e51bed2ca32ec6b84a0fa2dd836b04e0ffa69b2bc">static_size</a> enum value</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a05f536079732d192e572bcf395ab6b4e">swap</a>(r123array1xm128i &rhs)</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a></td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array1xm128i.html#a70ab4e530c7cce9481e07aa0b21dd96b">value_type</a> typedef</td><td><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array1xm128i.html b/lib/Random123-1.08/docs/html/structr123array1xm128i.html
new file mode 100644
index 0000000..800fd03
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array1xm128i.html
@@ -0,0 +1,892 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123array1xm128i Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-methods">Static Public Member Functions</a> |
+<a href="#pub-attribs">Public Attributes</a> |
+<a href="#pro-methods">Protected Member Functions</a>  </div>
+  <div class="headertitle">
+<h1>r123array1xm128i Struct Reference<br/>
+<small>
+[<a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123array1xm128i" -->
+<p><code>#include <<a class="el" href="array_8h_source.html">Random123/array.h</a>></code></p>
+
+<p><a href="structr123array1xm128i-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom">{ <a class="el" href="structr123array1xm128i.html#a130e9722020433db562761a8e51bed2ca32ec6b84a0fa2dd836b04e0ffa69b2bc">static_size</a> =  1
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123m128i.html">r123m128i</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a70ab4e530c7cce9481e07aa0b21dd96b">value_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123m128i.html">r123m128i</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#af9db87a7c1ae4c7ba1e355af89b4d22d">iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const <a class="el" href="structr123m128i.html">r123m128i</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#af6be8b009459737fa25d9d2ac7c4e6aa">const_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123m128i.html">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a34f0cbdac5eb89118ecf2ab5939fbf83">reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const <a class="el" href="structr123m128i.html">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a84d0123f4376cb6ab77cf817a0cea9cb">const_reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c">size_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a319811ed6105c3050135d8ec3ba36f7a">difference_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123m128i.html">r123m128i</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a4f78260ba2ec595bdc56fc21fd45e45a">pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const <a class="el" href="structr123m128i.html">r123m128i</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#acc3f6ecf7e6a6bc98c3681c80120ed61">const_pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123m128i.html">iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a6a507944eb872540e73e7a839cbc8e30">reverse_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123m128i.html">const_iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a6bf98ce6373b157b87c6fd4a7006ed68">const_reverse_iterator</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#aba0d6532c59c3c879bcfbad16cab5748">operator[]</a> (<a class="el" href="structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#aaa3ccbe6c0838b5bdafcd0dfa3c2c074">operator[]</a> (<a class="el" href="structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a5e8a81ee3f7c3b022554c0023a686700">at</a> (<a class="el" href="structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a53ad470978c3105c97f502959d31ffa0">at</a> (<a class="el" href="structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a3f272a3884d1d5ca7a207fb31a270617">size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a04e2b8952459b7aeabc011532fe3f8fa">max_size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#aa3e59f1626f2cadab5bc66e415ff0c72">empty</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a275c9837db101efb234c36cff3e7562f">begin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a7383241079a4eae9fee0e184261174fd">end</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#ae9102a4387a7b2013f5098c6c7c14e74">begin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#ae8ddb01064f8cdfbb7314d2f1fbd0dfd">end</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a335bab18a8bc904e34de0b3d9d1ce596">cbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#aa05003cae74984b777610702d27d66d2">cend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1xm128i.html#a6a507944eb872540e73e7a839cbc8e30">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a78034de911e765ed64162c894fe2ce05">rbegin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1xm128i.html#a6bf98ce6373b157b87c6fd4a7006ed68">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#acd4e73f214be1dfaae5d2e20559083eb">rbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1xm128i.html#a6a507944eb872540e73e7a839cbc8e30">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#aeb47d483223e3e29f6ad156e5c356a20">rend</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1xm128i.html#a6bf98ce6373b157b87c6fd4a7006ed68">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a1599d2154e1f407bef2d556c985b0c21">rend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1xm128i.html#a6bf98ce6373b157b87c6fd4a7006ed68">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a673c6cd3131269febe9a985dc76a2e08">crbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1xm128i.html#a6bf98ce6373b157b87c6fd4a7006ed68">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#aad72d00c81c8f6b9e8fb6b6be98056c6">crend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#acb25bc645e95f975ca6cbcb692add4b4">data</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">const_pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#ac66f2efebe9e32433b25f96ea3cf34fe">data</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a7efd9b7ccf35c3730fbdafb147e11660">front</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a0b5a33169ae87744ab353bfa7dc8f710">front</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a082b7b75374d69149ee03d1d228e2508">back</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a458be25b18c6e59d5c72e2c4d4ea6354">back</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#aa459abf9fe8d15019860de5b3b0cddf8">operator==</a> (const <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a60cf5b0e8283c20c386a7935f9ae0a60">operator!=</a> (const <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a7eba15dc035724245f70b4a3a98c6a52">fill</a> (const <a class="el" href="structr123m128i.html">value_type</a> &val)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a05f536079732d192e572bcf395ab6b4e">swap</a> (<a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> &rhs)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a62ee236dafcbfb81ef43d7aa82a66b47">incr</a> (uint64_t n=1)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr><td class="memTemplParams" colspan="2">template<typename SeedSeq > </td></tr>
+<tr><td class="memTemplItemLeft" align="right" valign="top">static <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#a6645aeddeb992559150089c49ac335c8">seed</a> (SeedSeq &ss)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">r123m128i</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">v</a> [1]</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array1xm128i.html#ab35cfd8e9221c294ab7546855373a38c">incr_carefully</a> (uint64_t n)</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a> </dd></dl>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="af6be8b009459737fa25d9d2ac7c4e6aa"></a><!-- doxytag: member="r123array1xm128i::const_iterator" ref="af6be8b009459737fa25d9d2ac7c4e6aa" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const <a class="el" href="structr123m128i.html">r123m128i</a>* <a class="el" href="structr123m128i.html">r123array1xm128i::const_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acc3f6ecf7e6a6bc98c3681c80120ed61"></a><!-- doxytag: member="r123array1xm128i::const_pointer" ref="acc3f6ecf7e6a6bc98c3681c80120ed61" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const <a class="el" href="structr123m128i.html">r123m128i</a>* <a class="el" href="structr123m128i.html">r123array1xm128i::const_pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a84d0123f4376cb6ab77cf817a0cea9cb"></a><!-- doxytag: member="r123array1xm128i::const_reference" ref="a84d0123f4376cb6ab77cf817a0cea9cb" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const <a class="el" href="structr123m128i.html">value_type</a>& <a class="el" href="structr123m128i.html">r123array1xm128i::const_reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6bf98ce6373b157b87c6fd4a7006ed68"></a><!-- doxytag: member="r123array1xm128i::const_reverse_iterator" ref="a6bf98ce6373b157b87c6fd4a7006ed68" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123m128i.html">const_iterator</a>> <a class="el" href="structr123array1xm128i.html#a6bf98ce6373b157b87c6fd4a7006ed68">r123array1xm128i::const_reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a319811ed6105c3050135d8ec3ba36f7a"></a><!-- doxytag: member="r123array1xm128i::difference_type" ref="a319811ed6105c3050135d8ec3ba36f7a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef ptrdiff_t <a class="el" href="structr123array1xm128i.html#a319811ed6105c3050135d8ec3ba36f7a">r123array1xm128i::difference_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af9db87a7c1ae4c7ba1e355af89b4d22d"></a><!-- doxytag: member="r123array1xm128i::iterator" ref="af9db87a7c1ae4c7ba1e355af89b4d22d" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123m128i.html">r123m128i</a>* <a class="el" href="structr123m128i.html">r123array1xm128i::iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4f78260ba2ec595bdc56fc21fd45e45a"></a><!-- doxytag: member="r123array1xm128i::pointer" ref="a4f78260ba2ec595bdc56fc21fd45e45a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123m128i.html">r123m128i</a>* <a class="el" href="structr123m128i.html">r123array1xm128i::pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a34f0cbdac5eb89118ecf2ab5939fbf83"></a><!-- doxytag: member="r123array1xm128i::reference" ref="a34f0cbdac5eb89118ecf2ab5939fbf83" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123m128i.html">value_type</a>& <a class="el" href="structr123m128i.html">r123array1xm128i::reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6a507944eb872540e73e7a839cbc8e30"></a><!-- doxytag: member="r123array1xm128i::reverse_iterator" ref="a6a507944eb872540e73e7a839cbc8e30" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123m128i.html">iterator</a>> <a class="el" href="structr123array1xm128i.html#a6a507944eb872540e73e7a839cbc8e30">r123array1xm128i::reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a702efcd8e34016d657ed6141bc767e6c"></a><!-- doxytag: member="r123array1xm128i::size_type" ref="a702efcd8e34016d657ed6141bc767e6c" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef size_t <a class="el" href="structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c">r123array1xm128i::size_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a70ab4e530c7cce9481e07aa0b21dd96b"></a><!-- doxytag: member="r123array1xm128i::value_type" ref="a70ab4e530c7cce9481e07aa0b21dd96b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123m128i.html">r123m128i</a> <a class="el" href="structr123m128i.html">r123array1xm128i::value_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Enumeration Documentation</h2>
+<a class="anchor" id="a130e9722020433db562761a8e51bed2c"></a><!-- doxytag: member="r123array1xm128i::@8" ref="a130e9722020433db562761a8e51bed2c" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">anonymous enum</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="a130e9722020433db562761a8e51bed2ca32ec6b84a0fa2dd836b04e0ffa69b2bc"></a><!-- doxytag: member="static_size" ref="a130e9722020433db562761a8e51bed2ca32ec6b84a0fa2dd836b04e0ffa69b2bc" args="" -->static_size</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a5e8a81ee3f7c3b022554c0023a686700"></a><!-- doxytag: member="r123array1xm128i::at" ref="a5e8a81ee3f7c3b022554c0023a686700" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">reference</a> r123array1xm128i::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a53ad470978c3105c97f502959d31ffa0"></a><!-- doxytag: member="r123array1xm128i::at" ref="a53ad470978c3105c97f502959d31ffa0" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">const_reference</a> r123array1xm128i::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a082b7b75374d69149ee03d1d228e2508"></a><!-- doxytag: member="r123array1xm128i::back" ref="a082b7b75374d69149ee03d1d228e2508" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">reference</a> r123array1xm128i::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a458be25b18c6e59d5c72e2c4d4ea6354"></a><!-- doxytag: member="r123array1xm128i::back" ref="a458be25b18c6e59d5c72e2c4d4ea6354" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">const_reference</a> r123array1xm128i::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a275c9837db101efb234c36cff3e7562f"></a><!-- doxytag: member="r123array1xm128i::begin" ref="a275c9837db101efb234c36cff3e7562f" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">iterator</a> r123array1xm128i::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae9102a4387a7b2013f5098c6c7c14e74"></a><!-- doxytag: member="r123array1xm128i::begin" ref="ae9102a4387a7b2013f5098c6c7c14e74" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">const_iterator</a> r123array1xm128i::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a335bab18a8bc904e34de0b3d9d1ce596"></a><!-- doxytag: member="r123array1xm128i::cbegin" ref="a335bab18a8bc904e34de0b3d9d1ce596" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">const_iterator</a> r123array1xm128i::cbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa05003cae74984b777610702d27d66d2"></a><!-- doxytag: member="r123array1xm128i::cend" ref="aa05003cae74984b777610702d27d66d2" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">const_iterator</a> r123array1xm128i::cend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a673c6cd3131269febe9a985dc76a2e08"></a><!-- doxytag: member="r123array1xm128i::crbegin" ref="a673c6cd3131269febe9a985dc76a2e08" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1xm128i.html#a6bf98ce6373b157b87c6fd4a7006ed68">const_reverse_iterator</a> r123array1xm128i::crbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aad72d00c81c8f6b9e8fb6b6be98056c6"></a><!-- doxytag: member="r123array1xm128i::crend" ref="aad72d00c81c8f6b9e8fb6b6be98056c6" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1xm128i.html#a6bf98ce6373b157b87c6fd4a7006ed68">const_reverse_iterator</a> r123array1xm128i::crend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acb25bc645e95f975ca6cbcb692add4b4"></a><!-- doxytag: member="r123array1xm128i::data" ref="acb25bc645e95f975ca6cbcb692add4b4" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">pointer</a> r123array1xm128i::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac66f2efebe9e32433b25f96ea3cf34fe"></a><!-- doxytag: member="r123array1xm128i::data" ref="ac66f2efebe9e32433b25f96ea3cf34fe" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">const_pointer</a> r123array1xm128i::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa3e59f1626f2cadab5bc66e415ff0c72"></a><!-- doxytag: member="r123array1xm128i::empty" ref="aa3e59f1626f2cadab5bc66e415ff0c72" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array1xm128i::empty </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7383241079a4eae9fee0e184261174fd"></a><!-- doxytag: member="r123array1xm128i::end" ref="a7383241079a4eae9fee0e184261174fd" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">iterator</a> r123array1xm128i::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae8ddb01064f8cdfbb7314d2f1fbd0dfd"></a><!-- doxytag: member="r123array1xm128i::end" ref="ae8ddb01064f8cdfbb7314d2f1fbd0dfd" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">const_iterator</a> r123array1xm128i::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7eba15dc035724245f70b4a3a98c6a52"></a><!-- doxytag: member="r123array1xm128i::fill" ref="a7eba15dc035724245f70b4a3a98c6a52" args="(const value_type &val)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array1xm128i::fill </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123m128i.html">value_type</a> & </td>
+          <td class="paramname"> <em>val</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7efd9b7ccf35c3730fbdafb147e11660"></a><!-- doxytag: member="r123array1xm128i::front" ref="a7efd9b7ccf35c3730fbdafb147e11660" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">reference</a> r123array1xm128i::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0b5a33169ae87744ab353bfa7dc8f710"></a><!-- doxytag: member="r123array1xm128i::front" ref="a0b5a33169ae87744ab353bfa7dc8f710" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">const_reference</a> r123array1xm128i::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a62ee236dafcbfb81ef43d7aa82a66b47"></a><!-- doxytag: member="r123array1xm128i::incr" ref="a62ee236dafcbfb81ef43d7aa82a66b47" args="(uint64_t n=1)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a>& r123array1xm128i::incr </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em> = <code>1</code></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab35cfd8e9221c294ab7546855373a38c"></a><!-- doxytag: member="r123array1xm128i::incr_carefully" ref="ab35cfd8e9221c294ab7546855373a38c" args="(uint64_t n)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a>& r123array1xm128i::incr_carefully </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em></td>
+          <td> ) </td>
+          <td><code> [inline, protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a04e2b8952459b7aeabc011532fe3f8fa"></a><!-- doxytag: member="r123array1xm128i::max_size" ref="a04e2b8952459b7aeabc011532fe3f8fa" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c">size_type</a> r123array1xm128i::max_size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a60cf5b0e8283c20c386a7935f9ae0a60"></a><!-- doxytag: member="r123array1xm128i::operator!=" ref="a60cf5b0e8283c20c386a7935f9ae0a60" args="(const r123array1xm128i &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array1xm128i::operator!= </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa459abf9fe8d15019860de5b3b0cddf8"></a><!-- doxytag: member="r123array1xm128i::operator==" ref="aa459abf9fe8d15019860de5b3b0cddf8" args="(const r123array1xm128i &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array1xm128i::operator== </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aaa3ccbe6c0838b5bdafcd0dfa3c2c074"></a><!-- doxytag: member="r123array1xm128i::operator[]" ref="aaa3ccbe6c0838b5bdafcd0dfa3c2c074" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">const_reference</a> r123array1xm128i::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aba0d6532c59c3c879bcfbad16cab5748"></a><!-- doxytag: member="r123array1xm128i::operator[]" ref="aba0d6532c59c3c879bcfbad16cab5748" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">reference</a> r123array1xm128i::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a78034de911e765ed64162c894fe2ce05"></a><!-- doxytag: member="r123array1xm128i::rbegin" ref="a78034de911e765ed64162c894fe2ce05" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1xm128i.html#a6a507944eb872540e73e7a839cbc8e30">reverse_iterator</a> r123array1xm128i::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acd4e73f214be1dfaae5d2e20559083eb"></a><!-- doxytag: member="r123array1xm128i::rbegin" ref="acd4e73f214be1dfaae5d2e20559083eb" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1xm128i.html#a6bf98ce6373b157b87c6fd4a7006ed68">const_reverse_iterator</a> r123array1xm128i::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1599d2154e1f407bef2d556c985b0c21"></a><!-- doxytag: member="r123array1xm128i::rend" ref="a1599d2154e1f407bef2d556c985b0c21" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1xm128i.html#a6bf98ce6373b157b87c6fd4a7006ed68">const_reverse_iterator</a> r123array1xm128i::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aeb47d483223e3e29f6ad156e5c356a20"></a><!-- doxytag: member="r123array1xm128i::rend" ref="aeb47d483223e3e29f6ad156e5c356a20" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1xm128i.html#a6a507944eb872540e73e7a839cbc8e30">reverse_iterator</a> r123array1xm128i::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6645aeddeb992559150089c49ac335c8"></a><!-- doxytag: member="r123array1xm128i::seed" ref="a6645aeddeb992559150089c49ac335c8" args="(SeedSeq &ss)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename SeedSeq > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> r123array1xm128i::seed </td>
+          <td>(</td>
+          <td class="paramtype">SeedSeq & </td>
+          <td class="paramname"> <em>ss</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3f272a3884d1d5ca7a207fb31a270617"></a><!-- doxytag: member="r123array1xm128i::size" ref="a3f272a3884d1d5ca7a207fb31a270617" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array1xm128i.html#a702efcd8e34016d657ed6141bc767e6c">size_type</a> r123array1xm128i::size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a05f536079732d192e572bcf395ab6b4e"></a><!-- doxytag: member="r123array1xm128i::swap" ref="a05f536079732d192e572bcf395ab6b4e" args="(r123array1xm128i &rhs)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array1xm128i::swap </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array1xm128i.html">r123array1xm128i</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="ab6d5e4b23c04e12c1aad7aaf38ff2bd5"></a><!-- doxytag: member="r123array1xm128i::v" ref="ab6d5e4b23c04e12c1aad7aaf38ff2bd5" args="[1]" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">r123m128i</a> <a class="el" href="structr123array1xm128i.html#ab6d5e4b23c04e12c1aad7aaf38ff2bd5">r123array1xm128i::v</a>[1]</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>Random123/<a class="el" href="array_8h_source.html">array.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array2x32-members.html b/lib/Random123-1.08/docs/html/structr123array2x32-members.html
new file mode 100644
index 0000000..591921e
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array2x32-members.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123array2x32 Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123array2x32.html">r123array2x32</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#aa29e0ae21be47bda2ac83e6c945b5719">at</a>(size_type i)</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#ae985b8811e4e8849d5f28dae76231dca">at</a>(size_type i) const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a3da7214b9946a3c8653312dcfa42a288">back</a>()</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#ae176c02299531373a0fff9a5f55226e5">back</a>() const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a96730b28149000a3ea4c6b0f05e1777b">begin</a>()</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#aa52b394a0c44b755e5c0d0409dc2c4ea">begin</a>() const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a9687a1e6cdb6b6c9a1ffd8f3c7d2ce45">cbegin</a>() const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a9bb4382830c6feb49573b82bb9a18efc">cend</a>() const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a7963141a4af4c4aa74708909312a8644">const_iterator</a> typedef</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#accf098ed49f9d84cfa3831a9fe183885">const_pointer</a> typedef</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a9d71cce3d7ccea7f48da94cf023e1486">const_reference</a> typedef</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#af298f85ad6bda860232465c5abc33618">const_reverse_iterator</a> typedef</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a09b34692bd41a710bf75e19af2353afb">crbegin</a>() const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a458da2536084746b5f3face73c9f962d">crend</a>() const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a76f2b3cd04d0502121b3c7894663e178">data</a>()</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a15d5bce0ea3596ad5f7b5aa7432a33df">data</a>() const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#aa3dfe31d2483fb629a9e3ac304b24d07">difference_type</a> typedef</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#acc67c9fedcddd77fdb2727c088eaab9d">empty</a>() const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a0d98e92b198e8a314d46f9c6fd0771a7">end</a>()</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#ad64dc05d5114c74d104bca45f21992fd">end</a>() const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#af7ea9ed8a064e9cab59ee97885bb459e">fill</a>(const value_type &val)</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#ad5e3ba16c4d22c3ac0775337bef3cc70">front</a>()</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a933676c34296b74eeea8a56a3c904a2c">front</a>() const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a7b295f3a299c8cf24a75ab7f9edfe46f">incr</a>(uint64_t n=1)</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#adf128cb5c0abaaa4f119d4bcef47ead9">incr_carefully</a>(uint64_t n)</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a4b447adc28d536d9b7ad7e33d5081a8e">iterator</a> typedef</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a07345b400c5a81e6cd55689d1e38122f">max_size</a>() const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#aa0c7e561ddeb475329ea8d8178fca2a1">operator!=</a>(const r123array2x32 &rhs) const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#aa8723e5786c66137e82405a532459b2d">operator==</a>(const r123array2x32 &rhs) const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a9926f6938472682c5d31a742378f17de">operator[]</a>(size_type i)</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a0ae33a5edf89f9f12edec38209b02464">operator[]</a>(size_type i) const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#ac884bcbd1063811354bfac66262a0b42">pointer</a> typedef</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a54e96198e6cd511dc147348f274b0784">rbegin</a>()</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a00afca78e25bbb9e0b00e6ab95ecb162">rbegin</a>() const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#aacd028d9f97ec8a2f484f0eff815abd5">reference</a> typedef</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a383edbf33737eb3e5098d6da4ed326f8">rend</a>()</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#ab3f0841dcd9cea6255406b7bc6363621">rend</a>() const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#ad0b05bbfee2d432dfef71342f14b8430">reverse_iterator</a> typedef</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a31cf9b80bbcc3c976681b878b7afa046">seed</a>(SeedSeq &ss)</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#ad3d7310bd3ced1bfb05cbe4f3e753490">size</a>() const </td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91">size_type</a> typedef</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#ad6e438ec0d5a08bfb0b71a3ff96ea7e8a5ae3e9837bb88660b088443c1a6fb47a">static_size</a> enum value</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a1eac99d2198007201b9c0040a18b258c">swap</a>(r123array2x32 &rhs)</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#a65524bf06568073021117ef196d6b45f">v</a></td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x32.html#ab669df8d33d32ee3571210eb090c6cb2">value_type</a> typedef</td><td><a class="el" href="structr123array2x32.html">r123array2x32</a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array2x32.html b/lib/Random123-1.08/docs/html/structr123array2x32.html
new file mode 100644
index 0000000..dd600f4
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array2x32.html
@@ -0,0 +1,892 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123array2x32 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-methods">Static Public Member Functions</a> |
+<a href="#pub-attribs">Public Attributes</a> |
+<a href="#pro-methods">Protected Member Functions</a>  </div>
+  <div class="headertitle">
+<h1>r123array2x32 Struct Reference<br/>
+<small>
+[<a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123array2x32" -->
+<p><code>#include <<a class="el" href="array_8h_source.html">Random123/array.h</a>></code></p>
+
+<p><a href="structr123array2x32-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom">{ <a class="el" href="structr123array2x32.html#ad6e438ec0d5a08bfb0b71a3ff96ea7e8a5ae3e9837bb88660b088443c1a6fb47a">static_size</a> =  2
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#ab669df8d33d32ee3571210eb090c6cb2">value_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint32_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a4b447adc28d536d9b7ad7e33d5081a8e">iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const uint32_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a7963141a4af4c4aa74708909312a8644">const_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x32.html#ab669df8d33d32ee3571210eb090c6cb2">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#aacd028d9f97ec8a2f484f0eff815abd5">reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const <a class="el" href="structr123array2x32.html#ab669df8d33d32ee3571210eb090c6cb2">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a9d71cce3d7ccea7f48da94cf023e1486">const_reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91">size_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#aa3dfe31d2483fb629a9e3ac304b24d07">difference_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint32_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#ac884bcbd1063811354bfac66262a0b42">pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const uint32_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#accf098ed49f9d84cfa3831a9fe183885">const_pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123array2x32.html#a4b447adc28d536d9b7ad7e33d5081a8e">iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#ad0b05bbfee2d432dfef71342f14b8430">reverse_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123array2x32.html#a7963141a4af4c4aa74708909312a8644">const_iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#af298f85ad6bda860232465c5abc33618">const_reverse_iterator</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#aacd028d9f97ec8a2f484f0eff815abd5">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a9926f6938472682c5d31a742378f17de">operator[]</a> (<a class="el" href="structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#a9d71cce3d7ccea7f48da94cf023e1486">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a0ae33a5edf89f9f12edec38209b02464">operator[]</a> (<a class="el" href="structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#aacd028d9f97ec8a2f484f0eff815abd5">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#aa29e0ae21be47bda2ac83e6c945b5719">at</a> (<a class="el" href="structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#a9d71cce3d7ccea7f48da94cf023e1486">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#ae985b8811e4e8849d5f28dae76231dca">at</a> (<a class="el" href="structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#ad3d7310bd3ced1bfb05cbe4f3e753490">size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a07345b400c5a81e6cd55689d1e38122f">max_size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#acc67c9fedcddd77fdb2727c088eaab9d">empty</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#a4b447adc28d536d9b7ad7e33d5081a8e">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a96730b28149000a3ea4c6b0f05e1777b">begin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#a4b447adc28d536d9b7ad7e33d5081a8e">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a0d98e92b198e8a314d46f9c6fd0771a7">end</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#a7963141a4af4c4aa74708909312a8644">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#aa52b394a0c44b755e5c0d0409dc2c4ea">begin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#a7963141a4af4c4aa74708909312a8644">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#ad64dc05d5114c74d104bca45f21992fd">end</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#a7963141a4af4c4aa74708909312a8644">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a9687a1e6cdb6b6c9a1ffd8f3c7d2ce45">cbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#a7963141a4af4c4aa74708909312a8644">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a9bb4382830c6feb49573b82bb9a18efc">cend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#ad0b05bbfee2d432dfef71342f14b8430">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a54e96198e6cd511dc147348f274b0784">rbegin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#af298f85ad6bda860232465c5abc33618">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a00afca78e25bbb9e0b00e6ab95ecb162">rbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#ad0b05bbfee2d432dfef71342f14b8430">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a383edbf33737eb3e5098d6da4ed326f8">rend</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#af298f85ad6bda860232465c5abc33618">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#ab3f0841dcd9cea6255406b7bc6363621">rend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#af298f85ad6bda860232465c5abc33618">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a09b34692bd41a710bf75e19af2353afb">crbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#af298f85ad6bda860232465c5abc33618">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a458da2536084746b5f3face73c9f962d">crend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#ac884bcbd1063811354bfac66262a0b42">pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a76f2b3cd04d0502121b3c7894663e178">data</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#accf098ed49f9d84cfa3831a9fe183885">const_pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a15d5bce0ea3596ad5f7b5aa7432a33df">data</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#aacd028d9f97ec8a2f484f0eff815abd5">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#ad5e3ba16c4d22c3ac0775337bef3cc70">front</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#a9d71cce3d7ccea7f48da94cf023e1486">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a933676c34296b74eeea8a56a3c904a2c">front</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#aacd028d9f97ec8a2f484f0eff815abd5">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a3da7214b9946a3c8653312dcfa42a288">back</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html#a9d71cce3d7ccea7f48da94cf023e1486">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#ae176c02299531373a0fff9a5f55226e5">back</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#aa8723e5786c66137e82405a532459b2d">operator==</a> (const <a class="el" href="structr123array2x32.html">r123array2x32</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#aa0c7e561ddeb475329ea8d8178fca2a1">operator!=</a> (const <a class="el" href="structr123array2x32.html">r123array2x32</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#af7ea9ed8a064e9cab59ee97885bb459e">fill</a> (const <a class="el" href="structr123array2x32.html#ab669df8d33d32ee3571210eb090c6cb2">value_type</a> &val)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a1eac99d2198007201b9c0040a18b258c">swap</a> (<a class="el" href="structr123array2x32.html">r123array2x32</a> &rhs)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html">r123array2x32</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a7b295f3a299c8cf24a75ab7f9edfe46f">incr</a> (uint64_t n=1)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr><td class="memTemplParams" colspan="2">template<typename SeedSeq > </td></tr>
+<tr><td class="memTemplItemLeft" align="right" valign="top">static <a class="el" href="structr123array2x32.html">r123array2x32</a> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a31cf9b80bbcc3c976681b878b7afa046">seed</a> (SeedSeq &ss)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#a65524bf06568073021117ef196d6b45f">v</a> [2]</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x32.html">r123array2x32</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x32.html#adf128cb5c0abaaa4f119d4bcef47ead9">incr_carefully</a> (uint64_t n)</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a> </dd></dl>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="a7963141a4af4c4aa74708909312a8644"></a><!-- doxytag: member="r123array2x32::const_iterator" ref="a7963141a4af4c4aa74708909312a8644" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const uint32_t* <a class="el" href="structr123array2x32.html#a7963141a4af4c4aa74708909312a8644">r123array2x32::const_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="accf098ed49f9d84cfa3831a9fe183885"></a><!-- doxytag: member="r123array2x32::const_pointer" ref="accf098ed49f9d84cfa3831a9fe183885" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const uint32_t* <a class="el" href="structr123array2x32.html#accf098ed49f9d84cfa3831a9fe183885">r123array2x32::const_pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9d71cce3d7ccea7f48da94cf023e1486"></a><!-- doxytag: member="r123array2x32::const_reference" ref="a9d71cce3d7ccea7f48da94cf023e1486" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const <a class="el" href="structr123array2x32.html#ab669df8d33d32ee3571210eb090c6cb2">value_type</a>& <a class="el" href="structr123array2x32.html#a9d71cce3d7ccea7f48da94cf023e1486">r123array2x32::const_reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af298f85ad6bda860232465c5abc33618"></a><!-- doxytag: member="r123array2x32::const_reverse_iterator" ref="af298f85ad6bda860232465c5abc33618" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123array2x32.html#a7963141a4af4c4aa74708909312a8644">const_iterator</a>> <a class="el" href="structr123array2x32.html#af298f85ad6bda860232465c5abc33618">r123array2x32::const_reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa3dfe31d2483fb629a9e3ac304b24d07"></a><!-- doxytag: member="r123array2x32::difference_type" ref="aa3dfe31d2483fb629a9e3ac304b24d07" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef ptrdiff_t <a class="el" href="structr123array2x32.html#aa3dfe31d2483fb629a9e3ac304b24d07">r123array2x32::difference_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4b447adc28d536d9b7ad7e33d5081a8e"></a><!-- doxytag: member="r123array2x32::iterator" ref="a4b447adc28d536d9b7ad7e33d5081a8e" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint32_t* <a class="el" href="structr123array2x32.html#a4b447adc28d536d9b7ad7e33d5081a8e">r123array2x32::iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac884bcbd1063811354bfac66262a0b42"></a><!-- doxytag: member="r123array2x32::pointer" ref="ac884bcbd1063811354bfac66262a0b42" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint32_t* <a class="el" href="structr123array2x32.html#ac884bcbd1063811354bfac66262a0b42">r123array2x32::pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aacd028d9f97ec8a2f484f0eff815abd5"></a><!-- doxytag: member="r123array2x32::reference" ref="aacd028d9f97ec8a2f484f0eff815abd5" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array2x32.html#ab669df8d33d32ee3571210eb090c6cb2">value_type</a>& <a class="el" href="structr123array2x32.html#aacd028d9f97ec8a2f484f0eff815abd5">r123array2x32::reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad0b05bbfee2d432dfef71342f14b8430"></a><!-- doxytag: member="r123array2x32::reverse_iterator" ref="ad0b05bbfee2d432dfef71342f14b8430" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123array2x32.html#a4b447adc28d536d9b7ad7e33d5081a8e">iterator</a>> <a class="el" href="structr123array2x32.html#ad0b05bbfee2d432dfef71342f14b8430">r123array2x32::reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac168a0f0c7eddf1842c9882643b31e91"></a><!-- doxytag: member="r123array2x32::size_type" ref="ac168a0f0c7eddf1842c9882643b31e91" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef size_t <a class="el" href="structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91">r123array2x32::size_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab669df8d33d32ee3571210eb090c6cb2"></a><!-- doxytag: member="r123array2x32::value_type" ref="ab669df8d33d32ee3571210eb090c6cb2" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint32_t <a class="el" href="structr123array2x32.html#ab669df8d33d32ee3571210eb090c6cb2">r123array2x32::value_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Enumeration Documentation</h2>
+<a class="anchor" id="ad6e438ec0d5a08bfb0b71a3ff96ea7e8"></a><!-- doxytag: member="r123array2x32::@1" ref="ad6e438ec0d5a08bfb0b71a3ff96ea7e8" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">anonymous enum</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="ad6e438ec0d5a08bfb0b71a3ff96ea7e8a5ae3e9837bb88660b088443c1a6fb47a"></a><!-- doxytag: member="static_size" ref="ad6e438ec0d5a08bfb0b71a3ff96ea7e8a5ae3e9837bb88660b088443c1a6fb47a" args="" -->static_size</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="aa29e0ae21be47bda2ac83e6c945b5719"></a><!-- doxytag: member="r123array2x32::at" ref="aa29e0ae21be47bda2ac83e6c945b5719" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#aacd028d9f97ec8a2f484f0eff815abd5">reference</a> r123array2x32::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae985b8811e4e8849d5f28dae76231dca"></a><!-- doxytag: member="r123array2x32::at" ref="ae985b8811e4e8849d5f28dae76231dca" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#a9d71cce3d7ccea7f48da94cf023e1486">const_reference</a> r123array2x32::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3da7214b9946a3c8653312dcfa42a288"></a><!-- doxytag: member="r123array2x32::back" ref="a3da7214b9946a3c8653312dcfa42a288" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#aacd028d9f97ec8a2f484f0eff815abd5">reference</a> r123array2x32::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae176c02299531373a0fff9a5f55226e5"></a><!-- doxytag: member="r123array2x32::back" ref="ae176c02299531373a0fff9a5f55226e5" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#a9d71cce3d7ccea7f48da94cf023e1486">const_reference</a> r123array2x32::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a96730b28149000a3ea4c6b0f05e1777b"></a><!-- doxytag: member="r123array2x32::begin" ref="a96730b28149000a3ea4c6b0f05e1777b" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#a4b447adc28d536d9b7ad7e33d5081a8e">iterator</a> r123array2x32::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa52b394a0c44b755e5c0d0409dc2c4ea"></a><!-- doxytag: member="r123array2x32::begin" ref="aa52b394a0c44b755e5c0d0409dc2c4ea" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#a7963141a4af4c4aa74708909312a8644">const_iterator</a> r123array2x32::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9687a1e6cdb6b6c9a1ffd8f3c7d2ce45"></a><!-- doxytag: member="r123array2x32::cbegin" ref="a9687a1e6cdb6b6c9a1ffd8f3c7d2ce45" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#a7963141a4af4c4aa74708909312a8644">const_iterator</a> r123array2x32::cbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9bb4382830c6feb49573b82bb9a18efc"></a><!-- doxytag: member="r123array2x32::cend" ref="a9bb4382830c6feb49573b82bb9a18efc" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#a7963141a4af4c4aa74708909312a8644">const_iterator</a> r123array2x32::cend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a09b34692bd41a710bf75e19af2353afb"></a><!-- doxytag: member="r123array2x32::crbegin" ref="a09b34692bd41a710bf75e19af2353afb" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#af298f85ad6bda860232465c5abc33618">const_reverse_iterator</a> r123array2x32::crbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a458da2536084746b5f3face73c9f962d"></a><!-- doxytag: member="r123array2x32::crend" ref="a458da2536084746b5f3face73c9f962d" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#af298f85ad6bda860232465c5abc33618">const_reverse_iterator</a> r123array2x32::crend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a76f2b3cd04d0502121b3c7894663e178"></a><!-- doxytag: member="r123array2x32::data" ref="a76f2b3cd04d0502121b3c7894663e178" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#ac884bcbd1063811354bfac66262a0b42">pointer</a> r123array2x32::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a15d5bce0ea3596ad5f7b5aa7432a33df"></a><!-- doxytag: member="r123array2x32::data" ref="a15d5bce0ea3596ad5f7b5aa7432a33df" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#accf098ed49f9d84cfa3831a9fe183885">const_pointer</a> r123array2x32::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acc67c9fedcddd77fdb2727c088eaab9d"></a><!-- doxytag: member="r123array2x32::empty" ref="acc67c9fedcddd77fdb2727c088eaab9d" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array2x32::empty </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0d98e92b198e8a314d46f9c6fd0771a7"></a><!-- doxytag: member="r123array2x32::end" ref="a0d98e92b198e8a314d46f9c6fd0771a7" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#a4b447adc28d536d9b7ad7e33d5081a8e">iterator</a> r123array2x32::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad64dc05d5114c74d104bca45f21992fd"></a><!-- doxytag: member="r123array2x32::end" ref="ad64dc05d5114c74d104bca45f21992fd" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#a7963141a4af4c4aa74708909312a8644">const_iterator</a> r123array2x32::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af7ea9ed8a064e9cab59ee97885bb459e"></a><!-- doxytag: member="r123array2x32::fill" ref="af7ea9ed8a064e9cab59ee97885bb459e" args="(const value_type &val)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array2x32::fill </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array2x32.html#ab669df8d33d32ee3571210eb090c6cb2">value_type</a> & </td>
+          <td class="paramname"> <em>val</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad5e3ba16c4d22c3ac0775337bef3cc70"></a><!-- doxytag: member="r123array2x32::front" ref="ad5e3ba16c4d22c3ac0775337bef3cc70" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#aacd028d9f97ec8a2f484f0eff815abd5">reference</a> r123array2x32::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a933676c34296b74eeea8a56a3c904a2c"></a><!-- doxytag: member="r123array2x32::front" ref="a933676c34296b74eeea8a56a3c904a2c" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#a9d71cce3d7ccea7f48da94cf023e1486">const_reference</a> r123array2x32::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7b295f3a299c8cf24a75ab7f9edfe46f"></a><!-- doxytag: member="r123array2x32::incr" ref="a7b295f3a299c8cf24a75ab7f9edfe46f" args="(uint64_t n=1)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html">r123array2x32</a>& r123array2x32::incr </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em> = <code>1</code></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adf128cb5c0abaaa4f119d4bcef47ead9"></a><!-- doxytag: member="r123array2x32::incr_carefully" ref="adf128cb5c0abaaa4f119d4bcef47ead9" args="(uint64_t n)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html">r123array2x32</a>& r123array2x32::incr_carefully </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em></td>
+          <td> ) </td>
+          <td><code> [inline, protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a07345b400c5a81e6cd55689d1e38122f"></a><!-- doxytag: member="r123array2x32::max_size" ref="a07345b400c5a81e6cd55689d1e38122f" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91">size_type</a> r123array2x32::max_size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa0c7e561ddeb475329ea8d8178fca2a1"></a><!-- doxytag: member="r123array2x32::operator!=" ref="aa0c7e561ddeb475329ea8d8178fca2a1" args="(const r123array2x32 &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array2x32::operator!= </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array2x32.html">r123array2x32</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa8723e5786c66137e82405a532459b2d"></a><!-- doxytag: member="r123array2x32::operator==" ref="aa8723e5786c66137e82405a532459b2d" args="(const r123array2x32 &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array2x32::operator== </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array2x32.html">r123array2x32</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0ae33a5edf89f9f12edec38209b02464"></a><!-- doxytag: member="r123array2x32::operator[]" ref="a0ae33a5edf89f9f12edec38209b02464" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#a9d71cce3d7ccea7f48da94cf023e1486">const_reference</a> r123array2x32::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9926f6938472682c5d31a742378f17de"></a><!-- doxytag: member="r123array2x32::operator[]" ref="a9926f6938472682c5d31a742378f17de" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#aacd028d9f97ec8a2f484f0eff815abd5">reference</a> r123array2x32::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a54e96198e6cd511dc147348f274b0784"></a><!-- doxytag: member="r123array2x32::rbegin" ref="a54e96198e6cd511dc147348f274b0784" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#ad0b05bbfee2d432dfef71342f14b8430">reverse_iterator</a> r123array2x32::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a00afca78e25bbb9e0b00e6ab95ecb162"></a><!-- doxytag: member="r123array2x32::rbegin" ref="a00afca78e25bbb9e0b00e6ab95ecb162" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#af298f85ad6bda860232465c5abc33618">const_reverse_iterator</a> r123array2x32::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab3f0841dcd9cea6255406b7bc6363621"></a><!-- doxytag: member="r123array2x32::rend" ref="ab3f0841dcd9cea6255406b7bc6363621" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#af298f85ad6bda860232465c5abc33618">const_reverse_iterator</a> r123array2x32::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a383edbf33737eb3e5098d6da4ed326f8"></a><!-- doxytag: member="r123array2x32::rend" ref="a383edbf33737eb3e5098d6da4ed326f8" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#ad0b05bbfee2d432dfef71342f14b8430">reverse_iterator</a> r123array2x32::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a31cf9b80bbcc3c976681b878b7afa046"></a><!-- doxytag: member="r123array2x32::seed" ref="a31cf9b80bbcc3c976681b878b7afa046" args="(SeedSeq &ss)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename SeedSeq > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array2x32.html">r123array2x32</a> r123array2x32::seed </td>
+          <td>(</td>
+          <td class="paramtype">SeedSeq & </td>
+          <td class="paramname"> <em>ss</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad3d7310bd3ced1bfb05cbe4f3e753490"></a><!-- doxytag: member="r123array2x32::size" ref="ad3d7310bd3ced1bfb05cbe4f3e753490" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x32.html#ac168a0f0c7eddf1842c9882643b31e91">size_type</a> r123array2x32::size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1eac99d2198007201b9c0040a18b258c"></a><!-- doxytag: member="r123array2x32::swap" ref="a1eac99d2198007201b9c0040a18b258c" args="(r123array2x32 &rhs)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array2x32::swap </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html">r123array2x32</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="a65524bf06568073021117ef196d6b45f"></a><!-- doxytag: member="r123array2x32::v" ref="a65524bf06568073021117ef196d6b45f" args="[2]" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">uint32_t <a class="el" href="structr123array2x32.html#a65524bf06568073021117ef196d6b45f">r123array2x32::v</a>[2]</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>Random123/<a class="el" href="array_8h_source.html">array.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array2x64-members.html b/lib/Random123-1.08/docs/html/structr123array2x64-members.html
new file mode 100644
index 0000000..f322811
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array2x64-members.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123array2x64 Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123array2x64.html">r123array2x64</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a46789872cf0f3a6310f864b2a35b2ea7">at</a>(size_type i)</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a971ddfa7c395d161028e16c829179f3c">at</a>(size_type i) const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a9beb3e776cb4f3cbee6846518749cb03">back</a>()</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#ac72fd3a39821ca25f94258f97da371c5">back</a>() const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a0fcc60a49efd917a3b630cf53c526311">begin</a>()</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a8cf4fadef6bdc6d438db173bc1d31165">begin</a>() const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#ad1ccbda4186dbb8c0a673db1ec0957c0">cbegin</a>() const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#ac80c7ce6fe5bd9ca8baf03db1e67a7e9">cend</a>() const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#ae4f249e82506274b19e6077c3d3f03af">const_iterator</a> typedef</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a3a13a452ca15f62f8ddcd8b7de9efa08">const_pointer</a> typedef</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a5d80c6b28d869a5422d99541ee1fb93f">const_reference</a> typedef</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#aa37f04aef8a808c76715b3b2d49c3c30">const_reverse_iterator</a> typedef</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a198ff47db0778d88db4fabe5f7721564">crbegin</a>() const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a5bddb882c7c9a493c382d3ce0d6d6079">crend</a>() const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a9a6eb23f15f9ee3a55f39b951798a739">data</a>()</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a9cdb592780378bdcc8a560e31e11f084">data</a>() const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a4227cd6be973fdb0d72398d0b5604da8">difference_type</a> typedef</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a60ed2f5af6357930b50a8de8f294f5c2">empty</a>() const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a24679f6a101d9d25b339106a771c4e68">end</a>()</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#af16f99514770cb88a57e36b1b849e80d">end</a>() const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a30d20bbf203dbd0b592c6cb58cb6dcdb">fill</a>(const value_type &val)</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a95b79f70de75c8346dbae7c5f933d076">front</a>()</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a21cf5457f945f5c00b16ce4a73797c1b">front</a>() const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#ac33e6336c8aee10e38259510ef76e5cf">incr</a>(uint64_t n=1)</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a52ddbfa3edbd9fa7f30e1402a9240da1">incr_carefully</a>(uint64_t n)</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#ac0fc5019e017f50e29d26df233085e56">iterator</a> typedef</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a03f7c9e37e59210b1d2b9390e415e289">max_size</a>() const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a1ddc25ec182ac3b119e420f5e21c3f87">operator!=</a>(const r123array2x64 &rhs) const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#aa690f425f846ff9908a734eb720df573">operator==</a>(const r123array2x64 &rhs) const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a7352cdb2c025b0373ece5c84409a1b1d">operator[]</a>(size_type i)</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#ae534a7e32afae58303ccc8379408551b">operator[]</a>(size_type i) const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a3b0b967b9ae134da266448c190f59c3a">pointer</a> typedef</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a6888b98627db6056afe3f4ee3396a9a6">rbegin</a>()</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#ad6720531d85d0c284ce32cde3b82a9da">rbegin</a>() const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a7150b3ad865d00ca1f753accd8165336">reference</a> typedef</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#ad1e373b457921fc672ed8892180431eb">rend</a>()</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#ad96f87786a8a277bf553d0c5584c20c1">rend</a>() const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#abcbf25662447a5241ed4d19c202f647a">reverse_iterator</a> typedef</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a3e5afc5e4c6886611630cec365d8397b">seed</a>(SeedSeq &ss)</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a10e19c13a970156c4fc18fa070dc9756">size</a>() const </td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#aacb6269c183cc408285dca02e3b55526">size_type</a> typedef</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#aa8ed42c5bf709f879674643a70e71dbca6219dc89b2a7ffde9b00364177f5b846">static_size</a> enum value</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a78ea0dba10b77c9f228108df9ab09c9d">swap</a>(r123array2x64 &rhs)</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#a547e4a51e531cf36eef885fbf20a7048">v</a></td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array2x64.html#acefd9fb46661254e17877844c545e15f">value_type</a> typedef</td><td><a class="el" href="structr123array2x64.html">r123array2x64</a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array2x64.html b/lib/Random123-1.08/docs/html/structr123array2x64.html
new file mode 100644
index 0000000..b6f50a8
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array2x64.html
@@ -0,0 +1,892 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123array2x64 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-methods">Static Public Member Functions</a> |
+<a href="#pub-attribs">Public Attributes</a> |
+<a href="#pro-methods">Protected Member Functions</a>  </div>
+  <div class="headertitle">
+<h1>r123array2x64 Struct Reference<br/>
+<small>
+[<a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123array2x64" -->
+<p><code>#include <<a class="el" href="array_8h_source.html">Random123/array.h</a>></code></p>
+
+<p><a href="structr123array2x64-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom">{ <a class="el" href="structr123array2x64.html#aa8ed42c5bf709f879674643a70e71dbca6219dc89b2a7ffde9b00364177f5b846">static_size</a> =  2
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#acefd9fb46661254e17877844c545e15f">value_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint64_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#ac0fc5019e017f50e29d26df233085e56">iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const uint64_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#ae4f249e82506274b19e6077c3d3f03af">const_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array2x64.html#acefd9fb46661254e17877844c545e15f">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a7150b3ad865d00ca1f753accd8165336">reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const <a class="el" href="structr123array2x64.html#acefd9fb46661254e17877844c545e15f">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a5d80c6b28d869a5422d99541ee1fb93f">const_reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#aacb6269c183cc408285dca02e3b55526">size_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a4227cd6be973fdb0d72398d0b5604da8">difference_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint64_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a3b0b967b9ae134da266448c190f59c3a">pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const uint64_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a3a13a452ca15f62f8ddcd8b7de9efa08">const_pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123array2x64.html#ac0fc5019e017f50e29d26df233085e56">iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#abcbf25662447a5241ed4d19c202f647a">reverse_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123array2x64.html#ae4f249e82506274b19e6077c3d3f03af">const_iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#aa37f04aef8a808c76715b3b2d49c3c30">const_reverse_iterator</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#a7150b3ad865d00ca1f753accd8165336">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a7352cdb2c025b0373ece5c84409a1b1d">operator[]</a> (<a class="el" href="structr123array2x64.html#aacb6269c183cc408285dca02e3b55526">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#a5d80c6b28d869a5422d99541ee1fb93f">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#ae534a7e32afae58303ccc8379408551b">operator[]</a> (<a class="el" href="structr123array2x64.html#aacb6269c183cc408285dca02e3b55526">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#a7150b3ad865d00ca1f753accd8165336">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a46789872cf0f3a6310f864b2a35b2ea7">at</a> (<a class="el" href="structr123array2x64.html#aacb6269c183cc408285dca02e3b55526">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#a5d80c6b28d869a5422d99541ee1fb93f">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a971ddfa7c395d161028e16c829179f3c">at</a> (<a class="el" href="structr123array2x64.html#aacb6269c183cc408285dca02e3b55526">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#aacb6269c183cc408285dca02e3b55526">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a10e19c13a970156c4fc18fa070dc9756">size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#aacb6269c183cc408285dca02e3b55526">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a03f7c9e37e59210b1d2b9390e415e289">max_size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a60ed2f5af6357930b50a8de8f294f5c2">empty</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#ac0fc5019e017f50e29d26df233085e56">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a0fcc60a49efd917a3b630cf53c526311">begin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#ac0fc5019e017f50e29d26df233085e56">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a24679f6a101d9d25b339106a771c4e68">end</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#ae4f249e82506274b19e6077c3d3f03af">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a8cf4fadef6bdc6d438db173bc1d31165">begin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#ae4f249e82506274b19e6077c3d3f03af">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#af16f99514770cb88a57e36b1b849e80d">end</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#ae4f249e82506274b19e6077c3d3f03af">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#ad1ccbda4186dbb8c0a673db1ec0957c0">cbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#ae4f249e82506274b19e6077c3d3f03af">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#ac80c7ce6fe5bd9ca8baf03db1e67a7e9">cend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#abcbf25662447a5241ed4d19c202f647a">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a6888b98627db6056afe3f4ee3396a9a6">rbegin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#aa37f04aef8a808c76715b3b2d49c3c30">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#ad6720531d85d0c284ce32cde3b82a9da">rbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#abcbf25662447a5241ed4d19c202f647a">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#ad1e373b457921fc672ed8892180431eb">rend</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#aa37f04aef8a808c76715b3b2d49c3c30">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#ad96f87786a8a277bf553d0c5584c20c1">rend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#aa37f04aef8a808c76715b3b2d49c3c30">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a198ff47db0778d88db4fabe5f7721564">crbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#aa37f04aef8a808c76715b3b2d49c3c30">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a5bddb882c7c9a493c382d3ce0d6d6079">crend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#a3b0b967b9ae134da266448c190f59c3a">pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a9a6eb23f15f9ee3a55f39b951798a739">data</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#a3a13a452ca15f62f8ddcd8b7de9efa08">const_pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a9cdb592780378bdcc8a560e31e11f084">data</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#a7150b3ad865d00ca1f753accd8165336">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a95b79f70de75c8346dbae7c5f933d076">front</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#a5d80c6b28d869a5422d99541ee1fb93f">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a21cf5457f945f5c00b16ce4a73797c1b">front</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#a7150b3ad865d00ca1f753accd8165336">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a9beb3e776cb4f3cbee6846518749cb03">back</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html#a5d80c6b28d869a5422d99541ee1fb93f">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#ac72fd3a39821ca25f94258f97da371c5">back</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#aa690f425f846ff9908a734eb720df573">operator==</a> (const <a class="el" href="structr123array2x64.html">r123array2x64</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a1ddc25ec182ac3b119e420f5e21c3f87">operator!=</a> (const <a class="el" href="structr123array2x64.html">r123array2x64</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a30d20bbf203dbd0b592c6cb58cb6dcdb">fill</a> (const <a class="el" href="structr123array2x64.html#acefd9fb46661254e17877844c545e15f">value_type</a> &val)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a78ea0dba10b77c9f228108df9ab09c9d">swap</a> (<a class="el" href="structr123array2x64.html">r123array2x64</a> &rhs)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html">r123array2x64</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#ac33e6336c8aee10e38259510ef76e5cf">incr</a> (uint64_t n=1)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr><td class="memTemplParams" colspan="2">template<typename SeedSeq > </td></tr>
+<tr><td class="memTemplItemLeft" align="right" valign="top">static <a class="el" href="structr123array2x64.html">r123array2x64</a> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a3e5afc5e4c6886611630cec365d8397b">seed</a> (SeedSeq &ss)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a547e4a51e531cf36eef885fbf20a7048">v</a> [2]</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array2x64.html">r123array2x64</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array2x64.html#a52ddbfa3edbd9fa7f30e1402a9240da1">incr_carefully</a> (uint64_t n)</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a> </dd></dl>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="ae4f249e82506274b19e6077c3d3f03af"></a><!-- doxytag: member="r123array2x64::const_iterator" ref="ae4f249e82506274b19e6077c3d3f03af" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const uint64_t* <a class="el" href="structr123array2x64.html#ae4f249e82506274b19e6077c3d3f03af">r123array2x64::const_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3a13a452ca15f62f8ddcd8b7de9efa08"></a><!-- doxytag: member="r123array2x64::const_pointer" ref="a3a13a452ca15f62f8ddcd8b7de9efa08" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const uint64_t* <a class="el" href="structr123array2x64.html#a3a13a452ca15f62f8ddcd8b7de9efa08">r123array2x64::const_pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5d80c6b28d869a5422d99541ee1fb93f"></a><!-- doxytag: member="r123array2x64::const_reference" ref="a5d80c6b28d869a5422d99541ee1fb93f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const <a class="el" href="structr123array2x64.html#acefd9fb46661254e17877844c545e15f">value_type</a>& <a class="el" href="structr123array2x64.html#a5d80c6b28d869a5422d99541ee1fb93f">r123array2x64::const_reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa37f04aef8a808c76715b3b2d49c3c30"></a><!-- doxytag: member="r123array2x64::const_reverse_iterator" ref="aa37f04aef8a808c76715b3b2d49c3c30" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123array2x64.html#ae4f249e82506274b19e6077c3d3f03af">const_iterator</a>> <a class="el" href="structr123array2x64.html#aa37f04aef8a808c76715b3b2d49c3c30">r123array2x64::const_reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4227cd6be973fdb0d72398d0b5604da8"></a><!-- doxytag: member="r123array2x64::difference_type" ref="a4227cd6be973fdb0d72398d0b5604da8" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef ptrdiff_t <a class="el" href="structr123array2x64.html#a4227cd6be973fdb0d72398d0b5604da8">r123array2x64::difference_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac0fc5019e017f50e29d26df233085e56"></a><!-- doxytag: member="r123array2x64::iterator" ref="ac0fc5019e017f50e29d26df233085e56" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint64_t* <a class="el" href="structr123array2x64.html#ac0fc5019e017f50e29d26df233085e56">r123array2x64::iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3b0b967b9ae134da266448c190f59c3a"></a><!-- doxytag: member="r123array2x64::pointer" ref="a3b0b967b9ae134da266448c190f59c3a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint64_t* <a class="el" href="structr123array2x64.html#a3b0b967b9ae134da266448c190f59c3a">r123array2x64::pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7150b3ad865d00ca1f753accd8165336"></a><!-- doxytag: member="r123array2x64::reference" ref="a7150b3ad865d00ca1f753accd8165336" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array2x64.html#acefd9fb46661254e17877844c545e15f">value_type</a>& <a class="el" href="structr123array2x64.html#a7150b3ad865d00ca1f753accd8165336">r123array2x64::reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abcbf25662447a5241ed4d19c202f647a"></a><!-- doxytag: member="r123array2x64::reverse_iterator" ref="abcbf25662447a5241ed4d19c202f647a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123array2x64.html#ac0fc5019e017f50e29d26df233085e56">iterator</a>> <a class="el" href="structr123array2x64.html#abcbf25662447a5241ed4d19c202f647a">r123array2x64::reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aacb6269c183cc408285dca02e3b55526"></a><!-- doxytag: member="r123array2x64::size_type" ref="aacb6269c183cc408285dca02e3b55526" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef size_t <a class="el" href="structr123array2x64.html#aacb6269c183cc408285dca02e3b55526">r123array2x64::size_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acefd9fb46661254e17877844c545e15f"></a><!-- doxytag: member="r123array2x64::value_type" ref="acefd9fb46661254e17877844c545e15f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint64_t <a class="el" href="structr123array2x64.html#acefd9fb46661254e17877844c545e15f">r123array2x64::value_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Enumeration Documentation</h2>
+<a class="anchor" id="aa8ed42c5bf709f879674643a70e71dbc"></a><!-- doxytag: member="r123array2x64::@5" ref="aa8ed42c5bf709f879674643a70e71dbc" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">anonymous enum</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="aa8ed42c5bf709f879674643a70e71dbca6219dc89b2a7ffde9b00364177f5b846"></a><!-- doxytag: member="static_size" ref="aa8ed42c5bf709f879674643a70e71dbca6219dc89b2a7ffde9b00364177f5b846" args="" -->static_size</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a46789872cf0f3a6310f864b2a35b2ea7"></a><!-- doxytag: member="r123array2x64::at" ref="a46789872cf0f3a6310f864b2a35b2ea7" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#a7150b3ad865d00ca1f753accd8165336">reference</a> r123array2x64::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html#aacb6269c183cc408285dca02e3b55526">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a971ddfa7c395d161028e16c829179f3c"></a><!-- doxytag: member="r123array2x64::at" ref="a971ddfa7c395d161028e16c829179f3c" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#a5d80c6b28d869a5422d99541ee1fb93f">const_reference</a> r123array2x64::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html#aacb6269c183cc408285dca02e3b55526">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9beb3e776cb4f3cbee6846518749cb03"></a><!-- doxytag: member="r123array2x64::back" ref="a9beb3e776cb4f3cbee6846518749cb03" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#a7150b3ad865d00ca1f753accd8165336">reference</a> r123array2x64::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac72fd3a39821ca25f94258f97da371c5"></a><!-- doxytag: member="r123array2x64::back" ref="ac72fd3a39821ca25f94258f97da371c5" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#a5d80c6b28d869a5422d99541ee1fb93f">const_reference</a> r123array2x64::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0fcc60a49efd917a3b630cf53c526311"></a><!-- doxytag: member="r123array2x64::begin" ref="a0fcc60a49efd917a3b630cf53c526311" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#ac0fc5019e017f50e29d26df233085e56">iterator</a> r123array2x64::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8cf4fadef6bdc6d438db173bc1d31165"></a><!-- doxytag: member="r123array2x64::begin" ref="a8cf4fadef6bdc6d438db173bc1d31165" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#ae4f249e82506274b19e6077c3d3f03af">const_iterator</a> r123array2x64::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad1ccbda4186dbb8c0a673db1ec0957c0"></a><!-- doxytag: member="r123array2x64::cbegin" ref="ad1ccbda4186dbb8c0a673db1ec0957c0" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#ae4f249e82506274b19e6077c3d3f03af">const_iterator</a> r123array2x64::cbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac80c7ce6fe5bd9ca8baf03db1e67a7e9"></a><!-- doxytag: member="r123array2x64::cend" ref="ac80c7ce6fe5bd9ca8baf03db1e67a7e9" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#ae4f249e82506274b19e6077c3d3f03af">const_iterator</a> r123array2x64::cend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a198ff47db0778d88db4fabe5f7721564"></a><!-- doxytag: member="r123array2x64::crbegin" ref="a198ff47db0778d88db4fabe5f7721564" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#aa37f04aef8a808c76715b3b2d49c3c30">const_reverse_iterator</a> r123array2x64::crbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5bddb882c7c9a493c382d3ce0d6d6079"></a><!-- doxytag: member="r123array2x64::crend" ref="a5bddb882c7c9a493c382d3ce0d6d6079" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#aa37f04aef8a808c76715b3b2d49c3c30">const_reverse_iterator</a> r123array2x64::crend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9a6eb23f15f9ee3a55f39b951798a739"></a><!-- doxytag: member="r123array2x64::data" ref="a9a6eb23f15f9ee3a55f39b951798a739" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#a3b0b967b9ae134da266448c190f59c3a">pointer</a> r123array2x64::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9cdb592780378bdcc8a560e31e11f084"></a><!-- doxytag: member="r123array2x64::data" ref="a9cdb592780378bdcc8a560e31e11f084" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#a3a13a452ca15f62f8ddcd8b7de9efa08">const_pointer</a> r123array2x64::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a60ed2f5af6357930b50a8de8f294f5c2"></a><!-- doxytag: member="r123array2x64::empty" ref="a60ed2f5af6357930b50a8de8f294f5c2" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array2x64::empty </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a24679f6a101d9d25b339106a771c4e68"></a><!-- doxytag: member="r123array2x64::end" ref="a24679f6a101d9d25b339106a771c4e68" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#ac0fc5019e017f50e29d26df233085e56">iterator</a> r123array2x64::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af16f99514770cb88a57e36b1b849e80d"></a><!-- doxytag: member="r123array2x64::end" ref="af16f99514770cb88a57e36b1b849e80d" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#ae4f249e82506274b19e6077c3d3f03af">const_iterator</a> r123array2x64::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a30d20bbf203dbd0b592c6cb58cb6dcdb"></a><!-- doxytag: member="r123array2x64::fill" ref="a30d20bbf203dbd0b592c6cb58cb6dcdb" args="(const value_type &val)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array2x64::fill </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array2x64.html#acefd9fb46661254e17877844c545e15f">value_type</a> & </td>
+          <td class="paramname"> <em>val</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a95b79f70de75c8346dbae7c5f933d076"></a><!-- doxytag: member="r123array2x64::front" ref="a95b79f70de75c8346dbae7c5f933d076" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#a7150b3ad865d00ca1f753accd8165336">reference</a> r123array2x64::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a21cf5457f945f5c00b16ce4a73797c1b"></a><!-- doxytag: member="r123array2x64::front" ref="a21cf5457f945f5c00b16ce4a73797c1b" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#a5d80c6b28d869a5422d99541ee1fb93f">const_reference</a> r123array2x64::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac33e6336c8aee10e38259510ef76e5cf"></a><!-- doxytag: member="r123array2x64::incr" ref="ac33e6336c8aee10e38259510ef76e5cf" args="(uint64_t n=1)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html">r123array2x64</a>& r123array2x64::incr </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em> = <code>1</code></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a52ddbfa3edbd9fa7f30e1402a9240da1"></a><!-- doxytag: member="r123array2x64::incr_carefully" ref="a52ddbfa3edbd9fa7f30e1402a9240da1" args="(uint64_t n)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html">r123array2x64</a>& r123array2x64::incr_carefully </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em></td>
+          <td> ) </td>
+          <td><code> [inline, protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a03f7c9e37e59210b1d2b9390e415e289"></a><!-- doxytag: member="r123array2x64::max_size" ref="a03f7c9e37e59210b1d2b9390e415e289" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#aacb6269c183cc408285dca02e3b55526">size_type</a> r123array2x64::max_size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1ddc25ec182ac3b119e420f5e21c3f87"></a><!-- doxytag: member="r123array2x64::operator!=" ref="a1ddc25ec182ac3b119e420f5e21c3f87" args="(const r123array2x64 &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array2x64::operator!= </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array2x64.html">r123array2x64</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa690f425f846ff9908a734eb720df573"></a><!-- doxytag: member="r123array2x64::operator==" ref="aa690f425f846ff9908a734eb720df573" args="(const r123array2x64 &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array2x64::operator== </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array2x64.html">r123array2x64</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae534a7e32afae58303ccc8379408551b"></a><!-- doxytag: member="r123array2x64::operator[]" ref="ae534a7e32afae58303ccc8379408551b" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#a5d80c6b28d869a5422d99541ee1fb93f">const_reference</a> r123array2x64::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html#aacb6269c183cc408285dca02e3b55526">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7352cdb2c025b0373ece5c84409a1b1d"></a><!-- doxytag: member="r123array2x64::operator[]" ref="a7352cdb2c025b0373ece5c84409a1b1d" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#a7150b3ad865d00ca1f753accd8165336">reference</a> r123array2x64::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html#aacb6269c183cc408285dca02e3b55526">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6888b98627db6056afe3f4ee3396a9a6"></a><!-- doxytag: member="r123array2x64::rbegin" ref="a6888b98627db6056afe3f4ee3396a9a6" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#abcbf25662447a5241ed4d19c202f647a">reverse_iterator</a> r123array2x64::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad6720531d85d0c284ce32cde3b82a9da"></a><!-- doxytag: member="r123array2x64::rbegin" ref="ad6720531d85d0c284ce32cde3b82a9da" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#aa37f04aef8a808c76715b3b2d49c3c30">const_reverse_iterator</a> r123array2x64::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad96f87786a8a277bf553d0c5584c20c1"></a><!-- doxytag: member="r123array2x64::rend" ref="ad96f87786a8a277bf553d0c5584c20c1" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#aa37f04aef8a808c76715b3b2d49c3c30">const_reverse_iterator</a> r123array2x64::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad1e373b457921fc672ed8892180431eb"></a><!-- doxytag: member="r123array2x64::rend" ref="ad1e373b457921fc672ed8892180431eb" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#abcbf25662447a5241ed4d19c202f647a">reverse_iterator</a> r123array2x64::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3e5afc5e4c6886611630cec365d8397b"></a><!-- doxytag: member="r123array2x64::seed" ref="a3e5afc5e4c6886611630cec365d8397b" args="(SeedSeq &ss)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename SeedSeq > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array2x64.html">r123array2x64</a> r123array2x64::seed </td>
+          <td>(</td>
+          <td class="paramtype">SeedSeq & </td>
+          <td class="paramname"> <em>ss</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a10e19c13a970156c4fc18fa070dc9756"></a><!-- doxytag: member="r123array2x64::size" ref="a10e19c13a970156c4fc18fa070dc9756" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array2x64.html#aacb6269c183cc408285dca02e3b55526">size_type</a> r123array2x64::size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a78ea0dba10b77c9f228108df9ab09c9d"></a><!-- doxytag: member="r123array2x64::swap" ref="a78ea0dba10b77c9f228108df9ab09c9d" args="(r123array2x64 &rhs)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array2x64::swap </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html">r123array2x64</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="a547e4a51e531cf36eef885fbf20a7048"></a><!-- doxytag: member="r123array2x64::v" ref="a547e4a51e531cf36eef885fbf20a7048" args="[2]" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">uint64_t <a class="el" href="structr123array2x64.html#a547e4a51e531cf36eef885fbf20a7048">r123array2x64::v</a>[2]</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>Random123/<a class="el" href="array_8h_source.html">array.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array4x32-members.html b/lib/Random123-1.08/docs/html/structr123array4x32-members.html
new file mode 100644
index 0000000..10dd2e3
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array4x32-members.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123array4x32 Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123array4x32.html">r123array4x32</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#ac44f12891effca2d069a3a3a8173dd62">at</a>(size_type i)</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#abdb3253eb03291895f89885298e17169">at</a>(size_type i) const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a70fd9b24cb3b126eb15c23049f786653">back</a>()</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a4e1cba8583b2fac8cc3bf854956191c4">back</a>() const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a96a9c7e3ece3d2b128cf7f264af6ea3c">begin</a>()</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a830254ee0db7bf12facf67f23428d2d9">begin</a>() const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a4881e99f7b0ff88e2a3082b9e2464bf5">cbegin</a>() const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a0045f9134801ed79d31f65c7d224d72c">cend</a>() const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a1078ba2cd13bb2a4f83e1b089c816ba7">const_iterator</a> typedef</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a28d13183d1bfcc05854dc39bebbcdf51">const_pointer</a> typedef</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a09d7e0d7b1572fc5fe2be119870a39bc">const_reference</a> typedef</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a2926ff865e9dcbc3c20e6639aa8d0b1b">const_reverse_iterator</a> typedef</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#ad65e3e63740dc2301442718b3b8aa440">crbegin</a>() const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a13322be3844d39f9de76d263fa8d1f75">crend</a>() const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a72ee678cce1fa539f44480eb269a01f9">data</a>()</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a20dd9fc18f9db8fe8e8eb08311398d22">data</a>() const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a3c690c039797cafe4718c03377937fb7">difference_type</a> typedef</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a4bc944eee354be2b258c0991d3cc61e1">empty</a>() const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a83dd3d17e17bb6a93b7cd544b0e9a403">end</a>()</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#ac6e732c58b1a5ad954c3b6f2be8385a1">end</a>() const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#ae362d7908c2ecc308f6fd4e085ace980">fill</a>(const value_type &val)</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a82b3fdeacb835bb64765def4bef92751">front</a>()</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#ab3434550aea3d2e04579cb255b0b4e9e">front</a>() const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a36515eb50711e36a88f1390bbd4e0e05">incr</a>(uint64_t n=1)</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#acec3775361651e6f8dea517f07d7a8b8">incr_carefully</a>(uint64_t n)</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a73a2a55a200af374d7299d2de13aa5cc">iterator</a> typedef</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#afddfc77eea0f5f4c53dc075425f96ab3">max_size</a>() const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a1a7aa47c8dd7db5146e54cc54d1d4358">operator!=</a>(const r123array4x32 &rhs) const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a14123fe9160e559a83e61ab6c2901759">operator==</a>(const r123array4x32 &rhs) const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#aa1fef4a0eb551a70d1ec5d766efcffb5">operator[]</a>(size_type i)</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a3161a139a59a1196398d5d4b81d740df">operator[]</a>(size_type i) const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#adcef39f1e3989578b4c0a92524a15df2">pointer</a> typedef</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#aea9aae067d8347aa53a12a4c9948ae9a">rbegin</a>()</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#aadb177f7f316ae47deeea20a686e7909">rbegin</a>() const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a620f00f67215ab7fd344ec551c596712">reference</a> typedef</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a368f69bdd03a9af1c6254daf98496dbd">rend</a>()</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a7b2af2db2af5f90c8a3f5f7014193d72">rend</a>() const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#aaabdf758fb4a56eaf4cf256654f41314">reverse_iterator</a> typedef</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#acdaad089dc0e44da5818ebda8404bd16">seed</a>(SeedSeq &ss)</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a1da4bfacdcd4a520a227bc5c2cff6a4b">size</a>() const </td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af">size_type</a> typedef</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a3d387fea63ac50668e75faa8ebe4594aa80d43f91cd038fece63f219b9f4a36c6">static_size</a> enum value</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a3e6f9b7de70de3386bcd2ba44ad68fb5">swap</a>(r123array4x32 &rhs)</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a></td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x32.html#a5ba59b507edcf793ba186a9a4e8c56d5">value_type</a> typedef</td><td><a class="el" href="structr123array4x32.html">r123array4x32</a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array4x32.html b/lib/Random123-1.08/docs/html/structr123array4x32.html
new file mode 100644
index 0000000..49b9f35
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array4x32.html
@@ -0,0 +1,892 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123array4x32 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-methods">Static Public Member Functions</a> |
+<a href="#pub-attribs">Public Attributes</a> |
+<a href="#pro-methods">Protected Member Functions</a>  </div>
+  <div class="headertitle">
+<h1>r123array4x32 Struct Reference<br/>
+<small>
+[<a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123array4x32" -->
+<p><code>#include <<a class="el" href="array_8h_source.html">Random123/array.h</a>></code></p>
+
+<p><a href="structr123array4x32-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom">{ <a class="el" href="structr123array4x32.html#a3d387fea63ac50668e75faa8ebe4594aa80d43f91cd038fece63f219b9f4a36c6">static_size</a> =  4
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a5ba59b507edcf793ba186a9a4e8c56d5">value_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint32_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a73a2a55a200af374d7299d2de13aa5cc">iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const uint32_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a1078ba2cd13bb2a4f83e1b089c816ba7">const_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x32.html#a5ba59b507edcf793ba186a9a4e8c56d5">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a620f00f67215ab7fd344ec551c596712">reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const <a class="el" href="structr123array4x32.html#a5ba59b507edcf793ba186a9a4e8c56d5">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a09d7e0d7b1572fc5fe2be119870a39bc">const_reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af">size_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a3c690c039797cafe4718c03377937fb7">difference_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint32_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#adcef39f1e3989578b4c0a92524a15df2">pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const uint32_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a28d13183d1bfcc05854dc39bebbcdf51">const_pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123array4x32.html#a73a2a55a200af374d7299d2de13aa5cc">iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#aaabdf758fb4a56eaf4cf256654f41314">reverse_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123array4x32.html#a1078ba2cd13bb2a4f83e1b089c816ba7">const_iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a2926ff865e9dcbc3c20e6639aa8d0b1b">const_reverse_iterator</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a620f00f67215ab7fd344ec551c596712">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#aa1fef4a0eb551a70d1ec5d766efcffb5">operator[]</a> (<a class="el" href="structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a09d7e0d7b1572fc5fe2be119870a39bc">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a3161a139a59a1196398d5d4b81d740df">operator[]</a> (<a class="el" href="structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a620f00f67215ab7fd344ec551c596712">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#ac44f12891effca2d069a3a3a8173dd62">at</a> (<a class="el" href="structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a09d7e0d7b1572fc5fe2be119870a39bc">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#abdb3253eb03291895f89885298e17169">at</a> (<a class="el" href="structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a1da4bfacdcd4a520a227bc5c2cff6a4b">size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#afddfc77eea0f5f4c53dc075425f96ab3">max_size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a4bc944eee354be2b258c0991d3cc61e1">empty</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a73a2a55a200af374d7299d2de13aa5cc">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a96a9c7e3ece3d2b128cf7f264af6ea3c">begin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a73a2a55a200af374d7299d2de13aa5cc">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a83dd3d17e17bb6a93b7cd544b0e9a403">end</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a1078ba2cd13bb2a4f83e1b089c816ba7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a830254ee0db7bf12facf67f23428d2d9">begin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a1078ba2cd13bb2a4f83e1b089c816ba7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#ac6e732c58b1a5ad954c3b6f2be8385a1">end</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a1078ba2cd13bb2a4f83e1b089c816ba7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a4881e99f7b0ff88e2a3082b9e2464bf5">cbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a1078ba2cd13bb2a4f83e1b089c816ba7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a0045f9134801ed79d31f65c7d224d72c">cend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#aaabdf758fb4a56eaf4cf256654f41314">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#aea9aae067d8347aa53a12a4c9948ae9a">rbegin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a2926ff865e9dcbc3c20e6639aa8d0b1b">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#aadb177f7f316ae47deeea20a686e7909">rbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#aaabdf758fb4a56eaf4cf256654f41314">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a368f69bdd03a9af1c6254daf98496dbd">rend</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a2926ff865e9dcbc3c20e6639aa8d0b1b">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a7b2af2db2af5f90c8a3f5f7014193d72">rend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a2926ff865e9dcbc3c20e6639aa8d0b1b">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#ad65e3e63740dc2301442718b3b8aa440">crbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a2926ff865e9dcbc3c20e6639aa8d0b1b">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a13322be3844d39f9de76d263fa8d1f75">crend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#adcef39f1e3989578b4c0a92524a15df2">pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a72ee678cce1fa539f44480eb269a01f9">data</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a28d13183d1bfcc05854dc39bebbcdf51">const_pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a20dd9fc18f9db8fe8e8eb08311398d22">data</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a620f00f67215ab7fd344ec551c596712">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a82b3fdeacb835bb64765def4bef92751">front</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a09d7e0d7b1572fc5fe2be119870a39bc">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#ab3434550aea3d2e04579cb255b0b4e9e">front</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a620f00f67215ab7fd344ec551c596712">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a70fd9b24cb3b126eb15c23049f786653">back</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html#a09d7e0d7b1572fc5fe2be119870a39bc">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a4e1cba8583b2fac8cc3bf854956191c4">back</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a14123fe9160e559a83e61ab6c2901759">operator==</a> (const <a class="el" href="structr123array4x32.html">r123array4x32</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a1a7aa47c8dd7db5146e54cc54d1d4358">operator!=</a> (const <a class="el" href="structr123array4x32.html">r123array4x32</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#ae362d7908c2ecc308f6fd4e085ace980">fill</a> (const <a class="el" href="structr123array4x32.html#a5ba59b507edcf793ba186a9a4e8c56d5">value_type</a> &val)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a3e6f9b7de70de3386bcd2ba44ad68fb5">swap</a> (<a class="el" href="structr123array4x32.html">r123array4x32</a> &rhs)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html">r123array4x32</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#a36515eb50711e36a88f1390bbd4e0e05">incr</a> (uint64_t n=1)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr><td class="memTemplParams" colspan="2">template<typename SeedSeq > </td></tr>
+<tr><td class="memTemplItemLeft" align="right" valign="top">static <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#acdaad089dc0e44da5818ebda8404bd16">seed</a> (SeedSeq &ss)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">v</a> [4]</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x32.html">r123array4x32</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x32.html#acec3775361651e6f8dea517f07d7a8b8">incr_carefully</a> (uint64_t n)</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a> </dd></dl>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="a1078ba2cd13bb2a4f83e1b089c816ba7"></a><!-- doxytag: member="r123array4x32::const_iterator" ref="a1078ba2cd13bb2a4f83e1b089c816ba7" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const uint32_t* <a class="el" href="structr123array4x32.html#a1078ba2cd13bb2a4f83e1b089c816ba7">r123array4x32::const_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a28d13183d1bfcc05854dc39bebbcdf51"></a><!-- doxytag: member="r123array4x32::const_pointer" ref="a28d13183d1bfcc05854dc39bebbcdf51" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const uint32_t* <a class="el" href="structr123array4x32.html#a28d13183d1bfcc05854dc39bebbcdf51">r123array4x32::const_pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a09d7e0d7b1572fc5fe2be119870a39bc"></a><!-- doxytag: member="r123array4x32::const_reference" ref="a09d7e0d7b1572fc5fe2be119870a39bc" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const <a class="el" href="structr123array4x32.html#a5ba59b507edcf793ba186a9a4e8c56d5">value_type</a>& <a class="el" href="structr123array4x32.html#a09d7e0d7b1572fc5fe2be119870a39bc">r123array4x32::const_reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2926ff865e9dcbc3c20e6639aa8d0b1b"></a><!-- doxytag: member="r123array4x32::const_reverse_iterator" ref="a2926ff865e9dcbc3c20e6639aa8d0b1b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123array4x32.html#a1078ba2cd13bb2a4f83e1b089c816ba7">const_iterator</a>> <a class="el" href="structr123array4x32.html#a2926ff865e9dcbc3c20e6639aa8d0b1b">r123array4x32::const_reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3c690c039797cafe4718c03377937fb7"></a><!-- doxytag: member="r123array4x32::difference_type" ref="a3c690c039797cafe4718c03377937fb7" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef ptrdiff_t <a class="el" href="structr123array4x32.html#a3c690c039797cafe4718c03377937fb7">r123array4x32::difference_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a73a2a55a200af374d7299d2de13aa5cc"></a><!-- doxytag: member="r123array4x32::iterator" ref="a73a2a55a200af374d7299d2de13aa5cc" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint32_t* <a class="el" href="structr123array4x32.html#a73a2a55a200af374d7299d2de13aa5cc">r123array4x32::iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adcef39f1e3989578b4c0a92524a15df2"></a><!-- doxytag: member="r123array4x32::pointer" ref="adcef39f1e3989578b4c0a92524a15df2" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint32_t* <a class="el" href="structr123array4x32.html#adcef39f1e3989578b4c0a92524a15df2">r123array4x32::pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a620f00f67215ab7fd344ec551c596712"></a><!-- doxytag: member="r123array4x32::reference" ref="a620f00f67215ab7fd344ec551c596712" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array4x32.html#a5ba59b507edcf793ba186a9a4e8c56d5">value_type</a>& <a class="el" href="structr123array4x32.html#a620f00f67215ab7fd344ec551c596712">r123array4x32::reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aaabdf758fb4a56eaf4cf256654f41314"></a><!-- doxytag: member="r123array4x32::reverse_iterator" ref="aaabdf758fb4a56eaf4cf256654f41314" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123array4x32.html#a73a2a55a200af374d7299d2de13aa5cc">iterator</a>> <a class="el" href="structr123array4x32.html#aaabdf758fb4a56eaf4cf256654f41314">r123array4x32::reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af4ee6cd95de0f8b7932d7a6a061663af"></a><!-- doxytag: member="r123array4x32::size_type" ref="af4ee6cd95de0f8b7932d7a6a061663af" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef size_t <a class="el" href="structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af">r123array4x32::size_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5ba59b507edcf793ba186a9a4e8c56d5"></a><!-- doxytag: member="r123array4x32::value_type" ref="a5ba59b507edcf793ba186a9a4e8c56d5" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint32_t <a class="el" href="structr123array4x32.html#a5ba59b507edcf793ba186a9a4e8c56d5">r123array4x32::value_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Enumeration Documentation</h2>
+<a class="anchor" id="a3d387fea63ac50668e75faa8ebe4594a"></a><!-- doxytag: member="r123array4x32::@2" ref="a3d387fea63ac50668e75faa8ebe4594a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">anonymous enum</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="a3d387fea63ac50668e75faa8ebe4594aa80d43f91cd038fece63f219b9f4a36c6"></a><!-- doxytag: member="static_size" ref="a3d387fea63ac50668e75faa8ebe4594aa80d43f91cd038fece63f219b9f4a36c6" args="" -->static_size</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="ac44f12891effca2d069a3a3a8173dd62"></a><!-- doxytag: member="r123array4x32::at" ref="ac44f12891effca2d069a3a3a8173dd62" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a620f00f67215ab7fd344ec551c596712">reference</a> r123array4x32::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abdb3253eb03291895f89885298e17169"></a><!-- doxytag: member="r123array4x32::at" ref="abdb3253eb03291895f89885298e17169" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a09d7e0d7b1572fc5fe2be119870a39bc">const_reference</a> r123array4x32::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a70fd9b24cb3b126eb15c23049f786653"></a><!-- doxytag: member="r123array4x32::back" ref="a70fd9b24cb3b126eb15c23049f786653" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a620f00f67215ab7fd344ec551c596712">reference</a> r123array4x32::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4e1cba8583b2fac8cc3bf854956191c4"></a><!-- doxytag: member="r123array4x32::back" ref="a4e1cba8583b2fac8cc3bf854956191c4" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a09d7e0d7b1572fc5fe2be119870a39bc">const_reference</a> r123array4x32::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a96a9c7e3ece3d2b128cf7f264af6ea3c"></a><!-- doxytag: member="r123array4x32::begin" ref="a96a9c7e3ece3d2b128cf7f264af6ea3c" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a73a2a55a200af374d7299d2de13aa5cc">iterator</a> r123array4x32::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a830254ee0db7bf12facf67f23428d2d9"></a><!-- doxytag: member="r123array4x32::begin" ref="a830254ee0db7bf12facf67f23428d2d9" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a1078ba2cd13bb2a4f83e1b089c816ba7">const_iterator</a> r123array4x32::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4881e99f7b0ff88e2a3082b9e2464bf5"></a><!-- doxytag: member="r123array4x32::cbegin" ref="a4881e99f7b0ff88e2a3082b9e2464bf5" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a1078ba2cd13bb2a4f83e1b089c816ba7">const_iterator</a> r123array4x32::cbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0045f9134801ed79d31f65c7d224d72c"></a><!-- doxytag: member="r123array4x32::cend" ref="a0045f9134801ed79d31f65c7d224d72c" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a1078ba2cd13bb2a4f83e1b089c816ba7">const_iterator</a> r123array4x32::cend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad65e3e63740dc2301442718b3b8aa440"></a><!-- doxytag: member="r123array4x32::crbegin" ref="ad65e3e63740dc2301442718b3b8aa440" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a2926ff865e9dcbc3c20e6639aa8d0b1b">const_reverse_iterator</a> r123array4x32::crbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a13322be3844d39f9de76d263fa8d1f75"></a><!-- doxytag: member="r123array4x32::crend" ref="a13322be3844d39f9de76d263fa8d1f75" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a2926ff865e9dcbc3c20e6639aa8d0b1b">const_reverse_iterator</a> r123array4x32::crend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a72ee678cce1fa539f44480eb269a01f9"></a><!-- doxytag: member="r123array4x32::data" ref="a72ee678cce1fa539f44480eb269a01f9" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#adcef39f1e3989578b4c0a92524a15df2">pointer</a> r123array4x32::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a20dd9fc18f9db8fe8e8eb08311398d22"></a><!-- doxytag: member="r123array4x32::data" ref="a20dd9fc18f9db8fe8e8eb08311398d22" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a28d13183d1bfcc05854dc39bebbcdf51">const_pointer</a> r123array4x32::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4bc944eee354be2b258c0991d3cc61e1"></a><!-- doxytag: member="r123array4x32::empty" ref="a4bc944eee354be2b258c0991d3cc61e1" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array4x32::empty </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a83dd3d17e17bb6a93b7cd544b0e9a403"></a><!-- doxytag: member="r123array4x32::end" ref="a83dd3d17e17bb6a93b7cd544b0e9a403" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a73a2a55a200af374d7299d2de13aa5cc">iterator</a> r123array4x32::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac6e732c58b1a5ad954c3b6f2be8385a1"></a><!-- doxytag: member="r123array4x32::end" ref="ac6e732c58b1a5ad954c3b6f2be8385a1" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a1078ba2cd13bb2a4f83e1b089c816ba7">const_iterator</a> r123array4x32::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae362d7908c2ecc308f6fd4e085ace980"></a><!-- doxytag: member="r123array4x32::fill" ref="ae362d7908c2ecc308f6fd4e085ace980" args="(const value_type &val)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array4x32::fill </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array4x32.html#a5ba59b507edcf793ba186a9a4e8c56d5">value_type</a> & </td>
+          <td class="paramname"> <em>val</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a82b3fdeacb835bb64765def4bef92751"></a><!-- doxytag: member="r123array4x32::front" ref="a82b3fdeacb835bb64765def4bef92751" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a620f00f67215ab7fd344ec551c596712">reference</a> r123array4x32::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab3434550aea3d2e04579cb255b0b4e9e"></a><!-- doxytag: member="r123array4x32::front" ref="ab3434550aea3d2e04579cb255b0b4e9e" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a09d7e0d7b1572fc5fe2be119870a39bc">const_reference</a> r123array4x32::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a36515eb50711e36a88f1390bbd4e0e05"></a><!-- doxytag: member="r123array4x32::incr" ref="a36515eb50711e36a88f1390bbd4e0e05" args="(uint64_t n=1)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html">r123array4x32</a>& r123array4x32::incr </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em> = <code>1</code></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acec3775361651e6f8dea517f07d7a8b8"></a><!-- doxytag: member="r123array4x32::incr_carefully" ref="acec3775361651e6f8dea517f07d7a8b8" args="(uint64_t n)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html">r123array4x32</a>& r123array4x32::incr_carefully </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em></td>
+          <td> ) </td>
+          <td><code> [inline, protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afddfc77eea0f5f4c53dc075425f96ab3"></a><!-- doxytag: member="r123array4x32::max_size" ref="afddfc77eea0f5f4c53dc075425f96ab3" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af">size_type</a> r123array4x32::max_size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1a7aa47c8dd7db5146e54cc54d1d4358"></a><!-- doxytag: member="r123array4x32::operator!=" ref="a1a7aa47c8dd7db5146e54cc54d1d4358" args="(const r123array4x32 &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array4x32::operator!= </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array4x32.html">r123array4x32</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a14123fe9160e559a83e61ab6c2901759"></a><!-- doxytag: member="r123array4x32::operator==" ref="a14123fe9160e559a83e61ab6c2901759" args="(const r123array4x32 &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array4x32::operator== </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array4x32.html">r123array4x32</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3161a139a59a1196398d5d4b81d740df"></a><!-- doxytag: member="r123array4x32::operator[]" ref="a3161a139a59a1196398d5d4b81d740df" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a09d7e0d7b1572fc5fe2be119870a39bc">const_reference</a> r123array4x32::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa1fef4a0eb551a70d1ec5d766efcffb5"></a><!-- doxytag: member="r123array4x32::operator[]" ref="aa1fef4a0eb551a70d1ec5d766efcffb5" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a620f00f67215ab7fd344ec551c596712">reference</a> r123array4x32::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aea9aae067d8347aa53a12a4c9948ae9a"></a><!-- doxytag: member="r123array4x32::rbegin" ref="aea9aae067d8347aa53a12a4c9948ae9a" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#aaabdf758fb4a56eaf4cf256654f41314">reverse_iterator</a> r123array4x32::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aadb177f7f316ae47deeea20a686e7909"></a><!-- doxytag: member="r123array4x32::rbegin" ref="aadb177f7f316ae47deeea20a686e7909" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a2926ff865e9dcbc3c20e6639aa8d0b1b">const_reverse_iterator</a> r123array4x32::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7b2af2db2af5f90c8a3f5f7014193d72"></a><!-- doxytag: member="r123array4x32::rend" ref="a7b2af2db2af5f90c8a3f5f7014193d72" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#a2926ff865e9dcbc3c20e6639aa8d0b1b">const_reverse_iterator</a> r123array4x32::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a368f69bdd03a9af1c6254daf98496dbd"></a><!-- doxytag: member="r123array4x32::rend" ref="a368f69bdd03a9af1c6254daf98496dbd" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#aaabdf758fb4a56eaf4cf256654f41314">reverse_iterator</a> r123array4x32::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acdaad089dc0e44da5818ebda8404bd16"></a><!-- doxytag: member="r123array4x32::seed" ref="acdaad089dc0e44da5818ebda8404bd16" args="(SeedSeq &ss)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename SeedSeq > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array4x32.html">r123array4x32</a> r123array4x32::seed </td>
+          <td>(</td>
+          <td class="paramtype">SeedSeq & </td>
+          <td class="paramname"> <em>ss</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1da4bfacdcd4a520a227bc5c2cff6a4b"></a><!-- doxytag: member="r123array4x32::size" ref="a1da4bfacdcd4a520a227bc5c2cff6a4b" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x32.html#af4ee6cd95de0f8b7932d7a6a061663af">size_type</a> r123array4x32::size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3e6f9b7de70de3386bcd2ba44ad68fb5"></a><!-- doxytag: member="r123array4x32::swap" ref="a3e6f9b7de70de3386bcd2ba44ad68fb5" args="(r123array4x32 &rhs)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array4x32::swap </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">r123array4x32</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="ac8e6785120a3031b211fc8aa7d03d83f"></a><!-- doxytag: member="r123array4x32::v" ref="ac8e6785120a3031b211fc8aa7d03d83f" args="[4]" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">uint32_t <a class="el" href="structr123array4x32.html#ac8e6785120a3031b211fc8aa7d03d83f">r123array4x32::v</a>[4]</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>Random123/<a class="el" href="array_8h_source.html">array.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array4x64-members.html b/lib/Random123-1.08/docs/html/structr123array4x64-members.html
new file mode 100644
index 0000000..486f8ca
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array4x64-members.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123array4x64 Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123array4x64.html">r123array4x64</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a5b60c8dcd20ce894109e346fdb4cbdb2">at</a>(size_type i)</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a893d3db3d274fc15ac32bc7cbab0e82a">at</a>(size_type i) const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#abb40868277e8a943a0b5464985baceb5">back</a>()</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a9006cfe7882bbc791a81a52f7cc0fd2d">back</a>() const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#ab78c67c429da6405f9d1ed5054635961">begin</a>()</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#acd133812dbe01892199683e003921b8b">begin</a>() const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#af716d2b14d1243870e8544ea2a3cece6">cbegin</a>() const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#af970ab87ce987c91097316bc0a0836ef">cend</a>() const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a2aa5637bebf5c9c753edbce62e889d77">const_iterator</a> typedef</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#aa268882d3b4fb43ec9d82baf22d58cc5">const_pointer</a> typedef</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#ac2f21a458bf9008b831c553c5ae77508">const_reference</a> typedef</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a8405a219a9c81f8f298298cffbfd46ac">const_reverse_iterator</a> typedef</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a7712a006a2b567321a6ac9e84bb267d8">crbegin</a>() const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a907eb18b7392479a8ad6b2ddfaaecbd2">crend</a>() const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a8567c3d6c4ee6c9cc2d8770d26e7fee9">data</a>()</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a31591d0bca18339d42c3a182a30457a0">data</a>() const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a3b1c7395f17992d8760fe93d3930db12">difference_type</a> typedef</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a51e4ded187a3f1ebadd6b915da039c3f">empty</a>() const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a298a04608a19dd91cb30bd7980ad796f">end</a>()</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a9fed923c39000c81f7f6b608d88953f9">end</a>() const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a6580c77b7d68c0a76b5bef33e59ac662">fill</a>(const value_type &val)</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a975ecaf4c5332fc400dfc8d6d60d9035">front</a>()</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a256920b96d1d3a4c61489b145da7383e">front</a>() const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#ac4187b4ae44913183b1c8f9b7654f8a9">incr</a>(uint64_t n=1)</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#af629d14b454f406cae4d128d9e05554d">incr_carefully</a>(uint64_t n)</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#adfc9f1209d12f855b9330ecccc8b6dd2">iterator</a> typedef</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#aad1329f21e3fdd5d25a29148db564b8a">max_size</a>() const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#abf2fc58ddb163708c087f72921dfd11d">operator!=</a>(const r123array4x64 &rhs) const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#afada659cc4a54a1416dca2522885cef1">operator==</a>(const r123array4x64 &rhs) const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#adf867ee2ffc437a3f358431d3729a33d">operator[]</a>(size_type i)</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a27c2001bf5af042aa450f17637646bd3">operator[]</a>(size_type i) const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a08c39c2f70f4198a82cba99c0162e67c">pointer</a> typedef</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a102f75427ce01bea725da02b975834b5">rbegin</a>()</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a7ccc255ba0e1803080b117703dc3dc70">rbegin</a>() const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a14ea48b972d46d9424c317db9698224f">reference</a> typedef</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a71f59163070cb4cfd7ddda6f4f8576a1">rend</a>()</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a25538a452f6e709bacfc9f49b7216280">rend</a>() const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#acc93aa79ca040ce8fd0957ac86caa2f9">reverse_iterator</a> typedef</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a6f0133930367a2260ed5a132bf737131">seed</a>(SeedSeq &ss)</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a303c3feaf0783e99292c3220613ea903">size</a>() const </td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af">size_type</a> typedef</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a904abc16c5828698aa8af5824b6a69c1aa1363fd51fd3dae2d8989711a11817ff">static_size</a> enum value</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#a9845020f8799cbf04156e3114a4c9314">swap</a>(r123array4x64 &rhs)</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#aae3a18410877c49f1058bc4d78a62f48">v</a></td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array4x64.html#ae4a79be3ab80944a8bb6bc7ec7907061">value_type</a> typedef</td><td><a class="el" href="structr123array4x64.html">r123array4x64</a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array4x64.html b/lib/Random123-1.08/docs/html/structr123array4x64.html
new file mode 100644
index 0000000..0a16a3d
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array4x64.html
@@ -0,0 +1,892 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123array4x64 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-methods">Static Public Member Functions</a> |
+<a href="#pub-attribs">Public Attributes</a> |
+<a href="#pro-methods">Protected Member Functions</a>  </div>
+  <div class="headertitle">
+<h1>r123array4x64 Struct Reference<br/>
+<small>
+[<a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123array4x64" -->
+<p><code>#include <<a class="el" href="array_8h_source.html">Random123/array.h</a>></code></p>
+
+<p><a href="structr123array4x64-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom">{ <a class="el" href="structr123array4x64.html#a904abc16c5828698aa8af5824b6a69c1aa1363fd51fd3dae2d8989711a11817ff">static_size</a> =  4
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#ae4a79be3ab80944a8bb6bc7ec7907061">value_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint64_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#adfc9f1209d12f855b9330ecccc8b6dd2">iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const uint64_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a2aa5637bebf5c9c753edbce62e889d77">const_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array4x64.html#ae4a79be3ab80944a8bb6bc7ec7907061">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a14ea48b972d46d9424c317db9698224f">reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const <a class="el" href="structr123array4x64.html#ae4a79be3ab80944a8bb6bc7ec7907061">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#ac2f21a458bf9008b831c553c5ae77508">const_reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af">size_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a3b1c7395f17992d8760fe93d3930db12">difference_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint64_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a08c39c2f70f4198a82cba99c0162e67c">pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const uint64_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#aa268882d3b4fb43ec9d82baf22d58cc5">const_pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123array4x64.html#adfc9f1209d12f855b9330ecccc8b6dd2">iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#acc93aa79ca040ce8fd0957ac86caa2f9">reverse_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123array4x64.html#a2aa5637bebf5c9c753edbce62e889d77">const_iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a8405a219a9c81f8f298298cffbfd46ac">const_reverse_iterator</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#a14ea48b972d46d9424c317db9698224f">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#adf867ee2ffc437a3f358431d3729a33d">operator[]</a> (<a class="el" href="structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#ac2f21a458bf9008b831c553c5ae77508">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a27c2001bf5af042aa450f17637646bd3">operator[]</a> (<a class="el" href="structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#a14ea48b972d46d9424c317db9698224f">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a5b60c8dcd20ce894109e346fdb4cbdb2">at</a> (<a class="el" href="structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#ac2f21a458bf9008b831c553c5ae77508">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a893d3db3d274fc15ac32bc7cbab0e82a">at</a> (<a class="el" href="structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a303c3feaf0783e99292c3220613ea903">size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#aad1329f21e3fdd5d25a29148db564b8a">max_size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a51e4ded187a3f1ebadd6b915da039c3f">empty</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#adfc9f1209d12f855b9330ecccc8b6dd2">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#ab78c67c429da6405f9d1ed5054635961">begin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#adfc9f1209d12f855b9330ecccc8b6dd2">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a298a04608a19dd91cb30bd7980ad796f">end</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#a2aa5637bebf5c9c753edbce62e889d77">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#acd133812dbe01892199683e003921b8b">begin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#a2aa5637bebf5c9c753edbce62e889d77">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a9fed923c39000c81f7f6b608d88953f9">end</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#a2aa5637bebf5c9c753edbce62e889d77">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#af716d2b14d1243870e8544ea2a3cece6">cbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#a2aa5637bebf5c9c753edbce62e889d77">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#af970ab87ce987c91097316bc0a0836ef">cend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#acc93aa79ca040ce8fd0957ac86caa2f9">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a102f75427ce01bea725da02b975834b5">rbegin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#a8405a219a9c81f8f298298cffbfd46ac">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a7ccc255ba0e1803080b117703dc3dc70">rbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#acc93aa79ca040ce8fd0957ac86caa2f9">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a71f59163070cb4cfd7ddda6f4f8576a1">rend</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#a8405a219a9c81f8f298298cffbfd46ac">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a25538a452f6e709bacfc9f49b7216280">rend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#a8405a219a9c81f8f298298cffbfd46ac">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a7712a006a2b567321a6ac9e84bb267d8">crbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#a8405a219a9c81f8f298298cffbfd46ac">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a907eb18b7392479a8ad6b2ddfaaecbd2">crend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#a08c39c2f70f4198a82cba99c0162e67c">pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a8567c3d6c4ee6c9cc2d8770d26e7fee9">data</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#aa268882d3b4fb43ec9d82baf22d58cc5">const_pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a31591d0bca18339d42c3a182a30457a0">data</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#a14ea48b972d46d9424c317db9698224f">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a975ecaf4c5332fc400dfc8d6d60d9035">front</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#ac2f21a458bf9008b831c553c5ae77508">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a256920b96d1d3a4c61489b145da7383e">front</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#a14ea48b972d46d9424c317db9698224f">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#abb40868277e8a943a0b5464985baceb5">back</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html#ac2f21a458bf9008b831c553c5ae77508">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a9006cfe7882bbc791a81a52f7cc0fd2d">back</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#afada659cc4a54a1416dca2522885cef1">operator==</a> (const <a class="el" href="structr123array4x64.html">r123array4x64</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#abf2fc58ddb163708c087f72921dfd11d">operator!=</a> (const <a class="el" href="structr123array4x64.html">r123array4x64</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a6580c77b7d68c0a76b5bef33e59ac662">fill</a> (const <a class="el" href="structr123array4x64.html#ae4a79be3ab80944a8bb6bc7ec7907061">value_type</a> &val)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a9845020f8799cbf04156e3114a4c9314">swap</a> (<a class="el" href="structr123array4x64.html">r123array4x64</a> &rhs)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html">r123array4x64</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#ac4187b4ae44913183b1c8f9b7654f8a9">incr</a> (uint64_t n=1)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr><td class="memTemplParams" colspan="2">template<typename SeedSeq > </td></tr>
+<tr><td class="memTemplItemLeft" align="right" valign="top">static <a class="el" href="structr123array4x64.html">r123array4x64</a> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#a6f0133930367a2260ed5a132bf737131">seed</a> (SeedSeq &ss)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#aae3a18410877c49f1058bc4d78a62f48">v</a> [4]</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array4x64.html">r123array4x64</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array4x64.html#af629d14b454f406cae4d128d9e05554d">incr_carefully</a> (uint64_t n)</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a> </dd></dl>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="a2aa5637bebf5c9c753edbce62e889d77"></a><!-- doxytag: member="r123array4x64::const_iterator" ref="a2aa5637bebf5c9c753edbce62e889d77" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const uint64_t* <a class="el" href="structr123array4x64.html#a2aa5637bebf5c9c753edbce62e889d77">r123array4x64::const_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa268882d3b4fb43ec9d82baf22d58cc5"></a><!-- doxytag: member="r123array4x64::const_pointer" ref="aa268882d3b4fb43ec9d82baf22d58cc5" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const uint64_t* <a class="el" href="structr123array4x64.html#aa268882d3b4fb43ec9d82baf22d58cc5">r123array4x64::const_pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac2f21a458bf9008b831c553c5ae77508"></a><!-- doxytag: member="r123array4x64::const_reference" ref="ac2f21a458bf9008b831c553c5ae77508" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const <a class="el" href="structr123array4x64.html#ae4a79be3ab80944a8bb6bc7ec7907061">value_type</a>& <a class="el" href="structr123array4x64.html#ac2f21a458bf9008b831c553c5ae77508">r123array4x64::const_reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8405a219a9c81f8f298298cffbfd46ac"></a><!-- doxytag: member="r123array4x64::const_reverse_iterator" ref="a8405a219a9c81f8f298298cffbfd46ac" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123array4x64.html#a2aa5637bebf5c9c753edbce62e889d77">const_iterator</a>> <a class="el" href="structr123array4x64.html#a8405a219a9c81f8f298298cffbfd46ac">r123array4x64::const_reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3b1c7395f17992d8760fe93d3930db12"></a><!-- doxytag: member="r123array4x64::difference_type" ref="a3b1c7395f17992d8760fe93d3930db12" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef ptrdiff_t <a class="el" href="structr123array4x64.html#a3b1c7395f17992d8760fe93d3930db12">r123array4x64::difference_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adfc9f1209d12f855b9330ecccc8b6dd2"></a><!-- doxytag: member="r123array4x64::iterator" ref="adfc9f1209d12f855b9330ecccc8b6dd2" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint64_t* <a class="el" href="structr123array4x64.html#adfc9f1209d12f855b9330ecccc8b6dd2">r123array4x64::iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a08c39c2f70f4198a82cba99c0162e67c"></a><!-- doxytag: member="r123array4x64::pointer" ref="a08c39c2f70f4198a82cba99c0162e67c" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint64_t* <a class="el" href="structr123array4x64.html#a08c39c2f70f4198a82cba99c0162e67c">r123array4x64::pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a14ea48b972d46d9424c317db9698224f"></a><!-- doxytag: member="r123array4x64::reference" ref="a14ea48b972d46d9424c317db9698224f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array4x64.html#ae4a79be3ab80944a8bb6bc7ec7907061">value_type</a>& <a class="el" href="structr123array4x64.html#a14ea48b972d46d9424c317db9698224f">r123array4x64::reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acc93aa79ca040ce8fd0957ac86caa2f9"></a><!-- doxytag: member="r123array4x64::reverse_iterator" ref="acc93aa79ca040ce8fd0957ac86caa2f9" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123array4x64.html#adfc9f1209d12f855b9330ecccc8b6dd2">iterator</a>> <a class="el" href="structr123array4x64.html#acc93aa79ca040ce8fd0957ac86caa2f9">r123array4x64::reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adbe34157dc62e7d2c988f12b06b273af"></a><!-- doxytag: member="r123array4x64::size_type" ref="adbe34157dc62e7d2c988f12b06b273af" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef size_t <a class="el" href="structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af">r123array4x64::size_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae4a79be3ab80944a8bb6bc7ec7907061"></a><!-- doxytag: member="r123array4x64::value_type" ref="ae4a79be3ab80944a8bb6bc7ec7907061" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint64_t <a class="el" href="structr123array4x64.html#ae4a79be3ab80944a8bb6bc7ec7907061">r123array4x64::value_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Enumeration Documentation</h2>
+<a class="anchor" id="a904abc16c5828698aa8af5824b6a69c1"></a><!-- doxytag: member="r123array4x64::@6" ref="a904abc16c5828698aa8af5824b6a69c1" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">anonymous enum</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="a904abc16c5828698aa8af5824b6a69c1aa1363fd51fd3dae2d8989711a11817ff"></a><!-- doxytag: member="static_size" ref="a904abc16c5828698aa8af5824b6a69c1aa1363fd51fd3dae2d8989711a11817ff" args="" -->static_size</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a5b60c8dcd20ce894109e346fdb4cbdb2"></a><!-- doxytag: member="r123array4x64::at" ref="a5b60c8dcd20ce894109e346fdb4cbdb2" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#a14ea48b972d46d9424c317db9698224f">reference</a> r123array4x64::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a893d3db3d274fc15ac32bc7cbab0e82a"></a><!-- doxytag: member="r123array4x64::at" ref="a893d3db3d274fc15ac32bc7cbab0e82a" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#ac2f21a458bf9008b831c553c5ae77508">const_reference</a> r123array4x64::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abb40868277e8a943a0b5464985baceb5"></a><!-- doxytag: member="r123array4x64::back" ref="abb40868277e8a943a0b5464985baceb5" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#a14ea48b972d46d9424c317db9698224f">reference</a> r123array4x64::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9006cfe7882bbc791a81a52f7cc0fd2d"></a><!-- doxytag: member="r123array4x64::back" ref="a9006cfe7882bbc791a81a52f7cc0fd2d" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#ac2f21a458bf9008b831c553c5ae77508">const_reference</a> r123array4x64::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab78c67c429da6405f9d1ed5054635961"></a><!-- doxytag: member="r123array4x64::begin" ref="ab78c67c429da6405f9d1ed5054635961" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#adfc9f1209d12f855b9330ecccc8b6dd2">iterator</a> r123array4x64::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acd133812dbe01892199683e003921b8b"></a><!-- doxytag: member="r123array4x64::begin" ref="acd133812dbe01892199683e003921b8b" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#a2aa5637bebf5c9c753edbce62e889d77">const_iterator</a> r123array4x64::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af716d2b14d1243870e8544ea2a3cece6"></a><!-- doxytag: member="r123array4x64::cbegin" ref="af716d2b14d1243870e8544ea2a3cece6" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#a2aa5637bebf5c9c753edbce62e889d77">const_iterator</a> r123array4x64::cbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af970ab87ce987c91097316bc0a0836ef"></a><!-- doxytag: member="r123array4x64::cend" ref="af970ab87ce987c91097316bc0a0836ef" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#a2aa5637bebf5c9c753edbce62e889d77">const_iterator</a> r123array4x64::cend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7712a006a2b567321a6ac9e84bb267d8"></a><!-- doxytag: member="r123array4x64::crbegin" ref="a7712a006a2b567321a6ac9e84bb267d8" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#a8405a219a9c81f8f298298cffbfd46ac">const_reverse_iterator</a> r123array4x64::crbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a907eb18b7392479a8ad6b2ddfaaecbd2"></a><!-- doxytag: member="r123array4x64::crend" ref="a907eb18b7392479a8ad6b2ddfaaecbd2" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#a8405a219a9c81f8f298298cffbfd46ac">const_reverse_iterator</a> r123array4x64::crend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8567c3d6c4ee6c9cc2d8770d26e7fee9"></a><!-- doxytag: member="r123array4x64::data" ref="a8567c3d6c4ee6c9cc2d8770d26e7fee9" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#a08c39c2f70f4198a82cba99c0162e67c">pointer</a> r123array4x64::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a31591d0bca18339d42c3a182a30457a0"></a><!-- doxytag: member="r123array4x64::data" ref="a31591d0bca18339d42c3a182a30457a0" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#aa268882d3b4fb43ec9d82baf22d58cc5">const_pointer</a> r123array4x64::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a51e4ded187a3f1ebadd6b915da039c3f"></a><!-- doxytag: member="r123array4x64::empty" ref="a51e4ded187a3f1ebadd6b915da039c3f" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array4x64::empty </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a298a04608a19dd91cb30bd7980ad796f"></a><!-- doxytag: member="r123array4x64::end" ref="a298a04608a19dd91cb30bd7980ad796f" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#adfc9f1209d12f855b9330ecccc8b6dd2">iterator</a> r123array4x64::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9fed923c39000c81f7f6b608d88953f9"></a><!-- doxytag: member="r123array4x64::end" ref="a9fed923c39000c81f7f6b608d88953f9" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#a2aa5637bebf5c9c753edbce62e889d77">const_iterator</a> r123array4x64::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6580c77b7d68c0a76b5bef33e59ac662"></a><!-- doxytag: member="r123array4x64::fill" ref="a6580c77b7d68c0a76b5bef33e59ac662" args="(const value_type &val)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array4x64::fill </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array4x64.html#ae4a79be3ab80944a8bb6bc7ec7907061">value_type</a> & </td>
+          <td class="paramname"> <em>val</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a975ecaf4c5332fc400dfc8d6d60d9035"></a><!-- doxytag: member="r123array4x64::front" ref="a975ecaf4c5332fc400dfc8d6d60d9035" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#a14ea48b972d46d9424c317db9698224f">reference</a> r123array4x64::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a256920b96d1d3a4c61489b145da7383e"></a><!-- doxytag: member="r123array4x64::front" ref="a256920b96d1d3a4c61489b145da7383e" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#ac2f21a458bf9008b831c553c5ae77508">const_reference</a> r123array4x64::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac4187b4ae44913183b1c8f9b7654f8a9"></a><!-- doxytag: member="r123array4x64::incr" ref="ac4187b4ae44913183b1c8f9b7654f8a9" args="(uint64_t n=1)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html">r123array4x64</a>& r123array4x64::incr </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em> = <code>1</code></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af629d14b454f406cae4d128d9e05554d"></a><!-- doxytag: member="r123array4x64::incr_carefully" ref="af629d14b454f406cae4d128d9e05554d" args="(uint64_t n)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html">r123array4x64</a>& r123array4x64::incr_carefully </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em></td>
+          <td> ) </td>
+          <td><code> [inline, protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aad1329f21e3fdd5d25a29148db564b8a"></a><!-- doxytag: member="r123array4x64::max_size" ref="aad1329f21e3fdd5d25a29148db564b8a" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af">size_type</a> r123array4x64::max_size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abf2fc58ddb163708c087f72921dfd11d"></a><!-- doxytag: member="r123array4x64::operator!=" ref="abf2fc58ddb163708c087f72921dfd11d" args="(const r123array4x64 &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array4x64::operator!= </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array4x64.html">r123array4x64</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afada659cc4a54a1416dca2522885cef1"></a><!-- doxytag: member="r123array4x64::operator==" ref="afada659cc4a54a1416dca2522885cef1" args="(const r123array4x64 &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array4x64::operator== </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array4x64.html">r123array4x64</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a27c2001bf5af042aa450f17637646bd3"></a><!-- doxytag: member="r123array4x64::operator[]" ref="a27c2001bf5af042aa450f17637646bd3" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#ac2f21a458bf9008b831c553c5ae77508">const_reference</a> r123array4x64::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adf867ee2ffc437a3f358431d3729a33d"></a><!-- doxytag: member="r123array4x64::operator[]" ref="adf867ee2ffc437a3f358431d3729a33d" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#a14ea48b972d46d9424c317db9698224f">reference</a> r123array4x64::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a102f75427ce01bea725da02b975834b5"></a><!-- doxytag: member="r123array4x64::rbegin" ref="a102f75427ce01bea725da02b975834b5" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#acc93aa79ca040ce8fd0957ac86caa2f9">reverse_iterator</a> r123array4x64::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7ccc255ba0e1803080b117703dc3dc70"></a><!-- doxytag: member="r123array4x64::rbegin" ref="a7ccc255ba0e1803080b117703dc3dc70" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#a8405a219a9c81f8f298298cffbfd46ac">const_reverse_iterator</a> r123array4x64::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a25538a452f6e709bacfc9f49b7216280"></a><!-- doxytag: member="r123array4x64::rend" ref="a25538a452f6e709bacfc9f49b7216280" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#a8405a219a9c81f8f298298cffbfd46ac">const_reverse_iterator</a> r123array4x64::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a71f59163070cb4cfd7ddda6f4f8576a1"></a><!-- doxytag: member="r123array4x64::rend" ref="a71f59163070cb4cfd7ddda6f4f8576a1" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#acc93aa79ca040ce8fd0957ac86caa2f9">reverse_iterator</a> r123array4x64::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6f0133930367a2260ed5a132bf737131"></a><!-- doxytag: member="r123array4x64::seed" ref="a6f0133930367a2260ed5a132bf737131" args="(SeedSeq &ss)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename SeedSeq > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array4x64.html">r123array4x64</a> r123array4x64::seed </td>
+          <td>(</td>
+          <td class="paramtype">SeedSeq & </td>
+          <td class="paramname"> <em>ss</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a303c3feaf0783e99292c3220613ea903"></a><!-- doxytag: member="r123array4x64::size" ref="a303c3feaf0783e99292c3220613ea903" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array4x64.html#adbe34157dc62e7d2c988f12b06b273af">size_type</a> r123array4x64::size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9845020f8799cbf04156e3114a4c9314"></a><!-- doxytag: member="r123array4x64::swap" ref="a9845020f8799cbf04156e3114a4c9314" args="(r123array4x64 &rhs)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array4x64::swap </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x64.html">r123array4x64</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="aae3a18410877c49f1058bc4d78a62f48"></a><!-- doxytag: member="r123array4x64::v" ref="aae3a18410877c49f1058bc4d78a62f48" args="[4]" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">uint64_t <a class="el" href="structr123array4x64.html#aae3a18410877c49f1058bc4d78a62f48">r123array4x64::v</a>[4]</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>Random123/<a class="el" href="array_8h_source.html">array.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array8x32-members.html b/lib/Random123-1.08/docs/html/structr123array8x32-members.html
new file mode 100644
index 0000000..682f83d
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array8x32-members.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123array8x32 Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123array8x32.html">r123array8x32</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#aa6c0788063f7e7b717aae2d9606cf302">at</a>(size_type i)</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a79f982be8c435215a5e812e88e500216">at</a>(size_type i) const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a1d4176e4ad6d70c98805e0c924d2df37">back</a>()</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a73f5b5012b1e6595f727ef88e60a53ac">back</a>() const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a7ae561c4d544e31f7bd2f256cb32f878">begin</a>()</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#ad924bdaf9facc3271ca2ae727cda23a3">begin</a>() const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a06c19ba6155e9c98892f5b98fb482c21">cbegin</a>() const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a0e1dfc305279a3439789dbdda8bfb6ae">cend</a>() const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#aa026dfdf1e2741c96db4343ceffd3c9f">const_iterator</a> typedef</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a621f6293254c6300b1d1b9835b7f30ba">const_pointer</a> typedef</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a2e7eda7e8940b37e17aef9b0efec3685">const_reference</a> typedef</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a207923147148d154b1659e257db44033">const_reverse_iterator</a> typedef</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a4ad5f793478a9658c52dc085b6c504ae">crbegin</a>() const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#ace0b6344aa8f0b9812a2610b6949a6b7">crend</a>() const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a78448bbbef69b3383eec4d78a814b4b2">data</a>()</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a0e2eb8cfaf36664411f19a6828339553">data</a>() const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#af8029821cb8a7b5a3500adb30d4f2326">difference_type</a> typedef</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#af2276e84924345efab98214be1691c83">empty</a>() const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a40c40a7a86150ec0e9d29739e0e649c3">end</a>()</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#acc1aa99ed89deb63c3ba7f71319ac10c">end</a>() const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a86481aecfb276687e9389cb6c43e1e8c">fill</a>(const value_type &val)</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#aeab7da4db40303e2104b79c2d8f3eced">front</a>()</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#aee2127f4a99f86b3fc7a9059e7d84e76">front</a>() const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a92ded324d4b7e2602766fa0c71fa5985">incr</a>(uint64_t n=1)</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a9e73ed67b7c577ebdb6c5e1f121fdc4f">incr_carefully</a>(uint64_t n)</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#aad8ff34e784d954a05f3f058facfb2be">iterator</a> typedef</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a0ea0af65a3b0a51c090ab6ef11f20c63">max_size</a>() const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#aed510e0472db9b00490c468d88e14bac">operator!=</a>(const r123array8x32 &rhs) const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#ae9ffa98997557c87b0a08b6ed2835155">operator==</a>(const r123array8x32 &rhs) const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a2b0d17077d419e9f296318161fcc0470">operator[]</a>(size_type i)</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#ace7ad1b4aca1ad419c373d9cff872805">operator[]</a>(size_type i) const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#aeaf3b46bbc571a21d61ad6ee6e760291">pointer</a> typedef</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a0a143a573df3282ba5b9cb2190047cca">rbegin</a>()</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a959345559456fbc9e7e72d03a72a032c">rbegin</a>() const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a4027cd913ec90428d5d0dcad23a5dc2b">reference</a> typedef</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#aa84fc75185aedca379d23c0220b5c64a">rend</a>()</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#afcf1ea68c3cd0ce7ff6de11d3030eb93">rend</a>() const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#acab5de900b99bad5f69009f48fa72235">reverse_iterator</a> typedef</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a93139b379ce88e16f75eb9edcf40b357">seed</a>(SeedSeq &ss)</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#aa4025fb7c1ef2c3376bdc9ae88b91553">size</a>() const </td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17">size_type</a> typedef</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#aae848a29e2a9b3229fc7063440885c4fa2270c17b2a56aea106facc9a22b62be6">static_size</a> enum value</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a04c88fca3a8cc3b579e9fc480629888e">swap</a>(r123array8x32 &rhs)</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#a7a84d2a924a271cc7b5f748023517d10">v</a></td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123array8x32.html#af47fd0d348b68dd7a2853c68eb32d8b7">value_type</a> typedef</td><td><a class="el" href="structr123array8x32.html">r123array8x32</a></td><td></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123array8x32.html b/lib/Random123-1.08/docs/html/structr123array8x32.html
new file mode 100644
index 0000000..7a5e887
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123array8x32.html
@@ -0,0 +1,892 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123array8x32 Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-types">Public Types</a> |
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-static-methods">Static Public Member Functions</a> |
+<a href="#pub-attribs">Public Attributes</a> |
+<a href="#pro-methods">Protected Member Functions</a>  </div>
+  <div class="headertitle">
+<h1>r123array8x32 Struct Reference<br/>
+<small>
+[<a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123array8x32" -->
+<p><code>#include <<a class="el" href="array_8h_source.html">Random123/array.h</a>></code></p>
+
+<p><a href="structr123array8x32-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom">{ <a class="el" href="structr123array8x32.html#aae848a29e2a9b3229fc7063440885c4fa2270c17b2a56aea106facc9a22b62be6">static_size</a> =  8
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#af47fd0d348b68dd7a2853c68eb32d8b7">value_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint32_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#aad8ff34e784d954a05f3f058facfb2be">iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const uint32_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#aa026dfdf1e2741c96db4343ceffd3c9f">const_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="structr123array8x32.html#af47fd0d348b68dd7a2853c68eb32d8b7">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a4027cd913ec90428d5d0dcad23a5dc2b">reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const <a class="el" href="structr123array8x32.html#af47fd0d348b68dd7a2853c68eb32d8b7">value_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a2e7eda7e8940b37e17aef9b0efec3685">const_reference</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17">size_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#af8029821cb8a7b5a3500adb30d4f2326">difference_type</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef uint32_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#aeaf3b46bbc571a21d61ad6ee6e760291">pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef const uint32_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a621f6293254c6300b1d1b9835b7f30ba">const_pointer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123array8x32.html#aad8ff34e784d954a05f3f058facfb2be">iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#acab5de900b99bad5f69009f48fa72235">reverse_iterator</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef std::reverse_iterator<br class="typebreak"/>
+< <a class="el" href="structr123array8x32.html#aa026dfdf1e2741c96db4343ceffd3c9f">const_iterator</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a207923147148d154b1659e257db44033">const_reverse_iterator</a></td></tr>
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#a4027cd913ec90428d5d0dcad23a5dc2b">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a2b0d17077d419e9f296318161fcc0470">operator[]</a> (<a class="el" href="structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#a2e7eda7e8940b37e17aef9b0efec3685">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#ace7ad1b4aca1ad419c373d9cff872805">operator[]</a> (<a class="el" href="structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#a4027cd913ec90428d5d0dcad23a5dc2b">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#aa6c0788063f7e7b717aae2d9606cf302">at</a> (<a class="el" href="structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17">size_type</a> i)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#a2e7eda7e8940b37e17aef9b0efec3685">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a79f982be8c435215a5e812e88e500216">at</a> (<a class="el" href="structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17">size_type</a> i) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#aa4025fb7c1ef2c3376bdc9ae88b91553">size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a0ea0af65a3b0a51c090ab6ef11f20c63">max_size</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#af2276e84924345efab98214be1691c83">empty</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#aad8ff34e784d954a05f3f058facfb2be">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a7ae561c4d544e31f7bd2f256cb32f878">begin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#aad8ff34e784d954a05f3f058facfb2be">iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a40c40a7a86150ec0e9d29739e0e649c3">end</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#aa026dfdf1e2741c96db4343ceffd3c9f">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#ad924bdaf9facc3271ca2ae727cda23a3">begin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#aa026dfdf1e2741c96db4343ceffd3c9f">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#acc1aa99ed89deb63c3ba7f71319ac10c">end</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#aa026dfdf1e2741c96db4343ceffd3c9f">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a06c19ba6155e9c98892f5b98fb482c21">cbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#aa026dfdf1e2741c96db4343ceffd3c9f">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a0e1dfc305279a3439789dbdda8bfb6ae">cend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#acab5de900b99bad5f69009f48fa72235">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a0a143a573df3282ba5b9cb2190047cca">rbegin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#a207923147148d154b1659e257db44033">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a959345559456fbc9e7e72d03a72a032c">rbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#acab5de900b99bad5f69009f48fa72235">reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#aa84fc75185aedca379d23c0220b5c64a">rend</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#a207923147148d154b1659e257db44033">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#afcf1ea68c3cd0ce7ff6de11d3030eb93">rend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#a207923147148d154b1659e257db44033">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a4ad5f793478a9658c52dc085b6c504ae">crbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#a207923147148d154b1659e257db44033">const_reverse_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#ace0b6344aa8f0b9812a2610b6949a6b7">crend</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#aeaf3b46bbc571a21d61ad6ee6e760291">pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a78448bbbef69b3383eec4d78a814b4b2">data</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#a621f6293254c6300b1d1b9835b7f30ba">const_pointer</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a0e2eb8cfaf36664411f19a6828339553">data</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#a4027cd913ec90428d5d0dcad23a5dc2b">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#aeab7da4db40303e2104b79c2d8f3eced">front</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#a2e7eda7e8940b37e17aef9b0efec3685">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#aee2127f4a99f86b3fc7a9059e7d84e76">front</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#a4027cd913ec90428d5d0dcad23a5dc2b">reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a1d4176e4ad6d70c98805e0c924d2df37">back</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html#a2e7eda7e8940b37e17aef9b0efec3685">const_reference</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a73f5b5012b1e6595f727ef88e60a53ac">back</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#ae9ffa98997557c87b0a08b6ed2835155">operator==</a> (const <a class="el" href="structr123array8x32.html">r123array8x32</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#aed510e0472db9b00490c468d88e14bac">operator!=</a> (const <a class="el" href="structr123array8x32.html">r123array8x32</a> &rhs) const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a86481aecfb276687e9389cb6c43e1e8c">fill</a> (const <a class="el" href="structr123array8x32.html#af47fd0d348b68dd7a2853c68eb32d8b7">value_type</a> &val)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a04c88fca3a8cc3b579e9fc480629888e">swap</a> (<a class="el" href="structr123array8x32.html">r123array8x32</a> &rhs)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html">r123array8x32</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a92ded324d4b7e2602766fa0c71fa5985">incr</a> (uint64_t n=1)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr><td class="memTemplParams" colspan="2">template<typename SeedSeq > </td></tr>
+<tr><td class="memTemplItemLeft" align="right" valign="top">static <a class="el" href="structr123array8x32.html">r123array8x32</a> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a93139b379ce88e16f75eb9edcf40b357">seed</a> (SeedSeq &ss)</td></tr>
+<tr><td colspan="2"><h2><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a7a84d2a924a271cc7b5f748023517d10">v</a> [8]</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123array8x32.html">r123array8x32</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123array8x32.html#a9e73ed67b7c577ebdb6c5e1f121fdc4f">incr_carefully</a> (uint64_t n)</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__arrayNxW.html">The r123arrayNxW classes</a> </dd></dl>
+<hr/><h2>Member Typedef Documentation</h2>
+<a class="anchor" id="aa026dfdf1e2741c96db4343ceffd3c9f"></a><!-- doxytag: member="r123array8x32::const_iterator" ref="aa026dfdf1e2741c96db4343ceffd3c9f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const uint32_t* <a class="el" href="structr123array8x32.html#aa026dfdf1e2741c96db4343ceffd3c9f">r123array8x32::const_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a621f6293254c6300b1d1b9835b7f30ba"></a><!-- doxytag: member="r123array8x32::const_pointer" ref="a621f6293254c6300b1d1b9835b7f30ba" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const uint32_t* <a class="el" href="structr123array8x32.html#a621f6293254c6300b1d1b9835b7f30ba">r123array8x32::const_pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2e7eda7e8940b37e17aef9b0efec3685"></a><!-- doxytag: member="r123array8x32::const_reference" ref="a2e7eda7e8940b37e17aef9b0efec3685" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef const <a class="el" href="structr123array8x32.html#af47fd0d348b68dd7a2853c68eb32d8b7">value_type</a>& <a class="el" href="structr123array8x32.html#a2e7eda7e8940b37e17aef9b0efec3685">r123array8x32::const_reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a207923147148d154b1659e257db44033"></a><!-- doxytag: member="r123array8x32::const_reverse_iterator" ref="a207923147148d154b1659e257db44033" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123array8x32.html#aa026dfdf1e2741c96db4343ceffd3c9f">const_iterator</a>> <a class="el" href="structr123array8x32.html#a207923147148d154b1659e257db44033">r123array8x32::const_reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af8029821cb8a7b5a3500adb30d4f2326"></a><!-- doxytag: member="r123array8x32::difference_type" ref="af8029821cb8a7b5a3500adb30d4f2326" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef ptrdiff_t <a class="el" href="structr123array8x32.html#af8029821cb8a7b5a3500adb30d4f2326">r123array8x32::difference_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aad8ff34e784d954a05f3f058facfb2be"></a><!-- doxytag: member="r123array8x32::iterator" ref="aad8ff34e784d954a05f3f058facfb2be" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint32_t* <a class="el" href="structr123array8x32.html#aad8ff34e784d954a05f3f058facfb2be">r123array8x32::iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aeaf3b46bbc571a21d61ad6ee6e760291"></a><!-- doxytag: member="r123array8x32::pointer" ref="aeaf3b46bbc571a21d61ad6ee6e760291" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint32_t* <a class="el" href="structr123array8x32.html#aeaf3b46bbc571a21d61ad6ee6e760291">r123array8x32::pointer</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4027cd913ec90428d5d0dcad23a5dc2b"></a><!-- doxytag: member="r123array8x32::reference" ref="a4027cd913ec90428d5d0dcad23a5dc2b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef <a class="el" href="structr123array8x32.html#af47fd0d348b68dd7a2853c68eb32d8b7">value_type</a>& <a class="el" href="structr123array8x32.html#a4027cd913ec90428d5d0dcad23a5dc2b">r123array8x32::reference</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acab5de900b99bad5f69009f48fa72235"></a><!-- doxytag: member="r123array8x32::reverse_iterator" ref="acab5de900b99bad5f69009f48fa72235" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::reverse_iterator<<a class="el" href="structr123array8x32.html#aad8ff34e784d954a05f3f058facfb2be">iterator</a>> <a class="el" href="structr123array8x32.html#acab5de900b99bad5f69009f48fa72235">r123array8x32::reverse_iterator</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa262b29c3d3fa22b07447b02c8c4be17"></a><!-- doxytag: member="r123array8x32::size_type" ref="aa262b29c3d3fa22b07447b02c8c4be17" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef size_t <a class="el" href="structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17">r123array8x32::size_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af47fd0d348b68dd7a2853c68eb32d8b7"></a><!-- doxytag: member="r123array8x32::value_type" ref="af47fd0d348b68dd7a2853c68eb32d8b7" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef uint32_t <a class="el" href="structr123array8x32.html#af47fd0d348b68dd7a2853c68eb32d8b7">r123array8x32::value_type</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Enumeration Documentation</h2>
+<a class="anchor" id="aae848a29e2a9b3229fc7063440885c4f"></a><!-- doxytag: member="r123array8x32::@3" ref="aae848a29e2a9b3229fc7063440885c4f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">anonymous enum</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" id="aae848a29e2a9b3229fc7063440885c4fa2270c17b2a56aea106facc9a22b62be6"></a><!-- doxytag: member="static_size" ref="aae848a29e2a9b3229fc7063440885c4fa2270c17b2a56aea106facc9a22b62be6" args="" -->static_size</em> </td><td>
+</td></tr>
+</table>
+</dd>
+</dl>
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="aa6c0788063f7e7b717aae2d9606cf302"></a><!-- doxytag: member="r123array8x32::at" ref="aa6c0788063f7e7b717aae2d9606cf302" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#a4027cd913ec90428d5d0dcad23a5dc2b">reference</a> r123array8x32::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a79f982be8c435215a5e812e88e500216"></a><!-- doxytag: member="r123array8x32::at" ref="a79f982be8c435215a5e812e88e500216" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#a2e7eda7e8940b37e17aef9b0efec3685">const_reference</a> r123array8x32::at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1d4176e4ad6d70c98805e0c924d2df37"></a><!-- doxytag: member="r123array8x32::back" ref="a1d4176e4ad6d70c98805e0c924d2df37" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#a4027cd913ec90428d5d0dcad23a5dc2b">reference</a> r123array8x32::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a73f5b5012b1e6595f727ef88e60a53ac"></a><!-- doxytag: member="r123array8x32::back" ref="a73f5b5012b1e6595f727ef88e60a53ac" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#a2e7eda7e8940b37e17aef9b0efec3685">const_reference</a> r123array8x32::back </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7ae561c4d544e31f7bd2f256cb32f878"></a><!-- doxytag: member="r123array8x32::begin" ref="a7ae561c4d544e31f7bd2f256cb32f878" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#aad8ff34e784d954a05f3f058facfb2be">iterator</a> r123array8x32::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad924bdaf9facc3271ca2ae727cda23a3"></a><!-- doxytag: member="r123array8x32::begin" ref="ad924bdaf9facc3271ca2ae727cda23a3" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#aa026dfdf1e2741c96db4343ceffd3c9f">const_iterator</a> r123array8x32::begin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a06c19ba6155e9c98892f5b98fb482c21"></a><!-- doxytag: member="r123array8x32::cbegin" ref="a06c19ba6155e9c98892f5b98fb482c21" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#aa026dfdf1e2741c96db4343ceffd3c9f">const_iterator</a> r123array8x32::cbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0e1dfc305279a3439789dbdda8bfb6ae"></a><!-- doxytag: member="r123array8x32::cend" ref="a0e1dfc305279a3439789dbdda8bfb6ae" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#aa026dfdf1e2741c96db4343ceffd3c9f">const_iterator</a> r123array8x32::cend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4ad5f793478a9658c52dc085b6c504ae"></a><!-- doxytag: member="r123array8x32::crbegin" ref="a4ad5f793478a9658c52dc085b6c504ae" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#a207923147148d154b1659e257db44033">const_reverse_iterator</a> r123array8x32::crbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ace0b6344aa8f0b9812a2610b6949a6b7"></a><!-- doxytag: member="r123array8x32::crend" ref="ace0b6344aa8f0b9812a2610b6949a6b7" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#a207923147148d154b1659e257db44033">const_reverse_iterator</a> r123array8x32::crend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a78448bbbef69b3383eec4d78a814b4b2"></a><!-- doxytag: member="r123array8x32::data" ref="a78448bbbef69b3383eec4d78a814b4b2" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#aeaf3b46bbc571a21d61ad6ee6e760291">pointer</a> r123array8x32::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0e2eb8cfaf36664411f19a6828339553"></a><!-- doxytag: member="r123array8x32::data" ref="a0e2eb8cfaf36664411f19a6828339553" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#a621f6293254c6300b1d1b9835b7f30ba">const_pointer</a> r123array8x32::data </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af2276e84924345efab98214be1691c83"></a><!-- doxytag: member="r123array8x32::empty" ref="af2276e84924345efab98214be1691c83" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array8x32::empty </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a40c40a7a86150ec0e9d29739e0e649c3"></a><!-- doxytag: member="r123array8x32::end" ref="a40c40a7a86150ec0e9d29739e0e649c3" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#aad8ff34e784d954a05f3f058facfb2be">iterator</a> r123array8x32::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acc1aa99ed89deb63c3ba7f71319ac10c"></a><!-- doxytag: member="r123array8x32::end" ref="acc1aa99ed89deb63c3ba7f71319ac10c" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#aa026dfdf1e2741c96db4343ceffd3c9f">const_iterator</a> r123array8x32::end </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a86481aecfb276687e9389cb6c43e1e8c"></a><!-- doxytag: member="r123array8x32::fill" ref="a86481aecfb276687e9389cb6c43e1e8c" args="(const value_type &val)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array8x32::fill </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array8x32.html#af47fd0d348b68dd7a2853c68eb32d8b7">value_type</a> & </td>
+          <td class="paramname"> <em>val</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aeab7da4db40303e2104b79c2d8f3eced"></a><!-- doxytag: member="r123array8x32::front" ref="aeab7da4db40303e2104b79c2d8f3eced" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#a4027cd913ec90428d5d0dcad23a5dc2b">reference</a> r123array8x32::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aee2127f4a99f86b3fc7a9059e7d84e76"></a><!-- doxytag: member="r123array8x32::front" ref="aee2127f4a99f86b3fc7a9059e7d84e76" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#a2e7eda7e8940b37e17aef9b0efec3685">const_reference</a> r123array8x32::front </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a92ded324d4b7e2602766fa0c71fa5985"></a><!-- doxytag: member="r123array8x32::incr" ref="a92ded324d4b7e2602766fa0c71fa5985" args="(uint64_t n=1)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html">r123array8x32</a>& r123array8x32::incr </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em> = <code>1</code></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9e73ed67b7c577ebdb6c5e1f121fdc4f"></a><!-- doxytag: member="r123array8x32::incr_carefully" ref="a9e73ed67b7c577ebdb6c5e1f121fdc4f" args="(uint64_t n)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html">r123array8x32</a>& r123array8x32::incr_carefully </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em></td>
+          <td> ) </td>
+          <td><code> [inline, protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0ea0af65a3b0a51c090ab6ef11f20c63"></a><!-- doxytag: member="r123array8x32::max_size" ref="a0ea0af65a3b0a51c090ab6ef11f20c63" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17">size_type</a> r123array8x32::max_size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aed510e0472db9b00490c468d88e14bac"></a><!-- doxytag: member="r123array8x32::operator!=" ref="aed510e0472db9b00490c468d88e14bac" args="(const r123array8x32 &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array8x32::operator!= </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array8x32.html">r123array8x32</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae9ffa98997557c87b0a08b6ed2835155"></a><!-- doxytag: member="r123array8x32::operator==" ref="ae9ffa98997557c87b0a08b6ed2835155" args="(const r123array8x32 &rhs) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool r123array8x32::operator== </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structr123array8x32.html">r123array8x32</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ace7ad1b4aca1ad419c373d9cff872805"></a><!-- doxytag: member="r123array8x32::operator[]" ref="ace7ad1b4aca1ad419c373d9cff872805" args="(size_type i) const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#a2e7eda7e8940b37e17aef9b0efec3685">const_reference</a> r123array8x32::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2b0d17077d419e9f296318161fcc0470"></a><!-- doxytag: member="r123array8x32::operator[]" ref="a2b0d17077d419e9f296318161fcc0470" args="(size_type i)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#a4027cd913ec90428d5d0dcad23a5dc2b">reference</a> r123array8x32::operator[] </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17">size_type</a> </td>
+          <td class="paramname"> <em>i</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0a143a573df3282ba5b9cb2190047cca"></a><!-- doxytag: member="r123array8x32::rbegin" ref="a0a143a573df3282ba5b9cb2190047cca" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#acab5de900b99bad5f69009f48fa72235">reverse_iterator</a> r123array8x32::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a959345559456fbc9e7e72d03a72a032c"></a><!-- doxytag: member="r123array8x32::rbegin" ref="a959345559456fbc9e7e72d03a72a032c" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#a207923147148d154b1659e257db44033">const_reverse_iterator</a> r123array8x32::rbegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afcf1ea68c3cd0ce7ff6de11d3030eb93"></a><!-- doxytag: member="r123array8x32::rend" ref="afcf1ea68c3cd0ce7ff6de11d3030eb93" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#a207923147148d154b1659e257db44033">const_reverse_iterator</a> r123array8x32::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa84fc75185aedca379d23c0220b5c64a"></a><!-- doxytag: member="r123array8x32::rend" ref="aa84fc75185aedca379d23c0220b5c64a" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#acab5de900b99bad5f69009f48fa72235">reverse_iterator</a> r123array8x32::rend </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a93139b379ce88e16f75eb9edcf40b357"></a><!-- doxytag: member="r123array8x32::seed" ref="a93139b379ce88e16f75eb9edcf40b357" args="(SeedSeq &ss)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename SeedSeq > </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array8x32.html">r123array8x32</a> r123array8x32::seed </td>
+          <td>(</td>
+          <td class="paramtype">SeedSeq & </td>
+          <td class="paramname"> <em>ss</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa4025fb7c1ef2c3376bdc9ae88b91553"></a><!-- doxytag: member="r123array8x32::size" ref="aa4025fb7c1ef2c3376bdc9ae88b91553" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123array8x32.html#aa262b29c3d3fa22b07447b02c8c4be17">size_type</a> r123array8x32::size </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a04c88fca3a8cc3b579e9fc480629888e"></a><!-- doxytag: member="r123array8x32::swap" ref="a04c88fca3a8cc3b579e9fc480629888e" args="(r123array8x32 &rhs)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void r123array8x32::swap </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array8x32.html">r123array8x32</a> & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="a7a84d2a924a271cc7b5f748023517d10"></a><!-- doxytag: member="r123array8x32::v" ref="a7a84d2a924a271cc7b5f748023517d10" args="[8]" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">uint32_t <a class="el" href="structr123array8x32.html#a7a84d2a924a271cc7b5f748023517d10">r123array8x32::v</a>[8]</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>Random123/<a class="el" href="array_8h_source.html">array.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123m128i-members.html b/lib/Random123-1.08/docs/html/structr123m128i-members.html
new file mode 100644
index 0000000..e8e3834
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123m128i-members.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>r123m128i Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="structr123m128i.html">r123m128i</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a></td><td><a class="el" href="structr123m128i.html">r123m128i</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123m128i.html#a80a5c24f76fec61b3ab0ed0e0353cfb7">operator __m128i</a>() const </td><td><a class="el" href="structr123m128i.html">r123m128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123m128i.html#ae5788785c2ce7f7ca6ff8dd4377771f3">operator const void *</a>() const </td><td><a class="el" href="structr123m128i.html">r123m128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123m128i.html#a9842fbc85102e0019cc58d97c28e2d02">operator=</a>(const __m128i &rhs)</td><td><a class="el" href="structr123m128i.html">r123m128i</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="structr123m128i.html#a0da7ae920bce1b75efb91017ab6bc37c">operator=</a>(uint64_t n)</td><td><a class="el" href="structr123m128i.html">r123m128i</a></td><td><code> [inline]</code></td></tr>
+</table></div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/structr123m128i.html b/lib/Random123-1.08/docs/html/structr123m128i.html
new file mode 100644
index 0000000..273ec3f
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/structr123m128i.html
@@ -0,0 +1,183 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: r123m128i Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-attribs">Public Attributes</a>  </div>
+  <div class="headertitle">
+<h1>r123m128i Struct Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="r123m128i" -->
+<p><code>#include <<a class="el" href="sse_8h_source.html">Random123/features/sse.h</a>></code></p>
+
+<p><a href="structr123m128i-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">r123m128i</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123m128i.html#a9842fbc85102e0019cc58d97c28e2d02">operator=</a> (const __m128i &rhs)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structr123m128i.html">r123m128i</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123m128i.html#a0da7ae920bce1b75efb91017ab6bc37c">operator=</a> (uint64_t n)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123m128i.html#ae5788785c2ce7f7ca6ff8dd4377771f3">operator const void *</a> () const </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123m128i.html#a80a5c24f76fec61b3ab0ed0e0353cfb7">operator __m128i</a> () const </td></tr>
+<tr><td colspan="2"><h2><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">__m128i </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">m</a></td></tr>
+</table>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a80a5c24f76fec61b3ab0ed0e0353cfb7"></a><!-- doxytag: member="r123m128i::operator __m128i" ref="a80a5c24f76fec61b3ab0ed0e0353cfb7" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">r123m128i::operator __m128i </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae5788785c2ce7f7ca6ff8dd4377771f3"></a><!-- doxytag: member="r123m128i::operator const void *" ref="ae5788785c2ce7f7ca6ff8dd4377771f3" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">r123m128i::operator const void * </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td> ) </td>
+          <td> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9842fbc85102e0019cc58d97c28e2d02"></a><!-- doxytag: member="r123m128i::operator=" ref="a9842fbc85102e0019cc58d97c28e2d02" args="(const __m128i &rhs)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">r123m128i</a>& r123m128i::operator= </td>
+          <td>(</td>
+          <td class="paramtype">const __m128i & </td>
+          <td class="paramname"> <em>rhs</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0da7ae920bce1b75efb91017ab6bc37c"></a><!-- doxytag: member="r123m128i::operator=" ref="a0da7ae920bce1b75efb91017ab6bc37c" args="(uint64_t n)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structr123m128i.html">r123m128i</a>& r123m128i::operator= </td>
+          <td>(</td>
+          <td class="paramtype">uint64_t </td>
+          <td class="paramname"> <em>n</em></td>
+          <td> ) </td>
+          <td><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="a9b9908268281aace8028a3f34980634d"></a><!-- doxytag: member="r123m128i::m" ref="a9b9908268281aace8028a3f34980634d" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">__m128i <a class="el" href="structr123m128i.html#a9b9908268281aace8028a3f34980634d">r123m128i::m</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>Random123/features/<a class="el" href="sse_8h_source.html">sse.h</a></li>
+</ul>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/tab_a.png b/lib/Random123-1.08/docs/html/tab_a.png
new file mode 100644
index 0000000..2d99ef2
Binary files /dev/null and b/lib/Random123-1.08/docs/html/tab_a.png differ
diff --git a/lib/Random123-1.08/docs/html/tab_b.png b/lib/Random123-1.08/docs/html/tab_b.png
new file mode 100644
index 0000000..b2c3d2b
Binary files /dev/null and b/lib/Random123-1.08/docs/html/tab_b.png differ
diff --git a/lib/Random123-1.08/docs/html/tab_h.png b/lib/Random123-1.08/docs/html/tab_h.png
new file mode 100644
index 0000000..c11f48f
Binary files /dev/null and b/lib/Random123-1.08/docs/html/tab_h.png differ
diff --git a/lib/Random123-1.08/docs/html/tab_s.png b/lib/Random123-1.08/docs/html/tab_s.png
new file mode 100644
index 0000000..978943a
Binary files /dev/null and b/lib/Random123-1.08/docs/html/tab_s.png differ
diff --git a/lib/Random123-1.08/docs/html/tabs.css b/lib/Random123-1.08/docs/html/tabs.css
new file mode 100644
index 0000000..2192056
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/tabs.css
@@ -0,0 +1,59 @@
+.tabs, .tabs2, .tabs3 {
+    background-image: url('tab_b.png');
+    width: 100%;
+    z-index: 101;
+    font-size: 13px;
+}
+
+.tabs2 {
+    font-size: 10px;
+}
+.tabs3 {
+    font-size: 9px;
+}
+
+.tablist {
+    margin: 0;
+    padding: 0;
+    display: table;
+}
+
+.tablist li {
+    float: left;
+    display: table-cell;
+    background-image: url('tab_b.png');
+    line-height: 36px;
+    list-style: none;
+}
+
+.tablist a {
+    display: block;
+    padding: 0 20px;
+    font-weight: bold;
+    background-image:url('tab_s.png');
+    background-repeat:no-repeat;
+    background-position:right;
+    color: #283A5D;
+    text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+    text-decoration: none;
+    outline: none;
+}
+
+.tabs3 .tablist a {
+    padding: 0 10px;
+}
+
+.tablist a:hover {
+    background-image: url('tab_h.png');
+    background-repeat:repeat-x;
+    color: #fff;
+    text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+    text-decoration: none;
+}
+
+.tablist li.current a {
+    background-image: url('tab_a.png');
+    background-repeat:repeat-x;
+    color: #fff;
+    text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
diff --git a/lib/Random123-1.08/docs/html/threefry_8h.html b/lib/Random123-1.08/docs/html/threefry_8h.html
new file mode 100644
index 0000000..87713da
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/threefry_8h.html
@@ -0,0 +1,728 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/threefry.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> |
+<a href="#namespaces">Namespaces</a> |
+<a href="#define-members">Defines</a> |
+<a href="#typedef-members">Typedefs</a> |
+<a href="#enum-members">Enumerations</a> |
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<h1>Random123/threefry.h File Reference</h1>  </div>
+</div>
+<div class="contents">
+<code>#include "<a class="el" href="compilerfeatures_8h_source.html">features/compilerfeatures.h</a>"</code><br/>
+<code>#include "<a class="el" href="array_8h_source.html">array.h</a>"</code><br/>
+
+<p><a href="threefry_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry2x32__R.html">r123::Threefry2x32_R< R ></a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry4x32__R.html">r123::Threefry4x32_R< R ></a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry2x64__R.html">r123::Threefry2x64_R< R ></a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="structr123_1_1Threefry4x64__R.html">r123::Threefry4x64_R< R ></a></td></tr>
+<tr><td colspan="2"><h2><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacer123.html">r123</a></td></tr>
+<tr><td colspan="2"><h2><a name="define-members"></a>
+Defines</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#a52e1635889bbf08009646f22897e07fc">threefry2x32</a>(c, k)   threefry2x32_R(threefry2x32_rounds, c, k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#aaaecd189b32b0081c6a3c2cb46577e23">threefry4x32</a>(c, k)   threefry4x32_R(threefry4x32_rounds, c, k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#acda3cc1cd02719e1e3d6cfdf7ce0c4c8">threefry2x64</a>(c, k)   threefry2x64_R(threefry2x64_rounds, c, k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#a992029974a22f14e0ef29a862ede2b8d">threefry4x64</a>(c, k)   threefry4x64_R(threefry4x64_rounds, c, k)</td></tr>
+<tr><td colspan="2"><h2><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array2x64.html">r123array2x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#a13c6df8879e7c13605fc1dc67cb2173b">threefry2x64_ctr_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array2x64.html">r123array2x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#a31a08f696af23b0e339126bc64a78812">threefry2x64_key_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array2x64.html">r123array2x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#abb918225d16fcdf0b2659e2096d182b9">threefry2x64_ukey_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array2x32.html">r123array2x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#ac0724455e1e9218f982501247d384833">threefry2x32_ctr_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array2x32.html">r123array2x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#a9ebab1ff37a7c983a4d5af114fb8f1c7">threefry2x32_key_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array2x32.html">r123array2x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#a642ffe8cacdd9e8f6b376bdffff36d24">threefry2x32_ukey_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x64.html">r123array4x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#a3296098832bc3a243f40078c1b93592e">threefry4x64_ctr_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x64.html">r123array4x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#ad51f07c7dc47238532cbc05e89f5cef9">threefry4x64_key_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x64.html">r123array4x64</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#a6b4db94d5185220d4fcec72f92a391ad">threefry4x64_ukey_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#aa72e480598b54b5bbc640a101f9cbe6e">threefry4x32_ctr_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#af332bdaec196cee5378cab4fd049ecde">threefry4x32_key_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#ad65418f4e2c8d8df38059aabc2cc98b6">threefry4x32_ukey_t</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef Threefry2x32_R<br class="typebreak"/>
+< threefry2x32_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#ga1c32939b65f84966c93677f4382ea36d">r123::Threefry2x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef Threefry4x32_R<br class="typebreak"/>
+< threefry4x32_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#gacb09a2dcfb7389769f0c58f45f132aaa">r123::Threefry4x32</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef Threefry2x64_R<br class="typebreak"/>
+< threefry2x64_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#ga2b54dd1b0d20f09239be5f8757f1f3db">r123::Threefry2x64</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">typedef Threefry4x64_R<br class="typebreak"/>
+< threefry4x64_rounds > </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#gae17c98bddf067365508ed0717f865e8b">r123::Threefry4x64</a></td></tr>
+<tr><td colspan="2"><h2><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#gae4df1e52db01acafb28d9c6c25a41071">r123_enum_threefry2x64</a> { <a class="el" href="group__ThreefryNxW.html#ggae4df1e52db01acafb28d9c6c25a41071a61579c86759ab497dbfc895f2fe6ec7c">threefry2x64_rounds</a> =  20
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#gae1c47baba4367dd47d68025d23ae4775">r123_enum_threefry2x32</a> { <a class="el" href="group__ThreefryNxW.html#ggae1c47baba4367dd47d68025d23ae4775a5c6f9a5f3ae1c3700938a3fca5f5821b">threefry2x32_rounds</a> =  20
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#ga6379a4a73e85bc36235907a326945acc">r123_enum_threefry4x64</a> { <a class="el" href="group__ThreefryNxW.html#gga6379a4a73e85bc36235907a326945acca9cdd4629047775ebe339ac9e9dd0ad65">threefry4x64_rounds</a> =  20
+ }</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__ThreefryNxW.html#ga027cd15620ecab867c6af8bb065b189b">r123_enum_threefry4x32</a> { <a class="el" href="group__ThreefryNxW.html#gga027cd15620ecab867c6af8bb065b189ba36063dd986ca2ccd28209c7b4bf711d7">threefry4x32_rounds</a> =  20
+ }</td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array2x64.html">threefry2x64_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#ac14fcf731b175a1cec85a80606ed5f04">threefry2x64keyinit</a> (<a class="el" href="structr123array2x64.html">threefry2x64_ukey_t</a> uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array2x64.html">threefry2x64_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#abe5e028454aef3f2bc459e5db05e0e04">threefry2x64_R</a> (unsigned int Nrounds, <a class="el" href="structr123array2x64.html">threefry2x64_ctr_t</a> in, <a class="el" href="structr123array2x64.html">threefry2x64_key_t</a> k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array2x64.html">threefry2x64_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#aea6a4bd5c80354a4f575c9bec2702172">threefry2x64</a> (<a class="el" href="structr123array2x64.html">threefry2x64_ctr_t</a> in, <a class="el" href="structr123array2x64.html">threefry2x64_key_t</a> k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array2x32.html">threefry2x32_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#a5dbdf6e314925cd676da9f97013aefe4">threefry2x32keyinit</a> (<a class="el" href="structr123array2x32.html">threefry2x32_ukey_t</a> uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array2x32.html">threefry2x32_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#ae8eee0d74a087c6cbc112af11b884501">threefry2x32_R</a> (unsigned int Nrounds, <a class="el" href="structr123array2x32.html">threefry2x32_ctr_t</a> in, <a class="el" href="structr123array2x32.html">threefry2x32_key_t</a> k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array2x32.html">threefry2x32_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#af98f648fb8e458ff0c6825cb903734f2">threefry2x32</a> (<a class="el" href="structr123array2x32.html">threefry2x32_ctr_t</a> in, <a class="el" href="structr123array2x32.html">threefry2x32_key_t</a> k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array4x64.html">threefry4x64_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#aeed27be75e75bfffb0bf8c6333f71b10">threefry4x64keyinit</a> (<a class="el" href="structr123array4x64.html">threefry4x64_ukey_t</a> uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array4x64.html">threefry4x64_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#a2e04c3f1ae28c4833444bfafcf22c47f">threefry4x64_R</a> (unsigned int Nrounds, <a class="el" href="structr123array4x64.html">threefry4x64_ctr_t</a> in, <a class="el" href="structr123array4x64.html">threefry4x64_key_t</a> k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array4x64.html">threefry4x64_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#a382d18a49002d2a5e2b2f06d58669d70">threefry4x64</a> (<a class="el" href="structr123array4x64.html">threefry4x64_ctr_t</a> in, <a class="el" href="structr123array4x64.html">threefry4x64_key_t</a> k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array4x32.html">threefry4x32_key_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#a458f442301e620096d73efd479ab8591">threefry4x32keyinit</a> (<a class="el" href="structr123array4x32.html">threefry4x32_ukey_t</a> uk)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array4x32.html">threefry4x32_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#a79eb6922e7404e224893f7f723fc240c">threefry4x32_R</a> (unsigned int Nrounds, <a class="el" href="structr123array4x32.html">threefry4x32_ctr_t</a> in, <a class="el" href="structr123array4x32.html">threefry4x32_key_t</a> k)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="structr123array4x32.html">threefry4x32_ctr_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="threefry_8h.html#a1636cce9de54f919e8952a42b7f397fd">threefry4x32</a> (<a class="el" href="structr123array4x32.html">threefry4x32_ctr_t</a> in, <a class="el" href="structr123array4x32.html">threefry4x32_key_t</a> k)</td></tr>
+</table>
+<hr/><h2>Define Documentation</h2>
+<a class="anchor" id="a52e1635889bbf08009646f22897e07fc"></a><!-- doxytag: member="threefry.h::threefry2x32" ref="a52e1635889bbf08009646f22897e07fc" args="(c, k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define threefry2x32</td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname">k</td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td>   threefry2x32_R(threefry2x32_rounds, c, k)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acda3cc1cd02719e1e3d6cfdf7ce0c4c8"></a><!-- doxytag: member="threefry.h::threefry2x64" ref="acda3cc1cd02719e1e3d6cfdf7ce0c4c8" args="(c, k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define threefry2x64</td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname">k</td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td>   threefry2x64_R(threefry2x64_rounds, c, k)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aaaecd189b32b0081c6a3c2cb46577e23"></a><!-- doxytag: member="threefry.h::threefry4x32" ref="aaaecd189b32b0081c6a3c2cb46577e23" args="(c, k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define threefry4x32</td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname">k</td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td>   threefry4x32_R(threefry4x32_rounds, c, k)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a992029974a22f14e0ef29a862ede2b8d"></a><!-- doxytag: member="threefry.h::threefry4x64" ref="a992029974a22f14e0ef29a862ede2b8d" args="(c, k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define threefry4x64</td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname">c, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"> </td>
+          <td class="paramname">k</td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td>   threefry4x64_R(threefry4x64_rounds, c, k)</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Typedef Documentation</h2>
+<a class="anchor" id="ac0724455e1e9218f982501247d384833"></a><!-- doxytag: member="threefry.h::threefry2x32_ctr_t" ref="ac0724455e1e9218f982501247d384833" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array2x32.html">r123array2x32</a> <a class="el" href="structr123array2x32.html">threefry2x32_ctr_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9ebab1ff37a7c983a4d5af114fb8f1c7"></a><!-- doxytag: member="threefry.h::threefry2x32_key_t" ref="a9ebab1ff37a7c983a4d5af114fb8f1c7" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array2x32.html">r123array2x32</a> <a class="el" href="structr123array2x32.html">threefry2x32_key_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a642ffe8cacdd9e8f6b376bdffff36d24"></a><!-- doxytag: member="threefry.h::threefry2x32_ukey_t" ref="a642ffe8cacdd9e8f6b376bdffff36d24" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array2x32.html">r123array2x32</a> <a class="el" href="structr123array2x32.html">threefry2x32_ukey_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a13c6df8879e7c13605fc1dc67cb2173b"></a><!-- doxytag: member="threefry.h::threefry2x64_ctr_t" ref="a13c6df8879e7c13605fc1dc67cb2173b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array2x64.html">r123array2x64</a> <a class="el" href="structr123array2x64.html">threefry2x64_ctr_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a31a08f696af23b0e339126bc64a78812"></a><!-- doxytag: member="threefry.h::threefry2x64_key_t" ref="a31a08f696af23b0e339126bc64a78812" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array2x64.html">r123array2x64</a> <a class="el" href="structr123array2x64.html">threefry2x64_key_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abb918225d16fcdf0b2659e2096d182b9"></a><!-- doxytag: member="threefry.h::threefry2x64_ukey_t" ref="abb918225d16fcdf0b2659e2096d182b9" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array2x64.html">r123array2x64</a> <a class="el" href="structr123array2x64.html">threefry2x64_ukey_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa72e480598b54b5bbc640a101f9cbe6e"></a><!-- doxytag: member="threefry.h::threefry4x32_ctr_t" ref="aa72e480598b54b5bbc640a101f9cbe6e" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> <a class="el" href="structr123array4x32.html">threefry4x32_ctr_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af332bdaec196cee5378cab4fd049ecde"></a><!-- doxytag: member="threefry.h::threefry4x32_key_t" ref="af332bdaec196cee5378cab4fd049ecde" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> <a class="el" href="structr123array4x32.html">threefry4x32_key_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad65418f4e2c8d8df38059aabc2cc98b6"></a><!-- doxytag: member="threefry.h::threefry4x32_ukey_t" ref="ad65418f4e2c8d8df38059aabc2cc98b6" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array4x32.html">r123array4x32</a> <a class="el" href="structr123array4x32.html">threefry4x32_ukey_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3296098832bc3a243f40078c1b93592e"></a><!-- doxytag: member="threefry.h::threefry4x64_ctr_t" ref="a3296098832bc3a243f40078c1b93592e" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array4x64.html">r123array4x64</a> <a class="el" href="structr123array4x64.html">threefry4x64_ctr_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad51f07c7dc47238532cbc05e89f5cef9"></a><!-- doxytag: member="threefry.h::threefry4x64_key_t" ref="ad51f07c7dc47238532cbc05e89f5cef9" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array4x64.html">r123array4x64</a> <a class="el" href="structr123array4x64.html">threefry4x64_key_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6b4db94d5185220d4fcec72f92a391ad"></a><!-- doxytag: member="threefry.h::threefry4x64_ukey_t" ref="a6b4db94d5185220d4fcec72f92a391ad" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structr123array4x64.html">r123array4x64</a> <a class="el" href="structr123array4x64.html">threefry4x64_ukey_t</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="af98f648fb8e458ff0c6825cb903734f2"></a><!-- doxytag: member="threefry.h::threefry2x32" ref="af98f648fb8e458ff0c6825cb903734f2" args="(threefry2x32_ctr_t in, threefry2x32_key_t k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array2x32.html">threefry2x32_ctr_t</a> threefry2x32 </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html">threefry2x32_ctr_t</a> </td>
+          <td class="paramname"> <em>in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html">threefry2x32_key_t</a> </td>
+          <td class="paramname"> <em>k</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae8eee0d74a087c6cbc112af11b884501"></a><!-- doxytag: member="threefry.h::threefry2x32_R" ref="ae8eee0d74a087c6cbc112af11b884501" args="(unsigned int Nrounds, threefry2x32_ctr_t in, threefry2x32_key_t k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array2x32.html">threefry2x32_ctr_t</a> threefry2x32_R </td>
+          <td>(</td>
+          <td class="paramtype">unsigned int </td>
+          <td class="paramname"> <em>Nrounds</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html">threefry2x32_ctr_t</a> </td>
+          <td class="paramname"> <em>in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html">threefry2x32_key_t</a> </td>
+          <td class="paramname"> <em>k</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5dbdf6e314925cd676da9f97013aefe4"></a><!-- doxytag: member="threefry.h::threefry2x32keyinit" ref="a5dbdf6e314925cd676da9f97013aefe4" args="(threefry2x32_ukey_t uk)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array2x32.html">threefry2x32_key_t</a> threefry2x32keyinit </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x32.html">threefry2x32_ukey_t</a> </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aea6a4bd5c80354a4f575c9bec2702172"></a><!-- doxytag: member="threefry.h::threefry2x64" ref="aea6a4bd5c80354a4f575c9bec2702172" args="(threefry2x64_ctr_t in, threefry2x64_key_t k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array2x64.html">threefry2x64_ctr_t</a> threefry2x64 </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html">threefry2x64_ctr_t</a> </td>
+          <td class="paramname"> <em>in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html">threefry2x64_key_t</a> </td>
+          <td class="paramname"> <em>k</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abe5e028454aef3f2bc459e5db05e0e04"></a><!-- doxytag: member="threefry.h::threefry2x64_R" ref="abe5e028454aef3f2bc459e5db05e0e04" args="(unsigned int Nrounds, threefry2x64_ctr_t in, threefry2x64_key_t k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array2x64.html">threefry2x64_ctr_t</a> threefry2x64_R </td>
+          <td>(</td>
+          <td class="paramtype">unsigned int </td>
+          <td class="paramname"> <em>Nrounds</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html">threefry2x64_ctr_t</a> </td>
+          <td class="paramname"> <em>in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html">threefry2x64_key_t</a> </td>
+          <td class="paramname"> <em>k</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac14fcf731b175a1cec85a80606ed5f04"></a><!-- doxytag: member="threefry.h::threefry2x64keyinit" ref="ac14fcf731b175a1cec85a80606ed5f04" args="(threefry2x64_ukey_t uk)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array2x64.html">threefry2x64_key_t</a> threefry2x64keyinit </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array2x64.html">threefry2x64_ukey_t</a> </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1636cce9de54f919e8952a42b7f397fd"></a><!-- doxytag: member="threefry.h::threefry4x32" ref="a1636cce9de54f919e8952a42b7f397fd" args="(threefry4x32_ctr_t in, threefry4x32_key_t k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array4x32.html">threefry4x32_ctr_t</a> threefry4x32 </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">threefry4x32_ctr_t</a> </td>
+          <td class="paramname"> <em>in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">threefry4x32_key_t</a> </td>
+          <td class="paramname"> <em>k</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a79eb6922e7404e224893f7f723fc240c"></a><!-- doxytag: member="threefry.h::threefry4x32_R" ref="a79eb6922e7404e224893f7f723fc240c" args="(unsigned int Nrounds, threefry4x32_ctr_t in, threefry4x32_key_t k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array4x32.html">threefry4x32_ctr_t</a> threefry4x32_R </td>
+          <td>(</td>
+          <td class="paramtype">unsigned int </td>
+          <td class="paramname"> <em>Nrounds</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">threefry4x32_ctr_t</a> </td>
+          <td class="paramname"> <em>in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">threefry4x32_key_t</a> </td>
+          <td class="paramname"> <em>k</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a458f442301e620096d73efd479ab8591"></a><!-- doxytag: member="threefry.h::threefry4x32keyinit" ref="a458f442301e620096d73efd479ab8591" args="(threefry4x32_ukey_t uk)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array4x32.html">threefry4x32_key_t</a> threefry4x32keyinit </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x32.html">threefry4x32_ukey_t</a> </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a382d18a49002d2a5e2b2f06d58669d70"></a><!-- doxytag: member="threefry.h::threefry4x64" ref="a382d18a49002d2a5e2b2f06d58669d70" args="(threefry4x64_ctr_t in, threefry4x64_key_t k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array4x64.html">threefry4x64_ctr_t</a> threefry4x64 </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x64.html">threefry4x64_ctr_t</a> </td>
+          <td class="paramname"> <em>in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array4x64.html">threefry4x64_key_t</a> </td>
+          <td class="paramname"> <em>k</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2e04c3f1ae28c4833444bfafcf22c47f"></a><!-- doxytag: member="threefry.h::threefry4x64_R" ref="a2e04c3f1ae28c4833444bfafcf22c47f" args="(unsigned int Nrounds, threefry4x64_ctr_t in, threefry4x64_key_t k)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array4x64.html">threefry4x64_ctr_t</a> threefry4x64_R </td>
+          <td>(</td>
+          <td class="paramtype">unsigned int </td>
+          <td class="paramname"> <em>Nrounds</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array4x64.html">threefry4x64_ctr_t</a> </td>
+          <td class="paramname"> <em>in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structr123array4x64.html">threefry4x64_key_t</a> </td>
+          <td class="paramname"> <em>k</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aeed27be75e75bfffb0bf8c6333f71b10"></a><!-- doxytag: member="threefry.h::threefry4x64keyinit" ref="aeed27be75e75bfffb0bf8c6333f71b10" args="(threefry4x64_ukey_t uk)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="structr123array4x64.html">threefry4x64_key_t</a> threefry4x64keyinit </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structr123array4x64.html">threefry4x64_ukey_t</a> </td>
+          <td class="paramname"> <em>uk</em></td>
+          <td> ) </td>
+          <td><code> [inline, static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+</div>
+</div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/html/threefry_8h_source.html b/lib/Random123-1.08/docs/html/threefry_8h_source.html
new file mode 100644
index 0000000..f9a8222
--- /dev/null
+++ b/lib/Random123-1.08/docs/html/threefry_8h_source.html
@@ -0,0 +1,839 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>Random123-1.08: Random123/threefry.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javaScript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">Random123-1.08  Documentation</li></ul></div>
+<!-- Generated by Doxygen 1.7.1 -->
+<script type="text/javascript"><!--
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+--></script>
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li id="searchli">
+        <div id="MSearchBox" class="MSearchBoxInactive">
+        <span class="left">
+          <img id="MSearchSelect" src="search/mag_sel.png"
+               onmouseover="return searchBox.OnSearchSelectShow()"
+               onmouseout="return searchBox.OnSearchSelectHide()"
+               alt=""/>
+          <input type="text" id="MSearchField" value="Search" accesskey="S"
+               onfocus="searchBox.OnSearchFieldFocus(true)" 
+               onblur="searchBox.OnSearchFieldFocus(false)" 
+               onkeyup="searchBox.OnSearchFieldChange(event)"/>
+          </span><span class="right">
+            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+          </span>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>Random123/threefry.h</h1>  </div>
+</div>
+<div class="contents">
+<a href="threefry_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">Copyright 2010-2011, D. E. Shaw Research.</span>
+<a name="l00003"></a>00003 <span class="comment">All rights reserved.</span>
+<a name="l00004"></a>00004 <span class="comment"></span>
+<a name="l00005"></a>00005 <span class="comment">Redistribution and use in source and binary forms, with or without</span>
+<a name="l00006"></a>00006 <span class="comment">modification, are permitted provided that the following conditions are</span>
+<a name="l00007"></a>00007 <span class="comment">met:</span>
+<a name="l00008"></a>00008 <span class="comment"></span>
+<a name="l00009"></a>00009 <span class="comment">* Redistributions of source code must retain the above copyright</span>
+<a name="l00010"></a>00010 <span class="comment">  notice, this list of conditions, and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"></span>
+<a name="l00012"></a>00012 <span class="comment">* Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00013"></a>00013 <span class="comment">  notice, this list of conditions, and the following disclaimer in the</span>
+<a name="l00014"></a>00014 <span class="comment">  documentation and/or other materials provided with the distribution.</span>
+<a name="l00015"></a>00015 <span class="comment"></span>
+<a name="l00016"></a>00016 <span class="comment">* Neither the name of D. E. Shaw Research nor the names of its</span>
+<a name="l00017"></a>00017 <span class="comment">  contributors may be used to endorse or promote products derived from</span>
+<a name="l00018"></a>00018 <span class="comment">  this software without specific prior written permission.</span>
+<a name="l00019"></a>00019 <span class="comment"></span>
+<a name="l00020"></a>00020 <span class="comment">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span>
+<a name="l00021"></a>00021 <span class="comment">"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span>
+<a name="l00022"></a>00022 <span class="comment">LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span>
+<a name="l00023"></a>00023 <span class="comment">A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span>
+<a name="l00024"></a>00024 <span class="comment">OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
+<a name="l00025"></a>00025 <span class="comment">SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span>
+<a name="l00026"></a>00026 <span class="comment">LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span>
+<a name="l00027"></a>00027 <span class="comment">DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span>
+<a name="l00028"></a>00028 <span class="comment">THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00029"></a>00029 <span class="comment">(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span>
+<a name="l00030"></a>00030 <span class="comment">OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00031"></a>00031 <span class="comment">*/</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#ifndef _threefry_dot_h_</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#define _threefry_dot_h_</span>
+<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="compilerfeatures_8h.html">features/compilerfeatures.h</a>"</span>
+<a name="l00035"></a>00035 <span class="preprocessor">#include "<a class="code" href="array_8h.html">array.h</a>"</span>
+<a name="l00036"></a>00036 
+<a name="l00038"></a>00038 <span class="comment">/* Significant parts of this file were copied from</span>
+<a name="l00039"></a>00039 <span class="comment">   from:</span>
+<a name="l00040"></a>00040 <span class="comment">      Skein_FinalRnd/ReferenceImplementation/skein.h</span>
+<a name="l00041"></a>00041 <span class="comment">      Skein_FinalRnd/ReferenceImplementation/skein_block.c</span>
+<a name="l00042"></a>00042 <span class="comment"></span>
+<a name="l00043"></a>00043 <span class="comment">   in http://csrc.nist.gov/groups/ST/hash/sha-3/Round3/documents/Skein_FinalRnd.zip</span>
+<a name="l00044"></a>00044 <span class="comment"></span>
+<a name="l00045"></a>00045 <span class="comment">   This file has been modified so that it may no longer perform its originally</span>
+<a name="l00046"></a>00046 <span class="comment">   intended function.  If you're looking for a Skein or Threefish source code,</span>
+<a name="l00047"></a>00047 <span class="comment">   please consult the original file.</span>
+<a name="l00048"></a>00048 <span class="comment"></span>
+<a name="l00049"></a>00049 <span class="comment">   The original file had the following header:</span>
+<a name="l00050"></a>00050 <span class="comment">**************************************************************************</span>
+<a name="l00051"></a>00051 <span class="comment">**</span>
+<a name="l00052"></a>00052 <span class="comment">** Interface declarations and internal definitions for Skein hashing.</span>
+<a name="l00053"></a>00053 <span class="comment">**</span>
+<a name="l00054"></a>00054 <span class="comment">** Source code author: Doug Whiting, 2008.</span>
+<a name="l00055"></a>00055 <span class="comment">**</span>
+<a name="l00056"></a>00056 <span class="comment">** This algorithm and source code is released to the public domain.</span>
+<a name="l00057"></a>00057 <span class="comment">**</span>
+<a name="l00058"></a>00058 <span class="comment">***************************************************************************</span>
+<a name="l00059"></a>00059 <span class="comment"></span>
+<a name="l00060"></a>00060 <span class="comment">*/</span>
+<a name="l00061"></a>00061 
+<a name="l00062"></a>00062 <span class="comment">/* See comment at the top of philox.h for the macro pre-process</span>
+<a name="l00063"></a>00063 <span class="comment">   strategy. */</span>
+<a name="l00064"></a>00064 
+<a name="l00065"></a>00065 <span class="comment">/* Rotation constants: */</span>
+<a name="l00066"></a>00066 <span class="keyword">enum</span> r123_enum_threefry64x4 {
+<a name="l00067"></a>00067     <span class="comment">/* These are the R_256 constants from the Threefish reference sources</span>
+<a name="l00068"></a>00068 <span class="comment">       with names changed to R_64x4... */</span>
+<a name="l00069"></a>00069     R_64x4_0_0=14, R_64x4_0_1=16,
+<a name="l00070"></a>00070     R_64x4_1_0=52, R_64x4_1_1=57,
+<a name="l00071"></a>00071     R_64x4_2_0=23, R_64x4_2_1=40,
+<a name="l00072"></a>00072     R_64x4_3_0= 5, R_64x4_3_1=37,
+<a name="l00073"></a>00073     R_64x4_4_0=25, R_64x4_4_1=33,
+<a name="l00074"></a>00074     R_64x4_5_0=46, R_64x4_5_1=12,
+<a name="l00075"></a>00075     R_64x4_6_0=58, R_64x4_6_1=22,
+<a name="l00076"></a>00076     R_64x4_7_0=32, R_64x4_7_1=32
+<a name="l00077"></a>00077 };
+<a name="l00078"></a>00078 
+<a name="l00079"></a>00079 <span class="keyword">enum</span> r123_enum_threefry64x2 {
+<a name="l00080"></a>00080     <span class="comment">/*</span>
+<a name="l00081"></a>00081 <span class="comment">    // Output from skein_rot_search: (srs64_B64-X1000)</span>
+<a name="l00082"></a>00082 <span class="comment">    // Random seed = 1. BlockSize = 128 bits. sampleCnt =  1024. rounds =  8, minHW_or=57</span>
+<a name="l00083"></a>00083 <span class="comment">    // Start: Tue Mar  1 10:07:48 2011</span>
+<a name="l00084"></a>00084 <span class="comment">    // rMin = 0.136. #0325[*15] [CRC=455A682F. hw_OR=64. cnt=16384. blkSize= 128].format   </span>
+<a name="l00085"></a>00085 <span class="comment">    */</span>
+<a name="l00086"></a>00086     R_64x2_0_0=16,
+<a name="l00087"></a>00087     R_64x2_1_0=42,
+<a name="l00088"></a>00088     R_64x2_2_0=12,
+<a name="l00089"></a>00089     R_64x2_3_0=31,
+<a name="l00090"></a>00090     R_64x2_4_0=16,
+<a name="l00091"></a>00091     R_64x2_5_0=32,
+<a name="l00092"></a>00092     R_64x2_6_0=24,
+<a name="l00093"></a>00093     R_64x2_7_0=21
+<a name="l00094"></a>00094     <span class="comment">/* 4 rounds: minHW =  4  [  4  4  4  4 ]</span>
+<a name="l00095"></a>00095 <span class="comment">    // 5 rounds: minHW =  8  [  8  8  8  8 ]</span>
+<a name="l00096"></a>00096 <span class="comment">    // 6 rounds: minHW = 16  [ 16 16 16 16 ]</span>
+<a name="l00097"></a>00097 <span class="comment">    // 7 rounds: minHW = 32  [ 32 32 32 32 ]</span>
+<a name="l00098"></a>00098 <span class="comment">    // 8 rounds: minHW = 64  [ 64 64 64 64 ]</span>
+<a name="l00099"></a>00099 <span class="comment">    // 9 rounds: minHW = 64  [ 64 64 64 64 ]</span>
+<a name="l00100"></a>00100 <span class="comment">    //10 rounds: minHW = 64  [ 64 64 64 64 ]</span>
+<a name="l00101"></a>00101 <span class="comment">    //11 rounds: minHW = 64  [ 64 64 64 64 ] */</span>
+<a name="l00102"></a>00102 };
+<a name="l00103"></a>00103 
+<a name="l00104"></a>00104 <span class="keyword">enum</span> r123_enum_threefry32x4 {
+<a name="l00105"></a>00105     <span class="comment">/* Output from skein_rot_search: (srs-B128-X5000.out)</span>
+<a name="l00106"></a>00106 <span class="comment">    // Random seed = 1. BlockSize = 64 bits. sampleCnt =  1024. rounds =  8, minHW_or=28</span>
+<a name="l00107"></a>00107 <span class="comment">    // Start: Mon Aug 24 22:41:36 2009</span>
+<a name="l00108"></a>00108 <span class="comment">    // ...</span>
+<a name="l00109"></a>00109 <span class="comment">    // rMin = 0.472. #0A4B[*33] [CRC=DD1ECE0F. hw_OR=31. cnt=16384. blkSize= 128].format    */</span>
+<a name="l00110"></a>00110     R_32x4_0_0=10, R_32x4_0_1=26,
+<a name="l00111"></a>00111     R_32x4_1_0=11, R_32x4_1_1=21,
+<a name="l00112"></a>00112     R_32x4_2_0=13, R_32x4_2_1=27,
+<a name="l00113"></a>00113     R_32x4_3_0=23, R_32x4_3_1= 5,
+<a name="l00114"></a>00114     R_32x4_4_0= 6, R_32x4_4_1=20,
+<a name="l00115"></a>00115     R_32x4_5_0=17, R_32x4_5_1=11,
+<a name="l00116"></a>00116     R_32x4_6_0=25, R_32x4_6_1=10,
+<a name="l00117"></a>00117     R_32x4_7_0=18, R_32x4_7_1=20
+<a name="l00118"></a>00118 
+<a name="l00119"></a>00119     <span class="comment">/* 4 rounds: minHW =  3  [  3  3  3  3 ]</span>
+<a name="l00120"></a>00120 <span class="comment">    // 5 rounds: minHW =  7  [  7  7  7  7 ]</span>
+<a name="l00121"></a>00121 <span class="comment">    // 6 rounds: minHW = 12  [ 13 12 13 12 ]</span>
+<a name="l00122"></a>00122 <span class="comment">    // 7 rounds: minHW = 22  [ 22 23 22 23 ]</span>
+<a name="l00123"></a>00123 <span class="comment">    // 8 rounds: minHW = 31  [ 31 31 31 31 ]</span>
+<a name="l00124"></a>00124 <span class="comment">    // 9 rounds: minHW = 32  [ 32 32 32 32 ]</span>
+<a name="l00125"></a>00125 <span class="comment">    //10 rounds: minHW = 32  [ 32 32 32 32 ]</span>
+<a name="l00126"></a>00126 <span class="comment">    //11 rounds: minHW = 32  [ 32 32 32 32 ] */</span>
+<a name="l00127"></a>00127 
+<a name="l00128"></a>00128 };
+<a name="l00129"></a>00129 
+<a name="l00130"></a>00130 <span class="keyword">enum</span> r123_enum_threefry32x2 {
+<a name="l00131"></a>00131     <span class="comment">/* Output from skein_rot_search (srs32x2-X5000.out)</span>
+<a name="l00132"></a>00132 <span class="comment">    // Random seed = 1. BlockSize = 64 bits. sampleCnt =  1024. rounds =  8, minHW_or=28</span>
+<a name="l00133"></a>00133 <span class="comment">    // Start: Tue Jul 12 11:11:33 2011</span>
+<a name="l00134"></a>00134 <span class="comment">    // rMin = 0.334. #0206[*07] [CRC=1D9765C0. hw_OR=32. cnt=16384. blkSize=  64].format   */</span>
+<a name="l00135"></a>00135     R_32x2_0_0=13,
+<a name="l00136"></a>00136     R_32x2_1_0=15,
+<a name="l00137"></a>00137     R_32x2_2_0=26,
+<a name="l00138"></a>00138     R_32x2_3_0= 6,
+<a name="l00139"></a>00139     R_32x2_4_0=17,
+<a name="l00140"></a>00140     R_32x2_5_0=29,
+<a name="l00141"></a>00141     R_32x2_6_0=16,
+<a name="l00142"></a>00142     R_32x2_7_0=24
+<a name="l00143"></a>00143 
+<a name="l00144"></a>00144     <span class="comment">/* 4 rounds: minHW =  4  [  4  4  4  4 ]</span>
+<a name="l00145"></a>00145 <span class="comment">    // 5 rounds: minHW =  6  [  6  8  6  8 ]</span>
+<a name="l00146"></a>00146 <span class="comment">    // 6 rounds: minHW =  9  [  9 12  9 12 ]</span>
+<a name="l00147"></a>00147 <span class="comment">    // 7 rounds: minHW = 16  [ 16 24 16 24 ]</span>
+<a name="l00148"></a>00148 <span class="comment">    // 8 rounds: minHW = 32  [ 32 32 32 32 ]</span>
+<a name="l00149"></a>00149 <span class="comment">    // 9 rounds: minHW = 32  [ 32 32 32 32 ]</span>
+<a name="l00150"></a>00150 <span class="comment">    //10 rounds: minHW = 32  [ 32 32 32 32 ]</span>
+<a name="l00151"></a>00151 <span class="comment">    //11 rounds: minHW = 32  [ 32 32 32 32 ] */</span>
+<a name="l00152"></a>00152     };
+<a name="l00153"></a>00153 
+<a name="l00154"></a>00154 <span class="keyword">enum</span> r123_enum_threefry_wcnt {
+<a name="l00155"></a>00155     WCNT2=2,
+<a name="l00156"></a>00156     WCNT4=4
+<a name="l00157"></a>00157 };
+<a name="l00158"></a>00158 R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(uint64_t RotL_64(uint64_t x, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> N));
+<a name="l00159"></a>00159 R123_CUDA_DEVICE R123_STATIC_INLINE uint64_t RotL_64(uint64_t x, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> N)
+<a name="l00160"></a>00160 {
+<a name="l00161"></a>00161     <span class="keywordflow">return</span> (x << (N & 63)) | (x >> ((64-N) & 63));
+<a name="l00162"></a>00162 }
+<a name="l00163"></a>00163     
+<a name="l00164"></a>00164 R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(uint32_t RotL_32(uint32_t x, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> N));
+<a name="l00165"></a>00165 R123_CUDA_DEVICE R123_STATIC_INLINE uint32_t RotL_32(uint32_t x, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> N)
+<a name="l00166"></a>00166 {
+<a name="l00167"></a>00167     <span class="keywordflow">return</span> (x << (N & 31)) | (x >> ((32-N) & 31));
+<a name="l00168"></a>00168 }
+<a name="l00169"></a>00169 
+<a name="l00170"></a>00170 <span class="preprocessor">#define SKEIN_MK_64(hi32,lo32)  ((lo32) + (((uint64_t) (hi32)) << 32))</span>
+<a name="l00171"></a>00171 <span class="preprocessor"></span><span class="preprocessor">#define SKEIN_KS_PARITY64         SKEIN_MK_64(0x1BD11BDA,0xA9FC1A22)</span>
+<a name="l00172"></a>00172 <span class="preprocessor"></span><span class="preprocessor">#define SKEIN_KS_PARITY32         0x1BD11BDA</span>
+<a name="l00173"></a>00173 <span class="preprocessor"></span>
+<a name="l00174"></a>00174 <span class="preprocessor">#ifndef THREEFRY2x32_DEFAULT_ROUNDS</span>
+<a name="l00175"></a>00175 <span class="preprocessor"></span><span class="preprocessor">#define THREEFRY2x32_DEFAULT_ROUNDS 20</span>
+<a name="l00176"></a>00176 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00177"></a>00177 <span class="preprocessor"></span>
+<a name="l00178"></a>00178 <span class="preprocessor">#ifndef THREEFRY2x64_DEFAULT_ROUNDS</span>
+<a name="l00179"></a>00179 <span class="preprocessor"></span><span class="preprocessor">#define THREEFRY2x64_DEFAULT_ROUNDS 20</span>
+<a name="l00180"></a>00180 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00181"></a>00181 <span class="preprocessor"></span>
+<a name="l00182"></a>00182 <span class="preprocessor">#ifndef THREEFRY4x32_DEFAULT_ROUNDS</span>
+<a name="l00183"></a>00183 <span class="preprocessor"></span><span class="preprocessor">#define THREEFRY4x32_DEFAULT_ROUNDS 20</span>
+<a name="l00184"></a>00184 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00185"></a>00185 <span class="preprocessor"></span>
+<a name="l00186"></a>00186 <span class="preprocessor">#ifndef THREEFRY4x64_DEFAULT_ROUNDS</span>
+<a name="l00187"></a>00187 <span class="preprocessor"></span><span class="preprocessor">#define THREEFRY4x64_DEFAULT_ROUNDS 20</span>
+<a name="l00188"></a>00188 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00189"></a>00189 <span class="preprocessor"></span>
+<a name="l00190"></a>00190 <span class="preprocessor">#define _threefry2x_tpl(W)                                              \</span>
+<a name="l00191"></a>00191 <span class="preprocessor">typedef struct r123array2x##W threefry2x##W##_ctr_t;                          \</span>
+<a name="l00192"></a>00192 <span class="preprocessor">typedef struct r123array2x##W threefry2x##W##_key_t;                          \</span>
+<a name="l00193"></a>00193 <span class="preprocessor">typedef struct r123array2x##W threefry2x##W##_ukey_t;                          \</span>
+<a name="l00194"></a>00194 <span class="preprocessor">R123_CUDA_DEVICE R123_STATIC_INLINE threefry2x##W##_key_t threefry2x##W##keyinit(threefry2x##W##_ukey_t uk) { return uk; } \</span>
+<a name="l00195"></a>00195 <span class="preprocessor">R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(threefry2x##W##_ctr_t threefry2x##W##_R(unsigned int Nrounds, threefry2x##W##_ctr_t in, threefry2x##W##_key_t k)); \</span>
+<a name="l00196"></a>00196 <span class="preprocessor">R123_CUDA_DEVICE R123_STATIC_INLINE                                          \</span>
+<a name="l00197"></a>00197 <span class="preprocessor">threefry2x##W##_ctr_t threefry2x##W##_R(unsigned int Nrounds, threefry2x##W##_ctr_t in, threefry2x##W##_key_t k){ \</span>
+<a name="l00198"></a>00198 <span class="preprocessor">    threefry2x##W##_ctr_t X;                                              \</span>
+<a name="l00199"></a>00199 <span class="preprocessor">    uint##W##_t ks[2+1];                                          \</span>
+<a name="l00200"></a>00200 <span class="preprocessor">    int  i; </span><span class="comment">/* avoid size_t to avoid need for stddef.h */</span>                   \
+<a name="l00201"></a>00201     R123_ASSERT(Nrounds<=32);                                           \
+<a name="l00202"></a>00202     ks[2] =  SKEIN_KS_PARITY##W;                                   \
+<a name="l00203"></a>00203     for (i=0;i < 2; i++)                                        \
+<a name="l00204"></a>00204         {                                                               \
+<a name="l00205"></a>00205             ks[i] = k.v[i];                                             \
+<a name="l00206"></a>00206             X.v[i]  = in.v[i];                                          \
+<a name="l00207"></a>00207             ks[2] ^= k.v[i];                                    \
+<a name="l00208"></a>00208         }                                                               \
+<a name="l00209"></a>00209                                                                         \
+<a name="l00210"></a>00210     <span class="comment">/* Insert initial key before round 0 */</span>                             \
+<a name="l00211"></a>00211     X.v[0] += ks[0]; X.v[1] += ks[1];                                   \
+<a name="l00212"></a>00212                                                                         \
+<a name="l00213"></a>00213     if(Nrounds>0){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_0_0); X.v[1] ^= X.v[0]; } \
+<a name="l00214"></a>00214     if(Nrounds>1){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_1_0); X.v[1] ^= X.v[0]; } \
+<a name="l00215"></a>00215     if(Nrounds>2){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_2_0); X.v[1] ^= X.v[0]; } \
+<a name="l00216"></a>00216     if(Nrounds>3){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_3_0); X.v[1] ^= X.v[0]; } \
+<a name="l00217"></a>00217     if(Nrounds>3){                                                      \
+<a name="l00218"></a>00218         <span class="comment">/* InjectKey(r=1) */</span>                                            \
+<a name="l00219"></a>00219         X.v[0] += ks[1]; X.v[1] += ks[2];                               \
+<a name="l00220"></a>00220         X.v[1] += 1;     <span class="comment">/* X.v[2-1] += r  */</span>                   \
+<a name="l00221"></a>00221     }                                                                   \
+<a name="l00222"></a>00222     if(Nrounds>4){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_4_0); X.v[1] ^= X.v[0]; } \
+<a name="l00223"></a>00223     if(Nrounds>5){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_5_0); X.v[1] ^= X.v[0]; } \
+<a name="l00224"></a>00224     if(Nrounds>6){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_6_0); X.v[1] ^= X.v[0]; } \
+<a name="l00225"></a>00225     if(Nrounds>7){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_7_0); X.v[1] ^= X.v[0]; } \
+<a name="l00226"></a>00226     if(Nrounds>7){                                                      \
+<a name="l00227"></a>00227         <span class="comment">/* InjectKey(r=2) */</span>                                            \
+<a name="l00228"></a>00228         X.v[0] += ks[2]; X.v[1] += ks[0];                               \
+<a name="l00229"></a>00229         X.v[1] += 2;                                                    \
+<a name="l00230"></a>00230     }                                                                   \
+<a name="l00231"></a>00231     if(Nrounds>8){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_0_0); X.v[1] ^= X.v[0]; } \
+<a name="l00232"></a>00232     if(Nrounds>9){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_1_0); X.v[1] ^= X.v[0]; } \
+<a name="l00233"></a>00233     if(Nrounds>10){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_2_0); X.v[1] ^= X.v[0]; } \
+<a name="l00234"></a>00234     if(Nrounds>11){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_3_0); X.v[1] ^= X.v[0]; } \
+<a name="l00235"></a>00235     if(Nrounds>11){                                                     \
+<a name="l00236"></a>00236         <span class="comment">/* InjectKey(r=3) */</span>                                            \
+<a name="l00237"></a>00237         X.v[0] += ks[0]; X.v[1] += ks[1];                               \
+<a name="l00238"></a>00238         X.v[1] += 3;                                                    \
+<a name="l00239"></a>00239     }                                                                   \
+<a name="l00240"></a>00240     if(Nrounds>12){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_4_0); X.v[1] ^= X.v[0]; } \
+<a name="l00241"></a>00241     if(Nrounds>13){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_5_0); X.v[1] ^= X.v[0]; } \
+<a name="l00242"></a>00242     if(Nrounds>14){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_6_0); X.v[1] ^= X.v[0]; } \
+<a name="l00243"></a>00243     if(Nrounds>15){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_7_0); X.v[1] ^= X.v[0]; } \
+<a name="l00244"></a>00244     if(Nrounds>15){                                                     \
+<a name="l00245"></a>00245         <span class="comment">/* InjectKey(r=4) */</span>                                            \
+<a name="l00246"></a>00246         X.v[0] += ks[1]; X.v[1] += ks[2];                               \
+<a name="l00247"></a>00247         X.v[1] += 4;                                                    \
+<a name="l00248"></a>00248     }                                                                   \
+<a name="l00249"></a>00249     if(Nrounds>16){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_0_0); X.v[1] ^= X.v[0]; } \
+<a name="l00250"></a>00250     if(Nrounds>17){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_1_0); X.v[1] ^= X.v[0]; } \
+<a name="l00251"></a>00251     if(Nrounds>18){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_2_0); X.v[1] ^= X.v[0]; } \
+<a name="l00252"></a>00252     if(Nrounds>19){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_3_0); X.v[1] ^= X.v[0]; } \
+<a name="l00253"></a>00253     if(Nrounds>19){                                                     \
+<a name="l00254"></a>00254         <span class="comment">/* InjectKey(r=5) */</span>                                            \
+<a name="l00255"></a>00255         X.v[0] += ks[2]; X.v[1] += ks[0];                               \
+<a name="l00256"></a>00256         X.v[1] += 5;                                                    \
+<a name="l00257"></a>00257     }                                                                   \
+<a name="l00258"></a>00258     if(Nrounds>20){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_4_0); X.v[1] ^= X.v[0]; } \
+<a name="l00259"></a>00259     if(Nrounds>21){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_5_0); X.v[1] ^= X.v[0]; } \
+<a name="l00260"></a>00260     if(Nrounds>22){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_6_0); X.v[1] ^= X.v[0]; } \
+<a name="l00261"></a>00261     if(Nrounds>23){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_7_0); X.v[1] ^= X.v[0]; } \
+<a name="l00262"></a>00262     if(Nrounds>23){                                                     \
+<a name="l00263"></a>00263         <span class="comment">/* InjectKey(r=6) */</span>                                            \
+<a name="l00264"></a>00264         X.v[0] += ks[0]; X.v[1] += ks[1];                               \
+<a name="l00265"></a>00265         X.v[1] += 6;                                                    \
+<a name="l00266"></a>00266     }                                                                   \
+<a name="l00267"></a>00267     if(Nrounds>24){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_0_0); X.v[1] ^= X.v[0]; } \
+<a name="l00268"></a>00268     if(Nrounds>25){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_1_0); X.v[1] ^= X.v[0]; } \
+<a name="l00269"></a>00269     if(Nrounds>26){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_2_0); X.v[1] ^= X.v[0]; } \
+<a name="l00270"></a>00270     if(Nrounds>27){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_3_0); X.v[1] ^= X.v[0]; } \
+<a name="l00271"></a>00271     if(Nrounds>27){                                                     \
+<a name="l00272"></a>00272         <span class="comment">/* InjectKey(r=7) */</span>                                            \
+<a name="l00273"></a>00273         X.v[0] += ks[1]; X.v[1] += ks[2];                               \
+<a name="l00274"></a>00274         X.v[1] += 7;                                                    \
+<a name="l00275"></a>00275     }                                                                   \
+<a name="l00276"></a>00276     if(Nrounds>28){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_4_0); X.v[1] ^= X.v[0]; } \
+<a name="l00277"></a>00277     if(Nrounds>29){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_5_0); X.v[1] ^= X.v[0]; } \
+<a name="l00278"></a>00278     if(Nrounds>30){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_6_0); X.v[1] ^= X.v[0]; } \
+<a name="l00279"></a>00279     if(Nrounds>31){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_7_0); X.v[1] ^= X.v[0]; } \
+<a name="l00280"></a>00280     if(Nrounds>31){                                                     \
+<a name="l00281"></a>00281         <span class="comment">/* InjectKey(r=8) */</span>                                            \
+<a name="l00282"></a>00282         X.v[0] += ks[2]; X.v[1] += ks[0];                               \
+<a name="l00283"></a>00283         X.v[1] += 8;                                                    \
+<a name="l00284"></a>00284     }                                                                   \
+<a name="l00285"></a>00285     return X;                                                           \
+<a name="l00286"></a>00286 }                                                                       \
+<a name="l00287"></a>00287                                             \
+<a name="l00288"></a>00288 enum r123_enum_threefry2x##W { threefry2x##W##_rounds = THREEFRY2x##W##_DEFAULT_ROUNDS };       \
+<a name="l00289"></a>00289 R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(threefry2x##W##_ctr_t threefry2x##W(threefry2x##W##_ctr_t in, threefry2x##W##_key_t k)); \
+<a name="l00290"></a>00290 R123_CUDA_DEVICE R123_STATIC_INLINE                                     \
+<a name="l00291"></a>00291 threefry2x##W##_ctr_t threefry2x##W(threefry2x##W##_ctr_t in, threefry2x##W##_key_t k){ \
+<a name="l00292"></a>00292     return threefry2x##W##_R(threefry2x##W##_rounds, in, k);            \
+<a name="l00293"></a>00293 }
+<a name="l00294"></a>00294 
+<a name="l00295"></a>00295 
+<a name="l00296"></a>00296 <span class="preprocessor">#define _threefry4x_tpl(W)                                              \</span>
+<a name="l00297"></a>00297 <span class="preprocessor">typedef struct r123array4x##W threefry4x##W##_ctr_t;                        \</span>
+<a name="l00298"></a>00298 <span class="preprocessor">typedef struct r123array4x##W threefry4x##W##_key_t;                        \</span>
+<a name="l00299"></a>00299 <span class="preprocessor">typedef struct r123array4x##W threefry4x##W##_ukey_t;                        \</span>
+<a name="l00300"></a>00300 <span class="preprocessor">R123_CUDA_DEVICE R123_STATIC_INLINE threefry4x##W##_key_t threefry4x##W##keyinit(threefry4x##W##_ukey_t uk) { return uk; } \</span>
+<a name="l00301"></a>00301 <span class="preprocessor">R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(threefry4x##W##_ctr_t threefry4x##W##_R(unsigned int Nrounds, threefry4x##W##_ctr_t in, threefry4x##W##_key_t k)); \</span>
+<a name="l00302"></a>00302 <span class="preprocessor">R123_CUDA_DEVICE R123_STATIC_INLINE                                          \</span>
+<a name="l00303"></a>00303 <span class="preprocessor">threefry4x##W##_ctr_t threefry4x##W##_R(unsigned int Nrounds, threefry4x##W##_ctr_t in, threefry4x##W##_key_t k){ \</span>
+<a name="l00304"></a>00304 <span class="preprocessor">    threefry4x##W##_ctr_t X;                                            \</span>
+<a name="l00305"></a>00305 <span class="preprocessor">    uint##W##_t ks[4+1];                                            \</span>
+<a name="l00306"></a>00306 <span class="preprocessor">    int  i; </span><span class="comment">/* avoid size_t to avoid need for stddef.h */</span>                   \
+<a name="l00307"></a>00307     R123_ASSERT(Nrounds<=72);                                           \
+<a name="l00308"></a>00308     ks[4] =  SKEIN_KS_PARITY##W;                                    \
+<a name="l00309"></a>00309     for (i=0;i < 4; i++)                                            \
+<a name="l00310"></a>00310         {                                                               \
+<a name="l00311"></a>00311             ks[i] = k.v[i];                                             \
+<a name="l00312"></a>00312             X.v[i]  = in.v[i];                                          \
+<a name="l00313"></a>00313             ks[4] ^= k.v[i];                                        \
+<a name="l00314"></a>00314         }                                                               \
+<a name="l00315"></a>00315                                                                         \
+<a name="l00316"></a>00316     <span class="comment">/* Insert initial key before round 0 */</span>                             \
+<a name="l00317"></a>00317     X.v[0] += ks[0]; X.v[1] += ks[1]; X.v[2] += ks[2]; X.v[3] += ks[3]; \
+<a name="l00318"></a>00318                                                                         \
+<a name="l00319"></a>00319     if(Nrounds>0){                                                      \
+<a name="l00320"></a>00320         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+<a name="l00321"></a>00321         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+<a name="l00322"></a>00322     }                                                                   \
+<a name="l00323"></a>00323     if(Nrounds>1){                                                      \
+<a name="l00324"></a>00324         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+<a name="l00325"></a>00325         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+<a name="l00326"></a>00326     }                                                                   \
+<a name="l00327"></a>00327     if(Nrounds>2){                                                      \
+<a name="l00328"></a>00328         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+<a name="l00329"></a>00329         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+<a name="l00330"></a>00330     }                                                                   \
+<a name="l00331"></a>00331     if(Nrounds>3){                                                      \
+<a name="l00332"></a>00332         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+<a name="l00333"></a>00333         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+<a name="l00334"></a>00334     }                                                                   \
+<a name="l00335"></a>00335     if(Nrounds>3){                                                      \
+<a name="l00336"></a>00336         <span class="comment">/* InjectKey(r=1) */</span>                                            \
+<a name="l00337"></a>00337         X.v[0] += ks[1]; X.v[1] += ks[2]; X.v[2] += ks[3]; X.v[3] += ks[4]; \
+<a name="l00338"></a>00338         X.v[4-1] += 1;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                 \
+<a name="l00339"></a>00339     }                                                                   \
+<a name="l00340"></a>00340                                                                         \
+<a name="l00341"></a>00341     if(Nrounds>4){                                                      \
+<a name="l00342"></a>00342         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+<a name="l00343"></a>00343         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+<a name="l00344"></a>00344     }                                                                   \
+<a name="l00345"></a>00345     if(Nrounds>5){                                                      \
+<a name="l00346"></a>00346         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+<a name="l00347"></a>00347         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+<a name="l00348"></a>00348     }                                                                   \
+<a name="l00349"></a>00349     if(Nrounds>6){                                                      \
+<a name="l00350"></a>00350         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+<a name="l00351"></a>00351         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+<a name="l00352"></a>00352     }                                                                   \
+<a name="l00353"></a>00353     if(Nrounds>7){                                                      \
+<a name="l00354"></a>00354         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+<a name="l00355"></a>00355         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+<a name="l00356"></a>00356     }                                                                   \
+<a name="l00357"></a>00357     if(Nrounds>7){                                                      \
+<a name="l00358"></a>00358         <span class="comment">/* InjectKey(r=2) */</span>                                            \
+<a name="l00359"></a>00359         X.v[0] += ks[2]; X.v[1] += ks[3]; X.v[2] += ks[4]; X.v[3] += ks[0]; \
+<a name="l00360"></a>00360         X.v[4-1] += 2;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                 \
+<a name="l00361"></a>00361     }                                                                   \
+<a name="l00362"></a>00362                                                                         \
+<a name="l00363"></a>00363     if(Nrounds>8){                                                      \
+<a name="l00364"></a>00364         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+<a name="l00365"></a>00365         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+<a name="l00366"></a>00366     }                                                                   \
+<a name="l00367"></a>00367     if(Nrounds>9){                                                      \
+<a name="l00368"></a>00368         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+<a name="l00369"></a>00369         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+<a name="l00370"></a>00370     }                                                                   \
+<a name="l00371"></a>00371     if(Nrounds>10){                                                     \
+<a name="l00372"></a>00372         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+<a name="l00373"></a>00373         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+<a name="l00374"></a>00374     }                                                                   \
+<a name="l00375"></a>00375     if(Nrounds>11){                                                     \
+<a name="l00376"></a>00376         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+<a name="l00377"></a>00377         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+<a name="l00378"></a>00378     }                                                                   \
+<a name="l00379"></a>00379     if(Nrounds>11){                                                     \
+<a name="l00380"></a>00380         <span class="comment">/* InjectKey(r=3) */</span>                                            \
+<a name="l00381"></a>00381         X.v[0] += ks[3]; X.v[1] += ks[4]; X.v[2] += ks[0]; X.v[3] += ks[1]; \
+<a name="l00382"></a>00382         X.v[4-1] += 3;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                 \
+<a name="l00383"></a>00383     }                                                                   \
+<a name="l00384"></a>00384                                                                         \
+<a name="l00385"></a>00385     if(Nrounds>12){                                                     \
+<a name="l00386"></a>00386         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+<a name="l00387"></a>00387         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+<a name="l00388"></a>00388     }                                                                   \
+<a name="l00389"></a>00389     if(Nrounds>13){                                                     \
+<a name="l00390"></a>00390         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+<a name="l00391"></a>00391         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+<a name="l00392"></a>00392     }                                                                   \
+<a name="l00393"></a>00393     if(Nrounds>14){                                                     \
+<a name="l00394"></a>00394         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+<a name="l00395"></a>00395         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+<a name="l00396"></a>00396     }                                                                   \
+<a name="l00397"></a>00397     if(Nrounds>15){                                                     \
+<a name="l00398"></a>00398         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+<a name="l00399"></a>00399         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+<a name="l00400"></a>00400     }                                                                   \
+<a name="l00401"></a>00401     if(Nrounds>15){                                                     \
+<a name="l00402"></a>00402         <span class="comment">/* InjectKey(r=1) */</span>                                            \
+<a name="l00403"></a>00403         X.v[0] += ks[4]; X.v[1] += ks[0]; X.v[2] += ks[1]; X.v[3] += ks[2]; \
+<a name="l00404"></a>00404         X.v[4-1] += 4;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                 \
+<a name="l00405"></a>00405     }                                                                   \
+<a name="l00406"></a>00406                                                                         \
+<a name="l00407"></a>00407     if(Nrounds>16){                                                     \
+<a name="l00408"></a>00408         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+<a name="l00409"></a>00409         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+<a name="l00410"></a>00410     }                                                                   \
+<a name="l00411"></a>00411     if(Nrounds>17){                                                     \
+<a name="l00412"></a>00412         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+<a name="l00413"></a>00413         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+<a name="l00414"></a>00414     }                                                                   \
+<a name="l00415"></a>00415     if(Nrounds>18){                                                     \
+<a name="l00416"></a>00416         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+<a name="l00417"></a>00417         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+<a name="l00418"></a>00418     }                                                                   \
+<a name="l00419"></a>00419     if(Nrounds>19){                                                     \
+<a name="l00420"></a>00420         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+<a name="l00421"></a>00421         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+<a name="l00422"></a>00422     }                                                                   \
+<a name="l00423"></a>00423     if(Nrounds>19){                                                     \
+<a name="l00424"></a>00424         <span class="comment">/* InjectKey(r=1) */</span>                                            \
+<a name="l00425"></a>00425         X.v[0] += ks[0]; X.v[1] += ks[1]; X.v[2] += ks[2]; X.v[3] += ks[3]; \
+<a name="l00426"></a>00426         X.v[4-1] += 5;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                 \
+<a name="l00427"></a>00427     }                                                                   \
+<a name="l00428"></a>00428                                                                         \
+<a name="l00429"></a>00429     if(Nrounds>20){                                                     \
+<a name="l00430"></a>00430         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+<a name="l00431"></a>00431         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+<a name="l00432"></a>00432     }                                                                   \
+<a name="l00433"></a>00433     if(Nrounds>21){                                                     \
+<a name="l00434"></a>00434         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+<a name="l00435"></a>00435         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+<a name="l00436"></a>00436     }                                                                   \
+<a name="l00437"></a>00437     if(Nrounds>22){                                                     \
+<a name="l00438"></a>00438         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+<a name="l00439"></a>00439         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+<a name="l00440"></a>00440     }                                                                   \
+<a name="l00441"></a>00441     if(Nrounds>23){                                                     \
+<a name="l00442"></a>00442         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+<a name="l00443"></a>00443         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+<a name="l00444"></a>00444     }                                                                   \
+<a name="l00445"></a>00445     if(Nrounds>23){                                                     \
+<a name="l00446"></a>00446         <span class="comment">/* InjectKey(r=1) */</span>                                            \
+<a name="l00447"></a>00447         X.v[0] += ks[1]; X.v[1] += ks[2]; X.v[2] += ks[3]; X.v[3] += ks[4]; \
+<a name="l00448"></a>00448         X.v[4-1] += 6;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                 \
+<a name="l00449"></a>00449     }                                                                   \
+<a name="l00450"></a>00450                                                                         \
+<a name="l00451"></a>00451     if(Nrounds>24){                                                     \
+<a name="l00452"></a>00452         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+<a name="l00453"></a>00453         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+<a name="l00454"></a>00454     }                                                                   \
+<a name="l00455"></a>00455     if(Nrounds>25){                                                     \
+<a name="l00456"></a>00456         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+<a name="l00457"></a>00457         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+<a name="l00458"></a>00458     }                                                                   \
+<a name="l00459"></a>00459     if(Nrounds>26){                                                     \
+<a name="l00460"></a>00460         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+<a name="l00461"></a>00461         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+<a name="l00462"></a>00462     }                                                                   \
+<a name="l00463"></a>00463     if(Nrounds>27){                                                     \
+<a name="l00464"></a>00464         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+<a name="l00465"></a>00465         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+<a name="l00466"></a>00466     }                                                                   \
+<a name="l00467"></a>00467     if(Nrounds>27){                                                     \
+<a name="l00468"></a>00468         <span class="comment">/* InjectKey(r=1) */</span>                                            \
+<a name="l00469"></a>00469         X.v[0] += ks[2]; X.v[1] += ks[3]; X.v[2] += ks[4]; X.v[3] += ks[0]; \
+<a name="l00470"></a>00470         X.v[4-1] += 7;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                 \
+<a name="l00471"></a>00471     }                                                                   \
+<a name="l00472"></a>00472                                                                         \
+<a name="l00473"></a>00473     if(Nrounds>28){                                                     \
+<a name="l00474"></a>00474         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+<a name="l00475"></a>00475         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+<a name="l00476"></a>00476     }                                                                   \
+<a name="l00477"></a>00477     if(Nrounds>29){                                                     \
+<a name="l00478"></a>00478         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+<a name="l00479"></a>00479         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+<a name="l00480"></a>00480     }                                                                   \
+<a name="l00481"></a>00481     if(Nrounds>30){                                                     \
+<a name="l00482"></a>00482         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+<a name="l00483"></a>00483         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+<a name="l00484"></a>00484     }                                                                   \
+<a name="l00485"></a>00485     if(Nrounds>31){                                                     \
+<a name="l00486"></a>00486         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+<a name="l00487"></a>00487         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+<a name="l00488"></a>00488     }                                                                   \
+<a name="l00489"></a>00489     if(Nrounds>31){                                                     \
+<a name="l00490"></a>00490         <span class="comment">/* InjectKey(r=1) */</span>                                            \
+<a name="l00491"></a>00491         X.v[0] += ks[3]; X.v[1] += ks[4]; X.v[2] += ks[0]; X.v[3] += ks[1]; \
+<a name="l00492"></a>00492         X.v[4-1] += 8;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                 \
+<a name="l00493"></a>00493     }                                                                   \
+<a name="l00494"></a>00494                                                                         \
+<a name="l00495"></a>00495     if(Nrounds>32){                                                     \
+<a name="l00496"></a>00496         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+<a name="l00497"></a>00497         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+<a name="l00498"></a>00498     }                                                                   \
+<a name="l00499"></a>00499     if(Nrounds>33){                                                     \
+<a name="l00500"></a>00500         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+<a name="l00501"></a>00501         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+<a name="l00502"></a>00502     }                                                                   \
+<a name="l00503"></a>00503     if(Nrounds>34){                                                     \
+<a name="l00504"></a>00504         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+<a name="l00505"></a>00505         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+<a name="l00506"></a>00506     }                                                                   \
+<a name="l00507"></a>00507     if(Nrounds>35){                                                     \
+<a name="l00508"></a>00508         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+<a name="l00509"></a>00509         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+<a name="l00510"></a>00510     }                                                                   \
+<a name="l00511"></a>00511     if(Nrounds>35){                                                     \
+<a name="l00512"></a>00512         <span class="comment">/* InjectKey(r=1) */</span>                                            \
+<a name="l00513"></a>00513         X.v[0] += ks[4]; X.v[1] += ks[0]; X.v[2] += ks[1]; X.v[3] += ks[2]; \
+<a name="l00514"></a>00514         X.v[4-1] += 9;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                 \
+<a name="l00515"></a>00515     }                                                                   \
+<a name="l00516"></a>00516                                                                         \
+<a name="l00517"></a>00517     if(Nrounds>36){                                                     \
+<a name="l00518"></a>00518         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+<a name="l00519"></a>00519         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+<a name="l00520"></a>00520     }                                                                   \
+<a name="l00521"></a>00521     if(Nrounds>37){                                                     \
+<a name="l00522"></a>00522         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+<a name="l00523"></a>00523         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+<a name="l00524"></a>00524     }                                                                   \
+<a name="l00525"></a>00525     if(Nrounds>38){                                                     \
+<a name="l00526"></a>00526         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+<a name="l00527"></a>00527         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+<a name="l00528"></a>00528     }                                                                   \
+<a name="l00529"></a>00529     if(Nrounds>39){                                                     \
+<a name="l00530"></a>00530         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+<a name="l00531"></a>00531         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+<a name="l00532"></a>00532     }                                                                   \
+<a name="l00533"></a>00533     if(Nrounds>39){                                                     \
+<a name="l00534"></a>00534         <span class="comment">/* InjectKey(r=1) */</span>                                            \
+<a name="l00535"></a>00535         X.v[0] += ks[0]; X.v[1] += ks[1]; X.v[2] += ks[2]; X.v[3] += ks[3]; \
+<a name="l00536"></a>00536         X.v[4-1] += 10;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                 \
+<a name="l00537"></a>00537     }                                                                   \
+<a name="l00538"></a>00538                                                                         \
+<a name="l00539"></a>00539     if(Nrounds>40){                                                     \
+<a name="l00540"></a>00540         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+<a name="l00541"></a>00541         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+<a name="l00542"></a>00542     }                                                                   \
+<a name="l00543"></a>00543     if(Nrounds>41){                                                     \
+<a name="l00544"></a>00544         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+<a name="l00545"></a>00545         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+<a name="l00546"></a>00546     }                                                                   \
+<a name="l00547"></a>00547     if(Nrounds>42){                                                     \
+<a name="l00548"></a>00548         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+<a name="l00549"></a>00549         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+<a name="l00550"></a>00550     }                                                                   \
+<a name="l00551"></a>00551     if(Nrounds>43){                                                     \
+<a name="l00552"></a>00552         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+<a name="l00553"></a>00553         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+<a name="l00554"></a>00554     }                                                                   \
+<a name="l00555"></a>00555     if(Nrounds>43){                                                     \
+<a name="l00556"></a>00556         <span class="comment">/* InjectKey(r=1) */</span>                                            \
+<a name="l00557"></a>00557         X.v[0] += ks[1]; X.v[1] += ks[2]; X.v[2] += ks[3]; X.v[3] += ks[4]; \
+<a name="l00558"></a>00558         X.v[4-1] += 11;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                \
+<a name="l00559"></a>00559     }                                                                   \
+<a name="l00560"></a>00560                                                                         \
+<a name="l00561"></a>00561     if(Nrounds>44){                                                     \
+<a name="l00562"></a>00562         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+<a name="l00563"></a>00563         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+<a name="l00564"></a>00564     }                                                                   \
+<a name="l00565"></a>00565     if(Nrounds>45){                                                     \
+<a name="l00566"></a>00566         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+<a name="l00567"></a>00567         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+<a name="l00568"></a>00568     }                                                                   \
+<a name="l00569"></a>00569     if(Nrounds>46){                                                     \
+<a name="l00570"></a>00570         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+<a name="l00571"></a>00571         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+<a name="l00572"></a>00572     }                                                                   \
+<a name="l00573"></a>00573     if(Nrounds>47){                                                     \
+<a name="l00574"></a>00574         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+<a name="l00575"></a>00575         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+<a name="l00576"></a>00576     }                                                                   \
+<a name="l00577"></a>00577     if(Nrounds>47){                                                     \
+<a name="l00578"></a>00578         <span class="comment">/* InjectKey(r=1) */</span>                                            \
+<a name="l00579"></a>00579         X.v[0] += ks[2]; X.v[1] += ks[3]; X.v[2] += ks[4]; X.v[3] += ks[0]; \
+<a name="l00580"></a>00580         X.v[4-1] += 12;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                 \
+<a name="l00581"></a>00581     }                                                                   \
+<a name="l00582"></a>00582                                                                         \
+<a name="l00583"></a>00583     if(Nrounds>48){                                                     \
+<a name="l00584"></a>00584         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+<a name="l00585"></a>00585         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+<a name="l00586"></a>00586     }                                                                   \
+<a name="l00587"></a>00587     if(Nrounds>49){                                                     \
+<a name="l00588"></a>00588         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+<a name="l00589"></a>00589         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+<a name="l00590"></a>00590     }                                                                   \
+<a name="l00591"></a>00591     if(Nrounds>50){                                                     \
+<a name="l00592"></a>00592         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+<a name="l00593"></a>00593         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+<a name="l00594"></a>00594     }                                                                   \
+<a name="l00595"></a>00595     if(Nrounds>51){                                                     \
+<a name="l00596"></a>00596         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+<a name="l00597"></a>00597         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+<a name="l00598"></a>00598     }                                                                   \
+<a name="l00599"></a>00599     if(Nrounds>51){                                                     \
+<a name="l00600"></a>00600         <span class="comment">/* InjectKey(r=1) */</span>                                            \
+<a name="l00601"></a>00601         X.v[0] += ks[3]; X.v[1] += ks[4]; X.v[2] += ks[0]; X.v[3] += ks[1]; \
+<a name="l00602"></a>00602         X.v[4-1] += 13;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                 \
+<a name="l00603"></a>00603     }                                                                   \
+<a name="l00604"></a>00604                                                                         \
+<a name="l00605"></a>00605     if(Nrounds>52){                                                     \
+<a name="l00606"></a>00606         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+<a name="l00607"></a>00607         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+<a name="l00608"></a>00608     }                                                                   \
+<a name="l00609"></a>00609     if(Nrounds>53){                                                     \
+<a name="l00610"></a>00610         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+<a name="l00611"></a>00611         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+<a name="l00612"></a>00612     }                                                                   \
+<a name="l00613"></a>00613     if(Nrounds>54){                                                     \
+<a name="l00614"></a>00614         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+<a name="l00615"></a>00615         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+<a name="l00616"></a>00616     }                                                                   \
+<a name="l00617"></a>00617     if(Nrounds>55){                                                     \
+<a name="l00618"></a>00618         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+<a name="l00619"></a>00619         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+<a name="l00620"></a>00620     }                                                                   \
+<a name="l00621"></a>00621     if(Nrounds>55){                                                     \
+<a name="l00622"></a>00622         <span class="comment">/* InjectKey(r=1) */</span>                                            \
+<a name="l00623"></a>00623         X.v[0] += ks[4]; X.v[1] += ks[0]; X.v[2] += ks[1]; X.v[3] += ks[2]; \
+<a name="l00624"></a>00624         X.v[4-1] += 14;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                 \
+<a name="l00625"></a>00625     }                                                                   \
+<a name="l00626"></a>00626                                                                         \
+<a name="l00627"></a>00627     if(Nrounds>56){                                                     \
+<a name="l00628"></a>00628         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+<a name="l00629"></a>00629         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+<a name="l00630"></a>00630     }                                                                   \
+<a name="l00631"></a>00631     if(Nrounds>57){                                                     \
+<a name="l00632"></a>00632         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+<a name="l00633"></a>00633         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+<a name="l00634"></a>00634     }                                                                   \
+<a name="l00635"></a>00635     if(Nrounds>58){                                                     \
+<a name="l00636"></a>00636         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+<a name="l00637"></a>00637         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+<a name="l00638"></a>00638     }                                                                   \
+<a name="l00639"></a>00639     if(Nrounds>59){                                                     \
+<a name="l00640"></a>00640         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+<a name="l00641"></a>00641         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+<a name="l00642"></a>00642     }                                                                   \
+<a name="l00643"></a>00643     if(Nrounds>59){                                                     \
+<a name="l00644"></a>00644         <span class="comment">/* InjectKey(r=1) */</span>                                            \
+<a name="l00645"></a>00645         X.v[0] += ks[0]; X.v[1] += ks[1]; X.v[2] += ks[2]; X.v[3] += ks[3]; \
+<a name="l00646"></a>00646         X.v[4-1] += 15;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                 \
+<a name="l00647"></a>00647     }                                                                   \
+<a name="l00648"></a>00648                                                                         \
+<a name="l00649"></a>00649     if(Nrounds>60){                                                     \
+<a name="l00650"></a>00650         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+<a name="l00651"></a>00651         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+<a name="l00652"></a>00652     }                                                                   \
+<a name="l00653"></a>00653     if(Nrounds>61){                                                     \
+<a name="l00654"></a>00654         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+<a name="l00655"></a>00655         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+<a name="l00656"></a>00656     }                                                                   \
+<a name="l00657"></a>00657     if(Nrounds>62){                                                     \
+<a name="l00658"></a>00658         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+<a name="l00659"></a>00659         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+<a name="l00660"></a>00660     }                                                                   \
+<a name="l00661"></a>00661     if(Nrounds>63){                                                     \
+<a name="l00662"></a>00662         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+<a name="l00663"></a>00663         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+<a name="l00664"></a>00664     }                                                                   \
+<a name="l00665"></a>00665     if(Nrounds>63){                                                     \
+<a name="l00666"></a>00666         <span class="comment">/* InjectKey(r=1) */</span>                                            \
+<a name="l00667"></a>00667         X.v[0] += ks[1]; X.v[1] += ks[2]; X.v[2] += ks[3]; X.v[3] += ks[4]; \
+<a name="l00668"></a>00668         X.v[4-1] += 16;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                 \
+<a name="l00669"></a>00669     }                                                                   \
+<a name="l00670"></a>00670                                                                         \
+<a name="l00671"></a>00671     if(Nrounds>64){                                                     \
+<a name="l00672"></a>00672         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+<a name="l00673"></a>00673         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+<a name="l00674"></a>00674     }                                                                   \
+<a name="l00675"></a>00675     if(Nrounds>65){                                                     \
+<a name="l00676"></a>00676         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+<a name="l00677"></a>00677         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+<a name="l00678"></a>00678     }                                                                   \
+<a name="l00679"></a>00679     if(Nrounds>66){                                                     \
+<a name="l00680"></a>00680         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+<a name="l00681"></a>00681         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+<a name="l00682"></a>00682     }                                                                   \
+<a name="l00683"></a>00683     if(Nrounds>67){                                                     \
+<a name="l00684"></a>00684         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+<a name="l00685"></a>00685         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+<a name="l00686"></a>00686     }                                                                   \
+<a name="l00687"></a>00687     if(Nrounds>67){                                                     \
+<a name="l00688"></a>00688         <span class="comment">/* InjectKey(r=1) */</span>                                            \
+<a name="l00689"></a>00689         X.v[0] += ks[2]; X.v[1] += ks[3]; X.v[2] += ks[4]; X.v[3] += ks[0]; \
+<a name="l00690"></a>00690         X.v[4-1] += 17;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                 \
+<a name="l00691"></a>00691     }                                                                   \
+<a name="l00692"></a>00692                                                                         \
+<a name="l00693"></a>00693     if(Nrounds>68){                                                     \
+<a name="l00694"></a>00694         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+<a name="l00695"></a>00695         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+<a name="l00696"></a>00696     }                                                                   \
+<a name="l00697"></a>00697     if(Nrounds>69){                                                     \
+<a name="l00698"></a>00698         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+<a name="l00699"></a>00699         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+<a name="l00700"></a>00700     }                                                                   \
+<a name="l00701"></a>00701     if(Nrounds>70){                                                     \
+<a name="l00702"></a>00702         X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+<a name="l00703"></a>00703         X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+<a name="l00704"></a>00704     }                                                                   \
+<a name="l00705"></a>00705     if(Nrounds>71){                                                     \
+<a name="l00706"></a>00706         X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+<a name="l00707"></a>00707         X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+<a name="l00708"></a>00708     }                                                                   \
+<a name="l00709"></a>00709     if(Nrounds>71){                                                     \
+<a name="l00710"></a>00710         <span class="comment">/* InjectKey(r=1) */</span>                                            \
+<a name="l00711"></a>00711         X.v[0] += ks[3]; X.v[1] += ks[4]; X.v[2] += ks[0]; X.v[3] += ks[1]; \
+<a name="l00712"></a>00712         X.v[4-1] += 18;     <span class="comment">/* X.v[WCNT4-1] += r  */</span>                 \
+<a name="l00713"></a>00713     }                                                                   \
+<a name="l00714"></a>00714                                                                         \
+<a name="l00715"></a>00715     return X;                                                           \
+<a name="l00716"></a>00716 }                                                                       \
+<a name="l00717"></a>00717                                             \
+<a name="l00718"></a>00718 enum r123_enum_threefry4x##W { threefry4x##W##_rounds = THREEFRY4x##W##_DEFAULT_ROUNDS };       \
+<a name="l00719"></a>00719 R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(threefry4x##W##_ctr_t threefry4x##W(threefry4x##W##_ctr_t in, threefry4x##W##_key_t k)); \
+<a name="l00720"></a>00720 R123_CUDA_DEVICE R123_STATIC_INLINE                                     \
+<a name="l00721"></a>00721 threefry4x##W##_ctr_t threefry4x##W(threefry4x##W##_ctr_t in, threefry4x##W##_key_t k){ \
+<a name="l00722"></a>00722     return threefry4x##W##_R(threefry4x##W##_rounds, in, k);            \
+<a name="l00723"></a>00723 }
+<a name="l00724"></a>00724 
+<a name="l00726"></a><a class="code" href="threefry_8h.html#ac14fcf731b175a1cec85a80606ed5f04">00726</a> _threefry2x_tpl(64)
+<a name="l00727"></a><a class="code" href="threefry_8h.html#a5dbdf6e314925cd676da9f97013aefe4">00727</a> _threefry2x_tpl(32)
+<a name="l00728"></a><a class="code" href="threefry_8h.html#aeed27be75e75bfffb0bf8c6333f71b10">00728</a> _threefry4x_tpl(64)
+<a name="l00729"></a><a class="code" href="threefry_8h.html#a458f442301e620096d73efd479ab8591">00729</a> _threefry4x_tpl(32)
+<a name="l00730"></a>00730 
+<a name="l00731"></a>00731 <span class="comment">/* gcc4.5 and 4.6 seem to optimize a macro-ized threefryNxW better</span>
+<a name="l00732"></a>00732 <span class="comment">   than a static inline function.  Why?  */</span>
+<a name="l00733"></a><a class="code" href="threefry_8h.html#a52e1635889bbf08009646f22897e07fc">00733</a> <span class="preprocessor">#define threefry2x32(c,k) threefry2x32_R(threefry2x32_rounds, c, k)</span>
+<a name="l00734"></a><a class="code" href="threefry_8h.html#aaaecd189b32b0081c6a3c2cb46577e23">00734</a> <span class="preprocessor"></span><span class="preprocessor">#define threefry4x32(c,k) threefry4x32_R(threefry4x32_rounds, c, k)</span>
+<a name="l00735"></a><a class="code" href="threefry_8h.html#acda3cc1cd02719e1e3d6cfdf7ce0c4c8">00735</a> <span class="preprocessor"></span><span class="preprocessor">#define threefry2x64(c,k) threefry2x64_R(threefry2x64_rounds, c, k)</span>
+<a name="l00736"></a><a class="code" href="threefry_8h.html#a992029974a22f14e0ef29a862ede2b8d">00736</a> <span class="preprocessor"></span><span class="preprocessor">#define threefry4x64(c,k) threefry4x64_R(threefry4x64_rounds, c, k)</span>
+<a name="l00737"></a>00737 <span class="preprocessor"></span>
+<a name="l00738"></a>00738 <span class="preprocessor">#ifdef __cplusplus</span>
+<a name="l00739"></a>00739 <span class="preprocessor"></span>
+<a name="l00740"></a>00740 <span class="preprocessor">#define _threefryNxWclass_tpl(NxW)                                      \</span>
+<a name="l00741"></a>00741 <span class="preprocessor">namespace r123{                                                     \</span>
+<a name="l00742"></a>00742 <span class="preprocessor">template<unsigned int R>                                                  \</span>
+<a name="l00743"></a>00743 <span class="preprocessor"> struct Threefry##NxW##_R{                                              \</span>
+<a name="l00744"></a>00744 <span class="preprocessor">    typedef threefry##NxW##_ctr_t ctr_type;                             \</span>
+<a name="l00745"></a>00745 <span class="preprocessor">    typedef threefry##NxW##_key_t key_type;                             \</span>
+<a name="l00746"></a>00746 <span class="preprocessor">    typedef threefry##NxW##_key_t ukey_type;                            \</span>
+<a name="l00747"></a>00747 <span class="preprocessor">    static const unsigned int rounds=R;                                 \</span>
+<a name="l00748"></a>00748 <span class="preprocessor">   inline R123_CUDA_DEVICE R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key)){ \</span>
+<a name="l00749"></a>00749 <span class="preprocessor">        R123_STATIC_ASSERT(R<=72, "threefry is only unrolled up to 72 rounds\n"); \</span>
+<a name="l00750"></a>00750 <span class="preprocessor">        return threefry##NxW##_R(R, ctr, key);                              \</span>
+<a name="l00751"></a>00751 <span class="preprocessor">    }                                                                   \</span>
+<a name="l00752"></a>00752 <span class="preprocessor">};                                                                      \</span>
+<a name="l00753"></a>00753 <span class="preprocessor"> typedef Threefry##NxW##_R<threefry##NxW##_rounds> Threefry##NxW;       \</span>
+<a name="l00754"></a>00754 <span class="preprocessor">} // namespace r123</span>
+<a name="l00755"></a>00755 <span class="preprocessor"></span>
+<a name="l00758"></a><a class="code" href="group__ThreefryNxW.html#ga1c32939b65f84966c93677f4382ea36d">00758</a> _threefryNxWclass_tpl(2x32)
+<a name="l00759"></a><a class="code" href="group__ThreefryNxW.html#gacb09a2dcfb7389769f0c58f45f132aaa">00759</a> _threefryNxWclass_tpl(4x32)
+<a name="l00760"></a><a class="code" href="group__ThreefryNxW.html#ga2b54dd1b0d20f09239be5f8757f1f3db">00760</a> _threefryNxWclass_tpl(2x64)
+<a name="l00761"></a><a class="code" href="group__ThreefryNxW.html#gae17c98bddf067365508ed0717f865e8b">00761</a> _threefryNxWclass_tpl(4x64)
+<a name="l00762"></a>00762 
+<a name="l00763"></a>00763 <span class="comment">/* The _tpl macros don't quite work to do string-pasting inside comments.</span>
+<a name="l00764"></a>00764 <span class="comment">   so we just write out the boilerplate documentation four times... */</span>
+<a name="l00765"></a>00765 
+<a name="l00862"></a>00862 <span class="preprocessor">#endif</span>
+<a name="l00863"></a>00863 <span class="preprocessor"></span>
+<a name="l00864"></a>00864 <span class="preprocessor">#endif</span>
+</pre></div></div>
+</div>
+<!--- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)">< [...]
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 20 2013 13:08:22 for Random123-1.08 by 
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/lib/Random123-1.08/docs/main.dox b/lib/Random123-1.08/docs/main.dox
new file mode 100644
index 0000000..47d5a3b
--- /dev/null
+++ b/lib/Random123-1.08/docs/main.dox
@@ -0,0 +1,343 @@
+/**
+ at mainpage Random123: a Library of Counter-Based Random Number Generators
+
+The Random123 library is a collection of counter-based random
+number generators (@ref CBRNG "CBRNGs") for CPUs (C and C++) and GPUs (CUDA and OpenCL), as described in
+<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers:  As Easy
+as 1, 2, 3</i>, Salmon, Moraes, Dror & Shaw, SC11, Seattle, Washington, USA, 2011, ACM </a>.
+They are intended for use in statistical
+applications and Monte Carlo simulation
+and have passed all of the rigorous
+SmallCrush, Crush and BigCrush tests in the 
+<a href="http://www.iro.umontreal.ca/~simardr/testu01/tu01.html">
+extensive TestU01 suite</a> of statistical tests for random number generators.
+They are \b not suitable for use in cryptography or security
+even though they are constructed using principles drawn from cryptography.
+
+CBRNGs are as fast as, or faster than conventional RNGs, much
+easier to parallelize, use minimal memory/cache resources, and
+require very little code.  On modern architectures, the
+Random123 CBRNGs require a few cycles per byte of random data
+returned and return random data in convenient sizes (arrays of
+two or four elements, each element is an unsigned integer of 32
+or 64 bits.  The range of random numbers is the full
+representable range of the 32 or 64 bit unsigned integer) 
+The \c <Random123/u01.h> header contains utility functions
+to convert 32- and 64-bit unsigned integers to open or closed
+ranges of single or double precision floating point numbers.
+
+The Random123 library was written by John Salmon and Mark Moraes.  It is
+available from
+<a href="http://deshawresearch.com/resources_random123.html">
+http://deshawresearch.com/resources_random123.html.</a>  Please see
+the @ref LICENSE "license" for terms and conditions.  Please 
+send
+feedback, including bug reports, suggestions, patches, etc. to
+random123 at deshawresearch.com.
+
+\section overview Overview
+
+Unlike conventional RNGs, counter-based RNGs are 
+<b>stateless</b> functions (or function classes i.e. functors) whose
+arguments are a \e counter, and a \e key
+and returns a result of the same type as the counter.
+
+	result = CBRNGname(counter, key)
+
+The returned result is a deterministic function of the key and counter,
+i.e. a unique (counter, key) tuple will always produce the same
+result.  The result is highly sensitive to small changes in the inputs,
+so that the sequence of values produced by simply
+incrementing the counter (or key) is effectively indistinguishable from a
+sequence of samples of a uniformly distributed random variable.
+
+For all the CBRNGs in the Random123 library, the result and
+counter are the same type, specifically an array of \e N words,
+where words have a width of \e W bits, encapsulated in @ref
+arrayNxW "r123arrayNxW" structs, or equivalently, for C++, in
+the @ref r123::Array1x32 "ArrayNxW" typedefs in the r123
+namespace.   Keys are usually also arrayMxW types, but sometimes M is
+a different size than the counter N (e.g. Philox keys are half the
+number of elements as the counter, Threefry and ARS are the same number,
+AES uses an opaque key type rather than an array)  The N random
+numbers returned in \c result.v[] are unsigned integers of
+width W (32 or 64), and the range of the random numbers is the full
+range of the unsigned integer of that width (i.e. 0 to 2^W-1)
+
+In C++, all public names (classes, structs, typedefs, etc) are in the
+\c r123 namespace.  In C, the public names (functions, enums, structs,
+typedefs) begin either with \c %r123 or with one of the RNG family names, e.g., \c
+threefry, \c philox, \c ars, \c aesni.  The RNG functions themselves have names like
+\c philox4x32.  C++ class names are capitalized, e.g., \c Threefry4x32.
+
+\section families The different families of Random123 generators
+
+Several families of CBRNGs are available in this version of the library:
+<ul>
+<li> @ref ThreefryNxW "Threefry" is a <b>non-cryptographic</b>
+adaptation of the Threefish block cipher from the <a href="http://www.skein-hash.info/"> Skein Hash Function</a>.  
+See @ref r123::Threefry2x32, @ref r123::Threefry4x32, @ref r123::Threefry2x64, @ref r123::Threefry4x64.
+<li> @ref PhiloxNxW "Philox" uses a Feistel network and integer multiplication.
+See @ref r123::Philox2x32, @ref r123::Philox4x32, @ref r123::Philox2x64, @ref r123::Philox4x64.
+The Nx64 forms are only available on hardware
+that supports 64-bit multiplication producing a 128-bit result.
+<li> @ref AESNI "AESNI" uses the Advanced Encryption Standard (AES) New Instruction,
+available on certain modern x86 processors (some models of Intel Westmere and Sandy Bridge,
+and AMD Interlagos, as of 2011).   AESNI CBRNGs can operate on four 32bit words (internally converting
+them to the 128bit SSE type needed by the AES-NI instructions, or on a single m128i "word", 
+which holds the SSE type.
+See @ref r123::AESNI4x32, @ref r123::AESNI1xm128i.
+<li> @ref AESNI "ARS" (Advanced Randomization System) is a \b non-cryptographic simplification of @ref AESNI "AESNI".
+See @ref r123::ARS4x32_R, @ref r123::ARS1xm128i_R.
+</ul>
+
+\section install Installation and Testing
+
+The Random123 library is implemented entirely in header files.  Thus,
+there is nothing to compile before using it and nothing to link after
+you have <c>\#include</c>d it in your source files.  Simply direct your C or
+C++ compiler to find the header files in the \c include/ directory that
+was unpacked from the distribution tar file and use the Random123
+header files, types and functions in your application.  
+
+In addition to the \c include/ files which implement the library the
+distribution also contains an \c examples/ directory.  Users are <b>
+STRONGLY ADVISED </b> to compile and run the tests in examples/ before using
+Random123 in an application (see <c> @ref ExamplesREADME "examples/README"</c>).
+Do not use the library if any tests fail.  (It is not a failure for
+a test to report that it cannot run because of missing
+hardware capabilities like 64bit multiply,
+SSE, AES-NI or compiler capabilities)
+
+\section usage Usage
+
+\subsection CxxAPI C++ API
+
+A typical C++ use case might look like:
+
+ at code
+#include <Random123/philox.h>
+
+typedef r123::Philox4x32 RNG;
+RNG rng;
+RNG::ctr_type c={{}};
+RNG::ukey_type uk={{}};
+uk[0] = ???; // some user_supplied_seed
+RNG::key_type k=uk;
+
+for(...){
+   c[0] = ???; // some loop-dependent application variable 
+   c[1] = ???; // another loop-dependent application variable 
+   RNG::ctr_type r = rng(c, k);
+   // use the random values in r for some operation related to
+   // this iteration on objectid
+}
+ at endcode
+
+On each iteration,\c r contains an array of 4 32-bit random values that
+will not be repeated by any other call to \c rng as long as \c c and \c k
+are not reused.
+
+In the example above, we use the @ref r123::Philox4x32, but any of the
+other @ref CBRNG "CBRNGs" would serve equally well.  Also note that
+for most CBRNGs, the ukey_type and the key_type are identical; the code
+could just as well ignore the ukey_type and directly construct the
+key_type.  However, for the @ref AESNI "AESNI" CBRNGs, the key_type is opaque, and
+must be constructed from a ukey_type, as shown.
+
+\subsection Capi The C API
+
+In C, the example above could be written as:
+ at code
+#include <Random123/philox.h>
+
+philox4x32_ctr_t c={{}};
+philox4x32_ukey_t uk={{}};
+
+uk.v[0] = user_supplied_seed;
+philox4x32_key_t k = philox4x32keyinit(uk);
+
+for(...){
+    c.v[0] = ???; /* some loop-dependent application variable */
+    c.v[1] = ???; /* another loop-dependent application variable */
+    philox4x32_ctr_t r = philox4x32(c, k);
+}
+ at endcode
+
+In C, access to the contents of the counter and key is through
+the fixed-size array member \c v.
+
+\section cuda The CUDA platform
+
+All relevant functions in the C and C++ APIs for Random123 are declared
+as CUDA device functions if they are included in a CUDA kernel source file
+and compiled with a CUDA compiler (nvcc).  They can be used exactly
+as described/documented for regular C or C++ programs.  Note that
+CUDA device functions and host functions share the same namespace, so
+it is not currently possible to use Random123 functions in 
+both the host portion and the device portion of the same .cu source file.
+To work around this, you must compile Random123-using host code in
+a separate .c source file from your .cu device-resident code.
+The Nx32 forms are faster than the Nx64 variants on current (2011)
+32-bit GPU architectures.
+
+It has been reported that Random123 uses 16 bytes of
+static memory per thread.  This is undesirable and not intentional,
+but we do not have a workaround other than to suggest adjusting memory
+allocation accordingly.
+
+The  
+pi_cuda.cu and pi_cudapp.cu examples illustrate the use of CUDA.
+
+\section opencl The OpenCL platform
+
+The functions in the Random123 C API can all be used in
+OpenCL kernels, just as in regular C functions. 
+As with CUDA, the Nx32 forms are faster than the Nx64 variants on current (2011)
+32-bit GPU architectures.
+
+The pi_opencl.c and pi_opencl_kernel.ocl examples illustrate the use
+of OpenCL.
+
+\section cplusplus0x C++0X \<random\> interface
+
+In addition to the stateless ("pure/functional") C++ API above,
+the Random123 package includes two C++ classes
+that leverage the C++0X \<random\> API.
+
+<ul>
+<li>r123::MicroURNG provides an adapter class that provides a
+more conventional interface compatible with the C++0X URNG
+(uniform random number generator) API; the MicroURNG adapter can
+be used with C++0x random number distributions and is
+fast/lightweight enough that a new MicroURNG can be instantiated
+with a unique key,counter tuple and used for each call to a
+distribution, there is little or no overhead to creating
+billions of unique MicroURNGs.  This adapter retains one of the
+key advantages of CBRNGs -- complete application control over
+the RNG state.
+<li>r123::Engine provides the C++0x Random Engine API.  This can
+also be used with any of the C++0X random distributions, but
+sacrifices the application control over RNG state that is a
+defining characteristic of CBRNGs.
+</ul>
+
+\section gsl The GNU Scientific Library (GSL) interface
+
+In addition to the stateless ("pure/functional") C API above,
+the Random123 package includes two C adapter interfaces
+to the <a href="http://www.gnu.org/s/gsl/">GNU Scientific Library (GSL).</a>
+
+<ul>
+<li>The \ref GSL_MICRORNG macro allows the application to
+define a GSL random number generator.  It
+can be used with GSL random distributions but still provides the
+application with complete control over the RNG state (it is
+analogous to the MicroURNG class, in that it uses shorter
+periods, and is intended to be instantiated in large numbers for
+a few calls to the random distribution).
+<li>The \ref GSL_CBRNG macro allows the application to create a GSL
+RNG with a completely conventional interface, sacrificing
+application control over the internal RNG state.
+</ul>
+
+\section u01 Generating uniformly distributed and Gaussian distributed floats and doubles
+
+The Random123 library provides generators for uniformly distributed
+random \b integers.  Often, applications want random \b real values or
+samples from other distributions.  The general problem of generating
+samples from arbitrary distributions is beyond the scope of the Random123
+library.  One can, of course, use GSL or MicroURNG and the
+distributions in the C++11 \<random\> library, but a few simple cases
+are common enough that all that extra machinery seems like overkill.
+We have included code in the examples/ directory which developers may
+find useful.
+
+<ul>
+<li>    examples/uniform.hpp - C++ functions that convert random integers to
+         random, uniformly distributed floating point values.
+<li>    examples/u01fixedpt.h - C functions that convert random integers to
+         random, uniformly distributed, equi-spaced, i.e., fixed point,
+         values.
+<li> examples/ua.hpp - C++11 functions that convert r123arrays of
+     uniformly distributed integers into std::arrays of uniformly
+     distributed floating point types.  The return type is std::array
+     because it is far easier, with template logic, to return a
+     std::array of the correct size than an r123array of the correct
+     size.
+<li>    examples/boxmuller.hpp - C++ functions that take two
+         uniformly distributed integers (32 or 64 bit) and
+         return a pair of Gaussian distributed floats or doubles.
+</ul>
+
+The Box-Muller method of generating Gaussian random variables is
+particularly well suited to Random123 because it deterministically
+consumes exactly two uniform randoms to generate exactly two gaussian
+randoms.  It uses math library functions: sincos, log and sqrt which
+may be slow on some platforms, but which are surprisingly fast on
+others.  Notably, on GPUs, the lack of branching in the Box-Muller
+method and hardware support for math functions overcomes the
+transcendental function overhead, making it the fastest generator of
+Gaussians that we are aware of.
+
+\subsection Examples Tests and Benchmarks
+
+The @ref ExamplesREADME "examples/" directory, contains tests, examples and benchmarks.
+
+<ul>
+<li> Unit tests for individual components and "known-answer-tests", which
+should be run to ensure that these RNGs build correctly on desired platforms.
+These help to provide assurance that the code is being compiled correctly.
+<li> Complete, short programs estimate pi by counting the number of random
+points that fall inside a circle inscribed in a square, demonstrating
+the C, C++, AES, GSL, OpenCL, CUDA and C++0x APIs.
+<li> Header files, including uniform.hpp, ufixed01.h, ua.hpp, and boxmuller.hpp containing code that
+users may find useful but that are outside the scope of the Random123 library itself.
+<li> Some highly abstracted timing harnesses are provided
+which measure performance of a variety of generators in different
+programming environments.
+</ul>
+
+\section portability Portability
+
+Although we have done our best to make Random123 portable and standards conforming,
+it is an unfortunate fact that there is no portable code.  There is only
+code that has been ported.
+We have tested the Random123 library with the following infrastructure
+
+<ul>
+<li>Linux, gcc (multiple versions from 3.4.3 through 4.8.1), on x86_64.
+<li>Linux, clang-2.9, 3.0, 3.1 and 3.3 on x86_64.
+<li>Linux, clang-3.0 and 3.1 with lib++ (2012-04-19 svn checkout) on x86_64.
+<li>Linux, open64-4.2.4 on x86_64.
+<li>Linux, Intel icc and icpc 12.0.2 on x86_64.
+<li>Linux, OpenCL (NVIDIA SDK 4.0.17) on GTX480, M2090, GTX580 and GTX680 GPUs.
+<li>Linux, OpenCL (AMD APP SDK 2.4 or 2.5), on x86_64 CPUs and Radeon HD6970 GPUs.
+<li>Linux, OpenCL (Intel OpenCL 1.5), on x86_64 CPUs.
+<li>Linux, NVIDIA CUDA 4.1.15, 4.2.6 and 5.5.22.  (NOTE: We recommend against the use of CUDA before 4.1)
+<li>Linux, gcc-4.1.2 and 4.4.1 on x86.
+<li>Solaris, both gcc-3.4.3 and Sun C/C++ 5.8, on x86_64.
+<li>FreeBSD 8.2, gcc-4.2.1, on x86_64.
+<li>MacOS X 5.8, gcc-4.0.1, on x86.
+<li>MacOS X 5.8, llvm-2.9.1 on x86 (problems with catching C++ exceptions).
+<li>Windows 7, Microsoft Visual Studio, version 10.0, Microsoft C/C++ compiler 16.00.
+</ul>
+
+Others have reported success on
+<ul>
+<li>MacOS, OpenCL on x86_64 CPUs
+<li>Linux, gcc-4.7.2 on Powerpc64 (BlueGene/Q)
+<li>Linux, Portland Group Compiler on Powerpc64 (BlueGene/Q)
+<li>Linux, IBM xlc on Powerpc64 (BlueGene/Q)
+</ul>
+
+We welcome feedback to random123 at deshawresearch.com about ports to other environments.
+
+We are grateful for contributions from the following users:
+<ul>
+<li> Geoffrey Irving and Gabriel Rockefeller - BlueGene/Q and powerpc ports
+<li> Yan Zhou - MacOS and clang ports
+</ul>
+*/
+
+
diff --git a/lib/Random123-1.08/docs/releasenotes.dox b/lib/Random123-1.08/docs/releasenotes.dox
new file mode 100644
index 0000000..baacbcc
--- /dev/null
+++ b/lib/Random123-1.08/docs/releasenotes.dox
@@ -0,0 +1,125 @@
+/**
+ at page "Release Notes"
+<dl>
+<dt>1.08 - Aug 20, 2013 </dt>
+<dd><ul>
+<li> Fix a bug in threefry2xW whereby rotation constants were
+chosen incorrectly after the 20th round.  There is no reason to
+suspect that the incorrectly chosen rotation constants were "bad"
+or "deficient" so there is no reason to suspect the quality of the
+random numbers produced.  Using threefry with R>20 would have been
+rare in any case.  The fix simply makes the implementation correspond 
+correctly to the description in the paper.
+<li> Add examples/uniform.hpp, examples/boxmuller.hpp and
+     examples/ua.hpp, containing example code to generate uniformly
+     and gaussian distributed floats and doubles.  Also add unit tests
+     (ut_uniform.cpp, ut_uniform_IEEEkat.cpp) and timing harnesses
+     (time_boxmuller.cpp and time_boxmuller_cuda.cpp).
+<li> Demote u01.h from the include/Random123/ to examples/ufixed01.h, but
+     examples/uniform.hpp is preferred.
+<li> Add kat_vectors for threefry2xW_32 and threefry4xW_72, i.e., the
+largest number of supported rounds in each case.
+<li> Mention ukey on the first page of docs.
+<li> Fix typos in documentation and comments and in gccfeatures.h.
+<li> Don't #include <x86intrin.h> unless (defined(__x86_64__)||defined(__i386__)).
+<li> Use __clang__ rather than __llvm__ in the predicate that decides whether to
+     include clangfeatures.h.
+<li> Add support for Portland Group compilers.
+<li> Add support for gcc and IBM XL compilers on powerpc64, e.g. BlueGene/Q.
+<li> Refuse to build with CUDA before 4.1 to avoid namespace bug.
+</ul></dd>
+
+<dt>1.07 - Nov 7, 2012 </dt>
+<dd><ul>
+<li> Provide const static data members:  _Min and _Max in Engine and MicroURNG, which
+work around a non-standard requirement imposed by the MacOS Xcode 4.5.2 <random> library.
+<li> Fine-grained test macros for specific features of C++11 rather than
+an all-or-none USE_CXX0X macro.  Features tested:
+constexpr, unrestricted unions, explicit conversions, <random> and <type_traits>.
+<li> Declare max() and min() methods with the R123_CONSTEXPR attribute
+in Engine and MicroURNG.
+<li> Improved clang support
+<li> Works with Solaris Sun CC now (requires -library=stlport4)
+<li> NVIDIA GTX6x0 should report correct core count
+<li> ut_features prints the list of features that compile on the build platform
+<li> Compiles cleanly with -Wall -Wextra (implying -Wunused-parameter -Wsign-compare)
+</ul></dd>
+
+<dt>1.06 - Apr 5, 2012 </dt>
+<dd><ul>
+<li> Added a known answer test for the u01 functions (kat_u01).
+<li> Defend headers against possible max and min macros in "system" header files.
+</ul></dd>
+
+<dt>1.05 - Mar 20, 2012 </dt><dd>
+<ul><li>
+MicroURNG and GSL_MICROURNG no longer give the programmer control
+over the number bits in the internal counter via a template or macro argument.
+Such flexibility is too easy to misuse, with the possible consequence
+of repeating random values.  Now, all MicroURNGs have a period in
+excess of 2^32, and MicroURNG<CBRNG>(c1, k1)
+and MicroURNG<CBRNG>(c2, k2) "collide" if and only if c1==c2 and k1==k2.</li>
+<li>Added <Random123/u01.h> header file with static functions for conversion
+of integers to uniformly distributed floating point values.</li>
+<li>Make operator<<(ostream&, const r123array&) and operator>>(ostream&, r123array&)
+inline.  This should work around ODR violations when the header files are
+included in more than one file in a project.</li>
+<li>Recognize that icpc has an _mm_set_epi64x intrinsic as of version 12.1.</li>
+<li>The gsl adapters always return 32-bits of random data, regardless of the
+width of counter type.</li>
+<li>Works around lack of anonymous enums in Intel OpenCL 1.5</li>
+<li>gencl.sh works on MacOS and systems with "classic" BSD indent.</li>
+<li>Tests run on AMD Radeon 7970 (Tahiti).</li>
+</ul>
+
+</dd>
+
+<dt>1.04 - Dec 5, 2011</dt><dd>
+<ul><li>
+new kat_vectors - there are now three tests for each tested generator: gen(ctr=0, key=0), gen(ctr=fff, key=0xfff),
+    and gen(ctr=digits-of-pi, key=more-digits-of-pi).  There are fewer tests overall, but they provide
+    better coverage, especially of non-zero keys.</li>
+</ul>
+</dd>
+
+<dt>1.03 - Nov 30, 2011</dt><dd>
+<ul>
+<li> overhaul known answer tests (kat)
+   <ul>
+   <li> common source for serial C, C++, cuda and opencl replaces katc and katpp </li>
+   <li> add missing kat_vectors for threefry2x32 </li>
+   </ul></li>
+<li> make keyinit functions device/kernel functions in CUDA/OpenCL </li>
+<li> replace r123array::assemble methods with r123array::seed(SeedSeq) template </li>
+<li> cleanup of signatures of Engine and MicroURNG methods: 
+   <ul>
+      <li> Engine(ukey_type&) and MicroURNG(ctr_type, ukey_type) constructors.</li>
+      <li> Engine(SeedSeq&) takes a reference argument, and, when C++0x <type_traits>
+           are available the SeedSeq templates don't participate in "surprising" overloads. </li>
+   </ul>
+</li>
+</ul>
+</dd>
+
+<dt>1.02 - Nov 21, 2011</dt><dd>
+<ul>
+<li>
+<b> BUG FIXED </b> in threefry2xW_R(R<20, ...).  Earlier implementations of
+threefry2x32_R and threfry2x64_R produced incorrect
+results when called with the number of rounds less than 20.
+The bug caused extra work to be done in every call, possibly resulting in <i>more</i>
+mixing than the correct implementation delivers.  Both old (buggy, more mixing) and new (bug-fixed, less mixing)
+implementations have been rechecked and are fully "Crush-Resistant". </li>
+<li>worked around problems with argument marshalling in version 2.4 of the AMDAPPSDK OpenCL implementation</li>
+</ul>
+</dd>
+
+<dt>1.01 - Nov 11, 2011</dt><dd>
+<ul>
+<li>allow the user to define __STDC_CONSTANT_MACROS</li>
+<li>allow r123arrayNxW::incr(larger_than_largest_value_type)</li>
+</ul>
+
+<dt>1.00 - Sep 26, 2011</dt><dd>Initial release</dd>
+</dl>
+*/
diff --git a/lib/Random123-1.08/examples/BUILD.LOG b/lib/Random123-1.08/examples/BUILD.LOG
new file mode 100644
index 0000000..809b8b4
--- /dev/null
+++ b/lib/Random123-1.08/examples/BUILD.LOG
@@ -0,0 +1,35 @@
+cc -O -I../include   kat_c.c   -o kat_c
+g++ -O -I../include   kat_cpp.cpp   -o kat_cpp
+nvcc -O -I../include   kat_cuda.cu   -o kat_cuda
+CC="cc" CPPFLAGS="-I../include" ./gencl.sh kat_opencl_kernel.ocl kat_opencl_kernel.i
+cc -O -I. -I../include   kat_opencl.c  -lOpenCL -o kat_opencl
+g++ -O -I../include   pi_aes.cpp   -o pi_aes
+cc -O -I../include   pi_capi.c   -o pi_capi
+g++ -O -I../include   pi_cppapi.cpp   -o pi_cppapi
+nvcc -O -I../include   pi_cuda.cu   -o pi_cuda
+nvcc -O -I../include   pi_cudapp.cu   -o pi_cudapp
+cc -O `gsl-config --cflags` -I../include   pi_gsl.c  `gsl-config --libs` -o pi_gsl
+g++ -O -I../include   pi_microurng.cpp   -o pi_microurng
+CC="cc" CPPFLAGS="-I../include" ./gencl.sh pi_opencl_kernel.ocl pi_opencl_kernel.i
+cc -O -I. -I../include   pi_opencl.c  -lOpenCL -o pi_opencl
+g++ -O -I../include   pi_uniform.cpp   -o pi_uniform
+cc -O -I../include   simple.c   -o simple
+g++ -O -I../include   simplepp.cpp   -o simplepp
+g++ -O -I../include   time_boxmuller.cpp   -o time_boxmuller
+nvcc -O -I../include   time_boxmuller_cuda.cu   -o time_boxmuller_cuda
+nvcc -O -I../include   time_cuda.cu   -o time_cuda
+CC="cc" CPPFLAGS="-I../include" ./gencl.sh time_opencl_kernel.ocl time_opencl_kernel.i
+cc -O -I. -I../include   time_opencl.c  -lOpenCL -o time_opencl
+cc -O -I../include   time_serial.c   -o time_serial
+cc -O -I../include -D_REENTRANT=1 -D_THREAD_SAFE=1   time_thread.c  -lpthread -o time_thread
+g++ -O -I../include   timers.cpp   -o timers
+g++ -O -I../include   ut_Engine.cpp   -o ut_Engine
+g++ -O -I../include   ut_M128.cpp   -o ut_M128
+g++ -O -I../include   ut_ReinterpretCtr.cpp   -o ut_ReinterpretCtr
+g++ -O -I../include   ut_aes.cpp   -o ut_aes
+cc -O -I../include   ut_ars.c   -o ut_ars
+g++ -O -I../include   ut_carray.cpp   -o ut_carray
+g++ -O -I../include   ut_features.cpp   -o ut_features
+cc -O `gsl-config --cflags` -I../include   ut_gsl.c  `gsl-config --libs` -o ut_gsl
+g++ -O -I../include   ut_ua.cpp   -o ut_ua
+g++ -O -I../include   ut_uniform.cpp   -o ut_uniform
diff --git a/lib/Random123-1.08/examples/BUILDVC.BAT b/lib/Random123-1.08/examples/BUILDVC.BAT
new file mode 100644
index 0000000..875231a
--- /dev/null
+++ b/lib/Random123-1.08/examples/BUILDVC.BAT
@@ -0,0 +1,50 @@
+:: Call this with either x86 (for 32bit compile on a 32bit machine),
+:: amd64 (if you want to do a 64bit compile on a 64bit machine),
+:: or x86_amd64 (if you want to compile for amd64 on an x86)
+:: With no argument, will default to amd64 on Win64 and x86 otherwise.
+:: Call this with the argument "run" if you want to only run the 
+:: previously compiled executables.
+ at echo off
+setlocal
+if not "%1"=="run" goto :Default
+set CC=echo
+set CFLAGS=
+goto :Loop
+
+:Default
+if "%~1"=="" goto :Guess
+set NEWBUILDVC=%1
+goto :Next
+
+:Guess
+set RegQry=HKLM\Hardware\Description\System\CentralProcessor\0
+REG.exe Query %RegQry% > hwdesc.o
+FIND /i "x86" < hwdesc.o > hwcheck.o
+if %errorlevel% == 0 (
+set NEWBUILDVC=x86
+) else (
+set NEWBUILDVC=amd64
+)
+
+:Next
+if "%BUILDVC%"=="%NEWBUILDVC%" goto :Continue
+if NOT DEFINED VCBAT set VCBAT="c:\Program Files (x86)\Microsoft Visual Studio 10.0\vc\vcvarsall.bat"
+call %VCBAT% %NEWBUILDVC%
+if errorlevel 1 exit /b 1
+set BUILDVC=%NEWBUILDVC%
+
+:Continue
+:: /Zi for debug.  /favor:INTEL64 is ignored for 32bit compiles.
+if NOT DEFINED CFLAGS set CFLAGS=/DR123_NO_SINCOS=1 /I..\include /W3 /Ox /EHs /nologo /favor:INTEL64
+set CC=cl
+echo Using %VCBAT%
+echo Building for %BUILDVC% with %CC% %CFLAGS%
+
+:Loop
+set BUILDFILES= ( kat_c.c kat_cpp.cpp pi_aes.cpp pi_capi.c pi_cppapi.cpp pi_microurng.cpp simple.c simplepp.cpp time_serial.c time_boxmuller.cpp timers.cpp ut_Engine.cpp ut_M128.cpp ut_ReinterpretCtr.cpp ut_aes.cpp ut_ars.c ut_carray.cpp ut_features.cpp ut_uniform.cpp )
+FOR %%A IN %BUILDFILES% DO (
+	%CC% %CFLAGS% %%A
+	if errorlevel 1 exit /b 1
+	%%~nA 
+	if errorlevel 1 exit /b 1 )
+endlocal
diff --git a/lib/Random123-1.08/examples/BUILDVC11.BAT b/lib/Random123-1.08/examples/BUILDVC11.BAT
new file mode 100644
index 0000000..d1e329b
--- /dev/null
+++ b/lib/Random123-1.08/examples/BUILDVC11.BAT
@@ -0,0 +1,6 @@
+rem /DR123_USE_CXX11=1 will not work because VS2012 is not fully C++11 compliant yet.
+setlocal
+set CFLAGS=/I..\include /W3 /Ox /EHs /nologo /favor:INTEL64
+set VCBAT="c:\Program Files (x86)\Microsoft Visual Studio 11.0\vc\vcvarsall.bat"
+call BUILDVC.bat %1
+endlocal
diff --git a/lib/Random123-1.08/examples/GNUmakefile b/lib/Random123-1.08/examples/GNUmakefile
new file mode 100644
index 0000000..9c277ab
--- /dev/null
+++ b/lib/Random123-1.08/examples/GNUmakefile
@@ -0,0 +1,133 @@
+no_target_specified: runcore
+	@echo
+	@echo The default make rule is equivalent to \'make runcore\' which runs only the most basic tests.
+	@echo The following \'meta-targets\' are available:
+	@echo "      " $(meta_targets)
+	@echo Here is the complete list of individual program targets:
+	@echo "      " $(all_primary_targets)
+	@echo Prepend \'run\' to any of the program targets or metatargets
+	@echo to run the binary and check for a zero exit status.
+	@echo Adding force=1 on the command line causes all targets to be considered out-of-date.
+.PHONY: no_target_specified
+
+# metatargets are variables which get mapped by METATARGET_template
+meta_targets:=kat core aesni timing c cpp gsl thread cuda opencl
+
+# Platform metatargets: each one typically has specific requirements in the build environment.
+# c is C99 (will work in MSVC), cpp is C++98, gsl requires the GNU Scientific Library
+# (specifically, the gsl-config program in the PATH), thread requires POSIX threads,
+# CUDA requires NVIDIA CUDA 3.x or newer, OpenCL requires OpenCL includes & libraries
+# (e.g. AMD APP SDK, NVIDIA SDK)
+c:=kat_c pi_capi simple ut_ars time_serial
+cpp:=kat_cpp pi_uniform pi_cppapi simplepp ut_carray ut_M128 ut_features ut_ReinterpretCtr ut_Engine ut_aes pi_aes timers pi_microurng time_boxmuller ut_ua ut_uniform
+gsl:=pi_gsl ut_gsl
+thread:=time_thread
+cuda:=pi_cuda pi_cudapp time_cuda kat_cuda time_boxmuller_cuda
+opencl:=pi_opencl time_opencl kat_opencl
+
+# Convenience metatargets: these are to help developers test functional subsets across platforms
+kat:=kat_c kat_cpp
+core:=$(c) $(cpp)
+aesni:=pi_aes ut_aes ut_ars
+timing:=timers time_serial time_thread
+
+$(gsl) : override LDLIBS += `gsl-config --libs`
+$(gsl) : override CFLAGS += `gsl-config --cflags`
+
+$(opencl) : % : %_kernel.i
+$(opencl) : override LDLIBS+=-lOpenCL
+$(opencl) : override CFLAGS+=-I.
+# Note, the Intel OpenCL SDK (1.5) has unresolved C++ symbols in its
+# libOpenCL.so Even though 'main' is a C program, you may need to link
+# it with a C++ compiler-driver, e.g., g++.  Since this Makefile does
+# compile-and-link in one step, use something like:
+# $(opencl) : CC=g++ -xc
+# which will invoke the g++ compiler-driver, but will treat the
+# program as C rather than C++.
+
+# N.B. gcc -pthread (without the -l) on linux at compile time also
+# adds -D_REENTRANT.  Unfortunately -pthread is unrecognized by
+# SunPRO.  Posix says that -lpthread is portable (as if anyone cares
+# what Posix says), and it seems to work in all the environments we've
+# tested.  Gcc's features.h says that _THREAD_SAFE is "often used by
+# other systems" as a synonym for _REENTRANT.  Cross your fingers...
+$(thread) : override LDLIBS+=-lpthread
+$(thread) : override CPPFLAGS+=-D_REENTRANT=1 -D_THREAD_SAFE=1
+
+all_primary_targets += $(addsuffix _kernel.i, $(opencl))
+
+################################################
+# Generic boilerplate from here down:
+vpath %.c $(srcdir/)
+vpath %.cpp $(srcdir/)
+vpath %.cu $(srcdir/)
+vpath %.ocl $(srcdir/)
+
+define METATARGET_template
+.PHONY: $(1)
+$(1) : $(filter-out $(SKIP_TARGETS), $($(1)))
+.PHONY: run$(1)
+run$(1) : $(addprefix run, $(filter-out $(SKIP_TARGETS), $($(1))))
+all_primary_targets += $($(1))
+endef
+
+$(foreach T,$(meta_targets), $(eval $(call METATARGET_template,$(T))))
+
+# sort also does 'uniq'
+all_primary_targets:=$(sort $(all_primary_targets))
+
+INC=$(srcdir/)../include
+override CPPFLAGS += -I$(INC)
+
+ifndef NVCC
+NVCC:=nvcc
+endif
+# The rngs are *very* slow without optimization.  In the simplest case,
+# where the user just calls 'make', we don't want them to see terrible
+# performance.  Unfortunately, this might surprise someone
+# who says, e.g., make CPPFLAGS=-O0.  Oh well...
+ifndef CFLAGS
+CFLAGS:=-O
+endif
+ifndef CXXFLAGS
+CXXFLAGS:=-O
+endif
+
+%.i : %.ocl
+	CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" $(srcdir/)./gencl.sh $< $@
+
+% : %.cu
+	$(NVCC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+% : %.c
+	$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+% : %.cpp
+	$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+run% : %
+	./$^ $(RUN_ARGS)
+
+# In lieu of autodepends, just say that all the compilation targets depend on all the headers.
+hdrs:=$(wildcard $(srcdir/)*.h $(srcdir/)gsl/*.c $(INC)/Random123/*.h $(INC)/Random123/*.hpp $(INC)/Random123/*/*.h $(INC)/Random123/*/*.hpp)
+misc:=$(wildcard $(srcdir/)*.cu $(srcdir/)*.ocl)
+$(all_primary_targets) : $(hdrs)
+$(misc) : $(hdrs)
+
+# If you put force=y on the command line, then $(all_primary_targets) will be
+# depend on FORCE, and hence will not be up-to-date.
+ifdef force
+$(all_primary_targets) : FORCE
+FORCE:
+endif
+
+.PHONY : echo_primary_targets
+echo_primary_targets:
+	@echo $(all_primary_targets)
+
+.PHONY : clean veryclean
+clean:
+	rm -f $(all_primary_targets)
+
+veryclean:
+	rm -f $(all_primary_targets) *.o \#* *~ *.pdb *.exe *.obj *.ilk *.suo
diff --git a/lib/Random123-1.08/examples/README b/lib/Random123-1.08/examples/README
new file mode 100644
index 0000000..254efbc
--- /dev/null
+++ b/lib/Random123-1.08/examples/README
@@ -0,0 +1,196 @@
+This file is examples/README and is also linked to from the doxygen main page.
+
+/**
+ at page ExamplesREADME Examples, Tests and Benchmarks
+
+The examples/ directory contains tests, examples and timing
+harnesses for the components of the Random123 library.
+
+ at section building Compiling and Running the code
+
+Installing and using Random123 requires only the use
+of the header files, and  has no prerequisites other than
+a reasonable C99 or C++98 compiler.
+
+With a modern GNU make (3.80 or newer), building and running the core tests
+and examples can be as easy as running gmake with no arguments.
+Note, though, that the provided examples/GNUmakefile intentionally avoids setting
+any of the standard make variables:  CC, CXX, CPPFLAGS, CFLAGS,
+CXXFLAGS, TARGET_ARCH, LDFLAGS,  LOADLIBES, LDLIBS.  GNU make
+will inherit settings for these variables from the environment,
+or they may be set on the command line.  If none  are set,
+compilation will proceed using system-wide default flags, generally
+without advanced optimization, architectural tuning, warnings, or other
+common options.  
+
+Before putting the Random123 library to use in an application,
+it is important to test it using the same compiler flags and
+features that the application will use.  In other words,
+the conventional make variables should be set
+the same way when testing the library as they will be set when the
+library is actually compiled into your application.
+Something like:
+ at code
+gmake CFLAGS="-std=c99" CXXFLAGS="-std=c++0x" CPPFLAGS="/alternate/location/include -O3 -Wall -Wstrict-aliasing=2" TARGET_ARCH="-march=native"
+ at endcode
+would confirm that all is well with optimization on, and output targeted at
+an architecture with the same capabilities as the machine running the compilation.
+
+Very old versions of GNU make (pre-2002) or non-GNU
+make will not work with examples/GNUmakefile.. Lacking a suitably modern GNU make,
+our advice is to invoke the
+C or C++ compiler directly on the source files in the examples/ directory.
+The file: examples/BUILD.LOG contains a list of sample build commands.  They
+will almost certainly need to be adapted to the target system.
+For Windows users, BUILDVC.BAT invokes the Microsoft
+Visual Studio compiler.  Edit it as needed for your platform.
+
+ at section tests Tests
+
+It is recommended that Random123 be tested <b> on the target system,
+with the target compiler, intended optimization levels, options,
+target architectures, etc.</b>
+before relying it.  The library
+uses architecture- and compiler-specific intrinsics,
+features and assembly language.  We have seen  cases where
+one compiler (open64 version 4.2.4) masquerades as another compiler (it defines __GNUC__) accepts extensions
+specific to the other compiler (__uint128_t)
+without error or warning, and then silently produces incorrect code.
+The only way to guard against this kind of misbehavior is to
+compile and run the tests with the compiler and options that you intend to use and
+the platform that you intend to run on.
+
+ at subsection kat Known Answer Tests
+
+Testing that your compiled code computes the same "Known Answers" as the
+reference implementation which has been subjected to the Crush batteries of
+statistical tests is critically important.
+
+The file \c examples/kat_vectors contains a few thousand "Known Answer
+Test" vectors, i.e., tuples of (method, counter, key, answer).  The
+source file katc.c is incorporated into kat_c.c (C),
+kat_cpp.cpp (C++), kat_cuda.cu (CUDA) and kat_opencl.c
+(OpenCL), which are compiled into kat_c, kat_cpp, kat_cuda
+and kat_opencl, respectively.  Each of these will read kat_vectors
+and verify that the compiled code obtains the same "known answers".
+
+The kat vectors are not language-specific.  Implementations of CBRNGs in
+other languages could also be validated against \c kat_vectors.  The
+kat vectors are also byte-order independent.  In other
+words, the CBRNGs in the library should produce the same numerical
+results on little-endian and big-endian hardware, but this behavior
+is largely untested.
+
+ at subsection ut Unit Tests
+
+examples/ also contains tests of specific components of the library.  While not
+exhaustive, these tests verify that a variety of invariants are satisfied
+by the public methods (e.g., that incr(N) is the same as incr() N times).  They
+also serve to verify some of the compile-time feature-test logic which, if incorrect can
+lead to mysterious errors (e.g., is it necessary to <c>#include <smmintrin.h></c>).
+Unit tests include:
+
+<ul>
+<li> ut_features - verifies compile-time feature-test logic.
+<li> ut_carray - verifies the capabilities of the @ref arrayNxW "r123arrayNxW" types.
+<li> ut_M128 - verifies the capabilities of the r123m128i type (only when SSE2 is available).
+<li> ut_ReinterpretCtr - verifies the r123::ReinterpretCtr wrapper template.
+<li> ut_Engine - verifies the capabilities of the r123::Engine wrapper template.
+<li> ut_aes - verifies that the @ref AESNI "AESNI" cbrngs match known answers from FIPS-197.
+<li> ut_gsl - tests the @ref GSL_CBRNG adapter <b>Requires the GNU Scientific Library</b>.
+</ul>
+
+ at section examples Examples
+
+ at subsection simple Simple examples in C and C++
+
+There are two extremely short examples that show all the code necessary to
+obtain and print a few random numbers in C and C++:
+<ul>
+<li> simple.c 
+<li> simplepp.cpp
+</ul>
+
+ at subsection generation Generation of uniformly distributed real values.
+
+The uniformly distributed integers that the CBRNGs produce are rarely
+what is required by applications.  Sampling other distributions
+is beyond the scope of Random123.  Many
+distributions can be sampled with GSL (using \<Random123/conventional/gsl_cbrng.h\>
+or with C++11's \<random\> (using \<Random123/MicroURNG.hpp\> or \<Random123/conventional/Engine.hpp\>.
+Nevertheless, some distributions are so simple that the
+machinery of \<random\> or GSL seems like overkill.  We provide
+code to generate uniformly distributed real numbers in
+the range (0, 1) and (-1, 1) in two header files:
+<ul>
+<li> uniform.hpp
+<li> u01fixedpt.h
+</ul>
+We encourage you to copy these header files and use them (or modify them)
+to suit your needs.  They are not as thoroughly tested or as portable
+as the headers in the library itself, but they should be safe to use
+on any platform with IEEE-754 floating point support.  They are
+documented in comments in the files themselves.
+
+ at subsection pi Estimating pi using different APIs
+
+Using random numbers to estimate pi is a classic example.  The idea
+is to choose points at random in a square and to count how many of
+them lie within the inscribed circle.  Since the area of the square
+is 4*r^2 and the area of the circle is pi*r^2, the ratio of the
+number of points in the circle to the total number of points should
+approach pi/4 as the number of points grows.
+
+We give several examples of pi estimation, each of
+which illustrates a slightly different API
+
+<ul>
+<li> pi_capi - using only the basic C API
+<li> pi_cppapi - using only the basic C++ API
+<li> pi_u01 - using the C++ API and uniform.hpp
+<li> pi_gsl - using a Random123 generator, but a gsl distribution to obtain real-valued random numbers.  <b>Requires the GNU Scientific Library</b>
+<li> pi_microurng - using a Random123 generator, but a C++0x \<random\> distribution to obtain real-valued random numbers
+<li> pi_cuda - using the Random123  library with CUDA, runnable on an NVIDIA GPU
+<li> pi_cudapp - using the C++ API with CUDA, runnable on an NVIDIA GPU
+<li> pi_opencl - using the Random123 library with OpenCL, runnable on any OpenCL platform: e.g. NVIDIA or ATI GPUs or Intel or AMD CPUs.  The actual
+compute kernel lives in the \c pi_opencl_kernel.ocl file and is transformed by \c gencl.sh into strings that get included in \c pi_opencl.c, since
+the OpenCL kernels get compiled for the target OpenCL platform at run-time
+<li> pi_aes - uses the AESNI4x32 Random123 generator
+</ul>
+
+ at section timers Measuring performance
+
+We include some timing harnesses that can be used to measure
+the performance of these CBRNGs on various platforms. These
+timing harnesses report a cycles-per-byte (cpB) metric, which
+should be independent of clock-rate or number of cores, but
+depends on compilers and the architecture of
+the processor being run on.  They also report aggregate throughput
+in GB/sec:  a more direct
+measure of performance, but one that depends on clock speed
+and number of cores being used.
+The timing harnesses are obscured by tricks required for
+portability across platforms and CBRNG type.
+As a result,
+they are not
+recommended as examples of the use of library
+and its APIs.
+
+<ul>
+<li> time_serial - uses the C API and reports performance for a
+single core.
+<li> timers - uses the C++ API, and is the only tool that reports
+AESNI1xm128i and ARS1xm128i performance (if your CPU supports the AES-NI instruction
+extensions).
+<li> time_thread - uses the C API and pthreads to report
+multithreaded performance, uses all cores available on the platform.
+<li> time_cuda - uses the C API within NVIDIA CUDA to run on NVIDIA GPUs.
+<li> time_opencl - uses the C API within OpenCL to run on GPUs or CPUs.
+</ul>
+
+time_serial, time_thread, time_cuda, time_opencl all use a common 
+kernel defined in time_random123.h.  They all use various 
+util_* header files for utility functions and platform-related
+boilerplate (also used by the pi_* examples).
+
+*/
diff --git a/lib/Random123-1.08/examples/boxmuller.hpp b/lib/Random123-1.08/examples/boxmuller.hpp
new file mode 100644
index 0000000..2946b5a
--- /dev/null
+++ b/lib/Random123-1.08/examples/boxmuller.hpp
@@ -0,0 +1,135 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+// This file implements the Box-Muller method for generating gaussian
+// random variables (GRVs).  Box-Muller has the advantage of
+// deterministically requiring exactly two uniform random variables as
+// input and producing exactly two GRVs as output, which makes it
+// especially well-suited to the counter-based generators in
+// Random123.  Other methods (e.g., Ziggurat, polar) require an
+// indeterminate number of inputs for each output and so require a
+// 'MicroURNG' to be used with Random123.  The down side of Box-Muller
+// is that it calls sincos, log and sqrt, which may be slow.  However,
+// on GPUs, these functions are remarkably fast, which makes
+// Box-Muller the fastest GRV generator we know of on GPUs.
+//
+// This file exports two structs and one overloaded function,
+// all in the r123 namespace:
+//   struct r123::float2{ float x,y; }
+//   struct r123::double2{ double x,y; }
+//
+//   r123::float2  r123::boxmuller(uint32_t u0, uint32_t u1);
+//   r123::double2 r123::boxmuller(uint64_t u0, uint64_t u1);
+//  
+// float2 and double2 are identical to their synonymous global-
+// namespace structures in CUDA.
+//
+// This file may not be as portable, and has not been tested as
+// rigorously as the files in the library itself, i.e., those in
+// ../include/Random123.  Nevertheless, we hope it is useful and we
+// encourage developers to copy it and modify it for their own
+// use.  We invite comments and improvements.
+
+
+#ifndef _r123_BOXMULLER_HPP__
+#define _r123_BOXMULLER_HPP__
+
+#include <Random123/features/compilerfeatures.h>
+#include "uniform.hpp"
+#include <math.h>
+
+namespace r123{
+
+#if !defined(__CUDACC__)
+typedef struct { float x, y; } float2;
+typedef struct { double x, y; } double2;
+#else
+typedef ::float2 float2;
+typedef ::double2 double2;
+#endif
+
+#if R123_NO_SINCOS /* enable this if sincos and sincosf are not in the math library */
+R123_CUDA_DEVICE R123_STATIC_INLINE void sincosf(float x, float *s, float *c) {
+    *s = sinf(x);
+    *c = cosf(x);
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE void sincos(double x, double *s, double *c) {
+    *s = sin(x);
+    *c = cos(x);
+}
+#endif /* sincos is not in the math library */
+
+#if !defined(CUDART_VERSION) || CUDART_VERSION < 5000 /* enabled if sincospi and sincospif are not in math lib */
+
+R123_CUDA_DEVICE R123_STATIC_INLINE void sincospif(float x, float *s, float *c){
+    const float PIf = 3.1415926535897932f;
+    sincosf(PIf*x, s, c);
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE void sincospi(double x, double *s, double *c) {
+    const double PI = 3.1415926535897932;
+    sincos(PI*x, s, c);
+}
+#endif /* sincospi is not in math lib */
+
+/*
+ * take two 32bit unsigned random values and return a float2 with
+ * two random floats in a normal distribution via a Box-Muller transform
+ */
+R123_CUDA_DEVICE R123_STATIC_INLINE float2 boxmuller(uint32_t u0, uint32_t u1) {
+    float r;
+    float2 f;
+    sincospif(uneg11<float>(u0), &f.x, &f.y);
+    r = sqrtf(-2.f * logf(u01<float>(u1))); // u01 is guaranteed to avoid 0.
+    f.x *= r;
+    f.y *= r;
+    return f;
+}
+
+/*
+ * take two 64bit unsigned random values and return a double2 with
+ * two random doubles in a normal distribution via a Box-Muller transform
+ */
+R123_CUDA_DEVICE R123_STATIC_INLINE double2 boxmuller(uint64_t u0, uint64_t u1) {
+    double r;
+    double2 f;
+
+    sincospi(uneg11<double>(u0), &f.x, &f.y);
+    r = sqrt(-2. * log(u01<double>(u1))); // u01 is guaranteed to avoid 0.
+    f.x *= r;
+    f.y *= r;
+    return f;
+}
+} // namespace r123
+
+#endif /* BOXMULLER_H__ */
diff --git a/lib/Random123-1.08/examples/gencl.sh b/lib/Random123-1.08/examples/gencl.sh
new file mode 100755
index 0000000..ab84b71
--- /dev/null
+++ b/lib/Random123-1.08/examples/gencl.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+# Run the C preprocessor on an OpenCL kernel to generate a C string array
+# suitable for clCreateProgramWithSource.  This allows us to create
+# standalone OpenCL programs that do not depend on paths to the source
+# tree (the programs will still run the OpenCL run-time compiler to
+# compile the kernel, but the kernel is a string within the program, with
+# no external include dependencies)
+# Mark Moraes, D. E. Shaw Research
+
+# indenting the cpp output makes errors from the OpenCL runtime compiler
+# much more understandable.  User can override with whatever they want.
+# The classic BSD indent (yes, the one that lived in /usr/ucb/indent once)
+# defaults to -br, but recent GNU indent versions do not.  Both appear to
+# accept -br, fortunately... (BSD indent does not accept -kr or -linux, alas)
+
+PATH=$PATH:/usr/bin
+export PATH
+if type indent > /dev/null 2>&1; then
+	: ${GENCL_INDENT="indent -br"}
+else
+	: ${GENCL_INDENT=cat}
+fi
+
+# We rely on gsub in awk, which exists in everything except classic
+# old V7 awk (Solaris!).  If we can find gawk or nawk, we prefer those.
+# http://www.shelldorado.com/articles/awkcompat.html
+for f in gawk nawk awk; do
+	if type "$f" > /dev/null 2>&1; then
+		: ${GENCL_AWK="$f"}
+		break
+	fi
+done
+case "${GENCL_AWK}" in
+'')	echo "$0: could not find awk!">&2; exit 1;;
+esac
+usage="Usage: $0 inputoclfilename outputfilename"
+case $# in
+2)	;;
+*)	echo "$usage" >&2; exit 1;;
+esac
+case "$1" in
+''|-*)	echo "Invalid or empty inputoclfilename: $1
+$usage" >&2; exit 1;;
+esac
+set -e
+${CC-cc} -xc -E -P -nostdinc -D__OPENCL_VERSION__=1 $CPPFLAGS "$1" | 
+	${GENCL_INDENT} | 
+	${GENCL_AWK} 'BEGIN {print "const static char *opencl_src = \"\\n\\"}
+	{gsub("\\", "\\\\", $0); gsub("\"", "\\\"", $0); print $0 "\\n\\"}
+	END {print "\";"}' > "$2"
diff --git a/lib/Random123-1.08/examples/kat.h b/lib/Random123-1.08/examples/kat.h
new file mode 100644
index 0000000..788cf44
--- /dev/null
+++ b/lib/Random123-1.08/examples/kat.h
@@ -0,0 +1,67 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __katdoth__
+#define __katdoth__
+
+#include <Random123/philox.h>
+#include <Random123/threefry.h>
+#include <Random123/ars.h>
+#include <Random123/aes.h>
+
+enum method_e{
+#define RNGNxW_TPL(base, N, W) base##N##x##W##_e,
+#include "rngNxW.h"
+#undef RNGNxW_TPL
+    unused // silences warning about dangling comma
+};
+
+#define RNGNxW_TPL(base, N, W)                       \
+    typedef struct {                                 \
+        base##N##x##W##_ctr_t ctr;                   \
+        base##N##x##W##_ukey_t ukey;                 \
+        base##N##x##W##_ctr_t expected;              \
+        base##N##x##W##_ctr_t computed;              \
+    } base##N##x##W##_kat;
+#include "rngNxW.h"
+#undef RNGNxW_TPL
+
+typedef struct{
+    enum method_e method;
+    unsigned nrounds;
+    union{
+#define RNGNxW_TPL(base, N, W) base##N##x##W##_kat base##N##x##W##_data;
+#include "rngNxW.h"
+#undef RNGNxW_TPL
+    }u;
+} kat_instance;
+
+#endif
diff --git a/lib/Random123-1.08/examples/kat_c.c b/lib/Random123-1.08/examples/kat_c.c
new file mode 100644
index 0000000..b310594
--- /dev/null
+++ b/lib/Random123-1.08/examples/kat_c.c
@@ -0,0 +1,41 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include "kat_main.h"
+
+#define KAT_KERNEL
+#define KAT_GLOBAL
+#define KAT_UINT size_t
+#include "kat_dev_execute.h"
+
+void host_execute_tests(kat_instance *tests, size_t ntests){
+    dev_execute_tests(tests, ntests);
+}
diff --git a/lib/Random123-1.08/examples/kat_cpp.cpp b/lib/Random123-1.08/examples/kat_cpp.cpp
new file mode 100644
index 0000000..3138dc8
--- /dev/null
+++ b/lib/Random123-1.08/examples/kat_cpp.cpp
@@ -0,0 +1,209 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include "kat_main.h"
+
+// With C++, it's a little trickier to create the mapping from
+// method-name/round-count to functions
+// because the round-counts are template arguments that have to be
+// specified at compile-time.  Thus, we can't just do #define RNGNxW_TPL
+// and #include "rngNxW.h".  We have to build a static map from:
+//  pair<generator, rounds> to functions that apply the right generator
+// with the right number of rounds.
+
+#ifdef _MSC_FULL_VER
+// Engines have multiple copy constructors, quite legal C++, disable MSVC complaint
+#pragma warning (disable : 4521)
+#endif
+
+#include <map>
+#include <cstring>
+#include <utility>
+#include <stdexcept>
+#include <Random123/MicroURNG.hpp>
+#include <Random123/conventional/Engine.hpp>
+
+using namespace std;
+
+typedef map<pair<method_e, unsigned>, void (*)(kat_instance *)> genmap_t;
+genmap_t genmap;
+
+void dev_execute_tests(kat_instance *tests, unsigned ntests){
+    size_t i;
+    for(i=0; i<ntests; ++i){
+        kat_instance *ti = &tests[i];
+        genmap_t::iterator p = genmap.find(make_pair(ti->method, ti->nrounds));
+        if(p == genmap.end())
+            throw std::runtime_error("pair<generator, nrounds> not in map.  You probably need to add more genmap entries in kat_cpp.cpp");
+
+        p->second(ti);
+        // TODO: check that the corresponding Engine and MicroURNG
+        //  return the same values.  Note that we have ut_Engine and
+        //  ut_MicroURNG, which check basic functionality, but they
+        //  don't have the breadth of the kat_vectors.
+    }
+}
+
+static int murng_reported;
+static int engine_reported;
+
+template <typename GEN>
+void do_test(kat_instance* ti){
+    GEN g;
+    struct gdata{
+        typename GEN::ctr_type ctr;
+        typename GEN::ukey_type ukey;
+        typename GEN::ctr_type expected;
+        typename GEN::ctr_type computed;
+    };
+    gdata data;
+    // use memcpy.  A reinterpret_cast would violate strict aliasing.
+    memcpy(&data, &ti->u, sizeof(data));
+    data.computed = g(data.ctr, data.ukey);
+
+    // Before we return, let's make sure that MicroURNG<GEN,1> and
+    // Engine<GEN> work as expeccted.  This doesn't really "fit" the
+    // execution model of kat.c, which just expects us to fill in
+    // ti->u.computed, so we report the error by failing to write back
+    // the computed data item in the (hopefully unlikely) event that
+    // things don't match up as expected.
+    int errs = 0;
+
+    // MicroURNG:  throws if the top 32 bits of the high word of ctr
+    // are non-zero.
+    typedef typename GEN::ctr_type::value_type value_type;
+    
+    value_type hibits = data.ctr[data.ctr.size()-1]>>( std::numeric_limits<value_type>::digits - 32 );
+    try{
+        r123::MicroURNG<GEN> urng(data.ctr, data.ukey);
+        if(hibits)
+            errs++; // Should have thrown.
+        for (size_t i = 0; i < data.expected.size(); i++) {
+	    size_t j = data.expected.size() - i - 1;
+	    if (data.expected[j] != urng()) {
+                errs++;
+	    }
+	}
+    }catch(std::runtime_error& /*ignored*/){
+        // A runtime_error is expected from the constructor
+        // when hibit is set.
+        if(!hibits)
+            errs++;
+    }
+    if(errs && (murng_reported++ == 0))
+        cerr << "Error in MicroURNG<GEN>, will appear as \"computed\" value of zero in error summary\n";
+
+    // Engine
+    // N.B.  exercising discard() arguably belongs in ut_Engine.cpp
+    typedef r123::Engine<GEN> Etype;
+    typedef typename GEN::ctr_type::value_type value_type;
+    Etype e(data.ukey);
+    typename GEN::ctr_type c = data.ctr;
+    value_type c0 = c[0];
+    c[0] /= 3;
+    e.setcounter(c, c.size());
+    if( c0 > c[0] ){
+        // skip one value by calling  e()
+        (void)e();
+        if (c0 > c[0]+1) {
+	    // skip many values by calling discard()
+	    R123_ULONG_LONG ndiscard = (c0 - c[0] - 1);
+            // Take care not to overflow the long long
+            if( ndiscard >= std::numeric_limits<R123_ULONG_LONG>::max() / c.size() ){
+                for(size_t j=0; j<c.size(); ++j){
+                    e.discard(ndiscard);
+                }
+            }else{
+                ndiscard *= c.size();
+                e.discard(ndiscard);
+            }
+	}
+	// skip a few more by calling e().
+	for (size_t i = 1; i < c.size(); i++) {
+	    (void) e();
+	}
+        // we should be back to where we started...
+    }
+    for (size_t i = 0; i < data.expected.size(); i++) {
+	value_type val = e();
+	size_t j = data.expected.size() - i - 1;
+	if (data.expected[j] != val) {
+            cerr << hex;
+            cerr << "Engine check, j=" << j << " expected: " << data.expected[j] << " val: " << val << "\n";
+	    errs++;
+            if(engine_reported++ == 0)
+                cerr << "Error in Engine<GEN, 1>, will appear as \"computed\" value of zero in error summary\n";
+	}
+    }
+
+    // Signal an error to the caller by *not* copying back
+    // the computed data object into the ti
+    if(errs == 0)
+        memcpy(&ti->u, &data, sizeof(data));
+}
+
+void host_execute_tests(kat_instance *tests, size_t ntests){
+    // In C++1x, this could be staticly declared with an initializer list.
+    genmap[make_pair(threefry2x32_e, 13u)] = do_test<r123::Threefry2x32_R<13> >;
+    genmap[make_pair(threefry2x32_e, 20u)] = do_test<r123::Threefry2x32_R<20> >;
+    genmap[make_pair(threefry2x32_e, 32u)] = do_test<r123::Threefry2x32_R<32> >;
+    genmap[make_pair(threefry2x64_e, 13u)] = do_test<r123::Threefry2x64_R<13> >;
+    genmap[make_pair(threefry2x64_e, 20u)] = do_test<r123::Threefry2x64_R<20> >;
+    genmap[make_pair(threefry2x64_e, 32u)] = do_test<r123::Threefry2x64_R<32> >;
+
+    genmap[make_pair(threefry4x32_e, 13u)] = do_test<r123::Threefry4x32_R<13> >;
+    genmap[make_pair(threefry4x32_e, 20u)] = do_test<r123::Threefry4x32_R<20> >;
+    genmap[make_pair(threefry4x32_e, 72u)] = do_test<r123::Threefry4x32_R<72> >;
+    genmap[make_pair(threefry4x64_e, 13u)] = do_test<r123::Threefry4x64_R<13> >;
+    genmap[make_pair(threefry4x64_e, 20u)] = do_test<r123::Threefry4x64_R<20> >;
+    genmap[make_pair(threefry4x64_e, 72u)] = do_test<r123::Threefry4x64_R<72> >;
+
+    genmap[make_pair(philox2x32_e, 7u)] = do_test<r123::Philox2x32_R<7> >;
+    genmap[make_pair(philox2x32_e, 10u)] = do_test<r123::Philox2x32_R<10> >;
+    genmap[make_pair(philox4x32_e, 7u)] = do_test<r123::Philox4x32_R<7> >;
+    genmap[make_pair(philox4x32_e, 10u)] = do_test<r123::Philox4x32_R<10> >;
+
+#if R123_USE_PHILOX_64BIT
+    genmap[make_pair(philox2x64_e, 7u)] = do_test<r123::Philox2x64_R<7> >;
+    genmap[make_pair(philox2x64_e, 10u)] = do_test<r123::Philox2x64_R<10> >;
+    genmap[make_pair(philox4x64_e, 7u)] = do_test<r123::Philox4x64_R<7> >;
+    genmap[make_pair(philox4x64_e, 10u)] = do_test<r123::Philox4x64_R<10> >;
+#endif
+
+#if R123_USE_AES_NI
+    genmap[make_pair(aesni4x32_e, 10u)] = do_test<r123::AESNI4x32 >;
+    genmap[make_pair(ars4x32_e, 7u)] = do_test<r123::ARS4x32_R<7> >;
+    genmap[make_pair(ars4x32_e, 10u)] = do_test<r123::ARS4x32_R<10> >;
+#endif
+
+    /* XXX ntests cannot be size_t because of OpenCL, seems unlikely it will overflow an unsigned... */
+    dev_execute_tests(tests, (unsigned)ntests);
+}
diff --git a/lib/Random123-1.08/examples/kat_cuda.cu b/lib/Random123-1.08/examples/kat_cuda.cu
new file mode 100644
index 0000000..6f9cb6d
--- /dev/null
+++ b/lib/Random123-1.08/examples/kat_cuda.cu
@@ -0,0 +1,63 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include "util_cuda.h"
+#include "kat_main.h"
+
+#define KAT_KERNEL __global__
+#define KAT_GLOBAL
+#define KAT_UINT size_t
+#include "kat_dev_execute.h"
+
+void host_execute_tests(kat_instance *tests_host, size_t ntests){
+    CUDAInfo *infop;
+    kat_instance *tests_dev;
+    size_t tests_sz;
+
+    infop = cuda_init(NULL);
+
+    tests_sz = ntests * sizeof(tests_host[0]);
+    CHECKCALL(cudaMalloc(&tests_dev, tests_sz));
+    CHECKCALL(cudaMemcpy(tests_dev, tests_host, tests_sz, cudaMemcpyHostToDevice));
+
+    printf("starting %zu tests on 1 blocks with 1 threads/block\n", ntests);
+    fflush(stdout);
+
+    // TO DO:  call this with parallelism, <<<infop->blocks_per_grid, infop->threads_per_block>>>
+    // and then insure that each of the threads got the same result.
+    dev_execute_tests<<<1, 1>>>(tests_dev, ntests);
+
+    CHECKCALL(cudaThreadSynchronize());
+    CHECKCALL(cudaMemcpy(tests_host, tests_dev, tests_sz, cudaMemcpyDeviceToHost));
+    CHECKCALL(cudaFree(tests_dev));
+    cuda_done(infop);
+}
+
diff --git a/lib/Random123-1.08/examples/kat_dev_execute.h b/lib/Random123-1.08/examples/kat_dev_execute.h
new file mode 100644
index 0000000..e29cd5e
--- /dev/null
+++ b/lib/Random123-1.08/examples/kat_dev_execute.h
@@ -0,0 +1,45 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include "kat.h"
+KAT_KERNEL void dev_execute_tests(KAT_GLOBAL kat_instance *tests, KAT_UINT ntests){
+    size_t i;
+    for(i=0; i<ntests; ++i){
+        KAT_GLOBAL kat_instance *ti = &tests[i];
+        switch(tests[i].method){
+            //case philox2x32_e: ti->philox2x32_data.computed = philox2x32_R(ti->rounds, ti->philox2x32_data.ctr, ti->philox2x32_data.key);
+#define RNGNxW_TPL(base, N, W) case base##N##x##W##_e: ti->u.base##N##x##W##_data.computed = base##N##x##W##_R(ti->nrounds, ti->u.base##N##x##W##_data.ctr, base##N##x##W##keyinit(ti->u.base##N##x##W##_data.ukey)); break;
+#include "rngNxW.h"
+#undef RNGNxW_TPL
+        case unused: ; // silence a warning
+        }
+    }
+}
diff --git a/lib/Random123-1.08/examples/kat_main.h b/lib/Random123-1.08/examples/kat_main.h
new file mode 100644
index 0000000..48d8c7a
--- /dev/null
+++ b/lib/Random123-1.08/examples/kat_main.h
@@ -0,0 +1,292 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/* Known Answer Test */
+
+/* We use the same source files to implement the Known Answer Test
+   (KAT) in C, C++, OpenCL and CUDA.  Supporting all four environments
+   with a single source file, and getting it all to work with 'make'
+   is a bit involved:
+
+   There are four "top-level" files:
+     kat_c.c
+     kat_cpp.cpp
+     kat_cuda.c
+     kat_opencl.c
+
+   These correspond to make targets: kat_c, kat_cpp, kat_cuda
+   and kat_opencl.
+
+   Those four files are very simple.  First, they #include this file,
+   which contains all the machinery for reading test vectors,
+   complaining about errors, etc..  Then they implement the function
+   host_execute_tests() in the appropriate environment.  host_execute_tests
+   looks very different in C/C++/CUDA/OpenCL.
+
+   host_execute_tests contrives to call/launch "dev_execute_tests"
+   on the device.  Except for a few environment-specific keywords,
+   (e.g., __global, __kernel), which are #defined in kat_XXX.c,
+   dev_execute_tests is obtained by including a common source file:
+      #include <kat_dev_execute.h>
+
+   One final complication:  in order to fully "bake" the source code
+   into the binary at compile-time, dev_execute_tests for opencl is implemented in
+   kat_opencl_kernel.ocl, which is processed by gencl.sh into
+   kat_opencl_kernel.i, which is thein #include-ed by kat_opencl.c.
+   
+*/
+#include "util.h"
+#include "kat.h"
+
+#define LINESIZE 1024
+
+int have_aesni = 0;
+int verbose = 0;
+int debug = 0;
+size_t nfailed = 0;
+const char *progname;
+
+extern void host_execute_tests(kat_instance *tests, size_t ntests);
+                
+/* A little hack to keep track of the test vectors that we don't know how to deal with: */
+int nunknowns = 0;
+#define MAXUNKNOWNS 20
+const char *unknown_names[MAXUNKNOWNS];
+int unknown_counts[MAXUNKNOWNS];
+
+void register_unknown(const char *name){
+    int i;
+    for(i=0; i<nunknowns; ++i){
+        if( strcmp(name, unknown_names[i]) == 0 ){
+            unknown_counts[i]++;
+            return;
+        }
+    }
+    if( i >= MAXUNKNOWNS ){
+        fprintf(stderr, "Too many unknown rng types.  Bye.\n");
+        exit(1);
+    }
+    nunknowns++;
+    unknown_names[i] = ntcsdup(name);
+    unknown_counts[i] = 1;
+}
+
+void report_unknowns(){
+    int i;
+    for(i=0; i<nunknowns; ++i){
+        printf("%d test vectors of type %s skipped\n", unknown_counts[i], unknown_names[i]);
+    }
+}
+
+/* read_<GEN>NxW */
+#define RNGNxW_TPL(base, N, W) \
+int read_##base##N##x##W(const char *line, kat_instance* tinst){        \
+    size_t i;                                                           \
+    int nchar;                                                          \
+    const char *p = line;                                               \
+    char *newp;                                                         \
+    size_t nkey = sizeof(tinst->u.base##N##x##W##_data.ukey.v)/sizeof(tinst->u.base##N##x##W##_data.ukey.v[0]); \
+    tinst->method = base##N##x##W##_e;                                  \
+    sscanf(p,  "%u%n", &tinst->nrounds, &nchar);                        \
+    p += nchar;                                                         \
+    for(i=0;  i<N; ++i){                                                \
+        tinst->u.base##N##x##W##_data.ctr.v[i] = strtou##W(p, &newp, 16); \
+        p = newp;                                                       \
+    }                                                                   \
+    for(i=0; i<nkey; ++i){                                              \
+        tinst->u.base##N##x##W##_data.ukey.v[i] = strtou##W(p, &newp, 16); \
+        p = newp;                                                       \
+    }                                                                   \
+    for(i=0;  i<N; ++i){                                                \
+        tinst->u.base##N##x##W##_data.expected.v[i] = strtou##W(p, &newp, 16); \
+        p = newp;                                                       \
+    }                                                                   \
+    memset(tinst->u.base##N##x##W##_data.computed.v, 0, sizeof(tinst->u.base##N##x##W##_data.computed.v));                  \
+    return 1;                                                           \
+}
+#include "rngNxW.h"
+#undef RNGNxW_TPL
+
+/* readtest:  dispatch to one of the read_<GEN>NxW functions */
+static int readtest(const char *line, kat_instance* tinst){
+    int nchar;
+    char name[LINESIZE];
+    if( line[0] == '#') return 0;                                       
+    sscanf(line, "%s%n", name, &nchar);
+    if(!have_aesni){
+        /* skip any tests that require AESNI */ 
+        if(strncmp(name, "aes", 3)==0 ||
+           strncmp(name, "ars", 3)==0){
+            register_unknown(name);
+            return 0;
+        }
+    }
+#define RNGNxW_TPL(base, N, W) if(strcmp(name, #base #N "x" #W) == 0) return read_##base##N##x##W(line+nchar, tinst);
+#include "rngNxW.h"
+#undef RNGNxW_TPL
+
+    register_unknown(name);
+    return 0;
+}
+
+#define RNGNxW_TPL(base, N, W) \
+void report_##base##N##x##W##error(const kat_instance *ti){ \
+ size_t i;                                                     \
+ size_t nkey = sizeof(ti->u.base##N##x##W##_data.ukey.v)/sizeof(ti->u.base##N##x##W##_data.ukey.v[0]); \
+ fprintf(stderr, "FAIL:  expected: ");                                \
+ fprintf(stderr, #base #N "x" #W " %d", ti->nrounds);                   \
+ for(i=0; i<N; ++i){                                                    \
+     fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.ctr.v[i]); \
+ }                                                                      \
+ for(i=0; i<nkey; ++i){                                                 \
+     fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.ukey.v[i]); \
+ }                                                                      \
+ for(i=0; i<N; ++i){                                                    \
+     fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.expected.v[i]); \
+ }                                                                      \
+ fprintf(stderr, "\n");                                                 \
+                                                                        \
+ fprintf(stderr, "FAIL:  computed: ");                                \
+ fprintf(stderr, #base #N "x" #W " %d", ti->nrounds);                   \
+ for(i=0; i<N; ++i){                                                    \
+     fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.ctr.v[i]); \
+ }                                                                      \
+ for(i=0; i<nkey; ++i){                                                 \
+     fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.ukey.v[i]); \
+ }                                                                      \
+ for(i=0; i<N; ++i){                                                    \
+     fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.computed.v[i]); \
+ }                                                                      \
+ fprintf(stderr, "\n");                                                 \
+ nfailed++;                                                             \
+}
+#include "rngNxW.h"
+#undef RNGNxW_TPL
+
+// dispatch to one of the report_<GEN>NxW() functions
+void analyze_tests(const kat_instance *tests, size_t ntests){
+    size_t i;
+    for(i=0; i<ntests; ++i){
+        const kat_instance *ti = &tests[i];
+        switch(tests[i].method){
+#define RNGNxW_TPL(base, N, W) case base##N##x##W##_e: \
+            if (memcmp(ti->u.base##N##x##W##_data.computed.v, ti->u.base##N##x##W##_data.expected.v, N*W/8)) report_##base##N##x##W##error(ti); break;
+#include "rngNxW.h"
+#undef RNGNxW_TPL
+        case unused: ; // silence a warning
+        }
+    }
+}
+
+#define NTESTS 1000
+
+int main(int argc, char **argv){
+    kat_instance *tests;
+    size_t t, ntests = NTESTS;
+    char linebuf[LINESIZE];
+    FILE *inpfile;
+    const char *p;
+    const char *inname;
+    char filename[LINESIZE];
+    
+    progname = argv[0];
+
+    /* If there's an argument, open that file.
+       else if getenv("srcdir") is non-empty open getenv("srcdir")/kat_vectors
+       else open "./kat_vectors" */
+    if( argc > 1 )
+        inname = argv[1];
+    else{
+        const char *e = getenv("srcdir");
+        if(!e)
+            e = ".";
+        sprintf(filename, "%s/kat_vectors", e);
+        inname = filename;
+    }
+
+    if (strcmp(inname, "-") == 0) {
+	inpfile = stdin;
+    } else {
+	inpfile = fopen(inname, "r");
+	if (inpfile == NULL) {
+	    fprintf(stderr, "%s: error opening input file %s for reading: %s\n",
+		    progname, inname, strerror(errno));
+	    exit(1);
+	}
+    }
+    if ((p = getenv("KATC_VERBOSE")) != NULL) {
+	verbose = atoi(p);
+    }
+    if ((p = getenv("KATC_DEBUG")) != NULL) {
+	debug = atoi(p);
+    }
+
+#if R123_USE_AES_NI
+    have_aesni = haveAESNI();
+#else
+    have_aesni = 0;
+#endif
+
+    tests = (kat_instance *) malloc(sizeof(tests[0])*ntests);
+    if (tests == NULL) {
+	fprintf(stderr, "Could not allocate %lu bytes for tests\n",
+		(unsigned long) ntests);
+	exit(1);
+    }
+    t = 0;
+    while (fgets(linebuf, sizeof linebuf, inpfile) != NULL) {
+        if( t==ntests ){
+	    ntests *= 2;
+	    tests = (kat_instance *)realloc(tests, sizeof(tests[0])*ntests);
+	    if (tests == NULL) {
+		fprintf(stderr, "Could not grow tests to %lu bytes\n",
+			(unsigned long) ntests);
+		exit(1);
+	    }
+        }
+        if( readtest(linebuf, &tests[t]) )
+            ++t;
+    }
+
+    report_unknowns();
+    printf("Perform %lu tests.\n", (unsigned long)t);
+    host_execute_tests(tests, t);
+
+    analyze_tests(tests, t);
+    free(tests);
+    if(nfailed != 0){
+        printf("FAILED %lu out of %lu\n", (unsigned long)nfailed, (unsigned long)t);
+        return 1;
+    }else{
+        printf("PASSED %lu known answer tests\n", (unsigned long)t);
+        return 0;
+    }
+}
diff --git a/lib/Random123-1.08/examples/kat_opencl.c b/lib/Random123-1.08/examples/kat_opencl.c
new file mode 100644
index 0000000..0c8d23d
--- /dev/null
+++ b/lib/Random123-1.08/examples/kat_opencl.c
@@ -0,0 +1,101 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include "util_opencl.h"
+#include "kat_main.h"
+
+// USE_GENCL:  gencl.sh is a small shell script
+// that pre-processes foo.ocl into foo.i, containing
+// a definition like:
+//  const char opencl_src[] = "preprocessed text of foo.ocl"
+// Thus, with gencl, this file says 
+//    #include <foo.i>
+// and the binary obtained by compiling it
+// is fully "baked".  Runtime behavior doesn't depend
+// on the contents of some file (e.g., foo.ocl or some
+// header that it includes) that might have changed long after this
+// file was compiled.
+//
+// The alternative (USE_GENCL 0) seems to be more along
+// the lines of what OpenCL designers imagine.  It makes the text of the
+// kernel program the string "#include <foo.c>".  This eliminates
+// the need for the extra machinery in gencl.sh, but runtime
+// behavior is susceptable to changes in foo.c, or files included
+// by foo.c long after this file is compiled.  It also requires some
+// hocus pocus to get absolute paths for the -I options needed
+// to compile the code at runtime.  Something like:
+//  override CFLAGS += -DSRCDIR=\"$(dir $(abspath $<)).\"
+#define USE_GENCL 1
+
+#if USE_GENCL
+#include <kat_opencl_kernel.i>
+#else
+#ifndef SRCDIR
+#error -DSRCDIR="/absolute/path/to/examples" should have been put on the command-line by GNUmakefile
+#endif
+#endif
+
+void host_execute_tests(kat_instance *tests, size_t ntests){
+    UCLInfo *infop;
+    cl_kernel kern;
+    size_t nthreads, tests_sz;
+    cl_mem tests_dev;
+    const char *kernelname = "dev_execute_tests";
+    cl_int err;
+    cl_uint cl_ntests = ntests;
+
+#if USE_GENCL
+    infop = opencl_init(NULL, opencl_src, "");
+#else
+    infop = opencl_init(NULL, "#include <kat_dev_execute.h>", 
+                        " -I" SRCDIR 
+                        " -I" SRCDIR "/../include " 
+                        " -DKAT_KERNEL=__kernel "
+                        " -DKAT_GLOBAL=__global "
+                        " -DKAT_UINT=uint" );
+#endif
+    CHECKERR(kern = clCreateKernel(infop->prog, kernelname, &err));
+    if (infop->wgsize > 64) infop->wgsize /= 2;
+    nthreads = infop->cores * infop->wgsize;
+    tests_sz = ntests * sizeof(*tests);
+    CHECKERR(tests_dev = clCreateBuffer(infop->ctx, CL_MEM_READ_WRITE|CL_MEM_USE_HOST_PTR, tests_sz, tests, &err));
+    CHECK(clEnqueueWriteBuffer(infop->cmdq, tests_dev, CL_TRUE, 0, tests_sz, tests, 0, 0, 0));
+    CHECK(clSetKernelArg(kern, 0, sizeof(cl_mem), (void*)&tests_dev));
+    CHECK(clSetKernelArg(kern, 1, sizeof(cl_uint), (void*)&cl_ntests));
+    printf("queuing kernel for %lu threads with %lu work group size, %u tests\n",
+	   (unsigned long)nthreads, (unsigned long)infop->wgsize, cl_ntests);
+    CHECK(clEnqueueNDRangeKernel(infop->cmdq, kern, 1, 0, &nthreads, &infop->wgsize, 0, 0, 0));
+    CHECK(clFinish(infop->cmdq));
+    CHECK(clEnqueueReadBuffer(infop->cmdq, tests_dev, CL_TRUE, 0, tests_sz, tests, 0, 0, 0));
+    CHECK(clReleaseMemObject(tests_dev));
+    CHECK(clReleaseKernel(kern));
+    opencl_done(infop);
+}
diff --git a/lib/Random123-1.08/examples/kat_opencl_kernel.ocl b/lib/Random123-1.08/examples/kat_opencl_kernel.ocl
new file mode 100644
index 0000000..867e9af
--- /dev/null
+++ b/lib/Random123-1.08/examples/kat_opencl_kernel.ocl
@@ -0,0 +1,38 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include "kat.h"
+
+#define KAT_KERNEL __kernel
+#define KAT_GLOBAL __global
+#define KAT_UINT uint
+
+#include "kat_dev_execute.h"
diff --git a/lib/Random123-1.08/examples/kat_vectors b/lib/Random123-1.08/examples/kat_vectors
new file mode 100644
index 0000000..cafa286
--- /dev/null
+++ b/lib/Random123-1.08/examples/kat_vectors
@@ -0,0 +1,83 @@
+# For each generator, we test:  gen(0, 0), gen(fff, fff) and gen(ctr=digits_of_pi, key=more_digits_of_pi).
+# Ignoring endianness, these are the first few hexdigits of pi:
+# 243F6A88 85A308D3 13198A2E 03707344 A4093822 299F31D0 082EFA98 EC4E6C89 452821E6 38D01377 BE5466CF 34E90C6C C0AC29B7 C97C50DD 3F84D5B5 B5470917 9216D5D9 8979FB1BD
+#
+#nameNxW  R  CTR                                 KEY                                   EXPECTED
+# 
+aesni4x32 10 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000   d44be966 3b2c8aef 59fa4c88 2e2b34ca
+aesni4x32 10 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 00000000 00000000   0f68399f cc680a67 4cbd230d 816d2e23
+aesni4x32 10 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 082efa98 ec4e6c89   ca693cbf 134a4f64 965e0cfd 5217a28f
+# also test AESNI with the test vector from FIPS197
+aesni4x32 10 33221100 77665544 bbaa9988 ffeeddcc 03020100 07060504 0b0a0908 0f0e0d0c   d8e0c469 30047b6a 80b7cdd8 5ac5b470
+#
+ars4x32 10 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000   8d73ee19 506401ef 13c2dbe4 0cbe9c0d
+ars4x32 10 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 082efa98 ec4e6c89   a516e7d6 8357ad74 5b59b3ec 8763fff3
+ars4x32 10 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 00000000 00000000   bb3743b1 9f635551 ecbc87fc a19478a9
+#
+philox2x32 7 00000000 00000000 00000000   257a3673 cd26be2a
+philox2x32 7 ffffffff ffffffff ffffffff   ab302c4d 3dc9d239
+philox2x32 7 243f6a88 85a308d3 13198a2e   bedbbe6b e4c770b3
+philox2x32 10 00000000 00000000 00000000   ff1dae59 6cd10df2
+philox2x32 10 ffffffff ffffffff ffffffff   2c3f628b ab4fd7ad
+philox2x32 10 243f6a88 85a308d3 13198a2e   dd7ce038 f62a4c12
+#
+philox4x32 7 00000000 00000000 00000000 00000000 00000000 00000000   5f6fb709 0d893f64 4f121f81 4f730a48
+philox4x32 7 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff   5207ddc2 45165e59 4d8ee751 8c52f662
+philox4x32 7 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0   4dfccaba 190a87f0 c47362ba b6b5242a
+philox4x32 10 00000000 00000000 00000000 00000000 00000000 00000000   6627e8d5 e169c58d bc57ac4c 9b00dbd8
+philox4x32 10 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff   408f276d 41c83b0e a20bc7c6 6d5451fd
+philox4x32 10 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0   d16cfe09 94fdcceb 5001e420 24126ea1
+#
+philox2x64 7 0000000000000000 0000000000000000 0000000000000000   b41da69fbfefc666 511e9ce1a5534056
+philox2x64 7 ffffffffffffffff ffffffffffffffff ffffffffffffffff   a4696cc04462015d 724782dae17169e9
+philox2x64 7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0   98ed1534392bf372 67528b1568882fd5
+philox2x64 10 0000000000000000 0000000000000000 0000000000000000   ca00a0459843d731 66c24222c9a845b5
+philox2x64 10 ffffffffffffffff ffffffffffffffff ffffffffffffffff   65b021d60cd8310f 4d02f3222f86df20
+philox2x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0   0a5e742c2997341c b0f883d38000de5d
+#
+philox4x64 7 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000   5dc8ee6268ec62cd 139bc570b6c125a0 84d6deb4fb65f49e aff7583376d378c2
+philox4x64 7 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff   071dd84367903154 48e2bbdc722b37d1 6afa9890bb89f76c 9194c8d8ada56ac7
+philox4x64 7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 452821e638d01377 be5466cf34e90c6c   513a366704edf755 f05d9924c07044d3 bef2cb9cbea74c6c 8db948de4caa1f8a
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000   16554d9eca36314c db20fe9d672d0fdc d7e772cee186176b 7e68b68aec7ba23b
+philox4x64 10 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff   87b092c3013fe90b 438c3c67be8d0224 9cc7d7c69cd777b6 a09caebf594f0ba0
+philox4x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 452821e638d01377 be5466cf34e90c6c   a528f45403e61d95 38c72dbd566e9788 a5a1610e72fd18b5 57bd43b5e52b7fe6
+#
+threefry2x32 13 00000000 00000000 00000000 00000000 9d1c5ec6 8bd50731
+threefry2x32 13 ffffffff ffffffff ffffffff ffffffff fd36d048 2d17272c
+threefry2x32 13 243f6a88 85a308d3 13198a2e 03707344 ba3e4725 f27d669e
+threefry2x32 20 00000000 00000000 00000000 00000000   6b200159 99ba4efe
+threefry2x32 20 ffffffff ffffffff ffffffff ffffffff   1cb996fc bb002be7
+threefry2x32 20 243f6a88 85a308d3 13198a2e 03707344   c4923a9c 483df7a0
+threefry2x32 32 00000000 00000000 00000000 00000000 cee3d47e a23dfd5c
+threefry2x32 32 ffffffff ffffffff ffffffff ffffffff 6e2fe0d0 b1b76f82
+threefry2x32 32 243f6a88 85a308d3 13198a2e 03707344 e2827716 c3c05cdf
+#
+threefry4x32 13 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 531c7e4f 39491ee5 2c855a92 3d6abf9a
+threefry4x32 13 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c4189358 1c9cc83a d5881c67 6a0a89e0
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 082efa98 ec4e6c89 4aa71d8f 734738c2 431fc6a8 ae6debf1
+threefry4x32 20 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000   9c6ca96a e17eae66 fc10ecd4 5256a7d8
+threefry4x32 20 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff   2a881696 57012287 f6c7446e a16a6732
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 082efa98 ec4e6c89   59cd1dbb b8879579 86b5d00c ac8b6d84
+threefry4x32 72 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 93171da6 9220326d b392b7b1 ff58a002
+threefry4x32 72 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 60743f3d 9961e684 aab21c34 8c65fb7d
+threefry4x32 72 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 082efa98 ec4e6c89 09930adf 7f27bd55 9ed68ce1 97f803f6
+#
+threefry2x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000000 f167b032c3b480bd e91f9fee4b7a6fb5
+threefry2x64 13 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ccdec5c917a874b1 4df53abca26ceb01
+threefry2x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 c3aac71561042993 3fe7ae8801aff316
+threefry2x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000000   c2b6e3a8c2c69865 6f81ed42f350084d
+threefry2x64 20 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff   e02cb7c4d95d277a d06633d0893b8b68
+threefry2x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   263c7d30bb0f0af1 56be8361d3311526
+threefry2x64 32 0000000000000000 0000000000000000 0000000000000000 0000000000000000 38ba854d7f13cfb3 d02fca729d54fadc
+threefry2x64 32 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff 6b532f4f6e288646 0388f1ec135ee18e
+threefry2x64 32 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 dad492f32efbd0c4 b6d7d0cd1f193e84
+#
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 4071fabee1dc8e05 02ed3113695c9c62 397311b5b89f9d49 e21292c3258024bc
+threefry4x64 13 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff 7eaed935479722b5 90994358c429f31c 496381083e07a75b 627ed0d746821121
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 452821e638d01377 be5466cf34e90c6c c0ac29b7c97c50dd 3f84d5b5b5470917 4361288ef9c1900c 8717291521782833 0d19db18c20cf47e a0b41d63ac8581e5
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000   09218ebde6c85537 55941f5266d86105 4bd25e16282434dc ee29ec846bd2e40b
+ threefry4x64 20 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff 29c24097942bba1b 0371bbfb0f6f4e11 3c231ffa33f83a1c cd29113fde32d168
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 452821e638d01377 be5466cf34e90c6c be5466cf34e90c6c c0ac29b7c97c50dd   a7e8fde591651bd9 baafd0c30138319b 84a5c1a729e685b9 901d406ccebc1ba4
+threefry4x64 72 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 94eeea8b1f2ada84 adf103313eae6670 952419a1f4b16d53 d83f13e63c9f6b11
+threefry4x64 72 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff 11518c034bc1ff4c 193f10b8bcdcc9f7 d024229cb58f20d8 563ed6e48e05183f
+threefry4x64 72 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 452821e638d01377 be5466cf34e90c6c be5466cf34e90c6c c0ac29b7c97c50dd acf412ccaa3b2270 c9e99bd53f2e9173 43dad469dc825948 fbb19d06c8a2b4dc
diff --git a/lib/Random123-1.08/examples/old_kat_vectors b/lib/Random123-1.08/examples/old_kat_vectors
new file mode 100644
index 0000000..d658726
--- /dev/null
+++ b/lib/Random123-1.08/examples/old_kat_vectors
@@ -0,0 +1,5339 @@
+#Generated by gentests.py and then running parsefail
+# 
+# Unfortunately, these kat_vectors don't exercise the bits of KEY very well,
+# so we have a new set in ./kat_vectors that is both smaller and
+# (we think) better.
+#
+# We keep these around because the extensive Crush tests reported in
+# the Random123 paper were all done with generators that satisfied
+# *these* kat_vectors.  It is reassuring to be able to verify
+# that future versions of the library satisfy the same kat_vectors.
+#
+#nameNxW    R CTR                 KEY        EXPECTED
+philox2x32  7 00000001 00000000   00000001   dd304d50 12e4d653
+philox2x32  7 00000000 00000001   00000001   2c4a4855 9199e69b
+philox2x32  7 00000000 ffffffff   00000001   6d2698e6 b701a038
+philox2x32  7 00000000 80000000   00000001   800bb214 33f68d84
+philox2x32  7 243f6a88 85a308d3   00000001   5e8c7db7 fe555fa5
+philox2x32  7 13198a2e 03707344   00000001   8c1ec904 8e580829
+philox2x32  7 a4093822 299f31d0   00000001   057c044a 7aafdd03
+philox2x32  7 082efa98 ec4e6c89   00000001   5a522bef 4f71ff9b
+philox2x32  7 452821e6 38d01377   00000001   5dbe9036 c71bfb6f
+philox2x32  7 be5466cf 34e90c6c   00000001   f8ce43da 5d07a3bc
+philox2x32 10 00000001 00000000   00000001   df873210 f52df537
+philox2x32 10 00000000 00000001   00000001   7ed26ce8 86c7f618
+philox2x32 10 00000000 ffffffff   00000001   319f09f6 8e11e823
+philox2x32 10 00000000 80000000   00000001   b004c3a1 5aaa7aab
+philox2x32 10 243f6a88 85a308d3   00000001   249cdc9c 4f745808
+philox2x32 10 13198a2e 03707344   00000001   7fe8940c 5164f5d3
+philox2x32 10 a4093822 299f31d0   00000001   9fa9cccc da4e7ee4
+philox2x32 10 082efa98 ec4e6c89   00000001   749e4ccd 6b4efa58
+philox2x32 10 452821e6 38d01377   00000001   e352771f 210baeaa
+philox2x32 10 be5466cf 34e90c6c   00000001   4d2a7213 d84561e4
+philox2x64  7 0000000000000001 0000000000000000   0000000000000001   6731c5bf26de72d3 adb0404961332fbe
+philox2x64  7 0000000000000000 0000000000000001   0000000000000001   88c0f355559817df 613b0c0682da5d16
+philox2x64  7 0000000000000000 ffffffffffffffff   0000000000000001   ef60e579e0cc8308 d5de9d9bf11b57ce
+philox2x64  7 0000000000000000 8000000000000000   0000000000000001   f05773bd9ddff049 600bdd92470c8940
+philox2x64  7 243f6a8885a308d3 13198a2e03707344   0000000000000001   a96599d377733423 d1c51f3aa6d13b8c
+philox2x64  7 a4093822299f31d0 082efa98ec4e6c89   0000000000000001   81a0e4d3c158a51a 5e20f98aff4f692c
+philox2x64  7 452821e638d01377 be5466cf34e90c6c   0000000000000001   e9fdf171af72db90 1ed074cb2bbc90c1
+philox2x64 10 0000000000000001 0000000000000000   0000000000000001   d9942a5c25dce933 512c1502dbacf1a2
+philox2x64 10 0000000000000000 0000000000000001   0000000000000001   9d42f8da0c592ba8 626786f6b2c510b0
+philox2x64 10 0000000000000000 ffffffffffffffff   0000000000000001   2d7c99d63b91dec2 0e13046ba2a2a7e6
+philox2x64 10 0000000000000000 8000000000000000   0000000000000001   0a1c7400c97c2506 845e4df70479d69f
+philox2x64 10 243f6a8885a308d3 13198a2e03707344   0000000000000001   9da663796aaa8b69 a04cf817aceac82d
+philox2x64 10 a4093822299f31d0 082efa98ec4e6c89   0000000000000001   0bde60d810e6cfcd ed2f63ae6019fd5a
+philox4x32  7 00000001 00000000 00000000 00000000   00000001 00000000   6b3257c3 820c5486 4de08b66 8771d665
+philox4x32  7 00000000 00000001 00000000 00000000   00000001 00000000   03dd87e3 e457f6e9 36c1ef7a 2c08abd7
+philox4x32  7 00000000 00000000 00000001 00000000   00000001 00000000   7b95d061 973a01c3 34a7320a b948ba2b
+philox4x32  7 00000000 00000000 00000000 00000001   00000001 00000000   ec3a83e6 1b8a97b3 d62f2558 2bbefc0b
+philox4x32  7 00000000 ffffffff 00000000 00000000   00000001 00000000   a84bdb23 ad074f5c d009bbed dc77d86c
+philox4x32  7 00000000 80000000 00000000 00000000   00000001 00000000   fee842f9 4ab3aed6 d83a3a74 6166acec
+philox4x32  7 00000000 00000000 ffffffff 00000000   00000001 00000000   9d9941e5 c454b1a9 292e9032 012e7a5b
+philox4x32  7 00000000 00000000 80000000 00000000   00000001 00000000   450f5c67 5e4f567e 3e5ae48e eca744c7
+philox4x32  7 00000000 00000000 00000000 ffffffff   00000001 00000000   700b66cd 833b8af0 e955c344 17781353
+philox4x32  7 00000000 00000000 00000000 80000000   00000001 00000000   f5dec550 d08482a9 09e2e568 c08a2602
+philox4x32  7 243f6a88 85a308d3 13198a2e 03707344   00000001 00000000   64803f9b acd38b4b 5ea00643 770c3921
+philox4x32  7 a4093822 299f31d0 082efa98 ec4e6c89   00000001 00000000   477d1496 cd0263d3 fa87a887 a1a13750
+philox4x32  7 452821e6 38d01377 be5466cf 34e90c6c   00000001 00000000   3c182998 851c52ae 22df9a24 805a4e26
+philox4x32  7 00000001 00000000 00000000 00000000   00000000 00000001   4582d3b2 11884435 1c51f335 56b76cad
+philox4x32  7 00000000 00000001 00000000 00000000   00000000 00000001   824469c3 e2b3aee2 f27d3e79 69e5de86
+philox4x32  7 00000000 00000000 00000001 00000000   00000000 00000001   c8cc99de 36b6acce c7fde4e2 b954b1f0
+philox4x32  7 00000000 00000000 00000000 00000001   00000000 00000001   d02f5ec7 f0673bf6 027bec46 779e7874
+philox4x32  7 00000000 ffffffff 00000000 00000000   00000000 00000001   55a94893 5824e089 0aacd579 d69ce6fb
+philox4x32  7 00000000 80000000 00000000 00000000   00000000 00000001   bed1d713 08c60b2d f16241e5 37b110de
+philox4x32  7 00000000 00000000 ffffffff 00000000   00000000 00000001   a44a8fd2 10e92201 f15f62ac e00f43b6
+philox4x32  7 00000000 00000000 80000000 00000000   00000000 00000001   096862a9 6755b23c 3e211f07 49799dc7
+philox4x32  7 00000000 00000000 00000000 ffffffff   00000000 00000001   189beecf e053c60b bbd309b7 6c7a7794
+philox4x32  7 00000000 00000000 00000000 80000000   00000000 00000001   deb89556 c991d089 09e16ad6 15a24b57
+philox4x32  7 243f6a88 85a308d3 13198a2e 03707344   00000000 00000001   3eb0cda8 1c3550e7 2541d05d 068d381c
+philox4x32  7 a4093822 299f31d0 082efa98 ec4e6c89   00000000 00000001   13818be6 633e77bb 6d135b5b a3b20aa0
+philox4x32  7 452821e6 38d01377 be5466cf 34e90c6c   00000000 00000001   b3735496 aa6cda09 0d72df0b b961e99a
+philox4x32  7 00000001 00000000 00000000 00000000   00000000 ffffffff   b5c9dc53 0f8b9936 5dfd28f4 80f4c67d
+philox4x32  7 00000000 00000001 00000000 00000000   00000000 ffffffff   993b616b d3aba408 076593da a2999568
+philox4x32  7 00000000 00000000 00000001 00000000   00000000 ffffffff   f891827e 3b2f7ecf 41cbeeb4 596c72b8
+philox4x32  7 00000000 00000000 00000000 00000001   00000000 ffffffff   5eddf390 c16f5ad8 5480b946 92b74eb2
+philox4x32  7 00000000 ffffffff 00000000 00000000   00000000 ffffffff   41e41234 eac57ab3 3565428b 0ae4d890
+philox4x32  7 00000000 80000000 00000000 00000000   00000000 ffffffff   9bbbefb2 69155b0d 59124dbf 5fa21593
+philox4x32  7 00000000 00000000 ffffffff 00000000   00000000 ffffffff   bb2d9138 e2aea83c 735542fd 142578c1
+philox4x32  7 00000000 00000000 80000000 00000000   00000000 ffffffff   b9bb52fe d06f257f b5079c8f 0490d30e
+philox4x32  7 00000000 00000000 00000000 ffffffff   00000000 ffffffff   793416be 37270805 fb649c02 68a4e7c2
+philox4x32  7 00000000 00000000 00000000 80000000   00000000 ffffffff   0e6e511e 8e7045fa d56a0e60 f8e94c17
+philox4x32  7 243f6a88 85a308d3 13198a2e 03707344   00000000 ffffffff   80fda6c5 33db1407 042deee8 0dec8a67
+philox4x32  7 a4093822 299f31d0 082efa98 ec4e6c89   00000000 ffffffff   55a400f8 90e13684 1ad7c6c6 fdfdd335
+philox4x32  7 452821e6 38d01377 be5466cf 34e90c6c   00000000 ffffffff   9ea5c780 92dfd935 5f5021d0 891581d8
+philox4x32  7 00000001 00000000 00000000 00000000   00000000 80000000   5a134bed 542bab82 21429fcd 677a1dd3
+philox4x32  7 00000000 00000001 00000000 00000000   00000000 80000000   819bfdaa 2584def1 af9ca218 0a2ef133
+philox4x32  7 00000000 00000000 00000001 00000000   00000000 80000000   d7854663 74abe06e dd8f4d3c b7f52230
+philox4x32  7 00000000 00000000 00000000 00000001   00000000 80000000   0d5576d6 d37a4b50 2d544d55 33f654d6
+philox4x32  7 00000000 ffffffff 00000000 00000000   00000000 80000000   db5de1d1 534479e1 fae88f56 c66f402b
+philox4x32  7 00000000 80000000 00000000 00000000   00000000 80000000   4cd24250 9291c73f 39429688 83707553
+philox4x32  7 00000000 00000000 ffffffff 00000000   00000000 80000000   6b227dcf b5bf2a3a c60d00b8 c0e04288
+philox4x32  7 00000000 00000000 80000000 00000000   00000000 80000000   56ddb529 b18488a9 63f467c6 a689a8ad
+philox4x32  7 00000000 00000000 00000000 ffffffff   00000000 80000000   414ea6b4 083011b4 08bc62cb 76d8fb76
+philox4x32  7 00000000 00000000 00000000 80000000   00000000 80000000   323abc61 28b9f4ce 59d8d353 01a9cf42
+philox4x32  7 243f6a88 85a308d3 13198a2e 03707344   00000000 80000000   2040eb58 f609f646 bbf37f20 5d76b5f9
+philox4x32  7 a4093822 299f31d0 082efa98 ec4e6c89   00000000 80000000   f9440a22 337100bb 1845d9c8 2736ad6d
+philox4x32  7 452821e6 38d01377 be5466cf 34e90c6c   00000000 80000000   b30a1fd9 3149f07f 59ede6aa 95d62ce2
+philox4x32 10 00000001 00000000 00000000 00000000   00000001 00000000   ac08141b dfc5ccbe 79c07a47 a7f66093
+philox4x32 10 00000000 00000001 00000000 00000000   00000001 00000000   833ff8dc 225c963c 232b88b3 0b334b07
+philox4x32 10 00000000 00000000 00000001 00000000   00000001 00000000   07071c12 428264b6 3909104b 6da2bda2
+philox4x32 10 00000000 00000000 00000000 00000001   00000001 00000000   127bee41 1e047488 48842b20 0a393496
+philox4x32 10 00000000 ffffffff 00000000 00000000   00000001 00000000   04e2eae1 463cc999 e7786310 65b3dc49
+philox4x32 10 00000000 80000000 00000000 00000000   00000001 00000000   34a4d61d 340e4017 f6945830 e9f52b96
+philox4x32 10 00000000 00000000 ffffffff 00000000   00000001 00000000   fb0905e2 78378790 ca37926b cdf58cfa
+philox4x32 10 00000000 00000000 80000000 00000000   00000001 00000000   f2e15c7d 3fedcd99 90046f6c 6657f0ca
+philox4x32 10 00000000 00000000 00000000 ffffffff   00000001 00000000   f50c9398 b36cdab2 436bdc89 cc49431b
+philox4x32 10 00000000 00000000 00000000 80000000   00000001 00000000   dde26e4e 17666f3b fc1f5b3a 83ac805d
+philox4x32 10 243f6a88 85a308d3 13198a2e 03707344   00000001 00000000   38527b8f fad9a48c 20e675c0 f2fea26a
+philox4x32 10 a4093822 299f31d0 082efa98 ec4e6c89   00000001 00000000   fb9877f8 482895e2 60b01453 198ea67b
+philox4x32 10 452821e6 38d01377 be5466cf 34e90c6c   00000001 00000000   f7b7fa0a 8d970e2c 205c9c76 83b16ce5
+philox4x32 10 00000001 00000000 00000000 00000000   00000000 00000001   ccf3076a 6306f434 bea71965 d96fe48a
+philox4x32 10 00000000 00000001 00000000 00000000   00000000 00000001   532f1322 36c890fb 6504b937 07bbfef7
+philox4x32 10 00000000 00000000 00000001 00000000   00000000 00000001   7f6c13ff 114b2447 0550eced ea1fc805
+philox4x32 10 00000000 00000000 00000000 00000001   00000000 00000001   96b27e8c 28826d0f 66d958ef 081509dc
+philox4x32 10 00000000 ffffffff 00000000 00000000   00000000 00000001   00e94a67 3524f44e 22995230 bb54df1e
+philox4x32 10 00000000 80000000 00000000 00000000   00000000 00000001   ce1afc4e 4fbf97a1 6110bee9 a559be2f
+philox4x32 10 00000000 00000000 ffffffff 00000000   00000000 00000001   576241af d3b45bee 619bd94d 15dd8793
+philox4x32 10 00000000 00000000 80000000 00000000   00000000 00000001   d9da65af eced57ba c34d2661 91fe931f
+philox4x32 10 00000000 00000000 00000000 ffffffff   00000000 00000001   36241728 4d42c858 fea737d6 49f40347
+philox4x32 10 00000000 00000000 00000000 80000000   00000000 00000001   0436a39b 31be9efa 6abd0c76 e7a68f83
+philox4x32 10 243f6a88 85a308d3 13198a2e 03707344   00000000 00000001   126514c3 d1898b69 da2707b3 6e6fb436
+philox4x32 10 a4093822 299f31d0 082efa98 ec4e6c89   00000000 00000001   1c28fa3f 8c5bf977 bb989783 0c1a3737
+philox4x32 10 452821e6 38d01377 be5466cf 34e90c6c   00000000 00000001   ac87a8c1 f240abdb add6c012 68a32a78
+philox4x32 10 00000001 00000000 00000000 00000000   00000000 ffffffff   473ab778 330bacc0 acd5fc9a 5ede76b3
+philox4x32 10 00000000 00000001 00000000 00000000   00000000 ffffffff   cdfbd51c caae5f2e 10739cfc 79e95162
+philox4x32 10 00000000 00000000 00000001 00000000   00000000 ffffffff   6c4b0e80 357e5a94 3255445d 6f433f0b
+philox4x32 10 00000000 00000000 00000000 00000001   00000000 ffffffff   5c4ecd0c 64c12cf9 8f9fb4c8 40c4a01f
+philox4x32 10 00000000 ffffffff 00000000 00000000   00000000 ffffffff   5f9c47aa 19861d86 ff2be81d 4c7db17e
+philox4x32 10 00000000 80000000 00000000 00000000   00000000 ffffffff   715a87cf f966a7f0 3e6dd95f e884e2fd
+philox4x32 10 00000000 00000000 ffffffff 00000000   00000000 ffffffff   07678411 9e524307 ba634e67 94ee8cb7
+philox4x32 10 00000000 00000000 80000000 00000000   00000000 ffffffff   b6f48e28 f2fa9414 00b64f66 4810cdb4
+philox4x32 10 00000000 00000000 00000000 ffffffff   00000000 ffffffff   9f18bb20 62161056 7ea8c028 4c01fc6e
+philox4x32 10 00000000 00000000 00000000 80000000   00000000 ffffffff   2a460458 0a2709e5 47bc9115 0f96d8af
+philox4x32 10 243f6a88 85a308d3 13198a2e 03707344   00000000 ffffffff   08f7720c 845ee9e0 502ccd3d a9a00e27
+philox4x32 10 a4093822 299f31d0 082efa98 ec4e6c89   00000000 ffffffff   9fcce05d 837d3f3c 5cdf3e61 db2544c0
+philox4x32 10 452821e6 38d01377 be5466cf 34e90c6c   00000000 ffffffff   72ce44b3 b44f9b78 49af0267 726813ac
+philox4x32 10 00000001 00000000 00000000 00000000   00000000 80000000   e29b9f84 2903d316 42a1f56f 1ad02eab
+philox4x32 10 00000000 00000001 00000000 00000000   00000000 80000000   94f419f8 1116c316 99f2fa30 bc048ad6
+philox4x32 10 00000000 00000000 00000001 00000000   00000000 80000000   488b0258 9eea6420 afe7062e 768f5637
+philox4x32 10 00000000 00000000 00000000 00000001   00000000 80000000   dbec6d70 69cea528 f7e22262 2e9f3e8f
+philox4x32 10 00000000 ffffffff 00000000 00000000   00000000 80000000   905ee550 c7520e9a 9af9d0ad 69b97e98
+philox4x32 10 00000000 80000000 00000000 00000000   00000000 80000000   1b89d963 0defe9af 60c9d3fb 3cfae97d
+philox4x32 10 00000000 00000000 ffffffff 00000000   00000000 80000000   601b5460 fe29678b 54510a02 c72ed094
+philox4x32 10 00000000 00000000 80000000 00000000   00000000 80000000   ae56ca02 7609ba67 25abd7df 46ce39a3
+philox4x32 10 00000000 00000000 00000000 ffffffff   00000000 80000000   09812238 47b8470d 3e0d0a26 92d96c9a
+philox4x32 10 00000000 00000000 00000000 80000000   00000000 80000000   f7a0b371 e51dc93d 56ce135d 1d4b5580
+philox4x32 10 243f6a88 85a308d3 13198a2e 03707344   00000000 80000000   63675d2c 422d7c4d 3145d30d 3bce33a4
+philox4x32 10 a4093822 299f31d0 082efa98 ec4e6c89   00000000 80000000   aa74e81c c9ddb97b 2c2cd881 9390c78d
+philox4x32 10 452821e6 38d01377 be5466cf 34e90c6c   00000000 80000000   94ca5566 14924b2f 28214292 59faeaee
+philox4x64  7 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000001 0000000000000000   a84f99f224f4cfbc 274efe46f0cc52a1 d63e2ec6fdb168a0 075123647506ee27
+philox4x64  7 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000001 0000000000000000   eb2bf03a13a1a1e3 56e7cbc84c87ec48 fc506dd46338cd70 46a7a39083ba8489
+philox4x64  7 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000001 0000000000000000   86b74b62e856f3a5 6053b9cb9274a289 4c9b75ec697ea72a a4fa1ef2ff24eae2
+philox4x64  7 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000001 0000000000000000   1ca5eced2c7cecd3 b1fcae7585130dc7 c0ea46280e16a2db 6d92ea22c9ad7e25
+philox4x64  7 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000001 0000000000000000   ae055a5045f32faf bde85edbfd887cd4 5f0dce5cb463d2c3 20e5732feedfc102
+philox4x64  7 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000001 0000000000000000   716bdad82151f110 991e7ed663cda695 b538a61037fa6f7b a33b549af210f319
+philox4x64  7 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000001 0000000000000000   ef3b00173dbfc105 d4d3378c1dbc8f3a 72bdd51b26d942f9 c6a1f46aa8d6fa9f
+philox4x64  7 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000001 0000000000000000   dd0b5de968e6c5c0 6b78797808867752 0b5a7aaa79ea06bc dcc26e1185e4d95c
+philox4x64  7 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000001 0000000000000000   8cf59bc42e37b57e 0b6a6e082f3ea65d 694ad11a471343a5 50da2ec78fbb66e9
+philox4x64  7 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000001 0000000000000000   2d9ca006eea83ab2 b6d94afceb4e5ebb 5ade5ab35910b0f8 94ead24dc22e07da
+philox4x64  7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000001 0000000000000000   e08b7a33c86d98e0 33aecd4f91b264b4 b91a88e80a219875 8f2a9dd82780854e
+philox4x64  7 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000001   f5e3223b00116da4 134e2e4b93c349cd 05df4d3d10fe52a4 0cd4fc5f2a6d4605
+philox4x64  7 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 0000000000000001   fa4318f3ddcbae0c d3822c687b18fbc9 fd6efa89fdf4def3 8a6e2b28c7000d51
+philox4x64  7 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 0000000000000001   b71736800cb19cc2 465e0b290594a26f 7d6461c312bbb3d2 ab712cce37a08231
+philox4x64  7 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 0000000000000001   e30b487d004a7790 a0b8ddb3235e7b2c ed4d107445bed6b8 0014a98401e1c79a
+philox4x64  7 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 0000000000000001   cffa905456214f44 5d92693cc6a563b6 5c156d9fc4514d26 f681331c9095f9d0
+philox4x64  7 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000001   af633db845c5b35a 3c904c74d24a616d e058112dc1e3d77f 2b486a45fc44757c
+philox4x64  7 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 0000000000000001   51ec481f11ca6d9c 5af7aee63bbdef91 fd9219ace01ca886 371274c68c106c72
+philox4x64  7 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 0000000000000001   84368e022df11716 9babf90b2d734275 ac2b18faf4b70450 74df64b2f1d44a4d
+philox4x64  7 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 0000000000000001   a07151c1a2096454 f1a175c7c4d40fa0 cdde1a462fb4d017 3e717c0b191a75e2
+philox4x64  7 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 0000000000000001   9059231222d6b54a c10c9276b5d8b864 3c6d04e46e384088 df9c4a211d0df316
+philox4x64  7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 0000000000000001   0046825443639c50 1c1a53c10fd6a39a 204525814c2bf9ca a2a8a25b1cfe992e
+philox4x64  7 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 ffffffffffffffff   bd030c40201c0f70 8de0448c8d01b695 e0a3f6bb1516887d 3b17f2a2ac08146f
+philox4x64  7 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 ffffffffffffffff   0adde99a7834d3be 381bec931b9ad649 a08229387d02463a dcbe1ac725399cee
+philox4x64  7 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 ffffffffffffffff   f3e86513a4e70e1e 186f958e53095344 3b971ea6c9a81548 dfafa60231e08d3d
+philox4x64  7 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 ffffffffffffffff   e0f90c7455a782a6 c552e4d263923300 22a0948ea7972b4d e387aec33822523c
+philox4x64  7 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 ffffffffffffffff   52a6a2780e51d7b2 3673bb81e995d85d b12dd4b6eb72d6f0 2e1909106a07a8cf
+philox4x64  7 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 ffffffffffffffff   c189106b490bd2fb 4f6d1dd470fdfbcb a7bd83ddeb0a1dab 045aa110f8f52c40
+philox4x64  7 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 ffffffffffffffff   9df8faedb521ef1e f1a120f15e091886 1d4689c5d1779200 829ef45f53092914
+philox4x64  7 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 ffffffffffffffff   767a5736b7d348aa efa73968ff5c0444 ede6adac4e8d4795 c366d2c5357e0bae
+philox4x64  7 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 ffffffffffffffff   cd2b03d43747bf25 b1e1d178f4476f31 2f04f2e652429d2b 3f18ff71fe2b1d96
+philox4x64  7 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 ffffffffffffffff   ae8dd2e4f571e95e cbe84fe3c5c7a22e 41958d43eb183198 be273430e39dbb2d
+philox4x64  7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 ffffffffffffffff   6eaea4468842c579 61c993f6deddb8b7 32da2c8845639fea 1caa39d539440f84
+philox4x64  7 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 8000000000000000   fdb4c38370017081 37f20a8cded028e1 07b6b7e9b441ca64 afcbb7db096a11ba
+philox4x64  7 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 8000000000000000   77f9f02957fe399f e7bcf2e59a9c0014 60c025f137ddfdef 6e2d9e24f28b054f
+philox4x64  7 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 8000000000000000   b1dffa9d26bb2bba a686af9fbc2fccca 7703523657b1f11d d1b1117279f5e560
+philox4x64  7 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 8000000000000000   1ee64cc049af47d4 130f44d0d6cb90b1 8aa65fb519e08c1d 5fd2902cdd9c4b21
+philox4x64  7 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 8000000000000000   5eda50bb0f6bf36b a61c3684ea63eac2 72577567a117738a 4c2f885c923f8a50
+philox4x64  7 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 8000000000000000   62c4b12d2d6f4f43 7ac09a7a5f78a347 eaeceb4a5d707d81 ddc693c1152ca863
+philox4x64  7 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 8000000000000000   19b89a3a0ebfc396 851393a4eb9800e1 60219574c2cfdf14 99835afa209b5a5f
+philox4x64  7 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 8000000000000000   fccd9c83d6bef5c8 495bdfc8980206ec ef6b8861816b556e 6750afa3867363f8
+philox4x64  7 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 8000000000000000   7793fdab901f40e2 0770db0a6546aebc 9414169ccb08ea4f 8e4107ded7e6fe22
+philox4x64  7 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 8000000000000000   2e2e8b89c1ecd349 a7a9e220db717f97 39841e145bee64ec af899729cd317ab5
+philox4x64  7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 8000000000000000   c4b6db2cafd36b63 1c10b197be4bb8f9 6ccf699079df5db9 7426268167ef98ce
+philox4x64 10 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000001 0000000000000000   4db6a27b756282df d944fa03babe0e2f 27f872e577060d32 07f697696a0482a2
+philox4x64 10 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000001 0000000000000000   bbf738c62d3516b3 7faed3926853226b c175b4809d5da923 7a77f6c341cec732
+philox4x64 10 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000001 0000000000000000   05c42b05ff257651 83431181197ac359 57be92230b7ced59 75073635c66ba84b
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000001 0000000000000000   8047f8778e0c2a18 da91ab55df266829 5a8b0adc29d708de d2ba72e9a5f8ca1f
+philox4x64 10 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000001 0000000000000000   82a98ead15250c68 dca14805e19e01bc 7bc58279fe853ad2 4366ca54a9015751
+philox4x64 10 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000001 0000000000000000   5103c647343f9197 a979e24146bddfdb a38a5cea6c70d5ea 69dbc87d145feea6
+philox4x64 10 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000001 0000000000000000   f5cfc4e5a58df07a 6fcdcdd4c962f858 9924d9474dfddf2f f5da8c63141ebe42
+philox4x64 10 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000001 0000000000000000   0dd2beab02c79d3b 85868d969fc6d557 da416fa7e6efe9a5 97aa0f5a07837f3c
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000001 0000000000000000   e3de832dbefa4f20 9d8e387753e80554 3f942711126531ab cbac59ef8a8facfc
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000001 0000000000000000   4aea7a2d45ef6b56 9d39b7727af2b34d 710b6c665646f6f3 4c266cbd9914407c
+philox4x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000001 0000000000000000   c306b6f69047b4d3 50a141b88a52f51f c1255f575c5efa40 e9ec1af0c5fd12e7
+philox4x64 10 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000001   d037f8c3f9a1d176 c057419b4c210765 abf13115117b0065 7bae035dea6ea5c0
+philox4x64 10 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 0000000000000001   5f173f0fc52df6ee 8e8e9c9688aed89e abdae5020b0cb568 48f2b1309feded50
+philox4x64 10 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 0000000000000001   fc2c9c4d9ddaf082 2897652bb49dcae3 baaf4535a51ae093 97a0e3db84f4deda
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 0000000000000001   c403b0ed4f4a56bc 4c10205602338da5 44026cf45fd8c7b3 c85ab2577611200a
+philox4x64 10 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 0000000000000001   a6b0eb43d4242e83 7eb0571197ef0432 595c5ac87ab02ffd 3065201e77c7719d
+philox4x64 10 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000001   06fc1ee830dac525 9dbd142788436b9f 5142f5068c0d523b 3a272b75f6fc8d07
+philox4x64 10 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 0000000000000001   05ea68c26fda314d bfedb09469623669 b5d90ab786f50a8a 91ab55b3322fa08b
+philox4x64 10 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 0000000000000001   fc66f7ed4a80f91a 26321095c87d4593 b7c965253657e98f 9ec415f9832e5a5b
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 0000000000000001   0a3c7e26094a08d3 2adb8f85553814c3 2e4991e78f66b1e3 15eb86339cfe3169
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 0000000000000001   fc1433efdbd33e21 808ce83adf2a77f8 96ee08d151e9bb53 e8f4c80839491335
+philox4x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 0000000000000001   43e89f25ef59b052 d2502d395a99506d d5c391a65ae822ed 5b049af4d110de73
+philox4x64 10 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 ffffffffffffffff   72d6708a2e33f32e cdb7d7084ea573af 7afec3befacf7bfa 973f3514d6cb878e
+philox4x64 10 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 ffffffffffffffff   78f3fb4b2e6c3b4c 8ff0de70dc8d4d15 7ff4df00521f1fa6 562c6ab0f46014a6
+philox4x64 10 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 ffffffffffffffff   2387991c4ec7757a b5386352c0608d17 4e1652d424a4e695 0a51cf9337aa092d
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 ffffffffffffffff   e6ffec0a65d827e2 4eda0ce957436ecb 044226366e687984 c563403773ea4586
+philox4x64 10 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 ffffffffffffffff   610763733452c58c 782a055afc18c1b2 9a6f11fd37bba6b7 7230bfcc8a5f81b8
+philox4x64 10 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 ffffffffffffffff   0227ecdbbe8da04d c78fb8f0b412a18b 2c95e618493dbf20 b3ecdbb8c2ef1600
+philox4x64 10 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 ffffffffffffffff   9dd4b8f423be915e 43cd5fa1ab84838c 9bdd5bc7b21d5372 ae35cb6a3d94c1fe
+philox4x64 10 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 ffffffffffffffff   127083ab716caa91 96939425b7ef4758 da6dbf8bfa9da76b f4a9720c1af9e0e2
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 ffffffffffffffff   3609d7e72c5bf1ea e82604f634f7ad33 8b6c9f114736edf2 83dcba394e12f45a
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 ffffffffffffffff   cc2e3611b341b443 d975353c6baa07e8 4d0e70419e907e10 8a4dceea01380ae1
+philox4x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 ffffffffffffffff   7abbd897f6d97f60 a35c61aae7c5a341 939a3dd4f55b2e11 aca6e644802e2b83
+philox4x64 10 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 8000000000000000   95bf028be28ca5e8 80a06590a6c807a8 1770cb520415bcba fecac07f93e9ed1f
+philox4x64 10 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 8000000000000000   6aa3e3e8852b4cc4 eeed4a014947ee9a b347eb5bb39cbcee f048d1bc0fc2b4f2
+philox4x64 10 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 8000000000000000   86b7bbf896316096 dbf03c3291b0e8e4 f7baf2cce7820704 6901641d0e74863d
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 8000000000000000   a22ba98c8739f11c 75840cee16d70e1a 59211c4195818dbb 26fd6d1dd8b4d938
+philox4x64 10 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 8000000000000000   b7a2f1ee3064f644 5bfed8c7b0e09ec9 d7ef6479063d9862 b94fd6571ec99673
+philox4x64 10 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 8000000000000000   237b3d9bab6c147b 15cd10a376b3ba31 e9fca9f852456a7c 011d03871fbcd351
+philox4x64 10 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 8000000000000000   c2af8ad32fd4de40 210519dc3915cf8d 96d7b5aaac61e656 bf890353d0e4f406
+philox4x64 10 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 8000000000000000   deabe779ac4018bf c244924f18a0bd57 b2c176463cbcdd44 924c5c68f49efe61
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 8000000000000000   65084d38b2079128 26278aadff5dc8a0 12b70968c429186c 3008f3151aec94d0
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 8000000000000000   4e5204874c73745c b416cb6ef85bba05 87819def7e3f93a0 cc38b1dbe3d9d6e9
+philox4x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 8000000000000000   79b0012fa80e5ad7 15b81f9bf706cc38 6586b6802ea9ba1c 1bba4ac847739bca
+threefry2x32 13 00000001 00000000 00000001 00000000 d460839c ee5930d0
+threefry2x32 13 00000000 00000001 00000001 00000000 ea891938 471d995c
+threefry2x32 13 00000000 ffffffff 00000001 00000000 c5e14858 bd7ab190
+threefry2x32 13 00000000 00000000 00000001 00000000 61ec2d44 95654539
+threefry2x32 13 85a308d3 03707344 00000001 00000000 ade2ae91 0d6ab23f
+threefry2x32 13 299f31d0 ec4e6c89 00000001 00000000 c2e3fb83 a2106e59
+threefry2x32 13 38d01377 34e90c6c 00000001 00000000 56362c81 144ef0e3
+threefry2x32 13 00000001 00000000 00000000 00000001 2ecbda41 982f3323
+threefry2x32 13 00000000 00000001 00000000 00000001 8f4c4973 dc866a7b
+threefry2x32 13 00000000 ffffffff 00000000 00000001 83ecfb53 4e25540b
+threefry2x32 13 00000000 00000000 00000000 00000001 7a3f4f18 3aaa1dff
+threefry2x32 13 85a308d3 03707344 00000000 00000001 7fac70ab 49b0b079
+threefry2x32 13 299f31d0 ec4e6c89 00000000 00000001 244c0e5d 55ae15dd
+threefry2x32 13 38d01377 34e90c6c 00000000 00000001 da2d36d7 adebf45a
+threefry2x32 13 00000001 00000000 00000000 ffffffff d858c2ae a698929b
+threefry2x32 13 00000000 00000001 00000000 ffffffff 5da8f6fe 123c29d0
+threefry2x32 13 00000000 ffffffff 00000000 ffffffff 0e22aa9d 848090af
+threefry2x32 13 00000000 00000000 00000000 ffffffff dace553b b8265b65
+threefry2x32 13 85a308d3 03707344 00000000 ffffffff 35aa55c0 223e1b40
+threefry2x32 13 299f31d0 ec4e6c89 00000000 ffffffff 88771755 0a184a3e
+threefry2x32 13 38d01377 34e90c6c 00000000 ffffffff 4b6695da c4532c17
+threefry2x32 13 00000001 00000000 00000000 00000000 fdddad3b cb69c1c2
+threefry2x32 13 00000000 00000001 00000000 00000000 4050e5b0 f6bca927
+threefry2x32 13 00000000 ffffffff 00000000 00000000 09c64211 b4e160b6
+threefry2x32 13 00000000 00000000 00000000 00000000 9d1c5ec6 8bd50731
+threefry2x32 13 85a308d3 03707344 00000000 00000000 a985a4e2 fb491ec4
+threefry2x32 13 299f31d0 ec4e6c89 00000000 00000000 cb484bfb e0dc3459
+threefry2x32 13 38d01377 34e90c6c 00000000 00000000 40f75b24 29b5d523
+threefry2x32 20 00000001 00000000 00000001 00000000 0ec66872 2d84e7b1
+threefry2x32 20 00000000 00000001 00000001 00000000 e8de5dc1 461e61e4
+threefry2x32 20 00000000 ffffffff 00000001 00000000 74100836 8f0cc08e
+threefry2x32 20 00000000 00000000 00000001 00000000 b435a7fa 96eb2785
+threefry2x32 20 85a308d3 03707344 00000001 00000000 6d2173ca 182d2d62
+threefry2x32 20 299f31d0 ec4e6c89 00000001 00000000 053c52c2 a5fd076c
+threefry2x32 20 38d01377 34e90c6c 00000001 00000000 0aff7206 20c6b1ad
+threefry2x32 20 00000001 00000000 00000000 00000001 4233dc34 3df99f6b
+threefry2x32 20 00000000 00000001 00000000 00000001 74298876 fc8d8048
+threefry2x32 20 00000000 ffffffff 00000000 00000001 45ecd01c effc9cbd
+threefry2x32 20 00000000 00000000 00000000 00000001 1e3f1835 6e752082
+threefry2x32 20 85a308d3 03707344 00000000 00000001 985706f1 39ede42b
+threefry2x32 20 299f31d0 ec4e6c89 00000000 00000001 9b255e86 836367b6
+threefry2x32 20 38d01377 34e90c6c 00000000 00000001 eacbd1c2 ddac6576
+threefry2x32 20 00000001 00000000 00000000 ffffffff 0a5c684a 89734cfb
+threefry2x32 20 00000000 00000001 00000000 ffffffff ce53f10b 4253b296
+threefry2x32 20 00000000 ffffffff 00000000 ffffffff dd0a4b72 e61f3a35
+threefry2x32 20 00000000 00000000 00000000 ffffffff b139a81a 35816875
+threefry2x32 20 85a308d3 03707344 00000000 ffffffff 09658c63 5ab84cbb
+threefry2x32 20 299f31d0 ec4e6c89 00000000 ffffffff c2662ee4 dae195a6
+threefry2x32 20 38d01377 34e90c6c 00000000 ffffffff f57c9b26 3333f9c2
+threefry2x32 20 00000001 00000000 00000000 00000000 508efb2c c0de3f32
+threefry2x32 20 00000000 00000001 00000000 00000000 375f238f cddb151d
+threefry2x32 20 00000000 ffffffff 00000000 00000000 2c4e0437 e1e32d13
+threefry2x32 20 00000000 00000000 00000000 00000000 6b200159 99ba4efe
+threefry2x32 20 85a308d3 03707344 00000000 00000000 8a7778e0 ba02812d
+threefry2x32 20 299f31d0 ec4e6c89 00000000 00000000 46367996 5ebc6941
+threefry2x32 20 38d01377 34e90c6c 00000000 00000000 0bfcf941 19b8c9e3
+threefry2x64 13  0000000000000001 0000000000000000  0000000000000001 0000000000000000  969384cc85e4f376 7483ab72c7895c74
+threefry2x64 13  0000000000000000 0000000000000001  0000000000000001 0000000000000000  a834c98cc31101ea e55d6fcaae6c2303
+threefry2x64 13  0000000000000000 ffffffffffffffff  0000000000000001 0000000000000000  ea4631bbb7e357da 76431283a854ad4d
+threefry2x64 13  0000000000000000 8000000000000000  0000000000000001 0000000000000000  aebb048a42880e06 0a82fc96ab46703c
+threefry2x64 13  243f6a8885a308d3 13198a2e03707344  0000000000000001 0000000000000000  f76fab3d0c8c5f58 86a6582b195612d5
+threefry2x64 13  a4093822299f31d0 082efa98ec4e6c89  0000000000000001 0000000000000000  4f56a3dab3651001 cfcdd06f8b5b9839
+threefry2x64 13  452821e638d01377 be5466cf34e90c6c  0000000000000001 0000000000000000  c9fc81ac4243db43 901cfd8fd5f300fd
+threefry2x64 13  0000000000000001 0000000000000000  0000000000000000 0000000000000001  4b4b7208689c3b75 a55414a2d2ee4bb0
+threefry2x64 13  0000000000000000 0000000000000001  0000000000000000 0000000000000001  eebbc15aa98df672 e9a144a8c6cee1fd
+threefry2x64 13  0000000000000000 ffffffffffffffff  0000000000000000 0000000000000001  4205e3c81cc0d747 ff9bee23459767fe
+threefry2x64 13  0000000000000000 8000000000000000  0000000000000000 0000000000000001  3adcde8fdf34b6ea b181e52876711403
+threefry2x64 13  243f6a8885a308d3 13198a2e03707344  0000000000000000 0000000000000001  f32f578de3c86db0 33cba85c3ab32ac2
+threefry2x64 13  a4093822299f31d0 082efa98ec4e6c89  0000000000000000 0000000000000001  8b991da7e77d5ad2 e0f66c743d048332
+threefry2x64 13  452821e638d01377 be5466cf34e90c6c  0000000000000000 0000000000000001  b3839b7842aaabdf 1b09812c3734f7d5
+threefry2x64 13  0000000000000001 0000000000000000  0000000000000000 ffffffffffffffff  d734efd44c40a6b0 c200d10c90840acf
+threefry2x64 13  0000000000000000 0000000000000001  0000000000000000 ffffffffffffffff  0a54d24f2de3fe2d c94935795a374f71
+threefry2x64 13  0000000000000000 ffffffffffffffff  0000000000000000 ffffffffffffffff  b05f97bf8112bd85 1e2febcdf6f2434b
+threefry2x64 13  0000000000000000 8000000000000000  0000000000000000 ffffffffffffffff  706e230984d25125 1a7fb58e33062071
+threefry2x64 13  243f6a8885a308d3 13198a2e03707344  0000000000000000 ffffffffffffffff  e79c1e9a9638a94b 0696219fb2391fdd
+threefry2x64 13  a4093822299f31d0 082efa98ec4e6c89  0000000000000000 ffffffffffffffff  63b3b5d7355ee523 98226c5378d79481
+threefry2x64 13  452821e638d01377 be5466cf34e90c6c  0000000000000000 ffffffffffffffff  a74b06d5dd1e77bc 78ace2fdf2fd1130
+threefry2x64 13  0000000000000001 0000000000000000  0000000000000000 8000000000000000  695a084cd9107249 7c2a145f7a914169
+threefry2x64 13  0000000000000000 0000000000000001  0000000000000000 8000000000000000  426ce9a41d6e3b44 1f406838af84fc50
+threefry2x64 13  0000000000000000 ffffffffffffffff  0000000000000000 8000000000000000  29fb2a250cb2be0e ab5d1d66743cb621
+threefry2x64 13  0000000000000000 8000000000000000  0000000000000000 8000000000000000  8f5f55581e428ef4 6f50999482bb0717
+threefry2x64 13  243f6a8885a308d3 13198a2e03707344  0000000000000000 8000000000000000  8132c0494d3a1024 1310f2c1f743337e
+threefry2x64 13  a4093822299f31d0 082efa98ec4e6c89  0000000000000000 8000000000000000  f0ac482e2f8c554e 0c250a7c2bd56d1f
+threefry2x64 13  452821e638d01377 be5466cf34e90c6c  0000000000000000 8000000000000000  c74c1599c6d82c7f 7d40926bdb8a9b86
+threefry2x64 20 0000000000000001 0000000000000000   0000000000000001 0000000000000000   76f8c465410f1b27 d44c2d67df04a330
+threefry2x64 20 0000000000000000 0000000000000001   0000000000000001 0000000000000000   a8049503dd3079f9 3d5ddeed522c0ede
+threefry2x64 20 0000000000000000 ffffffffffffffff   0000000000000001 0000000000000000   5e53259aa4258a55 0e8f38c365945d25
+threefry2x64 20 0000000000000000 8000000000000000   0000000000000001 0000000000000000   361a8be863ffb732 a4b1a2eeb58e74d0
+threefry2x64 20 243f6a8885a308d3 13198a2e03707344   0000000000000001 0000000000000000   fd6ae8f34dc33d12 038c18af4795d22a
+threefry2x64 20 a4093822299f31d0 082efa98ec4e6c89   0000000000000001 0000000000000000   7ac8bd11c1f70ff1 74639e2ca058255e
+threefry2x64 20 452821e638d01377 be5466cf34e90c6c   0000000000000001 0000000000000000   ed08efd2a170bbd7 0dd10199b9784662
+threefry2x64 20 0000000000000001 0000000000000000   0000000000000000 0000000000000001   ff2b78b5ab41d8da f62ebfe044d2eda8
+threefry2x64 20 0000000000000000 0000000000000001   0000000000000000 0000000000000001   5f3a212f661cd020 986a3ba650b3fe67
+threefry2x64 20 0000000000000000 ffffffffffffffff   0000000000000000 0000000000000001   6a6b93a7418044f4 87b8ba42ce2ff9bf
+threefry2x64 20 0000000000000000 8000000000000000   0000000000000000 0000000000000001   bae5e0296c6a477d 0fbb8a9f8a4ce574
+threefry2x64 20 243f6a8885a308d3 13198a2e03707344   0000000000000000 0000000000000001   99cec910eff5ec80 590c31d2679b536f
+threefry2x64 20 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 0000000000000001   02f8b55a501f2281 d76b4bf86e78c17a
+threefry2x64 20 452821e638d01377 be5466cf34e90c6c   0000000000000000 0000000000000001   85ed5f68252b8dad 94e7c2f00c87c774
+threefry2x64 20 0000000000000001 0000000000000000   0000000000000000 ffffffffffffffff   2315d2c0d1827ca7 6c9edc5ea9168247
+threefry2x64 20 0000000000000000 0000000000000001   0000000000000000 ffffffffffffffff   e673b4093ab96a92 e6b9195814502ad9
+threefry2x64 20 0000000000000000 ffffffffffffffff   0000000000000000 ffffffffffffffff   617e1767c6bab4b3 9defeccc66ef5483
+threefry2x64 20 0000000000000000 8000000000000000   0000000000000000 ffffffffffffffff   64008223d83f51ea 703e62828caafe5c
+threefry2x64 20 243f6a8885a308d3 13198a2e03707344   0000000000000000 ffffffffffffffff   55c5791f5e6a445c 6244e287ceff815b
+threefry2x64 20 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 ffffffffffffffff   69f5517074ffb421 364c6cb5114df09b
+threefry2x64 20 452821e638d01377 be5466cf34e90c6c   0000000000000000 ffffffffffffffff   8abfad0acf126feb 7e4838608dff93a6
+threefry2x64 20 0000000000000001 0000000000000000   0000000000000000 8000000000000000   f3113561b7808541 e1d6850fd01f03c8
+threefry2x64 20 0000000000000000 0000000000000001   0000000000000000 8000000000000000   1f254bdb6686f3f7 2defd1bc9a4e7d58
+threefry2x64 20 0000000000000000 ffffffffffffffff   0000000000000000 8000000000000000   becfaedd81933ce0 91105295132db554
+threefry2x64 20 0000000000000000 8000000000000000   0000000000000000 8000000000000000   08e7eef4615bbae3 16c446fef3ff2fa6
+threefry2x64 20 243f6a8885a308d3 13198a2e03707344   0000000000000000 8000000000000000   58af89abe6d07cab 12e1901ad854ba14
+threefry2x64 20 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 8000000000000000   469ded4657b380b5 4e18d924d1d191f4
+threefry2x64 20 452821e638d01377 be5466cf34e90c6c   0000000000000000 8000000000000000   89983220cc01af30 756813c51f68660f
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000001 0000000000000000 0000000000000000 0000000000000000   a6f9957bb320bd6e ef0a1039b8680652 fae787a45de5657b f9642457fdfcb48d
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000001 0000000000000000 0000000000000000 0000000000000000   33a54b87b3cd8f2e 9fa6ecdbf563b5a8 931690edd16e1167 73f4cf17f6509ec7
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000001 0000000000000000 0000000000000000 0000000000000000   b57fb4d862d825f6 5f5a8b05deb0f388 bdaf7ca748b32db5 dcc8a16110f45860
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000001 0000000000000000 0000000000000000 0000000000000000   63afa273fd1e9e0c 97afe3fa44762e3b 2219a168a1c4a650 b5aa9e933220d0b6
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000001 0000000000000000 0000000000000000 0000000000000000   18ebd38f634db4d4 fe8a4b02116edcae dd968dbd012bb9b1 015735f374007b55
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000001 0000000000000000 0000000000000000 0000000000000000   dc11f8adbd11b24a 791accb12bf2dec9 b3252ca2b3d45867 32583a89606cc095
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000001 0000000000000000 0000000000000000 0000000000000000   142fbf027471bec7 d4a21fe298e42da0 e1809cdb47379df7 895c488e4ce2e8e4
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000001 0000000000000000 0000000000000000 0000000000000000   56233cf7c5050e03 138e50f0180f9432 77e5abc32171ead2 22156b3a4478058e
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000001 0000000000000000 0000000000000000 0000000000000000   b51f94a1964e29f4 73c3547be95bcf52 cd0980b164b47740 cb7a80706dda6cd4
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000001 0000000000000000 0000000000000000 0000000000000000   6826fc7451e6c26c 9c945a480118b238 878fdb0ccf5287a2 b721878054b3e170
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000001 0000000000000000 0000000000000000 0000000000000000   1450ad64afc5f2ed e276f0d9b36896cc 1bf54af66c1ea6e1 b75bf6b012256a2f
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000001 0000000000000000 0000000000000000   c0a579b6df85d3f0 732bf17e102f3503 e9ef8226f861b581 9c6323b1032ee103
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 0000000000000001 0000000000000000 0000000000000000   419fb75d6279b45e 456c9bc33b2aa89b 6b9f17cbeaafb959 0f4d34c7bc2615dd
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 0000000000000001 0000000000000000 0000000000000000   35dc176476fd83f7 11c97fffd44c6f08 803723f5c82c0c4c 915629678133f8d0
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 0000000000000001 0000000000000000 0000000000000000   7b6e1a8f678caef4 db5a7994ef339ef5 b7aff2cabd5a0d5a a1b164b52ef2880c
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 0000000000000001 0000000000000000 0000000000000000   e335bf28c658f0a2 6dc44599a8dc94ac 17ce032c8be59e34 46bf9933175c2c84
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000001 0000000000000000 0000000000000000   a0ca6ff95e2395e3 f178163a7734c5a4 3fa3d6b89533b005 74ae65ed952f7779
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 0000000000000001 0000000000000000 0000000000000000   87043dbdc9710b4f 9257db04f6d3e197 385860312b4c2170 ce4cf41003912f85
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 0000000000000001 0000000000000000 0000000000000000   7040ee2508a3b5f8 641da9784e15d9cb fd6425f2b65abfcd 52a998ee7e05bb87
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 0000000000000001 0000000000000000 0000000000000000   c435439eadf80e26 3d1d6a0cc0c5a1ff 6e0f4ab6ccc428e6 a01b294b56f911ca
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 0000000000000001 0000000000000000 0000000000000000   c6a96a811e9e7967 246e0dde25ee2e41 4f2a463cafbc149d eed2f0dd7fb7e015
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 0000000000000001 0000000000000000 0000000000000000   3eb1e2a9f11e2bf6 c4bbbb8f8b92a4f3 a2785db07b5e26e3 dfe2c344e871d170
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000001 0000000000000000   94daba158dd2da48 f5e6c0b25edfef90 02dc9eadc3f11073 c6bc42a8d86e82e0
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000001 0000000000000000   2f0dd3a02e097fe7 c478a58d8de77acd 432b1f1a4f0376d1 a8ffef5de8592b22
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 0000000000000000 0000000000000001 0000000000000000   e145933082f42a2b 281a975a59959231 42e82c1fa3928ee2 ccc5c01c9c173ff6
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 0000000000000000 0000000000000001 0000000000000000   98968fa4a639959e 31522da140cfa5f4 3925eef1f1df6024 8d364318e053e86b
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000001 0000000000000000   8b7a6424cd57bd36 0f14e72a776d9eba 5056bbff35bb2d8b 2bf2035a0f74457b
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000001 0000000000000000   b98486865fe19a16 bbf02df5d0b6f14e 1d1d3db837473cfe 39d36d4ef6027d20
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 0000000000000000 0000000000000001 0000000000000000   4546fa00ed7ba2e7 b9598f5ffa69d1b5 2a31e21e7479956b 18b430b333a65956
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000001 0000000000000000   7e3fc60c2ba2b532 42ecfe3256df67fd 12cc29eda1e8e628 476fa98b6c20dc0c
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 0000000000000000 0000000000000001 0000000000000000   0553dc3e29eb393e 4fcb860d74474ba2 a54bda273d90fa5e b2d09969a3e0781e
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 0000000000000000 0000000000000001 0000000000000000   1b0d22708753d5a5 fe97c91941b129a0 43fde34d3a6b9581 684ee07a5d059bc6
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 0000000000000000 0000000000000001 0000000000000000   c5ae23b6e14b65a0 1bb8c20cf54ee911 afd0f01436a88dc7 e27b950209d0e8ea
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 0000000000000001   d6e0471854c36f95 024f53084350d59a a746f965db3779ab aec82c5a5a89448a
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 0000000000000001   c5aa1f1c7ae358f3 97a8892135e7c1ef eb25fba1cb9a4c41 7a90abbd43261fa4
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 0000000000000000 0000000000000000 0000000000000001   fb59e13f8bf1a7b6 3406ec6cdd6e2f1d 28d4622f7d272829 618f7c7e73507e00
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 0000000000000000 0000000000000000 0000000000000001   641cb9a478c9a5f6 6bf494830fc3c197 836e085ed5dfb374 cbae065146b3e242
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 0000000000000001   31f44b90e71f66c9 2f3ba3de820f4650 9097c77cde234ac5 50340ce26229fabc
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 0000000000000001   4e026822a87dee71 b4ab7f79ed3dfd4a 9429731fdb5c0a64 7706366fb9251512
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 0000000000000000 0000000000000000 0000000000000001   1949594f1d057a72 cbaea16559f04cb0 4a0ca9e5ad24f4cb db1f95560c87f79f
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 0000000000000001   0f9ca509614863a7 615112fd34af4c67 408fd57c3fadb45b 1f229a09ca130ea9
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 0000000000000000 0000000000000000 0000000000000001   48b71c1ec5e0e1a7 61005d67d77283bd 7475cf1b42918462 9a47b84099cb8820
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 0000000000000000 0000000000000000 0000000000000001   f744c0e233f14f37 ec52e887545bed98 75013191d39a68a5 b5107d5fbda31dba
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 0000000000000000 0000000000000000 0000000000000001   07bfa94414046839 c9292f370d05ec10 e5abfd88ea69c29c e5694ea31b40917e
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   5b1e5890fd4dddda 3bd7fe815d826da7 5cead66cc2d6cf4b 9f2b09ff30f4496e
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   e6dcd7854a76f333 535299e0765eda14 a649fdda2cf305f4 601265889b4f49b7
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   31ce59c9547701ce 442e5c98d58dd9e5 a4272c64230571fb 54d00283ad3869b8
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   78e0555be3caa567 29fd32a8e78dfe2b d12e964c3bb4e95d 508ce2a099d1294a
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   9bfaa6924981503c 3839252d08d78e82 b5a318c512e81925 2c3df5629446cb3d
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   39f7c8350c2fd966 a296554641bfa50f 2217077aa07b2a77 f4e41f63a9bbb3c4
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   8dad2651f0d59fc3 3fb4b008bf0c67ae 7a4958e5704b0e42 049189499fb9d713
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   47ba2144a6d5593a 70cf55d5a21ced0c 7bae9fe35eedf169 5fa2bef1f0178e53
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   3481c43775a74a3d 594029c16094b2ac 4242c166d72c5e8a 47132e77e038a80f
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   2583f96efb951f87 5c05dc0fad2a0640 2276fd3905536384 f52f698ab7c15254
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   860b9848db0836a6 60e2cf66b950ac3a d9d93cc3d01c0bb8 0c39d9fca3179af4
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 8000000000000000 0000000000000000 0000000000000000   0b97f6aec4194f29 f807cc683239c776 92336bc0d194833e 6af28b14847cbd25
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 8000000000000000 0000000000000000 0000000000000000   d0bcda618f970ad7 23bf3f0b100b6b8e c0f43c6935f03f96 8567ff6ca9bb298a
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 8000000000000000 0000000000000000 0000000000000000   952d67de8cc88100 b05aeba45473ada1 a12187872e534939 6bd07569c5c1384c
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 8000000000000000 0000000000000000 0000000000000000   206a6c9947cd4059 ecb599e01e678611 d76e1a6ec72eed5b 9af53b23d20fdf5d
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 8000000000000000 0000000000000000 0000000000000000   4686adcda45f8e82 f7c04d3b241269f9 98c2c7452f1de0be 9c45ac8325862db6
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 8000000000000000 0000000000000000 0000000000000000   1c1af5206f2ece54 f9bac132c72d711c a227149a44bda9d7 828db0a58587130c
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 8000000000000000 0000000000000000 0000000000000000   c0c6c3989f8a19c4 82ff34015e798fe5 1539e98a9cdce38a c98e62331c6329ff
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 8000000000000000 0000000000000000 0000000000000000   36d9f5d821c1c83f e2db772b11f2f021 6ba03362c1c10994 8d8a339448474da9
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 8000000000000000 0000000000000000 0000000000000000   5225a064dbddca63 dec3c80ea3f20208 b04e786c1de1a6b1 86e5434fc1dc51cc
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 8000000000000000 0000000000000000 0000000000000000   ccb716bd11cb6fe2 3dda97c9ec8c6199 23b4e9fc6557cb92 03ee97e50b557f80
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 8000000000000000 0000000000000000 0000000000000000   cfc902fffa76fa1b 71feded34df89372 84bc39de7545239f a8a7257817796076
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   43ac62ad40bb0dc8 f19797814ee9d712 bc733e88b4f4fc6f 8d88689a11c0e444
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   87c9feb08a847950 19601bb00361a1e4 b08ea511608f3a79 e0682be6cff83767
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   da75d515c7765562 a53632bf88383197 2ac07dd554ee8076 d5b5d9ca8fc4d7ef
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   acacc47aec597245 5603e39ea0c435be faac042a22a85a33 def0f2feabb108fb
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   84ceb8a17a4d921d c34ea70e11cd714c cb778d241722ad54 b6f57011c04feafd
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   17df51edc9093e45 ff21858aa5e3f88c 719738071c63ae9d f78bd7d434990a43
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   2e68fc7dfa5150a7 13b3e50898941ecf 67a61073ce21b66b 8ae48f8761ddb641
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   13019c159fd18540 56b47f4ff862d77e f0525397b38f5659 06c701aa0b5f0ce7
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   120841cc984c8b5d 7ef7e0e47aa11b7f 427eccd66d8ca6a7 8c9c187c5a93f9d8
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   5cd4de739c3025d4 8b7cba4515780d90 fcb10461e7262355 80cefb8eb218096a
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   3138f3138e47b09b c3957d408434f8f8 f53e02d616b134e7 721029b2628b0497
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 8000000000000000 0000000000000000   de825ce58d5c1163 fcc32b1bf6dba058 23ad3d0d2f87e6d2 75e05c241fc71616
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 0000000000000000 8000000000000000 0000000000000000   da20c7bc4e3d9707 5d92445c4891a513 e82592343e1ad0cd fe01a1f64d1e9a00
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 0000000000000000 8000000000000000 0000000000000000   154c6525d00f11aa 05559415b1cb8a8c 030bb62025d53788 18030170eda486a4
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 0000000000000000 8000000000000000 0000000000000000   31e3d5a16fc4baa7 aaeb4bc3b0a7054e 76338ce0989861b0 0c883d1d87da3197
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 0000000000000000 8000000000000000 0000000000000000   0003485836fb3812 6efa47e66ad4aaa9 dedbe1b07f5e2027 77013bbab7104b3a
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 8000000000000000 0000000000000000   1812be595dda0739 4e5a2fdb16c8947b e04cab5c91c3864a 1d1afd092303374a
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 0000000000000000 8000000000000000 0000000000000000   bfdadb9f36d8e4ea 5b422319060bf905 53ffcae0b8c7ca1c f6562ebd20777d5a
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 0000000000000000 8000000000000000 0000000000000000   96d112d938bc7771 e3fe46aa2618ac2f 206673e37bda2625 af1ebed61abd839a
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 0000000000000000 8000000000000000 0000000000000000   c11769ceba44ff3f 1996279e3a7cd8b5 b0ce7ee3ee7555b6 7d932c7e563d7cc5
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 0000000000000000 8000000000000000 0000000000000000   9eae02df80c59f3b 01dc7640aafa9fd8 9d5b7aa9f801ceb4 79d13e5608aedac7
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 0000000000000000 8000000000000000 0000000000000000   dd81e5071213cb65 f95242bc69694579 ba58df28812f62ac 8fc5dcbc22f589f5
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   706df8b143a55f67 ddff5e09840fa38c c879c4f524d998ba dc73a56cd4ae98bb
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   78053349f166715d c14d62de2c740d61 71c3e7d81060b29a 21bc36b618c97a1b
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   3c51fd1d7a0231a7 1c716c429b12d830 f98749855715755f d4928002384a27fa
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   3f2322ac3118ab7a 77342b3ce112420b a4e74eaea4b602ef d7a036a48f09bbeb
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   1f7d2d32b4560572 65dd77ea737af34e 7273b33fcc3a542a f4be4f5efe578555
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   9c8b4bb1d1234df1 c81acf5747a7e967 8a2816c04ee41e46 5044b310241a3b3e
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   9669abc61b43311c 43356b81b746111b b6dc48eeb21b8699 dbe907f08d01a64c
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   8beb2316ebfc349a 43338972ba44efa1 027aa324111ddb2a a0cc5e126b613e9c
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   9ab42dcf03464387 a1ba2f214f9603a6 75659e356c523763 140c05291e373a99
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   cc76b2ebda048a1f 74303dd7cbc9fe2b 86bcb8baedce89d7 02e1b32c8116a108
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   cd41da269ca3c8f9 3e1b1b12a9e2aa1b 68742c4dfaa5e2f9 d905f214c4e32adb
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 8000000000000000   a15fe10faae1413d b3ea00728b426ae8 44e0362e37778626 d76da78c8bbdb2f3
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 8000000000000000   c74b6463897871d2 3dee782ceb448d5b 76fb472b4f8dfb3c 579b0fa66a5a7e3c
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 0000000000000000 0000000000000000 8000000000000000   c596fbc29750200c 5eac3cafb1b65cff 0ebf88e52a4ca31c 56ce58d36711edc8
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 0000000000000000 0000000000000000 8000000000000000   344ee7b935fc9f4e 86e7bbe859b3288f 4fd5f444ff546852 379d0f15264ce291
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 8000000000000000   a12b7c0ae47df332 b1fb8faf8c7e055c 012f4ce8699912e8 1807370c17fe4806
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 8000000000000000   309cf1978593199d 4803a4c3464b33b1 8de1cf19119e5184 0e98be6e29cc004d
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 0000000000000000 0000000000000000 8000000000000000   a3f741dfb4b0123e baacbbb9319e1f3c 6e2a766bd9f55e2d f85ca77e46c8ac8d
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 8000000000000000   b1940157b0d12078 5a6d59771301089c 5528ee2ad8191549 062755f87de1a247
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 0000000000000000 0000000000000000 8000000000000000   921cfbb9ab46b160 bc60a78079a42218 dd7c39b5185d007c 046c126b53105693
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 0000000000000000 0000000000000000 8000000000000000   25c6067a84995616 d33240726703b517 ca201d11dd57f427 64a6de3f4143ee6e
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 0000000000000000 0000000000000000 8000000000000000   afeee610c4519328 8cbaaca176308e27 dc15a9770306e954 c7ece70c6b146822
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000001 0000000000000000 0000000000000000 0000000000000000   f89ed93865056e32 bd896a3dbd85a756 62d8d73be7c894f0 e792657aabcd4d07
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000001 0000000000000000 0000000000000000 0000000000000000   982b64d9ed17727f b92ee937b202c51f f4b17d93cfd45600 f9f8aae4c794d15e
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000001 0000000000000000 0000000000000000 0000000000000000   b6a7225711cc34b8 53074728c278f4c7 5667235e08827615 132e773e6e7f0eb3
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000001 0000000000000000 0000000000000000 0000000000000000   44bbf877aa21ae51 965dfe7a5d2264b4 e9f7ad5df7d8f80b f7b569832716868e
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000001 0000000000000000 0000000000000000 0000000000000000   93f2387a206e8f9e 6cb5b48ffdf2d7cd 0e979b44e4dd0e1a d7bff06c4f8e5211
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000001 0000000000000000 0000000000000000 0000000000000000   c89facdd90bc86dc 2860da6424e61172 6d062d8f0dc96667 977cd762173d0fe5
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000001 0000000000000000 0000000000000000 0000000000000000   c3d42d91a2e77a9d 9618b89ffb6c4c06 72f6505dff514d2c 6dac73802a09ff91
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000001 0000000000000000 0000000000000000 0000000000000000   c65d933491370e7f 8bd8c1c43548d88b 677cbc00c0577228 9c5c490ce2485273
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000001 0000000000000000 0000000000000000 0000000000000000   fb128418d58c8190 a30cacdbeeaf83a4 7daabc3ee8242ca6 cdc871c48430783c
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000001 0000000000000000 0000000000000000 0000000000000000   aa8f96391f668b67 e55eab0e8e2e5836 a1467300f7fb04f6 873ec0bc55573b89
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000001 0000000000000000 0000000000000000 0000000000000000   7bbbcbf0f617f950 8eda8917ee3a6a15 56bf5df8bfd1060e df7a6d2bf0396704
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000001 0000000000000000 0000000000000000   8ae5e8b70c436fa2 a95dbadf918998a1 0e5908b70abc9526 293f0eb4a5fdafe4
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 0000000000000001 0000000000000000 0000000000000000   8186defe625c11f3 06657e8ebbc151f1 f3b446f77ff82f6e a8655aab80b83368
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 0000000000000001 0000000000000000 0000000000000000   bfff7105cf64329d 5da774462017e77f 604b3d42401fcfd6 12c33a3cc0a622f7
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 0000000000000001 0000000000000000 0000000000000000   543bc7d16d113372 c13b3c63636d7acc c596bf4b944e106c ebad1d5a09f2d8e2
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 0000000000000001 0000000000000000 0000000000000000   1c72022fd804739a fb70dbc298660c89 ef584d080b442849 647fbc04f2b0ba2f
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000001 0000000000000000 0000000000000000   e53b96331ed89298 87f81c5d8334482b 1ab323554c0c08ef d8a54cad427df583
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 0000000000000001 0000000000000000 0000000000000000   aa234e6ecafcf2a0 4744cbeaae240876 64c770d4dcc26254 153e3de28b8c62e5
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 0000000000000001 0000000000000000 0000000000000000   d69224680a4d2e61 cf82a8b14c8282f6 c35caf223d708d26 d20eb877b3b194e6
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 0000000000000001 0000000000000000 0000000000000000   05b4e3832ac3001f cabd925f6019062a 6e881791ffffcddc 3d07c493dc18ee36
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 0000000000000001 0000000000000000 0000000000000000   770f680e00670cf7 55b37fe1f230b862 c60feeaa07a9a962 74b7618ae3112c62
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 0000000000000001 0000000000000000 0000000000000000   56292009e38f1873 10629818ed1b807a ecf7a9c2699f4c84 68dee03a7ba18cc0
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000001 0000000000000000   e976691f1b80d958 be8abbb14c5ed824 f29b8e777ca5c94b 97175c4d56649bd8
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000001 0000000000000000   99122a867130ba68 29e6fc66a54153d1 6bb286953c60faa3 15f3a11b70692bba
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 0000000000000000 0000000000000001 0000000000000000   568c091d800376a4 6410b91f1213d435 5a53e48b09b33a5d d3ca8ae91eb3cb52
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 0000000000000000 0000000000000001 0000000000000000   ebfa25173eba130b 872e5f2c3f858550 34ba124306653c10 75abaf6f3b82a8a5
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000001 0000000000000000   cb423ba5d281d13b 97355c07bffaaa4b f04be7e7841daec4 3d58b14622d0c064
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000001 0000000000000000   cd807105b3a2206f 8dfbf66b057ab348 81333ca31ef60ef4 db7e5ee3664aab98
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 0000000000000000 0000000000000001 0000000000000000   8a7a795de1c22fb1 710a7f0c73e9c6d9 552b80b908fd894a 1b2a91bbce9b4246
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000001 0000000000000000   c623a20d932ccb7d 03bf8b8446d7128b 72c4a06097e4601d 06742862e6031180
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 0000000000000000 0000000000000001 0000000000000000   61f394f4b8f77bb2 f73fa064e84c2daf 35c35bfbdfbef4f3 a724fb52592f935f
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 0000000000000000 0000000000000001 0000000000000000   6db56dd85b84b7d0 f159755eab2ce68f 60b4cd66d0531931 593643f04eabd3df
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 0000000000000000 0000000000000001 0000000000000000   8bae3792b1c7f028 d06b57022556fdb7 c9d485c0d516a5d0 389901e211326996
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 0000000000000001   fda4e34b6bda2e78 1bcde08f72564ebd db1ea7ab9244c332 1809e6e1f0baa36c
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 0000000000000001   1f46785827cf00cc 73efc9633842cd4f 76218d83b83a8156 62bcb826031f519e
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 0000000000000000 0000000000000000 0000000000000001   e062b28847b0a31d f9931a29afe520d4 2f2d40165188a578 4a3e9e455553a412
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 0000000000000000 0000000000000000 0000000000000001   cf65681072a11a30 00f9875b6228100c c6631b848fd3f81b d1391138164dffea
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 0000000000000001   3b55def85f780ad3 7c89509a536576db 703c7a54c92adc37 a634e944edfbb1b1
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 0000000000000001   523c9f16575344da 3b8b47c4f2abbbed c086def85eb710d0 ccccfce7151fed41
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 0000000000000000 0000000000000000 0000000000000001   2989b44b7bc9c589 6f51f1aa8194cd9c 910b471870d34248 3e16e545d6f9d3b4
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 0000000000000001   8e68fea009eee4b2 edb5e4274c6f0a04 eb34879011e8d7b2 d9da39416b62f51c
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 0000000000000000 0000000000000000 0000000000000001   1c84b638d27d7dd4 4e6dd3b04b1ff092 1adfe69682d3620e 508a1926a26bada8
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 0000000000000000 0000000000000000 0000000000000001   52ea8499b2a6f121 de7bf09d98328388 a93dee2da6423d6c fccbb0aa5fea8721
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 0000000000000000 0000000000000000 0000000000000001   f83be1563ca6864f f9b2244eb9a0a0bb 77c0dce929577f0d 4312da346a75b901
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   85874a427171bd52 087203b705096abb 2b4eac4bb197cc47 668384e956bb1b88
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   558e048a3b205295 73937c2aa93e99de 59141306fb089079 ad2f30432f603af0
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   ca31a1506188b7f3 e2f687331eb59e6b 2e0c5db2e49d0369 b2504b862d707d07
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   8e15267d675bb7f5 37e79e8f2c4f4c1a 738fd248c3fb83ce 6c5f250b42b1ead3
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   7a8abd584135cc95 54ae8923a9790941 36b8855f23b8c0cb d6e30da6960e6d3a
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   1b3e76a15a3d81bd 47515b766d1526a2 a8ac2e9d8c6fcbba 14842f687111ad6b
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   801ad32259dca163 ac610dfd986e37ab 92f0626474e43f64 f13aaf2bf6f9db40
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   4c2f35571e07df4f e6181172f7a4a8c2 852fe5c10b21ec0a 36859f042ba1fbb2
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   014828936fc30529 30b098f7baabebab bdba756ed22e67e8 dbfeb29883206ff2
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   603bb6e0f2479da5 e51dcee4b383d277 d961095b84b3418d 2125876df94c0a88
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   5eeed616d1e3b26b d476bb39d85d25ea 2388dc0afe33a091 53fe3702435ff634
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 8000000000000000 0000000000000000 0000000000000000   a702cfdfe4973280 7c249f1d0758cc0f 98454baaad673214 e3c59f707aabde84
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 8000000000000000 0000000000000000 0000000000000000   3131a6508d56437b 6cd6b52c18dc1a9a 7150f4cca95bc4b5 49a586b366d35c15
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 8000000000000000 0000000000000000 0000000000000000   67c05a6a0bb9ed25 de5266bab7cc9295 c343dcc30c002b27 5efb26d17a892573
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 8000000000000000 0000000000000000 0000000000000000   7805bde324c1af1c 668691f3be21caf7 3d6b424c11f232da aa67d4a504d5e515
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 8000000000000000 0000000000000000 0000000000000000   36fa107bd920d2a1 3241cb98bde958cb b0dc16d6e08b0631 6e7eee73c179ad07
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 8000000000000000 0000000000000000 0000000000000000   d919b55afd55c267 722ed883e05662d4 26e2c219316f4af4 952da37749e78786
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 8000000000000000 0000000000000000 0000000000000000   b1480c8085f9a79c 80fc9858168a8b32 4666dd30592b2e33 823262f5f32e3ad0
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 8000000000000000 0000000000000000 0000000000000000   a712d08192fb239b e6e4fe0a58a601fd e71ad1813b69e0e2 3219922b43502981
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 8000000000000000 0000000000000000 0000000000000000   ef86f20d6c3b68c3 917b208c644349cc 73738d7bc08f52ae 4144bc69eed1d435
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 8000000000000000 0000000000000000 0000000000000000   13a65d5f806490ec 9b7641d917615d41 ff918ea8509cc729 5c120cff123aedd2
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 8000000000000000 0000000000000000 0000000000000000   e6e9d6e5a345a1b1 ab16981d4978321a 9089eaa221460088 ae397a5f5f162e31
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   31243c5a95e832e1 cf3dc1a984b07f34 e950b7eb25eb26ba b5593c3426a1f0d3
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   fa7817180e135577 a128dcbcf2a70e97 e4932adcb9b11983 9755f62735e87f34
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   b834ea24815ea121 cac44aca182f748c b0dde9fec9df32de 44b9a0fc44677efb
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   5a6173e2accebd38 5b131c1580e7e4f3 efa5bf67388ddf08 f9ac55e63922c0d5
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   b384790d86c31a9e f1fb8ddfeaa88d4d 066441fc1fd9a778 2f1c77b88b083355
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   96659fc0678254da 6918643b2bde533f 5715c3b72f70b12f 03fbbca391a5696a
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   1c4ba033ecb49c93 966d0e8012a5a388 4a24daa292dceaab 03d2f3860af6f4e9
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   15a613110b4673a0 121b874b4810f620 f64e02eaa1212920 bcffc54556c3fce1
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   357adb0df3abcc95 db1ab7be4520ea15 6951e8aaaa5af14c fcf212f0979c0363
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   21f38a82dd49ebdd c9bade4b39894d89 992854bccee76282 cb11ce4b04634f01
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   ac11615cfb8804fb c26d1580d38b7c7d 3e8e683a4d20ea56 8a739c355ae4bbb9
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 8000000000000000 0000000000000000   b587771995c1ffe7 cfd116bd3029fc42 4d8207deb6d416c2 af9483f1ce57809f
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 0000000000000000 8000000000000000 0000000000000000   56a77269eff784de 07482fa109e195cc db90c9c776d70a2a 75d0913c19d22612
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 0000000000000000 8000000000000000 0000000000000000   9565f1f53359b88f ad98ae294ac770bb ee99e6b7b51226f9 c4e0ab4c9a14125f
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 0000000000000000 8000000000000000 0000000000000000   111a5de94005c146 2030eded2dd3b8e8 c957d395e7de6463 8d808f6ec9f73b44
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 0000000000000000 8000000000000000 0000000000000000   40e6bb219ab5c4cd ea85ca56ac874867 bc1540419dac8e01 563ad7643a376e93
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 8000000000000000 0000000000000000   164321657c70819d eaaf8de42198a16e 7eae23927bcbfab8 73a04730feb4851e
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 0000000000000000 8000000000000000 0000000000000000   97f229a61529e38a 8e319418bcfbb12a 6ba27633af0fa6de 57cbb3e68c3527d6
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 0000000000000000 8000000000000000 0000000000000000   68bbf3170a0997ed 881860e14d5cf2ed 31b899a4921526aa e677a9c70e92af02
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 0000000000000000 8000000000000000 0000000000000000   e60fa0c35e7b6944 9dff379ef3e2ad34 fabe148a01b71390 73e1d7df2dc9a644
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 0000000000000000 8000000000000000 0000000000000000   562d75b725acf954 f7f1b0276038ebfc 3c1eacdd68247566 c742c844a8deb5c5
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 0000000000000000 8000000000000000 0000000000000000   4b9990815eeba4e6 2b3ef48aa6419c30 d5b962dd45793f01 c867e6d3d6a9fbce
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   e38fadf720fccf69 73760232ff7339ae 7096a387f7bfce8b 09cdf4a8033c6461
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   8fbcb0ccb5a68c09 3c091f05ef3feb5a 880c915948eff90f 6d042824d55cfa79
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   f4187df19710e7bc 8176d6775bee5998 b2629a879b5983d3 8250daa72833a195
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   f16d33bd22225c93 257dd8242032f571 eb9c45bd059d0fa1 5a7f9b7c55960b1c
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   2e8361a4aa930a0e b8cbba78f68d1b63 3c0df7648dc4d4f9 3b533a4d2913ba33
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   c3b2ee2c35624ffe ff045283a1e08c3d b1b3042bb82d6ede 1bf1550286f383a2
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   f0326d40804c3153 37c27181a460c9ae c0034d039686abdf 3d55f60596ad5837
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0dab0563aa95c953 f38f100b1348d506 c27321a2d99f0a88 94e94b06c6477c62
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   a87036c367446e12 9f68749a58b47e25 6fc48a19201b0798 952188d35cf69fb0
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   36c8bd17d63a9a82 8af6f23bf2d3040c 156eee41f13b2798 244e8221835a7618
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   a293802a64ec9166 8039fe9d142bf9dc ab193c3d4835196a a650f43736078795
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 8000000000000000   a6848ded0ad67dd2 361bc11075f5202e 845a8a315b2978f9 d47cf41ceb9da6e9
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 8000000000000000   b0d56aaa267b5d14 778b7e865a84766b 533e6fe15d3fdee3 09d71e0d017df61f
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000   0000000000000000 0000000000000000 0000000000000000 8000000000000000   45fa780c18a49ae1 51be9eec7776ffa5 50f9251d8c94279d e6cd7113274158fe
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001   0000000000000000 0000000000000000 0000000000000000 8000000000000000   e6e1d3dd2aacbd00 67e52c14f46d11b5 2946912c9908c136 789dc703ca33c595
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 8000000000000000   9e858b947929378d 49298d74f00caa5f baf9196410a6257c 3e63a9a8359411c6
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 8000000000000000   d8ea8f824e58974a 3d23b4c3e1fbee5b c6546469d088fcbd a72cba22c3abf1ec
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000   0000000000000000 0000000000000000 0000000000000000 8000000000000000   84e993586057fd3d 5b26f2142a47213b 95bec6cb2ae889ac ea3895b9b7c8a3f8
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000   0000000000000000 0000000000000000 0000000000000000 8000000000000000   9a089a5f75db3ff3 3d97d5241f6b069e bb731d24954f2716 91213cc1c1f7e527
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff   0000000000000000 0000000000000000 0000000000000000 8000000000000000   cd2eb1d24a7de2c8 a3b1f18a27af4225 5f9a54357f4af40c bb8e26b5a9efb033
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000   0000000000000000 0000000000000000 0000000000000000 8000000000000000   616e99086444a4c3 bd6973f3a79afaa1 c98be82cfb397c4e 01fc06bb62fc3f33
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89   0000000000000000 0000000000000000 0000000000000000 8000000000000000   763ab713c2a06541 ac19a24b93f5678b 95117e99d0a8b3a9 9d41e61fc315bfe9
+threefry4x32 13 00000001 00000000 00000000 00000000   00000001 00000000 00000000 00000000   bb9799a3 99c96b85 147cb42b 41c4d9f0
+threefry4x32 13 00000000 00000001 00000000 00000000   00000001 00000000 00000000 00000000   07d71da4 d1a2b380 4b1c0744 07071fa3
+threefry4x32 13 00000000 00000000 00000001 00000000   00000001 00000000 00000000 00000000   6f325910 eb4baef9 63dc79fd 9fb4289a
+threefry4x32 13 00000000 00000000 00000000 00000001   00000001 00000000 00000000 00000000   c06c8569 41f8c075 0d9ac8fc ca4cb183
+threefry4x32 13 00000000 ffffffff 00000000 00000000   00000001 00000000 00000000 00000000   46dfc573 32ec2cd4 970d926b 4741150b
+threefry4x32 13 00000000 80000000 00000000 00000000   00000001 00000000 00000000 00000000   3cfb67ac 563ebf09 9e64b7fe a17a6edd
+threefry4x32 13 00000000 00000000 ffffffff 00000000   00000001 00000000 00000000 00000000   6fdcaa29 85eb97b0 641658b6 637597f8
+threefry4x32 13 00000000 00000000 80000000 00000000   00000001 00000000 00000000 00000000   6921a1bd edb37289 2a96f041 feee8d3d
+threefry4x32 13 00000000 00000000 00000000 ffffffff   00000001 00000000 00000000 00000000   46996f57 e449bcc1 8eecf7e2 8c9476b6
+threefry4x32 13 00000000 00000000 00000000 80000000   00000001 00000000 00000000 00000000   64c583dd 541b87f2 a1a74ed0 be222e82
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344   00000001 00000000 00000000 00000000   2dd111e3 4bcd84f6 a7bedab5 cfaccded
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89   00000001 00000000 00000000 00000000   91ad0543 8796f2e3 1f7dea71 5954cf16
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c   00000001 00000000 00000000 00000000   8b838910 ec61f53d 9159be96 00a91b1a
+threefry4x32 13 00000001 00000000 00000000 00000000   00000000 00000001 00000000 00000000   db476b8b 64ca080f 8164731a df2ad744
+threefry4x32 13 00000000 00000001 00000000 00000000   00000000 00000001 00000000 00000000   f2ec5347 87e3be56 ed0d2f4f c549203a
+threefry4x32 13 00000000 00000000 00000001 00000000   00000000 00000001 00000000 00000000   a105cb4d 540fca6f 1912780c 021445c5
+threefry4x32 13 00000000 00000000 00000000 00000001   00000000 00000001 00000000 00000000   d1711880 a6fdb528 57b11ea0 8ee9b71a
+threefry4x32 13 00000000 ffffffff 00000000 00000000   00000000 00000001 00000000 00000000   4d25c9d8 35411722 876597d3 a77c6b82
+threefry4x32 13 00000000 80000000 00000000 00000000   00000000 00000001 00000000 00000000   63cd2323 f5e6e7ec 4c97c974 75e7869f
+threefry4x32 13 00000000 00000000 ffffffff 00000000   00000000 00000001 00000000 00000000   eb05fac0 16e56be7 f2de2606 fda2302b
+threefry4x32 13 00000000 00000000 80000000 00000000   00000000 00000001 00000000 00000000   7513c86c ae260696 bcb5037b 83374447
+threefry4x32 13 00000000 00000000 00000000 ffffffff   00000000 00000001 00000000 00000000   a51b3ee6 b7ae14a5 a62dbd0f 1cd66929
+threefry4x32 13 00000000 00000000 00000000 80000000   00000000 00000001 00000000 00000000   24989ca3 581db664 f62bd4c4 4d4bf09f
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344   00000000 00000001 00000000 00000000   6fb81745 d27ca3e0 ceb229f5 a9ea334b
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89   00000000 00000001 00000000 00000000   a869236e 14bd4ece 83fd7d8a d40cf21c
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c   00000000 00000001 00000000 00000000   c34f3a0e 43b2e4d7 934173c0 f3cdf64a
+threefry4x32 13 00000001 00000000 00000000 00000000   00000000 00000000 00000001 00000000   babf5878 38c2494e 3019c043 1e0b2b9b
+threefry4x32 13 00000000 00000001 00000000 00000000   00000000 00000000 00000001 00000000   5d800e70 7ac570e8 97c4694a d8a3180a
+threefry4x32 13 00000000 00000000 00000001 00000000   00000000 00000000 00000001 00000000   e8c65d99 7c5ca426 0a86c445 7d4d3a21
+threefry4x32 13 00000000 00000000 00000000 00000001   00000000 00000000 00000001 00000000   26d36381 19af15e5 a54676bc 4af5d5eb
+threefry4x32 13 00000000 ffffffff 00000000 00000000   00000000 00000000 00000001 00000000   5a87e689 783f1462 3cedd1ae 2ea11e0a
+threefry4x32 13 00000000 80000000 00000000 00000000   00000000 00000000 00000001 00000000   92ceb56e 1d319cd1 a2b34995 e723ef97
+threefry4x32 13 00000000 00000000 ffffffff 00000000   00000000 00000000 00000001 00000000   f0ba66a4 04f0fd34 f5a697dd aa00c84a
+threefry4x32 13 00000000 00000000 80000000 00000000   00000000 00000000 00000001 00000000   93366e54 253cda1e a4e1b57b 70d26242
+threefry4x32 13 00000000 00000000 00000000 ffffffff   00000000 00000000 00000001 00000000   d972babe b256e807 670bdbbd 74ab6ecd
+threefry4x32 13 00000000 00000000 00000000 80000000   00000000 00000000 00000001 00000000   a205f99f b02fddb1 0336fd8e f281b7dc
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344   00000000 00000000 00000001 00000000   0527b8fa e9fdb4d9 08177632 a4c34938
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89   00000000 00000000 00000001 00000000   28006c21 591fad8a 36cb57c4 04820ec7
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c   00000000 00000000 00000001 00000000   a2538b90 2cbe2c7f 1542fe5f 9772775e
+threefry4x32 13 00000001 00000000 00000000 00000000   00000000 00000000 00000000 00000001   6a51ba3a 33fc7dd8 83ec724b 592255be
+threefry4x32 13 00000000 00000001 00000000 00000000   00000000 00000000 00000000 00000001   3b00082e f3111cc6 67f122b1 a4c02cec
+threefry4x32 13 00000000 00000000 00000001 00000000   00000000 00000000 00000000 00000001   eebb5e2e 5d5a0d75 64526042 bfeb2a2b
+threefry4x32 13 00000000 00000000 00000000 00000001   00000000 00000000 00000000 00000001   cc78dfd4 f03f59d7 24eb369b 7f233bc2
+threefry4x32 13 00000000 ffffffff 00000000 00000000   00000000 00000000 00000000 00000001   8a1de487 dbc78315 02bad926 0d62c434
+threefry4x32 13 00000000 80000000 00000000 00000000   00000000 00000000 00000000 00000001   5b7ec382 20dfb637 5e14485f 4365e731
+threefry4x32 13 00000000 00000000 ffffffff 00000000   00000000 00000000 00000000 00000001   48f54a63 040c8fe7 6f5f60e7 a8e2c422
+threefry4x32 13 00000000 00000000 80000000 00000000   00000000 00000000 00000000 00000001   bfa7d1e0 b2a7a93b a4a0780f 1b11e5e2
+threefry4x32 13 00000000 00000000 00000000 ffffffff   00000000 00000000 00000000 00000001   1d7fbcc4 fcc9efd9 4a40437e cb63413c
+threefry4x32 13 00000000 00000000 00000000 80000000   00000000 00000000 00000000 00000001   730a2e93 0cbfda73 72c9f9fe 936a1a42
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344   00000000 00000000 00000000 00000001   c325dccd 4d0d46a3 a0bf87fd 765514a9
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89   00000000 00000000 00000000 00000001   77eab59a 4aeebf17 5f99bf1a 61de049e
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c   00000000 00000000 00000000 00000001   af627ea8 d88088da c07f790d 4ff5b0ac
+threefry4x32 13 00000001 00000000 00000000 00000000   00000000 ffffffff 00000000 00000000   e0cb88ba 17e181a0 2946aa88 9443cccc
+threefry4x32 13 00000000 00000001 00000000 00000000   00000000 ffffffff 00000000 00000000   b0ea449f 66f501e8 8df43f17 52c4ee1d
+threefry4x32 13 00000000 00000000 00000001 00000000   00000000 ffffffff 00000000 00000000   7889161d 5e28d071 d3f5c7a3 95225ab6
+threefry4x32 13 00000000 00000000 00000000 00000001   00000000 ffffffff 00000000 00000000   880f46d0 28610176 362a2ecb f1a6336b
+threefry4x32 13 00000000 ffffffff 00000000 00000000   00000000 ffffffff 00000000 00000000   d2b3535a d354a28a 36d6521d e0ce90a2
+threefry4x32 13 00000000 80000000 00000000 00000000   00000000 ffffffff 00000000 00000000   5f8f5010 72df59a8 f6979560 6abef914
+threefry4x32 13 00000000 00000000 ffffffff 00000000   00000000 ffffffff 00000000 00000000   835394ae 63d0fa88 4f429ab5 e9b5607a
+threefry4x32 13 00000000 00000000 80000000 00000000   00000000 ffffffff 00000000 00000000   d551fb5f 37913678 4ac2778a befd7153
+threefry4x32 13 00000000 00000000 00000000 ffffffff   00000000 ffffffff 00000000 00000000   497e8b34 d89d8baf 1de18810 674236b2
+threefry4x32 13 00000000 00000000 00000000 80000000   00000000 ffffffff 00000000 00000000   7f592187 57aec906 15d8b63e 6702a7f9
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344   00000000 ffffffff 00000000 00000000   93492d6c b08d1b13 356c8f17 49014dbb
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89   00000000 ffffffff 00000000 00000000   2aba9b17 b0f1815b 5f138050 2e88678e
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c   00000000 ffffffff 00000000 00000000   b0afc429 9054cef2 63f61b5b d2607a3e
+threefry4x32 13 00000001 00000000 00000000 00000000   00000000 80000000 00000000 00000000   b5a298c5 98544b8f 0b290c3b 4fc4fdf3
+threefry4x32 13 00000000 00000001 00000000 00000000   00000000 80000000 00000000 00000000   e2041951 46bb6763 5a36b34f 1f66efaf
+threefry4x32 13 00000000 00000000 00000001 00000000   00000000 80000000 00000000 00000000   89aa48a3 c778ebf3 60c3ac82 dedaed40
+threefry4x32 13 00000000 00000000 00000000 00000001   00000000 80000000 00000000 00000000   1eacd90b c3f0b4e6 23e423ce aafd4b43
+threefry4x32 13 00000000 ffffffff 00000000 00000000   00000000 80000000 00000000 00000000   8a638e3b c227769d bae62226 12630b0f
+threefry4x32 13 00000000 80000000 00000000 00000000   00000000 80000000 00000000 00000000   97724835 82597cc0 49882f15 7c12d92f
+threefry4x32 13 00000000 00000000 ffffffff 00000000   00000000 80000000 00000000 00000000   591bf94a 59fa8964 5dc10c15 dea6b756
+threefry4x32 13 00000000 00000000 80000000 00000000   00000000 80000000 00000000 00000000   541b74ab 1aa9ef7a 59220844 15fa0d90
+threefry4x32 13 00000000 00000000 00000000 ffffffff   00000000 80000000 00000000 00000000   385c7d29 c23b3a6c 0fca8dd0 3f4f3e91
+threefry4x32 13 00000000 00000000 00000000 80000000   00000000 80000000 00000000 00000000   e538346b 44592384 21c220bd 940f1fbb
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344   00000000 80000000 00000000 00000000   6a8dccf0 e3103390 ec3122e0 1b0dc865
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89   00000000 80000000 00000000 00000000   10259fc5 4a51eb0e ed50befc 8c10418c
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c   00000000 80000000 00000000 00000000   4f20b506 d03e080e 5dd8990c e3fafd81
+threefry4x32 13 00000001 00000000 00000000 00000000   00000000 00000000 ffffffff 00000000   20c66986 ce82602a b34b9348 de9cc423
+threefry4x32 13 00000000 00000001 00000000 00000000   00000000 00000000 ffffffff 00000000   0a8f0c1d 82fce677 27c1ac16 57988493
+threefry4x32 13 00000000 00000000 00000001 00000000   00000000 00000000 ffffffff 00000000   7bfcc4a1 45a65bf9 f5aeacd1 a2947299
+threefry4x32 13 00000000 00000000 00000000 00000001   00000000 00000000 ffffffff 00000000   90875e0b 82506f17 b531b1b2 7d2d028c
+threefry4x32 13 00000000 ffffffff 00000000 00000000   00000000 00000000 ffffffff 00000000   18545949 69305ed4 4b3da352 0f8dd522
+threefry4x32 13 00000000 80000000 00000000 00000000   00000000 00000000 ffffffff 00000000   b4d7bb50 ac6f5eba 5d97c45e de2d6956
+threefry4x32 13 00000000 00000000 ffffffff 00000000   00000000 00000000 ffffffff 00000000   617273a9 211ecb6a f327e136 bdd5dacb
+threefry4x32 13 00000000 00000000 80000000 00000000   00000000 00000000 ffffffff 00000000   7a3467b0 f8a27a09 b120bc81 8a9557f5
+threefry4x32 13 00000000 00000000 00000000 ffffffff   00000000 00000000 ffffffff 00000000   6de0b215 7d98a8f1 58cb248f 4f666c7e
+threefry4x32 13 00000000 00000000 00000000 80000000   00000000 00000000 ffffffff 00000000   244e2551 7ab76c56 0cb96ec5 fcabd419
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344   00000000 00000000 ffffffff 00000000   934afaf9 56a7c139 6962f013 84ec70a1
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89   00000000 00000000 ffffffff 00000000   c6a6cd92 d83ee260 8b666f81 94a02e20
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c   00000000 00000000 ffffffff 00000000   638f713e e708f8e2 fff2eb86 31ec2455
+threefry4x32 13 00000001 00000000 00000000 00000000   00000000 00000000 80000000 00000000   c0163b54 8f252db7 c28d798a 6613f48f
+threefry4x32 13 00000000 00000001 00000000 00000000   00000000 00000000 80000000 00000000   ce187c27 a948119f 07227a1b 0c6ead40
+threefry4x32 13 00000000 00000000 00000001 00000000   00000000 00000000 80000000 00000000   5d64e652 a3f06629 387cb0a2 431cbfee
+threefry4x32 13 00000000 00000000 00000000 00000001   00000000 00000000 80000000 00000000   32ec886e fe5884e3 a4a72770 4e126562
+threefry4x32 13 00000000 ffffffff 00000000 00000000   00000000 00000000 80000000 00000000   a4ae85df c1d2f99a 5fe4d68c 9e3f0931
+threefry4x32 13 00000000 80000000 00000000 00000000   00000000 00000000 80000000 00000000   3f93aa6d bfaec1b9 456c1592 d2fb4742
+threefry4x32 13 00000000 00000000 ffffffff 00000000   00000000 00000000 80000000 00000000   6a664c79 50161d2e 4b55d3fa 9137506d
+threefry4x32 13 00000000 00000000 80000000 00000000   00000000 00000000 80000000 00000000   f2192d18 d6e93dc7 f0faded8 1413e98a
+threefry4x32 13 00000000 00000000 00000000 ffffffff   00000000 00000000 80000000 00000000   a4efc3b8 ddfc1a8b 47fa89d3 e28a2d7c
+threefry4x32 13 00000000 00000000 00000000 80000000   00000000 00000000 80000000 00000000   a6307085 fd39c3dd 440c18b7 7338e5a3
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344   00000000 00000000 80000000 00000000   50bccbed 79ddec0d 53d7163d 584f8670
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89   00000000 00000000 80000000 00000000   d3b55c83 6e7b6f42 fb6a086e f8d484c3
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c   00000000 00000000 80000000 00000000   ea8172a9 0f986a3b b392993f 370b8468
+threefry4x32 13 00000001 00000000 00000000 00000000   00000000 00000000 00000000 ffffffff   859aa72f 6bb65ad2 1af7d19a 07b3dfba
+threefry4x32 13 00000000 00000001 00000000 00000000   00000000 00000000 00000000 ffffffff   3b681644 1118ab22 cd72ea4e d032523b
+threefry4x32 13 00000000 00000000 00000001 00000000   00000000 00000000 00000000 ffffffff   f7b84f1b 4df726ca c2f490f4 a1c7081a
+threefry4x32 13 00000000 00000000 00000000 00000001   00000000 00000000 00000000 ffffffff   ad9946e8 09c1c011 e4bb5cbe a8384ba3
+threefry4x32 13 00000000 ffffffff 00000000 00000000   00000000 00000000 00000000 ffffffff   130ffb6d 587e8e0d 265ad6e6 51acdfb1
+threefry4x32 13 00000000 80000000 00000000 00000000   00000000 00000000 00000000 ffffffff   6f3d6d3b 9e1ceb3c 5de98f47 5dcee187
+threefry4x32 13 00000000 00000000 ffffffff 00000000   00000000 00000000 00000000 ffffffff   eeb5e084 76c64fbd aa92e022 bf4c9c68
+threefry4x32 13 00000000 00000000 80000000 00000000   00000000 00000000 00000000 ffffffff   b2b71f54 101817ca 88b01673 6c67712d
+threefry4x32 13 00000000 00000000 00000000 ffffffff   00000000 00000000 00000000 ffffffff   1f5a4754 643e6831 b3c094be d28a2a24
+threefry4x32 13 00000000 00000000 00000000 80000000   00000000 00000000 00000000 ffffffff   549a5412 89bdc102 614c9193 a6d813f7
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344   00000000 00000000 00000000 ffffffff   ffe3fd54 21a20d59 03cf8258 84ac4999
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89   00000000 00000000 00000000 ffffffff   b79cd0cf b515fcc0 a1674946 a1187117
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c   00000000 00000000 00000000 ffffffff   b6305e69 b3ccd613 a3266147 4312ec73
+threefry4x32 13 00000001 00000000 00000000 00000000   00000000 00000000 00000000 80000000   7d67e519 55549296 2eb13bfd 81823f68
+threefry4x32 13 00000000 00000001 00000000 00000000   00000000 00000000 00000000 80000000   66dba48c a5eee0bb 18d1599f 1eba839e
+threefry4x32 13 00000000 00000000 00000001 00000000   00000000 00000000 00000000 80000000   d71d63bb 3351afa8 b24560e1 b6355e77
+threefry4x32 13 00000000 00000000 00000000 00000001   00000000 00000000 00000000 80000000   d4f42034 cc3975c3 c9ecc935 658abb6e
+threefry4x32 13 00000000 ffffffff 00000000 00000000   00000000 00000000 00000000 80000000   f9f9b176 5d8314e0 9685ff9a e8dcf31f
+threefry4x32 13 00000000 80000000 00000000 00000000   00000000 00000000 00000000 80000000   75151c94 5f1bb005 f9174036 95460872
+threefry4x32 13 00000000 00000000 ffffffff 00000000   00000000 00000000 00000000 80000000   007d59b5 37178598 35fbd0dc d54535cd
+threefry4x32 13 00000000 00000000 80000000 00000000   00000000 00000000 00000000 80000000   b5f32f71 a670ff75 2bd1eb0c 74138877
+threefry4x32 13 00000000 00000000 00000000 ffffffff   00000000 00000000 00000000 80000000   19319fd2 97eb8752 7c7c5657 a95bcf65
+threefry4x32 13 00000000 00000000 00000000 80000000   00000000 00000000 00000000 80000000   5e75035a 33bf62ee eaf8c0b2 c7461234
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344   00000000 00000000 00000000 80000000   91894181 9b4a5a5a 5436d9a4 464b4f16
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89   00000000 00000000 00000000 80000000   12a30ea8 5998d88f 7efddb98 18855380
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c   00000000 00000000 00000000 80000000   b9ea931a eaa9ebc0 23814855 1ed78d0e
+threefry4x32 20 00000001 00000000 00000000 00000000   00000001 00000000 00000000 00000000   7abf626d 1ab006a8 df122d54 f32aad64
+threefry4x32 20 00000000 00000001 00000000 00000000   00000001 00000000 00000000 00000000   9ca4c2d0 52b79a44 746ff6b9 d2bc40a8
+threefry4x32 20 00000000 00000000 00000001 00000000   00000001 00000000 00000000 00000000   1660946a 5c6cb533 bce451d6 6a8ea7d1
+threefry4x32 20 00000000 00000000 00000000 00000001   00000001 00000000 00000000 00000000   aee9b8af d3974b35 08430dd8 c0144975
+threefry4x32 20 00000000 ffffffff 00000000 00000000   00000001 00000000 00000000 00000000   1d70ba8d 10b08201 d648f656 53725b82
+threefry4x32 20 00000000 80000000 00000000 00000000   00000001 00000000 00000000 00000000   da93366f 0c3172ae e540e7d3 4394643e
+threefry4x32 20 00000000 00000000 ffffffff 00000000   00000001 00000000 00000000 00000000   d63def2f 21dd1e3c f1f869aa 45651495
+threefry4x32 20 00000000 00000000 80000000 00000000   00000001 00000000 00000000 00000000   76d830a5 5626c957 ad7bab47 bce56186
+threefry4x32 20 00000000 00000000 00000000 ffffffff   00000001 00000000 00000000 00000000   929d0fdb 313aba54 6ddae3a7 458ac900
+threefry4x32 20 00000000 00000000 00000000 80000000   00000001 00000000 00000000 00000000   8a33982c 3e714678 8e459239 e69e7871
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344   00000001 00000000 00000000 00000000   7771a0cb 14b9d81f 7f6fafa4 1ef38878
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89   00000001 00000000 00000000 00000000   d2475970 69b39f1c 76a0e58d 6cbc7b00
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c   00000001 00000000 00000000 00000000   44e9188c f22b4558 abe99791 d7050ba1
+threefry4x32 20 00000001 00000000 00000000 00000000   00000000 00000001 00000000 00000000   cd5ca55b 0f511ce1 d034d9d4 4de57515
+threefry4x32 20 00000000 00000001 00000000 00000000   00000000 00000001 00000000 00000000   719ed999 5ee45a0a 98bf92f7 313eb33d
+threefry4x32 20 00000000 00000000 00000001 00000000   00000000 00000001 00000000 00000000   e3b5105e 17ff842b e76c7b45 9c8ec5eb
+threefry4x32 20 00000000 00000000 00000000 00000001   00000000 00000001 00000000 00000000   dbd1f89d 2d266865 223e2436 20da6b99
+threefry4x32 20 00000000 ffffffff 00000000 00000000   00000000 00000001 00000000 00000000   9bd6735a 912dd856 31e700d3 e846fe74
+threefry4x32 20 00000000 80000000 00000000 00000000   00000000 00000001 00000000 00000000   e999d1ec de625a88 2b62184a 7e757487
+threefry4x32 20 00000000 00000000 ffffffff 00000000   00000000 00000001 00000000 00000000   bbef6b52 46ec2e38 fb1ce33a 6f4d08a1
+threefry4x32 20 00000000 00000000 80000000 00000000   00000000 00000001 00000000 00000000   77de5928 2fd26df7 7c138b05 ec40d875
+threefry4x32 20 00000000 00000000 00000000 ffffffff   00000000 00000001 00000000 00000000   68b00fd7 28226ece 30717554 3caad6d9
+threefry4x32 20 00000000 00000000 00000000 80000000   00000000 00000001 00000000 00000000   7f1febcc b36e7136 8dc0b136 e7e907f9
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344   00000000 00000001 00000000 00000000   da6b34b7 6f1f3431 a29d7413 a1ee6b27
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89   00000000 00000001 00000000 00000000   a6b1f881 9dea4786 80989c4c 4d60c817
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c   00000000 00000001 00000000 00000000   48d517ee 57fe23cf 236383d0 f68f54ca
+threefry4x32 20 00000001 00000000 00000000 00000000   00000000 00000000 00000001 00000000   877ec138 5d60ec84 cf496d33 00810905
+threefry4x32 20 00000000 00000001 00000000 00000000   00000000 00000000 00000001 00000000   a32388e9 bb55a8c3 4b6bb74c 2f4db0e7
+threefry4x32 20 00000000 00000000 00000001 00000000   00000000 00000000 00000001 00000000   b36c626f f78b6390 618f2b73 d8f60c3b
+threefry4x32 20 00000000 00000000 00000000 00000001   00000000 00000000 00000001 00000000   d7ed773c 499f3a68 458782e4 d9587c59
+threefry4x32 20 00000000 ffffffff 00000000 00000000   00000000 00000000 00000001 00000000   c03ca044 8b53660e 4da73b98 cf3f5e8b
+threefry4x32 20 00000000 80000000 00000000 00000000   00000000 00000000 00000001 00000000   23d5f689 304886c9 c4dc0f19 04d89ded
+threefry4x32 20 00000000 00000000 ffffffff 00000000   00000000 00000000 00000001 00000000   47efa3ce fa438a0c 7e505603 bf41e2b5
+threefry4x32 20 00000000 00000000 80000000 00000000   00000000 00000000 00000001 00000000   b1fb5a5a 322e31ee bc46eaad 264c7a0a
+threefry4x32 20 00000000 00000000 00000000 ffffffff   00000000 00000000 00000001 00000000   2be25bd7 3ecff089 d667e103 0cc98f4b
+threefry4x32 20 00000000 00000000 00000000 80000000   00000000 00000000 00000001 00000000   dcc09281 25e8fc15 99b73154 8ecb92f4
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344   00000000 00000000 00000001 00000000   354060d0 2a7af67b fe20d404 7e3851b5
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89   00000000 00000000 00000001 00000000   f59114e5 924f6c4c 6e46f9f3 4148c3a4
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c   00000000 00000000 00000001 00000000   59ad2ff1 aaf66838 58f96539 41ac71f6
+threefry4x32 20 00000001 00000000 00000000 00000000   00000000 00000000 00000000 00000001   f9980dbb 6fb50a56 61316640 c5fbc269
+threefry4x32 20 00000000 00000001 00000000 00000000   00000000 00000000 00000000 00000001   29e66b28 0b31a602 813b6463 672b996c
+threefry4x32 20 00000000 00000000 00000001 00000000   00000000 00000000 00000000 00000001   97a75cdf 3e163e27 f762605f 24f1cf0d
+threefry4x32 20 00000000 00000000 00000000 00000001   00000000 00000000 00000000 00000001   11128c97 7cfedcf4 21ac3aeb c57f95a0
+threefry4x32 20 00000000 ffffffff 00000000 00000000   00000000 00000000 00000000 00000001   8871d08b 50a56a70 cf8b5fb1 41af799a
+threefry4x32 20 00000000 80000000 00000000 00000000   00000000 00000000 00000000 00000001   20d1b6dc 2ea43da2 d1d3ce8c e3a2ba78
+threefry4x32 20 00000000 00000000 ffffffff 00000000   00000000 00000000 00000000 00000001   84ce4cc5 9173f458 8f93d413 17f1917e
+threefry4x32 20 00000000 00000000 80000000 00000000   00000000 00000000 00000000 00000001   4f459d2a d6396b52 227fcfff 364fb84b
+threefry4x32 20 00000000 00000000 00000000 ffffffff   00000000 00000000 00000000 00000001   818780ad 84a418bb 89298bb2 6e029f7c
+threefry4x32 20 00000000 00000000 00000000 80000000   00000000 00000000 00000000 00000001   2f38ef82 fddbbda1 b835f37e ceca1194
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344   00000000 00000000 00000000 00000001   ca5c1d73 966f4bb6 c39a67b5 700ef44f
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89   00000000 00000000 00000000 00000001   b2be8a87 e80084dd 567e7c32 b2b567d1
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c   00000000 00000000 00000000 00000001   f9465abf 41dcb1e5 c3dd2934 60cefe14
+threefry4x32 20 00000001 00000000 00000000 00000000   00000000 ffffffff 00000000 00000000   f938ae0b 280a1a60 22588ce3 d2ad79e5
+threefry4x32 20 00000000 00000001 00000000 00000000   00000000 ffffffff 00000000 00000000   f9bb4d06 7bd59688 c26de361 afe0fd6b
+threefry4x32 20 00000000 00000000 00000001 00000000   00000000 ffffffff 00000000 00000000   e23d5d08 38c68a3c ff829bd3 2fc0e91d
+threefry4x32 20 00000000 00000000 00000000 00000001   00000000 ffffffff 00000000 00000000   6decfd6d c52434e1 5aec208d 59501671
+threefry4x32 20 00000000 ffffffff 00000000 00000000   00000000 ffffffff 00000000 00000000   7807880f fb81f5ae 3b8a50f6 b370c421
+threefry4x32 20 00000000 80000000 00000000 00000000   00000000 ffffffff 00000000 00000000   8f6a3d89 508c5cbf 9225f59b 71d1261a
+threefry4x32 20 00000000 00000000 ffffffff 00000000   00000000 ffffffff 00000000 00000000   9724a16b 8b0883c5 1846f2ff d6a10d39
+threefry4x32 20 00000000 00000000 80000000 00000000   00000000 ffffffff 00000000 00000000   54307a6e c60747fb edd0fbc8 0bd6fb57
+threefry4x32 20 00000000 00000000 00000000 ffffffff   00000000 ffffffff 00000000 00000000   05c03d1c 58007f68 ccba4dca 5eb0e23a
+threefry4x32 20 00000000 00000000 00000000 80000000   00000000 ffffffff 00000000 00000000   3b13b3ba 5e085212 d13c41d5 e856459b
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344   00000000 ffffffff 00000000 00000000   33e6452a 35fc8e87 a16f03ef 68e38cf7
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89   00000000 ffffffff 00000000 00000000   d348602b 00d485ba dfa639b3 d60e12cd
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c   00000000 ffffffff 00000000 00000000   02e4dfb4 8142a511 495c5c31 7ae0da50
+threefry4x32 20 00000001 00000000 00000000 00000000   00000000 80000000 00000000 00000000   d37eb236 2ddad9c3 61528ff7 b8ec5256
+threefry4x32 20 00000000 00000001 00000000 00000000   00000000 80000000 00000000 00000000   03ad393e bbc1bf89 dd6e098c 56a3302c
+threefry4x32 20 00000000 00000000 00000001 00000000   00000000 80000000 00000000 00000000   fc5b6ff0 879c918b d6e46000 fb47ab60
+threefry4x32 20 00000000 00000000 00000000 00000001   00000000 80000000 00000000 00000000   17b8b414 0aa2716b a6925cee 44b8be19
+threefry4x32 20 00000000 ffffffff 00000000 00000000   00000000 80000000 00000000 00000000   eec59a8b fd034061 6c249c4f 5271c003
+threefry4x32 20 00000000 80000000 00000000 00000000   00000000 80000000 00000000 00000000   0659aef3 347f8aa1 664a8892 e4183f59
+threefry4x32 20 00000000 00000000 ffffffff 00000000   00000000 80000000 00000000 00000000   0b0366fb 6d6e8025 da9b8e96 000fa93a
+threefry4x32 20 00000000 00000000 80000000 00000000   00000000 80000000 00000000 00000000   1415a6d4 44b1df75 e690b46c aff8c717
+threefry4x32 20 00000000 00000000 00000000 ffffffff   00000000 80000000 00000000 00000000   a7515669 034355b9 527c44b0 cf71b104
+threefry4x32 20 00000000 00000000 00000000 80000000   00000000 80000000 00000000 00000000   8c502590 9ce36ae7 45875b1c fde5ff97
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344   00000000 80000000 00000000 00000000   d056e169 da3c6dab 31b3ed9f 70c8b685
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89   00000000 80000000 00000000 00000000   941eac5f f50a12c3 bed601ff 6024a402
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c   00000000 80000000 00000000 00000000   67139da8 71e6f247 a90ff128 3fe6ccf0
+threefry4x32 20 00000001 00000000 00000000 00000000   00000000 00000000 ffffffff 00000000   b26e46d7 d58dcbea 44489127 2865ac93
+threefry4x32 20 00000000 00000001 00000000 00000000   00000000 00000000 ffffffff 00000000   14ee5b14 66aba2e0 6bd68aae f984f705
+threefry4x32 20 00000000 00000000 00000001 00000000   00000000 00000000 ffffffff 00000000   f49e7e65 dedd4390 4b104723 618625fc
+threefry4x32 20 00000000 00000000 00000000 00000001   00000000 00000000 ffffffff 00000000   577246b9 6d087fea 64b6d323 8e4fa21e
+threefry4x32 20 00000000 ffffffff 00000000 00000000   00000000 00000000 ffffffff 00000000   0c9b68b4 16289051 7b6b1ac6 23e3d806
+threefry4x32 20 00000000 80000000 00000000 00000000   00000000 00000000 ffffffff 00000000   f4c74238 f457f99a 7b7a0621 1d791994
+threefry4x32 20 00000000 00000000 ffffffff 00000000   00000000 00000000 ffffffff 00000000   79a8f615 4c1fb115 2439febc 91ec3ef7
+threefry4x32 20 00000000 00000000 80000000 00000000   00000000 00000000 ffffffff 00000000   505396e0 2aeac4e0 5aef015d a129a598
+threefry4x32 20 00000000 00000000 00000000 ffffffff   00000000 00000000 ffffffff 00000000   82832f91 e2733136 9677e3ff 96b94781
+threefry4x32 20 00000000 00000000 00000000 80000000   00000000 00000000 ffffffff 00000000   3037f522 33b7280b ff7f8973 d6131090
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344   00000000 00000000 ffffffff 00000000   d385ce86 2bc39e5a 4ade2764 ba39188a
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89   00000000 00000000 ffffffff 00000000   fa7c55f8 0ccf6a95 6828c88c b3b7edc8
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c   00000000 00000000 ffffffff 00000000   b0e93230 2a11fb81 75be814c e0be3860
+threefry4x32 20 00000001 00000000 00000000 00000000   00000000 00000000 80000000 00000000   3c62aa08 d99bfc63 72d34e76 781ae48c
+threefry4x32 20 00000000 00000001 00000000 00000000   00000000 00000000 80000000 00000000   f88da646 bc58451d dfb5c3f1 eb596c4c
+threefry4x32 20 00000000 00000000 00000001 00000000   00000000 00000000 80000000 00000000   8b6e05be 4455517d 416026d6 548b3e5d
+threefry4x32 20 00000000 00000000 00000000 00000001   00000000 00000000 80000000 00000000   9f6ab638 70addd3d 105b2dd6 2f87b26d
+threefry4x32 20 00000000 ffffffff 00000000 00000000   00000000 00000000 80000000 00000000   8f11466e 36aae720 31530649 dddbad07
+threefry4x32 20 00000000 80000000 00000000 00000000   00000000 00000000 80000000 00000000   193985e2 c5f3347d f1dc0637 6be021fa
+threefry4x32 20 00000000 00000000 ffffffff 00000000   00000000 00000000 80000000 00000000   5e289a03 80647773 10df1470 e035bce8
+threefry4x32 20 00000000 00000000 80000000 00000000   00000000 00000000 80000000 00000000   c6304224 34d873a7 db3b2b6e 54030b67
+threefry4x32 20 00000000 00000000 00000000 ffffffff   00000000 00000000 80000000 00000000   beaf10ec 8b48cada 668f7b2c e2fd86a7
+threefry4x32 20 00000000 00000000 00000000 80000000   00000000 00000000 80000000 00000000   9fbb252d 2bcb551c cc59a234 156ca0cb
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344   00000000 00000000 80000000 00000000   32d9d5c3 b491382e e679cdb9 e6c96f8e
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89   00000000 00000000 80000000 00000000   e5356b8c e1f3df45 8024b188 d2bf0aab
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c   00000000 00000000 80000000 00000000   6ef2396b ce289257 342f9c90 3aaee904
+threefry4x32 20 00000001 00000000 00000000 00000000   00000000 00000000 00000000 ffffffff   abc8ddc7 dbf5379e 3a809978 82f9096c
+threefry4x32 20 00000000 00000001 00000000 00000000   00000000 00000000 00000000 ffffffff   38b0bb32 c8ced8d8 b63b9968 dbf325b8
+threefry4x32 20 00000000 00000000 00000001 00000000   00000000 00000000 00000000 ffffffff   2086ba88 1cb8f743 07ac211a 965f6b64
+threefry4x32 20 00000000 00000000 00000000 00000001   00000000 00000000 00000000 ffffffff   07c6b1d7 4a66beb5 21c093bf 1081e95f
+threefry4x32 20 00000000 ffffffff 00000000 00000000   00000000 00000000 00000000 ffffffff   ad660005 4e918661 86f9c5ae a244990e
+threefry4x32 20 00000000 80000000 00000000 00000000   00000000 00000000 00000000 ffffffff   9ebee205 166de65d 48b85c4d 71a4a225
+threefry4x32 20 00000000 00000000 ffffffff 00000000   00000000 00000000 00000000 ffffffff   24fa4e0b 6f4a4f1c 3efc6acf 2f0af4b4
+threefry4x32 20 00000000 00000000 80000000 00000000   00000000 00000000 00000000 ffffffff   d781cec1 16e2bca6 959e05cc 2b4dd292
+threefry4x32 20 00000000 00000000 00000000 ffffffff   00000000 00000000 00000000 ffffffff   24aa0e95 a5192356 67a67574 53a84850
+threefry4x32 20 00000000 00000000 00000000 80000000   00000000 00000000 00000000 ffffffff   f2016f23 a78565ae 1880c681 3dd669b8
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344   00000000 00000000 00000000 ffffffff   c533f368 9dc05fec 46387b65 e6df5427
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89   00000000 00000000 00000000 ffffffff   86dbe6b0 ee36ed73 d2003c4c 85b2f032
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c   00000000 00000000 00000000 ffffffff   8f40ddae 6720f14a 1295037e 2b6fe580
+threefry4x32 20 00000001 00000000 00000000 00000000   00000000 00000000 00000000 80000000   a7ab1fa0 a48016dd 199d9549 9c7d6e97
+threefry4x32 20 00000000 00000001 00000000 00000000   00000000 00000000 00000000 80000000   6140be19 0bb69fbf 41262d16 e577b795
+threefry4x32 20 00000000 00000000 00000001 00000000   00000000 00000000 00000000 80000000   f3eeeb6c f70a689d 96074833 8d2913c3
+threefry4x32 20 00000000 00000000 00000000 00000001   00000000 00000000 00000000 80000000   4d3c8d35 eaae92ef 9d504bb9 ebf6a44f
+threefry4x32 20 00000000 ffffffff 00000000 00000000   00000000 00000000 00000000 80000000   a79d4a27 b64d6bc7 dedd5f31 1d036d32
+threefry4x32 20 00000000 80000000 00000000 00000000   00000000 00000000 00000000 80000000   0f7e61c8 551a5639 601396b7 072ed781
+threefry4x32 20 00000000 00000000 ffffffff 00000000   00000000 00000000 00000000 80000000   e44dfcc4 53432a37 1e3b8ac0 4d398038
+threefry4x32 20 00000000 00000000 80000000 00000000   00000000 00000000 00000000 80000000   47688a8d b01f446f c12e5b49 7f858ea4
+threefry4x32 20 00000000 00000000 00000000 ffffffff   00000000 00000000 00000000 80000000   634c27d7 898b3477 05a72e5a e4319af9
+threefry4x32 20 00000000 00000000 00000000 80000000   00000000 00000000 00000000 80000000   d493dd04 d6964a71 f5fec603 399b5e2f
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344   00000000 00000000 00000000 80000000   32c36c0b 33dc130f c0890ca1 b34d5012
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89   00000000 00000000 00000000 80000000   af2f3e6a c77e8257 001209a2 3d78e3ee
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c   00000000 00000000 00000000 80000000   c089a051 b8cbe6c4 70ade481 414be4a8
+#Only aesni test is the FIPS197 test vector
+aesni4x32 10 33221100 77665544 bbaa9988 ffeeddcc 03020100 07060504 0b0a0908 0f0e0d0c d8e0c469 30047b6a 80b7cdd8 5ac5b470
+ars4x32 7 00000001 00000000 00000000 00000000 00000001 00000000 00000000 00000000 3523162b dc14d20c 79184077 72184193
+ars4x32 7 00000100 00000000 00000000 00000000 00000001 00000000 00000000 00000000 6fb6e62d 68b661a4 6f1280f3 22cdb932
+ars4x32 7 00010000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 55b66ba6 0b73dfc4 ca2010ae ad28d97e
+ars4x32 7 01000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 af6cb834 72fab497 290540d3 28a63677
+ars4x32 7 00000000 00000001 00000000 00000000 00000001 00000000 00000000 00000000 f928af71 52594c2a e41e8545 f10cae23
+ars4x32 7 00000000 00000100 00000000 00000000 00000001 00000000 00000000 00000000 f9498100 dc442236 92194dd1 83a093c7
+ars4x32 7 00000000 00010000 00000000 00000000 00000001 00000000 00000000 00000000 f87500fe 1adb2f6b 919d5769 a882d0f0
+ars4x32 7 00000000 01000000 00000000 00000000 00000001 00000000 00000000 00000000 c6e27fb8 5dd75c62 84f2a444 11fd91a4
+ars4x32 7 00000000 00000000 00000001 00000000 00000001 00000000 00000000 00000000 b12ef4b4 748f8bd7 9fb1399d d39547a8
+ars4x32 7 00000000 00000000 00000100 00000000 00000001 00000000 00000000 00000000 80a66748 ba2bdf93 8d5fae68 0edc78d5
+ars4x32 7 00000000 00000000 00010000 00000000 00000001 00000000 00000000 00000000 11fb3330 432514e5 0e1a63d2 c3f4b292
+ars4x32 7 00000000 00000000 01000000 00000000 00000001 00000000 00000000 00000000 a7b5bf1b b295ebeb 544f1fdf 947bb346
+ars4x32 7 00000000 00000000 00000000 00000001 00000001 00000000 00000000 00000000 fa8bab94 ef7e7d49 d67f6d8f b030b353
+ars4x32 7 00000000 00000000 00000000 00000100 00000001 00000000 00000000 00000000 4177e35d b5585986 e16e468b 7b051fe8
+ars4x32 7 00000000 00000000 00000000 00010000 00000001 00000000 00000000 00000000 ef4ae251 c01058d0 91844766 73b965e9
+ars4x32 7 00000000 00000000 00000000 01000000 00000001 00000000 00000000 00000000 789dfd47 2f2f3ed2 8f55eba5 15af98bd
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000001 00000000 00000000 00000000 c2cbebe0 4906b074 99d2a4fe 74204972
+ars4x32 7 00008000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 2845e523 51e91cb7 a79b537e 1a5875f1
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 022013d3 4b413126 5e2da277 774ce804
+ars4x32 7 00800000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 af7088fb f4e42652 2d5d6163 e79832b3
+ars4x32 7 ff000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 81fc8a91 7bff9086 03393910 e8c2f256
+ars4x32 7 80000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 42231b13 ff20707d 5f2376f2 ce8672b7
+ars4x32 7 00000000 000000ff 00000000 00000000 00000001 00000000 00000000 00000000 de5ee9e4 f3f68d60 03aeb145 5ab70d58
+ars4x32 7 00000000 00000080 00000000 00000000 00000001 00000000 00000000 00000000 2815ad0c 34ec29d2 2afb2a63 4d4ded27
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000001 00000000 00000000 00000000 f51e542f cc4cba41 9cd20f31 7b45463a
+ars4x32 7 00000000 00008000 00000000 00000000 00000001 00000000 00000000 00000000 32e737f1 e90ae2d4 c517c727 43dac8c0
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000001 00000000 00000000 00000000 59f476a9 25a68376 12aaa448 4204c7ef
+ars4x32 7 00000000 00800000 00000000 00000000 00000001 00000000 00000000 00000000 109a62da 375da48e e667373f 7d300432
+ars4x32 7 00000000 ff000000 00000000 00000000 00000001 00000000 00000000 00000000 a9e31d93 f36c93a0 9257bd76 53618c92
+ars4x32 7 00000000 80000000 00000000 00000000 00000001 00000000 00000000 00000000 82e49339 8779350e 88dbb182 4b767bc3
+ars4x32 7 00000000 00000000 000000ff 00000000 00000001 00000000 00000000 00000000 1fba16c5 87a56b41 eee975e7 fcd9c427
+ars4x32 7 00000000 00000000 00000080 00000000 00000001 00000000 00000000 00000000 4c4e8cee 26c911ed 82c9c419 7e922f32
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000001 00000000 00000000 00000000 4c6b9e86 8b63621a 0ce69c5a 8e1214a8
+ars4x32 7 00000000 00000000 00008000 00000000 00000001 00000000 00000000 00000000 3345dbf8 a21b6deb 95df8882 2cee5bf6
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000001 00000000 00000000 00000000 a95808a6 9ac50792 4e8f64bb 23481cc2
+ars4x32 7 00000000 00000000 00800000 00000000 00000001 00000000 00000000 00000000 ff154d65 f952e6b8 49fce617 0e5c66b9
+ars4x32 7 00000000 00000000 ff000000 00000000 00000001 00000000 00000000 00000000 7fa55a59 c660b95b 82afe74e 11b90abe
+ars4x32 7 00000000 00000000 80000000 00000000 00000001 00000000 00000000 00000000 8dc1b022 cd9abb84 418a32dc edc93d06
+ars4x32 7 00000000 00000000 00000000 000000ff 00000001 00000000 00000000 00000000 014375b0 28d52a24 7c0dfda2 5fb669eb
+ars4x32 7 00000000 00000000 00000000 00000080 00000001 00000000 00000000 00000000 888951cd b983f2dd 673d28ca 9715cfb2
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000001 00000000 00000000 00000000 407e6c65 cf1aaaaa 00f5e6a5 b842096d
+ars4x32 7 00000000 00000000 00000000 00008000 00000001 00000000 00000000 00000000 3b7ee2df d3bd1c9f c106f806 800057b6
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000001 00000000 00000000 00000000 a72a1c5b 7ddec8b7 58758642 9a3130c2
+ars4x32 7 00000000 00000000 00000000 00800000 00000001 00000000 00000000 00000000 5f9a8a5d ed8fe111 2e184cd9 5ebea31c
+ars4x32 7 00000000 00000000 00000000 ff000000 00000001 00000000 00000000 00000000 de5527e7 7d0b3f49 7dc8235a dc6ed5c9
+ars4x32 7 00000000 00000000 00000000 80000000 00000001 00000000 00000000 00000000 a2154453 e90a0384 0e3816c0 bdb8b8e0
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000001 00000000 00000000 00000000 bb4006c7 33dbc0db 1ea0a1c9 7f9541e3
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000001 00000000 00000000 00000000 36f0672e 0337ce56 45e7cf25 197db869
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000001 00000000 00000000 00000000 bb33ad5e 8825d64e 9f8cbc28 722c7449
+ars4x32 7 00000001 00000000 00000000 00000000 00000100 00000000 00000000 00000000 e2fef76c e69a2546 354f712d cf15f67f
+ars4x32 7 00000100 00000000 00000000 00000000 00000100 00000000 00000000 00000000 34fffcea 8ea015ce eccfaa90 bb401947
+ars4x32 7 00010000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 d727b857 560f384e 4d6f6d00 df267f76
+ars4x32 7 01000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 a9878fc5 dc39724f 37be857f a90a5d68
+ars4x32 7 00000000 00000001 00000000 00000000 00000100 00000000 00000000 00000000 38041b25 540aee93 8a7dea41 8531fc3c
+ars4x32 7 00000000 00000100 00000000 00000000 00000100 00000000 00000000 00000000 ed3b3cd0 039b7fee 59bfaf4c 2bb3ad73
+ars4x32 7 00000000 00010000 00000000 00000000 00000100 00000000 00000000 00000000 6d00d7e3 5d24e1f6 0c0f476a d7a7b45c
+ars4x32 7 00000000 01000000 00000000 00000000 00000100 00000000 00000000 00000000 bac0b2d2 f0bd7fa6 fdb5bbe1 d64347c3
+ars4x32 7 00000000 00000000 00000001 00000000 00000100 00000000 00000000 00000000 e360493c 31d69a9a 820e0bfa dd9a3dce
+ars4x32 7 00000000 00000000 00000100 00000000 00000100 00000000 00000000 00000000 424c05df 59e03d06 8d2b91b9 a8c6c4fd
+ars4x32 7 00000000 00000000 00010000 00000000 00000100 00000000 00000000 00000000 1a0f53d9 bc1548db 245e6e04 d5bdca89
+ars4x32 7 00000000 00000000 01000000 00000000 00000100 00000000 00000000 00000000 d1e06460 1d1230a9 0db6634b ada192f5
+ars4x32 7 00000000 00000000 00000000 00000001 00000100 00000000 00000000 00000000 cadb6f7f 90f2ff0f fd7e194d 0f20d0e1
+ars4x32 7 00000000 00000000 00000000 00000100 00000100 00000000 00000000 00000000 b23f4afe 1d5b5b1e 188fd756 c1211130
+ars4x32 7 00000000 00000000 00000000 00010000 00000100 00000000 00000000 00000000 cbfe49f4 1f7ead50 111d546f 0cfe779e
+ars4x32 7 00000000 00000000 00000000 01000000 00000100 00000000 00000000 00000000 ec6701cf c96ceaa5 c6ac2bea f8d24538
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000100 00000000 00000000 00000000 d2a5788d 2ac03ddb 4694e11b 19a821ff
+ars4x32 7 00008000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 8c1a80e0 c1d9bca3 33bb5502 3a699ee9
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 4fb35bd5 f75ba852 20e4c1ac d89e8e78
+ars4x32 7 00800000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 01de2719 57f13a99 4a865950 83467712
+ars4x32 7 ff000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 eda124b0 86926832 6b07d1ae 6089e29e
+ars4x32 7 80000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 3f7a7507 dcd9ce76 776f338f e0de1d10
+ars4x32 7 00000000 000000ff 00000000 00000000 00000100 00000000 00000000 00000000 0045b783 c8882fd9 589f8c68 f1215797
+ars4x32 7 00000000 00000080 00000000 00000000 00000100 00000000 00000000 00000000 aa75b9e2 b3bcea23 ee080acb 80c007c0
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000100 00000000 00000000 00000000 dec4660c 586d36d3 405af16c e6747c3d
+ars4x32 7 00000000 00008000 00000000 00000000 00000100 00000000 00000000 00000000 ad1bc2ec 4e80db1d 555bb146 0adb8978
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000100 00000000 00000000 00000000 b30955b3 506de1ee 517e0ce9 adcb4423
+ars4x32 7 00000000 00800000 00000000 00000000 00000100 00000000 00000000 00000000 fca5abdc 155e1f1a 1294a02d ac338d14
+ars4x32 7 00000000 ff000000 00000000 00000000 00000100 00000000 00000000 00000000 0f354869 9db19735 c62a061c d781a794
+ars4x32 7 00000000 80000000 00000000 00000000 00000100 00000000 00000000 00000000 6aa0ec2d 52169669 52cc849c b04b4e2e
+ars4x32 7 00000000 00000000 000000ff 00000000 00000100 00000000 00000000 00000000 76a8695f e2657f52 66132680 459fac17
+ars4x32 7 00000000 00000000 00000080 00000000 00000100 00000000 00000000 00000000 65b2c50a f0fa659e 2955f763 dd50b7be
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000100 00000000 00000000 00000000 46e35843 9ed05230 93cb262c 82447770
+ars4x32 7 00000000 00000000 00008000 00000000 00000100 00000000 00000000 00000000 c90129e3 17bbb904 93b73b91 54bd4ecb
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000100 00000000 00000000 00000000 f6b8ea4f 56dc57d8 b1da974c 930f4404
+ars4x32 7 00000000 00000000 00800000 00000000 00000100 00000000 00000000 00000000 62f1a1a9 9f4bfe1e b147e06a 89480f80
+ars4x32 7 00000000 00000000 ff000000 00000000 00000100 00000000 00000000 00000000 8ccf46b7 3c96fa79 dbaddd6e 6d4a8f9f
+ars4x32 7 00000000 00000000 80000000 00000000 00000100 00000000 00000000 00000000 9cfd0a12 dbd449d0 0899f1b0 776734aa
+ars4x32 7 00000000 00000000 00000000 000000ff 00000100 00000000 00000000 00000000 164e2a2e 0687b6b0 28ae5171 cf72b434
+ars4x32 7 00000000 00000000 00000000 00000080 00000100 00000000 00000000 00000000 ba0ff3f7 55904f5a f5654604 39ed84bd
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000100 00000000 00000000 00000000 53066b99 83a4d1ed 454b66bd 46c3db2b
+ars4x32 7 00000000 00000000 00000000 00008000 00000100 00000000 00000000 00000000 d932d01f 523fc11c 649026d7 78555d42
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000100 00000000 00000000 00000000 22692731 a3e84efd a62e8563 7d082ea0
+ars4x32 7 00000000 00000000 00000000 00800000 00000100 00000000 00000000 00000000 cc1faa6e d153f41f e49510b5 7414ee11
+ars4x32 7 00000000 00000000 00000000 ff000000 00000100 00000000 00000000 00000000 f75eee60 cfd19dbb 6b2928db a23eaa4d
+ars4x32 7 00000000 00000000 00000000 80000000 00000100 00000000 00000000 00000000 eb212ad6 d1798ddd 1cb1d3a2 4faa492c
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000100 00000000 00000000 00000000 16f12765 03364a45 2ad9d46e a3e9a74c
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000100 00000000 00000000 00000000 62163ea3 73e12817 e531a348 50c03c1e
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000100 00000000 00000000 00000000 5f2bd4b2 d3e5db14 64a054e9 1a7f038c
+ars4x32 7 00000001 00000000 00000000 00000000 00010000 00000000 00000000 00000000 89946751 a8781167 cec08928 26e12d35
+ars4x32 7 00000100 00000000 00000000 00000000 00010000 00000000 00000000 00000000 e8fcd218 527420d0 5bdf9eb9 88275738
+ars4x32 7 00010000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 e5349df5 2bebd533 051d33a9 79089581
+ars4x32 7 01000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 77745613 fa0843e2 574548a4 4ad71f07
+ars4x32 7 00000000 00000001 00000000 00000000 00010000 00000000 00000000 00000000 759a7b4f e250af00 67feb99b c9bcd5a8
+ars4x32 7 00000000 00000100 00000000 00000000 00010000 00000000 00000000 00000000 f2fa46c5 4bc8e03a 9da5f00b e94f26be
+ars4x32 7 00000000 00010000 00000000 00000000 00010000 00000000 00000000 00000000 b24af7b7 8b39e81b 516497b4 03d45328
+ars4x32 7 00000000 01000000 00000000 00000000 00010000 00000000 00000000 00000000 74518558 34a6b002 6b2295ac 259c675a
+ars4x32 7 00000000 00000000 00000001 00000000 00010000 00000000 00000000 00000000 5a88b52d 6326fe18 c4e87f3e de32b54d
+ars4x32 7 00000000 00000000 00000100 00000000 00010000 00000000 00000000 00000000 88e59a00 51d28a83 f6e4b330 746a5e21
+ars4x32 7 00000000 00000000 00010000 00000000 00010000 00000000 00000000 00000000 1d7a1606 84e4cbbd 1abfa751 44c1af28
+ars4x32 7 00000000 00000000 01000000 00000000 00010000 00000000 00000000 00000000 635b17fa 93d2b246 18dff0d5 44174196
+ars4x32 7 00000000 00000000 00000000 00000001 00010000 00000000 00000000 00000000 9439d321 39b6ed65 f29ad358 5b3ab33b
+ars4x32 7 00000000 00000000 00000000 00000100 00010000 00000000 00000000 00000000 d3b226d0 f17ae0c4 1c08b11d 770fabda
+ars4x32 7 00000000 00000000 00000000 00010000 00010000 00000000 00000000 00000000 510571eb b26a689b ed6354f4 72f4dc67
+ars4x32 7 00000000 00000000 00000000 01000000 00010000 00000000 00000000 00000000 2b6f7eb0 d09fe512 5c4059fa 10b93549
+ars4x32 7 0000ff00 00000000 00000000 00000000 00010000 00000000 00000000 00000000 a01993d5 792f4743 856cc064 b4c1aa0b
+ars4x32 7 00008000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 a9be5bef fb21cd0a e6a36818 7ce9d3cc
+ars4x32 7 00ff0000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 520e92c7 df1e1219 7b1ecbef ae4ecbab
+ars4x32 7 00800000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 78b673a8 4b6699ce 9fbbed20 9e7c251e
+ars4x32 7 ff000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 e62aee2b 70e15362 48919226 6c8b2ea8
+ars4x32 7 80000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 e18e5b03 b73ea66a 17fa2367 9bec1912
+ars4x32 7 00000000 000000ff 00000000 00000000 00010000 00000000 00000000 00000000 d9653b53 8e53c7f2 f7e28d83 f382e091
+ars4x32 7 00000000 00000080 00000000 00000000 00010000 00000000 00000000 00000000 b8ab1362 ca09b231 b6e182e4 0898a049
+ars4x32 7 00000000 0000ff00 00000000 00000000 00010000 00000000 00000000 00000000 9100d155 d1f9195a 65e17e27 25335ad9
+ars4x32 7 00000000 00008000 00000000 00000000 00010000 00000000 00000000 00000000 6fdbdcdd fe852f14 2c7ea5e6 fe6ed6a4
+ars4x32 7 00000000 00ff0000 00000000 00000000 00010000 00000000 00000000 00000000 2e003c15 fc696b20 4fa0d3e8 187a9ad0
+ars4x32 7 00000000 00800000 00000000 00000000 00010000 00000000 00000000 00000000 e6a6230d d621826a ceaff40d dab1fd68
+ars4x32 7 00000000 ff000000 00000000 00000000 00010000 00000000 00000000 00000000 23b972dd 6a41102e 3fefaa9f 787d61d2
+ars4x32 7 00000000 80000000 00000000 00000000 00010000 00000000 00000000 00000000 38217de7 996aec37 c2ac8fc7 6a85fe7d
+ars4x32 7 00000000 00000000 000000ff 00000000 00010000 00000000 00000000 00000000 b9110c72 b89bd9e7 af746395 ad3dab5e
+ars4x32 7 00000000 00000000 00000080 00000000 00010000 00000000 00000000 00000000 7b8e959a f6a29350 dd89bcd6 0b2de298
+ars4x32 7 00000000 00000000 0000ff00 00000000 00010000 00000000 00000000 00000000 61017e12 acf42650 9db18422 a6fead93
+ars4x32 7 00000000 00000000 00008000 00000000 00010000 00000000 00000000 00000000 1c770454 668ef738 76e03c43 2c0be368
+ars4x32 7 00000000 00000000 00ff0000 00000000 00010000 00000000 00000000 00000000 8e3473f6 cab98281 79318e54 7bff427e
+ars4x32 7 00000000 00000000 00800000 00000000 00010000 00000000 00000000 00000000 4f76299a e1d27fee f05ea39e 60eed953
+ars4x32 7 00000000 00000000 ff000000 00000000 00010000 00000000 00000000 00000000 80b8e85c 39987169 5689feb9 f6896150
+ars4x32 7 00000000 00000000 80000000 00000000 00010000 00000000 00000000 00000000 28409dad 503d924f 7a86db93 fa9a1b86
+ars4x32 7 00000000 00000000 00000000 000000ff 00010000 00000000 00000000 00000000 81162d5b 17805524 0f746072 56198ae6
+ars4x32 7 00000000 00000000 00000000 00000080 00010000 00000000 00000000 00000000 b02e2741 d0a55125 833710d0 99095698
+ars4x32 7 00000000 00000000 00000000 0000ff00 00010000 00000000 00000000 00000000 1d1a877f 6248d773 42ff4f8d f3318007
+ars4x32 7 00000000 00000000 00000000 00008000 00010000 00000000 00000000 00000000 953eaa01 345cb173 89b1a43d 2a262484
+ars4x32 7 00000000 00000000 00000000 00ff0000 00010000 00000000 00000000 00000000 2f99217b e3265774 f8c7097d 176838e1
+ars4x32 7 00000000 00000000 00000000 00800000 00010000 00000000 00000000 00000000 7b455b7a 8f44de5b 49b4e489 4efecc1f
+ars4x32 7 00000000 00000000 00000000 ff000000 00010000 00000000 00000000 00000000 89d36bdc 7250509e 154947d6 2b24eee7
+ars4x32 7 00000000 00000000 00000000 80000000 00010000 00000000 00000000 00000000 805902c7 5fe8da24 5596a805 919414a5
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00010000 00000000 00000000 00000000 a1f28e94 d9c2bd6e d1aefdb8 06de12b5
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00010000 00000000 00000000 00000000 0f57450c 94b448ed 3efb8323 d0002896
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00010000 00000000 00000000 00000000 73005580 e1245058 41d4db4c 21861651
+ars4x32 7 00000001 00000000 00000000 00000000 01000000 00000000 00000000 00000000 5c4b4fac 4a902da1 49c67894 81affdbc
+ars4x32 7 00000100 00000000 00000000 00000000 01000000 00000000 00000000 00000000 80dffd64 942af8b4 91ce56d0 a1f0b1d8
+ars4x32 7 00010000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 f64d4d05 4aaf07b4 e42433b4 bb9a2dcd
+ars4x32 7 01000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00d8b708 3a583109 a0b663ce dc387c79
+ars4x32 7 00000000 00000001 00000000 00000000 01000000 00000000 00000000 00000000 bde8b707 b1d0fc98 2a6e75e9 69b13bc8
+ars4x32 7 00000000 00000100 00000000 00000000 01000000 00000000 00000000 00000000 921cd0c0 20641dd8 4077e8a0 4015c4f3
+ars4x32 7 00000000 00010000 00000000 00000000 01000000 00000000 00000000 00000000 1d992c48 19122a0e 29855702 e7fe63e8
+ars4x32 7 00000000 01000000 00000000 00000000 01000000 00000000 00000000 00000000 d3615b62 a10a3fbf e8c529eb 8ee27361
+ars4x32 7 00000000 00000000 00000001 00000000 01000000 00000000 00000000 00000000 0b120f22 3dc6329e 1ddcb426 7a0dbecb
+ars4x32 7 00000000 00000000 00000100 00000000 01000000 00000000 00000000 00000000 22d34172 9bd694bc 16621499 14971a6f
+ars4x32 7 00000000 00000000 00010000 00000000 01000000 00000000 00000000 00000000 f5239b2f 825cef05 6dc375a1 cb8d3678
+ars4x32 7 00000000 00000000 01000000 00000000 01000000 00000000 00000000 00000000 ebfcdf2c e82a8caf f0358985 82d5e001
+ars4x32 7 00000000 00000000 00000000 00000001 01000000 00000000 00000000 00000000 d6184b2f 521d122b 1b58dbde 2ee393f4
+ars4x32 7 00000000 00000000 00000000 00000100 01000000 00000000 00000000 00000000 e270e869 3f150608 7ffc8753 6c417364
+ars4x32 7 00000000 00000000 00000000 00010000 01000000 00000000 00000000 00000000 057cf2ab 4e817a4e a155ce11 e508ff07
+ars4x32 7 00000000 00000000 00000000 01000000 01000000 00000000 00000000 00000000 af6928f4 77a40536 ee3a8087 4b9ed5a1
+ars4x32 7 0000ff00 00000000 00000000 00000000 01000000 00000000 00000000 00000000 65a7b7d5 f7988414 f7753877 44da2732
+ars4x32 7 00008000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 d32b4207 e3ccc6da a74431ce edc0c367
+ars4x32 7 00ff0000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 15cdd5ad b95621a7 9df98e93 7afc642d
+ars4x32 7 00800000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 f79e3600 278a9ff4 25840b72 ddbe0f3a
+ars4x32 7 ff000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 6f3a0542 74b95c62 7079dc80 c403d4fd
+ars4x32 7 80000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 fefe9a3d 77d75f58 07bdbf41 f81a8b77
+ars4x32 7 00000000 000000ff 00000000 00000000 01000000 00000000 00000000 00000000 07af7386 3b4eded0 e11204fe 39a066c6
+ars4x32 7 00000000 00000080 00000000 00000000 01000000 00000000 00000000 00000000 846fda1a c6652537 e644a37a 0d25ac39
+ars4x32 7 00000000 0000ff00 00000000 00000000 01000000 00000000 00000000 00000000 790a495a 8e01d43b 1ba7f6d0 bd42895b
+ars4x32 7 00000000 00008000 00000000 00000000 01000000 00000000 00000000 00000000 fcb0bb8a 81e4607b 0a0b331c 133a6780
+ars4x32 7 00000000 00ff0000 00000000 00000000 01000000 00000000 00000000 00000000 aae2bd69 f2ed7a43 6dafd25c 1fee4b82
+ars4x32 7 00000000 00800000 00000000 00000000 01000000 00000000 00000000 00000000 455f5a2c 876960c9 0e7ca579 08c9afed
+ars4x32 7 00000000 ff000000 00000000 00000000 01000000 00000000 00000000 00000000 59ce76c2 e0a6e62a 3ad76158 ddb9d93e
+ars4x32 7 00000000 80000000 00000000 00000000 01000000 00000000 00000000 00000000 6659a57e 986e656e 3013c3fb 61ebc630
+ars4x32 7 00000000 00000000 000000ff 00000000 01000000 00000000 00000000 00000000 907e763c c6b83a25 ef89a90f 74fdb694
+ars4x32 7 00000000 00000000 00000080 00000000 01000000 00000000 00000000 00000000 fba4b3a6 477cc9c2 bcce80ce b6f101b0
+ars4x32 7 00000000 00000000 0000ff00 00000000 01000000 00000000 00000000 00000000 710adbb1 3b7b935a bfa43ed9 af53d3ee
+ars4x32 7 00000000 00000000 00008000 00000000 01000000 00000000 00000000 00000000 993981f3 10a0761d 18b966d6 db95020b
+ars4x32 7 00000000 00000000 00ff0000 00000000 01000000 00000000 00000000 00000000 23277b85 4775d2a1 389e8a20 6d6e9a32
+ars4x32 7 00000000 00000000 00800000 00000000 01000000 00000000 00000000 00000000 83b8cda3 dddafdcd b241246d f8ef5001
+ars4x32 7 00000000 00000000 ff000000 00000000 01000000 00000000 00000000 00000000 ca3d1252 eb2f2305 882985a7 06dd099b
+ars4x32 7 00000000 00000000 80000000 00000000 01000000 00000000 00000000 00000000 af730151 3ebf4c13 ddb6ac40 a6b9f508
+ars4x32 7 00000000 00000000 00000000 000000ff 01000000 00000000 00000000 00000000 2606cdef e2398e47 1eefffab b8443df5
+ars4x32 7 00000000 00000000 00000000 00000080 01000000 00000000 00000000 00000000 8108c137 2f79064f 9184f6dd 1984b4d2
+ars4x32 7 00000000 00000000 00000000 0000ff00 01000000 00000000 00000000 00000000 dac3d4d8 85e7cf04 22b2b6c0 ca9cdbaa
+ars4x32 7 00000000 00000000 00000000 00008000 01000000 00000000 00000000 00000000 d91f06c5 79dbe78b a6ee5140 f5e3e1d4
+ars4x32 7 00000000 00000000 00000000 00ff0000 01000000 00000000 00000000 00000000 e49c12eb 805810c6 4389010c 438dd318
+ars4x32 7 00000000 00000000 00000000 00800000 01000000 00000000 00000000 00000000 2baf979c 0b234238 7a91dcee 8f2195fe
+ars4x32 7 00000000 00000000 00000000 ff000000 01000000 00000000 00000000 00000000 8c367e4e 9384e1e8 d2d54f83 e24bd666
+ars4x32 7 00000000 00000000 00000000 80000000 01000000 00000000 00000000 00000000 05ec5aed 7b80c18f 6e02ec00 af7d8461
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 01000000 00000000 00000000 00000000 6b62230f a3c81ef5 378ab653 23af48f3
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 01000000 00000000 00000000 00000000 9f28e482 ef3ad602 a7f68742 17bdf9dd
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 01000000 00000000 00000000 00000000 9bcee3c9 47d31087 b3d5d208 281dd93a
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000001 00000000 00000000 b98fa0e7 cdd825ac c4a2942b 188df12b
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000001 00000000 00000000 e56a671d fa738e98 71ee4418 0900944f
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 582501fc e56c7921 d38ed338 c37e5a4e
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 e4e7782f 675942c8 917bcde1 c3739f28
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000001 00000000 00000000 45a75118 f1c9f98e e1cbd902 ffa4f796
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000001 00000000 00000000 8e63d1dc ddc2763e eac3cd9d 8b624caf
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000001 00000000 00000000 31190524 b3ff427a 2418a4ce aadbcaba
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000001 00000000 00000000 0dde1a7a a994604a e66d1ccf ebd37d29
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000001 00000000 00000000 12847b3e 6b2b9d08 38d1e36d cb4e5d1c
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000001 00000000 00000000 88e7ac98 eb941086 f3556cb4 20964290
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000001 00000000 00000000 8febb1a4 bdd9c500 fc798878 1699918b
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000001 00000000 00000000 8c6b4bce 3acc1384 5eb2f546 a70d2ab0
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000001 00000000 00000000 3e6cf754 72ff7900 42b1882e a259b63d
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000001 00000000 00000000 05118b88 d902ce95 87b141fa a95529d9
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000001 00000000 00000000 4ffee2f7 2ff88f16 e4fa93e0 2ba2e908
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000001 00000000 00000000 0d00fbab 394bd1ab 8372d815 57ce07bd
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000001 00000000 00000000 c91da1c3 a89eba39 83c66a3e 7f9ccf3d
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 a9aab7d2 48ab0c11 94120bf6 661ed874
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 90f76c90 a75c8676 d5932a66 29b2ed5d
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 6e287bb4 8fcb509d 3282420a b2f0acce
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 7577b019 481c0dd9 45771637 e47d6c74
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 1caa9a2a 3fd49fee 28a8592f f820b17e
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000001 00000000 00000000 bd9d4712 a1bab707 a658a416 fc2cad21
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000001 00000000 00000000 5db5aef3 4aacb477 e00321e3 03f2f164
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000001 00000000 00000000 86c63b0c 1ae77829 f54fc72b 3e65483e
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000001 00000000 00000000 b8e6a3aa 3870f807 67e6d3c0 3c786c41
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000001 00000000 00000000 60723484 3f6acad0 f3150d04 6fe1cef2
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000001 00000000 00000000 d0875b42 d178529d b07f05ed 1936bc05
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000001 00000000 00000000 58eac67a 702ce62d b491a9e8 ca546c89
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000001 00000000 00000000 a9b8f470 afef5bd3 578b37cf bf2cdc2e
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000001 00000000 00000000 aa38025f e885466b a026d001 3f0376e3
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000001 00000000 00000000 540dff9b 94870d7f 6035a801 1d2461d5
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000001 00000000 00000000 d54a4299 03db719c 03867340 2b8ce970
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000001 00000000 00000000 0cf0355e d424d952 85ce5c9b 89ea9557
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000001 00000000 00000000 fc648dc4 0a8e70d9 37f5dfea faaaf6d4
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000001 00000000 00000000 a89ba05f 64d4f5c6 446076c2 c68f0fee
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000001 00000000 00000000 32ebf3c8 b3b5a1c7 422d6927 6e5c3871
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000001 00000000 00000000 3d6730bb d4af0df0 7af81d69 87ae990c
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000001 00000000 00000000 102e26cc d8ad45ce d4ddaed3 26f5d03a
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000001 00000000 00000000 6ae99574 408d6c8e 5198ef8a 251ce0c0
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000001 00000000 00000000 9865f8d1 0f1a33c4 16a6f032 4501cb27
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000001 00000000 00000000 50c5fd20 0f842254 2573669a 1118408a
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000001 00000000 00000000 9c85b493 34006dfb f29cb2d2 fe3eeb55
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000001 00000000 00000000 31f2f820 a237d610 e79519f0 a3e6773d
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000001 00000000 00000000 9a42597e bc616f75 11873515 0d95b6bf
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000001 00000000 00000000 149e81a7 13397722 e15ef1c9 085060f1
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000001 00000000 00000000 ec49a376 fc9c0e9f 1dc34445 963c9380
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000001 00000000 00000000 2a100713 0631ced0 42f20c78 d81af2e7
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000001 00000000 00000000 706b9c5e 50067d76 d9d4d6fa 4d44ac9c
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000100 00000000 00000000 dfda1d3a 072f4efa a128a5d5 a6fe1d04
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000100 00000000 00000000 aefe63cd a94f6047 ef47ae8a 5c6d0fc7
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 a263fbbb 95aa495c a5937e9e 544bfb02
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 4b5755b9 2ca59014 9403b7ff 5c00c781
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000100 00000000 00000000 62acbd8b ec95ebd4 35e31abf b290cc33
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000100 00000000 00000000 134748e1 b6befa9f 7232fa06 d4764e33
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000100 00000000 00000000 6190f931 ee7ee9d3 6ed0f4d1 16c9b244
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000100 00000000 00000000 c7f11a27 94dba789 e9dbcbc5 14a9abc6
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000100 00000000 00000000 153d00f7 f2129258 20aa50f2 ed9aebae
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000100 00000000 00000000 9f7cebbc 2ec7b89e 66001c4c 83cdbb20
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000100 00000000 00000000 65155935 919e4c9e 5f34f008 b51f7415
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000100 00000000 00000000 be69da4b 58cb9d5e 19d12824 d82c1b08
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000100 00000000 00000000 ac76a8a7 fff592ae 7b84a113 daad3a5b
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000100 00000000 00000000 b278eb5b 63a440b9 623099ad b87237c8
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000100 00000000 00000000 8ab1b9ef 8a631fc5 2dce6925 acaa5c9d
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000100 00000000 00000000 2433ea25 2017b332 91aa1b2a 0e49b4a3
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000100 00000000 00000000 86fd3cb3 f56664c6 e7140277 cf6a9098
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 52efaf03 3b031fa5 eec1ec93 4a377c34
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 7fead7cb 22746d85 d921eb48 e7a70ecd
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 3281b39d 696b18bd 8eda997d d5bb089c
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 adab5d35 ad91fa0d 7acfa6fd 9892d997
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 85ade5e0 2c042865 15890a20 f7c24d33
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000100 00000000 00000000 119163c9 a07d67cd 20f06789 a281ee4d
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000100 00000000 00000000 2fb03510 5ed5dca3 b719eb6f 574605c9
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000100 00000000 00000000 f4f7d2ef 7a524610 a185f709 f21fefd6
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000100 00000000 00000000 c5e7439c 2804792a 1235964f 8539a3c7
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000100 00000000 00000000 5f369f8f 7d9d5302 4f494420 827ed4f2
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000100 00000000 00000000 0775ffd7 3b1dea1e b02efaca b4f9719a
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000100 00000000 00000000 426cd4b8 3a1fc698 c19c4020 723a2986
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000100 00000000 00000000 ed151868 428ac2da 5531458b 00d2447c
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000100 00000000 00000000 fcb4f454 b536ddfa 3a52e482 71f6646e
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000100 00000000 00000000 3997e8de 9b8e8867 6293329b 06827994
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000100 00000000 00000000 f4991404 73e5e16e f5b17c26 9924f7a2
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000100 00000000 00000000 3066aea9 c3fd8937 7994b392 4b2269ac
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000100 00000000 00000000 c06e303d 65230c26 fcc999c3 928bbecd
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000100 00000000 00000000 949c3f78 95a9a17b 353c533c 32f8838a
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000100 00000000 00000000 a037a04d a5d5ef5f 134dce23 1cce86ea
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000100 00000000 00000000 73bcea41 a66fe5a3 e92911a5 d81c85f1
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000100 00000000 00000000 13a8abdc 5c45c562 2850859a 38851cc5
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000100 00000000 00000000 1cf530b3 c20a3ef5 1dd72902 d8f71715
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000100 00000000 00000000 20c4d1e9 6aaea5f9 d31be549 32a09e8e
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000100 00000000 00000000 642cc569 29ad57a4 9e7e4347 6ad323fd
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000100 00000000 00000000 cccb582c a8794b89 9e9ee7b4 f64b2875
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000100 00000000 00000000 75c085fb 289d50f1 78cb52d7 a5492eac
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000100 00000000 00000000 dc83b67b 6ae5216e 0945dd86 bfe74a90
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000100 00000000 00000000 d9b3797d 07d9cede b0d73dd4 a9ab3ba1
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000100 00000000 00000000 dd0b9690 1f87f73e b52e0554 f3a8866f
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000100 00000000 00000000 445a7ccb 1d2bd419 6cb33baa 8de67355
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000100 00000000 00000000 8186605a 2a648389 7fa392d4 a0282353
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00010000 00000000 00000000 cc555e0c 96812f76 c34b8b18 0ab1336f
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00010000 00000000 00000000 d8e396e2 593932fb c6e40d9f 7422c554
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 c3121431 cb1af462 1c6d3dc8 06806508
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 74a52f42 ab71d0a5 2d9ec16f 6a309675
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00010000 00000000 00000000 f8e52867 c5154ebe 3e2412d2 1fd6eb47
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00010000 00000000 00000000 b6d97bb1 6633b0c4 f5b83d5f ef5b7701
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00010000 00000000 00000000 21987c11 f47b221c 1bd108f9 4a89ea4c
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00010000 00000000 00000000 fd5b97cd cddf1906 abe0b7a9 32b6f137
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00010000 00000000 00000000 4651379b c51b8684 b8661b5c eee9c303
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00010000 00000000 00000000 dbe78ab2 23c7dd58 5f85f73b 37ffe920
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00010000 00000000 00000000 78afdc44 98924fa1 cb7ee502 198cf8be
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00010000 00000000 00000000 bb80d75c a4f61d05 371b83b0 f8b925c1
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00010000 00000000 00000000 8ab4b97a e856ed18 6691e448 e9c947b1
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00010000 00000000 00000000 8c0ce175 1f94b2a8 64368529 f8c997d9
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00010000 00000000 00000000 a581635b dcadee87 37d80a10 42e2d6ea
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00010000 00000000 00000000 f6073156 f3c915f5 872d7248 7428bd38
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00010000 00000000 00000000 5c1adf3b 31a5847f 38f35004 ab0c0e56
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 fd51e724 1b511634 abfc1f02 e08d5826
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 221d06a9 b5a1fa43 c87832af 07c56795
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 0d7aa123 b5f4f0e1 10b92a35 4c568a8e
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 dc53383e 738f609d 6bda6aab 5b9015b3
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 1b01b36b 16dc731f 38af0f58 14549502
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00010000 00000000 00000000 aec3f7e9 4513e562 bd0a53a9 a7c19937
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00010000 00000000 00000000 dce01ffb be0890c6 9acbaeda d40fe96e
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00010000 00000000 00000000 4eceae96 81ed9647 555e7dba 1100b881
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00010000 00000000 00000000 c75f6525 f06dd94d 7f24c2bc 51c982e0
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00010000 00000000 00000000 b0729ec8 3c6027b6 d1539c93 035cc3e9
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00010000 00000000 00000000 eaca848d 069cb07a 96bd3060 6d2752e4
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00010000 00000000 00000000 7450b9f7 871a1d9a 211b42e5 02d9e3ce
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00010000 00000000 00000000 a0300cb3 f04fbefe fe6d6fd2 7b1e58b7
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00010000 00000000 00000000 360d9abf 3fb3c8bc d919221d 10f57a6a
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00010000 00000000 00000000 f63c4618 ece252f4 2662a407 84841340
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00010000 00000000 00000000 3e14c92b 4f431782 653d0255 5e48097e
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00010000 00000000 00000000 eb618ea6 d0e27776 6bd5ec9d 72491aab
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00010000 00000000 00000000 7b42d9a7 073a55fe 5cef8388 5d240e4e
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00010000 00000000 00000000 39d1c065 85c0acc7 f0101005 93ec0ee2
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00010000 00000000 00000000 460bd111 4a7e1dcf e6c05f70 62fde911
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00010000 00000000 00000000 5758809e ab8bd50d b1542f44 0b7a51b0
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00010000 00000000 00000000 2398b55f 28407e67 60f625c8 ab267016
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00010000 00000000 00000000 910b861a 9ae4f63b 69c20a02 2d60c3f7
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00010000 00000000 00000000 3fcb21a7 16951149 990475c1 99025226
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00010000 00000000 00000000 d7e919f3 73db70ec 003a8e3b 4c2b67eb
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00010000 00000000 00000000 991f3917 b56c3247 1a5d48ad 01bcbfae
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00010000 00000000 00000000 613efef9 09710d43 50d71c7c 06c2355d
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00010000 00000000 00000000 4313ed8e bd141078 c12d3c6e efa80cf0
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00010000 00000000 00000000 656a64b2 c9e2588a 6a740d6b f6771cfe
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00010000 00000000 00000000 01329c6b b18c5d96 17088447 58573d6b
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00010000 00000000 00000000 475e7f2c df5f29d5 71c921aa e71bf175
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00010000 00000000 00000000 75311c7e 008c90a3 cd72458f 6eb71f5e
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 01000000 00000000 00000000 f1d28f60 cadf4685 f5a23c51 d908aa34
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 01000000 00000000 00000000 01c8c951 22a359fb 3ff357d4 f2efe9fc
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 cbfb74e9 d32346b5 74a9d8e7 78ad3148
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 9ad5ccf9 1e86645e 060e4b44 806d350e
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 01000000 00000000 00000000 af5c32bc 2f4c1d79 42ea3ba8 7f64cf82
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 01000000 00000000 00000000 b5de7ef6 3b368ca4 797907bb 0e290d60
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 01000000 00000000 00000000 63ff88f8 f2fcda03 ed9521eb 0da73a6f
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 01000000 00000000 00000000 af2004e3 6b8c03c1 ce200f44 15272428
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 01000000 00000000 00000000 f76605b2 f5b358bb 7e29f4de 48e9b229
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 01000000 00000000 00000000 ec4a3974 a873f7aa 58833321 6efcbe17
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 01000000 00000000 00000000 56cdee6f 690fabf1 e9d1f12e 477dad74
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 01000000 00000000 00000000 3d45f975 4219eaaa ed5bd00f 4ee3eeda
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 01000000 00000000 00000000 4ce13170 ccdef41e 82346a8c e6b3d412
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 01000000 00000000 00000000 469c7844 ee82a394 a7a3b23c 8cc4db81
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 01000000 00000000 00000000 0ca9b5fe a5673d62 7c83e3f0 95143ac0
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 01000000 00000000 00000000 efcf3d1a df15cb85 41679ec2 473c724a
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 01000000 00000000 00000000 5257892e 0c645c39 ffd595d6 fa3d694e
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 68d8f64a 066631ec f3a9997a a1350d5b
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 ca14c369 47ce2364 9cb2196d af6c47ad
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 849eb7ff c5950be4 f1a61f9e 6001f279
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 cdda7689 01a0fc17 1c8cb79e 663104e6
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 fdc8b354 3974bfb8 9805f0b9 687134ea
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 01000000 00000000 00000000 80ee7029 e70ddbd3 5910cc44 5f4afd16
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 01000000 00000000 00000000 2af567a0 2d2f3cbf 1aa86411 0f64b041
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 01000000 00000000 00000000 1d511c03 26f8fd53 e46cb9ba 770aab45
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 01000000 00000000 00000000 80dc0d67 f54a2826 cbdbd04e 74b4fbc8
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 01000000 00000000 00000000 ef3c100a 92fc4374 40b313d2 125f29b5
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 01000000 00000000 00000000 e2488dc6 f410be92 0e5dea44 c0694d36
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 01000000 00000000 00000000 0a4085bf 797eeeee 6b7a0006 e538592d
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 01000000 00000000 00000000 d63c4b1b d52295d2 87f5a196 d1542c1b
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 01000000 00000000 00000000 4565e62b 2b06ae38 e41196d8 f9a249b7
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 01000000 00000000 00000000 b4f09a88 759568be ce1dfb0c 948834ad
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 01000000 00000000 00000000 da4eb391 01bc628b 38c604a2 07535efe
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 01000000 00000000 00000000 3c4f71c5 54059a07 0d1f9a16 4b1af865
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 01000000 00000000 00000000 3fefd40d c260b532 63363e58 6f98c813
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 01000000 00000000 00000000 7d02082c 5f09d506 18c4f684 352ef5e3
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 01000000 00000000 00000000 bf1187a0 46a976bc bc71e679 4e0e5623
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 01000000 00000000 00000000 ed83edea b6645e3a 16acb791 7d43064f
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 01000000 00000000 00000000 91556a10 1b40759c 95cdff41 52cb618a
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 01000000 00000000 00000000 fb7e7161 4ab7039f 519333e1 78d7a241
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 01000000 00000000 00000000 a2590d06 f8338a72 4705fdd9 9f8db47d
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 01000000 00000000 00000000 c5146907 aba557c4 7ba1b22f 46cb38e0
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 01000000 00000000 00000000 510cda71 b0b2f5d7 26ed41b7 014a51fd
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 01000000 00000000 00000000 4a73adf2 4ba83e52 c3ea9859 72be18f3
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 01000000 00000000 00000000 b9d90390 981871a2 0f7145e8 7a00fa57
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 01000000 00000000 00000000 689c9cc9 293ab8ae 1dfca36b 7c8a9731
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 01000000 00000000 00000000 59978e50 6d29cdb5 8d324ba0 a5dd3e4a
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 01000000 00000000 00000000 3948cc5d b01d7d06 ee2cb5c4 a8a14e61
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 01000000 00000000 00000000 753c4e79 496e5769 8b50732c d23f56d9
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000001 00000000 e55ec276 e473d61f c316132c 954894ea
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000001 00000000 61e296a3 a424ccbd 575b5150 0aec2318
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 5a6b6952 34618ed9 ad0f420a 50060389
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 36e839df 742e6b89 45867c8a 969127fb
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000001 00000000 7a0cad0e 9eacee2a 32bbe64e 799efd9d
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000001 00000000 a06824a8 4fb555db 1241f0e7 304538c0
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000001 00000000 5afd1311 eb272486 71660469 54fb1933
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000001 00000000 934d980f 7d2a488a ce3cd73c 48dfe32b
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000001 00000000 acbb0ca6 57d697a2 5fde660c 606d05e1
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000001 00000000 d0c41463 5b22d41f e82375fd e05576e7
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000001 00000000 d395d125 02665bf0 ba11994f c781ccab
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000001 00000000 96880c59 01df06b8 07e62c46 7904e9e5
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000001 00000000 c8a185e0 e0c7db14 36518c29 fc40bba8
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000001 00000000 c788d4d7 db552421 962dc825 41cefbe8
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000001 00000000 b656d6c7 abe0765e b3501422 cadb748e
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000001 00000000 e34b1ea4 8d64c890 09afc44f b36a4508
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000001 00000000 950434ab c13c78d1 46c50ea8 8a41ad52
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 5818cc68 9c066862 d8668af1 14ebb966
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 4dbfdf75 73fc433a 5864d4a2 a0e27186
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 9f16f8fa 43943702 cc3f4e1a 581f9570
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 91f7c720 45712f56 ff004166 3252a1eb
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 84915ec3 6992c44b 71942078 488fb76c
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000001 00000000 d561a9ed c75c6965 d21c4161 e7d06023
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000001 00000000 3eb2ec86 ed6ec73d 7892f171 1522715b
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000001 00000000 53892271 8674ab3b 93e6afca 841cbca2
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000001 00000000 13541920 3a435e24 25f08417 bfade8dc
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000001 00000000 d0a1e7a9 7a816e40 b66226ae 62e0a4ee
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000001 00000000 8e3f42e2 2b014896 d86aa526 cd27fbeb
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000001 00000000 cafdabd9 6dcfa350 f7f8270a 9ae67ded
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000001 00000000 3d0d8f49 51136f93 26192fc1 18520d2f
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000001 00000000 20b28b79 8a8b37f8 00b104ab 868b2d14
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000001 00000000 31d98a86 9ccebecb 645a8b17 f0bb99eb
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000001 00000000 68a48077 83b8ba14 05946de8 24566774
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000001 00000000 d86678f9 354f95b4 eb7a401a ad61c2c6
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000001 00000000 8f66d754 a08c81e6 c63c356c 3ba62f17
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000001 00000000 c17d8282 720b8f46 db6e67b1 b4e955cd
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000001 00000000 9aff812c 45baa6b7 4b0c9c0f ff98f8b1
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000001 00000000 b326c5ad 7a9aa757 00b31db0 601fcdca
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000001 00000000 91620765 6f729564 29a2f9f2 cfded75c
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000001 00000000 c941d058 5cd997a1 5e9bf194 7b21d5fb
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000001 00000000 10e2485a b4e5e1e9 cd4ba01c 2e49dde2
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000001 00000000 1cdbca4c e5e98bc9 72f23ac1 cdb16c1b
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000001 00000000 1fb363a1 474f5285 78035b43 d518402e
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000001 00000000 307ba338 840c962b 34cba2bb 8d50d44e
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000001 00000000 53ca2c77 05f1ed32 94b6cd6f 4d397f26
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000001 00000000 faf425b1 b86d358e d1a20e65 281bbbf8
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000001 00000000 61f619d6 16c90f22 1fec0d94 6257e0be
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000001 00000000 25142c67 9cfa1771 c5978a54 7400f567
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000001 00000000 2ee984a7 638ced08 d33ef781 0247374b
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000100 00000000 d1b71a4f 1684424d 9fd4c7dc 9bc4d871
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000100 00000000 9fa9054b 71f78e23 c9b3d997 2ca4eedb
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 3db7ed45 be438491 cd0d6566 ac45f324
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 cc1a364b 3a1cbe65 abe2f8e9 f502c286
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000100 00000000 8feeb62a d5061040 b534de85 3c027ed9
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000100 00000000 9e2e2531 4c9f15d0 c445affc 60730252
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000100 00000000 b7c5670e 138a4b8d 6e42fdd8 5b9daf1f
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000100 00000000 dd1d56da 6eed44fd a7dc085e 152674ca
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000100 00000000 5295cae2 66bb409c 75db79b7 58dd33f3
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000100 00000000 ed9ce0e1 072c7948 03c30fb2 ac016e8b
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000100 00000000 5e2ca009 ca4f2212 44f195a6 565be49a
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000100 00000000 ceb2d3c0 be733e64 bc1f1860 c29c14ad
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000100 00000000 824fa943 31b285c4 263d37ea 2f123fbb
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000100 00000000 a816d1be 20fb3610 72e57473 56e874cd
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000100 00000000 4350d13a 2617f33b d1609d1c 7843b983
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000100 00000000 bf189652 e19db3da b9a9c751 fe69dabd
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000100 00000000 aa25fcc5 aa1d1333 04449e1f 8233a5d1
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 b3cd867f 2740b7cb 39cea5c5 c184d63b
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 31a10a6f d86903e4 310fda33 90006449
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 a0489810 69a99632 f30a3276 0ebabdb1
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 0987067b ac2d74b1 c8d0f7f8 651d1ca4
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 a63b4182 ad284ec1 4436f8b9 b98134fd
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000100 00000000 23bcfa51 0870547e b46b24d5 a34737a6
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000100 00000000 ee786787 118a55f0 43b9771a 20ff54a3
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000100 00000000 75412ce0 52dee65c 77791fd6 60943f38
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000100 00000000 8bbe8840 ed24b4df 125e9e9b 5ede5ceb
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000100 00000000 956293f5 eb6577e5 aea6424d 050e3306
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000100 00000000 256d2b89 d3f9ad2f 90b82362 018409fd
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000100 00000000 af745525 fb08c32e 1c134f69 54af5d5b
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000100 00000000 4279efbd cdfc19a2 6b806fe3 c3cdf539
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000100 00000000 91b1a835 6e6fa9f9 9ad21955 f9881872
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000100 00000000 d3da99a7 2b009b3b 04b727a1 1eaaa447
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000100 00000000 33bd4a06 c8968739 e08dad00 45f8363b
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000100 00000000 1c399450 72192248 9dbd2ddf be17d911
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000100 00000000 4213e7e2 9eee3bff ca895491 00c7b193
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000100 00000000 b955af87 2c272a9e a500d242 22611535
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000100 00000000 2e01ebb4 0dcf0ecc 758d642a a7597d3b
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000100 00000000 3c587492 fc291e69 97a3dc0f a71448c5
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000100 00000000 1faf9fbe b3d940fc c93b02a2 cd4aa238
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000100 00000000 ec9bcc5d 28a32054 4c7d0e4c 47cfc9b1
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000100 00000000 e7fd6ed3 406c0111 96dbb609 4ad0168d
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000100 00000000 e6d16efd ee3b3517 0b0af6f6 0fb44f85
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000100 00000000 c6081d68 22ff5d78 f406fde2 1c8277de
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000100 00000000 22ccb737 9e4a0d7d 6c6dd7cc 6f9fa8a9
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000100 00000000 5c4fc443 c4461e64 8d34b2b4 3948c1da
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000100 00000000 fc085908 e4d876e5 e4af7700 6c218c12
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000100 00000000 148d2070 dbe15c71 a8847c49 02efc241
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000100 00000000 ea492649 be966d5e ae76cfce b1d4d505
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000100 00000000 2b1e4db8 f7cfdc2d 14b0b987 8f31e992
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00010000 00000000 e59bf1d2 cab0f564 3104664f 2620d3a8
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00010000 00000000 e13533b7 b2562201 a8eaa55f a750df08
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 6d9b77c1 b4c8d357 2680fa2b 3f24b6eb
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 8b8c2007 29822d48 c5ef677d 1f89c3a7
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00010000 00000000 5d2fa112 e2c5d011 df9135ad 763f29cd
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00010000 00000000 7b396de9 cf3342ed 91371e20 e5836599
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00010000 00000000 18f90e00 e840907d b34d1745 2fa31445
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00010000 00000000 5b21ea12 9b81514d 3a44a5d1 1e429945
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00010000 00000000 db5924f6 43a09271 4bbd7526 47a0b9c8
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00010000 00000000 eeaf24d3 513eabbd 6e27d8de dfba806f
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00010000 00000000 60caf69a ce5c0585 ebaca6c9 51b5618f
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00010000 00000000 40e5c216 f39c46bb 42124cf5 d29e3a81
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00010000 00000000 f57c667d 46dbbbf1 221b419b 086bc672
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00010000 00000000 68babf11 f7755abc 1c03ca54 5d4876f6
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00010000 00000000 01e33c4c 337f84f1 accdd03a df95085e
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00010000 00000000 dcc0f93d 9d21dc4d bb1c0159 6151428f
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00010000 00000000 d1fed09e 84ec00dd a4f64c71 b958535e
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 3e7982ea 8c9be213 a326f346 4e9711e3
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 49e320a2 8526076a 01c83b75 89eca4cf
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 13b6d420 5802874a e8c409d3 5400604b
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 866c2aae 210efb54 f1dd4928 15276ee1
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 df8334cd 383c4a69 b4530250 7e70f0f0
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00010000 00000000 39a0f8e2 faf0937a cab7a67b 14fa4909
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00010000 00000000 3452504e aa51562b 8ed6632a f532ff33
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00010000 00000000 198b3f09 69a2a1b7 244cb5c3 f5975969
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00010000 00000000 a5b028bf eb128cea fa673ddc 6dba3964
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00010000 00000000 62063941 455d80cb 0a50e480 c0cfc579
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00010000 00000000 c4c59ee9 c55bfd45 e9d9d1f8 aed1a219
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00010000 00000000 bc39e53b f43472b1 f3e1a62e 20214463
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00010000 00000000 0b9fdddf e49b3226 9b609ebf 94e00cd1
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00010000 00000000 6ef585e1 372feb69 4a300d7a 3b9d9371
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00010000 00000000 87cf8e6b 3e5e1e1f feb7c8e4 a2081049
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00010000 00000000 f9e429b6 69cc141b a7c881d3 e29b35ac
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00010000 00000000 d4a1f5c4 401e56b6 9b5490a8 2f833185
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00010000 00000000 99766356 8ff50157 b3821b37 ec4d7fe1
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00010000 00000000 d410c303 bdcc51fe 4fce8db1 c2300086
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00010000 00000000 3c76e5d6 7f97d7b2 87fefb47 aa1e74a3
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00010000 00000000 b04160af ccd69849 d997776c 78baca82
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00010000 00000000 2b426a66 b4778997 036bb2b6 73f85000
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00010000 00000000 97c725fd 4c263287 6b84df34 87bab7e8
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00010000 00000000 955705c6 638b9589 bf7079d3 a0812340
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00010000 00000000 8062aec7 ad667c4c 531d646c a89419b6
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00010000 00000000 5f4b9c78 e073fd03 7af2647f e04cadb5
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00010000 00000000 21173c0d bcbff324 23e49265 77a987e2
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00010000 00000000 75469838 fd82de60 d25e525f 6fc94eec
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00010000 00000000 2901d556 c39f0758 f0f25524 ab9ea7f1
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00010000 00000000 0f4f1084 0dbb5150 bf4b4ba1 f1e9a302
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00010000 00000000 a7f09b0b d538d63e 8cd9698e 4de1d5c8
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00010000 00000000 e14850e1 da61655e f8b9fee9 4cca7a22
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 01000000 00000000 82d8ce21 f80a41c3 e9d7378e a43774de
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 01000000 00000000 29450fbe c7620b1e 01db607e 496c959e
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 67b63d9e b7aa2865 5b0b2f47 38eca693
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 22e3d97b 88139492 04477566 8fdf0038
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 01000000 00000000 df57c091 a68d2400 c56ef541 caca2946
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 01000000 00000000 d2e144ed 44f15ecc 72ad8cf0 18eb77a1
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 01000000 00000000 597c28af dff928f2 c9881678 39c1b806
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 01000000 00000000 9448bc5a 0f04a19c 7de7946f e41b327e
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 01000000 00000000 25e501dc fc98dc25 2a624ae8 3335bc09
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 01000000 00000000 73ed7ea6 1d84a23a ecea26e4 79d91ca2
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 01000000 00000000 17c50437 780ab31f 883bf9e7 e4426521
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 01000000 00000000 5ed86b68 57bcd482 c1963c45 c80403e9
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 01000000 00000000 e4318c44 bd5a645e ee2a5267 d3f32328
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 01000000 00000000 9584cdb9 0369c0c6 5db25327 f05fe043
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 01000000 00000000 0eb27e05 398c1efc e252f9ec 9792108d
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 01000000 00000000 27d98c16 a999fd3e 0f9aa126 4714fcf5
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 01000000 00000000 18e2ab27 192e782c 228edbcd 1cf25b21
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 b4dfa099 93e47dcd 53622042 1ae269aa
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 289bdca4 79f10ec9 223c09b3 be39c40d
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 a5f9354a 74713822 5d699bd5 e61ef52b
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 155c9b52 7f208dab 99bfd248 967ad519
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 99c71cf2 004e9a5d dbf6813b e03f8f30
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 01000000 00000000 fd514803 5b988c05 11b96981 cc9efbf5
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 01000000 00000000 a2e373f3 fff6af00 aae75bb6 aa810fda
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 01000000 00000000 1b9d9279 33f2e9d4 57b2baac a08aaecd
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 01000000 00000000 3b7d051d c251092d 0f387d56 c30b2bbd
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 01000000 00000000 f7161117 ef751edb ad5435ad fdcbd02c
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 01000000 00000000 a53512ef ab201dd5 5ce98a55 6152b179
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 01000000 00000000 71491954 fa3dfbaa 4766b8de 18867ab8
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 01000000 00000000 a90344a6 0d3c789a 30a038cb 6bb037f2
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 01000000 00000000 0a27fa46 3b9d3956 4817a0f7 0f35fd04
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 01000000 00000000 56940c06 a82316da 4ae11ae6 ca14cb80
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 01000000 00000000 ef5356d3 eba75b67 5280c534 333bc371
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 01000000 00000000 b29f5cb6 60e617b8 f15ab8d2 58a93843
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 01000000 00000000 ee1b4eea 636b83ad 7310d166 3c49ed51
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 01000000 00000000 cdcf1fa1 ff375a8c 3b20fba8 0553b4ac
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 01000000 00000000 534e5a74 6ad414cf 6783dc68 5afdaefc
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 01000000 00000000 aa5f07f3 8208c9f7 86206e63 0e1dba58
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 01000000 00000000 c4b11a37 665a50fa a5f49338 6e8f0568
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 01000000 00000000 f7f20443 868b09a9 7432511a 88556c5b
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 01000000 00000000 8cf1b0f7 195a07bb e7444fc0 8efa2752
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 01000000 00000000 d4deb9d3 8a9dcfcc 04f1b075 fb78122f
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 01000000 00000000 8bb5c362 97b1a466 ff73a392 dd0e35ed
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 01000000 00000000 30099688 0620fd6d 7988d696 194aab84
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 01000000 00000000 d381395a 31d23232 e2ce7661 9c07e08f
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 01000000 00000000 38c43a08 5fe81ebb 3227c6cd e673f899
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 01000000 00000000 57b9eb17 b16faefb f026d744 770589ec
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 01000000 00000000 64ee86b0 b6f88be3 c384e0d6 a98d0044
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 01000000 00000000 0943acb4 e8ca93ea c99a6bf0 587bbe35
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000001 d8cdc0b3 76febda9 f145334c 8ccd989e
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000001 a4120da0 7e334806 6ccbbae6 f884db86
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 fe3fdf78 7fe5f526 0f9898a0 8553f47a
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 0f5c7ddf e4ff9c6b b7822869 824f7b3c
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000001 907e8fe5 6ff48574 c613762f 8419cca9
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000001 7027e389 5b9bdc45 08d90b0a 996e7998
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000001 904f9f5a b5f4e88d ead29fc0 2b996332
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000001 80a2b84e 6900e001 c5162475 051606e2
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000001 6c7a3b27 944d3b5b 052a12c4 1287ca7d
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000001 7117192f 8e210458 f4f9f6f5 6c4a0318
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000001 8aeeaf0a 185ac5e3 bcb8fc4a acbfe41b
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000001 d9c75aea 39894834 bf1d275e d00a123c
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000001 34d40c7a c5526b8f 0b35e113 bcd830c6
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000001 b7acb815 feffa06e ea979b88 c0cf38bd
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000001 6cdeb44a 35bd89c2 2fd88035 fbc9ddd3
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000001 6c5d7d52 c8b975e9 e8a693ab b4bd1af3
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000001 f8521b4a dbe20169 24340095 4dd3bb60
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 c2d6689b 3b72883f f0fc19d1 6cc655f8
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 0949c29c 3880052f 2459c0d3 774f67ac
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 d37727d5 d44885fb 40dec1e3 10be5d27
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 3ac80642 953d6595 9c2df6a1 2fa227c0
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 e343745c 514c98fb 202c521b 36a272dd
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000001 8f31f7db 58d9f1d0 2ba4fff1 dafd441e
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000001 14093d48 19b54970 3076e546 54df7928
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000001 65a1ec0f 0410478d 0336f294 08685c66
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000001 adc7dadb 75984ee9 3f99fbec 32abbb5d
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000001 ec4d68bc 8193dd1c 5db4cc7c 53e78f28
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000001 2747e673 697ba048 fbd55241 f7d03178
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000001 1c4c758f 6142a50c 3db5d4c9 7d8964bb
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000001 490f97b9 fb25b95c cae9be65 ba621248
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000001 95a625ff c506be5a 3c3547b4 b50900dc
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000001 0b47695b 0823c2e9 7e30a51b 61a7bf88
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000001 746993bc 5e841d54 3663cb30 679aa59a
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000001 26b7e4b3 b52b2568 6ae26a56 7ece4e0a
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000001 81b612d9 b684a761 b460a0d0 dea6923a
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000001 a15c7e43 8b87221e aa01cea1 897212b9
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000001 d87e6534 a914f232 2ba776e3 64de0c83
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000001 07043336 9ae9d489 f4a25ba8 165fddb8
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000001 c3d87d0d 58adc9e4 9e1da7d2 da881245
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000001 0533180f afe5e50e 779f1051 79221e92
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000001 3dd06f43 0b0d5f83 1302fe7d 3d2552e3
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000001 725fc967 5021d4c6 ca759daa 0f8a7bbe
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000001 a22aaee8 4ff66429 11f6d35b 9f328c05
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000001 26131e6e cdac6fde dcdb3556 62e54f7b
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000001 c5ae206a 792a3d3c cff179d2 0667b2ec
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000001 be478a57 82e7d9a0 25d55857 66b8c0ab
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000001 eb5c58f7 9b42dc31 09174875 447f07e3
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000001 e7091d5f ba221fd5 3775e6e7 6f5d17f4
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000001 c944f017 ecdc01b1 64613fad 638d30f8
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000100 7f2f0daa 8250599e d86eaf5b 6bbae2a9
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000100 e4b5773e de0d22b1 f2ea0982 7b34db92
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 393ae33d 46d1e116 12b3e6dd 59980fac
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 5f412afa fdc6613b d0e935f6 471e5e4b
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000100 7abeb2bc 122ddec0 6fa03a7a 824166dc
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000100 1008b496 a85ba459 e7f1b8bd 3da32d88
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000100 4d1afb12 939b7c02 f44bf246 fe7d2ef8
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000100 1bb5c98d 60fa9c25 2749d1d9 3c880ed9
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000100 a419efe3 cec80e6c 3fcc84a9 e56898c6
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000100 505c2396 befec6b5 325cc0ed d63677a7
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000100 1a6a4fcd b4fd4d3c 08fd0936 7cb1abb4
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000100 01e1f7e9 959bfa34 b1ba5ba2 4c4dd6e0
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000100 e6205d2a 0f119894 bc95a629 7ec8eb32
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000100 542e3279 b1f2cffe 3eb39960 3680a449
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000100 25021f11 cda42315 29e10f48 b917f681
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000100 6b563024 a62a213a 083ef6de 448dcb62
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000100 3dd4ac40 773dd04b 1fa760a1 5ab2d7b4
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 55183ca4 2fae8c07 8a04c8a2 83bfb3b1
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 ac1fa9e2 8a376297 6a76f622 66951cc2
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 dcce8912 4bdd1e1a 8177deb0 a2df4df6
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 7b47aa39 17de883b f0389adb 725a81a2
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 cd5f9e74 661902ef ef2a7524 0782be05
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000100 6950909c b0c259d3 9a1b0d2a e940fb31
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000100 74bd6da0 2506319b fc8113d5 79455bde
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000100 720d34e0 5f60576f 7278b81c d707f0a1
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000100 ac8137db 28f464a3 98fc9b1b 2a2e70c9
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000100 53d3c9db cb40a3bb d21c9214 4385dc60
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000100 01ca9fc8 be2d5bc7 58e949a0 b7c03b88
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000100 0bd240e0 4fd3dc82 2fad4a10 ab50808e
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000100 06c9fb2c 7bbc95f4 6f01b025 3ff15e9f
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000100 df36eb98 3a8cf76f cf22acb6 5e6bfb60
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000100 4d620503 ff7ad0ad cba5c94d af9c37e5
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000100 7161b90e cae6104d 5b1257d9 29f82898
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000100 59d062ab 89e20f13 e6223064 6e7a60ee
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000100 631ad4da b29b6712 052c2160 7d7315ba
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000100 e920893f f173f4de 7e3a9c64 18cd538d
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000100 60303917 64f675bd 98417210 b058a208
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000100 6464c8b1 8b280c53 18c499fb f27a4e16
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000100 f2ab7027 8d25e619 90017a45 2dc913ce
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000100 23e9d1f4 7e6995a0 c4e606b8 0f1a66bc
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000100 0a095c69 eae0868d f0f38532 f98b752b
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000100 17fbf313 e6698d5b 0d534c3a c11f77ae
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000100 460be28e 444d9392 7a902b48 84cae4e3
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000100 610abef3 e7b54875 39a79235 eb13ffb4
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000100 c713d0ef 445f03ed bd7ead2d ed950e14
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000100 e6737c14 2c8dcc7d 3a23f109 67b6a89f
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000100 67f457c1 557228c2 c8089581 7d01371a
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000100 a824da65 0b3dc334 aaba7e18 3d402fbe
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000100 22ac2693 92de8f21 02a7797d 8f573dfe
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00010000 16453451 ae1de563 0dee5530 eceed42c
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00010000 46df3956 2d4a949c b59326a3 584723cd
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 f08b09be 0de23177 5098b59b 110784f7
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 485ef1c7 80025f08 b23ee428 27208fe3
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00010000 b158ebb3 8338a0a1 de47abd3 30640723
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00010000 87326517 08099596 4ce7aa41 c4c38ba2
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00010000 46b8aa2a 3777c4be 8415045a 1299fdbe
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00010000 54421b55 8571e355 5c415a26 6cb049b7
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00010000 6f930ec4 a9e9ad53 4251bb83 2e476fa6
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00010000 a7ef447a 524b4fa1 05c908a1 45f9ad22
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00010000 267ec642 b82ac27a 4d84ed96 e0b16f5f
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00010000 ab216213 8d2a7155 bbe7d6b4 9b641b00
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00010000 90b88f45 621a4888 765566df 5e4be449
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00010000 0ec8a630 6e5b9e83 9a75b24c 4f8235b9
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00010000 f4619e3a 02ded40c 9c0340eb 3b7e7721
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00010000 05072ea9 5639f5a6 d23e7418 b1e3ced6
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00010000 a33ab035 a790718f 180c5629 6cb17eb0
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 3afaf21d f5f444d4 418d0c92 4d51e6ab
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 e38a9623 fc3e8309 4454bf75 244bfb0d
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 29397c94 ee16888b f4cd5d6b 2f559297
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 afe121a2 836f1bdc 9c684339 599bbaac
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 97b8aabd b1df936a 52f5e128 d56ede53
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00010000 78942d59 640b16e9 b8cf9e93 6654d236
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00010000 8b1ad3ba 90e87f5b 0d634de7 aaf1ec6d
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00010000 b4a35540 8a7bfccb d8ef9e43 6e6f13b1
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00010000 269e3c15 d4beeeb8 ec43a0a2 94e2f460
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00010000 b074026a 609dcbb3 e487f3d7 30364b78
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00010000 53e4a4db a3556ea4 576e6986 1b516aa4
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00010000 dc5e18da ef5264a5 413d6200 1c4fe353
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00010000 bd3bf363 f67e6401 a70a9952 864d4aa5
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00010000 ca25ca8c d87c52ed 10f3e089 a3f10a38
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00010000 99b35266 3935d44c 45de70ae 5f45642b
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00010000 881487ec a7d965b7 9390323e a0f820ec
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00010000 3c407556 c54e9eee 10be61a8 01b3314c
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00010000 9bdfd785 cdfacd85 2ad6eaae 08e5e1e0
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00010000 70049988 28ac8eaa 8f88c445 26a6a7ac
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00010000 b3309df6 9f70fb63 e6bfe14d d9db32c5
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00010000 78c3331f e11483c2 196cd881 8c5cb976
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00010000 78c1f422 ffb35622 976a0ea2 c47dadf3
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00010000 9a48897c 0d43258e 68143233 a4c42971
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00010000 c0c0c9a1 db862add 34cbbc45 0ae92dc3
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00010000 609cb695 a458cf4e 845dea00 770d10fd
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00010000 96096fbc 092a6c52 a2863361 6034ae5a
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00010000 59325887 93450bbe a209db71 2ca5aafb
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00010000 603c3e9c 37da7ac1 46c5ed4c d4b26267
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00010000 417dd2b9 c069d12c 5cd96a21 a5aa30fe
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00010000 d1e6217e c52b09d7 43c3362c daa88559
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00010000 500d3d50 8334b350 4a350e9d 065f38cd
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00010000 6cf8999b 6a224467 cef79e60 1f6aa053
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 01000000 236973b9 acfa2b20 a57b6a9e 141ff8a6
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 01000000 b28f36c5 abf41d7b d5fce5d2 14ed9ac6
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 87c39599 8016094f a95de4ce aa6aa7b8
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 400e9c58 f0d67e0b 9e82d4ce 1309b835
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 01000000 80ef9d40 b2e43def 364c02e9 06946104
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 01000000 d0c96c3c ddb82b22 5849cf64 76915554
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 01000000 974f08cb f1017d85 2a8ff47c 9515ba1f
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 01000000 0f6f1b7b 01983102 4f048852 ee49b8c2
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 01000000 1657d267 dc22abf5 6144b420 934224a4
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 01000000 7ec7d92c cf0f4ed8 e5850d8b dc54d1af
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 01000000 44c14233 ffb3c533 199a6672 4d92fefd
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 01000000 6f391434 d9838457 4558af73 cde09326
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 01000000 749c35fa 013dd6ad c985360b 054b5540
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 01000000 0da7d3fb a196f591 87ddccb6 5bacae93
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 01000000 0f1b4f3e 7110733b f8515528 ff32033b
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 01000000 fb5a5d93 3ed97d61 039e3770 f3d0f902
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 01000000 681a3e44 8e63ecd0 3abcabec 4d2d5731
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 7f371943 dcfe4c07 49b7b9fb d57162e7
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 83976612 a822b1a8 35791be9 a5d50048
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 63f7134a d37c8caa 7f04dd78 8a27a3ec
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 6d3353b7 77bb4bb3 d7e0c2ff 16005d82
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 3e284f56 e9881391 2e0fd8ea 724a7aee
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 01000000 bd941ac9 ae36480f 7558b610 d6f26b21
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 01000000 3314bc79 87b3f03a 481bfaa7 a7b3a2f0
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 01000000 828a4d0b 88977fc1 d68b9de4 102f59e1
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 01000000 989b41df fc836e53 5651aa7a 4e468c77
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 01000000 0f2ca98d 3217d236 7e6fa595 ed30cbc0
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 01000000 95a56154 36c66fdb 2d78e0b1 264d50a4
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 01000000 730568fa 5f468b14 def70363 1347fbb1
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 01000000 1e9be78a 288adfe4 acb526aa cf7bfcad
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 01000000 f28e617f 82ecd209 cead3a30 94a421cb
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 01000000 275841e9 2b57d809 cde1d166 5fd89bf5
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 01000000 2445d98d 4e04a79b 13979046 6b7d16ef
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 01000000 06632be5 e012e4a6 415e4e48 f0a6810d
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 01000000 dd19f886 d6931273 ee256f13 b76397aa
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 01000000 9ae07c7a ff565271 12f255ea 92b0421c
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 01000000 70b1f0b9 804754b2 e7ce2010 95d34179
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 01000000 832a2722 bb70152a 3b712fff 3e86ca27
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 01000000 73235ff4 84cf30f9 70ceb0f4 648df5bb
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 01000000 5de658ec 8c032498 30ab870e f87c9df4
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 01000000 48d8da59 56604227 972bde33 323ff9df
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 01000000 035faa21 6bcbf158 25f98491 b0d4fa88
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 01000000 3f39a50d 739f3ae0 f8c6c4cf 14edf4e2
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 01000000 5fb447f4 4e452b6d 471ca52a 490b9927
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 01000000 ef0634c5 6283e5e1 a6fe4817 18509a0a
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 01000000 e52f5ce3 b9b1feac 423d4a40 d133d0af
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 01000000 f3aa0390 315d0cd6 4519ebd9 fc2f7ce2
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 01000000 488fca1d 2ce48061 5fc5db0d 71c22c4e
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 01000000 3e71fd01 b9a73d45 2efb44bc bc0883ef
+ars4x32 7 00000001 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 7d13e4db 9a88eb7a 35843f1a 866f65c3
+ars4x32 7 00000100 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 f076786a 2de44c1d 0a5a871b 43f6e099
+ars4x32 7 00010000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 c47cd146 027b1ba4 31ab6a10 7f56ff7a
+ars4x32 7 01000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 e76c9bd9 ec696130 dd0a4218 f9eb265d
+ars4x32 7 00000000 00000001 00000000 00000000 0000ff00 00000000 00000000 00000000 e16d46ca ae9d21bd 1a2902ae 6dc6dafc
+ars4x32 7 00000000 00000100 00000000 00000000 0000ff00 00000000 00000000 00000000 173f2a2e 55ed290e b558c7eb 491c6fa2
+ars4x32 7 00000000 00010000 00000000 00000000 0000ff00 00000000 00000000 00000000 afb78413 0b81cf0c 82f232ff eceb9c23
+ars4x32 7 00000000 01000000 00000000 00000000 0000ff00 00000000 00000000 00000000 388159c2 679fc345 5776c7cf dcc2b909
+ars4x32 7 00000000 00000000 00000001 00000000 0000ff00 00000000 00000000 00000000 a7c5cf36 038f933f e2736b0f 25ece025
+ars4x32 7 00000000 00000000 00000100 00000000 0000ff00 00000000 00000000 00000000 7d760dc7 fba9e143 2c03d992 0deed06d
+ars4x32 7 00000000 00000000 00010000 00000000 0000ff00 00000000 00000000 00000000 52fb540d ed4f5f6f 5979bebf 4d125b76
+ars4x32 7 00000000 00000000 01000000 00000000 0000ff00 00000000 00000000 00000000 ab8062b5 37067fbd 9e374581 83b02c1d
+ars4x32 7 00000000 00000000 00000000 00000001 0000ff00 00000000 00000000 00000000 4294069a 343f7c26 d07baf72 923b8aec
+ars4x32 7 00000000 00000000 00000000 00000100 0000ff00 00000000 00000000 00000000 177f19b6 b7c68ffa de71312e 24ea4f8b
+ars4x32 7 00000000 00000000 00000000 00010000 0000ff00 00000000 00000000 00000000 f09e48eb 3c48bb03 e74e4b45 380059bd
+ars4x32 7 00000000 00000000 00000000 01000000 0000ff00 00000000 00000000 00000000 715c8bc7 cce2cbb0 5967a9ac b62c96e3
+ars4x32 7 0000ff00 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 35715da2 e9b679af 41d4db67 5a0d04bb
+ars4x32 7 00008000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 a06bdcb5 f4847027 3b5847b4 7aaa7469
+ars4x32 7 00ff0000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 b7c3b815 a954e0a8 94d0f903 84d221b8
+ars4x32 7 00800000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 6f49710d 0161f573 4e6ad7eb b127ea30
+ars4x32 7 ff000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 a16a81ec bb71b3cf b61df0bc cd5a6cf2
+ars4x32 7 80000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 dae31938 f0122e2d 6152c09c 27e2c376
+ars4x32 7 00000000 000000ff 00000000 00000000 0000ff00 00000000 00000000 00000000 61b8aeea 304bd76d 2b9fda47 7d6815d0
+ars4x32 7 00000000 00000080 00000000 00000000 0000ff00 00000000 00000000 00000000 b415b044 950ef84a 019c610d e2be1cb8
+ars4x32 7 00000000 0000ff00 00000000 00000000 0000ff00 00000000 00000000 00000000 79b7e774 54b9d8e8 6906d920 e14e30d7
+ars4x32 7 00000000 00008000 00000000 00000000 0000ff00 00000000 00000000 00000000 54c20799 0d32af30 7e69c810 8ea36de2
+ars4x32 7 00000000 00ff0000 00000000 00000000 0000ff00 00000000 00000000 00000000 d16bfa1e 859584c8 a46d009a e023eece
+ars4x32 7 00000000 00800000 00000000 00000000 0000ff00 00000000 00000000 00000000 4c5910e4 3671ddee 0ca84957 0a604ccc
+ars4x32 7 00000000 ff000000 00000000 00000000 0000ff00 00000000 00000000 00000000 8f4fbe19 f18a46c1 0b430910 4468a0f1
+ars4x32 7 00000000 80000000 00000000 00000000 0000ff00 00000000 00000000 00000000 087f97a4 9a0ba2c1 bf36caea 8587a619
+ars4x32 7 00000000 00000000 000000ff 00000000 0000ff00 00000000 00000000 00000000 7ff7e522 9b292fd3 1b2600d0 2a68ec8f
+ars4x32 7 00000000 00000000 00000080 00000000 0000ff00 00000000 00000000 00000000 2391de60 ac9c9f97 9b45f2c6 3f1fcd2f
+ars4x32 7 00000000 00000000 0000ff00 00000000 0000ff00 00000000 00000000 00000000 d7b54f07 11e5c24f 2b8c3173 ebe64dc4
+ars4x32 7 00000000 00000000 00008000 00000000 0000ff00 00000000 00000000 00000000 2019eb40 e45a0ca7 41967671 9325094e
+ars4x32 7 00000000 00000000 00ff0000 00000000 0000ff00 00000000 00000000 00000000 d377c955 f73724b0 60a4367f 74efbae9
+ars4x32 7 00000000 00000000 00800000 00000000 0000ff00 00000000 00000000 00000000 d06a64ff 3d3fb872 d23cddfe 2cf313f3
+ars4x32 7 00000000 00000000 ff000000 00000000 0000ff00 00000000 00000000 00000000 caa347ec 362e47fa 37db32a2 939f3dd0
+ars4x32 7 00000000 00000000 80000000 00000000 0000ff00 00000000 00000000 00000000 121068a3 a6f6a9bd 6b4436f2 2936fae3
+ars4x32 7 00000000 00000000 00000000 000000ff 0000ff00 00000000 00000000 00000000 5ca7f32b 35843972 38c38c1d 22ccb436
+ars4x32 7 00000000 00000000 00000000 00000080 0000ff00 00000000 00000000 00000000 0d50a165 c7706d44 dfbcb0a0 3dbb9b10
+ars4x32 7 00000000 00000000 00000000 0000ff00 0000ff00 00000000 00000000 00000000 6cbd9d88 25856615 ca9cc5a0 3ee77397
+ars4x32 7 00000000 00000000 00000000 00008000 0000ff00 00000000 00000000 00000000 3a22b46a f51324d1 181b1a2c 7a6d6620
+ars4x32 7 00000000 00000000 00000000 00ff0000 0000ff00 00000000 00000000 00000000 dba434d5 e9f01484 230a2026 c32fbaa6
+ars4x32 7 00000000 00000000 00000000 00800000 0000ff00 00000000 00000000 00000000 555abae9 49b8aa4d 08e2898d 34c05ffa
+ars4x32 7 00000000 00000000 00000000 ff000000 0000ff00 00000000 00000000 00000000 4e588132 9ebf1ea8 eb70abf3 19c1340e
+ars4x32 7 00000000 00000000 00000000 80000000 0000ff00 00000000 00000000 00000000 22547cb5 08984142 8cc08a13 e241ae97
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 0000ff00 00000000 00000000 00000000 98b62d23 0b6d0ba8 baab19fd dea5184d
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 0000ff00 00000000 00000000 00000000 4cfeb8e9 0a7e96d4 0507241f b3e34599
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 0000ff00 00000000 00000000 00000000 42cad440 508e26da 3f6420ce f9dac8a0
+ars4x32 7 00000001 00000000 00000000 00000000 00008000 00000000 00000000 00000000 b4192971 09539fc9 c077cc1f 02dc8280
+ars4x32 7 00000100 00000000 00000000 00000000 00008000 00000000 00000000 00000000 b29da95f 97960ab5 cc0ba6f5 70f68b45
+ars4x32 7 00010000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 4b26eba9 0afec271 1a5862d9 a2fbab60
+ars4x32 7 01000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 5b96062d 4a538f1b cef0f3f0 fa33f829
+ars4x32 7 00000000 00000001 00000000 00000000 00008000 00000000 00000000 00000000 2df682a5 e9fd97e4 de2fcc61 6ad346b1
+ars4x32 7 00000000 00000100 00000000 00000000 00008000 00000000 00000000 00000000 9ea89c73 7d9a8473 0a98fdc5 cd4eaa4b
+ars4x32 7 00000000 00010000 00000000 00000000 00008000 00000000 00000000 00000000 ce3dd09f 9a94935c d642de44 fe93f557
+ars4x32 7 00000000 01000000 00000000 00000000 00008000 00000000 00000000 00000000 4ca77f0c b785dabb 2b70797f 1b4f7cd0
+ars4x32 7 00000000 00000000 00000001 00000000 00008000 00000000 00000000 00000000 afb7d87e 3e5372ff 3670b934 370b142c
+ars4x32 7 00000000 00000000 00000100 00000000 00008000 00000000 00000000 00000000 eb57ceb5 9e0cab9d 0c6e81d2 80c5d390
+ars4x32 7 00000000 00000000 00010000 00000000 00008000 00000000 00000000 00000000 887ab783 e2dda480 7efa747d 50c3a6f7
+ars4x32 7 00000000 00000000 01000000 00000000 00008000 00000000 00000000 00000000 fd28991d 8cd72c34 3b8d7957 4d82bc0f
+ars4x32 7 00000000 00000000 00000000 00000001 00008000 00000000 00000000 00000000 42cbb732 e812c8ac 4fe033fa 3c57857f
+ars4x32 7 00000000 00000000 00000000 00000100 00008000 00000000 00000000 00000000 3a322695 e9cc71ba 60873d85 0330afa2
+ars4x32 7 00000000 00000000 00000000 00010000 00008000 00000000 00000000 00000000 3af0fdc5 44df990c f3b574be 8ba46baf
+ars4x32 7 00000000 00000000 00000000 01000000 00008000 00000000 00000000 00000000 ad4505c7 e5e3e8bb 5bd7f068 fc0c2205
+ars4x32 7 0000ff00 00000000 00000000 00000000 00008000 00000000 00000000 00000000 10290740 4d49e705 1a76c8ff a7a5aa59
+ars4x32 7 00008000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 c344e818 d6f972c9 718ba48d 243ec4d4
+ars4x32 7 00ff0000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 bc156ad2 142af240 c1a88557 09840973
+ars4x32 7 00800000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 7e1f495d 91e0b733 725991ab 03de3987
+ars4x32 7 ff000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 149b47c9 cf7fac97 1e060e9a 95a36c31
+ars4x32 7 80000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 d88726d1 dc6c33c9 26b520f5 1d138faf
+ars4x32 7 00000000 000000ff 00000000 00000000 00008000 00000000 00000000 00000000 44d588d5 1b98e290 8b7dbb9a 01748115
+ars4x32 7 00000000 00000080 00000000 00000000 00008000 00000000 00000000 00000000 a2e345ad c19117e9 b05da489 55cfa170
+ars4x32 7 00000000 0000ff00 00000000 00000000 00008000 00000000 00000000 00000000 81d05528 f132945d 67c683f5 0651c945
+ars4x32 7 00000000 00008000 00000000 00000000 00008000 00000000 00000000 00000000 d029cbaa 6346b68e c879f83d 97f73048
+ars4x32 7 00000000 00ff0000 00000000 00000000 00008000 00000000 00000000 00000000 4e4c11b2 8506d628 2c9c75a3 975d680a
+ars4x32 7 00000000 00800000 00000000 00000000 00008000 00000000 00000000 00000000 313b97cf e3a44a70 fc6187a5 58a034a3
+ars4x32 7 00000000 ff000000 00000000 00000000 00008000 00000000 00000000 00000000 442a0817 afb746b8 194c0eb5 4ef17998
+ars4x32 7 00000000 80000000 00000000 00000000 00008000 00000000 00000000 00000000 f39262b5 f0135a8f 6aa2d31c 528b4b26
+ars4x32 7 00000000 00000000 000000ff 00000000 00008000 00000000 00000000 00000000 27c0e3f3 093c2cf4 71500803 c6f737e4
+ars4x32 7 00000000 00000000 00000080 00000000 00008000 00000000 00000000 00000000 da68c63a d4cd41e4 7b4edead d2484d56
+ars4x32 7 00000000 00000000 0000ff00 00000000 00008000 00000000 00000000 00000000 ff2f78ea 780c5f4f d8300b11 cebe22da
+ars4x32 7 00000000 00000000 00008000 00000000 00008000 00000000 00000000 00000000 c9d4b44f b60f12af a0751b26 89250c61
+ars4x32 7 00000000 00000000 00ff0000 00000000 00008000 00000000 00000000 00000000 95a7f1a5 8e9c86c0 61b88412 ad26e5c2
+ars4x32 7 00000000 00000000 00800000 00000000 00008000 00000000 00000000 00000000 a01a31b5 b0a556f6 94e4352c e0694763
+ars4x32 7 00000000 00000000 ff000000 00000000 00008000 00000000 00000000 00000000 fe8bae26 53f4f2fd f6104dd2 3ae163d3
+ars4x32 7 00000000 00000000 80000000 00000000 00008000 00000000 00000000 00000000 a96d7149 e1c71ace 03c22296 3258065b
+ars4x32 7 00000000 00000000 00000000 000000ff 00008000 00000000 00000000 00000000 0034229f f1f520b0 70852ef1 b5acd951
+ars4x32 7 00000000 00000000 00000000 00000080 00008000 00000000 00000000 00000000 bd37d239 dfa1d7bf ab0bc739 6f10d461
+ars4x32 7 00000000 00000000 00000000 0000ff00 00008000 00000000 00000000 00000000 248444f6 406c6f2d 0708e103 1380c7c3
+ars4x32 7 00000000 00000000 00000000 00008000 00008000 00000000 00000000 00000000 dbeecd59 c32c51e9 f68865af 641ea2e6
+ars4x32 7 00000000 00000000 00000000 00ff0000 00008000 00000000 00000000 00000000 eff2640d 7b4b0ad8 c2c66c11 4394dfc4
+ars4x32 7 00000000 00000000 00000000 00800000 00008000 00000000 00000000 00000000 83c21922 bb3bf8f7 bb57629d fbdfbf90
+ars4x32 7 00000000 00000000 00000000 ff000000 00008000 00000000 00000000 00000000 11222c7d 43bfed9f 3289c92d 0d731aae
+ars4x32 7 00000000 00000000 00000000 80000000 00008000 00000000 00000000 00000000 228c99ac f2677093 86390bb7 dd798774
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00008000 00000000 00000000 00000000 f688f6fc 11df506a ba609007 46a5debe
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00008000 00000000 00000000 00000000 aa8cba8f c215007b 3ff3b9c4 b4dd340e
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00008000 00000000 00000000 00000000 861a9f31 8360b689 8b7d6829 1623096e
+ars4x32 7 00000001 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 5699ef44 00d103a4 c3eaac9b 45008c49
+ars4x32 7 00000100 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 b2be89c2 c37ed97e aa49c958 eefdc48c
+ars4x32 7 00010000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 c84c1a7b 503fac50 0a0f4268 3432317e
+ars4x32 7 01000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 317cffea 45a03ab6 b84734b4 7491e4a8
+ars4x32 7 00000000 00000001 00000000 00000000 00ff0000 00000000 00000000 00000000 7641fe12 0409fbee 8dc258fa 643a095c
+ars4x32 7 00000000 00000100 00000000 00000000 00ff0000 00000000 00000000 00000000 4144456b 56e421b9 8e0bc871 908da857
+ars4x32 7 00000000 00010000 00000000 00000000 00ff0000 00000000 00000000 00000000 31467a52 9f569421 57af6d93 4ab9aaf1
+ars4x32 7 00000000 01000000 00000000 00000000 00ff0000 00000000 00000000 00000000 a4a81156 d35e565b c0004abc f7f5ad80
+ars4x32 7 00000000 00000000 00000001 00000000 00ff0000 00000000 00000000 00000000 d9a3c778 5a994a33 050a851e 53ff6bb3
+ars4x32 7 00000000 00000000 00000100 00000000 00ff0000 00000000 00000000 00000000 9602db81 4f3e8e31 b8eb8778 8d9ae6e6
+ars4x32 7 00000000 00000000 00010000 00000000 00ff0000 00000000 00000000 00000000 9cc2bebf cd9c9adb 1f5111bf 525c8306
+ars4x32 7 00000000 00000000 01000000 00000000 00ff0000 00000000 00000000 00000000 254233e0 f1600a4a 12cd2ffa 33f64782
+ars4x32 7 00000000 00000000 00000000 00000001 00ff0000 00000000 00000000 00000000 c76b94ff 1506dbfa b6a53b19 6567ec72
+ars4x32 7 00000000 00000000 00000000 00000100 00ff0000 00000000 00000000 00000000 b96d4a8b a94e4988 48e5aa70 7f981078
+ars4x32 7 00000000 00000000 00000000 00010000 00ff0000 00000000 00000000 00000000 7297a8ae 50f40468 7c06ad3f ada1dacb
+ars4x32 7 00000000 00000000 00000000 01000000 00ff0000 00000000 00000000 00000000 5e5c57e0 6b7e504d 29090675 5f3846be
+ars4x32 7 0000ff00 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 f5203998 7c9f3216 ee22563a 3b71d9e6
+ars4x32 7 00008000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 52c6dec8 0610dfdc cabe92af b816df9d
+ars4x32 7 00ff0000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 b8cb69c4 7c6cd1b4 fef546e2 a67ba514
+ars4x32 7 00800000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 79ced4ff a7a61914 6b548c73 a7f15747
+ars4x32 7 ff000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 a2e949d9 860c3f63 d1105cb4 848d284e
+ars4x32 7 80000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 5bfdfefd 00f7baa4 6952abe6 e67d2254
+ars4x32 7 00000000 000000ff 00000000 00000000 00ff0000 00000000 00000000 00000000 6f489149 449ccf7d 2851c093 342faa21
+ars4x32 7 00000000 00000080 00000000 00000000 00ff0000 00000000 00000000 00000000 8f05251e 3b8e4328 3c01aa05 af222007
+ars4x32 7 00000000 0000ff00 00000000 00000000 00ff0000 00000000 00000000 00000000 2639f421 3d48b670 dfa86214 e6acd2ce
+ars4x32 7 00000000 00008000 00000000 00000000 00ff0000 00000000 00000000 00000000 94c5e071 feec27d5 17ec71d4 be8166af
+ars4x32 7 00000000 00ff0000 00000000 00000000 00ff0000 00000000 00000000 00000000 81bf17b5 15bf09e4 60c94d35 7719711e
+ars4x32 7 00000000 00800000 00000000 00000000 00ff0000 00000000 00000000 00000000 1f623b0b ebfca3f2 b6ca58a7 eeffc059
+ars4x32 7 00000000 ff000000 00000000 00000000 00ff0000 00000000 00000000 00000000 d12de53f 82c9fd72 153a4bf1 97834260
+ars4x32 7 00000000 80000000 00000000 00000000 00ff0000 00000000 00000000 00000000 78be9d31 d05ca12d 978adffa 42c3f165
+ars4x32 7 00000000 00000000 000000ff 00000000 00ff0000 00000000 00000000 00000000 df6516c8 c517f2ac f8189fcb 40268c9f
+ars4x32 7 00000000 00000000 00000080 00000000 00ff0000 00000000 00000000 00000000 06f0db2d b8cf2a5d 6a2fac1f b2b615f3
+ars4x32 7 00000000 00000000 0000ff00 00000000 00ff0000 00000000 00000000 00000000 07e97c9f b59955f1 ce210819 ddc6c117
+ars4x32 7 00000000 00000000 00008000 00000000 00ff0000 00000000 00000000 00000000 266fc505 086d79dd 883c7f19 812c8e58
+ars4x32 7 00000000 00000000 00ff0000 00000000 00ff0000 00000000 00000000 00000000 b2c8ba04 c0fdc64a b4d9a67c b335bd21
+ars4x32 7 00000000 00000000 00800000 00000000 00ff0000 00000000 00000000 00000000 c750fb02 49c6f0df 5e77855c 41bb7162
+ars4x32 7 00000000 00000000 ff000000 00000000 00ff0000 00000000 00000000 00000000 5a23f420 4b39be37 d12b4e70 43748ae8
+ars4x32 7 00000000 00000000 80000000 00000000 00ff0000 00000000 00000000 00000000 34ca991f 61a767bd c351e5b2 05eb14a6
+ars4x32 7 00000000 00000000 00000000 000000ff 00ff0000 00000000 00000000 00000000 b9032c17 622b9d66 a63ab848 cae4026d
+ars4x32 7 00000000 00000000 00000000 00000080 00ff0000 00000000 00000000 00000000 cb0864ff b9e9a0f4 587865a2 8d0e951a
+ars4x32 7 00000000 00000000 00000000 0000ff00 00ff0000 00000000 00000000 00000000 15df81bf 96bd32db 32fbbc39 5b63bcdf
+ars4x32 7 00000000 00000000 00000000 00008000 00ff0000 00000000 00000000 00000000 6437f14b 830fadfc 94314d02 c2511479
+ars4x32 7 00000000 00000000 00000000 00ff0000 00ff0000 00000000 00000000 00000000 48cb4f99 382ec6b3 be457c1d 2beed31f
+ars4x32 7 00000000 00000000 00000000 00800000 00ff0000 00000000 00000000 00000000 907b159b fe077e87 07b00ee8 5a81946f
+ars4x32 7 00000000 00000000 00000000 ff000000 00ff0000 00000000 00000000 00000000 996fcba6 25b49011 c432074f 5f3b26ef
+ars4x32 7 00000000 00000000 00000000 80000000 00ff0000 00000000 00000000 00000000 a91adb51 2af26621 19e0aeff 68d6e694
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00ff0000 00000000 00000000 00000000 3c41f9b1 ad73ddb3 02d857d3 09ff12ea
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00ff0000 00000000 00000000 00000000 991e32b5 45aaf05e 64fffcd8 61b258d8
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00ff0000 00000000 00000000 00000000 081148ce 4da869c0 d06f78cf 42cda6d4
+ars4x32 7 00000001 00000000 00000000 00000000 00800000 00000000 00000000 00000000 a1b4b19d e403839e 16f8b8b6 1652d04b
+ars4x32 7 00000100 00000000 00000000 00000000 00800000 00000000 00000000 00000000 099f42eb 7c93ef4a 7273a8b3 ef9d69b5
+ars4x32 7 00010000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 a76aebe3 7ff94770 dfee2619 05bd0057
+ars4x32 7 01000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 451fe101 f6a3ef4e 667f63a8 04ce4c83
+ars4x32 7 00000000 00000001 00000000 00000000 00800000 00000000 00000000 00000000 15cf4734 c47aef94 80edc942 f5ca69db
+ars4x32 7 00000000 00000100 00000000 00000000 00800000 00000000 00000000 00000000 e7566892 c6eb88c6 9c918435 0dd838f7
+ars4x32 7 00000000 00010000 00000000 00000000 00800000 00000000 00000000 00000000 469a99d1 8f034fce 3d2030c4 e0ed5d88
+ars4x32 7 00000000 01000000 00000000 00000000 00800000 00000000 00000000 00000000 c2c40a6a c58b2921 a4f6decf 4ae71aac
+ars4x32 7 00000000 00000000 00000001 00000000 00800000 00000000 00000000 00000000 1f70d2ed d32b22f6 9aa6dda6 3fef3838
+ars4x32 7 00000000 00000000 00000100 00000000 00800000 00000000 00000000 00000000 a9916db0 88b578e6 e47542bc 9ce1322f
+ars4x32 7 00000000 00000000 00010000 00000000 00800000 00000000 00000000 00000000 9e6e2d23 bd640359 4ab167df 9e912c62
+ars4x32 7 00000000 00000000 01000000 00000000 00800000 00000000 00000000 00000000 a2eda192 53f1d8b3 f44078fa d08dac13
+ars4x32 7 00000000 00000000 00000000 00000001 00800000 00000000 00000000 00000000 f7fc0eda 98472867 c3d1b83a 94ac445c
+ars4x32 7 00000000 00000000 00000000 00000100 00800000 00000000 00000000 00000000 0afed4d3 7d509436 d83d1e7e 804f751d
+ars4x32 7 00000000 00000000 00000000 00010000 00800000 00000000 00000000 00000000 a256ba8c 38c907b1 75c2a0b3 c53df9d7
+ars4x32 7 00000000 00000000 00000000 01000000 00800000 00000000 00000000 00000000 76c3db9a d7f46201 9fa6778f 543e2247
+ars4x32 7 0000ff00 00000000 00000000 00000000 00800000 00000000 00000000 00000000 1de2029f e8bd542d adf51e19 85712c5d
+ars4x32 7 00008000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 ea2d0d3d 7c789821 6436a2dc 2dcc2884
+ars4x32 7 00ff0000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 5aba4731 34daa9ed a85c4546 d7dbf009
+ars4x32 7 00800000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 86c988bd 0701e39e 73a7d71c 17ab834e
+ars4x32 7 ff000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 aa465b47 86459dff 49611206 659bf418
+ars4x32 7 80000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 cf78f7c8 c620145b e06942aa 812e7565
+ars4x32 7 00000000 000000ff 00000000 00000000 00800000 00000000 00000000 00000000 c1ec8b70 da99ba59 d636b3f1 d33f4c01
+ars4x32 7 00000000 00000080 00000000 00000000 00800000 00000000 00000000 00000000 2889f1e5 5202bc42 93ca7570 41bfee0e
+ars4x32 7 00000000 0000ff00 00000000 00000000 00800000 00000000 00000000 00000000 f498fb91 d2aa5281 d0320c53 6e8f9393
+ars4x32 7 00000000 00008000 00000000 00000000 00800000 00000000 00000000 00000000 e0588e3a b2502bdf 0d301f0e d3ae6262
+ars4x32 7 00000000 00ff0000 00000000 00000000 00800000 00000000 00000000 00000000 e6c9f06e cb8f5012 31ccd88d 8082af36
+ars4x32 7 00000000 00800000 00000000 00000000 00800000 00000000 00000000 00000000 fbd461b1 bcf10336 da98061d f9f0eead
+ars4x32 7 00000000 ff000000 00000000 00000000 00800000 00000000 00000000 00000000 8d77a649 48ab6739 f3f6244a bcdb8ea4
+ars4x32 7 00000000 80000000 00000000 00000000 00800000 00000000 00000000 00000000 01d0fd1e 86e6ec23 34fe8312 adac2407
+ars4x32 7 00000000 00000000 000000ff 00000000 00800000 00000000 00000000 00000000 7183f509 0c87a68e 516efffe cd0603a1
+ars4x32 7 00000000 00000000 00000080 00000000 00800000 00000000 00000000 00000000 f90e665a 45f197b8 b01703a5 d9850ca9
+ars4x32 7 00000000 00000000 0000ff00 00000000 00800000 00000000 00000000 00000000 aba1b65b c3dc39c6 f818760c 5fcd9614
+ars4x32 7 00000000 00000000 00008000 00000000 00800000 00000000 00000000 00000000 c931ae0a a9c813a2 7389ce7b 3452f6d9
+ars4x32 7 00000000 00000000 00ff0000 00000000 00800000 00000000 00000000 00000000 5a7dd37f 99af6c84 d32965cc 710b3e37
+ars4x32 7 00000000 00000000 00800000 00000000 00800000 00000000 00000000 00000000 baedac97 b750a9ff 2f620a43 75c8add1
+ars4x32 7 00000000 00000000 ff000000 00000000 00800000 00000000 00000000 00000000 45954d84 67001176 dc64cf9e d0c338d7
+ars4x32 7 00000000 00000000 80000000 00000000 00800000 00000000 00000000 00000000 249dc958 65149828 5151c56e 707367fb
+ars4x32 7 00000000 00000000 00000000 000000ff 00800000 00000000 00000000 00000000 4e5ae7bc e47b30b0 f86b822c e364646c
+ars4x32 7 00000000 00000000 00000000 00000080 00800000 00000000 00000000 00000000 e63765d5 f32674bc 7782ed19 5567a9e5
+ars4x32 7 00000000 00000000 00000000 0000ff00 00800000 00000000 00000000 00000000 3ac6ab25 eebd3be5 ce198c87 190642a6
+ars4x32 7 00000000 00000000 00000000 00008000 00800000 00000000 00000000 00000000 90ca936c 19a11969 95285a8e d6c02163
+ars4x32 7 00000000 00000000 00000000 00ff0000 00800000 00000000 00000000 00000000 b47543c1 fcbb50e4 2b70872f e7925299
+ars4x32 7 00000000 00000000 00000000 00800000 00800000 00000000 00000000 00000000 45024998 0f63a2ab 1073737f b118a227
+ars4x32 7 00000000 00000000 00000000 ff000000 00800000 00000000 00000000 00000000 3c131bc1 dafb56c6 3f891099 ada112bf
+ars4x32 7 00000000 00000000 00000000 80000000 00800000 00000000 00000000 00000000 20510e0e 9282f9f2 36a85fea 60436ef8
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00800000 00000000 00000000 00000000 c8c161d9 a6254725 3a8e0032 b16af124
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00800000 00000000 00000000 00000000 fc54d1a3 2bebd8fc 350e3cba a9b3e3b3
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00800000 00000000 00000000 00000000 725a0795 1f5b8fbf 0dde02a2 ddda103b
+ars4x32 7 00000001 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 f20c1570 d6039a6e be4c0b63 0ceab11b
+ars4x32 7 00000100 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 c58d83f4 c7c11330 92c5c6aa c439b7b9
+ars4x32 7 00010000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 f6d11f1d 28402208 38be7215 bcf3029f
+ars4x32 7 01000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 0d715426 5dc37963 60e36070 f208eb70
+ars4x32 7 00000000 00000001 00000000 00000000 ff000000 00000000 00000000 00000000 02d1fa26 36d9a526 bd86b104 f287cff5
+ars4x32 7 00000000 00000100 00000000 00000000 ff000000 00000000 00000000 00000000 d2661d98 6e9fa52e c4b8b29c 7715a4e6
+ars4x32 7 00000000 00010000 00000000 00000000 ff000000 00000000 00000000 00000000 4ab024ed 9feb8bfb 4ab3a7af d6d46e21
+ars4x32 7 00000000 01000000 00000000 00000000 ff000000 00000000 00000000 00000000 e0ca2ef9 0f8fcc91 a909c0f8 5026f05d
+ars4x32 7 00000000 00000000 00000001 00000000 ff000000 00000000 00000000 00000000 00b618f9 7986feda 5082f579 dccbe02e
+ars4x32 7 00000000 00000000 00000100 00000000 ff000000 00000000 00000000 00000000 91c81394 a3c03bd0 be362e51 14e979c2
+ars4x32 7 00000000 00000000 00010000 00000000 ff000000 00000000 00000000 00000000 afffebcd 5e5ee6c9 5ad415ff 1c816807
+ars4x32 7 00000000 00000000 01000000 00000000 ff000000 00000000 00000000 00000000 6e8b1751 c4ebb487 1a3c413e 8b34880c
+ars4x32 7 00000000 00000000 00000000 00000001 ff000000 00000000 00000000 00000000 531ef1f8 157230dd 44a117e0 d28ebbb2
+ars4x32 7 00000000 00000000 00000000 00000100 ff000000 00000000 00000000 00000000 5117f82c bcb985ff 3cc57c54 1dea7b4c
+ars4x32 7 00000000 00000000 00000000 00010000 ff000000 00000000 00000000 00000000 2ec0689e e031aff0 9c5bbe70 4be2d641
+ars4x32 7 00000000 00000000 00000000 01000000 ff000000 00000000 00000000 00000000 7fdcd715 f074a429 486e4445 f4b48540
+ars4x32 7 0000ff00 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 3f336fa9 7ac9514b fbe022cc 72d67f1c
+ars4x32 7 00008000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 cb311987 a33b790b 5238e35c 1b22d75d
+ars4x32 7 00ff0000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 3f33ae27 8073ad94 00e099ba 0890dc6b
+ars4x32 7 00800000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 316ed3b1 7ebb4320 8d4e502c 19b9a17b
+ars4x32 7 ff000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 8a4ef9ba b150b7b8 a89b995d 222654b3
+ars4x32 7 80000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 aa6ab8e1 32aaafe2 68cff088 5126a72f
+ars4x32 7 00000000 000000ff 00000000 00000000 ff000000 00000000 00000000 00000000 d9484dd2 d8ed45bf cd934356 98711bc5
+ars4x32 7 00000000 00000080 00000000 00000000 ff000000 00000000 00000000 00000000 b194fc17 7ad19838 104a1190 6ad2e2c6
+ars4x32 7 00000000 0000ff00 00000000 00000000 ff000000 00000000 00000000 00000000 10e03c4f 1d66a55e f4015b51 24b0a6da
+ars4x32 7 00000000 00008000 00000000 00000000 ff000000 00000000 00000000 00000000 5c877863 27e4ae74 c1fe9bdb 30e7387f
+ars4x32 7 00000000 00ff0000 00000000 00000000 ff000000 00000000 00000000 00000000 48d665be 04dd1041 3c536403 c0c50658
+ars4x32 7 00000000 00800000 00000000 00000000 ff000000 00000000 00000000 00000000 316af260 c3e51228 8e2d101c 55283e5f
+ars4x32 7 00000000 ff000000 00000000 00000000 ff000000 00000000 00000000 00000000 b2d3fb05 0e237707 5159f20a c142ef5b
+ars4x32 7 00000000 80000000 00000000 00000000 ff000000 00000000 00000000 00000000 e31079c1 260ea3df aa6faa8b 38845c56
+ars4x32 7 00000000 00000000 000000ff 00000000 ff000000 00000000 00000000 00000000 9acdaf03 0885571d 530cb772 2d658c18
+ars4x32 7 00000000 00000000 00000080 00000000 ff000000 00000000 00000000 00000000 950397cf ddd8b4bb 9018eaa0 e764146d
+ars4x32 7 00000000 00000000 0000ff00 00000000 ff000000 00000000 00000000 00000000 b24e6d97 79f27720 cedc6bcf cebad106
+ars4x32 7 00000000 00000000 00008000 00000000 ff000000 00000000 00000000 00000000 f2e3aedb 07a6ff24 57597231 c1c326ea
+ars4x32 7 00000000 00000000 00ff0000 00000000 ff000000 00000000 00000000 00000000 5006737e ef8f114f 5433839c 8bf6fcec
+ars4x32 7 00000000 00000000 00800000 00000000 ff000000 00000000 00000000 00000000 ce0dcef4 5dce8255 9cfc7a44 92c775f6
+ars4x32 7 00000000 00000000 ff000000 00000000 ff000000 00000000 00000000 00000000 06445467 01eaf5af 7c41372f 306c0418
+ars4x32 7 00000000 00000000 80000000 00000000 ff000000 00000000 00000000 00000000 b24a91ad 5374b993 532c214e 4d62735c
+ars4x32 7 00000000 00000000 00000000 000000ff ff000000 00000000 00000000 00000000 2ad702b7 f298e652 ad45e416 afdf3b45
+ars4x32 7 00000000 00000000 00000000 00000080 ff000000 00000000 00000000 00000000 1fdfac1b 29d91b83 6283fa9a c4bdabc1
+ars4x32 7 00000000 00000000 00000000 0000ff00 ff000000 00000000 00000000 00000000 c38ba415 36e0934a 9e93e7ff 57fb9604
+ars4x32 7 00000000 00000000 00000000 00008000 ff000000 00000000 00000000 00000000 8496cc8f d317b99a 09ed2dd5 0edb985e
+ars4x32 7 00000000 00000000 00000000 00ff0000 ff000000 00000000 00000000 00000000 c1a8e6ba f637f477 7c1be8c5 1635dc1c
+ars4x32 7 00000000 00000000 00000000 00800000 ff000000 00000000 00000000 00000000 5f2e7d91 f1f9cf5a 817e48fe 32ccab0c
+ars4x32 7 00000000 00000000 00000000 ff000000 ff000000 00000000 00000000 00000000 319fdc17 28a1caa6 cc3b75d2 cb8f3b4d
+ars4x32 7 00000000 00000000 00000000 80000000 ff000000 00000000 00000000 00000000 1f4d97b8 422e76b3 dda759c2 a5847931
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 ff000000 00000000 00000000 00000000 0ba58ff4 f368a86b fd226d2d 38846c8f
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec ff000000 00000000 00000000 00000000 0559bff4 5d8c2def 9683e6e7 2f3bfae0
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 ff000000 00000000 00000000 00000000 49aa9863 e5956af6 c1963ab1 591271f2
+ars4x32 7 00000001 00000000 00000000 00000000 80000000 00000000 00000000 00000000 87bb5447 bc484c00 3c5b9aeb 1c2b06a0
+ars4x32 7 00000100 00000000 00000000 00000000 80000000 00000000 00000000 00000000 85ff139c 79136de3 a6c097ad a9d93b5e
+ars4x32 7 00010000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 d742d3e8 1cadab91 38352a68 13cdbe8f
+ars4x32 7 01000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 7baaf6fd ce25c905 cd52dd6d 9b4b8695
+ars4x32 7 00000000 00000001 00000000 00000000 80000000 00000000 00000000 00000000 a372abd2 9170f153 c0f3826a 030d183c
+ars4x32 7 00000000 00000100 00000000 00000000 80000000 00000000 00000000 00000000 ac9b58af eab5f7f1 3067583b 20a88a68
+ars4x32 7 00000000 00010000 00000000 00000000 80000000 00000000 00000000 00000000 1543d6a6 2a11882a b8bd4a66 9d975a6a
+ars4x32 7 00000000 01000000 00000000 00000000 80000000 00000000 00000000 00000000 71143d7c 1ef3ced0 7932bd39 5ea74960
+ars4x32 7 00000000 00000000 00000001 00000000 80000000 00000000 00000000 00000000 78214851 98901970 9c7fb38b 86e20192
+ars4x32 7 00000000 00000000 00000100 00000000 80000000 00000000 00000000 00000000 4516ccf1 a5a3eb0f ea6d2d14 cbe8dc1d
+ars4x32 7 00000000 00000000 00010000 00000000 80000000 00000000 00000000 00000000 b0e28d6c dafe0519 9265f7a2 3a67d98f
+ars4x32 7 00000000 00000000 01000000 00000000 80000000 00000000 00000000 00000000 ca83bf38 b97608b1 f638b1ad 264da873
+ars4x32 7 00000000 00000000 00000000 00000001 80000000 00000000 00000000 00000000 eb299f5a 488ca603 d07f13b6 11f9a950
+ars4x32 7 00000000 00000000 00000000 00000100 80000000 00000000 00000000 00000000 1820cc2d ed40c0c6 9de2f5db a832b40c
+ars4x32 7 00000000 00000000 00000000 00010000 80000000 00000000 00000000 00000000 8c94851e 9015ad5d fa421361 7a8c9a72
+ars4x32 7 00000000 00000000 00000000 01000000 80000000 00000000 00000000 00000000 356b05ae e4868c3f 00d4c8e7 5bb483bd
+ars4x32 7 0000ff00 00000000 00000000 00000000 80000000 00000000 00000000 00000000 87e57c8d a2ebb5da 94ef921b fa8513ce
+ars4x32 7 00008000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 cc5d25dd 0f0c036d d8f1396b 0a42d6b4
+ars4x32 7 00ff0000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 a2459ccc f6ee7d36 ccec35f6 e61df0ad
+ars4x32 7 00800000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 124c12b5 6fdd7c44 d10cd930 50fc3048
+ars4x32 7 ff000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 09a36724 e1efb60c 7a6af056 16918325
+ars4x32 7 80000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 241b7c12 dac5702f 035aaf92 367de6b0
+ars4x32 7 00000000 000000ff 00000000 00000000 80000000 00000000 00000000 00000000 d0e87638 680d52f8 ef7d1235 eb854d5f
+ars4x32 7 00000000 00000080 00000000 00000000 80000000 00000000 00000000 00000000 41458389 3648fdb0 f32d3a06 1b374ab6
+ars4x32 7 00000000 0000ff00 00000000 00000000 80000000 00000000 00000000 00000000 89767040 98bd8b53 2a7a25e1 9d330351
+ars4x32 7 00000000 00008000 00000000 00000000 80000000 00000000 00000000 00000000 0495c061 b369bdf6 16e39b8b 2f73c706
+ars4x32 7 00000000 00ff0000 00000000 00000000 80000000 00000000 00000000 00000000 4f44ba25 2fa529fb 7bac72d0 8c5e9791
+ars4x32 7 00000000 00800000 00000000 00000000 80000000 00000000 00000000 00000000 cf05097a 9445e279 6be1bea5 934cc529
+ars4x32 7 00000000 ff000000 00000000 00000000 80000000 00000000 00000000 00000000 b14f83c4 23ea98f2 117f8aa9 6f4e3cff
+ars4x32 7 00000000 80000000 00000000 00000000 80000000 00000000 00000000 00000000 bcefcdbe f7800c28 75a42433 343eb79f
+ars4x32 7 00000000 00000000 000000ff 00000000 80000000 00000000 00000000 00000000 c823637a f2cd8f68 3f74cbdd 72672c7e
+ars4x32 7 00000000 00000000 00000080 00000000 80000000 00000000 00000000 00000000 cdd08685 aa494976 778fdcd3 9ecac13f
+ars4x32 7 00000000 00000000 0000ff00 00000000 80000000 00000000 00000000 00000000 fa778f3c 6258a48a e9264cb5 7b37bca7
+ars4x32 7 00000000 00000000 00008000 00000000 80000000 00000000 00000000 00000000 2d459898 72b4770e c2a0bb2b 3c849ce6
+ars4x32 7 00000000 00000000 00ff0000 00000000 80000000 00000000 00000000 00000000 4cc396bc ced17dc9 f56b05e9 f981fa2a
+ars4x32 7 00000000 00000000 00800000 00000000 80000000 00000000 00000000 00000000 fca7e4cd 675b8891 78cb54e9 32b59df7
+ars4x32 7 00000000 00000000 ff000000 00000000 80000000 00000000 00000000 00000000 2382998d 5c4ed0b3 055d8edf ca6ca6d4
+ars4x32 7 00000000 00000000 80000000 00000000 80000000 00000000 00000000 00000000 afa21a88 d3361143 bda336cd 1bf267e9
+ars4x32 7 00000000 00000000 00000000 000000ff 80000000 00000000 00000000 00000000 b18364a6 17306f04 1b6a8425 6eff1661
+ars4x32 7 00000000 00000000 00000000 00000080 80000000 00000000 00000000 00000000 0e9be5fd 8ca4a6f1 0a8877e6 da88be80
+ars4x32 7 00000000 00000000 00000000 0000ff00 80000000 00000000 00000000 00000000 1b5e3bd8 03430218 f30c0ab5 396c6445
+ars4x32 7 00000000 00000000 00000000 00008000 80000000 00000000 00000000 00000000 782878c3 3e5bf42b cf3105a1 de7112a6
+ars4x32 7 00000000 00000000 00000000 00ff0000 80000000 00000000 00000000 00000000 43bd4d21 40c58ac2 32165652 fbf0adba
+ars4x32 7 00000000 00000000 00000000 00800000 80000000 00000000 00000000 00000000 f0139d5e 9458d4c8 5adb4065 18813af3
+ars4x32 7 00000000 00000000 00000000 ff000000 80000000 00000000 00000000 00000000 28331921 43f86e50 f0b94047 e0654b93
+ars4x32 7 00000000 00000000 00000000 80000000 80000000 00000000 00000000 00000000 5ec61507 95b87190 8213fbdb 1360ab51
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 80000000 00000000 00000000 00000000 533f6a37 ba512677 d84dfdd5 5597e5aa
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 80000000 00000000 00000000 00000000 529c017f 9f86555b 837d649b ff84d080
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 80000000 00000000 00000000 00000000 25283e1d ec64d74a afae1f45 5dad3c19
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 43c59a8b 7a0a8656 9c5f8e27 4af02ac2
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 57dc1d90 13124348 47a4d8f5 d64e0304
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 99ae0ba7 08529cca 397c2875 233f40e4
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 87ceb2f7 6b345e61 9a2262b5 d69056cc
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 000000ff 00000000 00000000 1d69aed8 3b929058 e9fbe805 18ed39b5
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 000000ff 00000000 00000000 90bfc885 9f4237b2 dfd32f0e b1e2f26a
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 000000ff 00000000 00000000 da68b9cc 33b56472 05f80088 098915f3
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 000000ff 00000000 00000000 55848037 5c14a6e4 10023500 abc72296
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 000000ff 00000000 00000000 e7d77cf9 7140c274 0642cd78 c167426a
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 000000ff 00000000 00000000 1f6f5dc7 6a834368 bc961991 01d51d24
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 000000ff 00000000 00000000 1bb02fcb 029706f2 c4d03153 40cc75eb
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 000000ff 00000000 00000000 be29eb01 7a39d0ea 79092750 0157e93f
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 000000ff 00000000 00000000 78f7259c 6ac835be 3b05318c a379cd46
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 000000ff 00000000 00000000 c914d01b 78603f42 272880d0 63db5558
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 000000ff 00000000 00000000 30fed3a5 d7d0f6ca f8a2b39b 4d1abdbd
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 000000ff 00000000 00000000 6fc859e0 28e9e642 deeabe53 148ec29e
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 2ed44b13 fb6dc843 f6762574 24a4be71
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 c15b218e 5942aad5 5385c634 0b1a8d79
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 cea1fe5d d64390e8 77fa74f9 739b2908
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 2d68af44 add72c30 8695fccf 457ff20c
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 a6d4ccee 099f5cb7 3def8137 c8b0e054
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 2262767d 4f132f15 74544c84 849da607
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 000000ff 00000000 00000000 6ffb7b5e f6433da9 546972b1 b9ba5e91
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 000000ff 00000000 00000000 2f2e366a 8e08a28d 9fd231f5 89e1b414
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 000000ff 00000000 00000000 ec4f793f 4a915361 49d4bf4b 008921e9
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 000000ff 00000000 00000000 c16c5ceb 50bfe194 033a05fb 581cece7
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 000000ff 00000000 00000000 b62541fa 29374e2b 5fd7db5a b8dc8fa1
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 000000ff 00000000 00000000 f3092fc1 2d34850a ee312b26 b3248d96
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 000000ff 00000000 00000000 18b536c0 2171ac1c 366bacb9 20307007
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 000000ff 00000000 00000000 e5a3b8fc 7d0ebab7 1773b22b ca5ef8ff
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 000000ff 00000000 00000000 eb5a6b14 d6f13e39 e5c2898c 884ae98d
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 000000ff 00000000 00000000 63559e27 f649cb3e 8dad6310 214cec8b
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 000000ff 00000000 00000000 ed16c428 2f7d0063 1dbe5855 0964c597
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 000000ff 00000000 00000000 9c1c25a2 b51b1513 c2ce46c6 b710743b
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 000000ff 00000000 00000000 27e77312 e0090553 981f1b58 e2e53ed4
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 000000ff 00000000 00000000 2aba1abb c3d3fd8e 4db4d2cf a0d8e8fe
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 000000ff 00000000 00000000 d6eb1511 03b367ec fb02e357 221e1de6
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 000000ff 00000000 00000000 998b7fa0 c330bf3e 4906a0b9 32c00aee
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 000000ff 00000000 00000000 f95becd0 bdc40f82 23bc843a 953bbb26
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 000000ff 00000000 00000000 f960be5e c44d7241 08b27d55 67690dca
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 000000ff 00000000 00000000 ff69bad7 6752a2e6 5222bb9c 30d59d7e
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 000000ff 00000000 00000000 585585c3 b27283cf 4dcd15a3 ce8cd474
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 000000ff 00000000 00000000 09d00347 3eb2b33d c167b7a6 3481b589
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 000000ff 00000000 00000000 abb02cd1 a5501d95 f69faffa efae570e
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 000000ff 00000000 00000000 4ab73886 18a8e008 86c42139 4ffd1164
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 000000ff 00000000 00000000 f77867ae 96b779a2 e350fb3a bc323d55
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 000000ff 00000000 00000000 ad84c758 b85d53fc 270cc9cb 0d11d188
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 000000ff 00000000 00000000 1a623015 87f931a8 16b04922 f155907a
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 000000ff 00000000 00000000 f584e714 00b48848 4a91baa5 3ca12024
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000080 00000000 00000000 ae90a49e 0299f75a dba09105 373ea9eb
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000080 00000000 00000000 214eed3d 174342ff 75353808 982cff92
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 0f23fa1a 7b4b9c5d e05f47d2 b5ab6abc
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 c5d8ab43 57dccb7e e867925b 7f6262a2
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000080 00000000 00000000 374bb137 888b5016 ab7c188d 90208ed9
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000080 00000000 00000000 5f9ea30d a10ab20d 6dbd796c ef1aaa67
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000080 00000000 00000000 77d47187 2f3cfe06 9379af3f c4ba660f
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000080 00000000 00000000 f3b87463 f479102f ba81384d 34102ef8
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000080 00000000 00000000 60908525 4aabf57a 93c9cc43 8cad4313
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000080 00000000 00000000 3ce1f6e3 dda6d891 e1510c84 8f834bf4
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000080 00000000 00000000 985cf038 aa7b16b2 638d34f1 eda67219
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000080 00000000 00000000 a545eecc 860e969e 239e2844 0169b9a8
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000080 00000000 00000000 cb17174d e653d856 bc2b4908 e8fe058e
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000080 00000000 00000000 da37f0c2 dea7695a b2d60e33 5ea535fb
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000080 00000000 00000000 ab5150a4 6bda12a2 8f191285 7d7bb7c3
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000080 00000000 00000000 37041509 09fbce98 04aa5f64 c4321682
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000080 00000000 00000000 9c143b49 5f8c06bf 2cdff4f4 221ceef9
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 b7be5da6 fa4c411e c9cd4b45 531ad13e
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 6b883640 05246641 2b401ae1 d4d847ed
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 68166451 96c4002c a2bfab07 d56932a7
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 969ce4d7 2327f0e2 9f062d34 68cb61ac
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 f524b711 5cb24950 b205657f 695b1936
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000080 00000000 00000000 a428a90d ee8be22b ec86cd41 d7ca0544
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000080 00000000 00000000 92033e09 70381ddf a67153cf 7f1d3e6a
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000080 00000000 00000000 776d80b7 92d6738c 0eb0f0f1 6606b60b
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000080 00000000 00000000 3437e471 971e2660 9de12fcc 9e719dee
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000080 00000000 00000000 17d851f4 b6e2cba0 dcf9d96f 6db22640
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000080 00000000 00000000 49fba068 efaea7ff 4403e079 eff7e9f8
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000080 00000000 00000000 a9d90c25 137cefe3 2da099c8 8b7c54fe
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000080 00000000 00000000 31ecb7fc e98ed901 cc52ca53 522b8aef
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000080 00000000 00000000 67ea36d8 edc81619 75f854de 62620573
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000080 00000000 00000000 5f07cdb6 dc8eba08 a2203ab9 ebd2994e
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000080 00000000 00000000 2f97e7b3 1c024bf0 9460e45c 1eb15ddd
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000080 00000000 00000000 f99e3f20 685e32af d12893b7 d18721d8
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000080 00000000 00000000 59a6b960 e2f7be6d 19708280 ec687494
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000080 00000000 00000000 f6bf72b5 35e08dfc 79348d65 0c815c53
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000080 00000000 00000000 47060b19 ade1deb2 8d099901 f0ac9d2d
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000080 00000000 00000000 0a867ee5 95ee7cc0 7f2e1cf0 c07dfba7
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000080 00000000 00000000 c6642d40 a7c3b4ed eec824dc 24aee808
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000080 00000000 00000000 597ca954 4b3feb03 b167cc9c c8279e80
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000080 00000000 00000000 593f9abf 9e8e17a6 0242e2e5 f369eeed
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000080 00000000 00000000 fab1a164 05491084 8eef7174 75a535d2
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000080 00000000 00000000 69bcce75 1438b313 66a61a4b 43d63282
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000080 00000000 00000000 a4af4199 6f5a71ff 5414096c 85cb08c1
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000080 00000000 00000000 39646b02 29dd0ee6 e83e8167 a6d3146d
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000080 00000000 00000000 532476b9 2bbb5430 2f6e0475 0eda4364
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000080 00000000 00000000 e5f3aa72 34c9a92c ecef1d1b cf2f08f2
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000080 00000000 00000000 f5deff66 26bdf298 18970803 1b6bedfd
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000080 00000000 00000000 0cc5fc86 ec0fdde9 76d69653 8db392f0
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 bf8d3d73 1d510d98 a6a565cb f41beed0
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 e6d8c3e2 327dc9c6 a53a0526 a7a2e8c8
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 981d0eee 0e53df72 c8c669fa ef118af6
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 1ee3785e 8f405a41 6cf2f459 d12f65de
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 0000ff00 00000000 00000000 5689240e 4a9abb71 24f810b9 a00fed86
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 0000ff00 00000000 00000000 18ea4be2 8b2cd08c 56f9bdbe 494e587c
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 0000ff00 00000000 00000000 92e8db17 688254d0 099cfecb 0098b9be
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 0000ff00 00000000 00000000 8d849af3 bf8eb57a e3608fea 0abb0dc5
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 0000ff00 00000000 00000000 f0957217 2d87c5a8 769befb8 0549d014
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 0000ff00 00000000 00000000 501c3db9 1c2634bf 1338febc 662dcdb1
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 0000ff00 00000000 00000000 5208560b 3029b78d 68a6398f 7ddd0893
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 0000ff00 00000000 00000000 5e03fc29 b285b39d 03b9254b 6beccc1a
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 0000ff00 00000000 00000000 dc4ea628 911b21d6 a19c28e2 37bba515
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 0000ff00 00000000 00000000 467cdace 893c5b03 f7c0a63f b5fa6d2f
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 0000ff00 00000000 00000000 f9f1edfc 22a89845 34a86319 15f2be80
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 0000ff00 00000000 00000000 e95326d2 158048c8 8a64a0bf 59be8fe3
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 ed0f0350 6dd365eb 1bcfa92a 4db75da2
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 62ffa2d5 51f141be 09c2b4b8 b598b403
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 811a7341 0810d368 7a944fba 8c2db187
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 5d716d41 86d8ebee d46107c9 e689580a
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 30171295 a98ec36d 2e0be711 4f2d1fe9
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 f0015e01 ca15540b 21cb5ab1 ac427fe0
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 0000ff00 00000000 00000000 b27d8ea4 4571306b 285941ad d099a2fa
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 0000ff00 00000000 00000000 cf80a449 81a472b2 3f02b902 5331a873
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 0000ff00 00000000 00000000 8c7134f8 5c101fe0 a856f137 f0b7f9e2
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 0000ff00 00000000 00000000 afb74eb6 8ce42242 283c88fb c996e8f9
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 0000ff00 00000000 00000000 de9c09e7 2c4371b2 d68598a3 fd542cd7
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 0000ff00 00000000 00000000 b644c5b6 d9b39c14 df251f04 d100e3a3
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 0000ff00 00000000 00000000 60227b14 5446b9ec 29d6f141 aabf28ec
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 0000ff00 00000000 00000000 4e5ff116 74319409 a2701bcf c21ac2b8
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 0000ff00 00000000 00000000 df928d9b f5ee85d1 d2e6fcff 8ff1a089
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 0000ff00 00000000 00000000 655d7684 02a497cf 66472be3 51cb21ae
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 0000ff00 00000000 00000000 385c614b cfbb23f4 d8d2e9e1 fc2d347a
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 0000ff00 00000000 00000000 be160be9 d5f9377d 4ab8930d de644129
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 0000ff00 00000000 00000000 f71ffc4b 9cab4462 5ea652a8 14c64784
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 0000ff00 00000000 00000000 37283e06 0ed6eb3a b50d87d7 e634ea06
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 0000ff00 00000000 00000000 4f21b624 e648f329 2d8d00e4 e9b49f04
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 0000ff00 00000000 00000000 e4a3fe71 9b5fae1e 53820c87 1c58ec32
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 0000ff00 00000000 00000000 c29db687 ff297beb c5d6bec3 cb7ae3cf
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 0000ff00 00000000 00000000 21951dae 003c22e4 83d84db6 1a9de86f
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 0000ff00 00000000 00000000 f413a989 165bdbe1 8922a860 6797a8ff
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 0000ff00 00000000 00000000 e59016e4 fb6e32cd 65f00e08 30226a9b
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 0000ff00 00000000 00000000 229fd6be 4ee85e56 716cdf41 170ff3ff
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 0000ff00 00000000 00000000 b52fe913 83b547be 82862735 846a4eac
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 0000ff00 00000000 00000000 196d2d4f 8e9e6910 a5ca966a fe82b956
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 0000ff00 00000000 00000000 36d5b269 f4db697b ec722e8d df2ff182
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 0000ff00 00000000 00000000 5bd99f4a c5252d31 108e2fe8 3f2686a2
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 0000ff00 00000000 00000000 39c67c1f 1d0b1143 8f481468 8a074ac7
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 0000ff00 00000000 00000000 f4159e57 3ab56aa9 c3494b56 be2adf75
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00008000 00000000 00000000 db9704a9 ef263fce 5db55684 c96084fb
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00008000 00000000 00000000 dfeb7041 fa1db088 b7bc68f9 33ca18ac
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 31d60d2d 47f43f83 9df1d72f 181de12c
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 f9c6cd53 132035ec 2e18186a 2104f1c9
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00008000 00000000 00000000 2cc737b6 58815b90 33777112 aeb6800a
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00008000 00000000 00000000 9d94df0d 2a830476 cf2e099c 8d892ff3
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00008000 00000000 00000000 748b4a17 5b72ce83 1b3f3e4b 8728a776
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00008000 00000000 00000000 7d45758d e76bf3fe a7b55753 dcaefaac
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00008000 00000000 00000000 e66b7711 3e2e1887 b0f76cd2 4f19cd7d
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00008000 00000000 00000000 749fb548 e9504acc 8f4fcea3 995dd615
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00008000 00000000 00000000 35945e10 73b8316d 4304cd97 22139e09
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00008000 00000000 00000000 c0a3584d 8851beab bb5054da 54bde8ef
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00008000 00000000 00000000 cac47e18 33b1923a 2661cd54 3912c9f6
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00008000 00000000 00000000 8eea2fca 424213b8 432d7466 eec8205e
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00008000 00000000 00000000 e14c3c29 4c914482 e4297b22 9b74a9b0
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00008000 00000000 00000000 09298383 2aacc8c9 68fab5f3 3ac39074
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00008000 00000000 00000000 e6fda281 e47d10f1 913e2eef bc2d749e
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 85bfc2ed f03342c8 33575fab 39908df3
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 9ba088f8 8b002507 b53e5ba5 a7f72b49
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 ea1c882b b06e1f48 76e390fe 0da47a30
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 98a48736 42766b4c 51a4ab61 a91bb5c3
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 4ae41923 243a9d0b bcc8f725 f287d208
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00008000 00000000 00000000 2becea93 ace8c413 b7cc8723 a2239118
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00008000 00000000 00000000 54b29d30 73bc664f 9a9e7718 e88468d8
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00008000 00000000 00000000 e61b52ea 70fb72a5 f697bd49 e7aed424
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00008000 00000000 00000000 abd7dc9f 87a475f2 a2a09480 e550e8f7
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00008000 00000000 00000000 9b1e02fa f83ae20c 2f622aa8 3219519a
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00008000 00000000 00000000 14fba53a eb197503 a8df910f 321148c8
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00008000 00000000 00000000 1f4105db 1c722e89 cbc6bca0 37dc36db
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00008000 00000000 00000000 1754bdfb 10ec431e d2b3eaad a00edf7a
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00008000 00000000 00000000 f6fe2fd1 a5178952 af6b93b0 0bd11cf2
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00008000 00000000 00000000 d03063ae dd50c426 1acbb6a0 b0554b47
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00008000 00000000 00000000 2f8b0bf2 429ab5a5 a016a59e d471538a
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00008000 00000000 00000000 71f7c393 8f48b5e7 299ddc6a 55fcaa6c
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00008000 00000000 00000000 a71b7b5d 578afb73 0e7392db 96b694ce
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00008000 00000000 00000000 5a441f14 c83ec7d0 753ac769 38073516
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00008000 00000000 00000000 e4e6f8dc f53de139 45effab1 dc0996a6
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00008000 00000000 00000000 50cd0a10 c52757d4 7ff34684 bb68de39
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00008000 00000000 00000000 215ef309 6f0de2af b4b85414 7b736785
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00008000 00000000 00000000 8731b162 bd29d6fa 00f59b48 678bc88d
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00008000 00000000 00000000 c4606bde ddd5ed0c 5c9bc1ff 5ad36111
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00008000 00000000 00000000 cdee80d2 29fde63c 08b24838 4bdd7d5b
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00008000 00000000 00000000 69f07cb4 3daad6ee 23d91210 dd331958
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00008000 00000000 00000000 dd083841 75da0960 dfed0370 f375191b
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00008000 00000000 00000000 dfe5fc51 5c5afcd7 318a4734 6cac06cb
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00008000 00000000 00000000 0addcc4e 9a41fb4d b703f735 84e16f6c
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00008000 00000000 00000000 06cf3877 8a415845 dd99e388 407e5223
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00008000 00000000 00000000 de6ea0e8 e8222e4f 1c21646b b734df48
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00008000 00000000 00000000 dd143117 e8d7dca6 e5bed8c0 b263b96d
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 22f2e0d8 119db813 ef467231 87adf624
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 591be312 848da854 bc940af1 67bc8788
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 2590446f 41ed4294 1fabf395 9992d4d0
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 cb66370c 08d192e8 bb3e9866 aa7f9e33
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00ff0000 00000000 00000000 7a9b0472 38d53db3 9583ba65 84d57212
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00ff0000 00000000 00000000 29280b3e 2d6c8fbd 994dfe1c 593aeaa6
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00ff0000 00000000 00000000 dd008448 cd16543a 30df7d0f 3039bd79
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00ff0000 00000000 00000000 9f11a9e6 e603f66f 5a57ee92 93d9af01
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00ff0000 00000000 00000000 1345a1be 0f8a5c3f d1ea8039 4abbac6d
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00ff0000 00000000 00000000 94d5bec7 b9b0e28d d20cc7e4 af8f8d86
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00ff0000 00000000 00000000 0693f3d8 c0b81f20 3788c729 9cea29c9
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00ff0000 00000000 00000000 53fa683a f547a8ba 302b9e54 0558a385
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00ff0000 00000000 00000000 d20286b1 15b4c8c5 d23c8659 4710be03
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00ff0000 00000000 00000000 b6b46794 9185795e edd8901e 40d74d41
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00ff0000 00000000 00000000 34732fd7 ae767bd9 04cebe75 92815953
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00ff0000 00000000 00000000 b7326f81 17aaf702 caed628d a909f2a4
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 7b09863f 3274ceb9 e8ca6436 cd9fa04c
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 33044882 ca7f0d85 a60f44fc 5b4891ce
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 9dc3299a 212f0f0d 88c5f4a4 906b734e
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 9556fc2f 7afc82b3 3bc44611 4351e66d
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 dfce62c3 d3c5a2c0 4c1d6737 862d9293
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 f4f0b118 144c2c2f 26b39231 ea14c7b9
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00ff0000 00000000 00000000 b245315d bcf6c91d 754a7c14 2565e48f
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00ff0000 00000000 00000000 752203b4 ae13b9a0 e31fec08 eb692cef
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00ff0000 00000000 00000000 09df70d5 40f8d185 48efe5f7 ee1108a0
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00ff0000 00000000 00000000 136a420c b7181b55 deafcbae 1d5ee1a6
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00ff0000 00000000 00000000 a0d5b02b 733a381c 450b339f 7cff8df1
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00ff0000 00000000 00000000 c8926a31 a643a5b0 43107ff4 32072bc9
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00ff0000 00000000 00000000 a58e8a68 a6b42ff4 258b5e32 60b56a1c
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00ff0000 00000000 00000000 fcee65a1 f4d681ca 3505111a 9a6acf37
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00ff0000 00000000 00000000 b0f43b3b 1c31e2b7 67e8de1c 31a02555
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00ff0000 00000000 00000000 ecc48ee5 981d2b49 fd7a22b9 ec415eca
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00ff0000 00000000 00000000 4970651e 85676890 def6e22c 4f7cfaec
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00ff0000 00000000 00000000 5d3c6b96 d38d2378 b276ece6 f5fcafda
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00ff0000 00000000 00000000 9a8d3698 ab0ef629 959e5d2c 56c0b421
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00ff0000 00000000 00000000 9a344ab0 8f692a72 859b7958 da1b6e56
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00ff0000 00000000 00000000 db668406 9292601c 3f17b216 7d4a1edf
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00ff0000 00000000 00000000 fcbbbf78 df5a0eb5 d3db5451 cfc752a7
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00ff0000 00000000 00000000 23810f43 e8b16515 aa4c4b07 c1ba936e
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00ff0000 00000000 00000000 9577f463 e0444f19 420d39d5 df310656
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00ff0000 00000000 00000000 c87afd4b 878b17e4 058a30a0 80f8c3c8
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00ff0000 00000000 00000000 865e2af9 48b7f68a 41bd6dfa 342ba0f8
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00ff0000 00000000 00000000 2ea49763 e91477bf aa5d51d1 74e9517d
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00ff0000 00000000 00000000 d432cdeb d7a03de6 e6da11f1 7acb2a00
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00ff0000 00000000 00000000 e6d53827 4fc4e478 71542a8d 1f3bc6a8
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00ff0000 00000000 00000000 e3847d0b e65bbbb4 5bb78b81 94a1ffa8
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00ff0000 00000000 00000000 e7d6bcdd 45051fe4 252629fc bf659cc5
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00ff0000 00000000 00000000 41f95399 e7959014 d2b9e413 1f39e87e
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00ff0000 00000000 00000000 c2b31aea d398aa7a 3b1031e1 bc68c109
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00800000 00000000 00000000 a00cec5b ca487f61 359cf73f 70d21378
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00800000 00000000 00000000 4ec9a531 01d54c62 bf5bb168 3936a9dc
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 88d2d6f8 39b8dfdf 2c4b698c 1777afa9
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 7420b78f 0c252bbd 9c15e937 310f3172
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00800000 00000000 00000000 1ef12f67 a60fe50b 69094d0d 8bff4098
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00800000 00000000 00000000 8efc8373 d5525958 00b1ca78 1a00468b
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00800000 00000000 00000000 4c8af3c6 287a3960 bc819b5c ccd70ef3
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00800000 00000000 00000000 be01d2cb bcb36836 6d07da5d 7b5f5131
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00800000 00000000 00000000 f80acd07 8c3fad47 a43a6c1d 69d4c38b
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00800000 00000000 00000000 0366f28f b42cc3d2 c48f4210 fc323078
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00800000 00000000 00000000 b939bdc3 f022b43d ad77aeb2 9873ef1e
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00800000 00000000 00000000 8348845d 3d6f6b77 5d6c5431 f41b1d32
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00800000 00000000 00000000 1a0d422b a516883d 2c9cbcbd 2e3e99aa
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00800000 00000000 00000000 d86f62b6 f25abfd6 d3552a3a 66b91402
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00800000 00000000 00000000 a7ec3af6 70d67a95 b65e8dd4 ea222f76
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00800000 00000000 00000000 ce5df8a5 01643578 caa889a5 e2705fd6
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00800000 00000000 00000000 3c6ad46b e7e1f139 39fbf5ef 6f1a3aea
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 234f33d3 4fa04e77 411d7035 39268f19
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 0b14f1c3 cd9af14d 539e70e4 79825055
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 40e73acc e9b3b945 10196cce f368f24b
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 836ff74a 9c70652a fea219a9 8b74d93f
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 0a5591da 22b02386 4d28d374 836fa930
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00800000 00000000 00000000 e38da49a 17af6e25 348ceb8f ab48a1a1
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00800000 00000000 00000000 aebfe231 846aeb9c fa9738a5 f6f29436
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00800000 00000000 00000000 347096a3 b95cdaea 860c65c8 6bd32e14
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00800000 00000000 00000000 b5d23f22 30beb254 e19e5180 0876af03
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00800000 00000000 00000000 7622487e bfcbebc8 d543d53a 32525da0
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00800000 00000000 00000000 f110591a e77c10d2 131fd7c5 7866db43
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00800000 00000000 00000000 30a66ecc ae6b7e48 74bd80d8 76b29af8
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00800000 00000000 00000000 58d0bb84 6706c78b 45009e22 e2785f61
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00800000 00000000 00000000 4c61bfe6 7c955151 e8001ec5 d0e615d8
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00800000 00000000 00000000 6f3ad05a f461f745 93857d8c f4905c98
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00800000 00000000 00000000 3bd3b603 e4d94cd7 26d0b77f 02c0d7a4
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00800000 00000000 00000000 d157ff8d 0d02e8e2 684207f3 b9bcf112
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00800000 00000000 00000000 339e5c56 076e7a8f 14c0c415 b969eada
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00800000 00000000 00000000 37433a96 db919da4 81251cf1 f4e33e0a
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00800000 00000000 00000000 f8347f15 c53d6bd6 d45169e6 66d75179
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00800000 00000000 00000000 df6f61ec c24802e5 9ac4c23b 567b0462
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00800000 00000000 00000000 75201044 9748cf2d 2863ce41 abc2f9d6
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00800000 00000000 00000000 4e472868 2032a8ef 57b542a6 87a7ba77
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00800000 00000000 00000000 11dc900c 177c3c50 ff18eb90 1ae824ac
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00800000 00000000 00000000 d96eb7d0 2278a9f7 1cc3be75 2c605110
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00800000 00000000 00000000 d807febf f989c784 c403114d 4216b1ee
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00800000 00000000 00000000 6311b004 c28fb046 5a200f83 bb7d751d
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00800000 00000000 00000000 26188d57 412bf765 4600984a b9c9d357
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00800000 00000000 00000000 844374b9 abff9a5f 96815949 b22f6961
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00800000 00000000 00000000 ffac52fa 1f7d34f9 a9738dfc 47759b16
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00800000 00000000 00000000 fbcf1b8f 4e82c5d7 124478f1 bf5d6237
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00800000 00000000 00000000 d563c78b 35d4deef f9dff8ba fa4c3faa
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 3fff9d46 5b0693fe a650b70e f7364259
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 c2fa97cf 135f3c99 5e5827b4 9f23e516
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 595f9ac4 d3ce4ef5 6e35b798 05625328
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 440ab580 5e2cb77e 20834e4f 07c5cda9
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 ff000000 00000000 00000000 5cad76b4 2d10781c 88281342 86f4b2ff
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 ff000000 00000000 00000000 0baef30c 35fd70c5 0405f817 7b2ff157
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 ff000000 00000000 00000000 91c7c79a a6c35ec2 c68d26e3 1d67d346
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 ff000000 00000000 00000000 6a06e692 9dc01cf5 643390ba dcf9a4e1
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 ff000000 00000000 00000000 2846ce5d 2d5c5293 69ef3bf5 14eda2ee
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 ff000000 00000000 00000000 073bcfeb c7511a06 e6e172ad 04256d1b
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 ff000000 00000000 00000000 7eedd694 783e76ea a54f18ce 73358e97
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 ff000000 00000000 00000000 ce6d599c a1e8dba1 c792f716 e79f5e37
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 ff000000 00000000 00000000 9492bd38 cba5a7d4 b2f61619 c4d1d9ac
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 ff000000 00000000 00000000 2f993455 e8b24e8a 03463cba 76d284ee
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 ff000000 00000000 00000000 98675030 cdf6a1e1 ae7c3e3e 75852eb4
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 ff000000 00000000 00000000 8b15c94a 9e1e7937 dffda9ac dccd4d48
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 b22116ab 9fe03ef6 c537818f e47727e0
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 8d56c361 b300372f fb93f6d9 db48a513
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 d5169544 537df03d 51194829 50f20d3f
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 d262b945 f3d67451 2580e1f1 bd4a686d
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 e869c6ed 0a359231 fe48009f f52ec3dc
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 5e06823f c5938edd 13af24a0 27958c66
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 ff000000 00000000 00000000 c99e41d0 33024c8d fe9d5339 a63a5f24
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 ff000000 00000000 00000000 3290af6f db2d7d1c bcd8a1a8 3e8bb439
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 ff000000 00000000 00000000 129ea6bb 5d08d671 f62ef596 cad420a5
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 ff000000 00000000 00000000 bf9ecf25 dfe7fe89 62867a95 2683b953
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 ff000000 00000000 00000000 03bc9cda eaaee763 88c08cdf 7719a09c
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 ff000000 00000000 00000000 ad437fdc 6976af30 f4ec20b6 dfc29017
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 ff000000 00000000 00000000 eb301301 290c523c 45eee9c5 d64bf7a8
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 ff000000 00000000 00000000 3a342e30 d00ac78f 5b41b3e7 bbb4d824
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 ff000000 00000000 00000000 9de8ac05 ce583257 b2c5ef4f a57f7c76
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 ff000000 00000000 00000000 0a2ad7b3 b4d4d02f a71b913e 274cc7ad
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 ff000000 00000000 00000000 a5d2501c 04dc2b1d e116388c d560e1d9
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 ff000000 00000000 00000000 070a7bb7 d1a2432e bec1284d b10c0250
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 ff000000 00000000 00000000 3cbceeed 85a455f6 136cda60 453b735f
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 ff000000 00000000 00000000 0aa40388 0316fcda acbc1c87 bc639a3e
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 ff000000 00000000 00000000 2a77b2df 5082a5a5 b5527d9f f113ea2e
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 ff000000 00000000 00000000 d052815c 62de4af5 c0d26b42 c4aeb933
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 ff000000 00000000 00000000 7d751d2d 8dc0e76f 275d7b8b df4aa40a
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 ff000000 00000000 00000000 681d9e43 febf6b94 4b026a8d ee1485e9
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 ff000000 00000000 00000000 00041b8f f701647b 5444ac32 d89fb67c
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 ff000000 00000000 00000000 e9858209 2bc56022 16004c89 85bc27b4
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 ff000000 00000000 00000000 4158a0f1 f4c90b15 c1cb18d3 63d6cf74
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 ff000000 00000000 00000000 3c663c9d 72ec3fe3 2dbd3c61 13009c67
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 ff000000 00000000 00000000 c4a83fc3 68898afd 597344cf 21084208
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 ff000000 00000000 00000000 7fab47bb fcd840f2 cda838c4 6ae55be9
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 ff000000 00000000 00000000 a0473fb6 d208106d 8b769b3a 24d4f27b
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 ff000000 00000000 00000000 844c06ae f167b931 f701a614 7ec8b726
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 ff000000 00000000 00000000 37bd10fd 09a717ef 3b52e5fa 4a6937c2
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 80000000 00000000 00000000 5f0ada1b bd050790 dcaf5e38 298a17b8
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 80000000 00000000 00000000 5773f53d c2e1b603 87014c86 e34ec098
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 414196fd 2b2dc69e 78149e7c 45b5f326
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 1f875ed9 ac5906df 12e5f6a7 e233bfd1
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 80000000 00000000 00000000 dcfc2a48 f8ba776a 5c4a2812 8a16d7be
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 80000000 00000000 00000000 2a3576d3 6629f24d 13f14b9e 3d2ca84e
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 80000000 00000000 00000000 3e16e8a7 fc4d8a08 0a01ac1e 1af11bec
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 80000000 00000000 00000000 96593166 0238eabc bbebf20f 0f504522
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 80000000 00000000 00000000 8af3b216 dd7acd2b a3e33e1e 78b046e4
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 80000000 00000000 00000000 9a054567 fff1d369 15556300 cf32fa94
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 80000000 00000000 00000000 f5a60b19 7d5e3da6 84d86206 9e1853e9
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 80000000 00000000 00000000 94c67275 4b58d229 ed89be2b 74d861c9
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 80000000 00000000 00000000 63a9b261 caeb28c8 2ef06ebd f2e5792a
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 80000000 00000000 00000000 38f259c6 82cd5ca0 88012938 1b5e554e
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 80000000 00000000 00000000 f2573b0c 7adc711e 19ce7393 e9f7de3e
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 80000000 00000000 00000000 6b8acec2 ead9cca3 7fa50710 5d15e514
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 80000000 00000000 00000000 8c7993f1 e3203144 84cab4b5 72020dbb
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 42d7f77d f086fc2e 3e73a287 c07d7ebc
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 6bce9267 5e248dac a2ed0ce5 aef8fd8f
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 4472cb80 f16e7a81 1ae5d21e 5f55c422
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 aa8c96e7 7081d2fc 29cae09f 98911fa3
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 edff19de 058ba50c 77d23430 a67d3096
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 80000000 00000000 00000000 249e0ed9 233a0ad4 1eb99295 52e5de17
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 80000000 00000000 00000000 5cbc4013 a507ff7e 19c0ec9a 98a429e1
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 80000000 00000000 00000000 b82754b5 f5be7d8e 4ffa8942 52e2a259
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 80000000 00000000 00000000 c1dd067d 61dfed2a 9fa61288 846d0e65
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 80000000 00000000 00000000 5eedd38e daf2e6c6 efcbf785 0773d069
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 80000000 00000000 00000000 bebaae38 bf214df2 00b1720c 42177b77
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 80000000 00000000 00000000 23e1c82a 5d9a8441 4d3274da 8db3ac26
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 80000000 00000000 00000000 1612e16c 8ce98dcd 39b1bd24 45addfa9
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 80000000 00000000 00000000 370cafef 3f7e2898 73255314 2a49538b
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 80000000 00000000 00000000 2d984e0c 528466c2 a95bee17 d09bc557
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 80000000 00000000 00000000 04c3d191 76c5b6f6 15e575df 1579abf0
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 80000000 00000000 00000000 cfb9c656 406d2556 357a2e8c bea5ee32
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 80000000 00000000 00000000 18978a0b 3832c66a 2e2d7273 683e77c6
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 80000000 00000000 00000000 1234972a 25fa70fa 4da76fce 53941394
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 80000000 00000000 00000000 a8f77508 14259e2b 210358b5 98cd4738
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 80000000 00000000 00000000 8976de9d 368c66d2 ba5f8bbf f4881147
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 80000000 00000000 00000000 aa9648cd d926107f 4ef3fb1c 3e9b4cff
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 80000000 00000000 00000000 7de770ee 7198b212 30e3fb87 1bf1945e
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 80000000 00000000 00000000 00e0ac25 c7ceb630 cdd4686d fa763bdf
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 80000000 00000000 00000000 43b3b752 af25c906 b1b4c5f5 a060418e
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 80000000 00000000 00000000 198dd040 e1df7ce3 2a02dab1 d3af6e19
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 80000000 00000000 00000000 600c5000 a1452641 eb1394d7 3afe4cb5
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 80000000 00000000 00000000 00966e72 fd68133c 2fd0ca6e be23b3bd
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 80000000 00000000 00000000 d4a2cb91 1091cb54 cf890039 ddda004f
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 80000000 00000000 00000000 bbc2523d e460d59d 48e1dd0e 60e28a17
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 80000000 00000000 00000000 cfcb3264 9ca26dd6 94e27470 4c925066
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 80000000 00000000 00000000 6735321b 61e112c7 afee373e 46f1395e
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 dd64a2ff 5104730d c0ae788d a01d6a2b
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 e70ebc93 76c6aad5 80ad83b3 62d2754f
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 7a62d1cc de10fa0e 0d8b1e8a 32776f76
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 055823a1 c06b9761 f9bd3fc2 e878afc5
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 000000ff 00000000 37cd795c 1ccc8adf a68d762e 553c7112
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 000000ff 00000000 03b8471b fb53325a 12d2e358 1c5da90d
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 000000ff 00000000 a78e262c 3b1ba467 3ba757f4 e692d21c
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 000000ff 00000000 7665303b 4e3555cb 36df84ad 2fb325c6
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 000000ff 00000000 364b771f 291c0c78 13a1aa88 c494c221
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 000000ff 00000000 7c36b039 692e4b12 50a2349c 85410d4d
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 000000ff 00000000 9964202c e48b3418 b31c5ede d22677c6
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 000000ff 00000000 1883bb94 b1301868 24a80f7e 285b3455
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 000000ff 00000000 f83701ba 2054306a 41cc63a4 c107d44d
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 000000ff 00000000 e7ec839f 21a2f540 431d62b9 dc559e31
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 000000ff 00000000 193c9ee3 710ca9c0 4d2a0071 2bfd6a4e
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 000000ff 00000000 9481e88c ec053c33 9c4983da 8e71653c
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 35a186ff 53d78ecb 6c2514a6 0bc7ace5
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 30b292b0 288f14e0 16a3ed41 5e9a1e8c
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 d3b9ae42 53ea5e05 ea37344c 3365d0de
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 873b4e28 fc4c21d5 970a4cb3 3f02ee17
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 431ef8cf 59c8dfd2 f86178a1 847b60cf
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 60af461e a413f0ba a76cb9d6 1f633554
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 000000ff 00000000 803a06af ec3f8653 c212c9e0 1cb31cb2
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 000000ff 00000000 017e6914 0f535266 0ae93b38 cfe4c9d3
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 000000ff 00000000 b9d94a88 1c64dd00 c747a4dd 171ed6e3
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 000000ff 00000000 0b5675f7 942da36f 345f5696 0bf565c3
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 000000ff 00000000 c65b64c3 da4f3f6b 2588c0a8 66504ff2
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 000000ff 00000000 0cbb3a66 77613276 0dc528a1 31a876f3
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 000000ff 00000000 a06a59b7 aab0c4b8 ef1aabd3 a33c70b4
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 000000ff 00000000 b02a5efd 857a0543 d8ef7568 6726adf7
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 000000ff 00000000 52fd0dfd 15561258 c6ab328b f9557afc
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 000000ff 00000000 89c6338c d18771e7 7c12f02d 3d0955b9
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 000000ff 00000000 68dd0297 3442908f 77dfe98b e52ea361
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 000000ff 00000000 50b1e8eb 9b537afa 147b4051 48d80416
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 000000ff 00000000 f6ff5eb4 30f6b151 630a56dd 5a0b422f
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 000000ff 00000000 be82fb06 15d2509e 725b861a df97b972
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 000000ff 00000000 b6c6a327 885044c7 53b59d61 d8e11374
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 000000ff 00000000 b19247c4 4e3d2d40 a3dc5fb9 e9a64a87
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 000000ff 00000000 f6accc79 61a1a18f c10cde1c 82263b48
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 000000ff 00000000 e4080bc3 9f03cf41 73813e63 55920cbf
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 000000ff 00000000 953bd9b1 f0adfdbc 8d1e8637 fc3aae24
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 000000ff 00000000 67aac33a bc41dc9d 9e76a5d3 d05fb0cc
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 000000ff 00000000 9aa1ec74 abeedbf3 b69362c4 8bc7fef0
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 000000ff 00000000 e2a38fe5 e357ad6e f9428603 1da81cce
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 000000ff 00000000 38aa15a5 571ef34a c022ddce 78d900b2
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 000000ff 00000000 12facc68 09c6ab68 d036ec58 02fb6181
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 000000ff 00000000 e16cc4ad 54f590c4 e1566ac0 32f9c6a9
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 000000ff 00000000 265d4bd1 c1615d4e 09de0cd2 eb487c57
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 000000ff 00000000 ee505d84 9d283ee1 779ab900 0827c83e
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000080 00000000 28b2328f 0fa5f615 8316c9ea e541fe16
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000080 00000000 5e0d37b7 d3a150e2 0a8cd83b 43948be9
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 c7241b1e bb6537ef a62023dc 0ab19d6d
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 acdb9793 b6762963 011e1e60 736b471f
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000080 00000000 a04030ca 37035c35 3c83185d 66977ad7
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000080 00000000 f87e3660 29b62f23 1fa911e4 8825ac2d
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000080 00000000 0405098d 5f586df6 4d048c3a 5f6625a3
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000080 00000000 b570ae35 55111919 6cd58d47 ffdf357e
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000080 00000000 e61b9f3d cc504fd1 e55cc705 e1164506
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000080 00000000 d4abecca 32245a7d bf274520 781bf659
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000080 00000000 8cd339b8 f7292101 db49022d 52747449
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000080 00000000 88f0a81a 9ba3290c e738881f e27cec9e
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000080 00000000 b02ee6da f5f9bc83 62de8926 fa7ee983
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000080 00000000 8c983a61 1ae74967 5bd89970 5b8d7c6c
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000080 00000000 2f0b2de6 4f52e7e4 61cbdefe 02fef405
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000080 00000000 7c76e448 a783f64f 0560b403 255a28a1
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000080 00000000 f157758b baf4ccb5 2d66ebe5 6c94c55d
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 a1b67bff 447e0b5e 4c3ddd64 072f1022
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 4b52c613 834a15d2 4cd2b88b c7810251
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 5a306e0b c7da868e d032dde6 5c06d858
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 dc5360db ed5d35a2 439064ac fce2a0ec
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 6289382f e74206ba 91690ea6 4a7cd082
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000080 00000000 890c9ecd 757b4645 0c116ba9 3345c351
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000080 00000000 cc566acc e04aa66a eeddafe9 41e2f7e7
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000080 00000000 f4d61444 ba5cbec6 58d7bb95 620ff6f3
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000080 00000000 906a517a 5f65728b 59ea2a88 5c307e01
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000080 00000000 e7122e90 7832983a 96c5af52 f5d242ce
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000080 00000000 fbb8d451 7d889eb5 96c8d138 0ffc51e9
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000080 00000000 dab30e2a dbd9f3e7 6bf73eaf bc3a8d7d
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000080 00000000 bc7d6d85 b69aee83 e8f71720 70d09ae8
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000080 00000000 5fa55d16 9908c07b e7b4ee98 134617f1
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000080 00000000 eaeb1cb5 1ff6b616 acca2703 75221d78
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000080 00000000 6b77d622 8646ca40 6028461c af1903b7
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000080 00000000 03900db2 4aa298bd 10dcbf6e 6fecc45c
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000080 00000000 842f5cd6 646ba731 8d066c6f 716cabf6
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000080 00000000 93675dde ccd2485a 52960f2b 66bf4a21
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000080 00000000 78d8e9c6 862bc175 c09fed18 1256f338
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000080 00000000 77a9b9d1 f964ad82 27f1b1fb bd8a0bd1
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000080 00000000 cbc664b6 810d4747 ad8aa88f 806fbd63
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000080 00000000 8435f62a 91cfc4d9 0eed6cd9 91cb2208
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000080 00000000 8f321c01 5b3edf6e fb7991a3 bd289447
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000080 00000000 eea6f4db 41de03f5 182895c1 b53098a7
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000080 00000000 3780b16c 3bd637f8 95636506 6da9be31
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000080 00000000 293a9962 66a0cdff 152b3b0d e29416ec
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000080 00000000 1e80c35a 26391dc2 1411b393 6d83ef15
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000080 00000000 63ba81ae b5d0f45b 2167d0a7 f6753e70
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000080 00000000 ef14eb2a 8375a2fb 6079b492 a44dc69a
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000080 00000000 1be30298 84e8d9e2 5cd64037 d7689860
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000080 00000000 d2d55a42 a400c4d7 12d0cc63 3191768e
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 e207ecb3 210b891c 856c8786 d570d667
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 473186b1 9247f498 84e2cdb1 0fd6079b
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 3ee486a0 e30bc9a7 cae61162 3541295c
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 39342ae3 0f79c530 a2b86b64 6874fce4
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 0000ff00 00000000 17b01843 1999a4d5 38d3003c 8ba22700
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 0000ff00 00000000 37abbdf5 f6ed2b16 302e3c8d ae41ef09
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 0000ff00 00000000 598b800c 85d7af3e 4b7c9da2 7be5610f
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 0000ff00 00000000 1b0aefe6 7060079f 4455577c 9520db4a
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 0000ff00 00000000 91431f52 816d61a4 7abc1dcb beb68973
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 0000ff00 00000000 39a6d5f0 3ab9c84e 7bb3aa4f d2439736
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 0000ff00 00000000 04953ce3 1f590731 8326bcc3 76545701
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 0000ff00 00000000 eb2aae06 ab7c74cd af2b98b8 938db69f
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 0000ff00 00000000 3f706478 3fcfe475 43c02841 3da4c11f
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 0000ff00 00000000 2aa708ea c23d23a2 441b0061 6fd2d232
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 0000ff00 00000000 5a7d4288 10fe9cfb 328bbb69 24d5d706
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 0000ff00 00000000 b40c18cc 876c614f dbb42b2a b7ae7994
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 94b1ba11 1454e234 5078f9ba 253fd486
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 1abd0a2c 9890ccbc 99eca8d6 440a1934
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 d20d70e9 fd4cd32b d5ccd103 8d323b56
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 7dbc1d85 8dbadddd c86dcb38 75eb4f48
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 bb652524 cb8eab7d 2da04670 63a33b3e
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 689a1ecc 6039e2be 2cd5fd3a 14e563b2
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 0000ff00 00000000 b16bea2d 967c4577 0df15037 e4886893
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 0000ff00 00000000 b496dbe0 9ad71f56 070fc5e7 b120b9a2
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 0000ff00 00000000 e0ce7d99 a52b4a27 e88b11f4 4685a7ca
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 0000ff00 00000000 b770bfd2 97e22420 5f29089a b4577e2c
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 0000ff00 00000000 39bfa7b3 b92a5943 9ed1915e 48a33f8d
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 0000ff00 00000000 830af295 4eaa5e63 019f24d7 aec4a78b
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 0000ff00 00000000 25137691 347525cd d32fd26d 9305c2ce
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 0000ff00 00000000 ad2dfac0 2e2c8c4d 7fdb7b6a ca5e0859
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 0000ff00 00000000 87ce0724 1b64153f e2ae361f 07572129
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 0000ff00 00000000 bb8c5b2e 843b2948 208de4e2 cdeab0ad
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 0000ff00 00000000 b944aa9c c45f5a12 f1ca4a9e a0456e0b
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 0000ff00 00000000 40b417b0 a2a007c2 85f8319d a3756891
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 0000ff00 00000000 f7a5b1a6 06a4b50c 686df503 2c847a65
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 0000ff00 00000000 9bc2c697 c68ebdda 8632850d 1caa3240
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 0000ff00 00000000 6b6426a7 7d75282e 8674bff4 b5375972
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 0000ff00 00000000 7120e227 60337a2c e5057c45 044f5b94
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 0000ff00 00000000 9726bb5f 8047463b 8fe61df7 12ffdf7c
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 0000ff00 00000000 753e008d 82416d3d f65cddc2 7b6ccd1f
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 0000ff00 00000000 72bf7410 06ab16a1 a7d39ea2 bff4f0b9
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 0000ff00 00000000 6cc08cf8 f5c5e856 5867ba98 eb67e26a
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 0000ff00 00000000 5da7e2fc fcd7a11c 8d858c12 f65f99e2
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 0000ff00 00000000 87f146c1 5898085a 37a4f313 6d3018c5
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 0000ff00 00000000 8dd15ad3 0c7c3618 83d72028 3884bb9f
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 0000ff00 00000000 0c5b6d80 06845859 8c5feea9 89d16738
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 0000ff00 00000000 2df31a0a 729ebc03 67e18942 f9f32def
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 0000ff00 00000000 360c4e8a ea0dc3f7 9553d17b e974fec4
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 0000ff00 00000000 9a7f1259 37d979c6 ce278c27 96d67bb3
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00008000 00000000 ff8b4859 ea64fe49 f4087406 fc4b2f65
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00008000 00000000 d378a434 2c15de1d e24a3c41 1aafe6a9
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 e9352493 e2655ea3 916a121e 984ad64f
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 487ee61d 2c252f77 47c1f591 eafcf518
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00008000 00000000 5be2f0c5 2f9bc90b 6636fb8a 3c95bb55
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00008000 00000000 c852daa3 2dc271d9 5259cd5e 0e1a8cdf
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00008000 00000000 36fbd56b 352a20fc eb27648d 8b9ade31
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00008000 00000000 2670d668 deeddda4 383006f4 8998f35c
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00008000 00000000 04910224 1a5dbc0b 08a0163c ace7a017
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00008000 00000000 910c3e65 b3e85fbc cd168602 ddf8e63a
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00008000 00000000 a7c3fe43 884bbe51 eb9967f2 cf0c575d
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00008000 00000000 692a2238 531c9c29 afa6d025 0dd6445d
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00008000 00000000 9f3f5308 0d79dd3b 15e080d5 fd8e4dca
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00008000 00000000 b92f2227 df6749aa e3c2767d b0e4e214
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00008000 00000000 e19300ae de40a7b3 b0776433 df508342
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00008000 00000000 adb4da91 ad928796 8a063cfe cfe98a48
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00008000 00000000 9a196e77 eec0b6a2 0f09da71 77f0b9a7
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 a1423831 92b09a92 1b59db81 97877bc9
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 a9803eb6 c2150f50 f3f4335b 769870b5
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 bc228b32 1c261956 c258d812 d53f8dcd
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 e4d4d995 66a88f32 16924d5f 131e87a3
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 11f1fc59 0d452e4b 22a34320 d6837e2b
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00008000 00000000 e9a5f770 5ce1166e 2c3a0b84 2ba27e02
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00008000 00000000 211f56d5 455fb285 809479ad adc82395
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00008000 00000000 e1dcd656 8cbe35c9 1b1da938 6cf939e7
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00008000 00000000 c96bc0a7 cc55c189 1c33cadf fef12577
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00008000 00000000 e2c7cee9 284c6c94 f111b06c 7c94f947
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00008000 00000000 e6061948 d5068dc4 2ad66b1e 69796b8d
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00008000 00000000 263b16fa d57ae39b c5721991 559c3496
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00008000 00000000 424d82a4 2de34feb c9ea8fde 2a795a77
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00008000 00000000 e38c8441 d997461e ec59f5f1 209e8fae
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00008000 00000000 78ff893e 731b1680 35c09a8a 2707177c
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00008000 00000000 8f2c1884 74f32a0f 5a6e8255 f2cd90b5
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00008000 00000000 30d1e593 bd0dddce 4c3300c6 bf4cce98
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00008000 00000000 62d7584f dba38064 c5804177 c1523bc6
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00008000 00000000 9a95ba58 a8d89e83 78abc8ad f5e7d2cf
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00008000 00000000 ba70ac88 361c8ab0 22c5c925 ad11aafb
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00008000 00000000 2724e7bf 0d5370e4 f73abf99 6f458b64
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00008000 00000000 d6bde385 73f0a1dd f741c189 645bf361
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00008000 00000000 b923575c d74cfa76 4cf13d38 89e164be
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00008000 00000000 2e1b196d 1262def8 c49e9776 212320de
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00008000 00000000 459ce8c6 b1cfa83e 432d48f0 e8b5bd63
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00008000 00000000 e419fbf3 af62d307 f56ce478 b71545c2
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00008000 00000000 f388f74d 6b2771e0 b07f3b19 d978d23d
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00008000 00000000 38536d42 0bc4cb6d c6458036 0f9dc83c
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00008000 00000000 3349b5d4 35dd0907 fd7807ee 2686b306
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00008000 00000000 b21c2bf9 1c4628f1 5a2141d6 38d7c260
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00008000 00000000 f94b8b78 38e02d43 5af1f50c 20479c8f
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00008000 00000000 851cb311 34296508 baade6b5 ec7c625e
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 4fa36bed f49b0f68 f68454e1 8f4ffd6b
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 0ed25b31 17d37f27 63fa0d94 d9669710
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 e358a9f1 f2635fdd 8f93e471 97ddd54f
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 9021c525 2f77fcf9 2bb35ce2 99d6c5ea
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00ff0000 00000000 6e6685a3 75fba10d 1d2ed31a 813a318a
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00ff0000 00000000 1556fb5d 5b90d443 78106e08 69b66c5c
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00ff0000 00000000 b601a9a9 fc7333bc 69067f14 4492bee6
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00ff0000 00000000 8a3d63e9 03147c09 5c30d175 3222a38f
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00ff0000 00000000 216a0bff 6e151caf c631b665 9b6d7527
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00ff0000 00000000 45db8411 309a25f2 4eb85913 aa7be9d1
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00ff0000 00000000 a3adade5 5f44b75c 453fea47 e259fbc2
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00ff0000 00000000 1c87faa1 ed8f4de4 b985e974 d09eff50
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00ff0000 00000000 5073b96d 15f38001 705963cd 5cb0103e
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00ff0000 00000000 db35c200 3f6b4da2 c9915de2 218ff3bf
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00ff0000 00000000 47cd4aab d752d014 f28b860c a1bc04cb
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00ff0000 00000000 a285a077 6e47cdc9 98569e8d c677b518
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 4b9c3596 92c11f50 c97b5915 51e6898a
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00d14d89 38006c1d 7bc5afc9 cfe16969
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 f207a99e 33e90e8a 48736b6e baf80a74
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 9106c865 646d84a4 dcd683ce 4182f6ad
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 19f21514 78c6ed2c ee689dac 9f2df2d9
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 8bd79976 ff8adaca 0130d1f7 2b06140b
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00ff0000 00000000 4a70c7e2 356656c9 7c9e7d56 820e892a
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00ff0000 00000000 c57855ef 829c70f3 8ce2efb9 f3d34560
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00ff0000 00000000 06520b39 be42e64d 30377268 5264ee53
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00ff0000 00000000 eafc3b62 e9f93279 7ebe1830 515a177d
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00ff0000 00000000 c9a49b3a 07b4e3a9 418deeef 13559144
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00ff0000 00000000 54b4f3ea 7d21dd47 ca6c3c92 ad216979
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00ff0000 00000000 74713ea7 12ad5451 8671dbc1 d57d9d75
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00ff0000 00000000 ebe4ecb9 c31eba78 5a6303bc ee4c42ca
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00ff0000 00000000 3dc002f5 52b17469 8298788c 7537b37c
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00ff0000 00000000 41b45326 fd956649 46486ae0 86ca0006
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00ff0000 00000000 2eb13676 7d591e27 e6713fe3 74bf381a
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00ff0000 00000000 5c3e62f5 5fa35cd6 e42d2934 8ea2df61
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00ff0000 00000000 b269cb2b 5ea85bfb 2a8ce1ab fa783c04
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00ff0000 00000000 eb6c4f88 4ae25fa7 975f094c bf74c4bd
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00ff0000 00000000 822f96a4 47cb8dcc 5b65d0ee 00592c4c
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00ff0000 00000000 9e913667 d144a7c6 b02f5136 7558771c
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00ff0000 00000000 5da84c50 b88e33ef 820698aa f8e5d652
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00ff0000 00000000 e04d1713 be1bd333 2cac27c3 7cef40b8
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00ff0000 00000000 57c02c7f 1940a93d 5f44006e 903339b2
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00ff0000 00000000 0060047d 49f3a5a4 a9da83fa 5bd5d855
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00ff0000 00000000 7c232cfd 483abf9a e0494b22 ce559af9
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00ff0000 00000000 e2e3d656 7055d469 67f35dc8 a135cf8a
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00ff0000 00000000 1a50f657 df2bdd5e b594ec19 ffe9269d
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00ff0000 00000000 35bc3c82 eec65419 99bc3f75 1645e084
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00ff0000 00000000 d055bdad a21ab0fa 6f5c68c8 2871b20e
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00ff0000 00000000 8cdb6d07 0331f252 829f3fdb 5fdb7e77
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00ff0000 00000000 03e0b8f9 aad821bc f95e2a0c 51feb93a
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00800000 00000000 e9080079 057151f2 6d995910 750b5673
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00800000 00000000 fa63d562 9947e6db c9939d4c 6bc5f1e3
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 8c275b4f 3307529f 0205d226 19fc0965
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 994f4ebd 177adfb5 f0b7ad06 2538baf2
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00800000 00000000 a8493f2e 2fe47ed2 75b7ee41 9f2bfb4b
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00800000 00000000 7f7dfec1 d7acaae6 5d90e279 40b20fa9
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00800000 00000000 e137e761 9e68178d 63d6f810 16c59e33
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00800000 00000000 feb6ad7e f650069c ed4fbfcf ec8eaea2
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00800000 00000000 a8fdbcba 7cc58b23 7567a9e8 0a431787
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00800000 00000000 789c95d2 6fe20176 b35d830d 2e89a3ea
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00800000 00000000 9817cdaa 1314c2a3 a7e3e005 91b0e928
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00800000 00000000 7b56644e 2f5a731e 0f8bc3c3 955e6def
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00800000 00000000 435ec10c f48f1cc9 b4097238 b9e9e8b1
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00800000 00000000 b5fa1cd8 39c43e5e cc5812a4 d8ee89a0
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00800000 00000000 88ecfd91 bf0c0a69 e8634b97 54642a0f
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00800000 00000000 4b36b2e9 1a6251f8 33fbf583 e799e32a
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00800000 00000000 9e778350 3447036e 9706b42d 5d0a1b8b
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 7d55a72a 3b02f5e1 41e66207 511cb7bb
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 21773439 410262a4 193f6dda b884b561
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 21b9839b 52ab6283 7b605860 c52c1a36
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 2bd6d845 47f8f2bc 16a2963b dcff967d
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 2c1c2d04 805c7d28 01a807b0 7153f583
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00800000 00000000 997db510 302959cf 3bdc36a4 6197c9ba
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00800000 00000000 ff7ac844 641ad65c ced417d5 e5bca0f1
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00800000 00000000 cfc50be7 1440ee7e b43063eb fa79bc51
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00800000 00000000 414f54e0 c020b7f6 cd98df4c da58c2c6
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00800000 00000000 831c6399 5ffbf486 71efd2e8 95b4255f
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00800000 00000000 cbaceb29 37bbc31c ef44bdab 90f92671
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00800000 00000000 81bc89d5 e4c3dd2a a4e8b457 98589830
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00800000 00000000 78d0a9a0 f167c7d1 dff91d28 3f0c112d
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00800000 00000000 82333e85 8efd25a3 dc58e89f 6be384c6
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00800000 00000000 0ddaa164 9cb2b549 c0dc502d 4056fdb6
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00800000 00000000 60950f43 a4e9d390 431c18ab 06f6edb3
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00800000 00000000 8aef14ef a673a0c2 bc64341c 40bbd2e1
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00800000 00000000 6e2377f3 18a9cdeb 0942dcdd 934a22f6
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00800000 00000000 26fefcd8 4a8fd303 737f374b d5553621
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00800000 00000000 86d7b77b cbe8e3b1 572f67d3 f77dee99
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00800000 00000000 80ca0691 5c053347 6cd2f69a 92d7f5e1
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00800000 00000000 1c770c46 0ed1ce0c 534e8311 ace6d64a
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00800000 00000000 0401673f 236b14e1 b86a8060 511e469e
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00800000 00000000 684be1c8 2eb410f4 8f053d5f cd4e0351
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00800000 00000000 23872d7c 20039fcb 774aff2f 79a117a8
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00800000 00000000 612edeee 0c9ee409 531c983a bab16142
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00800000 00000000 013f14ea 9a9fa775 225cdca9 1e561107
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00800000 00000000 226668a8 29203d71 1f34d9d5 aadd4b71
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00800000 00000000 e34b6fcf 51c8285b 60fc7dd5 99067bb1
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00800000 00000000 3d7154ab 7f08d6ca 8dcc0b0b e99e6581
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00800000 00000000 aefdaed4 e8ba816a e4d91e8a 85bb1f9c
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00800000 00000000 9ea642bc bead97b7 81029076 b33a7fc5
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 e594998f b5d5bcd5 7998a540 6d4720f9
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 e191f528 e9bf876c 2d943b13 c96c6246
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 43f89e68 8cd82bb8 f47d82ff 70e66707
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 5139c273 62620c93 3eccc591 06d3bba3
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 ff000000 00000000 04760d2a f5edbe89 4dd31233 f5a349ad
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 ff000000 00000000 1c99f4bb b2870b61 740c20e8 b4b3a447
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 ff000000 00000000 50142161 ca26a966 b631aa10 76202601
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 ff000000 00000000 a4e5c4fe cbbe1926 55d303f9 1e0ba097
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 ff000000 00000000 d096cdb9 8198af67 01567021 8f068fea
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 ff000000 00000000 b7fb1a31 15b6d0e5 57450c2b 8e931a17
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 ff000000 00000000 26774f55 9c0a6234 3c9dc396 93347de8
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 ff000000 00000000 1dfb4108 4be6f25d 7c5de5e4 951402bd
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 ff000000 00000000 6302ed04 6ad5096f 7cf96fee e62789af
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 ff000000 00000000 ffb2f2ca a2b6c832 1755f26d 3b042f52
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 ff000000 00000000 d9d4678c 69e519d5 47c61f78 f03ae6df
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 ff000000 00000000 6b032ecf 64d2139b c8e0058e 520bf9dc
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 59e92d22 7949c4bb e8657fba 7080bd58
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 842e5047 04709ad9 491fd8cd cd9d36ef
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 33cda626 bca22980 90f9a64f cbc3c4b6
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 981eb300 a9ed8be1 6c051075 1f4aa89f
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 aee436ba 4cb7543b c08d10e3 46af739b
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 313a8392 fc1b20c8 107a3111 becca7c5
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 ff000000 00000000 c61fabad 747a7795 f7be9cf5 a47b0dc7
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 ff000000 00000000 fa88c065 5041f854 f0f14444 e07fff07
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 ff000000 00000000 1c968df6 052f9a87 1ec2cdd4 0e86ac4a
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 ff000000 00000000 604bd694 dd191dcc d2b42afd b364fdbe
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 ff000000 00000000 7605676c 44eaae99 f550c105 758d377e
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 ff000000 00000000 8f824b8a 169359c6 8757dde1 39f8a63b
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 ff000000 00000000 260e12ab ef29fa83 25010c47 55fc59f8
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 ff000000 00000000 1437d144 53fc8556 01fd3e34 9ec7ce17
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 ff000000 00000000 f9889861 2885a4c0 90199984 8186c409
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 ff000000 00000000 d5a5b5c0 4dedbbad c729b38c 6e6b5f5b
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 ff000000 00000000 eab2b472 84d793a5 21469192 b4a1bf6d
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 ff000000 00000000 b1b2dc57 afd6624d 5f128d86 f89fe2a9
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 ff000000 00000000 dfcb6e5e a0894b3b f85c52fa d29e0bff
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 ff000000 00000000 1633dc13 10ceced3 613ed8de deb5db90
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 ff000000 00000000 f9abe8ab 34ae560f c23b89c5 ffb47ec7
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 ff000000 00000000 38205c98 e813a1dc c7dfd2cc c7ed1b5a
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 ff000000 00000000 a83a5099 81580b72 9418d1a1 427b5bc8
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 ff000000 00000000 057cd2b9 f1396aed 962fb7e8 007b9417
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 ff000000 00000000 9ead8db7 0be43b46 abbf6f00 64399b80
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 ff000000 00000000 a5f7a8c1 9c014f32 e84da0c7 528db876
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 ff000000 00000000 2f862e83 ee399416 2fc4b244 219bf33b
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 ff000000 00000000 7c38fd5e e88c7b0b 00a39564 d127ba08
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 ff000000 00000000 9dde56f7 703a51a2 809b288c 13fc1db8
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 ff000000 00000000 001a54c7 7c415411 7419eadc 30283e4c
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 ff000000 00000000 3c9224d4 642eaab1 3ca000f2 c837fd1b
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 ff000000 00000000 35b24344 d6067df7 c0c48112 05f68f85
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 ff000000 00000000 6e492fd4 5de1d3f5 082d2ff3 0c00136a
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 80000000 00000000 50ee6f9f b145d6ff 04c3488c 77cd209f
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 80000000 00000000 d91e7c95 8944f3d8 8943fa3a 4d22c6ea
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 2686ee74 f5c74c56 e38f1dbc ded52c9e
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 0567728c ea8d267b 37e6a8ba 5625d260
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 80000000 00000000 c0ced4da 4bfe2786 e58b4d79 9ea767d6
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 80000000 00000000 b269706c 863d4f06 ad7e7fe2 88b07128
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 80000000 00000000 e573ef41 430faffa eade00c4 20f0b1ba
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 80000000 00000000 7cd777be 5053dd9f 30ef6a67 6b51d8f7
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 80000000 00000000 ec045802 370393e6 bd882103 588ed4f1
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 80000000 00000000 9898896b 1b9b3011 cec1c90c b3bff953
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 80000000 00000000 832d4f7a c2bcc9d3 2c59d87a 8fe2f8ab
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 80000000 00000000 8a3070a6 896d5802 6b3c1d19 ed1d2810
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 80000000 00000000 bc69ab5b 32405fbd 5c43ac3c 2371b526
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 80000000 00000000 71ec9436 4fa0ee91 46b32565 9553dc6c
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 80000000 00000000 9fbc1872 75a39026 810ad2d0 2c8601a6
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 80000000 00000000 97cb2996 bf8fd265 82cea626 3347e64b
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 80000000 00000000 4af192d3 a36695a6 a17916fd ab5b1252
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 3e10a586 c183603d 5583b06c 430f5fcd
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 05d060a5 85e09077 5489df86 a37daedc
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 9a5142d6 a7d70911 9a87b352 4e1a8f77
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 7e6a1959 a16d3e5e 3bf24b06 b503c1f8
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 7aba07a8 1ed6fb0d 5f51e882 3495d0e3
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 80000000 00000000 0add6979 17a72877 ce5565e8 41a226ff
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 80000000 00000000 043fe565 b0e380bb a6a88d46 c7219ae4
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 80000000 00000000 6c7c39b8 a33a2a55 e0e820f6 cc322707
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 80000000 00000000 eecc5f3f 40870c09 cd3ad7c3 4b1604be
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 80000000 00000000 6bc74f4b 6c57bbeb e8cb7079 2d461a71
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 80000000 00000000 2a846853 f7fca57a 1252cfd2 f4ee435a
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 80000000 00000000 af9b5771 27e2c1f0 262d0f5a a11f9c95
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 80000000 00000000 312670de 6f0f7254 08254bde 3b9bf3bd
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 80000000 00000000 91f3c2f1 51a51b64 f8db3bad 84658c4a
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 80000000 00000000 3622195e 3afeaff4 e68cfc47 7f0e392d
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 80000000 00000000 e404d0de 0dad63df 1d86d0bf 5f84995c
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 80000000 00000000 1f101c49 a193a793 f59bae29 f4022bb1
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 80000000 00000000 939a5317 65f86e1e a510f31d 89b18ee5
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 80000000 00000000 cbf83da1 ddd26b7a c2b08e12 2f259f99
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 80000000 00000000 bb8a595b c4b6ebc9 c15f8037 ae5ae08c
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 80000000 00000000 a7a3f1d9 a4e83df6 c164329a 26887914
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 80000000 00000000 a43219d2 70e406ee 648a62ff d27bdf0c
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 80000000 00000000 fcc32a22 78ea12c6 4c617906 99e5c9ef
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 80000000 00000000 0b1f00f6 084d9447 534f7cc0 ee2599c1
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 80000000 00000000 2278d6c7 7d598017 a5a8495d 082fd290
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 80000000 00000000 03468145 4b44a835 3faca49e 1d1cefff
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 80000000 00000000 4d2c2ff9 87ba11be fd422373 ebd9ed6e
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 80000000 00000000 612aa9c0 f9507178 c7988e66 33be6059
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 80000000 00000000 ee635721 f0227c18 019f491f f1f72229
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 80000000 00000000 77c8a6b3 63296dcf c2bc8b57 a12bf8e8
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 80000000 00000000 4402a2a9 7dcd34d4 722f7f82 203961ac
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 80000000 00000000 40b825de a60b3b62 f4ebf400 0e825cbf
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 000000ff ba205fb6 7571108e 39bb44a8 08d8418f
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 9bd98154 0c5fd6a0 2a17f791 379c7568
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 21db62f4 126704f7 9e258258 58d5afdd
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 3ac130a1 94e59f22 1e98e881 70e56970
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 000000ff 3fc93b6e 03ce6242 08b7885e 2d82bbaf
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 000000ff ac5a404c 9a57bacd 9c8a2152 c1505349
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 000000ff cdcd83a2 c711fdbe e51645e5 7e6d046d
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 000000ff 4373d67c 358d830c 3fa8027d 757dcfcf
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 000000ff 68020c55 7a9d35a0 017e4ddd f9ae6d97
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 000000ff 6f360904 5653e7d9 21fd3780 45370e1c
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 000000ff 3eab9707 15013d52 aabe0047 d7fb53a6
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 000000ff 942aec32 3e14b6f5 fcea7f43 bc089bcc
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 000000ff c255d1e3 eb8b8360 1265d817 8469d77a
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 000000ff 1ca7f47f 54b6924e ccd09f94 ca3b2c0e
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 000000ff 86a52cca a8987a42 bed185ee c8eb8d7a
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 000000ff 6200e914 68f0cf97 88381a0d 305d9e6c
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 000000ff b34e6fd8 fda920d7 eab62664 afc9526a
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 0d281301 5fe3c5d1 0ca70fe0 642e27d1
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 8b83e9c8 fcf79329 e8136b62 445ee56a
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff dd404bcf db24fc5e ff00b775 dd297bf3
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff dcca8760 ce686599 fecaac4d 3d6f484e
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff f1e30f8c 242c8379 6b2cbbbe a34dd198
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 000000ff 0cc917eb 0f5fa1ac 12e47540 cd0f31e6
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 000000ff d917750a 8e3e533d a980b398 9a701daa
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 000000ff 0a0abe59 10a96176 2c6f1819 6f955e80
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 000000ff fb553ded 772c96f6 c9e98f69 f6215dc7
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 000000ff 9d279f8c 001a6b16 a9d2b14d 6b312d90
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 000000ff 94068fe0 5d3a1770 5a5d122a 2e461232
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 000000ff 699fa8ee 285405cf 0fe6a66f c6afc4d3
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 000000ff 6f905c6c ff97a60d 67329e05 c06eef7e
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 000000ff 4d92bc50 44607f7c ce770b42 2b897df0
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 000000ff 978f1fbc 9e462394 ef68d931 03fff47c
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 000000ff 114a0d56 50016f2a 9ffd7388 be9ffa0c
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 000000ff 2749f402 a64b9a01 c35cce05 7d891479
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 000000ff 7d35638a 597e663d 9606347b c5c56adb
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 000000ff be8ab74f d910586f 3bb3029b 679bfe1c
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 000000ff e5fd023d 40ba82d5 b74e4200 2b3019af
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 000000ff 5cf9b98a 11a7d7f4 59df98d0 7821aae9
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 000000ff 2890decf 9d58b59f f578c4cd d37a5621
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 000000ff e5b5d0ec 0bcddc55 e3ce4717 834d42ec
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 000000ff be40ed1c d3fa06b4 5e129830 006d89f6
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 000000ff 987c84ed ed1f21f3 44ffe815 a2408672
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 000000ff 9ba6d879 10e6e4f8 06ed8aa5 0145877d
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 000000ff 8d10aaec e645e3ba 3f04218d 40f8b67d
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 000000ff b0659c9c 0740e25f 2c151c73 eb08059e
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 000000ff 2599afaa 47af114f b715953d f14f0d62
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 000000ff 09a2917c 81643036 7d18cdaf b286a87c
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 000000ff 5a7e2699 3219d6af 8ffb64e6 20049567
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 000000ff af08af74 e8fbf59c 8a5af092 f94136c8
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000080 b6c8a390 d1017b49 945a30e4 bbb12e77
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000080 dbf38ffe 7cffafd6 f46b1b64 2030119e
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 ec40611c 9922b2f1 aba0ca77 68704af0
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 191a0257 5b89af7c b4a0842a 671a25b5
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000080 0adeb3e8 6bf36c1f 8d34bead a28eb9c1
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000080 e41a2df7 a59eaf3c a2facbfa b4578cd2
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000080 8fbc7d6b 62769b02 06fddf59 98fd67ce
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000080 4c206362 ae612042 30bb1ea0 60367f6e
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000080 af37d525 13a44d70 3c481d0a 18eec0b2
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000080 2faea34b 4bac3b7b c17ebace e97fb330
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000080 369fdfe3 04081de3 fc1adc6d 9ee43625
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000080 c3e039b3 0e50d67e 02dc6318 cf160f8a
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000080 63df5831 b78e3874 cf3deccc ac763012
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000080 87d8f297 8636d3c7 0c81a629 71217d68
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000080 d01601cc 416a8b81 c03f0d12 04568b8a
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000080 e126b7db dd192c78 76d98e1e 3e3acb44
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000080 0385df57 5fe0a1f0 f7db7de5 cab598f7
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 ea2cddaf a12525bf 59cc4e5d 46fc7628
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 ac8a8993 2627d7da 785a4410 43d6ca35
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 ed74b91e 4cd838ed 8da65f2a f45836af
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 1220ecfd 9d90e56f 3bdb3e66 a13d3459
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 9ac247b3 c0fbe2ee 29a5ce96 6223e7a6
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000080 07f38992 431f289c bf3d0f90 bb31139d
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000080 3e87e158 4421f5c2 3bd07c3b e078c6ff
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000080 40ff4b3d 972e40f7 a3de98f2 629c220d
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000080 e049bd76 b882e323 5f203d0c 44406976
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000080 56f35880 8268e2c8 ee9ea2b2 bb013349
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000080 67381f8b 45d26557 63f30265 07d94652
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000080 03dc8465 59a93630 6e37c101 342ba48e
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000080 4badda42 e5745abd b2a4c569 59932f35
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000080 05c369b7 c16d6c0a 00a61636 d6f16971
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000080 5cfb1283 5456a613 132d7ad7 f5f6fc33
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000080 6d70be70 68f1c773 7aef97a8 cf2afd9f
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000080 e72b5845 3b1ad9b1 cccb8327 e974936b
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000080 40f06d8d 8daeaf90 a12a9bb5 1ddb0188
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000080 e6c63d22 b909283f 350817aa 8a241aaa
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000080 2b0ff10c 407f999d 0f4a0bd2 6f2aa50a
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000080 269160c8 4ca320e4 8ac10c3e f61ea009
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000080 29cef2f0 ab096ca5 06153c58 b293312b
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000080 9df9fa8c 48bc1a69 b4e05ade 10626ed7
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000080 3740739f b4c2803f 4c664624 a9556783
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000080 6c112d9a 0bcabebe 4fc7cb1e 4b24f856
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000080 28a20ce7 0ae113bf 7ef2db5c 3bee6c8e
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000080 f086532a 016327da e2b39dbc 23c9c84c
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000080 df2a6747 c64b2d09 4e76212b b34591f7
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000080 999f7488 e79031e6 b2121bc1 647ac92d
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000080 0bcf9f8a d3f78a00 bef7f10a 0aba298c
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000080 dd2efffc 78da53fb 29b853c8 7f2df440
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000080 7220bc39 b7230651 3e17b7e5 c35375b7
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 e6969724 ea77117b f4472835 e1782eb7
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 bc137850 6915f2cf fcbc8fa0 a9556b09
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 3b768400 b96371bb 1cbcf1fe 9d198b9d
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 e4a78c1d 06042e7c a7233197 93970572
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 0000ff00 3f5109bb 5103e99d 8cf85d2f 3291b05b
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 0000ff00 3360830e 30fe7c80 f7043c06 2f8250da
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 0000ff00 d6640367 4d4347de 19a7ec43 53304d04
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 0000ff00 a3fa134f 78844f3b c53e40e9 01419be7
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 0000ff00 63d3090e 98efe3c0 28db8c72 6e8a6e3d
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 0000ff00 4c2b8318 3eb8c5c0 531b38cc 227aed96
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 0000ff00 d96a78ed ec8ad8e5 a172bc36 137384d8
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 0000ff00 d82dd886 384813c6 e7b1285e f2a0660a
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 0000ff00 6a04b8b3 2ff1e2c1 c46517e7 d667347a
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 0000ff00 9eb3eb63 4308fef5 d5a79ab6 9ff96e30
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 0000ff00 3131e370 625a7960 b954d783 8d5e1ceb
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 0000ff00 baceb239 b276bc17 2bfdace4 75108304
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 60007544 26b8e375 0070ef6d 43f7f0cb
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 7be23e1e 5747dc9f 8379d38d 2bab83ee
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 ee5d036d d2d90edd 34834765 9f53affd
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 6b57dc82 37fc10ee feff9c27 85dd9d70
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 d0b60125 12434c5e 3a1cca46 ade79259
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 ded42a73 ee5dd93d b36d7933 89ac2906
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 0000ff00 dda978d0 e516497f 14385f40 606063cc
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 0000ff00 25ad5b4c 0707cee6 c3c95f35 504c730c
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 0000ff00 cf90e7c3 e8b160f9 5741b506 094c31c1
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 0000ff00 e67e5fa4 949d5d9d 40aea83f b9346f56
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 0000ff00 d93b9673 e8062095 ec216f51 1831cef6
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 0000ff00 635c096f e2e438c0 d1b8d51e 8d7e2503
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 0000ff00 b114c194 5625692d 0bb23f33 7304011d
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 0000ff00 fb3747a3 ef52cd47 69d89179 09a108c6
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 0000ff00 e64edb80 829bc7a0 268d1a02 e54c9e71
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 0000ff00 f18f31b9 2f5ef9e2 e109bb9a 78555284
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 0000ff00 7630b865 80dfb883 bfb250a2 3748e0a7
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 0000ff00 f44eaf8e 2ece190f 1daa5830 47a38a4c
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 0000ff00 3223ebb4 bffcb90d 4c12a456 bc506ea4
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 0000ff00 1fcd3b82 b9afc082 3aa0e466 7637c0aa
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 0000ff00 cf12ceb9 0bb5cbcc 9da02550 d63999b0
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 0000ff00 e1daa0ef 79f0f80f 9c9ecc32 dc20c432
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 0000ff00 ec8858fa 42e6894b d8fe0a5f 8a0a07c9
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 0000ff00 49072a40 c08d2519 c6055bc6 92577eda
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 0000ff00 342325fa d8f20b40 c2c3aac5 65147f0a
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 0000ff00 264b735c 0e1b4cf1 11ccbc18 450c7f7c
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 0000ff00 b9cd79c9 9a7ac672 ed3787f9 806bd94f
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 0000ff00 6c35f272 6f1aa932 1f3365b0 b7bd24b7
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 0000ff00 cc68caf4 3a97ae1e 793c3f5c 3322417e
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 0000ff00 9b90b178 512785d3 d370ddac eb79ee42
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 0000ff00 6efe6875 3010187d ca52b0ef 74716ff0
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 0000ff00 b82755f4 19593fe3 cff17ba6 7dac57d4
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 0000ff00 4209f0a9 cae24b27 5a798a39 b321e924
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00008000 9999d86f d5b04c49 99aa4d6a 5249f1b5
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00008000 3a96ddf4 b8ffbf68 c54fa232 e2fd3c77
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 8c8b3ecf f03e1940 4292f136 50f58c35
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 b577e787 f046cfab b157f5a5 befeb264
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00008000 28173c64 98a8e68a ccfbb49d 3db3e06d
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00008000 ade69c8c 2ba7642c 7b75f40f 6573d916
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00008000 33a8fa63 1b348950 10636d86 c02c1cae
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00008000 95ee84ad c3b4c302 b1fa0d5b 39219c4a
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00008000 9c12f262 05966d6f 6d8e0df8 128090d8
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00008000 1d93efae f470bb64 a078b87f 83aab9dd
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00008000 9b5f3253 8b89bc76 66846275 dc68047e
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00008000 0f086cab 81843faf d23d7fab 7f996bfb
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00008000 192f9388 d7392088 2f521dfa e05def2e
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00008000 c8338a4b c1074f84 c74ea356 bbe7b2d7
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00008000 f3f22a4b 40cb0754 3fec10b0 e978eb1c
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00008000 f07ff368 adebb743 f9e19a5a 4268be87
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00008000 bbf5ac6e 06f970cf 80e2593b 4da13148
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 652ba9c3 d7f3d5eb d6c46af1 5992e908
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 e513bb9f 4e5eecdf ad9cf572 1d2e049b
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 6f7e7212 aaeda863 d328b6fc 7b6d3808
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 dbe5393c 8e2034b9 b585639a 56e5aabd
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 1d5bbd63 e15c015f 3fd66f0e e9c21cfa
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00008000 d037c45a e1a6efd0 f3aa3b71 ba68c5c0
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00008000 1a351deb e6921918 b4a8e59a b2b5c926
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00008000 182749dc a3c6ebe5 2442f308 a7839bae
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00008000 ddfbbbd4 7d8da7b4 728edfba d30be2f4
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00008000 56558acf 3e41130b e42e7286 4b6a3b50
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00008000 ecb9fcb1 88476795 6f82c630 2118c855
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00008000 8467b6b3 e419570c b96ebe38 fbc8f905
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00008000 78fe5b75 b3b35322 e4e0ea23 14f78048
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00008000 1745da18 ceabb445 783908d9 26037384
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00008000 a0296cb7 9c833dc4 1e316b0f 0a7367b7
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00008000 8be3cbb9 7613179f 310e0ae0 237ed1ee
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00008000 8d42edbc 75bd79f1 c65cb7cd a4c875c7
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00008000 d23528d9 21e9b771 34d464aa c4ff2c8d
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00008000 64aa52e7 71c96867 981477d7 2f5c226d
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00008000 19dbdbed 6b4bd3ef 3ca21d36 d9cf8641
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00008000 7014fdbd a49ab556 1a53f673 d7103a1d
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00008000 cee680a7 56b7ba5b 83e4cf54 56880773
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00008000 8fe4e861 b51e152e 77d241a4 c3729436
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00008000 dac02c8e 04dc6e8c deedd4e3 79192afe
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00008000 3d700b73 ae21f5a9 199e8baf 26b3d711
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00008000 44892f95 bb2d1a02 a567e66f 38ea3760
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00008000 a8b94889 fd901188 54ab283c a0a59643
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00008000 1d0f1f82 c12db848 0623c816 e001f107
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00008000 9c98f9fc 748f2908 0eaebb20 f2abb869
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00008000 173b5371 63012220 8bc6c1ca 5b052e37
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00008000 5e7e1980 d4f004e3 74e1dd35 06c63ed3
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00008000 f8585f35 792755dd f3a1ad8d a0fbb9b5
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 aec2d436 8450fa0e bd6c2af2 b2e2ea62
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 de1716a9 d31542ec 420d8e5f 96edb01e
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 8f8cb7f9 061b2e5b 13b57a41 3531eade
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 976ae569 5eea786d 2c14232b ef1b689a
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00ff0000 75477164 f695da43 ba81e870 b89589a5
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00ff0000 e55ac2bb 27f6b140 807d1cf1 e78047d4
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00ff0000 ff50a010 b8120cf6 d64a591b df1e78fd
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00ff0000 438426a3 68fa62fc 86f9be7f 179cd401
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00ff0000 95768488 3cdda66d 04781755 5278e78c
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00ff0000 15f585da 1821534c 700462b2 2ac16577
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00ff0000 d13c83a3 92d5a62d 25493930 1bf3ed6a
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00ff0000 60ea84c1 3fff6f6e eb8d52f3 e792bda5
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00ff0000 e8298a66 060fd8bd 4aa82879 c82de151
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00ff0000 419be76a f046e526 2f7585b1 b1a46c03
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00ff0000 6d0e8d83 d96af6fc b360ff30 1f48847a
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00ff0000 13013969 07b3289f f60b3d21 a100b04a
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 a5858e1f ce56b291 33486dcd ea078153
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 f5d6bbfb e20a1bf1 e9d4c738 16d99eee
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 47257887 2e330955 890cf6c8 0197d72d
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 33afed53 723dba58 cf5c22bc 7774a1bf
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 2cd7020d 53397f2a dad07a2e 937c373e
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 995409e1 124fa314 d0e81be9 c3bd5823
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00ff0000 decaafb5 f2af7017 dffa6d3b 4084547b
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00ff0000 e33806e3 bbce22c4 065a8146 18f3e4fb
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00ff0000 5e78c26d 6c474b39 4f7bfaa6 547c5c7d
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00ff0000 775e72f9 ef6aa867 3cece2da d3e20ab4
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00ff0000 8f5ced18 67bd1184 3305c9d5 c123547e
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00ff0000 7e905e3f e11324ba 12df2ae1 116e1447
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00ff0000 8e3de9cc 7db83f52 c8bdbbc3 a8209cb9
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00ff0000 06c95f5a a3442340 ff5d70b9 b0150951
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00ff0000 fa64ffb8 5f6b7ea5 1a8940b8 c2d7a4e2
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00ff0000 39229535 557d82f9 4d1960af 8345401f
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00ff0000 c64c071e e9c00095 96cd2a0a 5377835d
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00ff0000 7bf81b02 3c39163a 084d0685 0caba919
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00ff0000 24ae41eb 689c1939 d454c719 5dcd1288
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00ff0000 c0bf8717 ba19ac1d cf744187 32d9e41e
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00ff0000 c8230f78 eecd9fda 52e5791a dc794523
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00ff0000 6a193c9b a65600c4 2760c467 12ce3b0c
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00ff0000 7f200e53 7201567c 9d6e2655 5566dc40
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00ff0000 2733749b 1244ae8f b003b6d6 0b6cdab0
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00ff0000 30926386 795206f4 b369f320 89fead5b
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00ff0000 a87b350a 95f4026c 91e2de67 2a2e63b9
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00ff0000 04b9d323 38328c93 5b618e1f db402a8c
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00ff0000 aa266846 6c7bbf03 803238d6 7261b5dc
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00ff0000 af9dee32 ad0458bd 3afb0ba4 3e79dcb9
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00ff0000 34486962 3b6b724c 30ad6bb4 e12028a0
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00ff0000 98307f93 b7bd1a71 2cab55d1 d8fa0e74
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00ff0000 78402005 ed9ef8a7 0cedb596 0e90bc22
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00ff0000 5744b07b 59adac28 18046647 10c93034
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00800000 913ceb51 38138c27 95ef225e cdb73cba
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00800000 2ffeb8f8 d40b8746 c307909a a28bce5b
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 2fa64be7 0f3875aa f42872e6 2b2dd366
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 86c842dc b9bbae51 41ce8725 beceb6e0
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00800000 9160bbfd 4e416ce0 4f552606 0411554a
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00800000 cae9d9ac e80ffdb8 7a4acb5c 05728b4c
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00800000 cb4e3e01 707b04f9 be3d08e0 1e724878
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00800000 f22dc1d1 61efa99b fe4b35c4 42f1ae9f
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00800000 abb51416 704b9fdf b783c974 6b910362
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00800000 48e985f2 1b2f3015 37e33c25 2d14bcd3
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00800000 6f3f2636 bb6aa8e5 9705f884 2cc11782
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00800000 20167428 7bcad5ca c641e404 bef7d4cc
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00800000 506428c3 04978fc6 9fa8d4be 8e3e570f
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00800000 69aa3611 83eadb80 ac09e387 9c0f5d55
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00800000 88417573 160ef3a0 beac468d aff9718f
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00800000 533037a7 50dc35b5 8e01f7b3 880fce38
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00800000 09b2a987 58d6ee83 60700022 0b07a0a9
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 08b995e1 75e4ace8 701c1317 5ff425ec
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 b56c5fa5 b400898f 6b18aeaa 467780c0
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 5ac8c476 5bc9f43f a83ab541 a7678e64
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 4dbfd87a aee8d958 5301ed7a b57af9d2
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 ba7dccc3 49e9b6af 2601ec2d 142d19fe
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00800000 bbee6bb1 25af1268 8c16dc3d 09d51329
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00800000 258d3743 e578bab3 8dca4b33 e244314e
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00800000 e7b2e049 637e1b76 8424dd3f 40777e5a
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00800000 cf407bb7 7fe0bdb6 ad2cfed5 825e04d2
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00800000 52d3122b df42f504 9328862a badb6776
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00800000 3a63c38b 600be114 99578e15 3f9f13cf
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00800000 c47cf038 7f7811b6 6989c8a3 e7f4ed71
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00800000 427542a1 c074fad8 df5cfb21 4a67dad8
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00800000 8bf976fb 7f6991c1 a5bd7a21 dd41ecaa
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00800000 3826a018 504b9d62 c878c336 b04b85dc
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00800000 587f2792 59c7af31 6f2737a6 8e59316a
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00800000 fe0e9d1f 128b13b6 c764d11a a372ad18
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00800000 8f30d4a3 b2b93b51 6da9656d b868c978
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00800000 909756ee 327575fe ddfe2647 ae53fc4d
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00800000 4196cbdc 60c6840c bb6d5444 f259f47c
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00800000 0be279c9 e42ecc5f d35705f9 6f7583c1
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00800000 17af5e04 02c95c18 3f23a503 a2261d4e
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00800000 bcfb6e46 d1a3d60c ea740e5f 12ea6ed1
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00800000 3e4add40 4e9c8224 b2361093 609db035
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00800000 76ae32ae 70456796 4e35906d 444508cd
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00800000 433e75df bae525fd cfc16bb1 23956a4c
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00800000 a927b4c0 4b64a202 9af94594 ed59a36b
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00800000 2e2850c5 105bdac7 3be5093b c3367694
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00800000 326ded18 3901a24b cdd54a03 e440b784
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00800000 133d5d06 256a441d 70bf8e82 6cd6089d
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00800000 4ef00738 868ce320 3b278f38 de4fc31e
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00800000 28b894f6 94d29fa6 5bc130a9 6cc758d0
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 830ede16 2c7aedff 98327fad 25585765
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 688c673f 4feebbd6 4ee8f6dd cb325a2b
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 7469633d 1c511f43 a5d7f652 5f992c84
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 e327b087 6b3a38bb dfb0bbcf 6029a7f1
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 ff000000 56327af1 3defa922 9873cc35 0fbb01b0
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 ff000000 b302a0b9 28bd9cb8 cd998b9e 390348f7
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 ff000000 99bbcabe 849548c5 7fd94f01 6fc3d07a
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 ff000000 198149ba 35394361 d8fc6c48 b8d63959
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 ff000000 69d7d7c7 c0bc9014 ae8b5fa3 d2a89e74
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 ff000000 ea950837 fb738fc6 ef4d55d7 04576d0f
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 ff000000 3620f982 3ce8fc43 62b7c574 abb7857e
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 ff000000 f01f1083 76afb448 c1c8b156 96e1879e
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 ff000000 ec9eacc2 6774f522 841c19a4 1f8dda37
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 ff000000 ca15575d 1ab3559d 7b18ae12 27e40e29
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 ff000000 dcb6d7c6 03d08b0e 5081cc94 8e249c86
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 ff000000 a2560187 8a78fec2 67aa93bf e103de82
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 7e93bdaa 3333d2a9 54275e94 29f2558b
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 4a80089c b95368bf 90fb6f8b 2d894c41
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 f2d44d68 cdb19f20 9747a357 35505875
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 0291942e 2cb40254 f3dc55e9 7c7221d2
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 3a3c5a30 094dc480 328c313f c4fc6fe2
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 cb7c77d5 5d0f196b 297a4cd7 b02e3eef
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 ff000000 0af3f33d b4444c6f 484a326f 6951a499
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 ff000000 7960fd9a 3a445d2f 03a78647 0cc25aa7
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 ff000000 2c91b280 c10863bf 4136bce5 31ad2c85
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 ff000000 44a43b39 8ec6dec2 7debc7db ce0666ee
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 ff000000 081925c6 522ccff9 a82cdebd 2f9e8fc5
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 ff000000 eaafe2a9 f15dd430 7dc169c8 1466e73c
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 ff000000 182f687e 2d7ee0d8 f4c7111e d4568acb
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 ff000000 d8581c85 465a6bde 1f27ff17 18522949
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 ff000000 bc596afa ad59cb47 76aa9deb 205ddf74
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 ff000000 f7e07727 150aa4af 0beb9007 cd5095fd
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 ff000000 9618d496 f2b60e55 52125c7f 81e153f7
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 ff000000 9fafbcd8 03328635 6e262747 83fc5f6f
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 ff000000 762f673f 5b94c0b2 2085a682 02705419
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 ff000000 b0179103 8d458989 ff0e5982 49f5be90
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 ff000000 d7625e83 26e36f0a 09cbefbf 44469e3c
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 ff000000 4f654e80 74f7ba7b 1d71a482 5d2ef42f
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 ff000000 50a9e302 0a88eded 605407d6 961cf688
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 ff000000 0e35fc3f 51317e4f 7ec99c9c 247e15e2
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 ff000000 b79f2dbe d88d92a4 6bdcd12d 0da84be4
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 ff000000 28aaf55a 0d457eaa ca39b6bd 9ae11aca
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 ff000000 f51f42bb 714a3ba4 ecf49d28 3297feaf
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 ff000000 34033ef5 ef1a2178 3dc08498 8742b1f8
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 ff000000 42a38dae 356f9800 ee54d9ce 2c8fe759
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 ff000000 8ac74af6 db5395b6 3d51c46d bb448a5d
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 ff000000 5fe80073 4be63b93 c8bc6459 3647869c
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 ff000000 b0e3dd9a f2f1c750 7a819dcf b5da4539
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 ff000000 e87ec26e 055af8ee 4554a7db b2ff189c
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 80000000 26789d39 0b35b558 d134c70a 05f21058
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 80000000 b090f71b 0c24e6cd 14c39853 29eea7a1
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 67957e08 82b4de0c 3817a4a4 a7d9c9e5
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 36475912 2e67e681 9186a568 6d3ab920
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 80000000 36641fe7 44561777 df4a4071 774a7979
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 80000000 13d7c238 ec3445e5 03bf05d0 efc826e4
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 80000000 1856302b 2cfd6cef f3c4c4c2 fd97ea43
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 80000000 c82ecfc9 246d99da ee5a939a df4e2ec7
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 80000000 b3057d65 5f4857fe 161fd575 eb1af21d
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 80000000 493e26c7 ab8a8a12 b2c7522e ee623a12
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 80000000 54fb2c88 9b0a6e74 afe9a75c 5ac60579
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 80000000 4708dd7f 9772ca07 09d43d7b d657da70
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 80000000 1866cb47 ec4a45b5 51415a63 62edcebd
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 80000000 f48b91c7 c7f95960 f75596d2 7d66e99c
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 80000000 30fd74da 8416b1b8 acfad80a 74183a32
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 80000000 60abf0c9 a8f16c38 6aecc856 77585d18
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 80000000 95ecca0f a586b316 49039c99 db7c3ced
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 69b6c8dd c867ff5c c29fbfd2 bb8abad8
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 91bd9101 1ade8c27 dd03d6cf 4a2f609d
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 9fe8eb8d c0f1ad2c ff1b02c2 13e53657
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 d2737890 1c5bf29a 60c1876b d0e6375f
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 a36d95f2 e1b3836b 16e07380 530e046a
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 80000000 49a80c7f 38e8f470 5297276c 2a15f290
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 80000000 129069a4 34691701 1e540326 459225e0
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 80000000 0aeef630 536d89b1 62698a9b 75935d28
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 80000000 ed53e002 2f4dafd2 c699a3ce c518f265
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 80000000 fe8314d1 430aba3a 903a1b95 383b4771
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 80000000 32ef00e3 a8288238 7925c333 09305962
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 80000000 faa6902d d4e9436b 117ef210 cc580c65
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 80000000 da277aa7 b9bcc78d 7682a753 7f111edb
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 80000000 cf776645 b25583c1 6afc73ed 563c5124
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 80000000 8e5c34e2 4b8ae101 e9f7f828 e3f5ca55
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 80000000 2419a489 22144205 48ae6a07 6e461b03
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 80000000 26896192 7988e1c2 c9517654 68253c81
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 80000000 757d6cfb f7030e88 9248f577 32a75662
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 80000000 36fd2e12 e975bc10 3078eace be3302dd
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 80000000 c14e818d 97df0638 c264b1de 5d478b0e
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 80000000 e3ba2b28 9db21117 896fa5d6 a803d2b9
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 80000000 a569e149 bc4c5eab 2452fc82 01d2e698
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 80000000 b407f105 4e2bf500 52e0672a bfb546db
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 80000000 d69cde49 60f9ec60 bb175073 cf0d97e7
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 80000000 fe0a7ffe f6d1bcf2 b98768d8 7e94a046
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 80000000 a3432cf6 10539085 0f7d7a9b e14c6dee
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 80000000 baee3cbe 194d47c1 7dc26b0f a063a426
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 80000000 8e864bfc a7c4c727 4c946170 af4dd13d
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 80000000 b6c08c48 52962db9 88508917 4dd4aaff
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 80000000 31e3f0cc 92d1e3cc a2fdaa6c 902c741b
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 80000000 378edc3f 0de9ca93 eabe8ab2 8b2f1d2e
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 80000000 394a7bc3 4d049c56 b0e3d5a5 dcb070b5
+ars4x32 10 00000001 00000000 00000000 00000000 00000001 00000000 00000000 00000000 3789b2f9 cf3e7bfc 51bafd66 e5c2f16c
+ars4x32 10 00000100 00000000 00000000 00000000 00000001 00000000 00000000 00000000 419e7cee 1634c377 ac441b35 b5fdad47
+ars4x32 10 00010000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 8f5a5777 3966ef14 a179a3a6 68bd181a
+ars4x32 10 01000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 598460c9 f5a72152 18876ff0 6499a688
+ars4x32 10 00000000 00000001 00000000 00000000 00000001 00000000 00000000 00000000 1e482dbb 2a7d29e4 abd679be 27f0d406
+ars4x32 10 00000000 00000100 00000000 00000000 00000001 00000000 00000000 00000000 4e2cb77d 76586ea3 20b8a841 abe1ae74
+ars4x32 10 00000000 00010000 00000000 00000000 00000001 00000000 00000000 00000000 9dbd160e bea9c9bc 2b30c629 a7563f10
+ars4x32 10 00000000 01000000 00000000 00000000 00000001 00000000 00000000 00000000 dc7e94c1 a7c5a4d0 1132a44c 095cb974
+ars4x32 10 00000000 00000000 00000001 00000000 00000001 00000000 00000000 00000000 dbdbc6af 3ea7b4f4 219b4da7 47161831
+ars4x32 10 00000000 00000000 00000100 00000000 00000001 00000000 00000000 00000000 f3a905df df16c950 92e4d08e 0ccaa78f
+ars4x32 10 00000000 00000000 00010000 00000000 00000001 00000000 00000000 00000000 d948e4cc 4f6e190c 0d73a820 c492e4ea
+ars4x32 10 00000000 00000000 01000000 00000000 00000001 00000000 00000000 00000000 28adb021 4ba7a2c6 e2e147bd 41f1d499
+ars4x32 10 00000000 00000000 00000000 00000001 00000001 00000000 00000000 00000000 4febfa99 150b2760 42b439ab 644be146
+ars4x32 10 00000000 00000000 00000000 00000100 00000001 00000000 00000000 00000000 5d4ec2f9 0b058beb 06ee5c54 40d84bfd
+ars4x32 10 00000000 00000000 00000000 00010000 00000001 00000000 00000000 00000000 62b8f839 5efa5122 91dcbecc d338fda6
+ars4x32 10 00000000 00000000 00000000 01000000 00000001 00000000 00000000 00000000 992fcee9 92f851d3 686e3c09 2f99ac38
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000001 00000000 00000000 00000000 dd3052a2 e18f6d4d a56acffb 7e788c8a
+ars4x32 10 00008000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 f53537d6 a25397f4 894699bf 69fcc395
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 d7a2c9fc e5cc90ea 5309405a 8513cb0a
+ars4x32 10 00800000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 f588d19d e91f4772 8b088d79 79c222e8
+ars4x32 10 ff000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 23fa982b 4d2f59e5 7c4259d5 efa0c6bc
+ars4x32 10 80000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 f98c4b1f 68cc558d ae0b81ea 01f64bf8
+ars4x32 10 00000000 000000ff 00000000 00000000 00000001 00000000 00000000 00000000 31816f80 faaccbe9 7cf8f6ad b150f7e0
+ars4x32 10 00000000 00000080 00000000 00000000 00000001 00000000 00000000 00000000 cfb3111e d9c0e672 b199fc26 7d00477b
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000001 00000000 00000000 00000000 8fd7f747 1d1829ac 0768c9b2 15461738
+ars4x32 10 00000000 00008000 00000000 00000000 00000001 00000000 00000000 00000000 7bf0f87d f7574711 f2060d65 2d4648ca
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000001 00000000 00000000 00000000 a25a23a4 59e31c12 43b7712f 3b4db0b7
+ars4x32 10 00000000 00800000 00000000 00000000 00000001 00000000 00000000 00000000 9bb76c81 13279319 da45e911 e7acf8ac
+ars4x32 10 00000000 ff000000 00000000 00000000 00000001 00000000 00000000 00000000 45c6e2e7 1c1064b5 8cc499c0 60a32751
+ars4x32 10 00000000 80000000 00000000 00000000 00000001 00000000 00000000 00000000 ea1329f0 b4e46d1c 800e51a9 7abe2fb6
+ars4x32 10 00000000 00000000 000000ff 00000000 00000001 00000000 00000000 00000000 5385535f 75fd78fe 7627488b ae1cd2ec
+ars4x32 10 00000000 00000000 00000080 00000000 00000001 00000000 00000000 00000000 59637a22 8c35edc1 f80a44e4 a3c7aea9
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000001 00000000 00000000 00000000 77755dc9 106066b3 694b91f8 e3ea193d
+ars4x32 10 00000000 00000000 00008000 00000000 00000001 00000000 00000000 00000000 f05f3386 1cab5701 8937931b c617bcd1
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000001 00000000 00000000 00000000 ea05d264 8cbe6a05 f64e9f3e 39d51fca
+ars4x32 10 00000000 00000000 00800000 00000000 00000001 00000000 00000000 00000000 1db2d166 c8b21f45 897084ea 35c3bf03
+ars4x32 10 00000000 00000000 ff000000 00000000 00000001 00000000 00000000 00000000 f2b2c107 5e0a0c79 f4ccd6ee f28b47e3
+ars4x32 10 00000000 00000000 80000000 00000000 00000001 00000000 00000000 00000000 01ac4859 eb71b2ce 40dfc98a e4217138
+ars4x32 10 00000000 00000000 00000000 000000ff 00000001 00000000 00000000 00000000 0d1001e5 f20e6f86 196988ab a0bda0b9
+ars4x32 10 00000000 00000000 00000000 00000080 00000001 00000000 00000000 00000000 e1fc3ada a9cfe2d6 072e60e8 08110681
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000001 00000000 00000000 00000000 db24279e 2d1845bf 385a2256 3da77f6b
+ars4x32 10 00000000 00000000 00000000 00008000 00000001 00000000 00000000 00000000 234f6deb 9200575b 61cfb986 055d4a4d
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000001 00000000 00000000 00000000 7af7d320 10013dd4 3c765651 1d6fcf32
+ars4x32 10 00000000 00000000 00000000 00800000 00000001 00000000 00000000 00000000 635342f1 e8f843da 42926271 bc0f9c38
+ars4x32 10 00000000 00000000 00000000 ff000000 00000001 00000000 00000000 00000000 4ef05c09 5d6f2a07 2dbe6c53 40aa3a76
+ars4x32 10 00000000 00000000 00000000 80000000 00000001 00000000 00000000 00000000 618f6832 57cc23f0 e06b3858 7b8cc711
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000001 00000000 00000000 00000000 21d40a5c 21e528aa a1a359eb 9c02b159
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000001 00000000 00000000 00000000 42e0f6c1 5a350cc7 ca3d7163 bab442a1
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000001 00000000 00000000 00000000 417063dd 05895c8c aa1ad0f2 8a7e2516
+ars4x32 10 00000001 00000000 00000000 00000000 00000100 00000000 00000000 00000000 72a0ac1f 480fae16 3ee35313 d59218d1
+ars4x32 10 00000100 00000000 00000000 00000000 00000100 00000000 00000000 00000000 909a04f3 dee070ac 5d34d9f6 0057f628
+ars4x32 10 00010000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 9a214df4 a4449843 b5ad1ada edaa299d
+ars4x32 10 01000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 4846ef73 06c41885 6741882b 4d09e74a
+ars4x32 10 00000000 00000001 00000000 00000000 00000100 00000000 00000000 00000000 71d41253 9e730f5b 9705647d e25d4f88
+ars4x32 10 00000000 00000100 00000000 00000000 00000100 00000000 00000000 00000000 5adf8f61 784b1b6f 7c95509d afbfe97d
+ars4x32 10 00000000 00010000 00000000 00000000 00000100 00000000 00000000 00000000 994f3797 8bfeb14d 2c321c99 e88b5b0b
+ars4x32 10 00000000 01000000 00000000 00000000 00000100 00000000 00000000 00000000 3ce918ed 6302e8eb 4ffcbf54 4bd82ec6
+ars4x32 10 00000000 00000000 00000001 00000000 00000100 00000000 00000000 00000000 3d5fe3f7 ab107c15 6dcc7326 2824fb0d
+ars4x32 10 00000000 00000000 00000100 00000000 00000100 00000000 00000000 00000000 765b3288 51c9afcb a4c5741e 5bbeb453
+ars4x32 10 00000000 00000000 00010000 00000000 00000100 00000000 00000000 00000000 cec5baf1 93d7d9fc 3096a8e9 e277db63
+ars4x32 10 00000000 00000000 01000000 00000000 00000100 00000000 00000000 00000000 73d2fbb8 f299bef8 f4dc31cd f0338bd6
+ars4x32 10 00000000 00000000 00000000 00000001 00000100 00000000 00000000 00000000 0b8824b9 96d0f8fd 4d0fc3f9 d35cbe7b
+ars4x32 10 00000000 00000000 00000000 00000100 00000100 00000000 00000000 00000000 62f0abf0 a89ca8c1 05c82cc9 3cb5c328
+ars4x32 10 00000000 00000000 00000000 00010000 00000100 00000000 00000000 00000000 085e56bd 1d91f6ea 3c29fec0 1f703b97
+ars4x32 10 00000000 00000000 00000000 01000000 00000100 00000000 00000000 00000000 3a2f8790 5fba0608 f9992841 3de27411
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000100 00000000 00000000 00000000 ed032a22 05db0314 e8b6fa9e 1cd7d7dd
+ars4x32 10 00008000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 2b4c41b1 f5d7550b 96494e63 9dee9b50
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 7f046111 ef2b88be d7e01af1 c8540447
+ars4x32 10 00800000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 8904c8b5 1bff107c 89de1122 f078fe9e
+ars4x32 10 ff000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 91d45dec fe7a07dd 003e5ca6 98b2f680
+ars4x32 10 80000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 66e6c7c0 3d668856 bd6208df dd6c0b04
+ars4x32 10 00000000 000000ff 00000000 00000000 00000100 00000000 00000000 00000000 12165f49 5bb73eab ebe55978 d391b601
+ars4x32 10 00000000 00000080 00000000 00000000 00000100 00000000 00000000 00000000 9096afe3 8c271d02 02d21b32 20c3a8b9
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000100 00000000 00000000 00000000 2b13a66e b47a554a ceb1047e 1fa90048
+ars4x32 10 00000000 00008000 00000000 00000000 00000100 00000000 00000000 00000000 f056db2d deaaa7ce 829d9400 8457dad7
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000100 00000000 00000000 00000000 c2ec8828 0987967a ea4e82f9 da6cb8eb
+ars4x32 10 00000000 00800000 00000000 00000000 00000100 00000000 00000000 00000000 c4a587d7 4eae030f 71af5aa7 17470690
+ars4x32 10 00000000 ff000000 00000000 00000000 00000100 00000000 00000000 00000000 b37dcd16 221b0d99 9c3ee696 b5a768eb
+ars4x32 10 00000000 80000000 00000000 00000000 00000100 00000000 00000000 00000000 e3528871 e932bab8 3b5575fa 640afb7b
+ars4x32 10 00000000 00000000 000000ff 00000000 00000100 00000000 00000000 00000000 14377abb 63c257a7 271e195c b3c779fa
+ars4x32 10 00000000 00000000 00000080 00000000 00000100 00000000 00000000 00000000 4a8b3b3c 2f2d8018 95f0f21d 70cc5020
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000100 00000000 00000000 00000000 ef4d408f c66ddec4 cf3e8e5b 2e4d80a6
+ars4x32 10 00000000 00000000 00008000 00000000 00000100 00000000 00000000 00000000 195c0040 e612419d 6870bb86 037c5e1c
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000100 00000000 00000000 00000000 716308b0 8845c05a bfec797f 178fccb3
+ars4x32 10 00000000 00000000 00800000 00000000 00000100 00000000 00000000 00000000 0144107c b2391277 2a953a84 17b80885
+ars4x32 10 00000000 00000000 ff000000 00000000 00000100 00000000 00000000 00000000 d6c2189d 2f394669 b780f227 1d7f1b9f
+ars4x32 10 00000000 00000000 80000000 00000000 00000100 00000000 00000000 00000000 0c53c3e4 bfeb3488 560ac071 9076c1ed
+ars4x32 10 00000000 00000000 00000000 000000ff 00000100 00000000 00000000 00000000 06cd9d79 8725dc30 e8620e96 832b78b2
+ars4x32 10 00000000 00000000 00000000 00000080 00000100 00000000 00000000 00000000 590a48df c970e88e 215eff00 5f65a014
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000100 00000000 00000000 00000000 b6be10a4 54e96084 f7b1c020 5667a715
+ars4x32 10 00000000 00000000 00000000 00008000 00000100 00000000 00000000 00000000 0158f44f 096ba2ba b7ccce1a 1ee18eb7
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000100 00000000 00000000 00000000 e2aeff6c 3c9f9df9 75d95894 96e56309
+ars4x32 10 00000000 00000000 00000000 00800000 00000100 00000000 00000000 00000000 e43683f9 6d48b586 89822f15 c24ab59e
+ars4x32 10 00000000 00000000 00000000 ff000000 00000100 00000000 00000000 00000000 91535e7f 89114f9f c173e3a4 b0ac992a
+ars4x32 10 00000000 00000000 00000000 80000000 00000100 00000000 00000000 00000000 99af942b fe15e28d 0eb06c81 62509724
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000100 00000000 00000000 00000000 5b594541 b7fab0dc 89f9ca5d ea0db0de
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000100 00000000 00000000 00000000 a3703024 38b84df2 a4686a4c c2a647f5
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000100 00000000 00000000 00000000 ff22a6fe 66be6769 aec16d23 905b0622
+ars4x32 10 00000001 00000000 00000000 00000000 00010000 00000000 00000000 00000000 fd1af696 5378a483 2a7902de d90db43e
+ars4x32 10 00000100 00000000 00000000 00000000 00010000 00000000 00000000 00000000 5b8189ee d7af776f 58b70db1 8b21950f
+ars4x32 10 00010000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 aae746c3 335eb675 a093d5d7 4437e425
+ars4x32 10 01000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 4183ba0e 2c7f021a 9b5e19be 961ef6b9
+ars4x32 10 00000000 00000001 00000000 00000000 00010000 00000000 00000000 00000000 8cfaf2cd 9679da95 f58b3663 13dece23
+ars4x32 10 00000000 00000100 00000000 00000000 00010000 00000000 00000000 00000000 a4c5273c 93f1e56e 00c1b09e 8fe9f0a3
+ars4x32 10 00000000 00010000 00000000 00000000 00010000 00000000 00000000 00000000 de7add1b 7b602b8b 6f51d466 d5b704f7
+ars4x32 10 00000000 01000000 00000000 00000000 00010000 00000000 00000000 00000000 3b0ac4d1 1604d0e9 c2efbeb8 49234e1d
+ars4x32 10 00000000 00000000 00000001 00000000 00010000 00000000 00000000 00000000 0b137f97 68b33f23 94c15a81 b9b0eb77
+ars4x32 10 00000000 00000000 00000100 00000000 00010000 00000000 00000000 00000000 dca890a0 a82d10a7 0c548dd9 935541dd
+ars4x32 10 00000000 00000000 00010000 00000000 00010000 00000000 00000000 00000000 bb299133 967b5068 c3c080cd afb20355
+ars4x32 10 00000000 00000000 01000000 00000000 00010000 00000000 00000000 00000000 05b8865b 2b4bbba1 a0769fd0 68eefc0f
+ars4x32 10 00000000 00000000 00000000 00000001 00010000 00000000 00000000 00000000 f69dfef6 3b4bead5 5fceac0f 73b6cb5d
+ars4x32 10 00000000 00000000 00000000 00000100 00010000 00000000 00000000 00000000 71b4613f c0f36665 75746911 75fc8724
+ars4x32 10 00000000 00000000 00000000 00010000 00010000 00000000 00000000 00000000 87bce4ef 0763cd7e ac659500 dcd4abe5
+ars4x32 10 00000000 00000000 00000000 01000000 00010000 00000000 00000000 00000000 1334dcee a9e3a84b f5541b4b fa03c8c3
+ars4x32 10 0000ff00 00000000 00000000 00000000 00010000 00000000 00000000 00000000 b00ef56f 052800d1 f563e286 e3e0c3c6
+ars4x32 10 00008000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 06fd42be d01bd239 8dfc2b89 178357cc
+ars4x32 10 00ff0000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 1d3e451b 1dd7fad8 a9147b03 7ee20538
+ars4x32 10 00800000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 555d8ec6 0764fbde 5649615a d700e43e
+ars4x32 10 ff000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 11eb0368 f5f67768 35bfa350 f3f0ff8f
+ars4x32 10 80000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 5ed1e7d1 6180fd1a 4e755be0 dcda0759
+ars4x32 10 00000000 000000ff 00000000 00000000 00010000 00000000 00000000 00000000 20ea794e 29e33a57 8ab149b6 f867e36f
+ars4x32 10 00000000 00000080 00000000 00000000 00010000 00000000 00000000 00000000 7c091aab e38ab356 5d488601 89edc670
+ars4x32 10 00000000 0000ff00 00000000 00000000 00010000 00000000 00000000 00000000 8174879e b33931a4 5d0c5717 ae86c09c
+ars4x32 10 00000000 00008000 00000000 00000000 00010000 00000000 00000000 00000000 d741a12a 69239d5d ccbab809 b88e680d
+ars4x32 10 00000000 00ff0000 00000000 00000000 00010000 00000000 00000000 00000000 0a718384 2ad5217d a98b5369 b917ff13
+ars4x32 10 00000000 00800000 00000000 00000000 00010000 00000000 00000000 00000000 0b7dc6ba 15709a53 f9ba3787 b14a4762
+ars4x32 10 00000000 ff000000 00000000 00000000 00010000 00000000 00000000 00000000 ed61078d 146e50da c907e4ce 504676b4
+ars4x32 10 00000000 80000000 00000000 00000000 00010000 00000000 00000000 00000000 21b4604c fd5740e3 9c4e16de 5c97f02b
+ars4x32 10 00000000 00000000 000000ff 00000000 00010000 00000000 00000000 00000000 4618e0bd 7723923b fff48883 488b574c
+ars4x32 10 00000000 00000000 00000080 00000000 00010000 00000000 00000000 00000000 830e64af 8a583bd0 877e69b3 2889afd3
+ars4x32 10 00000000 00000000 0000ff00 00000000 00010000 00000000 00000000 00000000 c9982b20 703c4841 8d27bbdc 658c69e7
+ars4x32 10 00000000 00000000 00008000 00000000 00010000 00000000 00000000 00000000 e65236c6 43d9f184 44306648 ab1234d7
+ars4x32 10 00000000 00000000 00ff0000 00000000 00010000 00000000 00000000 00000000 ee67b8e8 64d2128b 85a2de0e 93a9aff6
+ars4x32 10 00000000 00000000 00800000 00000000 00010000 00000000 00000000 00000000 66d264e4 a46aa477 4c735fb0 9d59c142
+ars4x32 10 00000000 00000000 ff000000 00000000 00010000 00000000 00000000 00000000 8e17378f 267db9e2 d12a015f 18fbe34f
+ars4x32 10 00000000 00000000 80000000 00000000 00010000 00000000 00000000 00000000 f3439b2c fadad898 25014f01 5099d9f5
+ars4x32 10 00000000 00000000 00000000 000000ff 00010000 00000000 00000000 00000000 3eeebe70 bc9a61d9 afbcdae9 4f87accf
+ars4x32 10 00000000 00000000 00000000 00000080 00010000 00000000 00000000 00000000 60b54112 73002122 cc8949b3 e5821081
+ars4x32 10 00000000 00000000 00000000 0000ff00 00010000 00000000 00000000 00000000 70852928 211bab69 86b713dc 2234fddb
+ars4x32 10 00000000 00000000 00000000 00008000 00010000 00000000 00000000 00000000 97992054 2e7cf8a6 f7cbcd18 585e18bd
+ars4x32 10 00000000 00000000 00000000 00ff0000 00010000 00000000 00000000 00000000 511b8cf0 f5bdc929 dd620ff5 a3f29b63
+ars4x32 10 00000000 00000000 00000000 00800000 00010000 00000000 00000000 00000000 552608b7 49a1b891 96658c98 b8655fe2
+ars4x32 10 00000000 00000000 00000000 ff000000 00010000 00000000 00000000 00000000 ef7d4bf4 e9f48f98 b56a03ec f4a406c0
+ars4x32 10 00000000 00000000 00000000 80000000 00010000 00000000 00000000 00000000 4eda0692 f78cdc59 a8df1cc3 54192d76
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00010000 00000000 00000000 00000000 5550ef69 36bc1242 5bc4d226 57dfc1fd
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00010000 00000000 00000000 00000000 9eea7478 7181135b 9c46c00e 14ab98cb
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00010000 00000000 00000000 00000000 0e83e4e0 2c1a2165 03e84f54 bad9495a
+ars4x32 10 00000001 00000000 00000000 00000000 01000000 00000000 00000000 00000000 fc860b1c 81fd3b9b e00affc5 371e9791
+ars4x32 10 00000100 00000000 00000000 00000000 01000000 00000000 00000000 00000000 7c48a581 57f33193 c825dd82 ced9cd59
+ars4x32 10 00010000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 ab3fbb2a f0c5af6c e0c8032e c7625f7c
+ars4x32 10 01000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 93af7909 9477151a 257f9650 75d45378
+ars4x32 10 00000000 00000001 00000000 00000000 01000000 00000000 00000000 00000000 de139644 12373518 10a91988 b46ff4c9
+ars4x32 10 00000000 00000100 00000000 00000000 01000000 00000000 00000000 00000000 15d90584 72abfec9 e90d0b25 087a54aa
+ars4x32 10 00000000 00010000 00000000 00000000 01000000 00000000 00000000 00000000 f454dd05 18db0405 ba4da74e 135e6dd7
+ars4x32 10 00000000 01000000 00000000 00000000 01000000 00000000 00000000 00000000 57223ac0 691401c5 04289c5f 1fd99b47
+ars4x32 10 00000000 00000000 00000001 00000000 01000000 00000000 00000000 00000000 4d01c327 7eb0aae9 f8dbc2d1 4449f6da
+ars4x32 10 00000000 00000000 00000100 00000000 01000000 00000000 00000000 00000000 8802025e 2335325c 10681d07 485fa32d
+ars4x32 10 00000000 00000000 00010000 00000000 01000000 00000000 00000000 00000000 91fdb751 1e470175 13154e9b bd7a980c
+ars4x32 10 00000000 00000000 01000000 00000000 01000000 00000000 00000000 00000000 90de49e9 71233994 8524b5d9 9e02d455
+ars4x32 10 00000000 00000000 00000000 00000001 01000000 00000000 00000000 00000000 ad2d1804 acee0a47 bab650ea d4e5cb98
+ars4x32 10 00000000 00000000 00000000 00000100 01000000 00000000 00000000 00000000 f046e106 b280a9f6 af60ab90 3d102592
+ars4x32 10 00000000 00000000 00000000 00010000 01000000 00000000 00000000 00000000 437e3d76 6a0864c1 244daddf 6a018f67
+ars4x32 10 00000000 00000000 00000000 01000000 01000000 00000000 00000000 00000000 fc995c91 5eeb4755 2ed9f981 f4c15509
+ars4x32 10 0000ff00 00000000 00000000 00000000 01000000 00000000 00000000 00000000 3b59c5d2 70ba805d b0ea3ebd 0e369797
+ars4x32 10 00008000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 80c308fc 49264772 811ea2e6 0332d35f
+ars4x32 10 00ff0000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 b59962e6 31218d76 eb1dc97e 09d71d31
+ars4x32 10 00800000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 94049e5b 21f2ad69 aaeea03b 2dbe9379
+ars4x32 10 ff000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 86b06282 ddc76d90 47b21c7a 6d426bb8
+ars4x32 10 80000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 80f4e2bd f5b8d606 563e0268 5c79dee5
+ars4x32 10 00000000 000000ff 00000000 00000000 01000000 00000000 00000000 00000000 1701491b 144d5be1 7a2abfa6 1539d924
+ars4x32 10 00000000 00000080 00000000 00000000 01000000 00000000 00000000 00000000 2df222cd 1e1d897a a8338527 0d932cbb
+ars4x32 10 00000000 0000ff00 00000000 00000000 01000000 00000000 00000000 00000000 158de244 1384539d 0820155b b97fbfde
+ars4x32 10 00000000 00008000 00000000 00000000 01000000 00000000 00000000 00000000 472c8495 a2ffa86e 0f8f0023 02725dcd
+ars4x32 10 00000000 00ff0000 00000000 00000000 01000000 00000000 00000000 00000000 41498fde da77bceb dad8421f 6c03848b
+ars4x32 10 00000000 00800000 00000000 00000000 01000000 00000000 00000000 00000000 6485b186 a59cc5d2 d235ca5a ddb2a88a
+ars4x32 10 00000000 ff000000 00000000 00000000 01000000 00000000 00000000 00000000 51a11ce0 4ee3b8d6 3eedc6c5 42fc8b28
+ars4x32 10 00000000 80000000 00000000 00000000 01000000 00000000 00000000 00000000 4091fc6c 65000c0c 1236a673 c3d26d7e
+ars4x32 10 00000000 00000000 000000ff 00000000 01000000 00000000 00000000 00000000 498db7a3 386ecc4f 1b39a73e 61a74aa6
+ars4x32 10 00000000 00000000 00000080 00000000 01000000 00000000 00000000 00000000 4faf0b29 8aab2130 81b0d347 a1c0701e
+ars4x32 10 00000000 00000000 0000ff00 00000000 01000000 00000000 00000000 00000000 da0b6dd1 d5ecde42 99cd9db1 410c63b6
+ars4x32 10 00000000 00000000 00008000 00000000 01000000 00000000 00000000 00000000 11873158 9c5af954 4afd1c56 ef1a5b58
+ars4x32 10 00000000 00000000 00ff0000 00000000 01000000 00000000 00000000 00000000 2577dc2d c937bf7e 70db2e79 12fec747
+ars4x32 10 00000000 00000000 00800000 00000000 01000000 00000000 00000000 00000000 84125aa3 95cd880f 84b3a5ae 5bc903d5
+ars4x32 10 00000000 00000000 ff000000 00000000 01000000 00000000 00000000 00000000 491bff18 a58abc16 980f071b 3efc1a0f
+ars4x32 10 00000000 00000000 80000000 00000000 01000000 00000000 00000000 00000000 3bf95ff6 e2331d1e 1d7120f5 909ef332
+ars4x32 10 00000000 00000000 00000000 000000ff 01000000 00000000 00000000 00000000 cbf60703 aefcd779 c448583e fd7e1d9f
+ars4x32 10 00000000 00000000 00000000 00000080 01000000 00000000 00000000 00000000 694d10a6 83259031 7eac1d10 876c6404
+ars4x32 10 00000000 00000000 00000000 0000ff00 01000000 00000000 00000000 00000000 d3d427ec 67a13a84 5bdcb359 37356889
+ars4x32 10 00000000 00000000 00000000 00008000 01000000 00000000 00000000 00000000 2790c7e3 3b276547 4e807221 811fc030
+ars4x32 10 00000000 00000000 00000000 00ff0000 01000000 00000000 00000000 00000000 e9b889b3 07dc1d5c 69d3481f 088a62a3
+ars4x32 10 00000000 00000000 00000000 00800000 01000000 00000000 00000000 00000000 3b19c924 8eb03fee 7729ea7d 208a494f
+ars4x32 10 00000000 00000000 00000000 ff000000 01000000 00000000 00000000 00000000 838374fa ce7514da 84b027c5 bb34b237
+ars4x32 10 00000000 00000000 00000000 80000000 01000000 00000000 00000000 00000000 81617bdf 3cbce010 39410cbd 8f866b7e
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 01000000 00000000 00000000 00000000 beb5befb 81de37f7 9d71d7f3 1355920a
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 01000000 00000000 00000000 00000000 95d1beab 03d40658 8a3c77c8 c7ff1269
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 01000000 00000000 00000000 00000000 b7fde77f 17befdd0 62cdc28e df0fc922
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000001 00000000 00000000 bfd4f3d1 ecc3187a cdff4528 1718ed47
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000001 00000000 00000000 40ce4318 f222abd1 d504fc5c 2bcfb432
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 acb1f467 2e1e7d92 8ae54caa 4c40966d
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 31f42074 9b42fec4 6904b2e6 a0394425
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000001 00000000 00000000 97bf20ea 01410ccd 903cbe64 9a01639a
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000001 00000000 00000000 7eabeb65 5838f760 b6d5acb7 9946e5f3
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000001 00000000 00000000 9293178d 1488e417 92b6b94c 6bee2ed3
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000001 00000000 00000000 e1e6e986 ff6a5697 6990f8e7 2ff09e37
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000001 00000000 00000000 30641bb8 95408420 559d692f 9da284a8
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000001 00000000 00000000 d367be4f 153ce862 ec4caf3e b541f0c9
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000001 00000000 00000000 3e38cb33 a34ca8b2 a5ce5b8f c3698852
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000001 00000000 00000000 459a9382 dcfb0e97 b448d680 ad54f2e0
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000001 00000000 00000000 d8b662a7 fdcf5fc6 8362b5d1 c49d7fdd
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000001 00000000 00000000 631d0b89 aa692571 3b6fbd45 23b148ec
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000001 00000000 00000000 2d239410 b738d860 03a139fd 83c2e20f
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000001 00000000 00000000 78f4cc47 8e254e87 423e3555 bdd03738
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000001 00000000 00000000 96100ad9 afb67343 a017ef86 e81ff838
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 a31342cd be973fc0 cd421b80 4ce07c86
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 75040d45 c26cc386 1a72b4d8 168c7cc7
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 7b391fd8 721c3746 5b681c84 1ed54b5c
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 2710673e 74feb97b 5da20bcf dd664a98
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 5b29f83b 1cc13a86 c33cea1f 078f80e9
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000001 00000000 00000000 646f76d2 bcd60477 b114f75a 675d0eaf
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000001 00000000 00000000 7e7fcfa1 5447f6c0 45acb805 ce1e029d
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000001 00000000 00000000 f6c0cdd6 c00123bc dbdd876a 809954db
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000001 00000000 00000000 1444a4c7 114a1082 ab0826e8 41b7ceff
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000001 00000000 00000000 da769fd5 5dab338d d2651bf4 8ff5e181
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000001 00000000 00000000 5f49458b f30e7822 37318817 431d9788
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000001 00000000 00000000 cd545d32 91fdfca3 ee1bc378 d5de49e3
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000001 00000000 00000000 e2daef77 fdca4c2e af7e0fbe c4f92ca0
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000001 00000000 00000000 3c35a24d 054f1076 5608cdfe e0daab21
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000001 00000000 00000000 2e7757ad 966ab208 d833608e bf8d94eb
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000001 00000000 00000000 00efc870 541575d6 00596efa 9735d2d0
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000001 00000000 00000000 c4de9e0a cd3b7939 19c2ca34 91cc6caa
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000001 00000000 00000000 ad5c7145 608b2764 2688d22a 4ce0fbf8
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000001 00000000 00000000 f41ba454 80441dfc 3405e53b d794fd33
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000001 00000000 00000000 60be9130 b451879b 19922d8f 1f9a4fd3
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000001 00000000 00000000 67800d7c 07db99ce 6ffbcfc7 755321a4
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000001 00000000 00000000 13894f1d 2488f85d e904b6f0 3840c79f
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000001 00000000 00000000 58f7922b aa6ce608 d93bd8d8 3ca9f6ea
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000001 00000000 00000000 528acc48 9aa02e61 5521500e 18555b6c
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000001 00000000 00000000 508109ec 559b7023 64e3e562 2df69fba
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000001 00000000 00000000 18b56a1a 417812b1 263c7be3 b37183c1
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000001 00000000 00000000 c0d51b22 2fbc6c94 57bc4bd6 68cf5022
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000001 00000000 00000000 2e7460db 9fa33fee 41d322bd f82953c5
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000001 00000000 00000000 6477708d b6ed7061 fb9047db 8a42e3cf
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000001 00000000 00000000 41e2795a f4c16966 19d92cf2 2ca279a9
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000001 00000000 00000000 58b993db 5576ccd3 74d2aba9 ccc12df4
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000001 00000000 00000000 aaf7fc35 5f3edfb9 6ccd2e41 23239042
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000100 00000000 00000000 060e57e2 5b2951fc f1a12bba 6ee00755
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000100 00000000 00000000 74c867ed a4d7421a 9096722a dbfe336b
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 c22c998a c1cc03e1 9321470c 1a917550
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 b3399733 41a29fc2 f853ab4f a5335c76
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000100 00000000 00000000 4748503e 0cac3731 08b43c28 978e8899
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000100 00000000 00000000 06ed60de fddd401d 42481e9f 75b1a5a3
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000100 00000000 00000000 6721c6c7 d20d3ebe f3fe66b5 ff71a033
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000100 00000000 00000000 95ba8f60 67834224 a72d0de8 15cbdfa7
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000100 00000000 00000000 2fddcba6 995c62e9 2958150d b9f739df
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000100 00000000 00000000 3a2813c1 7a71f3a9 a556f619 21cba117
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000100 00000000 00000000 ba1c117b 81b89f93 201c9b0b 111e7fc3
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000100 00000000 00000000 e7bf6a5a 03c8d18b f1b9a08d 63a58137
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000100 00000000 00000000 eacd39d2 c0b6a1f1 94322d0b c6c343aa
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000100 00000000 00000000 dbaf44de edfe1d58 36275f08 3986269e
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000100 00000000 00000000 a57d1092 2f544c57 13bc0871 fa43d886
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000100 00000000 00000000 5a9a6ce7 650a3536 9f6e6f49 3891361d
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000100 00000000 00000000 1d628619 73d8a773 18f02dbf e8ff2d8b
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 10bbe054 e899a607 e6f6c151 4fa59102
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 00d3c748 0412c157 030d7094 bbb9b671
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 b1f4fb4e cf597a37 bc42d357 77fef051
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 bcdbfc69 2d2f450e 2f48a872 0e5a2aad
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 9a195442 9cf3a70b fb778338 be621807
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000100 00000000 00000000 8f746c68 0f34e2cb a9bbad63 fcb9ed3e
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000100 00000000 00000000 e209361f b9d770d0 f0401031 14471c8c
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000100 00000000 00000000 14587472 aee079a7 9d248e9b 84bf98d5
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000100 00000000 00000000 5617cd7e cf121cb3 a7fea455 602172fe
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000100 00000000 00000000 ebcf671f 5c5b7c31 c23126a7 8a213279
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000100 00000000 00000000 a2c9274b 0df40531 0e1fb929 12c747d4
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000100 00000000 00000000 08671a9f 3c455428 b10ed0ff a03c7578
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000100 00000000 00000000 ab400477 e772d792 c852367e b3be7c96
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000100 00000000 00000000 8ad68f38 00412fbe 5d7b18be e168bac7
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000100 00000000 00000000 74c7af57 08dc5f8b 3ab9cd75 cdd2b74a
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000100 00000000 00000000 992ce9ed 8d739ea1 21aba89a 4f4001d3
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000100 00000000 00000000 13ad16b2 bd562f32 a42a41ef 736d72b2
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000100 00000000 00000000 cb573a84 0f0ddb71 1f5a43f1 e874ea9e
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000100 00000000 00000000 aefac238 c2550422 e7c52da2 1e296fb1
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000100 00000000 00000000 31ee3d43 ca3deb61 fb236218 36ce79e0
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000100 00000000 00000000 0173e654 5938583b 134210ce faaf72cf
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000100 00000000 00000000 71d627bf d946907f a0632309 b1e5cf47
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000100 00000000 00000000 2b7a2f55 1b843650 566c98b8 5b792892
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000100 00000000 00000000 6449f4cb d91cc504 8e90409e 15ced0ce
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000100 00000000 00000000 8174d8b0 c0ee31ef 972940b1 403d1f21
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000100 00000000 00000000 80f58285 8bb0a5e2 78664e39 5222725a
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000100 00000000 00000000 a6e5122d 86a514fc 699eaf15 3a32b327
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000100 00000000 00000000 168f76ba 20b994ee 62f80250 d965092b
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000100 00000000 00000000 6c332825 becccb7e 8a044408 38e14a79
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000100 00000000 00000000 62e41263 47de94d7 3bef0ab5 99b7c6c3
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000100 00000000 00000000 df68edfe f42fbd44 552f75c1 449bff8d
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000100 00000000 00000000 32409ac9 d4afe040 3d4166b7 b5ba0843
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00010000 00000000 00000000 79744520 ab471dee 2229ee76 142f29a5
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00010000 00000000 00000000 da1f0f64 3ac98f1a dfcfdc39 91c5493c
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 8063c637 8143b753 efbb9cc6 a4779ea0
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 41c71d46 39e540b0 b1edeb98 3f40c392
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00010000 00000000 00000000 e3010a49 beecef10 19fed042 d6d65129
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00010000 00000000 00000000 c61ae084 122f9d86 417c0ab6 64f63ddd
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00010000 00000000 00000000 088ac5bb 0cd34875 75552299 b46d2df9
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00010000 00000000 00000000 472a81ed a0f827b8 ea577e51 efee88e1
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00010000 00000000 00000000 245b80d4 511c60bc fda74051 4cc6874c
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00010000 00000000 00000000 1a874d01 b1fa2411 8a79844a 609e11d0
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00010000 00000000 00000000 5b0e23d8 94ded59e 4f0280e4 4de98d46
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00010000 00000000 00000000 b396a7e4 adc70056 ce376050 7028adb3
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00010000 00000000 00000000 6e21e594 7a62bd3e 4abb9ed4 838dc27c
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00010000 00000000 00000000 88974616 cf4faf02 ee9f97d4 b7f44dfa
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00010000 00000000 00000000 6e263cf1 791e4a77 69213927 51eb46d0
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00010000 00000000 00000000 17a1f6b9 450efddb 5f369ea1 e259d647
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00010000 00000000 00000000 db2b30fd 1eb49923 6e46d2ad b41ea3e2
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 cdf245ec 1eafa5af c8d72b40 1e7e33b0
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 112ea2b5 eeb733dd d9190cf1 d6fca246
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 156db0b5 afdb177e 882309da b3acd61c
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 666d782b 0c479c66 b149ccd0 b822c6a8
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 3c3871b8 ec24e8f0 24949528 302f11c0
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00010000 00000000 00000000 b94bb344 533ec7fc 2ee3a059 f15953bf
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00010000 00000000 00000000 9bcf62ce 52c7fad3 1df2cfaa ba441314
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00010000 00000000 00000000 3d86e62b 0b798100 18f85c0b c758eaff
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00010000 00000000 00000000 503004e7 ef0fbb14 098e9cdc ce9eb330
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00010000 00000000 00000000 a5ca0432 f1b38bb4 5b9a8918 ff286165
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00010000 00000000 00000000 c1c96fee 935518f6 67986b63 f2c8a5cd
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00010000 00000000 00000000 8fe8428e ddfaf73c 563ef193 090dc8db
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00010000 00000000 00000000 6398312c dfd17c95 c85f20d3 f618c47b
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00010000 00000000 00000000 333d8f64 3fb516e2 bb91bd0e a031b72e
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00010000 00000000 00000000 15d89365 a663b6ee 20f86c41 24e71dbc
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00010000 00000000 00000000 6865715a 19a35bfd fcbbeafa 44b787e4
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00010000 00000000 00000000 5ae0faf9 8779d15d 524734e3 a7f0cf34
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00010000 00000000 00000000 ee108acb 4d5a248c 52045add 2ddf877d
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00010000 00000000 00000000 6b99345b 5e99a8a3 f396433e a9d49c98
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00010000 00000000 00000000 059bfcc1 c7584fbd 3f1e4a70 ac3957ed
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00010000 00000000 00000000 b6d51c0e cfcf17ae cf3b9440 00fc2908
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00010000 00000000 00000000 6c728ec5 f8f32e4b 4b35172a f8f8395c
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00010000 00000000 00000000 28dbd11e b5748583 934b929e a6700643
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00010000 00000000 00000000 811ceff5 2eea3339 e548ef68 15c50b0f
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00010000 00000000 00000000 e2883bbc 74ea0e81 fb1756e3 943d29b0
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00010000 00000000 00000000 5f3863d1 4a71611b b2c055a2 79e7fa19
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00010000 00000000 00000000 69c24de1 6e892c47 e493bf8c 2899cc43
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00010000 00000000 00000000 cbd7176f 72a9ab45 93c16a50 f3fe8bc6
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00010000 00000000 00000000 d75a6592 be01362b 7976f7d3 0adbb2a8
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00010000 00000000 00000000 3ddaafe2 6fe742c5 354f8a52 d6d29e5a
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00010000 00000000 00000000 ef6fb762 4cd0001d 16c68b0b 2dbb0aba
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00010000 00000000 00000000 7995d3ed d1ff5dd4 a66c5408 b7b57f46
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 01000000 00000000 00000000 3fb0f209 ec46902b b0cb92f0 71cd4dc8
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 01000000 00000000 00000000 e37240c3 940ecd2c 8a8b8880 825c2d60
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 874b17f1 25ddfd8e dbb86906 c239527e
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 b4216b45 8d5efd6c d0b0cf3c afc15920
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 01000000 00000000 00000000 1c0a1a33 0c58d79a 1dc31f0a 3f3e48ad
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 01000000 00000000 00000000 f1131a69 c1ada617 09b19130 bb3a2dd6
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 01000000 00000000 00000000 d7c2737f f4e4cd53 8d555496 bc8588cb
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 01000000 00000000 00000000 54e46015 02c0955b 570df0fa 5a4ee4ce
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 01000000 00000000 00000000 330d20b0 becff70f 69e6b919 edfa2357
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 01000000 00000000 00000000 9c521989 4b461e45 c1728d66 47a5c9e3
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 01000000 00000000 00000000 98930d07 5b30e46c 86d53a54 dc47bd07
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 01000000 00000000 00000000 4ba983e8 06bbbcd3 30d0c62e 3de153b5
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 01000000 00000000 00000000 e9ee0e5a 4a518bec 48d97ffb 1a051110
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 01000000 00000000 00000000 7382e3ed a18970ab 114f2724 94722940
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 01000000 00000000 00000000 459b82b3 1ebb9005 5b8b6b37 dddc4c1d
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 01000000 00000000 00000000 9f5a2184 e3010010 8b75e977 6f9e0698
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 01000000 00000000 00000000 77c4a50c b3d073e7 c3e061e7 56118fe4
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 d9d8eb8e e2370636 2d916219 39ad2085
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 28e28abe 3972d404 31eb3d2f 0324d171
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 1ee43af3 02e8fb9e 9b94a6b8 213cbc8d
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 96ba9165 84971203 2a5af6d7 cfbe4757
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 f3b43fb3 7c208a83 a33d5ddd 2206abdd
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 01000000 00000000 00000000 a8621d78 c3bdef73 40fa56d4 9d5df72d
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 01000000 00000000 00000000 53117285 512402a4 002f894c 1fca6b16
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 01000000 00000000 00000000 c6e4be24 808dc4d1 4d0485fd c0445b33
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 01000000 00000000 00000000 8b9639ad 06d9825d 2bccd907 7a288325
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 01000000 00000000 00000000 94772093 aa59262d 2fdf153e 74b4dcb3
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 01000000 00000000 00000000 1b8cff46 9cefb067 69df31d3 1b739b43
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 01000000 00000000 00000000 0ee5bd64 1e83b18a a1e22225 868c1831
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 01000000 00000000 00000000 1e9e60bd 813b3fd1 231f614a 84d597df
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 01000000 00000000 00000000 5efca986 7c4e56df de86fd5e 88bb87b7
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 01000000 00000000 00000000 dd4e54e7 a25f2f2e a3010ebd c8f3fa61
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 01000000 00000000 00000000 8bce1a3d 8f055227 cde20b9e 282de09d
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 01000000 00000000 00000000 65b19137 c0aeb93a 38989860 fd7987a5
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 01000000 00000000 00000000 0698b753 8b1a360a 47ed543f 723f8714
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 01000000 00000000 00000000 f252603c 25733ab7 1890301e d99576c1
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 01000000 00000000 00000000 94234fe0 d5978da9 b557b299 8281fc07
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 01000000 00000000 00000000 f03e782d b654780b 9ed5614d 9a050adf
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 01000000 00000000 00000000 7f5fa570 0e293e10 1f9fda22 e843efe2
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 01000000 00000000 00000000 bd3027f3 fb400d64 9bc46c03 f2d69986
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 01000000 00000000 00000000 3b283179 c530d618 121e3991 b0151d60
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 01000000 00000000 00000000 bad9bfb6 8e6d58d2 ec9ca2db 53d305b0
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 01000000 00000000 00000000 40b89c8f 06ec7b3a db7e2330 2e6924ff
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 01000000 00000000 00000000 b2f5b121 47028501 2e42db1f beabfc13
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 01000000 00000000 00000000 23130470 729b594a 8d436499 592b860f
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 01000000 00000000 00000000 d644c6c2 079ade86 ea18abff 1599ac31
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 01000000 00000000 00000000 eec33e51 af4070e6 70867f49 f2c76cb5
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 01000000 00000000 00000000 8a5612a0 59d12ee9 81d1e679 64880e10
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 01000000 00000000 00000000 fa481e8a 4aee6a4a 3743c22b 43c29a06
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000001 00000000 3b6da218 dead2919 1881c9f1 1fbae2fa
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000001 00000000 cca52c27 2c7f5e1e 018a877b 0427fcf3
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 bfbd5600 484665db e30ba803 029ac957
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 0207c89e e2faa9a2 9c6f6b7f bf644286
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000001 00000000 28a535e4 1e633eab 9e99accd 39dfbac7
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000001 00000000 3a3da075 f7b97e3c 92ddd583 a9c0515a
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000001 00000000 ea044d54 72acc464 9f564e5a 8e803cf6
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000001 00000000 30b877dc 27cbee0e e157547a b50a3229
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000001 00000000 03fadd0d f684cc55 c93a2bc6 3157a8aa
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000001 00000000 9cd1c3dc 9cbf9642 5bba5f7e cc57560e
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000001 00000000 5d45da73 ad72f4e5 217d6f04 e01018e8
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000001 00000000 4f79a630 681862d0 9187a7a9 d2b6228b
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000001 00000000 3f22ac01 326f4bdc dc59699a 31131031
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000001 00000000 ca569cca 4a1234cc 011ef9e9 3acc0871
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000001 00000000 35c2e79a 6d82a846 cfdb03ea 7cc737ec
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000001 00000000 1607d796 6414bb50 f1d68168 415d0fe5
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000001 00000000 b758a508 9a19d3d0 05cf6c00 aa56a110
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 b318b4fa 9b487e27 6d78ccce b35d9944
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 1a1c53b4 97410980 0fd3f17f 54e1b36d
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 b352246e b53e32d1 fe17691a ce07debf
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 c012668a 91d42293 f0fa88db c46400b2
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 520ca484 208436e1 2dd1d264 60baa37c
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000001 00000000 b60d427f 7f740c3a 8a42180a aa2435a5
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000001 00000000 dccf627e f30e00ff 41aadaac 96b44f6d
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000001 00000000 c9062243 f61fa301 4eae59e9 4bc9ca87
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000001 00000000 589e53a9 e7a18b34 7f81eec5 448cde5a
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000001 00000000 d3b52fa5 0bec4e82 db777641 d6d7ce1c
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000001 00000000 646d0325 9a95656e 1f5bbc36 4f5c8d31
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000001 00000000 40e7ff1f 8db8807e 24e406c1 e7ffefe3
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000001 00000000 7ab87d4c 22524953 f697bfd1 4a8fa5af
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000001 00000000 fb9990c5 17a82d5a ed61000e 1760b52c
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000001 00000000 f0ab6fe4 ac81a8f8 d132ef2f 8562665e
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000001 00000000 b14d9cb4 23e10b75 539a5993 54950f3f
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000001 00000000 61f18fa8 10c72855 07238252 b84b8f85
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000001 00000000 82295fb2 0113d8ae d125425d e218b87a
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000001 00000000 74015001 8238716d 5bb7e8c8 82652e1e
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000001 00000000 b8fdcccc 79f12e50 8b5d2ca9 ae37ed3c
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000001 00000000 f70d72cd 119d6244 f89d5ece de4ec4d4
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000001 00000000 47d26478 35548a5c 1f723bfa bbe42052
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000001 00000000 123f01cb 59bb0542 edb94675 f8a2f093
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000001 00000000 ae428db7 25a40404 9516b2af 2bbd3270
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000001 00000000 830c6a08 968ea4da a9f6b36d a8756cfa
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000001 00000000 31329a5a 3b79a414 73ce6f09 e056e02d
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000001 00000000 04005865 5280e42d f93f8264 ea076ef7
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000001 00000000 335323f0 7e5a4c67 07d28bde 6ab5457b
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000001 00000000 31032630 af692c8b 6c4a0149 a9182b0d
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000001 00000000 dba9a18f 4a8ba058 d88ade5c 09d1295f
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000001 00000000 5179b9c0 cb326d0d b21c57aa 5cfd9320
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000001 00000000 afe0e8b8 b51af1bc 09ccefba c5a5d5cb
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000100 00000000 3a24e38a f2f479cb b01944b4 787db0cc
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000100 00000000 ee3e1719 6df3d396 94aad58c 945d2a6a
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 3636c4c0 f4de3eef abcd21b9 0fc39679
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 4e290cbc 1187add7 050a4bee cd74796b
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000100 00000000 310595d6 b0243ff4 0def94bb 489bcf09
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000100 00000000 678986ee 95bc7c78 b62a2ef8 662a739d
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000100 00000000 ee7ce9f3 c25c4244 2d3282d8 28a82909
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000100 00000000 88b21a07 e239b7e0 b70453e5 bee35270
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000100 00000000 ccb2bc2c 4720b4f4 8bd1a65a 5c069920
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000100 00000000 7e2b8c2d d3f271cb e01e7725 e649c3f1
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000100 00000000 dc4dc527 54543e6a d496bb0c bf332ffa
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000100 00000000 4df06a29 7f665420 e75be145 0521f902
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000100 00000000 6757fcd1 a4d214f0 ff160e06 2fbe68b9
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000100 00000000 03c65f5d b129a136 7869bc83 7b9ae516
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000100 00000000 712861d8 0dcd1b4a 08eef989 ae83de10
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000100 00000000 d412f16e 4993bb53 5d4c46d7 83b47181
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000100 00000000 4e06f6c5 6de2ef2a b6140d2f d5853b30
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 ba20ecdb ac4192ef ecd7050c 9e65a71e
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 5e9b4604 d42b487a cf95b31e 7ca7993b
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 e83d44c2 e99d926f 479e4132 57dd525f
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 3ea2c8b5 e5987dd5 1894f0d7 6e9dc53f
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 6c3dbb24 a4f93856 4c82b52a 488b9165
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000100 00000000 f8cb9348 bb0266c5 2cd842c5 26fc8c00
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000100 00000000 7349ff5a c319fd45 dcda0575 3f21b3d2
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000100 00000000 c00f7b2f ceaf4cdb 4ac4dc31 154c19dc
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000100 00000000 7e74e110 1935a117 3ff50bce 94bbb144
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000100 00000000 144413d2 2246c38e 02930b9a b0baad7c
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000100 00000000 0315cd39 d7aa8fed a7ca8633 f1332f6a
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000100 00000000 267ae963 2a5a1091 d6fa66a4 e1931070
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000100 00000000 8dbae2ba bf505e53 cb081eb9 38f78513
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000100 00000000 646723f1 c59588de 35d64138 62f4f638
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000100 00000000 d3ec5c77 41ac4ab9 f538ff0c b6fc0eea
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000100 00000000 fa73e170 7f2eb263 1311bef6 4baf3de2
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000100 00000000 24558d77 342b0b22 05e2209d a685912d
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000100 00000000 6ffc1906 0b216795 cdb94b1f 5ad9f467
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000100 00000000 971e896a 17cb24c0 947a56a9 673672b2
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000100 00000000 df0d5551 976050f4 4c71d944 5e915fb7
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000100 00000000 2ff7a1b6 38c8dc6d 310a11a5 d31099c9
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000100 00000000 1afc0f34 d31c7a6d b8c9b481 c3df3411
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000100 00000000 55e651a4 8f8c6480 a88be763 ee484349
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000100 00000000 4841234e d38e02c2 7085b9af 5ae19921
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000100 00000000 82a0524f 909836f1 2b37c0fd e8bb5a68
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000100 00000000 5f601944 728c210c eec42500 8208d1ff
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000100 00000000 cab60741 2c79f40f 48b6b6ee b05773ba
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000100 00000000 54f9db96 5da83c71 53e98128 5e1f3fed
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000100 00000000 ede0c269 db58068f 1dad8f7e 31365754
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000100 00000000 cccc3855 3b7250a3 c1ba834f 0f1971c2
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000100 00000000 c0ecdb97 0bb47b83 78428cac 5508e403
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000100 00000000 9d0e088c 51aad17d b2e90098 c5701d31
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00010000 00000000 6d379196 f5a0e8b6 82ed605a 4261efd5
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00010000 00000000 470d64b7 4fb9e376 240377ba e087143a
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 ed397e2a 62613728 8f945e67 bab73e70
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 a0db8ab4 f81debf2 017d3c84 fd2b0967
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00010000 00000000 66344dc6 c5ed1455 1a6e0173 ecad0ae4
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00010000 00000000 2a0c8828 f3cf3ef6 e7c4f214 984a8b30
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00010000 00000000 138ca5fe 39f5acd0 f952cf2b 28f7b5b3
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00010000 00000000 e9206a90 413f58d9 1f13a5af 7bae6ce0
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00010000 00000000 f0cf39bb 3eb8befd a4fdd272 b270a992
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00010000 00000000 c67dd272 0f43e863 7b5a9044 5768b0af
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00010000 00000000 24b7ed0d 93483b55 807d858d 506f9e86
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00010000 00000000 2449ac5b fca945e7 af6736ec 1409d8b6
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00010000 00000000 e2808a62 d941c835 af8733f8 84cefd17
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00010000 00000000 38147605 70c6708f 98367389 125db73a
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00010000 00000000 6cc7b369 35124f77 d0f5b3f6 239298aa
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00010000 00000000 6649f539 a3603a3d 6e90e8d2 b060b7ed
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00010000 00000000 9f0d4dd5 466f7ab9 a2cb72ed 3b0eb515
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 958bb39e 7b50f52f b19b5604 46fe8648
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 f6f717d6 d7cae96e f805f6ae 03456c6c
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 2aaea638 580972d2 54f9eac4 2af2139a
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 a45aad7b fe11c4db 71e5b90f 21d6bcaa
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 30ebaa3b 08bae465 3b7f886e a65f14ab
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00010000 00000000 b43540ef 6648506d e7b43f88 702e2168
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00010000 00000000 cd83b53f f1eabcd6 11e4cdd2 ecae04ab
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00010000 00000000 8109ccb1 b1e93308 98b6adb9 b4fd5869
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00010000 00000000 54a7f662 f010414a 66b9168a 316e7c96
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00010000 00000000 c6121cb3 46b010ee 66a7523a 4c78f6a3
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00010000 00000000 88b864a6 27410eee 232e3a98 01529469
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00010000 00000000 91990f1f 26e916bf a13c7f8e 83bbc2d2
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00010000 00000000 82eae346 c786e1d6 2be9a5ab 6abab178
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00010000 00000000 27cad9ef 39773de2 3187675d 700415eb
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00010000 00000000 8f115fb6 63fd3e7f 187eeca7 06825f02
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00010000 00000000 a167ba02 88faed26 5cfcddcc cf18ff60
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00010000 00000000 9a885cba de3c28e5 d37a61cd b573951f
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00010000 00000000 29b9480e 49de968c bbf6cf9c a18bc0c9
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00010000 00000000 06f5efa7 a2eecffd c2721b15 a1b2fba7
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00010000 00000000 b6fd0d49 b5b677c8 85b4864d 90788bf5
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00010000 00000000 59628edd e69f3ba4 ab0a4400 2a11e765
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00010000 00000000 c0ac8e76 288f5e66 97c3672e 8da77970
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00010000 00000000 b71d89a8 93b990e4 6a991646 71b48b74
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00010000 00000000 a46b95c1 1ae1bd2c 17dcb860 498671df
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00010000 00000000 1dae7ea4 12a1e229 acd13702 55c3fffa
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00010000 00000000 110dc0cc 43fb4477 abd9226c 17c2f80b
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00010000 00000000 206e4bd1 ff42717b a725faf8 20fd1253
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00010000 00000000 1a43112d add402ad abbf9688 6cd0ea86
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00010000 00000000 80f6754c a5ddaa17 ec763fe2 79c7da96
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00010000 00000000 4cfa0a0b 2b01063a f2de8183 9b73a748
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00010000 00000000 a816a6ec b5c31283 09630670 68823347
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00010000 00000000 4304806c 678427b0 590e73ee f01ef425
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 01000000 00000000 f0ec9081 17439473 d35e62c7 565376dc
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 01000000 00000000 29dff89a 5925e07c 1c9a36a9 1ff67d0c
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 e327a201 72601fcb fa492724 594c8bde
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 baab607a 46eeee26 f120ff0b de8aab05
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 01000000 00000000 9df160a2 fea97302 6f09ee94 7af3592a
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 01000000 00000000 f5e604aa 7b2b9b77 7be6665c 55f86568
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 01000000 00000000 21d42295 e98eba48 3da4566b 63de1a1d
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 01000000 00000000 81e31326 07dfeaef f9a3b35f 55b42e2a
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 01000000 00000000 fe571b0a 2f3b0f85 3ae46c13 c147a031
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 01000000 00000000 ad2055b9 fe4693eb 0cd23900 75c1cf16
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 01000000 00000000 407a6ae1 aed41913 cc785e96 733d9574
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 01000000 00000000 14790664 c31bd6c8 1006e243 6b8ba00c
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 01000000 00000000 16341bb4 33f7c92a 7da857a4 54fa72d0
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 01000000 00000000 b023abd5 4be29d0b c2ec8c44 4759f825
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 01000000 00000000 ba7e678e 879b2090 20003b19 28ffbfbc
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 01000000 00000000 9d613b98 e88c8bc9 f6cffe07 3ba558fa
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 01000000 00000000 b17d2fb7 41de2a63 69f8477e b842b6c0
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 d7c8c34d 72a728f5 90176d9d 12a20872
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 060fceb2 dd0ae253 b5b055d3 80d3c814
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 574dc142 6911237f 42f24703 dc367a60
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 58e90605 f7d04d30 09706766 e3c7dae1
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 5f2fa382 8fc9965c 6101e8d0 1b0cb812
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 01000000 00000000 6f2c17f1 0ccabeb3 9b76af24 961159d3
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 01000000 00000000 cd298400 24e18e72 d1e4806e ff4e590e
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 01000000 00000000 07521109 ad6a1cc0 bb975e41 b95a35c7
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 01000000 00000000 b70c2a80 671f5b84 680bbd42 f60c6c35
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 01000000 00000000 4e338c5c 805e6304 8198670c 96775bcb
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 01000000 00000000 f8ee10dc ceee3c76 85a48d75 fd91006d
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 01000000 00000000 57efb78c 4cb625e3 f92f2ec0 cd0e568b
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 01000000 00000000 a491e191 3dda3454 1d1d7da2 b46f0381
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 01000000 00000000 3b9a15f6 9513a474 826060f1 fe2e12fe
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 01000000 00000000 fce1af10 3ef65f2c 76c708ce a70a9d0b
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 01000000 00000000 817cdaa6 05420d43 adf89b3b 6d876924
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 01000000 00000000 2108e0ce be053b4b bee203c0 d3a3e45c
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 01000000 00000000 164aa195 5b3c52da 4bc45866 a3c09427
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 01000000 00000000 f0616dec ffce2c48 8ad61e07 bac6f5d8
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 01000000 00000000 e037c667 9caa836b b94643ed 4f29d7c2
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 01000000 00000000 0cdcf979 9e0bbeb1 f1792602 9374d54a
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 01000000 00000000 97af39cc a96de874 54dcb078 f467d206
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 01000000 00000000 dd6dc39b a93139a5 d333e43e 67716f60
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 01000000 00000000 ae4636c5 1405a129 2b8668a6 d73d09d6
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 01000000 00000000 636af1ce 6ee69d0f 15f452ee 3569ec72
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 01000000 00000000 23906744 658f7afd 76d77c00 08a22245
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 01000000 00000000 87f45225 6e2a65a8 f81a9808 03291042
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 01000000 00000000 67b56823 1c6edf37 cac0ce94 fc5b9375
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 01000000 00000000 a9faac65 baeffe98 c47c0b67 6efd4c3d
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 01000000 00000000 6d980bc2 6b28966d cc0edc5e 56029663
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 01000000 00000000 c676b55f 8ad7487b 63bc0c7f 1379c4b5
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 01000000 00000000 c63e4e34 dda2ae11 6a4eea59 e2d735e4
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000001 e030af51 f0c406ad cd31da3f 12daeb18
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000001 d647af79 a5e0b9f7 d945e5a4 161fc4c8
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 c6e78b9f 08760454 98f27570 17813501
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 ba496ee9 da990d16 7612ca4c 3eae2911
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000001 b5a0fbb3 a9766f8c 7af52349 4f04e26a
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000001 aa093e55 b226f0a9 53afa070 569ab229
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000001 4f47704d efa380e9 b5edad71 38aad304
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000001 9e9853a0 082ef8bc 716329cb ddf155e8
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000001 63461ac2 938b887a 56773d65 31df7347
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000001 c1e6ce95 97e64ad4 bd0b383a 8ebf32f9
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000001 5aca53c2 27e87b5a 97050794 c6d1ab5a
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000001 a6e6df68 a16f4e57 ffad3462 51065696
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000001 73845df4 e3f11542 363666c3 39e10bb6
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000001 64a87348 7ec4d910 9e75213b 5914d9f9
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000001 e4d6993c 77305999 46a765f5 ea1fbb4d
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000001 068a65eb 6aea3a8c 343c1a47 f7560cf1
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000001 ef3a2fc1 32b12ecd 31f46080 4856d695
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 9e24d97a 238869ca 35a667a9 cac75660
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 d078505b c444a93d 3c1d4687 fd299c5b
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 455a18e0 8b25ee8a 9eb52d70 0a2406f6
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 e42be7a5 10e8344b 8a841e2a 76866124
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 40dd0d34 a1083f9b 54e94679 f24cb157
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000001 f76ee81e 3f8e191c 7ace5e54 686c78a9
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000001 7b0e0ea5 626bb09b a3084fed 1e1ea262
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000001 6c35e2e4 4b116ac4 7c76ccce 6bb9a4a7
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000001 9f4d1018 414a8cf5 6baee5d1 f7c0f074
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000001 e663febc 5aff1931 fba5f61c 11210a8b
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000001 1dda1386 c427a4f4 da7de3be ca6d898e
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000001 e5136b72 9c9a2b25 e6212dd9 11b59216
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000001 b5f6c242 16eee9c4 5d9f2224 3ee53567
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000001 998d7220 94aab55c 675ec4d4 751d8763
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000001 3065eb46 14dd6ecc 56227cda 656756d6
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000001 c8e3c4e8 d5a754f1 ce7a3b8c 145d41a5
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000001 bc8ee1a1 1efad7f8 cca32205 f25ecce9
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000001 999d4322 09f63cba 401bf5f5 dfa94671
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000001 2bcdfd5d 9cc3f21e f2e4ffa4 de8da739
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000001 ae20c6a7 1f6a5d18 a46ca51e 536b01fa
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000001 0d6e2690 54582cd4 a409c539 8d61509c
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000001 0b56a479 ac382ffd 8ff545ad 38bf0503
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000001 976ac401 af2a5de7 4bc9f677 d4aef946
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000001 12e13444 50ac2a67 ca356633 e03b7d2f
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000001 5e649cc6 ef0f17a5 94798230 08e834c1
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000001 66a13df1 5a5dcbd0 0508d339 bc651029
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000001 14bb05b6 6b7fa5a4 1055f28f 77cc28f2
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000001 69db4f0a 2f946efd a984980b b9faa3ac
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000001 d62eb4ff 35cfdc17 cd4a1c41 14d50043
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000001 ef824629 1cba14e7 49ed4950 ffb38246
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000001 a34ee7af 7f2fd010 664fda60 38af05b1
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000001 1d54c792 869cb843 fbd24ccd ad3de6b3
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000100 f1df58a4 1ed53375 7bb78ef4 4e11dbab
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000100 e6ee2dee 3b5880ed 942efd6f 91f43b8f
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 7c21e72b a288390d f96c436d 0d20b4e0
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 807067d5 212fec9b 88c0801b 5a85aff9
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000100 1b0be5cb 29d0b95d 372985b6 48e76f44
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000100 93c509e1 e718172c 7f883cb2 c21639ce
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000100 06cfde2e fa591c7f cd70f744 7757851b
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000100 1864201c 9f652d37 09547c97 4d881d90
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000100 7fbb915f 552c9bb0 3c7a3c8b ce644482
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000100 ed0e5f89 9e74bab0 97043f39 7f18a3f2
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000100 65258d2d ab2d98a6 242de7be 0e5a2536
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000100 792c4707 16b18391 e007d7f4 c4cbeb22
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000100 02c8ef7e a739a692 2421e133 69219eed
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000100 6e3cc3e1 25db43ec 96727f77 21ed7496
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000100 747d8e1e 932a1db3 a88a3850 f4da36b5
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000100 628b9a9e 258e5f68 65ee127b 5303581e
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000100 b67af349 02f4b3e4 6e4f30ce 61bfc6f4
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 f791fead 0377ddf6 bdc314ba f0671471
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 637910a8 bbdcc060 a1c08936 7a710668
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 dcae14d3 6776e33d 7766d0ce 408f15fa
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 c93ba8e6 7435c567 845dc071 d02ca702
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 fa54a9fa 8e7465b9 77d395ce c43bd5a4
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000100 79523499 349f6079 c3461163 179aec9f
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000100 95d8e848 6aa64376 9d703e91 fab6988a
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000100 c53dd017 99b3e749 3ef4f8d8 7d752c89
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000100 43ab57e1 4789da5f 87033eb8 e7ad3a50
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000100 faedf924 7a650192 147d4b09 9ac01939
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000100 e2042db4 dca05c16 827d333c 9251e5da
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000100 d1603183 18130362 9d2c9608 818ac71e
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000100 33147cbe e7b079be fc1189f5 5887bb9d
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000100 29b1e630 8f1af85b d903d2ed 1a082d77
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000100 c6b5525a 81d234f0 48a17017 8351d3b5
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000100 b8187e65 b2cb6954 e3c23052 69f5b5b4
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000100 2e87227e 7dfabedb f2933574 e7b37365
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000100 e3486e92 1fc15025 16d75fe1 547641e7
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000100 f8d61ae3 62f626ae 92910a34 bffbc7cc
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000100 5d335465 e2b59668 6f89fa9f d4e30427
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000100 52320fe3 28ba865c 883302fc 476e34d7
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000100 228b94db 37aa6dc2 da959a01 7d123017
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000100 5b4eee21 8252a042 21b5ed99 e08dbf9c
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000100 38050743 c31e8259 983e032e 713cf089
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000100 94beb06e 10012caf 03832d81 51bd03a3
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000100 d98e9d5e 0c316ae4 a8670426 8d941618
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000100 66e4d621 a3795a49 ac79c7d4 b3011d67
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000100 b6c8fb40 c1da803d 08588e78 ae5fcfad
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000100 8ae97e4b 1f8b6a28 0f7b192c b7ae7931
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000100 683e01ea 87f5779a aef054a4 8e33cb06
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000100 0dfab3ca a7ba9e3f 9c954ad6 6b613c27
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000100 6c5aea28 7690beb2 4c79a7b5 760f532a
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00010000 a9b35b10 a375ea94 9808b6c1 e50acdf9
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00010000 d97b580a 1d94d0f0 7d7c8d8a 438197d1
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 9a9c2bc3 2e00bd2f 68f86d66 fda84482
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 1c0e722c d39ac81c 32fce64e 2c076b46
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00010000 fb05a984 a71de6a4 009f985b 6d29c01a
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00010000 a4696ee0 5c0abe77 77ab1ca0 de73318b
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00010000 514becd2 01d352ed 31b84f0f 5d2e8628
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00010000 4b514f06 7566afa1 c6c71798 e0d25cda
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00010000 186f64bd 87b56de6 aba3c4bc 4d812602
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00010000 44119056 89cbd5be d7e979ab c2d59c40
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00010000 316066d3 9e963405 f0c6436d 941c5dc4
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00010000 6c79b3f9 0a16685c b27b9a10 85170546
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00010000 8e2a93a1 aab9e1dd b6b102a4 4c18cbc6
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00010000 782a17be 532c720d 2e96d480 285a912a
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00010000 89ca671f a89507f3 2eb97463 c1a49f17
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00010000 17ec9935 79683783 a11238fb 4c608198
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00010000 52de9adf 1fa60534 58b426b4 8609be54
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 ee86cc4b 116cc1dc e7e039bf 47088901
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 7fabcc11 9cb66a47 5fb49fab 5fc996a7
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 caa700a6 0325b0d7 a7cb3251 6e979ea8
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 56317ad6 505ed872 57947af4 aac1b4fa
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 46e441bc 37cf2022 d17d4e60 486c4b33
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00010000 2faee6c2 7fd2e177 c9f9c395 281f73ee
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00010000 7e5e29a7 c156a39e 30e3276b 250a765d
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00010000 426b7127 b2aab7c7 a3e000e3 0e222cd3
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00010000 5a46397c 3dcbe508 db679125 8af9502f
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00010000 e177c2d6 e6882c0b 7fe501d5 1955b56d
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00010000 c40d3950 8dff35f0 ca567139 f0b23503
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00010000 b8b7824f 583c476a 9d7a73ea f640b07f
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00010000 dbe1caa4 9c7508b7 19b89657 6975a0b1
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00010000 b9894675 fc9dbef6 8b9f01e3 35b679f8
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00010000 c04646d9 ff304cee 2563d09e c70b493c
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00010000 0c9b3b1f 378faf60 53a737c3 8f7d0f98
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00010000 afd60479 e8d33be6 3c5d1a86 37683214
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00010000 9f88f7c7 31ad8d98 007e7d53 647f473b
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00010000 70b61e10 af6eaf82 5ea450af b4165ed2
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00010000 d38acb23 16435559 3c751c68 d0268fa8
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00010000 0d8f8b91 c6cbc3e8 82d1ae4b e4da5cc4
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00010000 bf6c742e a95e65c9 ce7dc48e ff90ffc8
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00010000 d91f6594 9c18a30c 445657a6 7066d6bf
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00010000 b9817a19 15cf8179 e39085d4 f31e8cf5
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00010000 60f6a78b 38c4d698 b09432f1 3cea4a6e
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00010000 1cd61bb4 49c0cb69 f1d31578 16fc57df
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00010000 377e16e6 442c4847 da18f00c 0beed65c
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00010000 24a1351d d340c934 0d24242b 8c777c1c
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00010000 b1521cc5 83135c99 97176e37 c90058e5
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00010000 672ae628 5567ee43 e1836c02 2e4c17eb
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00010000 6b9c636d acb17505 985e650b 5e7f69ae
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00010000 25e22335 13360180 3230dd73 63916012
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 01000000 247f0514 bf305a96 52a1a2a3 e57040fd
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 01000000 998b05e4 d36d64aa c626aeaf f2753c2c
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 cfcf8e8d 09c75787 71eb8a35 4ca0901c
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 9fe0465a 29a6fa34 b863a0b8 248d9b96
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 01000000 8a389ee3 1a46f0fa 79591b16 965cf03d
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 01000000 d8afe7dc 8f28277b ab017f0f e657d755
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 01000000 c0c9741f d01806cc cc3a9052 1b735f2e
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 01000000 cafb62e7 0bcab19b 830ea094 ceaa9892
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 01000000 ab9dfe3b 91d056cc 802cc19a b0b86070
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 01000000 1cea55b5 0de9fb2f 22ae0d0f da5d677c
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 01000000 6d12c1fd 88aa8db1 15feaaff 34881817
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 01000000 5ddba2e1 61a25b12 78f177c2 545a617c
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 01000000 06fae575 4f5fd1a2 46823be1 9daa0f27
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 01000000 c5ecca74 0c27e77b 5f8d6f60 1954e0e8
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 01000000 00df0908 fd4f181c a59ca029 3b64c3d5
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 01000000 fbba385e 31fadaba 7cb9fb23 d890b40a
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 01000000 51c44a4a d23387f2 6a4868ec 143e6914
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 73c9215a 067421dc a47ba7df ed17441c
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 05223e30 99614b1f 824558a0 77def08f
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 ff8ffbdf dbf27d95 656aa8de 20c486f3
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 20f060fa 5a681df4 8a74aa57 0d312560
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 c4cc387a f116d76d c73534c7 721c66fb
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 01000000 1062de7a 87531b12 0e4268ee 105fdc0c
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 01000000 6f28d09d a8f2e77b 3dd54948 728f0b06
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 01000000 03768c53 0e08e96f bb9532f7 c81f7a6e
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 01000000 232b442e 1ecc54b5 47fd72c5 660c1ed0
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 01000000 37bf7ae2 aae1c68d 6107992e 279634c8
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 01000000 d79665d2 0f079047 379ce9c3 f25e6799
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 01000000 b84df59b a7682678 3d61af8b 84eebdbd
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 01000000 f9c59ee0 b4be9850 4bb861f3 e67d08d1
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 01000000 9c521252 d6a8c73c e379f086 f89ab41a
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 01000000 b7b31df0 accc7692 f4fbaa8d 64fd8874
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 01000000 9a717564 a0cb7cdc 438b7552 b91b7820
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 01000000 918c06f2 75f0076d ce870444 c5d9860d
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 01000000 f88f9930 afb8ce53 f1a97c5a 25d31efe
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 01000000 8fd66e4c ffd160cf 2cc93b1d 2dce4692
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 01000000 5524dcaf 40762d39 d69e3b7b baba1676
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 01000000 7a7c7737 6057b9fe 7a76e3c8 b574f8fb
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 01000000 954ba403 6ba1c264 b6aed22d ee859bc4
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 01000000 14f8612e 3726a4ec c611176d ed092f61
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 01000000 e632d378 c397c684 d32f3508 a394057b
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 01000000 55a364eb 570a271b b75dda1c 0e45b60d
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 01000000 c6d6b2ce e913f457 60d4c582 7441c07a
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 01000000 57ee42ec 960b74ca 972ea934 8654c107
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 01000000 6a795ce7 a720649b 1296b189 d4e4697f
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 01000000 703f3bd8 138b897b ede3087f 43fa7a1b
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 01000000 879c7e5a 7b9cf65f 447c0371 08a9687b
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 01000000 79702e82 a0689d80 3e967f90 b48255d3
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 01000000 4e9a3827 89deff2a 7578177a b2856db2
+ars4x32 10 00000001 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 fcae6333 bd01b7df b770e892 9cb16292
+ars4x32 10 00000100 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 e5087d42 c37b8481 e34a0bf2 ffc5218b
+ars4x32 10 00010000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 a5b4b75e 76b71d55 3ce3f901 7cb7c270
+ars4x32 10 01000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 b8572a88 3ea486ca a4297626 8aa5f727
+ars4x32 10 00000000 00000001 00000000 00000000 0000ff00 00000000 00000000 00000000 25004d41 354bfbd5 cb0d6d2a ce2866fe
+ars4x32 10 00000000 00000100 00000000 00000000 0000ff00 00000000 00000000 00000000 ce1f43dc 9476d233 173e2431 1bf36ea2
+ars4x32 10 00000000 00010000 00000000 00000000 0000ff00 00000000 00000000 00000000 94216c8e 9b501d69 1b832695 c13ab5f9
+ars4x32 10 00000000 01000000 00000000 00000000 0000ff00 00000000 00000000 00000000 6a5c2f12 060bf87e 5a077a17 ae024bc6
+ars4x32 10 00000000 00000000 00000001 00000000 0000ff00 00000000 00000000 00000000 94252aa8 0444a04d dfac6fd6 977b6c1a
+ars4x32 10 00000000 00000000 00000100 00000000 0000ff00 00000000 00000000 00000000 9506aa8c 6ee40879 138836aa 509ac569
+ars4x32 10 00000000 00000000 00010000 00000000 0000ff00 00000000 00000000 00000000 536fbd48 217a89ec c2476fc1 b649b851
+ars4x32 10 00000000 00000000 01000000 00000000 0000ff00 00000000 00000000 00000000 2bc4b6af 3b94ba32 67bdea20 ec9488d7
+ars4x32 10 00000000 00000000 00000000 00000001 0000ff00 00000000 00000000 00000000 23753cdb 5909cafa 72e4a6b1 03f47730
+ars4x32 10 00000000 00000000 00000000 00000100 0000ff00 00000000 00000000 00000000 990ddfe7 152ed393 eb0d9f13 2e4ea32a
+ars4x32 10 00000000 00000000 00000000 00010000 0000ff00 00000000 00000000 00000000 e016741b 3783a4c4 bce1590f f08190de
+ars4x32 10 00000000 00000000 00000000 01000000 0000ff00 00000000 00000000 00000000 c8c35ede 248aa584 5a0f85c9 00b3fd5b
+ars4x32 10 0000ff00 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 0d087d6b 615667d8 51c24c95 048f31a8
+ars4x32 10 00008000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 8594974a 10c70d1f 5ff39e10 74e7b83b
+ars4x32 10 00ff0000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 340e3607 f971005f e562dcac a8a8958d
+ars4x32 10 00800000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 044ac5c0 b36dbf67 56089195 c3e407cf
+ars4x32 10 ff000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 56567ace 4d5b1686 a544562d 3cc18ba8
+ars4x32 10 80000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 3ca2b293 a5d66ea0 31831459 926ea2fa
+ars4x32 10 00000000 000000ff 00000000 00000000 0000ff00 00000000 00000000 00000000 0fcd4b44 1577f2bb 8d4ee07d bc8d9195
+ars4x32 10 00000000 00000080 00000000 00000000 0000ff00 00000000 00000000 00000000 941d2950 d634b468 69c05b83 e09a08ba
+ars4x32 10 00000000 0000ff00 00000000 00000000 0000ff00 00000000 00000000 00000000 45dd8a83 d1a6fcf6 f366a1cd dc96484f
+ars4x32 10 00000000 00008000 00000000 00000000 0000ff00 00000000 00000000 00000000 e840f688 55b214ad d57918bb cc7161d0
+ars4x32 10 00000000 00ff0000 00000000 00000000 0000ff00 00000000 00000000 00000000 dffddb1d 119bcb50 3312aa05 647a03de
+ars4x32 10 00000000 00800000 00000000 00000000 0000ff00 00000000 00000000 00000000 f6b1de15 8fffc880 78fde489 c28e8cb6
+ars4x32 10 00000000 ff000000 00000000 00000000 0000ff00 00000000 00000000 00000000 a9140b47 b30e6b6d 409d0abe eb61b360
+ars4x32 10 00000000 80000000 00000000 00000000 0000ff00 00000000 00000000 00000000 f886b0ab 70e2290f 5eeda35a 1b3e2f9e
+ars4x32 10 00000000 00000000 000000ff 00000000 0000ff00 00000000 00000000 00000000 d9f03545 5211f8b3 2a76c051 97266bf0
+ars4x32 10 00000000 00000000 00000080 00000000 0000ff00 00000000 00000000 00000000 9bbe9abe db095dd8 1b808527 9f28fee9
+ars4x32 10 00000000 00000000 0000ff00 00000000 0000ff00 00000000 00000000 00000000 7857bb35 9aa27628 ba02455a 81ef8e54
+ars4x32 10 00000000 00000000 00008000 00000000 0000ff00 00000000 00000000 00000000 99d67194 60448862 83329032 3f23d5dc
+ars4x32 10 00000000 00000000 00ff0000 00000000 0000ff00 00000000 00000000 00000000 901bc81a 26ee2082 290f81f2 578edbf2
+ars4x32 10 00000000 00000000 00800000 00000000 0000ff00 00000000 00000000 00000000 a0a3f116 1511d5f8 b1e6eb53 258c6f33
+ars4x32 10 00000000 00000000 ff000000 00000000 0000ff00 00000000 00000000 00000000 a814f115 a68a1479 6f615e1e da260fc3
+ars4x32 10 00000000 00000000 80000000 00000000 0000ff00 00000000 00000000 00000000 2d4f25cc da7dc5a2 12b4d343 6d004435
+ars4x32 10 00000000 00000000 00000000 000000ff 0000ff00 00000000 00000000 00000000 d6cd5c8e 70a36b18 a224f39a 74d7d2c6
+ars4x32 10 00000000 00000000 00000000 00000080 0000ff00 00000000 00000000 00000000 18dc79b1 736119d4 a52be882 78e23f3d
+ars4x32 10 00000000 00000000 00000000 0000ff00 0000ff00 00000000 00000000 00000000 042ba503 6d4bc33d 530de6b6 46c83dbc
+ars4x32 10 00000000 00000000 00000000 00008000 0000ff00 00000000 00000000 00000000 ac2bcf2e 6d1831d7 e748da2a 66618176
+ars4x32 10 00000000 00000000 00000000 00ff0000 0000ff00 00000000 00000000 00000000 b8177d4a 8f058469 d2d72992 7c56821a
+ars4x32 10 00000000 00000000 00000000 00800000 0000ff00 00000000 00000000 00000000 cc92440a 08a79c7c b6203a24 8e81c8fa
+ars4x32 10 00000000 00000000 00000000 ff000000 0000ff00 00000000 00000000 00000000 60891aaf d01bf76a 166dd985 4a59c676
+ars4x32 10 00000000 00000000 00000000 80000000 0000ff00 00000000 00000000 00000000 3b8dc262 9a3c487a b9f621ae 532cce23
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 0000ff00 00000000 00000000 00000000 a588c9fb 84c80f49 85617392 f28ffb9e
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 0000ff00 00000000 00000000 00000000 1d9391f8 d9c48b01 2015ae55 66beca09
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 0000ff00 00000000 00000000 00000000 33721436 1ddc703e 7d53720c 06616c78
+ars4x32 10 00000001 00000000 00000000 00000000 00008000 00000000 00000000 00000000 2c1fb260 4b9d3357 b5e32c52 e4d4a547
+ars4x32 10 00000100 00000000 00000000 00000000 00008000 00000000 00000000 00000000 86f801b8 5661adcd f033c12a bdecffd1
+ars4x32 10 00010000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 828a289c 779a00a0 0a4fca07 f55832eb
+ars4x32 10 01000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 a8158b87 8b117489 a0163d43 4bde76fb
+ars4x32 10 00000000 00000001 00000000 00000000 00008000 00000000 00000000 00000000 b649633d 8edf2b2e 224d0043 b110e51c
+ars4x32 10 00000000 00000100 00000000 00000000 00008000 00000000 00000000 00000000 1a2b5294 a32ca0ed ebaad815 51e9bdf6
+ars4x32 10 00000000 00010000 00000000 00000000 00008000 00000000 00000000 00000000 5e641b42 f4e3e74c 83c74cd5 a807a6b1
+ars4x32 10 00000000 01000000 00000000 00000000 00008000 00000000 00000000 00000000 580fc53f 36b7fec4 855dab97 60157c73
+ars4x32 10 00000000 00000000 00000001 00000000 00008000 00000000 00000000 00000000 70233efb 1fba478b 8bfd17d5 2ba33d17
+ars4x32 10 00000000 00000000 00000100 00000000 00008000 00000000 00000000 00000000 289fff80 c6c4462a 50aa8868 fb07aacd
+ars4x32 10 00000000 00000000 00010000 00000000 00008000 00000000 00000000 00000000 f95b9940 6de46d1d 090a417b eb7b9b22
+ars4x32 10 00000000 00000000 01000000 00000000 00008000 00000000 00000000 00000000 8693b12b 5605ca40 3639dbb6 773154ea
+ars4x32 10 00000000 00000000 00000000 00000001 00008000 00000000 00000000 00000000 b4f37059 b7c5e71a 976e0084 ce535b06
+ars4x32 10 00000000 00000000 00000000 00000100 00008000 00000000 00000000 00000000 67089a5f 0f7499d4 ba3e5df8 65b5d616
+ars4x32 10 00000000 00000000 00000000 00010000 00008000 00000000 00000000 00000000 3030083c 44c4fc9c de89336a 56c3d028
+ars4x32 10 00000000 00000000 00000000 01000000 00008000 00000000 00000000 00000000 98e4d84d 0aa677ed 7eef5d57 8ec60064
+ars4x32 10 0000ff00 00000000 00000000 00000000 00008000 00000000 00000000 00000000 ead6b0d8 15c4a87c 9fd307c5 c59222ba
+ars4x32 10 00008000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 40067896 8c980481 dd9b28cc 1fe0a1d7
+ars4x32 10 00ff0000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 a7530620 85baf1ab f8554105 3f28debf
+ars4x32 10 00800000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 c3e96d56 3528f63e 69745e92 093df66a
+ars4x32 10 ff000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 0a7b4073 2d90e83d 5c6403ce 9138f700
+ars4x32 10 80000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 48cda39c cf436caa 256ce979 42e2007e
+ars4x32 10 00000000 000000ff 00000000 00000000 00008000 00000000 00000000 00000000 28c02311 f61730f1 f777e987 6633e363
+ars4x32 10 00000000 00000080 00000000 00000000 00008000 00000000 00000000 00000000 36c60b34 95849f47 be3eadd5 15621908
+ars4x32 10 00000000 0000ff00 00000000 00000000 00008000 00000000 00000000 00000000 ad9c0e68 d937938e d51ff077 d9248807
+ars4x32 10 00000000 00008000 00000000 00000000 00008000 00000000 00000000 00000000 8ed38874 e59f5903 4637afa1 9385dc8f
+ars4x32 10 00000000 00ff0000 00000000 00000000 00008000 00000000 00000000 00000000 c6329fb2 c441156d 431cd7e6 acbf16dc
+ars4x32 10 00000000 00800000 00000000 00000000 00008000 00000000 00000000 00000000 7ac3e4e4 fb235550 28eef786 5973a922
+ars4x32 10 00000000 ff000000 00000000 00000000 00008000 00000000 00000000 00000000 1bf649d1 22e1d20f 909dac92 a0841b86
+ars4x32 10 00000000 80000000 00000000 00000000 00008000 00000000 00000000 00000000 038df3cf a92f5ed0 d9d9b196 7e30dc75
+ars4x32 10 00000000 00000000 000000ff 00000000 00008000 00000000 00000000 00000000 ae62b3e4 8f7fd299 3e8a3331 dfbf97cf
+ars4x32 10 00000000 00000000 00000080 00000000 00008000 00000000 00000000 00000000 6e8b36ac 00312a90 0627f1b4 830909ec
+ars4x32 10 00000000 00000000 0000ff00 00000000 00008000 00000000 00000000 00000000 d5f57993 ba3427b2 494662f7 1540d20c
+ars4x32 10 00000000 00000000 00008000 00000000 00008000 00000000 00000000 00000000 77336a3b 29db5f6e 14c3529f 2fe84106
+ars4x32 10 00000000 00000000 00ff0000 00000000 00008000 00000000 00000000 00000000 69f5c5d1 74e9e964 b34f84ea 33c005f7
+ars4x32 10 00000000 00000000 00800000 00000000 00008000 00000000 00000000 00000000 4169325f a27e38d6 a840fdab f6e263c4
+ars4x32 10 00000000 00000000 ff000000 00000000 00008000 00000000 00000000 00000000 6ba6529c 060468f4 f75739df d14b414a
+ars4x32 10 00000000 00000000 80000000 00000000 00008000 00000000 00000000 00000000 f9e1dbfa 4629392b 40c440ae b150dc10
+ars4x32 10 00000000 00000000 00000000 000000ff 00008000 00000000 00000000 00000000 c3bfd4e5 49f163df 982dc34d 3ea45d73
+ars4x32 10 00000000 00000000 00000000 00000080 00008000 00000000 00000000 00000000 0b1d46a4 0dc87e22 51b31851 e67a0640
+ars4x32 10 00000000 00000000 00000000 0000ff00 00008000 00000000 00000000 00000000 b3947949 cda68ed4 5b41245a fec3cc4d
+ars4x32 10 00000000 00000000 00000000 00008000 00008000 00000000 00000000 00000000 f0b14a4d 9d6bc368 41291f18 c7732ebb
+ars4x32 10 00000000 00000000 00000000 00ff0000 00008000 00000000 00000000 00000000 5d14a04a 5fd91a6c 24f2daa6 9e5bee56
+ars4x32 10 00000000 00000000 00000000 00800000 00008000 00000000 00000000 00000000 e1da803f f714cd82 86c69275 fa85929a
+ars4x32 10 00000000 00000000 00000000 ff000000 00008000 00000000 00000000 00000000 24e1c392 e0687318 b80eda4b 4d779c7a
+ars4x32 10 00000000 00000000 00000000 80000000 00008000 00000000 00000000 00000000 229b4480 a8d51c8f aea527fd 2061cf50
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00008000 00000000 00000000 00000000 1541fd48 266479ea d562ddaf b046946a
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00008000 00000000 00000000 00000000 51e6885b d82e4842 6bc6f3ef 84348129
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00008000 00000000 00000000 00000000 5069213d c381cd8d 6636cc72 f4661fd7
+ars4x32 10 00000001 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 e88443ad 68c1e6a7 1bcf3aec 1dd200a7
+ars4x32 10 00000100 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 cae83bfa 673e52f0 678d80ac 703c57b3
+ars4x32 10 00010000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 93656c91 ebe4c141 94d82984 dbe7b4c1
+ars4x32 10 01000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 46ce0ab3 e697a69b de54a604 18a05322
+ars4x32 10 00000000 00000001 00000000 00000000 00ff0000 00000000 00000000 00000000 7b659b84 7ac2102a 0ef11f37 fb9226a2
+ars4x32 10 00000000 00000100 00000000 00000000 00ff0000 00000000 00000000 00000000 cdba9d6e a28a10f0 bd9118b9 fbcc0c7b
+ars4x32 10 00000000 00010000 00000000 00000000 00ff0000 00000000 00000000 00000000 933021e6 11537841 93256204 e191ed2c
+ars4x32 10 00000000 01000000 00000000 00000000 00ff0000 00000000 00000000 00000000 0fb34cf4 a9f8bfc8 32abc499 66ba599c
+ars4x32 10 00000000 00000000 00000001 00000000 00ff0000 00000000 00000000 00000000 c3b56dd9 1150aa54 9f5fad4f 996e43d9
+ars4x32 10 00000000 00000000 00000100 00000000 00ff0000 00000000 00000000 00000000 76c3605b e31e707c 34408c3e 1c06c78e
+ars4x32 10 00000000 00000000 00010000 00000000 00ff0000 00000000 00000000 00000000 233e3c15 fae95405 f3cb0fd7 4906d997
+ars4x32 10 00000000 00000000 01000000 00000000 00ff0000 00000000 00000000 00000000 704b0da7 f6b4e9f5 ac79ea80 5d2b16d4
+ars4x32 10 00000000 00000000 00000000 00000001 00ff0000 00000000 00000000 00000000 52e9c5c4 bdea19d5 f9f4130b 82c74a8b
+ars4x32 10 00000000 00000000 00000000 00000100 00ff0000 00000000 00000000 00000000 28250c8e 091815d9 f9440858 ba50a1bb
+ars4x32 10 00000000 00000000 00000000 00010000 00ff0000 00000000 00000000 00000000 00aa3398 1593c82b 01f90307 4da20b88
+ars4x32 10 00000000 00000000 00000000 01000000 00ff0000 00000000 00000000 00000000 14d27e46 c6e0deee 6246a1ab 544ae3c5
+ars4x32 10 0000ff00 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 38ad9717 fbede586 a6fb65ed df1c9f5b
+ars4x32 10 00008000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 9b6c7482 25032317 b78aa504 5045caf2
+ars4x32 10 00ff0000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 7252d59d f4f4d769 b9149134 3d4684c9
+ars4x32 10 00800000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 873abe0e 5201f3f1 30cdb3cc 8e715ac2
+ars4x32 10 ff000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 0cd9f4b7 5e3f61b3 c2bbe84a ed11a097
+ars4x32 10 80000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 9168e4e8 a189d9cc 4a788569 d53b415a
+ars4x32 10 00000000 000000ff 00000000 00000000 00ff0000 00000000 00000000 00000000 9f99a1d1 b9f6076b 05a627e8 b064124d
+ars4x32 10 00000000 00000080 00000000 00000000 00ff0000 00000000 00000000 00000000 b5891ac7 98593d8a 5f966b3c 466c6ae3
+ars4x32 10 00000000 0000ff00 00000000 00000000 00ff0000 00000000 00000000 00000000 7f8d8a7a 037a7275 cbb4f9bf a61e2b9c
+ars4x32 10 00000000 00008000 00000000 00000000 00ff0000 00000000 00000000 00000000 b3b7b20d 2d87fe1d b98016a3 ae8e4ce1
+ars4x32 10 00000000 00ff0000 00000000 00000000 00ff0000 00000000 00000000 00000000 534bd7f1 72934711 4171cfcb 81ddaad3
+ars4x32 10 00000000 00800000 00000000 00000000 00ff0000 00000000 00000000 00000000 42d534bd bcae68e8 dea7289e 1ccc31d3
+ars4x32 10 00000000 ff000000 00000000 00000000 00ff0000 00000000 00000000 00000000 c51854f1 ef3fb610 aab3ddc8 06cd29a6
+ars4x32 10 00000000 80000000 00000000 00000000 00ff0000 00000000 00000000 00000000 a6f81ddd f812ed3f 0b14cb66 2d74d5af
+ars4x32 10 00000000 00000000 000000ff 00000000 00ff0000 00000000 00000000 00000000 02b9e693 e2daeb40 38c3c0d1 b6e1b678
+ars4x32 10 00000000 00000000 00000080 00000000 00ff0000 00000000 00000000 00000000 619299f7 5d418257 05a4b287 7d64ec86
+ars4x32 10 00000000 00000000 0000ff00 00000000 00ff0000 00000000 00000000 00000000 54abe441 1e0ca52c 9697d390 ec49403c
+ars4x32 10 00000000 00000000 00008000 00000000 00ff0000 00000000 00000000 00000000 45f4cd80 081e315a 7642ae2a 759b45c1
+ars4x32 10 00000000 00000000 00ff0000 00000000 00ff0000 00000000 00000000 00000000 12aa95e9 ce20986d 7736572f 632973d1
+ars4x32 10 00000000 00000000 00800000 00000000 00ff0000 00000000 00000000 00000000 0c51b3d6 bfd21432 720ef22f a8eb9b11
+ars4x32 10 00000000 00000000 ff000000 00000000 00ff0000 00000000 00000000 00000000 e5d77df0 cc30d6f1 90a45f1a e82f6893
+ars4x32 10 00000000 00000000 80000000 00000000 00ff0000 00000000 00000000 00000000 6ad6d549 22c09b7e 11252c9e 952d6aff
+ars4x32 10 00000000 00000000 00000000 000000ff 00ff0000 00000000 00000000 00000000 ee477839 37c32d1a 48552f71 b890ec4b
+ars4x32 10 00000000 00000000 00000000 00000080 00ff0000 00000000 00000000 00000000 4f7f8639 5db444c4 ef8f4605 f1556a83
+ars4x32 10 00000000 00000000 00000000 0000ff00 00ff0000 00000000 00000000 00000000 b7661dc6 4d43a593 549d1cfe cfc04369
+ars4x32 10 00000000 00000000 00000000 00008000 00ff0000 00000000 00000000 00000000 de625f52 02b261c4 effc7c7b 91cb13e7
+ars4x32 10 00000000 00000000 00000000 00ff0000 00ff0000 00000000 00000000 00000000 a1c7b8bd 6d64b2f8 d1298c96 e130ab7b
+ars4x32 10 00000000 00000000 00000000 00800000 00ff0000 00000000 00000000 00000000 662f82fa 1800add6 f8312469 4736a74f
+ars4x32 10 00000000 00000000 00000000 ff000000 00ff0000 00000000 00000000 00000000 5911e758 97dae4b4 6af2b7bf 150f6d1b
+ars4x32 10 00000000 00000000 00000000 80000000 00ff0000 00000000 00000000 00000000 3488d858 3e2bbad6 40c64989 bab1e0e5
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00ff0000 00000000 00000000 00000000 dbe2cf83 80c2228c 2c1e363d e5d927c0
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00ff0000 00000000 00000000 00000000 847c9587 c42cd2d6 451f9848 6c289780
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00ff0000 00000000 00000000 00000000 9efd8b55 0a5d400e 3a07864b db6eed91
+ars4x32 10 00000001 00000000 00000000 00000000 00800000 00000000 00000000 00000000 db5ef4e1 e16048d4 78b14d68 33a970c7
+ars4x32 10 00000100 00000000 00000000 00000000 00800000 00000000 00000000 00000000 1b61f324 2fa9127a daf45f23 2281de23
+ars4x32 10 00010000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 e527ad88 66072a45 cb92483c 5bca41c9
+ars4x32 10 01000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 0df61f3f b1b08c54 c7570612 1103be2c
+ars4x32 10 00000000 00000001 00000000 00000000 00800000 00000000 00000000 00000000 e4ec6165 605e55f8 44fff6e8 b971033f
+ars4x32 10 00000000 00000100 00000000 00000000 00800000 00000000 00000000 00000000 c2569c0f 04a96b58 b4eac11f 6f477e54
+ars4x32 10 00000000 00010000 00000000 00000000 00800000 00000000 00000000 00000000 9867ce58 13167afc 3259d630 73b5cb83
+ars4x32 10 00000000 01000000 00000000 00000000 00800000 00000000 00000000 00000000 06ba859e b8d588e4 ea7f3b8e 3b1d1b79
+ars4x32 10 00000000 00000000 00000001 00000000 00800000 00000000 00000000 00000000 c04d021b 3518ba1e 3f729c0a 2cb2d2f2
+ars4x32 10 00000000 00000000 00000100 00000000 00800000 00000000 00000000 00000000 830e7ae7 eadc30a7 4d9812dc 6b43aa06
+ars4x32 10 00000000 00000000 00010000 00000000 00800000 00000000 00000000 00000000 b08691da 09b5e267 73cbee0d 57194cef
+ars4x32 10 00000000 00000000 01000000 00000000 00800000 00000000 00000000 00000000 e03fbf4a eaaf4354 a5f21afc 0b24275a
+ars4x32 10 00000000 00000000 00000000 00000001 00800000 00000000 00000000 00000000 4085411e 55ddeccd 11721c28 61944ef3
+ars4x32 10 00000000 00000000 00000000 00000100 00800000 00000000 00000000 00000000 31d2bb4c db351c79 ed94d0e6 b06757ac
+ars4x32 10 00000000 00000000 00000000 00010000 00800000 00000000 00000000 00000000 b948086e 5a94b824 1dab6a09 7ab43abb
+ars4x32 10 00000000 00000000 00000000 01000000 00800000 00000000 00000000 00000000 c2d6fbef 6f1ad683 6e50b436 8f6e0473
+ars4x32 10 0000ff00 00000000 00000000 00000000 00800000 00000000 00000000 00000000 7c0ff76b c44db90a c7495841 3d14b195
+ars4x32 10 00008000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 646271c9 b5f201f1 6a854d67 50292d43
+ars4x32 10 00ff0000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 d45d3917 70ffcfb0 2ff6010e 9af9b891
+ars4x32 10 00800000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 cf7aac1c 76b5a514 fcfcbe40 2bbc5b50
+ars4x32 10 ff000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 fca66d94 0f4feb3f e0ab1b45 536472a3
+ars4x32 10 80000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 2090d2e1 fe76252c 0a3241d7 1898c552
+ars4x32 10 00000000 000000ff 00000000 00000000 00800000 00000000 00000000 00000000 8f1a05f3 eb0d950f 5e10ac82 d7d98359
+ars4x32 10 00000000 00000080 00000000 00000000 00800000 00000000 00000000 00000000 e9c204bf bb484da9 7025ed88 c41eb824
+ars4x32 10 00000000 0000ff00 00000000 00000000 00800000 00000000 00000000 00000000 e3f0c873 0632085c fc75c879 88318a3d
+ars4x32 10 00000000 00008000 00000000 00000000 00800000 00000000 00000000 00000000 bcfed823 8ee4cee9 78d39ab7 f915b651
+ars4x32 10 00000000 00ff0000 00000000 00000000 00800000 00000000 00000000 00000000 95f99dbd 2abddccb 6ac36720 2ac62033
+ars4x32 10 00000000 00800000 00000000 00000000 00800000 00000000 00000000 00000000 f46eca4a 488c1f4d fce17f35 0e29f371
+ars4x32 10 00000000 ff000000 00000000 00000000 00800000 00000000 00000000 00000000 ed90442c 193ae115 c99d70af 9dbae328
+ars4x32 10 00000000 80000000 00000000 00000000 00800000 00000000 00000000 00000000 004e80fe 9b3a9cf4 1ace505d aec4050b
+ars4x32 10 00000000 00000000 000000ff 00000000 00800000 00000000 00000000 00000000 859f6028 433d3b58 85f84904 609079a2
+ars4x32 10 00000000 00000000 00000080 00000000 00800000 00000000 00000000 00000000 37ab8b47 fd603f7d b3f51703 1df6faee
+ars4x32 10 00000000 00000000 0000ff00 00000000 00800000 00000000 00000000 00000000 d12ca292 4e8eafd6 7720d20b afe3dc6d
+ars4x32 10 00000000 00000000 00008000 00000000 00800000 00000000 00000000 00000000 3958d33c 251761e9 2a2508e8 3ad41a75
+ars4x32 10 00000000 00000000 00ff0000 00000000 00800000 00000000 00000000 00000000 63b226bc 9f57beb8 0a08b6d2 deb4184f
+ars4x32 10 00000000 00000000 00800000 00000000 00800000 00000000 00000000 00000000 f1762304 babb3dad 9e68f4d9 ede3754a
+ars4x32 10 00000000 00000000 ff000000 00000000 00800000 00000000 00000000 00000000 459d968c 6566e40b 42960e14 d220224b
+ars4x32 10 00000000 00000000 80000000 00000000 00800000 00000000 00000000 00000000 bc82e8db 4745f1f7 834f9f5f 423b69b5
+ars4x32 10 00000000 00000000 00000000 000000ff 00800000 00000000 00000000 00000000 d4ac8f96 1e5ce164 202b2891 c1f1cb85
+ars4x32 10 00000000 00000000 00000000 00000080 00800000 00000000 00000000 00000000 555a3182 851f8f14 840f6e67 ff50f9bd
+ars4x32 10 00000000 00000000 00000000 0000ff00 00800000 00000000 00000000 00000000 c81cd8cf 39a0b6d9 707fb56c 14e285e5
+ars4x32 10 00000000 00000000 00000000 00008000 00800000 00000000 00000000 00000000 703f8143 6a9d4f17 1ce6b2d1 8a5a82ae
+ars4x32 10 00000000 00000000 00000000 00ff0000 00800000 00000000 00000000 00000000 bd3214ef 868380c4 90c06b8a 67ce86ef
+ars4x32 10 00000000 00000000 00000000 00800000 00800000 00000000 00000000 00000000 b49e71ab 6320e3ef 54ed49fd fe98e25e
+ars4x32 10 00000000 00000000 00000000 ff000000 00800000 00000000 00000000 00000000 ab7c9f9a 309cd4ef 72c641eb 8aaf2ef4
+ars4x32 10 00000000 00000000 00000000 80000000 00800000 00000000 00000000 00000000 97cc0d1a 620b1043 84c6dfe1 931f395e
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00800000 00000000 00000000 00000000 b7ca7f47 66e13159 047c8bec a45d8db0
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00800000 00000000 00000000 00000000 67e23eb6 be4231c7 3fa98062 fe04bd78
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00800000 00000000 00000000 00000000 5fa8976f f69a3512 1774b3f4 80395e73
+ars4x32 10 00000001 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 f7d2aa28 e640a1ec c2d8b754 41848c0e
+ars4x32 10 00000100 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 410b55c1 7bf60178 37d78113 db9f0b23
+ars4x32 10 00010000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 69feb9d9 7ddb8fee 793d78d1 cd2aeb75
+ars4x32 10 01000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 3b6e6059 c910b0f8 7a39c697 41336a36
+ars4x32 10 00000000 00000001 00000000 00000000 ff000000 00000000 00000000 00000000 fd1b6a45 cb542c48 02229b0d 290a52ba
+ars4x32 10 00000000 00000100 00000000 00000000 ff000000 00000000 00000000 00000000 c3d2e857 0441fd33 973d189f 0f2e74cd
+ars4x32 10 00000000 00010000 00000000 00000000 ff000000 00000000 00000000 00000000 409d2af9 5b3bf6c6 67242f7d 0a4ac554
+ars4x32 10 00000000 01000000 00000000 00000000 ff000000 00000000 00000000 00000000 ce3e9c59 6f490eef af582f73 466d8fc3
+ars4x32 10 00000000 00000000 00000001 00000000 ff000000 00000000 00000000 00000000 c63a6987 171d2147 0a028b8a 9357d8da
+ars4x32 10 00000000 00000000 00000100 00000000 ff000000 00000000 00000000 00000000 457d09fb ad6adc96 cf7e989a 18de088a
+ars4x32 10 00000000 00000000 00010000 00000000 ff000000 00000000 00000000 00000000 ca559ca2 a52c8634 b9f259f0 eb45d905
+ars4x32 10 00000000 00000000 01000000 00000000 ff000000 00000000 00000000 00000000 6d9c800b 96db29c0 68997d47 85629ce3
+ars4x32 10 00000000 00000000 00000000 00000001 ff000000 00000000 00000000 00000000 385760c0 d16f0faa 23cb7b10 5b7684fa
+ars4x32 10 00000000 00000000 00000000 00000100 ff000000 00000000 00000000 00000000 030f70d6 a2276f19 aa0303a5 9fff9373
+ars4x32 10 00000000 00000000 00000000 00010000 ff000000 00000000 00000000 00000000 a32dd276 66689272 7c93a697 5535e13e
+ars4x32 10 00000000 00000000 00000000 01000000 ff000000 00000000 00000000 00000000 4c882120 42e1caa4 77d94eaa 40fb7d85
+ars4x32 10 0000ff00 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 68af87e5 736298dc ffd70c1e cd7fdc20
+ars4x32 10 00008000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 06877113 0f14e185 97f9e55a b4eaa91f
+ars4x32 10 00ff0000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 b7a90a79 29557e2e 2859cc17 a9342fcb
+ars4x32 10 00800000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 124f8d4f 9db2acdf ca0bbb11 3d23283a
+ars4x32 10 ff000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 5df2a345 ca3497ca 637ff8f2 42ce8160
+ars4x32 10 80000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 4c9688b5 de560a88 153c9b25 6de2906c
+ars4x32 10 00000000 000000ff 00000000 00000000 ff000000 00000000 00000000 00000000 a4894ec2 b445b0d1 5ce41862 80de31ec
+ars4x32 10 00000000 00000080 00000000 00000000 ff000000 00000000 00000000 00000000 7ce5a59c 61f94b72 6cbf8c5d 5ab5b2bd
+ars4x32 10 00000000 0000ff00 00000000 00000000 ff000000 00000000 00000000 00000000 4ebc3279 09240e4b a07646df 005db721
+ars4x32 10 00000000 00008000 00000000 00000000 ff000000 00000000 00000000 00000000 387cd8ae ec75b073 76f47ec8 fcd3bde8
+ars4x32 10 00000000 00ff0000 00000000 00000000 ff000000 00000000 00000000 00000000 042a366e 12677620 bb39008c 14397c4a
+ars4x32 10 00000000 00800000 00000000 00000000 ff000000 00000000 00000000 00000000 b5da689c 879191e2 57b3b2dc cceba406
+ars4x32 10 00000000 ff000000 00000000 00000000 ff000000 00000000 00000000 00000000 93d66392 592f6cc4 95102dad f11423e0
+ars4x32 10 00000000 80000000 00000000 00000000 ff000000 00000000 00000000 00000000 efdb58c1 669ba5f2 63e548f7 4fd85d31
+ars4x32 10 00000000 00000000 000000ff 00000000 ff000000 00000000 00000000 00000000 c55a255a 6bb3527f 36f5bd81 b732a889
+ars4x32 10 00000000 00000000 00000080 00000000 ff000000 00000000 00000000 00000000 9642acba 516b0c77 6616d37a 38363d9b
+ars4x32 10 00000000 00000000 0000ff00 00000000 ff000000 00000000 00000000 00000000 fec0b5c5 e1eb7b36 d67dbc8d ed6b2fcc
+ars4x32 10 00000000 00000000 00008000 00000000 ff000000 00000000 00000000 00000000 ceaafa67 bb785bf6 db255932 f5fce949
+ars4x32 10 00000000 00000000 00ff0000 00000000 ff000000 00000000 00000000 00000000 81ca13cf 1c5aa438 5fbf0aeb f8ea76de
+ars4x32 10 00000000 00000000 00800000 00000000 ff000000 00000000 00000000 00000000 ba833116 fe7eaaa0 3fe9eff9 0de94178
+ars4x32 10 00000000 00000000 ff000000 00000000 ff000000 00000000 00000000 00000000 4e586f11 1e4a7a42 111fae69 d48e5612
+ars4x32 10 00000000 00000000 80000000 00000000 ff000000 00000000 00000000 00000000 44c18d42 65604a51 a44b5072 8641ca7a
+ars4x32 10 00000000 00000000 00000000 000000ff ff000000 00000000 00000000 00000000 ce91dd77 a6a45786 ea5cf870 a8de2c9f
+ars4x32 10 00000000 00000000 00000000 00000080 ff000000 00000000 00000000 00000000 f05bd698 29284180 78c6f669 1b5cf6e5
+ars4x32 10 00000000 00000000 00000000 0000ff00 ff000000 00000000 00000000 00000000 13a510c1 7ec43c0a 51e6456c 2fb6d9b8
+ars4x32 10 00000000 00000000 00000000 00008000 ff000000 00000000 00000000 00000000 34b3f6ad e44fda40 74d440b8 cb8b80d0
+ars4x32 10 00000000 00000000 00000000 00ff0000 ff000000 00000000 00000000 00000000 16bfac7f ba4437e0 c8aa863a 6bc8b15f
+ars4x32 10 00000000 00000000 00000000 00800000 ff000000 00000000 00000000 00000000 4da07234 8f72fe3d a4c2e8dc 94bdd3ac
+ars4x32 10 00000000 00000000 00000000 ff000000 ff000000 00000000 00000000 00000000 f468dfc1 6e0f1e95 26798846 5154122e
+ars4x32 10 00000000 00000000 00000000 80000000 ff000000 00000000 00000000 00000000 5fe2c6c1 af61ba83 457a3f73 a14a3fad
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 ff000000 00000000 00000000 00000000 b68c8a72 adb26d11 56ac3f0b 0ff6bd07
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec ff000000 00000000 00000000 00000000 7791be90 afae34fe 929d2b8e b154905a
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 ff000000 00000000 00000000 00000000 d9c97667 c152434b dc1464bd e178171a
+ars4x32 10 00000001 00000000 00000000 00000000 80000000 00000000 00000000 00000000 97ff5cd8 4861db8c 56b30095 393ea1b2
+ars4x32 10 00000100 00000000 00000000 00000000 80000000 00000000 00000000 00000000 d79f27d2 8c0b82f2 032b61a7 325736af
+ars4x32 10 00010000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 6d8a2815 12c7ae92 c104fdf1 cffe9065
+ars4x32 10 01000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 4a2e289e 6022c434 a9d05f0f b6164120
+ars4x32 10 00000000 00000001 00000000 00000000 80000000 00000000 00000000 00000000 a242a3c1 2d12adde 35c2700c 381ac0cb
+ars4x32 10 00000000 00000100 00000000 00000000 80000000 00000000 00000000 00000000 e0570553 5f8edf6c a744ed01 9b38eefd
+ars4x32 10 00000000 00010000 00000000 00000000 80000000 00000000 00000000 00000000 c278a1e4 30fdb3e6 87758dc9 407e25fc
+ars4x32 10 00000000 01000000 00000000 00000000 80000000 00000000 00000000 00000000 780d148b 118fcdea b603d27f 02207e40
+ars4x32 10 00000000 00000000 00000001 00000000 80000000 00000000 00000000 00000000 a2bda148 cc53600a 1726339f 72104df8
+ars4x32 10 00000000 00000000 00000100 00000000 80000000 00000000 00000000 00000000 0729f5bd cd715d46 76d7deb7 319cffb6
+ars4x32 10 00000000 00000000 00010000 00000000 80000000 00000000 00000000 00000000 8accf3dc 9cf6976f 95f4991a 366a0b57
+ars4x32 10 00000000 00000000 01000000 00000000 80000000 00000000 00000000 00000000 d9f99c22 aba10b6f 409410a4 46579319
+ars4x32 10 00000000 00000000 00000000 00000001 80000000 00000000 00000000 00000000 909887b1 6f7554d8 37e260c5 daa0f112
+ars4x32 10 00000000 00000000 00000000 00000100 80000000 00000000 00000000 00000000 f74bd90d 935d6769 0251c6dc 8c756b12
+ars4x32 10 00000000 00000000 00000000 00010000 80000000 00000000 00000000 00000000 36c4bb4a 068834b6 8658e86e e63b17c5
+ars4x32 10 00000000 00000000 00000000 01000000 80000000 00000000 00000000 00000000 fff5db04 c71a6e74 6fef623c 8cbd1065
+ars4x32 10 0000ff00 00000000 00000000 00000000 80000000 00000000 00000000 00000000 5494ff8e b037ba29 79cc7007 586b197a
+ars4x32 10 00008000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00ec0fcb 778eb20e aab8faf1 e35ac3cf
+ars4x32 10 00ff0000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 a917f1ed 8159329a de9788bf 97e4bbe8
+ars4x32 10 00800000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 25906cb3 7d803d3f 4ba100f5 e89d9852
+ars4x32 10 ff000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 d82188ad 229109e3 b4981afa 5ab8891d
+ars4x32 10 80000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 adbdf443 3fb1ffa4 1fa26427 d492932f
+ars4x32 10 00000000 000000ff 00000000 00000000 80000000 00000000 00000000 00000000 e8fa0690 193087aa f5ed6379 c99b78ba
+ars4x32 10 00000000 00000080 00000000 00000000 80000000 00000000 00000000 00000000 c967dfa9 e083aa64 ead2c7b7 d9ea26b1
+ars4x32 10 00000000 0000ff00 00000000 00000000 80000000 00000000 00000000 00000000 5dcf7365 5afcb957 df110c18 cbbeb426
+ars4x32 10 00000000 00008000 00000000 00000000 80000000 00000000 00000000 00000000 d5e940e2 434e3b1e 2f128f6f 5451dfc3
+ars4x32 10 00000000 00ff0000 00000000 00000000 80000000 00000000 00000000 00000000 f1794662 b301ae7d a2f464e6 997dd9f6
+ars4x32 10 00000000 00800000 00000000 00000000 80000000 00000000 00000000 00000000 c3aef88e f1d5ac85 d42a0f21 7cb0f3c9
+ars4x32 10 00000000 ff000000 00000000 00000000 80000000 00000000 00000000 00000000 92c61834 8ea5053f 102d04af 61223c6b
+ars4x32 10 00000000 80000000 00000000 00000000 80000000 00000000 00000000 00000000 89182370 ca6696b6 cd760b2c e0a3a674
+ars4x32 10 00000000 00000000 000000ff 00000000 80000000 00000000 00000000 00000000 da2c51c8 364eaf31 254fe3c1 ac396019
+ars4x32 10 00000000 00000000 00000080 00000000 80000000 00000000 00000000 00000000 a07f2985 6feb731a af6bbb05 aee2e670
+ars4x32 10 00000000 00000000 0000ff00 00000000 80000000 00000000 00000000 00000000 0ed8bd0b d0b7bd3c 516bad61 c187b5d2
+ars4x32 10 00000000 00000000 00008000 00000000 80000000 00000000 00000000 00000000 e2fdfa30 5630a1f2 2d4cba2f a04055ef
+ars4x32 10 00000000 00000000 00ff0000 00000000 80000000 00000000 00000000 00000000 fa4f81be 84a8f047 770751fe 6a4c9e83
+ars4x32 10 00000000 00000000 00800000 00000000 80000000 00000000 00000000 00000000 879c5ee9 c172703d fbbdcac4 03a9c0e3
+ars4x32 10 00000000 00000000 ff000000 00000000 80000000 00000000 00000000 00000000 6ae3fe71 5adb4c66 79a32ba4 f4be6b5e
+ars4x32 10 00000000 00000000 80000000 00000000 80000000 00000000 00000000 00000000 f40b0b8e eba53eb5 d8c08069 e2927be8
+ars4x32 10 00000000 00000000 00000000 000000ff 80000000 00000000 00000000 00000000 53d9cee3 cece393c ed6574f2 ebe560ef
+ars4x32 10 00000000 00000000 00000000 00000080 80000000 00000000 00000000 00000000 f78c13c7 8c0b88e3 c3173a73 929c7e82
+ars4x32 10 00000000 00000000 00000000 0000ff00 80000000 00000000 00000000 00000000 ec276a98 a5c64f44 ad7dfa39 47bc1a2d
+ars4x32 10 00000000 00000000 00000000 00008000 80000000 00000000 00000000 00000000 cc98cd21 2513088c 1ff85f6d 9dddd2af
+ars4x32 10 00000000 00000000 00000000 00ff0000 80000000 00000000 00000000 00000000 1b445988 88b28e58 1f32ac9f d878b6b6
+ars4x32 10 00000000 00000000 00000000 00800000 80000000 00000000 00000000 00000000 906819f6 9f13ac1c 776dee54 23b41c34
+ars4x32 10 00000000 00000000 00000000 ff000000 80000000 00000000 00000000 00000000 57489a6c 3a733797 a402c7c6 f7072556
+ars4x32 10 00000000 00000000 00000000 80000000 80000000 00000000 00000000 00000000 a978be96 d415dec9 0c39bc27 3042b2f9
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 80000000 00000000 00000000 00000000 4760415d 0a8eb41e e617271e ce05bbb2
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 80000000 00000000 00000000 00000000 a1ae2eab 1339f173 ed81008d b1f714e0
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 80000000 00000000 00000000 00000000 18c45445 15a58d99 fdb3876d eb1f5c04
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 1fa1e630 4d2f894e 6ba89d45 96dc9df0
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 1516864d 4eb88d23 b222d70e 6fb68e8b
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 5ce4a88a 23da0556 daac7f67 ed800fd1
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 828cc9d2 fb57de07 e8de59fb 2f90cec1
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 000000ff 00000000 00000000 77b148c1 ed3007c2 0651b6d7 b722ec45
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 000000ff 00000000 00000000 b6c6c579 e5d1451f 640dd587 fa5ae330
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 000000ff 00000000 00000000 5a28db11 36678ef2 930bbcf1 23cd2392
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 000000ff 00000000 00000000 59760264 41199d8c efbdd3c5 966525d3
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 000000ff 00000000 00000000 a2077d7d 8ae1cee9 14205b74 90e49ed9
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 000000ff 00000000 00000000 a34202b9 02f0238b 48f1f511 f4b9ae4e
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 000000ff 00000000 00000000 b8c1c0ea 3330fb90 f9947b9c a4a72574
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 000000ff 00000000 00000000 e1f71d06 65fbb183 99769e9c eac7f1e4
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 000000ff 00000000 00000000 c16e3334 d796c741 eb5bb0dd 8a879ac3
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 000000ff 00000000 00000000 f53b562d 1dfbd78f d3d968db fc5401be
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 000000ff 00000000 00000000 b441bfb3 540c411d e0bc213c db49576d
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 000000ff 00000000 00000000 a768eabd d0a8a1d9 8d9f363f 4ddf49ff
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 2b692d50 cddf4bd2 6930bca7 0e0d70fc
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 b33c77e3 14c35ce1 52c76d19 7f569a77
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 e68e0fa7 8d78692c 613fd85d b6e15efd
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 abbe0880 b1cd7217 7d55ce46 797a0862
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 dae5f10d 4ec8e1fc 3f268cf4 8c2c2ad4
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 84686cd0 a7ae82ec ff25ac79 f1dc3088
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 000000ff 00000000 00000000 b93e4064 9a91e466 07e0e82b b1117cde
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 000000ff 00000000 00000000 10db4555 815d4eb3 5d25295e f2a4f297
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 000000ff 00000000 00000000 703414c0 cc52320c b66fcfe8 7ccf471f
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 000000ff 00000000 00000000 a6a4b22b 0957d232 ebcafef3 476f5f82
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 000000ff 00000000 00000000 3e79b79a 29b72295 0aac8aab 1df135ca
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 000000ff 00000000 00000000 6c25c4a2 ded9637d b0062115 6f168a11
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 000000ff 00000000 00000000 c0268b28 4baf1fd9 75522421 c70141be
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 000000ff 00000000 00000000 2b0db51a e6e972fa c3db0c71 cf011a1b
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 000000ff 00000000 00000000 526dcc62 57cc3103 5325c82d 8d0d2443
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 000000ff 00000000 00000000 4d40d69f 70795c84 43806a1a 026f7148
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 000000ff 00000000 00000000 fc9ec47e 9da0186c 690fbed9 e779d32d
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 000000ff 00000000 00000000 adc1e763 48657940 f821733b 94466063
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 000000ff 00000000 00000000 88313a3b 434321fd 704c3a37 1de3ff37
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 000000ff 00000000 00000000 f8bb1fee 069fbde8 aea1be43 7bdfc1ea
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 000000ff 00000000 00000000 fcf27c4c 51054364 a2e8947c 4fe3d72d
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 000000ff 00000000 00000000 d0f8f28a f8816738 3c514ce7 6c34bb66
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 000000ff 00000000 00000000 fd2c89e4 f10f1080 a4ae9678 a4d6d514
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 000000ff 00000000 00000000 b9947f21 66735588 8fb143dc e7cc086c
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 000000ff 00000000 00000000 bc57f7b9 fbdd225d 327ce0ad fa0057f8
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 000000ff 00000000 00000000 d330aa24 d9b8c90c f33a9aea dcce91d0
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 000000ff 00000000 00000000 cce8a8bd e6d58698 ff2ef9ed 45c0ec86
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 000000ff 00000000 00000000 1c2a1a5c a03f2a9a 90488834 d9d22878
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 000000ff 00000000 00000000 f50918b0 1abc837e 63f787ca 4c3d21b0
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 000000ff 00000000 00000000 d3b48412 00431173 fc381c89 92f0d299
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 000000ff 00000000 00000000 59e6ed04 e72dee88 43a0c869 f80b6f82
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 000000ff 00000000 00000000 8ba8b541 1e8abc5e 2fb4912b 4d0f6dc1
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 000000ff 00000000 00000000 8b10b9c9 b977f852 d9bd28bf 12d77e54
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000080 00000000 00000000 110d6be7 a16da48b a3f265d0 b0569d26
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000080 00000000 00000000 52ca46a7 a18bb1f4 20ea22e7 128f8393
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 8c87ef25 27cba360 f0a8fc01 40c75256
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 5a5b8507 eb4ffb4b 398550d2 48ddd688
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000080 00000000 00000000 b33cee09 c18b0735 b1498f38 d5398d27
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000080 00000000 00000000 a17c32c1 8c2671c0 b2015ac4 209eabe2
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000080 00000000 00000000 688f798b 46fbe8bf 9dee92d7 054dffbd
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000080 00000000 00000000 bb8c5b61 041a0b85 c4560614 8c04ec9d
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000080 00000000 00000000 213669a9 29989053 7223d88d 000e3388
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000080 00000000 00000000 6832e31a 2bb5aa98 94ec72d5 84dabefe
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000080 00000000 00000000 aa365f18 72a90916 7b72d26a 94d8b664
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000080 00000000 00000000 ad54e76b 62d5fa01 c1d1575d 0b65f816
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000080 00000000 00000000 c233074c f26bc2e3 848a0d7f 50133fbb
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000080 00000000 00000000 70ebbaf0 4f6e7229 782f099f 2b72b631
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000080 00000000 00000000 33a62ae4 7c6eac1e b920fb8a 74f74c1d
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000080 00000000 00000000 af0a5b7d 43519cd0 ea3cda2f f740241e
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000080 00000000 00000000 e47439e6 ba0ebd9a ec544e8f 10895388
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 33f4223d 998b9cee 918cbcd8 bdc679c9
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 8e93e529 ae3eec51 464b8779 bf89010e
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 0abcea55 2b8b74d1 eec1f021 3446b5a7
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 e774b3db e0d8f2cb 684b504b 8ba60f5f
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 3b05baca afc7aaa9 9b3892d1 9abe1d26
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000080 00000000 00000000 2f6c73a2 972ed4cc 41d15bbf bc036df0
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000080 00000000 00000000 3f401a57 c43fd94c d3e0d78e 7994b848
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000080 00000000 00000000 1bbc1c53 2bb7665a 338c238d ff975267
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000080 00000000 00000000 2cdd6893 02156110 1c814ecf 6ec3f330
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000080 00000000 00000000 4ce62ccd 7f6a5d2e da2c1c9b 1ce2b248
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000080 00000000 00000000 220c8cad a5af436f 64e11e9f 391581d9
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000080 00000000 00000000 48b5dabf df94481a 6ed3bcf6 34ad0952
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000080 00000000 00000000 9f17100b 3f5315e4 793b6995 11cc7178
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000080 00000000 00000000 2e6da599 a33aa282 a52c8fe8 82d587cc
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000080 00000000 00000000 961099d8 a3e1ea0f d1c06f29 3576caf6
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000080 00000000 00000000 f3f8264a 0f8812fd 72cec900 4d46f983
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000080 00000000 00000000 150b661c d645dc30 58cee969 ffc65955
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000080 00000000 00000000 497d867a 04f9bdc0 01fdb685 b54bff6f
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000080 00000000 00000000 7c2e189a 58781269 a87399db 364b24ee
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000080 00000000 00000000 7ec65f86 adc1d28f bb957d72 d9e41689
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000080 00000000 00000000 87448d14 3b1715c9 586b3fe5 61b33657
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000080 00000000 00000000 3ca3750f 41213709 b4a9c050 a2802c9d
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000080 00000000 00000000 3e7d1880 846ca7a8 5b4d718b ec3c4b4e
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000080 00000000 00000000 aa65a024 a1f6e3e1 1e50300b 81b2fe34
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000080 00000000 00000000 6ea04ddf 68274c2d 00e8fe18 1e72c32a
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000080 00000000 00000000 091763e9 95c787c6 795f2454 7cde8a2b
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000080 00000000 00000000 f7eeae5f 4741b188 fce905e1 135baaa7
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000080 00000000 00000000 b1f3bfc9 6cb39ec6 a3c738ea a04985eb
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000080 00000000 00000000 590a08dd 916022c4 adc06097 48303077
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000080 00000000 00000000 64e7b5b9 33179a7e 4ca06cc0 5d956f58
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000080 00000000 00000000 dd4830eb 1314366c 600a1334 b68aa44f
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000080 00000000 00000000 a99d55a9 7cf8940a a70f0281 d233a206
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 2dc6c14a 01f7b3e4 e269700c 8039a0fe
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 cf32bd13 c75e8c63 337a5b1c 8b874719
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 bd30d45c 846cf3e2 0f784607 5180e999
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 24c4748b 5ff9410b 1638e715 317f5646
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 0000ff00 00000000 00000000 fa857c4e f695a8fa ba5a3fa2 f6231137
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 0000ff00 00000000 00000000 e9ffd90d 50b3ab34 f829bd63 9df6a93d
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 0000ff00 00000000 00000000 fda8b1ac 2efbcda8 9f4d4ed0 f39d01c2
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 0000ff00 00000000 00000000 3f4e231d 9e776fa6 32c5e943 06362122
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 0000ff00 00000000 00000000 bb71ca48 14cf1dd1 84cc6c3d 0a99871f
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 0000ff00 00000000 00000000 cfb0ef9a a2df536a b732ae38 1823beab
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 0000ff00 00000000 00000000 e2e28037 172a132b 6e060aa8 2fc0c9e3
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 0000ff00 00000000 00000000 f0981cf0 88e1084e 4c41f8c0 74505114
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 0000ff00 00000000 00000000 9b618c4c d158e039 45ddb8c4 4b0fdf24
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 0000ff00 00000000 00000000 52ac216a 053b9443 2b9c9b4a a5fb6faa
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 0000ff00 00000000 00000000 bee39c93 93b0301a 8910637e 23c3611c
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 0000ff00 00000000 00000000 650c2e58 7fd8bcf2 b846d4cb 5c5c5896
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 27f00b01 e912ea67 025dbccf 216e777f
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 95188c09 e7abd1db f318be66 d1165daf
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 faa73165 0abe4f13 ec553c37 448f1e74
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 d32c5d3b 0af1158c 2bc4a9f8 ee58b025
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 482b2f4f 77e2bd55 29e72d52 a7d60f91
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 fa179af1 9a4fb273 da522d39 f1dc01a7
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 0000ff00 00000000 00000000 a3fed363 4fc44ec9 a06b8195 38126587
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 0000ff00 00000000 00000000 01cf1c5d a676e82d bfcba095 5b90a259
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 0000ff00 00000000 00000000 aeb20d4c ea634ae9 1b8be6b3 6df7b85d
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 0000ff00 00000000 00000000 afa063b7 8902017c dd482f4e 59a11ca9
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 0000ff00 00000000 00000000 96f72228 034dacbf 8bee6910 b56b2d20
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 0000ff00 00000000 00000000 80c2cc73 1f725523 61f67069 17059dfd
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 0000ff00 00000000 00000000 8a19cd22 d8e8238c a1159618 cf0e9fe9
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 0000ff00 00000000 00000000 a0be8a6c 1290d8e5 ccba2020 258bd01f
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 0000ff00 00000000 00000000 c28cf28c 6d2d75ae b6aec62d b6fa4e89
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 0000ff00 00000000 00000000 d065ba13 013ae0ff e9c4c8c8 c52e46cf
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 0000ff00 00000000 00000000 be88f8ac b839f2f3 f3af303c 63895958
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 0000ff00 00000000 00000000 4fd07277 958637fc 6a3b8e1d a3b8dcb2
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 0000ff00 00000000 00000000 6a829f35 7fb7d017 371bb7ff 4adfa760
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 0000ff00 00000000 00000000 67018fc1 0e251c19 6223f775 1eb72c0e
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 0000ff00 00000000 00000000 d460bcde da2c1ea7 4e6158f8 0dcca4a8
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 0000ff00 00000000 00000000 4a97d4c6 ce1fad90 29297407 ad396e77
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 0000ff00 00000000 00000000 d4f4091c a3c2580f 8e58289a 0075b40e
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 0000ff00 00000000 00000000 234a4361 27a4a0b9 af6ccd19 28133313
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 0000ff00 00000000 00000000 eba3fbea c112d76a 4d32c5e6 9a8e9651
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 0000ff00 00000000 00000000 45e5faa9 c2277e0a a73963b9 8a75f7e8
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 0000ff00 00000000 00000000 1bab678d 9901717a 60d037ec aeddc874
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 0000ff00 00000000 00000000 fa19c967 6830b351 347d854e c4b9f813
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 0000ff00 00000000 00000000 7ba2449d 32520ac1 d9d16688 0add41f0
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 0000ff00 00000000 00000000 a33f8984 e8d72811 711888e1 f5fbe028
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 0000ff00 00000000 00000000 cb545f23 5ca091cc 08a6a333 4a2921e1
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 0000ff00 00000000 00000000 2307f427 f289a5c6 396b854e c89338d7
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 0000ff00 00000000 00000000 aaf76d9a 28743c55 708931a0 b700e2cb
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00008000 00000000 00000000 11b2c798 52af64ac 5e86f95a add1345d
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00008000 00000000 00000000 89ef1d94 7516434d 8b76d4f5 51bb21d9
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 b8344e5d 861a5367 85e0d288 d52a6203
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 1e234bac 544cb733 74336b9a 34b1db37
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00008000 00000000 00000000 c0babd76 90c70187 1688183d 457dba82
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00008000 00000000 00000000 b58786b8 09807b2f c6886e95 d9fffcf5
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00008000 00000000 00000000 fdb0253b 138d16ba 4e9fef71 99813f71
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00008000 00000000 00000000 c39a5f5a 90c42202 e41ce57e 25d838f5
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00008000 00000000 00000000 bf7138c2 2db613f3 979e46d2 15b04dbe
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00008000 00000000 00000000 37dbe9ae fb1acad6 6d44734c 3169b3f7
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00008000 00000000 00000000 efb0b715 8ea1b1d7 30607b3a 6cbfa6e6
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00008000 00000000 00000000 b9943661 5b9b8b69 09758f3f 53b808e7
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00008000 00000000 00000000 f3770661 9d9b9d0c 5484af6b aa8d4ae6
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00008000 00000000 00000000 10aeb57b bed162e9 61e1ec21 875c02ba
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00008000 00000000 00000000 7eb11039 8be0d22b 973f2195 339f4e7d
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00008000 00000000 00000000 bf9e158c f594dea2 163f71b5 cf4625ab
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00008000 00000000 00000000 c5c9e699 44b05450 220e2be6 b3fbafaa
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 7a702519 770065c5 7da1ac78 42975dfc
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 e45e79b9 c1d70b6b e58d50da e25b8a3a
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 bb8017f6 c2dcd9ca 438b0414 da0afe0e
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 001d26fb e5cd3e68 2eb855d5 cede37aa
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 26caf5a6 c643f329 e8607db7 d9c43796
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00008000 00000000 00000000 4f70d0bb cb90e2e1 deae178a a69ff4ca
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00008000 00000000 00000000 04e23895 30380ec2 ecc92d37 e56ff7ff
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00008000 00000000 00000000 384cd0f8 f6fb584d 34653a8a 233ccfbd
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00008000 00000000 00000000 0b8bf352 9216ef4f 671c47f0 40d679ed
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00008000 00000000 00000000 384b01f1 cf053f61 0ee822fc d0eb61a0
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00008000 00000000 00000000 a73319dd d1dca02f 849e2935 362de084
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00008000 00000000 00000000 126fe0b7 14eccfee 3dd0d096 0cc3db10
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00008000 00000000 00000000 c19242ba 0ff36b65 5bdd3942 75c188a2
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00008000 00000000 00000000 62024504 6cd94d16 bd1dba48 21bda41b
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00008000 00000000 00000000 f3833739 6d37801f 73b528bb fcb1ddc9
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00008000 00000000 00000000 90f44c11 9b3cd3e3 4df59a4c f8fbe502
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00008000 00000000 00000000 db6477d1 e733e1ed b8aab516 5cc31604
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00008000 00000000 00000000 903253e6 055dc1c5 eaea3cc4 7a424462
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00008000 00000000 00000000 547f2be9 3242aee5 b9a90db3 9a29a381
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00008000 00000000 00000000 daef34c4 45aed485 41ca2065 db079e0c
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00008000 00000000 00000000 4e1631d6 5c7b4cf3 73a62ac9 741a6062
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00008000 00000000 00000000 13bb6593 dcba39fe 373f2594 4fdadf7e
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00008000 00000000 00000000 e2aa5355 6565f485 e856d8b6 1d7adba8
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00008000 00000000 00000000 093b963e 4f1add3c 1901fe1b 368971d9
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00008000 00000000 00000000 04214948 1dfe8a9e 840c1e7d d34065ba
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00008000 00000000 00000000 d587f9f9 16e41aba 3081e5ae 3f13668d
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00008000 00000000 00000000 d359dc0d 04af3b91 af74a3ed 87abd08a
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00008000 00000000 00000000 183c4d47 496bda9c 2733d10b cea402e3
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00008000 00000000 00000000 314c5626 49d1dee8 5d50e64f fda22ca1
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00008000 00000000 00000000 d407159d ad5b77e9 6c1f5f7c 35e4de8e
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00008000 00000000 00000000 699f5f9d 9fa89518 c13cdb55 4d965dc1
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00008000 00000000 00000000 7b10eb91 66941760 e17ccee9 0cb270ca
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 8b271a26 3cded4fd cb377902 7f99f502
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 792d2c87 5be9b0d5 f50624e0 620eddef
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 cb87c293 5ef3b0ac 4a0b069a fa524a9c
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 73af0176 f2d557b5 f6cb2d33 0910883d
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00ff0000 00000000 00000000 a95baffc 8692d41d 45e878b2 5a37e6ec
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00ff0000 00000000 00000000 58ad47c0 9ea46109 aa939c1d f1070142
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00ff0000 00000000 00000000 fe9eec24 d63ae788 42cb27a1 2a4809ac
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00ff0000 00000000 00000000 e1d90779 d0cf9e8e 2d18a333 93524d17
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00ff0000 00000000 00000000 b0d45209 bb6959ea 981747e1 43f39533
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00ff0000 00000000 00000000 54ed87ce 97c97497 2ab91c56 c619b886
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00ff0000 00000000 00000000 d03ca0a5 1e7da6e8 e6f15ee7 f595e3e9
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00ff0000 00000000 00000000 a69eddec a62433ad 00a9b200 f12e415f
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00ff0000 00000000 00000000 f41434d3 322159d1 f6877d95 8c5beada
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00ff0000 00000000 00000000 499f4f32 9fc76c64 bea7af15 11fb6c62
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00ff0000 00000000 00000000 d7602848 995411e1 ff54159c 4d1f597f
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00ff0000 00000000 00000000 4fcb1a1a 68d49cb9 0b816bf9 8ab2995a
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 92b3435b 68231e7f 34d0496d 835a905e
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 6e257524 3131909f 14c26282 f39bb71c
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 e2ea1171 5bce8a8d 9dc3143a 7f73794b
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 3bc194f4 7f08a721 90d50d8c 8c4d558d
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 4274cbd9 5f814654 d63ae4b6 991a1bb2
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 73f15782 8ee7bbd4 b2698492 3d28ce62
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00ff0000 00000000 00000000 60ee2bc1 df5d201b cb3f1ce6 01174504
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00ff0000 00000000 00000000 de375b32 20f72567 d341c3bc 96fb7b71
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00ff0000 00000000 00000000 2b9f1dc7 28521207 662164d9 814fb941
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00ff0000 00000000 00000000 9a46ea69 93255817 9462f4ca a1e7a299
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00ff0000 00000000 00000000 aca5f032 54df27d4 90e4397f a25907b4
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00ff0000 00000000 00000000 437b6f99 61aa8c4d 53d08872 1f945ba7
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00ff0000 00000000 00000000 9fff0f99 1e866f3e 4bb9588b 65e8a528
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00ff0000 00000000 00000000 1f4c2477 506b421f 76562a09 4b19fb3f
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00ff0000 00000000 00000000 4d7d6752 85f4d2e6 5ea98a87 a9932a8b
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00ff0000 00000000 00000000 a1e478bc 62bbb1c1 f31f526a f707e9d8
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00ff0000 00000000 00000000 a2e8713b 9fd9843c 35f213da 69535ab7
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00ff0000 00000000 00000000 f6e3e374 c4182263 185a28ec 3fb22ed7
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00ff0000 00000000 00000000 1ab188cc 3c24b734 8b7fdfa6 34651748
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00ff0000 00000000 00000000 b73485bb f616a467 b941b4f8 ba301c08
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00ff0000 00000000 00000000 5fc90eb0 38749554 9ad52075 be7e9fd3
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00ff0000 00000000 00000000 6e82d5f4 44b9bfb9 68d69727 0f1af38f
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00ff0000 00000000 00000000 26a5309e 92459c89 13e8246a 8a1debce
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00ff0000 00000000 00000000 9f30a96d 8fb8d407 bd1ae374 fc6a2e7c
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00ff0000 00000000 00000000 8d886bcb 2dfd8d6d b9821758 dc461d09
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00ff0000 00000000 00000000 f695ecbc 86558726 aea04b27 47007ed8
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00ff0000 00000000 00000000 b95435b3 ea82ec28 8c211929 10117636
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00ff0000 00000000 00000000 537efb9f b4bb37d9 11b135be 59cb6b94
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00ff0000 00000000 00000000 f13bf67e a9633301 bfe65b6f 3ecb9167
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00ff0000 00000000 00000000 6b0a6693 db1fc14f fb49596d 7dbc3ca4
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00ff0000 00000000 00000000 b99ff4bb 8b706e5b 33e937b1 c89eb4f3
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00ff0000 00000000 00000000 0c5f68b3 e13e35d2 97b3e761 1d05ec2c
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00ff0000 00000000 00000000 fa437e41 baa6d495 31e4651b 065a40bc
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00800000 00000000 00000000 a9614f77 e878adfc d1644771 bb7e1f0f
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00800000 00000000 00000000 51c98f25 4dfb61b1 72070d1b 2b4bce7b
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 a6dcee11 fd2c4c13 35b3c08e a74ee6f3
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 ea476d7f af214625 ad771422 28c1ba87
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00800000 00000000 00000000 d844d6cc a557cf23 3df42836 978a7ef0
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00800000 00000000 00000000 c2a296d8 9b211cd1 02e4c488 2d2f36fd
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00800000 00000000 00000000 8ac56a48 dc10e356 42515a3f 7a8c383f
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00800000 00000000 00000000 d8a88471 4823d9b8 3cde01cc 54187f20
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00800000 00000000 00000000 77dde11a 0f88c85f eb5e4013 051f7868
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00800000 00000000 00000000 65798694 72d38e68 bbc713fd cb3c43dd
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00800000 00000000 00000000 86b0f28e 68bafab0 fdac32b9 83f28341
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00800000 00000000 00000000 3af3ac1e a60e19c1 91532c03 482276ae
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00800000 00000000 00000000 f3a77866 84a6ac92 50873f5b bea502e7
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00800000 00000000 00000000 c3ff6aca b19189cd 41e7fd41 1f8019ab
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00800000 00000000 00000000 84cf9d48 8d6a83a1 3f3b1cb0 68da841b
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00800000 00000000 00000000 06042f2c b5c52213 9b0f3804 ba68d96d
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00800000 00000000 00000000 c864f8e8 9f323c3d ccb036d2 1fc4944f
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 7127d03b b6cf6400 87b36419 24dd6bbe
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 c75b4203 ff4b9dbc 411a33e7 6657b609
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 72f5ea73 c633bba0 da9d45fb d8118c29
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 40bac872 417af0e8 18491dda d6c616f5
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 c919dc63 1328fdc9 21353f9c 5cdf89e6
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00800000 00000000 00000000 c1fabb73 39e038ac 98726be3 88ffb110
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00800000 00000000 00000000 4fe2ea59 757d88c1 fd1bd554 291f1d12
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00800000 00000000 00000000 6625392c bd116176 393d082e 1c65e979
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00800000 00000000 00000000 de7824ee 41930dbf 0297daf7 b5b44e94
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00800000 00000000 00000000 6d8582de efb21c49 06bdf0cf 1ef8ed63
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00800000 00000000 00000000 95e325a9 c9452803 1b92d70a 36290e55
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00800000 00000000 00000000 b40e1c7f 51359e8a c545965c 4f94d4bb
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00800000 00000000 00000000 0d156b55 447f4959 0f62f99e 87c94668
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00800000 00000000 00000000 7031d465 15587368 4c2efc4b 7e9a28fd
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00800000 00000000 00000000 ebfe358d 0d8cf82a ac6b7fef 3f690b9c
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00800000 00000000 00000000 951be3d0 919ee902 0ab9ed0f 32308e60
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00800000 00000000 00000000 0bbe6a6f 56b38c2a 36a4517d d19eb168
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00800000 00000000 00000000 76b0a5b9 166ef9de 3c20e1c9 f32192b0
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00800000 00000000 00000000 84f90e94 ba62b185 b8a9b3a8 e2ad2df7
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00800000 00000000 00000000 0ca1105d 39d85068 f21fd86d e1b17585
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00800000 00000000 00000000 0a0398e8 de216909 5afb1040 b39b650f
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00800000 00000000 00000000 e3a13c42 d7980183 c885a470 385b36f1
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00800000 00000000 00000000 f7bc487f ab0e715f af9319bc abd0bc9e
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00800000 00000000 00000000 7917a5e2 3a2c501e e65446be 39701909
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00800000 00000000 00000000 082ca32d 5f7316a6 724c27f8 14a1186a
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00800000 00000000 00000000 67f5ae30 4e872d21 3b7ee342 2678784d
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00800000 00000000 00000000 facba4fa ca4ab7ec 5404231f 490e3bac
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00800000 00000000 00000000 d49a718f 8017f588 d2493f0c b711a6d6
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00800000 00000000 00000000 3720a7ab bab9748e 9716bb16 81c698b5
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00800000 00000000 00000000 ab3cabe1 89b3bb6a 688f9d93 04122cca
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00800000 00000000 00000000 e673f8a9 1a1349ea 1bce935c 129c5a05
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00800000 00000000 00000000 3218b830 3acfac5b 8e1f2094 cdafe481
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 a0f9adc0 50a0a405 0792e60b d250490e
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 710201b7 f4fad272 4a0f4d05 13bfce15
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 ba8fe932 b074d0a1 5a22c96a f5177348
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 80aa7b57 ebb4e0ec ed281947 7e20fbae
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 ff000000 00000000 00000000 24c99b1f 28c1fefd 9b09c683 268f3683
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 ff000000 00000000 00000000 2937c5fb 75f9242d c218d7b0 e21da5c3
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 ff000000 00000000 00000000 5d9cdbde ffd2ed18 7a29659d 0a8490c1
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 ff000000 00000000 00000000 83a9ccf6 e3e5f3eb 92d33f24 f29d26a9
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 ff000000 00000000 00000000 b9502d2a 9b7e2edb cb7007a3 e3e1bf84
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 ff000000 00000000 00000000 a7ce23fb a1da063b ccbc80c9 f204b7b8
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 ff000000 00000000 00000000 f44fb029 f88edbe5 767663ae 76159c73
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 ff000000 00000000 00000000 88b1e3c5 ac6bf6d4 9b8ede00 1d50be01
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 ff000000 00000000 00000000 a06872b0 2115765f 71e5f5b0 06c72b76
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 ff000000 00000000 00000000 fb5d18df 8769ff31 e1e17123 72d6d1b7
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 ff000000 00000000 00000000 3932a248 c79313a9 1cc7dff0 d35e3f26
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 ff000000 00000000 00000000 87d2e8e9 994264a9 2c55677c 198990a8
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 53f0b4bf 13c9f83c 640030e8 6096a3ef
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 69349340 084b9ee1 1847b60a ecf1129b
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 5a979080 ac599f32 82e9f866 dfea36fe
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 fe136d46 a8948301 8e29eb3e 4ca702df
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 fa1eea01 a4d4f372 a2a6abeb e056b959
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 1c5f9175 40fe7227 a1cc702a 03716ea4
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 ff000000 00000000 00000000 682d8534 5ba4cd55 b3598b72 debffe0a
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 ff000000 00000000 00000000 e807a95c eb8bf49c 7081ada2 76fa7315
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 ff000000 00000000 00000000 a03a73e9 15f9785f 8f2f449a d9951353
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 ff000000 00000000 00000000 9a68b1db a743b0e5 4bd12457 facc0d2a
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 ff000000 00000000 00000000 5e491c36 7b79cc5e 030fb10f fd830c30
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 ff000000 00000000 00000000 3a4897b0 dd519314 4770822f 00b8d259
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 ff000000 00000000 00000000 b675f977 2e1ab2e3 7d185337 d4dc0d49
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 ff000000 00000000 00000000 2e36a555 c3c707e5 ffc6d799 f24d4311
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 ff000000 00000000 00000000 609b8e18 b6d3fd60 86d71136 bbeae13a
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 ff000000 00000000 00000000 fac5b1be 656786cb 58a1c095 6a46aa21
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 ff000000 00000000 00000000 d646323b af4b3751 9bb77dba ef0ca0fb
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 ff000000 00000000 00000000 b9b127ad 2d4dfe40 5aa49be3 ff1b6897
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 ff000000 00000000 00000000 45661465 1cf012c0 9497666a 6173081c
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 ff000000 00000000 00000000 9d20cc22 9814ce73 83510e87 b16f59c6
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 ff000000 00000000 00000000 2959ebf8 44c6d75e 5c7bf4ba bc1ff850
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 ff000000 00000000 00000000 f6192614 5bdc0dfd 9a5f5825 caa993ed
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 ff000000 00000000 00000000 0aa7844c a3aab8b1 2278de65 22b828ab
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 ff000000 00000000 00000000 7c17e752 b8419c18 fcb21d8e 1ebbb101
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 ff000000 00000000 00000000 b1d26e4d dc7af8fe 7895d10f c4eede45
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 ff000000 00000000 00000000 c1410777 2d3248f8 269c2836 2e7cd461
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 ff000000 00000000 00000000 5c861f6e 6c4386b1 5f03c53c 377e35fc
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 ff000000 00000000 00000000 d36721d4 9ef3c8d7 311f374e 0048acf5
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 ff000000 00000000 00000000 04060dcc b0eff4b7 1d1357d8 d953f14f
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 ff000000 00000000 00000000 3da29869 87c1cba7 0a83b037 c2bc2f74
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 ff000000 00000000 00000000 cd2ce71d 484fc862 51f2b487 7d8fb164
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 ff000000 00000000 00000000 a8b834d7 97503406 ed40d6b6 a131a359
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 ff000000 00000000 00000000 a5bd4941 390f6b85 5450dc68 c053a7a1
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 80000000 00000000 00000000 35490912 57d0e7d9 ca875369 3cfd04f0
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 80000000 00000000 00000000 f0bda856 42764679 19fbda68 8172da2f
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 31f324d9 96d79123 5252fdcb f32ecd0e
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 22905cd3 18dd2f62 0e30a1cf 41ede49e
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 80000000 00000000 00000000 942d9e5c 4d5d4e1a 8efa50d7 57f2b95a
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 80000000 00000000 00000000 2ff68685 317f6334 769179f1 769f811e
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 80000000 00000000 00000000 cda3bc71 f45c0efe cf9c8392 f6c63745
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 80000000 00000000 00000000 74cd0365 ef908ab9 cc4d4637 1db9ebd2
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 80000000 00000000 00000000 cd891f47 607c8990 d9b38f3b 44e7cea5
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 80000000 00000000 00000000 4e9ce7a4 88224aa0 699f58de b44e5acf
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 80000000 00000000 00000000 28661024 afadeba7 d0f8222e 81218a10
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 80000000 00000000 00000000 659799ca bafffae3 a6473f39 4dffdcc2
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 80000000 00000000 00000000 8d352b3e e95d257e 2b3add91 4614e45f
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 80000000 00000000 00000000 49ad8464 0aa772a7 52a8ea18 c8eac568
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 80000000 00000000 00000000 f778e9ec d9e60399 e7db0012 8ecc888e
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 80000000 00000000 00000000 f2303c41 733bbc2b fcd5d8e4 73dac3aa
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 80000000 00000000 00000000 bf8290cf 4f386e9d 98e26227 4b71c30b
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 99b92605 b5b8407d ce9a264a efc77316
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 cea8f1d7 b6bf885b 02fa6423 0cc90195
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 d1d0debb 1e26cda5 234e1eb6 9f053dd5
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 4ac84af4 9e2bcf7b c92400c7 425abf64
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 63f4d549 0b5b9f93 4f1dcd5a 17d2efe7
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 80000000 00000000 00000000 55cf4ef9 5cd578ea fd9aeeb8 22aeb44f
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 80000000 00000000 00000000 a369eb36 0ce5a066 359b0d2f 7394e4ce
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 80000000 00000000 00000000 8d9ccef5 64949cd7 ff5bdc17 799f01a8
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 80000000 00000000 00000000 0851a190 2f6c3516 06d9b4ad d16e22fa
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 80000000 00000000 00000000 5d2bc951 5ef057fe ef7adfd1 3e1020ae
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 80000000 00000000 00000000 a9191c15 4e461234 1f53bfb2 1017eed9
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 80000000 00000000 00000000 29eb1d58 906ebd03 3884c6a5 a653e529
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 80000000 00000000 00000000 fc52f6ac e2be16cf 1a91efd2 8f2c9ef4
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 80000000 00000000 00000000 a19f9e8f e02661b2 87f70d0a 270420c8
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 80000000 00000000 00000000 50f7f407 0a83c5d1 ea15a99e de1fc8f2
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 80000000 00000000 00000000 abae9972 c9b62db1 d5a35a15 78bf031c
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 80000000 00000000 00000000 ae290b57 22620c16 8c4e3380 8f98f719
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 80000000 00000000 00000000 f53616a7 898e1293 5f8a4e1e 6557c24c
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 80000000 00000000 00000000 7203fec5 a32613dc b91c159b ffad3ccb
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 80000000 00000000 00000000 f108b0e0 3984cf10 0c2759ed a3a43c0d
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 80000000 00000000 00000000 5c6810ea d797869a 6ec81def 9bbc3fbf
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 80000000 00000000 00000000 8ce8b903 2356b275 84691e6e 8d2efe08
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 80000000 00000000 00000000 26c9b894 ced52c49 b1f1b094 e156101e
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 80000000 00000000 00000000 105c7c88 609d2997 81304651 8338a0ca
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 80000000 00000000 00000000 2b093dd5 fca6899f 6b275645 45d06e83
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 80000000 00000000 00000000 c7199cdb 1342290b dcb9eb77 1dc71da7
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 80000000 00000000 00000000 7b1b1236 2ce34af7 e02ef933 ea984440
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 80000000 00000000 00000000 6cb3b476 d12819f6 959504d0 ccc2f276
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 80000000 00000000 00000000 3edff8c0 a6187c02 4a1d2177 cb169a0d
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 80000000 00000000 00000000 f382422b 3d3dc13c 6d45a473 af756ca8
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 80000000 00000000 00000000 31d99cd0 d6b7e2d9 1ebcea94 e1a748f7
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 80000000 00000000 00000000 a4e64916 cd15299d 5e26d12b 48de37f0
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 9f5d80d4 794a5486 29019ab6 472dc4b2
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 4ea72aa2 24ace57c 65343fe2 6141fd36
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 9f2ff8a9 7c05765c 452bc993 56084006
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 45aaeca8 27b057aa 2dc113b2 3702518c
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 000000ff 00000000 66e88052 7dc51f2e 9c389d67 1183e665
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 000000ff 00000000 be2afa22 a59d5538 b472a507 29dfae20
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 000000ff 00000000 a8e52eb3 142aa6f6 15539351 b2712232
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 000000ff 00000000 c06bec00 a6ceb148 e5f5fa07 63d33156
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 000000ff 00000000 9ce5471a 1b3a598e 147d0066 d43b3db6
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 000000ff 00000000 ddda7a40 55624a27 ff7f26a6 e9d75f26
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 000000ff 00000000 c436bd96 912fa0a4 60c27280 1cdcfda9
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 000000ff 00000000 c04e5b29 51991d05 ada54c6a cc68206a
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 000000ff 00000000 978b5998 d111a2be 502869aa 05f16b73
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 000000ff 00000000 0de53a91 0aa5a806 085092d5 1105944d
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 000000ff 00000000 09cb6199 f40eb188 1c0b8c0e b6185e6f
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 000000ff 00000000 8bb1801f 28cbb5eb 942bb8ed 712f8a30
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 d5860ee1 1fffabfc 739c6d0f 652fe6f2
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 74fb0c2b 8f24decd e948fd90 5230ee0d
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 3df7bada 01abdad5 56eeea05 45442205
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 d4674c3f c89c765b 82857074 32763d4d
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 219a795f bf1f73ca 80a4661f 7b03cea8
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 07f88686 9cbf736a 90fa5537 bdc78d0f
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 000000ff 00000000 31c48afb 47e6fdc1 bfab3797 9911a653
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 000000ff 00000000 bd931b49 d549608e 341743d5 d33a2785
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 000000ff 00000000 71e6c352 95ffd8d4 087423a2 57d38421
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 000000ff 00000000 6a889c62 4cc200b8 443378a4 024a49a6
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 000000ff 00000000 15854a4e 399eab8c fa1bddf2 31bb7730
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 000000ff 00000000 deec5aca a4e0cd6f ca050a65 d8e94063
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 000000ff 00000000 3bb81a8d 57466caf 04414319 0e2b8c4a
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 000000ff 00000000 ed59a3a3 d755a575 589bee5d 5cb05c14
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 000000ff 00000000 4597e89c 63d67111 e9b252a1 9a190af6
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 000000ff 00000000 f8eb267a 0e8e0dc1 c8366e23 758f6f30
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 000000ff 00000000 991dc2fc a2782037 3f421cf7 c6b03740
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 000000ff 00000000 a226fe9c ad602184 9140c643 4129ca3d
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 000000ff 00000000 1bdeb639 53b985ee c0bcb078 b892c4e2
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 000000ff 00000000 172511c8 c2a169b2 fb123cef 32417c29
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 000000ff 00000000 8efe1d11 d5be5fa6 be816827 904558d6
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 000000ff 00000000 5889a990 36b0fcb6 26ad5e11 8f3bbf66
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 000000ff 00000000 349e8c58 73a53b65 29d1ed42 4616e7a4
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 000000ff 00000000 a2aaf3eb 9347b26a 1917022d de2dffee
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 000000ff 00000000 8c757a87 587c4cf9 1b5c1bf9 0c3616c5
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 000000ff 00000000 6760e16f 93b03b74 a7de3a80 8fa93309
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 000000ff 00000000 ff278b74 d430f96e de8e472f 0ab8a7d0
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 000000ff 00000000 e8e4f94a 345f8d70 a38fd32a 5c726aea
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 000000ff 00000000 c2a23dd0 7011b1e2 332c7423 b35056ee
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 000000ff 00000000 251b5804 ba885efb 577759f8 543e0e84
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 000000ff 00000000 7fd4d23b 15b8edfc fee03fe5 a12f94a2
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 000000ff 00000000 1049d92e 7b4b996e 99541c8d 087efad4
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 000000ff 00000000 9d0ded71 e435dccb 164901af 34fc1baf
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000080 00000000 78edb96a 6908c8de 14f55ef2 9f0fae04
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000080 00000000 de37fe97 cf28bbb9 b661da5b 2a13c7ee
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 6e861f75 1c7655a4 daa779f7 1021c8ff
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 44313b42 a77b3f2a 2fe551e6 0540dfd3
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000080 00000000 03dd5293 61edd733 c5ed88da a6cab8b2
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000080 00000000 ed06f5a9 5568a8cc cc6cc793 3ed98f1f
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000080 00000000 24b74d8a b47dc602 eb1c91a6 9f4ed8e6
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000080 00000000 7d802fde a6e88144 599f7e11 8a4d5f68
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000080 00000000 32a71211 59b38cc0 b4f2b31a b2136232
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000080 00000000 ced9a35f 763e924f 69fd7268 33d411de
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000080 00000000 8e5b8b9f 94f47d85 57251d28 f0b25ce9
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000080 00000000 97591c5d 87e8713d 3cc50903 d1e27c7a
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000080 00000000 3f7b1e5e 2aba4203 5a55d1ff ab7ed0fc
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000080 00000000 5d0fcbcd 06665fed 3757cff9 d810791a
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000080 00000000 728af58d 5781eff8 8864c0f9 3b75ee85
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000080 00000000 967523e3 f9c4a057 c35a6daa 6151a76a
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000080 00000000 1933314b ee335886 0ed15ef6 5e42982a
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 decd3a83 4501177d 54b8c3ab c59dd6e3
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 5b445f94 312e247b 2ab3cd23 fd412c8b
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 010df58d 380f8c53 0cfc4871 e3cd6daa
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 699b519e 09f8e4c8 266de62a 9f7f6722
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 9286df5b 4acb9c6a 6796ae21 66c4b0f9
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000080 00000000 257bb931 15374ecc 84e3bc37 00b3a497
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000080 00000000 34212381 2c5363ee 2576da5e e6cc37a2
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000080 00000000 3433f8db 4cb05ac7 f0607702 38136951
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000080 00000000 635503bf a1954b79 2cf926f5 980ca587
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000080 00000000 d39d7534 afcc457b 098e9a43 4a456000
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000080 00000000 4519de79 96f80024 24d07cbd 4c0b7795
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000080 00000000 d29296cd 6dc750a2 fd383b84 64755f9c
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000080 00000000 49c5803d 9fcf9542 6c79ea07 49261f84
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000080 00000000 e273b4b5 6b136ebe 533957ea 77e304bb
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000080 00000000 1c44d927 538b6c83 e363d0cf 00a77f62
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000080 00000000 b61ee82d e2655b38 3db27ab2 cd94f34e
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000080 00000000 eda4f5e2 47d08f95 8bfc833c cdbd697a
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000080 00000000 f5d9cdc2 4f91c004 27391e7d 199b276e
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000080 00000000 d23978f4 ab233254 f611ca0b 7fbc8460
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000080 00000000 2bc6f4ac 6d6b8451 19b58a65 c84fb4c9
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000080 00000000 8a84549b c251bb70 e7cfff88 5f71c7d0
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000080 00000000 08b2e46c dbfe2c11 8b6ea6da 3aa1fbfd
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000080 00000000 75f8eee7 418fb421 e6d0d4a0 c638e3b3
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000080 00000000 b892d231 e09b1b98 a8285831 74b2ed09
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000080 00000000 2cbdeaa2 c85de50d d999dbac ba322240
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000080 00000000 9066074a d3f2b6eb bf997c56 6e2fc3e1
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000080 00000000 c1dab9a7 02680c69 69bc280a ef506afe
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000080 00000000 6b4503ea 3dd88f9a a64e9edf 54e5101f
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000080 00000000 e2e930df bc0f222b ced19097 52071260
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000080 00000000 b4e5e606 35b7286f 950de5c6 c2f1a652
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000080 00000000 dc194b8a 448447bc c7374ed0 9980536e
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000080 00000000 aa838c05 e22ba715 6918cc5c dc292da8
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 4f895e3e 72b5a8f9 41c531be 63caf21f
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 e1814add 46b78185 5a794602 c5cbb81f
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 b2c797be f07a5e58 4aaeb2d5 34d77337
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 79a0ffd9 48780199 0705054e 49350ed4
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 0000ff00 00000000 ea92d127 fc1a95df 273c0510 b61e10e8
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 0000ff00 00000000 465c4daa 7959cac3 580b5939 5cade546
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 0000ff00 00000000 40d94049 f73cb9ac 745cffa6 59f76ec5
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 0000ff00 00000000 cf703f5b cd3f4549 97b731f1 a76acffc
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 0000ff00 00000000 601682a7 ff3352a6 f51767ca 67c505cb
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 0000ff00 00000000 064a4fd5 acf56790 fc2f77c6 542e7a7b
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 0000ff00 00000000 07dd2141 a9e2457c debae6fc ddd06c68
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 0000ff00 00000000 5a7b064d c5639457 f259c9bf c8070244
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 0000ff00 00000000 d197cd70 1ef3538c db127a4b a3a1bb87
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 0000ff00 00000000 4b404fd6 ad1b745e 6a8c294b 5df0c9d4
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 0000ff00 00000000 9578bf95 49e2728e 56c2e4ae 3ae95323
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 0000ff00 00000000 45839f9c c7f0e13d f1a64680 3aeac951
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 be685e6a 35d02b3f 65b1fab0 1a9b817c
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 8b23624f c777cdc2 17ba7e26 91e2d3ab
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 7475aab9 7f315b43 bc2b96c3 00242add
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 109a90ca 965c5269 7430bab4 a3889c75
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 fe582027 bef70e59 8a9b2847 5c0df86c
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 3e3f8f0f 1734ab81 33f4d2ea 300b3b8b
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 0000ff00 00000000 ff63a226 41021a29 82485198 8c15a717
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 0000ff00 00000000 e27a093e c263725a de05cc61 86e501c0
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 0000ff00 00000000 b06ada3e 32f43fc1 f617a8d4 05404006
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 0000ff00 00000000 98361f5a c454edae c9d73afa e3eef15b
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 0000ff00 00000000 43f847d0 0c32ef55 6b7d8ca5 b2e06275
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 0000ff00 00000000 59daf278 4e717bc6 bac4cd52 19ad0428
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 0000ff00 00000000 515a9cd5 6a818e6d ca4261cc e40fa439
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 0000ff00 00000000 9c190df3 635b6902 e957b24e 6df51f6e
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 0000ff00 00000000 afb4979c 19bf132f 235e7a66 379823d2
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 0000ff00 00000000 fab801f4 7d8403c4 213946e6 bf26cfa1
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 0000ff00 00000000 2bff30c5 dc2724dd 276b8f10 293035ae
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 0000ff00 00000000 bd535fc6 d0996f9d 0b279e9a 198ca5ac
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 0000ff00 00000000 082570f6 f137eed9 82f8e840 a5190121
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 0000ff00 00000000 ea45c747 936587e8 2f8ad187 95ea35d0
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 0000ff00 00000000 1bd18a60 b0d73ea8 e1966b10 2eac853b
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 0000ff00 00000000 5236a302 62972607 e3c01714 0b62be49
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 0000ff00 00000000 efb10eeb acd85f80 99fba3e7 47b3c363
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 0000ff00 00000000 41722b57 d4ac5a7a acd93feb 753133f3
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 0000ff00 00000000 11d3138c c2a57d61 aa7af870 055f2d4e
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 0000ff00 00000000 2b9fb6aa f71d55a2 f2792824 edb7f27f
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 0000ff00 00000000 d4778713 5e30a88a 062e6325 be4add84
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 0000ff00 00000000 b5a55af2 1be5b52b 12f81646 0e07d277
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 0000ff00 00000000 45a08cc5 57c9c115 f8e385c0 a36320f8
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 0000ff00 00000000 612339f4 86580243 459c100b 850bd33d
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 0000ff00 00000000 39bd7725 10cbed46 51577369 8acdda6c
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 0000ff00 00000000 c5650896 57b105b1 dc6cceb4 73d682b0
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 0000ff00 00000000 6f5b19b1 da5bbfef b31787b4 e1b68bc1
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00008000 00000000 24d1487f 158e76bd 8f4625e2 1e4540ed
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00008000 00000000 fdc7999b 7bf57a2f 01436def 8b61b237
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 686e0027 1feb6da1 c12824a4 7c2b0f28
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 33836406 9f2ab550 562389cc 95d88501
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00008000 00000000 6cfc5fce 5c5bb94e b6ecef73 69459223
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00008000 00000000 3421e4bb 62cff9de 6aadbe7f 5402a3e1
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00008000 00000000 6c9c37e8 700b2ff4 8814305d fafff619
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00008000 00000000 c9a01dff c0d0754d c7746621 10487b7c
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00008000 00000000 261f4c1a 558a7d91 69228368 ca5bb4e3
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00008000 00000000 41535347 2881b818 bae2d203 472f8fe7
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00008000 00000000 7eb52b1a 195c1451 be6a546d c97ab66a
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00008000 00000000 7d3f7f8c 6de137ff d4250a82 2ced4b04
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00008000 00000000 01d2065f a5e190c7 b6966627 9f26e06c
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00008000 00000000 64fa9a54 d9e965d1 eb21155c e55453cf
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00008000 00000000 cd61bd9d 992e6f20 722cb30e 8d88b06d
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00008000 00000000 b6d727bd ff9b0a17 cda0c38a 3cc5d2cb
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00008000 00000000 7c6a0872 3e6f25d4 92970934 dcabecfc
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 5e22281e 0b94307d e9db296b 2cf95249
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 011bac44 666d7197 a5e1c544 c75e1c6d
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 abbe39f4 52d30bab 991053f6 4b4ed4cf
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 f3e85902 a7c0dbb2 bd9d9c94 6b3042fb
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 a723461e 951ecf6d ab3f8dc8 4c05d117
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00008000 00000000 ee5355b5 32725efa 61b14b48 e353a242
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00008000 00000000 11f078cc 605038a9 68376309 10032ad2
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00008000 00000000 0900e5ff 0f45e7e0 d8fd1655 5a726ff7
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00008000 00000000 2aaa22f3 ab0c292e ecbf2fa5 bbe1420c
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00008000 00000000 0ce0d376 233941c7 e7362e05 2d05628d
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00008000 00000000 3e176017 54200793 d514e4e8 3eb412a7
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00008000 00000000 48f2869b 3845ef22 5e1901ea 4a859734
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00008000 00000000 b7418462 d1f9ac07 3c055a85 8e0f3ea1
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00008000 00000000 e8d41de4 a8874978 46a24e6c 62ca3cfc
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00008000 00000000 1532c522 6ddf05a4 c2066e0d 4bcd4299
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00008000 00000000 85e164d1 abc06722 d1d9c63f d7c77859
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00008000 00000000 1a82806a 5a3f2a6b f64ab142 8f9dcbfe
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00008000 00000000 3b79de87 7c00eab3 f24513c2 3dd85d75
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00008000 00000000 4ba6fbb8 6103aaa6 9b5bd1ab 82501d69
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00008000 00000000 f5753d5b b7ba337b cb34b53a d8ab23ed
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00008000 00000000 f8c29746 c96595dd 2a7e4df6 c4f15e03
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00008000 00000000 5e5bf243 43201ef2 b2b56cdf 2606e3c1
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00008000 00000000 5b7b8240 9c0dbf33 3cd7526b d88092c4
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00008000 00000000 5cd72157 3bf89f8d 4308c0af acdd1a5f
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00008000 00000000 d2c67dca 081c3b2b 3971d46f 1aa33642
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00008000 00000000 b37023cb 70133c8f 50dcbba4 b0ec5a98
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00008000 00000000 66d1ab9e c8000dc4 6bf78454 f5967ab4
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00008000 00000000 8cdee45a 0a564a1c 247a57b6 7d76dd5c
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00008000 00000000 9d950cfc 48245225 e2f6ce41 e18bbb3d
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00008000 00000000 8726cb58 4b596fcc d85ccd2d ea5c1b86
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00008000 00000000 b5bbbd24 af621eff eb71ad90 3963eda2
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00008000 00000000 7e8c5d35 b01f4357 1d4da01a 349d9308
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 150100c1 8d8bf7c0 1c7d1deb ea2ff94f
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 994d5250 c83dc66c e341426f bb32bccb
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 8ac076c6 b28157c7 823ddb74 5d555ba4
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 912496a3 26ef9bae afd546a9 6ad2f1f1
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00ff0000 00000000 17bfc356 ba77656f 0f46d315 8fc83394
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00ff0000 00000000 30ca7dd6 e2b05be4 c3d7d1be d450f616
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00ff0000 00000000 5857a46b 9ccfbe40 2b669fa2 9abc43b5
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00ff0000 00000000 d062d457 d657a39e 23313e22 00fe8983
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00ff0000 00000000 6a2a8e8c fa721dd3 5569b7a8 7047dffc
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00ff0000 00000000 8a8ed781 7cf1b536 87ec6941 c4e4c20f
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00ff0000 00000000 4d954fc9 836102fa fb3944b2 d1b5a7e9
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00ff0000 00000000 79a5718b b154c479 a77f8db1 adb57436
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00ff0000 00000000 43642543 c3937039 9f582b56 19f7d08b
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00ff0000 00000000 675c5fbe f10a35e8 f11bcf82 d576b00e
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00ff0000 00000000 049552f7 68df840f 7cb4f5f2 6d19b3a0
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00ff0000 00000000 831c604c 0e4000c8 4bc6c406 6962eaea
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 d0f5ceb6 19226e67 265c3f6e 50007b66
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 c519f53c f413fac7 436b8242 f48c31b2
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 d4b94661 5822fc35 7d5f5827 88fbc576
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 39661f90 f3148a86 85deba9a 6a320b8b
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 8f57ce6e f6391458 ecc348bf bb6f94e1
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 76cb2978 8e67c88d 950a1a6a a62e2213
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00ff0000 00000000 1ae699eb 3cbca167 39775a0e 146b9cc6
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00ff0000 00000000 a98821cc 51579bf1 e844a285 39fa3044
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00ff0000 00000000 4be5b753 8f56938b 3d6cc3da 86ecba90
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00ff0000 00000000 198172c3 800e20da be07ee33 a8560a99
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00ff0000 00000000 ff2b7003 d5983fe4 1309cf3c 74333dd4
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00ff0000 00000000 771bf320 5a91a69a 25e85234 6b44483d
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00ff0000 00000000 cad80ab5 243a85d6 746d94c3 14288f35
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00ff0000 00000000 af6409e0 7b2e97e1 61dc66cc daf91138
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00ff0000 00000000 72f34dba 42ea306f ab2dbb1c f89d0e52
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00ff0000 00000000 de0425e6 b0711cbe a1f06647 1d22420d
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00ff0000 00000000 2c4547fb 290dc51b f05b6832 367d1247
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00ff0000 00000000 8c9ba4ff 28b80719 bae6c186 2961fbb2
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00ff0000 00000000 f4d1a124 8dd06f6e b60ad992 a75bb575
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00ff0000 00000000 1d264180 0d82de2f f7ad28d1 6de99d88
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00ff0000 00000000 e8d546e4 f436aa12 d9ea6b9b 1e8293d8
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00ff0000 00000000 c68b533b 0c2f5dca ee1f618f dac2795c
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00ff0000 00000000 b0231ad0 d9f78969 e9a7f2fa 57a7d045
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00ff0000 00000000 66222670 31459874 e598e3a8 1a4bde92
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00ff0000 00000000 b6d2196d db3851bd 516ae69b 06225b81
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00ff0000 00000000 bdc0eebb bfa3e06f 92d8d0ae bd8cf1c3
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00ff0000 00000000 62aa92f2 f195369f 42e7ce55 30d5680a
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00ff0000 00000000 bd9e04a8 227be90d 097430ac 878fd8a8
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00ff0000 00000000 40930095 69a60863 56535b7c 1db91864
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00ff0000 00000000 3fe5270e 13485418 5b672b74 4a4d1bce
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00ff0000 00000000 ac577578 1f84fd44 033a5861 779c8365
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00ff0000 00000000 a8a3b667 0c5cbf5b caccc1bd 734b447b
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00ff0000 00000000 e5d8935f 0661e012 1b98bb8d a2055553
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00800000 00000000 68e72e13 266b1949 abca7cd0 d1d4a3cd
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00800000 00000000 705dbcb8 95696c45 d61cf801 3c1b2b7e
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 0ab694e0 2a73e296 0075cb87 e3e64788
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 c8c39af7 2c85aa23 7658b885 0a9b9ceb
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00800000 00000000 adae304e c04bff5e dc073076 326c6db4
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00800000 00000000 9f18f947 2e6324bb 63a1cbf3 70b3c520
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00800000 00000000 85f625f9 42888c8a 3ba60d3a 4b775425
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00800000 00000000 f1ff4973 f55b9ef0 92ece024 a4eecd95
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00800000 00000000 66193413 cb44934e 0286e084 30f50630
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00800000 00000000 4a3c0db1 e14e905d 19af9847 74a6bab5
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00800000 00000000 360c0993 a7e6d53c 6545bd83 3d1e73a3
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00800000 00000000 562cf033 253dcff5 4a402904 fa8abff9
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00800000 00000000 436a432f 11dbdb14 05e49a83 9993339e
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00800000 00000000 58d08506 40633f84 56a1a0f8 660b48aa
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00800000 00000000 02c240f0 8d2fc6dd 5a8c1a84 aab3284f
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00800000 00000000 2864f59a 6edf90a5 ce976842 915798b4
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00800000 00000000 825a70ce 7c5cd2df 26b9286b 7e663990
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 d2582afe 7ce7356c 61af9992 76e40957
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 cabcada6 6adfef01 8d0f0341 3e913f9d
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 a5980f69 9d59ac3a 1948d421 7b5f876c
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 22263e0b 847009f1 534a770e d3bee5ee
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 6cb180d5 1a7fe928 c78f1ad4 2a5f82b2
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00800000 00000000 901f9239 d8682cf2 9f1aef9d de8af58c
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00800000 00000000 a2068588 a97aa456 a42ed8a0 431234e4
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00800000 00000000 3b1d0a13 0049dcf1 60b9cdbb 9beedcb5
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00800000 00000000 18a1aba6 4403bbca 967481e5 7e6554e1
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00800000 00000000 482ceb52 af4d0143 55c736db aebb6425
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00800000 00000000 f6cf72fb 4d6640d9 35a977f1 7096cc36
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00800000 00000000 d21cb48e 36311bae 3221e8d1 4ba5719f
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00800000 00000000 13086d02 660d0a2d e0962f43 b0fa1d6e
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00800000 00000000 f04d666c 30ff59f4 7502022c 3cfc80a4
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00800000 00000000 d5114c63 b5d76336 b8b67146 02867d09
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00800000 00000000 953c28e4 4ae01f34 8ed0dc6e 7789cb86
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00800000 00000000 1be4f6a6 f44a275b 1d943bf8 c0a290f1
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00800000 00000000 dd31a5da 05be7bd6 a167d78e 7d08f34c
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00800000 00000000 d5dcf493 3b152044 3d432a8f 775976d2
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00800000 00000000 80e0584e a682ae00 0fcc317d 405dd7b8
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00800000 00000000 b328592e 23fdb9a2 cc0a0b5a c9e4691c
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00800000 00000000 472a4c24 b385afbd 4dfd4a54 c97f647a
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00800000 00000000 f94146fb 0d22e6f0 56ecd3a4 208e570e
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00800000 00000000 5b6370ef 423622fc be86d2ba 442a8110
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00800000 00000000 3f27be64 7d2df841 441029aa 8a19787e
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00800000 00000000 1151638b 08a6c2ca 14f24afa 0e840c78
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00800000 00000000 8112fcc5 e7bae10f 737e7764 05a503e4
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00800000 00000000 37694239 bdd5f12f c3534fd0 42a4a9c2
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00800000 00000000 15288d81 c5011e00 64e4df7d c6fe95d1
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00800000 00000000 3244478c 4ffda7c7 530422c7 833a4081
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00800000 00000000 1f6b2595 f19ea03d 12612526 3e202d62
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00800000 00000000 6bec8130 ae19560b 5c138b96 3fcb10a4
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 58efaae8 908f42d9 e4a5adeb 800f20f0
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 1b5bd8ef 4c71ab0a 4361587e e736be48
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 e7fa3d88 ed05f2ad a1f51a03 8019547e
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 a84250a7 481c99b6 ad206e2d f7cfc759
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 ff000000 00000000 83828d08 1ed9dd9b 8370a4da 87770b65
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 ff000000 00000000 70bc4d50 e5d389ce 0d1ed6bf 5cb66f96
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 ff000000 00000000 d011df96 62a24fd2 862bdb89 51673aff
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 ff000000 00000000 b5951541 117d9964 7bbc4552 d46c6108
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 ff000000 00000000 895d27ea dc118488 14108089 c64316d5
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 ff000000 00000000 77515b74 8ea060d8 aeb9258e 29210aff
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 ff000000 00000000 98894204 5953a99d 98611732 cc2a318a
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 ff000000 00000000 4015a871 701ca798 3e27d956 1ad8e87d
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 ff000000 00000000 20823b8c 3c0e0feb b35a9f82 811604a4
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 ff000000 00000000 15144119 2ce37c74 7e392f1a 9e35c7cb
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 ff000000 00000000 bb159130 24c7e73e 0829a1e6 dd30133b
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 ff000000 00000000 fca4d0ca f03c677f 70ba8d66 a1adfb79
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 f0a7207b 5f3d4137 65cde2ab 886b68a4
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 687ed791 369f293a 1d55e60b 2b9402fa
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 02044399 a8ee0e4b 4df92ff7 84f2d2e0
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 ba9ba0b4 6d8a660a 38361200 3a68ba1b
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 411ff0c5 6c9435a8 75df0544 d8aab3a1
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 819b4329 41031a9c d55552cd da3cd070
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 ff000000 00000000 3b3b48b5 8ef2dd6a eff89bd0 ca2f9b84
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 ff000000 00000000 e2dbbab9 f08aee93 b7f69de6 3d049a17
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 ff000000 00000000 5017bc10 55fad779 44fa7a36 0118e600
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 ff000000 00000000 fcb470e5 66cf1e2c cd667359 ab002923
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 ff000000 00000000 5a3bcb0d 7171d784 87adcf0f 48815634
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 ff000000 00000000 581967fb 3a31f5eb 56eb2845 0c4664fb
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 ff000000 00000000 bcb2b6db 5bb1b54c 8aeec711 3de3aaed
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 ff000000 00000000 82f23d44 c05a76ae fd053b09 4811f26c
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 ff000000 00000000 60e4c1b3 a9cbe94b 5a1bf944 af1cc907
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 ff000000 00000000 579e0bed 17c5f429 5d523ca2 083c228e
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 ff000000 00000000 4d08ca02 f93a8353 d942c66f 14e89ccf
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 ff000000 00000000 c437ef90 b3e6c4f8 5c96cd27 c9eb6193
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 ff000000 00000000 97e2cfff 7fb4a4d8 711f5d3a 30ddd82c
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 ff000000 00000000 2a7de2c3 9b2b4963 b35c6f87 5c6224a5
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 ff000000 00000000 fbafd6b1 0a2cde19 ffc1b1db fb4475e9
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 ff000000 00000000 a209fecb 74698947 efe93434 9247b5ee
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 ff000000 00000000 9c680acb 3a32a953 be5c11a4 7c443198
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 ff000000 00000000 6d2fe0c4 2cd7c774 a1108e79 30e00da1
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 ff000000 00000000 a7bf2fb6 d8745ced 3689002d dd18f2d4
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 ff000000 00000000 d96b2959 c77aae07 6eb557df 804209f0
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 ff000000 00000000 fe919ceb 31d0dc56 e872a4a1 eba61bf8
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 ff000000 00000000 25d41591 6eeb72bf 5a9b8eed d69fafbe
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 ff000000 00000000 14fe134c c16f5762 9fbe3991 3fd1124d
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 ff000000 00000000 db8829be c1f8712e da644ea2 27a8390c
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 ff000000 00000000 80d8415d 43b257fb 31703e65 24616f8a
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 ff000000 00000000 057dc2d7 5ae3fa5a f95a7de3 f9808716
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 ff000000 00000000 88e51669 eadba2c2 09cf3da5 d5f0465c
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 80000000 00000000 83d8298c cf50434e 604c644b 085b2b3a
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 80000000 00000000 c31c0ee3 a3e4013f 929d7a3a 251cef6b
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 b2958cdc adf2ca56 298655aa 38dfb0bd
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 8b666be5 6691a603 becb6f7c 4e518093
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 80000000 00000000 a28133df c529f5e6 cd5f91f9 7d10f299
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 80000000 00000000 ab9f6d47 eacf9e26 4d2f0c18 a35abd5c
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 80000000 00000000 abb330b6 de59b743 50f267d1 aad6a67a
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 80000000 00000000 fb1d5547 79fbc7c9 4e8d3ab8 8250e91c
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 80000000 00000000 7d0a1025 4c3269bf bb67303f 1443062e
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 80000000 00000000 c3772324 636a13a2 818cc7da 8e61b8aa
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 80000000 00000000 0fac38e2 b1f0c476 e266440c f91503a1
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 80000000 00000000 9547f705 ad06ba30 85e1496f 17ebf7f5
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 80000000 00000000 26f2e248 bb626483 6cc9da1e 3935acb5
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 80000000 00000000 6193ea72 dd9179f9 11d5fb2b b3f582f5
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 80000000 00000000 daa78425 2b6a189a f60338b6 1b561a4f
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 80000000 00000000 83642eba a4210779 c8e5bedc b835e990
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 80000000 00000000 20989bb9 ced2018e b11a2efb a2c28fe8
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 fbe11e8e 51f48068 2efe8e0c 3ead3383
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 2312ca53 57298d29 b524128a 78103575
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 9ce0f6ba 2bef00f8 36c91af0 170c8f5f
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 92167ad7 7e9e298f f8a3b57c 37f5d192
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 65b750a7 2cf2e7d2 180b35f8 8b26a303
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 80000000 00000000 0b38e8b0 5a2c26ae 7e18dc14 ca613f02
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 80000000 00000000 36c55fa7 649d1c12 f0a73818 660ea1de
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 80000000 00000000 336a6fb3 99c55a04 9c57b111 09cd84fd
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 80000000 00000000 927aa646 be0db63e 45794f89 d4712587
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 80000000 00000000 85488bc3 6cad29d3 d25bb760 94f43c28
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 80000000 00000000 3fc3414f d6d0b06b 4c01b8e3 30e2e6de
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 80000000 00000000 cdc351e1 db319290 6211914b e9ce9b56
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 80000000 00000000 12235426 f00d95e3 0350c5b6 f0660a18
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 80000000 00000000 907152eb 78604841 c96f8ea5 7031759b
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 80000000 00000000 6c0eb5d6 9772bd42 6dccfed2 53db859c
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 80000000 00000000 6e69e34c 29510fff 3fe90368 87329159
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 80000000 00000000 e327d823 6b2d3ecd 544a284b 79686d75
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 80000000 00000000 9ba8cef6 e7f80e0c 4136bed0 12362d9a
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 80000000 00000000 c0eed7ce 6eaf676a 66cf3cd4 20ee1258
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 80000000 00000000 e2a102ed 1306dfbd 18088d73 2ad203b3
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 80000000 00000000 1f530db1 45344f8c e782dbd5 1a9e476f
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 80000000 00000000 4088a06b 4986fe43 0a37c474 99853bc9
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 80000000 00000000 4a0bfe2d 6d38c858 71d3170e 871c4c6b
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 80000000 00000000 a44728cf 99964d4e 6c11ef52 f261d9b1
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 80000000 00000000 b7be56a8 29b7eb27 d0713407 1c015d45
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 80000000 00000000 720f816b fc240128 6cf925c1 718ab1cd
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 80000000 00000000 8d9b5126 ca07da70 04d57bbe 1bdc146f
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 80000000 00000000 f209882a cb81e957 d97f320f 03635b68
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 80000000 00000000 63b7f67b 35533d6a acff5c1d e3c9e3d9
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 80000000 00000000 7a532752 8f6680af 0db9bfab 0d33bcaa
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 80000000 00000000 595aeda6 b34e1b64 0c119a13 00834623
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 80000000 00000000 cad2076a 85890ca8 c59dac90 549d1fce
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 33ffd0ef 0c0babaa 08eb61d8 976b28d3
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 000000ff f7e104ab be0b3491 2397b283 b5a861b3
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 21816f54 5725716b 202fad3e 26c0da69
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff a95bdf5a b791e42f dba8f277 cdaff870
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 000000ff 74c668e6 295aa836 671e0057 809aac97
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 000000ff 6c80bd64 1cf9a282 e07ae71a b7659073
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 000000ff 99c28353 d7142627 6298578b c78e1cb5
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 000000ff 4d150fd5 c4c7937e f8eaf05c 47c5de1f
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 000000ff bef0c095 25d06762 ea140336 4033cc83
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 000000ff 9ab8f614 5f5f8717 53a45bb0 b961b14b
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 000000ff b9cc0441 c291dc7b 125608d4 a5e48b9a
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 000000ff b20b345f b53497d8 98d069af fdc6ff85
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 000000ff 6f4126ba d37262eb 948fc600 e0ad87db
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 000000ff ee0a121c e2605764 b4441611 2f6213f9
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 000000ff 3ecf3a05 fa6c6c61 e595463f 1dccb524
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 000000ff 639dbb7f 92f573e3 fcbf4d49 d9b8a651
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 000000ff edb11662 f32ccdb4 59b654a0 b4c156d2
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff aab94b97 e10e41b8 caf908ba 26000a72
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 9e14dc32 072a4e95 907bafb9 1d7c7e56
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 8c8f6c05 2dd2144f 7b4b1890 2d33cd21
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 2d70ad73 d2936e08 023a5229 27024f69
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff d198566a 956e9f11 aff6033c b7a1e0d9
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 000000ff 8396e64c f66b5c04 2b3c5067 4984eca2
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 000000ff 27a41963 ab27c91b 651acdf0 54996ecc
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 000000ff 81109c08 9da13963 e6ce44b5 8ebc1ec0
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 000000ff 893684a4 c76671cb 5ff2b138 26f596fc
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 000000ff f270746c 8a659b14 2597b05b b41b8ac6
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 000000ff 6fc87a80 b9b202a6 14861218 39aa8048
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 000000ff a3692a84 fd8f8dfa ce1ff290 16f88d25
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 000000ff fbb888a1 4e8b803c 6cc94bef ddbef818
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 000000ff c7c4c6a9 c1bf2778 279d1ba1 7960de94
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 000000ff 695878ca 94719854 9dd8d82d 99c457d5
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 000000ff 41445324 58ecb758 96f36169 90bad6e1
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 000000ff 260ffa79 d230efab a95ced9a afd4b25c
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 000000ff 8fdb4fdc de0ca0da 72e24082 764ee577
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 000000ff a59adf40 317e08bb 1099c6b6 aa74f87d
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 000000ff 36f8f5dc 512092ae c300df3a 45d4ddab
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 000000ff 662321c2 2dc580ec f8c30280 ab2e2d6b
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 000000ff 198bc760 6fd7ee4e 8d5a18fc 49c316be
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 000000ff a713a3f0 00daaee4 e3e8d3ec 7a7d7056
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 000000ff d3633eb7 892b2455 19b1b392 569daedf
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 000000ff 7694f06f ffca196c 92b6fcd1 ec177846
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 000000ff 1c0e34f5 4eee2d80 65980ae9 732c4be2
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 000000ff 6c83d21b e14ac358 0d1c78c2 78668cfa
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 000000ff c7b701c2 d2c32a77 fb9f7760 4f5157db
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 000000ff 0454b442 2c74a5e4 945a81ac 7f9c1f7b
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 000000ff cfdf7117 5c542fd4 92d2a507 81b674aa
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 000000ff 19e70495 cfd13d17 35586663 1249a4ee
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 000000ff df69d37a 0c16d3a1 6b06175c 5c346c58
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000080 441f8846 7805ddde 01d6501c 66965a55
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000080 a4ea924d 9333f022 4c005326 811ad481
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 1fff4f86 30488a15 3473582f 24afed44
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 5b178f62 eccaa1aa 4dacef8b e120ecf3
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000080 888cabaa e962affe d6b811e0 da8998cf
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000080 01f6e1fa bcfe755b 59f405cb d3b9595d
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000080 a92c805a 07f594c6 82b56f52 fd277e6c
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000080 2814dfbf ef7a2f15 a63f540e 951ffd5f
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000080 916a6b19 5c6539d6 2e042e51 f1067340
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000080 61bf8f15 b1655376 2e585680 1910fb8d
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000080 d823be54 c018af09 c83c8aa4 1acb9df7
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000080 e475a6ec c5af66b1 9728aa88 3f22ffb6
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000080 0d9f50c5 63a94f4b a5c20fb8 eac1b9c8
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000080 6668bdc0 ac5a23df 080bc7fa bfdf8622
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000080 d19d9045 2e79a915 94922bdd 1259c766
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000080 bceba0f0 68947c27 0161f941 7de2146a
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000080 efc230aa 41961f4d 12330650 a5b27be1
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 438dc33d 39b01218 a0330845 93780676
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 38e5e94b 259b59dd f0f5f46a fdb2ea7f
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 e8cef36d 2b604c05 43b6c2a9 26d94cc6
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 106647b8 cfd28eb1 fd243ed7 89279207
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 cfd7caf8 aa1dc211 f9ceba3f 09b3dde3
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000080 b80ba363 35897d3d bd0b0ae1 4a29e020
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000080 454c62b8 04123d8b 53456512 a9c6eafa
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000080 0d875fd4 3799d4b3 1ef0689a 19775936
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000080 32793f33 3690320d fc0d04b9 45949259
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000080 bb3e2980 a0b65de2 15bb7894 1c1624d5
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000080 ee3efec8 3f12e6d5 3856536f 27d8042e
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000080 f951b734 5532181d c7e1f51c 3fa0c656
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000080 0ca4b22f f7dbf66f a5920bf6 b23cf0b5
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000080 65e54190 2e8a5593 d8a9213e d5dfc748
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000080 bee6b5b8 43957076 a6a35191 e559fdbb
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000080 8012169a 0778bf27 46b2b0bd cbab0500
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000080 9367dea7 e05cf125 dd1e32e1 3b33f515
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000080 dd095a3b b2e80097 1541b57e 963aa5a9
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000080 d6ec3e16 94364668 5237e175 c07a4ae7
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000080 c6479866 eda003f0 c72af0cf 8996bd8d
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000080 fd76301e d114c666 eaabe38e a2ee1acf
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000080 cde36b1a 4bd149c4 49b4af8c bf6ad382
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000080 e18c881c 7236049b 86ab2a17 7741d079
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000080 a2b1485b 2d362f5d 70e37119 9dfe9263
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000080 36ac4fcd 0f724248 457ec24f 7e7b9a01
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000080 8a320fae a0ee0eb8 bee52539 d49ca440
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000080 288480d9 073d5371 23cdb186 7061f0b1
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000080 04676afe 9bea090f aa0cf401 25ce78af
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000080 373bddf2 dc759e42 06e04841 d7933fff
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000080 0e2f4a16 f57c7ca6 fb4e4e01 bb68b93c
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000080 9b3bf539 5e0f2816 95f0b29c b4388b10
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000080 36cbd4d4 53867fd4 c5414655 f86902e6
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 2980bb5e 3c4ff48b cad6d110 93e28c48
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 312e0c21 66863de4 38c7d0c3 0ff3214a
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 95b94d16 e22e1a1f 9aa4d3a0 b054e524
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 b28a787b bc920c57 3c391390 281e9428
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 0000ff00 214588d9 9e5ecced a8fb6fba be9e731b
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 0000ff00 eff22c55 84357d81 d153dcd8 bf81cca7
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 0000ff00 61c77b2a 98dc4d28 01635a07 616bac16
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 0000ff00 5d487e87 4fad2564 633ac064 9ffb8ccf
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 0000ff00 a716fa17 d0fdb0e1 0332c62c ae3de920
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 0000ff00 34eab877 9414be2a cb17472f f1559987
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 0000ff00 46ec8cb1 8ed57197 e14dab1d 71fd3de5
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 0000ff00 de09d251 890dbcbe 91552c2f 0969f34e
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 0000ff00 c632f05c 217c5375 71edcdba 1f903697
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 0000ff00 ad5f4d61 275baa40 837a4ba9 f9bc3b63
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 0000ff00 7f9b6db4 cbdb9890 a4e63f50 dbcacc9d
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 0000ff00 2a0094a1 23e30b4a 04bb601e bbd3cd3e
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 f5724c8a 5056e5dc de3df5cd 8b0f7208
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 3f47da17 060bf755 978efcee dc6ec630
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 b166b082 d5fc1935 412a33cc 7fe5bdeb
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 ec675656 0518c33b 5724d6d9 2a989266
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 0df3c708 be07f0ea 8736897c 46654b90
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 4cdb44f2 4eb10192 85ed84e8 6fed9533
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 0000ff00 5b6ab4a6 8322cd4f 0256450b 250c608f
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 0000ff00 f82a8df0 17a68ce6 57e4a9d3 3dd1575f
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 0000ff00 1cc8256a 95df59dc 63098fae 7866ccc8
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 0000ff00 e865b08e 7ddd6871 e3c02bef cd1893f4
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 0000ff00 2b384e63 a9d3e4d6 ee7258cd e31778f1
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 0000ff00 5db3377c e4475048 d82ad1c0 b0ccc4c6
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 0000ff00 25330c24 3fe84857 7a1a5f33 975eaa32
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 0000ff00 f4db2e62 af485e1d 4f03d243 c668ad02
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 0000ff00 7ac0fcd2 81cea5e7 a9c50d20 cc6f3d71
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 0000ff00 08e5ad77 fcd190c5 ee22854d bb3dbdaa
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 0000ff00 1cf237e1 ed803394 31ad06dd b9d3def7
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 0000ff00 63b7d290 da9032c0 9fa386bf 170e735f
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 0000ff00 0c9db5ca d9b700e0 9633e409 32e90ccf
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 0000ff00 a3596eb4 03a8793a d2046a69 f524015a
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 0000ff00 ce9c088d cac32294 1dcea918 70c68754
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 0000ff00 30bf1275 033f5ce0 e5a937cc b8a92a63
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 0000ff00 00f4eadb 2c7de0ff 8cbddde5 100e5989
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 0000ff00 07731ecf 8b9e331a 703f296e fec62773
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 0000ff00 5a5857fe 540171a0 46420351 21377428
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 0000ff00 bd1fb099 803e090a 6eae74e5 a6306414
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 0000ff00 679a91e1 130b9bb9 c4149fe9 3cd42b79
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 0000ff00 aa99531d cb58591d 5b8311c6 73dc851d
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 0000ff00 e468fa6d 537601a5 0736eb73 00cdfaf6
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 0000ff00 5fea58d2 ffbe434a 6e460b2c f0da2415
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 0000ff00 5d9c00e5 0a20546d 438080b5 ac7259a5
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 0000ff00 ed43dcf1 29c33a47 8dc88e14 99a62820
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 0000ff00 c2d4e578 cd384c4d 320ac18d 60eefb71
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00008000 dc5b2a9a 0afef152 4cc6ce2b e496280e
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00008000 ce2452c9 d8746b9c 5fa4b592 676c01f6
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 b2e83580 93092e6f 832452f0 9b71e0ec
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 359a248d e0717f2f 966b85aa 1c3edbae
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00008000 c1498c85 1c5caa7d 927cfa28 c06b49ca
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00008000 bb49de96 49b1c65a 9f592b56 4b9e518a
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00008000 1818ca8d 5f7d9737 1c27d3b0 78dc7efa
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00008000 8e697715 f204f264 3ddbef0f b4d6acf4
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00008000 33792d55 6f3b4039 107ca94d faeb84ad
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00008000 8a1365ce a5573d6b 0d3dca48 70c61ecd
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00008000 3f92ba86 82d9540d 8ccf984e 6af3e6b3
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00008000 257fb510 2f8721de 4fd1b056 3b60363e
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00008000 bb700f86 7bdb19b3 9e11db4a 9beea8a4
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00008000 7ca7cb18 cdb73ae0 b3f297f1 aa17ae2f
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00008000 af439f17 1f7c8397 11fbac69 44eb3140
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00008000 3057672f 5d1f5c34 0f169cc5 a5e63f71
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00008000 56544e93 500aece7 58e47d5e f1a52735
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 96b33f5d a134b4bc 91a8ebe8 7b23e4f0
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 58c3c3ea 00fe987a cafbc39d d9c48178
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 e420e4dd 6f693315 ac6f48be 9ef6d10c
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 86df5e20 f9559125 215f0b08 f5d3929e
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 bb31badd c2618da6 d23fb278 b4bd3d10
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00008000 8bac757b 5a3083a8 069c44d6 9174a0d0
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00008000 fe734946 d39c1fba 7f1ff519 15307785
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00008000 8a37c599 ec59f39b 44998ae3 0d5a394f
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00008000 4efca554 eb7e76b7 cd2d9623 36f0afe2
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00008000 8333d78e 5737cb50 1a0885ac c203ece1
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00008000 fc690244 15cf363a 503e643d 69a79d4d
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00008000 31b20472 166c52bc 5b63968a 47133bce
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00008000 cd8574d8 1b115532 65daa911 706930fb
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00008000 09ab4d96 2da926c6 e65bd1bd e1880ac9
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00008000 6dcb3eed 584a0e60 96dd3d0f 16fcef9b
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00008000 e3b63fa1 394cfae6 31d34bef ea6c7ba0
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00008000 51cb0477 5d484017 9e5a14ab e071ad23
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00008000 e7245aaf 0cd8556a 94525c59 cc84d991
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00008000 8561b8e7 af8a34ce f8be98d5 a68da87d
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00008000 df20f930 275651ce a922c02b 4600bae3
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00008000 c067bc44 05061760 bf3b3abb 5f40267d
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00008000 414f2d26 020e128c 4baea3f5 8bf858bf
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00008000 68c2b324 825c48dd 9a314db8 d03c0fbc
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00008000 81fc8b30 4c30c6f9 8c1303e7 1ce78a18
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00008000 31b85719 f187d654 09b1e0f6 b24a59aa
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00008000 ce669498 81c6a9b3 b7decc86 0568f8a7
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00008000 24293624 33cf83ee c99ade5a 4f6dbc01
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00008000 699467f0 602914f1 73dba5fd 6e518a1a
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00008000 6e06bb5b 94088181 b8d7177c 8817e9c1
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00008000 2042d92e 54aa35dd 35ce06ee 5d805f84
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00008000 ef8a0eb8 d41d547f 0b2f495d 97f37acd
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00008000 3933029f d9cf9fe5 59ce01da d11c35c8
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 f3f46196 d11cae53 af61b8ee b22e6b3b
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 6f3d9f29 76c3e022 e3727918 d589dc6d
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 6b0e18a2 5ac5b5df 25fb5583 e3bf3c7c
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 5b4c73fe 0b3f41ed 9ac98d5c baa8d82e
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00ff0000 a7049b58 deb285fc fc21d230 5f1c6147
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00ff0000 bfac55f9 02b0f828 807285e5 0376257a
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00ff0000 6c736849 eec20a20 77b2b107 55fa1de7
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00ff0000 d27272c1 85c6ff05 8567961f 74443e44
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00ff0000 da91acd2 71d9a6be 033ac1c4 12f26984
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00ff0000 626813a9 ce47f3d6 96d92c2d fa083734
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00ff0000 6225c1f8 1d45b19f 5176e440 b3ca458e
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00ff0000 5460ea28 b640c053 77469753 bee6cff7
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00ff0000 d2c422dd 3010efc5 b202f5d0 be05c6dd
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00ff0000 be9431a7 0911a5a4 bd2abe83 612f8586
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00ff0000 fb686a25 4ff2114c deb1c3b9 854ee3db
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00ff0000 61791f3a eda4ed85 0fef769c 8cb219ab
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 662d6593 0dd2a51f 3df30975 881ae692
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 b572dd2f b403b910 ddade016 68524bf8
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 02df66b2 6844e2d4 c6a601ad 678e8471
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 965e9a17 6141df53 2472c9e7 a2e94bb7
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 f7cfcaac f631f03d 78328e33 6c26b793
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 93788181 6d25b373 cead0033 6ff7a44e
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00ff0000 ae37fdd7 fdc156be 92955610 b13722b1
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00ff0000 4fce4684 22a96286 952f4e4b 974e97b3
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00ff0000 c6b16976 fd2c1fd0 b86c0899 d95ed223
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00ff0000 65129760 4c61b126 df0dd04d 8322c305
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00ff0000 04764b97 84f92827 1d8e42ab 162444fe
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00ff0000 8d08195b 8c7198d2 31d048ae df36c78e
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00ff0000 7935ec55 74893e0a a38f531e e93402af
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00ff0000 c699a874 35cc0a22 acfd92ad 15dc044d
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00ff0000 36fdddcc c9359a1d c2ac1dda 0db7e34f
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00ff0000 0e96dfbd 0f307501 8e70f586 dcf688d7
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00ff0000 8c821ea2 8f488d76 4f271e49 74890070
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00ff0000 d7c029b3 94aaf818 dbfa13c3 b7d8435c
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00ff0000 851d7dfc b9cb6acb cc3bda81 056f06ea
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00ff0000 86837cdc d5bba7d9 938abbda e8ab258d
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00ff0000 ef8a2b6d 2bd164f7 ee06fc74 203fc944
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00ff0000 6f19f017 3b4ef67c 7be9a3c8 f858e684
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00ff0000 f50a6906 d1d32a39 dc3756c6 c36cadad
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00ff0000 0842f1d8 db7fffdc def8c50c 6693b706
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00ff0000 bdf4fcbd 8bc60f49 55d3d3f5 bc6333cc
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00ff0000 7105df6e f5ffee84 b5137ddf 6aef0f35
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00ff0000 c1f4a96d cadeb327 221fba3b c64dc031
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00ff0000 442c7b1b 65ce7736 338602d5 5cabab3f
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00ff0000 be3e7800 996bba5f 58e5821e 4e4924e3
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00ff0000 7d1317c5 2d1e0b31 2bd4b871 a4cf6b92
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00ff0000 53c36f2d 8d53f6ef 53113e46 04a659e0
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00ff0000 3c543e7c 261edcd4 726dfbf3 c8d99a69
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00ff0000 ea418a97 139c31e5 ac9b19ba aa538a8e
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00800000 42046aaf b91498a5 6a259a16 b3eb3a2e
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00800000 fd625108 b17ba275 97886513 21ad40a9
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 aafef5bb 62b249f9 8b0aa44f 45e468f8
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 ec330007 44aa0288 25be9228 d5f8e13f
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00800000 673aceb7 7ca9ae9f d83907e6 7e9256bc
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00800000 5676e018 edcf0a72 bea8a741 f795cda6
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00800000 6d5d7593 d401b974 6a0f1bba ed12286c
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00800000 0ae1d756 b94312b5 5675a578 5b4a46c4
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00800000 1bd24cc0 e8080a9d 0ecbb72b f3a76d57
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00800000 3966784c 7dc969a3 44eb558b 8961e6dd
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00800000 73b4879c eace0901 4cc1cafb 8553c489
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00800000 e80a74ba 362da2ef ef2d5659 e533ba90
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00800000 5e55ee55 3f4e0282 031ca33c 21b48f8e
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00800000 93f70128 e5821be3 50409b66 0897ccad
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00800000 bd19830e a5960c21 7fd3aa66 147d3108
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00800000 91808867 737d2300 62bfc781 9de2d107
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00800000 3771eb8b c3b77eed e250ecf5 5c5eb4fd
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 f09b7b64 56f85b75 f6bf2b80 9b0cc239
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 93139c5c 96ccedb3 8b7391ff d0119d20
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 a59252d0 3c860eaf b7ad1fc4 f978a8d1
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 159c5ad0 8d3752f2 5e4e902d c0e4e886
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 8aa631f8 069ae5ab 0008b3f9 60404759
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00800000 a34f31cb 506b2397 89f24851 e15455d3
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00800000 aa3133ac 1e2abffd ba03d968 7fd7861c
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00800000 19d0a84f f97c0cec b2524039 aaffe800
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00800000 c2ea9b6d 27c10f71 a6896dfd 2050fcac
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00800000 ec8aa5b3 cb97a73e 7aaf19c1 035d9258
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00800000 50da963d 0e7a7178 5953710a b025b96f
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00800000 b4b91bc5 628a3b09 8187bf2c d218b973
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00800000 e701a2de fe5f816a 76ae8ffa f5e8a4d7
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00800000 c851d186 92d4ae9d 8ebd58d4 beb32d60
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00800000 44b837e3 8f5d1220 465dce59 4beb067f
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00800000 312dfdd7 dc15914d d3365f15 bae1edcb
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00800000 ae8c17d8 1a855cba 066ecafc abd9a392
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00800000 35caf6a0 b779a7e5 963fd0f5 530f640c
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00800000 44ec39e9 1b7bc783 34a68e2a 216e372c
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00800000 b92eb27e e15ccf20 df0da553 3d94e19b
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00800000 e9f64c3a fe517c12 13b493f4 606fbfbb
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00800000 d4ae37ff b9d776d0 7dd5d17b 1c692adc
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00800000 18d6c6fc 95ca9ec2 efbb03cd 45efbadf
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00800000 5cdc4bd5 ad3f779d 2e66cd6e 3d02b112
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00800000 02baadd8 220a382f 810b2330 81b9b93c
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00800000 37e2e70a ee2871ac 2a5a8ac9 cc44e32b
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00800000 3eceab21 6056d03c 8c05d55e e088c124
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00800000 4fc8c7bc 3d1c046d 275bc435 81346eab
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00800000 6659edac 26290dd5 0a3e3455 b31a2be3
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00800000 e6c0191d 261dcebc d41bbe82 8e6e9730
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00800000 197b4a3b ef928010 96e75bd3 a2d1e856
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00800000 e7b8e74d 038826eb 03a47ad1 4ac33455
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 27b00d10 76eeb5fe 30fea418 02742412
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 fd72843d 364facaf 6f610ab5 a3b54a17
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 77e3bb3f 612cad81 f7568471 a28cf424
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 c516b0a8 c9b2ac37 8386050b 7ab691ff
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 ff000000 35c207f6 29adeb17 53c324da 2ee41036
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 ff000000 64d4c6f5 51a9f791 99290f8e 5dadfe9f
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 ff000000 06395df1 78ef47c2 3611e5d3 c858d573
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 ff000000 2db4b9d2 48766956 84e31755 75eff4b7
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 ff000000 f7a2dafc 4227e584 db7eb815 fc23888e
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 ff000000 8241b04f 294be7c6 77da5fbc 1d297fe7
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 ff000000 9f195b14 d92996f6 ccf2d097 282d3d82
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 ff000000 8c03f471 c325a44e af4cf54d 818945ac
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 ff000000 538b8502 3da680b4 4ba5207a ff17a65e
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 ff000000 0bbf6ebf 277560b4 ebcbc2eb 62cf1bd2
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 ff000000 00e77ac0 277dc0dc 2323de1e c4d15453
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 ff000000 e679e1e6 78b4356b d50ac033 7ba1b8ef
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 76d2f408 b92d7e94 15ef11ff fc6057c4
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 c69cb78e 69407a3c 4fe5a98a b278c6b9
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 4952fdd0 05239ddb b842ce7d f3707c1f
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 e93dbade d6ad32cd 0cedc6e8 dbe27d0d
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 d418902a e8718bef 411592de 89d0b3f6
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 f0c0139a 4cecb0b3 3dd22f10 82a32996
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 ff000000 6879fd3b dcd3090c cd76e918 9763aa16
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 ff000000 006ca0cb 05501fdb 5b52dd6d 659411d8
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 ff000000 0148bb9c dd798f1a 510eb47b 20046ca7
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 ff000000 b8bd5381 14cda4be 07e491e2 36e08dc9
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 ff000000 882d166f f0c359dc b21dc4a4 053a5ee3
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 ff000000 301a4295 e655143d 6dd028ad fedda3ac
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 ff000000 688a4524 7aaabc09 25b5a1b5 08088fa9
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 ff000000 c17b1d49 cc5607a9 21ee2dfe 95a99bff
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 ff000000 2aced990 38892fc6 49e2b4c6 3a52a56f
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 ff000000 0fa8f694 e50536aa 8b05a5ea 30391e50
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 ff000000 ede36e48 e2d7501d 0fbdb070 d7611f60
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 ff000000 ed6e7836 13d33ce8 2ec70ea2 4b7458e3
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 ff000000 6180aae3 f456e639 31a87e11 c85999b0
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 ff000000 b0f72296 b437656f 0c6c13af 42269ae3
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 ff000000 8992f96a 38f12202 b145b3e0 4b22b7df
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 ff000000 e3266f68 75e172c8 4e627e57 2f18974e
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 ff000000 43f0eb04 f210d529 0a8bf0ce 38681023
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 ff000000 8bc32dfc 73fda05d 6150a6a3 55f1806c
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 ff000000 cc8357d2 581e8348 460a644c 509d3ec2
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 ff000000 3e3698b8 c03b8b6f 1fca337d e8290c22
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 ff000000 cf661d8e f1adc07c c6751ffb 2b670e1e
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 ff000000 8b05dbd5 3cb2ff22 fdd8ce3b f863a7e6
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 ff000000 8cb4ba53 7ed4b1f4 75c5c0b3 2df76a1a
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 ff000000 3eef466a 0224052f acd47be6 9aba9889
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 ff000000 73fb0705 020ccd4e 85f36527 d8c79692
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 ff000000 2c3fe25f 3a57e7ee bc1827bd 6b3d18b0
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 ff000000 8bbcd0b2 6ee1140a 73e65601 21fb1ba7
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 80000000 fb029bde c66dcda0 d5e37e9e b16153f4
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 80000000 c8628b14 65dd32ad 9df2d576 84590ee0
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 56abd8fd 08eb9fbe c7c0e3ef 7ebe6a02
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 86d7ca0a 10293363 a91e2acf 41cb60cd
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 80000000 2cbc07ec 78f6ebc0 e178d485 e1bd2a79
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 80000000 fc0dd527 5525a559 b82ec796 3fce8b27
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 80000000 35f94c49 dcec4494 b32b5591 607c35ae
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 80000000 223ecea6 9c6b82b9 8cda2ead fbdb3669
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 80000000 60302545 19be4945 ed1f61af 47ed7642
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 80000000 1e3c6ed3 1a6d28f8 e927216b 6983fe5f
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 80000000 64ec8748 bc735a79 154db177 98d6e304
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 80000000 eb8dbaaa c8d657ba 157635c4 cd8027b1
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 80000000 006d78b1 3240f565 1591df9a 3920f3a9
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 80000000 e63ae4b3 f4a20e6a b06cb99c ab9ebae3
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 80000000 0d0a1f5f 8b52c922 b655a04d 154509fb
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 80000000 4f955239 57ea76d1 2ed261e8 6665c61f
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 80000000 167a4885 bdd9d560 44901710 a1db3fef
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 01303e4d cc35c236 602a988b 67b25d16
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 d59d1ae1 201cf528 ca644f98 c863c919
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 a64ddf44 b9181f8f 08467b4c 0bddb7e5
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 1803efc8 007c2e15 25833640 8e7345c3
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 5a9b7d60 6ea2901e 78003e60 8942fbf4
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 80000000 29d3113a 43eaba4a 2758c58e 8fff4986
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 80000000 c403cb6c b87ce89f ddc5a406 eb5c0ea4
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 80000000 e7c4b1fa b544220c f4049712 84c85034
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 80000000 dea49ca5 785d289e f24509fb 37a561d4
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 80000000 39a9c229 b37e81f3 25136a6b 31f8df5d
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 80000000 c6a48363 d638f93c 0f7e20a0 2aa2107f
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 80000000 6e32daa1 77487aa8 981c7542 45c89ac2
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 80000000 24b7ff04 54a379cd 54105878 5e699328
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 80000000 4a217568 5ab95f01 c470dd0e cc312296
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 80000000 59f4e457 b3b2944d 2db60de7 5d6596c5
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 80000000 6291ff37 e4ec1241 2c6b7ea5 070f2af3
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 80000000 c52c541e 96b8b03e 29020434 07b8b52e
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 80000000 1d9ca290 d22df559 677b4219 211115fd
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 80000000 8b22d574 a1cffe3d 9c70e4c4 4d39249d
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 80000000 198c7bbb c5fc8419 46ddb6b8 f63f407b
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 80000000 f07ea702 360cb148 72e5e1fa e903112e
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 80000000 b117d222 cb3f5001 c5eb6c25 7440f4e5
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 80000000 f062efce 07b8dae5 6e487b3c ee17a039
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 80000000 93345860 df9ce586 7c8b5ff3 1028ea8a
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 80000000 f7ae5400 234e6d34 aa1e51c0 cdf51bd4
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 80000000 df755c0e 4842b68b a3d26d09 b1e5d506
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 80000000 dc546bee be2edfda 2887d5b6 39e817e9
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 80000000 e9375d82 8c142da5 cdf4bffe 421e1845
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 80000000 a0e70327 7caee527 6a428c61 3c4f3840
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 80000000 b80e41ea 4a1fa670 348659dd ee801943
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 80000000 020ddcdd 4a5fbd4f 03373d33 9415f871
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 80000000 d45af446 218fe8d8 47653a38 a1d863e2
diff --git a/lib/Random123-1.08/examples/pi_aes.cpp b/lib/Random123-1.08/examples/pi_aes.cpp
new file mode 100644
index 0000000..6b1b2cc
--- /dev/null
+++ b/lib/Random123-1.08/examples/pi_aes.cpp
@@ -0,0 +1,83 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/aes.h>
+#include <stdio.h>
+#include <assert.h>
+using namespace r123;
+
+// Everyone's favorite PRNG example: calculate pi/4 by throwing darts
+// at a square board and counting the fraction that are inside the
+// inscribed circle.
+
+// This version uses the C++ API to AESNI.
+
+#include "pi_check.h"
+
+int main(int, char **){
+#if R123_USE_AES_NI
+    unsigned long hits = 0, tries = 0;
+    const int64_t two_to_the_62 = ((int64_t)1)<<62;
+
+    if (!haveAESNI()) {
+	std::cerr << "AES-NI instructions not available on this hardware, skipping the pi_aes test." << std::endl;
+        return 0;
+    }
+    typedef AESNI4x32 G;
+    G generator;
+    G::ukey_type ukey = {{0x11111111, 0x22222222, 0x33333333, 0x44444444}};
+    // The key_type constructor transforms the 128bit AES ukey_type to an expanded (1408bit) form.
+    G::key_type key = ukey;
+    G::ctr_type ctr = {{0xdeadbeef, 0xbeadcafe, 0x12345678, 0x90abcdef}};
+
+    printf("Throwing %lu darts at a square board using AESNI4x32\n", NTRIES);
+    std::cout << "Initializing AES key with userkey: " << std::hex << ukey << " ctr: " << ctr << std::endl;
+
+    while(tries < NTRIES){
+        ctr.incr();
+        G::ctr_type r = generator(ctr, key);
+	if (tries == 0) {
+	    std::cout << "first random from AESNI is " << std::hex << r << std::endl;;
+	}
+        for(size_t j=0; j<r.size(); j+=2){
+            int64_t x = (int32_t)r[j];
+            int64_t y = (int32_t)r[j+1];
+            if( (x*x + y*y) < two_to_the_62 )
+                hits++;
+            tries++;
+        }
+    }
+    return pi_check(hits, tries);
+#else
+    std::cout << "AESNI RNG not compiled into this binary, skipping the pi_aes test.\n";
+    return 0;	// Not a failure to not have AESNI compiled into this.
+#endif
+}
diff --git a/lib/Random123-1.08/examples/pi_capi.c b/lib/Random123-1.08/examples/pi_capi.c
new file mode 100644
index 0000000..78d34e5
--- /dev/null
+++ b/lib/Random123-1.08/examples/pi_capi.c
@@ -0,0 +1,78 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/threefry.h>
+#include <stdio.h>
+#include <assert.h>
+
+/* Everyone's favorite PRNG example: calculate pi/4 by throwing darts
+// at a square board and counting the fraction that are inside the
+// inscribed circle.
+
+// This version uses the C API to threefry2x64. */
+
+#include "pi_check.h"
+
+int main(int argc, char **argv){
+    unsigned long hits = 0, tries = 0;
+    const int64_t two_to_the_62 = ((int64_t)1)<<62;
+
+    threefry2x64_key_t key = {{0, 0}};
+    threefry2x64_ctr_t ctr = {{0, 0}};
+    enum { int32s_per_counter = sizeof(ctr)/sizeof(int32_t) };
+    (void)argc;(void)argv; /* unused  */
+
+    printf("Throwing %lu darts at a square board using threefry2x64\n", NTRIES);
+
+    /* make the most of each bijection by looping over as many
+       int32_t's as we can find in the ctr_type. */
+    assert( int32s_per_counter%2 == 0 );
+    while(tries < NTRIES){
+        /* Use a union to avoid strict aliasing issues. */
+        union{
+            threefry2x64_ctr_t ct;
+            int32_t i32[int32s_per_counter];
+        }u;
+        size_t j;
+        /* Don't worry about the 'carry'.  We're not going to loop
+           more than 2^64 times. */
+        ctr.v[0]++;
+        u.ct = threefry2x64(ctr, key);
+        for(j=0; j<int32s_per_counter; j+=2){
+            int64_t x = u.i32[j];
+            int64_t y = u.i32[j+1];
+            if( (x*x + y*y) < two_to_the_62 )
+                hits++;
+            tries++;
+        }
+    }
+    return pi_check(hits, tries);
+}
diff --git a/lib/Random123-1.08/examples/pi_check.h b/lib/Random123-1.08/examples/pi_check.h
new file mode 100644
index 0000000..f34290f
--- /dev/null
+++ b/lib/Random123-1.08/examples/pi_check.h
@@ -0,0 +1,67 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef PI_CHECK_H__
+#define PI_CHECK_H__ 1
+
+#include <stdio.h>
+
+const unsigned long NTRIES = 10000000UL;
+
+/* XX Cannot make this static, is included in some files that only use it
+   under ifdef-conditionally, and we do not want to ifdef this to match. */
+int pi_check(unsigned long hits, unsigned long tries)
+{
+    const double PI = 3.14159265358979323846;
+    double ourpi, mean, var, delta, chisq;
+    printf("%lu out of %lu darts thrown at a square board hit the inscribed circle\n",
+           hits, tries);
+    ourpi = 4.*hits/tries;
+    printf("pi is approximately %.8g (diff = %.2g %%)\n", ourpi, (ourpi - PI)*100./PI);
+    mean = tries*(PI/4.);
+    var = tries * (PI/4.)*(1. - (PI/4.));
+    delta = hits - mean;
+    chisq = delta*delta/var;
+    /*  Sigh.  Jump through hoops so we don't want to link with -lm for sqrt */
+    if( chisq < 1. )
+        printf("OK, # of hits is less than one 'sigma' away from expectation\n(chisquared = %.2g)\n", chisq);
+    else if(chisq < 4.)
+        printf("OK, # of hits is between one and two 'sigma' away from expectation\n(chisquared = %.2g)\n", chisq);
+    else if(chisq < 9.)
+        printf("Maybe OK, # of hits is between two and three 'sigma' away from expectation\n(chisquared = %.2g)\n", chisq);
+    else {
+        printf("May not be OK, # of hits is more than three 'sigma'.  Worth looking into.\n(chisquared = %.2g)\n", chisq);
+	return 1;
+    }
+    return 0;
+}
+
+#endif /* PI_CHECK_H__ */
diff --git a/lib/Random123-1.08/examples/pi_cppapi.cpp b/lib/Random123-1.08/examples/pi_cppapi.cpp
new file mode 100644
index 0000000..1f0a407
--- /dev/null
+++ b/lib/Random123-1.08/examples/pi_cppapi.cpp
@@ -0,0 +1,78 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/threefry.h>
+#include <Random123/ReinterpretCtr.hpp>
+#include <stdio.h>
+#include <assert.h>
+
+// Everyone's favorite PRNG example: calculate pi/4 by throwing darts
+// at a square board and counting the fraction that are inside the
+// inscribed circle.
+
+// This version uses the C++ API to Threefry4x64, and the
+// ReinterpretCtr template to get 32-bit values.  
+
+// Note - by using ReinterpretCtr, the result depends on the
+// endianness of the hardware it runs on even though the underlying
+// generator is endian-independent.  An easy way to make the result
+// endian-independent would be to eliminate ReinterpretCtr and to use
+// a generator that works natively with 32-bit quantities, e.g.,
+// Threefry4x32 or Philox4x32.
+
+using namespace r123;
+
+#include "pi_check.h"
+
+int main(int, char **){
+    unsigned long hits = 0, tries = 0;
+    const int64_t two_to_the_62 = ((int64_t)1)<<62;
+
+    typedef ReinterpretCtr<r123array8x32, Threefry4x64> G;
+    G generator;
+    G::key_type key = {{}}; // initialize with zeros
+    G::ctr_type ctr = {{}};
+
+    printf("Throwing %lu darts at a square board using Threefry4x64\n", NTRIES);
+
+    while(tries < NTRIES){
+        ctr.incr();
+        G::ctr_type r = generator(ctr, key);
+        for(size_t j=0; j<r.size(); j+=2){
+            int64_t x = (int32_t)r[j];
+            int64_t y = (int32_t)r[j+1];
+            if( (x*x + y*y) < two_to_the_62 )
+                hits++;
+            tries++;
+        }
+    }
+    return pi_check(hits, tries);
+}
diff --git a/lib/Random123-1.08/examples/pi_cuda.cu b/lib/Random123-1.08/examples/pi_cuda.cu
new file mode 100644
index 0000000..fd2f5c5
--- /dev/null
+++ b/lib/Random123-1.08/examples/pi_cuda.cu
@@ -0,0 +1,119 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+// Simple CUDA device kernel and host main program to
+// compute pi via random darts at a square
+
+// functions for boilerplate CUDA init and done
+#include "util_cuda.h"
+
+#include <Random123/philox.h>
+
+int debug = 0;
+const char *progname;
+
+// CUDA Kernel:
+// generates n x,y points and returns hits[tid] with the count of number
+// of those points within the unit circle on each thread.
+__global__ void counthits(unsigned n, uint2 *hitsp)
+{
+    unsigned tid = blockDim.x * blockIdx.x + threadIdx.x;
+    unsigned hits = 0, tries = 0;
+    philox4x32_key_t k = {{tid, 0xdecafbad}};
+    philox4x32_ctr_t c = {{0, 0xf00dcafe, 0xdeadbeef, 0xbeeff00d}};
+
+    while (tries < n) {
+	union {
+	    philox4x32_ctr_t c;
+	    int4 i;
+	}u;
+	c.v[0] = tries;
+	u.c = philox4x32(c, k);
+	int64_t x1 = u.i.x, y1 = u.i.y;
+	int64_t x2 = u.i.z, y2 = u.i.w;
+	if ((x1*x1 + y1*y1) < (1LL<<62)) {
+	    hits++;
+	}
+	tries++;
+	if ((x2*x2 + y2*y2) < (1LL<<62)) {
+	    hits++;
+	}
+	tries++;
+    }
+    hitsp[tid] = make_uint2(hits, tries);
+}
+
+#include "pi_check.h"
+
+int
+main(int argc, char **argv)
+{
+    CUDAInfo *infop;
+    uint2 *hits_host, *hits_dev;
+    size_t hits_sz;
+    unsigned nthreads;
+    unsigned count = argc > 1 ? atoi(argv[1]) : 0;
+    double d  = 0.;
+
+    d = timer(&d);
+    progname = argv[0];
+    debug = argc > 2 ? atoi(argv[2]): 0;
+
+    infop = cuda_init(argc > 3 ? argv[3] : NULL);
+    nthreads =  infop->blocks_per_grid * infop->threads_per_block;
+    if (count == 0)
+	count = NTRIES/nthreads;
+
+    hits_sz = nthreads * sizeof(hits_host[0]);
+    CHECKCALL(cudaMalloc(&hits_dev, hits_sz));
+    CHECKNOTZERO((hits_host = (uint2 *)malloc(hits_sz)));
+
+    printf("starting %u blocks with %u threads/block for %u points each\n",
+	   infop->blocks_per_grid, infop->threads_per_block, count);
+    fflush(stdout);
+
+    counthits<<<infop->blocks_per_grid, infop->threads_per_block>>>(count, hits_dev);
+
+    CHECKCALL(cudaThreadSynchronize());
+    CHECKCALL(cudaMemcpy(hits_host, hits_dev, hits_sz, cudaMemcpyDeviceToHost));
+
+    unsigned long hits = 0, tries = 0;
+    for (unsigned i = 0; i < nthreads; i++) {
+	if (debug)
+	    printf("%u %u %u\n", i, hits_host[i].x, hits_host[i].y);
+	hits += hits_host[i].x;
+	tries += hits_host[i].y;
+    }
+    CHECKCALL(cudaFree(hits_dev));
+    free(hits_host);
+    cuda_done(infop);
+    return pi_check(hits, tries);
+}
diff --git a/lib/Random123-1.08/examples/pi_cudapp.cu b/lib/Random123-1.08/examples/pi_cudapp.cu
new file mode 100644
index 0000000..0d7ec75
--- /dev/null
+++ b/lib/Random123-1.08/examples/pi_cudapp.cu
@@ -0,0 +1,125 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+// Simple CUDA device kernel and host main program to
+// compute pi via random darts at a square
+
+// functions for boilerplate CUDA init and done
+#include "util_cuda.h"
+
+#include <Random123/philox.h>
+
+using namespace r123;
+
+int debug = 0;
+const char *progname;
+
+
+// CUDA Kernel:
+// generates n x,y points and returns hits[tid] with the count of number
+// of those points within the unit circle on each thread.
+__global__ void counthits(unsigned n, uint2 *hitsp)
+{
+    unsigned tid = blockDim.x * blockIdx.x + threadIdx.x;
+    unsigned hits = 0, tries = 0;
+    typedef Philox4x32 G;
+    G rng;
+    G::key_type k = {{tid, 0xdecafbad}};
+    G::ctr_type c = {{}};
+
+    while (tries < n) {
+	union {
+	    G::ctr_type c;
+	    int4 i;
+	}u;
+	c.incr();
+	u.c = rng(c, k);
+	int64_t x1 = u.i.x, y1 = u.i.y;
+	int64_t x2 = u.i.z, y2 = u.i.w;
+	if ((x1*x1 + y1*y1) < (1LL<<62)) {
+	    hits++;
+	}
+	tries++;
+	if ((x2*x2 + y2*y2) < (1LL<<62)) {
+	    hits++;
+	}
+	tries++;
+    }
+    hitsp[tid] = make_uint2(hits, tries);
+}
+
+#include "pi_check.h"
+
+int
+main(int argc, char **argv)
+{
+    CUDAInfo *infop;
+    uint2 *hits_host, *hits_dev;
+    size_t hits_sz;
+    unsigned nthreads;
+    unsigned count = argc > 1 ? atoi(argv[1]) : 0;
+    double d  = 0.;
+
+    d = timer(&d);
+    progname = argv[0];
+    debug = argc > 2 ? atoi(argv[2]): 0;
+
+    infop = cuda_init(argc > 3 ? argv[3] : NULL);
+    nthreads =  infop->blocks_per_grid * infop->threads_per_block;
+    if (count == 0)
+	count = NTRIES/nthreads;
+
+    hits_sz = nthreads * sizeof(hits_host[0]);
+    CHECKCALL(cudaMalloc(&hits_dev, hits_sz));
+    CHECKNOTZERO((hits_host = (uint2 *)malloc(hits_sz)));
+
+    printf("starting %u blocks with %u threads/block for %u points each\n",
+	   infop->blocks_per_grid, infop->threads_per_block, count);
+    fflush(stdout);
+
+    counthits<<<infop->blocks_per_grid, infop->threads_per_block>>>(count, hits_dev);
+
+    CHECKCALL(cudaThreadSynchronize());
+    CHECKCALL(cudaMemcpy(hits_host, hits_dev, nthreads*sizeof(hits_dev[0]),
+		   cudaMemcpyDeviceToHost));
+
+    unsigned long hits = 0, tries = 0;
+    for (unsigned i = 0; i < nthreads; i++) {
+	if (debug)
+	    printf("%u %u %u\n", i, hits_host[i].x, hits_host[i].y);
+	hits += hits_host[i].x;
+	tries += hits_host[i].y;
+    }
+    CHECKCALL(cudaFree(hits_dev));
+    free(hits_host);
+    cuda_done(infop);
+    return pi_check(hits, tries);
+}
diff --git a/lib/Random123-1.08/examples/pi_gsl.c b/lib/Random123-1.08/examples/pi_gsl.c
new file mode 100644
index 0000000..9f50979
--- /dev/null
+++ b/lib/Random123-1.08/examples/pi_gsl.c
@@ -0,0 +1,67 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <gsl/gsl_randist.h>
+#include <stdio.h>
+#include "Random123/philox.h"
+#include "Random123/threefry.h"
+#include "Random123/gsl_microrng.h"
+
+/* Compute pi, using the gsl_ran_flat distribution with
+   an underlying threefry4x64 counter-based rng (cbrng).
+   We can call cbrng 8 times between calls to cbrng_reset */
+
+GSL_MICRORNG(cbrng, threefry4x64); /* creates gsl_rng_cbrng */
+
+#include "pi_check.h"
+
+int main(int argc, char **argv){
+    unsigned long hits = 0, tries = 0;
+    gsl_rng *r;
+    (void)argc; (void)argv; /* unused */
+
+    threefry4x64_ctr_t c = {{0}};
+    threefry4x64_key_t k = {{0}};
+    r = gsl_rng_alloc(gsl_rng_cbrng);
+    printf("%lu uniforms from %s\n", NTRIES, gsl_rng_name(r));
+    while (tries < NTRIES) {
+            double x, y;
+            c.v[0]++; /* increment the counter */
+            cbrng_reset(r, c, k); /* reset the rng to the new counter */
+            x = gsl_ran_flat (r, -1.0, 1.0);
+            y = gsl_ran_flat (r, -1.0, 1.0);
+            if( x*x + y*y < 1.0 )
+                hits++;
+	    tries++;
+    }
+    gsl_rng_free (r);
+    return pi_check(hits, tries);
+}
diff --git a/lib/Random123-1.08/examples/pi_microurng.cpp b/lib/Random123-1.08/examples/pi_microurng.cpp
new file mode 100644
index 0000000..7dac9a4
--- /dev/null
+++ b/lib/Random123-1.08/examples/pi_microurng.cpp
@@ -0,0 +1,108 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+// Everyone's favorite PRNG example: calculate pi/4 by throwing darts
+// at a square board and counting the fraction that are inside the
+// inscribed circle.
+
+// This version uses Philox4x32 with a MicroURNG and the C++0x standard
+// library std::uniform_real distribution to generate floats in [-1..1]
+
+// N.B.  The results are hardware dependent even though the underlying
+// counter based RNG is hardware and endian-invariant.  On x86,
+// floating point temporaries, e.g., x, y, x*x, etc., are stored in
+// 80-bit extended precision registers.  On x86-64 (and other IEEE-754
+// systems), temporaries are stored in 32-bit SSE registers.
+
+#include <Random123/philox.h>
+#include <Random123/MicroURNG.hpp>
+#include <Random123/ReinterpretCtr.hpp>
+#if R123_USE_CXX11_RANDOM
+#include <random>
+#endif
+#include <iostream>
+#include <iomanip>
+#include "pi_check.h"
+
+using namespace r123;
+
+int main(int, char**){
+    typedef Philox4x32 RNG;
+    RNG::ctr_type c = {{}};
+    RNG::key_type k = {{}};
+    MicroURNG<RNG> longmurng(c.incr(), k);
+#if R123_USE_STD_RANDOM
+    std::uniform_real_distribution<float> u(-1., 1.);
+
+    // First, compute pi with a nice long MicroURNG that we cancall
+    // billions of times (2^31) before it runs out of state:
+    unsigned long hits=0;
+    std::cout << "Calling a single MicroURNG " << NTRIES << " times" << std::endl;
+    for(unsigned long i=0; i<NTRIES; ++i){
+        float x = u(longmurng);
+        float y = u(longmurng);
+        if( (x*x + y*y) < 1.0f )
+            hits++;
+    }
+    if (pi_check(hits, NTRIES) != 0) {
+	return 1;
+    }
+    // MicroURNGs are very light-weight.  It shouldn't be
+    // too expensive to create a new one every time through the loop:
+    std::cout << "Creating and calling a new MicroURNG " << NTRIES << " times" << std::endl;
+    hits=0;
+    for(unsigned long i=0; i<NTRIES; ++i){
+        MicroURNG<RNG> shorturng(c.incr(), k);
+        float x = u(shorturng);
+        float y = u(shorturng);
+        if( (x*x + y*y) < 1.0f )
+            hits++;
+    }
+    return pi_check(hits, NTRIES);
+#else
+    // MicroURNG's are interesting because they allow us to use std::distributions,
+    // as in the above code.  Std::distributions are nice, but if all we need is
+    // a uniform integer, we can do without such fancy C++0x features:
+    unsigned long hits=0;
+    std::cout << "Calling a single MicroURNG " << NTRIES << " times" << std::endl;
+    for(unsigned long i=0; i<NTRIES; ++i){
+        float x = 2.*longmurng()/(double)std::numeric_limits<uint32_t>::max() - 1.;
+        float y = 2.*longmurng()/(double)std::numeric_limits<uint32_t>::max() - 1.;
+        if( (x*x + y*y) < 1.0f )
+            hits++;
+    }
+    if (pi_check(hits, NTRIES) != 0) {
+	return 1;
+    }
+#endif
+    
+
+}
diff --git a/lib/Random123-1.08/examples/pi_opencl.c b/lib/Random123-1.08/examples/pi_opencl.c
new file mode 100644
index 0000000..7a14a15
--- /dev/null
+++ b/lib/Random123-1.08/examples/pi_opencl.c
@@ -0,0 +1,92 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+// Simple OpenCL device kernel and host main program to
+// compute pi via random darts at a square
+
+// functions to do boilerplate OpenCL begin and end
+#include "util_opencl.h"
+#include "pi_check.h"
+
+// Include preprocessed kernel declaration for the array src 
+// The GNUmakefile will create pi_opencl_kernel.i in the build
+// directory, and then compile this with -I., so use #include <angle> .
+#include <pi_opencl_kernel.i>
+
+const char *progname;
+int verbose = 0;
+int debug = 0;
+
+int
+main(int argc, char **argv)
+{
+    unsigned count = argc > 1 ? atoi(argv[1]) : 0;
+    UCLInfo *infop;
+    size_t i, nthreads, hits_sz;
+    cl_mem hits_dev;
+    cl_uint2 *hits_host;
+    const char *kernelname = "counthits";
+    cl_int err;
+    cl_kernel kern;
+    double d = 0.;
+
+    d = timer(&d);
+    progname = argv[0];
+    verbose = debug = argc > 2 ? atoi(argv[2]): 0;
+    infop = opencl_init(argc > 3 ? argv[3] : NULL, opencl_src, argc > 4 ? argv[4] : "");
+    CHECKERR(kern = clCreateKernel(infop->prog, kernelname, &err));
+    if (infop->wgsize > 64) infop->wgsize /= 2;
+    nthreads = infop->cores * infop->wgsize;
+    if (count == 0)
+	count = NTRIES/nthreads;
+    hits_sz = nthreads * sizeof(hits_host[0]);
+    CHECKNOTZERO(hits_host = (cl_uint2 *)malloc(hits_sz));
+    CHECKERR(hits_dev = clCreateBuffer(infop->ctx, CL_MEM_WRITE_ONLY, hits_sz, 0, &err));
+    CHECK(clSetKernelArg(kern, 0, sizeof(cl_uint), (void*)&count));
+    CHECK(clSetKernelArg(kern, 1, sizeof(cl_mem), (void*)&hits_dev));
+    printf("queuing kernel for %lu threads with %lu work group size, %u points\n",
+	   (unsigned long)nthreads, (unsigned long)infop->wgsize, count);
+    CHECK(clEnqueueNDRangeKernel(infop->cmdq, kern, 1, 0, &nthreads, &infop->wgsize, 0, 0, 0));
+    CHECK(clFinish(infop->cmdq));
+    CHECK(clEnqueueReadBuffer(infop->cmdq, hits_dev, CL_TRUE, 0, hits_sz, hits_host, 0, 0, 0));
+
+    unsigned long hits = 0, tries = 0;
+    for (i = 0; i < nthreads; i++) {
+	if (debug)
+	    printf("%lu %u %u\n", (unsigned long)i, hits_host[i].x, hits_host[i].y);
+	hits += hits_host[i].x;
+	tries += hits_host[i].y;
+    }
+    CHECK(clReleaseMemObject(hits_dev));
+    CHECK(clReleaseKernel(kern));
+    opencl_done(infop);
+    return pi_check(hits, tries);
+}
diff --git a/lib/Random123-1.08/examples/pi_opencl_kernel.ocl b/lib/Random123-1.08/examples/pi_opencl_kernel.ocl
new file mode 100644
index 0000000..20a2931
--- /dev/null
+++ b/lib/Random123-1.08/examples/pi_opencl_kernel.ocl
@@ -0,0 +1,71 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ * This file is the OpenCL kernel.  It gets preprocessed, munged
+ * into a C string declaration and included in pi_opencl, so that
+ * running the compiled pi_opencl does not depend on any include
+ * files, paths etc.
+ */
+
+#include <Random123/threefry.h>
+
+/*
+ * counthits generates n x,y points and returns hits[tid] with
+ * the count of number of those points within the unit circle on
+ * each thread.
+ */
+__kernel void counthits(unsigned n, __global uint2 *hitsp) {
+    unsigned tid = get_global_id(0);
+    unsigned hits = 0, tries = 0;
+    threefry4x32_key_t k = {{tid, 0xdecafbad, 0xfacebead, 0x12345678}};
+    threefry4x32_ctr_t c = {{0, 0xf00dcafe, 0xdeadbeef, 0xbeeff00d}};
+    while (tries < n) {
+	union {
+	    threefry4x32_ctr_t c;
+	    int4 i;
+	} u;
+	c.v[0]++;
+	u.c = threefry4x32(c, k);
+	long x1 = u.i.x, y1 = u.i.y;
+	long x2 = u.i.z, y2 = u.i.w;
+	if ((x1*x1 + y1*y1) < (1L<<62)) {
+	    hits++;
+	}
+	tries++;
+	if ((x2*x2 + y2*y2) < (1L<<62)) {
+	    hits++;
+	}
+	tries++;
+    }
+    hitsp[tid].x = hits;
+    hitsp[tid].y = tries;
+}
diff --git a/lib/Random123-1.08/examples/pi_uniform.cpp b/lib/Random123-1.08/examples/pi_uniform.cpp
new file mode 100644
index 0000000..9160b86
--- /dev/null
+++ b/lib/Random123-1.08/examples/pi_uniform.cpp
@@ -0,0 +1,136 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <stdio.h>
+#include <Random123/threefry.h>
+#include "uniform.hpp"
+
+/* Compute pi, using the u01 conversion with threefry2x64 and threefry2x32 */
+
+#include "pi_check.h"
+
+using namespace r123;
+
+template<typename Ftype, typename CBRNG>
+void pi(typename CBRNG::key_type k);
+
+int errs = 0;
+int main(int, char **){
+    unsigned long hits = 0, tries = 0;
+
+    // First, we demonstrate how to compute pi
+    // using uneg11 to convert the integer output
+    // of threefry2x64 to a double in (-1, 1).
+    Threefry2x64::ctr_type c = {{0}}, r;
+    Threefry2x64::ukey_type uk = {{R123_64BIT(0xdeadbeef12345678)}};
+    Threefry2x64::key_type k = uk;
+    printf("%lu uniform doubles from threefry2x64\n", NTRIES);
+    while (tries < NTRIES) {
+            double x, y;
+            c.v[0]++; /* increment the counter */
+	    r = threefry2x64(c, k);
+            x = uneg11<double>(r.v[0]);
+            y = uneg11<double>(r.v[1]);
+            if( x*x + y*y < 1.0 )
+                hits++;
+	    tries++;
+    }
+    errs += pi_check(hits, tries);
+
+    // Extra credit: use some template hackery to exercise various
+    // combinations of float, double and long double, unit64_t and
+    // uint32_t and the conversion functions u01, uneg11 and ufixed01.
+    // This provides minimal testing of the conversion functions.
+    pi<float, Threefry2x64>(k);
+    pi<double, Threefry2x64>(k);
+    pi<long double, Threefry2x64>(k);
+
+    Threefry2x32::ukey_type ukh = {{0xdecafbad}};
+    Threefry2x32::key_type kh = ukh;
+    pi<float, Threefry2x32>(kh);
+    pi<double, Threefry2x32>(kh);
+    pi<long double, Threefry2x32>(kh);
+
+    return errs;
+}
+
+template<typename Ftype, typename CBRNG>
+void pi(typename CBRNG::key_type k){
+    unsigned long hits = 0, tries = 0;
+    CBRNG rng;
+
+    printf("Compute pi with uneg11:\n");
+    typename CBRNG::ctr_type c = {{0}}, r;
+    hits = tries = 0;
+    while (tries < NTRIES) {
+        Ftype x, y;
+        c.v[0]++; /* increment the counter */
+        r = rng(c, k);
+        // x and y in the entire square from (-1,-1) to (1,1)
+        x = uneg11<Ftype>(r.v[0]);
+        y = uneg11<Ftype>(r.v[1]);
+        if( x*x + y*y < 1.0 )
+            hits++;
+        tries++;
+    }
+    errs += pi_check(hits, tries);
+
+    printf("Compute pi with u01:\n");
+    hits = tries = 0;
+    while (tries < NTRIES) {
+            Ftype x, y;
+            c.v[0]++; /* increment the counter */
+	    r = rng(c, k);
+            // generate x and y in the first quadrant from (0,0) to (1,1)
+            x = u01<Ftype>(r.v[0]);
+            y = u01<Ftype>(r.v[1]);
+            if( x*x + y*y < 1.0 )
+                hits++;
+	    tries++;
+    }
+    errs += pi_check(hits, tries);
+
+    printf("Compute pi with u01fixedpt:\n");
+    hits = tries = 0;
+    while (tries < NTRIES) {
+            Ftype x, y;
+            c.v[0]++; /* increment the counter */
+	    r = rng(c, k);
+            // generate x and y in the first quadrant from (0,0) to (1,1)
+            x = u01fixedpt<Ftype>(r.v[0]);
+            y = u01fixedpt<Ftype>(r.v[1]);
+            if( x*x + y*y < 1.0 )
+                hits++;
+	    tries++;
+    }
+    errs += pi_check(hits, tries);
+ }
+
diff --git a/lib/Random123-1.08/examples/rngNxW.h b/lib/Random123-1.08/examples/rngNxW.h
new file mode 100644
index 0000000..1bd62d4
--- /dev/null
+++ b/lib/Random123-1.08/examples/rngNxW.h
@@ -0,0 +1,46 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+RNGNxW_TPL(philox, 2, 32)
+RNGNxW_TPL(philox, 4, 32)
+#if R123_USE_PHILOX_64BIT
+RNGNxW_TPL(philox, 2, 64)
+RNGNxW_TPL(philox, 4, 64)
+#endif
+RNGNxW_TPL(threefry, 2, 32)
+RNGNxW_TPL(threefry, 2, 64)
+RNGNxW_TPL(threefry, 4, 32)
+RNGNxW_TPL(threefry, 4, 64)
+#if R123_USE_AES_NI
+RNGNxW_TPL(ars, 4, 32)
+RNGNxW_TPL(aesni, 4, 32)
+#endif
diff --git a/lib/Random123-1.08/examples/simple.c b/lib/Random123-1.08/examples/simple.c
new file mode 100644
index 0000000..eeccc4e
--- /dev/null
+++ b/lib/Random123-1.08/examples/simple.c
@@ -0,0 +1,52 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/threefry.h>
+#include <stdio.h>
+
+int main(int argc, char **argv){
+    int i;
+    threefry2x64_ctr_t  ctr = {{0,0}};
+    threefry2x64_key_t key = {{0xdeadbeef, 0xbadcafe}};
+    (void)argc; (void)argv; /* unused */
+    printf( "The first few randoms with key %llx %llx\n",
+	   (unsigned long long)key.v[0], (unsigned long long)key.v[1]);
+    for(i=0; i<10; ++i){
+        ctr.v[0] = i;
+	{
+          threefry2x64_ctr_t rand = threefry2x64(ctr, key);
+          printf("ctr: %llx %llx threefry2x64(20, ctr, key): %llx %llx\n",
+                 (unsigned long long)ctr.v[0], (unsigned long long)ctr.v[1],
+                 (unsigned long long)rand.v[0], (unsigned long long)rand.v[1]);
+	}
+    }
+    return 0;
+}
diff --git a/lib/Random123-1.08/examples/simplepp.cpp b/lib/Random123-1.08/examples/simplepp.cpp
new file mode 100644
index 0000000..a930390
--- /dev/null
+++ b/lib/Random123-1.08/examples/simplepp.cpp
@@ -0,0 +1,47 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/threefry.h>
+#include <iostream>
+
+int main(int, char **){
+    typedef r123::Threefry2x64 CBRNG;
+    CBRNG g;
+    CBRNG::ctr_type  ctr = {{0,0}};
+    CBRNG::key_type key = {{0xdeadbeef}};
+    std::cout << std::hex << "The first few 2x64 randoms from Threefry2x64 with key " << key << "\n";
+    for(int i=0; i<10; ++i){
+        ctr[0] = i;
+        CBRNG::ctr_type rand = g(ctr, key);
+        std::cout << "ctr: " << ctr << " Threefry2x64<>(ctr, key): " << rand << "\n";
+    }
+    return 0;
+}
diff --git a/lib/Random123-1.08/examples/time_boxmuller.cpp b/lib/Random123-1.08/examples/time_boxmuller.cpp
new file mode 100644
index 0000000..2da4044
--- /dev/null
+++ b/lib/Random123-1.08/examples/time_boxmuller.cpp
@@ -0,0 +1,132 @@
+// Test for boxmuller.h on CPU
+#include <Random123/philox.h>
+#include <Random123/threefry.h>
+#include "boxmuller.hpp"
+#include "util.h"   // for timer()
+
+typedef r123::Philox4x32 CBRNGF;
+typedef r123::Threefry2x64 CBRNGD;
+
+const char *progname = "time_boxmuller";
+
+// Each call to boxmuller() returns a pair of values in the .x and .y
+// members, which we add up into sum just to avoid being optimized away.
+template <typename CBRNG, typename F, typename F2>
+F timedloop(typename CBRNG::ukey_type k, size_t Ntry){
+    F sum = 0.f;
+    typename CBRNG::ctr_type ctr = {{}};
+    const size_t csize = sizeof(ctr)/sizeof(ctr[0]);
+    CBRNG rng;
+
+    for(size_t i=0; i<Ntry; i+=csize){
+        ctr.incr();
+        typename CBRNG::ctr_type u = rng(ctr, k);
+	F2 f2;
+	switch(csize) {
+	case 8: f2 = r123::boxmuller(u[6], u[7]); sum += f2.x + f2.y;
+                f2 = r123::boxmuller(u[4], u[5]); sum += f2.x + f2.y;
+	case 4: f2 = r123::boxmuller(u[2], u[3]); sum += f2.x + f2.y;
+	case 2: f2 = r123::boxmuller(u[0], u[1]); sum += f2.x + f2.y;
+                break;
+	default:
+	        R123_ASSERT(0);
+	}
+    }
+    return sum;
+}
+
+template <typename CBRNG, typename F2>
+void dumploop(FILE *fp, typename CBRNG::ukey_type k, size_t Ntry){
+    typename CBRNG::ctr_type ctr = {{}};
+    const size_t csize = sizeof(ctr)/sizeof(ctr[0]);
+    CBRNG rng;
+
+    for(size_t i=0; i<Ntry; i+=csize){
+        ctr.incr();
+        typename CBRNG::ctr_type u = rng(ctr, k);
+	F2 f2;
+	switch(csize) {
+	case 8: f2 = r123::boxmuller(u[6], u[7]); fprintf(fp, "%g\n%g\n", f2.x, f2.y);
+                f2 = r123::boxmuller(u[4], u[5]); fprintf(fp, "%g\n%g\n", f2.x, f2.y);
+	case 4: f2 = r123::boxmuller(u[2], u[3]); fprintf(fp, "%g\n%g\n", f2.x, f2.y);
+	case 2: f2 = r123::boxmuller(u[0], u[1]); fprintf(fp, "%g\n%g\n", f2.x, f2.y); break;
+	default:
+	    R123_ASSERT(0);
+	}
+    }
+}
+
+#define NREPEAT 20
+
+template <typename CBRNG, typename F, typename F2>
+void timedcall(const char *tname, typename CBRNG::ukey_type k, size_t Ntry, char *out_fname) {
+    double cur_time, dt;
+    F sums[NREPEAT];
+    int i;
+    FILE *fp;
+    char *fname;
+    if (out_fname) {
+	fname = (char *) malloc(strlen(out_fname) + strlen(tname) + 2);
+	CHECKNOTZERO(fname);
+	sprintf(fname, "%s-%s", out_fname, tname);
+	fp = fopen(fname, "w");
+	CHECKNOTZERO(fp);
+    } else {
+	fname = NULL;
+	fp = NULL;
+    }
+    (void) timer(&cur_time);
+    /*
+     * we call timedloop NREPEAT times so that it is easy to keep
+     * Ntry the same for boxmuller.cu and boxmuller.cpp, so sum[0]
+     * can be checked.
+     */
+    for (i = 0; i < NREPEAT; i++) {
+	k.v[sizeof(k)/sizeof(k.v[0])-1] = i;
+	if (fp)
+	    dumploop<CBRNG, F2>(fp, k, Ntry);
+	else
+	    sums[i] = timedloop<CBRNG, F, F2>(k, Ntry);
+    }
+    dt = timer(&cur_time);
+    if (fp) {
+	printf("%s %lu written to %s in %g sec: %gM/sec\n", tname, (unsigned long)(Ntry*NREPEAT), fname, dt, Ntry*NREPEAT*1.e-6/dt);
+	fclose(fp);
+	free(fname);
+    } else {
+	printf("%s %lu in %g sec: %gM/sec, sum = %g\n", tname, (unsigned long)(Ntry*NREPEAT), dt, Ntry*NREPEAT*1.e-6/dt, sums[0]);
+	for (i = 1; i < NREPEAT; i++) {
+	    printf(" %g", sums[i]);
+	}
+	printf("\n");
+    }
+}
+
+const size_t DEF_N = 200000;
+
+int main(int argc, char **argv){
+    CBRNGF::ukey_type keyf = {{}};
+    CBRNGD::ukey_type keyd = {{}};
+    size_t Ntry = DEF_N;
+    char *dumpfname;
+    
+    dumpfname = getenv("BOXMULLER_DUMPFILE");
+    if(argc>1) {
+	if (argv[1][0] == '-') {
+	    fprintf(stderr, "Usage: %s [iterations_per_thread [key0 [key1]]]\n", argv[0]);
+	    exit(1);
+	}
+        Ntry = atol(argv[1]);
+    }
+    for (int i = 0; i < (int)(sizeof(keyf)/sizeof(keyf[0])-1) && 2+i < argc; i++) {
+	keyf.v[i] = atol(argv[2+i]);
+    }
+    for (int i = 0; i < (int)(sizeof(keyd)/sizeof(keyd[0])-1) && 2+i < argc; i++) {
+	keyd.v[i] = atol(argv[2+i]);
+    }
+
+    timedcall<CBRNGF,float,r123::float2>("float", keyf, Ntry, dumpfname);
+    timedcall<CBRNGD,double,r123::double2>("double", keyd, Ntry, dumpfname);
+    return 0;
+}
+    
diff --git a/lib/Random123-1.08/examples/time_boxmuller_cuda.cu b/lib/Random123-1.08/examples/time_boxmuller_cuda.cu
new file mode 100644
index 0000000..4554b14
--- /dev/null
+++ b/lib/Random123-1.08/examples/time_boxmuller_cuda.cu
@@ -0,0 +1,181 @@
+// Test for boxmuller.h on CUDA
+#include <Random123/philox.h>
+#include <Random123/threefry.h>
+#include "util.h"   // for timer()
+#include "util_cuda.h"	// for cuda_init, CHECKCALL
+#include "boxmuller.hpp"
+
+typedef r123::Philox4x32 CBRNGF;
+typedef r123::Threefry2x64 CBRNGD;
+int debug = 0;
+const char *progname = "time_boxmuller_cuda";
+
+// Sometimes warnings are A LOT more trouble than they're worth.
+// if we just write u[6], we get warnings
+// so we write u[(csize>n)?6:0].
+#define UGLY(n) (csize>n)?n:0
+
+// The timedloop kernel sums N randoms per thread for timing and
+// records that sum in out[tid] (mainly to ensure that
+// the random generation process does not get optimized away)
+template <typename CBRNG, typename F, typename F2>
+__global__ void timedloop(F *out, typename CBRNG::ukey_type k, size_t N){
+    unsigned tid = blockDim.x * blockIdx.x + threadIdx.x;
+    const size_t klast = sizeof(k)/sizeof(k[0]) - 1;
+    R123_ASSERT(k[klast] == 0); // uses last element of key to
+    k[klast] = tid;		// ensure unique key per thread
+    F sum = 0.f;
+    typename CBRNG::ctr_type ctr = {};
+    const size_t csize = sizeof(ctr)/sizeof(ctr[0]);
+    CBRNG rng;
+
+    for(size_t i=0; i<N; i+=csize){
+        ctr.incr();
+        typename CBRNG::ctr_type u = rng(ctr, k);
+	F2 f2;
+	// Using a loop instead of the Duff device here costs 10%,
+	// at least in CUDA4.2 circa Jan 2013 on a Tesla C2050!
+	switch(csize) {
+	case 8: f2 = r123::boxmuller(u[UGLY(6)], u[UGLY(7)]); sum += f2.x + f2.y;
+		f2 = r123::boxmuller(u[UGLY(4)], u[UGLY(5)]); sum += f2.x + f2.y;
+	case 4: f2 = r123::boxmuller(u[UGLY(2)], u[UGLY(3)]); sum += f2.x + f2.y;
+	case 2: f2 = r123::boxmuller(u[0], u[1]); sum += f2.x + f2.y;
+	        break;
+	default:
+	        R123_ASSERT(0);
+	}
+    }
+    out[tid] = sum;
+}
+
+// The dumploop kernel records all the normal randoms individually in out,
+// so it produces N randoms per thread.  Each thread records
+// its randoms in tid, NTHREADS+tid, NTHREAD*2+tid, ..., NTHREADS*(N-1)+tid
+// which hopefully results in nicely coalesced writes from each warp.
+template <typename CBRNG, typename F, typename F2>
+__global__ void dumploop(F *out, typename CBRNG::ukey_type k, size_t N){
+    unsigned tid = blockDim.x * blockIdx.x + threadIdx.x;
+    const size_t klast = sizeof(k)/sizeof(k[0]) - 1;
+    R123_ASSERT(k[klast] == 0); // uses last element of key to
+    k[klast] = tid;		// ensure unique key per thread
+    typename CBRNG::ctr_type ctr = {};
+    const size_t csize = sizeof(ctr)/sizeof(ctr[0]);
+    CBRNG rng;
+
+    for(size_t i=0; i<N;){
+        ctr.incr();
+        typename CBRNG::ctr_type u = rng(ctr, k);
+	F2 f2;
+	// Using a loop instead of the Duff device here costs 10%,
+	// at least in CUDA4.2 circa Jan 2013 on a Tesla C2050!
+	switch(csize) {
+	case 8: f2 = r123::boxmuller(u[UGLY(6)], u[UGLY(7)]);
+		out[blockDim.x*gridDim.x*i + tid] = f2.x;
+		i++;
+		out[blockDim.x*gridDim.x*i + tid] = f2.y;
+		i++;
+		f2 = r123::boxmuller(u[UGLY(4)], u[UGLY(5)]);
+		out[blockDim.x*gridDim.x*i + tid] = f2.x;
+		i++;
+		out[blockDim.x*gridDim.x*i + tid] = f2.y;
+		i++;
+	case 4: f2 = r123::boxmuller(u[UGLY(2)], u[UGLY(3)]);
+#undef UGLY
+		out[blockDim.x*gridDim.x*i + tid] = f2.x;
+		i++;
+		out[blockDim.x*gridDim.x*i + tid] = f2.y;
+		i++;
+	case 2: f2 = r123::boxmuller(u[0], u[1]);
+		out[blockDim.x*gridDim.x*i + tid] = f2.x;
+		i++;
+		out[blockDim.x*gridDim.x*i + tid] = f2.y;
+		i++;
+		break;
+	default:
+		asm("trap;");
+	}
+    }
+}
+
+template <typename CBRNG, typename F, typename F2>
+void timedcall(const char *tname, const char *out_fname, CUDAInfo *infop, typename CBRNG::ukey_type k, size_t N) {
+    double cur_time, dt;
+    const int nthreads = infop->blocks_per_grid*infop->threads_per_block;
+    const size_t nrand = out_fname ? N * nthreads : nthreads;
+    const size_t out_size = nrand*sizeof(F);
+    F *d_out, *h_out = (F *) malloc(out_size);
+    CHECKNOTZERO(h_out);
+    CHECKCALL(cudaMalloc(&d_out, out_size));
+    (void) timer(&cur_time);
+    if (out_fname)
+	dumploop<CBRNG,F,F2> <<<infop->blocks_per_grid, infop->threads_per_block>>> (d_out, k, N);
+    else
+	timedloop<CBRNG,F,F2> <<<infop->blocks_per_grid, infop->threads_per_block>>> (d_out, k, N);
+    CHECKCALL(cudaThreadSynchronize());
+    CHECKCALL(cudaMemcpy(h_out, d_out, out_size, cudaMemcpyDeviceToHost));
+    dt = timer(&cur_time);
+    printf("%s %zd in %g sec: %gM/sec\n", tname, N*nthreads, dt, N*nthreads*1.e-6/dt);
+    if (out_fname) {
+	char *fname = (char *) malloc(strlen(out_fname) + strlen(tname) + 2);
+	CHECKNOTZERO(fname);
+	sprintf(fname, "%s-%s", out_fname, tname);
+	FILE *fp = fopen(fname, "w");
+	CHECKNOTZERO(fp);
+	for (size_t i = 0; i < nrand; i++){
+	    fprintf(fp, "%g\n", h_out[i]);
+	}
+	fclose(fp);
+	free(fname);
+    } else {
+	int nwoops = 0;
+	printf("%s h_out[0] = %g\n", tname, h_out[0]);
+	for (size_t i = 0; i < nrand; i++){
+	    if(h_out[i] == 0.f){
+		if(nwoops++<10)
+		    printf("Woops %s h_out[%zd] = %g\n", tname, i, h_out[i]);
+
+	    }
+	}
+	if(nwoops>10){
+	    printf("Woops %s %d times\n", tname, nwoops);
+	}
+    }
+    CHECKCALL(cudaFree(d_out));
+    free(h_out);
+}
+
+const size_t DEF_N = 200000;
+
+int main(int argc, char **argv){
+    CBRNGF::ukey_type keyf = {};
+    CBRNGD::ukey_type keyd = {};
+    size_t Ntry = DEF_N;
+    char *cp = getenv("R123_DEBUG");
+    if (cp)
+	debug = atoi(cp);
+    if ((cp = getenv("BOXMULLER_DUMPFILE")) != NULL) {
+	Ntry = 8;
+    } else {
+	Ntry = DEF_N;
+    }
+    if(argc>1) {
+	if (argv[1][0] == '-') {
+	    fprintf(stderr, "Usage: %s [iterations_per_thread [key0 [key1]]]\n", argv[0]);
+	    exit(1);
+	}
+        Ntry = atol(argv[1]);
+    }
+    // XXX cannot use keyf.size in host code, only in device code
+    for (int i = 0; i < (int)(sizeof(keyf)/sizeof(keyf[0])-1) && 2+i < argc; i++) {
+	keyf.v[i] = atol(argv[2+i]);
+    }
+    for (int i = 0; i < (int)(sizeof(keyd)/sizeof(keyd[0])-1) && 2+i < argc; i++) {
+	keyd.v[i] = atol(argv[2+i]);
+    }
+    CUDAInfo *infop = cuda_init(getenv("R123_CUDA_DEVICE"));
+    timedcall<CBRNGF,float,r123::float2>("float", cp, infop, keyf, Ntry);
+    timedcall<CBRNGD,double,r123::double2>("double",cp, infop, keyd, Ntry);
+    cuda_done(infop);
+    return 0;
+}
+    
diff --git a/lib/Random123-1.08/examples/time_cuda.cu b/lib/Random123-1.08/examples/time_cuda.cu
new file mode 100644
index 0000000..9644333
--- /dev/null
+++ b/lib/Random123-1.08/examples/time_cuda.cu
@@ -0,0 +1,175 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ * CUDA test and timing harness for Random123 RNGs.  Uses macros
+ * and util_expandtpl.h to "templatize" over all the different
+ * permutations of RNGs and NxW and R.
+ */
+
+#include "util_cuda.h"
+
+#include "Random123/philox.h"
+#include "Random123/threefry.h"
+
+#include "time_misc.h"
+#include "util_print.h"
+
+#define KERNEL __global__
+#define get_global_id(i) (blockDim.x * blockIdx.x + threadIdx.x)
+#include "time_random123.h"
+
+#define TEST_TPL(NAME, N, W, R) \
+void NAME##N##x##W##_##R(NAME##N##x##W##_ukey_t ukey, NAME##N##x##W##_ctr_t ctr, NAME##N##x##W##_ctr_t kactr, uint count, CUDAInfo *tp) \
+{ \
+    const char *kernelname = PREFIX #NAME #N "x" #W "_" #R; \
+    NAME##N##x##W##_ctr_t *hC, *dC; \
+    int n, niterations = numtrials; /* we make niterations + 2 (warmup, overhead) calls to the kernel */ \
+    double cur_time; \
+    size_t i; \
+    const size_t nworkitems = tp->blocks_per_grid * tp->threads_per_block; \
+    const size_t szC = nworkitems*sizeof(hC[0]); \
+    \
+    /* allocate vector of counters in device memory, initialize to zero */ \
+    CHECKCALL(cudaMalloc(&dC, szC)); \
+    CHECKCALL(cudaMemset((void *)dC, 0, szC)); \
+    /* allocate and initialize vector of counters in host memory */ \
+    CHECKNOTZERO(hC = (NAME##N##x##W##_ctr_t *)malloc(szC)); \
+    for (i = 0; i < nworkitems; i++) { \
+	size_t xi; \
+	for (xi = 0; xi < N; xi++) { \
+	    hC[i].v[xi] = 0; \
+	} \
+    } \
+    uint kcount = 0; \
+    double basetime = 0., dt = 0., mindt = 0.; \
+    for (n = -2; n < niterations; n++) { \
+	if (n == -2) { \
+	    if (count == 0) { \
+		/* try to set a good guess for count */ \
+		count = (uint)(tp->cycles ? tp->cycles * 1e-8 : 10000); \
+		dprintf(("starting with count = %u\n", count)); \
+	    } \
+	    kcount = count; \
+	} else if (n == -1) { \
+	    /* use first iteration time to calibrate count to get approximately sec_per_trial */ \
+	    if (count > 1) { \
+		count = (uint)(count * sec_per_trial / dt); \
+		dprintf(("scaled count = %u\n", count)); \
+	    } \
+	    /* second iteration is to calculate overhead after warmup */ \
+	    kcount = 1; \
+	} else if (n == 0) { \
+	    int xj; \
+	    /* Check that we got the expected value */ \
+	    for (xj = 0; xj < N; xj++) { \
+		if (kactr.v[xj] != hC[0].v[xj]) { \
+		    printf("%s mismatch: xj = %d, expected\n", kernelname, xj); \
+		    printline_##NAME##N##x##W##_##R(ukey, ctr, &kactr, 1); \
+		    printf("    but got\n"); \
+		    printline_##NAME##N##x##W##_##R(ukey, ctr, hC, 1); \
+                    if(!debug) exit(1); \
+                    else break; \
+		} else { \
+		    dprintf(("%s matched word %d\n", kernelname, xj)); \
+		} \
+	    } \
+	    basetime = dt; \
+	    if (debug||verbose) { \
+		dprintf(("%s %.3f secs for %lu workitems test on device %d (%s)\n", \
+		       kernelname, basetime, (unsigned long) nworkitems, \
+		       tp->devnum, tp->dev.name)); \
+		printline_##NAME##N##x##W##_##R(ukey, ctr, hC, (verbose < 2) ? 1 : nworkitems); \
+	    } \
+	    kcount = count + 1; \
+	} \
+	dprintf(("launch %s\n", kernelname)); \
+	(void)timer(&cur_time); \
+	test_##NAME##N##x##W##_##R<<<tp->blocks_per_grid, tp->threads_per_block>>>(kcount, ukey, ctr, dC); \
+	dprintf(("synchronize\n")); \
+	CHECKCALL(cudaThreadSynchronize()); \
+	dprintf(("copy results back from device to host\n")); \
+	CHECKCALL(cudaMemcpy(hC, dC, szC, cudaMemcpyDeviceToHost)); \
+	dt = timer(&cur_time); \
+	dprintf(("iteration %d took %.3f secs\n", n, dt)); \
+	ALLZEROS(hC, nworkitems, N); \
+	if (n == 0 || dt < mindt) mindt = dt; \
+    } \
+    if (count > 1) { \
+	double tpB = (mindt - basetime) / ( (kcount - 1.) * nworkitems * (N * W / 8.) ); \
+	printf("%-17s %#5.3g cpB, %#5.3g GB/s on dev %d %u B granularity (best %u in %.3f s - %.6f s)\n", \
+	       kernelname + sizeof(PREFIX) - 1, \
+	       tpB * tp->cycles , 1e-9/tpB, \
+	       tp->devnum, (uint)(N*W/8), kcount, mindt, basetime ); \
+	fflush(stdout); \
+    } \
+    /* free host and device memory */ \
+    free(hC); \
+    CHECKCALL(cudaFree(dC)); \
+}
+
+#include "util_expandtpl.h"
+
+int main(int argc, char **argv)
+{
+    char *cp;
+    uint count = 0;
+    CUDAInfo *infop;
+    int keyctroffset = 0;
+    
+    progname = argv[0];
+    if (argc > 3|| (argv[1] && argv[1][0] == '-')) {
+	fprintf(stderr, "Usage: %s [COUNT [DEVICESTRING]]\n", progname);
+	exit(1);
+    }
+    if (argc  > 1)
+	count = atoi(argv[1]);
+    if ((cp = getenv("TIME_CUDA_VERBOSE")) != NULL) {
+	verbose = atoi(cp);
+    }
+    if ((cp = getenv("TIME_CUDA_DEBUG")) != NULL) {
+	debug = atoi(cp);
+    }
+    if ((cp = getenv("TIME_CUDA_OFFSET")) != NULL) {
+	keyctroffset = atoi(cp);
+    }
+    if ((cp = getenv("TIME_CUDA_NUMTRIALS")) != NULL) {
+        numtrials = atoi(cp);
+    }
+    if ((cp = getenv("TIME_CUDA_SEC_PER_TRIAL")) != NULL) {
+        sec_per_trial = atof(cp);
+    }
+    infop = cuda_init(argc > 2 ? argv[2] : NULL);
+    /* define macro to initialize and call the kernels */
+#   include "time_initkeyctr.h"
+    cuda_done(infop);
+    return 0;
+}
diff --git a/lib/Random123-1.08/examples/time_initkeyctr.h b/lib/Random123-1.08/examples/time_initkeyctr.h
new file mode 100644
index 0000000..8f0a7ba
--- /dev/null
+++ b/lib/Random123-1.08/examples/time_initkeyctr.h
@@ -0,0 +1,99 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef TIME_INITKEYCTR_H__
+#define TIME_INITKEYCTR_H__ 1
+
+#if TRY_OTHER
+static mrg1x32_ctr_t good_mrg1x32_1 = {{0x4b2cd7ee}};
+static mt1x32_ctr_t good_mt1x32_1 = {{0x39037a7d}};
+static mtsmall1x32_ctr_t good_mtsmall1x32_1 = {{0x7afd2a98}};
+static cmrg1x32_ctr_t good_cmrg1x32_1 = {{0x032b54e2}};
+static xorwow1x32_ctr_t good_xorwow1x32_1 = {{0xed1b6264}};
+#endif
+#if R123_USE_PHILOX_64BIT
+static philox2x64_ctr_t good_philox2x64_6 = {{R123_64BIT(0xdd40cdb81af968d2),R123_64BIT(0x0cb57d6d5f7b68dc)}};
+static philox2x64_ctr_t good_philox2x64_10 = {{R123_64BIT(0x539e5b3d18faf5da),R123_64BIT(0x838ca1328d07d3ba)}};
+static philox4x64_ctr_t good_philox4x64_7 = {{R123_64BIT(0xcf492074862957a2),R123_64BIT(0x7057627260938584),R123_64BIT(0x676e23214a14901d),R123_64BIT(0xefa2c5df3848e3fe)}};
+static philox4x64_ctr_t good_philox4x64_10 = {{R123_64BIT(0x1b64f56b381a5a89),R123_64BIT(0x940a282a8add45e1),R123_64BIT(0x53c936376ac7d5df),R123_64BIT(0x6147e87ec9bd9caa)}};
+#endif
+static philox4x32_ctr_t good_philox4x32_7 = {{0x40ba6a95,0x799e6a43,0x7dcabe10,0xa7a81636}};
+static philox4x32_ctr_t good_philox4x32_10 = {{0xf16d828e,0xa1c5962d,0xacac820c,0x58113d7a}};
+static threefry2x64_ctr_t good_threefry2x64_13 = {{R123_64BIT(0xdf0f096c179ad798),R123_64BIT(0x077862fbaa1a0d11)}};
+static threefry2x64_ctr_t good_threefry2x64_20 = {{R123_64BIT(0xb91153d59815d50e),R123_64BIT(0xdb0dd45e5b0eab81)}};
+static threefry4x64_ctr_t good_threefry4x64_12 = {{R123_64BIT(0x416d1802da0a4a0f),R123_64BIT(0xabd4d80749306281),R123_64BIT(0x62c6b120b542bff0),R123_64BIT(0xefb28dc80c6fc36c)}};
+static threefry4x64_ctr_t good_threefry4x64_20 = {{R123_64BIT(0xad8f0b8c18ed5187),R123_64BIT(0xd80146a6961e1880),R123_64BIT(0x7fce9d950d8acbc4),R123_64BIT(0x782948d5203519f1)}};
+static threefry4x32_ctr_t good_threefry4x32_12 = {{0xe461db1c,0xfdfa62a7,0x0b10cd2a,0xa3679758}};
+static threefry4x32_ctr_t good_threefry4x32_20 = {{0xf82cf576,0x162ca116,0x3afefe23,0x54cc64ac}};
+static threefry4x64_ctr_t good_threefry4x64_72 = {{R123_64BIT(0x73ff3f7a0b878f68),R123_64BIT(0x6668f6bbaba83f31),R123_64BIT(0x088eb85d40fbdb56),R123_64BIT(0xd1f39136adc96552)}};
+
+#if R123_USE_AES_NI
+static ars4x32_ctr_t good_ars4x32_5 = {{0x279f6b0b, 0xd0b1edf6, 0x6044b433, 0x66c06817}};
+static ars4x32_ctr_t good_ars4x32_7 = {{0xa9cd8055, 0x80272a47, 0x4b7ab914, 0x5351d78e}};
+static aesni4x32_ctr_t good_aesni4x32_10 = {{0x1e68c9fd, 0x347b0858, 0x503d8d91, 0x9e73460a}};
+#endif
+
+/*
+ * Initializes a ukey and counter to known values with a known
+ * offset and calls the test function with that ukey, ctr and a
+ * count and closure.  keyctroffset should be a variable
+ * initialized from the environment to avoid compiler
+ * optimization from known constants (after inlining).
+ */
+#define TEST_TPL(NAME, N, W, R) \
+if ((strncmp(#NAME, "aes", 3) == 0 || strncmp(#NAME, "ars", 3) == 0) && !haveAESNI()) { \
+    printf("AESNI not available on this hardware\n"); \
+} else { \
+    NAME##N##x##W##_ukey_t ukey={{0}};            \
+    NAME##N##x##W##_ctr_t ctr={{0}};            \
+    size_t xi; \
+    for (xi = 0; xi < sizeof(ukey)/sizeof(ukey.v[0]); xi++) { \
+	switch (xi) { \
+	    case 0: ukey.v[xi] = 0xdeadbeef+keyctroffset; break; \
+	    case 1: ukey.v[xi] = 0x12345678+keyctroffset; break; \
+	    case 2: ukey.v[xi] = 0xc0debad1+keyctroffset; break; \
+	    case 3: ukey.v[xi] = 0x31415926+keyctroffset; break; \
+	} \
+    } \
+    for (xi = 0; xi < N; xi++) { \
+	switch (xi) { \
+	    case 0: ctr.v[xi] = 0x00000000+keyctroffset; break; \
+	    case 1: ctr.v[xi] = 0x10000000+keyctroffset; break; \
+	    case 2: ctr.v[xi] = 0x20000000+keyctroffset; break; \
+	    case 3: ctr.v[xi] = 0x30000000+keyctroffset; break; \
+	} \
+    } \
+    NAME##N##x##W##_##R(ukey, ctr, good_##NAME##N##x##W##_##R, count, infop); \
+}
+
+#include "util_expandtpl.h"
+
+#endif /* TIME_INITKEYCTR_H__ */
diff --git a/lib/Random123-1.08/examples/time_misc.h b/lib/Random123-1.08/examples/time_misc.h
new file mode 100644
index 0000000..5ca0768
--- /dev/null
+++ b/lib/Random123-1.08/examples/time_misc.h
@@ -0,0 +1,53 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef TIME_MISC_H__
+#define TIME_MISC_H__ 1
+/* Miscellaneous common definitions for time_*.c */
+
+#if TRY_OTHER
+/*
+ * Compare with some other conventional RNGs for timing
+ * performance.  We do not distribute those RNGs or
+ * their timing code.
+ */
+# include "util_other.h"
+#endif
+
+const char *progname;
+int verbose = 0;
+int debug = 0;
+int numtrials = 5;
+double sec_per_trial = 0.2;
+
+#define PREFIX "test_"
+
+#endif /* TIME_MISC_H__ */
diff --git a/lib/Random123-1.08/examples/time_opencl.c b/lib/Random123-1.08/examples/time_opencl.c
new file mode 100644
index 0000000..939d0a0
--- /dev/null
+++ b/lib/Random123-1.08/examples/time_opencl.c
@@ -0,0 +1,199 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ * OpenCL test and timing harness for Random123 RNGs.  Uses macros
+ * and util_expandtpl.h to "templatize" over all the different
+ * permutations of RNGs and NxW and R.
+ */
+
+#define R123_USE_AES_NI	0 /* never use this for OpenCL */
+
+#include "util_opencl.h"
+
+#include "Random123/philox.h"
+#include "Random123/threefry.h"
+
+#include "time_misc.h"
+#include "util_print.h"
+
+#define TEST_TPL(NAME, N, W, R) \
+void NAME##N##x##W##_##R(NAME##N##x##W##_ukey_t ukey, NAME##N##x##W##_ctr_t ctr, NAME##N##x##W##_ctr_t kactr, uint count, UCLInfo *tp) \
+{ \
+    const char *kernelname = PREFIX #NAME #N "x" #W "_" #R; \
+    NAME##N##x##W##_ctr_t *hC; \
+    int n, niterations = numtrials; /* we make niterations + 2 (warmup, overhead) calls to the kernel */ \
+    int narg; \
+    double cur_time; \
+    size_t i; \
+    cl_int err; \
+    cl_mem dC; \
+    cl_kernel kern; \
+    \
+    /* create handle to kernel in program */ \
+    dprintf(("%s kernel\n", kernelname)); \
+    CHECKERR(kern = clCreateKernel(tp->prog, kernelname, &err)); \
+    const size_t nworkitems = tp->wgsize * tp->cores; \
+    const size_t szC = nworkitems*sizeof(hC[0]); \
+    /* allocate and initialize vector of counters in host memory */ \
+    CHECKNOTZERO(hC = (NAME##N##x##W##_ctr_t *) malloc(szC)); \
+    for (i = 0; i < nworkitems; i++) { \
+	int xi; \
+	for (xi = 0; xi < N; xi++) \
+	    hC[i].v[xi] = 0; \
+    } \
+    /* allocate vector of counters in device memory, initialize from current host memory */ \
+    CHECKERR(dC = clCreateBuffer(tp->ctx, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, szC, hC, &err)); \
+    /* see comment in time_random123.h for why this is cl_ulong */ \
+    cl_ulong kcount = 0;                                                    \
+    double basetime = 0., dt = 0., mindt = 0.; \
+    /* first two iterations are for warmup & baseline */ \
+    for (n = -2; n < niterations; n++) { \
+	if (n == -2) { \
+	    if (count == 0) { \
+		/* try to set a good guess for count */ \
+		count = (uint)(tp->cycles ? tp->cycles * 1e-8 : 10000); \
+		dprintf(("starting with count = %u\n", count)); \
+	    } \
+	    kcount = count; \
+	} else if (n == -1) { \
+	    /* use first iteration time to calibrate count to get approximately sec_per_trial */ \
+	    if (count > 1) { \
+		count = (uint)(count * sec_per_trial / dt); \
+		dprintf(("scaled count = %u\n", count)); \
+	    } \
+	    /* second iteration is to calculate overhead after warmup */ \
+	    kcount = 1; \
+	} else if (n == 0) { \
+	    int xj; \
+	    /* Check that we got the expected value */ \
+	    for (xj = 0; xj < N; xj++) { \
+		if (kactr.v[xj] != hC[0].v[xj]) { \
+		    printf("%s mismatch: xj = %d, expected\n", kernelname, xj); \
+		    printline_##NAME##N##x##W##_##R(ukey, ctr, &kactr, 1); \
+		    printf("    but got\n"); \
+		    printline_##NAME##N##x##W##_##R(ukey, ctr, hC, 1); \
+		    if(!debug) exit(1);                                 \
+                    else break;                                         \
+		} else { \
+		    dprintf(("%s matched word %d\n", kernelname, xj)); \
+		} \
+	    } \
+	    basetime = dt; \
+	    if (debug||verbose) { \
+		dprintf(("%s %.3f secs for %lu workitems test on device %s\n", \
+		       kernelname, basetime, (unsigned long) nworkitems, \
+		       tp->devname)); \
+		printline_##NAME##N##x##W##_##R(ukey, ctr, hC, (verbose < 2) ? 1 : nworkitems); \
+	    } \
+	    kcount = count + 1; \
+	} \
+	(void)timer(&cur_time); \
+	dprintf(("setup arguments to kernel function %s\n", kernelname)); \
+	narg = 0; \
+	CHECK(clSetKernelArg(kern, narg, sizeof(kcount), (void *)&kcount)); \
+	narg++; \
+	CHECK(clSetKernelArg(kern, narg, sizeof(ukey), (void *)&ukey)); \
+	narg++; \
+	CHECK(clSetKernelArg(kern, narg, sizeof(ctr), (void *)&ctr)); \
+	narg++; \
+	CHECK(clSetKernelArg(kern, narg, sizeof(cl_mem), (void *)&dC)); \
+	dprintf(("queue kernel for execution on device %s\n", tp->devname)); \
+	CHECK(clEnqueueNDRangeKernel(tp->cmdq, kern, 1, 0, &nworkitems, &tp->wgsize, 0, 0, 0)); \
+	CHECK(clFlush(tp->cmdq)); \
+	dprintf(("copy results from device memory to host memory\n")); \
+	CHECK(clEnqueueReadBuffer(tp->cmdq, dC, CL_FALSE, 0, szC, hC, 0, 0, 0)); \
+	CHECK(clFlush(tp->cmdq)); \
+	dprintf(("synchronize\n")); \
+	CHECK(clFinish(tp->cmdq)); \
+	dt = timer(&cur_time); \
+	dprintf(("iteration %d took %.3f secs\n", n, dt)); \
+	ALLZEROS(hC, nworkitems, N); \
+	if (n == 0 || dt < mindt) mindt = dt; \
+    } \
+    if (count > 1) { \
+	double tpB = (mindt - basetime) / ( (count - 1.) * nworkitems * (N * W / 8.) ); \
+	printf("%-17s %#5.3g cpB, %#5.3g GB/s %u B granularity (best %u in %.3f s - %.6f s)\n", \
+	       kernelname + sizeof(PREFIX) - 1, \
+	       tpB * tp->cycles , 1e-9/tpB, \
+	       (uint)(N*W/8), count, mindt, basetime ); \
+	fflush(stdout); \
+    } \
+    /* free host and device memory */ \
+    free(hC); \
+    CHECK(clReleaseMemObject(dC)); \
+    /* free the kernel */ \
+    CHECK(clReleaseKernel(kern)); \
+}
+
+#include "util_expandtpl.h"
+
+/* Include the preprocessed source code, stashed in a literal string */
+#include "time_opencl_kernel.i"
+
+int main(int argc, char **argv)
+{
+    const char *cp;
+    uint count = 0;
+    UCLInfo *infop;
+    int keyctroffset = 0;
+    
+    progname = argv[0];
+    if (argc > 3|| (argv[1] && argv[1][0] == '-')) {
+	fprintf(stderr, "Usage: %s [COUNT [DEVICESTRING]]\n", progname);
+	exit(1);
+    }
+    if (argc  > 1)
+	count = atoi(argv[1]);
+    if ((cp = getenv("TIME_OPENCL_VERBOSE")) != NULL) {
+	verbose = atoi(cp);
+    }
+    if ((cp = getenv("TIME_OPENCL_DEBUG")) != NULL) {
+	debug = atoi(cp);
+    }
+    if ((cp = getenv("TIME_OPENCL_OFFSET")) != NULL) {
+	keyctroffset = atoi(cp);
+    }
+    if ((cp = getenv("TIME_OPENCL_NUMTRIALS")) != NULL) {
+        numtrials = atoi(cp);
+    }
+    if ((cp = getenv("TIME_OPENCL_SEC_PER_TRIAL")) != NULL) {
+        sec_per_trial = atof(cp);
+    }
+    if ((cp = getenv("TIME_OPENCL_BUILD_OPTIONS")) == NULL) {
+	cp = "";
+    }
+    infop = opencl_init(argc > 2 ? argv[2] : NULL, opencl_src, cp);
+    /* define macro to initialize and call the kernels */
+#   include "time_initkeyctr.h"
+    opencl_done(infop);
+    return 0;
+}
diff --git a/lib/Random123-1.08/examples/time_opencl_kernel.ocl b/lib/Random123-1.08/examples/time_opencl_kernel.ocl
new file mode 100644
index 0000000..dda7728
--- /dev/null
+++ b/lib/Random123-1.08/examples/time_opencl_kernel.ocl
@@ -0,0 +1,35 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __OPENCL_VERSION__
+#define __OPENCL_VERSION__ 1
+#endif
+#include "time_random123.h"
diff --git a/lib/Random123-1.08/examples/time_random123.h b/lib/Random123-1.08/examples/time_random123.h
new file mode 100644
index 0000000..2457494
--- /dev/null
+++ b/lib/Random123-1.08/examples/time_random123.h
@@ -0,0 +1,135 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef TIME_RANDOM123_H__
+#define TIME_RANDOM123_H__ 1
+
+/*
+ * This file contains the performance timing kernels for Random123
+ * RNGs and a few conventional PRNGs, which have been hacked into
+ * this framework.  This code should NOT be considered as an
+ * example of using PRNGs.  A few macros try to keep it
+ * cross-platform across C (serial or threads), CUDA and OpenCL.
+ * The TEST_TPL + include util_expandtpl trick is used to
+ * template-generate kernels for all the different RNGs across
+ * NxW.
+ */
+
+#include <Random123/philox.h>
+#include <Random123/threefry.h>
+
+#ifdef __OPENCL_VERSION__
+#define KERNEL __kernel
+#define MEMTYPE __global
+#endif
+
+#ifndef KERNEL
+#define KERNEL
+#endif
+
+#ifndef MEMTYPE
+#define MEMTYPE
+#endif
+
+/* LOOK_AT forces the compiler to actually produce the code that
+   computes the elements of A.  Without it, optimizing compilers can
+   elide some or all of the computation of A (i.e., the RNG we're
+   trying to get timings for).  There are many ways to do this.  A
+   perhaps more natural way would be to keep a running sum of all the
+   results so far, but we found that gcc 4.5 and 4.6 could unroll that
+   code into a fully SSE-ized loop, which appears to be
+   unrepresentative of the kinds of optimizations that are possible in
+   practice.  I.e., we could not find any "real" use of the output of
+   the RNG that permitted SSE-ization of the RNG. */
+#define LOOK_AT(A, I, N) do{                                            \
+    if (N==4) if(R123_BUILTIN_EXPECT(!(A.v[N>2?3:0]^A.v[N>2?2:0]^A.v[N>1?1:0]^A.v[0]), 0)) ++I; \
+    if (N==2) if(R123_BUILTIN_EXPECT(!(A.v[N>1?1:0]^A.v[0]), 0)) ++I;   \
+    if (N==1) if(R123_BUILTIN_EXPECT(!(A.v[0]), 0)) ++I;                \
+    }while(0)
+
+
+/* Macro that will expand later into all the Random123 PRNGs for NxW_R */
+/* Note that making the first argument uint seems to expose some
+   argument marshalling bugs in version 2.4 of the AMDAPPSDK.  Passing
+   a 64-bit (ulong) seems to fix things, but since we know the value
+   fits in 32 bits, we assign it to a 32-bit (uint) to reduce loop
+   overhead.
+*/
+#define TEST_TPL(NAME, N, W, R)                                         \
+KERNEL void test_##NAME##N##x##W##_##R(uint64_t n64, NAME##N##x##W##_ukey_t uk, NAME##N##x##W##_ctr_t ctrinit, MEMTYPE NAME##N##x##W##_ctr_t *ctr) \
+{                                                                       \
+    uint n = (uint)n64;                                                 \
+    unsigned tid = get_global_id(0);                                    \
+    uint i;                                                             \
+    NAME##N##x##W##_ctr_t c, v={{0}};                                   \
+    NAME##N##x##W##_key_t k=NAME##N##x##W##keyinit(uk);                 \
+    c = ctrinit;                                                        \
+    if( R == NAME##N##x##W##_rounds ){                                  \
+        for (i = 0; i < n; ++i) {                                       \
+	    v = NAME##N##x##W(c, k);                                    \
+	    LOOK_AT(v, i, N);                                           \
+            c.v[0]++;                                                   \
+        }                                                               \
+    }else {                                                             \
+        for (i = 0; i < n; ++i) {                                       \
+            v = NAME##N##x##W##_R(R, c, k);                             \
+	    LOOK_AT(v, i, N);                                           \
+            c.v[0]++;                                                   \
+        }                                                               \
+    }                                                                   \
+    ctr[tid] = v;                                                       \
+}
+
+/*
+ * Hackery to time GSL and XORWOW in the same framework, they can
+ * be made to look somewhat like Random123, but not with TEST_TPL
+ * above, so we undefine TRY_OTHER before including
+ * util_expandtpl.  Ugh.
+ */
+#if TRY_OTHER
+# include "time_other.h"
+# define RESTORE_OTHER 1
+#endif
+
+/* Now expand TEST_TPL for all the relevant RNGs */
+#include "util_expandtpl.h"
+
+/*
+ * Now restore TRY_OTHER if needed to that subsequent
+ * expandtpl (e.g. for time_keyctrinit) will work.
+ */
+#if RESTORE_OTHER
+# undef TRY_OTHER
+# define TRY_OTHER 1
+# undef RESTORE_OTHER
+#endif
+
+#endif /* TIME_RANDOM123_H__ */
diff --git a/lib/Random123-1.08/examples/time_serial.c b/lib/Random123-1.08/examples/time_serial.c
new file mode 100644
index 0000000..523cdce
--- /dev/null
+++ b/lib/Random123-1.08/examples/time_serial.c
@@ -0,0 +1,154 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ * Single-core CPU test and timing harness for Random123 RNGs.
+ * Uses macros and util_expandtpl.h to "templatize" over all the
+ * different permutations of RNGs and NxW and R.
+ */
+#include "util.h"
+
+#include "Random123/philox.h"
+#include "Random123/threefry.h"
+#include "Random123/ars.h"
+#include "Random123/aes.h"
+
+#include "time_misc.h"
+#include "util_print.h"
+
+#include "util_cpu.h"
+#define KERNEL R123_STATIC_INLINE
+#define get_global_id(i)    (i)
+#include "time_random123.h"
+
+#define TEST_TPL(NAME, N, W, R) \
+void NAME##N##x##W##_##R(NAME##N##x##W##_ukey_t ukey, NAME##N##x##W##_ctr_t ctr, NAME##N##x##W##_ctr_t kactr, uint count, CPUInfo *tp) \
+{ \
+    const char *kernelname = #NAME #N "x" #W "_" #R; \
+    double cur_time; \
+    int n, niterations = numtrials; /* we make niterations + 2 (warmup, overhead) calls to the kernel */ \
+    uint kcount = 0; \
+    double basetime = 0., dt = 0., mindt = 0.; \
+    NAME##N##x##W##_ctr_t C, *hC = &C; \
+    \
+    for (n = -2; n < niterations; n++) { \
+	if (n == -2) { \
+	    if (count == 0) { \
+		/* try to set a good guess for count */ \
+		count = (uint)(tp->hz ? tp->hz * 1e-5 : 100000); \
+		dprintf(("starting with count = %u\n", count)); \
+	    } \
+	    kcount = count; \
+	} else if (n == -1) { \
+	    /* use first iteration time to calibrate count to get approximately sec_per_trial */ \
+	    if (count > 1) { \
+		count = (uint)(count * sec_per_trial / dt); \
+		dprintf(("scaled count = %u\n", count)); \
+	    } \
+	    /* second iteration is to calculate overhead after warmup */ \
+	    kcount = 1; \
+	} else if (n == 0) { \
+	    int xj; \
+	    /* Check that we got the expected value */ \
+	    for (xj = 0; xj < N; xj++) { \
+		if (kactr.v[xj] != hC[0].v[xj]) { \
+		    printf("%s mismatch: xj = %d, expected\n", kernelname, xj); \
+		    printline_##NAME##N##x##W##_##R(ukey, ctr, &kactr, 1); \
+		    printf("    but got\n"); \
+		    printline_##NAME##N##x##W##_##R(ukey, ctr, hC, 1); \
+		    if(!debug) exit(1);                                 \
+                    else break;                                         \
+		} else { \
+		    dprintf(("%s matched word %d\n", kernelname, xj)); \
+		} \
+	    } \
+	    basetime = dt; \
+	    if (debug||verbose) { \
+		dprintf(("%s %.3f secs\n", kernelname, basetime)); \
+		printline_##NAME##N##x##W##_##R(ukey, ctr, hC, 1); \
+	    } \
+	    kcount = count + 1; \
+	} \
+	dprintf(("call function %s\n", kernelname)); \
+	(void)timer(&cur_time); \
+	test_##NAME##N##x##W##_##R(kcount, ukey, ctr, hC); \
+	dt = timer(&cur_time); \
+	dprintf(("iteration %d took %.3f secs\n", n, dt)); \
+	ALLZEROS(hC, 1, N); \
+	if (n == 0 || dt < mindt) mindt = dt; \
+    } \
+    if (count > 1) { \
+	double tpB = (mindt - basetime) / ( (kcount - 1.) * (N * W / 8.) ); \
+	printf("%-17s %#5.3g cpB %#5.3g GB/s %u B granularity (best %u in %.3f s - %.6f s)\n", \
+	       kernelname, tpB * tp->hz, 1e-9/tpB, \
+	       (uint)(N*W/8), kcount, mindt, basetime ); \
+	fflush(stdout); \
+    } \
+}
+
+#include "util_expandtpl.h"
+
+int main(int argc, char **argv)
+{
+    char *cp;
+    uint count = 0;
+    CPUInfo *infop;
+    int keyctroffset = 0;
+    
+    progname = argv[0];
+    if (argc > 3|| (argv[1] && argv[1][0] == '-')) {
+	fprintf(stderr, "Usage: %s [COUNT]]\n", progname);
+	exit(1);
+    }
+    if (argc > 1)
+	count = atoi(argv[1]);
+    if ((cp = getenv("TIME_SERIAL_VERBOSE")) != NULL) {
+	verbose = atoi(cp);
+    }
+    if ((cp = getenv("TIME_SERIAL_DEBUG")) != NULL) {
+	debug = atoi(cp);
+    }
+    if ((cp = getenv("TIME_SERIAL_OFFSET")) != NULL) {
+	keyctroffset = atoi(cp);
+    }
+    if ((cp = getenv("TIME_SERIAL_NUMTRIALS")) != NULL) {
+        numtrials = atoi(cp);
+    }
+    if ((cp = getenv("TIME_SERIAL_SEC_PER_TRIAL")) != NULL) {
+        sec_per_trial = atof(cp);
+    }
+    infop = cpu_init("1"); /* This is time_serial.c.  Use only one core. */
+    {
+#   include "time_initkeyctr.h"
+    cpu_done(infop);
+    }
+    return 0;
+}
diff --git a/lib/Random123-1.08/examples/time_thread.c b/lib/Random123-1.08/examples/time_thread.c
new file mode 100644
index 0000000..2159fe2
--- /dev/null
+++ b/lib/Random123-1.08/examples/time_thread.c
@@ -0,0 +1,240 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ * Pthreads test and timing harness for Random123 RNGs.
+ * Uses macros and util_expandtpl.h to "templatize" over all the
+ * different permutations of RNGs and NxW and R.
+ */
+
+#include "util.h"
+#include <sys/stat.h>
+
+#include "Random123/philox.h"
+#include "Random123/threefry.h"
+#include "Random123/ars.h"
+#include "Random123/aes.h"
+
+#include "time_misc.h"
+#include "util_print.h"
+#include "util_cpu.h"
+#include <pthread.h>
+
+/*
+ * Main thread initializes thread_info[i].started to zero, .tid to its own
+ * pthread_self() as a placeholder.
+ * Child #i sets thread_info[i].tid to pthread_self() and then
+ * sets .started.  Only child #i ever writes to thread_info[i], and
+ * does so only once.  So searching through thread_info is race-free
+ * for get_global_id, since it only ever looking for its own pthread_self
+ * anyway.  The write to started needs to be atomic.
+ * This is all so that we can use the same kernel as OpenCL/CUDA.
+ * Note that parent keeps its own copy of thread ids returned
+ * by pthread_create in tids[] to avoid any races with thread_info.
+ */
+typedef struct {
+    int started; /* started == 1 means tid contains pthread_self() of thread */
+    pthread_t tid;
+} ThreadInfo;
+static volatile ThreadInfo *thread_info; /* thread_id state, one per thread */ \
+static int thread_count;
+
+/* Linear search should be fast enough for small thread count... */
+R123_STATIC_INLINE int get_global_id(int x)
+{
+    int i;
+    pthread_t me = pthread_self();
+    (void)x; /* why is this an arg? */
+    for (i = 0; i < thread_count; i++) {
+	if (thread_info[i].started && pthread_equal(me, thread_info[i].tid))
+	    return i;
+    }
+    fprintf(stderr, "could not find thread %lu\n", (unsigned long) me);
+    pthread_exit(NULL);
+}
+
+#define KERNEL R123_STATIC_INLINE
+#include "time_random123.h"
+
+#define TEST_TPL(NAME, N, W, R) \
+typedef struct { \
+    uint kcount; \
+    NAME##N##x##W##_ukey_t ukey; \
+    NAME##N##x##W##_ctr_t ctr; \
+    NAME##N##x##W##_ctr_t *octrs; \
+} ThreadData_##NAME##N##x##W##_##R; \
+\
+typedef struct { \
+    ThreadData_##NAME##N##x##W##_##R *tp; \
+    volatile ThreadInfo *tip; \
+} ThreadArg_##NAME##N##x##W##_##R; \
+\
+/* thread_run is launched in a new thread by pthread_create */ \
+void *thread_run_##NAME##N##x##W##_##R(void *p) \
+{ \
+    ThreadArg_##NAME##N##x##W##_##R *ta = p; \
+    ThreadData_##NAME##N##x##W##_##R *tp = ta->tp; \
+    volatile ThreadInfo *tip = ta->tip; \
+    /* store our thread id for use by get_global_info */ \
+    tip->tid = pthread_self(); \
+    tip->started = 1; \
+    test_##NAME##N##x##W##_##R(tp->kcount, tp->ukey, tp->ctr, tp->octrs); \
+    return tp; \
+}\
+void NAME##N##x##W##_##R(NAME##N##x##W##_ukey_t ukey, NAME##N##x##W##_ctr_t ctr, NAME##N##x##W##_ctr_t kactr, uint count, CPUInfo *tp) \
+{ \
+    const char *kernelname = #NAME #N "x" #W "_" #R; \
+    double cur_time; \
+    int i, n, niterations = numtrials; /* we make niterations + 2 (warmup, overhead) calls to the kernel */ \
+    double basetime = 0., dt = 0., mindt = 0.; \
+    ThreadData_##NAME##N##x##W##_##R td; /* same for all threads */ \
+    ThreadArg_##NAME##N##x##W##_##R *tap; /* args for thread_run, 1 per thread */ \
+    pthread_t me = pthread_self(); /* parent thread id */ \
+    pthread_t *tids; /* array of child thread ids */ \
+    void *vp; /* return from join */ \
+    CHECKNOTZERO(thread_info = (ThreadInfo *) malloc(sizeof(thread_info[0])*tp->ncores)); \
+    CHECKNOTZERO(tap = (ThreadArg_##NAME##N##x##W##_##R *) malloc(sizeof(tap[0])*tp->ncores)); \
+    CHECKNOTZERO(tids = (pthread_t *) malloc(sizeof(tids[0])*tp->ncores)); \
+    for (i = 0; i < tp->ncores; i++) { \
+	thread_info[i].started = 0; \
+	thread_info[i].tid = me; \
+	tap[i].tip = &thread_info[i]; \
+	tap[i].tp = &td; \
+    } \
+    thread_count = tp->ncores; \
+    CHECKNOTZERO(td.octrs = (NAME##N##x##W##_ctr_t *) malloc(sizeof(td.octrs[0])*tp->ncores)); \
+    td.ukey = ukey; \
+    td.ctr = ctr; \
+    td.kcount = 0; \
+    for (n = -2; n < niterations; n++) { \
+	if (n == -2) { \
+	    if (count == 0) { \
+		/* try to set a good guess for count */ \
+		count = (uint)(tp->hz ? tp->hz * 1e-3 : 100000); \
+		dprintf(("starting with count = %u\n", count)); \
+	    } \
+	    td.kcount = count; \
+	} else if (n == -1) { \
+	    /* use first iteration time to calibrate count to get approximately sec_per_trial */ \
+	    if (count > 1) { \
+		count = (uint)(count * sec_per_trial / dt); \
+		dprintf(("scaled count = %u\n", count)); \
+	    } \
+	    /* second iteration is to calculate overhead after warmup */ \
+	    td.kcount = 1; \
+	} else if (n == 0) { \
+	    int xj; \
+	    /* Check that we got the expected value */ \
+	    for (xj = 0; xj < N; xj++) { \
+		if (kactr.v[xj] != td.octrs[0].v[xj]) { \
+		    printf("%s mismatch: xj = %d, expected\n", kernelname, xj); \
+		    printline_##NAME##N##x##W##_##R(ukey, ctr, &kactr, 1); \
+		    printf("    but got\n"); \
+		    printline_##NAME##N##x##W##_##R(ukey, ctr, td.octrs, 1); \
+                    if(!debug) exit(1);                                 \
+                    else break;                                         \
+		} else { \
+		    dprintf(("%s matched word %d\n", kernelname, xj)); \
+		} \
+	    } \
+	    basetime = dt; \
+	    if (verbose) { \
+		dprintf(("%s %.3f secs\n", kernelname, basetime)); \
+		printline_##NAME##N##x##W##_##R(ukey, ctr, td.octrs, tp->ncores); \
+	    } \
+	    td.kcount = count + 1; \
+	} \
+	dprintf(("call function %s\n", kernelname)); \
+	(void)timer(&cur_time); \
+	for (i = 0; i < tp->ncores; i++) { \
+	    CHECKZERO(pthread_create(&tids[i], NULL, thread_run_##NAME##N##x##W##_##R, &tap[i])); \
+	    dprintf(("thread %d started\n", i)); \
+	} \
+	for (i = 0; i < thread_count; i++) { \
+	    CHECKZERO(pthread_join(tids[i], &vp)); \
+	    dprintf(("thread %d done\n", i)); \
+	} \
+	dt = timer(&cur_time); \
+	dprintf(("iteration %d took %.3f secs\n", n, dt)); \
+	ALLZEROS(td.octrs, tp->ncores, N); \
+	if (n == 0 || dt < mindt) mindt = dt; \
+    } \
+    if (count > 1) { \
+	double tpB = (mindt - basetime) / ( (td.kcount - 1.) * tp->ncores * (N * W / 8.) ); \
+	printf("%-17s %#5.3g cpB %#5.3g GB/s %u B granularity (best %u in %.3f s - %.6f s)\n", \
+	       kernelname, tpB * tp->hz * tp->ncores, 1e-9/tpB, \
+	       (uint)(N*W/8), td.kcount, mindt, basetime ); \
+	fflush(stdout); \
+    } \
+    thread_count = 0; \
+    free((void *) thread_info); \
+    thread_info = NULL; \
+    free(td.octrs); \
+    free(tap); \
+    free(tids); \
+}
+
+#include "util_expandtpl.h"
+
+int main(int argc, char **argv)
+{
+    char *cp;
+    uint count = 0;
+    CPUInfo *infop;
+    int keyctroffset = 0;
+    
+    progname = argv[0];
+    if (argc > 3|| (argv[1] && argv[1][0] == '-')) {
+	fprintf(stderr, "Usage: %s [COUNT [NCORES]]\n", progname);
+	exit(1);
+    }
+    if (argc > 1)
+	count = atoi(argv[1]);
+    if ((cp = getenv("TIME_THREAD_VERBOSE")) != NULL) {
+	verbose = atoi(cp);
+    }
+    if ((cp = getenv("TIME_THREAD_DEBUG")) != NULL) {
+	debug = atoi(cp);
+    }
+    if ((cp = getenv("TIME_THREAD_OFFSET")) != NULL) {
+	keyctroffset = atoi(cp);
+    }
+    if ((cp = getenv("TIME_THREAD_NUMTRIALS")) != NULL) {
+        numtrials = atoi(cp);
+    }
+    if ((cp = getenv("TIME_THREAD_SEC_PER_TRIAL")) != NULL) {
+        sec_per_trial = atof(cp);
+    }
+    infop = cpu_init(argc > 2 ? argv[2] : NULL);
+#   include "time_initkeyctr.h"
+    cpu_done(infop);
+    return 0;
+}
diff --git a/lib/Random123-1.08/examples/timers.cpp b/lib/Random123-1.08/examples/timers.cpp
new file mode 100644
index 0000000..9150613
--- /dev/null
+++ b/lib/Random123-1.08/examples/timers.cpp
@@ -0,0 +1,238 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include "util.h"
+
+#include <Random123/philox.h>
+#include <Random123/threefry.h>
+#include <Random123/aes.h>
+#include <Random123/ars.h>
+#include <cstdio>
+#include <cmath>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <cstring>
+#if R123_USE_X86INTRIN_H
+#include <x86intrin.h>
+#endif
+#include "util_demangle.hpp"
+#include "util_cpu.h"
+
+using namespace r123;
+
+const char *progname;
+int debug = 0;
+
+using namespace std;
+
+namespace{
+    template <typename B> void timer();
+} // namespace <anon>
+
+int main(int argc, char **argv){
+    progname = argv[0];
+    debug = 0;
+#if R123_USE_AES_NI
+    if( argc == 1 || strcmp(argv[1], "ARS")==0 ){
+    if(haveAESNI()){
+        timer<ARS1xm128i_R<5> >();
+        timer<ARS4x32_R<5> >();
+        timer<ARS1xm128i_R<7> >();
+        timer<ARS4x32_R<7> >();
+        timer<ARS1xm128i_R<10> >();
+        timer<AESNI1xm128i >();
+    }else{
+        cout << "Skipping Bijections that use AES-NI instructions that are not available on this platform\n";
+    } 
+    }
+#else
+    cout << "This binary is not compiled with AES-NI support.  Skipping the ARS bijections\n";
+#endif // R123_USE_AES_NI
+
+    if( argc == 1 || strcmp(argv[1], "AES")==0 ){
+#if R123_USE_AES_OPENSSL
+    cout << "\n";
+    timer<AESOpenSSL16x8>();
+#endif
+    }
+
+    if( argc == 1 || strcmp(argv[1], "Threefry2x64")==0 ){
+    cout << "\n";
+    timer<Threefry2x64_R<13> >();
+    timer<Threefry2x64_R<20> >();
+    timer<Threefry2x64 >();
+    }
+
+    if( argc == 1 || strcmp(argv[1], "Threefry4x32")==0 ) {
+    cout << "\n";
+    timer<Threefry4x32_R<12> >();
+    timer<Threefry4x32_R<20> >();
+    timer<Threefry4x32 >();
+    }
+
+    if( argc == 1 || strcmp(argv[1], "Threefry4x64")==0 ){
+    cout << "\n";
+    timer<Threefry4x64_R<12> >();
+    timer<Threefry4x64_R<20> >();
+    timer<Threefry4x64 >();
+    timer<Threefry4x64_R<72> >();
+    }
+
+#if R123_USE_PHILOX_64BIT
+    if( argc == 1 || strcmp(argv[1], "Philox2x64") == 0 ){
+    cout << "\n";
+    timer<Philox2x64_R<6> >();
+    timer<Philox2x64_R<10> >();
+    }
+
+    if( argc == 1 || strcmp(argv[1], "Philox4x64") == 0 ){
+    cout << "\n";
+    timer<Philox4x64_R<7> >();
+    timer<Philox4x64_R<10> >();
+    }
+#else
+    cout << "\n64x64->128bit multiplication is not implmented.  Skipping Philox-Nx64 bijections\n";
+#endif
+
+    if( argc == 1 || strcmp(argv[1], "Philox4x32") == 0 ){
+    cout << "\n";
+    timer<Philox4x32_R<7> >();
+    timer<Philox4x32_R<10> >();
+    }
+
+    return 0;
+}
+
+    
+namespace{
+
+// To prevent the compiler from noticing that the result of the
+// bijection is never used and eliding the entire calculation, we
+// accumulate the output of millions of calls to the bijection.  All
+// the ctr_types are sufficiently container-like that we can just
+// loop over the contents, doing += on each value_type
+template <typename CtrType>
+CtrType& operator+=(CtrType& lhs, CtrType rhs){ 
+    typename CtrType::const_iterator rp = rhs.cbegin();
+    for(typename CtrType::iterator lp=lhs.begin(); lp!=lhs.end(); ++lp)
+            *lp ^= *rp++;
+        return lhs; 
+}
+
+// We've accumulated it, but we still have to use it.  A non-zero
+// test serves the purpose:
+template <typename CtrType>
+bool nz(const CtrType v){
+    for(typename CtrType::const_iterator vp=v.cbegin(); vp!=v.cend(); ++vp)
+        if( *vp ) return true;
+    return false;
+}
+
+#if R123_USE_AES_NI
+// The "obvious" solution for ctr_types whose value_type doesn't
+// have += defined (e.g., m128i) would be to overload += on the
+// value_type.  But we can't do that in gcc because m128i is typedefed
+// to a fancy compiler-specific builtin type, and you can only overload
+// += on classes and enums.  So instead we specialize += on the
+// array instead of on the value_type:
+template<> 
+r123array1xm128i& operator+=(r123array1xm128i& lhs, r123array1xm128i rhs){
+    typedef r123array1xm128i CtrType;
+    CtrType::const_iterator rp = rhs.cbegin();
+    for(CtrType::iterator lp=lhs.begin(); lp!=lhs.end(); ++lp)
+        lp->m = _mm_xor_si128(*lp, *rp++);
+    return lhs;
+}
+#endif
+
+template <typename B>
+void timer(){
+    typedef typename B::ctr_type ctr_type;
+    ctr_type sum = {{}};
+    uint_fast64_t N = 1000000;    // First try only a few thousand...
+    B b;
+    int bytes_per_call = sizeof(ctr_type);
+    cout << demangle(b) << ": gran: " << bytes_per_call;
+
+    ctr_type c0 = {{}};
+    const char *envp;
+    if((envp = getenv("TIMERS_COUNTER"))){
+        std::istringstream iss((std::string(envp)));
+        iss >> c0;
+    }
+     
+    typename B::ukey_type uk = {{}};
+    if( (envp = getenv("TIMERS_KEY"))){
+        std::istringstream iss((std::string(envp)));
+        iss >> uk;
+    }
+    typename B::key_type k(uk);
+   
+    ctr_type c = c0;
+    double clk;
+    ::timer(&clk);
+    for(uint_fast64_t i=0; i<N; ++i){
+        c.incr();
+        sum += b(c, k);
+    }
+    double dur = ::timer(&clk);
+    double clockspeed = clockspeedHz(0, 0);
+
+    double bestrate = 0.;
+    double bestdur = 0.;
+    uint_fast64_t bestN = 0;
+    for(size_t t=0; t<5; ++t){
+        ctr_type c = c0;
+        N = (uint_fast64_t)(N*(0.1/dur));
+        ::timer(&clk);
+        for(uint_fast64_t i=0; i<N; ++i){
+            c.incr();
+            sum += b(c, k);
+        }
+        dur = ::timer(&clk);
+        double rate = N*bytes_per_call/dur;
+        if( rate > bestrate ){
+            bestrate = rate;
+            bestN = N;
+            bestdur = dur;
+        }
+    }
+    cout << " (best of 5) " << bestN << " bijections in " << bestdur << " sec. rate: " << bestrate*1.e-9 << "GB/s  cpB: " << clockspeed/bestrate << endl;
+        
+    if(!nz(sum))
+        cout << "Don't let the compiler optimize it all away... sum==0.  That's a surprise!\n";
+}
+
+} // namespace <anonymous>
+
+
diff --git a/lib/Random123-1.08/examples/u01fixedpt.h b/lib/Random123-1.08/examples/u01fixedpt.h
new file mode 100644
index 0000000..62510ab
--- /dev/null
+++ b/lib/Random123-1.08/examples/u01fixedpt.h
@@ -0,0 +1,197 @@
+/*
+Copyright 2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef _random123_ufixed01_dot_h_
+#define _random123_ufixed01_dot_h_
+
+#include "features/compilerfeatures.h"
+
+/** @defgroup u01fixedpt_closed_open_W_M The u01fixedpt conversion functions
+
+    These functions convert unsigned W-bit integers to uniformly
+    spaced real values (float or double) between 0.0 and 1.0 with
+    mantissas of M bits.
+
+    PLEASE THINK CAREFULLY BEFORE USING THESE FUNCTIONS.  THEY MAY
+    NOT BE WHAT YOU WANT.  YOU MAY BE MUCH BETTER SERVED BY THE
+    FUNCTIONS IN ./uniform.hpp.
+
+    These functions produce a finite number *uniformly spaced* values
+    in the range from 0.0 to 1.0 with uniform probability.  The price
+    of uniform spacing is that they may not utilize the entire space
+    of possible outputs.  E.g., u01fixedpt_closed_open_32_24 will never
+    produce a non-zero value less than 2^-24, even though such values
+    are representable in single-precision floating point.
+
+    There are 12 functions, corresponding to the following choices:
+
+     -  W = 32 or 64
+     -  M = 24 or 53 (float or double)
+     -  open0 or closed0 : whether the output is open or closed at 0.0
+     -  open1 or closed1 : whether the output is open or closed at 1.0 
+
+    The W=64 M=24 cases are not implemented.  To obtain an M=24 float
+    from a uint64_t, use a cast (possibly with right-shift and bitwise
+    and) to convert some of the bits of the uint64_t to a uint32_t and
+    then use u01fixedpt_x_y_32_24.  Note that the 64-bit random integers
+    produced by the Random123 library are random in "all the bits", so
+    with a little extra effort you can obtain two floats this way --
+    one from the high bits and one from the low bits of the 64-bit
+    value.
+
+    If the output is open at one end, then the extreme
+    value (0.0 or 1.0) will never be returned.  Conversely, if the output
+    is closed at one end, then the extreme value is a possible
+    return value.
+
+    The values returned are as follows.  All values are returned
+    with equal frequency, except as noted in the closed_closed case:
+
+     closed_open:  Let P=min(M,W)
+        there are 2^P possible output values:
+        {0, 1, 2, ..., 2^P-1}/2^P
+
+     open_closed:  Let P=min(M,W)
+        there are 2^P possible values:
+        {1, 2, ..., 2^P}/2^P
+
+     open_open:   Let P=min(M, W+1) 
+        there are 2^(P-1) possible values:
+        {1, 3, 5, ..., 2^P-1}/2^P
+
+     closed_closed:  Let P=min(M, W-1)
+        there are 1+2^P possible values:
+        {0, 1, 2, ... 2^P}/2^P
+        The extreme values (0.0 and 1.0) are
+        returned with half the frequency of
+        all others.
+    
+    On x86 hardware, especially on 32bit machines, the use of
+    internal 80bit x87-style floating point may result in
+    'bonus' precision, which may cause closed intervals to not
+    be really closed, i.e. the conversions below might not
+    convert UINT{32,64}_MAX to 1.0.  This sort of issue is
+    likely to occur when storing the output of a u01fixedpt_*_32_24
+    function in a double, though one can imagine getting extra
+    precision artifacts when going from 64_53 as well.  Other
+    artifacts may exist on some GPU hardware.  The tests in
+    kat_u01_main.h try to expose such issues, but caveat emptor.
+
+    @{
+    @cond HIDDEN_FROM_DOXYGEN
+ */
+
+/* Hex floats were standardized by C in 1999, but weren't standardized
+   by C++ until 2011.  So, we're obliged to write out our constants in
+   decimal, even though they're most naturally expressed in binary.
+   We cross our fingers and hope that the compiler does the compile-time
+   constant arithmetic properly.
+*/
+#define R123_0x1p_31f (1.f/(1024.f*1024.f*1024.f*2.f))
+#define R123_0x1p_24f (128.f*R123_0x1p_31f)
+#define R123_0x1p_23f (256.f*R123_0x1p_31f)
+#define R123_0x1p_32  (1./(1024.*1024.*1024.*4.))
+#define R123_0x1p_63 (2.*R123_0x1p_32*R123_0x1p_32)
+#define R123_0x1p_53 (1024.*R123_0x1p_63)
+#define R123_0x1p_52 (2048.*R123_0x1p_63)
+
+/** @endcond */
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/* narrowing conversions:  uint32_t to float */
+R123_CUDA_DEVICE R123_STATIC_INLINE float u01fixedpt_closed_closed_32_24(uint32_t i){
+    /* N.B.  we ignore the high bit, so output is not monotonic */
+    return ((i&0x7fffffc0) + (i&0x40))*R123_0x1p_31f; /* 0x1.p-31f */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE float u01fixedpt_closed_open_32_24(uint32_t i){
+    return (i>>8)*R123_0x1p_24f; /* 0x1.0p-24f; */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE float u01fixedpt_open_closed_32_24(uint32_t i){
+    return (1+(i>>8))*R123_0x1p_24f; /* *0x1.0p-24f; */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE float u01fixedpt_open_open_32_24(uint32_t i){
+    return (0.5f+(i>>9))*R123_0x1p_23f; /* 0x1.p-23f; */
+}
+
+#if R123_USE_U01_DOUBLE
+/* narrowing conversions:  uint64_t to double */
+R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_closed_closed_64_53(uint64_t i){
+    /* N.B.  we ignore the high bit, so output is not monotonic */
+    return ((i&R123_64BIT(0x7ffffffffffffe00)) + (i&0x200))*R123_0x1p_63; /* 0x1.p-63; */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_closed_open_64_53(uint64_t i){
+    return (i>>11)*R123_0x1p_53; /* 0x1.0p-53; */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_open_closed_64_53(uint64_t i){
+    return (1+(i>>11))*R123_0x1p_53; /* 0x1.0p-53; */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_open_open_64_53(uint64_t i){
+    return (0.5+(i>>12))*R123_0x1p_52; /* 0x1.0p-52; */
+}
+
+/* widening conversions:  u32 to double */
+R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_closed_closed_32_53(uint32_t i){
+    /* j = i+(i&1) takes on 2^31+1 possible values with a 'trapezoid' distribution:
+      p_j =  1 0 2 0 2 .... 2 0 2 0 1
+      j   =  0 1 2 3 4 ....        2^32
+      by converting to double *before* doing the add, we don't wrap the high bit.
+    */
+    return (((double)(i&1)) + i)*R123_0x1p_32; /* 0x1.p-32; */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_closed_open_32_53(uint32_t i){
+    return i*R123_0x1p_32; /* 0x1.p-32; */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_open_closed_32_53(uint32_t i){
+    return (1.+i)*R123_0x1p_32; /* 0x1.p-32; */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_open_open_32_53(uint32_t i){
+    return (0.5+i)*R123_0x1p_32; /* 0x1.p-32; */
+}
+#endif /* R123_USE_U01_DOUBLE */
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+#endif
diff --git a/lib/Random123-1.08/examples/ua.hpp b/lib/Random123-1.08/examples/ua.hpp
new file mode 100644
index 0000000..e3132d9
--- /dev/null
+++ b/lib/Random123-1.08/examples/ua.hpp
@@ -0,0 +1,101 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#if __cplusplus<201103L
+#error "This file uses C++11 features: <array> and <type_traits> and trailing return types"
+#endif
+
+#ifndef __r123_ua_dot_hpp
+#define __r123_ua_dot_hpp
+// uniform.hpp provides functions for converting single integers
+// to uniformly distributed reals.
+//
+// This file takes r123arrays of integers and converts them into
+// std::arrays of floating point type.  Why std::array and not
+// r123array?  Because with r123array, the size is baked into the name
+// and is not a template parameter.  Since it's not a template
+// parameter, we can't manufacture an r123array of the right size
+// during template instantiation.
+//
+// This file may not be as portable, and has not been tested as
+// rigorously as the files in the library itself, i.e., those in
+// ../include/Random123.  Nevertheless, we hope it is useful and we
+// encourage developers to copy it and modify it for their own
+// use.  We invite comments and improvements.
+
+#include <Random123/features/compilerfeatures.h>
+#include <array>
+#include "uniform.hpp"
+
+namespace r123{
+
+template <typename Ftype, typename IAtype>
+static inline auto ua01(IAtype in) -> 
+    std::array<Ftype, IAtype::static_size>
+{
+    std::array<Ftype, IAtype::static_size> ret;
+    size_t i=0;
+    for(auto e : in){
+        ret[i++] = u01<Ftype>(e);
+    }
+    return ret;
+}
+
+template <typename Ftype, typename IAtype>
+static inline auto uaneg11(IAtype in) -> 
+    std::array<Ftype, IAtype::static_size>
+{
+    std::array<Ftype, IAtype::static_size> ret;
+    size_t i=0;
+    for(auto e : in){
+        ret[i++] = uneg11<Ftype>(e);
+    }
+    return ret;
+}
+
+template <typename Ftype, typename IAtype>
+static inline auto ua01fixedpt(IAtype in) -> 
+    std::array<Ftype, IAtype::static_size>
+{
+    std::array<Ftype, IAtype::static_size> ret;
+    size_t i=0;
+    for(auto e : in){
+        ret[i++] = u01fixedpt<Ftype>(e);
+    }
+    return ret;
+}
+
+
+} // namespace r123
+
+#endif
+
diff --git a/lib/Random123-1.08/examples/uniform.hpp b/lib/Random123-1.08/examples/uniform.hpp
new file mode 100644
index 0000000..55cf126
--- /dev/null
+++ b/lib/Random123-1.08/examples/uniform.hpp
@@ -0,0 +1,210 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef __r123_uniform_dot_hpp
+#define __r123_uniform_dot_hpp
+
+// This file provides some simple tools that can be used to convert
+// integers of various widths to floats and doubles with various
+// characteristics.  It can be used to generate real-valued, uniformly
+// distributed random variables from the random integers produced by
+// the Random123 CBRNGs.
+//
+// There are three templated functions:
+//
+//   u01:  output is as dense as possible in (0,1}, never 0.0.  May
+//     return 1.0 if and only if the number of output mantissa bits
+//     is less than the width of the input.
+//   uneg11:  output is as dense as possible in {-1,1}, never 0.0.  May
+//     return 1.0 or -1.0 if and only if the number of output mantissa bits
+//     is less than the width of the input.
+//   u01fixedpt:  output is "fixed point", equispaced, open at both ends, 
+//      and is never 0.0, 0.5 nor 1.0.
+//
+// The behavior of u01 and uneg11 depend on the pre-processor symbol:
+// R123_UNIFORM_FLOAT_STORE.  When #defined to a non-zero value, u01
+// and uneg11 declare a volatile intermediate result, with the
+// intention of forcing architectures that have "extra bits" in their
+// floating point registers to more closely conform to IEEE
+// arithmetic.  When compiled this way, u01 and uneg11 will be
+// significantly slower, as they will incur a memory write and read on
+// every call.  Without it, they may fail the "known answer test"
+// implemented in ut_uniform_IEEEkat.cpp even though they perform
+// perfectly reasonable int to float conversions.  We have used
+// this option to get 32-bit x86 to produce the same results as
+// 64-bit x86-64 code, but we do not recommend it for normal
+// use.
+//
+// This file may not be as portable, and has not been tested as
+// rigorously as the files in the library itself, i.e., those in
+// ../include/Random123.  Nevertheless, we hope it is useful and we
+// encourage developers to copy it and modify it for their own
+// use.  We invite comments and improvements.
+
+#include <Random123/features/compilerfeatures.h>
+#include <limits>
+#if R123_USE_CXX11_TYPE_TRAITS
+#include <type_traits>
+#endif
+
+
+namespace r123{
+
+#if R123_USE_CXX11_TYPE_TRAITS
+using std::make_signed;
+using std::make_unsigned;
+#else
+// Sigh... We could try to find another <type_traits>, e.g., from
+// boost or TR1.  Or we can do it ourselves in the r123 namespace.
+// It's not clear which will cause less headache...
+template <typename T> struct make_signed{};
+template <typename T> struct make_unsigned{};
+#define R123_MK_SIGNED_UNSIGNED(ST, UT)                 \
+template<> struct make_signed<ST>{ typedef ST type; }; \
+template<> struct make_signed<UT>{ typedef ST type; }; \
+template<> struct make_unsigned<ST>{ typedef UT type; }; \
+template<> struct make_unsigned<UT>{ typedef UT type; }
+
+R123_MK_SIGNED_UNSIGNED(int8_t, uint8_t);
+R123_MK_SIGNED_UNSIGNED(int16_t, uint16_t);
+R123_MK_SIGNED_UNSIGNED(int32_t, uint32_t);
+R123_MK_SIGNED_UNSIGNED(int64_t, uint64_t);
+#if R123_USE_GNU_UINT128
+R123_MK_SIGNED_UNSIGNED(__int128_t, __uint128_t);
+#endif
+#undef R123_MK_SIGNED_UNSIGNED
+#endif
+
+#if defined(__CUDACC__) || defined(_LIBCPP_HAS_NO_CONSTEXPR)
+// Amazing! cuda thinks numeric_limits::max() is a __host__ function, so
+// we can't use it in a device function.  
+//
+// The LIBCPP_HAS_NO_CONSTEXP test catches situations where the libc++
+// library thinks that the compiler doesn't support constexpr, but we
+// think it does.  As a consequence, the library declares
+// numeric_limits::max without constexpr.  This workaround should only
+// affect a narrow range of compiler/library pairings.
+// 
+// In both cases, we find max() by computing ~(unsigned)0 right-shifted
+// by is_signed.
+template <typename T>
+R123_CONSTEXPR R123_STATIC_INLINE R123_CUDA_DEVICE T maxTvalue(){
+    typedef typename make_unsigned<T>::type uT;
+    return (~uT(0)) >> std::numeric_limits<T>::is_signed;
+ }
+#else
+template <typename T>
+R123_CONSTEXPR R123_STATIC_INLINE T maxTvalue(){
+    return std::numeric_limits<T>::max();
+}
+#endif
+
+// u01: Input is a W-bit integer (signed or unsigned).  It is cast to
+//   a W-bit unsigned integer, multiplied by Ftype(2^-W) and added to
+//   Ftype(2^(-W-1)).  A good compiler should optimize it down to an
+//   int-to-float conversion followed by a multiply and an add, which
+//   might be fused, dependingon the architecture.
+//
+//  If the input is a uniformly distributed integer, then the
+//  result is a uniformly distributed floating point number in [0, 1].
+//  The result is never exactly 0.0.  
+//  The smallest value returned is 2^-W.
+//  Let M be the number of mantissa bits in Ftype.
+//  If W>M  then the largest value retured is 1.0.
+//  If W<=M then the largest value returned is the largest Ftype less than 1.0.
+template <typename Ftype, typename Itype>
+R123_CUDA_DEVICE R123_STATIC_INLINE Ftype u01(Itype in){
+    typedef typename make_unsigned<Itype>::type Utype;
+    R123_CONSTEXPR Ftype factor = Ftype(1.)/(maxTvalue<Utype>() + Ftype(1.));
+    R123_CONSTEXPR Ftype halffactor = Ftype(0.5)*factor;
+#if R123_UNIFORM_FLOAT_STORE
+    volatile Ftype x = Utype(in)*factor; return x+halffactor;
+#else
+    return Utype(in)*factor + halffactor;
+#endif
+}
+
+// uneg11: Input is a W-bit integer (signed or unsigned).  It is cast
+//    to a W-bit signed integer, multiplied by Ftype(2^-(W-1)) and
+//    then added to Ftype(2^(-W-2)).  A good compiler should optimize
+//    it down to an int-to-float conversion followed by a multiply and
+//    an add, which might be fused, depending on the architecture.
+//
+//  If the input is a uniformly distributed integer, then the
+//  output is a uniformly distributed floating point number in [-1, 1].
+//  The result is never exactly 0.0.
+//  The smallest absolute value returned is 2^-(W-1)
+//  Let M be the number of mantissa bits in Ftype.
+//  If W>M  then the largest value retured is 1.0 and the smallest is -1.0.
+//  If W<=M then the largest value returned is the largest Ftype less than 1.0
+//    and the smallest value returned is the smallest Ftype greater than -1.0.
+template <typename Ftype, typename Itype>
+R123_CUDA_DEVICE R123_STATIC_INLINE Ftype uneg11(Itype in){
+    typedef typename make_signed<Itype>::type Stype;
+    R123_CONSTEXPR Ftype factor = Ftype(1.)/(maxTvalue<Stype>() + Ftype(1.));
+    R123_CONSTEXPR Ftype halffactor = Ftype(0.5)*factor;
+#if R123_UNIFORM_FLOAT_STORE
+    volatile Ftype x = Stype(in)*factor; return x+halffactor;
+#else
+    return Stype(in)*factor + halffactor;
+#endif
+}
+
+// u01fixedpt:  Return a "fixed point" number in (0,1).  Let:
+//   W = width of Itype, e.g., 32 or 64, regardless of signedness.
+//   M = mantissa bits of Ftype, e.g., 24, 53 or 64
+//   B = min(M, W)
+// Then the 2^B-1 possible output values are:
+//    2^-B*{1, 3, 5, ..., 2^B - 1}
+// The smallest output is: 2^-B
+// The largest output is:  1 - 2^-B
+// The output is never exactly 0.0, nor 0.5, nor 1.0.
+// The 2^(B-1) possible outputs:
+//   - are equally likely,
+//   - are uniformly spaced by 2^-(B-1),
+//   - are balanced around 0.5
+template <typename Ftype, typename Itype>
+R123_CUDA_DEVICE R123_STATIC_INLINE Ftype u01fixedpt(Itype in){
+    typedef typename make_unsigned<Itype>::type Utype;
+    R123_CONSTEXPR int excess = std::numeric_limits<Utype>::digits - std::numeric_limits<Ftype>::digits;
+    if(excess>=0){
+        R123_CONSTEXPR int ex_nowarn = (excess>=0) ? excess : 0;
+        R123_CONSTEXPR Ftype factor = Ftype(1.)/(Ftype(1.) + ((maxTvalue<Utype>()>>ex_nowarn)));
+        return (1 | (Utype(in)>>ex_nowarn)) * factor;
+    }else
+        return u01<Ftype>(in);
+}
+
+} // namespace r123
+
+#endif
+
diff --git a/lib/Random123-1.08/examples/ut_Engine.cpp b/lib/Random123-1.08/examples/ut_Engine.cpp
new file mode 100644
index 0000000..6673d62
--- /dev/null
+++ b/lib/Random123-1.08/examples/ut_Engine.cpp
@@ -0,0 +1,240 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+// TODO - really do a thorough and complete set of tests.
+
+#ifdef _MSC_FULL_VER
+// Engines have multiple copy constructors, quite legal C++, disable MSVC complaint
+#pragma warning (disable : 4521)
+#endif
+
+#include <Random123/philox.h>
+#include <Random123/aes.h>
+#include <Random123/threefry.h>
+#include <Random123/ars.h>
+#include <Random123/conventional/Engine.hpp>
+#include <Random123/ReinterpretCtr.hpp>
+#if R123_USE_CXX11_RANDOM
+#include <random>
+#endif
+#include <cassert>
+#include <iostream>
+#include <sstream>
+#include "util_demangle.hpp"
+
+using namespace std;
+using namespace r123;
+
+template <typename EType>
+typename EType::result_type kat1000(){
+    // A zero return says that no KAT is known.  This makes
+    // sense for the ReniterpretCtr-based engines which are
+    // expected to produce endian-specific results, so we
+    // don't have known answers for them.
+    return 0;
+}
+
+#if R123_USE_PHILOX_64BIT
+template <> uint64_t kat1000<Engine<Philox2x64 > >(){ return R123_64BIT(10575809911605703474); }
+#endif
+template <> uint32_t kat1000<Engine<Philox4x32 > >(){ return 1721865298; }
+template <> uint64_t kat1000<Engine<Threefry2x64 > >(){ return R123_64BIT(17578122881062615727); }
+template <> uint32_t kat1000<Engine<Threefry4x32 > >(){ return 874101813; }
+#if R123_USE_AES_OPENSSL
+template <> uint8_t  kat1000<Engine<AESOpenSSL16x8> >(){ return 0237; }
+#endif
+
+#define ASSERTEQ(A, B) assert(A==B); assert(A()==B()); assert(A()==B()); assert(A()==B())
+
+struct DummySeedSeq{
+    template <typename ITER>
+    void generate(ITER b, ITER e){
+        std::fill(b, e, 1);
+    }
+};
+
+template <typename EType>
+void doit(){
+    EType e;
+    cout << "doit<" << demangle(e) << ">";
+    typedef typename EType::cbrng_type BType;
+    typedef typename EType::result_type rtype;
+    typedef typename BType::ctr_type ctype;
+    typedef typename BType::key_type ktype;
+
+    DummySeedSeq dummyss;
+    EType ess(dummyss);
+    assert(ess != e);
+
+    rtype r1 = e();
+    rtype r2 = e(); assert( r1 != r2 );
+    rtype r3 = e(); assert( r3 != r2 && r3 != r1 );
+
+    // We've elsewhere confirmed that the underlying bijections actually "work",
+    // e.g., that they pass the Known Answer Test for some set of test vectors.
+    // Here, we simply check that the output of the Engine corresponds, in the expected
+    // way to the output of the underlying bijection.
+    
+    // Check that the first few values out of the engine correspond
+    // to output from the underlying bijection.
+    BType b;
+    ctype c1 = {{}};
+    ktype k = e.getseed();
+    e.seed(); 
+    for(int i=0; i<100; ++i){
+        c1[0]++;
+        ctype rb = b(c1, k);
+        for(typename ctype::reverse_iterator p=rb.rbegin(); p!=rb.rend(); ++p){
+            rtype re = e();
+            assert( *p == re );
+        }
+    }
+
+    // Check that discard work as expected, i.e., we can keep two
+    // engines "in sync" by discarding from one and stepping the other.
+    EType e2;
+    assert(e2 != e);
+    e2.discard(100*c1.size());
+    ASSERTEQ(e2, e);
+    
+    for(int disc=1; disc<50; ++disc){
+        e.discard(disc);
+        assert( e != e2 );
+        for(int j=0; j<disc; ++j) e2();
+        ASSERTEQ(e2, e);
+    }
+
+    // Check that saving and restoring state and the copy constructor 
+    // works as expected.
+    ostringstream oss;
+    oss << e2;
+    string s2 = oss.str();
+    int fiftyfive = 55;
+#if R123_USE_CXX11_TYPE_TRAITS
+    // With CXX11, the library has type_traits to prevent
+    // undesirable type resolution against the templated SeedSeq constructor
+    EType e3(fiftyfive);
+#else
+    // Without CXX11, we have to be careful to pass in
+    // a bona fide rtype, and not just something that will promote
+    // to an rtype, if we want the rtype constructor.
+    EType e3((rtype(fiftyfive)));
+#endif
+    EType esave(e);
+    assert(e3 != e2);
+    {
+        istringstream iss(s2);
+        iss >> e3;
+    }
+    ASSERTEQ(e3, e2);
+    assert(e3 != esave );
+    {
+        istringstream iss(s2);
+        iss >> e3;
+    }
+    ASSERTEQ(e3, esave);
+    
+    // Check that the constructor-from-rvalue works.
+    EType e4((rtype)99);
+    EType e5;
+    assert(e4 != e5);
+    assert(e4 != e3);
+    e5.seed((rtype)99);
+    ASSERTEQ(e4, e5);
+
+#if R123_USE_STD_RANDOM
+    // Check that we can use an EType with a std::distribution.
+    // Obviously, this requires <random>
+    uniform_int_distribution<int> dieroller(1, 6);
+    vector<int> hist(7);
+    int NROLL = 10000;
+    for(int i=0; i<NROLL; ++i){
+        int roll = dieroller(e5);
+        hist[roll]++;
+    }
+    double chisq = 0.;
+    double expected = NROLL/6.;
+    double var = NROLL*5./36.;
+    for(int pips=1; pips<=6; ++pips){
+        double delta = hist[pips] - expected;
+        chisq += delta*delta/var;
+    }
+    // The critical value of chisq with 6 degrees of freedom
+    // for P=0.01 is 16.81.  For P=0.05, it is 12.59
+    const double chicrit = 12.59;
+    if( chisq > chicrit ){
+        printf("std::uniform_int_distribution doesn't look random.  Chisq = %g.  Does this look like the result of a fair set of dice rolls to you?\n", chisq);
+        for(int pips=1; pips<=6; ++pips){
+            printf("%d pips  %d times\n", pips, hist[pips]);
+        }
+        abort();  // a bit harsh, no?  It might just be a rare event at the 5% level...
+    }
+#endif
+
+    // Finally do a kat test.  
+    EType ekat;
+    ekat.discard(1000);
+    typename EType::result_type r = ekat();
+    typename EType::result_type knownanswer = kat1000<EType>();
+    if( knownanswer != 0 && r != knownanswer )
+        cerr << "KAT mismatch.  The 1000th random from " << demangle(ekat) << " is " << r << " it should be " << knownanswer << "\n";
+    assert( knownanswer==0 || r == knownanswer );
+    cout << " OK" << endl;
+}
+
+int main(int, char **){
+#if R123_USE_PHILOX_64BIT
+    doit<Engine<Philox2x64 > >();
+    doit<Engine<ReinterpretCtr<r123array4x32, Philox2x64 > > >();
+#endif
+    doit<Engine<Philox4x32 > >();
+    doit<Engine<Threefry2x64 > >();
+    doit<Engine<Threefry4x32 > >();
+    doit<Engine<ReinterpretCtr<r123array4x32, Threefry2x64 > > >();
+    doit<Engine<ReinterpretCtr<r123array2x64, Threefry4x32 > > >();
+
+#if R123_USE_AES_NI
+    if( haveAESNI() ){
+        doit<Engine<ARS4x32> >();
+        doit<Engine<ReinterpretCtr<r123array2x64, ARS4x32> > >();
+        doit<Engine<AESNI4x32> >();
+    }else{
+        cout << "AES is compiled into the binary, but is not available on this hardware\n";
+    }
+#endif
+#if R123_USE_AES_OPENSSL
+    doit<Engine<AESOpenSSL16x8> >();
+#endif
+
+    cout << "ut_Engine:  all OK" << endl;
+    return 0;
+}
+
diff --git a/lib/Random123-1.08/examples/ut_M128.cpp b/lib/Random123-1.08/examples/ut_M128.cpp
new file mode 100644
index 0000000..07a4292
--- /dev/null
+++ b/lib/Random123-1.08/examples/ut_M128.cpp
@@ -0,0 +1,149 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/features/compilerfeatures.h>
+#if !R123_USE_SSE
+#include <stdio.h>
+int main(){ printf("No SSE.  Nothing to check\n"); return 0; }
+#else
+
+#include <Random123/features/sse.h>
+#include <sstream>
+
+int main(int, char **){
+    r123m128i uninitialized;
+    __m128i zm = _mm_setzero_si128();
+#if R123_USE_CXX1X_UNRESTRICTED_UNIONS
+    r123m128i zM(zm);
+#else
+    r123m128i zM; zM.m = zm;
+#endif
+    uninitialized.m = _mm_setzero_si128();
+
+    // operator bool (or maybe void*)
+    assert(!uninitialized);
+    assert(!zM);
+
+    // operator=(__m128i)
+    // conversion to __m128i
+    __m128i one = _mm_set_epi32(0, 0, 0, 1);
+    __m128i two = _mm_set_epi32(0, 0, 0, 2);
+    r123m128i One, Two;
+    One = one;
+    Two = two;
+    assert(!!One);
+    assert(!!Two);
+    r123m128i AnotherOne;
+    AnotherOne = one;
+
+    assert( AnotherOne == One );
+    assert( Two != One );
+    __m128i m = One;
+    AnotherOne = m;
+    assert( AnotherOne ==  One );
+
+    // operator++ (prefix)
+    ++One;
+    assert( One == Two );
+    assert( One != AnotherOne );
+
+    // operator+=(R123_ULONG_LONG)
+    // operator==(R123_ULONG_LONG, r123m128i)
+    R123_ULONG_LONG ull = 2;
+    AnotherOne += 1;
+    for(int i=0; i<1000; ++i){
+        AnotherOne += i;
+        ull += i;
+        for(int j=0; j<i; ++j){
+            assert(One != AnotherOne);
+            ++One;
+        }
+        assert(One == AnotherOne);
+        assert(ull == AnotherOne);
+    }
+
+    // Do some additions that require carrying.
+    // Check the identity behavior of the streams
+    // as well
+    for(uint64_t i=0; i<1000; ++i){
+        uint64_t fff = (~((uint64_t)0)) - i;
+        AnotherOne += fff;
+        ull += fff; // will overflow
+        One += fff/2;
+        One += fff - fff/2;
+        assert(AnotherOne == One);
+        assert( !(ull == One) );
+        std::stringstream ss;
+        r123m128i YetAnother;
+        ss << AnotherOne;
+        ss >> YetAnother;
+
+        assert( YetAnother == AnotherOne );
+    }
+
+    // Sep 2011 - clang in the fink build of llvm-2.9.1 on MacOS 10.5.8
+    // fails to catch anything, and hence fails this test.  I suspect
+    // a problem with the packaging/installation rather than a bug
+    // in llvm.  However, if it shows up in other contexts, some
+    // kind of #ifndef might be appropriate.  N.B.  There's a similar
+    // exception test in ut_carray.cpp
+    bool caught;
+    caught = false;
+    try{
+        One < AnotherOne;
+    }catch(std::runtime_error& ){ caught = true; }
+    assert(caught);
+
+    caught = false;
+    try{
+        One <= AnotherOne;
+    }catch(std::runtime_error& ){ caught = true; }
+    assert(caught);
+
+    caught = false;
+    try{
+        One > AnotherOne;
+    }catch(std::runtime_error& ){ caught = true; }
+    assert(caught);
+
+    caught = false;
+    try{
+        One >= AnotherOne;
+    }catch(std::runtime_error& ){ caught = true; }
+    assert(caught);
+
+    // assemble_from_u32<r123m128i>
+
+    std::cout << "ut_M128: OK\n";
+    return 0;
+}
+
+#endif
diff --git a/lib/Random123-1.08/examples/ut_ReinterpretCtr.cpp b/lib/Random123-1.08/examples/ut_ReinterpretCtr.cpp
new file mode 100644
index 0000000..4dd05cd
--- /dev/null
+++ b/lib/Random123-1.08/examples/ut_ReinterpretCtr.cpp
@@ -0,0 +1,47 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/ReinterpretCtr.hpp>
+#include <Random123/threefry.h>
+#include <iostream>
+#include "util_demangle.hpp"
+
+using namespace r123;
+int main(int, char **){
+    r123array4x32 c = {{}};
+    r123array4x32 r;
+
+    ReinterpretCtr<r123array4x32, Threefry2x64> p;
+    Threefry2x64::key_type kp = {{}};
+    r = p(c, kp);
+    std::cout << demangle(p) << ": " << r << "\n";
+    return 0;
+}
diff --git a/lib/Random123-1.08/examples/ut_aes.cpp b/lib/Random123-1.08/examples/ut_aes.cpp
new file mode 100644
index 0000000..5cf04e1
--- /dev/null
+++ b/lib/Random123-1.08/examples/ut_aes.cpp
@@ -0,0 +1,106 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+// Check our AES implementation against the example in FIPS-197
+
+#include <Random123/aes.h>
+#include <Random123/ReinterpretCtr.hpp>
+#if R123_USE_AES_OPENSSL
+#include <openssl/aes.h>
+#endif
+#include <string>
+#include <cstdio>
+#include <iostream>
+#include <cstring>
+#include <cassert>
+
+using namespace std;
+using namespace r123;
+
+#if !R123_USE_SSE
+int main(int, char **){
+    std::cout << "No SSE support.  This test is not compiled\n";
+    return 0;
+}
+#else
+
+#include "util_m128.h"
+
+int main(int, char **){
+    r123array1xm128i IN, K;
+
+    K.v[0].m =  m128i_from_charbuf("0001020304050607 08090a0b0c0d0e0f");
+    IN.v[0].m = m128i_from_charbuf("0011223344556677 8899aabbccddeeff");
+    // From FIPS-197, this is the official "right answer"
+    r123array1xm128i right_answer;
+    right_answer[0] = m128i_from_charbuf("69c4 e0d8 6a7b 0430 d8cd b780 70b4 c55a");
+    (void)right_answer;  /* don't complain about an unused variable if neither NI nor OPENSSL are enabled. */
+#if R123_USE_AES_NI
+    if( haveAESNI() ){
+        AESNI1xm128i::key_type xk(K);
+        AESNI1xm128i bx;
+        AESNI1xm128i::ctr_type x = bx(IN, xk);
+
+        assert( x==right_answer );
+        cout << "IN: " << m128i_to_string(IN[0]) <<  "\n";
+        cout << "K : " << m128i_to_string(K[0])  << "\n";
+        cout << "AES:" << m128i_to_string(x[0])  << "\n";
+        cout << "Hooray!  AESNI1xm128i(IN, K) matches the published test vector!\n";
+    }else{
+        cout << "The AES-NI instructions are not available on this hardware.  Skipping AES-NI tests\n";
+    }
+#else
+    cout << "The AES-NI Bijections are not compiled into this binary.  Skipping AES-NI tests\n";
+#endif
+    
+    // And let's do it with AESOpenSSL.  But since AESOpenSSL has its own
+    // format for keys and counters we make a union for the key types and
+    // use ReinterpretCtr to wrap a union around the counter types.
+#if R123_USE_AES_OPENSSL
+#if R123_USE_AES_NI
+    typedef AESNI1xm128i::ctr_type nictype;
+#else
+    typedef r123array1xm128i nictype;
+#endif
+    AESOpenSSL16x8::ukey_type ouk;
+    _mm_storeu_si128((__m128i*)&ouk.v[0], K.v[0].m);
+    AESOpenSSL16x8::key_type okey(ouk);
+    ReinterpretCtr<nictype, AESOpenSSL16x8> osslb;
+    assert( osslb(IN, okey) == right_answer );
+    cout << "Hooray!  AESOpenSSL16x8(IN, K) matches the published test vector!\n";
+#else
+    cout << "The OpenSSL AES implementation is not linked with this binary.  Skipping the AESOpenSSL16x8\n";
+#endif // R123_USE_AES_OPENSSL
+
+    return 0;
+}
+
+#endif
diff --git a/lib/Random123-1.08/examples/ut_ars.c b/lib/Random123-1.08/examples/ut_ars.c
new file mode 100644
index 0000000..8eb10f7
--- /dev/null
+++ b/lib/Random123-1.08/examples/ut_ars.c
@@ -0,0 +1,82 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/ars.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#if !R123_USE_SSE
+int main(int argc, char **argv){
+    (void)argc; (void)argv; /* unused */
+    printf("No SSE support.  This test is not compiled\n");
+    return 0;
+}
+#else
+#include "util_m128.h"
+
+int
+main(int argc, char **argv)
+{
+#if R123_USE_AES_NI
+    struct r123array1xm128i c, k, ret;
+    char m128str[M128_STR_SIZE], *kat;
+
+    if (haveAESNI()) {
+	c.v[0].m = m128i_from_charbuf("01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00");
+	k.v[0].m = m128i_from_charbuf("01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00");
+	ret = ars1xm128i_R(7, c, k);
+	kat = "2b1623350cd214dc 7740187993411872";
+	if (strcmp(m128i_to_charbuf(ret.v[0].m, m128str), kat) != 0) {
+	    fprintf(stderr, "%s: error, expected %s, got %s\n", argv[0], kat, m128str);
+	    exit(1);
+	}
+	printf("%s: OK, got %s\n", argv[0], kat);
+	c.v[0].m = m128i_from_charbuf("00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00");
+	k.v[0].m = m128i_from_charbuf("01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00");
+	ret = ars1xm128i_R(7, c, k);
+	kat = "2de6b66fa461b668 f380126f32b9cd22";
+	if (strcmp(m128i_to_charbuf(ret.v[0].m, m128str), kat) != 0) {
+	    fprintf(stderr, "%s: error, expected %s, got %s\n", argv[0], kat, m128str);
+	    exit(1);
+	}
+	printf("%s: OK, got %s\n", argv[0], kat);
+    } else {
+	printf("%s: no AES-NI on this machine\n", argv[0]);
+    }
+#else
+    printf("%s: no AES-NI compiled into this program\n", argv[0]);
+#endif
+    (void)argc; (void)argv; /* unused */
+    return 0;
+}
+
+#endif
diff --git a/lib/Random123-1.08/examples/ut_carray.cpp b/lib/Random123-1.08/examples/ut_carray.cpp
new file mode 100644
index 0000000..3c08f89
--- /dev/null
+++ b/lib/Random123-1.08/examples/ut_carray.cpp
@@ -0,0 +1,317 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/array.h>
+#include <iostream>
+#include <typeinfo>
+#include <sstream>
+#include <limits>
+#include <assert.h>
+#include <vector>
+#include "util_demangle.hpp"
+
+using namespace std;
+
+template<typename T>
+inline static T zero(){ return 0; }
+
+template<typename T>
+inline static T fff(){ return ~T(0); }
+
+template<typename T>
+inline R123_ULONG_LONG ull(const T& t){ return static_cast<R123_ULONG_LONG>(t); }
+
+template <typename T>
+inline uint32_t get32(const T& t, size_t n){
+    return t>>(n*32);
+}
+
+#if R123_USE_SSE
+template<>
+inline r123m128i zero<r123m128i>(){ r123m128i M; M.m=_mm_setzero_si128(); return M;}
+
+template<>
+inline r123m128i fff<r123m128i>(){ r123m128i M; M.m=_mm_set_epi32(~0, ~0, ~0, ~0); return M;}
+
+template<>
+inline R123_ULONG_LONG ull<r123m128i>(const r123m128i& t){ 
+    return _mm_extract_lo64(t.m);
+}
+
+template <>
+inline uint32_t get32<r123m128i>(const r123m128i& t, size_t n){
+    switch(n){
+    case 3: return _mm_cvtsi128_si32(_mm_srli_si128(t.m, 12));
+    case 2: return _mm_cvtsi128_si32(_mm_srli_si128(t.m, 8));
+    case 1: return _mm_cvtsi128_si32(_mm_srli_si128(t.m, 4));
+    }
+    return _mm_cvtsi128_si32(t.m);
+}
+#endif
+
+struct dummySeedSeq{
+    typedef uint32_t result_type;
+    template <typename ITER>
+    void generate(ITER b, ITER e){
+        uint32_t v = 0xdeadbeef;
+        for(; b!=e; ++b){
+            *b = v;
+            v += 0xbaddecaf;
+        }
+    }
+};
+
+template <typename AType>
+void doit(size_t N, size_t W){
+    AType uninitialized;
+    typedef AType atype;
+    typedef typename atype::value_type vtype;
+    typedef typename atype::iterator  itype;
+
+    assert( R123_W(AType) == W );
+
+    cout << "doit<" << demangle(uninitialized) << ">";
+    // size
+    assert(uninitialized.size() == N);
+
+    // width
+    assert(sizeof(vtype)*8 == W);
+    // data
+    assert(uninitialized.data() == &uninitialized.v[0]);
+
+    // front
+    assert(&uninitialized.front() == uninitialized.data());
+
+    // back
+    assert(&uninitialized.back() == uninitialized.data()+(N-1));
+
+    // The ut_carray Random123 unit test uses an empty initializer list to
+    // construct instances of different r123 arrays, in a test that's
+    // templated on array type.  This works fine for all of the r123 array
+    // types except r123array1xm128i---i.e., an "array" consisting of a single
+    // __m128i value.  GCC defines __m128i as a single long long,
+    //
+    // typedef long long __m128i __attribute__ ((__vector_size__ (16),
+    //                                           __may_alias__));
+    //
+    // while Intel defines it as a union,
+    //
+    // typedef union  _MMINTRIN_TYPE(16) __m128i {
+    // #if !defined(_MSC_VER)
+    //      /*
+    //       * To support GNU compatible intialization with initializers list,
+    //       * make first union member to be of int64 type.
+    //       */
+    //      __int64             m128i_gcc_compatibility[2];
+    // #endif
+    //     /*
+    //      * Although we do not recommend using these directly, they are here
+    //      * for better MS compatibility.
+    //      */
+    //     __int8              m128i_i8[16];
+    //     __int16             m128i_i16[8];
+    //     __int32             m128i_i32[4];
+    //     __int64             m128i_i64[2];
+    //     unsigned __int8     m128i_u8[16];
+    //     unsigned __int16    m128i_u16[8];
+    //     unsigned __int32    m128i_u32[4];
+    //     unsigned __int64    m128i_u64[2];
+    //
+    //     /*
+    //      * This is what we used to have here alone.
+    //      * Leave for backward compatibility.
+    //      */
+    //     char c[16];
+    // } __m128i;
+    //
+    // but PGI defines __m128i as a struct,
+    //
+    // typedef struct {
+    //   private: long long m128i_i64[2];
+    // } __attribute__((aligned(16))) __m128i;
+    //
+    // which can't be initialized with initializer lists before C++11.
+
+    // constructor with initializer.  [], at
+#ifndef __PGI
+    AType z = {{}};
+#else
+    AType z;
+    z.fill(zero<vtype>());
+#endif
+    for(unsigned i=0; i<N; ++i){
+        assert(!z[i]);
+        assert(!z.at(i));
+        uninitialized[i] = z[i];
+        uninitialized[i] += (i+1);
+    }
+
+    // Copy-assignment
+    atype iota = uninitialized;
+
+    // begin/end
+    for(itype p=iota.begin(); p!=iota.end(); ++p){
+        assert((int)ull(*p) == 1+ (p-iota.begin()));
+    }
+    // cbegin/cend
+    for(typename atype::const_iterator p=iota.cbegin(); p!=iota.cend(); ++p){
+        assert((int)ull(*p) == 1+ (p-iota.cbegin()));
+    }
+
+    // rbegin/rend
+    for(typename atype::reverse_iterator p=iota.rbegin(); p!=iota.rend(); ++p){
+        assert((int)ull(*p) == iota.rend()-p);
+    }
+
+    // crbegin/crend
+    for(typename atype::const_reverse_iterator p=iota.crbegin(); p!=iota.crend(); ++p){
+        assert((int)ull(*p) == iota.crend()-p);
+    }
+
+    // == and !=
+    assert(iota == uninitialized);
+    assert(!(iota != uninitialized));
+    
+    for(size_t i=0; i<N; ++i){
+        atype notequal = iota;
+        ++notequal[i];
+        assert(notequal != iota);
+        assert(!(notequal == iota));
+    }
+
+    // Sep 2011 - clang in the fink build of llvm-2.9.1 on MacOS 10.5.8
+    // fails to catch anything, and hence fails this test.  I suspect
+    // a problem with the packaging/installation rather than a bug
+    // in llvm.  However, if it shows up in other contexts, some
+    // kind of #ifndef might be appropriate.  N.B.  There's another
+    // exception test below and one in ut_M128.cpp
+    // check that at throws 
+    bool caught = false;
+    try{
+        iota.at(N);
+    }catch(std::out_of_range&){
+        caught = true;
+    }
+    assert(caught);
+
+    // fill
+    vtype one = zero<vtype>();
+    ++one;
+    atype aone;
+    aone.fill(one);
+    for(size_t i=0; i<N; ++i){
+        assert(aone[i] == one);
+    }
+
+    // swap
+    aone.swap(z);
+    for(size_t i=0; i<N; ++i){
+        assert(aone[i] == zero<vtype>());
+        assert(z[i] == one);
+    }
+
+    // seed
+    dummySeedSeq seedseq;
+    aone = atype::seed(seedseq);
+    vector<uint32_t> v32( N*((W+31)/32) );
+    seedseq.generate(v32.begin(), v32.end());
+    size_t jj=0;
+    uint32_t mask = 0xffffffff;
+    if( W < 32 )
+        mask >>= (32-W);
+    for(size_t i=0; i<N; ++i){
+        for(size_t j=0; j<W; j+=32){
+            uint32_t aj = get32(aone[i], j/32);
+            assert( aj == (mask&v32.at(jj)) );
+            jj++;
+        }
+    }
+
+    // incr 
+
+#ifndef __PGI
+    atype a = {{}};
+#else
+    atype a;
+    a.fill(zero<vtype>());
+#endif
+    a.incr();
+    a.incr();
+    a.incr();
+    a.incr();
+    assert( ull(a[0]) == 4u );
+    assert( N<2 || ull(a[1]) == 0u );
+
+    a.incr(0xbadcafe);
+    assert( ull(a[0]) == (mask&(4u+0xbadcafe)) );
+
+    // Set the zero'th entry to fff and then increment
+    a[0] = fff<vtype>();
+    a.incr();
+    assert( a[0] == zero<vtype>() );
+    assert( N<2 || ull(a[1]) == (W>8?1u:0xcc));
+
+    a.incr();
+    assert( ull(a[0]) == 1u );
+    assert( N<2 || ull(a[1]) == (W>8?1u:0xcc) );
+
+    R123_ULONG_LONG ulfff = ull(fff<vtype>());
+
+    a.incr(ulfff);
+    a.incr(ulfff - 5u);
+    a.incr(2);
+    a.incr(2);
+    a.incr(2);
+    a.incr(2);
+
+    // operator<< and operator>>
+
+    std::stringstream ss;
+    ss << a;
+    AType b;
+    ss >> b;
+    assert(a == b);
+    cout << " OK\n";
+}
+
+
+int main(int, char **){
+#if R123_USE_SSE
+    doit<r123array1xm128i>(1, 128);
+#endif
+    doit<r123array2x32>(2, 32);
+    doit<r123array4x32>(4, 32);
+    doit<r123array2x64>(2, 64);
+    doit<r123array4x64>(4, 64);
+    doit<r123array16x8>(16, 8);
+    return 0;
+}
+
diff --git a/lib/Random123-1.08/examples/ut_features.cpp b/lib/Random123-1.08/examples/ut_features.cpp
new file mode 100644
index 0000000..2ee23d0
--- /dev/null
+++ b/lib/Random123-1.08/examples/ut_features.cpp
@@ -0,0 +1,454 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+// This "unit test" is basically a test of the completeness
+// of compilerfeatures.hpp.  Each of the pp-symbols in compilerfeatures.hpp
+// is supposed to have a definition.  We check them all, and
+// in some cases, emit some appropriate code to check that
+// they reflect reality.
+#include <assert.h>
+#include <Random123/features/compilerfeatures.h>
+#include <iostream>
+
+struct Outputter{
+    Outputter(const char *name, int value){
+        std::cout << name << " " << value << std::endl;
+    }
+};
+
+// Many symbols rely on the pp-convention of
+// expanding undefined values in arithmetic expressions to 0.
+// Thus, we can't do something terse like:
+// #define Out(Sym) Outputter outputter##Sym(#Sym, Sym)
+// Instead, we have to force the preprocessor to evaluate
+// the symbol.
+// #if Sym
+// Otrue(Sym)
+// #else
+// Ofalse(Sym)
+// #endif
+#define Otrue(Sym) Outputter outputter##Sym(#Sym, true)
+#define Ofalse(Sym) Outputter outputter##Sym(#Sym, false)
+
+#ifndef R123_USE_X86INTRIN_H
+#error "No  R123_USE_X86INTRIN_H"
+#endif
+#if R123_USE_X86INTRIN_H
+#include <x86intrin.h>
+Otrue(R123_USE_X86INTRIN_H);
+#else
+Ofalse(R123_USE_X86INTRIN_H);
+#endif
+
+#ifndef R123_USE_IA32INTRIN_H
+#error "No  R123_USE_IA32INTRIN_H"
+#endif
+#if R123_USE_IA32INTRIN_H
+Otrue(R123_USE_IA32INTRIN_H);
+#include <ia32intrin.h>
+#else
+Ofalse(R123_USE_IA32INTRIN_H);
+#endif
+
+#ifndef R123_USE_XMMINTRIN_H
+#error "No  R123_USE_XMMINTRIN_H"
+#endif
+#if R123_USE_XMMINTRIN_H
+#include <xmmintrin.h>
+Otrue(R123_USE_XMMINTRIN_H);
+#else
+Ofalse(R123_USE_XMMINTRIN_H);
+#endif
+
+#ifndef R123_USE_EMMINTRIN_H
+#error "No  R123_USE_EMMINTRIN_H"
+#endif
+#if R123_USE_EMMINTRIN_H
+#include <emmintrin.h>
+Otrue(R123_USE_EMMINTRIN_H);
+#else
+Ofalse(R123_USE_EMMINTRIN_H);
+#endif
+
+#ifndef R123_USE_SMMINTRIN_H
+#error "No  R123_USE_SMMINTRIN_H"
+#endif
+#if R123_USE_SMMINTRIN_H
+Otrue(R123_USE_SMMINTRIN_H);
+#include <smmintrin.h>
+#else
+Ofalse(R123_USE_SMMINTRIN_H);
+#endif
+
+#ifndef R123_USE_WMMINTRIN_H
+#error "No  R123_USE_WMMINTRIN_H"
+#endif
+#if R123_USE_WMMINTRIN_H
+Otrue(R123_USE_WMMINTRIN_H);
+#include <wmmintrin.h>
+#else
+Ofalse(R123_USE_WMMINTRIN_H);
+#endif
+
+#ifndef R123_USE_INTRIN_H
+#error "No  R123_USE_INTRIN_H"
+#endif
+#if R123_USE_INTRIN_H
+Otrue(R123_USE_INTRIN_H);
+#include <intrin.h>
+#else
+Ofalse(R123_USE_INTRIN_H);
+#endif
+
+#ifndef R123_USE_SSE
+#error "No  R123_USE_SSE"
+#endif
+#if R123_USE_SSE
+Otrue(R123_USE_SSE);
+#include <Random123/features/sse.h>
+__m128i mm;
+#else
+Ofalse(R123_USE_SSE);
+#endif
+
+#ifndef R123_CUDA_DEVICE
+#error "No  R123_CUDA_DEVICE"
+#endif
+R123_CUDA_DEVICE void cuda_device_func(){}
+
+// C++11 features
+#ifndef R123_USE_CXX11_UNRESTRICTED_UNIONS
+#error "No  R123_USE_CXX11_UNRESTRICTED_UNIONS"
+#endif
+#if R123_USE_CXX11_UNRESTRICTED_UNIONS
+Otrue(R123_USE_CXX11_UNRESTRICTED_UNIONS);
+struct defaulted_ctor{
+    int i;
+    defaulted_ctor()=default;
+    defaulted_ctor(const defaulted_ctor& d) : i(d.i){}
+};
+union unrestricted{
+    int i;
+    defaulted_ctor dc;
+};
+#else
+Ofalse(R123_USE_CXX11_UNRESTRICTED_UNIONS);
+#endif
+
+#ifndef R123_USE_CXX11_STATIC_ASSERT
+#error "No  R123_USE_CXX11_STATIC_ASSERT"
+#endif
+#if R123_USE_CXX11_STATIC_ASSERT
+Otrue(R123_USE_CXX11_STATIC_ASSERT);
+static_assert(true, "this shouldn't be a problem");
+#else
+Ofalse(R123_USE_CXX11_STATIC_ASSERT);
+#endif
+
+#ifndef R123_USE_CXX11_CONSTEXPR
+#error "No  R123_USE_CXX11_CONSTEXPR"
+#endif
+#if R123_USE_CXX11_CONSTEXPR
+Otrue(R123_USE_CXX11_CONSTEXPR);
+constexpr int zero() {return 0;}
+#else
+Ofalse(R123_USE_CXX11_CONSTEXPR);
+#endif
+
+#ifndef R123_USE_CXX11_EXPLICIT_CONVERSIONS
+#error "No  R123_USE_CXX11_EXPLICIT_CONVERSIONS"
+#endif
+#if R123_USE_CXX11_EXPLICIT_CONVERSIONS
+Otrue(R123_USE_CXX11_EXPLICIT_CONVERSIONS);
+struct explicit_converter{
+    explicit operator bool() const {return true;}
+};
+#else
+Ofalse(R123_USE_CXX11_EXPLICIT_CONVERSIONS);
+#endif
+
+#ifndef R123_USE_CXX11_RANDOM
+#error "No   R123_USE_CXX11_RANDOM"
+#endif
+#if R123_USE_CXX11_RANDOM
+Otrue(R123_USE_CXX11_RANDOM);
+#include <random>
+#else
+Ofalse(R123_USE_CXX11_RANDOM);
+#endif
+
+#ifndef R123_USE_CXX11_TYPE_TRAITS
+#error "No  R123_USE_CXX11_TYPE_TRAITS"
+#endif
+#if R123_USE_CXX11_TYPE_TRAITS
+Otrue(R123_USE_CXX11_TYPE_TRAITS);
+#include <type_traits>
+#else
+Ofalse(R123_USE_CXX11_TYPE_TRAITS);
+#endif
+
+#ifndef R123_USE_CXX11_LONG_LONG
+#error "No  R123_USE_CXX11_LONG_LONG"
+#endif
+#if R123_USE_CXX11_LONG_LONG
+Otrue(R123_USE_CXX11_LONG_LONG);
+unsigned long long ull;
+#else
+Ofalse(R123_USE_CXX11_LONG_LONG);
+#endif
+
+#ifndef R123_FORCE_INLINE
+#error "No  R123_FORCE_INLINE"
+#endif
+inline R123_FORCE_INLINE(int forcibly_inlined(int i));
+inline int forcibly_inlined(int i){ return i+1;}
+
+#ifndef R123_USE_AES_NI
+#error "No  R123_USE_AES_NI"
+#endif
+#if R123_USE_AES_NI
+Otrue(R123_USE_AES_NI);
+__m128i aes(__m128i in){
+    if( haveAESNI() )
+        return _mm_aesenc_si128(in, in);
+    else
+        return _mm_setzero_si128();
+}
+#else
+Ofalse(R123_USE_AES_NI);
+#endif
+
+#ifndef R123_USE_SSE4_2
+#error "No  R123_USE_SSE4_2"
+#endif
+#if R123_USE_SSE4_2
+Otrue(R123_USE_SSE4_2);
+__m128i sse42(__m128i in){
+    return _mm_cmpgt_epi64(in, in);
+}
+#else
+Ofalse(R123_USE_SSE4_2);
+#endif
+
+#ifndef R123_USE_SSE4_1
+#error "No  R123_USE_SSE4_1"
+#endif
+#if R123_USE_SSE4_1
+Otrue(R123_USE_SSE4_1);
+int sse41(__m128i in){
+    return _mm_testz_si128(in, in);
+}
+#else
+Ofalse(R123_USE_SSE4_1);
+#endif
+
+#ifndef R123_USE_AES_OPENSSL
+#error "No  R123_USE_AES_OPENSSL"
+#endif
+#if R123_USE_AES_OPENSSL
+Otrue(R123_USE_AES_OPENSSL);
+#include <openssl/aes.h>
+#else
+Ofalse(R123_USE_AES_OPENSSL);
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#error "No  R123_USE_GNU_UINT128"
+#endif
+#if R123_USE_GNU_UINT128
+Otrue(R123_USE_GNU_UINT128);
+__uint128_t u128;
+#else
+Ofalse(R123_USE_GNU_UINT128);
+#endif
+
+#ifndef R123_USE_ASM_GNU
+#error "No  R123_USE_ASM_GNU"
+#endif
+#if R123_USE_ASM_GNU
+Otrue(R123_USE_ASM_GNU);
+R123_STATIC_INLINE int anotherAESNI(){
+    unsigned int eax, ebx, ecx, edx;
+    __asm__ __volatile__ ("cpuid": "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) :
+                      "a" (1));
+    return (ecx>>25) & 1;
+}
+#else
+Ofalse(R123_USE_ASM_GNU);
+#endif
+
+#ifndef R123_USE_CPUID_MSVC
+#error "No  R123_USE_CPUID_MSVC"
+#endif
+#if R123_USE_CPUID_MSVC
+Otrue(R123_USE_CPUID_MSVC);
+int chkcpuid(){
+    int CPUInfo[4];
+    __cpuid(CPUInfo, 1);
+    return CPUInfo[2]&(1<<25);
+}
+#else
+Ofalse(R123_USE_CPUID_MSVC);
+#endif
+
+#ifndef R123_USE_MULHILO32_ASM
+#error "No  R123_USE_MULHILO32_ASM"
+#endif
+#if R123_USE_MULHILO32_ASM
+Otrue(R123_USE_MULHILO32_ASM);
+#else
+Ofalse(R123_USE_MULHILO32_ASM);
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#error "No  R123_USE_MULHILO64_ASM"
+#endif
+#if R123_USE_MULHILO64_ASM
+Otrue(R123_USE_MULHILO64_ASM);
+#else
+Ofalse(R123_USE_MULHILO64_ASM);
+#endif
+
+#ifndef R123_USE_MULHILO64_MSVC_INTRIN
+#error "No  R123_USE_MULHILO_MSVC_INTRIN"
+#endif
+#if R123_USE_MULHILO64_MSVC_INTRIN
+Otrue(R123_USE_MULHILO64_MSVC_INTRIN);
+#include <cstdint>
+void msvc64mul(){
+    uint64_t a=1000000000000000000;
+    uint64_t b=a;
+    uint64_t h, l;
+    l = _umul128(a, b, &h);
+    assert( l == a*b);
+    assert( h == 54210108624275221ULL );
+}
+#else
+Ofalse(R123_USE_MULHILO64_MSVC_INTRIN);
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#error "No  R123_USE_MULHILO64_CUDA_INTRIN"
+#endif
+#if R123_USE_MULHILO64_CUDA_INTRIN
+Otrue(R123_USE_MULHILO64_CUDA_INTRIN);
+#else
+Ofalse(R123_USE_MULHILO64_CUDA_INTRIN);
+#endif
+
+#ifndef R123_USE_MULHILO64_OPENCL_INTRIN
+#error "No  R123_USE_MULHILO64_OPENCL_INTRIN"
+#endif
+#if R123_USE_MULHILO64_OPENCL_INTRIN
+Otrue(R123_USE_MULHILO64_OPENCL_INTRIN);
+#else
+Ofalse(R123_USE_MULHILO64_OPENCL_INTRIN);
+#endif
+
+#ifndef R123_USE_MULHILO64_MULHI_INTRIN
+#error "No  R123_USE_MULHILO64_MULHI_INTRIN"
+#endif
+#if R123_USE_MULHILO64_MULHI_INTRIN
+Otrue(R123_USE_MULHILO64_MULHI_INTRIN);
+static int test_mulhilo64_intrin(){
+    uint64_t a = R123_64BIT(0x1234567887654321);
+    uint64_t b = R123_64BIT(0x8765432112345678);
+    uint64_t c = R123_MULHILO64_MULHI_INTRIN(a, b);
+    assert( c == R123_64BIT(0x09A0CD05B99FE92E) );
+    return c == R123_64BIT(0x09A0CD05B99FE92E);
+}
+int mulhilo64_intrin_ok = test_mulhilo64_intrin();
+#else
+Ofalse(R123_USE_MULHILO64_MULHI_INTRIN);
+#endif
+
+#ifndef R123_USE_MULHILO32_MULHI_INTRIN
+#error "No  R123_USE_MULHILO32_MULHI_INTRIN"
+#endif
+#if R123_USE_MULHILO32_MULHI_INTRIN
+Otrue(R123_USE_MULHILO32_MULHI_INTRIN);
+static int test_mulhilo32_intrin(){
+    uint64_t a32 = 0x12345678;
+    uint64_t b32 = 0x87654321;
+    uint64_t c32 = R123_MULHILO32_MULHI_INTRIN(a32, b32);
+    assert( c32 == 0x09A0CD05 );
+    return c32 == 0x09A0CD05;
+}
+int mulhilo32_intrin_ok = test_mulhilo32_intrin();
+#else
+Ofalse(R123_USE_MULHILO32_MULHI_INTRIN);
+#endif
+
+#ifndef R123_USE_MULHILO64_C99
+#error "No  R123_USE_MULHILO64_C99"
+#endif
+#if R123_USE_MULHILO64_C99
+Otrue(R123_USE_MULHILO64_C99);
+#else
+Ofalse(R123_USE_MULHILO64_C99);
+#endif
+
+#ifndef R123_64BIT
+#error "No R123_64BIT"
+#else
+void xx() {
+    uint64_t a = R123_64BIT(0x1234567890abcdef);
+    assert ( (a >> 60) == 0x1 );
+}
+#endif
+
+#ifndef R123_USE_PHILOX_64BIT
+#error "No  R123_USE_PHILOX_64BIT"
+#endif
+#if R123_USE_PHILOX_64BIT
+Otrue(R123_USE_PHILOX_64BIT);
+#else
+Ofalse(R123_USE_PHILOX_64BIT);
+#endif
+
+#ifndef R123_ASSERT
+#error "No  R123_ASSERT"
+#else
+void chkassert(){
+    R123_ASSERT(1);
+}
+#endif
+
+#ifndef R123_STATIC_ASSERT
+#error "No  R123_STATIC_ASSERT"
+#else
+R123_STATIC_ASSERT(1, "looks true to me");
+void chkstaticassert(){
+    R123_STATIC_ASSERT(1, "it's ok inside a function too");
+}
+#endif
+
+int main(int , char **){return 0;}
diff --git a/lib/Random123-1.08/examples/ut_gsl.c b/lib/Random123-1.08/examples/ut_gsl.c
new file mode 100644
index 0000000..986de7c
--- /dev/null
+++ b/lib/Random123-1.08/examples/ut_gsl.c
@@ -0,0 +1,112 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <gsl/gsl_randist.h>
+#include <stdio.h>
+#include "Random123/philox.h"
+#include "Random123/threefry.h"
+#include "Random123/conventional/gsl_cbrng.h"
+#include <assert.h>
+
+/* Exercise the GSL_CBRNG macro */
+
+GSL_CBRNG(cbrng, threefry4x64); /* creates gsl_rng_cbrng */
+
+int main(int argc, char **argv){
+    int i;
+    gsl_rng *r;
+    gsl_rng *rcopy;
+    unsigned long save, x;
+    unsigned long saved[5];
+    double sum = 0.;
+    (void)argc; (void)argv; /* unused */
+
+    r = gsl_rng_alloc(gsl_rng_cbrng);
+    assert (gsl_rng_min(r) == 0);
+    assert (gsl_rng_max(r) == 0xffffffffUL); // Not necessarily ~0UL
+    assert (gsl_rng_size(r) > 0);
+
+    printf("%s\nulongs from %s in initial state\n", argv[0], gsl_rng_name(r));
+    for (i = 0; i < 5; i++) {
+	x = gsl_rng_get(r);
+        saved[i] = x;
+	printf("%d: 0x%lx\n", i, x);
+	assert(x != 0);
+    }
+    printf("uniforms from %s\n", gsl_rng_name(r));
+    for (i = 0; i < 5; i++) {
+        double z = gsl_rng_uniform(r);
+        sum += z;
+        printf("%d: %.4g\n", i, z);
+    }
+    assert( sum < 0.9*5 && sum > 0.1*5 && (long)"sum must be reasonably close  to 0.5*number of trials");
+    save = gsl_rng_get(r);
+
+    gsl_rng_set(r, 0xdeadbeef); /* set a non-zero seed */
+    printf("ulongs from %s after seed\n", gsl_rng_name(r));
+    for (i = 0; i < 5; i++) {
+	x = gsl_rng_get(r);
+	printf("%d: 0x%lx\n", i, x);
+	assert(x != 0);
+    }
+    /* make a copy of the total state */
+    rcopy = gsl_rng_alloc(gsl_rng_cbrng);
+    gsl_rng_memcpy(rcopy, r);
+    printf("uniforms from %s\n", gsl_rng_name(r));
+    sum = 0.;
+    for (i = 0; i < 5; i++) {
+        double x = gsl_rng_uniform(r);
+        double y = gsl_rng_uniform(rcopy);
+	printf("%d: %.4g\n", i, x);
+        sum += x;
+        assert(x == y);
+    }
+    assert(gsl_rng_get(r) != save);
+    assert( sum < 0.9*5 && sum > 0.1*5 && (long)"sum must be reasonably close  to 0.5*number of trials");
+
+    /* gsl_rng_set(*, 0) is supposed to recover the default seed */
+    gsl_rng_set(r, 0);
+    printf("ulongs from %s after restore to initial\n", gsl_rng_name(r));
+    for (i = 0; i < 5; i++) {
+	x = gsl_rng_get(r);
+        assert( x == saved[i] );
+	printf("%d: 0x%lx\n", i, x);
+	assert(x != 0);
+    }
+    printf("uniforms from %s\n", gsl_rng_name(r));
+    for (i = 0; i < 5; i++) {
+	printf("%d: %.4g\n", i, gsl_rng_uniform(r));
+    }
+    assert(gsl_rng_get(r) == save);
+    
+    gsl_rng_free (r);
+    return 0;
+}
diff --git a/lib/Random123-1.08/examples/ut_ua.cpp b/lib/Random123-1.08/examples/ut_ua.cpp
new file mode 100644
index 0000000..bfc342a
--- /dev/null
+++ b/lib/Random123-1.08/examples/ut_ua.cpp
@@ -0,0 +1,63 @@
+/*
+Copyright 2013, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#if __cplusplus<201103L
+#include <iostream>
+int main(int, char**){
+    std::cout << "ua.hpp requires C++11.  No tests performed\n";
+    return 0;
+}
+#else
+
+#include <Random123/array.h>
+#include <Random123/threefry.h>
+#include "ua.hpp"
+
+using namespace r123;
+int main(int, char **){
+    Threefry4x64 rng;
+    Threefry4x64::ctr_type c = {{1, 2, 3, 4}};
+    Threefry4x64::ukey_type uk = {{5, 6, 7, 8}};
+    Threefry4x64::key_type k = uk;
+    auto a = ua01<float>(rng(c, k)); // returns std::array<float,4>
+    for(auto e : a){
+        std::cout << e << "\n";
+    }
+    c.incr();
+    auto b = ua01<double>(rng(c, k));
+    for(auto e : b){
+        std::cout << e << "\n";
+    }
+
+    return 0;
+}
+#endif
diff --git a/lib/Random123-1.08/examples/ut_uniform.cpp b/lib/Random123-1.08/examples/ut_uniform.cpp
new file mode 100644
index 0000000..a8eece6
--- /dev/null
+++ b/lib/Random123-1.08/examples/ut_uniform.cpp
@@ -0,0 +1,167 @@
+/*
+Copyright 2013, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+ /* ut_uniform.cpp:   unit test for uniform.hpp.  
+
+    This is a "sanity test" of u01, uneg11 and u01fixedpt.  We confirm
+    that a histogram of few thousand calls to each of the functions
+    matches a reference histogram.  This verifies that the results are
+    generally sane i.e., they fall within the expected range, and that
+    they are close to a correct distribution.  It is *not* a foolproof
+    test of correctness, but it should catch portability issues
+    like errors in r123::make_signed or r123::make_unsigned
+    or r123::maxTvalue or misunderstandings about std::numeric_limits.
+
+    There is a "known answer test" for uniform.hpp in ut_uniform_IEEEkat.cpp,
+    but it is only expected to work on machines with strict IEEE arithmetic
+    and  no high-precicision intermediates.  See its own comments for
+    more details.
+ */
+
+#include "uniform.hpp"
+#include <Random123/threefry.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <map>
+#include <string>
+#include <sstream>
+
+using namespace r123;
+
+template <typename T>
+typename r123::make_unsigned<T>::type U(T x){ return x; }
+
+template <typename T>
+typename r123::make_signed<T>::type S(T x){ return x; }
+        
+#define Chk(u, Rng, Ftype) do{                            \
+        chk<Ftype, Rng>(#u, #Rng, #Ftype, &u<Ftype, Rng::ctr_type::value_type>); \
+    }while(0)
+
+std::map<std::string, std::string> refmap;
+
+void RefHist(const char* k, const char *v){
+    refmap[std::string(k)] = std::string(v);
+}
+
+void fillrefhist(){
+#include "ut_uniform_reference.hpp"
+}
+
+bool checking = true;
+int nfail = 0;
+
+template<typename Ftype, typename RNG, typename Utype>
+void chk(const std::string& fname, const std::string& rngname, const std::string& ftypename, Utype f){
+    std::string key = fname + " " + rngname + " " + ftypename;
+    RNG rng;
+    typedef typename RNG::ukey_type ukey_type;
+    typedef typename RNG::ctr_type ctr_type;
+    typedef typename RNG::key_type key_type;
+
+    ctr_type c = {{}};
+    ukey_type uk = {{}};
+    key_type k = uk;
+    // 26 bins - 13 greater than 0 and 13 less.  Why 13?  Because a
+    // prime number seems less likely to tickle the rounding-related
+    // corner cases, which is aruably both good and bad.
+    const int NBINS=26;
+    
+    int hist[NBINS] = {};
+    for(int i=0; i<1000; ++i){
+        c = c.incr();
+        ctr_type r = rng(c, k);
+        for(int j=0; j<ctr_type::static_size; ++j){
+            Ftype u = f(r[j]);
+            //printf("%s %llx, %.17g\n", key.c_str(), (long long)r[j], (double)u);
+            R123_ASSERT( u >= -1.);
+            R123_ASSERT( u <= 1.);
+            int idx = (int) ((u + Ftype(1.))*Ftype(NBINS/2));
+            hist[idx]++;
+        }
+    }
+    std::ostringstream oss;
+    for(int i=0; i<NBINS; ++i){
+        oss << " " << hist[i];
+    }
+    if(checking){
+        if( oss.str() != refmap[key] ){
+            printf("MISMATCH:  %s:\n\tcomputed histogram=%s\n\treference histogram=%s\n", 
+                   key.c_str(),
+                   oss.str().c_str(),
+                   refmap[key].c_str());
+            nfail++;
+        }
+    }else{
+        printf("RefHist(\"%s\", \"%s\");\n",  key.c_str(), oss.str().c_str());
+    }
+}
+
+int main(int argc, char **argv){
+    checking = (argc==1);
+    fillrefhist();
+
+    // 18 tests:  3 functions (u01, uneg11, u01fixedpt)
+    //          x 2 input sizes (32 bit or 64 bit)
+    //          x 3 output sizes (float, double, long double)
+    Chk(u01, Threefry4x32, float);
+    Chk(u01, Threefry4x32, double);
+    Chk(u01, Threefry4x32, long double);
+
+    Chk(u01, Threefry4x64, float);
+    Chk(u01, Threefry4x64, double);
+    Chk(u01, Threefry4x64, long double);
+
+    Chk(uneg11, Threefry4x32, float);
+    Chk(uneg11, Threefry4x32, double);
+    Chk(uneg11, Threefry4x32, long double);
+
+    Chk(uneg11, Threefry4x64, float);
+    Chk(uneg11, Threefry4x64, double);
+    Chk(uneg11, Threefry4x64, long double);
+    
+    Chk(u01fixedpt, Threefry4x32, float);
+    Chk(u01fixedpt, Threefry4x32, double);
+    Chk(u01fixedpt, Threefry4x32, long double);
+
+    Chk(u01fixedpt, Threefry4x64, float);
+    Chk(u01fixedpt, Threefry4x64, double);
+    Chk(u01fixedpt, Threefry4x64, long double);
+
+    if(nfail){
+        printf("// %s: FAILED %d Known-Answer-Tests failed\n", argv[0], nfail);
+    }else if(checking){
+        printf("%s: SUCCESS\n", argv[0]);
+    }
+
+    return !!nfail;
+}
diff --git a/lib/Random123-1.08/examples/ut_uniform_IEEEkat.cpp b/lib/Random123-1.08/examples/ut_uniform_IEEEkat.cpp
new file mode 100644
index 0000000..f7d9cf7
--- /dev/null
+++ b/lib/Random123-1.08/examples/ut_uniform_IEEEkat.cpp
@@ -0,0 +1,293 @@
+/*
+Copyright 2013, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+ /* ut_uniform_IEEEkat.cpp - a "Known Answer Test" for uniform.hpp
+
+    This code tests that the compilation environment reproduces
+    exactly the behavior of u01, uneg11 and u01fixedpt on an x86-64
+    system with strict IEEE arithmetic.  It is likely to fail on
+    systems that use 80-bit internal registers (e.g., 32-bit x86), and
+    systems that are smart enough to fuse floating point multiply and
+    add into a single, rounded-only-once instruction (e.g., PowerPC,
+    Fermi, newer ARMs, Haswell, Itanium, etc.).  Failures in these
+    cases are *not* necessarily problematic. */
+
+#include "uniform.hpp"
+#include <stdio.h>
+#include <stdlib.h>
+#include <map>
+#include <string>
+
+using namespace r123;
+
+std::map<std::string, long double> katmap;
+
+// Don't inline this.  It's called thousands of times in fill_katmap
+// and blows out the optimizer in older versions of clang and open64
+// if it's inlined.
+void insert(const char *s, long double v){
+    katmap[std::string(s)] = v;
+}
+
+void fill_katmap(){
+#include "ut_uniform_IEEEkatvectors.hpp"
+#if 0  // helpful for debug,
+    for(std::map<std::string, long double>::iterator p=katmap.begin(); p!=katmap.end(); ++p){
+        fprintf(stderr, "%s -> %La\n", p->first.c_str(), p->second);
+    }
+#endif
+}
+
+template <typename T>
+typename r123::make_unsigned<T>::type U(T x){ return x; }
+
+template <typename T>
+typename r123::make_signed<T>::type S(T x){ return x; }
+        
+bool checking = true;
+int nfail = 0;
+int nuntested = 0;
+int notfound = 0;
+
+#define DO1(T, expr, astr) DoOne<T>(#expr, astr, expr)
+
+#define DO(i, astr) do{                                     \
+        ChkSignInvariance(#i, i);                      \
+        if(std::numeric_limits<float>::digits == 24){ \
+            DO1(float, u01<float>(i), astr);                  \
+            DO1(float, uneg11<float>(i), astr);                 \
+            DO1(float, u01fixedpt<float>(i), astr);              \
+        }else{                                          \
+            printf("UNTESTED: %s:  float does not have a 24 bit mantissa\n", #i); \
+            nuntested++;                                                \
+        }                                                       \
+        if(std::numeric_limits<double>::digits == 53){ \
+            DO1(double, u01<double>(i), astr);                 \
+            DO1(double, uneg11<double>(i), astr);                \
+            DO1(double, u01fixedpt<double>(i), astr);             \
+        }else{                                          \
+            printf("UNTESTED: %s:  double does not have a 53 bit mantissa\n", #i); \
+            nuntested++;                                                \
+        }                                                       \
+        if(std::numeric_limits<long double>::digits == 64){     \
+            DO1(long double, u01<long double>(i), astr);                \
+            DO1(long double, uneg11<long double>(i), astr);              \
+            DO1(long double, u01fixedpt<long double>(i), astr);          \
+        }else{                                          \
+            printf("UNTESTED: %s:  long double does not have a 64 bit mantissa\n", #i); \
+            nuntested++;                                                \
+        }                                                       \
+    } while(0)
+
+// u01, uneg11 and u01fixedpt should all depend on the bits, but not the
+// signedness of their argument.  The templated functions S(i) and U(i)
+// return their argument cast to an approprite signed and unsigned type.
+// ChkSignInvariance verifies that.
+template <typename IType>
+void ChkSignInvariance(const std::string& s, IType i){
+    if( u01<float>(S(i)) != u01<float>(U(i)) ){ 
+        printf("INVARIANT FAILURE:  u01<float>(Signed(x)) != u01<float>(Unsigned(x)) x=%s\n", s.c_str()); 
+        nfail++;                                                        
+    }                                                                   
+    if( uneg11<float>(S(i)) != uneg11<float>(U(i)) ){                   
+        printf("INVARIANT FAILURE:  uneg11<float>(Signed(x)) != uneg11<float>(Unsigned(x)) x=%s\n", s.c_str());
+        nfail++;                                                        
+    }                                                                   
+    if( u01fixedpt<float>(S(i)) != u01fixedpt<float>(U(i)) ){           
+        printf("INVARIANT FAILURE:  u01<float>(Signed(x)) != u01<float>(Unsigned(x)) x=%s\n", s.c_str()); 
+        nfail++;                                                        
+    }                                                                   
+
+    if( u01<double>(S(i)) != u01<double>(U(i)) ){ 
+        printf("INVARIANT FAILURE:  u01<double>(Signed(x)) != u01<double>(Unsigned(x)) x=%s\n", s.c_str()); 
+        nfail++;                                                        
+    }                                                                   
+    if( uneg11<double>(S(i)) != uneg11<double>(U(i)) ){                   
+        printf("INVARIANT FAILURE:  uneg11<double>(Signed(x)) != uneg11<double>(Unsigned(x)) x=%s\n", s.c_str());
+        nfail++;                                                        
+    }                                                                   
+    if( u01fixedpt<double>(S(i)) != u01fixedpt<double>(U(i)) ){           
+        printf("INVARIANT FAILURE:  u01<double>(Signed(x)) != u01<double>(Unsigned(x)) x=%s\n", s.c_str()); 
+        nfail++;                                                        
+    }                                                                   
+
+    if( u01<long double>(S(i)) != u01<long double>(U(i)) ){ 
+        printf("INVARIANT FAILURE:  u01<long double>(Signed(x)) != u01<long double>(Unsigned(x)) x=%s\n", s.c_str()); 
+        nfail++;                                                        
+    }                                                                   
+    if( uneg11<long double>(S(i)) != uneg11<long double>(U(i)) ){                   
+        printf("INVARIANT FAILURE:  uneg11<long double>(Signed(x)) != uneg11<long double>(Unsigned(x)) x=%s\n", s.c_str());
+        nfail++;                                                        
+    }                                                                   
+    if( u01fixedpt<long double>(S(i)) != u01fixedpt<long double>(U(i)) ){           
+        printf("INVARIANT FAILURE:  u01<long double>(Signed(x)) != u01<long double>(Unsigned(x)) x=%s\n", s.c_str()); 
+        nfail++;                                                        
+    }                                                                   
+}
+
+template <typename T>
+void DoOne(const std::string s, const char* astr, volatile T x){
+    std::string ss = s + " a=" + astr;
+    volatile long double ldx = x;
+    if(checking){                                 
+        if( katmap.find(ss) == katmap.end() ){   
+            printf("NOT FOUND: katmap[%s]\n", ss.c_str());
+            notfound++;                           
+        }else{                                    
+            if(ldx!=katmap[ss]){                  
+                printf("MISMATCH:  %s: computed=%.21Lg reference=%.21Lg\n", ss.c_str(), ldx, katmap[ss]); 
+                nfail++;                                                
+            }                                                           
+        }                                                               
+    }else{                                                              
+        printf("insert(\"%s\", %#.21LgL);\n", ss.c_str(), ldx);     
+    }
+}
+
+void DO3264(int a){
+    const uint32_t maxu32 = std::numeric_limits<uint32_t>::max();
+    const uint64_t maxu64 = std::numeric_limits<uint64_t>::max();
+    const uint32_t minu32 = std::numeric_limits<uint32_t>::min();
+    const uint64_t minu64 = std::numeric_limits<uint64_t>::min();
+
+    const int32_t maxi32 = std::numeric_limits<int32_t>::max();
+    const int64_t maxi64 = std::numeric_limits<int64_t>::max();
+    const int32_t mini32 = std::numeric_limits<int32_t>::min();
+    const int64_t mini64 = std::numeric_limits<int64_t>::min();
+
+    char astr[32];
+    sprintf(astr, "%d", a);
+
+    DO( minu32 + uint32_t(a), astr );
+    DO( minu64 + uint64_t(a), astr );
+    DO( mini32 + int32_t(a), astr ); 
+    DO( mini64 + int64_t(a), astr ); 
+
+    DO( maxu32 - uint32_t(a), astr );
+    DO( maxu64 - uint64_t(a), astr );
+    DO( maxi32 - int32_t(a), astr ); 
+    DO( maxi64 - int64_t(a), astr ); 
+}
+
+int main(int argc, char **argv){
+    if(argc>1){
+        checking = false;
+        printf("/* This file was created by '%s %s' on a reference\n"
+               "   platform, and is #included in the recompilation of %s\n"
+               "   on a target platform.  When %s is run with no arguments\n"
+               "   on the target platform, it asserts that the values computed\n"
+               "   on the target platform match the reference values recorded here.\n"
+               "   These reference values were computed on an x86_64 using 32-bit,\n"
+               "   64-bit and 80-bit IEEE arithmetic for float, double and long double\n"
+               "   respectively.  Other platforms with different representations of\n"
+               "   floating point values or different conventions for how intermediates\n"
+               "   are stored and rounded will almost certainly fail these tests\n"
+               "   even though their results might be perfectly valid.\n"
+               "*/\n", argv[0], argv[1], argv[0], argv[0]);
+    }
+    fill_katmap();
+    
+
+    DO3264(0);
+    DO3264(1);
+    DO3264(2);
+    DO3264(3);
+    DO3264(4);
+    DO3264(5);
+
+    DO3264(63);
+    DO3264(64);
+    DO3264(65);
+
+    DO3264(127);
+    DO3264(128);
+    DO3264(129);
+
+    DO3264(191);
+    DO3264(192);
+    DO3264(193);
+
+    DO3264(255);
+    DO3264(256);
+    DO3264(257);
+
+    DO3264(319);
+    DO3264(320);
+    DO3264(321);
+
+    DO3264(382);
+    DO3264(383);
+    DO3264(384);
+
+    DO3264(639);
+    DO3264(640);
+    DO3264(641);
+
+    DO3264(1023);
+    DO3264(1024);
+    DO3264(1025);
+
+    DO3264(3070);
+    DO3264(3071);
+    DO3264(3072);
+
+    DO3264(5119);
+    DO3264(5120);
+    DO3264(5121);
+
+    if(notfound){
+        printf("// %s: WARNING:  %d tests were not checked because reference values were not compiled in\n",
+               argv[0], notfound);
+    }
+    if(nuntested){
+        printf("// %s: WARNING:  %d tests were not performed because the floating point rep does not match the IEEE format used to compute reference values\n", 
+               argv[0], nuntested);
+    }
+    if(nfail){
+        printf("// %s: FAILED %d Known-Answer-Tests failed\n", argv[0], nfail);
+        printf("Such failures may be due to non-IEEE arithmetic on your platform.  In some \n"
+               "cases, you may be able to recover IEEE arithmetic by pre-defining the\n"
+               "pp-symbol R123_UNIFORM_FLOAT_STORE to a non-zero value, e.g., adding\n"
+               "-DR123_UNIFORM_FLOAT_STORE=1 to the compile command line.  On some\n"
+               "systems (notably, 32-bit x86 architectures) this will prevent use of\n"
+               "extra-wide internal floating point registers and will recover IEEE\n"
+               "arithmetic.  Unfortunately, this will make u01 and uneg11 significantly\n"
+               "slower, so you may not wish to define it in production code.  As far\n"
+               "as we know, the floating point values returned with the symbol unset\n"
+               "are perfectly reasonable.  They simply don't perfectly match the\n"
+               "values computed on our reference x86-64 platform with IEEE arithmetic\n");
+    }else{
+        printf("// %s: SUCCESS\n", argv[0]);
+    }
+
+    return !!nfail;
+}
diff --git a/lib/Random123-1.08/examples/ut_uniform_IEEEkatvectors.hpp b/lib/Random123-1.08/examples/ut_uniform_IEEEkatvectors.hpp
new file mode 100644
index 0000000..4246b60
--- /dev/null
+++ b/lib/Random123-1.08/examples/ut_uniform_IEEEkatvectors.hpp
@@ -0,0 +1,2605 @@
+/* This file was created by './ut_uniform_IEEEkat 1' on a reference
+   platform, and is #included in the recompilation of ./ut_uniform_IEEEkat
+   on a target platform.  When ./ut_uniform_IEEEkat is run with no arguments
+   on the target platform, it asserts that the values computed
+   on the target platform match the reference values recorded here.
+   These reference values were computed on an x86_64 using 32-bit,
+   64-bit and 80-bit IEEE arithmetic for float, double and long double
+   respectively.  Other platforms with different representations of
+   floating point values or different conventions for how intermediates
+   are stored and rounded will almost certainly fail these tests
+   even though their results might be perfectly valid.
+*/
+insert("u01<float>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=0", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("u01<float>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=0", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=0", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L);
+insert("u01<float>(mini32 + int32_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=0", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=0", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=0", -0.999999999767169356346L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L);
+insert("u01<long double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=0", -0.999999999767169356346L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L);
+insert("u01<float>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=0", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=0", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=0", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=0", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=0", -0.999999999999999999946L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=0", 0.500000000000000000054L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=0", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=0", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=0", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=0", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=0", 0.999999999999999999946L);
+insert("u01<float>(maxi32 - int32_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=0", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=0", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=0", 0.999999999767169356346L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=0", 0.999999999767169356346L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L);
+insert("u01<float>(maxi64 - int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=0", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=0", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=0", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=0", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=0", 0.499999999999999999973L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=0", 0.999999999999999999946L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=0", 0.499999999999999999946L);
+insert("u01<float>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("u01<float>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1", 5.42101086242752217004e-20L);
+insert("u01<float>(mini32 + int32_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=1", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=1", -0.999999999301508069038L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L);
+insert("u01<long double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=1", -0.999999999301508069038L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L);
+insert("u01<float>(mini64 + int64_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=1", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=1", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=1", 0.500000000000000000108L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=1", -0.999999999999999999837L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1", 0.500000000000000000054L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=1", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=1", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=1", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999999892L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999999946L);
+insert("u01<float>(maxi32 - int32_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=1", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=1", 0.999999999301508069038L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=1", 0.999999999301508069038L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L);
+insert("u01<float>(maxi64 - int64_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=1", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=1", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=1", 0.499999999999999999919L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=1", 0.999999999999999999837L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1", 0.499999999999999999946L);
+insert("u01<float>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=2", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("u01<float>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=2", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=2", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=2", 1.62630325872825665101e-19L);
+insert("u01<float>(mini32 + int32_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=2", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=2", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=2", -0.999999998835846781731L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L);
+insert("u01<long double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=2", -0.999999998835846781731L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L);
+insert("u01<float>(mini64 + int64_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=2", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=2", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=2", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=2", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=2", 0.500000000000000000108L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=2", -0.999999999999999999729L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=2", 0.500000000000000000163L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=2", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=2", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=2", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=2", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=2", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999999892L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999999837L);
+insert("u01<float>(maxi32 - int32_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=2", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=2", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=2", 0.999999998835846781731L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=2", 0.999999998835846781731L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L);
+insert("u01<float>(maxi64 - int64_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=2", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=2", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=2", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=2", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=2", 0.499999999999999999864L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=2", 0.999999999999999999729L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=2", 0.499999999999999999837L);
+insert("u01<float>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("u01<float>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3", 1.62630325872825665101e-19L);
+insert("u01<float>(mini32 + int32_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=3", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=3", -0.999999998370185494423L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L);
+insert("u01<long double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=3", -0.999999998370185494423L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L);
+insert("u01<float>(mini64 + int64_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=3", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=3", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=3", 0.500000000000000000217L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=3", -0.999999999999999999621L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3", 0.500000000000000000163L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=3", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=3", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=3", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999999783L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999999837L);
+insert("u01<float>(maxi32 - int32_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=3", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=3", 0.999999998370185494423L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=3", 0.999999998370185494423L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L);
+insert("u01<float>(maxi64 - int64_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=3", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=3", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=3", 0.499999999999999999810L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=3", 0.999999999999999999621L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3", 0.499999999999999999837L);
+insert("u01<float>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=4", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("u01<float>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=4", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=4", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=4", 2.71050543121376108502e-19L);
+insert("u01<float>(mini32 + int32_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=4", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=4", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=4", -0.999999997904524207115L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L);
+insert("u01<long double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=4", -0.999999997904524207115L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L);
+insert("u01<float>(mini64 + int64_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=4", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=4", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=4", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=4", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=4", 0.500000000000000000217L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=4", -0.999999999999999999512L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=4", 0.500000000000000000271L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=4", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=4", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=4", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=4", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=4", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999999783L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999999729L);
+insert("u01<float>(maxi32 - int32_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=4", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=4", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=4", 0.999999997904524207115L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=4", 0.999999997904524207115L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L);
+insert("u01<float>(maxi64 - int64_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=4", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=4", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=4", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=4", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=4", 0.499999999999999999756L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=4", 0.999999999999999999512L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=4", 0.499999999999999999729L);
+insert("u01<float>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("u01<float>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5", 2.71050543121376108502e-19L);
+insert("u01<float>(mini32 + int32_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=5", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=5", -0.999999997438862919807L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L);
+insert("u01<long double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=5", -0.999999997438862919807L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L);
+insert("u01<float>(mini64 + int64_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=5", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=5", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=5", 0.500000000000000000325L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=5", -0.999999999999999999404L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5", 0.500000000000000000271L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=5", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=5", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=5", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999999675L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999999729L);
+insert("u01<float>(maxi32 - int32_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=5", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=5", 0.999999997438862919807L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=5", 0.999999997438862919807L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L);
+insert("u01<float>(maxi64 - int64_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=5", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=5", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=5", 0.499999999999999999702L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=5", 0.999999999999999999404L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5", 0.499999999999999999729L);
+insert("u01<float>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=63", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=63", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=63", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=63", 3.41523684332933896712e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=63", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=63", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=63", -0.999999970430508255959L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L);
+insert("u01<long double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=63", -0.999999970430508255959L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L);
+insert("u01<float>(mini64 + int64_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=63", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=63", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=63", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=63", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=63", 0.500000000000000003469L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=63", -0.999999999999999993115L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=63", 0.500000000000000003415L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=63", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=63", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=63", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=63", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=63", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999996531L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999996585L);
+insert("u01<float>(maxi32 - int32_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=63", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=63", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=63", 0.999999970430508255959L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=63", 0.999999970430508255959L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L);
+insert("u01<float>(maxi64 - int64_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=63", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=63", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=63", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=63", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=63", 0.499999999999999996558L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=63", 0.999999999999999993115L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=63", 0.499999999999999996585L);
+insert("u01<float>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=64", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=64", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=64", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=64", 3.52365706057788941052e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=64", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=64", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=64", -0.999999969964846968651L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L);
+insert("u01<long double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=64", -0.999999969964846968651L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L);
+insert("u01<float>(mini64 + int64_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=64", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=64", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=64", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=64", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=64", 0.500000000000000003469L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=64", -0.999999999999999993007L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=64", 0.500000000000000003524L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=64", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=64", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=64", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=64", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=64", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999996531L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999996476L);
+insert("u01<float>(maxi32 - int32_t(a)) a=64", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=64", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=64", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=64", 0.999999969964846968651L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=64", 0.999999969964846968651L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L);
+insert("u01<float>(maxi64 - int64_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=64", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=64", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=64", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=64", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=64", 0.499999999999999996503L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=64", 0.999999999999999993007L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=64", 0.499999999999999996476L);
+insert("u01<float>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=65", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=65", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=65", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=65", 3.52365706057788941052e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=65", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=65", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=65", -0.999999969499185681343L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L);
+insert("u01<long double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=65", -0.999999969499185681343L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L);
+insert("u01<float>(mini64 + int64_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=65", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=65", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=65", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=65", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=65", 0.500000000000000003578L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=65", -0.999999999999999992898L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=65", 0.500000000000000003524L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=65", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=65", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=65", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=65", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=65", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999996422L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999996476L);
+insert("u01<float>(maxi32 - int32_t(a)) a=65", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=65", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=65", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=65", 0.999999969499185681343L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=65", 0.999999969499185681343L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L);
+insert("u01<float>(maxi64 - int64_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=65", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=65", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=65", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=65", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=65", 0.499999999999999996449L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=65", 0.999999999999999992898L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=65", 0.499999999999999996476L);
+insert("u01<float>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=127", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=127", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=127", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=127", 6.88468379528295315595e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=127", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=127", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=127", -0.999999940628185868263L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L);
+insert("u01<long double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=127", -0.999999940628185868263L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L);
+insert("u01<float>(mini64 + int64_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=127", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=127", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=127", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=127", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=127", 0.500000000000000006939L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=127", -0.999999999999999986176L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=127", 0.500000000000000006885L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=127", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=127", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=127", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=127", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=127", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999993061L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999993115L);
+insert("u01<float>(maxi32 - int32_t(a)) a=127", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=127", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=127", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=127", 0.999999940628185868263L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=127", 0.999999940628185868263L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L);
+insert("u01<float>(maxi64 - int64_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=127", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=127", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=127", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=127", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=127", 0.499999999999999993088L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=127", 0.999999999999999986176L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=127", 0.499999999999999993115L);
+insert("u01<float>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=128", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=128", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=128", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=128", 6.99310401253150359935e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=128", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=128", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=128", -0.999999940162524580956L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L);
+insert("u01<long double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=128", -0.999999940162524580956L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L);
+insert("u01<float>(mini64 + int64_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=128", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=128", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=128", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=128", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=128", 0.500000000000000006939L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=128", -0.999999999999999986068L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=128", 0.500000000000000006993L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=128", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=128", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=128", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=128", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=128", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999993061L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999993007L);
+insert("u01<float>(maxi32 - int32_t(a)) a=128", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=128", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=128", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=128", 0.999999940162524580956L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=128", 0.999999940162524580956L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L);
+insert("u01<float>(maxi64 - int64_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=128", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=128", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=128", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=128", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=128", 0.499999999999999993034L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=128", 0.999999999999999986068L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=128", 0.499999999999999993007L);
+insert("u01<float>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=129", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=129", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=129", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=129", 6.99310401253150359935e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=129", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=129", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=129", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=129", -0.999999939696863293648L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L);
+insert("u01<long double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=129", -0.999999939696863293648L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L);
+insert("u01<float>(mini64 + int64_t(a)) a=129", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=129", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=129", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=129", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=129", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=129", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=129", 0.500000000000000007047L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=129", -0.999999999999999985960L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=129", 0.500000000000000006993L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=129", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=129", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=129", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=129", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=129", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999992953L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999993007L);
+insert("u01<float>(maxi32 - int32_t(a)) a=129", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=129", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=129", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=129", 0.999999939696863293648L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=129", 0.999999939696863293648L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L);
+insert("u01<float>(maxi64 - int64_t(a)) a=129", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=129", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=129", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=129", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=129", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=129", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=129", 0.499999999999999992980L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=129", 0.999999999999999985960L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=129", 0.499999999999999993007L);
+insert("u01<float>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=191", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=191", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=191", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=191", 1.03541307472365673448e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=191", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=191", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=191", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=191", -0.999999910825863480568L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L);
+insert("u01<long double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=191", -0.999999910825863480568L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L);
+insert("u01<float>(mini64 + int64_t(a)) a=191", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=191", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=191", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=191", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=191", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=191", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=191", 0.500000000000000010408L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=191", -0.999999999999999979238L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=191", 0.500000000000000010354L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=191", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=191", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=191", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=191", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=191", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999989592L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999989646L);
+insert("u01<float>(maxi32 - int32_t(a)) a=191", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=191", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=191", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=191", 0.999999910825863480568L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=191", 0.999999910825863480568L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L);
+insert("u01<float>(maxi64 - int64_t(a)) a=191", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=191", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=191", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=191", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=191", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=191", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=191", 0.499999999999999989619L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=191", 0.999999999999999979238L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=191", 0.499999999999999989646L);
+insert("u01<float>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=192", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=192", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=192", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=192", 1.04625509644851177882e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=192", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=192", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=192", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=192", -0.999999910360202193260L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L);
+insert("u01<long double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=192", -0.999999910360202193260L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L);
+insert("u01<float>(mini64 + int64_t(a)) a=192", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=192", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=192", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=192", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=192", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=192", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=192", 0.500000000000000010408L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=192", -0.999999999999999979129L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=192", 0.500000000000000010463L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=192", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=192", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=192", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=192", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=192", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999989592L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999989537L);
+insert("u01<float>(maxi32 - int32_t(a)) a=192", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=192", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=192", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=192", 0.999999910360202193260L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=192", 0.999999910360202193260L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L);
+insert("u01<float>(maxi64 - int64_t(a)) a=192", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=192", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=192", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=192", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=192", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=192", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=192", 0.499999999999999989565L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=192", 0.999999999999999979129L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=192", 0.499999999999999989537L);
+insert("u01<float>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=193", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=193", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=193", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=193", 1.04625509644851177882e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=193", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=193", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=193", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=193", -0.999999909894540905952L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L);
+insert("u01<long double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=193", -0.999999909894540905952L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L);
+insert("u01<float>(mini64 + int64_t(a)) a=193", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=193", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=193", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=193", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=193", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=193", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=193", 0.500000000000000010517L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=193", -0.999999999999999979021L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=193", 0.500000000000000010463L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=193", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=193", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=193", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=193", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=193", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999989483L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999989537L);
+insert("u01<float>(maxi32 - int32_t(a)) a=193", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=193", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=193", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=193", 0.999999909894540905952L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=193", 0.999999909894540905952L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L);
+insert("u01<float>(maxi64 - int64_t(a)) a=193", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=193", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=193", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=193", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=193", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=193", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=193", 0.499999999999999989510L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=193", 0.999999999999999979021L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=193", 0.499999999999999989537L);
+insert("u01<float>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=255", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=255", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=255", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=255", 1.38235776991901815336e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=255", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=255", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=255", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=255", -0.999999881023541092873L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L);
+insert("u01<long double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=255", -0.999999881023541092873L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L);
+insert("u01<float>(mini64 + int64_t(a)) a=255", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=255", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=255", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=255", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=255", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=255", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=255", 0.500000000000000013878L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=255", -0.999999999999999972299L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=255", 0.500000000000000013824L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=255", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=255", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=255", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=255", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=255", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999986122L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999986176L);
+insert("u01<float>(maxi32 - int32_t(a)) a=255", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=255", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=255", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=255", 0.999999881023541092873L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=255", 0.999999881023541092873L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L);
+insert("u01<float>(maxi64 - int64_t(a)) a=255", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=255", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=255", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=255", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=255", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=255", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=255", 0.499999999999999986149L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=255", 0.999999999999999972299L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=255", 0.499999999999999986176L);
+insert("u01<float>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=256", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=256", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=256", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=256", 1.39319979164387319770e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=256", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=256", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=256", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=256", -0.999999880557879805565L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L);
+insert("u01<long double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=256", -0.999999880557879805565L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L);
+insert("u01<float>(mini64 + int64_t(a)) a=256", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=256", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=256", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=256", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=256", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=256", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=256", 0.500000000000000013878L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=256", -0.999999999999999972190L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=256", 0.500000000000000013932L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=256", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=256", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=256", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=256", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=256", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999986122L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999986068L);
+insert("u01<float>(maxi32 - int32_t(a)) a=256", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=256", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=256", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=256", 0.999999880557879805565L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=256", 0.999999880557879805565L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L);
+insert("u01<float>(maxi64 - int64_t(a)) a=256", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=256", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=256", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=256", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=256", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=256", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=256", 0.499999999999999986095L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=256", 0.999999999999999972190L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=256", 0.499999999999999986068L);
+insert("u01<float>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=257", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=257", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=257", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=257", 1.39319979164387319770e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=257", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=257", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=257", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=257", -0.999999880092218518257L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L);
+insert("u01<long double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=257", -0.999999880092218518257L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L);
+insert("u01<float>(mini64 + int64_t(a)) a=257", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=257", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=257", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=257", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=257", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=257", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=257", 0.500000000000000013986L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=257", -0.999999999999999972082L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=257", 0.500000000000000013932L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=257", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=257", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=257", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=257", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=257", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999986014L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999986068L);
+insert("u01<float>(maxi32 - int32_t(a)) a=257", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=257", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=257", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=257", 0.999999880092218518257L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=257", 0.999999880092218518257L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L);
+insert("u01<float>(maxi64 - int64_t(a)) a=257", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=257", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=257", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=257", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=257", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=257", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=257", 0.499999999999999986041L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=257", 0.999999999999999972082L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=257", 0.499999999999999986068L);
+insert("u01<float>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=319", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=319", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=319", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=319", 1.72930246511437957224e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=319", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=319", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=319", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=319", -0.999999851221218705177L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L);
+insert("u01<long double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=319", -0.999999851221218705177L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L);
+insert("u01<float>(mini64 + int64_t(a)) a=319", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=319", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=319", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=319", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=319", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=319", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=319", 0.500000000000000017347L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=319", -0.999999999999999965360L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=319", 0.500000000000000017293L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=319", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=319", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=319", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=319", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=319", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999982653L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999982707L);
+insert("u01<float>(maxi32 - int32_t(a)) a=319", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=319", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=319", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=319", 0.999999851221218705177L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=319", 0.999999851221218705177L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L);
+insert("u01<float>(maxi64 - int64_t(a)) a=319", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=319", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=319", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=319", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=319", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=319", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=319", 0.499999999999999982680L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=319", 0.999999999999999965360L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=319", 0.499999999999999982707L);
+insert("u01<float>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=320", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=320", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=320", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=320", 1.74014448683923461658e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=320", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=320", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=320", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=320", -0.999999850755557417870L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L);
+insert("u01<long double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=320", -0.999999850755557417870L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L);
+insert("u01<float>(mini64 + int64_t(a)) a=320", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=320", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=320", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=320", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=320", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=320", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=320", 0.500000000000000017347L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=320", -0.999999999999999965251L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=320", 0.500000000000000017401L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=320", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=320", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=320", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=320", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=320", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999982653L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999982599L);
+insert("u01<float>(maxi32 - int32_t(a)) a=320", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=320", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=320", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=320", 0.999999850755557417870L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=320", 0.999999850755557417870L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L);
+insert("u01<float>(maxi64 - int64_t(a)) a=320", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=320", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=320", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=320", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=320", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=320", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=320", 0.499999999999999982626L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=320", 0.999999999999999965251L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=320", 0.499999999999999982599L);
+insert("u01<float>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=321", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=321", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=321", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=321", 1.74014448683923461658e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=321", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=321", -0.999999821186065673828L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=321", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=321", -0.999999850289896130562L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L);
+insert("u01<long double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=321", -0.999999850289896130562L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L);
+insert("u01<float>(mini64 + int64_t(a)) a=321", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=321", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=321", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=321", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=321", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=321", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=321", 0.500000000000000017456L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=321", -0.999999999999999965143L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=321", 0.500000000000000017401L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=321", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=321", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=321", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=321", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=321", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999982544L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999982599L);
+insert("u01<float>(maxi32 - int32_t(a)) a=321", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=321", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=321", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=321", 0.999999850289896130562L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=321", 0.999999850289896130562L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L);
+insert("u01<float>(maxi64 - int64_t(a)) a=321", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=321", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=321", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=321", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=321", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=321", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=321", 0.499999999999999982571L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=321", 0.999999999999999965143L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=321", 0.499999999999999982599L);
+insert("u01<float>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=382", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=382", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=382", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=382", 2.07624716030974099112e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=382", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=382", -0.999999821186065673828L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=382", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=382", -0.999999821884557604790L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L);
+insert("u01<long double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=382", -0.999999821884557604790L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L);
+insert("u01<float>(mini64 + int64_t(a)) a=382", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=382", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=382", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=382", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=382", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=382", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=382", 0.500000000000000020708L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=382", -0.999999999999999958529L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=382", 0.500000000000000020762L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=382", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=382", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=382", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=382", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=382", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999979292L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999979238L);
+insert("u01<float>(maxi32 - int32_t(a)) a=382", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=382", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=382", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=382", 0.999999821884557604790L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=382", 0.999999821884557604790L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L);
+insert("u01<float>(maxi64 - int64_t(a)) a=382", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=382", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=382", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=382", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=382", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=382", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=382", 0.499999999999999979265L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=382", 0.999999999999999958529L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=382", 0.499999999999999979238L);
+insert("u01<float>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=383", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=383", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=383", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=383", 2.07624716030974099112e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=383", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=383", -0.999999821186065673828L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=383", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=383", -0.999999821418896317482L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L);
+insert("u01<long double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=383", -0.999999821418896317482L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L);
+insert("u01<float>(mini64 + int64_t(a)) a=383", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=383", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=383", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=383", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=383", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=383", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=383", 0.500000000000000020817L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=383", -0.999999999999999958421L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=383", 0.500000000000000020762L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=383", 0.999999880790710449219L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=383", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=383", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=383", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=383", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999979183L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999979238L);
+insert("u01<float>(maxi32 - int32_t(a)) a=383", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=383", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=383", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=383", 0.999999821418896317482L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=383", 0.999999821418896317482L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L);
+insert("u01<float>(maxi64 - int64_t(a)) a=383", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=383", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=383", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=383", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=383", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=383", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=383", 0.499999999999999979210L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=383", 0.999999999999999958421L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=383", 0.499999999999999979238L);
+insert("u01<float>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=384", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=384", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=384", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=384", 2.08708918203459603546e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=384", 0.500000119209289550781L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=384", -0.999999821186065673828L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=384", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=384", -0.999999820953235030174L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L);
+insert("u01<long double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=384", -0.999999820953235030174L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L);
+insert("u01<float>(mini64 + int64_t(a)) a=384", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=384", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=384", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=384", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=384", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=384", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=384", 0.500000000000000020817L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=384", -0.999999999999999958312L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=384", 0.500000000000000020871L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=384", 0.999999880790710449219L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=384", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=384", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=384", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=384", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999979183L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999979129L);
+insert("u01<float>(maxi32 - int32_t(a)) a=384", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=384", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=384", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=384", 0.999999820953235030174L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=384", 0.999999820953235030174L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L);
+insert("u01<float>(maxi64 - int64_t(a)) a=384", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=384", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=384", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=384", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=384", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=384", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=384", 0.499999999999999979156L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=384", 0.999999999999999958312L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=384", 0.499999999999999979129L);
+insert("u01<float>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=639", 1.78813934326171875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=639", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=639", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=639", 3.46402594109118666665e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=639", 0.500000119209289550781L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=639", -0.999999701976776123047L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=639", 0.500000178813934326172L);
+insert("u01<double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=639", -0.999999702209606766701L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L);
+insert("u01<long double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=639", -0.999999702209606766701L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L);
+insert("u01<float>(mini64 + int64_t(a)) a=639", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=639", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=639", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=639", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=639", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=639", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=639", 0.500000000000000034694L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=639", -0.999999999999999930665L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=639", 0.500000000000000034640L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=639", 0.999999880790710449219L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=639", 0.999999821186065673828L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=639", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=639", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=639", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999965306L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999965360L);
+insert("u01<float>(maxi32 - int32_t(a)) a=639", 0.499999850988388061523L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=639", 0.999999701976776123047L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=639", 0.499999821186065673828L);
+insert("u01<double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=639", 0.999999702209606766701L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=639", 0.999999702209606766701L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L);
+insert("u01<float>(maxi64 - int64_t(a)) a=639", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=639", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=639", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=639", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=639", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=639", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=639", 0.499999999999999965333L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=639", 0.999999999999999930665L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=639", 0.499999999999999965360L);
+insert("u01<float>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=640", 1.78813934326171875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=640", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=640", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=640", 3.47486796281604171099e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=640", 0.500000119209289550781L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=640", -0.999999701976776123047L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=640", 0.500000178813934326172L);
+insert("u01<double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=640", -0.999999701743945479393L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L);
+insert("u01<long double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=640", -0.999999701743945479393L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L);
+insert("u01<float>(mini64 + int64_t(a)) a=640", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=640", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=640", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=640", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=640", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=640", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=640", 0.500000000000000034694L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=640", -0.999999999999999930557L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=640", 0.500000000000000034749L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=640", 0.999999821186065673828L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=640", 0.999999821186065673828L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=640", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=640", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=640", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999965306L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999965251L);
+insert("u01<float>(maxi32 - int32_t(a)) a=640", 0.499999850988388061523L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=640", 0.999999701976776123047L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=640", 0.499999821186065673828L);
+insert("u01<double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=640", 0.999999701743945479393L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=640", 0.999999701743945479393L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L);
+insert("u01<float>(maxi64 - int64_t(a)) a=640", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=640", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=640", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=640", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=640", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=640", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=640", 0.499999999999999965278L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=640", 0.999999999999999930557L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=640", 0.499999999999999965251L);
+insert("u01<float>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=641", 1.78813934326171875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=641", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=641", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=641", 3.47486796281604171099e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=641", 0.500000178813934326172L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=641", -0.999999701976776123047L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=641", 0.500000178813934326172L);
+insert("u01<double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=641", -0.999999701278284192085L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L);
+insert("u01<long double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=641", -0.999999701278284192085L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L);
+insert("u01<float>(mini64 + int64_t(a)) a=641", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=641", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=641", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=641", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=641", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=641", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=641", 0.500000000000000034803L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=641", -0.999999999999999930448L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=641", 0.500000000000000034749L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=641", 0.999999821186065673828L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=641", 0.999999821186065673828L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=641", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=641", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=641", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999965197L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999965251L);
+insert("u01<float>(maxi32 - int32_t(a)) a=641", 0.499999850988388061523L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=641", 0.999999701976776123047L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=641", 0.499999821186065673828L);
+insert("u01<double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=641", 0.999999701278284192085L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=641", 0.999999701278284192085L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L);
+insert("u01<float>(maxi64 - int64_t(a)) a=641", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=641", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=641", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=641", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=641", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=641", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=641", 0.499999999999999965224L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=641", 0.999999999999999930448L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=641", 0.499999999999999965251L);
+insert("u01<float>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1023", 1.78813934326171875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1023", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1023", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1023", 5.54569411226335517995e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=1023", 0.500000238418579101562L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=1023", -0.999999523162841796875L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1023", 0.500000178813934326172L);
+insert("u01<double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=1023", -0.999999523395672440529L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L);
+insert("u01<long double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=1023", -0.999999523395672440529L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L);
+insert("u01<float>(mini64 + int64_t(a)) a=1023", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=1023", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1023", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=1023", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=1023", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1023", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=1023", 0.500000000000000055511L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=1023", -0.999999999999999889032L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1023", 0.500000000000000055457L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=1023", 0.999999761581420898438L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1023", 0.999999821186065673828L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=1023", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1023", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=1023", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999944489L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999944543L);
+insert("u01<float>(maxi32 - int32_t(a)) a=1023", 0.499999761581420898438L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=1023", 0.999999523162841796875L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1023", 0.499999821186065673828L);
+insert("u01<double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=1023", 0.999999523395672440529L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=1023", 0.999999523395672440529L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L);
+insert("u01<float>(maxi64 - int64_t(a)) a=1023", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=1023", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1023", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=1023", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944516L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=1023", 0.999999999999999889032L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944543L);
+insert("u01<float>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1024", 2.98023223876953125000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1024", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1024", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1024", 5.55653613398821022429e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=1024", 0.500000238418579101562L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=1024", -0.999999523162841796875L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1024", 0.500000298023223876953L);
+insert("u01<double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=1024", -0.999999522930011153221L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L);
+insert("u01<long double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=1024", -0.999999522930011153221L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L);
+insert("u01<float>(mini64 + int64_t(a)) a=1024", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=1024", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1024", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=1024", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=1024", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1024", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=1024", 0.500000000000000055511L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=1024", -0.999999999999999888923L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1024", 0.500000000000000055565L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=1024", 0.999999761581420898438L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1024", 0.999999701976776123047L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=1024", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1024", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999888978L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999944489L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999944435L);
+insert("u01<float>(maxi32 - int32_t(a)) a=1024", 0.499999761581420898438L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=1024", 0.999999523162841796875L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1024", 0.499999701976776123047L);
+insert("u01<double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=1024", 0.999999522930011153221L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=1024", 0.999999522930011153221L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L);
+insert("u01<float>(maxi64 - int64_t(a)) a=1024", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=1024", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1024", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=1024", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944462L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=1024", 0.999999999999999888923L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944435L);
+insert("u01<float>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1025", 2.98023223876953125000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1025", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1025", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1025", 5.55653613398821022429e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=1025", 0.500000238418579101562L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=1025", -0.999999523162841796875L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1025", 0.500000298023223876953L);
+insert("u01<double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=1025", -0.999999522464349865913L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L);
+insert("u01<long double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=1025", -0.999999522464349865913L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L);
+insert("u01<float>(mini64 + int64_t(a)) a=1025", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=1025", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1025", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=1025", 0.500000000000000111022L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=1025", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1025", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=1025", 0.500000000000000055620L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=1025", -0.999999999999999888815L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1025", 0.500000000000000055565L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=1025", 0.999999761581420898438L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1025", 0.999999701976776123047L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=1025", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1025", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999888978L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999944380L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999944435L);
+insert("u01<float>(maxi32 - int32_t(a)) a=1025", 0.499999761581420898438L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=1025", 0.999999523162841796875L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1025", 0.499999701976776123047L);
+insert("u01<double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=1025", 0.999999522464349865913L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=1025", 0.999999522464349865913L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L);
+insert("u01<float>(maxi64 - int64_t(a)) a=1025", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=1025", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1025", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=1025", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944408L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=1025", 0.999999999999999888815L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944435L);
+insert("u01<float>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3070", 6.55651092529296875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3070", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3070", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3070", 1.66479243585149205842e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=3070", 0.500000715255737304688L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=3070", -0.999998569488525390625L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3070", 0.500000655651092529297L);
+insert("u01<double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=3070", -0.999998570187017321587L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L);
+insert("u01<long double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=3070", -0.999998570187017321587L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L);
+insert("u01<float>(mini64 + int64_t(a)) a=3070", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=3070", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3070", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=3070", 0.500000000000000111022L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=3070", -0.999999999999999666933L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3070", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=3070", 0.500000000000000166425L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=3070", -0.999999999999999667096L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3070", 0.500000000000000166479L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=3070", 0.999999284744262695312L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3070", 0.999999344348907470703L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=3070", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3070", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999888978L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999833575L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999833521L);
+insert("u01<float>(maxi32 - int32_t(a)) a=3070", 0.499999284744262695312L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=3070", 0.999998569488525390625L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3070", 0.499999344348907470703L);
+insert("u01<double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=3070", 0.999998570187017321587L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=3070", 0.999998570187017321587L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L);
+insert("u01<float>(maxi64 - int64_t(a)) a=3070", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=3070", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3070", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833467L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=3070", 0.999999999999999666933L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833548L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=3070", 0.999999999999999667096L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833521L);
+insert("u01<float>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3071", 6.55651092529296875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3071", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3071", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3071", 1.66479243585149205842e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=3071", 0.500000715255737304688L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=3071", -0.999998569488525390625L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3071", 0.500000655651092529297L);
+insert("u01<double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=3071", -0.999998569721356034279L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L);
+insert("u01<long double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=3071", -0.999998569721356034279L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L);
+insert("u01<float>(mini64 + int64_t(a)) a=3071", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=3071", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3071", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=3071", 0.500000000000000111022L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=3071", -0.999999999999999666933L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3071", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=3071", 0.500000000000000166533L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=3071", -0.999999999999999666987L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3071", 0.500000000000000166479L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=3071", 0.999999284744262695312L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3071", 0.999999344348907470703L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=3071", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3071", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999777955L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999833467L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999833521L);
+insert("u01<float>(maxi32 - int32_t(a)) a=3071", 0.499999284744262695312L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=3071", 0.999998569488525390625L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3071", 0.499999344348907470703L);
+insert("u01<double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=3071", 0.999998569721356034279L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=3071", 0.999998569721356034279L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L);
+insert("u01<float>(maxi64 - int64_t(a)) a=3071", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=3071", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3071", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833467L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=3071", 0.999999999999999666933L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833494L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=3071", 0.999999999999999666987L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833521L);
+insert("u01<float>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3072", 7.74860382080078125000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3072", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3072", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3072", 1.66587663802397756285e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=3072", 0.500000715255737304688L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=3072", -0.999998569488525390625L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3072", 0.500000774860382080078L);
+insert("u01<double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=3072", -0.999998569255694746971L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L);
+insert("u01<long double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=3072", -0.999998569255694746971L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L);
+insert("u01<float>(mini64 + int64_t(a)) a=3072", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=3072", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3072", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=3072", 0.500000000000000222045L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=3072", -0.999999999999999666933L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3072", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=3072", 0.500000000000000166533L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=3072", -0.999999999999999666879L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3072", 0.500000000000000166588L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=3072", 0.999999284744262695312L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3072", 0.999999225139617919922L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=3072", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3072", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999777955L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999833467L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999833412L);
+insert("u01<float>(maxi32 - int32_t(a)) a=3072", 0.499999284744262695312L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=3072", 0.999998569488525390625L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3072", 0.499999225139617919922L);
+insert("u01<double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=3072", 0.999998569255694746971L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=3072", 0.999998569255694746971L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L);
+insert("u01<float>(maxi64 - int64_t(a)) a=3072", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=3072", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3072", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833467L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=3072", 0.999999999999999666933L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833439L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=3072", 0.999999999999999666879L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833412L);
+insert("u01<float>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5119", 1.13248825073242187500e-06L);
+insert("u01<double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("u01<float>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5119", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5119", 3.33066907387546962127e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5119", 2.77501546047664859884e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=5119", 0.500001192092895507812L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=5119", -0.999997615814208984375L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5119", 0.500001132488250732422L);
+insert("u01<double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=5119", -0.999997616047039628029L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L);
+insert("u01<long double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=5119", -0.999997616047039628029L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L);
+insert("u01<float>(mini64 + int64_t(a)) a=5119", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=5119", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5119", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=5119", 0.500000000000000222045L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=5119", -0.999999999999999444888L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5119", 0.500000000000000333067L);
+insert("u01<long double>(mini64 + int64_t(a)) a=5119", 0.500000000000000277556L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=5119", -0.999999999999999444943L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5119", 0.500000000000000277502L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=5119", 0.999998807907104492188L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5119", 0.999998867511749267578L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=5119", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5119", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999777955L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999666933L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999722444L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999722498L);
+insert("u01<float>(maxi32 - int32_t(a)) a=5119", 0.499998807907104492188L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=5119", 0.999997615814208984375L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5119", 0.499998867511749267578L);
+insert("u01<double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=5119", 0.999997616047039628029L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=5119", 0.999997616047039628029L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L);
+insert("u01<float>(maxi64 - int64_t(a)) a=5119", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=5119", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5119", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722444L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=5119", 0.999999999999999444888L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999666933L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722471L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=5119", 0.999999999999999444943L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722498L);
+insert("u01<float>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5120", 1.25169754028320312500e-06L);
+insert("u01<double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("u01<float>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5120", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5120", 3.33066907387546962127e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5120", 2.77609966264913410328e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=5120", 0.500001192092895507812L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=5120", -0.999997615814208984375L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5120", 0.500001251697540283203L);
+insert("u01<double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=5120", -0.999997615581378340721L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L);
+insert("u01<long double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=5120", -0.999997615581378340721L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L);
+insert("u01<float>(mini64 + int64_t(a)) a=5120", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=5120", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5120", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=5120", 0.500000000000000222045L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=5120", -0.999999999999999444888L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5120", 0.500000000000000333067L);
+insert("u01<long double>(mini64 + int64_t(a)) a=5120", 0.500000000000000277556L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=5120", -0.999999999999999444834L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5120", 0.500000000000000277610L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=5120", 0.999998807907104492188L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5120", 0.999998748302459716797L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=5120", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5120", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999666933L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999666933L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999722444L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999722390L);
+insert("u01<float>(maxi32 - int32_t(a)) a=5120", 0.499998807907104492188L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=5120", 0.999997615814208984375L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5120", 0.499998748302459716797L);
+insert("u01<double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=5120", 0.999997615581378340721L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=5120", 0.999997615581378340721L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L);
+insert("u01<float>(maxi64 - int64_t(a)) a=5120", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=5120", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5120", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722444L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=5120", 0.999999999999999444888L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999666933L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722417L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=5120", 0.999999999999999444834L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722390L);
+insert("u01<float>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5121", 1.25169754028320312500e-06L);
+insert("u01<double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("u01<float>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5121", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5121", 3.33066907387546962127e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5121", 2.77609966264913410328e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=5121", 0.500001192092895507812L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=5121", -0.999997615814208984375L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5121", 0.500001251697540283203L);
+insert("u01<double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=5121", -0.999997615115717053413L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L);
+insert("u01<long double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=5121", -0.999997615115717053413L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L);
+insert("u01<float>(mini64 + int64_t(a)) a=5121", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=5121", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5121", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=5121", 0.500000000000000333067L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=5121", -0.999999999999999444888L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5121", 0.500000000000000333067L);
+insert("u01<long double>(mini64 + int64_t(a)) a=5121", 0.500000000000000277664L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=5121", -0.999999999999999444726L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5121", 0.500000000000000277610L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=5121", 0.999998807907104492188L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5121", 0.999998748302459716797L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=5121", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5121", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999666933L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999666933L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999722336L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999722390L);
+insert("u01<float>(maxi32 - int32_t(a)) a=5121", 0.499998807907104492188L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=5121", 0.999997615814208984375L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5121", 0.499998748302459716797L);
+insert("u01<double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=5121", 0.999997615115717053413L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=5121", 0.999997615115717053413L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L);
+insert("u01<float>(maxi64 - int64_t(a)) a=5121", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=5121", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5121", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722444L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=5121", 0.999999999999999444888L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999666933L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722363L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=5121", 0.999999999999999444726L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722390L);
+// ./ut_uniform_IEEEkat: SUCCESS
diff --git a/lib/Random123-1.08/examples/ut_uniform_kat_vectors.dat b/lib/Random123-1.08/examples/ut_uniform_kat_vectors.dat
new file mode 100644
index 0000000..ae6bd13
--- /dev/null
+++ b/lib/Random123-1.08/examples/ut_uniform_kat_vectors.dat
@@ -0,0 +1,2604 @@
+/* This file was created by 'ut_uniform with-arg' on a reference
+   platform, and is #included in the recompilation of ut_uniform
+   on a target platform.  When ut_uniform is run with no arguments
+   on the target platform, it asserts that the values computed
+   on the target platform match the reference values recorded here.
+   These reference values were computed on an x86_64 using 32-bit,
+   64-bit and 80-bit IEEE arithmetic for float, double and long double
+   respectively.  Other platforms with different representations of
+   floating point values will almost certainly fail these tests
+   even though their results might be perfectly valid.
+*/
+insert("u01<float>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=0", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("u01<float>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=0", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=0", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L);
+insert("u01<float>(mini32 + int32_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=0", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=0", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=0", -0.999999999767169356346L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L);
+insert("u01<long double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=0", -0.999999999767169356346L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L);
+insert("u01<float>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=0", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=0", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=0", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=0", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=0", -0.999999999999999999946L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=0", 0.500000000000000000054L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=0", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=0", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=0", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=0", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=0", 0.999999999999999999946L);
+insert("u01<float>(maxi32 - int32_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=0", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=0", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=0", 0.999999999767169356346L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=0", 0.999999999767169356346L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L);
+insert("u01<float>(maxi64 - int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=0", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=0", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=0", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=0", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=0", 0.499999999999999999973L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=0", 0.999999999999999999946L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=0", 0.499999999999999999946L);
+insert("u01<float>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("u01<float>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1", 5.42101086242752217004e-20L);
+insert("u01<float>(mini32 + int32_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=1", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=1", -0.999999999301508069038L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L);
+insert("u01<long double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=1", -0.999999999301508069038L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L);
+insert("u01<float>(mini64 + int64_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=1", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=1", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=1", 0.500000000000000000108L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=1", -0.999999999999999999837L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1", 0.500000000000000000054L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=1", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=1", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=1", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999999892L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999999946L);
+insert("u01<float>(maxi32 - int32_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=1", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=1", 0.999999999301508069038L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=1", 0.999999999301508069038L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L);
+insert("u01<float>(maxi64 - int64_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=1", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=1", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=1", 0.499999999999999999919L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=1", 0.999999999999999999837L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1", 0.499999999999999999946L);
+insert("u01<float>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=2", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("u01<float>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=2", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=2", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=2", 1.62630325872825665101e-19L);
+insert("u01<float>(mini32 + int32_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=2", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=2", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=2", -0.999999998835846781731L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L);
+insert("u01<long double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=2", -0.999999998835846781731L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L);
+insert("u01<float>(mini64 + int64_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=2", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=2", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=2", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=2", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=2", 0.500000000000000000108L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=2", -0.999999999999999999729L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=2", 0.500000000000000000163L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=2", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=2", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=2", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=2", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=2", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999999892L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999999837L);
+insert("u01<float>(maxi32 - int32_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=2", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=2", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=2", 0.999999998835846781731L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=2", 0.999999998835846781731L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L);
+insert("u01<float>(maxi64 - int64_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=2", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=2", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=2", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=2", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=2", 0.499999999999999999864L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=2", 0.999999999999999999729L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=2", 0.499999999999999999837L);
+insert("u01<float>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("u01<float>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3", 1.62630325872825665101e-19L);
+insert("u01<float>(mini32 + int32_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=3", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=3", -0.999999998370185494423L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L);
+insert("u01<long double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=3", -0.999999998370185494423L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L);
+insert("u01<float>(mini64 + int64_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=3", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=3", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=3", 0.500000000000000000217L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=3", -0.999999999999999999621L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3", 0.500000000000000000163L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=3", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=3", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=3", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999999783L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999999837L);
+insert("u01<float>(maxi32 - int32_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=3", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=3", 0.999999998370185494423L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=3", 0.999999998370185494423L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L);
+insert("u01<float>(maxi64 - int64_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=3", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=3", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=3", 0.499999999999999999810L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=3", 0.999999999999999999621L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3", 0.499999999999999999837L);
+insert("u01<float>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=4", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("u01<float>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=4", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=4", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=4", 2.71050543121376108502e-19L);
+insert("u01<float>(mini32 + int32_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=4", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=4", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=4", -0.999999997904524207115L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L);
+insert("u01<long double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=4", -0.999999997904524207115L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L);
+insert("u01<float>(mini64 + int64_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=4", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=4", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=4", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=4", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=4", 0.500000000000000000217L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=4", -0.999999999999999999512L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=4", 0.500000000000000000271L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=4", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=4", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=4", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=4", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=4", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999999783L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999999729L);
+insert("u01<float>(maxi32 - int32_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=4", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=4", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=4", 0.999999997904524207115L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=4", 0.999999997904524207115L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L);
+insert("u01<float>(maxi64 - int64_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=4", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=4", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=4", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=4", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=4", 0.499999999999999999756L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=4", 0.999999999999999999512L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=4", 0.499999999999999999729L);
+insert("u01<float>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("u01<float>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5", 2.71050543121376108502e-19L);
+insert("u01<float>(mini32 + int32_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=5", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=5", -0.999999997438862919807L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L);
+insert("u01<long double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=5", -0.999999997438862919807L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L);
+insert("u01<float>(mini64 + int64_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=5", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=5", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=5", 0.500000000000000000325L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=5", -0.999999999999999999404L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5", 0.500000000000000000271L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=5", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=5", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=5", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999999675L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999999729L);
+insert("u01<float>(maxi32 - int32_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=5", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=5", 0.999999997438862919807L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=5", 0.999999997438862919807L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L);
+insert("u01<float>(maxi64 - int64_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=5", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=5", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=5", 0.499999999999999999702L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=5", 0.999999999999999999404L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5", 0.499999999999999999729L);
+insert("u01<float>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=63", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=63", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=63", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=63", 3.41523684332933896712e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=63", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=63", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=63", -0.999999970430508255959L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L);
+insert("u01<long double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=63", -0.999999970430508255959L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L);
+insert("u01<float>(mini64 + int64_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=63", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=63", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=63", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=63", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=63", 0.500000000000000003469L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=63", -0.999999999999999993115L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=63", 0.500000000000000003415L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=63", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=63", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=63", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=63", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=63", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999996531L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999996585L);
+insert("u01<float>(maxi32 - int32_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=63", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=63", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=63", 0.999999970430508255959L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=63", 0.999999970430508255959L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L);
+insert("u01<float>(maxi64 - int64_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=63", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=63", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=63", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=63", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=63", 0.499999999999999996558L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=63", 0.999999999999999993115L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=63", 0.499999999999999996585L);
+insert("u01<float>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=64", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=64", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=64", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=64", 3.52365706057788941052e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=64", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=64", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=64", -0.999999969964846968651L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L);
+insert("u01<long double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=64", -0.999999969964846968651L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L);
+insert("u01<float>(mini64 + int64_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=64", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=64", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=64", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=64", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=64", 0.500000000000000003469L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=64", -0.999999999999999993007L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=64", 0.500000000000000003524L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=64", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=64", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=64", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=64", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=64", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999996531L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999996476L);
+insert("u01<float>(maxi32 - int32_t(a)) a=64", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=64", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=64", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=64", 0.999999969964846968651L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=64", 0.999999969964846968651L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L);
+insert("u01<float>(maxi64 - int64_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=64", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=64", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=64", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=64", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=64", 0.499999999999999996503L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=64", 0.999999999999999993007L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=64", 0.499999999999999996476L);
+insert("u01<float>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=65", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=65", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=65", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=65", 3.52365706057788941052e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=65", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=65", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=65", -0.999999969499185681343L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L);
+insert("u01<long double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=65", -0.999999969499185681343L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L);
+insert("u01<float>(mini64 + int64_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=65", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=65", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=65", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=65", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=65", 0.500000000000000003578L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=65", -0.999999999999999992898L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=65", 0.500000000000000003524L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=65", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=65", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=65", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=65", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=65", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999996422L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999996476L);
+insert("u01<float>(maxi32 - int32_t(a)) a=65", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=65", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=65", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=65", 0.999999969499185681343L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=65", 0.999999969499185681343L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L);
+insert("u01<float>(maxi64 - int64_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=65", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=65", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=65", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=65", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=65", 0.499999999999999996449L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=65", 0.999999999999999992898L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=65", 0.499999999999999996476L);
+insert("u01<float>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=127", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=127", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=127", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=127", 6.88468379528295315595e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=127", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=127", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=127", -0.999999940628185868263L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L);
+insert("u01<long double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=127", -0.999999940628185868263L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L);
+insert("u01<float>(mini64 + int64_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=127", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=127", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=127", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=127", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=127", 0.500000000000000006939L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=127", -0.999999999999999986176L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=127", 0.500000000000000006885L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=127", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=127", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=127", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=127", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=127", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999993061L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999993115L);
+insert("u01<float>(maxi32 - int32_t(a)) a=127", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=127", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=127", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=127", 0.999999940628185868263L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=127", 0.999999940628185868263L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L);
+insert("u01<float>(maxi64 - int64_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=127", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=127", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=127", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=127", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=127", 0.499999999999999993088L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=127", 0.999999999999999986176L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=127", 0.499999999999999993115L);
+insert("u01<float>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=128", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=128", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=128", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=128", 6.99310401253150359935e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=128", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=128", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=128", -0.999999940162524580956L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L);
+insert("u01<long double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=128", -0.999999940162524580956L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L);
+insert("u01<float>(mini64 + int64_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=128", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=128", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=128", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=128", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=128", 0.500000000000000006939L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=128", -0.999999999999999986068L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=128", 0.500000000000000006993L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=128", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=128", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=128", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=128", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=128", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999993061L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999993007L);
+insert("u01<float>(maxi32 - int32_t(a)) a=128", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=128", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=128", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=128", 0.999999940162524580956L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=128", 0.999999940162524580956L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L);
+insert("u01<float>(maxi64 - int64_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=128", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=128", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=128", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=128", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=128", 0.499999999999999993034L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=128", 0.999999999999999986068L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=128", 0.499999999999999993007L);
+insert("u01<float>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=129", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=129", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=129", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=129", 6.99310401253150359935e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=129", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=129", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=129", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=129", -0.999999939696863293648L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L);
+insert("u01<long double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=129", -0.999999939696863293648L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L);
+insert("u01<float>(mini64 + int64_t(a)) a=129", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=129", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=129", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=129", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=129", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=129", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=129", 0.500000000000000007047L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=129", -0.999999999999999985960L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=129", 0.500000000000000006993L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=129", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=129", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=129", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=129", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=129", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999992953L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999993007L);
+insert("u01<float>(maxi32 - int32_t(a)) a=129", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=129", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=129", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=129", 0.999999939696863293648L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=129", 0.999999939696863293648L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L);
+insert("u01<float>(maxi64 - int64_t(a)) a=129", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=129", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=129", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=129", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=129", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=129", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=129", 0.499999999999999992980L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=129", 0.999999999999999985960L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=129", 0.499999999999999993007L);
+insert("u01<float>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=191", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=191", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=191", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=191", 1.03541307472365673448e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=191", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=191", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=191", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=191", -0.999999910825863480568L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L);
+insert("u01<long double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=191", -0.999999910825863480568L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L);
+insert("u01<float>(mini64 + int64_t(a)) a=191", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=191", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=191", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=191", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=191", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=191", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=191", 0.500000000000000010408L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=191", -0.999999999999999979238L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=191", 0.500000000000000010354L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=191", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=191", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=191", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=191", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=191", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999989592L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999989646L);
+insert("u01<float>(maxi32 - int32_t(a)) a=191", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=191", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=191", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=191", 0.999999910825863480568L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=191", 0.999999910825863480568L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L);
+insert("u01<float>(maxi64 - int64_t(a)) a=191", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=191", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=191", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=191", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=191", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=191", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=191", 0.499999999999999989619L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=191", 0.999999999999999979238L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=191", 0.499999999999999989646L);
+insert("u01<float>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=192", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=192", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=192", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=192", 1.04625509644851177882e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=192", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=192", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=192", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=192", -0.999999910360202193260L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L);
+insert("u01<long double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=192", -0.999999910360202193260L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L);
+insert("u01<float>(mini64 + int64_t(a)) a=192", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=192", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=192", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=192", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=192", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=192", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=192", 0.500000000000000010408L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=192", -0.999999999999999979129L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=192", 0.500000000000000010463L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=192", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=192", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=192", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=192", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=192", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999989592L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999989537L);
+insert("u01<float>(maxi32 - int32_t(a)) a=192", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=192", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=192", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=192", 0.999999910360202193260L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=192", 0.999999910360202193260L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L);
+insert("u01<float>(maxi64 - int64_t(a)) a=192", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=192", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=192", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=192", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=192", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=192", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=192", 0.499999999999999989565L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=192", 0.999999999999999979129L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=192", 0.499999999999999989537L);
+insert("u01<float>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=193", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=193", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=193", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=193", 1.04625509644851177882e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=193", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=193", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=193", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=193", -0.999999909894540905952L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L);
+insert("u01<long double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=193", -0.999999909894540905952L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L);
+insert("u01<float>(mini64 + int64_t(a)) a=193", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=193", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=193", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=193", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=193", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=193", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=193", 0.500000000000000010517L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=193", -0.999999999999999979021L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=193", 0.500000000000000010463L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=193", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=193", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=193", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=193", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=193", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999989483L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999989537L);
+insert("u01<float>(maxi32 - int32_t(a)) a=193", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=193", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=193", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=193", 0.999999909894540905952L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=193", 0.999999909894540905952L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L);
+insert("u01<float>(maxi64 - int64_t(a)) a=193", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=193", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=193", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=193", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=193", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=193", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=193", 0.499999999999999989510L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=193", 0.999999999999999979021L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=193", 0.499999999999999989537L);
+insert("u01<float>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=255", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=255", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=255", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=255", 1.38235776991901815336e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=255", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=255", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=255", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=255", -0.999999881023541092873L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L);
+insert("u01<long double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=255", -0.999999881023541092873L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L);
+insert("u01<float>(mini64 + int64_t(a)) a=255", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=255", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=255", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=255", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=255", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=255", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=255", 0.500000000000000013878L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=255", -0.999999999999999972299L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=255", 0.500000000000000013824L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=255", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=255", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=255", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=255", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=255", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999986122L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999986176L);
+insert("u01<float>(maxi32 - int32_t(a)) a=255", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=255", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=255", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=255", 0.999999881023541092873L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=255", 0.999999881023541092873L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L);
+insert("u01<float>(maxi64 - int64_t(a)) a=255", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=255", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=255", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=255", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=255", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=255", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=255", 0.499999999999999986149L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=255", 0.999999999999999972299L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=255", 0.499999999999999986176L);
+insert("u01<float>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=256", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=256", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=256", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=256", 1.39319979164387319770e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=256", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=256", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=256", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=256", -0.999999880557879805565L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L);
+insert("u01<long double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=256", -0.999999880557879805565L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L);
+insert("u01<float>(mini64 + int64_t(a)) a=256", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=256", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=256", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=256", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=256", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=256", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=256", 0.500000000000000013878L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=256", -0.999999999999999972190L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=256", 0.500000000000000013932L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=256", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=256", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=256", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=256", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=256", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999986122L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999986068L);
+insert("u01<float>(maxi32 - int32_t(a)) a=256", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=256", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=256", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=256", 0.999999880557879805565L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=256", 0.999999880557879805565L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L);
+insert("u01<float>(maxi64 - int64_t(a)) a=256", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=256", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=256", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=256", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=256", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=256", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=256", 0.499999999999999986095L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=256", 0.999999999999999972190L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=256", 0.499999999999999986068L);
+insert("u01<float>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=257", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=257", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=257", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=257", 1.39319979164387319770e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=257", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=257", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=257", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=257", -0.999999880092218518257L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L);
+insert("u01<long double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=257", -0.999999880092218518257L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L);
+insert("u01<float>(mini64 + int64_t(a)) a=257", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=257", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=257", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=257", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=257", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=257", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=257", 0.500000000000000013986L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=257", -0.999999999999999972082L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=257", 0.500000000000000013932L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=257", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=257", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=257", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=257", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=257", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999986014L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999986068L);
+insert("u01<float>(maxi32 - int32_t(a)) a=257", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=257", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=257", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=257", 0.999999880092218518257L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=257", 0.999999880092218518257L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L);
+insert("u01<float>(maxi64 - int64_t(a)) a=257", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=257", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=257", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=257", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=257", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=257", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=257", 0.499999999999999986041L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=257", 0.999999999999999972082L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=257", 0.499999999999999986068L);
+insert("u01<float>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=319", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=319", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=319", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=319", 1.72930246511437957224e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=319", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=319", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=319", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=319", -0.999999851221218705177L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L);
+insert("u01<long double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=319", -0.999999851221218705177L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L);
+insert("u01<float>(mini64 + int64_t(a)) a=319", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=319", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=319", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=319", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=319", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=319", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=319", 0.500000000000000017347L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=319", -0.999999999999999965360L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=319", 0.500000000000000017293L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=319", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=319", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=319", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=319", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=319", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999982653L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999982707L);
+insert("u01<float>(maxi32 - int32_t(a)) a=319", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=319", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=319", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=319", 0.999999851221218705177L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=319", 0.999999851221218705177L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L);
+insert("u01<float>(maxi64 - int64_t(a)) a=319", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=319", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=319", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=319", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=319", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=319", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=319", 0.499999999999999982680L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=319", 0.999999999999999965360L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=319", 0.499999999999999982707L);
+insert("u01<float>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=320", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=320", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=320", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=320", 1.74014448683923461658e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=320", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=320", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=320", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=320", -0.999999850755557417870L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L);
+insert("u01<long double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=320", -0.999999850755557417870L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L);
+insert("u01<float>(mini64 + int64_t(a)) a=320", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=320", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=320", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=320", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=320", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=320", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=320", 0.500000000000000017347L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=320", -0.999999999999999965251L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=320", 0.500000000000000017401L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=320", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=320", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=320", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=320", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=320", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999982653L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999982599L);
+insert("u01<float>(maxi32 - int32_t(a)) a=320", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=320", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=320", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=320", 0.999999850755557417870L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=320", 0.999999850755557417870L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L);
+insert("u01<float>(maxi64 - int64_t(a)) a=320", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=320", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=320", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=320", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=320", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=320", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=320", 0.499999999999999982626L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=320", 0.999999999999999965251L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=320", 0.499999999999999982599L);
+insert("u01<float>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=321", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=321", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=321", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=321", 1.74014448683923461658e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=321", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=321", -0.999999821186065673828L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=321", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=321", -0.999999850289896130562L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L);
+insert("u01<long double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=321", -0.999999850289896130562L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L);
+insert("u01<float>(mini64 + int64_t(a)) a=321", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=321", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=321", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=321", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=321", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=321", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=321", 0.500000000000000017456L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=321", -0.999999999999999965143L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=321", 0.500000000000000017401L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=321", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=321", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=321", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=321", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=321", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999982544L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999982599L);
+insert("u01<float>(maxi32 - int32_t(a)) a=321", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=321", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=321", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=321", 0.999999850289896130562L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=321", 0.999999850289896130562L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L);
+insert("u01<float>(maxi64 - int64_t(a)) a=321", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=321", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=321", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=321", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=321", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=321", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=321", 0.499999999999999982571L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=321", 0.999999999999999965143L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=321", 0.499999999999999982599L);
+insert("u01<float>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=382", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=382", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=382", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=382", 2.07624716030974099112e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=382", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=382", -0.999999821186065673828L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=382", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=382", -0.999999821884557604790L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L);
+insert("u01<long double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=382", -0.999999821884557604790L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L);
+insert("u01<float>(mini64 + int64_t(a)) a=382", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=382", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=382", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=382", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=382", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=382", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=382", 0.500000000000000020708L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=382", -0.999999999999999958529L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=382", 0.500000000000000020762L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=382", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=382", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=382", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=382", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=382", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999979292L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999979238L);
+insert("u01<float>(maxi32 - int32_t(a)) a=382", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=382", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=382", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=382", 0.999999821884557604790L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=382", 0.999999821884557604790L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L);
+insert("u01<float>(maxi64 - int64_t(a)) a=382", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=382", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=382", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=382", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=382", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=382", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=382", 0.499999999999999979265L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=382", 0.999999999999999958529L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=382", 0.499999999999999979238L);
+insert("u01<float>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=383", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=383", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=383", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=383", 2.07624716030974099112e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=383", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=383", -0.999999821186065673828L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=383", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=383", -0.999999821418896317482L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L);
+insert("u01<long double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=383", -0.999999821418896317482L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L);
+insert("u01<float>(mini64 + int64_t(a)) a=383", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=383", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=383", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=383", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=383", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=383", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=383", 0.500000000000000020817L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=383", -0.999999999999999958421L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=383", 0.500000000000000020762L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=383", 0.999999880790710449219L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=383", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=383", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=383", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=383", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999979183L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999979238L);
+insert("u01<float>(maxi32 - int32_t(a)) a=383", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=383", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=383", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=383", 0.999999821418896317482L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=383", 0.999999821418896317482L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L);
+insert("u01<float>(maxi64 - int64_t(a)) a=383", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=383", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=383", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=383", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=383", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=383", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=383", 0.499999999999999979210L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=383", 0.999999999999999958421L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=383", 0.499999999999999979238L);
+insert("u01<float>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=384", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=384", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=384", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=384", 2.08708918203459603546e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=384", 0.500000119209289550781L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=384", -0.999999821186065673828L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=384", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=384", -0.999999820953235030174L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L);
+insert("u01<long double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=384", -0.999999820953235030174L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L);
+insert("u01<float>(mini64 + int64_t(a)) a=384", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=384", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=384", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=384", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=384", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=384", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=384", 0.500000000000000020817L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=384", -0.999999999999999958312L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=384", 0.500000000000000020871L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=384", 0.999999880790710449219L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=384", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=384", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=384", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=384", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999979183L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999979129L);
+insert("u01<float>(maxi32 - int32_t(a)) a=384", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=384", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=384", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=384", 0.999999820953235030174L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=384", 0.999999820953235030174L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L);
+insert("u01<float>(maxi64 - int64_t(a)) a=384", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=384", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=384", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=384", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=384", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=384", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=384", 0.499999999999999979156L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=384", 0.999999999999999958312L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=384", 0.499999999999999979129L);
+insert("u01<float>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=639", 1.78813934326171875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=639", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=639", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=639", 3.46402594109118666665e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=639", 0.500000119209289550781L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=639", -0.999999701976776123047L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=639", 0.500000178813934326172L);
+insert("u01<double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=639", -0.999999702209606766701L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L);
+insert("u01<long double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=639", -0.999999702209606766701L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L);
+insert("u01<float>(mini64 + int64_t(a)) a=639", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=639", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=639", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=639", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=639", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=639", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=639", 0.500000000000000034694L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=639", -0.999999999999999930665L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=639", 0.500000000000000034640L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=639", 0.999999880790710449219L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=639", 0.999999821186065673828L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=639", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=639", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=639", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999965306L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999965360L);
+insert("u01<float>(maxi32 - int32_t(a)) a=639", 0.499999850988388061523L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=639", 0.999999701976776123047L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=639", 0.499999821186065673828L);
+insert("u01<double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=639", 0.999999702209606766701L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=639", 0.999999702209606766701L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L);
+insert("u01<float>(maxi64 - int64_t(a)) a=639", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=639", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=639", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=639", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=639", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=639", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=639", 0.499999999999999965333L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=639", 0.999999999999999930665L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=639", 0.499999999999999965360L);
+insert("u01<float>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=640", 1.78813934326171875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=640", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=640", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=640", 3.47486796281604171099e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=640", 0.500000119209289550781L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=640", -0.999999701976776123047L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=640", 0.500000178813934326172L);
+insert("u01<double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=640", -0.999999701743945479393L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L);
+insert("u01<long double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=640", -0.999999701743945479393L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L);
+insert("u01<float>(mini64 + int64_t(a)) a=640", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=640", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=640", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=640", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=640", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=640", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=640", 0.500000000000000034694L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=640", -0.999999999999999930557L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=640", 0.500000000000000034749L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=640", 0.999999821186065673828L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=640", 0.999999821186065673828L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=640", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=640", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=640", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999965306L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999965251L);
+insert("u01<float>(maxi32 - int32_t(a)) a=640", 0.499999850988388061523L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=640", 0.999999701976776123047L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=640", 0.499999821186065673828L);
+insert("u01<double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=640", 0.999999701743945479393L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=640", 0.999999701743945479393L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L);
+insert("u01<float>(maxi64 - int64_t(a)) a=640", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=640", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=640", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=640", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=640", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=640", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=640", 0.499999999999999965278L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=640", 0.999999999999999930557L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=640", 0.499999999999999965251L);
+insert("u01<float>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=641", 1.78813934326171875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=641", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=641", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=641", 3.47486796281604171099e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=641", 0.500000178813934326172L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=641", -0.999999701976776123047L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=641", 0.500000178813934326172L);
+insert("u01<double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=641", -0.999999701278284192085L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L);
+insert("u01<long double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=641", -0.999999701278284192085L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L);
+insert("u01<float>(mini64 + int64_t(a)) a=641", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=641", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=641", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=641", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=641", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=641", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=641", 0.500000000000000034803L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=641", -0.999999999999999930448L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=641", 0.500000000000000034749L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=641", 0.999999821186065673828L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=641", 0.999999821186065673828L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=641", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=641", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=641", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999965197L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999965251L);
+insert("u01<float>(maxi32 - int32_t(a)) a=641", 0.499999850988388061523L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=641", 0.999999701976776123047L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=641", 0.499999821186065673828L);
+insert("u01<double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=641", 0.999999701278284192085L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=641", 0.999999701278284192085L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L);
+insert("u01<float>(maxi64 - int64_t(a)) a=641", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=641", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=641", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=641", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=641", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=641", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=641", 0.499999999999999965224L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=641", 0.999999999999999930448L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=641", 0.499999999999999965251L);
+insert("u01<float>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1023", 1.78813934326171875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1023", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1023", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1023", 5.54569411226335517995e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=1023", 0.500000238418579101562L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=1023", -0.999999523162841796875L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1023", 0.500000178813934326172L);
+insert("u01<double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=1023", -0.999999523395672440529L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L);
+insert("u01<long double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=1023", -0.999999523395672440529L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L);
+insert("u01<float>(mini64 + int64_t(a)) a=1023", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=1023", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1023", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=1023", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=1023", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1023", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=1023", 0.500000000000000055511L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=1023", -0.999999999999999889032L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1023", 0.500000000000000055457L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=1023", 0.999999761581420898438L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1023", 0.999999821186065673828L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=1023", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1023", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=1023", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999944489L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999944543L);
+insert("u01<float>(maxi32 - int32_t(a)) a=1023", 0.499999761581420898438L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=1023", 0.999999523162841796875L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1023", 0.499999821186065673828L);
+insert("u01<double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=1023", 0.999999523395672440529L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=1023", 0.999999523395672440529L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L);
+insert("u01<float>(maxi64 - int64_t(a)) a=1023", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=1023", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1023", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=1023", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944516L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=1023", 0.999999999999999889032L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944543L);
+insert("u01<float>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1024", 2.98023223876953125000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1024", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1024", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1024", 5.55653613398821022429e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=1024", 0.500000238418579101562L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=1024", -0.999999523162841796875L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1024", 0.500000298023223876953L);
+insert("u01<double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=1024", -0.999999522930011153221L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L);
+insert("u01<long double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=1024", -0.999999522930011153221L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L);
+insert("u01<float>(mini64 + int64_t(a)) a=1024", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=1024", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1024", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=1024", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=1024", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1024", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=1024", 0.500000000000000055511L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=1024", -0.999999999999999888923L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1024", 0.500000000000000055565L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=1024", 0.999999761581420898438L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1024", 0.999999701976776123047L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=1024", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1024", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999888978L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999944489L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999944435L);
+insert("u01<float>(maxi32 - int32_t(a)) a=1024", 0.499999761581420898438L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=1024", 0.999999523162841796875L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1024", 0.499999701976776123047L);
+insert("u01<double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=1024", 0.999999522930011153221L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=1024", 0.999999522930011153221L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L);
+insert("u01<float>(maxi64 - int64_t(a)) a=1024", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=1024", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1024", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=1024", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944462L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=1024", 0.999999999999999888923L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944435L);
+insert("u01<float>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1025", 2.98023223876953125000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1025", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1025", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1025", 5.55653613398821022429e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=1025", 0.500000238418579101562L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=1025", -0.999999523162841796875L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1025", 0.500000298023223876953L);
+insert("u01<double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=1025", -0.999999522464349865913L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L);
+insert("u01<long double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=1025", -0.999999522464349865913L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L);
+insert("u01<float>(mini64 + int64_t(a)) a=1025", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=1025", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1025", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=1025", 0.500000000000000111022L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=1025", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1025", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=1025", 0.500000000000000055620L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=1025", -0.999999999999999888815L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1025", 0.500000000000000055565L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=1025", 0.999999761581420898438L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1025", 0.999999701976776123047L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=1025", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1025", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999888978L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999944380L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999944435L);
+insert("u01<float>(maxi32 - int32_t(a)) a=1025", 0.499999761581420898438L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=1025", 0.999999523162841796875L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1025", 0.499999701976776123047L);
+insert("u01<double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=1025", 0.999999522464349865913L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=1025", 0.999999522464349865913L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L);
+insert("u01<float>(maxi64 - int64_t(a)) a=1025", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=1025", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1025", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=1025", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944408L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=1025", 0.999999999999999888815L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944435L);
+insert("u01<float>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3070", 6.55651092529296875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3070", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3070", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3070", 1.66479243585149205842e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=3070", 0.500000715255737304688L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=3070", -0.999998569488525390625L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3070", 0.500000655651092529297L);
+insert("u01<double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=3070", -0.999998570187017321587L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L);
+insert("u01<long double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=3070", -0.999998570187017321587L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L);
+insert("u01<float>(mini64 + int64_t(a)) a=3070", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=3070", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3070", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=3070", 0.500000000000000111022L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=3070", -0.999999999999999666933L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3070", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=3070", 0.500000000000000166425L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=3070", -0.999999999999999667096L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3070", 0.500000000000000166479L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=3070", 0.999999284744262695312L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3070", 0.999999344348907470703L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=3070", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3070", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999888978L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999833575L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999833521L);
+insert("u01<float>(maxi32 - int32_t(a)) a=3070", 0.499999284744262695312L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=3070", 0.999998569488525390625L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3070", 0.499999344348907470703L);
+insert("u01<double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=3070", 0.999998570187017321587L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=3070", 0.999998570187017321587L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L);
+insert("u01<float>(maxi64 - int64_t(a)) a=3070", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=3070", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3070", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833467L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=3070", 0.999999999999999666933L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833548L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=3070", 0.999999999999999667096L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833521L);
+insert("u01<float>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3071", 6.55651092529296875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3071", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3071", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3071", 1.66479243585149205842e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=3071", 0.500000715255737304688L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=3071", -0.999998569488525390625L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3071", 0.500000655651092529297L);
+insert("u01<double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=3071", -0.999998569721356034279L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L);
+insert("u01<long double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=3071", -0.999998569721356034279L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L);
+insert("u01<float>(mini64 + int64_t(a)) a=3071", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=3071", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3071", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=3071", 0.500000000000000111022L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=3071", -0.999999999999999666933L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3071", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=3071", 0.500000000000000166533L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=3071", -0.999999999999999666987L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3071", 0.500000000000000166479L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=3071", 0.999999284744262695312L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3071", 0.999999344348907470703L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=3071", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3071", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999777955L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999833467L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999833521L);
+insert("u01<float>(maxi32 - int32_t(a)) a=3071", 0.499999284744262695312L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=3071", 0.999998569488525390625L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3071", 0.499999344348907470703L);
+insert("u01<double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=3071", 0.999998569721356034279L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=3071", 0.999998569721356034279L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L);
+insert("u01<float>(maxi64 - int64_t(a)) a=3071", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=3071", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3071", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833467L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=3071", 0.999999999999999666933L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833494L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=3071", 0.999999999999999666987L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833521L);
+insert("u01<float>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3072", 7.74860382080078125000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3072", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3072", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3072", 1.66587663802397756285e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=3072", 0.500000715255737304688L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=3072", -0.999998569488525390625L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3072", 0.500000774860382080078L);
+insert("u01<double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=3072", -0.999998569255694746971L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L);
+insert("u01<long double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=3072", -0.999998569255694746971L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L);
+insert("u01<float>(mini64 + int64_t(a)) a=3072", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=3072", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3072", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=3072", 0.500000000000000222045L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=3072", -0.999999999999999666933L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3072", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=3072", 0.500000000000000166533L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=3072", -0.999999999999999666879L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3072", 0.500000000000000166588L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=3072", 0.999999284744262695312L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3072", 0.999999225139617919922L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=3072", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3072", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999777955L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999833467L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999833412L);
+insert("u01<float>(maxi32 - int32_t(a)) a=3072", 0.499999284744262695312L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=3072", 0.999998569488525390625L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3072", 0.499999225139617919922L);
+insert("u01<double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=3072", 0.999998569255694746971L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=3072", 0.999998569255694746971L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L);
+insert("u01<float>(maxi64 - int64_t(a)) a=3072", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=3072", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3072", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833467L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=3072", 0.999999999999999666933L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833439L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=3072", 0.999999999999999666879L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833412L);
+insert("u01<float>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5119", 1.13248825073242187500e-06L);
+insert("u01<double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("u01<float>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5119", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5119", 3.33066907387546962127e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5119", 2.77501546047664859884e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=5119", 0.500001192092895507812L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=5119", -0.999997615814208984375L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5119", 0.500001132488250732422L);
+insert("u01<double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=5119", -0.999997616047039628029L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L);
+insert("u01<long double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=5119", -0.999997616047039628029L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L);
+insert("u01<float>(mini64 + int64_t(a)) a=5119", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=5119", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5119", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=5119", 0.500000000000000222045L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=5119", -0.999999999999999444888L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5119", 0.500000000000000333067L);
+insert("u01<long double>(mini64 + int64_t(a)) a=5119", 0.500000000000000277556L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=5119", -0.999999999999999444943L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5119", 0.500000000000000277502L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=5119", 0.999998807907104492188L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5119", 0.999998867511749267578L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=5119", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5119", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999777955L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999666933L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999722444L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999722498L);
+insert("u01<float>(maxi32 - int32_t(a)) a=5119", 0.499998807907104492188L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=5119", 0.999997615814208984375L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5119", 0.499998867511749267578L);
+insert("u01<double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=5119", 0.999997616047039628029L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=5119", 0.999997616047039628029L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L);
+insert("u01<float>(maxi64 - int64_t(a)) a=5119", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=5119", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5119", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722444L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=5119", 0.999999999999999444888L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999666933L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722471L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=5119", 0.999999999999999444943L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722498L);
+insert("u01<float>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5120", 1.25169754028320312500e-06L);
+insert("u01<double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("u01<float>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5120", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5120", 3.33066907387546962127e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5120", 2.77609966264913410328e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=5120", 0.500001192092895507812L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=5120", -0.999997615814208984375L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5120", 0.500001251697540283203L);
+insert("u01<double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=5120", -0.999997615581378340721L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L);
+insert("u01<long double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=5120", -0.999997615581378340721L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L);
+insert("u01<float>(mini64 + int64_t(a)) a=5120", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=5120", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5120", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=5120", 0.500000000000000222045L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=5120", -0.999999999999999444888L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5120", 0.500000000000000333067L);
+insert("u01<long double>(mini64 + int64_t(a)) a=5120", 0.500000000000000277556L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=5120", -0.999999999999999444834L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5120", 0.500000000000000277610L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=5120", 0.999998807907104492188L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5120", 0.999998748302459716797L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=5120", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5120", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999666933L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999666933L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999722444L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999722390L);
+insert("u01<float>(maxi32 - int32_t(a)) a=5120", 0.499998807907104492188L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=5120", 0.999997615814208984375L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5120", 0.499998748302459716797L);
+insert("u01<double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=5120", 0.999997615581378340721L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=5120", 0.999997615581378340721L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L);
+insert("u01<float>(maxi64 - int64_t(a)) a=5120", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=5120", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5120", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722444L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=5120", 0.999999999999999444888L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999666933L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722417L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=5120", 0.999999999999999444834L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722390L);
+insert("u01<float>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5121", 1.25169754028320312500e-06L);
+insert("u01<double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("u01<float>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5121", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5121", 3.33066907387546962127e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5121", 2.77609966264913410328e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=5121", 0.500001192092895507812L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=5121", -0.999997615814208984375L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5121", 0.500001251697540283203L);
+insert("u01<double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=5121", -0.999997615115717053413L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L);
+insert("u01<long double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=5121", -0.999997615115717053413L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L);
+insert("u01<float>(mini64 + int64_t(a)) a=5121", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=5121", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5121", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=5121", 0.500000000000000333067L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=5121", -0.999999999999999444888L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5121", 0.500000000000000333067L);
+insert("u01<long double>(mini64 + int64_t(a)) a=5121", 0.500000000000000277664L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=5121", -0.999999999999999444726L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5121", 0.500000000000000277610L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=5121", 0.999998807907104492188L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5121", 0.999998748302459716797L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=5121", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5121", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999666933L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999666933L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999722336L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999722390L);
+insert("u01<float>(maxi32 - int32_t(a)) a=5121", 0.499998807907104492188L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=5121", 0.999997615814208984375L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5121", 0.499998748302459716797L);
+insert("u01<double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=5121", 0.999997615115717053413L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=5121", 0.999997615115717053413L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L);
+insert("u01<float>(maxi64 - int64_t(a)) a=5121", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=5121", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5121", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722444L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=5121", 0.999999999999999444888L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999666933L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722363L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=5121", 0.999999999999999444726L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722390L);
+// ./ut_uniform: SUCCESS
diff --git a/lib/Random123-1.08/examples/ut_uniform_reference.hpp b/lib/Random123-1.08/examples/ut_uniform_reference.hpp
new file mode 100644
index 0000000..d53d959
--- /dev/null
+++ b/lib/Random123-1.08/examples/ut_uniform_reference.hpp
@@ -0,0 +1,19 @@
+RefHist("u01 Threefry4x32 float", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314");
+RefHist("u01 Threefry4x32 double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314");
+RefHist("u01 Threefry4x32 long double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314");
+RefHist("u01 Threefry4x64 float", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275");
+RefHist("u01 Threefry4x64 double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275");
+RefHist("u01 Threefry4x64 long double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275");
+RefHist("uneg11 Threefry4x32 float", " 156 139 148 146 159 148 159 168 142 160 156 161 153 143 158 150 180 174 152 163 157 129 166 151 140 142");
+RefHist("uneg11 Threefry4x32 double", " 156 139 148 146 159 148 159 168 142 160 156 161 153 143 158 150 180 174 152 163 157 129 166 151 140 142");
+RefHist("uneg11 Threefry4x32 long double", " 156 139 148 146 159 148 159 168 142 160 156 161 153 143 158 150 180 174 152 163 157 129 166 151 140 142");
+RefHist("uneg11 Threefry4x64 float", " 159 141 148 184 162 142 155 137 173 187 153 140 135 164 144 146 149 151 171 152 148 137 179 146 145 152");
+RefHist("uneg11 Threefry4x64 double", " 159 141 148 184 162 142 155 137 173 187 153 140 135 164 144 146 149 151 171 152 148 137 179 146 145 152");
+RefHist("uneg11 Threefry4x64 long double", " 159 141 148 184 162 142 155 137 173 187 153 140 135 164 144 146 149 151 171 152 148 137 179 146 145 152");
+RefHist("u01fixedpt Threefry4x32 float", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314");
+RefHist("u01fixedpt Threefry4x32 double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314");
+RefHist("u01fixedpt Threefry4x32 long double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314");
+RefHist("u01fixedpt Threefry4x64 float", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275");
+RefHist("u01fixedpt Threefry4x64 double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275");
+RefHist("u01fixedpt Threefry4x64 long double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275");
+// ./ut_uniform: SUCCESS
diff --git a/lib/Random123-1.08/examples/util.h b/lib/Random123-1.08/examples/util.h
new file mode 100644
index 0000000..c78b7d8
--- /dev/null
+++ b/lib/Random123-1.08/examples/util.h
@@ -0,0 +1,291 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef UTIL_H__
+#define UTIL_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <math.h>
+#include <Random123/features/compilerfeatures.h>
+
+extern const char *progname;
+extern int debug;
+extern int verbose;
+
+#if defined(_MSC_VER)
+#define NOMINMAX /* tells Windows.h to NOT define min() & max() */
+#include <Windows.h>
+R123_STATIC_INLINE double now(){
+    LARGE_INTEGER f; // ticks per second
+    LARGE_INTEGER t;
+    QueryPerformanceFrequency(&f);
+    QueryPerformanceCounter(&t); // ticks since epoch
+    return ((double)t.QuadPart)/((double)f.QuadPart);
+}
+#else // _MSC_VER
+#include <sys/time.h>
+R123_STATIC_INLINE double now(){
+    struct timeval tv; 
+    gettimeofday(&tv, 0); 
+    return 1.e-6*tv.tv_usec + tv.tv_sec;
+}
+#endif // _MSC_VER
+
+/* timer returns difference between current time and *d, also updates *d with current time. */
+R123_STATIC_INLINE double timer(double *d) {
+    double dold = *d;
+    *d = now();
+    return *d - dold;
+}
+
+#define WHITESPACE " \t\f\v\n"
+char *nameclean(char *s)
+{
+    char *cp = s, *cp2, *cpend = s + strlen(s);
+    size_t i;
+
+    cp2 = s;
+    while ((cp2 = strstr(cp2, "(R)")) != NULL) {
+	*cp2++ = ' ';
+	*cp2++ = ' ';
+	*cp2++ = ' ';
+    }
+    cp2 = s;
+    while ((cp2 = strstr(cp2, "CPU")) != NULL) {
+	*cp2++ = ' ';
+	*cp2++ = ' ';
+	*cp2++ = ' ';
+    }
+    cp2 = s;
+    while ((cp2 = strchr(cp2, '@')) != NULL) {
+	*cp2++ = ' ';
+    }
+    while ((i = strcspn(cp, WHITESPACE)) > 0) {
+	cp += i;
+	i = strspn(cp, WHITESPACE);
+	if (i > 0) {
+	    cp2 = cp + i;
+	    *cp++ = ' ';
+	    if (cp2 > cp) {
+		memmove(cp, cp2, cpend - cp);
+		cpend -= cp2 - cp;
+	    }
+	}
+    }
+    return s;
+}
+
+#undef WHITESPACE
+
+/* strdup may or may not be in string.h, depending on the value
+   of the pp-symbol _XOPEN_SOURCE and other arcana.  Just
+   do it ourselves.
+   Mnemonic:  "ntcs" = "nul-terminated character string" */
+char *ntcsdup(const char *s){
+    char *p = (char *)malloc(strlen(s)+1);
+    strcpy(p, s);
+    return p;
+}
+
+/* MSVC doesn't know about strtoull.  Strictly speaking, strtoull
+   isn't standardized in C++98, either, but that seems not to be a
+   problem so we blissfully ignore it and use strtoull (or its MSVC
+   equivalent, _strtoui64) in both C and C++.  If strtoull in C++
+   becomes a problem, we can adopt the prtu strategy (see below) and
+   write C++ versions of strtouNN, that use an istringstream
+   instead. */
+#ifdef _MSC_FULL_VER
+#define strtoull _strtoui64
+#endif
+uint32_t strtou32(const char *p, char **endp, int base){
+    uint32_t ret;
+    errno = 0;
+    ret = strtoul(p, endp, base);
+    assert(errno==0);
+    return ret;
+}
+uint64_t strtou64(const char *p, char **endp, int base){
+    uint64_t ret;
+    errno = 0;
+    ret = strtoull(p, endp, base);
+    assert(errno==0);
+    return ret;
+}
+
+#if defined(__cplusplus)
+/* Strict C++98 doesn't grok %llx or unsigned long long, and with
+   aggressive error-checking, e.g., g++ -pedantic -Wall, will refuse
+   to compile code like:
+
+     fprintf(stderr, "%llx", (R123_ULONG_LONG)v);
+
+   On the other hand, when compiling to a 32-bit target, the only
+   64-bit type is long long, so we're out of luck if we can't use llx.
+   A portable, almost-standard way to do I/O on uint64_t values in C++
+   is to use bona fide C++ I/O streams.  We are still playing
+   fast-and-loose with standards because C++98 doesn't have <stdint.h>
+   and hence doesn't even guarantee that there's a uint64_t, much less
+   that the insertion operator<<(ostream&) works correctly with
+   whatever we've typedef'ed to uint64_t in
+   <features/compilerfeatures.h>.  Hope for the best... */
+#include <iostream>
+#include <limits>
+template <typename T>
+void prtu(T val){
+    using namespace std;
+    cerr.width(std::numeric_limits<T>::digits/4);
+    char prevfill = cerr.fill('0');
+    ios_base::fmtflags prevflags = cerr.setf(ios_base::hex, ios_base::basefield);
+    cerr << val;
+    cerr.flags(prevflags);
+    cerr.fill(prevfill);
+    assert(!cerr.bad());
+}
+void prtu32(uint32_t v){ prtu(v); }
+void prtu64(uint64_t v){ prtu(v); }
+
+#else /* __cplusplus */
+/* C should be easy.  inttypes.h was standardized in 1999.  But Microsoft
+   refuses to recognize the 12-year old standard, so: */
+#if defined(_MSC_FULL_VER)
+#define PRIx32 "x"
+#define PRIx64 "I64x"
+#else /* _MSC_FULL_VER */
+#include <inttypes.h>
+#endif /* _MSVC_FULL_VER */
+void prtu32(uint32_t v){ fprintf(stderr, "%08" PRIx32, v); }
+void prtu64(uint64_t v){ fprintf(stderr, "%016" PRIx64, v); }
+
+#endif /* __cplusplus */
+
+/*
+ * Convert a hexfloat string of the form "0xA.BpN" to a double,
+ * where A and B are hex integers and N is a decimal integer
+ * exponent
+ */
+double
+hextod(const char *cp)
+{
+    uint64_t whole = 0, frac = 0;
+    int exponent = 0, len = 0;
+    double d;
+    char *s;
+    if (cp[0] == '0' && (cp[1] == 'x'||cp[1] == 'X'))
+	cp += 2;
+    whole = strtou64(cp, &s, 16);
+    if (s[0] == '.') {
+	char *cp = ++s;
+	frac = strtou64(s, &s, 16);
+	len = s - cp;
+    }
+    if (s[0] == 'p') {
+	s++;
+	exponent = atoi(s);
+    }
+    frac += whole<<(4*len);
+    exponent -= 4*len;
+    d = frac;
+    d = ldexp(d, exponent);
+    return d;
+}
+
+#define CHECKNOTEQUAL(x, y)  do { if ((x) != (y)) ; else { \
+    fprintf(stderr, "%s: %s line %d error %s == %s (%s)\n", progname, __FILE__, __LINE__, #x, #y, strerror(errno)); \
+    exit(1); \
+} } while (0)
+#define CHECKEQUAL(x, y)  do { if ((x) == (y)) ; else { \
+    fprintf(stderr, "%s: %s line %d error %s != %s (%s)\n", progname, __FILE__, __LINE__, #x, #y, strerror(errno)); \
+    exit(1); \
+} } while (0)
+#define CHECKZERO(x)  CHECKEQUAL((x), 0)
+#define CHECKNOTZERO(x)  CHECKNOTEQUAL((x), 0)
+
+#define dprintf(x) do { if (debug < 1) ; else { printf x; fflush(stdout); } } while (0)
+
+#define ALLZEROS(x, K, N) \
+do { \
+    int allzeros = 1; \
+    unsigned xi, xj; \
+    for (xi = 0; xi < (unsigned)(K); xi++)      \
+	for (xj = 0; xj < (unsigned)(N); xj++)          \
+	    allzeros = allzeros & ((x)[xi].v[xj] == 0); \
+    if (allzeros) fprintf(stderr, "%s: Unexpected, all %lu elements of %ux%u had all zeros!\n", progname, (unsigned long)K, (unsigned)N, (unsigned)sizeof(x[0].v[0])); \
+} while(0)
+
+/* Read in N words of width W into ARR */
+#define SCANFARRAY(ARR, NAME, N, W) \
+do { \
+    int xi, xj; \
+    unsigned long long xv; \
+    for (xi = 0; xi < (N); xi++) { \
+        /* Avoid any cleverness with SCNx##W because Microsoft (as of Visual Studio 10.x) silently trashes the stack by pretending that %hhx is %x). */ \
+	const char *xfmt = " %llx%n"; \
+	ret = sscanf(cp, xfmt, &xv, &xj); \
+	ARR.v[xi] = (uint##W##_t)xv; \
+	if (debug > 1) printf("line %d: xfmt for W=%d is \"%s\", got ret=%d xj=%d, %s[%d]=%llx cp=%s", linenum, W, xfmt, ret, xj, #ARR, xi, (unsigned long long) ARR.v[xi], cp); \
+	if (ret < 1) { \
+	    fprintf(stderr, "%s: ran out of words reading %s on line %d: " #NAME #N "x" #W " %2d %s", \
+		    progname, #ARR, linenum, rounds, line); \
+	    errs++; \
+	    return; \
+	} \
+	cp += xj; \
+    } \
+} while(0)
+
+#define PRINTARRAY(ARR, fp) \
+do { \
+    char ofmt[64]; \
+    size_t xj; \
+    /* use %lu and the cast (instead of z) for portability to Microsoft, sizeof(v[0]) should fit easily in an unsigned long.  Avoid inttypes for the same reason. */ \
+    sprintf(ofmt, " %%0%lullx", (unsigned long)sizeof(ARR.v[0])*2UL); \
+    for (xj = 0; xj < sizeof(ARR.v)/sizeof(ARR.v[0]); xj++) { \
+	fprintf(fp, ofmt, (unsigned long long) ARR.v[xj]); \
+    } \
+} while(0)
+
+#define PRINTLINE(NAME, N, W, R, ictr, ukey, octr, fp) \
+do { \
+    fprintf(fp, "%s %d ", #NAME #N "x" #W, R); \
+    PRINTARRAY(ictr, fp); \
+    putc(' ', fp); \
+    PRINTARRAY(ukey, fp); \
+    putc(' ', fp); \
+    PRINTARRAY(octr, fp); \
+    putc('\n', fp); \
+    fflush(fp); \
+} while(0)
+
+#endif /* UTIL_H__ */
diff --git a/lib/Random123-1.08/examples/util_cpu.h b/lib/Random123-1.08/examples/util_cpu.h
new file mode 100644
index 0000000..bde2db3
--- /dev/null
+++ b/lib/Random123-1.08/examples/util_cpu.h
@@ -0,0 +1,198 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef UTIL_CPU_H__
+#define UTIL_CPU_H__ 1
+
+#include "util.h"
+
+/*
+ * burn a little CPU by computing a logistic map function
+ * before reading /proc/cpuinfo, might fool
+ * energy-saving CPU into showing its true speed
+ */
+static double warmupCPU(long n){
+    double d = 0.3;
+    int i;
+    for (i = 0; i < n; i++) {
+	d = 3.6 * d * (1. - d);
+    }
+    dprintf(("logistic map produced %f\n", d));
+    return d;
+}
+
+#if defined(_MSC_VER)
+#define NOMINMAX    /* tells Windows.h to NOT define min() & max() */
+#include <Windows.h>
+static double clockspeedHz(int *ncores, char **modelnamep) {
+    /*
+     * To-Do: one could read clock speed from registry.  Or
+     * maybe WMI?
+     * http://www.codeproject.com/KB/system/Processor_Speed.aspx
+     * http://msdn.microsoft.com/en-us/library/aa394373(v=vs.85).aspx
+     */
+    if (ncores) {
+	SYSTEM_INFO sysinfo;
+	GetSystemInfo(&sysinfo);
+	*ncores = sysinfo.dwNumberOfProcessors;
+    }
+    if (modelnamep) {
+	/*
+	 * To-Do: use __cpuid to get brand string see
+	 * http://msdn.microsoft.com/en-us/library/hskdteyh%28v=vs.80%29.aspx
+	 */
+	*modelnamep = ntcsdup("Windows");
+   }
+   return 0.;
+}
+#elif defined(__APPLE__)
+static double clockspeedHz(int *ncores, char **modelnamep){
+    FILE *fp = popen("sysctl hw.cpufrequency", "r");
+    double hz = 0.;
+    double d = warmupCPU(100L*1000L*1000L);
+    if( fscanf(fp, "%*s %lf", &hz)  != 1 )
+ 	return 0.;
+    pclose(fp);
+    if(ncores) *ncores = 1;
+    if(modelnamep) *modelnamep = ntcsdup("Apple");
+    return hz;
+}
+#elif defined(__SUNPRO_CC) || defined(__SUNPRO_C) || (defined(__GNUC__)&&defined(__sun__))
+static double clockspeedHz(int *ncores, char  **modelnamep){
+    FILE *fp = popen("kstat -p -s current_clock_Hz", "r");
+    double hz = 0.;
+    double d = warmupCPU(100L*1000L*1000L);
+    /* To-do: get a model name from kstat too */
+    if(modelnamep) *modelnamep = ntcsdup("Solaris");
+    int nc = 0;
+    while( fscanf(fp, "%*s %lf", &hz) == 1 ){
+        nc++;
+    }
+    if(ncores) *ncores = nc;
+    return hz;
+}
+#elif defined(__linux__)
+/* Read the clock speed from /proc/cpuinfo - Linux-specific! */
+static double clockspeedHz(int *ncores, char **modelnamep){
+    char *s, buf[1024]; /* long enough for any /proc/cpuinfo line */
+    double Mhz = 0.;
+    double xMhz;
+    int i;
+    double d = warmupCPU(100L*1000L*1000L);
+    FILE *fp;
+    if ((fp = fopen("/proc/cpuinfo", "r")) == NULL) {
+	if (ncores) *ncores = 1;
+	if (modelnamep) *modelnamep = ntcsdup("unknown");
+	return 0.;
+    }
+    if (ncores) *ncores = 0;
+    while (fgets(buf, sizeof buf, fp) != NULL) {
+	if (modelnamep && (s = strstr(buf, "model name")) != NULL) {
+	    CHECKNOTZERO(s = strchr(s, ':'));
+	    while (*++s == ' ')
+		;
+	    i = strchr(s, '\n') - s;
+	    *modelnamep = (char *)malloc(i + 1);
+	    memcpy(*modelnamep, s, i);
+	    (*modelnamep)[i] = '\0';
+	    dprintf(("raw modelname is %d bytes: %s\n", i, *modelnamep));
+	    nameclean(*modelnamep);
+	    dprintf(("cleaned modelname is %s\n", *modelnamep));
+	}
+	if ((s = strstr(buf, "cpu MHz")) || (s = strstr(buf, "clock"))) {
+	    if (s[1] == 'p') // cpu MHz
+		CHECKNOTZERO(sscanf(s, "cpu MHz : %lf %n", &xMhz, &i));
+	    else // clock
+		CHECKNOTZERO(sscanf(s, "clock : %lfMHz %n", &xMhz, &i));
+	    dprintf(("parsed %f %d\n", xMhz, i));
+	    if (xMhz > Mhz) Mhz = xMhz;
+	    s += i;
+	    if (ncores) *ncores += 1;
+	}
+    }
+    d = Mhz*1e6;
+    dprintf(("clockspeed is %f\n", d));
+    return d;
+}
+#elif defined(__FreeBSD__)
+static double clockspeedHz(int *nnodes, char **modelnamep){
+    /* Seems to work with FreeBSD 8.2. */
+    FILE *fp = popen("sysctl hw.ncpu hw.clockrate hw.model", "r");
+    int ncpu, clockrate;
+    if( fscanf(fp, "%*s%d%*s%d%*s", &ncpu, &clockrate) != 2 )
+	return 0;
+    if(nnodes) *nnodes = ncpu;
+    if(modelnamep){
+	char buf[256];
+	if(fgets(buf, sizeof(buf), fp) == NULL) 
+	    *modelnamep = ntcsdup("error reading sysctl");
+	else
+	    *modelnamep = ntcsdup(buf);
+    }
+    return 1.e6*clockrate;
+}
+#else
+static double clockspeedHz(int *nnodes, char **modelnamep){
+    if(nnodes) *nnodes = 1;
+    if(modelnamep) *modelnamep = ntcsdup("unknown");
+    return 0.;
+}
+#endif /* ! _MSC_VER */
+
+#define uint unsigned int
+typedef struct test_info {
+    double hz;
+    int ncores;
+    char *cpuname;
+} CPUInfo;
+
+CPUInfo *cpu_init(const char *arg)
+{
+    CPUInfo *tp;
+    tp = (CPUInfo*)malloc(sizeof(CPUInfo));
+    tp->hz = clockspeedHz(&tp->ncores, &tp->cpuname);
+    printf("%d cores, %.3f Ghz, cpu %s\n", tp->ncores, tp->hz*1e-9, tp->cpuname);
+    if (arg) {
+	int n = atoi(arg);
+	if (n) {
+	    printf("setting cores to %d\n", n);
+	    tp->ncores = n;
+	}
+    }
+    return tp;
+}
+
+void cpu_done(CPUInfo *tp)
+{
+    free(tp->cpuname);
+    free(tp);
+}
+#endif /* UTIL_CPU_H__ */
diff --git a/lib/Random123-1.08/examples/util_cuda.h b/lib/Random123-1.08/examples/util_cuda.h
new file mode 100644
index 0000000..1cb4476
--- /dev/null
+++ b/lib/Random123-1.08/examples/util_cuda.h
@@ -0,0 +1,116 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef UTIL_CUDA_H__
+#define UTIL_CUDA_H__
+
+#include "util.h"
+
+#include <cuda.h>
+#include <cuda_runtime_api.h>
+
+// utility macros to check return codes and complain/exit on failure
+#define CHECKLAST(MSG) 	do { cudaError_t e = cudaGetLastError(); if (e != cudaSuccess) {fprintf(stderr, "%s:%d: CUDA Error: %s: %s\n", __FILE__, __LINE__, (MSG), cudaGetErrorString(e)); exit(1); }} while(0)
+#define CHECKCALL(RET)	do { cudaError_t e = (RET); if (e != cudaSuccess) { fprintf(stderr, "%s:%d: CUDA Error: %s\n", __FILE__, __LINE__, cudaGetErrorString(e)); exit(1); } } while(0)
+
+typedef struct cuda_info {
+    int devnum, cores, blocks_per_grid, threads_per_block;
+    double cycles;
+    struct cudaDeviceProp dev;
+} CUDAInfo;
+
+// If devstr is none, chooses device with most cores.
+static CUDAInfo *cuda_init(const char *devstr)
+{
+    CUDAInfo *tp;
+    int i, ndev, cores, devcores;
+    double cycles;
+    CHECKNOTZERO(tp = (CUDAInfo *) malloc(sizeof(CUDAInfo)));
+    CHECKCALL( cudaGetDeviceCount(&ndev) );
+    devcores = 0;
+    for (i = 0; i < ndev; i++) {
+	struct cudaDeviceProp cu;
+	CHECKCALL( cudaGetDeviceProperties (&cu, i) );
+	// Number of cores is not available from a query, have to hardwire
+	// some knowledge here!
+	cores = cu.multiProcessorCount;
+	if (cu.major == 1 && cu.minor >= 0 && cu.minor <= 3) {
+	    // 1.0 (G80, G92, aka GTX880, Tesla [CSD]870) to 1.3 (GT200, aka GTX280, Tesla [CS]10xx) have 8 cores per MP
+	    cores *= 8;
+	} else if (cu.major == 2 && cu.minor == 0) {
+	    // 2.0 (G100, aka GTX480, Tesla/Fermi [CSM]20[567]0, and GF110, aka GTX580, M2090)
+	    cores *= 32;
+	} else if (cu.major == 2 && cu.minor == 1) {
+	    // 2.1 (GF104, GF114, GF116 aka GTX [45][56]0)
+	    cores *= 48;
+	} else if (cu.major == 3 && (cu.minor == 0||cu.minor==5)) {
+	    // 3.0 (Kepler GK104 aka GTX 680)
+	    cores *= 192;
+	} else {
+	    fprintf(stderr, "Unknown # of cores per MP for this device, assuming 1, so cpb will be wrong\n");
+	}
+	/* clockrate is in KHz */
+	cycles = 1e3 * cu.clockRate * cores;
+	printf("  %d: maj %d min %d %s%s ( %d units @ %g MHz ECC=%d %d cores %g Gcycles/s)\n",
+	   i, cu.major, cu.minor, nameclean(cu.name), cu.integrated ? " integrated" : "",
+	   cu.multiProcessorCount, cu.clockRate*1e-3, cu.ECCEnabled, cores, cycles*1e-9);
+	if (devstr && strstr(cu.name, devstr) == NULL) {
+	    dprintf(("skipping device %s\n", cu.name));
+	    continue;
+	}
+	if (cores > devcores) {
+	    devcores = cores;
+	    tp->devnum = i;
+	    tp->cores = cores;
+	    tp->cycles = cycles;
+	    tp->dev = cu;
+	}
+    }
+    if (devcores == 0) {
+	fprintf(stderr, "could not find specified device\n");
+	exit(1);
+    }
+    tp->blocks_per_grid = tp->cores; /* seems like a good guess */
+    tp->threads_per_block = tp->dev.warpSize * 2;
+    dprintf(("Using CUDA device %d, %d cores, %g cycles, will try %d blocks/grid %d threads/block\n",
+	     tp->devnum, tp->cores, tp->cycles, tp->blocks_per_grid, tp->threads_per_block));
+    CHECKCALL(cudaSetDevice(tp->devnum));
+    dprintf(("cuda_init done\n"));
+    return tp;
+}
+
+static void cuda_done(CUDAInfo *tp)
+{
+    dprintf(("cuda_done\n"));
+    free(tp);
+}
+
+#endif /* UTIL_CUDA_H__ */
diff --git a/lib/Random123-1.08/examples/util_demangle.hpp b/lib/Random123-1.08/examples/util_demangle.hpp
new file mode 100644
index 0000000..4ea34b8
--- /dev/null
+++ b/lib/Random123-1.08/examples/util_demangle.hpp
@@ -0,0 +1,75 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef demangle_dot_hpp_
+#include <string>
+
+// Every compiler has a demangling library *somewhere*.  Unfortunately, they're
+// all different...
+
+#ifdef __GNUC__
+ // Clang defines __GNUC__, but clang3.1 with -stdlib=libc++ can't
+ // find a <cxxabi.h> even though it *can* find the symbols at link
+ // time.  I suspect this is a bug/oversight in the installation
+ // process (which, in June 2012 is still pretty fluid for libc++), so
+ // it might be fixed in the future.  On the other hand, the API in
+ // cxxabi.h is locked down pretty tightly, so writing out an explicit
+ // extern declaration is pretty safe, and avoids a rats nest of
+ // ifdefs.  It is tempting to use clang's __has_include(<cxxabi.h>),
+ // but it feels like more #ifdefs with no obvious upside.
+ //
+ // #include <cxxabi.h>
+extern "C"{
+  char*
+  __cxa_demangle(const char* __mangled_name, char* __output_buffer,
+		 size_t* __length, int* __status);
+}
+#endif
+#include <typeinfo>
+
+template <typename T>
+std::string demangle(const T& ignored){
+#ifdef __GNUC__
+    int status;
+    char *realname = __cxa_demangle(typeid(ignored).name(), 0, 0, &status);
+    std::string ret;
+    if(status!=0 || realname==0)
+        ret = typeid(ignored).name();
+    else
+        ret = realname;
+    free(realname);
+    return ret;
+#else
+    return typeid(ignored).name();
+#endif
+}
+
+#endif
diff --git a/lib/Random123-1.08/examples/util_expandtpl.h b/lib/Random123-1.08/examples/util_expandtpl.h
new file mode 100644
index 0000000..1e209df
--- /dev/null
+++ b/lib/Random123-1.08/examples/util_expandtpl.h
@@ -0,0 +1,77 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef TEST_TPL
+#error "TEST_TPL not defined before including util_expandtpl.h"
+#else
+/*
+ * This is included by various files after defining TEST_TPL to
+ * expand TEST_TPL for each of the RNGs we want to test.
+ * TEST_TPL args are the name of the RNG, N, W, and R,
+ * N being the number of words, W being the wordsize in bits,
+ * and R being the number of rounds.
+ */
+
+#if TRY_OTHER
+TEST_TPL(mrg, 1, 32, 1)
+TEST_TPL(mt, 1, 32, 1)
+TEST_TPL(mtsmall, 1, 32, 1)
+TEST_TPL(cmrg, 1, 32, 1)
+TEST_TPL(xorwow, 1, 32, 1)
+#endif
+#if TRY_PHILOX2X32
+TEST_TPL(philox, 2, 32, 7)
+TEST_TPL(philox, 2, 32, 10)
+#endif
+TEST_TPL(philox, 4, 32, 7)
+TEST_TPL(philox, 4, 32, 10)
+#if R123_USE_PHILOX_64BIT
+TEST_TPL(philox, 2, 64, 6)
+TEST_TPL(philox, 2, 64, 10)
+TEST_TPL(philox, 4, 64, 7)
+TEST_TPL(philox, 4, 64, 10)
+#endif
+TEST_TPL(threefry, 2, 64, 13)
+TEST_TPL(threefry, 2, 64, 20)
+TEST_TPL(threefry, 4, 64, 12)
+TEST_TPL(threefry, 4, 64, 20)
+TEST_TPL(threefry, 4, 32, 12)
+TEST_TPL(threefry, 4, 32, 20)
+TEST_TPL(threefry, 4, 64, 72)
+
+#if R123_USE_AES_NI
+TEST_TPL(ars, 4, 32, 5)
+TEST_TPL(ars, 4, 32, 7)
+TEST_TPL(aesni, 4, 32, 10)
+#endif
+
+#undef TEST_TPL
+#endif /* TEST_TPL */
diff --git a/lib/Random123-1.08/examples/util_m128.h b/lib/Random123-1.08/examples/util_m128.h
new file mode 100644
index 0000000..b40511b
--- /dev/null
+++ b/lib/Random123-1.08/examples/util_m128.h
@@ -0,0 +1,87 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef UTIL_M128_H__
+#define UTIL_M128_H__
+#include <Random123/features/sse.h>
+
+// The formatting in fips-197 seems to correspond to
+// byte[15] [14] ... [0]
+__m128i m128i_from_charbuf(const char *s){
+    unsigned int bytes[16];
+    sscanf(s, "%02x%02x%02x%02x" "%02x%02x%02x%02x" "%02x%02x%02x%02x" "%02x%02x%02x%02x",
+             &bytes[0], &bytes[1], &bytes[2], &bytes[3],
+             &bytes[4], &bytes[5], &bytes[6], &bytes[7],
+             &bytes[8], &bytes[9], &bytes[10], &bytes[11],
+             &bytes[12], &bytes[13], &bytes[14], &bytes[15]);
+    return _mm_set_epi8(
+                         bytes[15], bytes[14], bytes[13], bytes[12],
+                         bytes[11], bytes[10], bytes[9], bytes[8],
+                         bytes[7], bytes[6], bytes[5], bytes[4],
+                         bytes[3], bytes[2], bytes[1], bytes[0]
+                         );
+}
+
+#define M128_STR_SIZE 34    /* minimum size of the charbuf "hex" argument */
+
+char *m128i_to_charbuf(__m128i m, char *hex){
+    union {
+	unsigned char bytes[16];
+	__m128i m;
+    } u;
+    _mm_storeu_si128((__m128i*)&u.bytes[0], m);
+    sprintf(hex, "%02x%02x%02x%02x" "%02x%02x%02x%02x"
+            " "
+            "%02x%02x%02x%02x""%02x%02x%02x%02x",
+             u.bytes[0], u.bytes[1], u.bytes[2], u.bytes[3],
+             u.bytes[4], u.bytes[5], u.bytes[6], u.bytes[7],
+             u.bytes[8], u.bytes[9], u.bytes[10], u.bytes[11],
+             u.bytes[12], u.bytes[13], u.bytes[14], u.bytes[15]);
+
+    return hex;
+}
+
+#ifdef __cplusplus
+#include <string>
+
+__m128i m128i_from_string(const std::string& s) {
+    return m128i_from_charbuf(s.c_str());
+}
+
+std::string m128i_to_string(__m128i m) {
+    char hex[M128_STR_SIZE];
+    
+    m128i_to_charbuf(m, hex);
+    return std::string(hex);
+}
+#endif /* __cplusplus */
+
+#endif /* UTIL_M128_H__ */
diff --git a/lib/Random123-1.08/examples/util_opencl.h b/lib/Random123-1.08/examples/util_opencl.h
new file mode 100644
index 0000000..9dde323
--- /dev/null
+++ b/lib/Random123-1.08/examples/util_opencl.h
@@ -0,0 +1,337 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef UTIL_OPENCL_H__
+#define UTIL_OPENCL_H__
+/*
+ * has a couple of utility functions to setup and teardown OpenCL.
+ * Avoid much boilerplate in every OpenCL program
+ */
+
+#include "util.h"
+
+#if defined(__APPLE__) || defined(__MACOSX)
+#include <OpenCL/cl.h>
+#include <OpenCL/cl_ext.h>
+#else
+#include <CL/cl.h>
+#include <CL/cl_ext.h>
+#endif
+
+#define UCL_STRSIZE 128
+
+typedef struct ucl_info {
+    cl_context ctx;
+    cl_program prog;
+    cl_device_id devid;
+    cl_command_queue cmdq;
+    cl_uint clkfreq, compunits;
+    size_t wgsize;
+    int cores;
+    double cycles;
+    char vendor[UCL_STRSIZE], devname[UCL_STRSIZE],
+	version[UCL_STRSIZE], driver[UCL_STRSIZE];
+    int computeflags;
+    cl_device_fp_config fpdbl;
+} UCLInfo;
+
+/* Miscellaneous checking macros for convenience */
+static char *print_cl_errstring(cl_int err) {
+    switch (err) {
+        case CL_SUCCESS:                          return strdup("Success!");
+        case CL_DEVICE_NOT_FOUND:                 return strdup("Device not found.");
+        case CL_DEVICE_NOT_AVAILABLE:             return strdup("Device not available");
+        case CL_COMPILER_NOT_AVAILABLE:           return strdup("Compiler not available");
+        case CL_MEM_OBJECT_ALLOCATION_FAILURE:    return strdup("Memory object allocation failure");
+        case CL_OUT_OF_RESOURCES:                 return strdup("Out of resources");
+        case CL_OUT_OF_HOST_MEMORY:               return strdup("Out of host memory");
+        case CL_PROFILING_INFO_NOT_AVAILABLE:     return strdup("Profiling information not available");
+        case CL_MEM_COPY_OVERLAP:                 return strdup("Memory copy overlap");
+        case CL_IMAGE_FORMAT_MISMATCH:            return strdup("Image format mismatch");
+        case CL_IMAGE_FORMAT_NOT_SUPPORTED:       return strdup("Image format not supported");
+        case CL_BUILD_PROGRAM_FAILURE:            return strdup("Program build failure");
+        case CL_MAP_FAILURE:                      return strdup("Map failure");
+        case CL_INVALID_VALUE:                    return strdup("Invalid value");
+        case CL_INVALID_DEVICE_TYPE:              return strdup("Invalid device type");
+        case CL_INVALID_PLATFORM:                 return strdup("Invalid platform");
+        case CL_INVALID_DEVICE:                   return strdup("Invalid device");
+        case CL_INVALID_CONTEXT:                  return strdup("Invalid context");
+        case CL_INVALID_QUEUE_PROPERTIES:         return strdup("Invalid queue properties");
+        case CL_INVALID_COMMAND_QUEUE:            return strdup("Invalid command queue");
+        case CL_INVALID_HOST_PTR:                 return strdup("Invalid host pointer");
+        case CL_INVALID_MEM_OBJECT:               return strdup("Invalid memory object");
+        case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR:  return strdup("Invalid image format descriptor");
+        case CL_INVALID_IMAGE_SIZE:               return strdup("Invalid image size");
+        case CL_INVALID_SAMPLER:                  return strdup("Invalid sampler");
+        case CL_INVALID_BINARY:                   return strdup("Invalid binary");
+        case CL_INVALID_BUILD_OPTIONS:            return strdup("Invalid build options");
+        case CL_INVALID_PROGRAM:                  return strdup("Invalid program");
+        case CL_INVALID_PROGRAM_EXECUTABLE:       return strdup("Invalid program executable");
+        case CL_INVALID_KERNEL_NAME:              return strdup("Invalid kernel name");
+        case CL_INVALID_KERNEL_DEFINITION:        return strdup("Invalid kernel definition");
+        case CL_INVALID_KERNEL:                   return strdup("Invalid kernel");
+        case CL_INVALID_ARG_INDEX:                return strdup("Invalid argument index");
+        case CL_INVALID_ARG_VALUE:                return strdup("Invalid argument value");
+        case CL_INVALID_ARG_SIZE:                 return strdup("Invalid argument size");
+        case CL_INVALID_KERNEL_ARGS:              return strdup("Invalid kernel arguments");
+        case CL_INVALID_WORK_DIMENSION:           return strdup("Invalid work dimension");
+        case CL_INVALID_WORK_GROUP_SIZE:          return strdup("Invalid work group size");
+        case CL_INVALID_WORK_ITEM_SIZE:           return strdup("Invalid work item size");
+        case CL_INVALID_GLOBAL_OFFSET:            return strdup("Invalid global offset");
+        case CL_INVALID_EVENT_WAIT_LIST:          return strdup("Invalid event wait list");
+        case CL_INVALID_EVENT:                    return strdup("Invalid event");
+        case CL_INVALID_OPERATION:                return strdup("Invalid operation");
+        case CL_INVALID_GL_OBJECT:                return strdup("Invalid OpenGL object");
+        case CL_INVALID_BUFFER_SIZE:              return strdup("Invalid buffer size");
+        case CL_INVALID_MIP_LEVEL:                return strdup("Invalid mip-map level");
+        default:                                  return strdup("Unknown");
+    }
+} 
+
+#define CHECKERR(x) do { \
+    (x); \
+    if (err != CL_SUCCESS) { \
+	fprintf(stderr, "%s: error %d: %s from %s\n", progname, err, print_cl_errstring(err), #x); \
+	exit(1); \
+    } \
+} while(0)
+
+#define CHECK(x) CHECKERR(err = (x))
+
+static UCLInfo *opencl_init(const char *devstr, const char *src,
+			    const char *options)
+{
+#define UCL_MAX_PROPERTIES 32
+#define UCL_MAX_PLATFORMS 8
+#define UCL_MAX_DEVICES 16
+    UCLInfo *tp;
+    cl_context_properties ctxprop[UCL_MAX_PROPERTIES];
+    cl_int err;
+    cl_platform_id platforms[UCL_MAX_PLATFORMS];
+    cl_uint nplatforms, ndevices;
+    cl_device_id devices[UCL_MAX_DEVICES];
+    const char *srcstr[1], *clbinfile;
+    unsigned i, j;
+    int cores, devcores;
+
+    /* get list of platforms */
+    CHECK(clGetPlatformIDs(0, NULL, &nplatforms));
+    dprintf(("nplatforms = %d\n", nplatforms));
+    CHECK(clGetPlatformIDs(UCL_MAX_PLATFORMS, platforms, &nplatforms));
+    if (nplatforms == 0) {
+	fprintf(stderr, "No OpenCL platforms available\n");
+	return NULL;
+    }
+    dprintf(("found %d platform%s:\n", nplatforms, nplatforms == 1 ? "" : "s"));
+    CHECKNOTZERO(tp = (UCLInfo *) malloc(sizeof(UCLInfo)));
+    ctxprop[0] = CL_CONTEXT_PLATFORM;
+    ctxprop[1] = 0; /* will fill in platform in loop */
+    ctxprop[2] = 0;
+    cores = devcores = 0;
+    for (i = 0; i < nplatforms; i++) {
+	dprintf(("platform %d: 0x%lx\n", i, (unsigned long)platforms[i]));
+	CHECK(clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL,
+			     UCL_MAX_DEVICES, devices, &ndevices));
+	dprintf(("platform 0x%lx has %d devices:\n", (unsigned long)platforms[i], ndevices));
+	for (j = 0; j < ndevices; j++) {
+	    UCLInfo uc;
+	    uc.devid = devices[j];
+	    CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_NAME,
+				  sizeof uc.devname, uc.devname, 0));
+	    nameclean(uc.devname);
+	    CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_VENDOR,
+				  sizeof uc.vendor, uc.vendor, 0));
+	    CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_VERSION,
+				  sizeof uc.version, uc.version, 0));
+	    CHECK(clGetDeviceInfo(devices[j], CL_DRIVER_VERSION,
+				  sizeof uc.driver, uc.driver, 0));
+	    CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_MAX_CLOCK_FREQUENCY,
+				  sizeof uc.clkfreq, &uc.clkfreq, 0));
+	    CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_MAX_COMPUTE_UNITS,
+				  sizeof uc.compunits, &uc.compunits, 0));
+	    CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_MAX_WORK_GROUP_SIZE,
+				  sizeof uc.wgsize, &uc.wgsize, 0));
+	    CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_DOUBLE_FP_CONFIG,
+				  sizeof uc.fpdbl, &uc.fpdbl, 0));
+	    uc.computeflags = 0;
+#ifdef CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV
+	    {
+		cl_uint nvmaj, nvmin;
+		if(clGetDeviceInfo(devices[j], CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV,
+				   sizeof(nvmaj), &nvmaj, 0) == CL_SUCCESS &&
+		   clGetDeviceInfo(devices[j], CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV,
+				   sizeof(nvmin), &nvmin, 0) == CL_SUCCESS) {
+		    uc.computeflags = nvmaj*10 + nvmin;
+		}
+	    }
+#endif
+	    cores = uc.compunits;
+	    /* XXX Hardwired knowledge about devices */
+	    if (strcmp("Cayman", uc.devname) == 0 || strcmp("Tahiti", uc.devname) == 0) {
+		/*
+		 * Most modern AMD compute units (shader cluster?)
+		 * are a 16-lane SIMD Engine with 4 (Cayman) or 5
+		 * (Cypress) VLIW slots per lane.  AMD appears to
+		 * think of each slot as a "stream processor"
+		 * (shader processor) in their marketing i.e. a
+		 * Cayman-based Radeon 6950 with 24 compute units
+		 * has 1536 stream processors.
+		 * With Tahiti/Southern Islands/GCN, each compute
+		 * unit has four vector execution SIMD units, each
+		 * with 16 lanes.  So the Tahiti-based Radeon 7970 with
+		 * 32 compute units has 2048 cores/stream processors.
+		 */
+		cores *= 16*4;
+	    } else if (strcmp("Cypress", uc.devname) == 0) {
+		cores *= 16*5;
+	    } else if (strstr(uc.devname, "GTX 680")) {
+		/* Kepler has 192 cores per SMX */
+		cores *= 192;
+	    } else if (strstr(uc.devname, "GTX 580") ||
+		       strstr(uc.devname, "GTX 480") ||
+		       strstr(uc.devname, "C20") ||
+		       strstr(uc.devname, "M20")) {
+		/*
+		 * Fermi has 32 cores per SM.  Maybe use
+		 * computeflags to figure this out?
+		 */
+		cores *= 32;
+
+	    }
+	    /* clkfreq is in Megahertz! */
+	    uc.cycles = 1e6 * uc.clkfreq * cores;
+	    dprintf(("  %d: device 0x%lx vendor %s %s version %s driver %s : %u compute units @ %u MHz %d cores cycles/s %.2f flags %d fpdbl 0x%lx\n",
+		     j, (unsigned long) devices[j], uc.vendor, uc.devname, uc.version,
+		     uc.driver, uc.compunits, uc.clkfreq, cores, uc.cycles, uc.computeflags,
+		     (unsigned long) uc.fpdbl));
+	    if (devstr && strstr(uc.devname, devstr) == NULL) {
+		if (verbose || debug)
+		    printf("skipping device %s\n", uc.devname);
+		continue;
+	    }
+	    if (cores > devcores) {
+		ctxprop[1] = (cl_context_properties) platforms[i];
+		devcores = cores;
+		*tp = uc;
+	    }
+	}
+    }
+    if (devcores == 0) {
+	fprintf(stderr, "%s: No matching devices found\n", progname);
+	exit(1);
+    }
+    tp->cores = devcores;
+
+    // using DEVICE_MAX_WORKGROUP_SIZE as the workgroup size seems to break
+    // weirdly on NVIDIA SDK 4.0.17 (the returned ctr arrays are all zeros)
+    // Halving it seems to produce as good or fractionally better performance
+    // on AMD, so seems a good choice. -- mm, 20110831
+    if (tp->wgsize > 2) {
+	tp->wgsize /= 2;
+    }
+    printf("device 0x%lx %s : %d units %d cores %.2f Gcycles/s %lu maxwg\n",
+	     (unsigned long)tp->devid, tp->devname, tp->compunits, devcores, tp->cycles*1e-9, tp->wgsize);
+    CHECKERR(tp->ctx = clCreateContext(ctxprop, 1, &tp->devid, 0, 0, &err));
+    dprintf(("create OpenCL context for device 0x%lx %s\n", (unsigned long)tp->devid, tp->devname));
+    CHECKERR(tp->cmdq = clCreateCommandQueue(tp->ctx, tp->devid, 0, &err));
+    /*
+     * create & compile OpenCL program from source string.  Could
+     * normalize this out of the context but that creates a more
+     * complex API.
+     */
+    dprintf(("create OpenCL program from source\n"));
+
+    /* If the device has support for double, enable it, might need it for u01.h */
+    i = 0;
+#define UCLDBL "\n\
+#ifdef cl_khr_fp64\n\
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n\
+#elif defined(cl_amd_fp64)\n\
+#pragma OPENCL EXTENSION cl_amd_fp64 : enable\n\
+#endif\n\
+"
+    if (tp->fpdbl) {
+	srcstr[i++] = UCLDBL;
+    }
+    srcstr[i++] = src;
+    CHECKERR(tp->prog = clCreateProgramWithSource(tp->ctx, i, srcstr, 0, &err));
+    if ((err = clBuildProgram(tp->prog, 1, &tp->devid, options, 0, 0)) != CL_SUCCESS || debug) {
+	char errbuf[512*1024];
+	cl_int builderr = err;
+	CHECK(clGetProgramBuildInfo(tp->prog, tp->devid, CL_PROGRAM_BUILD_LOG,
+				    sizeof errbuf, &errbuf, 0));
+	if (errbuf[0]) {
+	    fprintf(stderr, "%s: OpenCL build for device id 0x%lx %s returned error %d: %s\n",
+		    progname, (unsigned long) tp->devid, tp->devname, builderr, errbuf);
+	}
+	if (builderr != CL_SUCCESS)
+	    exit(1);
+    }
+    if ((clbinfile = getenv("R123_SAVE_OPENCL_BINARY")) != NULL) {
+	size_t sz, szret;
+	unsigned char *binp;
+	FILE *fp;
+	CHECKERR(clGetProgramInfo(tp->prog, CL_PROGRAM_BINARY_SIZES, sizeof(sz), &sz, &szret));
+	CHECKNOTZERO(szret);
+	CHECKNOTZERO(sz);
+	printf("szret %lu, sz %lu\n", szret, (unsigned long) sz);
+	if (szret > 0 && sz > 0) {
+	    CHECKNOTZERO((binp = (unsigned char *) malloc(sz)));
+	    CHECKERR(clGetProgramInfo(tp->prog, CL_PROGRAM_BINARIES, sizeof(binp), &binp, &szret));
+	    CHECKNOTZERO(szret);
+	    CHECKNOTZERO(fp = fopen(clbinfile, "wc"));
+	    CHECKEQUAL(sz, fwrite(binp, 1, sz, fp));
+	    CHECKZERO(fclose(fp));
+	    free(binp);
+	    printf("wrote OpenCL binary to %s\n", clbinfile);
+	}
+    }
+    dprintf(("opencl_init done\n"));
+    /* XXX Save build programs as .deviceid so we can read them back and run? */
+    return tp;
+}
+
+
+static void opencl_done(UCLInfo *tp) {
+    cl_int err;
+    
+    dprintf(("opencl_done\n"));
+    CHECK(clReleaseCommandQueue(tp->cmdq));
+    tp->cmdq = 0;
+    CHECK(clReleaseProgram(tp->prog));
+    tp->prog = 0;
+    CHECK(clReleaseContext(tp->ctx));
+    tp->ctx = 0;
+    free(tp);
+}
+
+
+#endif /* UTIL_OPENCL_H__ */
diff --git a/lib/Random123-1.08/examples/util_print.h b/lib/Random123-1.08/examples/util_print.h
new file mode 100644
index 0000000..c272a36
--- /dev/null
+++ b/lib/Random123-1.08/examples/util_print.h
@@ -0,0 +1,58 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef UTIL_PRINT_H__
+#define UTIL_PRINT_H__
+
+#include <stdio.h>
+
+extern int verbose;
+
+#define TEST_TPL(NAME, N, W, R) \
+void printline_##NAME##N##x##W##_##R(NAME##N##x##W##_ukey_t ukey, NAME##N##x##W##_ctr_t ictr, NAME##N##x##W##_ctr_t *octrs, size_t nctr) \
+{ \
+    size_t i; \
+    for (i = 0; i < nctr; i++) { \
+	if (i > 0) { \
+	    printf("  [%lu]", (unsigned long)i); \
+	    PRINTARRAY(octrs[i], stdout); \
+	    putc('\n', stdout); \
+	    fflush(stdout); \
+	} else { \
+	    PRINTLINE(NAME, N, W, R, ictr, ukey, octrs[0], stdout); \
+	} \
+	if (verbose < 2) break; \
+    } \
+}
+
+#include "util_expandtpl.h"
+
+#endif /* UTIL_PRINT_H__ */
diff --git a/lib/Random123-1.08/include/Random123/MicroURNG.hpp b/lib/Random123-1.08/include/Random123/MicroURNG.hpp
new file mode 100644
index 0000000..beb0341
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/MicroURNG.hpp
@@ -0,0 +1,146 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __MicroURNG_dot_hpp__
+#define __MicroURNG_dot_hpp__
+
+#include <stdexcept>
+#include <limits>
+
+namespace r123{
+/**
+    Given a CBRNG whose ctr_type has an unsigned integral value_type,
+    MicroURNG<CBRNG>(c, k) is a type that satisfies the
+    requirements of a C++0x Uniform Random Number Generator.
+
+    The intended purpose is for a MicroURNG to be passed
+    as an argument to a C++0x Distribution, e.g.,
+    std::normal_distribution.  See examples/MicroURNG.cpp.
+
+    The MicroURNG functor has a period of "only"
+
+       ctr_type.size()*2^32,
+
+    after which it will silently repeat.
+
+    The high 32 bits of the highest word in the counter c, passed to
+    the constructor must be zero.  MicroURNG uses these bits to
+    "count".
+
+    Older versions of the library permitted a second template
+    parameter by which the caller could control the number of
+    bits devoted to the URNG's internal counter.  This flexibility
+    has been disabled because URNGs created with different
+    numbers of counter bits could, conceivably "collide".
+
+\code
+       typedef ?someCBRNG? RNG;
+       RNG::ctr_type c = ...; // under application control
+       RNG::key_type k = ...; // 
+       std::normal_distribution<float> nd;
+       MicroURNG<RNG> urng(c, k);
+       for(???){
+         ...
+         nd(urng);  // may be called several hundred times with BITS=10
+         ...
+       }
+\endcode
+*/
+
+template<typename CBRNG>
+class MicroURNG{
+    // According to C++0x, a URNG requires only a result_type,
+    // operator()(), min() and max() methods.  Everything else
+    // (ctr_type, key_type, reset() method, etc.) is "value added"
+    // for the benefit of users that "know" that they're dealing with
+    // a MicroURNG.
+public:
+    typedef CBRNG cbrng_type;
+    static const int BITS = 32;
+    typedef typename cbrng_type::ctr_type ctr_type;
+    typedef typename cbrng_type::key_type key_type;
+    typedef typename cbrng_type::ukey_type ukey_type;
+    typedef typename ctr_type::value_type result_type;
+
+    R123_STATIC_ASSERT( std::numeric_limits<result_type>::digits >= BITS, "The result_type must have at least 32 bits" );
+
+    result_type operator()(){
+        if(last_elem == 0){
+            // jam n into the high bits of c
+            const size_t W = std::numeric_limits<result_type>::digits;
+            ctr_type c = c0;
+            c[c0.size()-1] |= n<<(W-BITS);
+            rdata = b(c,k);
+            n++;
+            last_elem = rdata.size();
+        }
+        return rdata[--last_elem];
+    }
+    MicroURNG(cbrng_type _b, ctr_type _c0, ukey_type _uk) : b(_b), c0(_c0), k(_uk), n(0), last_elem(0) {
+        chkhighbits();
+    }
+    MicroURNG(ctr_type _c0, ukey_type _uk) : b(), c0(_c0), k(_uk), n(0), last_elem(0) {
+        chkhighbits();
+    }
+
+    // _Min and _Max work around a bug in the library shipped with MacOS Xcode 4.5.2.
+    // See the commment in conventional/Engine.hpp.  
+    const static result_type _Min = 0;
+    const static result_type _Max = ~((result_type)0);
+
+    static R123_CONSTEXPR result_type min R123_NO_MACRO_SUBST () { return _Min; }
+    static R123_CONSTEXPR result_type max R123_NO_MACRO_SUBST () { return _Max; }
+    // extra methods:
+    const ctr_type& counter() const{ return c0; }
+    void reset(ctr_type _c0, ukey_type _uk){
+        c0 = _c0;
+        chkhighbits();
+        k = _uk;
+        n = 0;
+        last_elem = 0;
+    }
+
+private:
+    cbrng_type b;
+    ctr_type c0;
+    key_type k;
+    R123_ULONG_LONG n;
+    size_t last_elem;
+    ctr_type rdata;
+    void chkhighbits(){
+        result_type r = c0[c0.size()-1];
+        result_type mask = ((uint64_t)std::numeric_limits<result_type>::max R123_NO_MACRO_SUBST ())>>BITS;
+        if((r&mask) != r)
+            throw std::runtime_error("MicroURNG: c0, does not have high bits clear");
+    }
+};
+} // namespace r123
+#endif
diff --git a/lib/Random123-1.08/include/Random123/ReinterpretCtr.hpp b/lib/Random123-1.08/include/Random123/ReinterpretCtr.hpp
new file mode 100644
index 0000000..164a38b
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/ReinterpretCtr.hpp
@@ -0,0 +1,88 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __ReinterpretCtr_dot_hpp__
+#define __ReinterpretCtr_dot_hpp__
+
+#include "features/compilerfeatures.h"
+#include <cstring>
+
+namespace r123{
+/*!
+  ReinterpretCtr uses memcpy to map back and forth
+  between a CBRNG's ctr_type and the specified ToType.  For example,
+  after:
+
+    typedef ReinterpretCtr<r123array4x32, Philox2x64> G;
+
+  G is a bona fide CBRNG with ctr_type r123array4x32.
+
+  WARNING:  ReinterpretCtr is endian dependent.  The
+  values returned by G, declared as above,
+  will depend on the endianness of the machine on which it runs.
+ */
+
+template <typename ToType, typename CBRNG>
+struct ReinterpretCtr{
+    typedef ToType ctr_type;
+    typedef typename CBRNG::key_type key_type;
+    typedef typename CBRNG::ctr_type bctype;
+    typedef typename CBRNG::ukey_type ukey_type;
+    R123_STATIC_ASSERT(sizeof(ToType) == sizeof(bctype) && sizeof(typename bctype::value_type) != 16, 
+                       "ReinterpretCtr:  sizeof(ToType) is not the same as sizeof(CBRNG::ctr_type) or CBRNG::ctr_type::value_type looks like it might be __m128i");
+    // It's amazingly difficult to safely do conversions with __m128i.
+    // If we use the operator() implementation below with a CBRNG
+    // whose ctr_type is r123array1xm128i, gcc4.6 optimizes away the
+    // memcpys, inlines the operator()(c,k), and produces assembly
+    // language that ends with an aesenclast instruction with a
+    // destination operand pointing to an unaligned memory address ...
+    // Segfault!  See:  http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50444
+    // MSVC also produces code that crashes.  We suspect a
+    // similar mechanism but haven't done the debugging necessary to
+    // be sure.  We were able to 'fix' gcc4.6 by making bc a mutable
+    // data member rather than declaring it in the scope of
+    // operator().  That didn't fix the MSVC problems, though.
+    //
+    // Conclusion - don't touch __m128i, at least for now.  The
+    // easiest (but highly imprecise) way to do that is the static
+    // assertion above that rejects bctype::value_types of size 16. -
+    // Sep 2011.
+    ctr_type  operator()(ctr_type c, key_type k){
+        bctype bc;
+        std::memcpy(&bc, &c, sizeof(c));
+        CBRNG b;
+        bc = b(bc, k);
+        std::memcpy(&c, &bc, sizeof(bc));
+        return c;
+    }
+};
+} // namespace r123
+#endif
diff --git a/lib/Random123-1.08/include/Random123/aes.h b/lib/Random123-1.08/include/Random123/aes.h
new file mode 100644
index 0000000..96e3c9c
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/aes.h
@@ -0,0 +1,344 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __Random123_aes_dot_hpp__
+#define __Random123_aes_dot_hpp__
+
+#include "features/compilerfeatures.h"
+#include "array.h"
+
+/* Implement a bona fide AES block cipher.  It's minimally
+// checked against the test vector in FIPS-197 in ut_aes.cpp. */
+#if R123_USE_AES_NI
+
+/** @ingroup AESNI */
+typedef struct r123array1xm128i aesni1xm128i_ctr_t;
+/** @ingroup AESNI */
+typedef struct r123array1xm128i aesni1xm128i_ukey_t;
+/** @ingroup AESNI */
+typedef struct r123array4x32 aesni4x32_ukey_t;
+/** @ingroup AESNI */
+enum r123_enum_aesni1xm128i { aesni1xm128i_rounds = 10 };
+
+/** \cond HIDDEN_FROM_DOXYGEN */
+R123_STATIC_INLINE __m128i AES_128_ASSIST (__m128i temp1, __m128i temp2) { 
+    __m128i temp3; 
+    temp2 = _mm_shuffle_epi32 (temp2 ,0xff); 
+    temp3 = _mm_slli_si128 (temp1, 0x4);
+    temp1 = _mm_xor_si128 (temp1, temp3);
+    temp3 = _mm_slli_si128 (temp3, 0x4);
+    temp1 = _mm_xor_si128 (temp1, temp3);
+    temp3 = _mm_slli_si128 (temp3, 0x4);
+    temp1 = _mm_xor_si128 (temp1, temp3);
+    temp1 = _mm_xor_si128 (temp1, temp2); 
+    return temp1; 
+}
+
+R123_STATIC_INLINE void aesni1xm128iexpand(aesni1xm128i_ukey_t uk, __m128i ret[11])
+{
+    __m128i rkey = uk.v[0].m;
+    __m128i tmp2;
+
+    ret[0] = rkey;
+    tmp2 = _mm_aeskeygenassist_si128(rkey, 0x1);
+    rkey = AES_128_ASSIST(rkey, tmp2);
+    ret[1] = rkey;
+
+    tmp2 = _mm_aeskeygenassist_si128(rkey, 0x2);
+    rkey = AES_128_ASSIST(rkey, tmp2);
+    ret[2] = rkey;
+
+    tmp2 = _mm_aeskeygenassist_si128(rkey, 0x4);
+    rkey = AES_128_ASSIST(rkey, tmp2);
+    ret[3] = rkey;
+
+    tmp2 = _mm_aeskeygenassist_si128(rkey, 0x8);
+    rkey = AES_128_ASSIST(rkey, tmp2);
+    ret[4] = rkey;
+
+    tmp2 = _mm_aeskeygenassist_si128(rkey, 0x10);
+    rkey = AES_128_ASSIST(rkey, tmp2);
+    ret[5] = rkey;
+
+    tmp2 = _mm_aeskeygenassist_si128(rkey, 0x20);
+    rkey = AES_128_ASSIST(rkey, tmp2);
+    ret[6] = rkey;
+
+    tmp2 = _mm_aeskeygenassist_si128(rkey, 0x40);
+    rkey = AES_128_ASSIST(rkey, tmp2);
+    ret[7] = rkey;
+
+    tmp2 = _mm_aeskeygenassist_si128(rkey, 0x80);
+    rkey = AES_128_ASSIST(rkey, tmp2);
+    ret[8] = rkey;
+
+    tmp2 = _mm_aeskeygenassist_si128(rkey, 0x1b);
+    rkey = AES_128_ASSIST(rkey, tmp2);
+    ret[9] = rkey;
+
+    tmp2 = _mm_aeskeygenassist_si128(rkey, 0x36);
+    rkey = AES_128_ASSIST(rkey, tmp2);
+    ret[10] = rkey;
+}
+/** \endcond */
+    
+#ifdef __cplusplus
+/** @ingroup AESNI */
+struct aesni1xm128i_key_t{ 
+    __m128i k[11]; 
+    aesni1xm128i_key_t(){
+        aesni1xm128i_ukey_t uk;
+        uk.v[0].m = _mm_setzero_si128();
+        aesni1xm128iexpand(uk, k);
+    }
+    aesni1xm128i_key_t(const aesni1xm128i_ukey_t& uk){
+        aesni1xm128iexpand(uk, k);
+    }
+    aesni1xm128i_key_t(const aesni4x32_ukey_t& uk){
+        aesni1xm128i_ukey_t uk128;
+        uk128.v[0].m = _mm_set_epi32(uk.v[3], uk.v[2], uk.v[1], uk.v[0]);
+        aesni1xm128iexpand(uk128, k);
+    }
+    aesni1xm128i_key_t& operator=(const aesni1xm128i_ukey_t& uk){
+        aesni1xm128iexpand(uk, k);
+        return *this;
+    }
+    aesni1xm128i_key_t& operator=(const aesni4x32_ukey_t& uk){
+        aesni1xm128i_ukey_t uk128;
+        uk128.v[0].m = _mm_set_epi32(uk.v[3], uk.v[2], uk.v[1], uk.v[0]);
+        aesni1xm128iexpand(uk128, k);
+        return *this;
+    }
+};
+#else
+typedef struct { 
+    __m128i k[11]; 
+}aesni1xm128i_key_t;
+
+/** @ingroup AESNI */
+R123_STATIC_INLINE aesni1xm128i_key_t aesni1xm128ikeyinit(aesni1xm128i_ukey_t uk){
+    aesni1xm128i_key_t ret;
+    aesni1xm128iexpand(uk, ret.k);
+    return ret;
+}
+#endif
+
+/** @ingroup AESNI */
+R123_STATIC_INLINE aesni1xm128i_ctr_t aesni1xm128i(aesni1xm128i_ctr_t in, aesni1xm128i_key_t k) {
+    __m128i x = _mm_xor_si128(k.k[0], in.v[0].m);
+    x = _mm_aesenc_si128(x, k.k[1]);
+    x = _mm_aesenc_si128(x, k.k[2]);
+    x = _mm_aesenc_si128(x, k.k[3]);
+    x = _mm_aesenc_si128(x, k.k[4]);
+    x = _mm_aesenc_si128(x, k.k[5]);
+    x = _mm_aesenc_si128(x, k.k[6]);
+    x = _mm_aesenc_si128(x, k.k[7]);
+    x = _mm_aesenc_si128(x, k.k[8]);
+    x = _mm_aesenc_si128(x, k.k[9]);
+    x = _mm_aesenclast_si128(x, k.k[10]);
+    {
+      aesni1xm128i_ctr_t ret;
+      ret.v[0].m = x;
+      return ret;
+    }
+}
+
+/** @ingroup AESNI */
+R123_STATIC_INLINE aesni1xm128i_ctr_t aesni1xm128i_R(unsigned R, aesni1xm128i_ctr_t in, aesni1xm128i_key_t k){
+    R123_ASSERT(R==10);
+    return aesni1xm128i(in, k);
+}
+
+
+/** @ingroup AESNI */
+typedef struct r123array4x32 aesni4x32_ctr_t;
+/** @ingroup AESNI */
+typedef aesni1xm128i_key_t aesni4x32_key_t;
+/** @ingroup AESNI */
+enum r123_enum_aesni4x32 { aesni4x32_rounds = 10 };
+/** @ingroup AESNI */
+R123_STATIC_INLINE aesni4x32_key_t aesni4x32keyinit(aesni4x32_ukey_t uk){
+    aesni1xm128i_ukey_t uk128;
+    aesni4x32_key_t ret;
+    uk128.v[0].m = _mm_set_epi32(uk.v[3], uk.v[2], uk.v[1], uk.v[0]);
+    aesni1xm128iexpand(uk128, ret.k);
+    return ret;
+}
+
+/** @ingroup AESNI */
+/** The aesni4x32_R function provides a C API to the @ref AESNI "AESNI" CBRNG, allowing the number of rounds to be specified explicitly **/
+R123_STATIC_INLINE aesni4x32_ctr_t aesni4x32_R(unsigned int Nrounds, aesni4x32_ctr_t c, aesni4x32_key_t k){
+    aesni1xm128i_ctr_t c128;
+    c128.v[0].m = _mm_set_epi32(c.v[3], c.v[2], c.v[1], c.v[0]);
+    c128 = aesni1xm128i_R(Nrounds, c128, k);
+    _mm_storeu_si128((__m128i*)&c.v[0], c128.v[0].m);
+    return c;
+}
+
+#define aesni4x32_rounds aesni1xm128i_rounds
+
+/** The aesni4x32 macro provides a C API to the @ref AESNI "AESNI" CBRNG, uses the default number of rounds i.e. \c aesni4x32_rounds **/
+/** @ingroup AESNI */
+#define aesni4x32(c,k) aesni4x32_R(aesni4x32_rounds, c, k)
+
+#ifdef __cplusplus
+namespace r123{
+/** 
+ at defgroup AESNI ARS and AESNI Classes and Typedefs
+
+The ARS4x32, ARS1xm128i, AESNI4x32 and AESNI1xm128i classes export the member functions, typedefs and
+operator overloads required by a @ref CBRNG "CBRNG" class.
+
+ARS1xm128i and AESNI1xm128i are based on the AES block cipher and rely on the AES-NI hardware instructions
+available on some some new (2011) CPUs.
+
+The ARS1xm128i CBRNG and the use of AES for random number generation are described in 
+<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers:  As Easy as 1, 2, 3</i> </a>.
+Although it uses some cryptographic primitives, ARS1xm128i uses a cryptographically weak key schedule and is \b not suitable for cryptographic use.
+
+ at class AESNI1xm128i
+ at ingroup AESNI
+AESNI exports the member functions, typedefs and operator overloads required by a @ref CBRNG class.
+
+AESNI1xm128i uses the crypotgraphic AES round function, including the cryptographic key schedule.
+
+In contrast to the other CBRNGs in the Random123 library, the AESNI1xm128i_R::key_type is opaque
+and is \b not identical to the AESNI1xm128i_R::ukey_type.  Creating a key_type, using either the constructor
+or assignment operator, is significantly more time-consuming than running the bijection (hundreds
+of clock cycles vs. tens of clock cycles).
+
+AESNI1xm128i is only available when the feature-test macro R123_USE_AES_NI is true, which
+should occur only when the compiler is configured to generate AES-NI instructions (or
+when defaults are overridden by compile-time, compiler-command-line options).
+
+As of September 2011, the authors know of no statistical flaws with AESNI1xm128i.  It
+would be an event of major cryptographic note if any such flaws were ever found.
+*/
+struct AESNI1xm128i{
+    typedef aesni1xm128i_ctr_t ctr_type;
+    typedef aesni1xm128i_ukey_t ukey_type;
+    typedef aesni1xm128i_key_t key_type;
+    static const unsigned int rounds=10;
+    ctr_type operator()(ctr_type ctr, key_type key) const{
+        return aesni1xm128i(ctr, key);
+    }
+};
+
+/* @class AESNI4x32 */
+struct AESNI4x32{
+    typedef aesni4x32_ctr_t ctr_type;
+    typedef aesni4x32_ukey_t ukey_type;
+    typedef aesni4x32_key_t key_type;
+    static const unsigned int rounds=10;
+    ctr_type operator()(ctr_type ctr, key_type key) const{
+        return aesni4x32(ctr, key);
+    }
+};
+
+/** @ingroup AESNI
+    @class AESNI1xm128i_R
+
+AESNI1xm128i_R is provided for completeness, but is only instantiable with ROUNDS=10, in
+which case it is identical to AESNI1xm128i */
+template <unsigned ROUNDS=10> 
+struct AESNI1xm128i_R : public AESNI1xm128i{
+    R123_STATIC_ASSERT(ROUNDS==10, "AESNI1xm128i_R<R> is only valid with R=10");
+};
+
+/** @class AESNI4x32_R **/
+template <unsigned ROUNDS=10> 
+struct AESNI4x32_R : public AESNI4x32{
+    R123_STATIC_ASSERT(ROUNDS==10, "AESNI4x32_R<R> is only valid with R=10");
+};
+} // namespace r123
+#endif /* __cplusplus */
+
+#endif /* R123_USE_AES_NI */
+
+#if R123_USE_AES_OPENSSL
+#include <openssl/aes.h>
+typedef struct r123array16x8 aesopenssl16x8_ctr_t;
+typedef struct r123array16x8 aesopenssl16x8_ukey_t;
+#ifdef __cplusplus
+struct aesopenssl16x8_key_t{
+    AES_KEY k;
+    aesopenssl16x8_key_t(){
+        aesopenssl16x8_ukey_t ukey={{}};
+        AES_set_encrypt_key((const unsigned char *)&ukey.v[0], 128, &k);
+    }
+    aesopenssl16x8_key_t(const aesopenssl16x8_ukey_t& ukey){
+        AES_set_encrypt_key((const unsigned char *)&ukey.v[0], 128, &k);
+    }
+    aesopenssl16x8_key_t& operator=(const aesopenssl16x8_ukey_t& ukey){
+        AES_set_encrypt_key((const unsigned char *)&ukey.v[0], 128, &k);
+        return *this;
+    }
+};
+#else
+typedef struct aesopenssl16x8_key_t{
+    AES_KEY k;
+}aesopenssl16x8_key_t;
+R123_STATIC_INLINE struct aesopenssl16x8_key_t aesopenssl16x8keyinit(aesopenssl16x8_ukey_t uk){
+    aesopenssl16x8_key_t ret;
+    AES_set_encrypt_key((const unsigned char *)&uk.v[0], 128, &ret.k);
+    return ret;
+}
+#endif
+
+R123_STATIC_INLINE R123_FORCE_INLINE(aesopenssl16x8_ctr_t aesopenssl16x8_R(aesopenssl16x8_ctr_t ctr, aesopenssl16x8_key_t key));
+R123_STATIC_INLINE
+aesopenssl16x8_ctr_t aesopenssl16x8_R(aesopenssl16x8_ctr_t ctr, aesopenssl16x8_key_t key){
+    aesopenssl16x8_ctr_t ret;
+    AES_encrypt((const unsigned char*)&ctr.v[0], (unsigned char *)&ret.v[0], &key.k);
+    return ret;
+}
+
+#define aesopenssl16x8_rounds aesni4x32_rounds
+#define aesopenssl16x8(c,k) aesopenssl16x8_R(aesopenssl16x8_rounds)
+
+#ifdef __cplusplus
+namespace r123{
+struct AESOpenSSL16x8{
+    typedef aesopenssl16x8_ctr_t ctr_type;
+    typedef aesopenssl16x8_key_t key_type;
+    typedef aesopenssl16x8_ukey_t ukey_type;
+    static const unsigned int rounds=10;
+    ctr_type operator()(const ctr_type& in, const key_type& k){
+        ctr_type out;
+        AES_encrypt((const unsigned char *)&in[0], (unsigned char *)&out[0], &k.k);
+        return out;
+    }
+};
+} // namespace r123
+#endif /* __cplusplus */
+#endif /* R123_USE_AES_OPENSSL */
+
+#endif
diff --git a/lib/Random123-1.08/include/Random123/array.h b/lib/Random123-1.08/include/Random123/array.h
new file mode 100644
index 0000000..ab85392
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/array.h
@@ -0,0 +1,326 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef _r123array_dot_h__
+#define _r123array_dot_h__
+#include "features/compilerfeatures.h"
+#include "features/sse.h"
+
+#ifndef __cplusplus
+#define CXXMETHODS(_N, W, T)
+#define CXXOVERLOADS(_N, W, T)
+#else
+
+#include <stddef.h>
+#include <algorithm>
+#include <stdexcept>
+#include <iterator>
+#include <limits>
+#include <iostream>
+
+/** @defgroup arrayNxW The r123arrayNxW classes 
+
+    Each of the r123arrayNxW is a fixed size array of N W-bit unsigned integers.
+    It is functionally equivalent to the C++0x std::array<N, uintW_t>,
+    but does not require C++0x features or libraries.
+
+    In addition to meeting most of the requirements of a Container,
+    it also has a member function, incr(), which increments the zero-th
+    element and carrys overflows into higher indexed elements.  Thus,
+    by using incr(), sequences of up to 2^(N*W) distinct values
+    can be produced. 
+
+    If SSE is supported by the compiler, then the class
+    r123array1xm128i is also defined, in which the data member is an
+    array of one r123128i object.
+
+    @cond HIDDEN_FROM_DOXYGEN
+*/
+
+template <typename value_type>
+inline R123_CUDA_DEVICE value_type assemble_from_u32(uint32_t *p32){
+    value_type v=0;
+    for(size_t i=0; i<(3+sizeof(value_type))/4; ++i)
+        v |= ((value_type)(*p32++)) << (32*i);
+    return v;
+}
+
+// Work-alike methods and typedefs modeled on std::array:
+#define CXXMETHODS(_N, W, T)                                            \
+    typedef T value_type;                                               \
+    typedef T* iterator;                                                \
+    typedef const T* const_iterator;                                    \
+    typedef value_type& reference;                                      \
+    typedef const value_type& const_reference;                          \
+    typedef size_t size_type;                                           \
+    typedef ptrdiff_t difference_type;                                  \
+    typedef T* pointer;                                                 \
+    typedef const T* const_pointer;                                     \
+    typedef std::reverse_iterator<iterator> reverse_iterator;           \
+    typedef std::reverse_iterator<const_iterator> const_reverse_iterator; \
+    /* Boost.array has static_size.  C++11 specializes tuple_size */    \
+    enum {static_size = _N};                                            \
+    R123_CUDA_DEVICE reference operator[](size_type i){return v[i];}                     \
+    R123_CUDA_DEVICE const_reference operator[](size_type i) const {return v[i];}        \
+    R123_CUDA_DEVICE reference at(size_type i){ if(i >=  _N) R123_THROW(std::out_of_range("array index out of range")); return (*this)[i]; } \
+    R123_CUDA_DEVICE const_reference at(size_type i) const { if(i >=  _N) R123_THROW(std::out_of_range("array index out of range")); return (*this)[i]; } \
+    R123_CUDA_DEVICE size_type size() const { return  _N; }                              \
+    R123_CUDA_DEVICE size_type max_size() const { return _N; }                           \
+    R123_CUDA_DEVICE bool empty() const { return _N==0; };                               \
+    R123_CUDA_DEVICE iterator begin() { return &v[0]; }                                  \
+    R123_CUDA_DEVICE iterator end() { return &v[_N]; }                                   \
+    R123_CUDA_DEVICE const_iterator begin() const { return &v[0]; }                      \
+    R123_CUDA_DEVICE const_iterator end() const { return &v[_N]; }                       \
+    R123_CUDA_DEVICE const_iterator cbegin() const { return &v[0]; }                     \
+    R123_CUDA_DEVICE const_iterator cend() const { return &v[_N]; }                      \
+    R123_CUDA_DEVICE reverse_iterator rbegin(){ return reverse_iterator(end()); }        \
+    R123_CUDA_DEVICE const_reverse_iterator rbegin() const{ return const_reverse_iterator(end()); } \
+    R123_CUDA_DEVICE reverse_iterator rend(){ return reverse_iterator(begin()); }        \
+    R123_CUDA_DEVICE const_reverse_iterator rend() const{ return const_reverse_iterator(begin()); } \
+    R123_CUDA_DEVICE const_reverse_iterator crbegin() const{ return const_reverse_iterator(cend()); } \
+    R123_CUDA_DEVICE const_reverse_iterator crend() const{ return const_reverse_iterator(cbegin()); } \
+    R123_CUDA_DEVICE pointer data(){ return &v[0]; }                                     \
+    R123_CUDA_DEVICE const_pointer data() const{ return &v[0]; }                         \
+    R123_CUDA_DEVICE reference front(){ return v[0]; }                                   \
+    R123_CUDA_DEVICE const_reference front() const{ return v[0]; }                       \
+    R123_CUDA_DEVICE reference back(){ return v[_N-1]; }                                 \
+    R123_CUDA_DEVICE const_reference back() const{ return v[_N-1]; }                     \
+    R123_CUDA_DEVICE bool operator==(const r123array##_N##x##W& rhs) const{ \
+	/* CUDA3 does not have std::equal */ \
+	for (size_t i = 0; i < _N; ++i) \
+	    if (v[i] != rhs.v[i]) return false; \
+	return true; \
+    } \
+    R123_CUDA_DEVICE bool operator!=(const r123array##_N##x##W& rhs) const{ return !(*this == rhs); } \
+    /* CUDA3 does not have std::fill_n */ \
+    R123_CUDA_DEVICE void fill(const value_type& val){ for (size_t i = 0; i < _N; ++i) v[i] = val; } \
+    R123_CUDA_DEVICE void swap(r123array##_N##x##W& rhs){ \
+	/* CUDA3 does not have std::swap_ranges */ \
+	for (size_t i = 0; i < _N; ++i) { \
+	    T tmp = v[i]; \
+	    v[i] = rhs.v[i]; \
+	    rhs.v[i] = tmp; \
+	} \
+    } \
+    R123_CUDA_DEVICE r123array##_N##x##W& incr(R123_ULONG_LONG n=1){                         \
+        /* This test is tricky because we're trying to avoid spurious   \
+           complaints about illegal shifts, yet still be compile-time   \
+           evaulated. */                                                \
+        if(sizeof(T)<sizeof(n) && n>>((sizeof(T)<sizeof(n))?8*sizeof(T):0) ) \
+            return incr_carefully(n);                                   \
+        if(n==1){                                                       \
+            ++v[0];                                                     \
+            if(_N==1 || R123_BUILTIN_EXPECT(!!v[0], 1)) return *this;   \
+        }else{                                                          \
+            v[0] += n;                                                  \
+            if(_N==1 || R123_BUILTIN_EXPECT(n<=v[0], 1)) return *this;  \
+        }                                                               \
+        /* We expect that the N==?? tests will be                       \
+           constant-folded/optimized away by the compiler, so only the  \
+           overflow tests (!!v[i]) remain to be done at runtime.  For  \
+           small values of N, it would be better to do this as an       \
+           uncondtional sequence of adc.  An experiment/optimization    \
+           for another day...                                           \
+           N.B.  The weird subscripting: v[_N>3?3:0] is to silence      \
+           a spurious error from icpc                                   \
+           */                                                           \
+        ++v[_N>1?1:0];                                                  \
+        if(_N==2 || R123_BUILTIN_EXPECT(!!v[_N>1?1:0], 1)) return *this; \
+        ++v[_N>2?2:0];                                                  \
+        if(_N==3 || R123_BUILTIN_EXPECT(!!v[_N>2?2:0], 1)) return *this;  \
+        ++v[_N>3?3:0];                                                  \
+        for(size_t i=4; i<_N; ++i){                                     \
+            if( R123_BUILTIN_EXPECT(!!v[i-1], 1) ) return *this;        \
+            ++v[i];                                                     \
+        }                                                               \
+        return *this;                                                   \
+    }                                                                   \
+    /* seed(SeedSeq) would be a constructor if having a constructor */  \
+    /* didn't cause headaches with defaults */                          \
+    template <typename SeedSeq>                                         \
+    R123_CUDA_DEVICE static r123array##_N##x##W seed(SeedSeq &ss){      \
+        r123array##_N##x##W ret;                                        \
+        const size_t Ngen = _N*((3+sizeof(value_type))/4);              \
+        uint32_t u32[Ngen];                                             \
+        uint32_t *p32 = &u32[0];                                        \
+        ss.generate(&u32[0], &u32[Ngen]);                               \
+        for(size_t i=0; i<_N; ++i){                                     \
+            ret.v[i] = assemble_from_u32<value_type>(p32);              \
+            p32 += (3+sizeof(value_type))/4;                            \
+        }                                                               \
+        return ret;                                                     \
+    }                                                                   \
+protected:                                                              \
+    R123_CUDA_DEVICE r123array##_N##x##W& incr_carefully(R123_ULONG_LONG n){ \
+        /* n may be greater than the maximum value of a single value_type */ \
+        value_type vtn;                                                 \
+        vtn = n;                                                        \
+        v[0] += n;                                                      \
+        const unsigned rshift = 8* ((sizeof(n)>sizeof(value_type))? sizeof(value_type) : 0); \
+        for(size_t i=1; i<_N; ++i){                                     \
+            if(rshift){                                                 \
+                n >>= rshift;                                           \
+            }else{                                                      \
+                n=0;                                                    \
+            }                                                           \
+            if( v[i-1] < vtn )                                          \
+                ++n;                                                    \
+            if( n==0 ) break;                                           \
+            vtn = n;                                                    \
+            v[i] += n;                                                  \
+        }                                                               \
+        return *this;                                                   \
+    }                                                                   \
+    
+                                                                        
+// There are several tricky considerations for the insertion and extraction
+// operators:
+// - we would like to be able to print r123array16x8 as a sequence of 16 integers,
+//   not as 16 bytes.
+// - we would like to be able to print r123array1xm128i.
+// - we do not want an int conversion operator in r123m128i because it causes
+//   lots of ambiguity problems with automatic promotions.
+// Solution: r123arrayinsertable and r123arrayextractable
+
+template<typename T>
+struct r123arrayinsertable{
+    const T& v;
+    r123arrayinsertable(const T& t_) : v(t_) {} 
+    friend std::ostream& operator<<(std::ostream& os, const r123arrayinsertable<T>& t){
+        return os << t.v;
+    }
+};
+
+template<>
+struct r123arrayinsertable<uint8_t>{
+    const uint8_t& v;
+    r123arrayinsertable(const uint8_t& t_) : v(t_) {} 
+    friend std::ostream& operator<<(std::ostream& os, const r123arrayinsertable<uint8_t>& t){
+        return os << (int)t.v;
+    }
+};
+
+template<typename T>
+struct r123arrayextractable{
+    T& v;
+    r123arrayextractable(T& t_) : v(t_) {}
+    friend std::istream& operator>>(std::istream& is, r123arrayextractable<T>& t){
+        return is >> t.v;
+    }
+};
+
+template<>
+struct r123arrayextractable<uint8_t>{
+    uint8_t& v;
+    r123arrayextractable(uint8_t& t_) : v(t_) {} 
+    friend std::istream& operator>>(std::istream& is, r123arrayextractable<uint8_t>& t){
+        int i;
+        is >>  i;
+        t.v = i;
+        return is;
+    }
+};
+
+#define CXXOVERLOADS(_N, W, T)                                          \
+                                                                        \
+inline std::ostream& operator<<(std::ostream& os, const r123array##_N##x##W& a){   \
+    os << r123arrayinsertable<T>(a.v[0]);                                  \
+    for(size_t i=1; i<_N; ++i)                                          \
+        os << " " << r123arrayinsertable<T>(a.v[i]);                       \
+    return os;                                                          \
+}                                                                       \
+                                                                        \
+inline std::istream& operator>>(std::istream& is, r123array##_N##x##W& a){         \
+    for(size_t i=0; i<_N; ++i){                                         \
+        r123arrayextractable<T> x(a.v[i]);                                 \
+        is >> x;                                                        \
+    }                                                                   \
+    return is;                                                          \
+}                                                                       \
+                                                                        \
+namespace r123{                                                        \
+ typedef r123array##_N##x##W Array##_N##x##W;                          \
+}
+                                                                        
+#endif /* __cplusplus */
+
+/* _r123array_tpl expands to a declaration of struct r123arrayNxW.  
+
+   In C, it's nothing more than a struct containing an array of N
+   objects of type T.
+
+   In C++ it's the same, but endowed with an assortment of member
+   functions, typedefs and friends.  In C++, r123arrayNxW looks a lot
+   like std::array<T,N>, has most of the capabilities of a container,
+   and satisfies the requirements outlined in compat/Engine.hpp for
+   counter and key types.  ArrayNxW, in the r123 namespace is
+   a typedef equivalent to r123arrayNxW.
+*/
+
+#define _r123array_tpl(_N, W, T)                   \
+    /** @ingroup arrayNxW */                        \
+    /** @see arrayNxW */                            \
+struct r123array##_N##x##W{                         \
+ T v[_N];                                       \
+ CXXMETHODS(_N, W, T)                           \
+};                                              \
+                                                \
+CXXOVERLOADS(_N, W, T)
+
+/** @endcond */
+
+_r123array_tpl(1, 32, uint32_t)  /* r123array1x32 */
+_r123array_tpl(2, 32, uint32_t)  /* r123array2x32 */
+_r123array_tpl(4, 32, uint32_t)  /* r123array4x32 */
+_r123array_tpl(8, 32, uint32_t)  /* r123array8x32 */
+
+_r123array_tpl(1, 64, uint64_t)  /* r123array1x64 */
+_r123array_tpl(2, 64, uint64_t)  /* r123array2x64 */
+_r123array_tpl(4, 64, uint64_t)  /* r123array4x64 */
+
+_r123array_tpl(16, 8, uint8_t)  /* r123array16x8 for ARSsw, AESsw */
+
+#if R123_USE_SSE
+_r123array_tpl(1, m128i, r123m128i) /* r123array1x128i for ARSni, AESni */
+#endif
+
+/* In C++, it's natural to use sizeof(a::value_type), but in C it's
+   pretty convoluted to figure out the width of the value_type of an
+   r123arrayNxW:
+*/
+#define R123_W(a)   (8*sizeof(((a *)0)->v[0]))
+
+/** @namespace r123
+  Most of the Random123 C++ API is contained in the r123 namespace. 
+*/
+
+#endif
+
diff --git a/lib/Random123-1.08/include/Random123/ars.h b/lib/Random123-1.08/include/Random123/ars.h
new file mode 100644
index 0000000..a027b6f
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/ars.h
@@ -0,0 +1,204 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __Random123_ars_dot_hpp__
+#define __Random123_ars_dot_hpp__
+
+#include "features/compilerfeatures.h"
+#include "array.h"
+
+#if R123_USE_AES_NI
+
+#ifndef ARS1xm128i_DEFAULT_ROUNDS
+#define ARS1xm128i_DEFAULT_ROUNDS 7
+#endif
+
+/** @ingroup AESNI */
+enum r123_enum_ars1xm128i {ars1xm128i_rounds = ARS1xm128i_DEFAULT_ROUNDS};
+
+/* ARS1xm128i with Weyl keys.  Fast, and Crush-resistant, but NOT CRYPTO. */
+/** @ingroup AESNI */
+typedef struct r123array1xm128i ars1xm128i_ctr_t;
+/** @ingroup AESNI */
+typedef struct r123array1xm128i ars1xm128i_key_t;
+/** @ingroup AESNI */
+typedef struct r123array1xm128i ars1xm128i_ukey_t;
+/** @ingroup AESNI */
+R123_STATIC_INLINE ars1xm128i_key_t ars1xm128ikeyinit(ars1xm128i_ukey_t uk) { return uk; }
+/** @ingroup AESNI */
+R123_STATIC_INLINE ars1xm128i_ctr_t ars1xm128i_R(unsigned int Nrounds, ars1xm128i_ctr_t in, ars1xm128i_key_t k){
+    __m128i kweyl = _mm_set_epi64x(R123_64BIT(0xBB67AE8584CAA73B), /* sqrt(3) - 1.0 */
+                                   R123_64BIT(0x9E3779B97F4A7C15)); /* golden ratio */
+    /* N.B.  the aesenc instructions do the xor *after*
+    // so if we want to follow the AES pattern, we
+    // have to do the initial xor explicitly */
+    __m128i kk = k.v[0].m;
+    __m128i v = _mm_xor_si128(in.v[0].m, kk);
+    ars1xm128i_ctr_t ret;
+    R123_ASSERT(Nrounds<=10);
+    if( Nrounds>1 ){
+        kk = _mm_add_epi64(kk, kweyl);
+        v = _mm_aesenc_si128(v, kk);
+    }
+    if( Nrounds>2 ){
+        kk = _mm_add_epi64(kk, kweyl);
+        v = _mm_aesenc_si128(v, kk);
+    }
+    if( Nrounds>3 ){
+        kk = _mm_add_epi64(kk, kweyl);
+        v = _mm_aesenc_si128(v, kk);
+    }
+    if( Nrounds>4 ){
+        kk = _mm_add_epi64(kk, kweyl);
+        v = _mm_aesenc_si128(v, kk);
+    }
+    if( Nrounds>5 ){
+        kk = _mm_add_epi64(kk, kweyl);
+        v = _mm_aesenc_si128(v, kk);
+    }
+    if( Nrounds>6 ){
+        kk = _mm_add_epi64(kk, kweyl);
+        v = _mm_aesenc_si128(v, kk);
+    }
+    if( Nrounds>7 ){
+        kk = _mm_add_epi64(kk, kweyl);
+        v = _mm_aesenc_si128(v, kk);
+    }
+    if( Nrounds>8 ){
+        kk = _mm_add_epi64(kk, kweyl);
+        v = _mm_aesenc_si128(v, kk);
+    }
+    if( Nrounds>9 ){
+        kk = _mm_add_epi64(kk, kweyl);
+        v = _mm_aesenc_si128(v, kk);
+    }
+    kk = _mm_add_epi64(kk, kweyl);
+    v = _mm_aesenclast_si128(v, kk);
+    ret.v[0].m = v;
+    return ret;
+}
+
+/** @def ars1xm128i
+ at ingroup AESNI
+The ars1mx128i macro provides a C API interface to the @ref AESNI "ARS" CBRNG with the default number of rounds i.e. \c ars1xm128i_rounds **/
+#define ars1xm128i(c,k) ars1xm128i_R(ars1xm128i_rounds, c, k)
+
+/** @ingroup AESNI */
+typedef struct r123array4x32 ars4x32_ctr_t;
+/** @ingroup AESNI */
+typedef struct r123array4x32 ars4x32_key_t;
+/** @ingroup AESNI */
+typedef struct r123array4x32 ars4x32_ukey_t;
+/** @ingroup AESNI */
+enum r123_enum_ars4x32 {ars4x32_rounds = ARS1xm128i_DEFAULT_ROUNDS};
+/** @ingroup AESNI */
+R123_STATIC_INLINE ars4x32_key_t ars4x32keyinit(ars4x32_ukey_t uk) { return uk; }
+/** @ingroup AESNI */
+R123_STATIC_INLINE ars4x32_ctr_t ars4x32_R(unsigned int Nrounds, ars4x32_ctr_t c, ars4x32_key_t k){
+    ars1xm128i_ctr_t c128;
+    ars1xm128i_key_t k128;
+    c128.v[0].m = _mm_set_epi32(c.v[3], c.v[2], c.v[1], c.v[0]);
+    k128.v[0].m = _mm_set_epi32(k.v[3], k.v[2], k.v[1], k.v[0]);
+    c128 = ars1xm128i_R(Nrounds, c128, k128);
+    _mm_storeu_si128((__m128i*)&c.v[0], c128.v[0].m);
+    return c;
+}
+
+/** @def ars4x32
+ at ingroup AESNI
+The ars4x32 macro provides a C API interface to the @ref AESNI "ARS" CBRNG with the default number of rounds i.e. \c ars4x32_rounds **/
+#define ars4x32(c,k) ars4x32_R(ars4x32_rounds, c, k)
+
+#ifdef __cplusplus
+namespace r123{
+/** 
+ at ingroup AESNI
+
+ARS1xm128i_R exports the member functions, typedefs and operator overloads required by a @ref CBRNG class.
+
+ARS1xm128i uses the crypotgraphic AES round function, but a @b non-cryptographc key schedule
+to save time and space.
+
+ARS1xm128i is only available when the feature-test macro R123_USE_AES_NI is true, which
+should occur only when the compiler is configured to generate AES-NI instructions (or
+when defaults are overridden by compile-time, compiler-command-line options).
+
+The template argument, ROUNDS, is the number of times the ARS round
+functions will be applied.
+
+As of September 2011, the authors know of no statistical flaws with
+ROUNDS=5 or more.
+
+ at class ARS1xm128i_R
+
+*/
+template<unsigned int ROUNDS>
+struct ARS1xm128i_R{
+    typedef ars1xm128i_ctr_t ctr_type;
+    typedef ars1xm128i_key_t key_type;
+    typedef ars1xm128i_key_t ukey_type;
+    static const unsigned int rounds=ROUNDS;
+    R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key) const){
+        return ars1xm128i_R(ROUNDS, ctr, key);
+    }
+};
+
+/** @class ARS4x32_R
+    @ingroup AESNI
+*/
+
+template<unsigned int ROUNDS>
+struct ARS4x32_R{
+    typedef ars4x32_ctr_t ctr_type;
+    typedef ars4x32_key_t key_type;
+    typedef ars4x32_key_t ukey_type;
+    static const unsigned int rounds=ROUNDS;
+    R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key) const){
+        return ars4x32_R(ROUNDS, ctr, key);
+    }
+};
+/**
+ at ingroup AESNI
+
+ at class ARS1xm128i_R
+  ARS1xm128i is equivalent to ARS1xm128i_R<7>.    With 7 rounds,
+  the ARS1xm128i CBRNG  has a considerable safety margin over the minimum number
+  of rounds with no known statistical flaws, but still has excellent
+  performance. */
+typedef ARS1xm128i_R<ars1xm128i_rounds> ARS1xm128i;
+typedef ARS4x32_R<ars4x32_rounds> ARS4x32;
+} // namespace r123
+
+#endif /* __cplusplus */
+
+#endif /* R123_USE_AES_NI */
+
+#endif
diff --git a/lib/Random123-1.08/include/Random123/conventional/Engine.hpp b/lib/Random123-1.08/include/Random123/conventional/Engine.hpp
new file mode 100644
index 0000000..2b8ee7a
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/conventional/Engine.hpp
@@ -0,0 +1,250 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __Engine_dot_hpp_
+#define __Engine_dot_hpp_
+
+#include "../features/compilerfeatures.h"
+#include "../array.h"
+#include <limits>
+#include <stdexcept>
+#include <sstream>
+#include <algorithm>
+#include <vector>
+#if R123_USE_CXX11_TYPE_TRAITS
+#include <type_traits>
+#endif
+
+namespace r123{
+/**
+  If G satisfies the requirements of a CBRNG, and has a ctr_type whose
+  value_type is an unsigned integral type, then Engine<G> satisfies
+  the requirements of a C++0x "Uniform Random Number Engine" and can
+  be used in any context where such an object is expected.
+
+  Note that wrapping a counter based RNG with a traditional API in
+  this way obscures much of the power of counter based PRNGs.
+  Nevertheless, it may be of value in applications that are already
+  coded to work with the C++0x random number engines.
+
+  The MicroURNG template in MicroURNG.hpp
+  provides the more limited functionality of a C++0x "Uniform
+  Random Number Generator", but leaves the application in control
+  of counters and keys and hence may be preferable to the Engine template.
+  For example, a MicroURNG allows one to use C++0x "Random Number
+  Distributions"  without giving up control over the counters
+  and keys.
+*/ 
+
+template<typename CBRNG>
+struct Engine {
+    typedef CBRNG cbrng_type;
+    typedef typename CBRNG::ctr_type ctr_type;
+    typedef typename CBRNG::key_type key_type;
+    typedef typename CBRNG::ukey_type ukey_type;
+    typedef typename ctr_type::value_type result_type;
+    typedef size_t elem_type;
+
+protected:
+    cbrng_type b;
+    key_type key;
+    ukey_type ukey;
+    ctr_type c;
+    elem_type elem;
+    ctr_type v;
+
+    void fix_invariant(){
+        if( elem != 0 ) {
+            v = b(c, key);
+	}
+    }        
+public:
+    explicit Engine() : b(), c(), elem() {
+	ukey_type x = {{}};
+	ukey = x;
+        key = ukey;
+    }
+    explicit Engine(result_type r) : b(), c(), elem() {
+        ukey_type x = {{typename ukey_type::value_type(r)}};
+        ukey = x;
+        key = ukey;
+    }
+    // 26.5.3 says that the SeedSeq templates shouldn't particpate in
+    // overload resolution unless the type qualifies as a SeedSeq.
+    // How that is determined is unspecified, except that "as a
+    // minimum a type shall not qualify as a SeedSeq if it is
+    // implicitly convertible to a result_type."  
+    //
+    // First, we make sure that even the non-const copy constructor
+    // works as expected.  In addition, if we've got C++0x
+    // type_traits, we use enable_if and is_convertible to implement
+    // the convertible-to-result_type restriction.  Otherwise, the
+    // template is unconditional and will match in some surpirsing
+    // and undesirable situations.
+    Engine(Engine& e) : b(e.b), ukey(e.ukey), c(e.c), elem(e.elem){
+        key = ukey;
+        fix_invariant();
+    }
+    Engine(const Engine& e) : b(e.b), ukey(e.ukey), c(e.c), elem(e.elem){
+        key = ukey;
+        fix_invariant();
+    }
+
+    template <typename SeedSeq>
+    explicit Engine(SeedSeq &s
+#if R123_USE_CXX11_TYPE_TRAITS
+                    , typename std::enable_if<!std::is_convertible<SeedSeq, result_type>::value>::type* =0
+#endif
+                    )
+        : b(), c(), elem() {
+        ukey = ukey_type::seed(s);
+        key = ukey;
+    }
+    void seed(result_type r){
+        *this = Engine(r);
+    }
+    template <typename SeedSeq>
+    void seed(SeedSeq &s
+#if R123_USE_CXX11_TYPE_TRAITS
+                    , typename std::enable_if<!std::is_convertible<SeedSeq, result_type>::value>::type* =0
+#endif
+              ){ 
+        *this = Engine(s);
+    }
+    void seed(){
+        *this = Engine();
+    }
+    friend bool operator==(const Engine& lhs, const Engine& rhs){
+        return lhs.c==rhs.c && lhs.elem == rhs.elem && lhs.ukey == rhs.ukey;
+    }
+    friend bool operator!=(const Engine& lhs, const Engine& rhs){
+        return lhs.c!=rhs.c || lhs.elem != rhs.elem || lhs.ukey!=rhs.ukey;
+    }
+
+    friend std::ostream& operator<<(std::ostream& os, const Engine& be){
+        return os << be.c << " " << be.ukey << " " << be.elem;
+    }
+
+    friend std::istream& operator>>(std::istream& is, Engine& be){
+        is >> be.c >> be.ukey >> be.elem;
+        be.key = be.ukey;
+        be.fix_invariant();
+        return is;
+    }
+
+    // The <random> shipped with MacOS Xcode 4.5.2 imposes a
+    // non-standard requirement that URNGs also have static data
+    // members: _Min and _Max.  Later versions of libc++ impose the
+    // requirement only when constexpr isn't supported.  Although the
+    // Xcode 4.5.2 requirement is clearly non-standard, it is unlikely
+    // to be fixed and it is very easy work around.  We certainly
+    // don't want to go to great lengths to accommodate every buggy
+    // library we come across, but in this particular case, the effort
+    // is low and the benefit is high, so it's worth doing.  Thanks to
+    // Yan Zhou for pointing this out to us.  See similar code in
+    // ../MicroURNG.hpp
+    const static result_type _Min = 0;
+    const static result_type _Max = ~((result_type)0);
+
+    static R123_CONSTEXPR result_type min R123_NO_MACRO_SUBST () { return _Min; }
+    static R123_CONSTEXPR result_type max R123_NO_MACRO_SUBST () { return _Max; }
+
+    result_type operator()(){
+        if( c.size() == 1 )     // short-circuit the scalar case.  Compilers aren't mind-readers.
+            return b(c.incr(), key)[0];
+        if( elem == 0 ){
+            v = b(c.incr(), key);
+            elem = c.size();
+        }
+        return v[--elem];
+    }
+
+    void discard(R123_ULONG_LONG skip){
+        // don't forget:  elem counts down
+        size_t nelem = c.size();
+	size_t sub = skip % nelem;
+        skip /= nelem;
+	if (elem < sub) {
+	    elem += nelem;
+	    skip++;
+	}
+	elem -= sub;
+        c.incr(skip);
+        fix_invariant();
+    }
+         
+    //--------------------------
+    // Some bonus methods, not required for a Random Number
+    // Engine
+
+    // Constructors and seed() method for ukey_type seem useful
+    // We need const and non-const to supersede the SeedSeq template.
+    explicit Engine(const ukey_type &uk) : key(uk), ukey(uk), c(), elem(){}
+    explicit Engine(ukey_type &uk) : key(uk), ukey(uk), c(), elem(){}
+    void seed(const ukey_type& uk){
+        *this = Engine(uk);
+    }        
+    void seed(ukey_type& uk){
+        *this = Engine(uk);
+    }        
+
+    // Forward the e(counter) to the CBRNG we are templated
+    // on, using the current value of the key.
+    ctr_type operator()(const ctr_type& c) const{
+        return b(c, key);
+    }
+
+    // Since you can seed *this with a ukey_type, it seems reasonable
+    // to allow the caller to know what seed/ukey *this is using.
+    ukey_type getseed() const{
+        return ukey;
+    }
+
+    // Maybe the caller want's to know the details of
+    // the internal state, e.g., so it can call a different
+    // bijection with the same counter.
+    std::pair<ctr_type, elem_type> getcounter() const {
+        return make_pair(c,  elem);
+    }
+
+    // And the inverse.
+    void setcounter(const ctr_type& _c, elem_type _elem){
+        static const size_t nelem = c.size();
+        if( elem > nelem )
+            throw std::range_error("Engine::setcounter called  with elem out of range");
+        c = _c;
+        elem = _elem;
+        fix_invariant();
+    }
+};
+} // namespace r123
+
+#endif
diff --git a/lib/Random123-1.08/include/Random123/conventional/gsl_cbrng.h b/lib/Random123-1.08/include/Random123/conventional/gsl_cbrng.h
new file mode 100644
index 0000000..44457d0
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/conventional/gsl_cbrng.h
@@ -0,0 +1,128 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __r123_compat_gslrng_dot_h__
+#define __r123_compat_gslrng_dot_h__
+
+#include <gsl/gsl_rng.h>
+#include <string.h>
+
+/**
+   The macro:  GSL_CBRNG(NAME, CBRNGNAME)
+   declares the necessary structs and  constants that define a
+   gsl_rng_NAME type based on the counter-based RNG CBRNGNAME.  For example:
+
+   Usage:
+
+   @code
+   #include <Random123/threefry.h>
+   #include <Random123/conventional/gsl_cbrng.h>  // this file
+   GSL_CBRNG(cbrng, threefry4x32); // creates gsl_rng_cbrng
+
+   int main(int argc, char **argv){
+       gsl_rng *r = gsl_rng_alloc(gsl_rng_cbrng);
+       ... use r as you would use any other gsl_rng ...   
+    }
+    @endcode
+
+    It requires that NAME be the name of a CBRNG that follows the
+    naming and stylistic conventions of the Random123 library.
+
+    Note that wrapping a \ref CBRNG "counter-based PRNG" with a traditional API in
+    this way obscures much of the power of the CBRNG API.
+    Nevertheless, it may be of value to applications that are already
+    coded to work with GSL random number generators, and that wish
+    to use the RNGs in the Random123 library.
+
+ */ 
+
+#define GSL_CBRNG(NAME, CBRNGNAME)                                      \
+const gsl_rng_type *gsl_rng_##NAME;                                     \
+                                                                        \
+typedef struct{                                                         \
+    CBRNGNAME##_ctr_t ctr;                                                   \
+    CBRNGNAME##_ctr_t r;                                                     \
+    CBRNGNAME##_key_t key;                                                   \
+    int elem;                                                           \
+} NAME##_state;                                                         \
+                                                                        \
+static unsigned long int NAME##_get(void *vstate){                      \
+    NAME##_state *st = (NAME##_state *)vstate;                          \
+    const int N=sizeof(st->ctr.v)/sizeof(st->ctr.v[0]);                 \
+    if( st->elem == 0 ){                                                \
+        ++st->ctr.v[0];                                                 \
+        if( N>1 && st->ctr.v[0] == 0 ) ++st->ctr.v[1];                  \
+        if( N>2 && st->ctr.v[1] == 0 ) ++st->ctr.v[2];                  \
+        if( N>3 && st->ctr.v[2] == 0 ) ++st->ctr.v[3];                  \
+        st->r = CBRNGNAME(st->ctr, st->key);                                 \
+        st->elem = N;                                                   \
+    }                                                                   \
+    return 0xffffffffUL & st->r.v[--st->elem];                          \
+}                                                                       \
+                                                                        \
+static double                                                           \
+NAME##_get_double (void * vstate)                                       \
+{                                                                       \
+    return NAME##_get (vstate)/4294967296.0;                            \
+}                                                                       \
+                                                                        \
+static void NAME##_set(void *vstate, unsigned long int s){              \
+    NAME##_state *st = (NAME##_state *)vstate;                          \
+    st->elem = 0;                                                       \
+    /* Assume that key and ctr have an array member, v,                 \
+       as if they are r123arrayNxW.  If not, this will fail             \
+       to compile.  In particular, this macro fails to compile          \
+       when the underlying CBRNG requires use of keyinit */             \
+    memset(&st->ctr.v[0], 0, sizeof(st->ctr.v));                        \
+    memset(&st->key.v[0], 0, sizeof(st->key.v));                        \
+    /* GSL 1.15 documentation says this about gsl_rng_set:              \
+         Note that the most generators only accept 32-bit seeds, with higher \
+         values being reduced modulo 2^32.  For generators with smaller \
+         ranges the maximum seed value will typically be lower.         \
+     so we won't jump through any hoops here to deal with               \
+     high bits if sizeof(unsigned long) > sizeof(uint32_t). */          \
+    st->key.v[0] = s;                                                   \
+}                                                                       \
+                                                                        \
+static const gsl_rng_type NAME##_type = {                               \
+    #NAME,                                                              \
+    0xffffffffUL,                                                       \
+    0,                                                                  \
+    sizeof(NAME##_state),                                               \
+    &NAME##_set,                                                        \
+    &NAME##_get,                                                        \
+    &NAME##_get_double                                                  \
+};                                                                      \
+                                                                        \
+const gsl_rng_type *gsl_rng_##NAME = &NAME##_type
+
+#endif
+
diff --git a/lib/Random123-1.08/include/Random123/features/clangfeatures.h b/lib/Random123-1.08/include/Random123/features/clangfeatures.h
new file mode 100644
index 0000000..908aee8
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/features/clangfeatures.h
@@ -0,0 +1,76 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __clangfeatures_dot_hpp
+#define __clangfeatures_dot_hpp
+
+#ifndef R123_USE_X86INTRIN_H
+#define R123_USE_X86INTRIN_H ((defined(__x86_64__)||defined(__i386__)))
+#endif
+
+#ifndef R123_USE_CXX11_UNRESTRICTED_UNIONS
+#define R123_USE_CXX11_UNRESTRICTED_UNIONS __has_feature(cxx_unrestricted_unions)
+#endif
+
+#ifndef R123_USE_CXX11_STATIC_ASSERT
+#define R123_USE_CXX11_STATIC_ASSERT __has_feature(cxx_static_assert)
+#endif
+
+#ifndef R123_USE_CXX11_CONSTEXPR
+#define R123_USE_CXX11_CONSTEXPR __has_feature(cxx_constexpr)
+#endif
+
+#ifndef R123_USE_CXX11_EXPLICIT_CONVERSIONS
+#define R123_USE_CXX11_EXPLICIT_CONVERSIONS __has_feature(cxx_explicit_conversions)
+#endif
+
+// With clang-3.0, the apparently simpler:
+//  #define R123_USE_CXX11_RANDOM __has_include(<random>)
+// dumps core.
+#ifndef R123_USE_CXX11_RANDOM
+#if __cplusplus>=201103L && __has_include(<random>)
+#define R123_USE_CXX11_RANDOM 1
+#else
+#define R123_USE_CXX11_RANDOM 0
+#endif
+#endif
+
+#ifndef R123_USE_CXX11_TYPE_TRAITS
+#if __cplusplus>=201103L && __has_include(<type_traits>)
+#define R123_USE_CXX11_TYPE_TRAITS 1
+#else
+#define R123_USE_CXX11_TYPE_TRAITS 0
+#endif
+#endif
+
+#include "gccfeatures.h"
+
+#endif
diff --git a/lib/Random123-1.08/include/Random123/features/compilerfeatures.h b/lib/Random123-1.08/include/Random123/features/compilerfeatures.h
new file mode 100644
index 0000000..4039790
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/features/compilerfeatures.h
@@ -0,0 +1,320 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/**
+
+ at page porting Preprocessor symbols for porting Random123 to different platforms.
+
+The Random123 library is portable across C, C++, CUDA, OpenCL environments,
+and multiple operating systems (Linux, Windows 7, Mac OS X, FreeBSD, Solaris).
+This level of portability requires the abstraction of some features
+and idioms that are either not standardized (e.g., asm statments), or for which 
+different vendors have their own standards (e.g., SSE intrinsics) or for
+which vendors simply refuse to conform to well-established standards (e.g., <inttypes.h>).
+
+Random123/features/compilerfeatures.h
+conditionally includes a compiler-or-OS-specific Random123/featires/XXXfeatures.h file which
+defines appropriate values for the preprocessor symbols which can be used with
+a specific compiler or OS.  Those symbols will then
+be used by other header files and source files in the Random123
+library (and may be used by applications) to control what actually
+gets presented to the compiler.
+
+Most of the symbols are boolean valued.  In general, they will
+\b always be defined with value either 1 or 0, so do
+\b NOT use \#ifdef.  Use \#if R123_USE_SOMETHING instead.
+
+Library users can override any value by defining the pp-symbol with a compiler option,
+e.g.,
+
+    cc -DR123_USE_MULHILO64_C99 
+
+will use a strictly c99 version of the full-width 64x64->128-bit multiplication
+function, even if it would be disabled by default.
+
+All boolean-valued pre-processor symbols in Random123/features/compilerfeatures.h start with the prefix R123_USE_
+ at verbatim
+         AES_NI
+         AES_OPENSSL
+         SSE4_2
+         SSE4_1
+         SSE
+
+         STD_RANDOM
+
+         GNU_UINT128
+         ASM_GNU
+         ASM_MSASM
+
+         CPUID_MSVC
+
+         CXX11_RANDOM
+         CXX11_TYPE_TRAITS
+         CXX11_STATIC_ASSERT
+         CXX11_CONSTEXPR
+         CXX11_UNRESTRICTED_UNIONS
+         CXX11_EXPLICIT_CONVERSIONS
+         CXX11_LONG_LONG
+         CXX11 
+   
+         X86INTRIN_H
+         IA32INTRIN_H
+         XMMINTRIN_H
+         EMMINTRIN_H
+         SMMINTRIN_H
+         WMMINTRIN_H
+         INTRIN_H
+
+         MULHILO32_ASM
+         MULHILO64_ASM
+         MULHILO64_MSVC_INTRIN
+         MULHILO64_CUDA_INTRIN
+         MULHILO64_OPENCL_INTRIN
+         MULHILO64_C99
+
+         U01_DOUBLE
+	 
+ at endverbatim
+Most have obvious meanings.  Some non-obvious ones:
+
+AES_NI and AES_OPENSSL are not mutually exclusive.  You can have one,
+both or neither.
+
+GNU_UINT128 says that it's safe to use __uint128_t, but it
+does not require its use.  In particular, it should be
+used in mulhilo<uint64_t> only if MULHILO64_ASM is unset.
+
+If the XXXINTRIN_H macros are true, then one should
+ at code
+#include <xxxintrin.h>
+ at endcode
+to gain accesss to compiler intrinsics.
+
+The CXX11_SOME_FEATURE macros allow the code to use specific
+features of the C++11 language and library.  The catchall
+In the absence of a specific CXX11_SOME_FEATURE, the feature
+is controlled by the catch-all R123_USE_CXX11 macro.
+
+U01_DOUBLE defaults on, and can be turned off (set to 0)
+if one does not want the utility functions that convert to double
+(i.e. u01_*_53()), e.g. on OpenCL without the cl_khr_fp64 extension.
+
+There are a number of invariants that are always true.  Application code may
+choose to rely on these:
+
+<ul>
+<li>ASM_GNU and ASM_MASM are mutually exclusive
+<li>The "higher" SSE values imply the lower ones.
+</ul>
+
+There are also non-boolean valued symbols:
+
+<ul>
+<li>R123_STATIC_INLINE -
+  According to both C99 and GNU99, the 'static inline' declaration allows
+  the compiler to not emit code if the function is not used.  
+  Note that the semantics of 'inline', 'static' and 'extern' in
+  gcc have changed over time and are subject to modification by
+  command line options, e.g., -std=gnu89, -fgnu-inline.
+  Nevertheless, it appears that the meaning of 'static inline' 
+  has not changed over time and (with a little luck) the use of 'static inline'
+  here will be portable between versions of gcc and to other C99
+  compilers.
+  See: http://gcc.gnu.org/onlinedocs/gcc/Inline.html
+       http://www.greenend.org.uk/rjk/2003/03/inline.html
+
+<li>R123_FORCE_INLINE(decl) -
+  which expands to 'decl', adorned with the compiler-specific
+  embellishments to strongly encourage that the declared function be
+  inlined.  If there is no such compiler-specific magic, it should
+  expand to decl, unadorned.
+   
+<li>R123_CUDA_DEVICE - which expands to __device__ (or something else with
+  sufficiently similar semantics) when CUDA is in use, and expands
+  to nothing in other cases.
+
+<li>R123_ASSERT(x) - which expands to assert(x), or maybe to nothing at
+  all if we're in an environment so feature-poor that you can't even
+  call assert (I'm looking at you, CUDA and OpenCL), or even include
+  assert.h safely (OpenCL).
+
+<li>R123_STATIC_ASSERT(expr,msg) - which expands to
+  static_assert(expr,msg), or to an expression that
+  will raise a compile-time exception if expr is not true.
+
+<li>R123_ULONG_LONG - which expands to a declaration of the longest available
+  unsigned integer.
+
+<li>R123_64BIT(x) - expands to something equivalent to
+  UINT64_C(x) from <stdint.h>, even in environments where <stdint.h>
+  is not available, e.g., MSVC and OpenCL.
+
+<li>R123_BUILTIN_EXPECT(expr,likely_value) - expands to something with
+  the semantics of gcc's __builtin_expect(expr,likely_value).  If
+  the environment has nothing like __builtin_expect, it should expand
+  to just expr.
+</ul>
+
+
+\cond HIDDEN_FROM_DOXYGEN
+*/
+
+/* 
+N.B.  When something is added to the list of features, it should be
+added to each of the *features.h files, AND to examples/ut_features.cpp.
+*/
+
+/* N.B.  most other compilers (icc, nvcc, open64, llvm) will also define __GNUC__, so order matters. */
+#if defined(__OPENCL_VERSION__) && __OPENCL_VERSION__ > 0
+#include "openclfeatures.h"
+#elif defined(__CUDACC__)
+#include "nvccfeatures.h"
+#elif defined(__ICC)
+#include "iccfeatures.h"
+#elif defined(__xlC__)
+#include "xlcfeatures.h"
+#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#include "sunprofeatures.h"
+#elif defined(__OPEN64__)
+#include "open64features.h"
+#elif defined(__clang__)
+#include "clangfeatures.h"
+#elif defined(__GNUC__)
+#include "gccfeatures.h"
+#elif defined(__PGI)
+#include "pgccfeatures.h"
+#elif defined(_MSC_FULL_VER)
+#include "msvcfeatures.h"
+#else
+#error "Can't identify compiler.  You'll need to add a new xxfeatures.hpp"
+{ /* maybe an unbalanced brace will terminate the compilation */
+#endif
+
+#ifndef R123_USE_CXX11
+#define R123_USE_CXX11 (__cplusplus >= 201103L)
+#endif
+
+#ifndef R123_USE_CXX11_UNRESTRICTED_UNIONS
+#define R123_USE_CXX11_UNRESTRICTED_UNIONS R123_USE_CXX11
+#endif
+
+#ifndef R123_USE_CXX11_STATIC_ASSERT
+#define R123_USE_CXX11_STATIC_ASSERT R123_USE_CXX11
+#endif
+
+#ifndef R123_USE_CXX11_CONSTEXPR
+#define R123_USE_CXX11_CONSTEXPR R123_USE_CXX11
+#endif
+
+#ifndef R123_USE_CXX11_EXPLICIT_CONVERSIONS
+#define R123_USE_CXX11_EXPLICIT_CONVERSIONS R123_USE_CXX11
+#endif
+
+#ifndef R123_USE_CXX11_RANDOM
+#define R123_USE_CXX11_RANDOM R123_USE_CXX11
+#endif
+
+#ifndef R123_USE_CXX11_TYPE_TRAITS
+#define R123_USE_CXX11_TYPE_TRAITS R123_USE_CXX11
+#endif
+
+#ifndef R123_USE_CXX11_LONG_LONG
+#define R123_USE_CXX11_LONG_LONG R123_USE_CXX11
+#endif
+
+#ifndef R123_USE_MULHILO64_C99
+#define R123_USE_MULHILO64_C99 0
+#endif
+
+#ifndef R123_USE_MULHILO64_MULHI_INTRIN
+#define R123_USE_MULHILO64_MULHI_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO32_MULHI_INTRIN
+#define R123_USE_MULHILO32_MULHI_INTRIN 0
+#endif
+
+#ifndef R123_STATIC_ASSERT
+#if R123_USE_CXX11_STATIC_ASSERT
+#define R123_STATIC_ASSERT(expr, msg) static_assert(expr, msg)
+#else
+    /* if msg always_looked_like_this, we could paste it into the name.  Worth it? */
+#define R123_STATIC_ASSERT(expr, msg) typedef char static_assertion[(!!(expr))*2-1]
+#endif
+#endif
+
+#ifndef R123_CONSTEXPR
+#if R123_USE_CXX11_CONSTEXPR
+#define R123_CONSTEXPR constexpr
+#else
+#define R123_CONSTEXPR
+#endif
+#endif
+
+#ifndef R123_USE_PHILOX_64BIT
+#define R123_USE_PHILOX_64BIT (R123_USE_MULHILO64_ASM || R123_USE_MULHILO64_MSVC_INTRIN || R123_USE_MULHILO64_CUDA_INTRIN || R123_USE_GNU_UINT128 || R123_USE_MULHILO64_C99 || R123_USE_MULHILO64_OPENCL_INTRIN || R123_USE_MULHILO64_MULHI_INTRIN)
+#endif
+
+#ifndef R123_ULONG_LONG
+#if defined(__cplusplus) && !R123_USE_CXX11_LONG_LONG
+/* C++98 doesn't have long long.  It doesn't have uint64_t either, but
+   we will have typedef'ed uint64_t to something in the xxxfeatures.h.
+   With luck, it won't elicit complaints from -pedantic.  Cross your
+   fingers... */
+#define R123_ULONG_LONG uint64_t
+#else
+#define R123_ULONG_LONG unsigned long long
+#endif
+#endif
+
+/* UINT64_C should have been #defined by XXXfeatures.h, either by
+   #include <stdint.h> or through compiler-dependent hacks */
+#ifndef R123_64BIT
+#define R123_64BIT(x) UINT64_C(x)
+#endif
+
+#ifndef R123_THROW
+#define R123_THROW(x)    throw (x)
+#endif
+
+/*
+ * Windows.h (and perhaps other "well-meaning" code define min and
+ * max, so there's a high chance that our definition of min, max
+ * methods or use of std::numeric_limits min and max will cause
+ * complaints in any program that happened to include Windows.h or
+ * suchlike first.  We use the null macro below in our own header
+ * files definition or use of min, max to defensively preclude
+ * this problem.  It may not be enough; one might need to #define
+ * NOMINMAX before including Windows.h or compile with -DNOMINMAX.
+ */
+#define R123_NO_MACRO_SUBST
+
+/** \endcond */
diff --git a/lib/Random123-1.08/include/Random123/features/gccfeatures.h b/lib/Random123-1.08/include/Random123/features/gccfeatures.h
new file mode 100644
index 0000000..d6bb060
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/features/gccfeatures.h
@@ -0,0 +1,247 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __gccfeatures_dot_hpp
+#define __gccfeatures_dot_hpp
+
+#define R123_GNUC_VERSION (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
+
+#if !defined(__x86_64__) && !defined(__i386__) && !defined(__powerpc__)
+#  error "This code has only been tested on x86 and powerpc platforms."
+#include <including_a_nonexistent_file_will_stop_some_compilers_from_continuing_with_a_hopeless_task>
+{ /* maybe an unbalanced brace will terminate the compilation */
+ /* Feel free to try the Random123 library on other architectures by changing
+ the conditions that reach this error, but you should consider it a
+ porting exercise and expect to encounter bugs and deficiencies.
+ Please let the authors know of any successes (or failures). */
+#endif
+
+#ifdef __powerpc__
+#include <ppu_intrinsics.h>
+#endif
+
+#ifndef R123_STATIC_INLINE
+#define R123_STATIC_INLINE static __inline__
+#endif
+
+#ifndef R123_FORCE_INLINE
+#if R123_GNUC_VERSION >= 40000
+#define R123_FORCE_INLINE(decl) decl __attribute__((always_inline))
+#else
+#define R123_FORCE_INLINE(decl) decl
+#endif
+#endif
+
+#ifndef R123_CUDA_DEVICE
+#define R123_CUDA_DEVICE
+#endif
+
+#ifndef R123_ASSERT
+#include <assert.h>
+#define R123_ASSERT(x) assert(x)
+#endif
+
+#ifndef R123_BUILTIN_EXPECT
+#define R123_BUILTIN_EXPECT(expr,likely) __builtin_expect(expr,likely)
+#endif
+
+/* According to the C++0x standard, we should be able to test the numeric
+   value of __cplusplus == 199701L for C++98, __cplusplus == 201103L for C++0x
+   But gcc has had an open bug  http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773
+   since early 2001, which was finally fixed in 4.7 (early 2012).  For
+   earlier versions, the only way  to detect whether --std=c++0x was requested
+   on the command line is to look at the __GCC_EXPERIMENTAL_CXX0X__ pp-symbol.
+*/
+#define GNU_CXX11 (__cplusplus>=201103L || (R123_GNUC_VERSION<40700 && defined(__GCC_EXPERIMENTAL_CXX0X__) ))
+
+#ifndef R123_USE_CXX11_UNRESTRICTED_UNIONS
+#define R123_USE_CXX11_UNRESTRICTED_UNIONS ((R123_GNUC_VERSION >= 40600) && GNU_CXX11)
+#endif
+
+#ifndef R123_USE_CXX11_STATIC_ASSERT
+#define R123_USE_CXX11_STATIC_ASSERT ((R123_GNUC_VERSION >= 40300) && GNU_CXX11)
+#endif
+
+#ifndef R123_USE_CXX11_CONSTEXPR
+#define R123_USE_CXX11_CONSTEXPR ((R123_GNUC_VERSION >= 40600) && GNU_CXX11)
+#endif
+
+#ifndef R123_USE_CXX11_EXPLICIT_CONVERSIONS
+#define R123_USE_CXX11_EXPLICIT_CONVERSIONS ((R123_GNUC_VERSION >= 40500) && GNU_CXX11)
+#endif
+
+#ifndef R123_USE_CXX11_RANDOM
+#define R123_USE_CXX11_RANDOM ((R123_GNUC_VERSION>=40500) && GNU_CXX11)
+#endif
+
+#ifndef R123_USE_CXX11_TYPE_TRAITS
+#define R123_USE_CXX11_TYPE_TRAITS ((R123_GNUC_VERSION>=40400) && GNU_CXX11)
+#endif
+
+#ifndef R123_USE_AES_NI
+#ifdef __AES__
+#define R123_USE_AES_NI 1
+#else
+#define R123_USE_AES_NI 0
+#endif
+#endif
+
+#ifndef R123_USE_SSE4_2
+#ifdef __SSE4_2__
+#define R123_USE_SSE4_2 1
+#else
+#define R123_USE_SSE4_2 0
+#endif
+#endif
+
+#ifndef R123_USE_SSE4_1
+#ifdef __SSE4_1__
+#define R123_USE_SSE4_1 1
+#else
+#define R123_USE_SSE4_1 0
+#endif
+#endif
+
+#ifndef R123_USE_SSE
+/* There's no point in trying to compile SSE code in Random123
+   unless SSE2 is available. */
+#ifdef __SSE2__
+#define R123_USE_SSE 1
+#else
+#define R123_USE_SSE 0
+#endif
+#endif
+
+#ifndef R123_USE_AES_OPENSSL
+/* There isn't really a good way to tell at compile time whether
+   openssl is available.  Without a pre-compilation configure-like
+   tool, it's less error-prone to guess that it isn't available.  Add
+   -DR123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to
+   play with openssl */
+#define R123_USE_AES_OPENSSL 0
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#ifdef __x86_64__
+#define R123_USE_GNU_UINT128 1
+#else
+#define R123_USE_GNU_UINT128 0
+#endif
+#endif
+
+#ifndef R123_USE_ASM_GNU
+#define R123_USE_ASM_GNU (defined(__x86_64__)||defined(__i386__))
+#endif
+
+#ifndef R123_USE_CPUID_MSVC
+#define R123_USE_CPUID_MSVC 0
+#endif
+
+#ifndef R123_USE_X86INTRIN_H
+#define R123_USE_X86INTRIN_H ((defined(__x86_64__)||defined(__i386__)) && R123_GNUC_VERSION >= 40402)
+#endif
+
+#ifndef R123_USE_IA32INTRIN_H
+#define R123_USE_IA32INTRIN_H 0
+#endif
+
+#ifndef R123_USE_XMMINTRIN_H
+#define R123_USE_XMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_EMMINTRIN_H
+/* gcc -m64 on Solaris 10 defines __SSE2__ but doesn't have 
+   emmintrin.h in the include search path.  This is
+   so broken that I refuse to try to work around it.  If this
+   affects you, figure out where your emmintrin.h lives and
+   add an appropriate -I to your CPPFLAGS.  Or add -DR123_USE_SSE=0. */
+#define R123_USE_EMMINTRIN_H (R123_USE_SSE && (R123_GNUC_VERSION < 40402))
+#endif
+
+#ifndef R123_USE_SMMINTRIN_H
+#define R123_USE_SMMINTRIN_H ((R123_USE_SSE4_1 || R123_USE_SSE4_2) && (R123_GNUC_VERSION < 40402))
+#endif
+
+#ifndef R123_USE_WMMINTRIN_H
+#define R123_USE_WMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_INTRIN_H
+#define R123_USE_INTRIN_H 0
+#endif
+
+#ifndef R123_USE_MULHILO32_ASM
+#define R123_USE_MULHILO32_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#define R123_USE_MULHILO64_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_MSVC_INTRIN
+#define R123_USE_MULHILO64_MSVC_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#define R123_USE_MULHILO64_CUDA_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_OPENCL_INTRIN
+#define R123_USE_MULHILO64_OPENCL_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_MULHI_INTRIN
+#define R123_USE_MULHILO64_MULHI_INTRIN (defined(__powerpc64__))
+#endif
+
+#ifndef R123_MULHILO64_MULHI_INTRIN
+#define R123_MULHILO64_MULHI_INTRIN __mulhdu
+#endif
+
+#ifndef R123_USE_MULHILO32_MULHI_INTRIN
+#define R123_USE_MULHILO32_MULHI_INTRIN 0
+#endif
+
+#ifndef R123_MULHILO32_MULHI_INTRIN
+#define R123_MULHILO32_MULHI_INTRIN __mulhwu
+#endif
+
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS
+#endif
+#include <stdint.h>
+#ifndef UINT64_C
+#error UINT64_C not defined.  You must define __STDC_CONSTANT_MACROS before you #include <stdint.h>
+#endif
+
+/* If you add something, it must go in all the other XXfeatures.hpp
+   and in ../ut_features.cpp */
+#endif
diff --git a/lib/Random123-1.08/include/Random123/features/iccfeatures.h b/lib/Random123-1.08/include/Random123/features/iccfeatures.h
new file mode 100644
index 0000000..b64e5c2
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/features/iccfeatures.h
@@ -0,0 +1,208 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __icpcfeatures_dot_hpp
+#define __icpcfeatures_dot_hpp
+
+// icc relies on gcc libraries and other toolchain components.
+#define R123_GNUC_VERSION (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
+
+#if !defined(__x86_64__) && !defined(__i386__)
+#  error "This code has only been tested on x86 platforms."
+{ // maybe an unbalanced brace will terminate the compilation
+// You are invited to try Easy123 on other architectures, by changing
+// the conditions that reach this error, but you should consider it a
+// porting exercise and expect to encounter bugs and deficiencies.
+// Please let the authors know of any successes (or failures).
+#endif
+
+#ifndef R123_STATIC_INLINE
+#define R123_STATIC_INLINE static inline
+#endif
+
+#ifndef R123_FORCE_INLINE
+#define R123_FORCE_INLINE(decl) decl __attribute__((always_inline))
+#endif
+
+#ifndef R123_CUDA_DEVICE
+#define R123_CUDA_DEVICE
+#endif
+
+#ifndef R123_ASSERT
+#include <assert.h>
+#define R123_ASSERT(x) assert(x)
+#endif
+
+#ifndef R123_BUILTIN_EXPECT
+#define R123_BUILTIN_EXPECT(expr,likely) __builtin_expect(expr,likely)
+#endif
+
+// The basic idiom is:
+// #ifndef R123_SOMETHING
+// #if some condition
+// #define R123_SOMETHING 1
+// #else
+// #define R123_SOMETHING 0
+// #endif
+// #endif
+// This idiom allows an external user to override any decision
+// in this file with a command-line -DR123_SOMETHING=1 or -DR123_SOMETHINE=0
+
+// An alternative idiom is:
+// #ifndef R123_SOMETHING
+// #define R123_SOMETHING (some boolean expression)
+// #endif
+// where the boolean expression might contain previously-defined R123_SOMETHING_ELSE
+// pp-symbols.
+
+#ifndef R123_USE_SSE4_2
+#ifdef __SSE4_2__
+#define R123_USE_SSE4_2 1
+#else
+#define R123_USE_SSE4_2 0
+#endif
+#endif
+
+#ifndef R123_USE_SSE4_1
+#ifdef __SSE4_1__
+#define R123_USE_SSE4_1 1
+#else
+#define R123_USE_SSE4_1 0
+#endif
+#endif
+
+#ifndef R123_USE_SSE
+#ifdef __SSE2__
+#define R123_USE_SSE 1
+#else
+#define R123_USE_SSE 0
+#endif
+#endif
+
+#ifndef R123_USE_AES_NI
+// Unlike gcc, icc (version 12) does not pre-define an __AES__
+// pp-symbol when -maes or -xHost is on the command line.  This feels
+// like a defect in icc (it defines __SSE4_2__ in analogous
+// circumstances), but until Intel fixes it, we're better off erring
+// on the side of caution and not generating instructions that are
+// going to raise SIGILL when executed.  To get the AES-NI
+// instructions with icc, the caller must puts something like
+// -DR123_USE_AES_NI=1 or -D__AES__ on the command line.  FWIW, the
+// AES-NI Whitepaper by Gueron says that icc has supported AES-NI from
+// 11.1 onwards.
+//
+#define R123_USE_AES_NI ((__ICC>=1101) && defined(__AES__))
+#endif
+
+#ifndef R123_USE_AES_OPENSSL
+/* There isn't really a good way to tell at compile time whether
+   openssl is available.  Without a pre-compilation configure-like
+   tool, it's less error-prone to guess that it isn't available.  Add
+   -DR123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to
+   play with openssl */
+#define R123_USE_AES_OPENSSL 0
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#define R123_USE_GNU_UINT128 0
+#endif
+
+#ifndef R123_USE_ASM_GNU
+#define R123_USE_ASM_GNU 1
+#endif
+
+#ifndef R123_USE_CPUID_MSVC
+#define R123_USE_CPUID_MSVC 0
+#endif
+
+#ifndef R123_USE_X86INTRIN_H
+#define R123_USE_X86INTRIN_H 0
+#endif
+
+#ifndef R123_USE_IA32INTRIN_H
+#define R123_USE_IA32INTRIN_H 1
+#endif
+
+#ifndef R123_USE_XMMINTRIN_H
+#define R123_USE_XMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_EMMINTRIN_H
+#define R123_USE_EMMINTRIN_H 1
+#endif
+
+#ifndef R123_USE_SMMINTRIN_H
+#define R123_USE_SMMINTRIN_H 1
+#endif
+
+#ifndef R123_USE_WMMINTRIN_H
+#define R123_USE_WMMINTRIN_H 1
+#endif
+
+#ifndef R123_USE_INTRIN_H
+#define R123_USE_INTRIN_H 0
+#endif
+
+#ifndef R123_USE_MULHILO16_ASM
+#define R123_USE_MULHILO16_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO32_ASM
+#define R123_USE_MULHILO32_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#define R123_USE_MULHILO64_ASM 1
+#endif
+
+#ifndef R123_USE_MULHILO64_MSVC_INTRIN
+#define R123_USE_MULHILO64_MSVC_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#define R123_USE_MULHILO64_CUDA_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_OPENCL_INTRIN
+#define R123_USE_MULHILO64_OPENCL_INTRIN 0
+#endif
+
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS
+#endif
+#include <stdint.h>
+#ifndef UINT64_C
+#error UINT64_C not defined.  You must define __STDC_CONSTANT_MACROS before you #include <stdint.h>
+#endif
+
+// If you add something, it must go in all the other XXfeatures.hpp
+// and in ../ut_features.cpp
+#endif
diff --git a/lib/Random123-1.08/include/Random123/features/msvcfeatures.h b/lib/Random123-1.08/include/Random123/features/msvcfeatures.h
new file mode 100644
index 0000000..9eb9520
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/features/msvcfeatures.h
@@ -0,0 +1,200 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __msvcfeatures_dot_hpp
+#define __msvcfeatures_dot_hpp
+
+//#if _MSVC_FULL_VER <= 15
+//#error "We've only tested MSVC_FULL_VER==15."
+//#endif
+
+#if !defined(_M_IX86) && !defined(_M_X64)
+#  error "This code has only been tested on x86 platforms."
+{ // maybe an unbalanced brace will terminate the compilation
+// You are invited to try Random123 on other architectures, by changing
+// the conditions that reach this error, but you should consider it a
+// porting exercise and expect to encounter bugs and deficiencies.
+// Please let the authors know of any successes (or failures).
+#endif
+
+#ifndef R123_STATIC_INLINE
+#define R123_STATIC_INLINE static __inline
+#endif
+
+#ifndef R123_FORCE_INLINE
+#define R123_FORCE_INLINE(decl) _forceinline decl
+#endif
+
+#ifndef R123_CUDA_DEVICE
+#define R123_CUDA_DEVICE
+#endif
+
+#ifndef R123_ASSERT
+#include <assert.h>
+#define R123_ASSERT(x) assert(x)
+#endif
+
+#ifndef R123_BUILTIN_EXPECT
+#define R123_BUILTIN_EXPECT(expr,likely) expr
+#endif
+
+// The basic idiom is:
+// #ifndef R123_SOMETHING
+// #if some condition
+// #define R123_SOMETHING 1
+// #else
+// #define R123_SOMETHING 0
+// #endif
+// #endif
+// This idiom allows an external user to override any decision
+// in this file with a command-line -DR123_SOMETHING=1 or -DR123_SOMETHINE=0
+
+// An alternative idiom is:
+// #ifndef R123_SOMETHING
+// #define R123_SOMETHING (some boolean expression)
+// #endif
+// where the boolean expression might contain previously-defined R123_SOMETHING_ELSE
+// pp-symbols.
+
+#ifndef R123_USE_AES_NI
+#if defined(_M_X64)
+#define R123_USE_AES_NI 1
+#else
+#define R123_USE_AES_NI 0
+#endif
+#endif
+
+#ifndef R123_USE_SSE4_2
+#if defined(_M_X64)
+#define R123_USE_SSE4_2 1
+#else
+#define R123_USE_SSE4_2 0
+#endif
+#endif
+
+#ifndef R123_USE_SSE4_1
+#if defined(_M_X64)
+#define R123_USE_SSE4_1 1
+#else
+#define R123_USE_SSE4_1 0
+#endif
+#endif
+
+#ifndef R123_USE_SSE
+#define R123_USE_SSE 1
+#endif
+
+#ifndef R123_USE_AES_OPENSSL
+#define R123_USE_AES_OPENSSL 0
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#define R123_USE_GNU_UINT128 0
+#endif
+
+#ifndef R123_USE_ASM_GNU
+#define R123_USE_ASM_GNU 0
+#endif
+
+#ifndef R123_USE_CPUID_MSVC
+#define R123_USE_CPUID_MSVC 1
+#endif
+
+#ifndef R123_USE_X86INTRIN_H
+#define R123_USE_X86INTRIN_H 0
+#endif
+
+#ifndef R123_USE_IA32INTRIN_H
+#define R123_USE_IA32INTRIN_H 0
+#endif
+
+#ifndef R123_USE_XMMINTRIN_H
+#define R123_USE_XMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_EMMINTRIN_H
+#define R123_USE_EMMINTRIN_H 1
+#endif
+
+#ifndef R123_USE_SMMINTRIN_H
+#define R123_USE_SMMINTRIN_H 1
+#endif
+
+#ifndef R123_USE_WMMINTRIN_H
+#define R123_USE_WMMINTRIN_H 1
+#endif
+
+#ifndef R123_USE_INTRIN_H
+#define R123_USE_INTRIN_H 1
+#endif
+
+#ifndef R123_USE_MULHILO16_ASM
+#define R123_USE_MULHILO16_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO32_ASM
+#define R123_USE_MULHILO32_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#define R123_USE_MULHILO64_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_MSVC_INTRIN
+#if defined(_M_X64)
+#define R123_USE_MULHILO64_MSVC_INTRIN 1
+#else
+#define R123_USE_MULHILO64_MSVC_INTRIN 0
+#endif
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#define R123_USE_MULHILO64_CUDA_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_OPENCL_INTRIN
+#define R123_USE_MULHILO64_OPENCL_INTRIN 0
+#endif
+
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS
+#endif
+#include <stdint.h>
+#ifndef UINT64_C
+#error UINT64_C not defined.  You must define __STDC_CONSTANT_MACROS before you #include <stdint.h>
+#endif
+
+#pragma warning(disable:4244)
+#pragma warning(disable:4996)
+
+// If you add something, it must go in all the other XXfeatures.hpp
+// and in ../ut_features.cpp
+#endif
diff --git a/lib/Random123-1.08/include/Random123/features/nvccfeatures.h b/lib/Random123-1.08/include/Random123/features/nvccfeatures.h
new file mode 100644
index 0000000..711babf
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/features/nvccfeatures.h
@@ -0,0 +1,110 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __r123_nvcc_features_dot_h__
+#define __r123_nvcc_features_dot_h__
+
+#if !defined(CUDART_VERSION)
+#error "why are we in nvccfeatures.h if CUDART_VERSION is not defined"
+#endif
+
+#if CUDART_VERSION < 4010
+#error "CUDA versions earlier than 4.1 produce incorrect results for some templated functions in namespaces.  Random123 isunsupported.  See comments in nvccfeatures.h"
+// This test was added in Random123-1.08 (August, 2013) because we
+// discovered that Ftype(maxTvalue<T>()) with Ftype=double and
+// T=uint64_t in examples/uniform.hpp produces -1 for CUDA4.0 and
+// earlier.  We can't be sure this bug doesn't also affect invocations
+// of other templated functions, e.g., essentially all of Random123.
+// Thus, we no longer trust CUDA versions earlier than 4.1 even though
+// we had previously tested and timed Random123 with CUDA 3.x and 4.0.
+// If you feel lucky or desperate, you can change #error to #warning, but
+// please take extra care to be sure that you are getting correct
+// results.
+#endif
+
+// nvcc falls through to gcc or msvc.  So first define
+// a couple of things and then include either gccfeatures.h
+// or msvcfeatures.h
+
+#ifndef R123_CUDA_DEVICE
+#define R123_CUDA_DEVICE __device__
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#define R123_USE_MULHILO64_CUDA_INTRIN 1
+#endif
+
+#ifndef R123_ASSERT
+#define R123_ASSERT(x) if((x)) ; else asm("trap;")
+#endif
+
+#ifndef R123_BUILTIN_EXPECT
+#define R123_BUILTIN_EXPECT(expr,likely) expr
+#endif
+
+#ifndef R123_USE_AES_NI
+#define R123_USE_AES_NI 0
+#endif
+
+#ifndef R123_USE_SSE4_2
+#define R123_USE_SSE4_2 0
+#endif
+
+#ifndef R123_USE_SSE4_1
+#define R123_USE_SSE4_1 0
+#endif
+
+#ifndef R123_USE_SSE
+#define R123_USE_SSE 0
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#define R123_USE_GNU_UINT128 0
+#endif
+
+#ifndef R123_ULONG_LONG
+// uint64_t, which is what we'd get without this, is
+// not the same as unsigned long long
+#define R123_ULONG_LONG unsigned long long
+#endif
+
+#ifndef R123_THROW
+// No exceptions in CUDA, at least upto 4.0
+#define R123_THROW(x)    R123_ASSERT(0)
+#endif
+
+#if defined(__GNUC__)
+#include "gccfeatures.h"
+#elif defined(_MSC_FULL_VER)
+#include "msvcfeatures.h"
+#endif
+
+#endif
diff --git a/lib/Random123-1.08/include/Random123/features/open64features.h b/lib/Random123-1.08/include/Random123/features/open64features.h
new file mode 100644
index 0000000..8da9f5f
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/features/open64features.h
@@ -0,0 +1,50 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __open64features_dot_hpp
+#define __open64features_dot_hpp
+
+/* The gcc features are mostly right.  We just override a few and then include gccfeatures.h */
+
+/* Open64 4.2.3 and 4.2.4 accept the __uint128_t code without complaint
+   but produce incorrect code for 64-bit philox.  The MULHILO64_ASM
+   seems to work fine */
+#ifndef R123_USE_GNU_UINT128
+#define R123_USE_GNU_UINT128 0
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#define R123_USE_MULHILO64_ASM 1
+#endif
+
+#include "gccfeatures.h"
+
+#endif
diff --git a/lib/Random123-1.08/include/Random123/features/openclfeatures.h b/lib/Random123-1.08/include/Random123/features/openclfeatures.h
new file mode 100644
index 0000000..af03d30
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/features/openclfeatures.h
@@ -0,0 +1,89 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __openclfeatures_dot_hpp
+#define __openclfeatures_dot_hpp
+
+#ifndef R123_STATIC_INLINE
+#define R123_STATIC_INLINE inline
+#endif
+
+#ifndef R123_FORCE_INLINE
+#define R123_FORCE_INLINE(decl) decl __attribute__((always_inline))
+#endif
+
+#ifndef R123_CUDA_DEVICE
+#define R123_CUDA_DEVICE
+#endif
+
+#ifndef R123_ASSERT
+#define R123_ASSERT(x)
+#endif
+
+#ifndef R123_BUILTIN_EXPECT
+#define R123_BUILTIN_EXPECT(expr,likely) expr
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#define R123_USE_GNU_UINT128 0
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#define R123_USE_MULHILO64_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_MSVC_INTRIN
+#define R123_USE_MULHILO64_MSVC_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#define R123_USE_MULHILO64_CUDA_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_OPENCL_INTRIN
+#define R123_USE_MULHILO64_OPENCL_INTRIN 1
+#endif
+
+#ifndef R123_USE_AES_NI
+#define R123_USE_AES_NI 0
+#endif
+
+// XXX ATI APP SDK 2.4 clBuildProgram SEGVs if one uses uint64_t instead of
+// ulong to mul_hi.  And gets lots of complaints from stdint.h
+// on some machines.
+// But these typedefs mean we cannot include stdint.h with
+// these headers?  Do we need R123_64T, R123_32T, R123_8T?
+typedef ulong uint64_t;
+typedef uint  uint32_t;
+typedef uchar uint8_t;
+#define UINT64_C(x) ((ulong)(x##UL))
+
+#endif
diff --git a/lib/Random123-1.08/include/Random123/features/pgccfeatures.h b/lib/Random123-1.08/include/Random123/features/pgccfeatures.h
new file mode 100644
index 0000000..18ace13
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/features/pgccfeatures.h
@@ -0,0 +1,194 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Copyright (c) 2013, Los Alamos National Security, LLC
+All rights reserved.
+
+Copyright 2013. Los Alamos National Security, LLC. This software was produced
+under U.S. Government contract DE-AC52-06NA25396 for Los Alamos National
+Laboratory (LANL), which is operated by Los Alamos National Security, LLC for
+the U.S. Department of Energy. The U.S. Government has rights to use,
+reproduce, and distribute this software.  NEITHER THE GOVERNMENT NOR LOS
+ALAMOS NATIONAL SECURITY, LLC MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR
+ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE.  If software is modified
+to produce derivative works, such modified software should be clearly marked,
+so as not to confuse it with the version available from LANL.
+*/
+#ifndef __pgccfeatures_dot_hpp
+#define __pgccfeatures_dot_hpp
+
+#if !defined(__x86_64__) && !defined(__i386__)
+#  error "This code has only been tested on x86 platforms."
+#include <including_a_nonexistent_file_will_stop_some_compilers_from_continuing_with_a_hopeless_task>
+{ /* maybe an unbalanced brace will terminate the compilation */
+ /* Feel free to try the Random123 library on other architectures by changing
+ the conditions that reach this error, but you should consider it a
+ porting exercise and expect to encounter bugs and deficiencies.
+ Please let the authors know of any successes (or failures). */
+#endif
+
+#ifndef R123_STATIC_INLINE
+#define R123_STATIC_INLINE static inline
+#endif
+
+/* Found this example in PGI's emmintrin.h. */
+#ifndef R123_FORCE_INLINE
+#define R123_FORCE_INLINE(decl) decl __attribute__((__always_inline__))
+#endif
+
+#ifndef R123_CUDA_DEVICE
+#define R123_CUDA_DEVICE
+#endif
+
+#ifndef R123_ASSERT
+#include <assert.h>
+#define R123_ASSERT(x) assert(x)
+#endif
+
+#ifndef R123_BUILTIN_EXPECT
+#define R123_BUILTIN_EXPECT(expr,likely) (expr)
+#endif
+
+/* PGI through 13.2 doesn't appear to support AES-NI. */
+#ifndef R123_USE_AES_NI
+#define R123_USE_AES_NI 0
+#endif
+
+/* PGI through 13.2 appears to support MMX, SSE, SSE3, SSE3, SSSE3, SSE4a, and
+   ABM, but not SSE4.1 or SSE4.2. */
+#ifndef R123_USE_SSE4_2
+#define R123_USE_SSE4_2 0
+#endif
+
+#ifndef R123_USE_SSE4_1
+#define R123_USE_SSE4_1 0
+#endif
+
+#ifndef R123_USE_SSE
+/* There's no point in trying to compile SSE code in Random123
+   unless SSE2 is available. */
+#ifdef __SSE2__
+#define R123_USE_SSE 1
+#else
+#define R123_USE_SSE 0
+#endif
+#endif
+
+#ifndef R123_USE_AES_OPENSSL
+/* There isn't really a good way to tell at compile time whether
+   openssl is available.  Without a pre-compilation configure-like
+   tool, it's less error-prone to guess that it isn't available.  Add
+   -DR123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to
+   play with openssl */
+#define R123_USE_AES_OPENSSL 0
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#define R123_USE_GNU_UINT128 0
+#endif
+
+#ifndef R123_USE_ASM_GNU
+#define R123_USE_ASM_GNU 1
+#endif
+
+#ifndef R123_USE_CPUID_MSVC
+#define R123_USE_CPUID_MSVC 0
+#endif
+
+#ifndef R123_USE_X86INTRIN_H
+#define R123_USE_X86INTRIN_H 0
+#endif
+
+#ifndef R123_USE_IA32INTRIN_H
+#define R123_USE_IA32INTRIN_H 0
+#endif
+
+/* emmintrin.h from PGI #includes xmmintrin.h but then complains at link time
+   about undefined references to _mm_castsi128_ps(__m128i).  Why? */
+#ifndef R123_USE_XMMINTRIN_H
+#define R123_USE_XMMINTRIN_H 1
+#endif
+
+#ifndef R123_USE_EMMINTRIN_H
+#define R123_USE_EMMINTRIN_H 1
+#endif
+
+#ifndef R123_USE_SMMINTRIN_H
+#define R123_USE_SMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_WMMINTRIN_H
+#define R123_USE_WMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_INTRIN_H
+#ifdef __ABM__
+#define R123_USE_INTRIN_H 1
+#else
+#define R123_USE_INTRIN_H 0
+#endif
+#endif
+
+#ifndef R123_USE_MULHILO32_ASM
+#define R123_USE_MULHILO32_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_MULHI_INTRIN
+#define R123_USE_MULHILO64_MULHI_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#define R123_USE_MULHILO64_ASM 1
+#endif
+
+#ifndef R123_USE_MULHILO64_MSVC_INTRIN
+#define R123_USE_MULHILO64_MSVC_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#define R123_USE_MULHILO64_CUDA_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_OPENCL_INTRIN
+#define R123_USE_MULHILO64_OPENCL_INTRIN 0
+#endif
+
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS
+#endif
+#include <stdint.h>
+#ifndef UINT64_C
+#error UINT64_C not defined.  You must define __STDC_CONSTANT_MACROS before you #include <stdint.h>
+#endif
+
+/* If you add something, it must go in all the other XXfeatures.hpp
+   and in ../ut_features.cpp */
+#endif
diff --git a/lib/Random123-1.08/include/Random123/features/sse.h b/lib/Random123-1.08/include/Random123/features/sse.h
new file mode 100644
index 0000000..88efd65
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/features/sse.h
@@ -0,0 +1,280 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef _Random123_sse_dot_h__
+#define _Random123_sse_dot_h__
+
+#if R123_USE_SSE
+
+#if R123_USE_X86INTRIN_H
+#include <x86intrin.h>
+#endif
+#if R123_USE_IA32INTRIN_H
+#include <ia32intrin.h>
+#endif
+#if R123_USE_XMMINTRIN_H
+#include <xmmintrin.h>
+#endif
+#if R123_USE_EMMINTRIN_H
+#include <emmintrin.h>
+#endif
+#if R123_USE_SMMINTRIN_H
+#include <smmintrin.h>
+#endif
+#if R123_USE_WMMINTRIN_H
+#include <wmmintrin.h>
+#endif
+#if R123_USE_INTRIN_H
+#include <intrin.h>
+#endif
+#ifdef __cplusplus
+#include <iostream>
+#include <limits>
+#include <stdexcept>
+#endif
+
+#if R123_USE_ASM_GNU
+
+/* bit25 of CX tells us whether AES is enabled. */
+R123_STATIC_INLINE int haveAESNI(){
+    unsigned int eax, ebx, ecx, edx;
+    __asm__ __volatile__ ("cpuid": "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) :
+                      "a" (1));
+    return (ecx>>25) & 1;
+}
+#elif R123_USE_CPUID_MSVC
+R123_STATIC_INLINE int haveAESNI(){
+    int CPUInfo[4];
+    __cpuid(CPUInfo, 1);
+    return (CPUInfo[2]>>25)&1;
+}
+#else /* R123_USE_CPUID_??? */
+#warning "No R123_USE_CPUID_XXX method chosen.  haveAESNI will always return false"
+R123_STATIC_INLINE int haveAESNI(){
+    return 0;
+}
+#endif /* R123_USE_ASM_GNU || R123_USE_CPUID_MSVC */
+
+// There is a lot of annoying and inexplicable variation in the
+// SSE intrinsics available in different compilation environments.
+// The details seem to depend on the compiler, the version and
+// the target architecture.  Rather than insisting on
+// R123_USE_feature tests for each of these in each of the
+// compilerfeatures.h files we just keep the complexity localized
+// to here...
+#if (defined(__ICC) && __ICC<1210) || (defined(_MSC_VER) && !defined(_WIN64))
+/* Is there an intrinsic to assemble an __m128i from two 64-bit words? 
+   If not, use the 4x32-bit intrisic instead.  N.B.  It looks like Intel
+   added _mm_set_epi64x to icc version 12.1 in Jan 2012.
+*/
+R123_STATIC_INLINE __m128i _mm_set_epi64x(uint64_t v1, uint64_t v0){
+    union{
+        uint64_t u64;
+        uint32_t u32[2];
+    } u1, u0;
+    u1.u64 = v1;
+    u0.u64 = v0;
+    return _mm_set_epi32(u1.u32[1], u1.u32[0], u0.u32[1], u0.u32[0]);
+}
+#endif
+/* _mm_extract_lo64 abstracts the task of extracting the low 64-bit
+   word from an __m128i.  The _mm_cvtsi128_si64 intrinsic does the job
+   on 64-bit platforms.  Unfortunately, both MSVC and Open64 fail
+   assertions in ut_M128.cpp and ut_carray.cpp when we use the
+   _mm_cvtsi128_si64 intrinsic.  (See
+   https://bugs.open64.net/show_bug.cgi?id=873 for the Open64 bug).
+   On 32-bit platforms, there's no MOVQ, so there's no intrinsic.
+   Finally, even if the intrinsic exists, it may be spelled with or
+   without the 'x'.
+*/
+#if !defined(__x86_64__) || defined(_MSC_VER) || defined(__OPEN64__)
+R123_STATIC_INLINE uint64_t _mm_extract_lo64(__m128i si){
+    union{
+        uint64_t u64[2];
+        __m128i m;
+    }u;
+    _mm_store_si128(&u.m, si);
+    return u.u64[0];
+}
+#elif defined(__llvm__) || defined(__ICC)
+R123_STATIC_INLINE uint64_t _mm_extract_lo64(__m128i si){
+    return (uint64_t)_mm_cvtsi128_si64(si);
+}
+#else /* GNUC, others */
+/* FWIW, gcc's emmintrin.h has had the 'x' spelling
+   since at least gcc-3.4.4.  The no-'x' spelling showed up
+   around 4.2. */
+R123_STATIC_INLINE uint64_t _mm_extract_lo64(__m128i si){
+    return (uint64_t)_mm_cvtsi128_si64x(si);
+}
+#endif
+#if defined(__GNUC__) && __GNUC__ < 4
+/* the cast builtins showed up in gcc4. */
+R123_STATIC_INLINE __m128 _mm_castsi128_ps(__m128i si){
+    return (__m128)si;
+}
+#endif
+
+#ifdef __cplusplus
+
+struct r123m128i{
+    __m128i m;
+#if R123_USE_CXX11_UNRESTRICTED_UNIONS
+    // C++98 forbids a union member from having *any* constructors.
+    // C++11 relaxes this, and allows union members to have constructors
+    // as long as there is a "trivial" default construtor.  So in C++11
+    // we can provide a r123m128i constructor with an __m128i argument, and still
+    // have the default (and hence trivial) default constructor.
+    r123m128i() = default;
+    r123m128i(__m128i _m): m(_m){}
+#endif
+    r123m128i& operator=(const __m128i& rhs){ m=rhs; return *this;}
+    r123m128i& operator=(R123_ULONG_LONG n){ m = _mm_set_epi64x(0, n); return *this;}
+#if R123_USE_CXX11_EXPLICIT_CONVERSIONS
+    // With C++0x we can attach explicit to the bool conversion operator
+    // to disambiguate undesired promotions.  For g++, this works
+    // only in 4.5 and above.
+    explicit operator bool() const {return _bool();}
+#else
+    // Pre-C++0x, we have to do something else.  Google for the "safe bool"
+    // idiom for other ideas...
+    operator const void*() const{return _bool()?this:0;}
+#endif
+    operator __m128i() const {return m;}
+
+private:
+#if R123_USE_SSE4_1
+    bool _bool() const{ return !_mm_testz_si128(m,m); }
+#else
+    bool _bool() const{ return 0xf != _mm_movemask_ps(_mm_castsi128_ps(_mm_cmpeq_epi32(m, _mm_setzero_si128()))); }
+#endif
+};
+
+R123_STATIC_INLINE r123m128i& operator++(r123m128i& v){
+    __m128i& c = v.m;
+    __m128i zeroone = _mm_set_epi64x(R123_64BIT(0), R123_64BIT(1));
+    c = _mm_add_epi64(c, zeroone);
+    //return c;
+#if R123_USE_SSE4_1
+    __m128i zerofff = _mm_set_epi64x(0, ~(R123_64BIT(0)));
+    if( R123_BUILTIN_EXPECT(_mm_testz_si128(c,zerofff), 0) ){
+        __m128i onezero = _mm_set_epi64x(R123_64BIT(1), R123_64BIT(0));
+        c = _mm_add_epi64(c, onezero);
+    }
+#else
+    unsigned mask  = _mm_movemask_ps( _mm_castsi128_ps(_mm_cmpeq_epi32(c, _mm_setzero_si128())));
+    // The low two bits of mask are 11 iff the low 64 bits of
+    // c are zero.
+    if( R123_BUILTIN_EXPECT((mask&0x3) == 0x3, 0) ){
+        __m128i onezero = _mm_set_epi64x(1,0);
+        c = _mm_add_epi64(c, onezero);
+    }
+#endif
+    return v;
+}
+
+R123_STATIC_INLINE r123m128i& operator+=(r123m128i& lhs, R123_ULONG_LONG n){ 
+    __m128i c = lhs.m;
+    __m128i incr128 = _mm_set_epi64x(0, n);
+    c = _mm_add_epi64(c, incr128);
+    // return c;     // NO CARRY!  
+
+    int64_t lo64 = _mm_extract_lo64(c);
+    if((uint64_t)lo64 < n)
+        c = _mm_add_epi64(c, _mm_set_epi64x(1,0));
+    lhs.m = c;
+    return lhs; 
+}
+
+// We need this one because it's present, but never used in r123array1xm128i::incr
+R123_STATIC_INLINE bool operator<=(R123_ULONG_LONG, const r123m128i &){
+    throw std::runtime_error("operator<=(unsigned long long, r123m128i) is unimplemented.");}
+
+// The comparisons aren't implemented, but if we leave them out, and 
+// somebody writes, e.g., M1 < M2, the compiler will do an implicit
+// conversion through void*.  Sigh...
+R123_STATIC_INLINE bool operator<(const r123m128i&, const r123m128i&){
+    throw std::runtime_error("operator<(r123m128i, r123m128i) is unimplemented.");}
+R123_STATIC_INLINE bool operator<=(const r123m128i&, const r123m128i&){
+    throw std::runtime_error("operator<=(r123m128i, r123m128i) is unimplemented.");}
+R123_STATIC_INLINE bool operator>(const r123m128i&, const r123m128i&){
+    throw std::runtime_error("operator>(r123m128i, r123m128i) is unimplemented.");}
+R123_STATIC_INLINE bool operator>=(const r123m128i&, const r123m128i&){
+    throw std::runtime_error("operator>=(r123m128i, r123m128i) is unimplemented.");}
+
+R123_STATIC_INLINE bool operator==(const r123m128i &lhs, const r123m128i &rhs){ 
+    return 0xf==_mm_movemask_ps(_mm_castsi128_ps(_mm_cmpeq_epi32(lhs, rhs))); }
+R123_STATIC_INLINE bool operator!=(const r123m128i &lhs, const r123m128i &rhs){ 
+    return !(lhs==rhs);}
+R123_STATIC_INLINE bool operator==(R123_ULONG_LONG lhs, const r123m128i &rhs){
+    r123m128i LHS; LHS.m=_mm_set_epi64x(0, lhs); return LHS == rhs; }
+R123_STATIC_INLINE bool operator!=(R123_ULONG_LONG lhs, const r123m128i &rhs){
+    return !(lhs==rhs);}
+R123_STATIC_INLINE std::ostream& operator<<(std::ostream& os, const r123m128i& m){
+    union{
+        uint64_t u64[2];
+        __m128i m;
+    }u;
+    _mm_storeu_si128(&u.m, m.m);
+    return os << u.u64[0] << " " << u.u64[1];
+}
+
+R123_STATIC_INLINE std::istream& operator>>(std::istream& is, r123m128i& m){
+    uint64_t u64[2];
+    is >> u64[0] >> u64[1];
+    m.m = _mm_set_epi64x(u64[1], u64[0]);
+    return is;
+}
+
+template<typename T> inline T assemble_from_u32(uint32_t *p32); // forward declaration
+
+template <>
+inline r123m128i assemble_from_u32<r123m128i>(uint32_t *p32){
+    r123m128i ret;
+    ret.m = _mm_set_epi32(p32[3], p32[2], p32[1], p32[0]);
+    return ret;
+}
+
+#else
+
+typedef struct {
+    __m128i m;
+} r123m128i;
+
+#endif /* __cplusplus */
+
+#else /* !R123_USE_SSE */
+R123_STATIC_INLINE int haveAESNI(){
+    return 0;
+}
+#endif /* R123_USE_SSE */
+
+#endif /* _Random123_sse_dot_h__ */
diff --git a/lib/Random123-1.08/include/Random123/features/sunprofeatures.h b/lib/Random123-1.08/include/Random123/features/sunprofeatures.h
new file mode 100644
index 0000000..c9cdc00
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/features/sunprofeatures.h
@@ -0,0 +1,172 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __sunprofeatures_dot_hpp
+#define __sunprofeatures_dot_hpp
+
+#ifndef R123_STATIC_INLINE
+#define R123_STATIC_INLINE static inline
+#endif
+
+#ifndef R123_FORCE_INLINE
+#define R123_FORCE_INLINE(decl) decl
+#endif
+
+#ifndef R123_CUDA_DEVICE
+#define R123_CUDA_DEVICE
+#endif
+
+#ifndef R123_ASSERT
+#include <assert.h>
+#define R123_ASSERT(x) assert(x)
+#endif
+
+#ifndef R123_BUILTIN_EXPECT
+#define R123_BUILTIN_EXPECT(expr,likely) expr
+#endif
+
+// The basic idiom is:
+// #ifndef R123_SOMETHING
+// #if some condition
+// #define R123_SOMETHING 1
+// #else
+// #define R123_SOMETHING 0
+// #endif
+// #endif
+// This idiom allows an external user to override any decision
+// in this file with a command-line -DR123_SOMETHING=1 or -DR123_SOMETHINE=0
+
+// An alternative idiom is:
+// #ifndef R123_SOMETHING
+// #define R123_SOMETHING (some boolean expression)
+// #endif
+// where the boolean expression might contain previously-defined R123_SOMETHING_ELSE
+// pp-symbols.
+
+#ifndef R123_USE_AES_NI
+#define R123_USE_AES_NI 0
+#endif
+
+#ifndef R123_USE_SSE4_2
+#define R123_USE_SSE4_2 0
+#endif
+
+#ifndef R123_USE_SSE4_1
+#define R123_USE_SSE4_1 0
+#endif
+
+#ifndef R123_USE_SSE
+#define R123_USE_SSE 0
+#endif
+
+#ifndef R123_USE_AES_OPENSSL
+#define R123_USE_AES_OPENSSL 0
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#define R123_USE_GNU_UINT128 0
+#endif
+
+#ifndef R123_USE_ASM_GNU
+#define R123_USE_ASM_GNU 0
+#endif
+
+#ifndef R123_USE_CPUID_MSVC
+#define R123_USE_CPUID_MSVC 0
+#endif
+
+#ifndef R123_USE_X86INTRIN_H
+#define R123_USE_X86INTRIN_H 0
+#endif
+
+#ifndef R123_USE_IA32INTRIN_H
+#define R123_USE_IA32INTRIN_H 0
+#endif
+
+#ifndef R123_USE_XMMINTRIN_H
+#define R123_USE_XMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_EMMINTRIN_H
+#define R123_USE_EMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_SMMINTRIN_H
+#define R123_USE_SMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_WMMINTRIN_H
+#define R123_USE_WMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_INTRIN_H
+#define R123_USE_INTRIN_H 0
+#endif
+
+#ifndef R123_USE_MULHILO16_ASM
+#define R123_USE_MULHILO16_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO32_ASM
+#define R123_USE_MULHILO32_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#define R123_USE_MULHILO64_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_MSVC_INTRIN
+#define R123_USE_MULHILO64_MSVC_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#define R123_USE_MULHILO64_CUDA_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_OPENCL_INTRIN
+#define R123_USE_MULHILO64_OPENCL_INTRIN 0
+#endif
+
+#ifndef R123_USE_PHILOX_64BIT
+#define R123_USE_PHILOX_64BIT 0
+#endif
+
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS
+#endif
+#include <stdint.h>
+#ifndef UINT64_C
+#error UINT64_C not defined.  You must define __STDC_CONSTANT_MACROS before you #include <stdint.h>
+#endif
+
+// If you add something, it must go in all the other XXfeatures.hpp
+// and in ../ut_features.cpp
+#endif
diff --git a/lib/Random123-1.08/include/Random123/features/xlcfeatures.h b/lib/Random123-1.08/include/Random123/features/xlcfeatures.h
new file mode 100644
index 0000000..a5c8412
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/features/xlcfeatures.h
@@ -0,0 +1,202 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Copyright (c) 2013, Los Alamos National Security, LLC
+All rights reserved.
+
+Copyright 2013. Los Alamos National Security, LLC. This software was produced
+under U.S. Government contract DE-AC52-06NA25396 for Los Alamos National
+Laboratory (LANL), which is operated by Los Alamos National Security, LLC for
+the U.S. Department of Energy. The U.S. Government has rights to use,
+reproduce, and distribute this software.  NEITHER THE GOVERNMENT NOR LOS
+ALAMOS NATIONAL SECURITY, LLC MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR
+ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE.  If software is modified
+to produce derivative works, such modified software should be clearly marked,
+so as not to confuse it with the version available from LANL.
+*/
+#ifndef __xlcfeatures_dot_hpp
+#define __xlcfeatures_dot_hpp
+
+#if !defined(__x86_64__) && !defined(__i386__) && !defined(__powerpc__)
+#  error "This code has only been tested on x86 and PowerPC platforms."
+#include <including_a_nonexistent_file_will_stop_some_compilers_from_continuing_with_a_hopeless_task>
+{ /* maybe an unbalanced brace will terminate the compilation */
+ /* Feel free to try the Random123 library on other architectures by changing
+ the conditions that reach this error, but you should consider it a
+ porting exercise and expect to encounter bugs and deficiencies.
+ Please let the authors know of any successes (or failures). */
+#endif
+
+#ifdef __cplusplus
+/* builtins are automatically available to xlc.  To use them with xlc++,
+   one must include builtins.h.   c.f
+   http://publib.boulder.ibm.com/infocenter/cellcomp/v101v121/index.jsp?topic=/com.ibm.xlcpp101.cell.doc/compiler_ref/compiler_builtins.html
+*/
+#include <builtins.h>
+#endif
+
+#ifndef R123_STATIC_INLINE
+#define R123_STATIC_INLINE static inline
+#endif
+
+#ifndef R123_FORCE_INLINE
+#define R123_FORCE_INLINE(decl) decl __attribute__((__always_inline__))
+#endif
+
+#ifndef R123_CUDA_DEVICE
+#define R123_CUDA_DEVICE
+#endif
+
+#ifndef R123_ASSERT
+#include <assert.h>
+#define R123_ASSERT(x) assert(x)
+#endif
+
+#ifndef R123_BUILTIN_EXPECT
+#define R123_BUILTIN_EXPECT(expr,likely) __builtin_expect(expr,likely)
+#endif
+
+#ifndef R123_USE_AES_NI
+#define R123_USE_AES_NI 0
+#endif
+
+#ifndef R123_USE_SSE4_2
+#define R123_USE_SSE4_2 0
+#endif
+
+#ifndef R123_USE_SSE4_1
+#define R123_USE_SSE4_1 0
+#endif
+
+#ifndef R123_USE_SSE
+#define R123_USE_SSE 0
+#endif
+
+#ifndef R123_USE_AES_OPENSSL
+/* There isn't really a good way to tell at compile time whether
+   openssl is available.  Without a pre-compilation configure-like
+   tool, it's less error-prone to guess that it isn't available.  Add
+   -DR123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to
+   play with openssl */
+#define R123_USE_AES_OPENSSL 0
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#define R123_USE_GNU_UINT128 0
+#endif
+
+#ifndef R123_USE_ASM_GNU
+#define R123_USE_ASM_GNU 1
+#endif
+
+#ifndef R123_USE_CPUID_MSVC
+#define R123_USE_CPUID_MSVC 0
+#endif
+
+#ifndef R123_USE_X86INTRIN_H
+#define R123_USE_X86INTRIN_H 0
+#endif
+
+#ifndef R123_USE_IA32INTRIN_H
+#define R123_USE_IA32INTRIN_H 0
+#endif
+
+#ifndef R123_USE_XMMINTRIN_H
+#define R123_USE_XMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_EMMINTRIN_H
+#define R123_USE_EMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_SMMINTRIN_H
+#define R123_USE_SMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_WMMINTRIN_H
+#define R123_USE_WMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_INTRIN_H
+#ifdef __ABM__
+#define R123_USE_INTRIN_H 1
+#else
+#define R123_USE_INTRIN_H 0
+#endif
+#endif
+
+#ifndef R123_USE_MULHILO32_ASM
+#define R123_USE_MULHILO32_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_MULHI_INTRIN
+#define R123_USE_MULHILO64_MULHI_INTRIN (defined(__powerpc64__))
+#endif
+
+#ifndef R123_MULHILO64_MULHI_INTRIN
+#define R123_MULHILO64_MULHI_INTRIN __mulhdu
+#endif
+
+#ifndef R123_USE_MULHILO32_MULHI_INTRIN
+#define R123_USE_MULHILO32_MULHI_INTRIN 0
+#endif
+
+#ifndef R123_MULHILO32_MULHI_INTRIN
+#define R123_MULHILO32_MULHI_INTRIN __mulhwu
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#define R123_USE_MULHILO64_ASM (defined(__powerpc64__) && !(R123_USE_MULHILO64_MULHI_INTRIN))
+#endif
+
+#ifndef R123_USE_MULHILO64_MSVC_INTRIN
+#define R123_USE_MULHILO64_MSVC_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#define R123_USE_MULHILO64_CUDA_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_OPENCL_INTRIN
+#define R123_USE_MULHILO64_OPENCL_INTRIN 0
+#endif
+
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS
+#endif
+#include <stdint.h>
+#ifndef UINT64_C
+#error UINT64_C not defined.  You must define __STDC_CONSTANT_MACROS before you #include <stdint.h>
+#endif
+
+/* If you add something, it must go in all the other XXfeatures.hpp
+   and in ../ut_features.cpp */
+#endif
diff --git a/lib/Random123-1.08/include/Random123/gsl_microrng.h b/lib/Random123-1.08/include/Random123/gsl_microrng.h
new file mode 100644
index 0000000..4f09412
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/gsl_microrng.h
@@ -0,0 +1,136 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __r123_gslmicrorng_dot_h__
+#define __r123_gslmicrorng_dot_h__
+
+
+#include <gsl/gsl_rng.h>
+#include <string.h>
+
+/**   The macro: GSL_MICRORNG(NAME, CBRNGNAME) is the GSL
+   analog analog of the C++ r123::MicroURNG template.  It declares a gsl_rng
+   type named gsl_rng_NAME which uses the underlying CBRNGNAME
+   and can be invoked a limited number of times between calls to NAME_reset.
+
+   When the underlying CBRNG's \c ctr_t is an \ref arrayNxW "r123arrayNxW",
+   and the gsl_rng_NAME may called up to \c N*2^32 times 
+   between calls to \c NAME_reset.
+
+   \c NAME_reset takes a gsl_rng_NAME type, a counter and a key as arguments.
+   It restarts the micro-rng with a new base counter and key.
+
+   Note that you must call NAME_reset before the first use
+   of a gsl_rng.  NAME_reset is not called automatically by
+   gsl_rng_alloc().
+
+   @code
+   #include <Random123/threefry.h>
+   #include <Random123/gsl_microrng.h> // this file
+   GSL_MICRORNG(microcbrng, threefry4x64, 20)	// creates gsl_rng_microcbrng
+
+   int main(int argc, char** argv) {
+	gsl_rng *r = gsl_rng_alloc(gsl_rng_microcbrng);
+	threefry4x64_ctr_t c = {{}};
+	threefry4x64_key_t k = {{}};
+
+	for (...) {
+	    c.v[0] = ??; //  some application variable
+	    microcbrng_reset(r, c, k);
+	    for (...) {
+		// gaussian calls r several times.  It is safe for
+		// r to be used upto 2^20 times in this loop
+		something[i] = gsl_ran_gaussian(r, 1.5);
+	    }
+	}
+   }
+   @endcode
+   
+*/
+
+#define GSL_MICRORNG(NAME, CBRNGNAME)                                   \
+const gsl_rng_type *gsl_rng_##NAME;                                     \
+                                                                        \
+typedef struct{                                                         \
+    CBRNGNAME##_ctr_t ctr;                                              \
+    CBRNGNAME##_ctr_t r;                                                \
+    CBRNGNAME##_key_t key;                                              \
+    R123_ULONG_LONG n;                                                  \
+    int elem;                                                           \
+} NAME##_state;                                                         \
+                                                                        \
+static unsigned long int NAME##_get(void *vstate){                      \
+    NAME##_state *st = (NAME##_state *)vstate;                          \
+    const int N=sizeof(st->ctr.v)/sizeof(st->ctr.v[0]);                 \
+    if( st->elem == 0 ){                                                \
+        CBRNGNAME##_ctr_t c = st->ctr;                                  \
+        c.v[N-1] |= st->n<<(R123_W(CBRNGNAME##_ctr_t)-32);              \
+        st->n++;                                                        \
+        st->r = CBRNGNAME(c, st->key);                                  \
+        st->elem = N;                                                   \
+    }                                                                   \
+    return 0xffffffff & st->r.v[--st->elem];                            \
+}                                                                       \
+                                                                        \
+static double                                                           \
+NAME##_get_double (void * vstate)                                       \
+{                                                                       \
+    return NAME##_get (vstate)/4294967296.;                             \
+}                                                                       \
+                                                                        \
+static void NAME##_set(void *vstate, unsigned long int s){              \
+    NAME##_state *st = (NAME##_state *)vstate;                          \
+    (void)s; /* ignored */                                              \
+    st->elem = 0;                                                       \
+    st->n = ~0; /* will abort if _reset is not called */                \
+}                                                                       \
+                                                                        \
+static const gsl_rng_type NAME##_type = {                               \
+    #NAME,                                                              \
+    0xffffffffUL,                                                       \
+    0,                                                                  \
+    sizeof(NAME##_state),                                               \
+    &NAME##_set,                                                        \
+    &NAME##_get,                                                        \
+    &NAME##_get_double                                                  \
+};                                                                      \
+                                                                        \
+R123_STATIC_INLINE void NAME##_reset(const gsl_rng* gr, CBRNGNAME##_ctr_t c, CBRNGNAME##_key_t k) { \
+    NAME##_state* state = (NAME##_state *)gr->state;                    \
+    state->ctr = c;                                                     \
+    state->key = k;                                                     \
+    state->n = 0;                                                       \
+    state->elem = 0;                                                    \
+}                                                                       \
+                                                                        \
+const gsl_rng_type *gsl_rng_##NAME = &NAME##_type
+
+#endif
diff --git a/lib/Random123-1.08/include/Random123/philox.h b/lib/Random123-1.08/include/Random123/philox.h
new file mode 100644
index 0000000..9c87384
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/philox.h
@@ -0,0 +1,486 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef _philox_dot_h_
+#define _philox_dot_h_
+
+/** \cond HIDDEN_FROM_DOXYGEN */
+
+#include "features/compilerfeatures.h"
+#include "array.h"
+
+
+/*
+// Macros _Foo_tpl are code generation 'templates'  They define
+// inline functions with names obtained by mangling Foo and the
+// macro arguments.  E.g.,
+//   _mulhilo_tpl(32, uint32_t, uint64_t)
+// expands to a definition of:
+//   mulhilo32(uint32_t, uint32_t, uint32_t *, uint32_t *)
+// We then 'instantiate the template' to define
+// several different functions, e.g.,
+//   mulhilo32
+//   mulhilo64
+// These functions will be visible to user code, and may
+// also be used later in subsequent templates and definitions.
+
+// A template for mulhilo using a temporary of twice the word-width.
+// Gcc figures out that this can be reduced to a single 'mul' instruction,
+// despite the apparent use of double-wide variables, shifts, etc.  It's
+// obviously not guaranteed that all compilers will be that smart, so
+// other implementations might be preferable, e.g., using an intrinsic
+// or an asm block.  On the other hand, for 32-bit multiplies,
+// this *is* perfectly standard C99 - any C99 compiler should 
+// understand it and produce correct code.  For 64-bit multiplies,
+// it's only usable if the compiler recognizes that it can do
+// arithmetic on a 128-bit type.  That happens to be true for gcc on
+// x86-64, and powerpc64 but not much else.
+*/
+#define _mulhilo_dword_tpl(W, Word, Dword)                              \
+R123_CUDA_DEVICE R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word* hip){ \
+    Dword product = ((Dword)a)*((Dword)b);                              \
+    *hip = product>>W;                                                  \
+    return (Word)product;                                               \
+}
+
+/*
+// A template for mulhilo using gnu-style asm syntax.
+// INSN can be "mulw", "mull" or "mulq".  
+// FIXME - porting to other architectures, we'll need still-more conditional
+// branching here.  Note that intrinsics are usually preferable.
+*/
+#ifdef __powerpc__
+#define _mulhilo_asm_tpl(W, Word, INSN)                         \
+R123_STATIC_INLINE Word mulhilo##W(Word ax, Word b, Word *hip){ \
+    Word dx = 0;                                                \
+    __asm__("\n\t"                                              \
+        INSN " %0,%1,%2\n\t"                                    \
+        : "=r"(dx)                                              \
+        : "r"(b), "r"(ax)                                       \
+        );                                                      \
+    *hip = dx;                                                  \
+    return ax*b;                                                \
+}
+#else
+#define _mulhilo_asm_tpl(W, Word, INSN)                         \
+R123_STATIC_INLINE Word mulhilo##W(Word ax, Word b, Word *hip){      \
+    Word dx;                                                    \
+    __asm__("\n\t"                                              \
+        INSN " %2\n\t"                                          \
+        : "=a"(ax), "=d"(dx)                                    \
+        : "r"(b), "0"(ax)                                       \
+        );                                                      \
+    *hip = dx;                                                  \
+    return ax;                                                  \
+}
+#endif /* __powerpc__ */
+
+/*
+// A template for mulhilo using MSVC-style intrinsics
+// For example,_umul128 is an msvc intrinsic, c.f.
+// http://msdn.microsoft.com/en-us/library/3dayytw9.aspx
+*/
+#define _mulhilo_msvc_intrin_tpl(W, Word, INTRIN)               \
+R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word* hip){       \
+    return INTRIN(a, b, hip);                                   \
+}
+
+/* N.B.  This really should be called _mulhilo_mulhi_intrin.  It just
+   happens that CUDA was the first time we used the idiom. */
+#define _mulhilo_cuda_intrin_tpl(W, Word, INTRIN)                       \
+R123_CUDA_DEVICE R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word* hip){ \
+    *hip = INTRIN(a, b);                                                \
+    return a*b;                                                         \
+}
+
+/*
+// A template for mulhilo using only word-size operations and
+// C99 operators (no adc, no mulhi).  It
+// requires four multiplies and a dozen or so shifts, adds
+// and tests.  It's not clear what this is good for, other than
+// completeness.  On 32-bit platforms, it could be used to
+// implement philoxNx64, but on such platforms both the philoxNx32
+// and the threefryNx64 cbrngs are going to have much better
+// performance.  It is enabled below by R123_USE_MULHILO64_C99,
+// but that is currently (Sep 2011) not set by any of the
+// features/XXfeatures.h headers.  It can, of course, be
+// set with a compile-time -D option.
+*/
+#define _mulhilo_c99_tpl(W, Word) \
+R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word *hip){ \
+    const unsigned WHALF = W/2;                                    \
+    const Word LOMASK = ((((Word)1)<<WHALF)-1);                    \
+    Word lo = a*b;               /* full low multiply */           \
+    Word ahi = a>>WHALF;                                           \
+    Word alo = a& LOMASK;                                          \
+    Word bhi = b>>WHALF;                                           \
+    Word blo = b& LOMASK;                                          \
+                                                                   \
+    Word ahbl = ahi*blo;                                           \
+    Word albh = alo*bhi;                                           \
+                                                                   \
+    Word ahbl_albh = ((ahbl&LOMASK) + (albh&LOMASK));                   \
+    Word hi = ahi*bhi + (ahbl>>WHALF) +  (albh>>WHALF);                 \
+    hi += ahbl_albh >> WHALF; /* carry from the sum of lo(ahbl) + lo(albh) ) */ \
+    /* carry from the sum with alo*blo */                               \
+    hi += ((lo >> WHALF) < (ahbl_albh&LOMASK));                         \
+    *hip = hi;                                                          \
+    return lo;                                                          \
+}
+
+/*
+// A template for mulhilo on a platform that can't do it
+// We could put a C version here, but is it better to run *VERY*
+// slowly or to just stop and force the user to find another CBRNG?
+*/
+#define _mulhilo_fail_tpl(W, Word)                                      \
+R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word *hip){               \
+    R123_STATIC_ASSERT(0, "mulhilo" #W " is not implemented on this machine\n"); \
+}
+
+/*
+// N.B.  There's an MSVC intrinsic called _emul,
+// which *might* compile into better code than
+// _mulhilo_dword_tpl 
+*/
+#if R123_USE_MULHILO32_ASM
+#ifdef __powerpc__
+_mulhilo_asm_tpl(32, uint32_t, "mulhwu")
+#else
+_mulhilo_asm_tpl(32, uint32_t, "mull")
+#endif /* __powerpc__ */
+#else
+_mulhilo_dword_tpl(32, uint32_t, uint64_t)
+#endif
+
+#if R123_USE_PHILOX_64BIT
+#if R123_USE_MULHILO64_ASM
+#ifdef __powerpc64__
+_mulhilo_asm_tpl(64, uint64_t, "mulhdu")
+#else
+_mulhilo_asm_tpl(64, uint64_t, "mulq")
+#endif /* __powerpc64__ */
+#elif R123_USE_MULHILO64_MSVC_INTRIN
+_mulhilo_msvc_intrin_tpl(64, uint64_t, _umul128)
+#elif R123_USE_MULHILO64_CUDA_INTRIN
+_mulhilo_cuda_intrin_tpl(64, uint64_t, __umul64hi)
+#elif R123_USE_MULHILO64_OPENCL_INTRIN
+_mulhilo_cuda_intrin_tpl(64, uint64_t, mul_hi)
+#elif R123_USE_MULHILO64_MULHI_INTRIN
+_mulhilo_cuda_intrin_tpl(64, uint64_t, R123_MULHILO64_MULHI_INTRIN)
+#elif R123_USE_GNU_UINT128
+_mulhilo_dword_tpl(64, uint64_t, __uint128_t)
+#elif R123_USE_MULHILO64_C99
+_mulhilo_c99_tpl(64, uint64_t)
+#else
+_mulhilo_fail_tpl(64, uint64_t)
+#endif
+#endif
+
+/*
+// The multipliers and Weyl constants are "hard coded".
+// To change them, you can #define them with different
+// values before #include-ing this file. 
+// This isn't terribly elegant, but it works for C as
+// well as C++.  A nice C++-only solution would be to
+// use template parameters in the style of <random>
+*/
+#ifndef PHILOX_M2x64_0
+#define PHILOX_M2x64_0 R123_64BIT(0xD2B74407B1CE6E93)
+#endif
+
+#ifndef PHILOX_M4x64_0
+#define PHILOX_M4x64_0 R123_64BIT(0xD2E7470EE14C6C93)
+#endif
+
+#ifndef PHILOX_M4x64_1
+#define PHILOX_M4x64_1 R123_64BIT(0xCA5A826395121157)
+#endif
+
+#ifndef PHILOX_M2x32_0
+#define PHILOX_M2x32_0 ((uint32_t)0xd256d193)
+#endif
+
+#ifndef PHILOX_M4x32_0
+#define PHILOX_M4x32_0 ((uint32_t)0xD2511F53)
+#endif
+#ifndef PHILOX_M4x32_1
+#define PHILOX_M4x32_1 ((uint32_t)0xCD9E8D57)
+#endif
+
+#ifndef PHILOX_W64_0
+#define PHILOX_W64_0 R123_64BIT(0x9E3779B97F4A7C15)  /* golden ratio */
+#endif
+#ifndef PHILOX_W64_1
+#define PHILOX_W64_1 R123_64BIT(0xBB67AE8584CAA73B)  /* sqrt(3)-1 */
+#endif
+
+#ifndef PHILOX_W32_0
+#define PHILOX_W32_0 ((uint32_t)0x9E3779B9)
+#endif
+#ifndef PHILOX_W32_1
+#define PHILOX_W32_1 ((uint32_t)0xBB67AE85)
+#endif
+
+#ifndef PHILOX2x32_DEFAULT_ROUNDS
+#define PHILOX2x32_DEFAULT_ROUNDS 10
+#endif
+
+#ifndef PHILOX2x64_DEFAULT_ROUNDS
+#define PHILOX2x64_DEFAULT_ROUNDS 10
+#endif
+
+#ifndef PHILOX4x32_DEFAULT_ROUNDS
+#define PHILOX4x32_DEFAULT_ROUNDS 10
+#endif
+
+#ifndef PHILOX4x64_DEFAULT_ROUNDS
+#define PHILOX4x64_DEFAULT_ROUNDS 10
+#endif
+
+/* The ignored fourth argument allows us to instantiate the
+   same macro regardless of N. */
+#define _philox2xWround_tpl(W, T)                                       \
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(struct r123array2x##W _philox2x##W##round(struct r123array2x##W ctr, struct r123array1x##W key)); \
+R123_CUDA_DEVICE R123_STATIC_INLINE struct r123array2x##W _philox2x##W##round(struct r123array2x##W ctr, struct r123array1x##W key){ \
+    T hi;                                                               \
+    T lo = mulhilo##W(PHILOX_M2x##W##_0, ctr.v[0], &hi);                \
+    struct r123array2x##W out = {{hi^key.v[0]^ctr.v[1], lo}};               \
+    return out;                                                         \
+}
+#define _philox2xWbumpkey_tpl(W)                                        \
+R123_CUDA_DEVICE R123_STATIC_INLINE struct r123array1x##W _philox2x##W##bumpkey( struct r123array1x##W key) { \
+    key.v[0] += PHILOX_W##W##_0;                                        \
+    return key;                                                         \
+}
+
+#define _philox4xWround_tpl(W, T)                                       \
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(struct r123array4x##W _philox4x##W##round(struct r123array4x##W ctr, struct r123array2x##W key)); \
+R123_CUDA_DEVICE R123_STATIC_INLINE struct r123array4x##W _philox4x##W##round(struct r123array4x##W ctr, struct r123array2x##W key){ \
+    T hi0;                                                              \
+    T hi1;                                                              \
+    T lo0 = mulhilo##W(PHILOX_M4x##W##_0, ctr.v[0], &hi0);              \
+    T lo1 = mulhilo##W(PHILOX_M4x##W##_1, ctr.v[2], &hi1);              \
+    struct r123array4x##W out = {{hi1^ctr.v[1]^key.v[0], lo1,               \
+                              hi0^ctr.v[3]^key.v[1], lo0}};             \
+    return out;                                                         \
+}
+
+#define _philox4xWbumpkey_tpl(W)                                        \
+R123_CUDA_DEVICE R123_STATIC_INLINE struct r123array2x##W _philox4x##W##bumpkey( struct r123array2x##W key) { \
+    key.v[0] += PHILOX_W##W##_0;                                        \
+    key.v[1] += PHILOX_W##W##_1;                                        \
+    return key;                                                         \
+}
+
+#define _philoxNxW_tpl(N, Nhalf, W, T)                         \
+/** @ingroup PhiloxNxW */                                       \
+enum r123_enum_philox##N##x##W { philox##N##x##W##_rounds = PHILOX##N##x##W##_DEFAULT_ROUNDS }; \
+typedef struct r123array##N##x##W philox##N##x##W##_ctr_t;                  \
+typedef struct r123array##Nhalf##x##W philox##N##x##W##_key_t;              \
+typedef struct r123array##Nhalf##x##W philox##N##x##W##_ukey_t;              \
+R123_CUDA_DEVICE R123_STATIC_INLINE philox##N##x##W##_key_t philox##N##x##W##keyinit(philox##N##x##W##_ukey_t uk) { return uk; } \
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(philox##N##x##W##_ctr_t philox##N##x##W##_R(unsigned int R, philox##N##x##W##_ctr_t ctr, philox##N##x##W##_key_t key)); \
+R123_CUDA_DEVICE R123_STATIC_INLINE philox##N##x##W##_ctr_t philox##N##x##W##_R(unsigned int R, philox##N##x##W##_ctr_t ctr, philox##N##x##W##_key_t key) { \
+    R123_ASSERT(R<=16);                                                 \
+    if(R>0){                                       ctr = _philox##N##x##W##round(ctr, key); } \
+    if(R>1){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+    if(R>2){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+    if(R>3){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+    if(R>4){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+    if(R>5){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+    if(R>6){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+    if(R>7){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+    if(R>8){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+    if(R>9){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+    if(R>10){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+    if(R>11){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+    if(R>12){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+    if(R>13){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+    if(R>14){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+    if(R>15){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+    return ctr;                                                         \
+}
+         
+_philox2xWbumpkey_tpl(32)
+_philox4xWbumpkey_tpl(32)
+_philox2xWround_tpl(32, uint32_t) /* philo2x32round */
+_philox4xWround_tpl(32, uint32_t)            /* philo4x32round */
+/** \endcond */
+_philoxNxW_tpl(2, 1, 32, uint32_t)    /* philox2x32bijection */
+_philoxNxW_tpl(4, 2, 32, uint32_t)    /* philox4x32bijection */
+#if R123_USE_PHILOX_64BIT
+/** \cond HIDDEN_FROM_DOXYGEN */
+_philox2xWbumpkey_tpl(64)
+_philox4xWbumpkey_tpl(64)
+_philox2xWround_tpl(64, uint64_t) /* philo2x64round */
+_philox4xWround_tpl(64, uint64_t) /* philo4x64round */
+/** \endcond */
+_philoxNxW_tpl(2, 1, 64, uint64_t)    /* philox2x64bijection */
+_philoxNxW_tpl(4, 2, 64, uint64_t)    /* philox4x64bijection */
+#endif /* R123_USE_PHILOX_64BIT */
+
+#define philox2x32(c,k) philox2x32_R(philox2x32_rounds, c, k)
+#define philox4x32(c,k) philox4x32_R(philox4x32_rounds, c, k)
+#if R123_USE_PHILOX_64BIT
+#define philox2x64(c,k) philox2x64_R(philox2x64_rounds, c, k)
+#define philox4x64(c,k) philox4x64_R(philox4x64_rounds, c, k)
+#endif /* R123_USE_PHILOX_64BIT */
+
+#ifdef __cplusplus
+#include <stdexcept>
+
+/** \cond HIDDEN_FROM_DOXYGEN */
+
+#define _PhiloxNxW_base_tpl(CType, KType, N, W)                         \
+namespace r123{                                                          \
+template<unsigned int ROUNDS>                                             \
+struct Philox##N##x##W##_R{                                             \
+    typedef CType ctr_type;                                         \
+    typedef KType key_type;                                             \
+    typedef KType ukey_type;                                         \
+    static const unsigned int rounds=ROUNDS;                                 \
+    inline R123_CUDA_DEVICE R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key) const){ \
+        R123_STATIC_ASSERT(ROUNDS<=16, "philox is only unrolled up to 16 rounds\n"); \
+        return philox##N##x##W##_R(ROUNDS, ctr, key);                       \
+    }                                                                   \
+};                                                                      \
+typedef Philox##N##x##W##_R<philox##N##x##W##_rounds> Philox##N##x##W; \
+ } // namespace r123
+/** \endcond */
+
+_PhiloxNxW_base_tpl(r123array2x32, r123array1x32, 2, 32) // Philox2x32_R<R>
+_PhiloxNxW_base_tpl(r123array4x32, r123array2x32, 4, 32) // Philox4x32_R<R>
+#if R123_USE_PHILOX_64BIT
+_PhiloxNxW_base_tpl(r123array2x64, r123array1x64, 2, 64) // Philox2x64_R<R>
+_PhiloxNxW_base_tpl(r123array4x64, r123array2x64, 4, 64) // Philox4x64_R<R>
+#endif
+
+/* The _tpl macros don't quite work to do string-pasting inside comments.
+   so we just write out the boilerplate documentation four times... */
+
+/** 
+ at defgroup PhiloxNxW Philox Classes and Typedefs
+
+The PhiloxNxW classes export the member functions, typedefs and
+operator overloads required by a @ref CBRNG "CBRNG" class.
+
+As described in  
+<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers:  As Easy as 1, 2, 3</i> </a>.
+The Philox family of counter-based RNGs use integer multiplication, xor and permutation of W-bit words
+to scramble its N-word input key.  Philox is a mnemonic for Product HI LO Xor).
+
+
+ at class r123::Philox2x32_R 
+ at ingroup PhiloxNxW
+
+exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class.
+
+The template argument, ROUNDS, is the number of times the Philox round
+function will be applied.
+
+As of November 2011, the authors know of no statistical flaws with
+ROUNDS=6 or more for Philox2x32.
+
+ at typedef r123::Philox2x32
+ at ingroup PhiloxNxW
+  Philox2x32 is equivalent to Philox2x32_R<10>.    With 10 rounds,
+  Philox2x32 has a considerable safety margin over the minimum number
+  of rounds with no known statistical flaws, but still has excellent
+   performance. 
+
+
+
+ at class r123::Philox2x64_R 
+ at ingroup PhiloxNxW
+
+exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class.
+
+The template argument, ROUNDS, is the number of times the Philox round
+function will be applied.
+
+As of September 2011, the authors know of no statistical flaws with
+ROUNDS=6 or more for Philox2x64.
+
+ at typedef r123::Philox2x64
+ at ingroup PhiloxNxW
+  Philox2x64 is equivalent to Philox2x64_R<10>.    With 10 rounds,
+  Philox2x64 has a considerable safety margin over the minimum number
+  of rounds with no known statistical flaws, but still has excellent
+   performance. 
+
+
+
+ at class r123::Philox4x32_R 
+ at ingroup PhiloxNxW
+
+exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class.
+
+The template argument, ROUNDS, is the number of times the Philox round
+function will be applied.
+
+In November 2011, the authors recorded some suspicious p-values (approximately 1.e-7) from
+some very long (longer than the default BigCrush length) SimpPoker tests.  Despite
+the fact that even longer tests reverted to "passing" p-values, a cloud remains over
+Philox4x32 with 7 rounds.  The authors know of no statistical flaws with
+ROUNDS=8 or more for Philox4x32.
+
+ at typedef r123::Philox4x32
+ at ingroup PhiloxNxW
+  Philox4x32 is equivalent to Philox4x32_R<10>.    With 10 rounds,
+  Philox4x32 has a considerable safety margin over the minimum number
+  of rounds with no known statistical flaws, but still has excellent
+   performance. 
+
+
+
+ at class r123::Philox4x64_R 
+ at ingroup PhiloxNxW
+
+exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class.
+
+The template argument, ROUNDS, is the number of times the Philox round
+function will be applied.
+
+As of September 2011, the authors know of no statistical flaws with
+ROUNDS=7 or more for Philox4x64.
+
+ at typedef r123::Philox4x64
+ at ingroup PhiloxNxW
+  Philox4x64 is equivalent to Philox4x64_R<10>.    With 10 rounds,
+  Philox4x64 has a considerable safety margin over the minimum number
+  of rounds with no known statistical flaws, but still has excellent
+   performance. 
+*/
+
+#endif /* __cplusplus */
+
+#endif /* _philox_dot_h_ */
diff --git a/lib/Random123-1.08/include/Random123/threefry.h b/lib/Random123-1.08/include/Random123/threefry.h
new file mode 100644
index 0000000..da2de97
--- /dev/null
+++ b/lib/Random123-1.08/include/Random123/threefry.h
@@ -0,0 +1,864 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions, and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef _threefry_dot_h_
+#define _threefry_dot_h_
+#include "features/compilerfeatures.h"
+#include "array.h"
+
+/** \cond HIDDEN_FROM_DOXYGEN */
+/* Significant parts of this file were copied from
+   from:
+      Skein_FinalRnd/ReferenceImplementation/skein.h
+      Skein_FinalRnd/ReferenceImplementation/skein_block.c
+
+   in http://csrc.nist.gov/groups/ST/hash/sha-3/Round3/documents/Skein_FinalRnd.zip
+
+   This file has been modified so that it may no longer perform its originally
+   intended function.  If you're looking for a Skein or Threefish source code,
+   please consult the original file.
+
+   The original file had the following header:
+**************************************************************************
+**
+** Interface declarations and internal definitions for Skein hashing.
+**
+** Source code author: Doug Whiting, 2008.
+**
+** This algorithm and source code is released to the public domain.
+**
+***************************************************************************
+
+*/
+
+/* See comment at the top of philox.h for the macro pre-process
+   strategy. */
+
+/* Rotation constants: */
+enum r123_enum_threefry64x4 {
+    /* These are the R_256 constants from the Threefish reference sources
+       with names changed to R_64x4... */
+    R_64x4_0_0=14, R_64x4_0_1=16,
+    R_64x4_1_0=52, R_64x4_1_1=57,
+    R_64x4_2_0=23, R_64x4_2_1=40,
+    R_64x4_3_0= 5, R_64x4_3_1=37,
+    R_64x4_4_0=25, R_64x4_4_1=33,
+    R_64x4_5_0=46, R_64x4_5_1=12,
+    R_64x4_6_0=58, R_64x4_6_1=22,
+    R_64x4_7_0=32, R_64x4_7_1=32
+};
+
+enum r123_enum_threefry64x2 {
+    /*
+    // Output from skein_rot_search: (srs64_B64-X1000)
+    // Random seed = 1. BlockSize = 128 bits. sampleCnt =  1024. rounds =  8, minHW_or=57
+    // Start: Tue Mar  1 10:07:48 2011
+    // rMin = 0.136. #0325[*15] [CRC=455A682F. hw_OR=64. cnt=16384. blkSize= 128].format   
+    */
+    R_64x2_0_0=16,
+    R_64x2_1_0=42,
+    R_64x2_2_0=12,
+    R_64x2_3_0=31,
+    R_64x2_4_0=16,
+    R_64x2_5_0=32,
+    R_64x2_6_0=24,
+    R_64x2_7_0=21
+    /* 4 rounds: minHW =  4  [  4  4  4  4 ]
+    // 5 rounds: minHW =  8  [  8  8  8  8 ]
+    // 6 rounds: minHW = 16  [ 16 16 16 16 ]
+    // 7 rounds: minHW = 32  [ 32 32 32 32 ]
+    // 8 rounds: minHW = 64  [ 64 64 64 64 ]
+    // 9 rounds: minHW = 64  [ 64 64 64 64 ]
+    //10 rounds: minHW = 64  [ 64 64 64 64 ]
+    //11 rounds: minHW = 64  [ 64 64 64 64 ] */
+};
+
+enum r123_enum_threefry32x4 {
+    /* Output from skein_rot_search: (srs-B128-X5000.out)
+    // Random seed = 1. BlockSize = 64 bits. sampleCnt =  1024. rounds =  8, minHW_or=28
+    // Start: Mon Aug 24 22:41:36 2009
+    // ...
+    // rMin = 0.472. #0A4B[*33] [CRC=DD1ECE0F. hw_OR=31. cnt=16384. blkSize= 128].format    */
+    R_32x4_0_0=10, R_32x4_0_1=26,
+    R_32x4_1_0=11, R_32x4_1_1=21,
+    R_32x4_2_0=13, R_32x4_2_1=27,
+    R_32x4_3_0=23, R_32x4_3_1= 5,
+    R_32x4_4_0= 6, R_32x4_4_1=20,
+    R_32x4_5_0=17, R_32x4_5_1=11,
+    R_32x4_6_0=25, R_32x4_6_1=10,
+    R_32x4_7_0=18, R_32x4_7_1=20
+
+    /* 4 rounds: minHW =  3  [  3  3  3  3 ]
+    // 5 rounds: minHW =  7  [  7  7  7  7 ]
+    // 6 rounds: minHW = 12  [ 13 12 13 12 ]
+    // 7 rounds: minHW = 22  [ 22 23 22 23 ]
+    // 8 rounds: minHW = 31  [ 31 31 31 31 ]
+    // 9 rounds: minHW = 32  [ 32 32 32 32 ]
+    //10 rounds: minHW = 32  [ 32 32 32 32 ]
+    //11 rounds: minHW = 32  [ 32 32 32 32 ] */
+
+};
+
+enum r123_enum_threefry32x2 {
+    /* Output from skein_rot_search (srs32x2-X5000.out)
+    // Random seed = 1. BlockSize = 64 bits. sampleCnt =  1024. rounds =  8, minHW_or=28
+    // Start: Tue Jul 12 11:11:33 2011
+    // rMin = 0.334. #0206[*07] [CRC=1D9765C0. hw_OR=32. cnt=16384. blkSize=  64].format   */
+    R_32x2_0_0=13,
+    R_32x2_1_0=15,
+    R_32x2_2_0=26,
+    R_32x2_3_0= 6,
+    R_32x2_4_0=17,
+    R_32x2_5_0=29,
+    R_32x2_6_0=16,
+    R_32x2_7_0=24
+
+    /* 4 rounds: minHW =  4  [  4  4  4  4 ]
+    // 5 rounds: minHW =  6  [  6  8  6  8 ]
+    // 6 rounds: minHW =  9  [  9 12  9 12 ]
+    // 7 rounds: minHW = 16  [ 16 24 16 24 ]
+    // 8 rounds: minHW = 32  [ 32 32 32 32 ]
+    // 9 rounds: minHW = 32  [ 32 32 32 32 ]
+    //10 rounds: minHW = 32  [ 32 32 32 32 ]
+    //11 rounds: minHW = 32  [ 32 32 32 32 ] */
+    };
+
+enum r123_enum_threefry_wcnt {
+    WCNT2=2,
+    WCNT4=4
+};
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(uint64_t RotL_64(uint64_t x, unsigned int N));
+R123_CUDA_DEVICE R123_STATIC_INLINE uint64_t RotL_64(uint64_t x, unsigned int N)
+{
+    return (x << (N & 63)) | (x >> ((64-N) & 63));
+}
+    
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(uint32_t RotL_32(uint32_t x, unsigned int N));
+R123_CUDA_DEVICE R123_STATIC_INLINE uint32_t RotL_32(uint32_t x, unsigned int N)
+{
+    return (x << (N & 31)) | (x >> ((32-N) & 31));
+}
+
+#define SKEIN_MK_64(hi32,lo32)  ((lo32) + (((uint64_t) (hi32)) << 32))
+#define SKEIN_KS_PARITY64         SKEIN_MK_64(0x1BD11BDA,0xA9FC1A22)
+#define SKEIN_KS_PARITY32         0x1BD11BDA
+
+#ifndef THREEFRY2x32_DEFAULT_ROUNDS
+#define THREEFRY2x32_DEFAULT_ROUNDS 20
+#endif
+
+#ifndef THREEFRY2x64_DEFAULT_ROUNDS
+#define THREEFRY2x64_DEFAULT_ROUNDS 20
+#endif
+
+#ifndef THREEFRY4x32_DEFAULT_ROUNDS
+#define THREEFRY4x32_DEFAULT_ROUNDS 20
+#endif
+
+#ifndef THREEFRY4x64_DEFAULT_ROUNDS
+#define THREEFRY4x64_DEFAULT_ROUNDS 20
+#endif
+
+#define _threefry2x_tpl(W)                                              \
+typedef struct r123array2x##W threefry2x##W##_ctr_t;                          \
+typedef struct r123array2x##W threefry2x##W##_key_t;                          \
+typedef struct r123array2x##W threefry2x##W##_ukey_t;                          \
+R123_CUDA_DEVICE R123_STATIC_INLINE threefry2x##W##_key_t threefry2x##W##keyinit(threefry2x##W##_ukey_t uk) { return uk; } \
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(threefry2x##W##_ctr_t threefry2x##W##_R(unsigned int Nrounds, threefry2x##W##_ctr_t in, threefry2x##W##_key_t k)); \
+R123_CUDA_DEVICE R123_STATIC_INLINE                                          \
+threefry2x##W##_ctr_t threefry2x##W##_R(unsigned int Nrounds, threefry2x##W##_ctr_t in, threefry2x##W##_key_t k){ \
+    threefry2x##W##_ctr_t X;                                              \
+    uint##W##_t ks[2+1];                                          \
+    int  i; /* avoid size_t to avoid need for stddef.h */                   \
+    R123_ASSERT(Nrounds<=32);                                           \
+    ks[2] =  SKEIN_KS_PARITY##W;                                   \
+    for (i=0;i < 2; i++)                                        \
+        {                                                               \
+            ks[i] = k.v[i];                                             \
+            X.v[i]  = in.v[i];                                          \
+            ks[2] ^= k.v[i];                                    \
+        }                                                               \
+                                                                        \
+    /* Insert initial key before round 0 */                             \
+    X.v[0] += ks[0]; X.v[1] += ks[1];                                   \
+                                                                        \
+    if(Nrounds>0){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_0_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>1){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_1_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>2){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_2_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>3){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_3_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>3){                                                      \
+        /* InjectKey(r=1) */                                            \
+        X.v[0] += ks[1]; X.v[1] += ks[2];                               \
+        X.v[1] += 1;     /* X.v[2-1] += r  */                   \
+    }                                                                   \
+    if(Nrounds>4){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_4_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>5){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_5_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>6){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_6_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>7){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_7_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>7){                                                      \
+        /* InjectKey(r=2) */                                            \
+        X.v[0] += ks[2]; X.v[1] += ks[0];                               \
+        X.v[1] += 2;                                                    \
+    }                                                                   \
+    if(Nrounds>8){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_0_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>9){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_1_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>10){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_2_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>11){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_3_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>11){                                                     \
+        /* InjectKey(r=3) */                                            \
+        X.v[0] += ks[0]; X.v[1] += ks[1];                               \
+        X.v[1] += 3;                                                    \
+    }                                                                   \
+    if(Nrounds>12){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_4_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>13){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_5_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>14){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_6_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>15){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_7_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>15){                                                     \
+        /* InjectKey(r=4) */                                            \
+        X.v[0] += ks[1]; X.v[1] += ks[2];                               \
+        X.v[1] += 4;                                                    \
+    }                                                                   \
+    if(Nrounds>16){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_0_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>17){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_1_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>18){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_2_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>19){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_3_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>19){                                                     \
+        /* InjectKey(r=5) */                                            \
+        X.v[0] += ks[2]; X.v[1] += ks[0];                               \
+        X.v[1] += 5;                                                    \
+    }                                                                   \
+    if(Nrounds>20){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_4_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>21){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_5_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>22){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_6_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>23){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_7_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>23){                                                     \
+        /* InjectKey(r=6) */                                            \
+        X.v[0] += ks[0]; X.v[1] += ks[1];                               \
+        X.v[1] += 6;                                                    \
+    }                                                                   \
+    if(Nrounds>24){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_0_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>25){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_1_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>26){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_2_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>27){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_3_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>27){                                                     \
+        /* InjectKey(r=7) */                                            \
+        X.v[0] += ks[1]; X.v[1] += ks[2];                               \
+        X.v[1] += 7;                                                    \
+    }                                                                   \
+    if(Nrounds>28){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_4_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>29){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_5_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>30){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_6_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>31){  X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_7_0); X.v[1] ^= X.v[0]; } \
+    if(Nrounds>31){                                                     \
+        /* InjectKey(r=8) */                                            \
+        X.v[0] += ks[2]; X.v[1] += ks[0];                               \
+        X.v[1] += 8;                                                    \
+    }                                                                   \
+    return X;                                                           \
+}                                                                       \
+ /** @ingroup ThreefryNxW */                                            \
+enum r123_enum_threefry2x##W { threefry2x##W##_rounds = THREEFRY2x##W##_DEFAULT_ROUNDS };       \
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(threefry2x##W##_ctr_t threefry2x##W(threefry2x##W##_ctr_t in, threefry2x##W##_key_t k)); \
+R123_CUDA_DEVICE R123_STATIC_INLINE                                     \
+threefry2x##W##_ctr_t threefry2x##W(threefry2x##W##_ctr_t in, threefry2x##W##_key_t k){ \
+    return threefry2x##W##_R(threefry2x##W##_rounds, in, k);            \
+}
+
+
+#define _threefry4x_tpl(W)                                              \
+typedef struct r123array4x##W threefry4x##W##_ctr_t;                        \
+typedef struct r123array4x##W threefry4x##W##_key_t;                        \
+typedef struct r123array4x##W threefry4x##W##_ukey_t;                        \
+R123_CUDA_DEVICE R123_STATIC_INLINE threefry4x##W##_key_t threefry4x##W##keyinit(threefry4x##W##_ukey_t uk) { return uk; } \
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(threefry4x##W##_ctr_t threefry4x##W##_R(unsigned int Nrounds, threefry4x##W##_ctr_t in, threefry4x##W##_key_t k)); \
+R123_CUDA_DEVICE R123_STATIC_INLINE                                          \
+threefry4x##W##_ctr_t threefry4x##W##_R(unsigned int Nrounds, threefry4x##W##_ctr_t in, threefry4x##W##_key_t k){ \
+    threefry4x##W##_ctr_t X;                                            \
+    uint##W##_t ks[4+1];                                            \
+    int  i; /* avoid size_t to avoid need for stddef.h */                   \
+    R123_ASSERT(Nrounds<=72);                                           \
+    ks[4] =  SKEIN_KS_PARITY##W;                                    \
+    for (i=0;i < 4; i++)                                            \
+        {                                                               \
+            ks[i] = k.v[i];                                             \
+            X.v[i]  = in.v[i];                                          \
+            ks[4] ^= k.v[i];                                        \
+        }                                                               \
+                                                                        \
+    /* Insert initial key before round 0 */                             \
+    X.v[0] += ks[0]; X.v[1] += ks[1]; X.v[2] += ks[2]; X.v[3] += ks[3]; \
+                                                                        \
+    if(Nrounds>0){                                                      \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>1){                                                      \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>2){                                                      \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>3){                                                      \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>3){                                                      \
+        /* InjectKey(r=1) */                                            \
+        X.v[0] += ks[1]; X.v[1] += ks[2]; X.v[2] += ks[3]; X.v[3] += ks[4]; \
+        X.v[4-1] += 1;     /* X.v[WCNT4-1] += r  */                 \
+    }                                                                   \
+                                                                        \
+    if(Nrounds>4){                                                      \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>5){                                                      \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>6){                                                      \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>7){                                                      \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>7){                                                      \
+        /* InjectKey(r=2) */                                            \
+        X.v[0] += ks[2]; X.v[1] += ks[3]; X.v[2] += ks[4]; X.v[3] += ks[0]; \
+        X.v[4-1] += 2;     /* X.v[WCNT4-1] += r  */                 \
+    }                                                                   \
+                                                                        \
+    if(Nrounds>8){                                                      \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>9){                                                      \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>10){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>11){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>11){                                                     \
+        /* InjectKey(r=3) */                                            \
+        X.v[0] += ks[3]; X.v[1] += ks[4]; X.v[2] += ks[0]; X.v[3] += ks[1]; \
+        X.v[4-1] += 3;     /* X.v[WCNT4-1] += r  */                 \
+    }                                                                   \
+                                                                        \
+    if(Nrounds>12){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>13){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>14){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>15){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>15){                                                     \
+        /* InjectKey(r=1) */                                            \
+        X.v[0] += ks[4]; X.v[1] += ks[0]; X.v[2] += ks[1]; X.v[3] += ks[2]; \
+        X.v[4-1] += 4;     /* X.v[WCNT4-1] += r  */                 \
+    }                                                                   \
+                                                                        \
+    if(Nrounds>16){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>17){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>18){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>19){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>19){                                                     \
+        /* InjectKey(r=1) */                                            \
+        X.v[0] += ks[0]; X.v[1] += ks[1]; X.v[2] += ks[2]; X.v[3] += ks[3]; \
+        X.v[4-1] += 5;     /* X.v[WCNT4-1] += r  */                 \
+    }                                                                   \
+                                                                        \
+    if(Nrounds>20){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>21){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>22){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>23){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>23){                                                     \
+        /* InjectKey(r=1) */                                            \
+        X.v[0] += ks[1]; X.v[1] += ks[2]; X.v[2] += ks[3]; X.v[3] += ks[4]; \
+        X.v[4-1] += 6;     /* X.v[WCNT4-1] += r  */                 \
+    }                                                                   \
+                                                                        \
+    if(Nrounds>24){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>25){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>26){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>27){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>27){                                                     \
+        /* InjectKey(r=1) */                                            \
+        X.v[0] += ks[2]; X.v[1] += ks[3]; X.v[2] += ks[4]; X.v[3] += ks[0]; \
+        X.v[4-1] += 7;     /* X.v[WCNT4-1] += r  */                 \
+    }                                                                   \
+                                                                        \
+    if(Nrounds>28){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>29){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>30){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>31){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>31){                                                     \
+        /* InjectKey(r=1) */                                            \
+        X.v[0] += ks[3]; X.v[1] += ks[4]; X.v[2] += ks[0]; X.v[3] += ks[1]; \
+        X.v[4-1] += 8;     /* X.v[WCNT4-1] += r  */                 \
+    }                                                                   \
+                                                                        \
+    if(Nrounds>32){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>33){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>34){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>35){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>35){                                                     \
+        /* InjectKey(r=1) */                                            \
+        X.v[0] += ks[4]; X.v[1] += ks[0]; X.v[2] += ks[1]; X.v[3] += ks[2]; \
+        X.v[4-1] += 9;     /* X.v[WCNT4-1] += r  */                 \
+    }                                                                   \
+                                                                        \
+    if(Nrounds>36){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>37){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>38){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>39){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>39){                                                     \
+        /* InjectKey(r=1) */                                            \
+        X.v[0] += ks[0]; X.v[1] += ks[1]; X.v[2] += ks[2]; X.v[3] += ks[3]; \
+        X.v[4-1] += 10;     /* X.v[WCNT4-1] += r  */                 \
+    }                                                                   \
+                                                                        \
+    if(Nrounds>40){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>41){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>42){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>43){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>43){                                                     \
+        /* InjectKey(r=1) */                                            \
+        X.v[0] += ks[1]; X.v[1] += ks[2]; X.v[2] += ks[3]; X.v[3] += ks[4]; \
+        X.v[4-1] += 11;     /* X.v[WCNT4-1] += r  */                \
+    }                                                                   \
+                                                                        \
+    if(Nrounds>44){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>45){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>46){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>47){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>47){                                                     \
+        /* InjectKey(r=1) */                                            \
+        X.v[0] += ks[2]; X.v[1] += ks[3]; X.v[2] += ks[4]; X.v[3] += ks[0]; \
+        X.v[4-1] += 12;     /* X.v[WCNT4-1] += r  */                 \
+    }                                                                   \
+                                                                        \
+    if(Nrounds>48){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>49){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>50){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>51){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>51){                                                     \
+        /* InjectKey(r=1) */                                            \
+        X.v[0] += ks[3]; X.v[1] += ks[4]; X.v[2] += ks[0]; X.v[3] += ks[1]; \
+        X.v[4-1] += 13;     /* X.v[WCNT4-1] += r  */                 \
+    }                                                                   \
+                                                                        \
+    if(Nrounds>52){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>53){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>54){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>55){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>55){                                                     \
+        /* InjectKey(r=1) */                                            \
+        X.v[0] += ks[4]; X.v[1] += ks[0]; X.v[2] += ks[1]; X.v[3] += ks[2]; \
+        X.v[4-1] += 14;     /* X.v[WCNT4-1] += r  */                 \
+    }                                                                   \
+                                                                        \
+    if(Nrounds>56){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>57){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>58){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>59){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>59){                                                     \
+        /* InjectKey(r=1) */                                            \
+        X.v[0] += ks[0]; X.v[1] += ks[1]; X.v[2] += ks[2]; X.v[3] += ks[3]; \
+        X.v[4-1] += 15;     /* X.v[WCNT4-1] += r  */                 \
+    }                                                                   \
+                                                                        \
+    if(Nrounds>60){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>61){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>62){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>63){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>63){                                                     \
+        /* InjectKey(r=1) */                                            \
+        X.v[0] += ks[1]; X.v[1] += ks[2]; X.v[2] += ks[3]; X.v[3] += ks[4]; \
+        X.v[4-1] += 16;     /* X.v[WCNT4-1] += r  */                 \
+    }                                                                   \
+                                                                        \
+    if(Nrounds>64){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>65){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>66){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>67){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>67){                                                     \
+        /* InjectKey(r=1) */                                            \
+        X.v[0] += ks[2]; X.v[1] += ks[3]; X.v[2] += ks[4]; X.v[3] += ks[0]; \
+        X.v[4-1] += 17;     /* X.v[WCNT4-1] += r  */                 \
+    }                                                                   \
+                                                                        \
+    if(Nrounds>68){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>69){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>70){                                                     \
+        X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \
+        X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>71){                                                     \
+        X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \
+        X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \
+    }                                                                   \
+    if(Nrounds>71){                                                     \
+        /* InjectKey(r=1) */                                            \
+        X.v[0] += ks[3]; X.v[1] += ks[4]; X.v[2] += ks[0]; X.v[3] += ks[1]; \
+        X.v[4-1] += 18;     /* X.v[WCNT4-1] += r  */                 \
+    }                                                                   \
+                                                                        \
+    return X;                                                           \
+}                                                                       \
+ /** @ingroup ThreefryNxW */                                            \
+enum r123_enum_threefry4x##W { threefry4x##W##_rounds = THREEFRY4x##W##_DEFAULT_ROUNDS };       \
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(threefry4x##W##_ctr_t threefry4x##W(threefry4x##W##_ctr_t in, threefry4x##W##_key_t k)); \
+R123_CUDA_DEVICE R123_STATIC_INLINE                                     \
+threefry4x##W##_ctr_t threefry4x##W(threefry4x##W##_ctr_t in, threefry4x##W##_key_t k){ \
+    return threefry4x##W##_R(threefry4x##W##_rounds, in, k);            \
+}
+/** \endcond */
+
+_threefry2x_tpl(64)
+_threefry2x_tpl(32)
+_threefry4x_tpl(64)
+_threefry4x_tpl(32)
+
+/* gcc4.5 and 4.6 seem to optimize a macro-ized threefryNxW better
+   than a static inline function.  Why?  */
+#define threefry2x32(c,k) threefry2x32_R(threefry2x32_rounds, c, k)
+#define threefry4x32(c,k) threefry4x32_R(threefry4x32_rounds, c, k)
+#define threefry2x64(c,k) threefry2x64_R(threefry2x64_rounds, c, k)
+#define threefry4x64(c,k) threefry4x64_R(threefry4x64_rounds, c, k)
+
+#ifdef __cplusplus
+/** \cond HIDDEN_FROM_DOXYGEN */
+#define _threefryNxWclass_tpl(NxW)                                      \
+namespace r123{                                                     \
+template<unsigned int R>                                                  \
+ struct Threefry##NxW##_R{                                              \
+    typedef threefry##NxW##_ctr_t ctr_type;                             \
+    typedef threefry##NxW##_key_t key_type;                             \
+    typedef threefry##NxW##_key_t ukey_type;                            \
+    static const unsigned int rounds=R;                                 \
+   inline R123_CUDA_DEVICE R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key)){ \
+        R123_STATIC_ASSERT(R<=72, "threefry is only unrolled up to 72 rounds\n"); \
+        return threefry##NxW##_R(R, ctr, key);                              \
+    }                                                                   \
+};                                                                      \
+ typedef Threefry##NxW##_R<threefry##NxW##_rounds> Threefry##NxW;       \
+} // namespace r123
+
+/** \endcond */
+
+_threefryNxWclass_tpl(2x32)
+_threefryNxWclass_tpl(4x32)
+_threefryNxWclass_tpl(2x64)
+_threefryNxWclass_tpl(4x64)
+
+/* The _tpl macros don't quite work to do string-pasting inside comments.
+   so we just write out the boilerplate documentation four times... */
+
+/** 
+ at defgroup ThreefryNxW Threefry Classes and Typedefs
+
+The ThreefryNxW classes export the member functions, typedefs and
+operator overloads required by a @ref CBRNG "CBRNG" class.
+
+As described in  
+<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers:  As Easy as 1, 2, 3</i> </a>, 
+the Threefry family is closely related to the Threefish block cipher from
+<a href="http://www.skein-hash.info/"> Skein Hash Function</a>.  
+Threefry is \b not suitable for cryptographic use.
+
+Threefry uses integer addition, bitwise rotation, xor and permutation of words to randomize its output.
+
+ at class r123::Threefry2x32_R 
+ at ingroup ThreefryNxW
+
+exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class.
+
+The template argument, ROUNDS, is the number of times the Threefry round
+function will be applied.
+
+As of September 2011, the authors know of no statistical flaws with
+ROUNDS=13 or more for Threefry2x32.
+
+ at typedef r123::Threefry2x32
+ at ingroup ThreefryNxW
+  Threefry2x32 is equivalent to Threefry2x32_R<20>.    With 20 rounds,
+  Threefry2x32 has a considerable safety margin over the minimum number
+  of rounds with no known statistical flaws, but still has excellent
+   performance. 
+
+ at class r123::Threefry2x64_R 
+ at ingroup ThreefryNxW
+
+exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class.
+
+The template argument, ROUNDS, is the number of times the Threefry round
+function will be applied.
+
+In November 2011, the authors discovered that 13 rounds of
+Threefry2x64 sequenced by strided, interleaved key and counter
+increments failed a very long (longer than the default BigCrush
+length) WeightDistrub test.  At the same time, it was confirmed that
+14 rounds passes much longer tests (up to 5x10^12 samples) of a
+similar nature.  The authors know of no statistical flaws with
+ROUNDS=14 or more for Threefry2x64.
+
+ at typedef r123::Threefry2x64
+ at ingroup ThreefryNxW
+  Threefry2x64 is equivalent to Threefry2x64_R<20>.    With 20 rounds,
+  Threefry2x64 has a considerable safety margin over the minimum number
+  of rounds with no known statistical flaws, but still has excellent
+   performance. 
+
+
+
+ at class r123::Threefry4x32_R 
+ at ingroup ThreefryNxW
+
+exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class.
+
+The template argument, ROUNDS, is the number of times the Threefry round
+function will be applied.
+
+As of September 2011, the authors know of no statistical flaws with
+ROUNDS=12 or more for Threefry4x32.
+
+ at typedef r123::Threefry4x32
+ at ingroup ThreefryNxW
+  Threefry4x32 is equivalent to Threefry4x32_R<20>.    With 20 rounds,
+  Threefry4x32 has a considerable safety margin over the minimum number
+  of rounds with no known statistical flaws, but still has excellent
+   performance. 
+
+
+
+ at class r123::Threefry4x64_R 
+ at ingroup ThreefryNxW
+
+exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class.
+
+The template argument, ROUNDS, is the number of times the Threefry round
+function will be applied.
+
+As of September 2011, the authors know of no statistical flaws with
+ROUNDS=12 or more for Threefry4x64.
+
+ at typedef r123::Threefry4x64
+ at ingroup ThreefryNxW
+  Threefry4x64 is equivalent to Threefry4x64_R<20>.    With 20 rounds,
+  Threefry4x64 has a considerable safety margin over the minimum number
+  of rounds with no known statistical flaws, but still has excellent
+   performance. 
+*/
+
+#endif
+
+#endif
diff --git a/lib/ncl-2.1.18/AUTHORS b/lib/ncl-2.1.18/AUTHORS
new file mode 100644
index 0000000..03791dc
--- /dev/null
+++ b/lib/ncl-2.1.18/AUTHORS
@@ -0,0 +1,32 @@
+NCL AUTHORS -- the author of the NEXUS Class Library (NCL) version 2.0 is
+
+  Paul O. Lewis, Ph.D.
+  Assistant Professor
+  Department of Ecology and Evolutionary Biology
+  The University of Connecticut
+  75 North Eagleville Road, Unit 3043
+  Storrs, CT 06269-3043
+  U.S.A.
+
+  WWW: http://lewis.eeb.uconn.edu/lewishome
+  Email: paul.lewis at uconn.edu
+
+
+Versions after 2.0 contain changes primarily made by:
+  Mark T. Holder  mholder at users.sourceforge.net
+
+Other contributors to these versions include:
+  Derrick Zwickl
+  Brian O'Meara
+  Brandon Chisham
+  Fran�ois Michonneau
+  Jeet Sukumaran
+
+The code in examples/phylobase... was written by Brian O'Meara and Derrick Zwickl
+for phylobase.
+
+David Su�rez Pascal contributed SWIG bindings which heavily influenced those
+   found in branches/v2.2 
+
+Michael Elliot contributed some code to the branches/xml branch.
+
diff --git a/lib/ncl-2.1.18/BSDLicense.txt b/lib/ncl-2.1.18/BSDLicense.txt
new file mode 100644
index 0000000..21ac095
--- /dev/null
+++ b/lib/ncl-2.1.18/BSDLicense.txt
@@ -0,0 +1,24 @@
+Copyright (c) 2003-2012, Paul O. Lewis
+Copyright (c) 2007-2012, Mark T. Holder
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+    Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/lib/ncl-2.1.18/COPYING b/lib/ncl-2.1.18/COPYING
new file mode 100644
index 0000000..960fe74
--- /dev/null
+++ b/lib/ncl-2.1.18/COPYING
@@ -0,0 +1,280 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+

+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+

+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+

+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+

+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
diff --git a/lib/ncl-2.1.18/ChangeLog b/lib/ncl-2.1.18/ChangeLog
new file mode 100644
index 0000000..e69a106
--- /dev/null
+++ b/lib/ncl-2.1.18/ChangeLog
@@ -0,0 +1,380 @@
+ChangeLog for NCL 2.1
+
+================================================================================
+changes in svn versus previous tagged version
+================================================================================
+================================================================================
+2.1.18 (relative to 2.1.17) SVN revision 641
+================================================================================
+	- As of March 09, 2012, NCL is available under a Simplified BSD license (see
+BSDLicense.txt) in addition to the GPL license.
+
+	- improved use of std:: decorator (to improve portability).
+
+	- bug fix in data pattern compression routine when a charset is passed in - this only affects client code that this using NCL to compress data matrices.  
+	
+	- bugfixes for reading newick trees (including a still-hacky fix for dealing with numeric labels that cannot be interpreted as indices)
+
+================================================================================
+2.1.17 (relative to 2.1.16)
+================================================================================
+New features:
+	- Warning suppression (mainly on integer conversion).  Thanks to John 
+		Huelsenbeck!
+	- config.guess updated using  automake v1.11.1 in response to report of user
+		error by DZ.
+	
+
+================================================================================
+release that will be 2.1.16 (relative to 2.1.15)
+================================================================================
+New features:
+	- TaxaAssociation block now supported and treated as a "public" block
+	
+	
+================================================================================
+2.1.15 (relative to 2.1.14)   Revision: 617
+================================================================================
+bug fix: 
+	- NxsReader returns the most-recently read block read by default (as the
+		error message has always indicated) rather than the first block. This
+		only affects blocks without link commands and ambiguous 
+		references to blocks.
+	- typo fixed in error message for invalid fasta file reporting
+	
+New features enhancements:
+	- configure argument --with-reserveid added, so that the variable 
+		name id will not be used. This avoids conflict with the objective C 
+		keyword "id". thanks to John Huelsenbeck for the bug report
+	- non-recursive NxsSimpleNode::AddSelfAndDesToPreorder (for huge trees)
+	- refactored NxsSimpleNode to add RerootAtNode function
+
+================================================================================
+2.1.14 (relative to 2.1.13)   Revision: 611
+================================================================================
+
+Changes breaking backward compatibility with v2.1.13:
+    - None
+    
+    
+API changes:
+    - Moving several functions if optional tree processing from private to public
+    
+    - Changed some of the less-widely used example programs to noinst_PROGRAMS 
+        rather than bin_PROGRAMS so that we are not polluting the /usr/local/bin dir 
+         of every user
+
+New features:
+
+    - NxsTreesBlock::SetTreatAsRootedByDefault(false) can now be called so that 
+    	trees read will be treated as unrooted by default (this setting will be
+	    ignored if the tree is explicitly labeled as rooted via [&R] comment or
+	    unrooted via UTREE command or [&U] comment).
+    - NxsToken::Tokenize static function added (takes a string and returns a vector
+        of tokens.
+    - SetCoerceUnderscoresToSpaces added to MultiFormatReader
+    - GetNumLabelsCurrentlyStored added to NxsLabelToIndicesMapper to help with parsing
+        numeric trees
+    - Added optional treatIntegerLabelsAsNumbers setting to NxsTreesBlock for reading
+        numeric trees
+    - Added some functions for compressing redundant columns of a data matrix (see
+        the new example
+    - More command line flags supported by NCLConvertor, NEXUSnormalizer and gap 
+        code
+
+Bug Fixes:
+    - hasPolytomies field of NxsFullTreeDescription is now set correctly. 
+    - parsing of weight set of assumptions block
+    - configure now fails (as it should) if CXX is not working 
+
+
+
+
+================================================================================
+2.1.13 (relative to 2.1.12)   Revision: 575
+================================================================================
+
+minor API changes:
+	- nxscxxdiscretematrix ctor now takes an optional set of indices to include.
+	- It was convenient to make some of the error reporting functions more 
+		generic, so the NxsException class was given a addPositionInfo method,
+		and some of the characters block code was slightly refactored (to not
+		demand a NxsToken object for some calls).
+	- specified the facet values for the DataTypesEnum so that it will be easier 	
+		for client code written in non-C++ languages to interpret GetDataType()
+
+bug fixes:
+	- fixed strange pointer equality check that had used subtraction (and was
+		causing problems on new windows g++ - v4.2 64bit).
+	- explicitly casting return of size() to an unsigned to avoid g++ issues
+		with the NxsString << operators.
+	- You now must compile with HAVE_NCL_NXSSTRING_ENDL defined if you want the
+		funky NxsString&operator<<(NxsString &(*funcPtr)(NxsString&)) operator.
+	- include of <iterator> for vis studio 2010
+	- Changes to allow compilation in Visual Studio.
+new features:
+	- Added support for the .fin files that are posted by Goloboff et al in
+		their  Cladistics 25 (2009) 211�230 paper.
+	- better error message for too few taxa in characters and unaligned block
+	- bug fix: only affects writing of NEXUS from file formats that do not
+		contain tree names.  Trees were being printed without NEXUS names
+	- validateInternalNodeLabels flag added to NxsTreesBlock. True by default, 
+		but if set to false then the NxsTreesBlock will tolerate trees with
+		internal labels that correspond to integers by storing the label as a
+		string but not interpretting it as a taxon label
+	- another example added: NEXUSsubsetter is not an install product.  It reads 
+		a NEXUS file and a CharSet or TaxSet name
+
+
+
+================================================================================
+2.1.12 (relative to 2.1.09)
+================================================================================
+
+Removal of  trailing whitespace and large scale code reformatting will cause
+	diff to indicate a huge number of changes in this release but the
+	functionality has actually not changed much since 2.1.09
+
+Bug fixes:
+	- added more includes needed by g++ 4.4.01
+	- NxsReader::ClearUsedBlockList is more sensible (it clears more fields).
+	- NxsString no longer includel ncl/ncl.h it now includes ncl/nxsdefs.h
+	- memory leak had been occurring when NxsExceptions were raised from a
+		cloned block and the NxsReader was an ExceptionRaisingNxsReader
+	- nxsdistancedatum.cpp and nxsemptyblock.* removed
+	- block skipping -- now NCL will not be fooled by and end or endblock
+subcommand.
+	- now checks for continuous characters in IsGapState and IsMissing
+
+
+
+
+Library enhancements:
+	- much better documentation of v2.1 features
+	- several convenience functions added especially to assist processing of the
+		NxsCharactersBlock
+	- added a modified version of NCLInterface.h from phylobase as an example.
+		The file was written by Brian O'Meara and Derrick Zwickl
+	- added more flexible, but admittedly hacky method for controlling the level
+		of warnings that get printed out. Altering the warning level will also
+		turn off status messages.  So a bool member was added to NxsReader so
+		that client code can request that status messages still be shown.
+	- added a Free method to Scoped... containers in nxsallocatematrix.h
+	- added hot comments for autogeneration of v2.2 from v2.1 code
+
+================================================================================
+2.1.09 (relative to 2.1.06)
+================================================================================
+Bug fixes:
+	- added includes needed by g++ 4.4.01
+
+================================================================================
+2.1.08 (relative to 2.1.06)
+================================================================================
+Bug fixes:
+	- updated nexml writing to deal with changes in the schema
+	- fixed bug causing mis-indexing of taxa in trees if there is no taxa block
+		but a translate command.  This involves support for illegal nexus files.
+		I believe that the bug would have showed diagnosable pathologies if it
+		had affected any analysis (the highest number in the tree would have
+been
+		1 too high resulting in exceptions when the taxa block was queried).
+	- bug fix when trees are followed by labels that contain tokens that have to
+		be quoted
+	- fixed behavior of GetNamedStateSetOfColumn and GetObsStates so that they
+		are sensitive to the current gapmode for the char block
+	- explicit inclusion of cstdlib where needed
+
+Library enhancements:
+	- Signal handling (via NxsReader::setNCLCatchesSignals ) commit r449
+	- Lots of external format extensions and bug fixes:
+		- converter application added in examples
+		- export to AltNexus
+		- CLUSTAL's .aln reading (not well tested)
+================================================================================
+2.1.06 (relative to 2.1.05)
+================================================================================
+
+Up to svn revision 376
+
+bug fixes (visible to end-users):
+	- opening files in binary mode (failing to do so cause problems with end-of-
+		line and other special characters).
+	- character index (0-based rather than 1-based number) was being printed in
+		some contexts in error messages
+	- Apple g++-4.2 optimization bug now has a workaround
+	- Characters blocks now reject files in which the datatype is DNA, RNA, or
+protein
+		if SYMBOLS are added.
+
+
+bug fixes API:
+	- Fixed setting of NXS_HAS_ALL_TAXA_BIT
+	- no longer duplicating blocks when the same reader is used to read more
+		than one file
+	- allowing PublicNexusReader::Add to be called
+	- Some Windows-specific modifications to avoid warnings and errors compiling
+		under Visual Studio 2008 (VC9)
+	- characters block now generates an exception if there is no matrix
+	- NxsReader::BlockIsASingeltonReader problem fixed
+	- better cleaning up in the multiformat reader when there is an error in the
+		reading of a file
+	- another accessor added for NxsSimpleTree
+	- PublicNexusReader GetXXXBlock functions changed to return 0L rather than
+		raising an exception if you request a block that is out of range
+	- NCL_CONST_FUNCS macro added
+
+API additions:
+	- improvements to phylip reading -- matchchar now accepted (multiformat
+		reader only).
+	- reading a single bare newick tree (as "phyliptree" or "relaxedphyliptree"
+		in multiformat reader stuff).
+	- added cullIdenticalTaxaBlocks() function to nexusreader.  You should call
+		this before reading a file if you want all repeated taxa blocks to be
+		destroyed rather than saved
+	- support for genetic codes and translation to amino acids added
+	- GetEscapedDouble and GetEscapedInt added
+	- GetDatatypeMapForMixedType added
+	- added functionality to delete identical taxa blocks even if they are
+		implied blocks.  This only will be triggered if the client code has
+		called NxsReader::cullIdenticalTaxaBlocks(true).  This corrects an
+		issue DZ was seeing with reading multiple DATA blocks
+	- aliasing of block titles for culled blocks
+	- changed the handling of  the + character when a nxstoken instance has been
+		altered by a call to indictate hyphenNotPunctuation is in effecet (this
+		is done via the SetLabileFlagBit function). In almost all case this
+		function is called so that a number (particularly one writtend in
+		scientific notation will be read as a single token, rather than as many
+		as 4 tokens).  In rare cases, the + is used before the exponent or even
+		in front of the entire number.  So that client code does not have to
+		deal with these cases, the default behavior has been changed to using
+		the hyphenNotPunctuation to indicate that in the reading of the next
+		token neither - nor + should be treated as punctuation.  Client code
+		that wishes to use the old behavior can compile NCL with the
+		NCL_VERSION_2_STYLE_HYPHEN macro defined to 1
+
+================================================================================
+2.1.05 (relative to 2.1.04)
+================================================================================
+Added include <cstdlib> at top of nxsdistancesblock.cpp and nxstoken.cpp to
+avoid compilation errors on Fedora 9 systems.
+
+================================================================================
+2.1.04 (relative to 2.1.03)
+================================================================================
+Added inclusion of <climits> for gcc 4.3 (bug report by Brian Omeara)
+
+================================================================================
+2.1.03 (relative to 2.1.02)
+================================================================================
+minor bug fixes Jamroot file added for compilation  with bjam
+
+================================================================================
+2.1.02 (relative to 2.1.00)
+================================================================================
+minor bug fixes and const correctness
+
+================================================================================
+Since 2.1-specific changes.
+================================================================================
+Support for multiple instances of the same block type
+	* NxsBlockFactory mechanism API - see the examples/normalizer for an
+		example of usage. Full adoption of these API's is not required, but may
+		make your life easier.
+	* Reader now stores "implied blocks" -- e.g. makes a DATA block look to the
+		client code like a TAXA block and CHARACTERS block. This improves the
+		abstraction for library users.
+
+Other features added:
+	* commas tolerated in multiple state lists in the cells of a matrix {A,G}
+		the same as {AG}.  Such files are not legal, but are common.
+	* handling for TITLE and BLOCKID commands added to NxsBlock
+	* optimizations (tokenizing and data structures in taxa block) -- now 50
+		fold faster than 2.0 on the 11361 Taxon, 1360 Character file in the
+		CIPRES test files.
+	* TaxPartition and TreePartition read
+	* SETS and CODONS blocks now read. Actually read as a big, fat ASSUMPTIONS
+		block that spawns implied blocks (to deal with common practice of mixing
+		the commands in these blocks).
+	* WtSet, UserType, and TypeSet command
+	* now tolerating DATATYPE not being first in FORMAT command (to deal with
+		Clustal exports)
+	* tokenizer now skipping embedded comments (note that this changes the
+		behavior of command comment storing -- they are only returned if they
+		precede token)
+	* support for DATATYPE=MIXED added in CHARACTERS block
+	* trees block can now validates trees as they are read to improve error
+		reporting  -- this feature not used unless TreesBlock::
+		SetProcessAllTreesDuringParse(true) is called on the trees block
+		instance.
+	* some support for NHX parsing -- in the TreesDescription.
+	* support for LINK command (as introduced by Mesquite)
+	* support Mesquite-style CharSet/TaxSet syntax.
+ 	* NCL_MAJOR_VERSION and  NCL_MINOR_VERSION defines added. You can wrap any
+ 		ncl-2.1 specific code (you shouldn't need much) as follows:
+
+================================================================================
+#	if defined(NCL_MAJOR_VERSION) && (NCL_MAJOR_VERSION >= 2) &&
+(NCL_MINOR_VERSION >= 1)
+		trees->SetAllowImplicitNames(true);
+#	endif
+================================================================================
+
+
+
+bug fixes:
+	* RNA equates bug reported by DZ
+	* case of equate keys  (characters of both cases are now added for molecular
+		data) reported by DZ
+	* Tax and Charset reading now tolerate Standard keywords (they still
+		generate errors for VECTOR)
+	* fixes to the Distances block if the input order is not identical to the
+		taxa block order
+	* Some CharSet reading
+	* Lots more that I forgot to document.
+
+Behavior changes (could be called features or bugs depending on your POV):
+	* Now converts any built in CHARACTERS datatype that has symbols extensions
+		to standard datatype.
+
+
+
+================================================================================
+Since 2.0.0
+================================================================================
+12 Dec 2007 Mark Holder (mholder at users.sourceforge.net)
+	* Version 2.0.04 (https://svn.sourceforge.net/svnroot/ncl/branches/v2-stable
+revision 75)
+	* new features: Basic handling of Continuous datatype (ITEMS now
+		supported).  Brian O'Meara contribute code and suggestions to this
+		new feature.
+	* bug fixes: taxa information after a treedef (root taxa info) is now
+		accepted
+
+30 Nov 2007 Mark Holder (mholder at users.sourceforge.net)
+	* Paul's unaligned parsing block functionality added
+	* bug fixes (newtaxa is now implicit if ntax is used, other small changes
+		mainly pertaining to writing NEXUS, and testing with a round trip)
+
+
+18 Dec 2006 Mark Holder (mholder at users.sourceforge.net)
+	* Version 2.0.02 (https://svn.sourceforge.net/svnroot/ncl/branches/v2-stable
+revision 47)
+		- bug fixes to Version 2.0.01 (errors introduced in CharactersBlock
+Version 2.0.01 while suppressing errors)
+		- improvements to regression testing
+
+03 Nov 2006 Mark Holder (mholder at users.sourceforge.net)
+	* Version 2.0.01
+		- minor reorganization (examples dir)
+		- suppressing warnings
+		- reworked Makefile and configure (fixes link error from multiply
+defined objects on some Linux variants)
+
+20 May 2003 Paul Lewis (paul.lewis at uconn.edu)
+	* Version 2.0 released (first official release)
+
+================================================================================
+Latest changes
+================================================================================
+
diff --git a/lib/ncl-2.1.18/INSTALL b/lib/ncl-2.1.18/INSTALL
new file mode 100644
index 0000000..fc8cb58
--- /dev/null
+++ b/lib/ncl-2.1.18/INSTALL
@@ -0,0 +1,70 @@
+Copyright (c) 2004 by Paul O. Lewis
+
+================================================================================
+Building from svn checkout
+================================================================================
+In the instructions, the $ represents your shell's prompt (you don't type the in
+
+the $ part of the command -- note that if you are using a different shell you
+may see a % instead of $. That is fine, the instructions should still work).
+
+	$ sh bootstrap.sh
+	$ cd ..
+	$ mkdir build
+	$ cd build
+	$ ../v2.1/configure
+	$ make
+	$ make check
+	$ make install
+	$ make installcheck
+
+================================================================================
+Building from svn checkout
+================================================================================
+After you unpack the archive follow the instructions above (in the
+"Building from svn checkout" section), except that you can skip the first step.
+
+
+================================================================================
+Installing to a non-standard location
+================================================================================
+Note that if you are anticipating keeping up-to-date with the
+repository or have multiple NCL builds that you test against, then
+you may want to install in a non-standard location.
+For instance invoking:
+	$ ../v2.1/configure --prefix=`pwd`/installed
+will make the install products go inside an installed subdirectory
+of your build directory. This is paricularly helpful if you
+build several different variants (you can have builddebug and buildrelease
+directories built from the same source tree).
+
+If you do install to a non-standard location, then you may have to add the path
+to the installed library (the argument to prefix plus the subdirectory lib/ncl)
+to your LD_LIBRARY_PATH environmental variable. Note that on Mac (and possibly
+other BSD OS versions) you have to set the DYLD_LIBRARY_PATH variable rather
+than LD_LIBRARY_PATH.
+
+If you use bash you can do this by adding something like this to your
+~/.bash_profile file:
+##############################################################################
+if test -z $LD_LIBRARY_PATH
+then
+���LD_LIBRARY_PATH="/abs/path/to/your/install/prefix/lib/ncl"
+else
+���LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/abs/path/to/your/install/prefix/lib/ncl"
+fi
+export LD_LIBRARY_PATH
+
+##############################################################################
+
+where you substitute the path that you passed as a --prefix to configure for the
+string "/abs/path/to/your/install/prefix" above.
+
+
+
+================================================================================
+bjam builds
+================================================================================
+NCL also includes a Jamroot file for users who have projects that are built
+with the bjam tool.
+
diff --git a/lib/ncl-2.1.18/Jamroot b/lib/ncl-2.1.18/Jamroot
new file mode 100644
index 0000000..ed016f0
--- /dev/null
+++ b/lib/ncl-2.1.18/Jamroot
@@ -0,0 +1,53 @@
+# Project-wide requirements
+# Requirements apply to building the ncl library
+# Usage-requirements apply to dependants (i.e. phycas)
+
+import os ;
+local PHYCAS_MAC_UNIVERSAL = [ os.environ PHYCAS_MAC_UNIVERSAL ] ;
+local PHYCAS_NCL_STATIC = [ os.environ PHYCAS_NCL_STATIC ] ;
+
+#alias tool_specific_requirements : : : : <toolset>darwin <cxxflags>"-arch ppc -arch i386" <linkflags>"-arch ppc -arch i386" ;
+
+if $(PHYCAS_MAC_UNIVERSAL) {
+project ncl 
+  : requirements 
+      <include>.  <cxxflags>"-arch ppc -arch i386" <linkflags>"-arch ppc -arch i386"
+      <link>shared
+    ;
+} else if $(PHYCAS_NCL_STATIC) {
+project ncl 
+  : requirements 
+      <include>. 
+      <link>static
+    ;
+} else {
+project ncl 
+  : requirements 
+      <include>. 
+      <link>shared
+    ;
+}
+
+# Build and install the NCL library
+alias ncl_sources
+  : ncl/nxsassumptionsblock.cpp
+    ncl/nxsblock.cpp
+    ncl/nxscharactersblock.cpp
+    ncl/nxscxxdiscretematrix.cpp
+    ncl/nxsdatablock.cpp
+    ncl/nxsdistancesblock.cpp
+    ncl/nxsexception.cpp
+    ncl/nxsmultiformat.cpp
+    ncl/nxspublicblocks.cpp
+    ncl/nxsreader.cpp
+    ncl/nxssetreader.cpp
+    ncl/nxsstring.cpp
+    ncl/nxstaxablock.cpp
+    ncl/nxstoken.cpp
+    ncl/nxstreesblock.cpp
+    ncl/nxsunalignedblock.cpp ;
+project : usage-requirements <include>./ncl <include>. ;
+lib ncl : ncl_sources ;
+install ncl_library 
+  : ncl 
+  : <location>dist ;
\ No newline at end of file
diff --git a/lib/ncl-2.1.18/Makefile.am b/lib/ncl-2.1.18/Makefile.am
new file mode 100644
index 0000000..a8dfdf8
--- /dev/null
+++ b/lib/ncl-2.1.18/Makefile.am
@@ -0,0 +1,8 @@
+SUBDIRS = ncl $(MAYBE_TEST_DIR) $(MAYBE_SWIG_DIR) #  example
+
+pkgconfigdir= $(libdir)/pkgconfig
+pkgconfig_DATA= nclv2.1.pc
+
+EXTRA_DIST =  Jamroot  INSTALL COPYING AUTHORS NEWS BSDLicense.txt # data html test swig
+
+ACLOCAL_AMFLAGS = -I config
diff --git a/lib/ncl-2.1.18/NEWS b/lib/ncl-2.1.18/NEWS
new file mode 100644
index 0000000..555af7a
--- /dev/null
+++ b/lib/ncl-2.1.18/NEWS
@@ -0,0 +1,35 @@
+NCL NEWS -- history of user-visible changes.  20 May 2003
+
+Copyright (C) 2003-2008 Paul O. Lewis
+
+Please send NCL bug reports to paul.lewis at uconn.edu.
+
+See ChangeLog for details about minor upgrades.
+
+Version 2.0
+-----------
+This version significant upgrade to NCL in terms of ease of use for programmers
+and the coverage of variants of NEXUS files.  This version naturally supports
+multiple instances of blocks (common in files from Mesquite) and the Mixed
+datatype used by MrBayes. Support for the UNALIGNED and ASSUMPTIONS block has
+been dramatically improved. The SETS and CODONS blocks are now handled
+(they are treated as special forms of the ASSUMPTIONS block to tolerate the
+inclusion of many of the same commands in different block types). Almost all of
+the changes in this version were made by Mark Holder, so please direct bug
+reports, questions, and feature requests to him (though the sourceforge page
+is the best place to report these).
+
+
+Version 2.0
+-----------
+Although this is the second version of the library, it is really the
+first official release. My container classes used in the first version
+have been replaced by their STL equivalents, and the source code
+documentation is now much more thorough. This version is being pubicized
+in the form of an application note in the journal Bioinformatics.
+
+Version 1.0
+-----------
+This first version did not make use of the standard template library,
+instead using container classes of my own design. This version was
+distributed from my web site, but never publicized.
diff --git a/lib/ncl-2.1.18/README b/lib/ncl-2.1.18/README
new file mode 100644
index 0000000..fd0ca2a
--- /dev/null
+++ b/lib/ncl-2.1.18/README
@@ -0,0 +1,28 @@
+NCL README -- the NEXUS Class Library (NCL) README file
+
+Most documentation for this C++ class library is in the form of HTML
+files in the html directory. Please begin by viewing the html/index.html
+file in your web browser.
+
+See the INSTALL file for important information about building and installing
+the NCL and example programs, and incorporating the NCL into your own
+applications.
+
+As of March 09, 2012, NCL is available under a Simplified BSD license (see
+BSDLicense.txt) in addition to the GPL license.
+
+ACKNOWLEDGEMENTS
+	Many of the files used for testing were provided by Arlin Stoltzfus (see
+http://www.molevol.org/camel/projects/nexus/ for more information), the Mesquite
+package, and from TreeBase (thanks, to Bill Piel!).
+
+	The SWIG bindings for version 2.1 were inspired by the work of David Suarez
+Pascal in the 2007 Google Summer of Code.  They were simplified using new
+features of NCL 2.1.  Thanks to David for blazing the way on the old version,
+Google for funding, and NESCent (in particular Hilmar Lapp) for getting the
+NESCent GSoC program going.
+
+    The 2010 GSoC effort also led to enhancements in terms of annotation storage
+and xml parsing which are currently on 
+    https://ncl.svn.sourceforge.net/svnroot/ncl/branches/xml
+    Thanks to NESCent, Google, and Michael Elliot for that support.
diff --git a/lib/ncl-2.1.18/config.h b/lib/ncl-2.1.18/config.h
new file mode 100644
index 0000000..2131fd2
--- /dev/null
+++ b/lib/ncl-2.1.18/config.h
@@ -0,0 +1,102 @@
+/* config.h.  Generated from config.h.in by configure.  */
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to 1 if you have the `alarm' function. */
+#define HAVE_ALARM 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the <float.h> header file. */
+#define HAVE_FLOAT_H 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `memmove' function. */
+#define HAVE_MEMMOVE 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if stdbool.h conforms to C99. */
+#define HAVE_STDBOOL_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strchr' function. */
+#define HAVE_STRCHR 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the `strtol' function. */
+#define HAVE_STRTOL 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if the system has the type `_Bool'. */
+#define HAVE__BOOL 1
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#define LT_OBJDIR ".libs/"
+
+/* Name of package */
+#define PACKAGE "ncl"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "mtholder at gmail.com"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "NCL"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "NCL 2.1.18"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "ncl"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "2.1.18"
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#define TIME_WITH_SYS_TIME 1
+
+/* Define to 1 if your <sys/time.h> declares `struct tm'. */
+/* #undef TM_IN_SYS_TIME */
+
+/* Version number of package */
+#define VERSION "2.1.18"
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+/* #undef inline */
+#endif
diff --git a/lib/ncl-2.1.18/config/libtool.m4 b/lib/ncl-2.1.18/config/libtool.m4
new file mode 100644
index 0000000..534d1cc
--- /dev/null
+++ b/lib/ncl-2.1.18/config/libtool.m4
@@ -0,0 +1,7983 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 57 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable.  If COMMENT is supplied, it is inserted after the
+# `#!' sequence but before initialization text begins.  After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script.  The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test $lt_write_fail = 0 && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool at gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test "$silent" = yes &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  _LT_PROG_REPLACE_SHELLFNS
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Go],			[_LT_LANG(GO)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+m4_ifndef([AC_PROG_GO], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC],     [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+  fi
+fi
+if test -z "$GOC"; then
+  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+  [LT_LANG(GO)],
+  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS="$save_LDFLAGS"
+    ])
+
+    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+      [lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+  else
+    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  fi
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    m4_if([$1], [CXX],
+[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+  lt_aix_libpath_sed='[
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }]'
+  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi],[])
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+  fi
+  ])
+  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script which will find a shell with a builtin
+# printf (which we can use as an echo command).
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*" 
+}
+
+case "$ECHO" in
+  printf*) AC_MSG_RESULT([printf]) ;;
+  print*) AC_MSG_RESULT([print -r]) ;;
+  *) AC_MSG_RESULT([cat]) ;;
+esac
+
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test "X`printf %s $ECHO`" = "X$ECHO" \
+      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
+
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[  --with-sysroot[=DIR] Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted.  We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   AC_MSG_RESULT([${with_sysroot}])
+   AC_MSG_ERROR([The sysroot must be an absolute path.])
+   ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and in which our libraries should be installed.])])
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+  [lt_cv_ar_at_file=no
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+     [echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([lt_ar_try])
+      if test "$ac_status" -eq 0; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	AC_TRY_EVAL([lt_ar_try])
+	if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+     ])
+  ])
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+  [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[_LT_PROG_AR
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+    [Whether to use a lock for old archive extraction])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+m4_if([$1], [],[
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[23]].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+    [lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+	 [lt_cv_shlibpath_overrides_runpath=yes])])
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+    ])
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+    [Permission mode override for installation of shared libraries])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+    [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+    [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+  AC_SUBST([DUMPBIN])
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+    [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+  [lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*])
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+  esac
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT@&t at _DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT@&t at _DLSYM_CONST
+#else
+# define LT@&t at _DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT@&t at _DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([], [nm_file_list_spec], [1],
+    [Specify filename containing input files for $NM])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	m4_if([$1], [GCJ], [],
+	  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+        *Intel*\ [[CF]]*Compiler*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	  ;;
+	*Portland\ Group*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+      ;;
+    esac
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    haiku*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX([$1])
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX([$1])
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  fi
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	_LT_TAGVAR(always_export_symbols, $1)=yes
+	_LT_TAGVAR(file_list_spec, $1)='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	# FIXME: Should let the user specify the lib program.
+	_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	m4_if($1, [], [
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  _LT_LINKER_OPTION([if $CC understands -b],
+	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+	  [lt_cv_irix_exported_symbol],
+	  [save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   AC_LINK_IFELSE(
+	     [AC_LANG_SOURCE(
+	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+			      [C++], [[int foo (void) { return 0; }]],
+			      [Fortran 77], [[
+      subroutine foo
+      end]],
+			      [Fortran], [[
+      subroutine foo
+      end]])])],
+	      [lt_cv_irix_exported_symbol=yes],
+	      [lt_cv_irix_exported_symbol=no])
+           LDFLAGS="$save_LDFLAGS"])
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	     ;;
+	   *)
+	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+	[$RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+	  _LT_TAGVAR(allow_undefined_flag, $1)=
+	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+	  then
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	  else
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  fi
+	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+	])
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+    [Commands necessary for finishing linking programs])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report which library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX([$1])
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX([$1])
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	    if test "$with_gnu_ld" = yes; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    fi
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=yes
+	  _LT_TAGVAR(file_list_spec, $1)='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=".dll"
+	  # FIXME: Setting linknames here is a bad hack.
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	    else
+	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	    fi~
+	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	    linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	  # Don't use ranlib
+	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	    lt_tool_outputfile="@TOOL_OUTPUT@"~
+	    case $lt_outputfile in
+	      *.exe|*.EXE) ;;
+	      *)
+		lt_outputfile="$lt_outputfile.exe"
+		lt_tool_outputfile="$lt_tool_outputfile.exe"
+		;;
+	    esac~
+	    func_to_tool_file "$lt_outputfile"~
+	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	      $RM "$lt_outputfile.manifest";
+	    fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=no
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file (1st line
+	    # is EXPORTS), use it as is; otherwise, prepend...
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      cp $export_symbols $output_objdir/$soname.def;
+	    else
+	      echo EXPORTS > $output_objdir/$soname.def;
+	      cat $export_symbols >> $output_objdir/$soname.def;
+	    fi~
+	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      haiku*)
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+		$RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
+	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+	      '"$_LT_TAGVAR(reload_cmds, $1)"
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)="$GXX"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
+])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case ${prev}${p} in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test "$pre_test_object_deps_done" = no; then
+	 case ${prev} in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC* | sunCC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$G77"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+  CFLAGS="$lt_save_CFLAGS"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+CFLAGS=
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
+# ------------------------------------------------------
+# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
+# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
+m4_defun([_LT_PROG_FUNCTION_REPLACE],
+[dnl {
+sed -e '/^$1 ()$/,/^} # $1 /c\
+$1 ()\
+{\
+m4_bpatsubsts([$2], [$], [\\], [^\([	 ]\)], [\\\1])
+} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+])
+
+
+# _LT_PROG_REPLACE_SHELLFNS
+# -------------------------
+# Replace existing portable implementations of several shell functions with
+# equivalent extended shell implementations where those features are available..
+m4_defun([_LT_PROG_REPLACE_SHELLFNS],
+[if test x"$xsi_shell" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary parameter first.
+    func_stripname_result=${3}
+    func_stripname_result=${func_stripname_result#"${1}"}
+    func_stripname_result=${func_stripname_result%"${2}"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
+    func_split_long_opt_name=${1%%=*}
+    func_split_long_opt_arg=${1#*=}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
+    func_split_short_opt_arg=${1#??}
+    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
+    case ${1} in
+      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+      *)    func_lo2o_result=${1} ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
+
+  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
+
+  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
+    func_quote_for_eval "${2}"
+dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
+    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
+fi
+])
+
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine which file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+         [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+         [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/lib/ncl-2.1.18/config/ltmain.sh b/lib/ncl-2.1.18/config/ltmain.sh
new file mode 100644
index 0000000..33f642a
--- /dev/null
+++ b/lib/ncl-2.1.18/config/ltmain.sh
@@ -0,0 +1,9661 @@
+
+# libtool (GNU libtool) 2.4.2
+# Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage: $progname [OPTION]... [MODE-ARG]...
+#
+# Provide generalized library-building support services.
+#
+#       --config             show all configuration variables
+#       --debug              enable verbose shell tracing
+#   -n, --dry-run            display commands without modifying any files
+#       --features           display basic configuration information and exit
+#       --mode=MODE          use operation mode MODE
+#       --preserve-dup-deps  don't remove duplicate dependency libraries
+#       --quiet, --silent    don't print informational messages
+#       --no-quiet, --no-silent
+#                            print informational messages (default)
+#       --no-warn            don't display warning messages
+#       --tag=TAG            use configuration variables from tag TAG
+#   -v, --verbose            print more informational messages than default
+#       --no-verbose         don't print the extra informational messages
+#       --version            print version information
+#   -h, --help, --help-all   print short, long, or detailed help message
+#
+# MODE must be one of the following:
+#
+#         clean              remove files from the build directory
+#         compile            compile a source file into a libtool object
+#         execute            automatically set library path, then run a program
+#         finish             complete the installation of libtool libraries
+#         install            install libraries or executables
+#         link               create a library or an executable
+#         uninstall          remove libraries from an installed directory
+#
+# MODE-ARGS vary depending on the MODE.  When passed as first option,
+# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
+# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
+#
+# When reporting a bug, please describe a test case to reproduce it and
+# include the following information:
+#
+#         host-triplet:	$host
+#         shell:		$SHELL
+#         compiler:		$LTCC
+#         compiler flags:		$LTCFLAGS
+#         linker:		$LD (gnu? $with_gnu_ld)
+#         $progname:	(GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#         automake:	$automake_version
+#         autoconf:	$autoconf_version
+#
+# Report bugs to <bug-libtool at gnu.org>.
+# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+# General help using GNU software: <http://www.gnu.org/gethelp/>.
+
+PROGRAM=libtool
+PACKAGE=libtool
+VERSION="2.4.2 Debian-2.4.2-1.1"
+TIMESTAMP=""
+package_revision=1.3337
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# NLS nuisances: We save the old values to restore during execute mode.
+lt_user_locale=
+lt_safe_locale=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test \"\${$lt_var+set}\" = set; then
+          save_$lt_var=\$$lt_var
+          $lt_var=C
+	  export $lt_var
+	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
+	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+	fi"
+done
+LC_ALL=C
+LANGUAGE=C
+export LANGUAGE LC_ALL
+
+$lt_unset CDPATH
+
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+
+
+: ${CP="cp -f"}
+test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+: ${Xsed="$SED -e 1s/^X//"}
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
+
+exit_status=$EXIT_SUCCESS
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+dirname="s,/[^/]*$,,"
+basename="s,^.*/,,"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+    func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+} # func_dirname may be replaced by extended shell implementation
+
+
+# func_basename file
+func_basename ()
+{
+    func_basename_result=`$ECHO "${1}" | $SED "$basename"`
+} # func_basename may be replaced by extended shell implementation
+
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+    # Extract subdirectory from the argument.
+    func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+    func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
+} # func_dirname_and_basename may be replaced by extended shell implementation
+
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+    case ${2} in
+      .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+      *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+    esac
+} # func_stripname may be replaced by extended shell implementation
+
+
+# These SED scripts presuppose an absolute path with a trailing slash.
+pathcar='s,^/\([^/]*\).*$,\1,'
+pathcdr='s,^/[^/]*,,'
+removedotparts=':dotsl
+		s@/\./@/@g
+		t dotsl
+		s,/\.$,/,'
+collapseslashes='s@/\{1,\}@/@g'
+finalslash='s,/*$,/,'
+
+# func_normal_abspath PATH
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+#             value returned in "$func_normal_abspath_result"
+func_normal_abspath ()
+{
+  # Start from root dir and reassemble the path.
+  func_normal_abspath_result=
+  func_normal_abspath_tpath=$1
+  func_normal_abspath_altnamespace=
+  case $func_normal_abspath_tpath in
+    "")
+      # Empty path, that just means $cwd.
+      func_stripname '' '/' "`pwd`"
+      func_normal_abspath_result=$func_stripname_result
+      return
+    ;;
+    # The next three entries are used to spot a run of precisely
+    # two leading slashes without using negated character classes;
+    # we take advantage of case's first-match behaviour.
+    ///*)
+      # Unusual form of absolute path, do nothing.
+    ;;
+    //*)
+      # Not necessarily an ordinary path; POSIX reserves leading '//'
+      # and for example Cygwin uses it to access remote file shares
+      # over CIFS/SMB, so we conserve a leading double slash if found.
+      func_normal_abspath_altnamespace=/
+    ;;
+    /*)
+      # Absolute path, do nothing.
+    ;;
+    *)
+      # Relative path, prepend $cwd.
+      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+    ;;
+  esac
+  # Cancel out all the simple stuff to save iterations.  We also want
+  # the path to end with a slash for ease of parsing, so make sure
+  # there is one (and only one) here.
+  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
+  while :; do
+    # Processed it all yet?
+    if test "$func_normal_abspath_tpath" = / ; then
+      # If we ascended to the root using ".." the result may be empty now.
+      if test -z "$func_normal_abspath_result" ; then
+        func_normal_abspath_result=/
+      fi
+      break
+    fi
+    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcar"`
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcdr"`
+    # Figure out what to do with it
+    case $func_normal_abspath_tcomponent in
+      "")
+        # Trailing empty path component, ignore it.
+      ;;
+      ..)
+        # Parent dir; strip last assembled component from result.
+        func_dirname "$func_normal_abspath_result"
+        func_normal_abspath_result=$func_dirname_result
+      ;;
+      *)
+        # Actual path component, append it.
+        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
+      ;;
+    esac
+  done
+  # Restore leading double-slash if one was found on entry.
+  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+# func_relative_path SRCDIR DSTDIR
+# generates a relative path from SRCDIR to DSTDIR, with a trailing
+# slash if non-empty, suitable for immediately appending a filename
+# without needing to append a separator.
+#             value returned in "$func_relative_path_result"
+func_relative_path ()
+{
+  func_relative_path_result=
+  func_normal_abspath "$1"
+  func_relative_path_tlibdir=$func_normal_abspath_result
+  func_normal_abspath "$2"
+  func_relative_path_tbindir=$func_normal_abspath_result
+
+  # Ascend the tree starting from libdir
+  while :; do
+    # check if we have found a prefix of bindir
+    case $func_relative_path_tbindir in
+      $func_relative_path_tlibdir)
+        # found an exact match
+        func_relative_path_tcancelled=
+        break
+        ;;
+      $func_relative_path_tlibdir*)
+        # found a matching prefix
+        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+        func_relative_path_tcancelled=$func_stripname_result
+        if test -z "$func_relative_path_result"; then
+          func_relative_path_result=.
+        fi
+        break
+        ;;
+      *)
+        func_dirname $func_relative_path_tlibdir
+        func_relative_path_tlibdir=${func_dirname_result}
+        if test "x$func_relative_path_tlibdir" = x ; then
+          # Have to descend all the way to the root!
+          func_relative_path_result=../$func_relative_path_result
+          func_relative_path_tcancelled=$func_relative_path_tbindir
+          break
+        fi
+        func_relative_path_result=../$func_relative_path_result
+        ;;
+    esac
+  done
+
+  # Now calculate path; take care to avoid doubling-up slashes.
+  func_stripname '' '/' "$func_relative_path_result"
+  func_relative_path_result=$func_stripname_result
+  func_stripname '/' '/' "$func_relative_path_tcancelled"
+  if test "x$func_stripname_result" != x ; then
+    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
+  fi
+
+  # Normalisation. If bindir is libdir, return empty string,
+  # else relative path ending with a slash; either way, target
+  # file name can be directly appended.
+  if test ! -z "$func_relative_path_result"; then
+    func_stripname './' '' "$func_relative_path_result/"
+    func_relative_path_result=$func_stripname_result
+  fi
+}
+
+# The name of this program:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+
+# Make sure we have an absolute path for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=$func_dirname_result
+     progdir=`cd "$progdir" && pwd`
+     progpath="$progdir/$progname"
+     ;;
+  *)
+     save_IFS="$IFS"
+     IFS=${PATH_SEPARATOR-:}
+     for progdir in $PATH; do
+       IFS="$save_IFS"
+       test -x "$progdir/$progname" && break
+     done
+     IFS="$save_IFS"
+     test -n "$progdir" || progdir=`pwd`
+     progpath="$progdir/$progname"
+     ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+
+# Sed substitution that converts a w32 file name or path
+# which contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-`\' parameter expansions in output of double_quote_subst that were
+# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
+# in input to double_quote_subst, that '$' was protected from expansion.
+# Since each input `\' is now two `\'s, look for any number of runs of
+# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
+bs='\\'
+bs2='\\\\'
+bs4='\\\\\\\\'
+dollar='\$'
+sed_double_backslash="\
+  s/$bs4/&\\
+/g
+  s/^$bs2$dollar/$bs&/
+  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
+  s/\n//g"
+
+# Standard options:
+opt_dry_run=false
+opt_help=false
+opt_quiet=false
+opt_verbose=false
+opt_warning=:
+
+# func_echo arg...
+# Echo program name prefixed message, along with the current mode
+# name if it has been set yet.
+func_echo ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
+}
+
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $opt_verbose && func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
+}
+
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
+
+    # bash bug again:
+    :
+}
+
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
+
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    func_error ${1+"$@"}
+    func_fatal_error "$help"
+}
+help="Try \`$progname --help' for more information."  ## default
+
+
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_mkdir_p directory-path
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    my_directory_path="$1"
+    my_dir_list=
+
+    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+
+      # Protect directory names starting with `-'
+      case $my_directory_path in
+        -*) my_directory_path="./$my_directory_path" ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$my_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+	# list incase some portion of path contains whitespace.
+        my_dir_list="$my_directory_path:$my_dir_list"
+
+        # If the last portion added has no slash in it, the list is done
+        case $my_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+      done
+      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+
+      save_mkdir_p_IFS="$IFS"; IFS=':'
+      for my_dir in $my_dir_list; do
+	IFS="$save_mkdir_p_IFS"
+        # mkdir can fail with a `File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$my_dir" 2>/dev/null || :
+      done
+      IFS="$save_mkdir_p_IFS"
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$my_directory_path" || \
+        func_fatal_error "Failed to create \`$1'"
+    fi
+}
+
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$opt_dry_run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+        # Failing that, at least try and use $RANDOM to avoid a race
+        my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+        save_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$my_tmpdir"
+        umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || \
+        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+    fi
+
+    $ECHO "$my_tmpdir"
+}
+
+
+# func_quote_for_eval arg
+# Aesthetically quote ARG to be evaled later.
+# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
+# is double-quoted, suitable for a subsequent eval, whereas
+# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
+# which are still active within double quotes backslashified.
+func_quote_for_eval ()
+{
+    case $1 in
+      *[\\\`\"\$]*)
+	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
+      *)
+        func_quote_for_eval_unquoted_result="$1" ;;
+    esac
+
+    case $func_quote_for_eval_unquoted_result in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting, command substitution and and variable
+      # expansion for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+        ;;
+      *)
+        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
+    esac
+}
+
+
+# func_quote_for_expand arg
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    case $1 in
+      *[\\\`\"]*)
+	my_arg=`$ECHO "$1" | $SED \
+	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        my_arg="$1" ;;
+    esac
+
+    case $my_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        my_arg="\"$my_arg\""
+        ;;
+    esac
+
+    func_quote_for_expand_result="$my_arg"
+}
+
+
+# func_show_eval cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$my_cmd"
+      my_status=$?
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+# func_show_eval_locale cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$lt_user_locale
+	    $my_cmd"
+      my_status=$?
+      eval "$lt_safe_locale"
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+# func_tr_sh
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+  case $1 in
+  [0-9]* | *[!a-zA-Z0-9_]*)
+    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
+    ;;
+  * )
+    func_tr_sh_result=$1
+    ;;
+  esac
+}
+
+
+# func_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $opt_debug
+
+    $SED -n '/(C)/!b go
+	:more
+	/\./!{
+	  N
+	  s/\n# / /
+	  b more
+	}
+	:go
+	/^# '$PROGRAM' (GNU /,/# warranty; / {
+        s/^# //
+	s/^# *$//
+        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
+        p
+     }' < "$progpath"
+     exit $?
+}
+
+# func_usage
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/^#  *.*--help/ {
+        s/^# //
+	s/^# *$//
+	s/\$progname/'$progname'/
+	p
+    }' < "$progpath"
+    echo
+    $ECHO "run \`$progname --help | more' for full usage"
+    exit $?
+}
+
+# func_help [NOEXIT]
+# Echo long help message to standard output and exit,
+# unless 'noexit' is passed as argument.
+func_help ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/# Report bugs to/ {
+	:print
+        s/^# //
+	s/^# *$//
+	s*\$progname*'$progname'*
+	s*\$host*'"$host"'*
+	s*\$SHELL*'"$SHELL"'*
+	s*\$LTCC*'"$LTCC"'*
+	s*\$LTCFLAGS*'"$LTCFLAGS"'*
+	s*\$LD*'"$LD"'*
+	s/\$with_gnu_ld/'"$with_gnu_ld"'/
+	s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
+	s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
+	p
+	d
+     }
+     /^# .* home page:/b print
+     /^# General help using/b print
+     ' < "$progpath"
+    ret=$?
+    if test -z "$1"; then
+      exit $ret
+    fi
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    $opt_debug
+
+    func_error "missing argument for $1."
+    exit_cmd=exit
+}
+
+
+# func_split_short_opt shortopt
+# Set func_split_short_opt_name and func_split_short_opt_arg shell
+# variables after splitting SHORTOPT after the 2nd character.
+func_split_short_opt ()
+{
+    my_sed_short_opt='1s/^\(..\).*$/\1/;q'
+    my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
+
+    func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
+    func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
+} # func_split_short_opt may be replaced by extended shell implementation
+
+
+# func_split_long_opt longopt
+# Set func_split_long_opt_name and func_split_long_opt_arg shell
+# variables after splitting LONGOPT at the `=' sign.
+func_split_long_opt ()
+{
+    my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
+    my_sed_long_arg='1s/^--[^=]*=//'
+
+    func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
+    func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
+} # func_split_long_opt may be replaced by extended shell implementation
+
+exit_cmd=:
+
+
+
+
+
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
+
+# Global variables.
+nonopt=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+    eval "${1}=\$${1}\${2}"
+} # func_append may be replaced by extended shell implementation
+
+# func_append_quoted var value
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+func_append_quoted ()
+{
+    func_quote_for_eval "${2}"
+    eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
+} # func_append_quoted may be replaced by extended shell implementation
+
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+    func_arith_result=`expr "${@}"`
+} # func_arith may be replaced by extended shell implementation
+
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+    func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
+} # func_len may be replaced by extended shell implementation
+
+
+# func_lo2o object
+func_lo2o ()
+{
+    func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
+} # func_lo2o may be replaced by extended shell implementation
+
+
+# func_xform libobj-or-source
+func_xform ()
+{
+    func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
+} # func_xform may be replaced by extended shell implementation
+
+
+# func_fatal_configuration arg...
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func_error ${1+"$@"}
+    func_error "See the $PACKAGE documentation for more information."
+    func_fatal_error "Fatal configuration error."
+}
+
+
+# func_config
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+    done
+
+    exit $?
+}
+
+# func_features
+# Display the features supported by this script.
+func_features ()
+{
+    echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+
+    exit $?
+}
+
+# func_enable_tag tagname
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+  # Global variable:
+  tagname="$1"
+
+  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+
+  # Validate tagname.
+  case $tagname in
+    *[!-_A-Za-z0-9,/]*)
+      func_fatal_error "invalid tag name: $tagname"
+      ;;
+  esac
+
+  # Don't test for the "default" C tag, as we know it's
+  # there but not specially marked.
+  case $tagname in
+    CC) ;;
+    *)
+      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	taglist="$taglist $tagname"
+
+	# Evaluate the configuration.  Be careful to quote the path
+	# and the sed script, to avoid splitting on whitespace, but
+	# also don't use non-portable quotes within backquotes within
+	# quotes we have to do it in 2 steps:
+	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	eval "$extractedcf"
+      else
+	func_error "ignoring unknown tag $tagname"
+      fi
+      ;;
+  esac
+}
+
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+  if test "$package_revision" != "$macro_revision"; then
+    if test "$VERSION" != "$macro_version"; then
+      if test -z "$macro_version"; then
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      fi
+    else
+      cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+    fi
+
+    exit $EXIT_MISMATCH
+  fi
+}
+
+
+# Shorthand for --mode=foo, only valid as the first argument
+case $1 in
+clean|clea|cle|cl)
+  shift; set dummy --mode clean ${1+"$@"}; shift
+  ;;
+compile|compil|compi|comp|com|co|c)
+  shift; set dummy --mode compile ${1+"$@"}; shift
+  ;;
+execute|execut|execu|exec|exe|ex|e)
+  shift; set dummy --mode execute ${1+"$@"}; shift
+  ;;
+finish|finis|fini|fin|fi|f)
+  shift; set dummy --mode finish ${1+"$@"}; shift
+  ;;
+install|instal|insta|inst|ins|in|i)
+  shift; set dummy --mode install ${1+"$@"}; shift
+  ;;
+link|lin|li|l)
+  shift; set dummy --mode link ${1+"$@"}; shift
+  ;;
+uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+  shift; set dummy --mode uninstall ${1+"$@"}; shift
+  ;;
+esac
+
+
+
+# Option defaults:
+opt_debug=:
+opt_dry_run=false
+opt_config=false
+opt_preserve_dup_deps=false
+opt_features=false
+opt_finish=false
+opt_help=false
+opt_help_all=false
+opt_silent=:
+opt_warning=:
+opt_verbose=:
+opt_silent=false
+opt_verbose=false
+
+
+# Parse options once, thoroughly.  This comes as soon as possible in the
+# script to make things like `--version' happen as quickly as we can.
+{
+  # this just eases exit handling
+  while test $# -gt 0; do
+    opt="$1"
+    shift
+    case $opt in
+      --debug|-x)	opt_debug='set -x'
+			func_echo "enabling shell trace mode"
+			$opt_debug
+			;;
+      --dry-run|--dryrun|-n)
+			opt_dry_run=:
+			;;
+      --config)
+			opt_config=:
+func_config
+			;;
+      --dlopen|-dlopen)
+			optarg="$1"
+			opt_dlopen="${opt_dlopen+$opt_dlopen
+}$optarg"
+			shift
+			;;
+      --preserve-dup-deps)
+			opt_preserve_dup_deps=:
+			;;
+      --features)
+			opt_features=:
+func_features
+			;;
+      --finish)
+			opt_finish=:
+set dummy --mode finish ${1+"$@"}; shift
+			;;
+      --help)
+			opt_help=:
+			;;
+      --help-all)
+			opt_help_all=:
+opt_help=': help-all'
+			;;
+      --mode)
+			test $# = 0 && func_missing_arg $opt && break
+			optarg="$1"
+			opt_mode="$optarg"
+case $optarg in
+  # Valid mode arguments:
+  clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+  # Catch anything else as an error
+  *) func_error "invalid argument for $opt"
+     exit_cmd=exit
+     break
+     ;;
+esac
+			shift
+			;;
+      --no-silent|--no-quiet)
+			opt_silent=false
+func_append preserve_args " $opt"
+			;;
+      --no-warning|--no-warn)
+			opt_warning=false
+func_append preserve_args " $opt"
+			;;
+      --no-verbose)
+			opt_verbose=false
+func_append preserve_args " $opt"
+			;;
+      --silent|--quiet)
+			opt_silent=:
+func_append preserve_args " $opt"
+        opt_verbose=false
+			;;
+      --verbose|-v)
+			opt_verbose=:
+func_append preserve_args " $opt"
+opt_silent=false
+			;;
+      --tag)
+			test $# = 0 && func_missing_arg $opt && break
+			optarg="$1"
+			opt_tag="$optarg"
+func_append preserve_args " $opt $optarg"
+func_enable_tag "$optarg"
+			shift
+			;;
+
+      -\?|-h)		func_usage				;;
+      --help)		func_help				;;
+      --version)	func_version				;;
+
+      # Separate optargs to long options:
+      --*=*)
+			func_split_long_opt "$opt"
+			set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
+			shift
+			;;
+
+      # Separate non-argument short options:
+      -\?*|-h*|-n*|-v*)
+			func_split_short_opt "$opt"
+			set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
+			shift
+			;;
+
+      --)		break					;;
+      -*)		func_fatal_help "unrecognized option \`$opt'" ;;
+      *)		set dummy "$opt" ${1+"$@"};	shift; break  ;;
+    esac
+  done
+
+  # Validate options:
+
+  # save first non-option argument
+  if test "$#" -gt 0; then
+    nonopt="$opt"
+    shift
+  fi
+
+  # preserve --debug
+  test "$opt_debug" = : || func_append preserve_args " --debug"
+
+  case $host in
+    *cygwin* | *mingw* | *pw32* | *cegcc*)
+      # don't eliminate duplications in $postdeps and $predeps
+      opt_duplicate_compiler_generated_deps=:
+      ;;
+    *)
+      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+      ;;
+  esac
+
+  $opt_help || {
+    # Sanity checks first:
+    func_check_version_match
+
+    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+      func_fatal_configuration "not configured to build any kind of library"
+    fi
+
+    # Darwin sucks
+    eval std_shrext=\"$shrext_cmds\"
+
+    # Only execute mode is allowed to have -dlopen flags.
+    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
+      func_error "unrecognized option \`-dlopen'"
+      $ECHO "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Change the help message to a mode-specific one.
+    generic_help="$help"
+    help="Try \`$progname --help --mode=$opt_mode' for more information."
+  }
+
+
+  # Bail if the options were screwed
+  $exit_cmd $EXIT_FAILURE
+}
+
+
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+# func_lalib_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null \
+        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if `file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+	for lalib_p_l in 1 2 3 4
+	do
+	    read lalib_p_line
+	    case "$lalib_p_line" in
+		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+	    esac
+	done
+	exec 0<&5 5<&-
+    fi
+    test "$lalib_p" = yes
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    func_lalib_p "$1"
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_dirname_and_basename "$1" "" "."
+    func_stripname '' '.exe' "$func_basename_result"
+    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $opt_debug
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$save_ifs
+      eval cmd=\"$cmd\"
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# `FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $opt_debug
+    case $1 in
+    */* | *\\*)	. "$1" ;;
+    *)		. "./$1" ;;
+    esac
+}
+
+
+# func_resolve_sysroot PATH
+# Replace a leading = in PATH with a sysroot.  Store the result into
+# func_resolve_sysroot_result
+func_resolve_sysroot ()
+{
+  func_resolve_sysroot_result=$1
+  case $func_resolve_sysroot_result in
+  =*)
+    func_stripname '=' '' "$func_resolve_sysroot_result"
+    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
+    ;;
+  esac
+}
+
+# func_replace_sysroot PATH
+# If PATH begins with the sysroot, replace it with = and
+# store the result into func_replace_sysroot_result.
+func_replace_sysroot ()
+{
+  case "$lt_sysroot:$1" in
+  ?*:"$lt_sysroot"*)
+    func_stripname "$lt_sysroot" '' "$1"
+    func_replace_sysroot_result="=$func_stripname_result"
+    ;;
+  *)
+    # Including no sysroot.
+    func_replace_sysroot_result=$1
+    ;;
+  esac
+}
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $opt_debug
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+	func_append_quoted CC_quoted "$arg"
+      done
+      CC_expanded=`func_echo_all $CC`
+      CC_quoted_expanded=`func_echo_all $CC_quoted`
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	      # Double-quote args containing other shell metacharacters.
+	      func_append_quoted CC_quoted "$arg"
+	    done
+	    CC_expanded=`func_echo_all $CC`
+	    CC_quoted_expanded=`func_echo_all $CC_quoted`
+	    case "$@ " in
+	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  func_echo "unable to infer tagged configuration"
+	  func_fatal_error "specify a tag with \`--tag'"
+#	else
+#	  func_verbose "using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=${1}
+    if test "$build_libtool_libs" = yes; then
+      write_lobj=\'${2}\'
+    else
+      write_lobj=none
+    fi
+
+    if test "$build_old_libs" = yes; then
+      write_oldobj=\'${3}\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "${write_libobj}"
+    }
+}
+
+
+##################################################
+# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
+##################################################
+
+# func_convert_core_file_wine_to_w32 ARG
+# Helper function used by file name conversion functions when $build is *nix,
+# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH.
+#
+# ARG is the $build file name to be converted to w32 format.
+# Result is available in $func_convert_core_file_wine_to_w32_result, and will
+# be empty on error (or when ARG is empty)
+func_convert_core_file_wine_to_w32 ()
+{
+  $opt_debug
+  func_convert_core_file_wine_to_w32_result="$1"
+  if test -n "$1"; then
+    # Unfortunately, winepath does not exit with a non-zero error code, so we
+    # are forced to check the contents of stdout. On the other hand, if the
+    # command is not found, the shell will set an exit code of 127 and print
+    # *an error message* to stdout. So we must check for both error code of
+    # zero AND non-empty stdout, which explains the odd construction:
+    func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
+    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+      func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
+        $SED -e "$lt_sed_naive_backslashify"`
+    else
+      func_convert_core_file_wine_to_w32_result=
+    fi
+  fi
+}
+# end: func_convert_core_file_wine_to_w32
+
+
+# func_convert_core_path_wine_to_w32 ARG
+# Helper function used by path conversion functions when $build is *nix, and
+# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
+# configured wine environment available, with the winepath program in $build's
+# $PATH. Assumes ARG has no leading or trailing path separator characters.
+#
+# ARG is path to be converted from $build format to win32.
+# Result is available in $func_convert_core_path_wine_to_w32_result.
+# Unconvertible file (directory) names in ARG are skipped; if no directory names
+# are convertible, then the result may be empty.
+func_convert_core_path_wine_to_w32 ()
+{
+  $opt_debug
+  # unfortunately, winepath doesn't convert paths, only file names
+  func_convert_core_path_wine_to_w32_result=""
+  if test -n "$1"; then
+    oldIFS=$IFS
+    IFS=:
+    for func_convert_core_path_wine_to_w32_f in $1; do
+      IFS=$oldIFS
+      func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
+      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+        if test -z "$func_convert_core_path_wine_to_w32_result"; then
+          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+        else
+          func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
+        fi
+      fi
+    done
+    IFS=$oldIFS
+  fi
+}
+# end: func_convert_core_path_wine_to_w32
+
+
+# func_cygpath ARGS...
+# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
+# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
+# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
+# (2), returns the Cygwin file name or path in func_cygpath_result (input
+# file name or path is assumed to be in w32 format, as previously converted
+# from $build's *nix or MSYS format). In case (3), returns the w32 file name
+# or path in func_cygpath_result (input file name or path is assumed to be in
+# Cygwin format). Returns an empty string on error.
+#
+# ARGS are passed to cygpath, with the last one being the file name or path to
+# be converted.
+#
+# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
+# environment variable; do not put it in $PATH.
+func_cygpath ()
+{
+  $opt_debug
+  if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
+    func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
+    if test "$?" -ne 0; then
+      # on failure, ensure result is empty
+      func_cygpath_result=
+    fi
+  else
+    func_cygpath_result=
+    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+  fi
+}
+#end: func_cygpath
+
+
+# func_convert_core_msys_to_w32 ARG
+# Convert file name or path ARG from MSYS format to w32 format.  Return
+# result in func_convert_core_msys_to_w32_result.
+func_convert_core_msys_to_w32 ()
+{
+  $opt_debug
+  # awkward: cmd appends spaces to result
+  func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+}
+#end: func_convert_core_msys_to_w32
+
+
+# func_convert_file_check ARG1 ARG2
+# Verify that ARG1 (a file name in $build format) was converted to $host
+# format in ARG2. Otherwise, emit an error message, but continue (resetting
+# func_to_host_file_result to ARG1).
+func_convert_file_check ()
+{
+  $opt_debug
+  if test -z "$2" && test -n "$1" ; then
+    func_error "Could not determine host file name corresponding to"
+    func_error "  \`$1'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback:
+    func_to_host_file_result="$1"
+  fi
+}
+# end func_convert_file_check
+
+
+# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
+# Verify that FROM_PATH (a path in $build format) was converted to $host
+# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
+# func_to_host_file_result to a simplistic fallback value (see below).
+func_convert_path_check ()
+{
+  $opt_debug
+  if test -z "$4" && test -n "$3"; then
+    func_error "Could not determine the host path corresponding to"
+    func_error "  \`$3'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback.  This is a deliberately simplistic "conversion" and
+    # should not be "improved".  See libtool.info.
+    if test "x$1" != "x$2"; then
+      lt_replace_pathsep_chars="s|$1|$2|g"
+      func_to_host_path_result=`echo "$3" |
+        $SED -e "$lt_replace_pathsep_chars"`
+    else
+      func_to_host_path_result="$3"
+    fi
+  fi
+}
+# end func_convert_path_check
+
+
+# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
+# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
+# and appending REPL if ORIG matches BACKPAT.
+func_convert_path_front_back_pathsep ()
+{
+  $opt_debug
+  case $4 in
+  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+    ;;
+  esac
+  case $4 in
+  $2 ) func_append func_to_host_path_result "$3"
+    ;;
+  esac
+}
+# end func_convert_path_front_back_pathsep
+
+
+##################################################
+# $build to $host FILE NAME CONVERSION FUNCTIONS #
+##################################################
+# invoked via `$to_host_file_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# Result will be available in $func_to_host_file_result.
+
+
+# func_to_host_file ARG
+# Converts the file name ARG from $build format to $host format. Return result
+# in func_to_host_file_result.
+func_to_host_file ()
+{
+  $opt_debug
+  $to_host_file_cmd "$1"
+}
+# end func_to_host_file
+
+
+# func_to_tool_file ARG LAZY
+# converts the file name ARG from $build format to toolchain format. Return
+# result in func_to_tool_file_result.  If the conversion in use is listed
+# in (the comma separated) LAZY, no conversion takes place.
+func_to_tool_file ()
+{
+  $opt_debug
+  case ,$2, in
+    *,"$to_tool_file_cmd",*)
+      func_to_tool_file_result=$1
+      ;;
+    *)
+      $to_tool_file_cmd "$1"
+      func_to_tool_file_result=$func_to_host_file_result
+      ;;
+  esac
+}
+# end func_to_tool_file
+
+
+# func_convert_file_noop ARG
+# Copy ARG to func_to_host_file_result.
+func_convert_file_noop ()
+{
+  func_to_host_file_result="$1"
+}
+# end func_convert_file_noop
+
+
+# func_convert_file_msys_to_w32 ARG
+# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_file_result.
+func_convert_file_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_w32
+
+
+# func_convert_file_cygwin_to_w32 ARG
+# Convert file name ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_file_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
+    # LT_CYGPATH in this case.
+    func_to_host_file_result=`cygpath -m "$1"`
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_cygwin_to_w32
+
+
+# func_convert_file_nix_to_w32 ARG
+# Convert file name ARG from *nix to w32 format.  Requires a wine environment
+# and a working winepath. Returns result in func_to_host_file_result.
+func_convert_file_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_file_wine_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_w32
+
+
+# func_convert_file_msys_to_cygwin ARG
+# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_file_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_cygwin
+
+
+# func_convert_file_nix_to_cygwin ARG
+# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
+# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
+# in func_to_host_file_result.
+func_convert_file_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
+    func_convert_core_file_wine_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_cygwin
+
+
+#############################################
+# $build to $host PATH CONVERSION FUNCTIONS #
+#############################################
+# invoked via `$to_host_path_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# The result will be available in $func_to_host_path_result.
+#
+# Path separators are also converted from $build format to $host format.  If
+# ARG begins or ends with a path separator character, it is preserved (but
+# converted to $host format) on output.
+#
+# All path conversion functions are named using the following convention:
+#   file name conversion function    : func_convert_file_X_to_Y ()
+#   path conversion function         : func_convert_path_X_to_Y ()
+# where, for any given $build/$host combination the 'X_to_Y' value is the
+# same.  If conversion functions are added for new $build/$host combinations,
+# the two new functions must follow this pattern, or func_init_to_host_path_cmd
+# will break.
+
+
+# func_init_to_host_path_cmd
+# Ensures that function "pointer" variable $to_host_path_cmd is set to the
+# appropriate value, based on the value of $to_host_file_cmd.
+to_host_path_cmd=
+func_init_to_host_path_cmd ()
+{
+  $opt_debug
+  if test -z "$to_host_path_cmd"; then
+    func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
+    to_host_path_cmd="func_convert_path_${func_stripname_result}"
+  fi
+}
+
+
+# func_to_host_path ARG
+# Converts the path ARG from $build format to $host format. Return result
+# in func_to_host_path_result.
+func_to_host_path ()
+{
+  $opt_debug
+  func_init_to_host_path_cmd
+  $to_host_path_cmd "$1"
+}
+# end func_to_host_path
+
+
+# func_convert_path_noop ARG
+# Copy ARG to func_to_host_path_result.
+func_convert_path_noop ()
+{
+  func_to_host_path_result="$1"
+}
+# end func_convert_path_noop
+
+
+# func_convert_path_msys_to_w32 ARG
+# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_path_result.
+func_convert_path_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from ARG.  MSYS
+    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
+    # and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_msys_to_w32
+
+
+# func_convert_path_cygwin_to_w32 ARG
+# Convert path ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_path_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_cygwin_to_w32
+
+
+# func_convert_path_nix_to_w32 ARG
+# Convert path ARG from *nix to w32 format.  Requires a wine environment and
+# a working winepath.  Returns result in func_to_host_file_result.
+func_convert_path_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_nix_to_w32
+
+
+# func_convert_path_msys_to_cygwin ARG
+# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_path_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_msys_to_cygwin
+
+
+# func_convert_path_nix_to_cygwin ARG
+# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
+# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
+# func_to_host_file_result.
+func_convert_path_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from
+    # ARG. msys behavior is inconsistent here, cygpath turns them
+    # into '.;' and ';.', and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_nix_to_cygwin
+
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $opt_debug
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  test -n "$libobj" && \
+	    func_fatal_error "you cannot specify \`-o' more than once"
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-pie | -fpie | -fPIE)
+          func_append pie_flag " $arg"
+	  continue
+	  ;;
+
+	-shared | -static | -prefer-pic | -prefer-non-pic)
+	  func_append later " $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  func_stripname '-Wc,' '' "$arg"
+	  args=$func_stripname_result
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+	  for arg in $args; do
+	    IFS="$save_ifs"
+	    func_append_quoted lastarg "$arg"
+	  done
+	  IFS="$save_ifs"
+	  func_stripname ' ' '' "$lastarg"
+	  lastarg=$func_stripname_result
+
+	  # Add the arguments to base_compile.
+	  func_append base_compile " $lastarg"
+	  continue
+	  ;;
+
+	*)
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg="$srcfile"
+	  srcfile="$arg"
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      func_append_quoted base_compile "$lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      func_fatal_error "you must specify an argument for -Xcompile"
+      ;;
+    target)
+      func_fatal_error "you must specify a target with \`-o'"
+      ;;
+    *)
+      # Get the name of the library object.
+      test -z "$libobj" && {
+	func_basename "$srcfile"
+	libobj="$func_basename_result"
+      }
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    case $libobj in
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
+    esac
+
+    case $libobj in
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+    *)
+      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	continue
+	;;
+
+      -static)
+	build_libtool_libs=no
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
+      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname="$func_basename_result"
+    xdir="$func_dirname_result"
+    lobj=${xdir}$objdir/$objname
+
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	$ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+      func_append removelist " $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
+    fi
+
+    $opt_dry_run || $RM $removelist
+    func_append removelist " $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+    func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
+    srcfile=$func_to_tool_file_result
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      func_mkdir_p "$xdir$objdir"
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	func_append command " -o $lobj"
+      fi
+
+      func_show_eval_locale "$command"	\
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	func_show_eval '$MV "$output_obj" "$lobj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+	suppress_output=' >/dev/null 2>&1'
+      fi
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile$pie_flag"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+	func_append command " -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      func_append command "$suppress_output"
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	func_show_eval '$MV "$output_obj" "$obj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+    fi
+
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+      # Unlock the critical section if it was locked
+      if test "$need_locks" != no; then
+	removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
+
+    exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $opt_mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
+
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to build PIC objects only
+  -prefer-non-pic   try to build non-PIC objects only
+  -shared           do not build a \`.o' file suitable for static linking
+  -static           only build a \`.o' file suitable for static linking
+  -Wc,FLAG          pass FLAG directly to the compiler
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+        ;;
+
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
+
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+        ;;
+
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
+
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -bindir BINDIR    specify path to binaries directory (for systems where
+                    libraries must be found in the PATH setting at runtime)
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
+  -Wc,FLAG
+  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
+  -Wl,FLAG
+  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
+  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+        ;;
+
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      *)
+        func_fatal_help "invalid operation mode \`$opt_mode'"
+        ;;
+    esac
+
+    echo
+    $ECHO "Try \`$progname --help' for more information about other modes."
+}
+
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+  if test "$opt_help" = :; then
+    func_mode_help
+  else
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	func_mode_help
+      done
+    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	echo
+	func_mode_help
+      done
+    } |
+    sed '1d
+      /^When reporting/,/^Report/{
+	H
+	d
+      }
+      $x
+      /information about other modes/d
+      /more detailed .*MODE/d
+      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+  fi
+  exit $?
+fi
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $opt_debug
+    # The first argument is the command name.
+    cmd="$nonopt"
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
+
+    # Handle -dlopen flags immediately.
+    for file in $opt_dlopen; do
+      test -f "$file" \
+	|| func_fatal_help "\`$file' is not a file"
+
+      dir=
+      case $file in
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$lib' is not a valid libtool archive"
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+	func_source "$file"
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && \
+	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  func_append dir "/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	  fi
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+	;;
+
+      *)
+	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -* | *.la | *.lo ) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if func_ltwrapper_script_p "$file"; then
+	  func_source "$file"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	elif func_ltwrapper_executable_p "$file"; then
+	  func_ltwrapper_scriptname "$file"
+	  func_source "$func_ltwrapper_scriptname_result"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_append_quoted args "$file"
+    done
+
+    if test "X$opt_dry_run" = Xfalse; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+	      else
+		$lt_unset $lt_var
+	      fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $opt_debug
+    libs=
+    libdirs=
+    admincmds=
+
+    for opt in "$nonopt" ${1+"$@"}
+    do
+      if test -d "$opt"; then
+	func_append libdirs " $opt"
+
+      elif test -f "$opt"; then
+	if func_lalib_unsafe_p "$opt"; then
+	  func_append libs " $opt"
+	else
+	  func_warning "\`$opt' is not a valid libtool archive"
+	fi
+
+      else
+	func_fatal_error "invalid argument \`$opt'"
+      fi
+    done
+
+    if test -n "$libs"; then
+      if test -n "$lt_sysroot"; then
+        sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
+        sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
+      else
+        sysroot_cmd=
+      fi
+
+      # Remove sysroot references
+      if $opt_dry_run; then
+        for lib in $libs; do
+          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+        done
+      else
+        tmpdir=`func_mktempdir`
+        for lib in $libs; do
+	  sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+	    > $tmpdir/tmp-la
+	  mv -f $tmpdir/tmp-la $lib
+	done
+        ${RM}r "$tmpdir"
+      fi
+    fi
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $opt_dry_run || eval "$cmds" || func_append admincmds "
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    $opt_silent && exit $EXIT_SUCCESS
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      echo "----------------------------------------------------------------------"
+      echo "Libraries have been installed in:"
+      for libdir in $libdirs; do
+	$ECHO "   $libdir"
+      done
+      echo
+      echo "If you ever happen to want to link against installed libraries"
+      echo "in a given directory, LIBDIR, you must either use libtool, and"
+      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+      echo "flag during linking and do at least one of the following:"
+      if test -n "$shlibpath_var"; then
+	echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+	echo "     during execution"
+      fi
+      if test -n "$runpath_var"; then
+	echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+	echo "     during linking"
+      fi
+      if test -n "$hardcode_libdir_flag_spec"; then
+	libdir=LIBDIR
+	eval flag=\"$hardcode_libdir_flag_spec\"
+
+	$ECHO "   - use the \`$flag' linker flag"
+      fi
+      if test -n "$admincmds"; then
+	$ECHO "   - have your system administrator run these commands:$admincmds"
+      fi
+      if test -f /etc/ld.so.conf; then
+	echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+      fi
+      echo
+
+      echo "See any operating system documentation about shared libraries for"
+      case $host in
+	solaris2.[6789]|solaris2.1[0-9])
+	  echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+	  echo "pages."
+	  ;;
+	*)
+	  echo "more information, such as the ld(1) and ld.so(8) manual pages."
+	  ;;
+      esac
+      echo "----------------------------------------------------------------------"
+    fi
+    exit $EXIT_SUCCESS
+}
+
+test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+    $opt_debug
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       case $nonopt in *shtool*) :;; *) false;; esac; then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    func_append install_prog "$func_quote_for_eval_result"
+    install_shared_prog=$install_prog
+    case " $install_prog " in
+      *[\\\ /]cp\ *) install_cp=: ;;
+      *) install_cp=false ;;
+    esac
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    no_mode=:
+    for arg
+    do
+      arg2=
+      if test -n "$dest"; then
+	func_append files " $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f)
+	if $install_cp; then :; else
+	  prev=$arg
+	fi
+	;;
+      -g | -m | -o)
+	prev=$arg
+	;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
+	    arg2=$install_override_mode
+	    no_mode=false
+	  fi
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      func_append install_prog " $func_quote_for_eval_result"
+      if test -n "$arg2"; then
+	func_quote_for_eval "$arg2"
+      fi
+      func_append install_shared_prog " $func_quote_for_eval_result"
+    done
+
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prev' option requires an argument"
+
+    if test -n "$install_override_mode" && $no_mode; then
+      if $install_cp; then :; else
+	func_quote_for_eval "$install_override_mode"
+	func_append install_shared_prog " -m $func_quote_for_eval_result"
+      fi
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	func_fatal_help "no file or destination specified"
+      else
+	func_fatal_help "you must specify a destination"
+      fi
+    fi
+
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir="$func_dirname_result"
+      destname="$func_basename_result"
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+	func_fatal_help "\`$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	func_append staticlibs " $file"
+	;;
+
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$file' is not a valid libtool archive"
+
+	library_names=
+	old_library=
+	relink_command=
+	func_source "$file"
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append current_libdirs " $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append future_libdirs " $libdir" ;;
+	  esac
+	fi
+
+	func_dirname "$file" "/" ""
+	dir="$func_dirname_result"
+	func_append dir "$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  test "$inst_prefix_dir" = "$destdir" && \
+	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  func_warning "relinking \`$file'"
+	  func_show_eval "$relink_command" \
+	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names; shift
+	if test -n "$1"; then
+	  realname="$1"
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
+	      'exit $?'
+	  tstripme="$stripme"
+	  case $host_os in
+	  cygwin* | mingw* | pw32* | cegcc*)
+	    case $realname in
+	    *.dll.a)
+	      tstripme=""
+	      ;;
+	    esac
+	    ;;
+	  esac
+	  if test -n "$tstripme" && test -n "$striplib"; then
+	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      test "$linkname" != "$realname" \
+		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  func_execute_cmds "$postinstall_cmds" 'exit $?'
+	fi
+
+	# Install the pseudo-library for information purposes.
+	func_basename "$file"
+	name="$func_basename_result"
+	instname="$dir/$name"i
+	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && func_append staticlibs " $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  func_lo2o "$destfile"
+	  staticdest=$func_lo2o_result
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	test -n "$destfile" && \
+	  func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  func_lo2o "$file"
+	  staticobj=$func_lo2o_result
+	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      func_stripname '' '.exe' "$file"
+	      file=$func_stripname_result
+	      stripped_ext=".exe"
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin* | *mingw*)
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      wrapper=$func_ltwrapper_scriptname_result
+	    else
+	      func_stripname '' '.exe' "$file"
+	      wrapper=$func_stripname_result
+	    fi
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if func_ltwrapper_script_p "$wrapper"; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  func_source "$wrapper"
+
+	  # Check the variables that should have been set.
+	  test -z "$generated_by_libtool_version" && \
+	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      func_source "$lib"
+	    fi
+	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      func_warning "\`$lib' has not been installed in \`$libdir'"
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  func_source "$wrapper"
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    $opt_dry_run || {
+	      if test "$finalize" = yes; then
+	        tmpdir=`func_mktempdir`
+		func_basename "$file$stripped_ext"
+		file="$func_basename_result"
+	        outputname="$tmpdir/$file"
+	        # Replace the output file specification.
+	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
+
+	        $opt_silent || {
+	          func_quote_for_expand "$relink_command"
+		  eval "func_echo $func_quote_for_expand_result"
+	        }
+	        if eval "$relink_command"; then :
+	          else
+		  func_error "error: relink \`$file' with the above command before installing it"
+		  $opt_dry_run || ${RM}r "$tmpdir"
+		  continue
+	        fi
+	        file="$outputname"
+	      else
+	        func_warning "cannot relink \`$file'"
+	      fi
+	    }
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    func_stripname '' '.exe' "$destfile"
+	    destfile=$func_stripname_result
+	    ;;
+	  esac
+	  ;;
+	esac
+	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+	$opt_dry_run || if test -n "$outputname"; then
+	  ${RM}r "$tmpdir"
+	fi
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      func_basename "$file"
+      name="$func_basename_result"
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+      func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+      tool_oldlib=$func_to_tool_file_result
+
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
+      fi
+
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
+
+    test -n "$future_libdirs" && \
+      func_warning "remember to run \`$progname --finish$future_libdirs'"
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = install && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $opt_debug
+    my_outputname="$1"
+    my_originator="$2"
+    my_pic_p="${3-no}"
+    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	my_dlsyms="${my_outputname}S.c"
+      else
+	func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
+
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+	# Discover the nlist of each of the dlfiles.
+	nlist="$output_objdir/${my_outputname}.nm"
+
+	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+	# Parse the name list into a source file.
+	func_verbose "creating $output_objdir/$my_dlsyms"
+
+	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+/* External symbol declarations for the compiler. */\
+"
+
+	if test "$dlself" = yes; then
+	  func_verbose "generating symbol list for \`$output'"
+
+	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+	  # Add our own program objects to the symbol list.
+	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	  for progfile in $progfiles; do
+	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
+	    func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -n "$exclude_expsyms"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  if test -n "$export_symbols_regex"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  # Prepare the list of exported symbols
+	  if test -z "$export_symbols"; then
+	    export_symbols="$output_objdir/$outputname.exp"
+	    $opt_dry_run || {
+	      $RM $export_symbols
+	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      case $host in
+	      *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+	        ;;
+	      esac
+	    }
+	  else
+	    $opt_dry_run || {
+	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	      case $host in
+	        *cygwin* | *mingw* | *cegcc* )
+	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+	          ;;
+	      esac
+	    }
+	  fi
+	fi
+
+	for dlprefile in $dlprefiles; do
+	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_basename "$dlprefile"
+	  name="$func_basename_result"
+          case $host in
+	    *cygwin* | *mingw* | *cegcc* )
+	      # if an import library, we need to obtain dlname
+	      if func_win32_import_lib_p "$dlprefile"; then
+	        func_tr_sh "$dlprefile"
+	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
+	        dlprefile_dlbasename=""
+	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
+	          # Use subshell, to avoid clobbering current variable values
+	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
+	          if test -n "$dlprefile_dlname" ; then
+	            func_basename "$dlprefile_dlname"
+	            dlprefile_dlbasename="$func_basename_result"
+	          else
+	            # no lafile. user explicitly requested -dlpreopen <import library>.
+	            $sharedlib_from_linklib_cmd "$dlprefile"
+	            dlprefile_dlbasename=$sharedlib_from_linklib_result
+	          fi
+	        fi
+	        $opt_dry_run || {
+	          if test -n "$dlprefile_dlbasename" ; then
+	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
+	          else
+	            func_warning "Could not compute DLL name from $name"
+	            eval '$ECHO ": $name " >> "$nlist"'
+	          fi
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+	            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+	        }
+	      else # not an import lib
+	        $opt_dry_run || {
+	          eval '$ECHO ": $name " >> "$nlist"'
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	        }
+	      fi
+	    ;;
+	    *)
+	      $opt_dry_run || {
+	        eval '$ECHO ": $name " >> "$nlist"'
+	        func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	        eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	      }
+	    ;;
+          esac
+	done
+
+	$opt_dry_run || {
+	  # Make sure we have at least an empty file.
+	  test -f "$nlist" || : > "$nlist"
+
+	  if test -n "$exclude_expsyms"; then
+	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	    $MV "$nlist"T "$nlist"
+	  fi
+
+	  # Try sorting and uniquifying the output.
+	  if $GREP -v "^: " < "$nlist" |
+	      if sort -k 3 </dev/null >/dev/null 2>&1; then
+		sort -k 3
+	      else
+		sort +2
+	      fi |
+	      uniq > "$nlist"S; then
+	    :
+	  else
+	    $GREP -v "^: " < "$nlist" > "$nlist"S
+	  fi
+
+	  if test -f "$nlist"S; then
+	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+	  else
+	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
+	  fi
+
+	  echo >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+extern LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];
+LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{\
+  { \"$my_originator\", (void *) 0 },"
+
+	  case $need_lib_prefix in
+	  no)
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  *)
+	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  esac
+	  echo >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	} # !$opt_dry_run
+
+	pic_flag_for_symtable=
+	case "$compile_command " in
+	*" -static "*) ;;
+	*)
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+	  *-*-hpux*)
+	    pic_flag_for_symtable=" $pic_flag"  ;;
+	  *)
+	    if test "X$my_pic_p" != Xno; then
+	      pic_flag_for_symtable=" $pic_flag"
+	    fi
+	    ;;
+	  esac
+	  ;;
+	esac
+	symtab_cflags=
+	for arg in $LTCFLAGS; do
+	  case $arg in
+	  -pie | -fpie | -fPIE) ;;
+	  *) func_append symtab_cflags " $arg" ;;
+	  esac
+	done
+
+	# Now compile the dynamic symbol file.
+	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+	# Clean up the generated files.
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+
+	# Transform the symbol file into the correct name.
+	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	case $host in
+	*cygwin* | *mingw* | *cegcc* )
+	  if test -f "$output_objdir/$my_outputname.def"; then
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	  else
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  fi
+	  ;;
+	*)
+	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  ;;
+	esac
+	;;
+      *)
+	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
+    fi
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
+func_win32_libid ()
+{
+  $opt_debug
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+      func_to_tool_file "$1" func_convert_file_msys_to_w32
+      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+	$SED -n -e '
+	    1,100{
+		/ I /{
+		    s,.*,import,
+		    p
+		    q
+		}
+	    }'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
+
+# func_cygming_dll_for_implib ARG
+#
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib ()
+{
+  $opt_debug
+  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
+}
+
+# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
+#
+# The is the core of a fallback implementation of a
+# platform-specific function to extract the name of the
+# DLL associated with the specified import library LIBNAME.
+#
+# SECTION_NAME is either .idata$6 or .idata$7, depending
+# on the platform and compiler that created the implib.
+#
+# Echos the name of the DLL associated with the
+# specified import library.
+func_cygming_dll_for_implib_fallback_core ()
+{
+  $opt_debug
+  match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
+  $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
+    $SED '/^Contents of section '"$match_literal"':/{
+      # Place marker at beginning of archive member dllname section
+      s/.*/====MARK====/
+      p
+      d
+    }
+    # These lines can sometimes be longer than 43 characters, but
+    # are always uninteresting
+    /:[	 ]*file format pe[i]\{,1\}-/d
+    /^In archive [^:]*:/d
+    # Ensure marker is printed
+    /^====MARK====/p
+    # Remove all lines with less than 43 characters
+    /^.\{43\}/!d
+    # From remaining lines, remove first 43 characters
+    s/^.\{43\}//' |
+    $SED -n '
+      # Join marker and all lines until next marker into a single line
+      /^====MARK====/ b para
+      H
+      $ b para
+      b
+      :para
+      x
+      s/\n//g
+      # Remove the marker
+      s/^====MARK====//
+      # Remove trailing dots and whitespace
+      s/[\. \t]*$//
+      # Print
+      /./p' |
+    # we now have a list, one entry per line, of the stringified
+    # contents of the appropriate section of all members of the
+    # archive which possess that section. Heuristic: eliminate
+    # all those which have a first or second character that is
+    # a '.' (that is, objdump's representation of an unprintable
+    # character.) This should work for all archives with less than
+    # 0x302f exports -- but will fail for DLLs whose name actually
+    # begins with a literal '.' or a single character followed by
+    # a '.'.
+    #
+    # Of those that remain, print the first one.
+    $SED -e '/^\./d;/^.\./d;q'
+}
+
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
+# func_cygming_dll_for_implib_fallback ARG
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+#
+# This fallback implementation is for use when $DLLTOOL
+# does not support the --identify-strict option.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib_fallback ()
+{
+  $opt_debug
+  if func_cygming_gnu_implib_p "$1" ; then
+    # binutils import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
+  elif func_cygming_ms_implib_p "$1" ; then
+    # ms-generated import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
+  else
+    # unknown
+    sharedlib_from_linklib_result=""
+  fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $opt_debug
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+    if test "$lock_old_archive_extraction" = yes; then
+      lockfile=$f_ex_an_ar_oldlib.lock
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    fi
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+		   'stat=$?; rm -f "$lockfile"; exit $stat'
+    if test "$lock_old_archive_extraction" = yes; then
+      $opt_dry_run || rm -f "$lockfile"
+    fi
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $opt_debug
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib="$func_basename_result"
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  func_arith $extracted_serial + 1
+	  extracted_serial=$func_arith_result
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir="$my_gentop/$my_xlib_u"
+
+      func_mkdir_p "$my_xdir"
+
+      case $host in
+      *-darwin*)
+	func_verbose "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	$opt_dry_run || {
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`basename "$darwin_archive"`
+	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+	  if test -n "$darwin_arches"; then
+	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
+	      $LIPO -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    $RM -rf unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd $darwin_orig_dir
+	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	} # !$opt_dry_run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+	;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
+    done
+
+    func_extract_archives_result="$my_oldobjs"
+}
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=${1-no}
+
+	$ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    file=\"\$0\""
+
+    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+    $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+    ECHO=\"$qECHO\"
+  fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's $0 value, followed by "$@".
+lt_option_debug=
+func_parse_lt_options ()
+{
+  lt_script_arg0=\$0
+  shift
+  for lt_opt
+  do
+    case \"\$lt_opt\" in
+    --lt-debug) lt_option_debug=1 ;;
+    --lt-dump-script)
+        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
+        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
+        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
+        cat \"\$lt_dump_D/\$lt_dump_F\"
+        exit 0
+      ;;
+    --lt-*)
+        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
+        exit 1
+      ;;
+    esac
+  done
+
+  # Print the debug banner immediately:
+  if test -n \"\$lt_option_debug\"; then
+    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+  fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+  lt_dump_args_N=1;
+  for lt_arg
+  do
+    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
+  done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+"
+  case $host in
+  # Backslashes separate directories on plain windows
+  *-*-mingw | *-*-os2* | *-cegcc*)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+    ;;
+
+  *)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+    ;;
+  esac
+  $ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from \$@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+  case \" \$* \" in
+  *\\ --lt-*)
+    for lt_wr_arg
+    do
+      case \$lt_wr_arg in
+      --lt-*) ;;
+      *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+      esac
+      shift
+    done ;;
+  esac
+  func_exec_program_core \${1+\"\$@\"}
+}
+
+  # Parse options
+  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
+  done
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
+
+	  $ECHO "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$ECHO \"\$relink_command_output\" >&2
+	$RM \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+	else
+	  $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$ECHO "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# fixup the dll searchpath if we need to.
+	#
+	# Fix the DLL searchpath if we need to.  Do this before prepending
+	# to shlibpath, because on Windows, both are PATH and uninstalled
+	# libraries must come first.
+	if test -n "$dllsearchpath"; then
+	  $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	$ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+      func_exec_program \${1+\"\$@\"}
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+	cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+*/
+EOF
+	    cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+/* declarations of non-ANSI functions */
+#if defined(__MINGW32__)
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined(__CYGWIN__)
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined (other platforms) ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined(_MSC_VER)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+# define S_IXUSR _S_IEXEC
+# ifndef _INTPTR_T_DEFINED
+#  define _INTPTR_T_DEFINED
+#  define intptr_t int
+# endif
+#elif defined(__MINGW32__)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+#elif defined(__CYGWIN__)
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined (other platforms) ... */
+#endif
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+/* path handling portability macros */
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+#if defined(LT_DEBUGWRAPPER)
+static int lt_debug = 1;
+#else
+static int lt_debug = 0;
+#endif
+
+const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_debugprintf (const char *file, int line, const char *fmt, ...);
+void lt_fatal (const char *file, int line, const char *message, ...);
+static const char *nonnull (const char *s);
+static const char *nonempty (const char *s);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
+EOF
+
+	    cat <<EOF
+volatile const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_path "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_path "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test "$fast_install" = yes; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+	    else
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+	    fi
+
+
+	    cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  intptr_t rval = 127;
+
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  newargz = XMALLOC (char *, argc + 1);
+
+  /* very simple arg parsing; don't want to rely on getopt
+   * also, copy all non cwrapper options to newargz, except
+   * argz[0], which is handled differently
+   */
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (strcmp (argv[i], dumpscript_opt) == 0)
+	{
+EOF
+	    case "$host" in
+	      *mingw* | *cygwin* )
+		# make stdout use "unix" line endings
+		echo "          setmode(1,_O_BINARY);"
+		;;
+	      esac
+
+	    cat <<"EOF"
+	  lt_dump_script (stdout);
+	  return 0;
+	}
+      if (strcmp (argv[i], debug_opt) == 0)
+	{
+          lt_debug = 1;
+          continue;
+	}
+      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal (__FILE__, __LINE__,
+		    "unrecognized %s option: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
+
+EOF
+	    cat <<EOF
+  /* The GNU banner must be the first non-error debug message */
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+EOF
+	    cat <<"EOF"
+  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
+
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (before symlink chase) at: %s\n",
+		  tmp_pathspec);
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (after symlink chase) at: %s\n",
+		  actual_cwrapper_path);
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(main) libtool target name: %s\n",
+		  target_name);
+EOF
+
+	    cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
+
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
+
+	    case $host_os in
+	      mingw*)
+	    cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+	*p = '/';
+      }
+  }
+EOF
+	    ;;
+	    esac
+
+	    cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
+
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
+     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
+     because on Windows, both *_VARNAMEs are PATH but uninstalled
+     libraries must come first. */
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+
+  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
+		  nonnull (lt_argv_zero));
+  for (i = 0; i < newargc; i++)
+    {
+      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
+		      i, nonnull (newargz[i]));
+    }
+
+EOF
+
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  newargz = prepare_spawn (newargz);
+  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      lt_debugprintf (__FILE__, __LINE__,
+		      "(main) failed to launch target \"%s\": %s\n",
+		      lt_argv_zero, nonnull (strerror (errno)));
+      return 127;
+    }
+  return rval;
+EOF
+		;;
+	      *)
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+		;;
+	    esac
+
+	    cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal (__FILE__, __LINE__, "memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+			  string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable (const char *path)
+{
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
+
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char *concat_name;
+
+  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
+                  nonempty (wrapper));
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+	return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+	{
+	  concat_name = xstrdup (wrapper);
+	  if (check_executable (concat_name))
+	    return concat_name;
+	  XFREE (concat_name);
+	}
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+    }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+	has_slash = 1;
+	break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+	{
+	  for (p = path; *p; p = p_next)
+	    {
+	      const char *q;
+	      size_t p_len;
+	      for (q = p; *q; q++)
+		if (IS_PATH_SEPARATOR (*q))
+		  break;
+	      p_len = q - p;
+	      p_next = (*q == '\0' ? q : q + 1);
+	      if (p_len == 0)
+		{
+		  /* empty path: current directory */
+		  if (getcwd (tmp, LT_PATHMAX) == NULL)
+		    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+                              nonnull (strerror (errno)));
+		  tmp_len = strlen (tmp);
+		  concat_name =
+		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, tmp, tmp_len);
+		  concat_name[tmp_len] = '/';
+		  strcpy (concat_name + tmp_len + 1, wrapper);
+		}
+	      else
+		{
+		  concat_name =
+		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, p, p_len);
+		  concat_name[p_len] = '/';
+		  strcpy (concat_name + p_len + 1, wrapper);
+		}
+	      if (check_executable (concat_name))
+		return concat_name;
+	      XFREE (concat_name);
+	    }
+	}
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+              nonnull (strerror (errno)));
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      lt_debugprintf (__FILE__, __LINE__,
+		      "checking path component for symlinks: %s\n",
+		      tmp_pathspec);
+      if (lstat (tmp_pathspec, &s) == 0)
+	{
+	  if (S_ISLNK (s.st_mode) != 0)
+	    {
+	      has_symlinks = 1;
+	      break;
+	    }
+
+	  /* search backwards for last DIR_SEPARATOR */
+	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    p--;
+	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    {
+	      /* no more DIR_SEPARATORS left */
+	      break;
+	    }
+	  *p = '\0';
+	}
+      else
+	{
+	  lt_fatal (__FILE__, __LINE__,
+		    "error accessing file \"%s\": %s",
+		    tmp_pathspec, nonnull (strerror (errno)));
+	}
+    }
+  XFREE (tmp_pathspec);
+
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
+
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal (__FILE__, __LINE__,
+		"could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert (str != NULL);
+  assert (pat != NULL);
+
+  len = strlen (str);
+  patlen = strlen (pat);
+
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (strcmp (str, pat) == 0)
+	*str = '\0';
+    }
+  return str;
+}
+
+void
+lt_debugprintf (const char *file, int line, const char *fmt, ...)
+{
+  va_list args;
+  if (lt_debug)
+    {
+      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
+      va_start (args, fmt);
+      (void) vfprintf (stderr, fmt, args);
+      va_end (args);
+    }
+}
+
+static void
+lt_error_core (int exit_status, const char *file,
+	       int line, const char *mode,
+	       const char *message, va_list ap)
+{
+  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *file, int line, const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
+  va_end (ap);
+}
+
+static const char *
+nonnull (const char *s)
+{
+  return s ? s : "(null)";
+}
+
+static const char *
+nonempty (const char *s)
+{
+  return (s && !*s) ? "(empty)" : nonnull (s);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_setenv) setting '%s' to '%s'\n",
+                  nonnull (name), nonnull (value));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    int len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      int orig_value_len = strlen (orig_value);
+      int add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      int len = strlen (new_value);
+      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[len-1] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+EOF
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+   Note that spawn() does not by itself call the command interpreter
+     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+         GetVersionEx(&v);
+         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+      }) ? "cmd.exe" : "command.com").
+   Instead it simply concatenates the arguments, separated by ' ', and calls
+   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
+   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+   special way:
+   - Space and tab are interpreted as delimiters. They are not treated as
+     delimiters if they are surrounded by double quotes: "...".
+   - Unescaped double quotes are removed from the input. Their only effect is
+     that within double quotes, space and tab are treated like normal
+     characters.
+   - Backslashes not followed by double quotes are not special.
+   - But 2*n+1 backslashes followed by a double quote become
+     n backslashes followed by a double quote (n >= 0):
+       \" -> "
+       \\\" -> \"
+       \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+  size_t argc;
+  char **new_argv;
+  size_t i;
+
+  /* Count number of arguments.  */
+  for (argc = 0; argv[argc] != NULL; argc++)
+    ;
+
+  /* Allocate new argument vector.  */
+  new_argv = XMALLOC (char *, argc + 1);
+
+  /* Put quoted arguments into the new argument vector.  */
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+
+      if (string[0] == '\0')
+	new_argv[i] = xstrdup ("\"\"");
+      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+	{
+	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+	  size_t length;
+	  unsigned int backslashes;
+	  const char *s;
+	  char *quoted_string;
+	  char *p;
+
+	  length = 0;
+	  backslashes = 0;
+	  if (quote_around)
+	    length++;
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		length += backslashes + 1;
+	      length++;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    length += backslashes + 1;
+
+	  quoted_string = XMALLOC (char, length + 1);
+
+	  p = quoted_string;
+	  backslashes = 0;
+	  if (quote_around)
+	    *p++ = '"';
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		{
+		  unsigned int j;
+		  for (j = backslashes + 1; j > 0; j--)
+		    *p++ = '\\';
+		}
+	      *p++ = c;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    {
+	      unsigned int j;
+	      for (j = backslashes; j > 0; j--)
+		*p++ = '\\';
+	      *p++ = '"';
+	    }
+	  *p = '\0';
+
+	  new_argv[i] = quoted_string;
+	}
+      else
+	new_argv[i] = (char *) string;
+    }
+  new_argv[argc] = NULL;
+
+  return new_argv;
+}
+EOF
+		;;
+	    esac
+
+            cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+	    func_emit_wrapper yes |
+	      $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/  fputs ("\1", f);/p
+g
+D'
+            cat <<"EOF"
+}
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+    $opt_debug
+    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+    *import*) : ;;
+    *) false ;;
+    esac
+}
+
+# func_mode_link arg...
+func_mode_link ()
+{
+    $opt_debug
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
+
+    avoid_version=no
+    bindir=
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module="${wl}-single_module"
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	break
+	;;
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    func_warning "complete static linking is impossible in this configuration"
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	esac
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  func_append compile_command " @OUTPUT@"
+	  func_append finalize_command " @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	bindir)
+	  bindir="$arg"
+	  prev=
+	  continue
+	  ;;
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    func_append compile_command " @SYMFILE@"
+	    func_append finalize_command " @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      func_append dlfiles " $arg"
+	    else
+	      func_append dlprefiles " $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  test -f "$arg" \
+	    || func_fatal_error "symbol file \`$arg' does not exist"
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	framework)
+	  case $host in
+	    *-*-darwin*)
+	      case "$deplibs " in
+		*" $qarg.ltframework "*) ;;
+		*) func_append deplibs " $qarg.ltframework" # this is fixed later
+		   ;;
+	      esac
+	      ;;
+	  esac
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat "$save_arg"`
+	    do
+#	      func_append moreargs " $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if func_lalib_unsafe_p "$arg"; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		func_source "$arg"
+
+		if test -z "$pic_object" ||
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none &&
+		   test "$non_pic_object" = none; then
+		  func_fatal_error "cannot find name of object for \`$arg'"
+		fi
+
+		# Extract subdirectory from the argument.
+		func_dirname "$arg" "/" ""
+		xdir="$func_dirname_result"
+
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
+
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      func_append dlfiles " $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    func_append dlprefiles " $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  func_append libobjs " $pic_object"
+		  arg="$pic_object"
+		fi
+
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
+
+		  # A standard non-PIC object
+		  func_append non_pic_objects " $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if $opt_dry_run; then
+		  # Extract subdirectory from the argument.
+		  func_dirname "$arg" "/" ""
+		  xdir="$func_dirname_result"
+
+		  func_lo2o "$arg"
+		  pic_object=$xdir$objdir/$func_lo2o_result
+		  non_pic_object=$xdir$func_lo2o_result
+		  func_append libobjs " $pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+	        else
+		  func_fatal_error "\`$arg' is not a valid libtool object"
+		fi
+	      fi
+	    done
+	  else
+	    func_fatal_error "link input file \`$arg' does not exist"
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    func_fatal_error "only absolute run-paths are allowed"
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) func_append rpath " $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) func_append xrpath " $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	shrext)
+	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	weak)
+	  func_append weak_libs " $arg"
+	  prev=
+	  continue
+	  ;;
+	xcclinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xcompiler)
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $wl$qarg"
+	  prev=
+	  func_append compile_command " $wl$qarg"
+	  func_append finalize_command " $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  # See comment for -static flag below, for more details.
+	  func_append compile_command " $link_static_flag"
+	  func_append finalize_command " $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -bindir)
+	prev=bindir
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  func_fatal_error "more than one -exported-symbols argument is not allowed"
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework)
+	prev=framework
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	func_stripname "-L" '' "$arg"
+	if test -z "$func_stripname_result"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between \`-L' and \`$1'"
+	  else
+	    func_fatal_error "need path for \`-L' option"
+	  fi
+	fi
+	func_resolve_sysroot "$func_stripname_result"
+	dir=$func_resolve_sysroot_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  test -z "$absdir" && \
+	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "* | *" $arg "*)
+	  # Will only happen for absolute or sysroot arguments
+	  ;;
+	*)
+	  # Preserve sysroot, but never include relative directories
+	  case $dir in
+	    [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
+	    *) func_append deplibs " -L$dir" ;;
+	  esac
+	  func_append lib_search_path " $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
+	  *) func_append dllsearchpath ":$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    func_append deplibs " System.ltframework"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	func_append deplibs " $arg"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot|--sysroot)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	prev=xcompiler
+	continue
+	;;
+
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	case "$new_inherited_linker_flags " in
+	    *" $arg "*) ;;
+	    * ) func_append new_inherited_linker_flags " $arg" ;;
+	esac
+	continue
+	;;
+
+      -multi_module)
+	single_module="${wl}-multi_module"
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  func_warning "\`-no-install' is ignored for $host"
+	  func_warning "assuming \`-no-fast-install' instead"
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	func_stripname '-R' '' "$arg"
+	dir=$func_stripname_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	=*)
+	  func_stripname '=' '' "$dir"
+	  dir=$lt_sysroot$func_stripname_result
+	  ;;
+	*)
+	  func_fatal_error "only absolute run-paths are allowed"
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) func_append xrpath " $dir" ;;
+	esac
+	continue
+	;;
+
+      -shared)
+	# The effects of -shared are defined in a previous loop.
+	continue
+	;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -weak)
+        prev=weak
+	continue
+	;;
+
+      -Wc,*)
+	func_stripname '-Wc,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  func_append arg " $func_quote_for_eval_result"
+	  func_append compiler_flags " $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Wl,*)
+	func_stripname '-Wl,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  func_append arg " $wl$func_quote_for_eval_result"
+	  func_append compiler_flags " $wl$func_quote_for_eval_result"
+	  func_append linker_flags " $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # -msg_* for osf cc
+      -msg_*)
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      # Flags to be passed through unchanged, with rationale:
+      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
+      # -r[0-9][0-9]*        specify processor for the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
+      # +DA*, +DD*           enable 64-bit mode for the HP compiler
+      # -q*                  compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
+      # -F/path              path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # @file                GCC response files
+      # -tp=*                Portland pgcc target processor selection
+      # --sysroot=*          for sysroot support
+      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
+      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        func_append compiler_flags " $arg"
+        continue
+        ;;
+
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      *.$objext)
+	# A standard object.
+	func_append objs " $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if func_lalib_unsafe_p "$arg"; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  func_source "$arg"
+
+	  if test -z "$pic_object" ||
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none &&
+	     test "$non_pic_object" = none; then
+	    func_fatal_error "cannot find name of object for \`$arg'"
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  func_dirname "$arg" "/" ""
+	  xdir="$func_dirname_result"
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		func_append dlfiles " $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      func_append dlprefiles " $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    func_append libobjs " $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    func_append non_pic_objects " $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if $opt_dry_run; then
+	    # Extract subdirectory from the argument.
+	    func_dirname "$arg" "/" ""
+	    xdir="$func_dirname_result"
+
+	    func_lo2o "$arg"
+	    pic_object=$xdir$objdir/$func_lo2o_result
+	    non_pic_object=$xdir$func_lo2o_result
+	    func_append libobjs " $pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  else
+	    func_fatal_error "\`$arg' is not a valid libtool object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	func_append deplibs " $arg"
+	func_append old_deplibs " $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	func_resolve_sysroot "$arg"
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  func_append dlfiles " $func_resolve_sysroot_result"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  func_append dlprefiles " $func_resolve_sysroot_result"
+	  prev=
+	else
+	  func_append deplibs " $func_resolve_sysroot_result"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prevarg' option requires an argument"
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname="$func_basename_result"
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    func_dirname "$output" "/" ""
+    output_objdir="$func_dirname_result$objdir"
+    func_to_tool_file "$output_objdir/"
+    tool_output_objdir=$func_to_tool_file_result
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
+
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_preserve_dup_deps ; then
+	case "$libs " in
+	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	esac
+      fi
+      func_append libs " $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
+	  esac
+	  func_append pre_post_deps " $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+	passes="conv dlpreopen link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test "$linkmode,$pass" = "lib,link"; then
+	## FIXME: Find the place where the list is rebuilt in the wrong
+	##        order, and fix it there properly
+        tmp_deplibs=
+	for deplib in $deplibs; do
+	  tmp_deplibs="$deplib $tmp_deplibs"
+	done
+	deplibs="$tmp_deplibs"
+      fi
+
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link)
+	  libs="$deplibs %DEPLIBS%"
+	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+	  ;;
+	esac
+      fi
+      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+	# Collect and forward deplibs of preopened libtool libs
+	for lib in $dlprefiles; do
+	  # Ignore non-libtool-libs
+	  dependency_libs=
+	  func_resolve_sysroot "$lib"
+	  case $lib in
+	  *.la)	func_source "$func_resolve_sysroot_result" ;;
+	  esac
+
+	  # Collect preopened libtool deplibs, except any this library
+	  # has declared as weak libs
+	  for deplib in $dependency_libs; do
+	    func_basename "$deplib"
+            deplib_base=$func_basename_result
+	    case " $weak_libs " in
+	    *" $deplib_base "*) ;;
+	    *) func_append deplibs " $deplib" ;;
+	    esac
+	  done
+	done
+	libs="$dlprefiles"
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    func_append compiler_flags " $deplib"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    func_warning "\`-l' is ignored for archives/objects"
+	    continue
+	  fi
+	  func_stripname '-l' '' "$deplib"
+	  name=$func_stripname_result
+	  if test "$linkmode" = lib; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if func_lalib_p "$lib"; then
+		  library_names=
+		  old_library=
+		  func_source "$lib"
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    func_dirname "$lib" "" "."
+		    ladir="$func_dirname_result"
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+		;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	*.ltframework)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  *)
+	    func_warning "\`-L' is ignored for archives/objects"
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    func_stripname '-R' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    dir=$func_resolve_sysroot_result
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) func_append xrpath " $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la)
+	  func_resolve_sysroot "$deplib"
+	  lib=$func_resolve_sysroot_result
+	  ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    # Linking convenience modules into shared libraries is allowed,
+	    # but linking other static libraries is non-portable.
+	    case " $dlpreconveniencelibs " in
+	    *" $deplib "*) ;;
+	    *)
+	      valid_a_lib=no
+	      case $deplibs_check_method in
+		match_pattern*)
+		  set dummy $deplibs_check_method; shift
+		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		    valid_a_lib=yes
+		  fi
+		;;
+		pass_all)
+		  valid_a_lib=yes
+		;;
+	      esac
+	      if test "$valid_a_lib" != yes; then
+		echo
+		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because the file extensions .$libext of this argument makes me believe"
+		echo "*** that it is just a static archive that I should not use here."
+	      else
+		echo
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      fi
+	      ;;
+	    esac
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      func_append newdlprefiles " $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      func_append newdlfiles " $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
+	fi
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$lib" \
+	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+
+	func_dirname "$lib" "" "."
+	ladir="$func_dirname_result"
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	inherited_linker_flags=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	func_source "$lib"
+
+	# Convert "-framework foo" to "foo.ltframework"
+	if test -n "$inherited_linker_flags"; then
+	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
+	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+	    case " $new_inherited_linker_flags " in
+	      *" $tmp_inherited_linker_flag "*) ;;
+	      *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
+	    esac
+	  done
+	fi
+	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && func_append dlfiles " $dlopen"
+	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      func_fatal_error "cannot find name of link library for \`$lib'"
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    func_append convenience " $ladir/$objdir/$old_library"
+	    func_append old_convenience " $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+	      if $opt_preserve_dup_deps ; then
+		case "$tmp_libs " in
+		*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+		esac
+	      fi
+	      func_append tmp_libs " $deplib"
+	    done
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    func_fatal_error "\`$lib' is not a convenience library"
+	  fi
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	if test -n "$old_library" &&
+	   { test "$prefer_static_libs" = yes ||
+	     test "$prefer_static_libs,$installed" = "built,no"; }; then
+	  linklib=$old_library
+	else
+	  for l in $old_library $library_names; do
+	    linklib="$l"
+	  done
+	fi
+	if test -z "$linklib"; then
+	  func_fatal_error "cannot find name of link library for \`$lib'"
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    func_append dlprefiles " $lib $dependency_libs"
+	  else
+	    func_append newdlfiles " $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "passing it literally to the linker, although it might fail"
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	func_basename "$lib"
+	laname="$func_basename_result"
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    func_warning "library \`$lib' was moved."
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$lt_sysroot$libdir"
+	    absdir="$lt_sysroot$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  fi
+	fi # $installed = yes
+	func_stripname 'lib' '.la' "$laname"
+	name=$func_stripname_result
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir" && test "$linkmode" = prog; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	  fi
+	  case "$host" in
+	    # special handling for platforms with PE-DLLs.
+	    *cygwin* | *mingw* | *cegcc* )
+	      # Linker will automatically link against shared library if both
+	      # static and shared are present.  Therefore, ensure we extract
+	      # symbols from the import library if a shared library is present
+	      # (otherwise, the dlopen module name will be incorrect).  We do
+	      # this by putting the import library name into $newdlprefiles.
+	      # We recover the dlopen module name by 'saving' the la file
+	      # name in a special purpose variable, and (later) extracting the
+	      # dlname from the la file.
+	      if test -n "$dlname"; then
+	        func_tr_sh "$dir/$linklib"
+	        eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
+	        func_append newdlprefiles " $dir/$linklib"
+	      else
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      fi
+	    ;;
+	    * )
+	      # Prefer using a static library (so that no silly _DYNAMIC symbols
+	      # are required to link).
+	      if test -n "$old_library"; then
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      # Otherwise, use the dlname, so that lt_dlopen finds it.
+	      elif test -n "$dlname"; then
+	        func_append newdlprefiles " $dir/$dlname"
+	      else
+	        func_append newdlprefiles " $dir/$linklib"
+	      fi
+	    ;;
+	  esac
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  func_append newlib_search_path " $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) func_stripname '-L' '' "$deplib"
+	         func_resolve_sysroot "$func_stripname_result"
+	         func_append newlib_search_path " $func_resolve_sysroot_result"
+		 ;;
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { { test "$prefer_static_libs" = no ||
+	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath:" in
+	      *"$absdir:"*) ;;
+	      *) func_append temp_rpath "$absdir:" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc*)
+	      # No point in relinking DLLs because paths are not encoded
+	      func_append notinst_deplibs " $lib"
+	      need_relink=no
+	    ;;
+	  *)
+	    if test "$installed" = no; then
+	      func_append notinst_deplibs " $lib"
+	      need_relink=yes
+	    fi
+	    ;;
+	  esac
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on some
+	  # systems (darwin).  Don't bleat about dlopened modules though!
+	  dlopenmodule=""
+	  for dlpremoduletest in $dlprefiles; do
+	    if test "X$dlpremoduletest" = "X$lib"; then
+	      dlopenmodule="$dlpremoduletest"
+	      break
+	    fi
+	  done
+	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	    echo
+	    if test "$linkmode" = prog; then
+	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $ECHO "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    shift
+	    realname="$1"
+	    shift
+	    libname=`eval "\\$ECHO \"$libname_spec\""`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw* | *cegcc*)
+	        func_arith $current - $age
+		major=$func_arith_result
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    func_basename "$soroot"
+	    soname="$func_basename_result"
+	    func_stripname 'lib' '.dll' "$soname"
+	    newlib=libimp-$func_stripname_result.a
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      func_verbose "generating import library for \`$soname'"
+	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$opt_mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a (non-dlopened) module then we can not
+		    # link against it, someone is ignoring the earlier warnings
+		    if /usr/bin/file -L $add 2> /dev/null |
+			 $GREP ": [^:]* bundle" >/dev/null ; then
+		      if test "X$dlopenmodule" != "X$lib"; then
+			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
+			if test -z "$old_library" ; then
+			  echo
+			  echo "*** And there doesn't seem to be a static archive available"
+			  echo "*** The link will probably fail, sorry"
+			else
+			  add="$dir/$old_library"
+			fi
+		      elif test -n "$old_library"; then
+			add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes &&
+	         test "$hardcode_direct_absolute" = no; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$absdir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      func_append add_dir " -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      func_fatal_configuration "unsupported hardcode properties"
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes &&
+		 test "$hardcode_minus_L" != yes &&
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) func_append finalize_shlibpath "$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$opt_mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes &&
+	       test "$hardcode_direct_absolute" = no; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) func_append finalize_shlibpath "$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+		add="$inst_prefix_dir$libdir/$linklib"
+	      else
+		add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    func_append add_dir " -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    echo
+	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    echo "*** I have the capability to make that library automatically link in when"
+	    echo "*** you link to this library.  But I can only do this if you have a"
+	    echo "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      echo "*** But as you try to build a module library, libtool will still create "
+	      echo "*** a static module, that should work as long as the dlopening application"
+	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		echo
+		echo "*** However, this would only work if libtool was able to extract symbol"
+		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		echo "*** not find such a program.  So, this module is probably useless."
+		echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) func_stripname '-R' '' "$libdir"
+	           temp_xrpath=$func_stripname_result
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) func_append xrpath " $temp_xrpath";;
+		   esac;;
+	      *) func_append temp_deplibs " $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  func_append newlib_search_path " $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    case $deplib in
+              -L*) func_stripname '-L' '' "$deplib"
+                   func_resolve_sysroot "$func_stripname_result";;
+              *) func_resolve_sysroot "$deplib" ;;
+            esac
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $func_resolve_sysroot_result "*)
+                func_append specialdeplibs " $func_resolve_sysroot_result" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $func_resolve_sysroot_result"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      path=
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+	        func_resolve_sysroot "$deplib"
+	        deplib=$func_resolve_sysroot_result
+	        func_dirname "$deplib" "" "."
+		dir=$func_dirname_result
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    func_warning "cannot determine absolute directory name of \`$dir'"
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if $GREP "^installed=no" $deplib > /dev/null; then
+		case $host in
+		*-*-darwin*)
+		  depdepl=
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$absdir/$objdir/$depdepl" ; then
+		      depdepl="$absdir/$objdir/$depdepl"
+		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+		      func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+		      func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
+		      path=
+		    fi
+		  fi
+		  ;;
+		*)
+		  path="-L$absdir/$objdir"
+		  ;;
+		esac
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  test -z "$libdir" && \
+		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  test "$absdir" != "$libdir" && \
+		    func_warning "\`$deplib' seems to be moved"
+
+		  path="-L$absdir"
+		fi
+		;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test "$pass" = link; then
+	if test "$linkmode" = "prog"; then
+	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+	else
+	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	fi
+      fi
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) func_append lib_search_path " $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) func_append tmp_libs " $deplib" ;;
+	      esac
+	      ;;
+	    *) func_append tmp_libs " $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  func_append tmp_libs " $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+    fi
+    if test "$linkmode" = prog || test "$linkmode" = lib; then
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+	func_warning "\`-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      func_append objs "$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	func_stripname 'lib' '.la' "$outputname"
+	name=$func_stripname_result
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	test "$module" = no && \
+	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  func_stripname '' '.la' "$outputname"
+	  name=$func_stripname_result
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  func_stripname '' '.la' "$outputname"
+	  libname=$func_stripname_result
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	else
+	  echo
+	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+	  $ECHO "*** objects $objs is not portable!"
+	  func_append libobjs " $objs"
+	fi
+      fi
+
+      test "$dlself" != no && \
+	func_warning "\`-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test "$#" -gt 1 && \
+	func_warning "ignoring multiple \`-rpath's for a libtool library"
+
+      install_libdir="$1"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	test -n "$vinfo" && \
+	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+
+	test -n "$release" && \
+	  func_warning "\`-release' is ignored for convenience libraries"
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	shift
+	IFS="$save_ifs"
+
+	test -n "$7" && \
+	  func_fatal_help "too many parameters to \`-version-info'"
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$1"
+	  number_minor="$2"
+	  number_revision="$3"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  # correct linux to gnu/linux during the next big refactor
+	  darwin|linux|osf|windows|none)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|qnx|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_minor"
+	    lt_irix_increment=no
+	    ;;
+	  *)
+	    func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$1"
+	  revision="$2"
+	  age="$3"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "CURRENT \`$current' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "REVISION \`$revision' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "AGE \`$age' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  func_arith $current + 1
+	  minor_current=$func_arith_result
+	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	irix | nonstopux)
+	  if test "X$lt_irix_increment" = "Xno"; then
+	    func_arith $current - $age
+	  else
+	    func_arith $current - $age + 1
+	  fi
+	  major=$func_arith_result
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    func_arith $revision - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux) # correct to gnu/linux during the next big refactor
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    func_arith $current - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  func_append verstring ":${current}.0"
+	  ;;
+
+	qnx)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  func_arith $current - $age
+	  major=$func_arith_result
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    func_warning "undefined symbols not allowed in $host shared libraries"
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" "yes"
+      func_append libobjs " $symfileobj"
+      test "X$libobjs" = "X " && libobjs=
+
+      if test "$opt_mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$ECHO "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext | *.gcno)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+		 then
+		   continue
+		 fi
+	       fi
+	       func_append removelist " $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	test -n "$removelist" && \
+	  func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	func_append oldlibs " $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  func_replace_sysroot "$libdir"
+	  func_append temp_xrpath " -R$func_replace_sysroot_result"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) func_append dlfiles " $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) func_append dlprefiles " $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    func_append deplibs " System.ltframework"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      func_append deplibs " -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $opt_dry_run || $RM conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $opt_dry_run || $RM conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    func_append newdeplibs " $i"
+		    i=""
+		    ;;
+		  esac
+		fi
+		if test -n "$i" ; then
+		  libname=`eval "\\$ECHO \"$libname_spec\""`
+		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		  set dummy $deplib_matches; shift
+		  deplib_match=$1
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    func_append newdeplibs " $i"
+		  else
+		    droppeddeps=yes
+		    echo
+		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		    echo "*** I have the capability to make that library automatically link in when"
+		    echo "*** you link to this library.  But I can only do this if you have a"
+		    echo "*** shared version of the library, which I believe you do not have"
+		    echo "*** because a test_compile did reveal that the linker did not use it for"
+		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		$opt_dry_run || $RM conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      func_append newdeplibs " $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval "\\$ECHO \"$libname_spec\""`
+		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		    set dummy $deplib_matches; shift
+		    deplib_match=$1
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      func_append newdeplibs " $i"
+		    else
+		      droppeddeps=yes
+		      echo
+		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		      echo "*** I have the capability to make that library automatically link in when"
+		      echo "*** you link to this library.  But I can only do this if you have a"
+		      echo "*** shared version of the library, which you do not appear to have"
+		      echo "*** because a test_compile did reveal that the linker did not use this one"
+		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  echo
+		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+		  echo "*** make it link in!  You will probably need to install it or some"
+		  echo "*** library that it depends on before this library will be fully"
+		  echo "*** functional.  Installing it before continuing would be even better."
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method; shift
+	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		if test -n "$file_magic_glob"; then
+		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
+		else
+		  libnameglob=$libname
+		fi
+		test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  if test "$want_nocaseglob" = yes; then
+		    shopt -s nocaseglob
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		    $nocaseglob
+		  else
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		  fi
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null |
+			 $GREP " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+			 $SED -e 10q |
+			 $EGREP "$file_magic_regex" > /dev/null; then
+			func_append newdeplibs " $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method; shift
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
+		       $EGREP "$match_pattern_regex" > /dev/null; then
+		      func_append newdeplibs " $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+	    done
+	  fi
+	  case $tmp_deplibs in
+	  *[!\	\ ]*)
+	    echo
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	    ;;
+	  esac
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library with the System framework
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    echo
+	    echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+	    echo "*** a static module, that should work as long as the dlopening"
+	    echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      echo
+	      echo "*** However, this would only work if libtool was able to extract symbol"
+	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      echo "*** not find such a program.  So, this module is probably useless."
+	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    echo "*** The inter-library dependencies that have been dropped here will be"
+	    echo "*** automatically added whenever a program is linked with this library"
+	    echo "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      echo
+	      echo "*** Since this library must not contain undefined symbols,"
+	      echo "*** because either the platform does not support them or"
+	      echo "*** it was explicitly requested with -no-undefined,"
+	      echo "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+	*-*-darwin*)
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	# Remove ${wl} instances when linking with ld.
+	# FIXME: should test the right _cmds variable.
+	case $archive_cmds in
+	  *\$LD\ *) wl= ;;
+        esac
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		func_replace_sysroot "$libdir"
+		libdir=$func_replace_sysroot_result
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		func_append dep_rpath " $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append perm_rpath " $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      func_append rpath "$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	shift
+	realname="$1"
+	shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  func_append linknames " $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	test "X$libobjs" = "X " && libobjs=
+
+	delfiles=
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+	  export_symbols="$output_objdir/$libname.uexp"
+	  func_append delfiles " $export_symbols"
+	fi
+
+	orig_export_symbols=
+	case $host_os in
+	cygwin* | mingw* | cegcc*)
+	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+	    # exporting using user supplied symfile
+	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	      # and it's NOT already a .def file. Must figure out
+	      # which of the given symbols are data symbols and tag
+	      # them as such. So, trigger use of export_symbols_cmds.
+	      # export_symbols gets reassigned inside the "prepare
+	      # the list of exported symbols" if statement, so the
+	      # include_expsyms logic still works.
+	      orig_export_symbols="$export_symbols"
+	      export_symbols=
+	      always_export_symbols=yes
+	    fi
+	  fi
+	  ;;
+	esac
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $opt_dry_run || $RM $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd1 in $cmds; do
+	      IFS="$save_ifs"
+	      # Take the normal branch if the nm_file_list_spec branch
+	      # doesn't work or if tool conversion is not needed.
+	      case $nm_file_list_spec~$to_tool_file_cmd in
+		*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
+		  try_normal_branch=yes
+		  eval cmd=\"$cmd1\"
+		  func_len " $cmd"
+		  len=$func_len_result
+		  ;;
+		*)
+		  try_normal_branch=no
+		  ;;
+	      esac
+	      if test "$try_normal_branch" = yes \
+		 && { test "$len" -lt "$max_cmd_len" \
+		      || test "$max_cmd_len" -le -1; }
+	      then
+		func_show_eval "$cmd" 'exit $?'
+		skipped_export=false
+	      elif test -n "$nm_file_list_spec"; then
+		func_basename "$output"
+		output_la=$func_basename_result
+		save_libobjs=$libobjs
+		save_output=$output
+		output=${output_objdir}/${output_la}.nm
+		func_to_tool_file "$output"
+		libobjs=$nm_file_list_spec$func_to_tool_file_result
+		func_append delfiles " $output"
+		func_verbose "creating $NM input file list: $output"
+		for obj in $save_libobjs; do
+		  func_to_tool_file "$obj"
+		  $ECHO "$func_to_tool_file_result"
+		done > "$output"
+		eval cmd=\"$cmd1\"
+		func_show_eval "$cmd" 'exit $?'
+		output=$save_output
+		libobjs=$save_libobjs
+		skipped_export=false
+	      else
+		# The command line is too long to execute in one step.
+		func_verbose "using reloadable object file for export list..."
+		skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  tmp_export_symbols="$export_symbols"
+	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	fi
+
+	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	  # The given exports_symbols file has to be filtered, so filter it.
+	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # though. Also, the filter scales superlinearly with the number of
+	  # global variables. join(1) would be nice here, but unfortunately
+	  # isn't a blessed tool.
+	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	  func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	  export_symbols=$output_objdir/$libname.def
+	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+	  case " $convenience " in
+	  *" $test_deplib "*) ;;
+	  *)
+	    func_append tmp_deplibs " $test_deplib"
+	    ;;
+	  esac
+	done
+	deplibs="$tmp_deplibs"
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec" &&
+	    test "$compiler_needs_object" = yes &&
+	    test -z "$libobjs"; then
+	    # extract the archives, so we have objects to list.
+	    # TODO: could optimize this to just extract one archive.
+	    whole_archive_flag_spec=
+	  fi
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    func_append generated " $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    func_append libobjs " $func_extract_archives_result"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	fi
+
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  func_append linker_flags " $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$opt_mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    eval test_cmds=\"$archive_expsym_cmds\"
+	    cmds=$archive_expsym_cmds
+	  else
+	    eval test_cmds=\"$archive_cmds\"
+	    cmds=$archive_cmds
+	  fi
+	fi
+
+	if test "X$skipped_export" != "X:" &&
+	   func_len " $test_cmds" &&
+	   len=$func_len_result &&
+	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise
+	  # or, if using GNU ld and skipped_export is not :, use a linker
+	  # script.
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  func_basename "$output"
+	  output_la=$func_basename_result
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  last_robj=
+	  k=1
+
+	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
+	    output=${output_objdir}/${output_la}.lnkscript
+	    func_verbose "creating GNU ld script: $output"
+	    echo 'INPUT (' > $output
+	    for obj in $save_libobjs
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    echo ')' >> $output
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$func_to_tool_file_result
+	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
+	    output=${output_objdir}/${output_la}.lnk
+	    func_verbose "creating linker input file list: $output"
+	    : > $output
+	    set x $save_libobjs
+	    shift
+	    firstobj=
+	    if test "$compiler_needs_object" = yes; then
+	      firstobj="$1 "
+	      shift
+	    fi
+	    for obj
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
+	  else
+	    if test -n "$save_libobjs"; then
+	      func_verbose "creating reloadable object files..."
+	      output=$output_objdir/$output_la-${k}.$objext
+	      eval test_cmds=\"$reload_cmds\"
+	      func_len " $test_cmds"
+	      len0=$func_len_result
+	      len=$len0
+
+	      # Loop over the list of objects to be linked.
+	      for obj in $save_libobjs
+	      do
+		func_len " $obj"
+		func_arith $len + $func_len_result
+		len=$func_arith_result
+		if test "X$objlist" = X ||
+		   test "$len" -lt "$max_cmd_len"; then
+		  func_append objlist " $obj"
+		else
+		  # The command $test_cmds is almost too long, add a
+		  # command to the queue.
+		  if test "$k" -eq 1 ; then
+		    # The first file doesn't have a previous command to add.
+		    reload_objs=$objlist
+		    eval concat_cmds=\"$reload_cmds\"
+		  else
+		    # All subsequent reloadable object files will link in
+		    # the last one created.
+		    reload_objs="$objlist $last_robj"
+		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
+		  fi
+		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  func_arith $k + 1
+		  k=$func_arith_result
+		  output=$output_objdir/$output_la-${k}.$objext
+		  objlist=" $obj"
+		  func_len " $last_robj"
+		  func_arith $len0 + $func_len_result
+		  len=$func_arith_result
+		fi
+	      done
+	      # Handle the remaining objects by creating one last
+	      # reloadable object file.  All subsequent reloadable object
+	      # files will link in the last one created.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      reload_objs="$objlist $last_robj"
+	      eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
+	      if test -n "$last_robj"; then
+	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+	      fi
+	      func_append delfiles " $output"
+
+	    else
+	      output=
+	    fi
+
+	    if ${skipped_export-false}; then
+	      func_verbose "generating symbol list for \`$libname.la'"
+	      export_symbols="$output_objdir/$libname.exp"
+	      $opt_dry_run || $RM $export_symbols
+	      libobjs=$output
+	      # Append the command to create the export file.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+	      if test -n "$last_robj"; then
+		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	    fi
+
+	    test -n "$save_libobjs" &&
+	      func_verbose "creating a temporary reloadable object file: $output"
+
+	    # Loop through the commands generated above and execute them.
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $concat_cmds; do
+	      IFS="$save_ifs"
+	      $opt_silent || {
+		  func_quote_for_expand "$cmd"
+		  eval "func_echo $func_quote_for_expand_result"
+	      }
+	      $opt_dry_run || eval "$cmd" || {
+		lt_exit=$?
+
+		# Restore the uninstalled library and exit
+		if test "$opt_mode" = relink; then
+		  ( cd "$output_objdir" && \
+		    $RM "${realname}T" && \
+		    $MV "${realname}U" "$realname" )
+		fi
+
+		exit $lt_exit
+	      }
+	    done
+	    IFS="$save_ifs"
+
+	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+
+          if ${skipped_export-false}; then
+	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	      tmp_export_symbols="$export_symbols"
+	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	    fi
+
+	    if test -n "$orig_export_symbols"; then
+	      # The given exports_symbols file has to be filtered, so filter it.
+	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # though. Also, the filter scales superlinearly with the number of
+	      # global variables. join(1) would be nice here, but unfortunately
+	      # isn't a blessed tool.
+	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	      func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	      export_symbols=$output_objdir/$libname.def
+	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	    fi
+	  fi
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	      cmds=$archive_expsym_cmds
+	    else
+	      cmds=$archive_cmds
+	    fi
+	  fi
+	fi
+
+	if test -n "$delfiles"; then
+	  # Append the command to remove temporary files to $cmds.
+	  eval cmds=\"\$cmds~\$RM $delfiles\"
+	fi
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append libobjs " $func_extract_archives_result"
+	  test "X$libobjs" = "X " && libobjs=
+	fi
+
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $opt_silent || {
+	    func_quote_for_expand "$cmd"
+	    eval "func_echo $func_quote_for_expand_result"
+	  }
+	  $opt_dry_run || eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test "$opt_mode" = relink; then
+	      ( cd "$output_objdir" && \
+	        $RM "${realname}T" && \
+		$MV "${realname}U" "$realname" )
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$opt_mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      func_show_eval '${RM}r "$gentop"'
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for objects"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+	test -n "$objs$old_deplibs" && \
+	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+
+	libobj=$output
+	func_lo2o "$libobj"
+	obj=$func_lo2o_result
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec and hope we can get by with
+      # turning comma into space..
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	else
+	  gentop="$output_objdir/${obj}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # If we're not building shared, we need to use non_pic_objs
+      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      func_execute_cmds "$reload_cmds" 'exit $?'
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	func_execute_cmds "$reload_cmds" 'exit $?'
+      fi
+
+      if test -n "$gentop"; then
+	func_show_eval '${RM}r "$gentop"'
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) func_stripname '' '.exe' "$output"
+	          output=$func_stripname_result.exe;;
+      esac
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for programs"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for programs"
+
+      test "$preload" = yes \
+        && test "$dlopen_support" = unknown \
+	&& test "$dlopen_self" = unknown \
+	&& test "$dlopen_self_static" = unknown && \
+	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	;;
+      esac
+
+      case $host in
+      *-*-darwin*)
+	# Don't allow lazy linking, it breaks C++ global constructors
+	# But is supposedly fixed on 10.4 or later (yay!).
+	if test "$tagname" = CXX ; then
+	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+	    10.[0123])
+	      func_append compile_command " ${wl}-bind_at_load"
+	      func_append finalize_command " ${wl}-bind_at_load"
+	    ;;
+	  esac
+	fi
+	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      func_append compile_command " $compile_deplibs"
+      func_append finalize_command " $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append perm_rpath " $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
+	  *) func_append dllsearchpath ":$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_perm_rpath " $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+      fi
+
+      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+	func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
+
+      wrappers_required=yes
+      case $host in
+      *cegcc* | *mingw32ce*)
+        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
+      *cygwin* | *mingw* )
+        if test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      *)
+        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      esac
+      if test "$wrappers_required" = no; then
+	# Replace the output file specification.
+	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	exit_status=0
+	func_show_eval "$link_command" 'exit_status=$?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	# Delete the generated files.
+	if test -f "$output_objdir/${outputname}S.${objext}"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	fi
+
+	exit $exit_status
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$opt_dry_run || $RM $output
+	# Link the executable and exit
+	func_show_eval "$link_command" 'exit $?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	func_warning "this platform does not like uninstalled shared libraries"
+	func_warning "\`$output' will be relinked during installation"
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      func_show_eval "$link_command" 'exit $?'
+
+      if test -n "$postlink_cmds"; then
+	func_to_tool_file "$output_objdir/$outputname"
+	postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	func_execute_cmds "$postlink_cmds" 'exit $?'
+      fi
+
+      # Now create the wrapper script.
+      func_verbose "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    func_quote_for_eval "$var_value"
+	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) func_stripname '' '.exe' "$output"
+	         output=$func_stripname_result ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    func_stripname '' '.exe' "$outputname"
+	    outputname=$func_stripname_result ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    func_dirname_and_basename "$output" "" "."
+	    output_name=$func_basename_result
+	    output_path=$func_dirname_result
+	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
+	    cwrapper="$output_path/$output_name.exe"
+	    $RM $cwrappersource $cwrapper
+	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_cwrapperexe_src > $cwrappersource
+
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
+	    $opt_dry_run || {
+	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+	      $STRIP $cwrapper
+	    }
+
+	    # Now, create the wrapper script for func_source use:
+	    func_ltwrapper_scriptname $cwrapper
+	    $RM $func_ltwrapper_scriptname_result
+	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+	    $opt_dry_run || {
+	      # note: this script will not be executed, so do not chmod.
+	      if test "x$build" = "x$host" ; then
+		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+	      else
+		func_emit_wrapper no > $func_ltwrapper_scriptname_result
+	      fi
+	    }
+	  ;;
+	  * )
+	    $RM $output
+	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_wrapper no > $output
+	    chmod +x $output
+	  ;;
+	esac
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save $symfileobj"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	  if test "$preload" = yes && test -f "$symfileobj"; then
+	    func_append oldobjs " $symfileobj"
+	  fi
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	func_append generated " $gentop"
+
+	func_extract_archives $gentop $addlibs
+	func_append oldobjs " $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+	cmds=$old_archive_from_new_cmds
+      else
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append oldobjs " $func_extract_archives_result"
+	fi
+
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      func_basename "$obj"
+	      $ECHO "$func_basename_result"
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  echo "copying selected object files to avoid basename conflicts..."
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+	  func_mkdir_p "$gentop"
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    func_basename "$obj"
+	    objbase="$func_basename_result"
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		func_arith $counter + 1
+		counter=$func_arith_result
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      func_append oldobjs " $gentop/$newobj"
+	      ;;
+	    *) func_append oldobjs " $obj" ;;
+	    esac
+	  done
+	fi
+	func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+	tool_oldlib=$func_to_tool_file_result
+	eval cmds=\"$old_archive_cmds\"
+
+	func_len " $cmds"
+	len=$func_len_result
+	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	elif test -n "$archiver_list_spec"; then
+	  func_verbose "using command file archive linking..."
+	  for obj in $oldobjs
+	  do
+	    func_to_tool_file "$obj"
+	    $ECHO "$func_to_tool_file_result"
+	  done > $output_objdir/$libname.libcmd
+	  func_to_tool_file "$output_objdir/$libname.libcmd"
+	  oldobjs=" $archiver_list_spec$func_to_tool_file_result"
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  func_verbose "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  eval test_cmds=\"$old_archive_cmds\"
+	  func_len " $test_cmds"
+	  len0=$func_len_result
+	  len=$len0
+	  for obj in $save_oldobjs
+	  do
+	    func_len " $obj"
+	    func_arith $len + $func_len_result
+	    len=$func_arith_result
+	    func_append objlist " $obj"
+	    if test "$len" -lt "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+		RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	      len=$len0
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
+    done
+
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      func_verbose "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  func_quote_for_eval "$var_value"
+	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
+
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		func_basename "$deplib"
+		name="$func_basename_result"
+		func_resolve_sysroot "$deplib"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      -L*)
+		func_stripname -L '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -L$func_replace_sysroot_result"
+		;;
+	      -R*)
+		func_stripname -R '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -R$func_replace_sysroot_result"
+		;;
+	      *) func_append newdependency_libs " $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+
+	    for lib in $dlfiles; do
+	      case $lib in
+	      *.la)
+	        func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      *) func_append newdlfiles " $lib" ;;
+	      esac
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+	      *.la)
+		# Only pass preopened files to the pseudo-archive (for
+		# eventual linking with the app. that links it) if we
+		# didn't already link the preopened objects directly into
+		# the library:
+		func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      esac
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlfiles " $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlprefiles " $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $RM $output
+	  # place dlname in correct position for cygwin
+	  # In fact, it would be nice if we could use this code for all target
+	  # systems that can't hard-code library paths into their executables
+	  # and that have no shared library path variable independent of PATH,
+	  # but it turns out we can't easily determine that from inspecting
+	  # libtool variables, so we have to hard-code the OSs to which it
+	  # applies here; at the moment, that means platforms that use the PE
+	  # object format with DLL files.  See the long comment at the top of
+	  # tests/bindir.at for full details.
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+	      # If a -bindir argument was supplied, place the dll there.
+	      if test "x$bindir" != x ;
+	      then
+		func_relative_path "$install_libdir" "$bindir"
+		tdlname=$func_relative_path_result$dlname
+	      else
+		# Otherwise fall back on heuristic.
+		tdlname=../bin/$dlname
+	      fi
+	      ;;
+	  esac
+	  $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $ECHO >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      }
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
+
+{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
+    func_mode_link ${1+"$@"}
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $opt_debug
+    RM="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) func_append RM " $arg"; rmforce=yes ;;
+      -*) func_append RM " $arg" ;;
+      *) func_append files " $arg" ;;
+      esac
+    done
+
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
+
+    rmdirs=
+
+    for file in $files; do
+      func_dirname "$file" "" "."
+      dir="$func_dirname_result"
+      if test "X$dir" = X.; then
+	odir="$objdir"
+      else
+	odir="$dir/$objdir"
+      fi
+      func_basename "$file"
+      name="$func_basename_result"
+      test "$opt_mode" = uninstall && odir="$dir"
+
+      # Remember odir for removal later, being careful to avoid duplicates
+      if test "$opt_mode" = clean; then
+	case " $rmdirs " in
+	  *" $odir "*) ;;
+	  *) func_append rmdirs " $odir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+	 { test -h "$file"; } >/dev/null 2>&1 ||
+	 test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if func_lalib_p "$file"; then
+	  func_source $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    func_append rmfiles " $odir/$n"
+	  done
+	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"
+
+	  case "$opt_mode" in
+	  clean)
+	    case " $library_names " in
+	    *" $dlname "*) ;;
+	    *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
+	    esac
+	    test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if func_lalib_p "$file"; then
+
+	  # Read the .lo file
+	  func_source $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" &&
+	     test "$pic_object" != none; then
+	    func_append rmfiles " $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" &&
+	     test "$non_pic_object" != none; then
+	    func_append rmfiles " $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test "$opt_mode" = clean ; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    func_stripname '' '.exe' "$file"
+	    file=$func_stripname_result
+	    func_stripname '' '.exe' "$name"
+	    noexename=$func_stripname_result
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    func_append rmfiles " $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if func_ltwrapper_p "$file"; then
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      relink_command=
+	      func_source $func_ltwrapper_scriptname_result
+	      func_append rmfiles " $func_ltwrapper_scriptname_result"
+	    else
+	      relink_command=
+	      func_source $dir/$noexename
+	    fi
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
+	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	      func_append rmfiles " $odir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name" ; then
+	      func_append rmfiles " $odir/lt-${noexename}.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
+    done
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	func_show_eval "rmdir $dir >/dev/null 2>&1"
+      fi
+    done
+
+    exit $exit_status
+}
+
+{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
+    func_mode_uninstall ${1+"$@"}
+
+test -z "$opt_mode" && {
+  help="$generic_help"
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode \`$opt_mode'"
+
+if test -n "$exec_cmd"; then
+  eval exec "$exec_cmd"
+  exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
+# vi:sw=2
+
diff --git a/lib/ncl-2.1.18/config/ltoptions.m4 b/lib/ncl-2.1.18/config/ltoptions.m4
new file mode 100644
index 0000000..5d9acd8
--- /dev/null
+++ b/lib/ncl-2.1.18/config/ltoptions.m4
@@ -0,0 +1,384 @@
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
+#   Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 7 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+  		   [_LT_ENABLE_FAST_INSTALL])
+  ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [1], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+	IFS="$lt_save_ifs"
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/lib/ncl-2.1.18/config/ltversion.m4 b/lib/ncl-2.1.18/config/ltversion.m4
new file mode 100644
index 0000000..07a8602
--- /dev/null
+++ b/lib/ncl-2.1.18/config/ltversion.m4
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# @configure_input@
+
+# serial 3337 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4.2])
+m4_define([LT_PACKAGE_REVISION], [1.3337])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4.2'
+macro_revision='1.3337'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/lib/ncl-2.1.18/config/lt~obsolete.m4 b/lib/ncl-2.1.18/config/lt~obsolete.m4
new file mode 100644
index 0000000..c573da9
--- /dev/null
+++ b/lib/ncl-2.1.18/config/lt~obsolete.m4
@@ -0,0 +1,98 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 5 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
diff --git a/lib/ncl-2.1.18/configure.ac b/lib/ncl-2.1.18/configure.ac
new file mode 100644
index 0000000..ec362d4
--- /dev/null
+++ b/lib/ncl-2.1.18/configure.ac
@@ -0,0 +1,188 @@
+#                                               -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+
+AC_INIT(NCL, 2.1.18, mtholder at gmail.com)
+AC_CONFIG_HEADERS([config.h])
+
+AC_PREREQ(2.57)
+
+#	Directory that contains install-sh and other auxiliary files
+AC_CONFIG_AUX_DIR([config])
+
+################################################################################
+#	According to (http://www.mail-archive.com/autoconf@gnu.org/msg14232.html)
+#		this macro should be after AC_INIT but before AM_INIT_AUTOMAKE
+################################################################################
+AC_CONFIG_MACRO_DIR(config)
+
+AM_INIT_AUTOMAKE([1.6 foreign dist-zip tar-ustar filename-length-max=299])
+
+AC_CONFIG_SRCDIR([ChangeLog])
+
+# Checks for programs.
+AC_PROG_LN_S
+AC_PROG_INSTALL
+AC_PROG_LIBTOOL
+
+################################################################################
+# calling AC_PROG_CXX resets CXXFLAGS, we use our own flags set in the
+#	the AX_CXXFLAGS macro below.
+# So we cache the argument to configure
+#	here in ARG_CXX_FLAGS (so that our macro does not override them)
+ARG_CXX_FLAGS="$CXXFLAGS"
+################################################################################
+ARG_CXX_FLAGS="$CXXFLAGS"
+AC_PROG_CXX
+
+#Ranlib handled by check for libtool
+CXXFLAGS="$ARG_CXX_FLAGS"
+AX_CXXFLAGS
+
+AC_MSG_CHECKING([whether C++ compiler works])
+AC_LANG_PUSH(C++)
+AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[
+#include <vector>
+]], [[]]), [compiler_works='yes'], [compiler_works='no'])
+AC_MSG_RESULT([$compiler_works])
+AC_LANG_POP()
+if test x$compiler_works = xno
+then
+    AC_MSG_ERROR([No functioning C++ compiler found])
+fi
+
+################################################################################
+# the install-check requires python with subprocess to actually perform a check
+# these tests should not cause failure of configure if python is not found.
+################################################################################
+#AC_PATH_PROG([SWIG], [swig], [], [$PATH])
+
+#if test -z "$SWIG"
+#then
+#	if test -z "$USE_SWIG"
+#	then
+#		MAYBE_SWIG_DIR=
+#	else
+#		AC_MSG_ERROR([--with-swig was specified, but swig was not found on the path])
+#	fi
+#else
+#	if test -z "$USE_SWIG"
+#	then
+#		MAYBE_SWIG_DIR=
+#	else
+#		MAYBE_SWIG_DIR="swig"
+#	fi
+#fi
+#
+#PYTHON_SDK_DIR="$PYTHON_SDK_DIR"
+#if test -z "$PYTHON_SDK_DIR"
+#then
+#	if ! test -z "$MAYBE_SWIG_DIR"
+#	then
+#		AC_MSG_WARN([Currently the swig compilation requires that you specify the PYTHON_SDK_DIR environmental variable. It is very likely that the swig compilation will fail without this variable. The variable should be set to the directory that contains the python installation with subdirectories bin, include, and lib ])
+#	fi
+#fi
+#
+#PYTHON_NAME_WITH_VERSION="$PYTHON_NAME_WITH_VERSION"
+#if test -z "$PYTHON_NAME_WITH_VERSION"
+#then
+#	if ! test -z "$MAYBE_SWIG_DIR"
+#	then
+#		AC_MSG_WARN([Currently the swig compilation requires that you specify the PYTHON_NAME_WITH_VERSION environmental variable. It is very likely that the swig compilation will fail without this variable. It should be set to your python version, such as python2.6 ])
+#	fi
+#fi
+
+#MAYBE_SWIG_DIR=
+#USE_SWIG=
+#AC_ARG_WITH(
+#	[swig],
+#	AC_HELP_STRING(
+#		[--with-swig-python=yes],
+#		[Compiles NCL for use with SWIG bindings for use with languages other than C++ - currently only python examples are included]
+#		),
+#	[
+#	if test "$withval" = "yes"; then
+#		AM_PATH_PYTHON
+#		AC_PROG_SWIG(1.3.17)
+#		SWIG_ENABLE_CXX
+#		SWIG_PYTHON
+#		MAYBE_SWIG_DIR="swig"
+#	fi
+#	])
+
+
+AC_SUBST(CXXFLAGS)
+#AC_CXX_RTTI
+
+CPPFLAGS="-I\$(top_srcdir) $CPPFLAGS"
+# Checks for libraries.
+
+# Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS([float.h stdlib.h])
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_HEADER_STDBOOL
+AC_C_CONST
+AC_C_INLINE
+AC_STRUCT_TM
+
+# Checks for library functions.
+AC_FUNC_MKTIME
+AC_FUNC_STRTOD
+AC_CHECK_FUNCS([memmove strchr strtol])
+
+################################################################################
+# the install-check requires python with subprocess to actually perform a check
+# these tests should not cause failure of configure if python is not found.
+################################################################################
+AC_PATH_PROG([PYTHON], [python], [], [$PATH])
+AC_PYTHON_MODULE([subprocess], [], [])
+AC_SUBST(PYTHON)
+
+if test -z "$PYTHON"
+then
+	MAYBE_TEST_DIR=
+dnl else
+	dnl MAYBE_TEST_DIR="test"
+fi
+
+AC_ARG_WITH(
+	[constfuncs],
+	AC_HELP_STRING(
+		[--with-constfuncs=yes],
+		[Defines the NCL_CONST_FUNCS macro so functions that should be const are declared as such]
+		),
+	[
+	if test "$withval" = "yes"; then
+		CPPFLAGS="-DNCL_CONST_FUNCS $CPPFLAGS"
+	fi
+	])
+
+AC_ARG_WITH(
+	[reserveid],
+	AC_HELP_STRING(
+		[--with-reserveid=yes],
+		[Defines the RESERVE_ID_KEYWORD macro so that id is not used as a variable name]
+		),
+	[
+	if test "$withval" = "yes"; then
+		CPPFLAGS="-DRESERVE_ID_KEYWORD $CPPFLAGS"
+	fi
+	])
+
+
+
+
+dnl AC_SUBST(MAYBE_TEST_DIR)
+dnl AC_SUBST(MAYBE_SWIG_DIR)
+#AC_SUBST(PYTHON_SDK_DIR)
+#AC_SUBST(PYTHON_NAME_WITH_VERSION)
+
+AC_PROG_MAKE_SET
+
+AC_CONFIG_FILES([					\
+	Makefile 						\
+	ncl/Makefile					\
+	nclv2.1.pc
+	])
+AC_OUTPUT
diff --git a/lib/ncl-2.1.18/libtool b/lib/ncl-2.1.18/libtool
new file mode 100755
index 0000000..7765bbd
--- /dev/null
+++ b/lib/ncl-2.1.18/libtool
@@ -0,0 +1,10246 @@
+#! /bin/bash
+
+# libtool - Provide generalized library-building support services.
+# Generated automatically by config.status (ncl) 2.1.18
+# Libtool was configured on host loki:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags="CXX "
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=2.4.2
+macro_revision=1.3337
+
+# Whether or not to build shared libraries.
+build_libtool_libs=yes
+
+# Whether or not to build static libraries.
+build_old_libs=yes
+
+# What type of objects to build.
+pic_mode=default
+
+# Whether or not to optimize for fast installation.
+fast_install=yes
+
+# Shell to use when invoking shell scripts.
+SHELL="/bin/bash"
+
+# An echo program that protects backslashes.
+ECHO="printf %s\\n"
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=":"
+
+# The host system.
+host_alias=
+host=x86_64-unknown-linux-gnu
+host_os=linux-gnu
+
+# The build system.
+build_alias=
+build=x86_64-unknown-linux-gnu
+build_os=linux-gnu
+
+# A sed program that does not truncate output.
+SED="/bin/sed"
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP="/bin/grep"
+
+# An ERE matcher.
+EGREP="/bin/grep -E"
+
+# A literal string matcher.
+FGREP="/bin/grep -F"
+
+# A BSD- or MS-compatible name lister.
+NM="/usr/bin/nm -B"
+
+# Whether we need soft or hard links.
+LN_S="ln -s"
+
+# What is the maximum length of a command?
+max_cmd_len=1572864
+
+# Object file suffix (normally "o").
+objext=o
+
+# Executable file suffix (normally "").
+exeext=
+
+# whether the shell understands "unset".
+lt_unset=unset
+
+# turn spaces into newlines.
+SP2NL="tr \\040 \\012"
+
+# turn newlines into spaces.
+NL2SP="tr \\015\\012 \\040\\040"
+
+# convert $build file names to $host format.
+to_host_file_cmd=func_convert_file_noop
+
+# convert $build files to toolchain format.
+to_tool_file_cmd=func_convert_file_noop
+
+# An object symbol dumper.
+OBJDUMP="objdump"
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method="pass_all"
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd="\$MAGIC_CMD"
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=""
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob="no"
+
+# DLL creation program.
+DLLTOOL="false"
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd="printf %s\\n"
+
+# The archiver.
+AR="ar"
+
+# Flags to create an archive.
+AR_FLAGS="cru"
+
+# How to feed a file listing to the archiver.
+archiver_list_spec="@"
+
+# A symbol stripping program.
+STRIP="strip"
+
+# Commands used to install an old-style archive.
+RANLIB="ranlib"
+old_postinstall_cmds="chmod 644 \$oldlib~\$RANLIB \$tool_oldlib"
+old_postuninstall_cmds=""
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=no
+
+# A C compiler.
+LTCC="gcc"
+
+# LTCC compiler flags.
+LTCFLAGS="-g -O2"
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe="sed -n -e 's/^.*[	 ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[	 ][	 ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p' | sed '/ __gnu_lto/d'"
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl="sed -n -e 's/^T .* \\(.*\\)\$/extern int \\1();/p' -e 's/^[ABCDGIRSTW]* .* \\(.*\\)\$/extern char \\1;/p'"
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\)[ ]*\$/  {\\\"\\1\\\", (void *) 0},/p' -e 's/^[ABCDGIRSTW]* \\([^ ]*\\) \\([^ ]*\\)\$/  {\"\\2\", (void *) \\&\\2},/p'"
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \\([^ ]*\\)[ ]*\$/  {\\\"\\1\\\", (void *) 0},/p' -e 's/^[ABCDGIRSTW]* \\([^ ]*\\) \\(lib[^ ]*\\)\$/  {\"\\2\", (void *) \\&\\2},/p' -e 's/^[ABCDGIRSTW]* \\([^ ]*\\) \\([^ ]*\\)\$/  {\"lib\\2\", (void *) \\&\\2},/p'"
+
+# Specify filename containing input files for $NM.
+nm_file_list_spec="@"
+
+# The root where to search for dependent libraries,and in which our libraries should be installed.
+lt_sysroot=
+
+# The name of the directory that contains temporary libtool files.
+objdir=.libs
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=file
+
+# Must we lock files when doing compilation?
+need_locks="no"
+
+# Manifest tool.
+MANIFEST_TOOL=":"
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=""
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=""
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=""
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=""
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=""
+
+# Old archive suffix (normally "a").
+libext=a
+
+# Shared library suffix (normally ".so").
+shrext_cmds=".so"
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=""
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=no
+
+# Do we need a version for libraries?
+need_version=no
+
+# Library versioning type.
+version_type=linux
+
+# Shared library runtime path variable.
+runpath_var=LD_RUN_PATH
+
+# Shared library path variable.
+shlibpath_var=LD_LIBRARY_PATH
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=no
+
+# Format of library name prefix.
+libname_spec="lib\$name"
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}"
+
+# The coded name of the library, if different from the real name.
+soname_spec="\${libname}\${release}\${shared_ext}\$major"
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=""
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=""
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=""
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir"
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=""
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=yes
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec="/usr/lib/gcc/x86_64-linux-gnu/4.6 /usr/lib/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu /lib "
+
+# Run-time system search path for libraries.
+sys_lib_dlsearch_path_spec="/lib /usr/lib /lib/i386-linux-gnu /usr/lib/i386-linux-gnu /lib/i486-linux-gnu /usr/lib/i486-linux-gnu /usr/local/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu /lib32 /usr/lib32 "
+
+# Whether dlopen is supported.
+dlopen_support=unknown
+
+# Whether dlopen of programs is supported.
+dlopen_self=unknown
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=unknown
+
+# Commands to strip libraries.
+old_striplib="strip --strip-debug"
+striplib="strip --strip-unneeded"
+
+
+# The linker used to build libraries.
+LD="/usr/bin/ld -m elf_x86_64"
+
+# How to create reloadable object files.
+reload_flag=" -r"
+reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs"
+
+# Commands used to build an old-style archive.
+old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$tool_oldlib"
+
+# A language specific compiler.
+CC="gcc"
+
+# Is the compiler the GNU compiler?
+with_gcc=yes
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=" -fno-builtin"
+
+# Additional compiler flags for building library objects.
+pic_flag=" -fPIC -DPIC"
+
+# How to pass a linker flag through the compiler.
+wl="-Wl,"
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag="-static"
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o="yes"
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=no
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=no
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec="\${wl}--export-dynamic"
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive"
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object="no"
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=""
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=""
+
+# Commands used to build a shared archive.
+archive_cmds="\$CC -shared \$pic_flag \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib"
+archive_expsym_cmds="echo \\\"{ global:\\\" > \$output_objdir/\$libname.ver~
+	    cat \$export_symbols | sed -e \\\"s/\\\\(.*\\\\)/\\\\1;/\\\" >> \$output_objdir/\$libname.ver~
+	    echo \\\"local: *; };\\\" >> \$output_objdir/\$libname.ver~
+	    \$CC -shared \$pic_flag \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-version-script \${wl}\$output_objdir/\$libname.ver -o \$lib"
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=""
+module_expsym_cmds=""
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld="yes"
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=""
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=""
+
+# Flag to hardcode $libdir into a binary during linking.
+# This must work even if $libdir does not exist
+hardcode_libdir_flag_spec="\${wl}-rpath \${wl}\$libdir"
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=""
+
+# Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=no
+
+# Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting ${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=no
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=no
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=unsupported
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=no
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=no
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=no
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=no
+
+# The commands to list exported symbols.
+export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols"
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*"
+
+# Symbols that must always be exported.
+include_expsyms=""
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=""
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=""
+
+# Specify filename containing input files.
+file_list_spec=""
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=immediate
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=""
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=""
+postdep_objects=""
+predeps=""
+postdeps=""
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=""
+
+# ### END LIBTOOL CONFIG
+
+
+# libtool (GNU libtool) 2.4.2
+# Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage: $progname [OPTION]... [MODE-ARG]...
+#
+# Provide generalized library-building support services.
+#
+#       --config             show all configuration variables
+#       --debug              enable verbose shell tracing
+#   -n, --dry-run            display commands without modifying any files
+#       --features           display basic configuration information and exit
+#       --mode=MODE          use operation mode MODE
+#       --preserve-dup-deps  don't remove duplicate dependency libraries
+#       --quiet, --silent    don't print informational messages
+#       --no-quiet, --no-silent
+#                            print informational messages (default)
+#       --no-warn            don't display warning messages
+#       --tag=TAG            use configuration variables from tag TAG
+#   -v, --verbose            print more informational messages than default
+#       --no-verbose         don't print the extra informational messages
+#       --version            print version information
+#   -h, --help, --help-all   print short, long, or detailed help message
+#
+# MODE must be one of the following:
+#
+#         clean              remove files from the build directory
+#         compile            compile a source file into a libtool object
+#         execute            automatically set library path, then run a program
+#         finish             complete the installation of libtool libraries
+#         install            install libraries or executables
+#         link               create a library or an executable
+#         uninstall          remove libraries from an installed directory
+#
+# MODE-ARGS vary depending on the MODE.  When passed as first option,
+# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
+# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
+#
+# When reporting a bug, please describe a test case to reproduce it and
+# include the following information:
+#
+#         host-triplet:	$host
+#         shell:		$SHELL
+#         compiler:		$LTCC
+#         compiler flags:		$LTCFLAGS
+#         linker:		$LD (gnu? $with_gnu_ld)
+#         $progname:	(GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#         automake:	$automake_version
+#         autoconf:	$autoconf_version
+#
+# Report bugs to <bug-libtool at gnu.org>.
+# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+# General help using GNU software: <http://www.gnu.org/gethelp/>.
+
+PROGRAM=libtool
+PACKAGE=libtool
+VERSION="2.4.2 Debian-2.4.2-1.1"
+TIMESTAMP=""
+package_revision=1.3337
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# NLS nuisances: We save the old values to restore during execute mode.
+lt_user_locale=
+lt_safe_locale=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test \"\${$lt_var+set}\" = set; then
+          save_$lt_var=\$$lt_var
+          $lt_var=C
+	  export $lt_var
+	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
+	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+	fi"
+done
+LC_ALL=C
+LANGUAGE=C
+export LANGUAGE LC_ALL
+
+$lt_unset CDPATH
+
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+
+
+: ${CP="cp -f"}
+test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+: ${Xsed="$SED -e 1s/^X//"}
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
+
+exit_status=$EXIT_SUCCESS
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+dirname="s,/[^/]*$,,"
+basename="s,^.*/,,"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac
+} # Extended-shell func_dirname implementation
+
+
+# func_basename file
+func_basename ()
+{
+    func_basename_result="${1##*/}"
+} # Extended-shell func_basename implementation
+
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac
+    func_basename_result="${1##*/}"
+} # Extended-shell func_dirname_and_basename implementation
+
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary parameter first.
+    func_stripname_result=${3}
+    func_stripname_result=${func_stripname_result#"${1}"}
+    func_stripname_result=${func_stripname_result%"${2}"}
+} # Extended-shell func_stripname implementation
+
+
+# These SED scripts presuppose an absolute path with a trailing slash.
+pathcar='s,^/\([^/]*\).*$,\1,'
+pathcdr='s,^/[^/]*,,'
+removedotparts=':dotsl
+		s@/\./@/@g
+		t dotsl
+		s,/\.$,/,'
+collapseslashes='s@/\{1,\}@/@g'
+finalslash='s,/*$,/,'
+
+# func_normal_abspath PATH
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+#             value returned in "$func_normal_abspath_result"
+func_normal_abspath ()
+{
+  # Start from root dir and reassemble the path.
+  func_normal_abspath_result=
+  func_normal_abspath_tpath=$1
+  func_normal_abspath_altnamespace=
+  case $func_normal_abspath_tpath in
+    "")
+      # Empty path, that just means $cwd.
+      func_stripname '' '/' "`pwd`"
+      func_normal_abspath_result=$func_stripname_result
+      return
+    ;;
+    # The next three entries are used to spot a run of precisely
+    # two leading slashes without using negated character classes;
+    # we take advantage of case's first-match behaviour.
+    ///*)
+      # Unusual form of absolute path, do nothing.
+    ;;
+    //*)
+      # Not necessarily an ordinary path; POSIX reserves leading '//'
+      # and for example Cygwin uses it to access remote file shares
+      # over CIFS/SMB, so we conserve a leading double slash if found.
+      func_normal_abspath_altnamespace=/
+    ;;
+    /*)
+      # Absolute path, do nothing.
+    ;;
+    *)
+      # Relative path, prepend $cwd.
+      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+    ;;
+  esac
+  # Cancel out all the simple stuff to save iterations.  We also want
+  # the path to end with a slash for ease of parsing, so make sure
+  # there is one (and only one) here.
+  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
+  while :; do
+    # Processed it all yet?
+    if test "$func_normal_abspath_tpath" = / ; then
+      # If we ascended to the root using ".." the result may be empty now.
+      if test -z "$func_normal_abspath_result" ; then
+        func_normal_abspath_result=/
+      fi
+      break
+    fi
+    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcar"`
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcdr"`
+    # Figure out what to do with it
+    case $func_normal_abspath_tcomponent in
+      "")
+        # Trailing empty path component, ignore it.
+      ;;
+      ..)
+        # Parent dir; strip last assembled component from result.
+        func_dirname "$func_normal_abspath_result"
+        func_normal_abspath_result=$func_dirname_result
+      ;;
+      *)
+        # Actual path component, append it.
+        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
+      ;;
+    esac
+  done
+  # Restore leading double-slash if one was found on entry.
+  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+# func_relative_path SRCDIR DSTDIR
+# generates a relative path from SRCDIR to DSTDIR, with a trailing
+# slash if non-empty, suitable for immediately appending a filename
+# without needing to append a separator.
+#             value returned in "$func_relative_path_result"
+func_relative_path ()
+{
+  func_relative_path_result=
+  func_normal_abspath "$1"
+  func_relative_path_tlibdir=$func_normal_abspath_result
+  func_normal_abspath "$2"
+  func_relative_path_tbindir=$func_normal_abspath_result
+
+  # Ascend the tree starting from libdir
+  while :; do
+    # check if we have found a prefix of bindir
+    case $func_relative_path_tbindir in
+      $func_relative_path_tlibdir)
+        # found an exact match
+        func_relative_path_tcancelled=
+        break
+        ;;
+      $func_relative_path_tlibdir*)
+        # found a matching prefix
+        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+        func_relative_path_tcancelled=$func_stripname_result
+        if test -z "$func_relative_path_result"; then
+          func_relative_path_result=.
+        fi
+        break
+        ;;
+      *)
+        func_dirname $func_relative_path_tlibdir
+        func_relative_path_tlibdir=${func_dirname_result}
+        if test "x$func_relative_path_tlibdir" = x ; then
+          # Have to descend all the way to the root!
+          func_relative_path_result=../$func_relative_path_result
+          func_relative_path_tcancelled=$func_relative_path_tbindir
+          break
+        fi
+        func_relative_path_result=../$func_relative_path_result
+        ;;
+    esac
+  done
+
+  # Now calculate path; take care to avoid doubling-up slashes.
+  func_stripname '' '/' "$func_relative_path_result"
+  func_relative_path_result=$func_stripname_result
+  func_stripname '/' '/' "$func_relative_path_tcancelled"
+  if test "x$func_stripname_result" != x ; then
+    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
+  fi
+
+  # Normalisation. If bindir is libdir, return empty string,
+  # else relative path ending with a slash; either way, target
+  # file name can be directly appended.
+  if test ! -z "$func_relative_path_result"; then
+    func_stripname './' '' "$func_relative_path_result/"
+    func_relative_path_result=$func_stripname_result
+  fi
+}
+
+# The name of this program:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+
+# Make sure we have an absolute path for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=$func_dirname_result
+     progdir=`cd "$progdir" && pwd`
+     progpath="$progdir/$progname"
+     ;;
+  *)
+     save_IFS="$IFS"
+     IFS=${PATH_SEPARATOR-:}
+     for progdir in $PATH; do
+       IFS="$save_IFS"
+       test -x "$progdir/$progname" && break
+     done
+     IFS="$save_IFS"
+     test -n "$progdir" || progdir=`pwd`
+     progpath="$progdir/$progname"
+     ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+
+# Sed substitution that converts a w32 file name or path
+# which contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-`\' parameter expansions in output of double_quote_subst that were
+# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
+# in input to double_quote_subst, that '$' was protected from expansion.
+# Since each input `\' is now two `\'s, look for any number of runs of
+# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
+bs='\\'
+bs2='\\\\'
+bs4='\\\\\\\\'
+dollar='\$'
+sed_double_backslash="\
+  s/$bs4/&\\
+/g
+  s/^$bs2$dollar/$bs&/
+  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
+  s/\n//g"
+
+# Standard options:
+opt_dry_run=false
+opt_help=false
+opt_quiet=false
+opt_verbose=false
+opt_warning=:
+
+# func_echo arg...
+# Echo program name prefixed message, along with the current mode
+# name if it has been set yet.
+func_echo ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
+}
+
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $opt_verbose && func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
+}
+
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
+
+    # bash bug again:
+    :
+}
+
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
+
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    func_error ${1+"$@"}
+    func_fatal_error "$help"
+}
+help="Try \`$progname --help' for more information."  ## default
+
+
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_mkdir_p directory-path
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    my_directory_path="$1"
+    my_dir_list=
+
+    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+
+      # Protect directory names starting with `-'
+      case $my_directory_path in
+        -*) my_directory_path="./$my_directory_path" ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$my_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+	# list incase some portion of path contains whitespace.
+        my_dir_list="$my_directory_path:$my_dir_list"
+
+        # If the last portion added has no slash in it, the list is done
+        case $my_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+      done
+      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+
+      save_mkdir_p_IFS="$IFS"; IFS=':'
+      for my_dir in $my_dir_list; do
+	IFS="$save_mkdir_p_IFS"
+        # mkdir can fail with a `File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$my_dir" 2>/dev/null || :
+      done
+      IFS="$save_mkdir_p_IFS"
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$my_directory_path" || \
+        func_fatal_error "Failed to create \`$1'"
+    fi
+}
+
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$opt_dry_run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+        # Failing that, at least try and use $RANDOM to avoid a race
+        my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+        save_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$my_tmpdir"
+        umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || \
+        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+    fi
+
+    $ECHO "$my_tmpdir"
+}
+
+
+# func_quote_for_eval arg
+# Aesthetically quote ARG to be evaled later.
+# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
+# is double-quoted, suitable for a subsequent eval, whereas
+# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
+# which are still active within double quotes backslashified.
+func_quote_for_eval ()
+{
+    case $1 in
+      *[\\\`\"\$]*)
+	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
+      *)
+        func_quote_for_eval_unquoted_result="$1" ;;
+    esac
+
+    case $func_quote_for_eval_unquoted_result in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting, command substitution and and variable
+      # expansion for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+        ;;
+      *)
+        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
+    esac
+}
+
+
+# func_quote_for_expand arg
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    case $1 in
+      *[\\\`\"]*)
+	my_arg=`$ECHO "$1" | $SED \
+	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        my_arg="$1" ;;
+    esac
+
+    case $my_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        my_arg="\"$my_arg\""
+        ;;
+    esac
+
+    func_quote_for_expand_result="$my_arg"
+}
+
+
+# func_show_eval cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$my_cmd"
+      my_status=$?
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+# func_show_eval_locale cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$lt_user_locale
+	    $my_cmd"
+      my_status=$?
+      eval "$lt_safe_locale"
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+# func_tr_sh
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+  case $1 in
+  [0-9]* | *[!a-zA-Z0-9_]*)
+    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
+    ;;
+  * )
+    func_tr_sh_result=$1
+    ;;
+  esac
+}
+
+
+# func_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $opt_debug
+
+    $SED -n '/(C)/!b go
+	:more
+	/\./!{
+	  N
+	  s/\n# / /
+	  b more
+	}
+	:go
+	/^# '$PROGRAM' (GNU /,/# warranty; / {
+        s/^# //
+	s/^# *$//
+        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
+        p
+     }' < "$progpath"
+     exit $?
+}
+
+# func_usage
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/^#  *.*--help/ {
+        s/^# //
+	s/^# *$//
+	s/\$progname/'$progname'/
+	p
+    }' < "$progpath"
+    echo
+    $ECHO "run \`$progname --help | more' for full usage"
+    exit $?
+}
+
+# func_help [NOEXIT]
+# Echo long help message to standard output and exit,
+# unless 'noexit' is passed as argument.
+func_help ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/# Report bugs to/ {
+	:print
+        s/^# //
+	s/^# *$//
+	s*\$progname*'$progname'*
+	s*\$host*'"$host"'*
+	s*\$SHELL*'"$SHELL"'*
+	s*\$LTCC*'"$LTCC"'*
+	s*\$LTCFLAGS*'"$LTCFLAGS"'*
+	s*\$LD*'"$LD"'*
+	s/\$with_gnu_ld/'"$with_gnu_ld"'/
+	s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
+	s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
+	p
+	d
+     }
+     /^# .* home page:/b print
+     /^# General help using/b print
+     ' < "$progpath"
+    ret=$?
+    if test -z "$1"; then
+      exit $ret
+    fi
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    $opt_debug
+
+    func_error "missing argument for $1."
+    exit_cmd=exit
+}
+
+
+# func_split_short_opt shortopt
+# Set func_split_short_opt_name and func_split_short_opt_arg shell
+# variables after splitting SHORTOPT after the 2nd character.
+func_split_short_opt ()
+{
+    func_split_short_opt_arg=${1#??}
+    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}
+} # Extended-shell func_split_short_opt implementation
+
+
+# func_split_long_opt longopt
+# Set func_split_long_opt_name and func_split_long_opt_arg shell
+# variables after splitting LONGOPT at the `=' sign.
+func_split_long_opt ()
+{
+    func_split_long_opt_name=${1%%=*}
+    func_split_long_opt_arg=${1#*=}
+} # Extended-shell func_split_long_opt implementation
+
+exit_cmd=:
+
+
+
+
+
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
+
+# Global variables.
+nonopt=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+    eval "${1}+=\${2}"
+} # Extended-shell func_append implementation
+
+# func_append_quoted var value
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+func_append_quoted ()
+{
+    func_quote_for_eval "${2}"
+    eval "${1}+=\\ \$func_quote_for_eval_result"
+} # Extended-shell func_append_quoted implementation
+
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+    func_arith_result=$(( $* ))
+} # Extended-shell func_arith implementation
+
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+    func_len_result=${#1}
+} # Extended-shell func_len implementation
+
+
+# func_lo2o object
+func_lo2o ()
+{
+    case ${1} in
+      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+      *)    func_lo2o_result=${1} ;;
+    esac
+} # Extended-shell func_lo2o implementation
+
+
+# func_xform libobj-or-source
+func_xform ()
+{
+    func_xform_result=${1%.*}.lo
+} # Extended-shell func_xform implementation
+
+
+# func_fatal_configuration arg...
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func_error ${1+"$@"}
+    func_error "See the $PACKAGE documentation for more information."
+    func_fatal_error "Fatal configuration error."
+}
+
+
+# func_config
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+    done
+
+    exit $?
+}
+
+# func_features
+# Display the features supported by this script.
+func_features ()
+{
+    echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+
+    exit $?
+}
+
+# func_enable_tag tagname
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+  # Global variable:
+  tagname="$1"
+
+  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+
+  # Validate tagname.
+  case $tagname in
+    *[!-_A-Za-z0-9,/]*)
+      func_fatal_error "invalid tag name: $tagname"
+      ;;
+  esac
+
+  # Don't test for the "default" C tag, as we know it's
+  # there but not specially marked.
+  case $tagname in
+    CC) ;;
+    *)
+      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	taglist="$taglist $tagname"
+
+	# Evaluate the configuration.  Be careful to quote the path
+	# and the sed script, to avoid splitting on whitespace, but
+	# also don't use non-portable quotes within backquotes within
+	# quotes we have to do it in 2 steps:
+	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	eval "$extractedcf"
+      else
+	func_error "ignoring unknown tag $tagname"
+      fi
+      ;;
+  esac
+}
+
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+  if test "$package_revision" != "$macro_revision"; then
+    if test "$VERSION" != "$macro_version"; then
+      if test -z "$macro_version"; then
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      fi
+    else
+      cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+    fi
+
+    exit $EXIT_MISMATCH
+  fi
+}
+
+
+# Shorthand for --mode=foo, only valid as the first argument
+case $1 in
+clean|clea|cle|cl)
+  shift; set dummy --mode clean ${1+"$@"}; shift
+  ;;
+compile|compil|compi|comp|com|co|c)
+  shift; set dummy --mode compile ${1+"$@"}; shift
+  ;;
+execute|execut|execu|exec|exe|ex|e)
+  shift; set dummy --mode execute ${1+"$@"}; shift
+  ;;
+finish|finis|fini|fin|fi|f)
+  shift; set dummy --mode finish ${1+"$@"}; shift
+  ;;
+install|instal|insta|inst|ins|in|i)
+  shift; set dummy --mode install ${1+"$@"}; shift
+  ;;
+link|lin|li|l)
+  shift; set dummy --mode link ${1+"$@"}; shift
+  ;;
+uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+  shift; set dummy --mode uninstall ${1+"$@"}; shift
+  ;;
+esac
+
+
+
+# Option defaults:
+opt_debug=:
+opt_dry_run=false
+opt_config=false
+opt_preserve_dup_deps=false
+opt_features=false
+opt_finish=false
+opt_help=false
+opt_help_all=false
+opt_silent=:
+opt_warning=:
+opt_verbose=:
+opt_silent=false
+opt_verbose=false
+
+
+# Parse options once, thoroughly.  This comes as soon as possible in the
+# script to make things like `--version' happen as quickly as we can.
+{
+  # this just eases exit handling
+  while test $# -gt 0; do
+    opt="$1"
+    shift
+    case $opt in
+      --debug|-x)	opt_debug='set -x'
+			func_echo "enabling shell trace mode"
+			$opt_debug
+			;;
+      --dry-run|--dryrun|-n)
+			opt_dry_run=:
+			;;
+      --config)
+			opt_config=:
+func_config
+			;;
+      --dlopen|-dlopen)
+			optarg="$1"
+			opt_dlopen="${opt_dlopen+$opt_dlopen
+}$optarg"
+			shift
+			;;
+      --preserve-dup-deps)
+			opt_preserve_dup_deps=:
+			;;
+      --features)
+			opt_features=:
+func_features
+			;;
+      --finish)
+			opt_finish=:
+set dummy --mode finish ${1+"$@"}; shift
+			;;
+      --help)
+			opt_help=:
+			;;
+      --help-all)
+			opt_help_all=:
+opt_help=': help-all'
+			;;
+      --mode)
+			test $# = 0 && func_missing_arg $opt && break
+			optarg="$1"
+			opt_mode="$optarg"
+case $optarg in
+  # Valid mode arguments:
+  clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+  # Catch anything else as an error
+  *) func_error "invalid argument for $opt"
+     exit_cmd=exit
+     break
+     ;;
+esac
+			shift
+			;;
+      --no-silent|--no-quiet)
+			opt_silent=false
+preserve_args+=" $opt"
+			;;
+      --no-warning|--no-warn)
+			opt_warning=false
+preserve_args+=" $opt"
+			;;
+      --no-verbose)
+			opt_verbose=false
+preserve_args+=" $opt"
+			;;
+      --silent|--quiet)
+			opt_silent=:
+preserve_args+=" $opt"
+        opt_verbose=false
+			;;
+      --verbose|-v)
+			opt_verbose=:
+preserve_args+=" $opt"
+opt_silent=false
+			;;
+      --tag)
+			test $# = 0 && func_missing_arg $opt && break
+			optarg="$1"
+			opt_tag="$optarg"
+preserve_args+=" $opt $optarg"
+func_enable_tag "$optarg"
+			shift
+			;;
+
+      -\?|-h)		func_usage				;;
+      --help)		func_help				;;
+      --version)	func_version				;;
+
+      # Separate optargs to long options:
+      --*=*)
+			func_split_long_opt "$opt"
+			set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
+			shift
+			;;
+
+      # Separate non-argument short options:
+      -\?*|-h*|-n*|-v*)
+			func_split_short_opt "$opt"
+			set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
+			shift
+			;;
+
+      --)		break					;;
+      -*)		func_fatal_help "unrecognized option \`$opt'" ;;
+      *)		set dummy "$opt" ${1+"$@"};	shift; break  ;;
+    esac
+  done
+
+  # Validate options:
+
+  # save first non-option argument
+  if test "$#" -gt 0; then
+    nonopt="$opt"
+    shift
+  fi
+
+  # preserve --debug
+  test "$opt_debug" = : || preserve_args+=" --debug"
+
+  case $host in
+    *cygwin* | *mingw* | *pw32* | *cegcc*)
+      # don't eliminate duplications in $postdeps and $predeps
+      opt_duplicate_compiler_generated_deps=:
+      ;;
+    *)
+      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+      ;;
+  esac
+
+  $opt_help || {
+    # Sanity checks first:
+    func_check_version_match
+
+    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+      func_fatal_configuration "not configured to build any kind of library"
+    fi
+
+    # Darwin sucks
+    eval std_shrext=\"$shrext_cmds\"
+
+    # Only execute mode is allowed to have -dlopen flags.
+    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
+      func_error "unrecognized option \`-dlopen'"
+      $ECHO "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Change the help message to a mode-specific one.
+    generic_help="$help"
+    help="Try \`$progname --help --mode=$opt_mode' for more information."
+  }
+
+
+  # Bail if the options were screwed
+  $exit_cmd $EXIT_FAILURE
+}
+
+
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+# func_lalib_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null \
+        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if `file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+	for lalib_p_l in 1 2 3 4
+	do
+	    read lalib_p_line
+	    case "$lalib_p_line" in
+		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+	    esac
+	done
+	exec 0<&5 5<&-
+    fi
+    test "$lalib_p" = yes
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    func_lalib_p "$1"
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_dirname_and_basename "$1" "" "."
+    func_stripname '' '.exe' "$func_basename_result"
+    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $opt_debug
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$save_ifs
+      eval cmd=\"$cmd\"
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# `FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $opt_debug
+    case $1 in
+    */* | *\\*)	. "$1" ;;
+    *)		. "./$1" ;;
+    esac
+}
+
+
+# func_resolve_sysroot PATH
+# Replace a leading = in PATH with a sysroot.  Store the result into
+# func_resolve_sysroot_result
+func_resolve_sysroot ()
+{
+  func_resolve_sysroot_result=$1
+  case $func_resolve_sysroot_result in
+  =*)
+    func_stripname '=' '' "$func_resolve_sysroot_result"
+    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
+    ;;
+  esac
+}
+
+# func_replace_sysroot PATH
+# If PATH begins with the sysroot, replace it with = and
+# store the result into func_replace_sysroot_result.
+func_replace_sysroot ()
+{
+  case "$lt_sysroot:$1" in
+  ?*:"$lt_sysroot"*)
+    func_stripname "$lt_sysroot" '' "$1"
+    func_replace_sysroot_result="=$func_stripname_result"
+    ;;
+  *)
+    # Including no sysroot.
+    func_replace_sysroot_result=$1
+    ;;
+  esac
+}
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $opt_debug
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+	func_append_quoted CC_quoted "$arg"
+      done
+      CC_expanded=`func_echo_all $CC`
+      CC_quoted_expanded=`func_echo_all $CC_quoted`
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	      # Double-quote args containing other shell metacharacters.
+	      func_append_quoted CC_quoted "$arg"
+	    done
+	    CC_expanded=`func_echo_all $CC`
+	    CC_quoted_expanded=`func_echo_all $CC_quoted`
+	    case "$@ " in
+	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  func_echo "unable to infer tagged configuration"
+	  func_fatal_error "specify a tag with \`--tag'"
+#	else
+#	  func_verbose "using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=${1}
+    if test "$build_libtool_libs" = yes; then
+      write_lobj=\'${2}\'
+    else
+      write_lobj=none
+    fi
+
+    if test "$build_old_libs" = yes; then
+      write_oldobj=\'${3}\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "${write_libobj}"
+    }
+}
+
+
+##################################################
+# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
+##################################################
+
+# func_convert_core_file_wine_to_w32 ARG
+# Helper function used by file name conversion functions when $build is *nix,
+# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH.
+#
+# ARG is the $build file name to be converted to w32 format.
+# Result is available in $func_convert_core_file_wine_to_w32_result, and will
+# be empty on error (or when ARG is empty)
+func_convert_core_file_wine_to_w32 ()
+{
+  $opt_debug
+  func_convert_core_file_wine_to_w32_result="$1"
+  if test -n "$1"; then
+    # Unfortunately, winepath does not exit with a non-zero error code, so we
+    # are forced to check the contents of stdout. On the other hand, if the
+    # command is not found, the shell will set an exit code of 127 and print
+    # *an error message* to stdout. So we must check for both error code of
+    # zero AND non-empty stdout, which explains the odd construction:
+    func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
+    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+      func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
+        $SED -e "$lt_sed_naive_backslashify"`
+    else
+      func_convert_core_file_wine_to_w32_result=
+    fi
+  fi
+}
+# end: func_convert_core_file_wine_to_w32
+
+
+# func_convert_core_path_wine_to_w32 ARG
+# Helper function used by path conversion functions when $build is *nix, and
+# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
+# configured wine environment available, with the winepath program in $build's
+# $PATH. Assumes ARG has no leading or trailing path separator characters.
+#
+# ARG is path to be converted from $build format to win32.
+# Result is available in $func_convert_core_path_wine_to_w32_result.
+# Unconvertible file (directory) names in ARG are skipped; if no directory names
+# are convertible, then the result may be empty.
+func_convert_core_path_wine_to_w32 ()
+{
+  $opt_debug
+  # unfortunately, winepath doesn't convert paths, only file names
+  func_convert_core_path_wine_to_w32_result=""
+  if test -n "$1"; then
+    oldIFS=$IFS
+    IFS=:
+    for func_convert_core_path_wine_to_w32_f in $1; do
+      IFS=$oldIFS
+      func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
+      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+        if test -z "$func_convert_core_path_wine_to_w32_result"; then
+          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+        else
+          func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
+        fi
+      fi
+    done
+    IFS=$oldIFS
+  fi
+}
+# end: func_convert_core_path_wine_to_w32
+
+
+# func_cygpath ARGS...
+# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
+# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
+# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
+# (2), returns the Cygwin file name or path in func_cygpath_result (input
+# file name or path is assumed to be in w32 format, as previously converted
+# from $build's *nix or MSYS format). In case (3), returns the w32 file name
+# or path in func_cygpath_result (input file name or path is assumed to be in
+# Cygwin format). Returns an empty string on error.
+#
+# ARGS are passed to cygpath, with the last one being the file name or path to
+# be converted.
+#
+# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
+# environment variable; do not put it in $PATH.
+func_cygpath ()
+{
+  $opt_debug
+  if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
+    func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
+    if test "$?" -ne 0; then
+      # on failure, ensure result is empty
+      func_cygpath_result=
+    fi
+  else
+    func_cygpath_result=
+    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+  fi
+}
+#end: func_cygpath
+
+
+# func_convert_core_msys_to_w32 ARG
+# Convert file name or path ARG from MSYS format to w32 format.  Return
+# result in func_convert_core_msys_to_w32_result.
+func_convert_core_msys_to_w32 ()
+{
+  $opt_debug
+  # awkward: cmd appends spaces to result
+  func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+}
+#end: func_convert_core_msys_to_w32
+
+
+# func_convert_file_check ARG1 ARG2
+# Verify that ARG1 (a file name in $build format) was converted to $host
+# format in ARG2. Otherwise, emit an error message, but continue (resetting
+# func_to_host_file_result to ARG1).
+func_convert_file_check ()
+{
+  $opt_debug
+  if test -z "$2" && test -n "$1" ; then
+    func_error "Could not determine host file name corresponding to"
+    func_error "  \`$1'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback:
+    func_to_host_file_result="$1"
+  fi
+}
+# end func_convert_file_check
+
+
+# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
+# Verify that FROM_PATH (a path in $build format) was converted to $host
+# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
+# func_to_host_file_result to a simplistic fallback value (see below).
+func_convert_path_check ()
+{
+  $opt_debug
+  if test -z "$4" && test -n "$3"; then
+    func_error "Could not determine the host path corresponding to"
+    func_error "  \`$3'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback.  This is a deliberately simplistic "conversion" and
+    # should not be "improved".  See libtool.info.
+    if test "x$1" != "x$2"; then
+      lt_replace_pathsep_chars="s|$1|$2|g"
+      func_to_host_path_result=`echo "$3" |
+        $SED -e "$lt_replace_pathsep_chars"`
+    else
+      func_to_host_path_result="$3"
+    fi
+  fi
+}
+# end func_convert_path_check
+
+
+# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
+# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
+# and appending REPL if ORIG matches BACKPAT.
+func_convert_path_front_back_pathsep ()
+{
+  $opt_debug
+  case $4 in
+  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+    ;;
+  esac
+  case $4 in
+  $2 ) func_to_host_path_result+="$3"
+    ;;
+  esac
+}
+# end func_convert_path_front_back_pathsep
+
+
+##################################################
+# $build to $host FILE NAME CONVERSION FUNCTIONS #
+##################################################
+# invoked via `$to_host_file_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# Result will be available in $func_to_host_file_result.
+
+
+# func_to_host_file ARG
+# Converts the file name ARG from $build format to $host format. Return result
+# in func_to_host_file_result.
+func_to_host_file ()
+{
+  $opt_debug
+  $to_host_file_cmd "$1"
+}
+# end func_to_host_file
+
+
+# func_to_tool_file ARG LAZY
+# converts the file name ARG from $build format to toolchain format. Return
+# result in func_to_tool_file_result.  If the conversion in use is listed
+# in (the comma separated) LAZY, no conversion takes place.
+func_to_tool_file ()
+{
+  $opt_debug
+  case ,$2, in
+    *,"$to_tool_file_cmd",*)
+      func_to_tool_file_result=$1
+      ;;
+    *)
+      $to_tool_file_cmd "$1"
+      func_to_tool_file_result=$func_to_host_file_result
+      ;;
+  esac
+}
+# end func_to_tool_file
+
+
+# func_convert_file_noop ARG
+# Copy ARG to func_to_host_file_result.
+func_convert_file_noop ()
+{
+  func_to_host_file_result="$1"
+}
+# end func_convert_file_noop
+
+
+# func_convert_file_msys_to_w32 ARG
+# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_file_result.
+func_convert_file_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_w32
+
+
+# func_convert_file_cygwin_to_w32 ARG
+# Convert file name ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_file_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
+    # LT_CYGPATH in this case.
+    func_to_host_file_result=`cygpath -m "$1"`
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_cygwin_to_w32
+
+
+# func_convert_file_nix_to_w32 ARG
+# Convert file name ARG from *nix to w32 format.  Requires a wine environment
+# and a working winepath. Returns result in func_to_host_file_result.
+func_convert_file_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_file_wine_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_w32
+
+
+# func_convert_file_msys_to_cygwin ARG
+# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_file_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_cygwin
+
+
+# func_convert_file_nix_to_cygwin ARG
+# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
+# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
+# in func_to_host_file_result.
+func_convert_file_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
+    func_convert_core_file_wine_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_cygwin
+
+
+#############################################
+# $build to $host PATH CONVERSION FUNCTIONS #
+#############################################
+# invoked via `$to_host_path_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# The result will be available in $func_to_host_path_result.
+#
+# Path separators are also converted from $build format to $host format.  If
+# ARG begins or ends with a path separator character, it is preserved (but
+# converted to $host format) on output.
+#
+# All path conversion functions are named using the following convention:
+#   file name conversion function    : func_convert_file_X_to_Y ()
+#   path conversion function         : func_convert_path_X_to_Y ()
+# where, for any given $build/$host combination the 'X_to_Y' value is the
+# same.  If conversion functions are added for new $build/$host combinations,
+# the two new functions must follow this pattern, or func_init_to_host_path_cmd
+# will break.
+
+
+# func_init_to_host_path_cmd
+# Ensures that function "pointer" variable $to_host_path_cmd is set to the
+# appropriate value, based on the value of $to_host_file_cmd.
+to_host_path_cmd=
+func_init_to_host_path_cmd ()
+{
+  $opt_debug
+  if test -z "$to_host_path_cmd"; then
+    func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
+    to_host_path_cmd="func_convert_path_${func_stripname_result}"
+  fi
+}
+
+
+# func_to_host_path ARG
+# Converts the path ARG from $build format to $host format. Return result
+# in func_to_host_path_result.
+func_to_host_path ()
+{
+  $opt_debug
+  func_init_to_host_path_cmd
+  $to_host_path_cmd "$1"
+}
+# end func_to_host_path
+
+
+# func_convert_path_noop ARG
+# Copy ARG to func_to_host_path_result.
+func_convert_path_noop ()
+{
+  func_to_host_path_result="$1"
+}
+# end func_convert_path_noop
+
+
+# func_convert_path_msys_to_w32 ARG
+# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_path_result.
+func_convert_path_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from ARG.  MSYS
+    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
+    # and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_msys_to_w32
+
+
+# func_convert_path_cygwin_to_w32 ARG
+# Convert path ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_path_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_cygwin_to_w32
+
+
+# func_convert_path_nix_to_w32 ARG
+# Convert path ARG from *nix to w32 format.  Requires a wine environment and
+# a working winepath.  Returns result in func_to_host_file_result.
+func_convert_path_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_nix_to_w32
+
+
+# func_convert_path_msys_to_cygwin ARG
+# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_path_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_msys_to_cygwin
+
+
+# func_convert_path_nix_to_cygwin ARG
+# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
+# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
+# func_to_host_file_result.
+func_convert_path_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from
+    # ARG. msys behavior is inconsistent here, cygpath turns them
+    # into '.;' and ';.', and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_nix_to_cygwin
+
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $opt_debug
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  test -n "$libobj" && \
+	    func_fatal_error "you cannot specify \`-o' more than once"
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-pie | -fpie | -fPIE)
+          pie_flag+=" $arg"
+	  continue
+	  ;;
+
+	-shared | -static | -prefer-pic | -prefer-non-pic)
+	  later+=" $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  func_stripname '-Wc,' '' "$arg"
+	  args=$func_stripname_result
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+	  for arg in $args; do
+	    IFS="$save_ifs"
+	    func_append_quoted lastarg "$arg"
+	  done
+	  IFS="$save_ifs"
+	  func_stripname ' ' '' "$lastarg"
+	  lastarg=$func_stripname_result
+
+	  # Add the arguments to base_compile.
+	  base_compile+=" $lastarg"
+	  continue
+	  ;;
+
+	*)
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg="$srcfile"
+	  srcfile="$arg"
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      func_append_quoted base_compile "$lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      func_fatal_error "you must specify an argument for -Xcompile"
+      ;;
+    target)
+      func_fatal_error "you must specify a target with \`-o'"
+      ;;
+    *)
+      # Get the name of the library object.
+      test -z "$libobj" && {
+	func_basename "$srcfile"
+	libobj="$func_basename_result"
+      }
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    case $libobj in
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
+    esac
+
+    case $libobj in
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+    *)
+      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	continue
+	;;
+
+      -static)
+	build_libtool_libs=no
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
+      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname="$func_basename_result"
+    xdir="$func_dirname_result"
+    lobj=${xdir}$objdir/$objname
+
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	$ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+      removelist+=" $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
+    fi
+
+    $opt_dry_run || $RM $removelist
+    removelist+=" $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+    func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
+    srcfile=$func_to_tool_file_result
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      func_mkdir_p "$xdir$objdir"
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	command+=" -o $lobj"
+      fi
+
+      func_show_eval_locale "$command"	\
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	func_show_eval '$MV "$output_obj" "$lobj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+	suppress_output=' >/dev/null 2>&1'
+      fi
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile$pie_flag"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+	command+=" -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      command+="$suppress_output"
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	func_show_eval '$MV "$output_obj" "$obj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+    fi
+
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+      # Unlock the critical section if it was locked
+      if test "$need_locks" != no; then
+	removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
+
+    exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $opt_mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
+
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to build PIC objects only
+  -prefer-non-pic   try to build non-PIC objects only
+  -shared           do not build a \`.o' file suitable for static linking
+  -static           only build a \`.o' file suitable for static linking
+  -Wc,FLAG          pass FLAG directly to the compiler
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+        ;;
+
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
+
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+        ;;
+
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
+
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -bindir BINDIR    specify path to binaries directory (for systems where
+                    libraries must be found in the PATH setting at runtime)
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
+  -Wc,FLAG
+  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
+  -Wl,FLAG
+  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
+  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+        ;;
+
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      *)
+        func_fatal_help "invalid operation mode \`$opt_mode'"
+        ;;
+    esac
+
+    echo
+    $ECHO "Try \`$progname --help' for more information about other modes."
+}
+
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+  if test "$opt_help" = :; then
+    func_mode_help
+  else
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	func_mode_help
+      done
+    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	echo
+	func_mode_help
+      done
+    } |
+    sed '1d
+      /^When reporting/,/^Report/{
+	H
+	d
+      }
+      $x
+      /information about other modes/d
+      /more detailed .*MODE/d
+      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+  fi
+  exit $?
+fi
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $opt_debug
+    # The first argument is the command name.
+    cmd="$nonopt"
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
+
+    # Handle -dlopen flags immediately.
+    for file in $opt_dlopen; do
+      test -f "$file" \
+	|| func_fatal_help "\`$file' is not a file"
+
+      dir=
+      case $file in
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$lib' is not a valid libtool archive"
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+	func_source "$file"
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && \
+	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  dir+="/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	  fi
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+	;;
+
+      *)
+	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -* | *.la | *.lo ) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if func_ltwrapper_script_p "$file"; then
+	  func_source "$file"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	elif func_ltwrapper_executable_p "$file"; then
+	  func_ltwrapper_scriptname "$file"
+	  func_source "$func_ltwrapper_scriptname_result"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_append_quoted args "$file"
+    done
+
+    if test "X$opt_dry_run" = Xfalse; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+	      else
+		$lt_unset $lt_var
+	      fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $opt_debug
+    libs=
+    libdirs=
+    admincmds=
+
+    for opt in "$nonopt" ${1+"$@"}
+    do
+      if test -d "$opt"; then
+	libdirs+=" $opt"
+
+      elif test -f "$opt"; then
+	if func_lalib_unsafe_p "$opt"; then
+	  libs+=" $opt"
+	else
+	  func_warning "\`$opt' is not a valid libtool archive"
+	fi
+
+      else
+	func_fatal_error "invalid argument \`$opt'"
+      fi
+    done
+
+    if test -n "$libs"; then
+      if test -n "$lt_sysroot"; then
+        sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
+        sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
+      else
+        sysroot_cmd=
+      fi
+
+      # Remove sysroot references
+      if $opt_dry_run; then
+        for lib in $libs; do
+          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+        done
+      else
+        tmpdir=`func_mktempdir`
+        for lib in $libs; do
+	  sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+	    > $tmpdir/tmp-la
+	  mv -f $tmpdir/tmp-la $lib
+	done
+        ${RM}r "$tmpdir"
+      fi
+    fi
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $opt_dry_run || eval "$cmds" || admincmds+="
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    $opt_silent && exit $EXIT_SUCCESS
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      echo "----------------------------------------------------------------------"
+      echo "Libraries have been installed in:"
+      for libdir in $libdirs; do
+	$ECHO "   $libdir"
+      done
+      echo
+      echo "If you ever happen to want to link against installed libraries"
+      echo "in a given directory, LIBDIR, you must either use libtool, and"
+      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+      echo "flag during linking and do at least one of the following:"
+      if test -n "$shlibpath_var"; then
+	echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+	echo "     during execution"
+      fi
+      if test -n "$runpath_var"; then
+	echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+	echo "     during linking"
+      fi
+      if test -n "$hardcode_libdir_flag_spec"; then
+	libdir=LIBDIR
+	eval flag=\"$hardcode_libdir_flag_spec\"
+
+	$ECHO "   - use the \`$flag' linker flag"
+      fi
+      if test -n "$admincmds"; then
+	$ECHO "   - have your system administrator run these commands:$admincmds"
+      fi
+      if test -f /etc/ld.so.conf; then
+	echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+      fi
+      echo
+
+      echo "See any operating system documentation about shared libraries for"
+      case $host in
+	solaris2.[6789]|solaris2.1[0-9])
+	  echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+	  echo "pages."
+	  ;;
+	*)
+	  echo "more information, such as the ld(1) and ld.so(8) manual pages."
+	  ;;
+      esac
+      echo "----------------------------------------------------------------------"
+    fi
+    exit $EXIT_SUCCESS
+}
+
+test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+    $opt_debug
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       case $nonopt in *shtool*) :;; *) false;; esac; then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    install_prog+="$func_quote_for_eval_result"
+    install_shared_prog=$install_prog
+    case " $install_prog " in
+      *[\\\ /]cp\ *) install_cp=: ;;
+      *) install_cp=false ;;
+    esac
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    no_mode=:
+    for arg
+    do
+      arg2=
+      if test -n "$dest"; then
+	files+=" $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f)
+	if $install_cp; then :; else
+	  prev=$arg
+	fi
+	;;
+      -g | -m | -o)
+	prev=$arg
+	;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
+	    arg2=$install_override_mode
+	    no_mode=false
+	  fi
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      install_prog+=" $func_quote_for_eval_result"
+      if test -n "$arg2"; then
+	func_quote_for_eval "$arg2"
+      fi
+      install_shared_prog+=" $func_quote_for_eval_result"
+    done
+
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prev' option requires an argument"
+
+    if test -n "$install_override_mode" && $no_mode; then
+      if $install_cp; then :; else
+	func_quote_for_eval "$install_override_mode"
+	install_shared_prog+=" -m $func_quote_for_eval_result"
+      fi
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	func_fatal_help "no file or destination specified"
+      else
+	func_fatal_help "you must specify a destination"
+      fi
+    fi
+
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir="$func_dirname_result"
+      destname="$func_basename_result"
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+	func_fatal_help "\`$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	staticlibs+=" $file"
+	;;
+
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$file' is not a valid libtool archive"
+
+	library_names=
+	old_library=
+	relink_command=
+	func_source "$file"
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) current_libdirs+=" $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) future_libdirs+=" $libdir" ;;
+	  esac
+	fi
+
+	func_dirname "$file" "/" ""
+	dir="$func_dirname_result"
+	dir+="$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  test "$inst_prefix_dir" = "$destdir" && \
+	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  func_warning "relinking \`$file'"
+	  func_show_eval "$relink_command" \
+	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names; shift
+	if test -n "$1"; then
+	  realname="$1"
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
+	      'exit $?'
+	  tstripme="$stripme"
+	  case $host_os in
+	  cygwin* | mingw* | pw32* | cegcc*)
+	    case $realname in
+	    *.dll.a)
+	      tstripme=""
+	      ;;
+	    esac
+	    ;;
+	  esac
+	  if test -n "$tstripme" && test -n "$striplib"; then
+	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      test "$linkname" != "$realname" \
+		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  func_execute_cmds "$postinstall_cmds" 'exit $?'
+	fi
+
+	# Install the pseudo-library for information purposes.
+	func_basename "$file"
+	name="$func_basename_result"
+	instname="$dir/$name"i
+	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && staticlibs+=" $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  func_lo2o "$destfile"
+	  staticdest=$func_lo2o_result
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	test -n "$destfile" && \
+	  func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  func_lo2o "$file"
+	  staticobj=$func_lo2o_result
+	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      func_stripname '' '.exe' "$file"
+	      file=$func_stripname_result
+	      stripped_ext=".exe"
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin* | *mingw*)
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      wrapper=$func_ltwrapper_scriptname_result
+	    else
+	      func_stripname '' '.exe' "$file"
+	      wrapper=$func_stripname_result
+	    fi
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if func_ltwrapper_script_p "$wrapper"; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  func_source "$wrapper"
+
+	  # Check the variables that should have been set.
+	  test -z "$generated_by_libtool_version" && \
+	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      func_source "$lib"
+	    fi
+	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      func_warning "\`$lib' has not been installed in \`$libdir'"
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  func_source "$wrapper"
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    $opt_dry_run || {
+	      if test "$finalize" = yes; then
+	        tmpdir=`func_mktempdir`
+		func_basename "$file$stripped_ext"
+		file="$func_basename_result"
+	        outputname="$tmpdir/$file"
+	        # Replace the output file specification.
+	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
+
+	        $opt_silent || {
+	          func_quote_for_expand "$relink_command"
+		  eval "func_echo $func_quote_for_expand_result"
+	        }
+	        if eval "$relink_command"; then :
+	          else
+		  func_error "error: relink \`$file' with the above command before installing it"
+		  $opt_dry_run || ${RM}r "$tmpdir"
+		  continue
+	        fi
+	        file="$outputname"
+	      else
+	        func_warning "cannot relink \`$file'"
+	      fi
+	    }
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    func_stripname '' '.exe' "$destfile"
+	    destfile=$func_stripname_result
+	    ;;
+	  esac
+	  ;;
+	esac
+	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+	$opt_dry_run || if test -n "$outputname"; then
+	  ${RM}r "$tmpdir"
+	fi
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      func_basename "$file"
+      name="$func_basename_result"
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+      func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+      tool_oldlib=$func_to_tool_file_result
+
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
+      fi
+
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
+
+    test -n "$future_libdirs" && \
+      func_warning "remember to run \`$progname --finish$future_libdirs'"
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = install && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $opt_debug
+    my_outputname="$1"
+    my_originator="$2"
+    my_pic_p="${3-no}"
+    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	my_dlsyms="${my_outputname}S.c"
+      else
+	func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
+
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+	# Discover the nlist of each of the dlfiles.
+	nlist="$output_objdir/${my_outputname}.nm"
+
+	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+	# Parse the name list into a source file.
+	func_verbose "creating $output_objdir/$my_dlsyms"
+
+	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+/* External symbol declarations for the compiler. */\
+"
+
+	if test "$dlself" = yes; then
+	  func_verbose "generating symbol list for \`$output'"
+
+	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+	  # Add our own program objects to the symbol list.
+	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	  for progfile in $progfiles; do
+	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
+	    func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -n "$exclude_expsyms"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  if test -n "$export_symbols_regex"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  # Prepare the list of exported symbols
+	  if test -z "$export_symbols"; then
+	    export_symbols="$output_objdir/$outputname.exp"
+	    $opt_dry_run || {
+	      $RM $export_symbols
+	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      case $host in
+	      *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+	        ;;
+	      esac
+	    }
+	  else
+	    $opt_dry_run || {
+	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	      case $host in
+	        *cygwin* | *mingw* | *cegcc* )
+	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+	          ;;
+	      esac
+	    }
+	  fi
+	fi
+
+	for dlprefile in $dlprefiles; do
+	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_basename "$dlprefile"
+	  name="$func_basename_result"
+          case $host in
+	    *cygwin* | *mingw* | *cegcc* )
+	      # if an import library, we need to obtain dlname
+	      if func_win32_import_lib_p "$dlprefile"; then
+	        func_tr_sh "$dlprefile"
+	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
+	        dlprefile_dlbasename=""
+	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
+	          # Use subshell, to avoid clobbering current variable values
+	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
+	          if test -n "$dlprefile_dlname" ; then
+	            func_basename "$dlprefile_dlname"
+	            dlprefile_dlbasename="$func_basename_result"
+	          else
+	            # no lafile. user explicitly requested -dlpreopen <import library>.
+	            $sharedlib_from_linklib_cmd "$dlprefile"
+	            dlprefile_dlbasename=$sharedlib_from_linklib_result
+	          fi
+	        fi
+	        $opt_dry_run || {
+	          if test -n "$dlprefile_dlbasename" ; then
+	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
+	          else
+	            func_warning "Could not compute DLL name from $name"
+	            eval '$ECHO ": $name " >> "$nlist"'
+	          fi
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+	            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+	        }
+	      else # not an import lib
+	        $opt_dry_run || {
+	          eval '$ECHO ": $name " >> "$nlist"'
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	        }
+	      fi
+	    ;;
+	    *)
+	      $opt_dry_run || {
+	        eval '$ECHO ": $name " >> "$nlist"'
+	        func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	        eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	      }
+	    ;;
+          esac
+	done
+
+	$opt_dry_run || {
+	  # Make sure we have at least an empty file.
+	  test -f "$nlist" || : > "$nlist"
+
+	  if test -n "$exclude_expsyms"; then
+	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	    $MV "$nlist"T "$nlist"
+	  fi
+
+	  # Try sorting and uniquifying the output.
+	  if $GREP -v "^: " < "$nlist" |
+	      if sort -k 3 </dev/null >/dev/null 2>&1; then
+		sort -k 3
+	      else
+		sort +2
+	      fi |
+	      uniq > "$nlist"S; then
+	    :
+	  else
+	    $GREP -v "^: " < "$nlist" > "$nlist"S
+	  fi
+
+	  if test -f "$nlist"S; then
+	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+	  else
+	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
+	  fi
+
+	  echo >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+extern LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];
+LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{\
+  { \"$my_originator\", (void *) 0 },"
+
+	  case $need_lib_prefix in
+	  no)
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  *)
+	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  esac
+	  echo >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	} # !$opt_dry_run
+
+	pic_flag_for_symtable=
+	case "$compile_command " in
+	*" -static "*) ;;
+	*)
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+	  *-*-hpux*)
+	    pic_flag_for_symtable=" $pic_flag"  ;;
+	  *)
+	    if test "X$my_pic_p" != Xno; then
+	      pic_flag_for_symtable=" $pic_flag"
+	    fi
+	    ;;
+	  esac
+	  ;;
+	esac
+	symtab_cflags=
+	for arg in $LTCFLAGS; do
+	  case $arg in
+	  -pie | -fpie | -fPIE) ;;
+	  *) symtab_cflags+=" $arg" ;;
+	  esac
+	done
+
+	# Now compile the dynamic symbol file.
+	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+	# Clean up the generated files.
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+
+	# Transform the symbol file into the correct name.
+	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	case $host in
+	*cygwin* | *mingw* | *cegcc* )
+	  if test -f "$output_objdir/$my_outputname.def"; then
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	  else
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  fi
+	  ;;
+	*)
+	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  ;;
+	esac
+	;;
+      *)
+	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
+    fi
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
+func_win32_libid ()
+{
+  $opt_debug
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+      func_to_tool_file "$1" func_convert_file_msys_to_w32
+      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+	$SED -n -e '
+	    1,100{
+		/ I /{
+		    s,.*,import,
+		    p
+		    q
+		}
+	    }'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
+
+# func_cygming_dll_for_implib ARG
+#
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib ()
+{
+  $opt_debug
+  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
+}
+
+# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
+#
+# The is the core of a fallback implementation of a
+# platform-specific function to extract the name of the
+# DLL associated with the specified import library LIBNAME.
+#
+# SECTION_NAME is either .idata$6 or .idata$7, depending
+# on the platform and compiler that created the implib.
+#
+# Echos the name of the DLL associated with the
+# specified import library.
+func_cygming_dll_for_implib_fallback_core ()
+{
+  $opt_debug
+  match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
+  $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
+    $SED '/^Contents of section '"$match_literal"':/{
+      # Place marker at beginning of archive member dllname section
+      s/.*/====MARK====/
+      p
+      d
+    }
+    # These lines can sometimes be longer than 43 characters, but
+    # are always uninteresting
+    /:[	 ]*file format pe[i]\{,1\}-/d
+    /^In archive [^:]*:/d
+    # Ensure marker is printed
+    /^====MARK====/p
+    # Remove all lines with less than 43 characters
+    /^.\{43\}/!d
+    # From remaining lines, remove first 43 characters
+    s/^.\{43\}//' |
+    $SED -n '
+      # Join marker and all lines until next marker into a single line
+      /^====MARK====/ b para
+      H
+      $ b para
+      b
+      :para
+      x
+      s/\n//g
+      # Remove the marker
+      s/^====MARK====//
+      # Remove trailing dots and whitespace
+      s/[\. \t]*$//
+      # Print
+      /./p' |
+    # we now have a list, one entry per line, of the stringified
+    # contents of the appropriate section of all members of the
+    # archive which possess that section. Heuristic: eliminate
+    # all those which have a first or second character that is
+    # a '.' (that is, objdump's representation of an unprintable
+    # character.) This should work for all archives with less than
+    # 0x302f exports -- but will fail for DLLs whose name actually
+    # begins with a literal '.' or a single character followed by
+    # a '.'.
+    #
+    # Of those that remain, print the first one.
+    $SED -e '/^\./d;/^.\./d;q'
+}
+
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
+# func_cygming_dll_for_implib_fallback ARG
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+#
+# This fallback implementation is for use when $DLLTOOL
+# does not support the --identify-strict option.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib_fallback ()
+{
+  $opt_debug
+  if func_cygming_gnu_implib_p "$1" ; then
+    # binutils import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
+  elif func_cygming_ms_implib_p "$1" ; then
+    # ms-generated import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
+  else
+    # unknown
+    sharedlib_from_linklib_result=""
+  fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $opt_debug
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+    if test "$lock_old_archive_extraction" = yes; then
+      lockfile=$f_ex_an_ar_oldlib.lock
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    fi
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+		   'stat=$?; rm -f "$lockfile"; exit $stat'
+    if test "$lock_old_archive_extraction" = yes; then
+      $opt_dry_run || rm -f "$lockfile"
+    fi
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $opt_debug
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib="$func_basename_result"
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  func_arith $extracted_serial + 1
+	  extracted_serial=$func_arith_result
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir="$my_gentop/$my_xlib_u"
+
+      func_mkdir_p "$my_xdir"
+
+      case $host in
+      *-darwin*)
+	func_verbose "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	$opt_dry_run || {
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`basename "$darwin_archive"`
+	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+	  if test -n "$darwin_arches"; then
+	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
+	      $LIPO -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    $RM -rf unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd $darwin_orig_dir
+	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	} # !$opt_dry_run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+	;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
+    done
+
+    func_extract_archives_result="$my_oldobjs"
+}
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=${1-no}
+
+	$ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    file=\"\$0\""
+
+    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+    $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+    ECHO=\"$qECHO\"
+  fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's $0 value, followed by "$@".
+lt_option_debug=
+func_parse_lt_options ()
+{
+  lt_script_arg0=\$0
+  shift
+  for lt_opt
+  do
+    case \"\$lt_opt\" in
+    --lt-debug) lt_option_debug=1 ;;
+    --lt-dump-script)
+        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
+        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
+        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
+        cat \"\$lt_dump_D/\$lt_dump_F\"
+        exit 0
+      ;;
+    --lt-*)
+        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
+        exit 1
+      ;;
+    esac
+  done
+
+  # Print the debug banner immediately:
+  if test -n \"\$lt_option_debug\"; then
+    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+  fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+  lt_dump_args_N=1;
+  for lt_arg
+  do
+    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
+  done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+"
+  case $host in
+  # Backslashes separate directories on plain windows
+  *-*-mingw | *-*-os2* | *-cegcc*)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+    ;;
+
+  *)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+    ;;
+  esac
+  $ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from \$@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+  case \" \$* \" in
+  *\\ --lt-*)
+    for lt_wr_arg
+    do
+      case \$lt_wr_arg in
+      --lt-*) ;;
+      *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+      esac
+      shift
+    done ;;
+  esac
+  func_exec_program_core \${1+\"\$@\"}
+}
+
+  # Parse options
+  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
+  done
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
+
+	  $ECHO "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$ECHO \"\$relink_command_output\" >&2
+	$RM \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+	else
+	  $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$ECHO "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# fixup the dll searchpath if we need to.
+	#
+	# Fix the DLL searchpath if we need to.  Do this before prepending
+	# to shlibpath, because on Windows, both are PATH and uninstalled
+	# libraries must come first.
+	if test -n "$dllsearchpath"; then
+	  $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	$ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+      func_exec_program \${1+\"\$@\"}
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+	cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+*/
+EOF
+	    cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+/* declarations of non-ANSI functions */
+#if defined(__MINGW32__)
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined(__CYGWIN__)
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined (other platforms) ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined(_MSC_VER)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+# define S_IXUSR _S_IEXEC
+# ifndef _INTPTR_T_DEFINED
+#  define _INTPTR_T_DEFINED
+#  define intptr_t int
+# endif
+#elif defined(__MINGW32__)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+#elif defined(__CYGWIN__)
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined (other platforms) ... */
+#endif
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+/* path handling portability macros */
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+#if defined(LT_DEBUGWRAPPER)
+static int lt_debug = 1;
+#else
+static int lt_debug = 0;
+#endif
+
+const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_debugprintf (const char *file, int line, const char *fmt, ...);
+void lt_fatal (const char *file, int line, const char *message, ...);
+static const char *nonnull (const char *s);
+static const char *nonempty (const char *s);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
+EOF
+
+	    cat <<EOF
+volatile const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_path "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_path "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test "$fast_install" = yes; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+	    else
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+	    fi
+
+
+	    cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  intptr_t rval = 127;
+
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  newargz = XMALLOC (char *, argc + 1);
+
+  /* very simple arg parsing; don't want to rely on getopt
+   * also, copy all non cwrapper options to newargz, except
+   * argz[0], which is handled differently
+   */
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (strcmp (argv[i], dumpscript_opt) == 0)
+	{
+EOF
+	    case "$host" in
+	      *mingw* | *cygwin* )
+		# make stdout use "unix" line endings
+		echo "          setmode(1,_O_BINARY);"
+		;;
+	      esac
+
+	    cat <<"EOF"
+	  lt_dump_script (stdout);
+	  return 0;
+	}
+      if (strcmp (argv[i], debug_opt) == 0)
+	{
+          lt_debug = 1;
+          continue;
+	}
+      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal (__FILE__, __LINE__,
+		    "unrecognized %s option: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
+
+EOF
+	    cat <<EOF
+  /* The GNU banner must be the first non-error debug message */
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+EOF
+	    cat <<"EOF"
+  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
+
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (before symlink chase) at: %s\n",
+		  tmp_pathspec);
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (after symlink chase) at: %s\n",
+		  actual_cwrapper_path);
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(main) libtool target name: %s\n",
+		  target_name);
+EOF
+
+	    cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
+
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
+
+	    case $host_os in
+	      mingw*)
+	    cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+	*p = '/';
+      }
+  }
+EOF
+	    ;;
+	    esac
+
+	    cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
+
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
+     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
+     because on Windows, both *_VARNAMEs are PATH but uninstalled
+     libraries must come first. */
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+
+  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
+		  nonnull (lt_argv_zero));
+  for (i = 0; i < newargc; i++)
+    {
+      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
+		      i, nonnull (newargz[i]));
+    }
+
+EOF
+
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  newargz = prepare_spawn (newargz);
+  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      lt_debugprintf (__FILE__, __LINE__,
+		      "(main) failed to launch target \"%s\": %s\n",
+		      lt_argv_zero, nonnull (strerror (errno)));
+      return 127;
+    }
+  return rval;
+EOF
+		;;
+	      *)
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+		;;
+	    esac
+
+	    cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal (__FILE__, __LINE__, "memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+			  string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable (const char *path)
+{
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
+
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char *concat_name;
+
+  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
+                  nonempty (wrapper));
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+	return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+	{
+	  concat_name = xstrdup (wrapper);
+	  if (check_executable (concat_name))
+	    return concat_name;
+	  XFREE (concat_name);
+	}
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+    }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+	has_slash = 1;
+	break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+	{
+	  for (p = path; *p; p = p_next)
+	    {
+	      const char *q;
+	      size_t p_len;
+	      for (q = p; *q; q++)
+		if (IS_PATH_SEPARATOR (*q))
+		  break;
+	      p_len = q - p;
+	      p_next = (*q == '\0' ? q : q + 1);
+	      if (p_len == 0)
+		{
+		  /* empty path: current directory */
+		  if (getcwd (tmp, LT_PATHMAX) == NULL)
+		    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+                              nonnull (strerror (errno)));
+		  tmp_len = strlen (tmp);
+		  concat_name =
+		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, tmp, tmp_len);
+		  concat_name[tmp_len] = '/';
+		  strcpy (concat_name + tmp_len + 1, wrapper);
+		}
+	      else
+		{
+		  concat_name =
+		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, p, p_len);
+		  concat_name[p_len] = '/';
+		  strcpy (concat_name + p_len + 1, wrapper);
+		}
+	      if (check_executable (concat_name))
+		return concat_name;
+	      XFREE (concat_name);
+	    }
+	}
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+              nonnull (strerror (errno)));
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      lt_debugprintf (__FILE__, __LINE__,
+		      "checking path component for symlinks: %s\n",
+		      tmp_pathspec);
+      if (lstat (tmp_pathspec, &s) == 0)
+	{
+	  if (S_ISLNK (s.st_mode) != 0)
+	    {
+	      has_symlinks = 1;
+	      break;
+	    }
+
+	  /* search backwards for last DIR_SEPARATOR */
+	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    p--;
+	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    {
+	      /* no more DIR_SEPARATORS left */
+	      break;
+	    }
+	  *p = '\0';
+	}
+      else
+	{
+	  lt_fatal (__FILE__, __LINE__,
+		    "error accessing file \"%s\": %s",
+		    tmp_pathspec, nonnull (strerror (errno)));
+	}
+    }
+  XFREE (tmp_pathspec);
+
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
+
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal (__FILE__, __LINE__,
+		"could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert (str != NULL);
+  assert (pat != NULL);
+
+  len = strlen (str);
+  patlen = strlen (pat);
+
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (strcmp (str, pat) == 0)
+	*str = '\0';
+    }
+  return str;
+}
+
+void
+lt_debugprintf (const char *file, int line, const char *fmt, ...)
+{
+  va_list args;
+  if (lt_debug)
+    {
+      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
+      va_start (args, fmt);
+      (void) vfprintf (stderr, fmt, args);
+      va_end (args);
+    }
+}
+
+static void
+lt_error_core (int exit_status, const char *file,
+	       int line, const char *mode,
+	       const char *message, va_list ap)
+{
+  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *file, int line, const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
+  va_end (ap);
+}
+
+static const char *
+nonnull (const char *s)
+{
+  return s ? s : "(null)";
+}
+
+static const char *
+nonempty (const char *s)
+{
+  return (s && !*s) ? "(empty)" : nonnull (s);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_setenv) setting '%s' to '%s'\n",
+                  nonnull (name), nonnull (value));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    int len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      int orig_value_len = strlen (orig_value);
+      int add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      int len = strlen (new_value);
+      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[len-1] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+EOF
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+   Note that spawn() does not by itself call the command interpreter
+     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+         GetVersionEx(&v);
+         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+      }) ? "cmd.exe" : "command.com").
+   Instead it simply concatenates the arguments, separated by ' ', and calls
+   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
+   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+   special way:
+   - Space and tab are interpreted as delimiters. They are not treated as
+     delimiters if they are surrounded by double quotes: "...".
+   - Unescaped double quotes are removed from the input. Their only effect is
+     that within double quotes, space and tab are treated like normal
+     characters.
+   - Backslashes not followed by double quotes are not special.
+   - But 2*n+1 backslashes followed by a double quote become
+     n backslashes followed by a double quote (n >= 0):
+       \" -> "
+       \\\" -> \"
+       \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+  size_t argc;
+  char **new_argv;
+  size_t i;
+
+  /* Count number of arguments.  */
+  for (argc = 0; argv[argc] != NULL; argc++)
+    ;
+
+  /* Allocate new argument vector.  */
+  new_argv = XMALLOC (char *, argc + 1);
+
+  /* Put quoted arguments into the new argument vector.  */
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+
+      if (string[0] == '\0')
+	new_argv[i] = xstrdup ("\"\"");
+      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+	{
+	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+	  size_t length;
+	  unsigned int backslashes;
+	  const char *s;
+	  char *quoted_string;
+	  char *p;
+
+	  length = 0;
+	  backslashes = 0;
+	  if (quote_around)
+	    length++;
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		length += backslashes + 1;
+	      length++;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    length += backslashes + 1;
+
+	  quoted_string = XMALLOC (char, length + 1);
+
+	  p = quoted_string;
+	  backslashes = 0;
+	  if (quote_around)
+	    *p++ = '"';
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		{
+		  unsigned int j;
+		  for (j = backslashes + 1; j > 0; j--)
+		    *p++ = '\\';
+		}
+	      *p++ = c;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    {
+	      unsigned int j;
+	      for (j = backslashes; j > 0; j--)
+		*p++ = '\\';
+	      *p++ = '"';
+	    }
+	  *p = '\0';
+
+	  new_argv[i] = quoted_string;
+	}
+      else
+	new_argv[i] = (char *) string;
+    }
+  new_argv[argc] = NULL;
+
+  return new_argv;
+}
+EOF
+		;;
+	    esac
+
+            cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+	    func_emit_wrapper yes |
+	      $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/  fputs ("\1", f);/p
+g
+D'
+            cat <<"EOF"
+}
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+    $opt_debug
+    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+    *import*) : ;;
+    *) false ;;
+    esac
+}
+
+# func_mode_link arg...
+func_mode_link ()
+{
+    $opt_debug
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
+
+    avoid_version=no
+    bindir=
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module="${wl}-single_module"
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	break
+	;;
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    func_warning "complete static linking is impossible in this configuration"
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	esac
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      libtool_args+=" $func_quote_for_eval_result"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  compile_command+=" @OUTPUT@"
+	  finalize_command+=" @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	bindir)
+	  bindir="$arg"
+	  prev=
+	  continue
+	  ;;
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    compile_command+=" @SYMFILE@"
+	    finalize_command+=" @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      dlfiles+=" $arg"
+	    else
+	      dlprefiles+=" $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  test -f "$arg" \
+	    || func_fatal_error "symbol file \`$arg' does not exist"
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	framework)
+	  case $host in
+	    *-*-darwin*)
+	      case "$deplibs " in
+		*" $qarg.ltframework "*) ;;
+		*) deplibs+=" $qarg.ltframework" # this is fixed later
+		   ;;
+	      esac
+	      ;;
+	  esac
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat "$save_arg"`
+	    do
+#	      moreargs+=" $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if func_lalib_unsafe_p "$arg"; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		func_source "$arg"
+
+		if test -z "$pic_object" ||
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none &&
+		   test "$non_pic_object" = none; then
+		  func_fatal_error "cannot find name of object for \`$arg'"
+		fi
+
+		# Extract subdirectory from the argument.
+		func_dirname "$arg" "/" ""
+		xdir="$func_dirname_result"
+
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
+
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      dlfiles+=" $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    dlprefiles+=" $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  libobjs+=" $pic_object"
+		  arg="$pic_object"
+		fi
+
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
+
+		  # A standard non-PIC object
+		  non_pic_objects+=" $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  non_pic_objects+=" $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if $opt_dry_run; then
+		  # Extract subdirectory from the argument.
+		  func_dirname "$arg" "/" ""
+		  xdir="$func_dirname_result"
+
+		  func_lo2o "$arg"
+		  pic_object=$xdir$objdir/$func_lo2o_result
+		  non_pic_object=$xdir$func_lo2o_result
+		  libobjs+=" $pic_object"
+		  non_pic_objects+=" $non_pic_object"
+	        else
+		  func_fatal_error "\`$arg' is not a valid libtool object"
+		fi
+	      fi
+	    done
+	  else
+	    func_fatal_error "link input file \`$arg' does not exist"
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    func_fatal_error "only absolute run-paths are allowed"
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) rpath+=" $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) xrpath+=" $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	shrext)
+	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	weak)
+	  weak_libs+=" $arg"
+	  prev=
+	  continue
+	  ;;
+	xcclinker)
+	  linker_flags+=" $qarg"
+	  compiler_flags+=" $qarg"
+	  prev=
+	  compile_command+=" $qarg"
+	  finalize_command+=" $qarg"
+	  continue
+	  ;;
+	xcompiler)
+	  compiler_flags+=" $qarg"
+	  prev=
+	  compile_command+=" $qarg"
+	  finalize_command+=" $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  linker_flags+=" $qarg"
+	  compiler_flags+=" $wl$qarg"
+	  prev=
+	  compile_command+=" $wl$qarg"
+	  finalize_command+=" $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  # See comment for -static flag below, for more details.
+	  compile_command+=" $link_static_flag"
+	  finalize_command+=" $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -bindir)
+	prev=bindir
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  func_fatal_error "more than one -exported-symbols argument is not allowed"
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework)
+	prev=framework
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  compile_command+=" $arg"
+	  finalize_command+=" $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	func_stripname "-L" '' "$arg"
+	if test -z "$func_stripname_result"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between \`-L' and \`$1'"
+	  else
+	    func_fatal_error "need path for \`-L' option"
+	  fi
+	fi
+	func_resolve_sysroot "$func_stripname_result"
+	dir=$func_resolve_sysroot_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  test -z "$absdir" && \
+	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "* | *" $arg "*)
+	  # Will only happen for absolute or sysroot arguments
+	  ;;
+	*)
+	  # Preserve sysroot, but never include relative directories
+	  case $dir in
+	    [\\/]* | [A-Za-z]:[\\/]* | =*) deplibs+=" $arg" ;;
+	    *) deplibs+=" -L$dir" ;;
+	  esac
+	  lib_search_path+=" $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
+	  *) dllsearchpath+=":$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) dllsearchpath+=":$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    deplibs+=" System.ltframework"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	deplibs+=" $arg"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot|--sysroot)
+	compiler_flags+=" $arg"
+	compile_command+=" $arg"
+	finalize_command+=" $arg"
+	prev=xcompiler
+	continue
+	;;
+
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	compiler_flags+=" $arg"
+	compile_command+=" $arg"
+	finalize_command+=" $arg"
+	case "$new_inherited_linker_flags " in
+	    *" $arg "*) ;;
+	    * ) new_inherited_linker_flags+=" $arg" ;;
+	esac
+	continue
+	;;
+
+      -multi_module)
+	single_module="${wl}-multi_module"
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  func_warning "\`-no-install' is ignored for $host"
+	  func_warning "assuming \`-no-fast-install' instead"
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	func_stripname '-R' '' "$arg"
+	dir=$func_stripname_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	=*)
+	  func_stripname '=' '' "$dir"
+	  dir=$lt_sysroot$func_stripname_result
+	  ;;
+	*)
+	  func_fatal_error "only absolute run-paths are allowed"
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) xrpath+=" $dir" ;;
+	esac
+	continue
+	;;
+
+      -shared)
+	# The effects of -shared are defined in a previous loop.
+	continue
+	;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -weak)
+        prev=weak
+	continue
+	;;
+
+      -Wc,*)
+	func_stripname '-Wc,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  arg+=" $func_quote_for_eval_result"
+	  compiler_flags+=" $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Wl,*)
+	func_stripname '-Wl,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  arg+=" $wl$func_quote_for_eval_result"
+	  compiler_flags+=" $wl$func_quote_for_eval_result"
+	  linker_flags+=" $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # -msg_* for osf cc
+      -msg_*)
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      # Flags to be passed through unchanged, with rationale:
+      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
+      # -r[0-9][0-9]*        specify processor for the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
+      # +DA*, +DD*           enable 64-bit mode for the HP compiler
+      # -q*                  compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
+      # -F/path              path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # @file                GCC response files
+      # -tp=*                Portland pgcc target processor selection
+      # --sysroot=*          for sysroot support
+      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
+      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+        compile_command+=" $arg"
+        finalize_command+=" $arg"
+        compiler_flags+=" $arg"
+        continue
+        ;;
+
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      *.$objext)
+	# A standard object.
+	objs+=" $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if func_lalib_unsafe_p "$arg"; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  func_source "$arg"
+
+	  if test -z "$pic_object" ||
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none &&
+	     test "$non_pic_object" = none; then
+	    func_fatal_error "cannot find name of object for \`$arg'"
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  func_dirname "$arg" "/" ""
+	  xdir="$func_dirname_result"
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		dlfiles+=" $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      dlprefiles+=" $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    libobjs+=" $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    non_pic_objects+=" $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    non_pic_objects+=" $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if $opt_dry_run; then
+	    # Extract subdirectory from the argument.
+	    func_dirname "$arg" "/" ""
+	    xdir="$func_dirname_result"
+
+	    func_lo2o "$arg"
+	    pic_object=$xdir$objdir/$func_lo2o_result
+	    non_pic_object=$xdir$func_lo2o_result
+	    libobjs+=" $pic_object"
+	    non_pic_objects+=" $non_pic_object"
+	  else
+	    func_fatal_error "\`$arg' is not a valid libtool object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	deplibs+=" $arg"
+	old_deplibs+=" $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	func_resolve_sysroot "$arg"
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  dlfiles+=" $func_resolve_sysroot_result"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  dlprefiles+=" $func_resolve_sysroot_result"
+	  prev=
+	else
+	  deplibs+=" $func_resolve_sysroot_result"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	compile_command+=" $arg"
+	finalize_command+=" $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prevarg' option requires an argument"
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      compile_command+=" $arg"
+      finalize_command+=" $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname="$func_basename_result"
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    func_dirname "$output" "/" ""
+    output_objdir="$func_dirname_result$objdir"
+    func_to_tool_file "$output_objdir/"
+    tool_output_objdir=$func_to_tool_file_result
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
+
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_preserve_dup_deps ; then
+	case "$libs " in
+	*" $deplib "*) specialdeplibs+=" $deplib" ;;
+	esac
+      fi
+      libs+=" $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) specialdeplibs+=" $pre_post_deps" ;;
+	  esac
+	  pre_post_deps+=" $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+	passes="conv dlpreopen link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test "$linkmode,$pass" = "lib,link"; then
+	## FIXME: Find the place where the list is rebuilt in the wrong
+	##        order, and fix it there properly
+        tmp_deplibs=
+	for deplib in $deplibs; do
+	  tmp_deplibs="$deplib $tmp_deplibs"
+	done
+	deplibs="$tmp_deplibs"
+      fi
+
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link)
+	  libs="$deplibs %DEPLIBS%"
+	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+	  ;;
+	esac
+      fi
+      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+	# Collect and forward deplibs of preopened libtool libs
+	for lib in $dlprefiles; do
+	  # Ignore non-libtool-libs
+	  dependency_libs=
+	  func_resolve_sysroot "$lib"
+	  case $lib in
+	  *.la)	func_source "$func_resolve_sysroot_result" ;;
+	  esac
+
+	  # Collect preopened libtool deplibs, except any this library
+	  # has declared as weak libs
+	  for deplib in $dependency_libs; do
+	    func_basename "$deplib"
+            deplib_base=$func_basename_result
+	    case " $weak_libs " in
+	    *" $deplib_base "*) ;;
+	    *) deplibs+=" $deplib" ;;
+	    esac
+	  done
+	done
+	libs="$dlprefiles"
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    compiler_flags+=" $deplib"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) new_inherited_linker_flags+=" $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    func_warning "\`-l' is ignored for archives/objects"
+	    continue
+	  fi
+	  func_stripname '-l' '' "$deplib"
+	  name=$func_stripname_result
+	  if test "$linkmode" = lib; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if func_lalib_p "$lib"; then
+		  library_names=
+		  old_library=
+		  func_source "$lib"
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    func_dirname "$lib" "" "."
+		    ladir="$func_dirname_result"
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+		;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	*.ltframework)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) new_inherited_linker_flags+=" $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    newlib_search_path+=" $func_resolve_sysroot_result"
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    newlib_search_path+=" $func_resolve_sysroot_result"
+	    ;;
+	  *)
+	    func_warning "\`-L' is ignored for archives/objects"
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    func_stripname '-R' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    dir=$func_resolve_sysroot_result
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) xrpath+=" $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la)
+	  func_resolve_sysroot "$deplib"
+	  lib=$func_resolve_sysroot_result
+	  ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    # Linking convenience modules into shared libraries is allowed,
+	    # but linking other static libraries is non-portable.
+	    case " $dlpreconveniencelibs " in
+	    *" $deplib "*) ;;
+	    *)
+	      valid_a_lib=no
+	      case $deplibs_check_method in
+		match_pattern*)
+		  set dummy $deplibs_check_method; shift
+		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		    valid_a_lib=yes
+		  fi
+		;;
+		pass_all)
+		  valid_a_lib=yes
+		;;
+	      esac
+	      if test "$valid_a_lib" != yes; then
+		echo
+		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because the file extensions .$libext of this argument makes me believe"
+		echo "*** that it is just a static archive that I should not use here."
+	      else
+		echo
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      fi
+	      ;;
+	    esac
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      newdlprefiles+=" $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      newdlfiles+=" $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
+	fi
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$lib" \
+	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+
+	func_dirname "$lib" "" "."
+	ladir="$func_dirname_result"
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	inherited_linker_flags=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	func_source "$lib"
+
+	# Convert "-framework foo" to "foo.ltframework"
+	if test -n "$inherited_linker_flags"; then
+	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
+	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+	    case " $new_inherited_linker_flags " in
+	      *" $tmp_inherited_linker_flag "*) ;;
+	      *) new_inherited_linker_flags+=" $tmp_inherited_linker_flag";;
+	    esac
+	  done
+	fi
+	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && dlfiles+=" $dlopen"
+	  test -n "$dlpreopen" && dlprefiles+=" $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      func_fatal_error "cannot find name of link library for \`$lib'"
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    convenience+=" $ladir/$objdir/$old_library"
+	    old_convenience+=" $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+	      if $opt_preserve_dup_deps ; then
+		case "$tmp_libs " in
+		*" $deplib "*) specialdeplibs+=" $deplib" ;;
+		esac
+	      fi
+	      tmp_libs+=" $deplib"
+	    done
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    func_fatal_error "\`$lib' is not a convenience library"
+	  fi
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	if test -n "$old_library" &&
+	   { test "$prefer_static_libs" = yes ||
+	     test "$prefer_static_libs,$installed" = "built,no"; }; then
+	  linklib=$old_library
+	else
+	  for l in $old_library $library_names; do
+	    linklib="$l"
+	  done
+	fi
+	if test -z "$linklib"; then
+	  func_fatal_error "cannot find name of link library for \`$lib'"
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    dlprefiles+=" $lib $dependency_libs"
+	  else
+	    newdlfiles+=" $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "passing it literally to the linker, although it might fail"
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	func_basename "$lib"
+	laname="$func_basename_result"
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    func_warning "library \`$lib' was moved."
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$lt_sysroot$libdir"
+	    absdir="$lt_sysroot$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    notinst_path+=" $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    notinst_path+=" $abs_ladir"
+	  fi
+	fi # $installed = yes
+	func_stripname 'lib' '.la' "$laname"
+	name=$func_stripname_result
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir" && test "$linkmode" = prog; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	  fi
+	  case "$host" in
+	    # special handling for platforms with PE-DLLs.
+	    *cygwin* | *mingw* | *cegcc* )
+	      # Linker will automatically link against shared library if both
+	      # static and shared are present.  Therefore, ensure we extract
+	      # symbols from the import library if a shared library is present
+	      # (otherwise, the dlopen module name will be incorrect).  We do
+	      # this by putting the import library name into $newdlprefiles.
+	      # We recover the dlopen module name by 'saving' the la file
+	      # name in a special purpose variable, and (later) extracting the
+	      # dlname from the la file.
+	      if test -n "$dlname"; then
+	        func_tr_sh "$dir/$linklib"
+	        eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
+	        newdlprefiles+=" $dir/$linklib"
+	      else
+	        newdlprefiles+=" $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          dlpreconveniencelibs+=" $dir/$old_library"
+	      fi
+	    ;;
+	    * )
+	      # Prefer using a static library (so that no silly _DYNAMIC symbols
+	      # are required to link).
+	      if test -n "$old_library"; then
+	        newdlprefiles+=" $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          dlpreconveniencelibs+=" $dir/$old_library"
+	      # Otherwise, use the dlname, so that lt_dlopen finds it.
+	      elif test -n "$dlname"; then
+	        newdlprefiles+=" $dir/$dlname"
+	      else
+	        newdlprefiles+=" $dir/$linklib"
+	      fi
+	    ;;
+	  esac
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  newlib_search_path+=" $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) func_stripname '-L' '' "$deplib"
+	         func_resolve_sysroot "$func_stripname_result"
+	         newlib_search_path+=" $func_resolve_sysroot_result"
+		 ;;
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs+=" $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs+=" $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { { test "$prefer_static_libs" = no ||
+	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath:" in
+	      *"$absdir:"*) ;;
+	      *) temp_rpath+="$absdir:" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath+=" $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath+=" $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc*)
+	      # No point in relinking DLLs because paths are not encoded
+	      notinst_deplibs+=" $lib"
+	      need_relink=no
+	    ;;
+	  *)
+	    if test "$installed" = no; then
+	      notinst_deplibs+=" $lib"
+	      need_relink=yes
+	    fi
+	    ;;
+	  esac
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on some
+	  # systems (darwin).  Don't bleat about dlopened modules though!
+	  dlopenmodule=""
+	  for dlpremoduletest in $dlprefiles; do
+	    if test "X$dlpremoduletest" = "X$lib"; then
+	      dlopenmodule="$dlpremoduletest"
+	      break
+	    fi
+	  done
+	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	    echo
+	    if test "$linkmode" = prog; then
+	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $ECHO "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath+=" $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath+=" $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    shift
+	    realname="$1"
+	    shift
+	    libname=`eval "\\$ECHO \"$libname_spec\""`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw* | *cegcc*)
+	        func_arith $current - $age
+		major=$func_arith_result
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    func_basename "$soroot"
+	    soname="$func_basename_result"
+	    func_stripname 'lib' '.dll' "$soname"
+	    newlib=libimp-$func_stripname_result.a
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      func_verbose "generating import library for \`$soname'"
+	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$opt_mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a (non-dlopened) module then we can not
+		    # link against it, someone is ignoring the earlier warnings
+		    if /usr/bin/file -L $add 2> /dev/null |
+			 $GREP ": [^:]* bundle" >/dev/null ; then
+		      if test "X$dlopenmodule" != "X$lib"; then
+			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
+			if test -z "$old_library" ; then
+			  echo
+			  echo "*** And there doesn't seem to be a static archive available"
+			  echo "*** The link will probably fail, sorry"
+			else
+			  add="$dir/$old_library"
+			fi
+		      elif test -n "$old_library"; then
+			add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes &&
+	         test "$hardcode_direct_absolute" = no; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$absdir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      add_dir+=" -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      func_fatal_configuration "unsupported hardcode properties"
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) compile_shlibpath+="$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes &&
+		 test "$hardcode_minus_L" != yes &&
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) finalize_shlibpath+="$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$opt_mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes &&
+	       test "$hardcode_direct_absolute" = no; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) finalize_shlibpath+="$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+		add="$inst_prefix_dir$libdir/$linklib"
+	      else
+		add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    add_dir+=" -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    echo
+	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    echo "*** I have the capability to make that library automatically link in when"
+	    echo "*** you link to this library.  But I can only do this if you have a"
+	    echo "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      echo "*** But as you try to build a module library, libtool will still create "
+	      echo "*** a static module, that should work as long as the dlopening application"
+	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		echo
+		echo "*** However, this would only work if libtool was able to extract symbol"
+		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		echo "*** not find such a program.  So, this module is probably useless."
+		echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) func_stripname '-R' '' "$libdir"
+	           temp_xrpath=$func_stripname_result
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) xrpath+=" $temp_xrpath";;
+		   esac;;
+	      *) temp_deplibs+=" $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  newlib_search_path+=" $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    case $deplib in
+              -L*) func_stripname '-L' '' "$deplib"
+                   func_resolve_sysroot "$func_stripname_result";;
+              *) func_resolve_sysroot "$deplib" ;;
+            esac
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $func_resolve_sysroot_result "*)
+                specialdeplibs+=" $func_resolve_sysroot_result" ;;
+	      esac
+	    fi
+	    tmp_libs+=" $func_resolve_sysroot_result"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      path=
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+	        func_resolve_sysroot "$deplib"
+	        deplib=$func_resolve_sysroot_result
+	        func_dirname "$deplib" "" "."
+		dir=$func_dirname_result
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    func_warning "cannot determine absolute directory name of \`$dir'"
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if $GREP "^installed=no" $deplib > /dev/null; then
+		case $host in
+		*-*-darwin*)
+		  depdepl=
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$absdir/$objdir/$depdepl" ; then
+		      depdepl="$absdir/$objdir/$depdepl"
+		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+		      compiler_flags+=" ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+		      linker_flags+=" -dylib_file ${darwin_install_name}:${depdepl}"
+		      path=
+		    fi
+		  fi
+		  ;;
+		*)
+		  path="-L$absdir/$objdir"
+		  ;;
+		esac
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  test -z "$libdir" && \
+		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  test "$absdir" != "$libdir" && \
+		    func_warning "\`$deplib' seems to be moved"
+
+		  path="-L$absdir"
+		fi
+		;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test "$pass" = link; then
+	if test "$linkmode" = "prog"; then
+	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+	else
+	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	fi
+      fi
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) lib_search_path+=" $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) tmp_libs+=" $deplib" ;;
+	      esac
+	      ;;
+	    *) tmp_libs+=" $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  tmp_libs+=" $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+    fi
+    if test "$linkmode" = prog || test "$linkmode" = lib; then
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+	func_warning "\`-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      objs+="$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	func_stripname 'lib' '.la' "$outputname"
+	name=$func_stripname_result
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	test "$module" = no && \
+	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  func_stripname '' '.la' "$outputname"
+	  name=$func_stripname_result
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  func_stripname '' '.la' "$outputname"
+	  libname=$func_stripname_result
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	else
+	  echo
+	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+	  $ECHO "*** objects $objs is not portable!"
+	  libobjs+=" $objs"
+	fi
+      fi
+
+      test "$dlself" != no && \
+	func_warning "\`-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test "$#" -gt 1 && \
+	func_warning "ignoring multiple \`-rpath's for a libtool library"
+
+      install_libdir="$1"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	test -n "$vinfo" && \
+	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+
+	test -n "$release" && \
+	  func_warning "\`-release' is ignored for convenience libraries"
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	shift
+	IFS="$save_ifs"
+
+	test -n "$7" && \
+	  func_fatal_help "too many parameters to \`-version-info'"
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$1"
+	  number_minor="$2"
+	  number_revision="$3"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  # correct linux to gnu/linux during the next big refactor
+	  darwin|linux|osf|windows|none)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|qnx|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_minor"
+	    lt_irix_increment=no
+	    ;;
+	  *)
+	    func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$1"
+	  revision="$2"
+	  age="$3"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "CURRENT \`$current' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "REVISION \`$revision' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "AGE \`$age' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  func_arith $current + 1
+	  minor_current=$func_arith_result
+	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	irix | nonstopux)
+	  if test "X$lt_irix_increment" = "Xno"; then
+	    func_arith $current - $age
+	  else
+	    func_arith $current - $age + 1
+	  fi
+	  major=$func_arith_result
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    func_arith $revision - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux) # correct to gnu/linux during the next big refactor
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    func_arith $current - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  verstring+=":${current}.0"
+	  ;;
+
+	qnx)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  func_arith $current - $age
+	  major=$func_arith_result
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    func_warning "undefined symbols not allowed in $host shared libraries"
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" "yes"
+      libobjs+=" $symfileobj"
+      test "X$libobjs" = "X " && libobjs=
+
+      if test "$opt_mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$ECHO "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext | *.gcno)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+		 then
+		   continue
+		 fi
+	       fi
+	       removelist+=" $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	test -n "$removelist" && \
+	  func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	oldlibs+=" $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  func_replace_sysroot "$libdir"
+	  temp_xrpath+=" -R$func_replace_sysroot_result"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath+=" $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) dlfiles+=" $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) dlprefiles+=" $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    deplibs+=" System.ltframework"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      deplibs+=" -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $opt_dry_run || $RM conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $opt_dry_run || $RM conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    newdeplibs+=" $i"
+		    i=""
+		    ;;
+		  esac
+		fi
+		if test -n "$i" ; then
+		  libname=`eval "\\$ECHO \"$libname_spec\""`
+		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		  set dummy $deplib_matches; shift
+		  deplib_match=$1
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    newdeplibs+=" $i"
+		  else
+		    droppeddeps=yes
+		    echo
+		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		    echo "*** I have the capability to make that library automatically link in when"
+		    echo "*** you link to this library.  But I can only do this if you have a"
+		    echo "*** shared version of the library, which I believe you do not have"
+		    echo "*** because a test_compile did reveal that the linker did not use it for"
+		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+		;;
+	      *)
+		newdeplibs+=" $i"
+		;;
+	      esac
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		$opt_dry_run || $RM conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      newdeplibs+=" $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval "\\$ECHO \"$libname_spec\""`
+		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		    set dummy $deplib_matches; shift
+		    deplib_match=$1
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      newdeplibs+=" $i"
+		    else
+		      droppeddeps=yes
+		      echo
+		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		      echo "*** I have the capability to make that library automatically link in when"
+		      echo "*** you link to this library.  But I can only do this if you have a"
+		      echo "*** shared version of the library, which you do not appear to have"
+		      echo "*** because a test_compile did reveal that the linker did not use this one"
+		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  echo
+		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+		  echo "*** make it link in!  You will probably need to install it or some"
+		  echo "*** library that it depends on before this library will be fully"
+		  echo "*** functional.  Installing it before continuing would be even better."
+		fi
+		;;
+	      *)
+		newdeplibs+=" $i"
+		;;
+	      esac
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method; shift
+	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs+=" $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		if test -n "$file_magic_glob"; then
+		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
+		else
+		  libnameglob=$libname
+		fi
+		test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  if test "$want_nocaseglob" = yes; then
+		    shopt -s nocaseglob
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		    $nocaseglob
+		  else
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		  fi
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null |
+			 $GREP " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+			 $SED -e 10q |
+			 $EGREP "$file_magic_regex" > /dev/null; then
+			newdeplibs+=" $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      newdeplibs+=" $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method; shift
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs+=" $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
+		       $EGREP "$match_pattern_regex" > /dev/null; then
+		      newdeplibs+=" $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      newdeplibs+=" $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+	    done
+	  fi
+	  case $tmp_deplibs in
+	  *[!\	\ ]*)
+	    echo
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	    ;;
+	  esac
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library with the System framework
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    echo
+	    echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+	    echo "*** a static module, that should work as long as the dlopening"
+	    echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      echo
+	      echo "*** However, this would only work if libtool was able to extract symbol"
+	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      echo "*** not find such a program.  So, this module is probably useless."
+	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    echo "*** The inter-library dependencies that have been dropped here will be"
+	    echo "*** automatically added whenever a program is linked with this library"
+	    echo "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      echo
+	      echo "*** Since this library must not contain undefined symbols,"
+	      echo "*** because either the platform does not support them or"
+	      echo "*** it was explicitly requested with -no-undefined,"
+	      echo "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+	*-*-darwin*)
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs+=" -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs+=" $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs+=" $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	# Remove ${wl} instances when linking with ld.
+	# FIXME: should test the right _cmds variable.
+	case $archive_cmds in
+	  *\$LD\ *) wl= ;;
+        esac
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		func_replace_sysroot "$libdir"
+		libdir=$func_replace_sysroot_result
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    hardcode_libdirs+="$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		dep_rpath+=" $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) perm_rpath+=" $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      rpath+="$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	shift
+	realname="$1"
+	shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  linknames+=" $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	test "X$libobjs" = "X " && libobjs=
+
+	delfiles=
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+	  export_symbols="$output_objdir/$libname.uexp"
+	  delfiles+=" $export_symbols"
+	fi
+
+	orig_export_symbols=
+	case $host_os in
+	cygwin* | mingw* | cegcc*)
+	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+	    # exporting using user supplied symfile
+	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	      # and it's NOT already a .def file. Must figure out
+	      # which of the given symbols are data symbols and tag
+	      # them as such. So, trigger use of export_symbols_cmds.
+	      # export_symbols gets reassigned inside the "prepare
+	      # the list of exported symbols" if statement, so the
+	      # include_expsyms logic still works.
+	      orig_export_symbols="$export_symbols"
+	      export_symbols=
+	      always_export_symbols=yes
+	    fi
+	  fi
+	  ;;
+	esac
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $opt_dry_run || $RM $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd1 in $cmds; do
+	      IFS="$save_ifs"
+	      # Take the normal branch if the nm_file_list_spec branch
+	      # doesn't work or if tool conversion is not needed.
+	      case $nm_file_list_spec~$to_tool_file_cmd in
+		*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
+		  try_normal_branch=yes
+		  eval cmd=\"$cmd1\"
+		  func_len " $cmd"
+		  len=$func_len_result
+		  ;;
+		*)
+		  try_normal_branch=no
+		  ;;
+	      esac
+	      if test "$try_normal_branch" = yes \
+		 && { test "$len" -lt "$max_cmd_len" \
+		      || test "$max_cmd_len" -le -1; }
+	      then
+		func_show_eval "$cmd" 'exit $?'
+		skipped_export=false
+	      elif test -n "$nm_file_list_spec"; then
+		func_basename "$output"
+		output_la=$func_basename_result
+		save_libobjs=$libobjs
+		save_output=$output
+		output=${output_objdir}/${output_la}.nm
+		func_to_tool_file "$output"
+		libobjs=$nm_file_list_spec$func_to_tool_file_result
+		delfiles+=" $output"
+		func_verbose "creating $NM input file list: $output"
+		for obj in $save_libobjs; do
+		  func_to_tool_file "$obj"
+		  $ECHO "$func_to_tool_file_result"
+		done > "$output"
+		eval cmd=\"$cmd1\"
+		func_show_eval "$cmd" 'exit $?'
+		output=$save_output
+		libobjs=$save_libobjs
+		skipped_export=false
+	      else
+		# The command line is too long to execute in one step.
+		func_verbose "using reloadable object file for export list..."
+		skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  tmp_export_symbols="$export_symbols"
+	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	fi
+
+	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	  # The given exports_symbols file has to be filtered, so filter it.
+	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # though. Also, the filter scales superlinearly with the number of
+	  # global variables. join(1) would be nice here, but unfortunately
+	  # isn't a blessed tool.
+	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	  delfiles+=" $export_symbols $output_objdir/$libname.filter"
+	  export_symbols=$output_objdir/$libname.def
+	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+	  case " $convenience " in
+	  *" $test_deplib "*) ;;
+	  *)
+	    tmp_deplibs+=" $test_deplib"
+	    ;;
+	  esac
+	done
+	deplibs="$tmp_deplibs"
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec" &&
+	    test "$compiler_needs_object" = yes &&
+	    test -z "$libobjs"; then
+	    # extract the archives, so we have objects to list.
+	    # TODO: could optimize this to just extract one archive.
+	    whole_archive_flag_spec=
+	  fi
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    generated+=" $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    libobjs+=" $func_extract_archives_result"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	fi
+
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  linker_flags+=" $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$opt_mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    eval test_cmds=\"$archive_expsym_cmds\"
+	    cmds=$archive_expsym_cmds
+	  else
+	    eval test_cmds=\"$archive_cmds\"
+	    cmds=$archive_cmds
+	  fi
+	fi
+
+	if test "X$skipped_export" != "X:" &&
+	   func_len " $test_cmds" &&
+	   len=$func_len_result &&
+	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise
+	  # or, if using GNU ld and skipped_export is not :, use a linker
+	  # script.
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  func_basename "$output"
+	  output_la=$func_basename_result
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  last_robj=
+	  k=1
+
+	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
+	    output=${output_objdir}/${output_la}.lnkscript
+	    func_verbose "creating GNU ld script: $output"
+	    echo 'INPUT (' > $output
+	    for obj in $save_libobjs
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    echo ')' >> $output
+	    delfiles+=" $output"
+	    func_to_tool_file "$output"
+	    output=$func_to_tool_file_result
+	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
+	    output=${output_objdir}/${output_la}.lnk
+	    func_verbose "creating linker input file list: $output"
+	    : > $output
+	    set x $save_libobjs
+	    shift
+	    firstobj=
+	    if test "$compiler_needs_object" = yes; then
+	      firstobj="$1 "
+	      shift
+	    fi
+	    for obj
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    delfiles+=" $output"
+	    func_to_tool_file "$output"
+	    output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
+	  else
+	    if test -n "$save_libobjs"; then
+	      func_verbose "creating reloadable object files..."
+	      output=$output_objdir/$output_la-${k}.$objext
+	      eval test_cmds=\"$reload_cmds\"
+	      func_len " $test_cmds"
+	      len0=$func_len_result
+	      len=$len0
+
+	      # Loop over the list of objects to be linked.
+	      for obj in $save_libobjs
+	      do
+		func_len " $obj"
+		func_arith $len + $func_len_result
+		len=$func_arith_result
+		if test "X$objlist" = X ||
+		   test "$len" -lt "$max_cmd_len"; then
+		  objlist+=" $obj"
+		else
+		  # The command $test_cmds is almost too long, add a
+		  # command to the queue.
+		  if test "$k" -eq 1 ; then
+		    # The first file doesn't have a previous command to add.
+		    reload_objs=$objlist
+		    eval concat_cmds=\"$reload_cmds\"
+		  else
+		    # All subsequent reloadable object files will link in
+		    # the last one created.
+		    reload_objs="$objlist $last_robj"
+		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
+		  fi
+		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  func_arith $k + 1
+		  k=$func_arith_result
+		  output=$output_objdir/$output_la-${k}.$objext
+		  objlist=" $obj"
+		  func_len " $last_robj"
+		  func_arith $len0 + $func_len_result
+		  len=$func_arith_result
+		fi
+	      done
+	      # Handle the remaining objects by creating one last
+	      # reloadable object file.  All subsequent reloadable object
+	      # files will link in the last one created.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      reload_objs="$objlist $last_robj"
+	      eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
+	      if test -n "$last_robj"; then
+	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+	      fi
+	      delfiles+=" $output"
+
+	    else
+	      output=
+	    fi
+
+	    if ${skipped_export-false}; then
+	      func_verbose "generating symbol list for \`$libname.la'"
+	      export_symbols="$output_objdir/$libname.exp"
+	      $opt_dry_run || $RM $export_symbols
+	      libobjs=$output
+	      # Append the command to create the export file.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+	      if test -n "$last_robj"; then
+		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	    fi
+
+	    test -n "$save_libobjs" &&
+	      func_verbose "creating a temporary reloadable object file: $output"
+
+	    # Loop through the commands generated above and execute them.
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $concat_cmds; do
+	      IFS="$save_ifs"
+	      $opt_silent || {
+		  func_quote_for_expand "$cmd"
+		  eval "func_echo $func_quote_for_expand_result"
+	      }
+	      $opt_dry_run || eval "$cmd" || {
+		lt_exit=$?
+
+		# Restore the uninstalled library and exit
+		if test "$opt_mode" = relink; then
+		  ( cd "$output_objdir" && \
+		    $RM "${realname}T" && \
+		    $MV "${realname}U" "$realname" )
+		fi
+
+		exit $lt_exit
+	      }
+	    done
+	    IFS="$save_ifs"
+
+	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+
+          if ${skipped_export-false}; then
+	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	      tmp_export_symbols="$export_symbols"
+	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	    fi
+
+	    if test -n "$orig_export_symbols"; then
+	      # The given exports_symbols file has to be filtered, so filter it.
+	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # though. Also, the filter scales superlinearly with the number of
+	      # global variables. join(1) would be nice here, but unfortunately
+	      # isn't a blessed tool.
+	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	      delfiles+=" $export_symbols $output_objdir/$libname.filter"
+	      export_symbols=$output_objdir/$libname.def
+	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	    fi
+	  fi
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	      cmds=$archive_expsym_cmds
+	    else
+	      cmds=$archive_cmds
+	    fi
+	  fi
+	fi
+
+	if test -n "$delfiles"; then
+	  # Append the command to remove temporary files to $cmds.
+	  eval cmds=\"\$cmds~\$RM $delfiles\"
+	fi
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  generated+=" $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  libobjs+=" $func_extract_archives_result"
+	  test "X$libobjs" = "X " && libobjs=
+	fi
+
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $opt_silent || {
+	    func_quote_for_expand "$cmd"
+	    eval "func_echo $func_quote_for_expand_result"
+	  }
+	  $opt_dry_run || eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test "$opt_mode" = relink; then
+	      ( cd "$output_objdir" && \
+	        $RM "${realname}T" && \
+		$MV "${realname}U" "$realname" )
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$opt_mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      func_show_eval '${RM}r "$gentop"'
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for objects"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+	test -n "$objs$old_deplibs" && \
+	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+
+	libobj=$output
+	func_lo2o "$libobj"
+	obj=$func_lo2o_result
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec and hope we can get by with
+      # turning comma into space..
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	else
+	  gentop="$output_objdir/${obj}x"
+	  generated+=" $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # If we're not building shared, we need to use non_pic_objs
+      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      func_execute_cmds "$reload_cmds" 'exit $?'
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	func_execute_cmds "$reload_cmds" 'exit $?'
+      fi
+
+      if test -n "$gentop"; then
+	func_show_eval '${RM}r "$gentop"'
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) func_stripname '' '.exe' "$output"
+	          output=$func_stripname_result.exe;;
+      esac
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for programs"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for programs"
+
+      test "$preload" = yes \
+        && test "$dlopen_support" = unknown \
+	&& test "$dlopen_self" = unknown \
+	&& test "$dlopen_self_static" = unknown && \
+	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	;;
+      esac
+
+      case $host in
+      *-*-darwin*)
+	# Don't allow lazy linking, it breaks C++ global constructors
+	# But is supposedly fixed on 10.4 or later (yay!).
+	if test "$tagname" = CXX ; then
+	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+	    10.[0123])
+	      compile_command+=" ${wl}-bind_at_load"
+	      finalize_command+=" ${wl}-bind_at_load"
+	    ;;
+	  esac
+	fi
+	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs+=" -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs+=" $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs+=" $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      compile_command+=" $compile_deplibs"
+      finalize_command+=" $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath+=" $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs+="$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath+=" $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) perm_rpath+=" $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
+	  *) dllsearchpath+=":$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) dllsearchpath+=":$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs+="$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath+=" $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_perm_rpath+=" $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+      fi
+
+      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+	func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
+
+      wrappers_required=yes
+      case $host in
+      *cegcc* | *mingw32ce*)
+        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
+      *cygwin* | *mingw* )
+        if test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      *)
+        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      esac
+      if test "$wrappers_required" = no; then
+	# Replace the output file specification.
+	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	exit_status=0
+	func_show_eval "$link_command" 'exit_status=$?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	# Delete the generated files.
+	if test -f "$output_objdir/${outputname}S.${objext}"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	fi
+
+	exit $exit_status
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    rpath+="$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    rpath+="$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$opt_dry_run || $RM $output
+	# Link the executable and exit
+	func_show_eval "$link_command" 'exit $?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	func_warning "this platform does not like uninstalled shared libraries"
+	func_warning "\`$output' will be relinked during installation"
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      func_show_eval "$link_command" 'exit $?'
+
+      if test -n "$postlink_cmds"; then
+	func_to_tool_file "$output_objdir/$outputname"
+	postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	func_execute_cmds "$postlink_cmds" 'exit $?'
+      fi
+
+      # Now create the wrapper script.
+      func_verbose "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    func_quote_for_eval "$var_value"
+	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) func_stripname '' '.exe' "$output"
+	         output=$func_stripname_result ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    func_stripname '' '.exe' "$outputname"
+	    outputname=$func_stripname_result ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    func_dirname_and_basename "$output" "" "."
+	    output_name=$func_basename_result
+	    output_path=$func_dirname_result
+	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
+	    cwrapper="$output_path/$output_name.exe"
+	    $RM $cwrappersource $cwrapper
+	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_cwrapperexe_src > $cwrappersource
+
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
+	    $opt_dry_run || {
+	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+	      $STRIP $cwrapper
+	    }
+
+	    # Now, create the wrapper script for func_source use:
+	    func_ltwrapper_scriptname $cwrapper
+	    $RM $func_ltwrapper_scriptname_result
+	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+	    $opt_dry_run || {
+	      # note: this script will not be executed, so do not chmod.
+	      if test "x$build" = "x$host" ; then
+		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+	      else
+		func_emit_wrapper no > $func_ltwrapper_scriptname_result
+	      fi
+	    }
+	  ;;
+	  * )
+	    $RM $output
+	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_wrapper no > $output
+	    chmod +x $output
+	  ;;
+	esac
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save $symfileobj"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	  if test "$preload" = yes && test -f "$symfileobj"; then
+	    oldobjs+=" $symfileobj"
+	  fi
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	generated+=" $gentop"
+
+	func_extract_archives $gentop $addlibs
+	oldobjs+=" $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+	cmds=$old_archive_from_new_cmds
+      else
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  generated+=" $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  oldobjs+=" $func_extract_archives_result"
+	fi
+
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      func_basename "$obj"
+	      $ECHO "$func_basename_result"
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  echo "copying selected object files to avoid basename conflicts..."
+	  gentop="$output_objdir/${outputname}x"
+	  generated+=" $gentop"
+	  func_mkdir_p "$gentop"
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    func_basename "$obj"
+	    objbase="$func_basename_result"
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		func_arith $counter + 1
+		counter=$func_arith_result
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      oldobjs+=" $gentop/$newobj"
+	      ;;
+	    *) oldobjs+=" $obj" ;;
+	    esac
+	  done
+	fi
+	func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+	tool_oldlib=$func_to_tool_file_result
+	eval cmds=\"$old_archive_cmds\"
+
+	func_len " $cmds"
+	len=$func_len_result
+	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	elif test -n "$archiver_list_spec"; then
+	  func_verbose "using command file archive linking..."
+	  for obj in $oldobjs
+	  do
+	    func_to_tool_file "$obj"
+	    $ECHO "$func_to_tool_file_result"
+	  done > $output_objdir/$libname.libcmd
+	  func_to_tool_file "$output_objdir/$libname.libcmd"
+	  oldobjs=" $archiver_list_spec$func_to_tool_file_result"
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  func_verbose "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  eval test_cmds=\"$old_archive_cmds\"
+	  func_len " $test_cmds"
+	  len0=$func_len_result
+	  len=$len0
+	  for obj in $save_oldobjs
+	  do
+	    func_len " $obj"
+	    func_arith $len + $func_len_result
+	    len=$func_arith_result
+	    objlist+=" $obj"
+	    if test "$len" -lt "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+		RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	      len=$len0
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
+    done
+
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      func_verbose "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  func_quote_for_eval "$var_value"
+	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
+
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		func_basename "$deplib"
+		name="$func_basename_result"
+		func_resolve_sysroot "$deplib"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		newdependency_libs+=" ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      -L*)
+		func_stripname -L '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		newdependency_libs+=" -L$func_replace_sysroot_result"
+		;;
+	      -R*)
+		func_stripname -R '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		newdependency_libs+=" -R$func_replace_sysroot_result"
+		;;
+	      *) newdependency_libs+=" $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+
+	    for lib in $dlfiles; do
+	      case $lib in
+	      *.la)
+	        func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		newdlfiles+=" ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      *) newdlfiles+=" $lib" ;;
+	      esac
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+	      *.la)
+		# Only pass preopened files to the pseudo-archive (for
+		# eventual linking with the app. that links it) if we
+		# didn't already link the preopened objects directly into
+		# the library:
+		func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		newdlprefiles+=" ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      esac
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlfiles+=" $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlprefiles+=" $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $RM $output
+	  # place dlname in correct position for cygwin
+	  # In fact, it would be nice if we could use this code for all target
+	  # systems that can't hard-code library paths into their executables
+	  # and that have no shared library path variable independent of PATH,
+	  # but it turns out we can't easily determine that from inspecting
+	  # libtool variables, so we have to hard-code the OSs to which it
+	  # applies here; at the moment, that means platforms that use the PE
+	  # object format with DLL files.  See the long comment at the top of
+	  # tests/bindir.at for full details.
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+	      # If a -bindir argument was supplied, place the dll there.
+	      if test "x$bindir" != x ;
+	      then
+		func_relative_path "$install_libdir" "$bindir"
+		tdlname=$func_relative_path_result$dlname
+	      else
+		# Otherwise fall back on heuristic.
+		tdlname=../bin/$dlname
+	      fi
+	      ;;
+	  esac
+	  $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $ECHO >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      }
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
+
+{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
+    func_mode_link ${1+"$@"}
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $opt_debug
+    RM="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) RM+=" $arg"; rmforce=yes ;;
+      -*) RM+=" $arg" ;;
+      *) files+=" $arg" ;;
+      esac
+    done
+
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
+
+    rmdirs=
+
+    for file in $files; do
+      func_dirname "$file" "" "."
+      dir="$func_dirname_result"
+      if test "X$dir" = X.; then
+	odir="$objdir"
+      else
+	odir="$dir/$objdir"
+      fi
+      func_basename "$file"
+      name="$func_basename_result"
+      test "$opt_mode" = uninstall && odir="$dir"
+
+      # Remember odir for removal later, being careful to avoid duplicates
+      if test "$opt_mode" = clean; then
+	case " $rmdirs " in
+	  *" $odir "*) ;;
+	  *) rmdirs+=" $odir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+	 { test -h "$file"; } >/dev/null 2>&1 ||
+	 test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if func_lalib_p "$file"; then
+	  func_source $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    rmfiles+=" $odir/$n"
+	  done
+	  test -n "$old_library" && rmfiles+=" $odir/$old_library"
+
+	  case "$opt_mode" in
+	  clean)
+	    case " $library_names " in
+	    *" $dlname "*) ;;
+	    *) test -n "$dlname" && rmfiles+=" $odir/$dlname" ;;
+	    esac
+	    test -n "$libdir" && rmfiles+=" $odir/$name $odir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if func_lalib_p "$file"; then
+
+	  # Read the .lo file
+	  func_source $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" &&
+	     test "$pic_object" != none; then
+	    rmfiles+=" $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" &&
+	     test "$non_pic_object" != none; then
+	    rmfiles+=" $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test "$opt_mode" = clean ; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    func_stripname '' '.exe' "$file"
+	    file=$func_stripname_result
+	    func_stripname '' '.exe' "$name"
+	    noexename=$func_stripname_result
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    rmfiles+=" $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if func_ltwrapper_p "$file"; then
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      relink_command=
+	      func_source $func_ltwrapper_scriptname_result
+	      rmfiles+=" $func_ltwrapper_scriptname_result"
+	    else
+	      relink_command=
+	      func_source $dir/$noexename
+	    fi
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    rmfiles+=" $odir/$name $odir/${name}S.${objext}"
+	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	      rmfiles+=" $odir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name" ; then
+	      rmfiles+=" $odir/lt-${noexename}.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
+    done
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	func_show_eval "rmdir $dir >/dev/null 2>&1"
+      fi
+    done
+
+    exit $exit_status
+}
+
+{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
+    func_mode_uninstall ${1+"$@"}
+
+test -z "$opt_mode" && {
+  help="$generic_help"
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode \`$opt_mode'"
+
+if test -n "$exec_cmd"; then
+  eval exec "$exec_cmd"
+  exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
+# vi:sw=2
+
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD="/usr/bin/ld -m elf_x86_64"
+
+# How to create reloadable object files.
+reload_flag=" -r"
+reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs"
+
+# Commands used to build an old-style archive.
+old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$tool_oldlib"
+
+# A language specific compiler.
+CC="g++"
+
+# Is the compiler the GNU compiler?
+with_gcc=yes
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=" -fno-builtin"
+
+# Additional compiler flags for building library objects.
+pic_flag=" -fPIC -DPIC"
+
+# How to pass a linker flag through the compiler.
+wl="-Wl,"
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag="-static"
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o="yes"
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=no
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=no
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec="\${wl}--export-dynamic"
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive"
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object="no"
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=""
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=""
+
+# Commands used to build a shared archive.
+archive_cmds="\$CC \$pic_flag -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib"
+archive_expsym_cmds="\$CC \$pic_flag -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-retain-symbols-file \$wl\$export_symbols -o \$lib"
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=""
+module_expsym_cmds=""
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld="yes"
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=""
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=""
+
+# Flag to hardcode $libdir into a binary during linking.
+# This must work even if $libdir does not exist
+hardcode_libdir_flag_spec="\${wl}-rpath \${wl}\$libdir"
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=""
+
+# Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=no
+
+# Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting ${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=no
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=no
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=unsupported
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=no
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=no
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=no
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=no
+
+# The commands to list exported symbols.
+export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols"
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*"
+
+# Symbols that must always be exported.
+include_expsyms=""
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=""
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=""
+
+# Specify filename containing input files.
+file_list_spec=""
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=immediate
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs="/usr/lib/gcc/x86_64-linux-gnu/4.6 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /usr/lib/gcc/x86_64-linux-gnu/4.6/../../.."
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects="/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbeginS.o"
+postdep_objects="/usr/lib/gcc/x86_64-linux-gnu/4.6/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o"
+predeps=""
+postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s"
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path="-L/usr/lib/gcc/x86_64-linux-gnu/4.6 -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../.."
+
+# ### END LIBTOOL TAG CONFIG: CXX
diff --git a/lib/ncl-2.1.18/ncl/Makefile.am b/lib/ncl-2.1.18/ncl/Makefile.am
new file mode 100644
index 0000000..64bdd5e
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/Makefile.am
@@ -0,0 +1,51 @@
+pkglib_LTLIBRARIES = libncl.la
+libncl_ladir = $(includedir)/ncl
+libncl_la_LDFLAGS = -release @PACKAGE_VERSION@
+
+
+libncl_la_HEADERS = \
+	ncl.h \
+	nxsallocatematrix.h \
+	nxsassumptionsblock.h \
+	nxsblock.cpp \
+	nxsblock.h \
+	nxscharactersblock.h \
+	nxscdiscretematrix.h \
+	nxscxxdiscretematrix.h \
+	nxsdatablock.h \
+	nxsdefs.h \
+	nxsdiscretedatum.h \
+	nxsdistancedatum.h \
+	nxsdistancesblock.h \
+	nxsexception.h \
+	nxsmultiformat.h \
+	nxspublicblocks.h \
+	nxsreader.h \
+	nxssetreader.h \
+	nxsstring.h \
+	nxstaxablock.h \
+	nxstaxaassociationblock.h \
+	nxstoken.h \
+	nxstreesblock.h \
+	nxsunalignedblock.h \
+	nxsutilcopy.h
+
+libncl_la_SOURCES = \
+	nxsassumptionsblock.cpp \
+	nxsblock.cpp \
+	nxscharactersblock.cpp \
+	nxscxxdiscretematrix.cpp \
+	nxsdatablock.cpp \
+	nxsdistancesblock.cpp \
+	nxsexception.cpp \
+	nxsmultiformat.cpp \
+	nxspublicblocks.cpp \
+	nxsreader.cpp \
+	nxssetreader.cpp \
+	nxsstring.cpp \
+	nxstaxablock.cpp \
+	nxstaxaassociationblock.cpp \
+	nxstoken.cpp \
+	nxstreesblock.cpp \
+	nxsunalignedblock.cpp
+
diff --git a/lib/ncl-2.1.18/ncl/libncl.la b/lib/ncl-2.1.18/ncl/libncl.la
new file mode 100644
index 0000000..044128c
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/libncl.la
@@ -0,0 +1,41 @@
+# libncl.la - a libtool library file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='libncl-2.1.18.so'
+
+# Names of this library.
+library_names='libncl-2.1.18.so libncl-2.1.18.so libncl.so'
+
+# The name of the static archive.
+old_library='libncl.a'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags=''
+
+# Libraries that this one depends upon.
+dependency_libs=''
+
+# Names of additional weak libraries provided by this library
+weak_library_names=''
+
+# Version information for libncl.
+current=0
+age=0
+revision=0
+
+# Is this an already installed library?
+installed=no
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=no
+
+# Files to dlopen/dlpreopen
+dlopen=''
+dlpreopen=''
+
+# Directory that this library needs to be installed in:
+libdir='/usr/local/lib/ncl'
diff --git a/lib/ncl-2.1.18/ncl/ncl.h b/lib/ncl-2.1.18/ncl/ncl.h
new file mode 100644
index 0000000..25a6f1c
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/ncl.h
@@ -0,0 +1,97 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#ifndef NCL_NCL_H
+#define NCL_NCL_H
+
+#if !defined(__DECCXX)
+#	include <cctype>
+#	include <cmath>
+#	include <cstdarg>
+#	include <cstdio>
+#	include <cstdarg>
+#	include <cstdlib>
+#	include <ctime>
+#	include <climits>
+#	include <cfloat>
+#else
+#	include <ctype.h>
+#	include <stdarg.h>
+#	include <math.h>
+#	include <stdarg.h>
+#	include <stdio.h>
+#	include <stdlib.h>
+#	include <time.h>
+#	include <float.h>
+#endif
+
+#include <algorithm>
+#include <fstream>
+#include <iomanip>
+#include <iostream>
+#include <list>
+#include <map>
+#include <set>
+#include <stdexcept>
+#include <string>
+#if defined(__GNUC__)
+#	if __GNUC__ < 3
+#		include <strstream>
+#	else
+#		include <sstream>
+#	endif
+#endif
+#include <vector>
+
+# if ! defined (NCL_AVOID_USING_STD)
+	using namespace std;
+#endif
+
+#if defined( __BORLANDC__ )
+#	include <dos.h>
+#endif
+
+#if defined(__MWERKS__)
+#	define HAVE_PRAGMA_UNUSED
+		// mwerks (and may be other compilers) want return values even if the function throws an exception
+		//
+#	define DEMANDS_UNREACHABLE_RETURN
+
+#endif
+
+#include "ncl/nxsdefs.h"
+#include "ncl/nxsstring.h"
+#include "ncl/nxsexception.h"
+#include "ncl/nxstoken.h"
+#include "ncl/nxsblock.h"
+#include "ncl/nxsreader.h"
+#include "ncl/nxssetreader.h"
+#include "ncl/nxstaxablock.h"
+#include "ncl/nxstreesblock.h"
+#include "ncl/nxsdistancedatum.h"
+#include "ncl/nxsdistancesblock.h"
+#include "ncl/nxsdiscretedatum.h"
+#include "ncl/nxscharactersblock.h"
+#include "ncl/nxsassumptionsblock.h"
+#include "ncl/nxsdatablock.h"
+#include "ncl/nxsunalignedblock.h"
+#include "ncl/nxspublicblocks.h"
+#include "ncl/nxsmultiformat.h"
+
+#endif
diff --git a/lib/ncl-2.1.18/ncl/nxsallocatematrix.h b/lib/ncl-2.1.18/ncl/nxsallocatematrix.h
new file mode 100644
index 0000000..ee07bb9
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsallocatematrix.h
@@ -0,0 +1,253 @@
+//	Copyright (C) 2008 Mark Holder
+//
+//	This file is part of NCL (Nexus Class Library) version 2.1
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+// This code is based on code developed by Mark Holder for the CIPRES project
+
+#if !defined (NXS_ALLOCATE_MATRIX_H)
+# define NXS_ALLOCATE_MATRIX_H
+
+#include "ncl/nxsdefs.h"
+
+template<typename T>
+T *** NewThreeDArray(unsigned f , unsigned s , unsigned t);
+template<typename T>
+T ** NewTwoDArray(unsigned f , unsigned s);
+template<typename T>
+void DeleteThreeDArray(T ***& ptr);
+template<typename T>
+void DeleteTwoDArray(T **& ptr);
+
+/*!
+ Allocates a three dimensional array of doubles as one contiguous block of memory
+ the dimensions are f two dimensional arrays that are s by t.
+
+	The pointer should be freed by a call to DeleteThreeDArray
+
+ the array is set up so that
+ for(i = 0 ; i < f ; i++)
+	for (j = 0 ; j < s ; j++)
+		for (k = 0 ; k < t; k++)
+			array[i][j][k];
+
+ would be the same order of access as:
+
+	T *ptr = **array;
+	for (i = 0 ; i < f*s*t ; i++)
+		*ptr++;
+
+*/
+template<typename T> T *** NewThreeDArray(unsigned f , unsigned s , unsigned t)
+	{
+	NCL_ASSERT(f > 0 && s > 0 && t> 0);
+	const unsigned twoDStride = s*t;
+	T ***ptr;
+	ptr = new T **[f];
+	ptr[0] = new T *[f * s];
+	ptr[0][0] = new T[f * s * t];
+	for (unsigned sIt = 1 ; sIt < s ; sIt++)
+		ptr[0][sIt] = ptr[0][sIt-1] + t ;
+	for (unsigned fIt = 1 ; fIt < f ; fIt ++)
+		{
+		ptr[fIt] = ptr[fIt -1] +  s ;
+		ptr[fIt][0] = ptr[fIt -1][0] + twoDStride;
+		for (unsigned sIt = 1 ; sIt < s ; sIt++)
+			ptr[fIt][sIt] = ptr[fIt][sIt-1] + t ;
+		}
+	return ptr;
+	}
+
+/*!
+ Delete a Three Dimensional Array that has been allocated using NewThreeDArray and sets the pointer to NULL
+*/
+template<typename T> void DeleteThreeDArray	(T *** & ptr)
+	{
+	if (ptr)
+		{
+		if (*ptr)
+			{
+			delete [] **ptr;
+			delete [] * ptr;
+			}
+		delete [] ptr;
+		}
+	ptr = NULL;
+	}
+
+/*!
+ 	Allocates a two dimensional array of doubles as one contiguous block of memory
+ 	the dimensions are f by s.
+
+	The pointer should be freed by a call to DeleteTwoDArray
+
+ 	The array is set up so that:
+
+	for(i = 0 ; i < f ; i++)
+		for (j = 0 ; j < s ; j++)
+			array[i][j];
+
+	would be the same order of access as:
+
+  	T *ptr = **array;
+	for (i = 0 ; i < f*s*t ; i++)
+		*ptr++;
+*/
+template<typename T> T **NewTwoDArray(unsigned f , unsigned s)
+	{
+	NCL_ASSERT(f > 0 && s > 0);
+	T **ptr;
+	ptr = new T *[f];
+	*ptr = new T [f * s];
+	for (unsigned fIt = 1 ; fIt < f ; fIt ++)
+		ptr[fIt] = ptr[fIt -1] +  s ;
+	return ptr;
+	}
+
+/*!
+ Delete a 2 Dimensional Array NewTwoDArray and set the ptr to NULL
+*/
+template<typename T> inline void DeleteTwoDArray	(T ** & ptr)
+	{
+	if (ptr)
+		{
+		delete [] * ptr;
+		delete [] ptr;
+		ptr = NULL;
+		}
+	}
+
+
+template<typename T>
+class ScopedThreeDMatrix
+	{
+	public:
+		T *** ptr;
+
+		/*! returns an alias to the memory, but does not "surrender" the
+			ownership of the pointer to the caller
+		*/
+		T *** GetAlias() const
+			{
+			return ptr;
+			}
+		/*! Creates a new matrix.  See NewThreeDArray() for argument  explanation */
+		ScopedThreeDMatrix(unsigned f = 0, unsigned s = 0, unsigned t = 0)
+			:ptr(NULL)
+			{
+			Initialize(f, s, t);
+			}
+		/*! Frees the old matrix, and creates a new matrix.  See NewThreeDArray() for argument explanation  */
+		void Initialize(unsigned f = 0, unsigned s = 0, unsigned t = 0)
+			{
+			Free();
+			if (f > 0 && s > 0 && t > 0)
+				ptr = NewThreeDArray<T>(f, s, t);
+			}
+		/*! returns an alias to the memory, and "forgets" about the memory.
+			The caller is responsible for assuring that DeleteThreeDArray is
+			called on the pointer.
+		*/
+		T ***Surrender()
+			{
+			T ***temp = ptr;
+			ptr = NULL;
+			return temp;
+			}
+		~ScopedThreeDMatrix()
+			{
+			Free();
+			}
+		/*! Releases the memory. */
+		void Free()
+			{
+			if (ptr != NULL)
+				{
+				DeleteThreeDArray<T>(ptr);
+				ptr = 0L;
+				}
+			}
+	};
+
+
+/*!
+	Simple memory-management class for a 2-D array that is allocated using NewTwoDArray
+
+	Memory is deleted when the instance goes out of scope, unless Surrender is called.
+
+*/
+template<typename T>
+class ScopedTwoDMatrix
+	{
+
+	public:
+		T ** ptr;
+
+		/*! returns an alias to the memory, but does not "surrender" the
+			ownership of the pointer to the caller
+		*/
+		T ** GetAlias() const
+			{
+			return ptr;
+			}
+		/*! Creates a new matrix.  See NewTwoDArray() for argument explanation  */
+		ScopedTwoDMatrix(unsigned f = 0, unsigned s = 0)
+			:ptr(NULL)
+			{
+			Initialize(f, s);
+			}
+		/*! Frees the old matrix, and creates a new matrix.  See NewTwoDArray() for argument explanation  */
+		void Initialize(unsigned f, unsigned s)
+			{
+			Free();
+			if (f > 0 && s > 0)
+				ptr = NewTwoDArray<T>(f, s);
+			}
+		/*! returns an alias to the memory, and "forgets" about the memory.
+			The caller is responsible for assuring that DeleteTwoDArray is
+			called on the pointer.
+		*/
+		T **Surrender()
+			{
+			T** temp = ptr;
+			ptr = NULL;
+			return temp;
+			}
+
+		~ScopedTwoDMatrix()
+			{
+			Free();
+			}
+
+		/*! Releases the memory. */
+		void Free()
+			{
+			if (ptr != NULL)
+				{
+				DeleteTwoDArray<T>(ptr);
+				ptr = 0L;
+				}
+			}
+
+	};
+
+typedef ScopedTwoDMatrix<double> ScopedDblTwoDMatrix;
+typedef ScopedTwoDMatrix<unsigned> ScopedUIntTwoDMatrix;
+
+typedef ScopedThreeDMatrix<double> ScopedDblThreeDMatrix;
+typedef ScopedThreeDMatrix<unsigned> ScopedUIntThreeDMatrix;
+
+#endif
diff --git a/lib/ncl-2.1.18/ncl/nxsassumptionsblock.cpp b/lib/ncl-2.1.18/ncl/nxsassumptionsblock.cpp
new file mode 100644
index 0000000..6a32092
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsassumptionsblock.cpp
@@ -0,0 +1,2807 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+#include <iomanip>
+#include <climits>
+
+#include "ncl/nxsassumptionsblock.h"
+#include "ncl/nxssetreader.h"
+#include "ncl/nxsreader.h"
+using namespace std;
+
+class BogusToIndMapper: public NxsLabelToIndicesMapper
+	{
+	public:
+		BogusToIndMapper()
+			:queried(false)
+			{}
+		virtual ~BogusToIndMapper(){}
+
+		virtual unsigned GetMaxIndex() const
+			{
+			return UINT_MAX;
+			}
+		virtual unsigned GetIndicesForLabel(const std::string &label, NxsUnsignedSet *) const
+			{
+			queried=true;
+			NxsString e;
+			e << "The symbol " << label << " was not recognized";
+			throw NxsException(e);
+			}
+
+		virtual unsigned GetIndexSet(const std::string &, NxsUnsignedSet * ) const
+			{
+			return 0;
+			}
+		virtual bool AddNewIndexSet(const std::string &, const NxsUnsignedSet & )
+			{
+			return false;
+			}
+		virtual bool AddNewPartition(const std::string &, const NxsPartition & )
+			{
+			return false;
+			}
+
+		/// AppendNewLabel is only overloaded in Taxa and State LabelToIndexMappers
+		virtual unsigned AppendNewLabel(std::string &label)
+			{
+			queried=true;
+			NxsString e;
+			e << "The symbol " << label << " was not recognized";
+			throw NxsException(e);
+			}
+
+		std::vector<std::string> GetLabels() const
+			{
+			queried=true;
+			NxsString e;
+			throw NxsException(e);
+			}
+		mutable bool queried;
+	};
+
+
+void NxsTransformationManager::Reset()
+	{
+	standardTypeNames.clear();
+	standardTypeNames.insert("UNORD");
+	standardTypeNames.insert("ORD");
+	standardTypeNames.insert("IRREV");
+	standardTypeNames.insert("IRREV.UP");
+	standardTypeNames.insert("IRREV.DOWN");
+	standardTypeNames.insert("DOLLO");
+	standardTypeNames.insert("DOLLO.UP");
+	standardTypeNames.insert("DOLLO.DOWN");
+	standardTypeNames.insert("STRAT");
+	standardTypeNames.insert("SQUARED"); /* new in Mesquite */
+	standardTypeNames.insert("LINEAR"); /* new in Mesquite */
+	allTypeNames.clear();
+	allTypeNames.insert(standardTypeNames.begin(), standardTypeNames.end());
+
+	userTypeNames.clear();
+	dblUserTypes.clear();
+	intUserTypes.clear();
+	dblWtSets.clear();
+	intWtSets.clear();
+	typeSets.clear();
+	def_wtset.clear();
+	def_typeset.clear();
+	def_type.clear();
+	}
+
+void NxsTransformationManager::WriteUserType(std::ostream &out) const
+	{
+	if (dblUserTypes.empty() && intUserTypes.empty())
+		return;
+	for (std::map<std::string, NxsRealStepMatrix>::const_iterator csIt = dblUserTypes.begin(); csIt != dblUserTypes.end(); ++csIt)
+		{
+		out << "    UserType ";
+		out << NexusToken::EscapeString(csIt->first) << " (Stepmatrix) = ";
+		const NxsRealStepMatrix & p = csIt->second;
+		const std::vector<std::string> & states = p.GetSymbols();
+		const NxsRealStepMatrix::DblMatrix & mat = p.GetMatrix();
+		const unsigned nStates = (const unsigned)states.size();
+		out << nStates;
+		out << "\n    ";
+		for (std::vector<std::string>::const_iterator sIt = states.begin(); sIt != states.end(); ++sIt)
+			out << "   "<< NxsString::GetEscaped(*sIt) ;
+		NxsString n;
+		std::ios::fmtflags prevflags = out.setf(std::ios::showpoint);
+		for (unsigned i = 0; i < nStates; ++i)
+			{
+			out << "\n    ";
+			for (unsigned j = 0; j < nStates; ++j)
+				{
+				const double el = mat.at(i).at(j);
+				if (i == j && el == 0.0)
+					out << "   .";
+				else
+					{
+					n.clear();
+					if (el == DBL_MAX)
+						n += "i";
+					else
+						n += el;
+					out << "   " << NxsString::GetEscaped(n);
+					}
+				}
+			}
+		out.flags(prevflags);
+		out << ";\n";
+		}
+
+	for (std::map<std::string, NxsIntStepMatrix>::const_iterator csIt = intUserTypes.begin(); csIt != intUserTypes.end(); ++csIt)
+		{
+		out << "    UserType ";
+		out << NexusToken::EscapeString(csIt->first) << " (Stepmatrix) = ";
+		const NxsIntStepMatrix & p = csIt->second;
+		const std::vector<std::string> & states = p.GetSymbols();
+		const NxsIntStepMatrix::IntMatrix & mat = p.GetMatrix();
+		const unsigned nStates = (const unsigned)states.size();
+		out << nStates;
+		out << "\n    ";
+		for (std::vector<std::string>::const_iterator sIt = states.begin(); sIt != states.end(); ++sIt)
+			out << "   "<< NxsString::GetEscaped(*sIt) ;
+		NxsString n;
+		for (unsigned i = 0; i < nStates; ++i)
+			{
+			out << "\n    ";
+			for (unsigned j = 0; j < nStates; ++j)
+				{
+				const int el = mat.at(i).at(j);
+				if (i == j && el == 0)
+					out << "   .";
+				else
+					{
+					if (el == INT_MAX)
+						n = "i";
+					else
+						{
+						n.clear();
+						n += el;
+						}
+					out << "   " << NxsString::GetEscaped(n);
+					}
+				}
+			}
+		out << ";\n";
+		}
+	}
+
+void NxsTransformationManager::WriteWtSet(std::ostream &out) const
+	{
+	if (dblWtSets.empty() && intWtSets.empty())
+		return;
+	const char * dtp = (def_wtset.empty() ? NULL : def_wtset.c_str());
+	for (std::map<std::string, ListOfDblWeights>::const_iterator csIt = dblWtSets.begin(); csIt != dblWtSets.end(); ++csIt)
+		{
+		out << "    WtSet ";
+		if (NxsString::case_insensitive_equals(csIt->first.c_str(), dtp))
+			out << "* ";
+		out << NexusToken::EscapeString(csIt->first) << " =";
+		const ListOfDblWeights & p = csIt->second;
+		bool first = true;
+		for (ListOfDblWeights::const_iterator pIt = p.begin(); pIt != p.end(); ++pIt)
+			{
+			const DblWeightToIndexSet & g = *pIt;
+			if (!first)
+				out << ',';
+			out << " \'" << g.first << "' :";
+			NxsSetReader::WriteSetAsNexusValue(g.second, out);
+			first = false;
+			}
+		out << ";\n";
+		}
+	for (std::map<std::string, ListOfIntWeights>::const_iterator csIt = intWtSets.begin(); csIt != intWtSets.end(); ++csIt)
+		{
+		out << "    WtSet ";
+		if (NxsString::case_insensitive_equals(csIt->first.c_str(), dtp))
+			out << "* ";
+		out << NexusToken::EscapeString(csIt->first) << " =";
+		const ListOfIntWeights & p = csIt->second;
+		bool first = true;
+		for (ListOfIntWeights::const_iterator pIt = p.begin(); pIt != p.end(); ++pIt)
+			{
+			const IntWeightToIndexSet & g = *pIt;
+			if (!first)
+				out << ',';
+			out << " \'" << g.first << "' :";
+			NxsSetReader::WriteSetAsNexusValue(g.second, out);
+			first = false;
+			}
+		out << ";\n";
+		}
+	}
+
+
+/*!
+	Returns -1 if `index` is not in `wtset`
+*/
+void NxsTransformationManager::SetDefaultTypeName(const std::string &n)
+	{
+	if (!(n.empty() || IsValidTypeName(n)))
+		{
+		NxsString e(n.c_str());
+		e << " is not the name of a known type (and therefore is not a valid default type)";
+		throw NxsException(e);
+		}
+	def_type = n;
+	}
+
+
+bool NxsTransformationManager::IsEmpty() const
+	{
+	return (userTypeNames.empty()
+			&& dblWtSets.empty()
+			&& intWtSets.empty()
+			&& typeSets.empty()
+			&& (def_type.empty() || !NxsString::case_insensitive_equals(def_type.c_str(), "ORD")));
+	}
+
+/*!
+	Returns -1 if `index` is not in `wtset`
+*/
+double NxsTransformationManager::GetWeightForIndex(const ListOfDblWeights & wtset, unsigned index)
+	{
+	for (ListOfDblWeights::const_iterator wIt = wtset.begin(); wIt != wtset.end(); ++wIt)
+		{
+		if (wIt->second.count(index) > 0)
+			return wIt->first;
+		}
+	return -1.0;
+	}
+
+/*!
+	Returns -1 if `index` is not in `wtset`
+*/
+int NxsTransformationManager::GetWeightForIndex(const ListOfIntWeights & wtset, unsigned index)
+	{
+	for (ListOfIntWeights::const_iterator wIt = wtset.begin(); wIt != wtset.end(); ++wIt)
+		{
+		if (wIt->second.count(index) > 0)
+			return wIt->first;
+		}
+	return -1;
+	}
+
+/*!
+	Raises an NxsNCLAPIException if the `n` is not a type name.
+*/
+bool NxsTransformationManager::IsIntType(const std::string & n) const
+	{
+	std::string capName(n.c_str());
+	NxsString::to_upper(capName);
+	if (standardTypeNames.count(capName) > 0)
+		return true;
+	if (intUserTypes.find(capName) != intUserTypes.end())
+		return true;
+	if (dblUserTypes.find(capName) != dblUserTypes.end())
+		return false;
+	NxsString errormsg = "Type name ";
+	errormsg << n << " not found.";
+	throw NxsNCLAPIException(errormsg);
+	}
+
+
+/*!
+	Returns true if `n` is the name of a known type (standard or user type) -- not case-sensitive.
+*/
+bool NxsTransformationManager::IsValidTypeName(const std::string & n) const
+	{
+	std::string capName(n.c_str());
+	NxsString::to_upper(capName);
+	return (allTypeNames.count(capName) > 0);
+	}
+
+/*!
+	Raises an NxsNCLAPIException if the `n` is not a type name.
+*/
+bool NxsTransformationManager::IsStandardType(const std::string & n) const
+	{
+	std::string capName(n.c_str());
+	NxsString::to_upper(capName);
+	return (standardTypeNames.count(capName) > 0);
+	}
+
+/*! Returns the Stepmatrix for User Type with the name `n`
+
+	Raises an NxsNCLAPIException if the `n` is not a type name or is the name of
+		a builtin type (like "ORDERED")
+*/
+const NxsIntStepMatrix & NxsTransformationManager::GetIntType(const std::string & n) const
+	{
+	std::string capName(n.c_str());
+	NxsString::to_upper(capName);
+	if (IsStandardType(n))
+		throw NxsNCLAPIException("Standard (predefined) types cannot be fetched using GetIntType.");
+
+	std::map<std::string, NxsIntStepMatrix>::const_iterator i = intUserTypes.find(capName);
+	if (i != intUserTypes.end())
+		return i->second;
+	NxsString errormsg = "Type name ";
+	errormsg << n << " not found.";
+	throw NxsNCLAPIException(errormsg);
+	}
+
+/*! Returns the Stepmatrix for User Type with the name `n`
+
+	Raises an NxsNCLAPIException if the `n` is not a type name or is the name of
+		a builtin type (like "ORDERED")
+*/
+const NxsRealStepMatrix & NxsTransformationManager::GetRealType(const std::string & n) const
+	{
+	std::string capName(n.c_str());
+	NxsString::to_upper(capName);
+	std::map<std::string, NxsRealStepMatrix>::const_iterator i = dblUserTypes.find(capName);
+	if (i != dblUserTypes.end())
+		return i->second;
+	NxsString errormsg = "Type name ";
+	errormsg << n << " not found.";
+	throw NxsNCLAPIException(errormsg);
+	}
+
+const NxsIntStepMatrix::IntMatrix NxsTransformationManager::GetOrderedType(unsigned nStates)
+	{
+	NxsIntStepMatrix::IntVec v(nStates, 1);
+	NxsIntStepMatrix::IntMatrix m(nStates, v);
+	for (unsigned i = 0; i < nStates; ++i)
+		m[i][i] = 0;
+	return m;
+	}
+
+const NxsIntStepMatrix::IntMatrix NxsTransformationManager::GetUnorderedType(unsigned nStates)
+	{
+	NxsIntStepMatrix::IntVec v(nStates, 0);
+	NxsIntStepMatrix::IntMatrix m(nStates, v);
+	for (unsigned i = 0; i < nStates; ++i)
+		{
+		for (unsigned j = 0; j < nStates; ++j)
+			{
+			if (i > j)
+				m[i][j] = j - i;
+			else
+				m[i][j] = i - j;
+			}
+		}
+	return m;
+	}
+
+
+/*!
+	Raises an NxsNCLAPIException if the `name` is the name of a "standard" type.
+	Returns true if another user type was replaced.
+*/
+bool NxsTransformationManager::AddIntType(const std::string &name, const NxsIntStepMatrix &s)
+	{
+	std::string capName(name.c_str());
+	NxsString::to_upper(capName);
+	if (standardTypeNames.count(capName) > 0)
+		{
+		NxsString errormsg(name.c_str());
+		errormsg <<  " is a predefined type which cannot be redefined";
+		throw NxsNCLAPIException(errormsg);
+		}
+	bool replacing = intUserTypes.find(capName) != intUserTypes.end();
+	if (!replacing &&  dblUserTypes.find(capName) != dblUserTypes.end())
+		{
+		replacing = true;
+		dblUserTypes.erase(capName);
+		}
+	intUserTypes.insert(pair<std::string, NxsIntStepMatrix>(capName, s));
+	userTypeNames.insert(name);
+	allTypeNames.insert(capName);
+	return replacing;
+	}
+
+/*!
+	Raises an NxsNCLAPIException if the `name` is the name of a "standard" type.
+	Returns true if another user type was replaced.
+*/
+bool NxsTransformationManager::AddRealType(const std::string &name, const NxsRealStepMatrix &s)
+	{
+	std::string capName(name.c_str());
+	NxsString::to_upper(capName);
+	if (standardTypeNames.count(capName) > 0)
+		{
+		NxsString errormsg(name.c_str());
+		errormsg <<  " is a predefined type which cannot be redefined";
+		throw NxsNCLAPIException(errormsg);
+		}
+	bool replacing = dblUserTypes.find(capName) != dblUserTypes.end();
+	if (!replacing &&  intUserTypes.find(capName) != intUserTypes.end())
+		{
+		replacing = true;
+		intUserTypes.erase(capName);
+		}
+	dblUserTypes.insert(pair<std::string, NxsRealStepMatrix>(capName, s));
+	userTypeNames.insert(capName);
+	allTypeNames.insert(capName);
+	return replacing;
+	}
+
+bool NxsTransformationManager::AddIntWeightSet(const std::string &name, const NxsTransformationManager::ListOfIntWeights &ws, bool isDefault)
+	{
+	std::string capName(name.c_str());
+	NxsString::to_upper(capName);
+	bool replacing = intWtSets.find(capName) != intWtSets.end();
+	if (!replacing &&  dblWtSets.find(capName) != dblWtSets.end())
+		{
+		replacing = true;
+		dblWtSets.erase(capName);
+		}
+	intWtSets[capName] = ws;
+	if (isDefault)
+		def_wtset = name;
+	return replacing;
+	}
+
+bool NxsTransformationManager::AddRealWeightSet(const std::string &name, const NxsTransformationManager::ListOfDblWeights &ws, bool isDefault)
+	{
+	std::string capName(name.c_str());
+	NxsString::to_upper(capName);
+	bool replacing = dblWtSets.find(capName) != dblWtSets.end();
+	if (!replacing &&  intWtSets.find(capName) != intWtSets.end())
+		{
+		replacing = true;
+		intWtSets.erase(capName);
+		}
+	dblWtSets[capName] = ws;
+	if (isDefault)
+		{
+		def_wtset = name;
+		}
+	return replacing;
+	}
+
+bool NxsTransformationManager::AddTypeSet(const std::string &name, const NxsPartition &ts, bool isDefault)
+	{
+	std::string capName(name.c_str());
+	NxsString::to_upper(capName);
+	bool replacing = typeSets.find(capName) != typeSets.end();
+	typeSets[capName] = ts;
+	if (isDefault)
+		{
+		def_typeset = name;
+		}
+	return replacing;
+	}
+
+std::set<std::string> NxsTransformationManager::GetWeightSetNames() const
+	{
+	std::set<std::string> s;
+	std::map<std::string, ListOfDblWeights>::const_iterator dws = dblWtSets.begin();
+	for (; dws != dblWtSets.end(); ++dws)
+		s.insert(dws->first);
+	std::map<std::string, ListOfIntWeights>::const_iterator iws = intWtSets.begin();
+	for (; iws != intWtSets.end(); ++iws)
+		s.insert(iws->first);
+	return s;
+	}
+
+std::set<std::string> NxsTransformationManager::GetTypeSetNames() const
+	{
+	std::set<std::string> s;
+	std::map<std::string, ListOfTypeNamesToSets>::const_iterator dws = typeSets.begin();
+	for (; dws != typeSets.end(); ++dws)
+		s.insert(dws->first);
+	return s;
+	}
+
+
+void NxsAssumptionsBlock::AddCharPartition(const std::string & name, const NxsPartition &p)
+	{
+	charPartitions[name] = p;
+	}
+void NxsAssumptionsBlock::AddTaxPartition(const std::string & name, const NxsPartition &p)
+	{
+	taxPartitions[name] = p;
+	}
+
+void NxsAssumptionsBlock::AddTreePartition(const std::string & name, const NxsPartition &p)
+	{
+	treePartitions[name] = p;
+	}
+
+void NxsAssumptionsBlock::AddCodeSet(const std::string & name, const NxsPartition &p, bool asterisked)
+	{
+	codeSets[name] = p;
+	if (asterisked)
+		def_codeSet.assign(name.c_str());
+	}
+
+void NxsAssumptionsBlock::AddCodonPosSet(const std::string & name, const NxsPartition &p, bool asterisked)
+	{
+	codonPosSets[name] = p;
+	if (asterisked)
+		def_codonPosSet.assign(name.c_str());
+	}
+
+
+void NxsAssumptionsBlock::WriteOptions(std::ostream & out) const
+	{
+	const std::string d = transfMgr.GetDefaultTypeName();
+	if ((!d.empty() && !NxsString::case_insensitive_equals(d.c_str(), "ORD"))
+		|| gapsAsNewstate || polyTCountValue != POLY_T_COUNT_UNKNOWN)
+		{
+		out << "    OPTIONS";
+		if (!d.empty())
+			out << " DefType = " << NxsString::GetEscaped(d);
+		if (gapsAsNewstate)
+			out << " GapMode = NewState";
+		if (polyTCountValue == POLY_T_COUNT_MIN)
+			out << " PolyTCount = MinSteps";
+		else if (polyTCountValue == POLY_T_COUNT_MAX)
+			out << " PolyTCount = MaxSteps";
+		out << ";\n";
+		}
+	}
+
+bool NxsAssumptionsBlock::HasAssumptionsBlockCommands() const
+	{
+	return (gapsAsNewstate
+			|| !transfMgr.IsEmpty()
+			|| !exsets.empty()
+			||  polyTCountValue != POLY_T_COUNT_UNKNOWN);
+	}
+bool NxsAssumptionsBlock::HasSetsBlockCommands() const
+	{
+	return (!charsets.empty() || !taxsets.empty() || !treesets.empty()
+			||!charPartitions.empty() || !taxPartitions.empty() || !treePartitions.empty() );
+	}
+bool NxsAssumptionsBlock::HasCodonsBlockCommands() const
+	{
+	return (!codeSets.empty() || !codonPosSets.empty() || !codesMgr.IsEmpty());
+	}
+
+bool NxsAssumptionsBlock::CanReadBlockType(const NxsToken & token)
+	{
+	if (token.Equals("ASSUMPTIONS"))
+		{
+		NCL_BLOCKTYPE_ATTR_NAME = "ASSUMPTIONS";
+		readAs = ASSUMPTIONS_BLOCK_READ;
+		return true;
+		}
+	if (token.Equals("SETS"))
+		{
+		NCL_BLOCKTYPE_ATTR_NAME = "SETS";
+		readAs = SETS_BLOCK_READ;
+		return true;
+		}
+	if (token.Equals("CODONS"))
+		{
+		NCL_BLOCKTYPE_ATTR_NAME = "CODONS";
+		readAs = CODONS_BLOCK_READ;
+		return true;
+		}
+	return token.Equals(GetID());
+	}
+
+
+
+void NxsAssumptionsBlock::WriteAsNexus(std::ostream &out) const
+	{
+	NxsAssumptionsBlock *t = const_cast<NxsAssumptionsBlock *>(this); /*title switching*/
+	const std::string ft = title;
+	t->title.clear();
+	NameOfAssumpBlockAsRead treatAs = this->readAs;
+	if (treatAs == UNREAD_OR_GENERATED_BLOCK)
+		{
+		/*	Precedence order here is reverse the order of writing. This delays
+			skipped blocks to the last among SETS, CODONS, and ASSUMPTIONS blocks.
+		*/
+		if (HasAssumptionsBlockCommands())
+			treatAs = ASSUMPTIONS_BLOCK_READ;
+		else if (HasCodonsBlockCommands())
+			treatAs = CODONS_BLOCK_READ;
+		else if (HasSetsBlockCommands())
+			treatAs = SETS_BLOCK_READ;
+		}
+	try
+		{
+		if (HasSetsBlockCommands())
+			{
+			if (treatAs == SETS_BLOCK_READ && !IsAutoGeneratedTitle())
+				t->title = ft;
+			out << "BEGIN SETS;\n";
+			WriteBasicBlockCommands(out);
+			this->WriteTaxSet(out);
+			this->WriteCharSet(out);
+			this->WriteTreeSet(out);
+			this->WriteTaxPartition(out);
+			this->WriteCharPartition(out);
+			this->WriteTreePartition(out);
+			if (treatAs == SETS_BLOCK_READ)
+				{
+				WriteSkippedCommands(out);
+				t->title.clear();
+				}
+			out << "END;\n";
+			}
+		if (HasCodonsBlockCommands())
+			{
+			if (treatAs == CODONS_BLOCK_READ && !IsAutoGeneratedTitle())
+				t->title = ft;
+			out << "BEGIN CODONS;\n";
+			WriteBasicBlockCommands(out);
+			this->codesMgr.WriteGeneticCode(out);
+			this->WriteCodonPosSet(out);
+			this->WriteCodeSet(out);
+			if (treatAs == CODONS_BLOCK_READ)
+				{
+				WriteSkippedCommands(out);
+				t->title.clear();
+				}
+			out << "END;\n";
+			}
+		if (HasAssumptionsBlockCommands())
+			{
+			if (treatAs == ASSUMPTIONS_BLOCK_READ && !IsAutoGeneratedTitle())
+				t->title = ft;
+			out << "BEGIN ASSUMPTIONS;\n";
+			WriteBasicBlockCommands(out);
+			this->WriteExSet(out);
+			this->transfMgr.WriteUserType(out);
+			this->transfMgr.WriteWtSet(out);
+			this->transfMgr.WriteTypeSet(out);
+			this->WriteOptions(out);
+			if (treatAs == ASSUMPTIONS_BLOCK_READ)
+				WriteSkippedCommands(out);
+			out << "END;\n";
+			}
+		}
+	catch (...)
+		{
+		t->title =  ft;
+		throw;
+		}
+	t->title =  ft;
+	}
+
+
+NxsCharactersBlockAPI * NxsAssumptionsBlock::GetCharBlockPtr(int *status)
+	{
+	if (status)
+		*status = GetCharLinkStatus();
+	return charBlockPtr;
+	}
+NxsTaxaBlockAPI * NxsAssumptionsBlock::GetTaxaBlockPtr(int *status)
+	{
+	if (status)
+		*status = GetTaxaLinkStatus();
+	return taxa;
+	}
+NxsTreesBlockAPI * NxsAssumptionsBlock::GetTreesBlockPtr(int *status)
+	{
+	if (status)
+		*status = GetTreesLinkStatus();
+	return treesBlockPtr;
+	}
+
+NxsAssumptionsBlockAPI	*NxsAssumptionsBlock::CreateNewAssumptionsBlock(NxsToken &token)
+	{
+	NxsAssumptionsBlockAPI * aba = NULL;
+	if (nexusReader)
+		{
+		NxsString n("ASSUMPTIONS");
+		NxsBlock * block = nexusReader->CreateBlockFromFactories(n, token, NULL);
+		aba = static_cast<NxsAssumptionsBlockAPI *>(block);
+		}
+	if (aba == NULL)
+		{
+		NxsAssumptionsBlock *ab =  new NxsAssumptionsBlock(NULL);
+		ab->SetImplementsLinkAPI(this->ImplementsLinkAPI());
+		aba = ab;
+		}
+	aba->SetNexus(nexusReader);
+	passedRefOfOwnedBlock = false;
+	createdSubBlocks.push_back(aba);
+	return aba;
+	}
+
+NxsAssumptionsBlockAPI	*NxsAssumptionsBlock::GetAssumptionsBlockForCharBlock(NxsCharactersBlockAPI *cb, NxsBlockLinkStatus status, NxsToken &token)
+	{
+	int cbstatus;
+	NxsCharactersBlockAPI * thisCB = GetCharBlockPtr(&cbstatus);
+	if (thisCB == NULL)
+		{
+		SetCharBlockPtr(cb, status);
+		return this;
+		}
+	else if (cb == thisCB)
+		{
+		int f = cbstatus & NxsBlock::BLOCK_LINK_UNUSED_MASK;
+		if (f == status)
+			return this;
+		if (!(cbstatus & NxsBlock::BLOCK_LINK_USED))
+			{
+			if (cbstatus == BLOCK_LINK_UNINITIALIZED || cbstatus == BLOCK_LINK_UNKNOWN_STATUS)
+				SetCharLinkStatus(status);
+			}
+		else
+			{
+			/* return the same block for these two link statuses since they are both "safe" */
+			if ((f | status) == BLOCK_LINK_TO_ONLY_CHOICE)
+				charLinkStatus |= BLOCK_LINK_TO_ONLY_CHOICE;
+			}
+		return this;
+		}
+	for (VecAssumpBlockPtr::iterator bIt = createdSubBlocks.begin(); bIt != createdSubBlocks.end(); ++bIt)
+		{
+		NxsAssumptionsBlockAPI	* c = *bIt;
+		if (c && cb == c->GetCharBlockPtr(&cbstatus) && (cbstatus & BLOCK_LINK_UNUSED_MASK) == status)
+			return c;
+		}
+	
+	NxsAssumptionsBlockAPI	*effBlock = CreateNewAssumptionsBlock(token);
+	effBlock->SetCharBlockPtr(cb, status);
+	return effBlock;
+	}
+
+NxsAssumptionsBlockAPI	*NxsAssumptionsBlock::GetAssumptionsBlockForTaxaBlock(NxsTaxaBlockAPI *cb, NxsBlockLinkStatus status, NxsToken &token)
+	{
+	int cbstatus;
+	NxsTaxaBlockAPI * thisCB = GetTaxaBlockPtr(&cbstatus);
+	if (thisCB == NULL)
+		{
+		SetTaxaBlockPtr(cb, status);
+		return this;
+		}
+	else if (cb == GetTaxaBlockPtr(&cbstatus))
+		{
+		int f = cbstatus & NxsBlock::BLOCK_LINK_UNUSED_MASK;
+		if (f == status)
+			return this;
+		if (!(cbstatus & NxsBlock::BLOCK_LINK_USED))
+			{
+			if (cbstatus == BLOCK_LINK_UNINITIALIZED || cbstatus == BLOCK_LINK_UNKNOWN_STATUS)
+				{
+				SetTaxaLinkStatus(status);
+				return this;
+				}
+			}
+		else
+			{
+			/* return the same block for these two link statuses since they are both "safe" */
+			if ((f | status) == (BLOCK_LINK_FROM_LINK_CMD | BLOCK_LINK_TO_ONLY_CHOICE))
+				{
+				taxaLinkStatus |= (BLOCK_LINK_FROM_LINK_CMD | BLOCK_LINK_TO_ONLY_CHOICE);
+				return this;
+				}
+			}
+		}
+	for (VecAssumpBlockPtr::iterator bIt = createdSubBlocks.begin(); bIt != createdSubBlocks.end(); ++bIt)
+		{
+		NxsAssumptionsBlockAPI	* c = *bIt;
+		if (c && cb == c->GetTaxaBlockPtr(&cbstatus) && (cbstatus & BLOCK_LINK_UNUSED_MASK) == status)
+			return c;
+		}
+	NxsAssumptionsBlockAPI	*effBlock = CreateNewAssumptionsBlock(token);
+	effBlock->SetTaxaBlockPtr(cb, status);
+	return effBlock;
+	}
+NxsAssumptionsBlockAPI	*NxsAssumptionsBlock::GetAssumptionsBlockForTreesBlock(NxsTreesBlockAPI *cb, NxsBlockLinkStatus status, NxsToken &token)
+	{
+	int cbstatus;
+	NxsTreesBlockAPI * thisCB = GetTreesBlockPtr(&cbstatus);
+	if (thisCB == NULL)
+		{
+		SetTreesBlockPtr(cb, status);
+		return this;
+		}
+	else if (cb == GetTreesBlockPtr(&cbstatus))
+		{
+		int f = cbstatus & NxsBlock::BLOCK_LINK_UNUSED_MASK;
+		if (f == status)
+			return this;
+		if (!(cbstatus & NxsBlock::BLOCK_LINK_USED))
+			{
+			if (cbstatus == BLOCK_LINK_UNINITIALIZED || cbstatus == BLOCK_LINK_UNKNOWN_STATUS)
+				{
+				SetTreesLinkStatus(status);
+				return this;
+				}
+			}
+		else
+			{
+			/* return the same block for these two link statuses since they are both "safe" */
+			if ((f | status) == (BLOCK_LINK_FROM_LINK_CMD | BLOCK_LINK_TO_ONLY_CHOICE))
+				{
+				treesLinkStatus |= (BLOCK_LINK_FROM_LINK_CMD | BLOCK_LINK_TO_ONLY_CHOICE);
+				return this;
+				}
+			}
+		}
+	for (VecAssumpBlockPtr::iterator bIt = createdSubBlocks.begin(); bIt != createdSubBlocks.end(); ++bIt)
+		{
+		NxsAssumptionsBlockAPI	* c = *bIt;
+		if (c && cb == c->GetTreesBlockPtr(&cbstatus) && (cbstatus & BLOCK_LINK_UNUSED_MASK) == status)
+			return c;
+		}
+	NxsAssumptionsBlockAPI	*effBlock = CreateNewAssumptionsBlock(token);
+	effBlock->SetTreesBlockPtr(cb, status);
+	return effBlock;
+	}
+
+NxsAssumptionsBlockAPI	*NxsAssumptionsBlock::GetAssumptionsBlockForCharTitle(const char *charTitle, NxsToken &token, const char *cmd)
+	{
+	if (!nexusReader)
+		NxsNCLAPIException("No NxsReader when reading Assumptions block.");
+	unsigned ncb = 0;
+	NxsCharactersBlockAPI * cb = nexusReader->GetCharBlockByTitle(charTitle, &ncb);
+	if (charTitle == NULL)
+		{
+		int cbstatus;
+		NxsCharactersBlockAPI * thisCB = GetCharBlockPtr(&cbstatus);
+		int ust = cbstatus & NxsBlock::BLOCK_LINK_UNUSED_MASK;
+		if (thisCB != NULL && ust != BLOCK_LINK_UNINITIALIZED && ust != BLOCK_LINK_UNKNOWN_STATUS)
+			{
+			if (ncb > 1 && !blockwideCharsLinkEstablished)
+				{
+				errormsg = "Multiple CHARACTERS blocks have been encountered, but a ";
+				errormsg += cmd;
+				errormsg += " command was found which does not specify which CHARACTERS block it uses.";
+				errormsg << "The first CHARACTERS block that was used by this " << this->GetID() << " block will be used";
+				if (nexusReader)
+					nexusReader->NexusWarnToken(errormsg, NxsReader::AMBIGUOUS_CONTENT_WARNING, token);
+				errormsg.clear();
+				}
+			return this;
+			}
+		}
+	NxsAssumptionsBlockAPI * effectiveB = NULL;
+	if (cb == NULL)
+		{
+		if (charBlockPtr)
+			{
+			const NxsString	 t=charBlockPtr->GetID();
+			if (t.empty())
+				{
+				if (charTitle == NULL)
+					effectiveB = this;
+				}
+			else
+				{
+				if (NxsString::case_insensitive_equals(charTitle, t.c_str()))
+					effectiveB = this;
+				}
+			}
+		if (effectiveB == NULL)
+			{
+			errormsg.clear();
+			errormsg << "A CHARACTERS (or DATA) block ";
+			if (charTitle)
+				errormsg << "with the title " << NxsString::GetEscaped(charTitle);
+			errormsg << " must precede an " << NCL_BLOCKTYPE_ATTR_NAME << " block with a " <<  cmd <<  " command.";
+			errormsg << "\n(If such a block exists, then this program may not be using an API for the NCL library that supports block linking).";
+			throw NxsException(errormsg, token);
+			}
+		}
+	else if (ncb > 1)
+		{
+		errormsg = "Multiple CHARACTERS blocks have been encountered, but a ";
+		errormsg += cmd;
+		errormsg += " command was found which does not specify which CHARACTERS block it uses.   The most recent CHARACTERS block will be used.";
+		if (nexusReader)
+			nexusReader->NexusWarnToken(errormsg, NxsReader::AMBIGUOUS_CONTENT_WARNING, token);
+		errormsg.clear();
+		effectiveB = GetAssumptionsBlockForCharBlock(cb, NxsBlock::BLOCK_LINK_TO_MOST_RECENT, token);
+		}
+	else
+		{
+		NxsBlockLinkStatus statusRequested = (charTitle == NULL ? NxsBlock::BLOCK_LINK_TO_ONLY_CHOICE : NxsBlock::BLOCK_LINK_FROM_LINK_CMD);
+		effectiveB = GetAssumptionsBlockForCharBlock(cb, statusRequested, token);
+		}
+	effectiveB->FlagCharBlockAsUsed();
+	return effectiveB;
+	}
+
+NxsAssumptionsBlockAPI	*NxsAssumptionsBlock::GetAssumptionsBlockForTaxaTitle(const char *taxTitle, NxsToken &token, const char *cmd)
+	{
+	if (!nexusReader)
+		NxsNCLAPIException("No NxsReader when reading Assumptions block.");
+	if (taxTitle == NULL)
+		{
+		int cbstatus;
+		NxsTaxaBlockAPI * thisCB = GetTaxaBlockPtr(&cbstatus);
+		int ust = cbstatus & NxsBlock::BLOCK_LINK_UNUSED_MASK;
+		if (thisCB != NULL && ust != BLOCK_LINK_UNINITIALIZED && ust != BLOCK_LINK_UNKNOWN_STATUS)
+			return this;
+		}
+	unsigned ncb = 0;
+	NxsTaxaBlockAPI * cb = nexusReader->GetTaxaBlockByTitle(taxTitle, &ncb);
+	NxsAssumptionsBlockAPI *effectiveB = NULL;
+	if (cb == NULL)
+		{
+		if (taxa)
+			{
+			const NxsString	 t=taxa->GetID();
+			if (t.empty())
+				{
+				if (taxTitle == NULL)
+					effectiveB = this;
+				}
+			else
+				{
+				if (NxsString::case_insensitive_equals(taxTitle, t.c_str()))
+					effectiveB = this;
+				}
+			}
+		if (effectiveB == NULL)
+			{
+			errormsg.clear();
+			errormsg <<  "A TAXA block ";
+			if (taxTitle)
+				errormsg << "with the title " << NxsString::GetEscaped(taxTitle);
+			errormsg << " must precede an " << NCL_BLOCKTYPE_ATTR_NAME << " block with a " <<  cmd <<  " command.";
+			errormsg << "\n(If such a block exists, then this program may not be using an API for the NCL library that supports block linking).";
+			throw NxsException(errormsg, token);
+			}
+		}
+	else if (ncb > 1)
+		{
+		errormsg = "Multiple TAXA blocks have been encountered, but a ";
+		errormsg += cmd;
+		errormsg += " command was found which does not specify which TAXA block it uses.  The most recent TAXA block will be used.";
+		nexusReader->NexusWarnToken(errormsg, NxsReader::AMBIGUOUS_CONTENT_WARNING, token);
+		errormsg.clear();
+		effectiveB = GetAssumptionsBlockForTaxaBlock(cb, NxsBlock::BLOCK_LINK_TO_MOST_RECENT, token);
+		}
+	else
+		{
+		NxsBlockLinkStatus statusRequested = (taxTitle == NULL ? NxsBlock::BLOCK_LINK_TO_ONLY_CHOICE : NxsBlock::BLOCK_LINK_FROM_LINK_CMD);
+		effectiveB = GetAssumptionsBlockForTaxaBlock(cb, statusRequested, token);
+		}
+	effectiveB->FlagTaxaBlockAsUsed();
+	return effectiveB;
+	}
+
+NxsAssumptionsBlockAPI	*NxsAssumptionsBlock::GetAssumptionsBlockForTreesTitle(const char *treesTitle, NxsToken &token, const char *cmd)
+	{
+	if (!nexusReader)
+		NxsNCLAPIException("No NxsReader when reading Assumptions block.");
+	if (treesTitle == NULL)
+		{
+		int cbstatus;
+		NxsTreesBlockAPI * thisCB = GetTreesBlockPtr(&cbstatus);
+		int ust = cbstatus & NxsBlock::BLOCK_LINK_UNUSED_MASK;
+		if (thisCB != NULL && ust != BLOCK_LINK_UNINITIALIZED && ust != BLOCK_LINK_UNKNOWN_STATUS)
+			return this;
+		}
+	unsigned ncb = 0;
+	NxsTreesBlockAPI * cb = nexusReader->GetTreesBlockByTitle(treesTitle, &ncb);
+	NxsAssumptionsBlockAPI *effectiveB = NULL;
+	if (cb == NULL)
+		{
+		if (treesBlockPtr)
+			{
+			const NxsString	 t=treesBlockPtr->GetID();
+			if (t.empty())
+				{
+				if (treesTitle == NULL)
+					effectiveB = this;
+				}
+			else
+				{
+				if (NxsString::case_insensitive_equals(treesTitle, t.c_str()))
+					effectiveB = this;
+				}
+			}
+		if (effectiveB == NULL)
+			{
+			errormsg.clear();
+			errormsg <<  "A TREES block";
+			if (treesTitle)
+				errormsg << "with the title " << NxsString::GetEscaped(treesTitle);
+			errormsg << " must precede an " << NCL_BLOCKTYPE_ATTR_NAME << " block with a " <<  cmd <<  " command.";
+			errormsg << "\n(If such a block exists, then this program may not be using an API for the NCL library that supports block linking).";
+			throw NxsException(errormsg, token);
+			}
+		}
+	else if (ncb > 1)
+		{
+		errormsg = "Multiple TREES blocks have been encountered, but a ";
+		errormsg += cmd;
+		errormsg += " command was found which does not specify which TREES block it uses.  The most recent TREES block will be used.";
+		nexusReader->NexusWarnToken(errormsg, NxsReader::AMBIGUOUS_CONTENT_WARNING, token);
+		errormsg.clear();
+		effectiveB = GetAssumptionsBlockForTreesBlock(cb, NxsBlock::BLOCK_LINK_TO_MOST_RECENT, token);
+		}
+	else
+		{
+		NxsBlockLinkStatus statusRequested = (treesTitle == NULL ? NxsBlock::BLOCK_LINK_TO_ONLY_CHOICE : NxsBlock::BLOCK_LINK_FROM_LINK_CMD);
+		effectiveB = GetAssumptionsBlockForTreesBlock(cb, statusRequested, token);
+		}
+	effectiveB->FlagTreesBlockAsUsed();
+	return effectiveB;
+	}
+
+void NxsAssumptionsBlock::SetCharLinkStatus(NxsBlockLinkStatus s)
+	{
+	if (charLinkStatus & NxsBlock::BLOCK_LINK_USED)
+		{
+		throw NxsNCLAPIException("Resetting a used charLinkStatus");
+		}
+	charLinkStatus = s;
+	}
+
+void NxsAssumptionsBlock::SetTaxaLinkStatus(NxsBlockLinkStatus s)
+	{
+	if (taxaLinkStatus & NxsBlock::BLOCK_LINK_USED)
+		{
+		throw NxsNCLAPIException("Resetting a used taxaLinkStatus");
+		}
+	taxaLinkStatus = s;
+	}
+
+void NxsAssumptionsBlock::SetTreesLinkStatus(NxsBlockLinkStatus s)
+	{
+	if (treesLinkStatus & NxsBlock::BLOCK_LINK_USED)
+		{
+		throw NxsNCLAPIException("Resetting a used charLinkStatus");
+		}
+	treesLinkStatus = s;
+	}
+
+void NxsAssumptionsBlock::SetCharBlockPtr(NxsCharactersBlockAPI * c, NxsBlockLinkStatus s)
+	{
+	SetCharLinkStatus(s);
+	charBlockPtr = c;
+	}
+
+void NxsAssumptionsBlock::SetTaxaBlockPtr(NxsTaxaBlockAPI *c, NxsBlockLinkStatus s)
+	{
+	SetTaxaLinkStatus(s);
+	taxa = c;
+	}
+
+void NxsAssumptionsBlock::SetTreesBlockPtr(NxsTreesBlockAPI * c, NxsBlockLinkStatus s)
+	{
+	SetTreesLinkStatus(s);
+	treesBlockPtr = c;
+	}
+
+/*!
+	Sets NCL_BLOCKTYPE_ATTR_NAME = "ASSUMPTIONS", charBlockPtr = NULL, and taxa = t. Assumes taxa is non-NULL.
+*/
+NxsAssumptionsBlock::NxsAssumptionsBlock(
+  NxsTaxaBlockAPI *t)	/* pointer to the taxa block */
+	:taxa(t),
+	charBlockPtr(NULL),
+	treesBlockPtr(NULL),
+	charLinkStatus(NxsBlock::BLOCK_LINK_UNINITIALIZED),
+	taxaLinkStatus(NxsBlock::BLOCK_LINK_UNINITIALIZED),
+	treesLinkStatus(NxsBlock::BLOCK_LINK_UNINITIALIZED),
+	passedRefOfOwnedBlock(false)
+	{
+	taxaLinkStatus = (t == NULL ? NxsBlock::BLOCK_LINK_UNINITIALIZED : NxsBlock::BLOCK_LINK_UNKNOWN_STATUS);
+	NCL_BLOCKTYPE_ATTR_NAME = "ASSUMPTIONS";
+	Reset();
+	}
+
+/*!
+	Nothing needs to be done in the destructor.
+*/
+NxsAssumptionsBlock::~NxsAssumptionsBlock()
+	{
+	}
+
+/*!
+	Makes data member taxa point to 'tb'. Assumes tb is non-NULL.
+	NOTEAPICHANGE: In v2.1 this can throw a NxsNCLAPIException if the Assumptions block has been used, but not reset
+	before the pointer is reassigned.
+*/
+void NxsAssumptionsBlock::ReplaceTaxaBlockPtr(
+  NxsTaxaBlockAPI *tb)	/* pointer to new NxsTaxaBlockAPI object */
+	{
+	NCL_ASSERT(tb != NULL);
+	if (tb != taxa)
+		SetTaxaBlockPtr(tb, NxsBlock::BLOCK_LINK_UNKNOWN_STATUS);
+	}
+
+/*!
+	Returns the number of character sets stored.
+*/
+int NxsAssumptionsBlock::GetNumCharSets() const
+	{
+	return (int)charsets.size();
+	}
+
+/*!
+	Erases 'names' vector, then fills 'names' with the names of all stored character sets.
+*/
+void NxsAssumptionsBlock::GetCharSetNames(
+  NxsStringVector &names) const	/* the vector in which to store the names */ /*v2.1to2.2 3 */
+	{
+	names.erase(names.begin(), names.end());
+	NxsUnsignedSetMap::const_iterator i;
+	for (i = charsets.begin(); i != charsets.end(); i++)
+		names.push_back((*i).first);
+	}
+
+/*!
+	Returns pointer to character set having name 'nm'.
+*/
+const NxsUnsignedSet *NxsAssumptionsBlock::GetCharSet(
+  NxsString n) const /* the name of the character set to return */ /*v2.1to2.2 4 */
+	{
+	NxsUnsignedSetMap::const_iterator it = charsets.find(n); /*v2.1to2.2 5 */
+	if (it == charsets.end())
+		return NULL;
+	return &(it->second);
+	}
+
+/*!
+	Returns the number of character partitions stored.
+*/
+int NxsAssumptionsBlock::GetNumCharPartitions() /*v2.1to2.2 6 */
+	{
+	return (int)charPartitions.size();
+	}
+
+/*!
+	Erases 'names' vector, then fills 'names' with the names of all stored character partitions.
+*/
+void NxsAssumptionsBlock::GetCharPartitionNames(
+	vector<std::string> &names)	/* the vector in which to store the names */ /*v2.1to2.2 6 */
+	{
+	names.erase(names.begin(), names.end());
+	NxsPartitionsByName::const_iterator i;
+	for (i = charPartitions.begin(); i != charPartitions.end(); i++)
+	names.push_back((*i).first);
+	}
+
+/*!
+	Returns pointer to character partition having name 'nm'.
+*/
+const NxsPartition *NxsAssumptionsBlock::GetCharPartition(
+	std::string nm) const /* the name of the character set to return */
+	{
+	NxsPartitionsByName::const_iterator it = charPartitions.find(nm);
+	if (it == charPartitions.end())
+		return NULL;
+	return &(it->second);
+	}
+
+/*!
+	Returns the number of taxon sets stored.
+*/
+int NxsAssumptionsBlock::GetNumTaxSets()/*v2.1to2.2 6 */
+	{
+	return (int)taxsets.size();
+	}
+
+/*!
+	Erases 'names' vector, then fills 'names' with the names of all stored taxon sets.
+*/
+void NxsAssumptionsBlock::GetTaxSetNames(
+  NxsStringVector &names)	/* the vector in which to store the names */ /*v2.1to2.2 7 */
+	{
+	names.erase(names.begin(), names.end());
+	NxsUnsignedSetMap::const_iterator i;
+	for (i = taxsets.begin(); i != taxsets.end(); i++)
+		names.push_back((*i).first);
+	}
+
+/*!
+	Returns reference to taxon set having name 'nm'.
+*/
+NxsUnsignedSet &NxsAssumptionsBlock::GetTaxSet( /*v2.1to2.2 8 */
+  NxsString nm) /* the name of the taxon set to return */ /*v2.1to2.2 9 */
+	{
+	return taxsets[nm]; /*v2.1to2.2 10 */
+	}
+
+
+/*!
+	Returns the number of exclusion sets stored.
+*/
+int NxsAssumptionsBlock::GetNumExSets() /*v2.1to2.2 6 */
+	{
+	return (int)exsets.size();
+	}
+
+/*!
+	Erases names, then fills names with the names of all stored exclusion sets.
+*/
+void NxsAssumptionsBlock::GetExSetNames(
+  NxsStringVector &names)	/* the vector in which to store the names */ /*v2.1to2.2 7 */
+	{
+	names.erase(names.begin(), names.end());
+	NxsUnsignedSetMap::const_iterator i;
+	for (i = exsets.begin(); i != exsets.end(); i++)
+		names.push_back((*i).first);
+	}
+
+/*!
+	Returns reference to exclusion set having name 'nm'.
+*/
+NxsUnsignedSet &NxsAssumptionsBlock::GetExSet( /*v2.1to2.2 8 */
+  NxsString nm) /* the name of the exclusion set to return */ /*v2.1to2.2 9 */
+	{
+	return exsets[nm]; /*v2.1to2.2 11 */
+	}
+
+/*!
+	Returns name of default exclusion set. If returned string has zero length, then no default exclusion set was defined
+	in the data set.
+*/
+NxsString NxsAssumptionsBlock::GetDefExSetName() /*v2.1to2.2 12 */
+	{
+	return def_exset;
+	}
+
+/*!
+	Applies exclusion set having name 'nm' by calling the ApplyExset method of the NxsCharactersBlockAPI or
+	NxsCharactersBlockAPI-derived object stored in the charBlockPtr pointer (which will be whichever block last called the
+	NxsAssumptionsBlock::SetCallback method).
+*/
+void NxsAssumptionsBlock::ApplyExset(
+  NxsString n) /* the name of the exclusion set to apply */ /*v2.1to2.2 4 */
+	{
+	NxsString nm(n.c_str()); // null-op needed for ease of generation of v2.2 from 2.1 code
+	NCL_ASSERT(charBlockPtr != NULL);
+	charBlockPtr->ApplyExset(exsets[nm]);
+	}
+
+NxsAssumptionsBlockAPI * NxsAssumptionsBlock::DealWithPossibleParensInCharDependentCmd(NxsToken &token, const char *cmd, const std::vector<std::string> *unsupported, bool * isVect)
+	{
+	token.GetNextToken();
+	NxsString charblock_name;
+	errormsg.clear();
+	if (isVect)
+		*isVect = false;
+	if (token.Equals("("))
+		{
+		token.GetNextToken();
+		while (!token.Equals(")"))
+			{
+			if (token.Equals("CHARACTERS"))
+				{
+				NxsString t;
+				t << "after \"(Characters\" in a " << cmd << " command";
+				DemandEquals(token, t.c_str());
+				token.GetNextToken();
+				charblock_name = token.GetToken();
+				}
+			else if (token.Equals("VECTOR"))
+				{
+				if (!isVect)
+					GenerateNxsException(token, "VECTOR-style set definitions are not currently supported");
+				else
+					*isVect = true;
+				}
+			else if (token.Equals("NOTOKENS"))
+				GenerateNxsException(token, "NOTOKENS-style set definitions are not currently supported");
+			else if (token.Equals(";"))
+				{
+				NxsString s;
+				s << "; encountered in " << cmd << " command before parentheses were closed";
+				GenerateNxsException(token, s.c_str());
+				}
+			else if (!(token.Equals("STANDARD") || token.Equals("TOKENS")) && nexusReader)
+				{
+				bool found = false;
+				if (unsupported)
+					{
+					for (std::vector<std::string>::const_iterator u = unsupported->begin(); u != unsupported->end(); ++u)
+						{
+						if (token.Equals(u->c_str()))
+							{
+							found = true;
+							break;
+							}
+						}
+					}
+				if (found)
+					{
+					NxsString s;
+					s << "The " << token.GetTokenReference()<< " as a " << cmd << " qualifier is not supported.";
+					GenerateNxsException(token, s.c_str());
+					}
+				else
+					{
+					errormsg  << "Skipping unknown " << cmd << " qualifier: "  << token.GetTokenReference();
+					nexusReader->NexusWarnToken(errormsg, NxsReader::SKIPPING_CONTENT_WARNING, token);
+					errormsg.clear();
+					}
+				}
+			token.GetNextToken();
+			}
+		token.GetNextToken();
+		}
+	const char *cbn = (charblock_name.empty() ? NULL : charblock_name.c_str());
+	NxsString u;
+	u << "in " << cmd << " definition";
+	DemandIsAtEquals(token, u.c_str());
+	NxsAssumptionsBlockAPI * naba = this->GetAssumptionsBlockForCharTitle(cbn, token, cmd);
+	return naba;
+	}
+
+
+/*!
+	Reads and stores information contained in the command TypeSet within an ASSUMPTIONS block.
+*/
+void NxsAssumptionsBlock::HandleTypeSet(
+  NxsToken &token)	/* the token used to read from in */
+	{
+	errormsg.clear();
+	bool asterisked = false;
+	token.GetNextToken();
+	if (token.Equals("*"))
+		{
+		asterisked = true;
+		token.GetNextToken();
+		}
+	NxsString typeset_name = token.GetToken();
+	//typeset_name.ToUpper();
+	NxsAssumptionsBlockAPI * effectiveAssumpBlock = DealWithPossibleParensInCharDependentCmd(token, "TypeSet");
+	token.GetNextToken();
+	NCL_ASSERT(effectiveAssumpBlock);
+	NxsPartition newPartition;
+	NxsCharactersBlockAPI *cbp = effectiveAssumpBlock->GetCharBlockPtr();
+	NCL_ASSERT(cbp);
+	effectiveAssumpBlock->ReadPartitionDef(newPartition, *cbp, typeset_name, "Character", "TypeSet", token, false, false, false);
+	NxsTransformationManager &ctm = cbp->GetNxsTransformationManagerRef();
+	for (NxsPartition::const_iterator groupIt = newPartition.begin(); groupIt != newPartition.end(); ++groupIt)
+		{
+		if (!ctm.IsValidTypeName(groupIt->first))
+			{
+			errormsg << "The group name " << groupIt->first << " found in a TypeSet command does not correspond to a known type";
+			throw NxsException(errormsg, token);
+			}
+		}
+	NxsTransformationManager &tm = effectiveAssumpBlock->GetNxsTransformationManagerRef();
+	ctm.AddTypeSet(typeset_name, newPartition, asterisked);
+	tm.AddTypeSet(typeset_name, newPartition, asterisked);
+	}
+
+
+void NxsAssumptionsBlock::HandleUserType(NxsToken& token)
+	{
+	token.GetNextToken();
+	errormsg.clear();
+	if (token.Equals("*"))
+		{
+		errormsg << "An * is ignored in a UserType command";
+		if (nexusReader)
+			nexusReader->NexusWarnToken(errormsg, NxsReader::SKIPPING_CONTENT_WARNING, token);
+		token.GetNextToken();
+		errormsg.clear();
+		}
+	NxsString user_type_name = token.GetToken();
+	//codonPosSetName.ToUpper();
+	token.GetNextToken();
+	NxsString charblock_name;
+	bool floatMat = false;
+	bool cstreeform = false;
+	if (token.Equals("("))
+		{
+		token.GetNextToken();
+		while (!token.Equals(")"))
+			{
+			if (token.Equals("CHARACTERS"))
+				{
+				NxsString t;
+				t << "after \"(Characters\" in a UserType command";
+				DemandEquals(token, t.c_str());
+				token.GetNextToken();
+				charblock_name = token.GetToken();
+				}
+			else if (token.Equals("CSTREE"))
+				cstreeform = true;
+			else if (token.Equals("NOTOKENS"))
+				GenerateNxsException(token, "NOTOKENS-style UserType are not supported");
+			else if (token.Equals("REALMATRIX"))
+				floatMat = true;
+			else if (token.Equals(";"))
+				{
+				NxsString s;
+				s << "; encountered in UserType command before parentheses were closed";
+				GenerateNxsException(token, s.c_str());
+				}
+			else if (!(token.Equals("STEPMATRIX") || token.Equals("TOKENS")) && nexusReader)
+				{
+				errormsg  << "Skipping unknown UserType qualifier: "  << token.GetTokenReference();
+				nexusReader->NexusWarnToken(errormsg, NxsReader::SKIPPING_CONTENT_WARNING, token);
+				errormsg.clear();
+				}
+			token.GetNextToken();
+			}
+		token.GetNextToken();
+		}
+	if (token.Equals("STEPMATRIX") || token.Equals("REALMATRIX"))
+		{
+		errormsg  << "UserType qualifier "<< token.GetTokenReference() << " should occur in parentheses ("<< token.GetTokenReference() <<") ";
+		nexusReader->NexusWarnToken(errormsg, NxsReader::DEPRECATED_WARNING, token);
+		errormsg.clear();
+		token.GetNextToken();
+		}
+	DemandIsAtEquals(token, "in UserType definition");
+
+	const char *cbn = (charblock_name.empty() ? NULL : charblock_name.c_str());
+	NxsAssumptionsBlockAPI * effectiveAssumpBlock =  this->GetAssumptionsBlockForCharTitle(cbn, token, "UserType");
+	NCL_ASSERT(effectiveAssumpBlock);
+	NxsCharactersBlockAPI *cbp = effectiveAssumpBlock->GetCharBlockPtr();
+	NCL_ASSERT(cbp);
+
+	NxsRealStepMatrix::DblMatrix dm;
+	NxsIntStepMatrix::IntMatrix im;
+	std::vector<std::string> symbolsOrder;
+	const std::vector<const NxsDiscreteDatatypeMapper *> mappers = cbp->GetAllDatatypeMappers();
+
+	if (cstreeform)
+		{
+		bool success = false;
+		ProcessedNxsCommand tokenVec;
+		token.GetNextToken();
+		token.ProcessAsCommand(&tokenVec);
+
+		for (std::vector<const NxsDiscreteDatatypeMapper *>::const_iterator mIt = mappers.begin(); !success && mIt != mappers.end(); ++mIt)
+			{
+			const NxsDiscreteDatatypeMapper * mapper = *mIt;
+			std::string s = mapper->GetSymbolsWithGapChar();
+			symbolsOrder.clear();
+			std::map<std::string, unsigned> symMap;
+			for (unsigned i = 0; i < s.length(); ++i)
+				{
+				std::string sym(1, s[i]);
+				symbolsOrder.push_back(sym);
+				symMap[sym] = i;
+				}
+			std::string newick;
+			NxsFullTreeDescription treeDesc(newick, user_type_name, 0);
+			BogusToIndMapper labelToIndMapper;
+			try
+				{
+				NxsTreesBlock::ProcessTokenVecIntoTree(tokenVec, treeDesc, &labelToIndMapper, symMap, false, nexusReader, mapper->IsRespectCase());
+				success = true;
+				}
+			catch (NxsException &x)
+				{
+				if (!labelToIndMapper.queried)
+					throw x;
+				}
+			NxsSimpleTree cstree(treeDesc, 1, 1.0);
+			if (treeDesc.SomeEdgesHaveLengths() && !treeDesc.EdgeLengthsAreAllIntegers())
+				{
+				floatMat = true;
+				dm = cstree.GetDblPathDistances(false);
+				if (dm.size() < symbolsOrder.size())
+					symbolsOrder.resize(dm.size());
+				else if (dm.size() > symbolsOrder.size())
+					success = false;
+				}
+			else
+				{
+				im = cstree.GetIntPathDistances();
+				if (im.size() < symbolsOrder.size())
+					symbolsOrder.resize(im.size());
+				else if (im.size() > symbolsOrder.size())
+					success = false;
+				}
+
+			}
+		if (!success)
+			{
+			errormsg << "No datatype was found with all of the symbols the UserType CSTree";
+			throw NxsException(errormsg, token);
+			}
+		}
+	else
+		{
+		/* BEGIN Read as Stepmatrix section  */
+		token.GetNextToken();
+		NxsString t = token.GetToken();
+		long longNstates;
+		if (!NxsString::to_long(t.c_str(), &longNstates) || longNstates < 2)
+			{
+			errormsg << "Expecting a number of states after the = in the UserType command (the number of states must be greater than one).  Found " << t;
+			throw NxsException(t, token);
+			}
+		const bool respectCase = cbp->IsRespectCase();
+		unsigned nStates = (unsigned) longNstates;
+		NxsRealStepMatrix::DblVec dv(nStates, DBL_MAX);
+		NxsIntStepMatrix::IntVec iv(nStates, INT_MAX);
+		dm.assign(nStates, dv);
+		im.assign(nStates, iv);
+		std::set<char> symbolsSet;
+		for (unsigned i = 0; i < nStates;)
+			{
+			token.GetNextToken();
+			if (token.Equals(";"))
+				{
+				errormsg << "; prematurely terminated the state declaration portion of a UserType stepmatrix.";
+				throw NxsException(t, token);
+				}
+			NxsString tokStr = token.GetToken();
+			if (!respectCase)
+				tokStr.ToUpper();
+			for (NxsString::const_iterator cIt = tokStr.begin(); cIt != tokStr.end(); ++cIt, ++i)
+				{
+				char s = *cIt;
+				if (symbolsSet.count(s) > 0)
+					{
+					errormsg << "State names cannot be repeated in a UserType stepmatrix.  " << s << " was encountered more than once.";
+					throw NxsException(t, token);
+					}
+				bool found = false;
+				for (std::vector<const NxsDiscreteDatatypeMapper *>::const_iterator mIt = mappers.begin(); mIt != mappers.end(); ++mIt)
+					{
+					const NxsDiscreteDatatypeMapper * mapper = *mIt;
+					if (mapper->PositionInSymbolsOrGaps(s) != NXS_INVALID_STATE_CODE)
+						{
+						found = true;
+						break;
+						}
+					}
+				if (!found)
+					{
+					errormsg << "Unrecognized state " << s << "in  UserType stepmatrix.";
+					throw NxsException(t, token);
+					}
+				symbolsSet.insert(s);
+				symbolsOrder.push_back(std::string(1,s));
+				}
+			}
+
+		double currDblWt;
+		long currLongWt;
+
+		for (unsigned i = 0; i < nStates; ++i)
+			{
+			for (unsigned j = 0; j < nStates; ++j)
+				{
+				token.SetLabileFlagBit(NxsToken::hyphenNotPunctuation); // this allows us to deal with sci. not. in weights.
+				token.GetNextToken();
+				NxsString s = token.GetToken();
+				if (i == j && (token.Equals(".") || token.Equals("-")))
+					{
+					im[i][i] = 0;
+					dm[i][i] = 0.0;
+					}
+				else
+					{
+					bool v = NxsString::to_double(s.c_str(), &currDblWt);
+					if (!v)
+						{
+						if (!token.Equals("I") && !token.Equals("INF"))
+							{
+							errormsg << "Expecting a number or i (for infinity) as an element of the UserType stepmatrix. Found " << s;
+							throw NxsException(errormsg, token);
+							}
+						}
+					else
+						{
+						dm[i][j] = currDblWt;
+						if (!floatMat)
+							{
+							floatMat = !NxsString::to_long(s.c_str(), &currLongWt);
+							if (!floatMat)
+								im[i][j] = (int)currLongWt;
+							}
+						}
+					}
+				}
+			}
+		/* END Read as Stepmatrix section  */
+		token.GetNextToken();
+		if (!token.Equals(";"))
+			{
+			errormsg << "Expecting ; at the end of the UserType command. Found "  << token.GetTokenReference();
+			throw NxsException(t, token);
+			}
+		}
+
+	NxsTransformationManager &ctm = cbp->GetNxsTransformationManagerRef();
+	NxsTransformationManager &tm = effectiveAssumpBlock->GetNxsTransformationManagerRef();
+	if (floatMat)
+		{
+		const NxsRealStepMatrix nrsm(symbolsOrder, dm);
+		ctm.AddRealType(user_type_name, nrsm);
+		tm.AddRealType(user_type_name, nrsm);
+		}
+	else
+		{
+		const NxsIntStepMatrix nism(symbolsOrder, im);
+		ctm.AddIntType(user_type_name, nism);
+		tm.AddIntType(user_type_name, nism);
+		}
+	}
+
+
+NxsGeneticCodesManager::NxsGeneticCodesManager()
+	{
+	standardCodeNames.insert(std::string("UNIVERSAL"));
+	standardCodeNames.insert(std::string("UNIVERSAL.EXT"));
+	standardCodeNames.insert(std::string("MTDNA.DROS"));
+	standardCodeNames.insert(std::string("MTDNA.DROS.EXT"));
+	standardCodeNames.insert(std::string("MTDNA.MAM"));
+	standardCodeNames.insert(std::string("MTDNA.MAM.EXT"));
+	standardCodeNames.insert(std::string("MTDNA.YEAST"));
+	}
+
+bool NxsGeneticCodesManager::IsValidCodeName(const std::string &n) const
+	{
+	std::string capName(n.c_str());
+	NxsString::to_upper(capName);
+	return (standardCodeNames.count(capName) > 0) || (userDefinedCodeNames.count(capName) > 0);
+	}
+/*!
+	Reads and stores information contained in the command TypeSet within an ASSUMPTIONS block.
+*/
+void NxsAssumptionsBlock::HandleCodeSet(
+  NxsToken &token)	/* the token used to read from in */
+	{
+	bool asterisked = false;
+	token.GetNextToken();
+	if (token.Equals("*"))
+		{
+		asterisked = true;
+		token.GetNextToken();
+		}
+	std::vector<std::string> unsupported;
+	unsupported.push_back(std::string("TAXA"));
+	unsupported.push_back(std::string("UNALIGNED"));
+	NxsString codeset_name = token.GetToken();
+	//codeset_name.ToUpper();
+	NxsAssumptionsBlockAPI * effectiveAssumpBlock = DealWithPossibleParensInCharDependentCmd(token, "CodeSet", &unsupported);
+	token.GetNextToken();
+	NxsPartition newPartition;
+	NxsCharactersBlockAPI *cbp = effectiveAssumpBlock->GetCharBlockPtr();
+	NCL_ASSERT(cbp);
+	effectiveAssumpBlock->ReadPartitionDef(newPartition, *cbp, codeset_name, "Character", "CodeSet", token, false, false, false);
+	NxsGeneticCodesManager &gcm = effectiveAssumpBlock->GetNxsGeneticCodesManagerRef();
+	for (NxsPartition::const_iterator groupIt = newPartition.begin(); groupIt != newPartition.end(); ++groupIt)
+		{
+		const std::string & s = groupIt->first;
+		if (!gcm.IsValidCodeName(s))
+			{
+			errormsg << "The Genetic code name " << groupIt->first << " found in a CodeSet command does not correspond to a known code";
+			throw NxsException(errormsg, token);
+			}
+		}
+	effectiveAssumpBlock->AddCodeSet(codeset_name, newPartition, asterisked);
+	}
+
+/*!
+	Reads and stores information contained in the command TypeSet within an ASSUMPTIONS block.
+*/
+void NxsAssumptionsBlock::HandleCodonPosSet(
+  NxsToken &token)	/* the token used to read from in */
+	{
+	bool asterisked = false;
+	token.GetNextToken();
+	if (token.Equals("*"))
+		{
+		asterisked = true;
+		token.GetNextToken();
+		}
+	NxsString codonPosSetName = token.GetToken();
+	//codonPosSetName.ToUpper();
+	NxsAssumptionsBlockAPI * effectiveAssumpBlock = DealWithPossibleParensInCharDependentCmd(token, "CodonPosSet", NULL);
+	token.GetNextToken();
+	NxsPartition newPartition;
+	NxsCharactersBlockAPI *cbp = effectiveAssumpBlock->GetCharBlockPtr();
+	NCL_ASSERT(cbp);
+	effectiveAssumpBlock->ReadPartitionDef(newPartition, *cbp, codonPosSetName, "Character", "CodonPosSet", token, false, false, false);
+	for (NxsPartition::const_iterator groupIt = newPartition.begin(); groupIt != newPartition.end(); ++groupIt)
+		{
+		const std::string & s = groupIt->first;
+		bool legal = false;
+		if (s.length() == 1)
+			{
+			const char c = s[0];
+			if (c == 'n' || c == 'N' || c == '1' || c == '2' || c == '3' || c == '?')
+				legal = true;
+			}
+		if (!legal)
+			{
+			errormsg << "The Codon Position category name " << groupIt->first << " found in a CodonPosSet command is not legal.  \"N\", \"1\", \"2\", or \"3\" were expected.";
+			throw NxsException(errormsg, token);
+			}
+		}
+	effectiveAssumpBlock->AddCodonPosSet(codonPosSetName, newPartition, asterisked);
+	cbp->AddNewCodonPosPartition(codonPosSetName, newPartition, asterisked);
+	}
+
+class NxsSetVectorItemValidator
+	{
+	public:
+		virtual ~NxsSetVectorItemValidator(){};
+		virtual std::string convert(NxsToken &) = 0;
+	};
+
+class WtSetVectorItemValidator: public NxsSetVectorItemValidator
+	{
+	public:
+		virtual ~WtSetVectorItemValidator(){};
+		virtual std::string convert(NxsToken & token)
+			{
+			NxsString s = token.GetToken();
+			const char * c = s.c_str();
+			long currLongWt;
+			double currDblWt;
+			if (NxsString::to_long(c, &currLongWt) || NxsString::to_double(s.c_str(), &currDblWt))
+				return std::string(c);
+			NxsString errormsg;
+			errormsg << "Expecting a number as a character weight.  Found \"" << c << "\" instead.";
+			throw NxsException(errormsg, token);
+			}
+
+	};
+
+/*!
+	Reads and stores information contained in the command TypeSet within an ASSUMPTIONS block.
+*/
+void NxsAssumptionsBlock::HandleWeightSet(
+  NxsToken &token)	/* the token used to read from in */
+	{
+	bool asterisked = false;
+	token.GetNextToken();
+	if (token.Equals("*"))
+		{
+		asterisked = true;
+		token.GetNextToken();
+		}
+	NxsString wtset_name = token.GetToken();
+	//wtset_name.ToUpper();
+	bool isVect;
+	NxsAssumptionsBlockAPI * effectiveAssumpBlock = DealWithPossibleParensInCharDependentCmd(token, "WtSet", NULL, &isVect);
+	token.SetLabileFlagBit(NxsToken::hyphenNotPunctuation); // this allows us to deal with sci. not. in weights.
+	token.GetNextToken();
+	NxsPartition newPartition;
+	NxsCharactersBlockAPI *cbp = effectiveAssumpBlock->GetCharBlockPtr();
+	NCL_ASSERT(cbp);
+	if (isVect)
+		{
+		WtSetVectorItemValidator validator;
+		effectiveAssumpBlock->ReadVectorPartitionDef(newPartition, *cbp, wtset_name, "Character", "WtSet", token, false, true, validator);
+		}
+	else
+		effectiveAssumpBlock->ReadPartitionDef(newPartition, *cbp, wtset_name, "Character", "WtSet", token, false, false, false);
+	bool floatWts = false;
+	long currLongWt;
+	double currDblWt;
+	NxsTransformationManager &ctm = cbp->GetNxsTransformationManagerRef();
+	NxsTransformationManager::ListOfIntWeights liw;
+	NxsTransformationManager::ListOfDblWeights diw;
+	for (NxsPartition::const_iterator groupIt = newPartition.begin(); groupIt != newPartition.end(); ++groupIt)
+		{
+		const std::string & s = groupIt->first;
+		if (!floatWts)
+			{
+			floatWts = !NxsString::to_long(s.c_str(), &currLongWt);
+			if (!floatWts)
+				liw.push_back(NxsTransformationManager::IntWeightToIndexSet((int)currLongWt, groupIt->second));
+			}
+		bool v = NxsString::to_double(s.c_str(), &currDblWt);
+		if (!v)
+			{
+			errormsg << "Invalid weight " << groupIt->first << " found in a WtSet command.";
+			throw NxsException(errormsg, token);
+			}
+		diw.push_back(NxsTransformationManager::DblWeightToIndexSet(currDblWt, groupIt->second));
+		}
+	NxsTransformationManager &tm = effectiveAssumpBlock->GetNxsTransformationManagerRef();
+	if (floatWts)
+		{
+		ctm.AddRealWeightSet(wtset_name, diw, asterisked);
+		tm.AddRealWeightSet(wtset_name, diw, asterisked);
+		}
+	else
+		{
+		ctm.AddIntWeightSet(wtset_name, liw, asterisked);
+		tm.AddIntWeightSet(wtset_name, liw, asterisked);
+		}
+	}
+
+
+/*!
+	Reads and stores information contained in the command CharPartition within an ASSUMPTIONS block.
+*/
+void NxsAssumptionsBlock::HandleCharPartition(
+  NxsToken &token)	/* the token used to read from in */
+	{
+	bool asterisked = false;
+	token.GetNextToken();
+	if (token.Equals("*"))
+		{
+		asterisked = true;
+		token.GetNextToken();
+		}
+	NxsString charpart_name = token.GetToken();
+	//charpart_name.ToUpper();
+	NxsAssumptionsBlockAPI * effectiveAssumpBlock = DealWithPossibleParensInCharDependentCmd(token, "CharPartition");
+	token.GetNextToken();
+
+	NxsPartition newPartition;
+	NxsCharactersBlockAPI *cbp = effectiveAssumpBlock->GetCharBlockPtr();
+	NCL_ASSERT(cbp);
+	effectiveAssumpBlock->ReadPartitionDef(newPartition, *cbp, charpart_name, "Character", "CharPartition", token, asterisked, false, true);
+	effectiveAssumpBlock->AddCharPartition(charpart_name, newPartition);
+	}
+
+/*!
+	Reads and stores information contained in the command CHARSET within an ASSUMPTIONS block.
+*/
+void NxsAssumptionsBlock::HandleCharSet(
+  NxsToken &token)	/* the token used to read from in */
+	{
+	bool asterisked = false;
+	token.GetNextToken();
+	if (token.Equals("*"))
+		{
+		asterisked = true;
+		token.GetNextToken();
+		}
+	NxsString charset_name = token.GetToken();
+	//charset_name.ToUpper();
+	NxsAssumptionsBlockAPI * effectiveAssumpBlock = DealWithPossibleParensInCharDependentCmd(token, "CharSet");
+	token.GetNextToken();
+	effectiveAssumpBlock->ReadCharsetDef(charset_name, token, asterisked);
+	}
+
+/*!
+	Called after verifying that the correct Char block pointer is set.
+*/
+void NxsAssumptionsBlock::ReadCharsetDef(NxsString charset_name, NxsToken &token, bool asterisked)
+	{
+	NCL_ASSERT(charBlockPtr != NULL);
+	NxsCharactersBlockAPI &charBlock = *charBlockPtr;
+	NxsUnsignedSet s;
+	NxsSetReader::ReadSetDefinition(token, charBlock, "Character", "CharSet", &s);
+	charsets[charset_name] = s;
+	if (asterisked && nexusReader != NULL)
+		{
+		nexusReader->NexusWarnToken("An * is ignored in a CHARSET command", NxsReader::SKIPPING_CONTENT_WARNING, token);
+		errormsg.clear();
+		}
+	if (charBlock.AddNewIndexSet(charset_name, s) && nexusReader)
+		{
+		errormsg = "A CHARSET with the name ";
+		errormsg += charset_name;
+		errormsg += " has already been encountered.    The later definition will preempt the earlier definition(s).";
+		nexusReader->NexusWarnToken(errormsg, NxsReader::OVERWRITING_CONTENT_WARNING, token);
+		errormsg.clear();
+		}
+	}
+
+
+/*!
+	Reads and stores information contained in the command CHARSET within an ASSUMPTIONS block.
+*/
+void NxsAssumptionsBlock::HandleExSet(
+  NxsToken &token)	/* the token used to read from in */
+	{
+
+	bool asterisked = false;
+	token.GetNextToken();
+	if (token.Equals("*"))
+		{
+		asterisked = true;
+		token.GetNextToken();
+		}
+	NxsString exset_name = token.GetToken();
+	//exset_name.ToUpper();
+	NxsAssumptionsBlockAPI * effectiveAssumpBlock = DealWithPossibleParensInCharDependentCmd(token, "ExSet");
+	token.GetNextToken();
+	effectiveAssumpBlock->ReadExsetDef(exset_name, token, asterisked);
+	}
+
+/*!
+	Called after verifying that the correct Char block pointer is set.
+*/
+void NxsAssumptionsBlock::ReadExsetDef(NxsString charset_name, NxsToken &token, bool asterisked)
+	{
+	NCL_ASSERT(charBlockPtr != NULL);
+	NxsCharactersBlockAPI &charBlock = *charBlockPtr;
+	NxsUnsignedSet s;
+	NxsSetReader::ReadSetDefinition(token, charBlock, "Character", "ExSet", &s);
+	exsets[charset_name] = s;
+	if (charBlock.AddNewExSet(charset_name, s) && nexusReader)
+		{
+		errormsg = "A ExSet with the name ";
+		errormsg += charset_name;
+		errormsg += " has already been encountered.    The later definition will preempt the earlier definition(s).";
+		nexusReader->NexusWarnToken(errormsg, NxsReader::OVERWRITING_CONTENT_WARNING, token);
+		errormsg.clear();
+		}
+	if (asterisked)
+		{
+		def_exset = charset_name;
+		ApplyExset(charset_name);
+		}
+	}
+
+
+/*!
+	Reads and stores information contained in the command TaxPartition within an ASSUMPTIONS block.
+*/
+void NxsAssumptionsBlock::HandleTaxPartition(
+  NxsToken &token)	/* the token used to read from in */
+	{
+	bool asterisked = false;
+	token.GetNextToken();
+	if (token.Equals("*"))
+		{
+		asterisked = true;
+		token.GetNextToken();
+		}
+	NxsString taxpart_name = token.GetToken();
+	//taxpart_name.ToUpper();
+
+	NxsAssumptionsBlockAPI *effectiveAssumpBlock = NULL;
+	token.GetNextToken();
+	NxsString taxblock_name;
+
+	if (token.Equals("("))
+		{
+		token.GetNextToken();
+		while (!token.Equals(")"))
+			{
+			if (token.Equals("TAXA"))
+				{
+				DemandEquals(token, "after \"(Taxa\" in a TaxPartition command");
+				token.GetNextToken();
+				taxblock_name = token.GetToken();
+				}
+			else if (token.Equals("VECTOR"))
+				GenerateNxsException(token, "VECTOR-style set definitions are not currently supported");
+			else if (token.Equals("NOTOKENS"))
+				GenerateNxsException(token, "NOTOKENS-style set definitions are not currently supported");
+			else if (token.Equals(";"))
+				GenerateNxsException(token, "; encountered in TaxPartition command before parentheses were closed");
+			else if (!(token.Equals("STANDARD") || token.Equals("TOKENS")) && nexusReader)
+				{
+				errormsg = "Skipping unknown TaxPartition qualifier: ";
+				errormsg << token.GetTokenReference();
+				nexusReader->NexusWarnToken(errormsg, NxsReader::SKIPPING_CONTENT_WARNING, token);
+				errormsg.clear();
+				}
+			token.GetNextToken();
+			}
+		token.GetNextToken();
+		}
+	const char *cbn = (taxblock_name.empty() ? NULL : taxblock_name.c_str());
+	effectiveAssumpBlock = this->GetAssumptionsBlockForTaxaTitle(cbn, token, "TaxPartition");
+	DemandIsAtEquals(token, "in TaxPartition definition");
+	token.GetNextToken();
+	NxsPartition newPartition;
+	NCL_ASSERT(taxa);
+	effectiveAssumpBlock->ReadPartitionDef(newPartition, *taxa, taxpart_name, "Taxa", "TaxPartition", token, asterisked, false, true);
+	effectiveAssumpBlock->AddTaxPartition(taxpart_name, newPartition);
+	}
+/*!
+	Reads and stores information contained in the command TreePartition within an ASSUMPTIONS block.
+*/
+void NxsAssumptionsBlock::HandleTreePartition(
+  NxsToken &token)	/* the token used to read from in */
+	{
+	bool asterisked = false;
+	token.GetNextToken();
+	if (token.Equals("*"))
+		{
+		asterisked = true;
+		token.GetNextToken();
+		}
+	NxsString treepart_name = token.GetToken();
+	//treepart_name.ToUpper();
+	NxsAssumptionsBlockAPI *effectiveAssumpBlock = NULL;
+	token.GetNextToken();
+	NxsString treeblock_name;
+
+	if (token.Equals("("))
+		{
+		token.GetNextToken();
+		while (!token.Equals(")"))
+			{
+			if (token.Equals("TREES"))
+				{
+				DemandEquals(token, "after \"(Trees\" in a TreePartition command");
+				token.GetNextToken();
+				treeblock_name = token.GetToken();
+				}
+			else if (token.Equals("VECTOR"))
+				GenerateNxsException(token, "VECTOR-style set definitions are not currently supported");
+			else if (token.Equals("NOTOKENS"))
+				GenerateNxsException(token, "NOTOKENS-style set definitions are not currently supported");
+			else if (token.Equals(";"))
+				GenerateNxsException(token, "; encountered in TreePartition command before parentheses were closed");
+			else if (!(token.Equals("STANDARD") || token.Equals("TOKENS")) && nexusReader)
+				{
+				errormsg = "Skipping unknown TreePartition qualifier: ";
+				errormsg << token.GetTokenReference();
+				nexusReader->NexusWarnToken(errormsg, NxsReader::SKIPPING_CONTENT_WARNING, token);
+				errormsg.clear();
+				}
+			token.GetNextToken();
+			}
+		token.GetNextToken();
+		}
+	const char *cbn = (treeblock_name.empty() ? NULL : treeblock_name.c_str());
+	effectiveAssumpBlock = this->GetAssumptionsBlockForTreesTitle(cbn, token, "TreePartition");
+	DemandIsAtEquals(token, "in TreePartition definition");
+	token.GetNextToken();
+	NxsPartition newPartition;
+	NCL_ASSERT(treesBlockPtr);
+	effectiveAssumpBlock->ReadPartitionDef(newPartition, *treesBlockPtr, treepart_name, "Tree", "TreePartition", token, asterisked, false, true);
+	effectiveAssumpBlock->AddTreePartition(treepart_name, newPartition);
+	}
+
+void NxsBlock::ReadPartitionDef(
+  NxsPartition &np,
+  NxsLabelToIndicesMapper &ltm,
+  const std::string & partName,
+  const char * ptype,
+  const char * cmd,
+  NxsToken & token,
+  bool warnAsterisked,
+  bool demandAllInds,
+  bool storeAsPartition)
+	{
+	NxsUnsignedSet allInds;
+	const unsigned total = ltm.GetMaxIndex() + 1;
+	std::set<NxsString> prevGroupNames;
+	errormsg.clear();
+	for (;;)
+		{
+		if (token.Equals(";"))
+			break;
+		NxsString groupN = token.GetToken();
+		NxsString capGroupN = groupN;
+		capGroupN.ToUpper();
+		if (prevGroupNames.count(capGroupN) > 0)
+			{
+			errormsg << "Illegal repitition of a subset name (" << groupN << ") in the " << cmd << " definition of " << partName;
+			throw NxsException(errormsg, token);
+			}
+		token.GetNextToken();
+		if (!token.Equals(":"))
+			{
+			errormsg << "Expecting a : after the subset name " << groupN << " in the " << cmd  << " definition of " << partName << ". Found " << token.GetToken();
+			throw NxsException(errormsg, token);
+			}
+		token.GetNextToken();
+		NxsUnsignedSet s;
+		NxsSetReader::ReadSetDefinition(token, ltm, ptype, cmd, &s, &allInds);
+		allInds.insert(s.begin(), s.end());
+		np.push_back(NxsPartitionGroup(groupN, s));
+		if (token.Equals(";"))
+			break;
+		NCL_ASSERT(token.Equals(","));
+		 // this flag allows us to deal with sci. not. in WtSet commands.
+		 //	It shouldn't hurt in other contexts, though the parser will be
+		 //		more lax than it should (and will accept unquoted tokens-like-this as names).
+		token.SetLabileFlagBit(NxsToken::hyphenNotPunctuation);
+		token.GetNextToken();
+		}
+	if (allInds.size() < total)
+		{
+		unsigned n = 0;
+		for (;n < total; ++n)
+			{
+			if (allInds.count(n) == 0)
+				break;
+			}
+		errormsg << partName << " is a not a valid "<< cmd <<". At least one " << ptype << " ("<< n+1 << ") is not included";
+		if (demandAllInds)
+			throw NxsException(errormsg, token);
+		else if (nexusReader)
+			{
+			nexusReader->NexusWarnToken(errormsg, NxsReader::ILLEGAL_CONTENT_WARNING, token);
+			errormsg.clear();
+			}
+		}
+	if (warnAsterisked && nexusReader != NULL)
+		{
+		errormsg << "An * is ignored in a " << cmd << " command";
+		nexusReader->NexusWarnToken(errormsg, NxsReader::SKIPPING_CONTENT_WARNING, token);
+		errormsg.clear();
+		}
+	if (storeAsPartition && ltm.AddNewPartition(partName, np) && nexusReader)
+		{
+		errormsg << "A " << cmd << " with the name ";
+		errormsg += partName;
+		errormsg += " has already been encountered.    The later definition will preempt the earlier definition(s).";
+		nexusReader->NexusWarnToken(errormsg, NxsReader::OVERWRITING_CONTENT_WARNING, token);
+		errormsg.clear();
+		}
+	}
+
+unsigned NxsBlock::ReadVectorPartitionDef(NxsPartition &np, NxsLabelToIndicesMapper &ltm, const std::string & partName, const char * ptype, const char * cmd, NxsToken & token, bool warnAsterisked, bool demandAllInds, NxsSetVectorItemValidator & v)
+	{
+	NxsUnsignedSet allInds;
+	const unsigned total = ltm.GetMaxIndex() + 1;
+	std::map<std::string, NxsUnsignedSet> subsetMap;
+	errormsg.clear();
+	unsigned ind = 0;
+	for (; ind < total; ++ind)
+		{
+		if (token.Equals(";"))
+			break;
+		const std::string key = v.convert(token);
+		const std::string capKey = NxsString::get_upper(key);
+		NxsUnsignedSet & s = subsetMap[key];
+		s.insert(ind);
+		token.GetNextToken();
+		}
+	if (ind < total)
+		{
+		errormsg << partName << " is a not a valid "<< cmd <<". Only " << ind + 1 << " entries for " << ptype << "(s) were included in the definition";
+		if (demandAllInds)
+			throw NxsException(errormsg, token);
+		else if (nexusReader)
+			{
+			nexusReader->NexusWarnToken(errormsg, NxsReader::ILLEGAL_CONTENT_WARNING, token);
+			errormsg.clear();
+			}
+		}
+	if (warnAsterisked && nexusReader != NULL)
+		{
+		errormsg << "An * is ignored in a " << cmd << " command";
+		nexusReader->NexusWarnToken(errormsg, NxsReader::SKIPPING_CONTENT_WARNING, token);
+		errormsg.clear();
+		}
+	np.clear();
+	for (std::map<std::string, NxsUnsignedSet>::const_iterator sIt = subsetMap.begin(); sIt != subsetMap.end(); ++sIt)
+		{
+		const std::string & k = sIt->first;
+		const NxsUnsignedSet & valset = sIt->second;
+		np.push_back(NxsPartitionGroup(k, valset));
+		}
+	if (ltm.AddNewPartition(partName, np) && nexusReader)
+		{
+		errormsg << "A " << cmd << " with the name ";
+		errormsg += partName;
+		errormsg += " has already been encountered.    The later definition will preempt the earlier definition(s).";
+		nexusReader->NexusWarnToken(errormsg, NxsReader::OVERWRITING_CONTENT_WARNING, token);
+		errormsg.clear();
+		}
+	return ind;
+	}
+
+void NxsWriteSetCommand(const char *cmd, const NxsUnsignedSetMap & usetmap, std::ostream &out, const char * nameOfDef)
+	{
+	if (usetmap.empty())
+		return;
+	for (NxsUnsignedSetMap::const_iterator csIt = usetmap.begin(); csIt != usetmap.end(); ++csIt)
+		{
+		out << "    " << cmd << " ";
+		if (NxsString::case_insensitive_equals(csIt->first.c_str(), nameOfDef))
+			out << "* ";
+		out << NexusToken::EscapeString(csIt->first) << " =";
+		NxsSetReader::WriteSetAsNexusValue(csIt->second, out);
+		out << ";\n";
+		}
+	}
+
+void NxsWritePartitionCommand(const char *cmd, const NxsPartitionsByName & usetmap, std::ostream &out, const char * nameOfDef)
+	{
+	if (usetmap.empty())
+		return;
+	for (NxsPartitionsByName::const_iterator csIt = usetmap.begin(); csIt != usetmap.end(); ++csIt)
+		{
+		out << "    " << cmd << " ";
+		if (NxsString::case_insensitive_equals(csIt->first.c_str(), nameOfDef))
+			out << "* ";
+		out << NexusToken::EscapeString(csIt->first) << " =";
+		const NxsPartition & p = csIt->second;
+		bool first = true;
+		for (NxsPartition::const_iterator pIt = p.begin(); pIt != p.end(); ++pIt)
+			{
+			const NxsPartitionGroup & g = *pIt;
+			if (!first)
+				out << ',';
+			out << ' ' << NxsString::GetEscaped(g.first) << " :";
+			NxsSetReader::WriteSetAsNexusValue(g.second, out);
+			first = false;
+			}
+		out << ";\n";
+		}
+	}
+
+/*!
+	Reads and stores information contained in the command TAXSET within an ASSUMPTIONS block.
+*/
+void NxsAssumptionsBlock::HandleTaxSet(
+  NxsToken &token)	/* the token used to read from in */
+	{
+	bool asterisked = false;
+	token.GetNextToken();
+	if (token.Equals("*"))
+		{
+		asterisked = true;
+		token.GetNextToken();
+		}
+	NxsString taxset_name = token.GetToken();
+	//taxset_name.ToUpper();
+	token.GetNextToken();
+	NxsAssumptionsBlockAPI *effectiveAssumpBlock = NULL;
+	NxsString taxblock_name;
+	if (token.Equals("("))
+		{
+		token.GetNextToken();
+		while (!token.Equals(")"))
+			{
+			if (token.Equals("TAXA"))
+				{
+				DemandEquals(token, "after \"(Taxa\" in a TaxSet command");
+				token.GetNextToken();
+				taxblock_name = token.GetToken();
+				}
+			else if (token.Equals("VECTOR"))
+				GenerateNxsException(token, "VECTOR-style set definitions are not currently supported");
+			else if (token.Equals(";"))
+				GenerateNxsException(token, "; encountered in TaxSet command before parentheses were closed");
+			else if (!token.Equals("STANDARD") && nexusReader)
+				{
+				errormsg = "Skipping unknown TaxSet qualifier: ";
+				errormsg << token.GetTokenReference();
+				nexusReader->NexusWarnToken(errormsg, NxsReader::SKIPPING_CONTENT_WARNING, token);
+				errormsg.clear();
+				}
+			token.GetNextToken();
+			}
+		token.GetNextToken();
+		}
+	const char *tbn = (taxblock_name.empty() ? NULL : taxblock_name.c_str());
+	effectiveAssumpBlock = this->GetAssumptionsBlockForTaxaTitle(tbn, token, "TAXSET");
+	DemandIsAtEquals(token, "in TAXSET definition");
+	token.GetNextToken();
+	effectiveAssumpBlock->ReadTaxsetDef(taxset_name, token, asterisked);
+	}
+
+/*!
+	Called after verifying that the correct taxa block pointer is set.
+*/
+void NxsAssumptionsBlock::ReadTaxsetDef(NxsString taxset_name, NxsToken &token, bool asterisked)
+	{
+	NCL_ASSERT(taxa != NULL);
+	NxsTaxaBlockAPI &taxaBlock = *taxa;
+	NxsUnsignedSet s;
+	NxsSetReader::ReadSetDefinition(token, taxaBlock, "Taxon", "TaxSet", &s);
+	taxsets[taxset_name] = s;
+	if (asterisked && nexusReader != NULL)
+		{
+		nexusReader->NexusWarnToken("An * is ignored in a TaxSet command", NxsReader::SKIPPING_CONTENT_WARNING, token);
+		errormsg.clear();
+		}
+	if (taxaBlock.AddNewIndexSet(taxset_name, s) && nexusReader)
+		{
+		errormsg = "A TaxSet with the name ";
+		errormsg += taxset_name;
+		errormsg += " has already been encountered.    The later definition will preempt the earlier definition(s).";
+		nexusReader->NexusWarnToken(errormsg, NxsReader::SKIPPING_CONTENT_WARNING, token);
+		errormsg.clear();
+		}
+	}
+
+/*!
+	Reads and stores information contained in the command TAXSET within an ASSUMPTIONS block.
+*/
+void NxsAssumptionsBlock::HandleTreeSet(
+  NxsToken &token)	/* the token used to read from in */
+	{
+	bool asterisked = false;
+	token.GetNextToken();
+	if (token.Equals("*"))
+		{
+		asterisked = true;
+		token.GetNextToken();
+		}
+	NxsString treeset_name = token.GetToken();
+	//treeset_name.ToUpper();
+	token.GetNextToken();
+	NxsAssumptionsBlockAPI *effectiveAssumpBlock = NULL;
+	NxsString treeblock_name;
+	if (token.Equals("("))
+		{
+		token.GetNextToken();
+		while (!token.Equals(")"))
+			{
+			if (token.Equals("TREES"))
+				{
+				DemandEquals(token, "after \"(Trees\" in a TreeSet command");
+				token.GetNextToken();
+				treeblock_name = token.GetToken();
+				}
+			else if (token.Equals("VECTOR"))
+				GenerateNxsException(token, "VECTOR-style set definitions are not currently supported");
+			else if (token.Equals(";"))
+				GenerateNxsException(token, "; encountered in TreeSet command before parentheses were closed");
+			else if (!token.Equals("STANDARD") && nexusReader)
+				{
+				errormsg = "Skipping unknown TreeSet qualifier: ";
+				errormsg << token.GetTokenReference();
+				nexusReader->NexusWarnToken(errormsg, NxsReader::SKIPPING_CONTENT_WARNING, token);
+				errormsg.clear();
+				}
+			token.GetNextToken();
+			}
+		token.GetNextToken();
+		}
+	const char *tbn = (treeblock_name.empty() ? NULL : treeblock_name.c_str());
+	effectiveAssumpBlock = this->GetAssumptionsBlockForTreesTitle(tbn, token, "TreeSet");
+	DemandIsAtEquals(token, "in TreeSet definition");
+	token.GetNextToken();
+	effectiveAssumpBlock->ReadTreesetDef(treeset_name, token, asterisked);
+	}
+
+/*!
+	Called after verifying that the correct trees block pointer is set.
+*/
+void NxsAssumptionsBlock::ReadTreesetDef(NxsString treeset_name, NxsToken &token, bool asterisked)
+	{
+	NCL_ASSERT(treesBlockPtr != NULL);
+	NxsTreesBlockAPI &treesBlock = *treesBlockPtr;
+	NxsUnsignedSet s;
+	NxsSetReader::ReadSetDefinition(token, treesBlock, "Trees", "TreeSet", &s);
+	treesets[treeset_name] = s;
+	if (asterisked && nexusReader != NULL)
+		{
+		nexusReader->NexusWarnToken("An * is ignored in a TreeSet command", NxsReader::SKIPPING_CONTENT_WARNING, token);
+		errormsg.clear();
+		}
+	if (treesBlock.AddNewIndexSet(treeset_name, s) && nexusReader)
+		{
+		errormsg = "A TreeSet with the name ";
+		errormsg += treeset_name;
+		errormsg += " has already been encountered.    The later definition will preempt the earlier definition(s).";
+		nexusReader->NexusWarnToken(errormsg, NxsReader::SKIPPING_CONTENT_WARNING, token);
+		errormsg.clear();
+		}
+	}
+
+/*!
+	This function provides the ability to read everything following the block name (which is read by the NxsReader
+	object) to the end or ENDBLOCK statement. Characters are read from the input stream in. Overrides the pure virtual
+	function in the base class.
+*/
+void NxsAssumptionsBlock::Read(
+  NxsToken &token)	/* the token used to read from in */
+	{
+	isEmpty = false;
+	isUserSupplied = true;
+	NxsString n = "BEGIN ";
+	n << NCL_BLOCKTYPE_ATTR_NAME;
+	DemandEndSemicolon(token, n.c_str());
+
+	for(;;)
+		{
+		token.GetNextToken();
+		
+		int prevCharLinkStatus = charLinkStatus;
+		int prevTaxaLinkStatus = taxaLinkStatus;
+		int prevTreesLinkStatus = treesLinkStatus;
+
+		
+		NxsBlock::NxsCommandResult res = HandleBasicBlockCommands(token);
+		if (res == NxsBlock::NxsCommandResult(STOP_PARSING_BLOCK))
+			return;
+		if ((charLinkStatus & BLOCK_LINK_FROM_LINK_CMD) && !(prevCharLinkStatus & BLOCK_LINK_FROM_LINK_CMD))
+			blockwideCharsLinkEstablished = true;
+		if ((treesLinkStatus & BLOCK_LINK_FROM_LINK_CMD) && !(prevTreesLinkStatus & BLOCK_LINK_FROM_LINK_CMD))
+			blockwideTreesLinkEstablished = true;
+		if ((taxaLinkStatus & BLOCK_LINK_FROM_LINK_CMD) && !(prevTaxaLinkStatus & BLOCK_LINK_FROM_LINK_CMD))
+			blockwideTaxaLinkEstablished = true;
+		if (res != NxsBlock::NxsCommandResult(HANDLED_COMMAND))
+			{
+			if (token.Equals("CHARPARTITION"))
+				HandleCharPartition(token);
+			else if (token.Equals("CHARSET"))
+				HandleCharSet(token);
+			else if (token.Equals("CODESET"))
+				HandleCodeSet(token);
+			else if (token.Equals("CODONPOSSET"))
+				HandleCodonPosSet(token);
+			else if (token.Equals("EXSET"))
+				HandleExSet(token);
+			else if (token.Equals("OPTIONS"))
+				HandleOptions(token);
+			else if (token.Equals("TAXSET"))
+				HandleTaxSet(token);
+			else if (token.Equals("TAXPARTITION"))
+				HandleTaxPartition(token);
+			else if (token.Equals("TREESET"))
+				HandleTreeSet(token);
+			else if (token.Equals("TREEPARTITION"))
+				HandleTreePartition(token);
+			else if (token.Equals("TYPESET"))
+				HandleTypeSet(token);
+			else if (token.Equals("USERTYPE"))
+				HandleUserType(token);
+			else if (token.Equals("WTSET"))
+				HandleWeightSet(token);
+			else
+				SkipCommand(token);
+
+			}
+		}	// for(;;)
+	}
+void NxsAssumptionsBlock::HandleOptions(NxsToken &token)
+	{
+	errormsg.clear();
+	token.GetNextToken();
+	std::map<std::string, std::string> kv = token.ProcessAsSimpleKeyValuePairs("OPTIONS");
+	std::map<std::string, std::string>::const_iterator kvIt = kv.begin();
+	for (; kvIt != kv.end(); ++kvIt)
+		{
+		if (NxsString::case_insensitive_equals(kvIt->first.c_str(), "DEFTYPE"))
+			{
+			NxsAssumptionsBlockAPI	* effAssumpB = GetAssumptionsBlockForCharTitle(NULL, token, "OPTIONS");
+			NCL_ASSERT(effAssumpB);
+			NxsCharactersBlockAPI * cb = effAssumpB->GetCharBlockPtr();
+			NCL_ASSERT(cb);
+			NxsTransformationManager & tmRef = cb->GetNxsTransformationManagerRef();
+			if (!tmRef.IsValidTypeName(kvIt->second.c_str()))
+				{
+				errormsg << kvIt->second << " is not a valid type name for OPTIONS DefType. Expceting one of:\n";
+				const std::set<std::string> & tn = tmRef.GetTypeNames();
+				for (std::set<std::string>::const_iterator tnIt = tn.begin(); tnIt != tn.end(); ++tnIt)
+					errormsg << ' ' << NxsString::GetEscaped(*tnIt);
+				throw NxsException(errormsg, token);
+				}
+			try
+				{
+				tmRef.SetDefaultTypeName(kvIt->second);
+				NxsTransformationManager & etmRef  = effAssumpB->GetNxsTransformationManagerRef();
+				etmRef.SetDefaultTypeName(kvIt->second);
+				}
+			catch (const NxsException & x)
+				{
+				throw NxsException(x.msg, token);
+				}
+			}
+		else if (NxsString::case_insensitive_equals(kvIt->first.c_str(), "POLYTCOUNT"))
+			{
+			if (NxsString::case_insensitive_equals(kvIt->second.c_str(), "MINSTEPS"))
+				polyTCountValue = POLY_T_COUNT_MIN;
+			else if (NxsString::case_insensitive_equals(kvIt->second.c_str(), "MAXSTEPS"))
+				polyTCountValue = POLY_T_COUNT_MAX;
+			else
+				{
+				errormsg << "Unknown value (" << kvIt->second << ") found for OPTIONS PolyTCount (expecting MINSTEPS or MAXSTEPS).";
+				throw NxsException(errormsg, token);
+				}
+			}
+		else if (NxsString::case_insensitive_equals(kvIt->first.c_str(), "GAPMODE"))
+			{
+			NxsAssumptionsBlockAPI	* effAssumpB = GetAssumptionsBlockForCharTitle(NULL, token, "OPTIONS");
+			NCL_ASSERT(effAssumpB);
+			NxsCharactersBlockAPI * cb = effAssumpB->GetCharBlockPtr();
+			NCL_ASSERT(cb);
+			if (NxsString::case_insensitive_equals(kvIt->second.c_str(), "MISSING"))
+				{
+				effAssumpB->SetGapsAsNewstate(false);
+				cb->SetGapModeSetting(NxsCharactersBlockAPI::GAP_MODE_MISSING);
+				}
+			else if (NxsString::case_insensitive_equals(kvIt->second.c_str(), "NEWSTATE"))
+				{
+				effAssumpB->SetGapsAsNewstate(true);
+				cb->SetGapModeSetting(NxsCharactersBlockAPI::GAP_MODE_NEWSTATE);
+				}
+			else
+				{
+				errormsg << "Unknown value (" << kvIt->second << ") found for OPTIONS GapMode (expecting MISSING or NEWSTATE).";
+				throw NxsException(errormsg, token);
+				}
+			}
+		else if (nexusReader)
+			{
+			errormsg << "Skipping unknown subcommand (" << kvIt->first << ") in OPTIONS command of " << NCL_BLOCKTYPE_ATTR_NAME << " Block";
+			nexusReader->NexusWarnToken(errormsg, NxsReader::SKIPPING_CONTENT_WARNING, token);
+			errormsg.clear();
+			}
+		}
+	}
+
+/*!
+	Prepares for reading a new ASSUMPTIONS block. Overrides the pure virtual function in the base class.
+*/
+void NxsAssumptionsBlock::Reset()
+	{
+	if (!passedRefOfOwnedBlock)
+		{
+		VecAssumpBlockPtr::iterator bIt = createdSubBlocks.begin();
+		for(; bIt != createdSubBlocks.end(); ++bIt)
+			{
+			if (*bIt)
+				delete *bIt;
+			}
+		createdSubBlocks.clear();
+		}
+	passedRefOfOwnedBlock = false;
+	NxsBlock::Reset();
+	exsets.clear();
+	taxsets.clear();
+	charsets.clear();
+	def_exset.clear();
+	charPartitions.clear();
+	taxPartitions.clear();
+	treePartitions.clear();
+	readAs = UNREAD_OR_GENERATED_BLOCK;
+	charLinkStatus &= BLOCK_LINK_UNUSED_MASK;
+	taxaLinkStatus &= BLOCK_LINK_UNUSED_MASK;
+	treesLinkStatus &= BLOCK_LINK_UNUSED_MASK;
+	if (charLinkStatus & NxsBlock::BLOCK_LINK_FROM_LINK_CMD)
+		SetCharBlockPtr(NULL, NxsBlock::BLOCK_LINK_UNINITIALIZED);
+	if (taxaLinkStatus & NxsBlock::BLOCK_LINK_FROM_LINK_CMD)
+		SetTaxaBlockPtr(NULL, NxsBlock::BLOCK_LINK_UNINITIALIZED);
+	if (treesLinkStatus & NxsBlock::BLOCK_LINK_FROM_LINK_CMD)
+		SetTreesBlockPtr(NULL, NxsBlock::BLOCK_LINK_UNINITIALIZED);
+	transfMgr.Reset();
+	codesMgr.Reset();
+	polyTCountValue = POLY_T_COUNT_UNKNOWN;
+	gapsAsNewstate = false;
+	blockwideCharsLinkEstablished = false;
+	blockwideTaxaLinkEstablished = false;
+	blockwideTreesLinkEstablished = false;
+
+	codonPosSets.clear();
+	def_codonPosSet.clear();
+	codeSets.clear();
+	def_codeSet.clear();
+	}
+
+/*!
+	This function outputs a brief report of the contents of this ASSUMPTIONS block. Overrides the pure virtual function
+	in the base class.
+*/
+void NxsAssumptionsBlock::Report(
+  std::ostream &out)  NCL_COULD_BE_CONST /* the output stream to which to write the report */ /*v2.1to2.2 1 */
+	{
+	out << endl;
+	out << NCL_BLOCKTYPE_ATTR_NAME << " block contains the following:" << endl;
+
+	if (charsets.empty())
+		out << "  No character sets were defined" << endl;
+	else
+		{
+		NxsUnsignedSetMap::const_iterator charsets_iter = charsets.begin();
+		if (charsets.size() == 1)
+			{
+			out << "  1 character set defined:" << endl;
+			out << "   " << (*charsets_iter).first << endl;
+			}
+		else
+			{
+			out << "  " << (unsigned)charsets.size() << " character sets defined:" << endl;
+			for (; charsets_iter != charsets.end(); charsets_iter++)
+				{
+				NxsString nm = (*charsets_iter).first;
+				out << "   " << nm;
+				out << endl;
+				}
+			}
+		}	// if (charsets.empty()) ... else
+
+	if (taxsets.empty())
+		out << "  No taxon sets were defined" << endl;
+	else
+		{
+		NxsUnsignedSetMap::const_iterator taxsets_iter = taxsets.begin();
+		if (taxsets.size() == 1)
+			{
+			out << "  1 taxon set defined:" << endl;
+			out << "   " << (*taxsets_iter).first << endl;
+			}
+		else
+			{
+			out << "  " << (unsigned)taxsets.size() << " taxon sets defined:" << endl;
+			for (; taxsets_iter != taxsets.end(); taxsets_iter++)
+				{
+				NxsString nm = (*taxsets_iter).first;
+				out << "   " << nm;
+				out << endl;
+				}
+			}
+		}	// if (taxsets.empty()) ... else
+
+	if (exsets.empty())
+		out << "  No exclusion sets were defined" << endl;
+	else
+		{
+		NxsUnsignedSetMap::const_iterator exsets_iter = exsets.begin();
+		if (exsets.size() == 1)
+			{
+			out << "  1 exclusion set defined:" << endl;
+			out << "   " << (*exsets_iter).first << endl;
+			}
+		else
+			{
+			out << "  " << (unsigned)exsets.size() << " exclusion sets defined:" << endl;
+			for (; exsets_iter != exsets.end(); exsets_iter++)
+				{
+				NxsString nm = (*exsets_iter).first;
+				out << "   " << nm;
+				if (NxsString::case_insensitive_equals(nm.c_str(), def_exset.c_str()))
+					out << " (default)";
+				out << endl;
+				}
+			}
+		}
+
+	out << endl;
+	}
+
+/*!
+	A CHARACTERS, DATA, or ALLELES block can call this function to specify that it is to receive notification when the
+	current taxon or character set changes (e.g., an "EXSET *" command is read or a program requests that one of the
+	predefined taxon sets, character sets, or exsets be applied). Normally, a NxsCharactersBlockAPI-derived object calls
+	this function upon entering its MATRIX command, since when that happens it becomes the primary data-containing block.
+*/
+void NxsAssumptionsBlock::SetCallback(
+  NxsCharactersBlockAPI* p) /* the object to be called in the event of a change in character status */
+	{
+	charBlockPtr = p;
+	SetCharLinkStatus(NxsBlock::BLOCK_LINK_TO_MOST_RECENT);
+	}
+
+/*!
+	Converts a taxon label to a number corresponding to the taxon's position within the list maintained by the
+	NxsTaxaBlockAPI object. This method overrides the virtual function of the same name in the NxsBlock base class. If s
+	is not a valid taxon label, returns the value 0.
+*/
+unsigned NxsAssumptionsBlock::TaxonLabelToNumber(
+  NxsString s)	const /* the taxon label to convert */ /*v2.1to2.2 4 */
+	{
+	NCL_ASSERT(taxa != NULL);
+	int i;
+	try
+		{
+		i = 1 + taxa->FindTaxon(s);
+		}
+	catch(NxsTaxaBlock::NxsX_NoSuchTaxon)
+		{
+		i = 0;
+		}
+
+	return i;
+	}
+
+/*only used it the linkAPI is enabled*/
+void NxsAssumptionsBlock::HandleLinkCommand(NxsToken & token)
+	{
+	if (!nexusReader)
+		NxsNCLAPIException("No NxsReader when reading Assumptions block.");
+
+	token.GetNextToken();
+	const std::map<std::string, std::string> kv = token.ProcessAsSimpleKeyValuePairs("LINK");
+	std::map<std::string, std::string>::const_iterator pairIt = kv.begin();
+	for (;pairIt != kv.end(); ++pairIt)
+		{
+		NxsString key(pairIt->first.c_str());
+		key.ToUpper();
+		NxsString value(pairIt->second.c_str());
+		if (key == "TAXA")
+			{
+			if (taxa && !taxa->GetID().EqualsCaseInsensitive(value))
+				{
+				if (GetTaxaLinkStatus() & NxsBlock::BLOCK_LINK_USED)
+					{
+					errormsg = "LINK to a Taxa block must occur before commands that use a taxa block";
+					throw NxsException(errormsg, token);
+					}
+				SetTaxaBlockPtr(NULL, NxsBlock::BLOCK_LINK_UNINITIALIZED);
+				}
+			if (!taxa)
+				{
+				NxsTaxaBlockAPI * cb = nexusReader->GetTaxaBlockByTitle(value.c_str(), NULL);
+				if (cb == NULL)
+					{
+					errormsg = "Unknown TAXA block (";
+					errormsg += value;
+					errormsg +=") referred to in the LINK command";
+					throw NxsException(errormsg, token);
+					}
+				SetTaxaBlockPtr(cb, NxsBlock::BLOCK_LINK_FROM_LINK_CMD);
+				}
+			}
+		else if (key == "CHARACTERS")
+			{
+			if (charBlockPtr && !charBlockPtr->GetID().EqualsCaseInsensitive(value))
+				{
+				if (GetCharLinkStatus() & NxsBlock::BLOCK_LINK_USED)
+					{
+					errormsg = "LINK to a CHARACTERS block must occur before commands that use a CHARACTERS block";
+					throw NxsException(errormsg, token);
+					}
+				SetCharBlockPtr(NULL, NxsBlock::BLOCK_LINK_UNINITIALIZED);
+				}
+			if (!charBlockPtr)
+				{
+				NxsCharactersBlockAPI * cb = nexusReader->GetCharBlockByTitle(value.c_str(), NULL);
+				if (cb == NULL)
+					{
+					errormsg = "Unknown CHARACTERS block (";
+					errormsg += value;
+					errormsg +=") referred to in the LINK command";
+					throw NxsException(errormsg, token);
+					}
+				SetCharBlockPtr(cb, NxsBlock::BLOCK_LINK_FROM_LINK_CMD);
+				}
+			}
+		else if (key == "TREES")
+			{
+			if (treesBlockPtr && !treesBlockPtr->GetID().EqualsCaseInsensitive(value))
+				{
+				if (GetTreesLinkStatus() & NxsBlock::BLOCK_LINK_USED)
+					{
+					errormsg = "LINK to a TREES block must occur before commands that use a TREES block";
+					throw NxsException(errormsg, token);
+					}
+				SetTreesBlockPtr(NULL, NxsBlock::BLOCK_LINK_UNINITIALIZED);
+				}
+			if (!treesBlockPtr)
+				{
+				NxsTreesBlockAPI * cb = nexusReader->GetTreesBlockByTitle(value.c_str(), NULL);
+				if (cb == NULL)
+					{
+					errormsg = "Unknown TREES block (";
+					errormsg += value;
+					errormsg +=") referred to in the LINK command";
+					throw NxsException(errormsg, token);
+					}
+				SetTreesBlockPtr(cb, NxsBlock::BLOCK_LINK_FROM_LINK_CMD);
+				}
+			}
+		else
+			{
+			errormsg = "Skipping unknown LINK subcommand: ";
+			errormsg += pairIt->first.c_str();
+			nexusReader->NexusWarnToken(errormsg, NxsReader::SKIPPING_CONTENT_WARNING, token);
+			errormsg.clear(); //this token pos will be off a bit.
+			}
+		}
+	}
+void NxsAssumptionsBlock::WriteLinkCommand(std::ostream &out) const
+	{
+	if ( (taxa && !(taxa->GetTitle().empty()))
+		|| (treesBlockPtr  && !(treesBlockPtr->GetTitle().empty()))
+		|| (charBlockPtr && !(charBlockPtr->GetTitle().empty())))
+		{
+		out << "    LINK";
+		if (taxa)
+			out << " TAXA = " << NxsString::GetEscaped(taxa->GetTitle());
+		if (charBlockPtr)
+			out << " CHARACTERS = " << NxsString::GetEscaped(charBlockPtr->GetTitle());
+		if (treesBlockPtr)
+			out << " TREES = " << NxsString::GetEscaped(treesBlockPtr->GetTitle());
+		out << ";\n";
+		}
+	}
+
+VecBlockPtr NxsAssumptionsBlock::GetCreatedTaxaBlocks()
+	{
+	passedRefOfOwnedBlock = true;
+	VecBlockPtr r;
+	VecAssumpBlockPtr::iterator bIt = createdSubBlocks.begin();
+	for(; bIt != createdSubBlocks.end(); ++bIt)
+		r.push_back(*bIt);
+	return r;
+	}
+
+
+NxsAssumptionsBlock *NxsAssumptionsBlockFactory::GetBlockReaderForID(const std::string & idneeded, NxsReader *reader, NxsToken *)
+	{
+	if (reader == NULL || (idneeded != "ASSUMPTIONS" && idneeded != "CODONS" && idneeded != "SETS"))
+		return NULL;
+	NxsAssumptionsBlock * nb =	new NxsAssumptionsBlock(NULL);
+	nb->SetImplementsLinkAPI(true);
+	return nb;
+	}
diff --git a/lib/ncl-2.1.18/ncl/nxsassumptionsblock.h b/lib/ncl-2.1.18/ncl/nxsassumptionsblock.h
new file mode 100644
index 0000000..2836145
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsassumptionsblock.h
@@ -0,0 +1,391 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#ifndef NCL_ASSUMPTIONSBLOCK_H
+#define NCL_ASSUMPTIONSBLOCK_H
+
+#include <vector>
+
+#include "ncl/nxsdefs.h"
+#include "ncl/nxsblock.h"
+#include "ncl/nxstreesblock.h"
+#include "ncl/nxscharactersblock.h"
+#include "ncl/nxstaxablock.h"
+
+class NxsCharactersBlockAPI;
+class NxsTaxaBlockAPI;
+
+class NxsAssumptionsBlockAPI
+  : public NxsBlock
+	{
+	public:
+  		virtual void	SetCallback(NxsCharactersBlockAPI *p) = 0;
+
+
+
+		virtual void SetCharBlockPtr(NxsCharactersBlockAPI * c, NxsBlockLinkStatus s) = 0;
+		virtual void SetTaxaBlockPtr(NxsTaxaBlockAPI *, NxsBlockLinkStatus s) = 0;
+		virtual void SetTreesBlockPtr(NxsTreesBlockAPI *, NxsBlockLinkStatus s) = 0;
+
+		virtual NxsCharactersBlockAPI * GetCharBlockPtr(int *status=NULL) = 0; /*v2.1to2.2 13 */
+		virtual NxsTaxaBlockAPI * GetTaxaBlockPtr(int *status=NULL) = 0; /*v2.1to2.2 13 */
+		virtual NxsTreesBlockAPI * GetTreesBlockPtr(int *status=NULL) = 0; /*v2.1to2.2 13 */
+
+		/* i14 */ /*v2.1to2.2 14 */
+		/* i15 */ /*v2.1to2.2 15 */
+		/* i16 */ /*v2.1to2.2 16 */
+
+		virtual void AddCharPartition(const std::string & name, const NxsPartition &) = 0;
+		virtual void AddTaxPartition(const std::string & name, const NxsPartition &) = 0;
+		virtual void AddTreePartition(const std::string & name, const NxsPartition &) = 0;
+		virtual void AddCodeSet(const std::string & name, const NxsPartition &, bool asterisked) = 0;
+		virtual void AddCodonPosSet(const std::string & name, const NxsPartition &, bool asterisked) = 0;
+
+		virtual void FlagCharBlockAsUsed() = 0;
+		virtual void FlagTaxaBlockAsUsed() = 0;
+		virtual void FlagTreesBlockAsUsed() = 0;
+
+  		virtual void ReadCharsetDef(NxsString charset_name, NxsToken &token, bool asterisked) = 0;
+  		virtual void ReadExsetDef(NxsString charset_name, NxsToken &token, bool asterisked) = 0;
+		virtual void ReadTaxsetDef(NxsString set_name, NxsToken &token, bool asterisked) = 0;
+		virtual void ReadTreesetDef(NxsString set_name, NxsToken &token, bool asterisked) = 0;
+
+		virtual NxsTransformationManager & GetNxsTransformationManagerRef() = 0;
+		virtual const NxsTransformationManager & GetNxsTransformationManagerConstRef() const = 0;
+		virtual NxsGeneticCodesManager & GetNxsGeneticCodesManagerRef() = 0;
+		virtual void SetGapsAsNewstate(bool v) = 0;
+
+		/*!  delegates call to the NxsTransformationManager */
+		virtual std::vector<double> GetDefaultDoubleWeights() const
+			{
+		    return GetNxsTransformationManagerConstRef().GetDefaultDoubleWeights();
+			}
+
+		/*!  delegates call to the NxsTransformationManager */
+		virtual std::vector<int> GetDefaultIntWeights() const {
+		    return GetNxsTransformationManagerConstRef().GetDefaultIntWeights();
+		}
+
+ 	};
+
+/*!
+	This class handles reading and storage for the NxsReader block ASSUMPTIONS. It overrides the member functions Read
+	and Reset, which are abstract virtual functions in the base class NxsBlock. Adding a new data member? Don't forget
+	to:
+~
+	o Describe it in the class declaration using a C-style comment.
+	o Initialize it (unless it is self-initializing) in the constructor and re-initialize it in the Reset function.
+	o Describe the initial state in the constructor documentation.
+	o Delete memory allocated to it in both the destructor and Reset function.
+	o Report it in some way in the Report function.
+~
+*/
+class NxsAssumptionsBlock
+  : public NxsAssumptionsBlockAPI
+	{
+	enum NameOfAssumpBlockAsRead
+		{
+		UNREAD_OR_GENERATED_BLOCK,
+		ASSUMPTIONS_BLOCK_READ,
+		SETS_BLOCK_READ,
+		CODONS_BLOCK_READ
+		};
+
+
+	public:
+							NxsAssumptionsBlock(NxsTaxaBlockAPI *t);
+		virtual				~NxsAssumptionsBlock();
+
+		virtual bool		CanReadBlockType(const NxsToken & token);
+
+		void				ReplaceTaxaBlockPtr(NxsTaxaBlockAPI *tb);
+		void				SetCallback(NxsCharactersBlockAPI *p);
+
+		int					GetNumCharSets() const;
+		/* i17 */ /*v2.1to2.2 17 */
+		void				GetCharSetNames(NxsStringVector &names) const; /*v2.1to2.2 3 */
+		const NxsUnsignedSet *GetCharSet(NxsString nm) const; /*v2.1to2.2 4 */
+
+		int					GetNumCharPartitions(); /*v2.1to2.2 6 */
+		void				GetCharPartitionNames(std::vector<std::string> &names); /*v2.1to2.2 6 */
+		const NxsPartition		*GetCharPartition(std::string nm) const;
+
+		int					GetNumTaxSets(); /*v2.1to2.2 6 */
+		void				GetTaxSetNames(NxsStringVector &names); /*v2.1to2.2 3 */ /*v2.1to2.2 6 */
+		NxsUnsignedSet &	GetTaxSet(NxsString nm); /*v2.1to2.2 6 */ /*v2.1to2.2 8 */ /*v2.1to2.2 4 */
+
+		int					GetNumExSets();/*v2.1to2.2 6 */
+		void				GetExSetNames(NxsStringVector &names); /*v2.1to2.2 3 */ /*v2.1to2.2 6 */
+		NxsUnsignedSet &	GetExSet(NxsString nm); /*v2.1to2.2 6 */ /*v2.1to2.2 8 */ /*v2.1to2.2 4 */
+		NxsString			GetDefExSetName(); /*v2.1to2.2 6 */ /*v2.1to2.2 4 */
+		void				ApplyExset(NxsString nm); /*v2.1to2.2 4 */
+
+		virtual void		Read(NxsToken& token);
+		virtual void		Report(std::ostream& out) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		virtual void		Reset();
+		virtual void 		WriteAsNexus(std::ostream &out) const;
+
+		/*only used it the linkAPI is enabled*/
+		virtual void		HandleLinkCommand(NxsToken & );
+		virtual void		WriteLinkCommand(std::ostream &out) const;
+
+		virtual VecBlockPtr		GetImpliedBlocks()
+			{
+			return GetCreatedTaxaBlocks();
+			}
+
+		int					GetCharLinkStatus() {return charLinkStatus;}
+		int					GetTaxaLinkStatus() {return taxaLinkStatus;}
+		int					GetTreesLinkStatus() {return treesLinkStatus;}
+
+		void				FlagCharBlockAsUsed() {charLinkStatus |= NxsBlock::BLOCK_LINK_USED;}
+		void				FlagTaxaBlockAsUsed() {taxaLinkStatus |= NxsBlock::BLOCK_LINK_USED;}
+		void				FlagTreesBlockAsUsed() {treesLinkStatus |= NxsBlock::BLOCK_LINK_USED;}
+
+		void				SetCharLinkStatus(NxsBlockLinkStatus s);
+		void				SetTaxaLinkStatus(NxsBlockLinkStatus s);
+		void				SetTreesLinkStatus(NxsBlockLinkStatus s);
+
+		void				SetCharBlockPtr(NxsCharactersBlockAPI * c, NxsBlockLinkStatus s);
+		void				SetTaxaBlockPtr(NxsTaxaBlockAPI *, NxsBlockLinkStatus s);
+		void				SetTreesBlockPtr(NxsTreesBlockAPI *, NxsBlockLinkStatus s);
+		NxsCharactersBlockAPI * GetCharBlockPtr(int *status=NULL); /*v2.1to2.2 13 */
+		NxsTaxaBlockAPI *	GetTaxaBlockPtr(int *status=NULL); /*v2.1to2.2 13 */
+		NxsTreesBlockAPI *	GetTreesBlockPtr(int *status=NULL); /*v2.1to2.2 13 */
+
+		const NxsTransformationManager & GetNxsTransformationManagerConstRef() const
+			{
+			return transfMgr;
+			}
+		NxsTransformationManager & GetNxsTransformationManagerRef()
+			{
+			return transfMgr;
+			}
+		NxsGeneticCodesManager & GetNxsGeneticCodesManagerRef()
+			{
+			return codesMgr;
+			}
+		virtual void AddCharPartition(const std::string & name, const NxsPartition &);
+		virtual void AddTaxPartition(const std::string & name, const NxsPartition &);
+		virtual void AddTreePartition(const std::string & name, const NxsPartition &);
+		virtual void AddCodeSet(const std::string & name, const NxsPartition &, bool asterisked);
+		virtual void AddCodonPosSet(const std::string & name, const NxsPartition &, bool asterisked);
+
+		/*---------------------------------------------------------------------------------------
+		| Results in aliasing of the taxa, trees, and characters blocks!
+		*/
+		NxsAssumptionsBlock &operator=(const NxsAssumptionsBlock &other)
+			{
+			CopyBaseBlockContents(static_cast<const NxsBlock &>(other));
+			CopyAssumptionsContents(other);
+			return *this;
+			}
+
+		/*---------------------------------------------------------------------------------------
+		| Results in aliasing of the taxa, trees, and characters blocks!
+		|
+		| passedRefOfOwnedBlock is set to this->true to avoid double deletion (other
+		|	retains ownership of these blocks
+		*/
+		virtual void CopyAssumptionsContents(const NxsAssumptionsBlock &other)
+			{
+			taxa = other.taxa;
+			charBlockPtr = other.charBlockPtr;
+			treesBlockPtr = other.treesBlockPtr;
+			charsets = other.charsets;
+			taxsets = other.taxsets;
+			treesets = other.treesets;
+			exsets = other.exsets;
+			charPartitions = other.charPartitions;
+			taxPartitions = other.taxPartitions;
+			treePartitions = other.treePartitions;
+			def_exset = other.def_exset;
+			charLinkStatus = other.charLinkStatus;
+			taxaLinkStatus = other.taxaLinkStatus;
+			treesLinkStatus = other.treesLinkStatus;
+			passedRefOfOwnedBlock = true;
+			readAs = other.readAs;
+			transfMgr = other.transfMgr;
+			codesMgr = other.codesMgr;
+			createdSubBlocks = other.createdSubBlocks;
+			polyTCountValue = other.polyTCountValue;
+			gapsAsNewstate = other.gapsAsNewstate;
+            blockwideCharsLinkEstablished = other.blockwideCharsLinkEstablished;
+            blockwideTaxaLinkEstablished = other.blockwideTaxaLinkEstablished;
+            blockwideTreesLinkEstablished = other.blockwideTreesLinkEstablished;
+
+			codonPosSets = other.codonPosSets;
+			def_codonPosSet = other.def_codonPosSet;
+			codeSets = other.codeSets;
+			def_codeSet = other.def_codeSet;
+			}
+
+		virtual NxsAssumptionsBlock * Clone() const
+			{
+			NxsAssumptionsBlock * a = new NxsAssumptionsBlock(taxa);
+			*a = *this;
+			return a;
+			}
+		virtual void SetGapsAsNewstate(bool v)
+			{
+			gapsAsNewstate = v;
+			}
+
+
+	protected:
+		typedef std::vector<NxsAssumptionsBlockAPI *> VecAssumpBlockPtr;
+
+		virtual void 		ReadCharsetDef(NxsString charset_name, NxsToken &token, bool asterisked);
+		virtual void 		ReadExsetDef(NxsString charset_name, NxsToken &token, bool asterisked);
+		virtual void 		ReadTreesetDef(NxsString set_name, NxsToken &token, bool asterisked);
+		virtual void 		ReadTaxsetDef(NxsString set_name, NxsToken &token, bool asterisked);
+
+
+		VecBlockPtr 		GetCreatedTaxaBlocks();
+		virtual unsigned	TaxonLabelToNumber(NxsString s) const; /*v2.1to2.2 4 */
+
+		void				HandleCharPartition(NxsToken& token);
+		void				HandleCharSet(NxsToken& token);
+		void				HandleCodeSet(NxsToken& token);
+		void				HandleCodonPosSet(NxsToken& token);
+		void				HandleExSet(NxsToken& token);
+		void				HandleOptions(NxsToken & token);
+		void				HandleTaxPartition(NxsToken& token);
+		void				HandleTaxSet(NxsToken& token);
+		void				HandleTreePartition(NxsToken& token);
+		void				HandleTreeSet(NxsToken& token);
+		void				HandleTypeSet(NxsToken& token);
+		void				HandleUserType(NxsToken& token);
+		void				HandleWeightSet(NxsToken& token);
+
+		void				WriteCharSet(std::ostream &out) const
+			{
+			NxsWriteSetCommand("CHARSET", charsets, out);
+			}
+		void				WriteCharPartition(std::ostream &out) const
+			{
+			NxsWritePartitionCommand("CharPartition", charPartitions, out);
+			}
+		void				WriteExSet(std::ostream &out) const
+			{
+			NxsWriteSetCommand("EXSET", exsets, out, def_exset.c_str());
+			}
+		void				WriteOptions(std::ostream &out) const;
+		void				WriteTaxPartition(std::ostream &out) const
+			{
+			NxsWritePartitionCommand("TaxPartition", taxPartitions, out);
+			}
+		void				WriteTaxSet(std::ostream &out) const
+			{
+			NxsWriteSetCommand("TAXSET", taxsets, out);
+			}
+		void				WriteTreePartition(std::ostream &out) const
+			{
+			NxsWritePartitionCommand("TreePartition", treePartitions, out);
+			}
+		void				WriteTreeSet(std::ostream &out) const
+			{
+			NxsWriteSetCommand("TREESET", treesets, out);
+			}
+		void WriteCodeSet(std::ostream &out) const
+			{
+			NxsWritePartitionCommand("CodeSet", codeSets, out, def_codeSet.c_str());
+			}
+		void WriteCodonPosSet(std::ostream &out) const
+			{
+			NxsWritePartitionCommand("CodonPosSet", codonPosSets, out, def_codonPosSet.c_str());
+			}
+		NameOfAssumpBlockAsRead	GetIDOfBlockTypeIDFromParse() const
+			{
+			return readAs;
+			}
+	private:
+		NxsAssumptionsBlockAPI  *GetAssumptionsBlockForCharTitle(const char *title, NxsToken &token, const char *cmd);
+		NxsAssumptionsBlockAPI  *GetAssumptionsBlockForTaxaTitle(const char *title, NxsToken &token, const char *cmd);
+		NxsAssumptionsBlockAPI  *GetAssumptionsBlockForTreesTitle(const char *title, NxsToken &token, const char *cmd);
+
+		NxsAssumptionsBlockAPI  *GetAssumptionsBlockForCharBlock(NxsCharactersBlockAPI *, NxsBlockLinkStatus, NxsToken &token);
+		NxsAssumptionsBlockAPI  *GetAssumptionsBlockForTaxaBlock(NxsTaxaBlockAPI *, NxsBlockLinkStatus, NxsToken &token);
+		NxsAssumptionsBlockAPI  *GetAssumptionsBlockForTreesBlock(NxsTreesBlockAPI *, NxsBlockLinkStatus, NxsToken &token);
+
+		NxsAssumptionsBlockAPI  *CreateNewAssumptionsBlock(NxsToken &token);
+		NxsAssumptionsBlockAPI *DealWithPossibleParensInCharDependentCmd(NxsToken &token, const char *cmd, const std::vector<std::string> *unsupported = NULL, bool * isVect = NULL);
+		bool					HasAssumptionsBlockCommands() const;
+		bool					HasSetsBlockCommands() const;
+		bool					HasCodonsBlockCommands() const;
+
+
+		NxsTaxaBlockAPI			*taxa;				/* pointer to the NxsTaxaBlockAPI object */
+		NxsCharactersBlockAPI	*charBlockPtr;		/* pointer to the NxsCharactersBlockAPI-derived object to be notified in the event of exset changes */
+		NxsTreesBlockAPI		*treesBlockPtr;		/* pointer to the NxsTreesBlockAPI-derived object to be notified in the event of exset changes */
+
+
+
+		NxsUnsignedSetMap	charsets;
+		NxsUnsignedSetMap	taxsets;
+		NxsUnsignedSetMap	treesets;
+		NxsUnsignedSetMap	exsets;
+
+		NxsPartitionsByName charPartitions;
+		NxsPartitionsByName taxPartitions;
+		NxsPartitionsByName treePartitions;
+
+		NxsString			def_exset;			/* the default exset */
+
+		NxsPartitionsByName codonPosSets;
+		NxsString			def_codonPosSet;	/* the default codonPosSet */
+		NxsPartitionsByName codeSets;
+		NxsString			def_codeSet;		/* the default codeSet */
+
+		int					charLinkStatus;
+		int					taxaLinkStatus;
+		int					treesLinkStatus;
+		bool				passedRefOfOwnedBlock;
+		NameOfAssumpBlockAsRead	readAs;
+		NxsTransformationManager transfMgr;
+		NxsGeneticCodesManager	codesMgr;
+
+		std::vector<NxsAssumptionsBlockAPI *> createdSubBlocks;
+		enum PolyTCountValue
+			{
+			POLY_T_COUNT_UNKNOWN,
+			POLY_T_COUNT_MIN,
+			POLY_T_COUNT_MAX
+			};
+		PolyTCountValue		polyTCountValue;
+		bool				gapsAsNewstate;
+		bool blockwideCharsLinkEstablished;
+		bool blockwideTaxaLinkEstablished;
+		bool blockwideTreesLinkEstablished;
+
+		friend class NxsAssumptionsBlockFactory;
+		friend class PublicNexusReader;
+	};
+
+class NxsAssumptionsBlockFactory
+	:public NxsBlockFactory
+	{
+	public:
+		virtual NxsAssumptionsBlock * GetBlockReaderForID(const std::string & blockTypeName, NxsReader *reader, NxsToken *token);
+	};
+
+typedef NxsAssumptionsBlock AssumptionsBlock;	// for backward compatibility
+
+#endif
+
diff --git a/lib/ncl-2.1.18/ncl/nxsassumptionsblock.lo b/lib/ncl-2.1.18/ncl/nxsassumptionsblock.lo
new file mode 100644
index 0000000..8a364ed
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsassumptionsblock.lo
@@ -0,0 +1,12 @@
+# nxsassumptionsblock.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nxsassumptionsblock.o'
+
+# Name of the non-PIC object
+non_pic_object='nxsassumptionsblock.o'
+
diff --git a/lib/ncl-2.1.18/ncl/nxsblock.cpp b/lib/ncl-2.1.18/ncl/nxsblock.cpp
new file mode 100644
index 0000000..0875596
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsblock.cpp
@@ -0,0 +1,641 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#include "ncl/nxsdefs.h"
+#include "ncl/nxsblock.h"
+#include "ncl/nxsreader.h"
+#include <cstdlib>
+using namespace std;
+
+bool NxsLabelToIndicesMapper::allowNumberAsIndexPlusOne = true; //@TEMPORARY hack
+
+
+/* i18 */ /*v2.1to2.2 18 */
+
+#if !defined(IGNORE_NXS_ASSERT) && !defined(NDEBUG)
+	void ncl_assertion_failed(char const * expr, char const * function, char const * file, long line)
+		{
+#		if defined (ASSERTS_TO_EXCEPTIONS)
+			NxsString err;
+#		else
+			std::ostream & err(cerr);
+#		endif
+			err << "\nNCL assertion failed:";
+			err << "\n  expr: " << expr;
+			err << "\n  func: " << function;
+			err << "\n  file: " << file;
+			err << "\n  line: " << line ;
+#		if defined (ASSERTS_TO_EXCEPTIONS)
+			throw NxsNCLAPIException(err);
+#		else
+			std::cerr << std::endl;
+			std::exit(1);
+#		endif
+		}
+#endif
+
+
+/// returns the number of indices added (could be zero if the set name is not found.
+
+unsigned NxsLabelToIndicesMapper::GetIndicesFromSets(const std::string &label,
+  NxsUnsignedSet *inds,
+  const NxsUnsignedSetMap & itemSets)
+	{
+	const unsigned labelLen = (unsigned)label.length();
+	NxsUnsignedSetMap::const_iterator csIt = itemSets.begin();
+	for (; csIt != itemSets.end(); ++csIt)
+		{
+		const NxsString & csLabel = csIt->first;
+		if (labelLen == csLabel.length() && NxsString::case_insensitive_equals(label.c_str(), csLabel.c_str()))
+			{
+			const std::set<unsigned> & csSet = csIt->second;
+			if (inds)
+				inds->insert(csSet.begin(), csSet.end());
+			return (unsigned)csSet.size();
+			}
+		}
+	return 0;
+	}
+
+
+/// returns the number of indices added (will generate an NxsException if the name is neither a set name or a number).
+unsigned NxsLabelToIndicesMapper::GetIndicesFromSetOrAsNumber(const std::string &label,
+  NxsUnsignedSet *inds,
+  const NxsUnsignedSetMap & itemSets,
+  const unsigned maxInd,
+  const char * itemType) /* "tree", "character"... */
+	{
+	unsigned n = GetIndicesFromSets(label, inds, itemSets);
+	if (n > 0)
+		return n;
+	long i;
+	if (!NxsString::to_long(label.c_str(), &i))
+		{
+		NxsString emsg;
+		emsg << "Expecting a  number or " << itemType << " label, found " <<  label;
+		throw NxsException(emsg);
+		}
+	if (!NxsLabelToIndicesMapper::allowNumberAsIndexPlusOne)
+		{
+		NxsString emsg;
+		emsg << "Numbers are not to be used as labels to indicate " << itemType << " indices, but " << label << " was encountered.";
+		throw NxsException(emsg);		
+		}
+	i--;
+	if (i > (long)maxInd  || i < 0)
+		{
+		NxsString emsg = "Expecting a ";
+		emsg << itemType << " name or a number corresponding to a " << itemType << "\'s number (a number from 1 to ";
+		emsg << maxInd + 1 << "). Found " << label;
+		throw NxsException(emsg);
+		}
+	unsigned asu = (unsigned) (i);
+	if (inds)
+		inds->insert(asu);
+	return 1;
+	}
+
+void NxsBlock::WarnDangerousContent(const std::string &s, const NxsToken &token)
+	{
+	if (nexusReader)
+		nexusReader->NexusWarnToken(s, NxsReader::PROBABLY_INCORRECT_CONTENT_WARNING, token);
+	else
+		throw NxsException(s, token);
+	}
+
+void NxsBlock::WarnDangerousContent(const std::string &s, const ProcessedNxsToken &token)
+	{
+	if (nexusReader)
+		nexusReader->NexusWarnToken(s, NxsReader::PROBABLY_INCORRECT_CONTENT_WARNING, token);
+	else
+		throw NxsException(s, token);
+	}
+void NxsBlock::SkipCommand(NxsToken & token)
+	{
+	if (nexusReader)
+		{
+		errormsg = "Skipping command: ";
+		errormsg << token.GetTokenReference();
+		nexusReader->NexusWarnToken(errormsg, NxsReader::SKIPPING_CONTENT_WARNING, token);
+		errormsg.clear();
+		}
+	if (!token.Equals(";"))
+		SkippingCommand(token.GetToken());
+	if (storeSkippedCommands)
+		{
+		ProcessedNxsCommand pnc;
+		token.ProcessAsCommand(&pnc);
+		skippedCommands.push_back(pnc);
+		}
+	else
+		token.ProcessAsCommand(NULL);
+	}
+
+void NxsBlock::WriteSkippedCommands(std::ostream & out) const
+	{
+	for (list<ProcessedNxsCommand>::const_iterator cIt = skippedCommands.begin(); cIt != skippedCommands.end(); ++cIt)
+		{
+		if (WriteCommandAsNexus(out, *cIt))
+			out << '\n';
+		}
+
+	}
+
+
+
+/*!
+	Hook to consolidate the handling of COMMANDS that are common to all blocks (TITLE, BLOCKID, END, ENDBLOCK -- and,
+		evenually, LINK).
+	HandleXYZ() where XYZ is the command name is then called.
+	Returns NxsCommandResult(HANDLED_COMMAND), NxsCommandResult(HANDLED_COMMAND), or NxsCommandResult(UNKNOWN_COMMAND)
+		to tell the caller whether the command was recognized.
+*/
+NxsBlock::NxsCommandResult NxsBlock::HandleBasicBlockCommands(NxsToken & token)
+	{
+	if (token.Equals("TITLE"))
+		{
+		HandleTitleCommand(token);
+		return NxsBlock::NxsCommandResult(HANDLED_COMMAND);
+		}
+	if (false && token.Equals("BLOCKID")) /*now we are skipping this to put it at the end of blocks*/
+		{
+		HandleBlockIDCommand(token);
+		return NxsBlock::NxsCommandResult(HANDLED_COMMAND);
+		}
+	if (token.Equals("LINK") && this->ImplementsLinkAPI())
+		{
+		HandleLinkCommand(token);
+		return NxsBlock::NxsCommandResult(HANDLED_COMMAND);
+		}
+	if (token.Equals("END") || token.Equals("ENDBLOCK"))
+		{
+		HandleEndblock(token);
+		return NxsBlock::NxsCommandResult(STOP_PARSING_BLOCK);
+		}
+	return NxsBlock::NxsCommandResult(UNKNOWN_COMMAND);
+	}
+
+/*!
+	Stores the next token as the this->title field.
+*/
+void NxsBlock::HandleTitleCommand(NxsToken & token)
+	{
+	token.GetNextToken();
+	if (token.Equals(";"))
+		GenerateUnexpectedTokenNxsException(token, "a title for the block");
+	if (!title.empty() && nexusReader)
+		{
+		errormsg = "Multiple TITLE commands were encountered the title \"";
+		errormsg += title;
+		errormsg += "\" will be replaced by \"";
+		errormsg += token.GetToken() ;
+		errormsg += '\"';
+		nexusReader->NexusWarnToken(errormsg, NxsReader::OVERWRITING_CONTENT_WARNING, token);
+		errormsg.clear();
+		}
+	title = token.GetToken();
+	/* i19 */ /*v2.1to2.2 19 */
+	autoTitle = false;
+	DemandEndSemicolon(token, "TITLE");
+	}
+
+/*!
+	Stores the next token as the this->blockid field.
+*/
+void NxsBlock::HandleBlockIDCommand(NxsToken & token)
+	{
+	token.GetNextToken();
+	if (token.Equals(";"))
+		GenerateUnexpectedTokenNxsException(token, "an id for the block");
+	blockIDString = token.GetToken();
+	DemandEndSemicolon(token, "BLOCKID");
+	}
+
+/*!
+	The LINK command was invented for use in Mesquite where multiple instances of a particular type of data-containing
+	block are allowed. The NEXUS specification does not discuss the correct behavior in such cases.
+
+	Some of the problems caused by failing to specify how multiple data-containing block should be handled can
+	be avoided by explicitly linking blocks. For instance a CHARACTERS block may have a "LINK taxa=TaxaBlockTitle;"
+	to indicate which block of taxa it uses.
+
+	The NxsBlock version merely raises a NxsUnimplementedException.
+
+	Before version 2.1 Links between blocks were "off" by default (see below)
+	In version 2.1, the block scoping was made more robust, so the Link API was
+	enabled for all factory-created blocks in the commonly-used PublicNexusReader.
+	In 2.1 and greater it is safe to call SetImplementsLinkAPI(true) on any block (as far as we know).
+
+LINK API in NCL version > 2.0.04 and < 2.1
+	NCL versions after 2.0.04 will support for LINK for the public blocks, but will have the functionality
+		turned off by default (for backwards-compatibility).  When turned-off, LINK commands will be skipped.
+		Calling SetImplementsLinkAPI(true) on an instance will enable the use of the HandleLinkCommand() and
+		WriteLinkCommand()
+
+	HandleLinkCommand should be a pure virtual function, but implementing it that way would break old code that uses
+		NCL.  Instead the ImplementsLinkAPI/SetImplementsLinkAPI mechanism was invented.
+		NCL components will only call HandleLinkCommand() or WriteLinkCommand() if ImplementsLinkAPI() returns true.
+		For backward compatibility default all blocks have linkAPI=false.
+
+	Client code should always call ImplementsLinkAPI() to check whether HandleLinkCommand() or WriteLinkCommand()
+		are available.  Failure to do this may result in NxsUnimplementedException() being called.
+*/
+void NxsBlock::HandleLinkCommand(NxsToken & )
+	{
+	throw NxsUnimplementedException("NxsBlock::HandleLinkCommand");
+	}
+/*!
+
+*/
+void NxsBlock::WriteBasicBlockCommands(std::ostream &out) const
+	{
+	WriteTitleCommand(out);
+	WriteBlockIDCommand(out);
+	if (this->ImplementsLinkAPI())
+		WriteLinkCommand(out);
+	}
+
+/*!
+	Initializes all pointer data members to NULL, and all bool data members to true except isUserSupplied, which is
+	initialized to false.
+*/
+NxsBlock::NxsBlock()
+	:isEmpty(true),
+	isEnabled(true),
+	isUserSupplied(false),
+	nexusReader(NULL),
+	next(NULL),
+	linkAPI(false),
+	storeSkippedCommands(true)
+	{
+	}
+
+
+/*!
+	Raises an exception if it is not an equals sign.
+
+ 	Sets errormsg and raises a NxsException on failure.
+	`contextString` is used in error messages:
+		"Expecting '=' ${contextString} but found..."
+*/void NxsBlock::DemandIsAtEquals(NxsToken &token, const char *contextString) const
+	{
+	if (!token.Equals("="))
+		{
+		errormsg = "Expecting '=' ";
+		if (contextString)
+			errormsg.append(contextString);
+		errormsg << " but found " << token.GetToken() << " instead";
+		throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+		}
+	}
+
+void NxsBlock::DemandEquals(ProcessedNxsCommand::const_iterator & tokIt, const ProcessedNxsCommand::const_iterator & endIt, const char *contextString) const
+	{
+	++tokIt;
+	if (tokIt == endIt)
+		{
+		errormsg = "Expecting '=' ";
+		if (contextString)
+			errormsg.append(contextString);
+		errormsg << " but found ; instead";
+		--tokIt;
+		throw NxsException(errormsg, *tokIt);
+		}
+	if (!tokIt->Equals("="))
+		{
+		errormsg = "Expecting '=' ";
+		if (contextString)
+			errormsg.append(contextString);
+		errormsg << " but found " << tokIt->GetToken() << " instead";
+		throw NxsException(errormsg, *tokIt);
+		}
+	}
+
+
+/*!
+ throws a NxsException with the token info for `token`
+ `expected` should fill in the phrase "Expecting ${expected}, but found..."
+ expected can be NULL.
+
+ Sets this->errormsg
+*/
+void NxsBlock::GenerateNxsException(NxsToken &token, const char *message) const
+	{
+	if (message)
+		errormsg = message;
+	throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+	}
+
+/*!
+ throws a NxsException with the token info for `token`
+ `expected` should fill in the phrase "Expecting ${expected}, but found..."
+ expected can be NULL.
+
+ Sets this->errormsg
+*/
+void NxsBlock::GenerateUnexpectedTokenNxsException(NxsToken &token, const char *expected) const
+	{
+	errormsg = "Unexpected token";
+	if (expected)
+		{
+		errormsg += ". Expecting ";
+		errormsg += expected;
+		errormsg += ", but found: ";
+		}
+	else
+		{
+		errormsg += ": ";
+		}
+	errormsg += token.GetToken();
+	throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+	}
+
+
+
+/*!
+	Called when the END or ENDBLOCK command needs to be parsed from within a block.
+ 	Basically just checks to make sure the next token in the data file is a semicolon.
+*/
+void NxsBlock::HandleEndblock(
+  NxsToken &token)	/* the token used to read from in */
+	{
+	DemandEndSemicolon(token, "END or ENDBLOCK");
+	}
+
+/*!
+	Nothing to be done.
+*/
+NxsBlock::~NxsBlock()
+	{
+	if (nexusReader)
+		nexusReader->Detach(this);
+	}
+
+/*! This base class version simply returns 0 but a derived class should override this function if it needs to construct
+	and run a NxsSetReader object to read a set involving characters. The NxsSetReader object may need to use this
+	function to look up a character label encountered in the set. A class that overrides this method should return the
+	character index in the range [1..nchar].
+*/
+unsigned NxsBlock::CharLabelToNumber(
+  NxsString) NCL_COULD_BE_CONST /* the character label to be translated to the character's number */ /*v2.1to2.2 1 */
+	{
+	return 0;
+	}
+
+/*!
+	Sets the value of isEnabled to false. A NxsBlock can be disabled (by calling this method) if blocks of that type
+	are to be skipped during execution of the NEXUS file. If a disabled block is encountered, the virtual
+	NxsReader::SkippingDisabledBlock function is called, giving your application the opportunity to inform the user
+	that a block was skipped.
+*/
+void NxsBlock::Disable()
+	{
+	isEnabled = false;
+	}
+
+/*!
+	Sets the value of isEnabled to true. A NxsBlock can be disabled (by calling Disable) if blocks of that type are to
+	be skipped during execution of the NEXUS file. If a disabled block is encountered, the virtual
+	NxsReader::SkippingDisabledBlock function is called, giving your application the opportunity to inform the user
+	that a block was skipped.
+*/
+void NxsBlock::Enable()
+	{
+	isEnabled = true;
+	}
+
+/*!
+	Returns value of isEnabled, which can be controlled through use of the Enable and Disable member functions. A
+	NxsBlock should be disabled if blocks of that type are to be skipped during execution of the NEXUS file. If a
+	disabled block is encountered, the virtual NxsReader::SkippingDisabledBlock function is called, giving your
+	application the opportunity to inform the user that a block was skipped.
+*/
+bool NxsBlock::IsEnabled() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+	{
+	return isEnabled;
+	}
+
+/*!
+	Returns value of isUserSupplied, which is true if and only if this block's Read function is called to process a
+	block of this type appearing in a data file. This is useful because in some cases, a block object may be created
+	internally (e.g. a NxsTaxaBlockAPI may be populated using taxon names provided in a DATA block), and such blocks do
+	not require permission from the user to delete data stored therein.
+*/
+bool NxsBlock::IsUserSupplied() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+	{
+	return isUserSupplied;
+	}
+
+/*!
+	Returns true if Read function has not been called since the last Reset. This base class version simply returns the
+	value of the data member isEmpty. If you derive a new block class from NxsBlock, be sure to set isEmpty to true in
+	your Reset function and isEmpty to false in your Read function.
+*/
+bool NxsBlock::IsEmpty() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+	{
+	return isEmpty;
+	}
+
+/*!
+	Returns the `NCL_BLOCKTYPE_ATTR_NAME` NxsString.  \ref BlockTypeIDDiscussion
+*/
+NxsString NxsBlock::GetID() const
+	{
+	return NCL_BLOCKTYPE_ATTR_NAME;
+	}
+
+/*!
+	This virtual function must be overridden for each derived class to provide the ability to read everything following
+	the block name (which is read by the NxsReader object) to the end or endblock statement. Characters are read from
+	the input stream 'in'. Note that to get output comments displayed, you must derive a class from NxsToken, override
+	the member function OutputComment to display a supplied comment, and then pass a reference to an object of the
+	derived class to this function.
+*/
+void NxsBlock::Read(
+  NxsToken &)	/* the NxsToken to use for reading block */
+	{
+	}
+
+/*!
+	This virtual function should be overridden for each derived class to completely reset the block object in
+	preparation for reading in another block of this type. This function is called by the NxsReader object just prior to
+	calling the block object's Read function.
+*/
+void NxsBlock::Reset()
+	{
+	title = std::string();
+	/* i19 */ /*v2.1to2.2 19 */
+	autoTitle = false;
+	// Reset base class data members that could have changed
+	//
+	errormsg.clear();
+	isEnabled      = true;
+	isEmpty        = true;
+	isUserSupplied = false;
+	skippedCommands.clear();
+
+	}
+
+/*!
+	This virtual function provides a brief report of the contents of the block.
+*/
+void NxsBlock::Report(
+  std::ostream &) NCL_COULD_BE_CONST /* the output stream to which the report is sent */ /*v2.1to2.2 1 */
+	{
+	}
+
+/*!
+	This function is called when an unknown command named commandName is about to be skipped. This version of the
+	function does nothing (i.e., no warning is issued that a command was unrecognized). Override this virtual function
+	in a derived class to provide such warnings to the user.
+*/
+void NxsBlock::SkippingCommand(
+  NxsString )	/* the name of the command being skipped */
+	{
+	}
+
+/*!
+	This base class version simply returns 0, but a derived class should override this function if it needs to construct
+	and run a NxsSetReader object to read a set involving taxa. The NxsSetReader object may need to use this function to
+	look up a taxon label encountered in the set. A class that overrides this method should return the taxon index in
+	the range [1..ntax].
+*/
+unsigned NxsBlock::TaxonLabelToNumber(
+  NxsString ) const /* the taxon label to be translated to a taxon number */
+	{
+	return 0;
+	}
+
+/*!
+	Returns a vector of Blocks that were created by the reading in of this block (the prototypical case is the taxa block
+	that is implied by a data block).
+*/
+VecBlockPtr	NxsBlock::GetImpliedBlocks()
+	{
+	return VecBlockPtr();
+	}
+
+/*!
+	Returns a vector of Blocks that were created by the reading in of this block (the prototypical case is the taxa block
+	that is implied by a data block).
+*/
+VecConstBlockPtr NxsBlock::GetImpliedBlocksConst() const
+	{
+	return VecConstBlockPtr();
+	}
+
+/*!
+	Should returns a  new instance (deep copy) of the same type of block with the same state.
+	Note the NxsReader field should not be cloned (it should be aliased).
+
+	NxsBlock version throws NxsUnimplementedException (in future versions of NCL this will be a pure virtual.
+
+	NxsBlocks are expected to clone their linked blocks, but memo is passed in to avoid double cloning of shared references.
+	memo is an mapper of an old block to a new instance (used when groups of blocks are being cloned).
+*/
+NxsBlock * NxsBlock::CloneBlock(
+  NxsBlockMapper & /// memo is an mapper of an old block to a new instance (used when groups of blocks are being cloned)
+  ) const
+	{
+	throw NxsUnimplementedException(NxsString("CloneBlock"));
+	}
+
+/*!
+	Should serialize the content of the block as NEXUS.
+	NxsBlock version throws NxsUnimplementedException (in future versions of NCL this will be a pure virtual.
+*/
+void NxsBlock::WriteAsNexus(std::ostream &) const
+	{
+	throw NxsUnimplementedException(NxsString("NxsBlock::WriteAsNexus"));
+	}
+
+void NxsBlock::WriteTitleCommand(std::ostream &out) const
+	{
+	const std::string &t = this->GetInstanceName();
+	if (t.length() > 0)
+		out << "    TITLE " << NxsString::GetEscaped(t) << ";\n";
+	}
+
+void NxsBlock::WriteBlockIDCommand(std::ostream &out) const
+	{
+	const std::string & t = this->blockIDString;
+	if (t.length() > 0)
+		out << "    BLOCKID " << NxsString::GetEscaped(t) << ";\n";
+	}
+
+/*!
+	Should write the LINK command to out.
+	NxsBlock versio merely raises NxsUnimplementedException.
+	See notes on HandleLinkCommand.
+*/
+void NxsBlock::WriteLinkCommand(std::ostream &) const
+	{
+	throw NxsUnimplementedException("NxsBlock::WriteLinkCommand");
+	}
+
+std::string GetBlockIDTitleString(NxsBlock &b)
+	{
+	const std::string &t = b.GetInstanceName();
+	std::string r = b.GetID();
+	r.append(" block");
+	if (t.length() > 0)
+		{
+		r.append(" (");
+		r.append(t);
+		r.append(")");
+		}
+	return r;
+	}
+
+/*!
+	Accessor to "linkAPI" field. See notes on HandleLinkCommand.
+*/
+bool NxsBlock::ImplementsLinkAPI() const
+	{
+	return this->linkAPI;
+	}
+
+/*!
+	Should be called with SetImplementsLinkAPI(true) by all blocks that overload both:
+		HandleLinkCommand() and
+		WriteLinkCommand()
+	and that want LINK to be dealt with as a Basic block command.
+	See notes on HandleLinkCommand.
+*/
+void NxsBlock::SetImplementsLinkAPI(bool v)
+	{
+	this->linkAPI = v;
+	}
+/*!
+	Advances the token, and returns the unsigned int that the token represents
+
+ 	Sets errormsg and raises a NxsException on failure.
+	`contextString` is used in error messages:
+		"${contextString} must be a number greater than 0"
+*/
+unsigned NxsBlock::DemandPositiveInt(NxsToken &token, const char *contextString) const
+	{
+	return NxsToken::DemandPositiveInt(token, this->errormsg, contextString);
+	}
+
+void NxsBlock::DemandEndSemicolon(NxsToken &token, const char *contextString) const
+	{
+	NxsToken::DemandEndSemicolon(token, this->errormsg, contextString);
+	}
+
diff --git a/lib/ncl-2.1.18/ncl/nxsblock.h b/lib/ncl-2.1.18/ncl/nxsblock.h
new file mode 100644
index 0000000..04a2541
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsblock.h
@@ -0,0 +1,366 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+#ifndef NCL_NXSBLOCK_H
+#define NCL_NXSBLOCK_H
+
+#include <vector>
+#include "ncl/nxsdefs.h"
+#include "ncl/nxsexception.h"
+#include "ncl/nxstoken.h"
+
+class NxsReader;
+class NxsBlock;
+class NxsTaxaBlockAPI;
+
+typedef std::vector<NxsBlock *> VecBlockPtr;
+typedef std::vector<const NxsBlock *> VecConstBlockPtr;
+typedef std::pair<const NxsBlock *, std::string> BlockUniqueID;
+typedef std::map<BlockUniqueID, NxsBlock *> NxsBlockMapper;
+
+
+
+/*! This is the base class for the block interfaces that correspond to blocks
+that hold ordered lists (TAXA, CHARACTERS, TREES).
+
+	This interface is used internally during parsing, and is usually NOT
+	called directly by client code.
+*/
+class NxsLabelToIndicesMapper
+	{
+	public:
+		virtual ~NxsLabelToIndicesMapper(){}
+		virtual unsigned GetMaxIndex() const = 0;
+		virtual unsigned GetNumLabelsCurrentlyStored() const {return GetMaxIndex();}
+		/* Adds the 0-based indices corresponding to a label to the set.
+
+		 \returns the number of indices that correspond to the label (and the number
+		 of items that would be added to *inds if inds points to an empty set).
+		*/
+		virtual unsigned GetIndicesForLabel(const std::string &label, /* label, set name or string with the 1-based numeric representation of the object */
+											NxsUnsignedSet *inds /* The set of indices to add the taxa indices to (can be 0L). */
+											) const = 0;
+		/* Confusingly named function.
+			This function looks for the index set than is named `label` in the NxsLabelToIndicesMapper
+			It adds the indices from this set into `toFill` (if toFill is not NULL).
+			\returns the size of the set which was named label (the number of indices that were inserted).
+		*/
+		virtual unsigned GetIndexSet(const std::string &label, NxsUnsignedSet * toFill) const = 0;
+		/* Adds set `inds` to the collection of sets and gives it the name `label`
+			\returns true if the set replaced an existing set (in this case a warning will be issued - which can generate an NxsException, if the client code wants warning to generate exceptions).
+		*/
+		virtual bool AddNewIndexSet(const std::string &label, const NxsUnsignedSet & inds) = 0;
+		/* Adds partition `inds` to the collection of partition and gives it the name `label`
+			\returns true if the set replaced an existing partition (in this case a warning will be issued - which can generate an NxsException, if the client code wants warning to generate exceptions).
+		*/
+		virtual bool AddNewPartition(const std::string &label, const NxsPartition & inds) = 0;
+
+		/* Adds a new label to the collection of valid labels
+			AppendNewLabel is only overloaded in Taxa and State LabelToIndexMappers, all other
+			NxsLabelToIndicesMapper instances \throw NxsUnimplementedException
+		*/
+		virtual unsigned AppendNewLabel(std::string &/*label*/)
+			{
+			throw NxsUnimplementedException("AppendNewLabel called on fixed label interface");
+			}
+		static bool allowNumberAsIndexPlusOne;
+	protected:
+		static unsigned GetIndicesFromSets(const std::string &label, NxsUnsignedSet *inds, const NxsUnsignedSetMap & itemSets);
+		static unsigned GetIndicesFromSetOrAsNumber(const std::string &label, NxsUnsignedSet *inds, const NxsUnsignedSetMap & itemSets, const unsigned maxInd, const char * itemType);
+	};
+
+class NxsSetVectorItemValidator;
+
+std::string GetBlockIDTitleString(NxsBlock &);
+/*!
+	This is the base class from which all block classes are derived. A NxsBlock-derived class encapsulates a Nexus block
+	(e.g. DATA block, TREES block, etc.). The abstract virtual function Read must be overridden for each derived class
+	to provide the ability to read everything following the block name (which is read by the NxsReader object) to the
+	end or endblock statement. Derived classes must provide their own data storage and access functions. The abstract
+	virtual function Report must be overridden to provide some feedback to user on contents of block. The abstract
+	virtual function Reset must be overridden to empty the block of all its contents, restoring it to its
+	just-constructed state.
+*/
+class NxsBlock
+	{
+	friend class NxsReader;
+		/* i20 */ /*v2.1to2.2 20 */
+	public:
+		enum NxsBlockLinkStatus
+			{
+			BLOCK_LINK_UNINITIALIZED = 	       0x00,
+			BLOCK_LINK_UNKNOWN_STATUS =        0x01, /*backwards compatibility, this is the status of old block links*/
+			BLOCK_LINK_TO_ONLY_CHOICE =        0x02,
+			BLOCK_LINK_TO_MOST_RECENT =        0x04,
+			BLOCK_LINK_TO_IMPLIED_BLOCK =      0x08,
+			BLOCK_LINK_FROM_LINK_CMD =         0x10,
+			BLOCK_LINK_EQUIVALENT_TO_IMPLIED = 0x20,
+			BLOCK_LINK_UNUSED_MASK =           0x3F,
+			BLOCK_LINK_USED =                  0x40
+			};
+		enum NxsCommandResult
+			{
+			STOP_PARSING_BLOCK,
+			HANDLED_COMMAND,
+			UNKNOWN_COMMAND
+			};
+							NxsBlock();
+		virtual				~NxsBlock();
+
+		virtual void SetNexus(NxsReader *nxsptr);
+		NxsReader *GetNexus() const;
+		virtual bool CanReadBlockType(const NxsToken & token)
+			{
+			return token.Equals(NCL_BLOCKTYPE_ATTR_NAME);
+			}
+
+		NxsString			GetID() const;
+		bool				IsEmpty() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+
+		void				Enable();
+		void				Disable();
+		bool				IsEnabled() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		bool				IsUserSupplied() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+
+		virtual unsigned	CharLabelToNumber(NxsString s) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		virtual unsigned	TaxonLabelToNumber(NxsString s) const;
+
+		virtual void		SkippingCommand(NxsString commandName);
+
+		virtual void		HandleBlockIDCommand(NxsToken &token);
+		virtual void		HandleEndblock(NxsToken &token);
+		virtual void		HandleLinkCommand(NxsToken &token);
+		virtual void		HandleTitleCommand(NxsToken &token);
+
+		virtual void		Report(std::ostream &out) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		virtual void		Reset();
+
+		mutable NxsString	errormsg;			/* workspace for creating error messages */
+
+
+		virtual VecBlockPtr GetImpliedBlocks();
+		virtual VecConstBlockPtr	GetImpliedBlocksConst() const;
+		BlockUniqueID		GetInstanceIdentifier() const
+			{
+			return BlockUniqueID(this, GetInstanceName());
+			}
+		/* i21 */ /*v2.1to2.2 21 */
+		const std::string  &GetInstanceName() const
+			{
+			return title;
+			}
+		virtual NxsBlock			*CloneBlock(NxsBlockMapper &memo) const;
+		bool				ImplementsLinkAPI() const;
+		void				SetImplementsLinkAPI(bool v);
+
+		virtual void				WriteAsNexus(std::ostream &out) const;
+		virtual void 				WriteBlockIDCommand(std::ostream &out) const;
+		virtual void 				WriteLinkCommand(std::ostream &out) const;
+		virtual void 				WriteTitleCommand(std::ostream &out) const;
+		std::string GetTitle() const
+			{
+			return title;
+			}
+		void SetTitle(const std::string &t, bool autogeneratedTitle)
+			{
+			title = t;
+			/* i19 */ /*v2.1to2.2 19 */
+			autoTitle = autogeneratedTitle;
+			}
+		bool IsAutoGeneratedTitle() const
+			{
+			return autoTitle;
+			}
+		void StoreSkippedCommands(bool v)
+			{
+			storeSkippedCommands = v;
+			}
+		void ClearStoredSkippedCommands()
+			{
+			skippedCommands.clear();
+			}
+
+		/*----------------------------------------------------------------------------------------
+		| Copies all NxsBlock fields - execept  the `nexusReader` and `next` pointers.
+		|	Aliasing of Block pointers results in very dangerous implication of copying for
+		|	many subclasses of NxsBlock.
+		| Copying of blocks should be restricted to empty blocks without linkages (e.g.
+		|	the CloneFactory mechanism requires some form of copy, but should typically be used with
+		|	empty blocks.
+		*/
+
+		virtual void CopyBaseBlockContents(const NxsBlock &other)
+			{
+			errormsg = other.errormsg;
+			isEmpty = other.isEmpty;
+			isEnabled = other.isEnabled;
+			isUserSupplied = other.isUserSupplied;
+			NCL_BLOCKTYPE_ATTR_NAME = other.NCL_BLOCKTYPE_ATTR_NAME;
+			title = other.title;
+			/* i19 */ /*v2.1to2.2 19 */
+			blockIDString = other.blockIDString;
+			linkAPI = other.linkAPI;
+			storeSkippedCommands = other.storeSkippedCommands;
+			skippedCommands = other.skippedCommands;
+			autoTitle = other.autoTitle;
+			}
+
+		virtual NxsBlock * Clone() const
+			{
+			NxsBlock * b = new NxsBlock();
+			b->CopyBaseBlockContents(*this);
+			b->nexusReader = NULL;
+			b->next = NULL;
+			return b;
+			}
+
+		unsigned			ReadVectorPartitionDef(NxsPartition &np, NxsLabelToIndicesMapper &ltm, const std::string & partName, const char * ptype, const char * cmd, NxsToken & token, bool warnAsterisked, bool demandAllInds, NxsSetVectorItemValidator & v);
+		void 				ReadPartitionDef(NxsPartition &np, NxsLabelToIndicesMapper &ltm, const std::string & partName, const char * ptype, const char * cmd, NxsToken & token, bool warnAsterisked, bool demandAllInds, bool storeAsPartition);
+		virtual bool		TolerateEOFInBlock() const
+			{
+			return false;
+			}
+		void 				WarnDangerousContent(const std::string &s, const NxsToken &t);
+		void 				WarnDangerousContent(const std::string &s, const ProcessedNxsToken &t);
+
+		void				WriteBasicBlockCommands(std::ostream & out) const;
+		virtual void		WriteSkippedCommands(std::ostream & out) const;
+		// used internally to deal with multiple blocks spawning the same TAXA block
+		virtual bool 		SwapEquivalentTaxaBlock(NxsTaxaBlockAPI * )
+		{
+			return false;
+		}
+		/*! This is the argument from the BLOCKID command.  It should be unique, but
+			that is dependent on the file being valid (NCL does not verify uniqueness).
+
+			This is not the ID used to identify block type. \ref BlockTypeIDDiscussion
+		*/
+		std::string GetBlockIDCommandString() const { return blockIDString; }
+	protected:
+		void				SkipCommand(NxsToken & token);
+
+		NxsCommandResult	HandleBasicBlockCommands(NxsToken & token);
+		void				DemandEndSemicolon(NxsToken &token, const char *contextString) const;
+		void				DemandEquals(NxsToken &token, const char *contextString) const;
+		void				DemandEquals(ProcessedNxsCommand::const_iterator &tokIt, const ProcessedNxsCommand::const_iterator & endIt, const char *contextString) const ;
+		void				DemandIsAtEquals(NxsToken &token, const char *contextString) const;
+		unsigned 			DemandPositiveInt(NxsToken &token, const char *contextString) const;
+		void				GenerateNxsException(NxsToken &token, const char *message = NULL) const;
+		void				GenerateUnexpectedTokenNxsException(NxsToken &token, const char *expected = NULL) const;
+		bool				isEmpty;			/* true if this object is currently storing data */
+		bool				isEnabled;			/* true if this block is currently ebabled */
+		bool				isUserSupplied;		/* true if this object has been read from a file; false otherwise */
+		NxsReader			*nexusReader;		/* pointer to the Nexus file reader object */
+		NxsBlock			*next;				/* DEPRECATED field pointer to next block in list */
+		NxsString			NCL_BLOCKTYPE_ATTR_NAME;					/* holds name of block (e.g., "DATA", "TREES", etc.) \ref BlockTypeIDDiscussion */
+		std::string			title;				/* holds the title of the block empty by default */
+		std::string 		blockIDString; 		/* Mesquite generates these. I don't know what they are for */
+		bool				linkAPI;
+		bool				autoTitle;			/* true if the title was generated internally*/
+		bool				storeSkippedCommands;
+		std::list<ProcessedNxsCommand> skippedCommands; /* commands accumulate by SkipCommand or by some other means */
+
+		virtual void		Read(NxsToken &token);
+		/* i22 */ /*v2.1to2.2 22 */
+		private:
+			NxsBlock &operator=(const NxsBlock &other); /*intentionally not defined because of aliasing issues */
+
+	};
+
+/*! This abstract class defines the interface for a factory that can generate NxsBlocks.
+
+	When the NxsReader::Execute() method encounters a block that it needs to handle, it will first check the registered "singelton"
+		blocks (a block that has been added to it using NxsReader::Add(), those NxsBlock instances are recycled).
+		If no singleton block says that it can read that block of NEXUS (see NxsBlock::CanReadBlockType()), then the NxsReader
+		will walk through its list of factories calling NxsBlockFactory::GetBlockReaderForID() for each until it gets a
+		non-NULL pointer.
+
+	If there is an exception during the parsing of that block BlockError will be called for the factory instance that generated the block
+
+	If the block returns "false" from NxsBlock::IsEnabled() method, then BlockSkipped will be called by the NxsReader using
+		 the factory instance that generated the block
+
+	Blocks generated by factories but used successfully in a parse have to be deleted by the client code (See \ref memoryManagement discussion).
+
+*/
+class NxsBlockFactory
+	{
+	public:
+		virtual ~NxsBlockFactory()
+			{
+			}
+		/*! \returns a NxsBlock instance with NxsBlock::Read method that is capable of parsing a NEXUS block of type `NCL_BLOCKTYPE_ATTR_NAME`
+		*/
+		virtual NxsBlock  *	GetBlockReaderForID(const std::string & NCL_BLOCKTYPE_ATTR_NAME, /*!< The type of block that needs to be read see \ref BlockTypeIDDiscussion */
+												NxsReader *reader,  /*!< a pointer to the NxsReader controlling the parse. Can be NULL. Usually not needed for an implementation of this method */
+												NxsToken *token  /*!< a pointer to the NxsToken that is generating token. Can be NULL. Usually not needed for an implementation of this method */
+												) = 0;
+
+		/*! base-class implementation deletes the block (the NxsReader will not retain a reference to the block, so failing to delete can
+			lead to memory leaks if you do not have some fancy memory management scheme).
+
+			If there is an exception during the parsing of that block BlockError will be called for the factory instance that generated the block
+		*/
+		virtual void		BlockError(NxsBlock *b)
+			{
+			delete b;
+			}
+		/*! base-class implementation deletes the block (the NxsReader will not retain a reference to the block, so failing to delete can
+			lead to memory leaks if you do not have some fancy memory management scheme).
+
+		If the block returns "false" from NxsBlock::IsEnabled() method, then BlockSkipped will be called by the NxsReader using
+			 the factory instance that generated the block
+		*/
+		virtual void BlockSkipped(NxsBlock *b)
+			{
+			delete b;
+			}
+	};
+
+/*!
+	Sets the nexusReader data member of the NxsBlock object to 'nxsptr'.
+*/
+inline void NxsBlock::SetNexus(
+  NxsReader *nxsptr)	/* pointer to a NxsReader object */
+	{
+	nexusReader = nxsptr;
+	}
+/*!
+	Gets the nexusReader data member of the NxsBlock object to 'nxsptr'.
+*/
+inline NxsReader * NxsBlock::GetNexus() const
+	{
+	return nexusReader;
+	}
+
+
+/*!
+	Advances the token, and raise an exception if it is not an equals sign.
+
+ 	Sets errormsg and raises a NxsException on failure.
+	`contextString` is used in error messages:
+		"Expecting '=' ${contextString} but found..."
+*/
+inline void NxsBlock::DemandEquals(NxsToken &token, const char *contextString) const
+	{
+	token.GetNextToken();
+	DemandIsAtEquals(token, contextString);
+	}
+#endif
+
+
diff --git a/lib/ncl-2.1.18/ncl/nxsblock.lo b/lib/ncl-2.1.18/ncl/nxsblock.lo
new file mode 100644
index 0000000..ca2333d
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsblock.lo
@@ -0,0 +1,12 @@
+# nxsblock.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nxsblock.o'
+
+# Name of the non-PIC object
+non_pic_object='nxsblock.o'
+
diff --git a/lib/ncl-2.1.18/ncl/nxscdiscretematrix.h b/lib/ncl-2.1.18/ncl/nxscdiscretematrix.h
new file mode 100644
index 0000000..0bfa147
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxscdiscretematrix.h
@@ -0,0 +1,113 @@
+//	Copyright (C) 2008 Mark Holder
+//
+//	This file is part of NCL (Nexus Class Library) version 2.1
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+// This code is based on code developed by Mark Holder for the CIPRES project
+
+#if !defined(NXS_C_DISCRETE_MATRIX_H)
+#define NXS_C_DISCRETE_MATRIX_H
+
+
+#if defined (HAVE_CONFIG_H)
+#	include <config.h>
+#endif
+
+#if defined(_MSC_VER)
+#	undef	HAVE_COMPILE_TIME_DISPATCH
+#else
+#	define HAVE_COMPILE_TIME_DISPATCH
+#endif
+
+/* For typedefs like uint8_t */
+#if HAVE_INTTYPES_H
+#	include <inttypes.h>
+#elif HAVE_STDINT_H
+#	include <stdint.h>
+#elif defined(_MSC_VER) && _MSC_VER >= 1200
+#	include <basetsd.h>
+	typedef   INT8 int8_t;
+	typedef  UINT8 uint8_t;
+	typedef  INT64 int64_t;
+	typedef UINT64 uint64_t;
+#elif defined(_MSC_VER)
+	typedef signed char int8_t;
+	typedef unsigned char uint8_t;
+	typedef long long int64_t;
+	typedef unsigned long long uint64_t;
+#elif defined(_WIN32)
+#	include <stdint.h>
+#endif
+
+	/* For size_t */
+#if defined(HAVE_STDDEF_H)
+#	include <stddef.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+typedef int8_t NxsCDiscreteState_t; /** type used to enumerate possible states.
+								-1 is used for gaps, other negative flags may be added later.
+								This size limits the maximum number of states allowed. */
+typedef int8_t NxsCDiscreteStateSet; /** type used to refer to unique combinations of states (the "fundamental" states and ambiguity codes)
+								-1 is used for gaps.  To handle all possible data sets, this must be large enough to hold
+								2^(nStates + 1) values if the datatype allows gaps.  Thus using int8_t limits us to 8 states */
+
+/*
+The following enum is a cropping of the NxsCharactersBlock::DataTypesEnum
+which includes all of the datatypes (and only those) that can be expressed
+in a NxsCDiscreteMatrix. Each of the enum facets will have the same
+value as in  NxsCharactersBlock::DataTypesEnum.
+
+This enum is also handy because it is accessible via C.
+*/
+typedef enum {
+			  NxsAltGeneric_Datatype = 1,
+			  NxsAltDNA_Datatype = 2,
+			  NxsAltRNA_Datatype = 3,
+			  NxsAltNuc_Datatype = 4,
+			  NxsAltAA_Datatype = 5,
+			  NxsAltCodon_Datatype = 6
+			  } NxsAltDatatypes;
+const int LowestNxsCDatatype = 1;
+const int HighestNxsCDatatype = 6;
+
+typedef struct NxsCDiscreteMatrixStruct
+	{
+	NxsCDiscreteState_t 	  *stateList; 		/** Flattened array of array of observed states.  If more than one state was observed, then the first element is the number of states observed.
+											  Exceptions: -1 is for gaps, nStates is for missing. */
+	unsigned * stateListPos;  	/** Maps a state set code (the elements of the matrix) to the index in stateList where the states are listed */
+	NxsCDiscreteStateSet ** matrix;			/** taxa x characters matrix of indices of state sets */
+	const char * symbolsList;	/** array of the characters used to stand for each state ("ACGT?NRY" for example) //@temp paup depends on all symbols being unique (even ambiguity codes)*/
+	unsigned nStates;
+	unsigned nChar;
+	unsigned nTax;
+	unsigned nObservedStateSets; /* the length of stateListPos */
+	NxsAltDatatypes datatype;
+	} NxsCDiscreteMatrix;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TREEINFER_HELPER_H */
+
diff --git a/lib/ncl-2.1.18/ncl/nxscharactersblock.cpp b/lib/ncl-2.1.18/ncl/nxscharactersblock.cpp
new file mode 100644
index 0000000..9ce5f48
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxscharactersblock.cpp
@@ -0,0 +1,5422 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+/**
+ * This file includes contributions by Brian O'Meara. August 2005.
+ * These changes include the ability to parse continuous data types.
+ */
+#include <iomanip>
+#include <climits>
+
+#include "ncl/nxscharactersblock.h"
+#include "ncl/nxsreader.h"
+#include "ncl/nxsassumptionsblock.h"
+#include "ncl/nxssetreader.h"
+#include <algorithm>
+#include <iterator>
+using namespace std;
+
+CodonRecodingStruct getCodonRecodingStruct(NxsGeneticCodesEnum gCode);
+std::vector<NxsDiscreteStateCell> getToCodonRecodingMapper(NxsGeneticCodesEnum gCode);
+
+
+void NxsDiscreteDatatypeMapper::DebugWriteMapperFields(std::ostream & out) const
+{
+  out << nStates << "\"fundamental\" states\n";
+  out << "Symbols = \"" << symbols << "\"\n";
+  if (respectCase)
+    out << "Symbol comparison respects case (is case-sensitive)\n";
+  else
+    out << "Symbol comparison does not respect case (is case-insensitive)\n";
+  if (gapChar == '\0')
+    out << "No Gaps\n";
+  else
+    out << "Gap char is " << gapChar << "\n";
+
+  out << "State codes:\n";
+  int nsc = (int)GetNumStateCodes();
+  for (int scc = 0; scc < nsc; ++scc)
+    {
+      int sc = scc + sclOffset;
+      out << sc << ' ';
+      if (sc == NXS_MISSING_CODE)
+	out << missing << '\n';
+      else if (sc == NXS_GAP_STATE_CODE)
+	out << gapChar << '\n';
+      else
+	{
+	  const std::set<NxsDiscreteStateCell> & ssfc(GetStateSetForCode(sc));
+	  std::set<NxsDiscreteStateCell>::const_iterator sIt = ssfc.begin();
+	  if (ssfc.size() == 1)
+	    {
+	      out << symbols[*sIt];
+	    }
+	  else
+	    {
+	      if (IsPolymorphic(sc))
+		out << '(';
+	      else
+		out << '{';
+	      for (; sIt != ssfc.end(); ++sIt)
+		{
+		  if (*sIt == NXS_MISSING_CODE)
+		    out << missing;
+		  else if (*sIt == NXS_GAP_STATE_CODE)
+		    out << gapChar;
+		  else
+		    out << symbols[*sIt];
+		}
+	      if (IsPolymorphic(sc))
+		out << ')';
+	      else
+		out << '}';
+	    }
+	  out << '\n';
+	}
+    }
+
+  std::map<char, NxsString>::const_iterator eeIt = extraEquates.begin();
+  if (eeIt != extraEquates.end())
+    {
+      out << "Extra equates:\n";
+      for (; eeIt != extraEquates.end(); ++eeIt)
+	out << eeIt->first  << " -> " << eeIt->second << '\n';
+    }
+  out.flush();
+}
+
+static unsigned char lcBaseToInd(char );
+
+static unsigned char lcBaseToInd(char c) {
+  if (c == 'a')
+    return 0;
+  if (c == 'c')
+    return 1;
+  if (c == 'g')
+    return 2;
+  if (c == 't')
+    return 3;
+  throw NxsException("Expecting a DNA base");
+}
+
+NxsCodonTriplet::NxsCodonTriplet(const char *triplet)
+{
+  std::string s(triplet);
+  if (s.length() != 3)
+    throw NxsException("Expecting a triplet of bases");
+  NxsString::to_lower(s);
+  this->firstPos = lcBaseToInd(s[0]);
+  this->secondPos = lcBaseToInd(s[1]);
+  this->thirdPos = lcBaseToInd(s[2]);
+}
+
+
+NxsCodonTriplet::MutDescription NxsCodonTriplet::getSingleMut(const NxsCodonTriplet & other) const {
+  if (firstPos == other.firstPos) {
+    if (secondPos == other.secondPos) {
+      if (thirdPos == other.thirdPos)
+	return MutDescription(0,0);
+      return MutDescription((int)thirdPos, (int)other.thirdPos);
+    }
+    if (thirdPos == other.thirdPos)
+      return MutDescription((int)secondPos, (int)other.secondPos);
+    return MutDescription(-1, -1);
+  }
+  if (secondPos == other.secondPos) {
+    if (thirdPos == other.thirdPos)
+      return MutDescription((int)firstPos, (int)other.firstPos);
+    return MutDescription(-1, -1);
+  }
+  return MutDescription(-1, -1);
+}
+
+
+/*******************************************************************************
+ * deletes "fundamental" states (rather than gaps or ambiguity codes) from a
+ * datatype mapper.
+ * Equates (default or user-defined) are not supported in the current version of the function
+ *	(so this will only work on standard or codons data).
+ */
+
+void NxsDiscreteDatatypeMapper::DeleteStateIndices(const std::set<NxsDiscreteStateCell> & deletedInds)
+{
+  if (deletedInds.empty())
+    return;
+  if (*(deletedInds.begin()) < 0 || *(deletedInds.rbegin()) >= (NxsDiscreteStateCell)this->nStates)
+    throw NxsException("DeleteStateIndices can only delete fundamental states");
+  if (!(NxsCharactersBlock::GetDefaultEquates(this->datatype).empty() && extraEquates.empty()))
+    throw NxsException("DeleteStateIndices can not currently work on datatypes with equates");
+  std::vector<NxsDiscreteStateCell> remap;
+  NxsDiscreteStateCell newIndex = 0;
+  std::string nsym;
+  for (NxsDiscreteStateCell i = 0; i < (NxsDiscreteStateCell) this->nStates; ++i)
+    {
+      if (deletedInds.find(i) == deletedInds.end())
+	{
+	  remap.push_back(newIndex++);
+	  nsym.append(1, symbols[i]);
+	}
+      else
+	remap.push_back(NXS_INVALID_STATE_CODE);
+    }
+  const unsigned oldNStates = nStates;
+  std::vector<NxsDiscreteStateSetInfo> oldStateSetsVec = this->stateSetsVec;
+  symbols = nsym;
+
+  this->RefreshMappings(0L);
+
+  for (unsigned i = oldNStates - sclOffset; i < oldStateSetsVec.size(); ++i)
+    {
+      const NxsDiscreteStateSetInfo & ssi = oldStateSetsVec[i];
+      std::set<NxsDiscreteStateCell> stSet;
+      for (std::set<NxsDiscreteStateCell>::const_iterator s = ssi.states.begin(); s != ssi.states.end(); ++s)
+	{
+	  NxsDiscreteStateCell u = *s;
+	  if (u < 0)
+	    stSet.insert(u);
+	  else
+	    {
+	      NxsDiscreteStateCell r = remap.at(u);
+	      if (r >= 0)
+		stSet.insert(r);
+	    }
+	}
+      // We have to add every "extra" state set, so that the indexing for the higher state codes is just shifted by the number of states deleted
+      AddStateSet(stSet, ssi.nexusSymbol, true, ssi.isPolymorphic);
+    }
+}
+
+std::vector<NxsDiscreteStateCell> getToCodonRecodingMapper(NxsGeneticCodesEnum gCode)
+{
+  std::vector<NxsDiscreteStateCell> v;
+  if(gCode == NXS_GCODE_STANDARD) {
+    const NxsDiscreteStateCell trnxs_gcode_standard[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, 48, -1, 49, 50, 51, 52, 53, -1, 54, 55, 56, 57, 58, 59, 60};
+    std::copy(trnxs_gcode_standard, trnxs_gcode_standard + 64, std::back_inserter(v));
+    return v;
+  }
+  if(gCode == NXS_GCODE_VERT_MITO) {
+    const NxsDiscreteStateCell trnxs_gcode_vert_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, -1, 8, -1, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, -1, 46, -1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59};
+    std::copy(trnxs_gcode_vert_mito, trnxs_gcode_vert_mito + 64, std::back_inserter(v));
+    return v;
+  }
+  if(gCode == NXS_GCODE_YEAST_MITO) {
+    const NxsDiscreteStateCell trnxs_gcode_yeast_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, 48, -1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61};
+    std::copy(trnxs_gcode_yeast_mito, trnxs_gcode_yeast_mito + 64, std::back_inserter(v));
+    return v;
+  }
+  if(gCode == NXS_GCODE_MOLD_MITO) {
+    const NxsDiscreteStateCell trnxs_gcode_mold_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, 48, -1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61};
+    std::copy(trnxs_gcode_mold_mito, trnxs_gcode_mold_mito + 64, std::back_inserter(v));
+    return v;
+  }
+  if(gCode == NXS_GCODE_INVERT_MITO) {
+    const NxsDiscreteStateCell trnxs_gcode_invert_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, 48, -1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61};
+    std::copy(trnxs_gcode_invert_mito, trnxs_gcode_invert_mito + 64, std::back_inserter(v));
+    return v;
+  }
+  if(gCode == NXS_GCODE_CILIATE) {
+    const NxsDiscreteStateCell trnxs_gcode_ciliate[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, -1, 56, 57, 58, 59, 60, 61, 62};
+    std::copy(trnxs_gcode_ciliate, trnxs_gcode_ciliate + 64, std::back_inserter(v));
+    return v;
+  }
+  if(gCode == NXS_GCODE_ECHINO_MITO) {
+    const NxsDiscreteStateCell trnxs_gcode_echino_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, 48, -1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61};
+    std::copy(trnxs_gcode_echino_mito, trnxs_gcode_echino_mito + 64, std::back_inserter(v));
+    return v;
+  }
+  if(gCode == NXS_GCODE_EUPLOTID) {
+    const NxsDiscreteStateCell trnxs_gcode_euplotid[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, 48, -1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61};
+    std::copy(trnxs_gcode_euplotid, trnxs_gcode_euplotid + 64, std::back_inserter(v));
+    return v;
+  }
+  if(gCode == NXS_GCODE_PLANT_PLASTID) {
+    const NxsDiscreteStateCell trnxs_gcode_plant_plastid[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, 48, -1, 49, 50, 51, 52, 53, -1, 54, 55, 56, 57, 58, 59, 60};
+    std::copy(trnxs_gcode_plant_plastid, trnxs_gcode_plant_plastid + 64, std::back_inserter(v));
+    return v;
+  }
+  if(gCode == NXS_GCODE_ALT_YEAST) {
+    const NxsDiscreteStateCell trnxs_gcode_alt_yeast[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, 48, -1, 49, 50, 51, 52, 53, -1, 54, 55, 56, 57, 58, 59, 60};
+    std::copy(trnxs_gcode_alt_yeast, trnxs_gcode_alt_yeast + 64, std::back_inserter(v));
+    return v;
+  }
+  if(gCode == NXS_GCODE_ASCIDIAN_MITO) {
+    const NxsDiscreteStateCell trnxs_gcode_ascidian_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, 48, -1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61};
+    std::copy(trnxs_gcode_ascidian_mito, trnxs_gcode_ascidian_mito + 64, std::back_inserter(v));
+    return v;
+  }
+  if(gCode == NXS_GCODE_ALT_FLATWORM_MITO) {
+    const NxsDiscreteStateCell trnxs_gcode_alt_flatworm_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, -1, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62};
+    std::copy(trnxs_gcode_alt_flatworm_mito, trnxs_gcode_alt_flatworm_mito + 64, std::back_inserter(v));
+    return v;
+  }
+  if(gCode == NXS_GCODE_BLEPHARISMA_MACRO) {
+    const NxsDiscreteStateCell trnxs_gcode_blepharisma_macro[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, 48, 49, 50, 51, 52, 53, 54, -1, 55, 56, 57, 58, 59, 60, 61};
+    std::copy(trnxs_gcode_blepharisma_macro, trnxs_gcode_blepharisma_macro + 64, std::back_inserter(v));
+    return v;
+  }
+  if(gCode == NXS_GCODE_CHLOROPHYCEAN_MITO) {
+    const NxsDiscreteStateCell trnxs_gcode_chlorophycean_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, 48, 49, 50, 51, 52, 53, 54, -1, 55, 56, 57, 58, 59, 60, 61};
+    std::copy(trnxs_gcode_chlorophycean_mito, trnxs_gcode_chlorophycean_mito + 64, std::back_inserter(v));
+    return v;
+  }
+  if(gCode == NXS_GCODE_TREMATODE_MITO) {
+    const NxsDiscreteStateCell trnxs_gcode_trematode_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, 48, -1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61};
+    std::copy(trnxs_gcode_trematode_mito, trnxs_gcode_trematode_mito + 64, std::back_inserter(v));
+    return v;
+  }
+  if(gCode == NXS_GCODE_SCENEDESMUS_MITO) {
+    const NxsDiscreteStateCell trnxs_gcode_scenedesmus_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, 48, 49, 50, -1, 51, 52, 53, -1, 54, 55, 56, 57, 58, 59, 60};
+    std::copy(trnxs_gcode_scenedesmus_mito, trnxs_gcode_scenedesmus_mito + 64, std::back_inserter(v));
+    return v;
+  }
+  if(gCode == NXS_GCODE_THRAUSTOCHYTRIUM_MITO) {
+    const NxsDiscreteStateCell trnxs_gcode_thraustochytrium_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, 48, -1, 49, 50, 51, 52, 53, -1, 54, 55, 56, -1, 57, 58, 59};
+    std::copy(trnxs_gcode_thraustochytrium_mito, trnxs_gcode_thraustochytrium_mito + 64, std::back_inserter(v));
+    return v;
+  }
+  throw NxsException("Unrecognized genetic code.");
+}
+
+
+CodonRecodingStruct getCodonRecodingStruct(NxsGeneticCodesEnum gCode)
+{
+  CodonRecodingStruct c;
+  unsigned n;
+
+  if(gCode == NXS_GCODE_STANDARD) {
+    const int ccitacnxs_gcode_standard[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 51, 52, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63};
+    n = 61;
+    const int caaindnxs_gcode_standard[] = {8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 19, 19, 15, 15, 15, 15, 1, 18, 1, 9, 4, 9, 4};
+    const char * ccodstrnxs_gcode_standard[] = {"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG", "ACT", "AGA", "AGC", "AGG", "AGT", "ATA", "ATC", "ATG", "ATT", "CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG", "CCT", "CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG", "CTT", "GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG", "GCT", "GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG", "GTT", "TAC", "TAT", "TCA", "TCC", "TCG", "TCT", "TGC", "TGG", "TGT", "TTA", "TTC", "TTG", "TTT"};
+    std::copy(ccitacnxs_gcode_standard, ccitacnxs_gcode_standard + n, std::back_inserter(c.compressedCodonIndToAllCodonsInd));
+    std::copy(caaindnxs_gcode_standard, caaindnxs_gcode_standard + n, std::back_inserter(c.aaInd));
+    std::copy(ccodstrnxs_gcode_standard, ccodstrnxs_gcode_standard + n, std::back_inserter(c.codonStrings));
+    return c;
+  }
+  if(gCode == NXS_GCODE_VERT_MITO) {
+    const int ccitacnxs_gcode_vert_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63};
+    n = 60;
+    const int caaindnxs_gcode_vert_mito[] = {8, 11, 8, 11, 16, 16, 16, 16, 15, 15, 10, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 19, 19, 15, 15, 15, 15, 18, 1, 18, 1, 9, 4, 9, 4};
+    const char * ccodstrnxs_gcode_vert_mito[] = {"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG", "ACT", "AGC", "AGT", "ATA", "ATC", "ATG", "ATT", "CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG", "CCT", "CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG", "CTT", "GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG", "GCT", "GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG", "GTT", "TAC", "TAT", "TCA", "TCC", "TCG", "TCT", "TGA", "TGC", "TGG", "TGT", "TTA", "TTC", "TTG", "TTT"};
+    std::copy(ccitacnxs_gcode_vert_mito, ccitacnxs_gcode_vert_mito + n, std::back_inserter(c.compressedCodonIndToAllCodonsInd));
+    std::copy(caaindnxs_gcode_vert_mito, caaindnxs_gcode_vert_mito + n, std::back_inserter(c.aaInd));
+    std::copy(ccodstrnxs_gcode_vert_mito, ccodstrnxs_gcode_vert_mito + n, std::back_inserter(c.codonStrings));
+    return c;
+  }
+  if(gCode == NXS_GCODE_YEAST_MITO) {
+    const int ccitacnxs_gcode_yeast_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63};
+    n = 62;
+    const int caaindnxs_gcode_yeast_mito[] = {8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 19, 19, 15, 15, 15, 15, 18, 1, 18, 1, 9, 4, 9, 4};
+    const char * ccodstrnxs_gcode_yeast_mito[] = {"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG", "ACT", "AGA", "AGC", "AGG", "AGT", "ATA", "ATC", "ATG", "ATT", "CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG", "CCT", "CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG", "CTT", "GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG", "GCT", "GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG", "GTT", "TAC", "TAT", "TCA", "TCC", "TCG", "TCT", "TGA", "TGC", "TGG", "TGT", "TTA", "TTC", "TTG", "TTT"};
+    std::copy(ccitacnxs_gcode_yeast_mito, ccitacnxs_gcode_yeast_mito + n, std::back_inserter(c.compressedCodonIndToAllCodonsInd));
+    std::copy(caaindnxs_gcode_yeast_mito, caaindnxs_gcode_yeast_mito + n, std::back_inserter(c.aaInd));
+    std::copy(ccodstrnxs_gcode_yeast_mito, ccodstrnxs_gcode_yeast_mito + n, std::back_inserter(c.codonStrings));
+    return c;
+  }
+  if(gCode == NXS_GCODE_MOLD_MITO) {
+    const int ccitacnxs_gcode_mold_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63};
+    n = 62;
+    const int caaindnxs_gcode_mold_mito[] = {8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 19, 19, 15, 15, 15, 15, 18, 1, 18, 1, 9, 4, 9, 4};
+    const char * ccodstrnxs_gcode_mold_mito[] = {"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG", "ACT", "AGA", "AGC", "AGG", "AGT", "ATA", "ATC", "ATG", "ATT", "CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG", "CCT", "CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG", "CTT", "GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG", "GCT", "GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG", "GTT", "TAC", "TAT", "TCA", "TCC", "TCG", "TCT", "TGA", "TGC", "TGG", "TGT", "TTA", "TTC", "TTG", "TTT"};
+    std::copy(ccitacnxs_gcode_mold_mito, ccitacnxs_gcode_mold_mito + n, std::back_inserter(c.compressedCodonIndToAllCodonsInd));
+    std::copy(caaindnxs_gcode_mold_mito, caaindnxs_gcode_mold_mito + n, std::back_inserter(c.aaInd));
+    std::copy(ccodstrnxs_gcode_mold_mito, ccodstrnxs_gcode_mold_mito + n, std::back_inserter(c.codonStrings));
+    return c;
+  }
+  if(gCode == NXS_GCODE_INVERT_MITO) {
+    const int ccitacnxs_gcode_invert_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63};
+    n = 62;
+    const int caaindnxs_gcode_invert_mito[] = {8, 11, 8, 11, 16, 16, 16, 16, 15, 15, 15, 15, 10, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 19, 19, 15, 15, 15, 15, 18, 1, 18, 1, 9, 4, 9, 4};
+    const char * ccodstrnxs_gcode_invert_mito[] = {"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG", "ACT", "AGA", "AGC", "AGG", "AGT", "ATA", "ATC", "ATG", "ATT", "CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG", "CCT", "CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG", "CTT", "GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG", "GCT", "GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG", "GTT", "TAC", "TAT", "TCA", "TCC", "TCG", "TCT", "TGA", "TGC", "TGG", "TGT", "TTA", "TTC", "TTG", "TTT"};
+    std::copy(ccitacnxs_gcode_invert_mito, ccitacnxs_gcode_invert_mito + n, std::back_inserter(c.compressedCodonIndToAllCodonsInd));
+    std::copy(caaindnxs_gcode_invert_mito, caaindnxs_gcode_invert_mito + n, std::back_inserter(c.aaInd));
+    std::copy(ccodstrnxs_gcode_invert_mito, ccodstrnxs_gcode_invert_mito + n, std::back_inserter(c.codonStrings));
+    return c;
+  }
+  if(gCode == NXS_GCODE_CILIATE) {
+    const int ccitacnxs_gcode_ciliate[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63};
+    n = 63;
+    const int caaindnxs_gcode_ciliate[] = {8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 13, 19, 13, 19, 15, 15, 15, 15, 1, 18, 1, 9, 4, 9, 4};
+    const char * ccodstrnxs_gcode_ciliate[] = {"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG", "ACT", "AGA", "AGC", "AGG", "AGT", "ATA", "ATC", "ATG", "ATT", "CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG", "CCT", "CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG", "CTT", "GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG", "GCT", "GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG", "GTT", "TAA", "TAC", "TAG", "TAT", "TCA", "TCC", "TCG", "TCT", "TGC", "TGG", "TGT", "TTA", "TTC", "TTG", "TTT"};
+    std::copy(ccitacnxs_gcode_ciliate, ccitacnxs_gcode_ciliate + n, std::back_inserter(c.compressedCodonIndToAllCodonsInd));
+    std::copy(caaindnxs_gcode_ciliate, caaindnxs_gcode_ciliate + n, std::back_inserter(c.aaInd));
+    std::copy(ccodstrnxs_gcode_ciliate, ccodstrnxs_gcode_ciliate + n, std::back_inserter(c.codonStrings));
+    return c;
+  }
+  if(gCode == NXS_GCODE_ECHINO_MITO) {
+    const int ccitacnxs_gcode_echino_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63};
+    n = 62;
+    const int caaindnxs_gcode_echino_mito[] = {11, 11, 8, 11, 16, 16, 16, 16, 15, 15, 15, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 19, 19, 15, 15, 15, 15, 18, 1, 18, 1, 9, 4, 9, 4};
+    const char * ccodstrnxs_gcode_echino_mito[] = {"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG", "ACT", "AGA", "AGC", "AGG", "AGT", "ATA", "ATC", "ATG", "ATT", "CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG", "CCT", "CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG", "CTT", "GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG", "GCT", "GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG", "GTT", "TAC", "TAT", "TCA", "TCC", "TCG", "TCT", "TGA", "TGC", "TGG", "TGT", "TTA", "TTC", "TTG", "TTT"};
+    std::copy(ccitacnxs_gcode_echino_mito, ccitacnxs_gcode_echino_mito + n, std::back_inserter(c.compressedCodonIndToAllCodonsInd));
+    std::copy(caaindnxs_gcode_echino_mito, caaindnxs_gcode_echino_mito + n, std::back_inserter(c.aaInd));
+    std::copy(ccodstrnxs_gcode_echino_mito, ccodstrnxs_gcode_echino_mito + n, std::back_inserter(c.codonStrings));
+    return c;
+  }
+  if(gCode == NXS_GCODE_EUPLOTID) {
+    const int ccitacnxs_gcode_euplotid[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63};
+    n = 62;
+    const int caaindnxs_gcode_euplotid[] = {8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 19, 19, 15, 15, 15, 15, 1, 1, 18, 1, 9, 4, 9, 4};
+    const char * ccodstrnxs_gcode_euplotid[] = {"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG", "ACT", "AGA", "AGC", "AGG", "AGT", "ATA", "ATC", "ATG", "ATT", "CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG", "CCT", "CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG", "CTT", "GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG", "GCT", "GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG", "GTT", "TAC", "TAT", "TCA", "TCC", "TCG", "TCT", "TGA", "TGC", "TGG", "TGT", "TTA", "TTC", "TTG", "TTT"};
+    std::copy(ccitacnxs_gcode_euplotid, ccitacnxs_gcode_euplotid + n, std::back_inserter(c.compressedCodonIndToAllCodonsInd));
+    std::copy(caaindnxs_gcode_euplotid, caaindnxs_gcode_euplotid + n, std::back_inserter(c.aaInd));
+    std::copy(ccodstrnxs_gcode_euplotid, ccodstrnxs_gcode_euplotid + n, std::back_inserter(c.codonStrings));
+    return c;
+  }
+  if(gCode == NXS_GCODE_PLANT_PLASTID) {
+    const int ccitacnxs_gcode_plant_plastid[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 51, 52, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63};
+    n = 61;
+    const int caaindnxs_gcode_plant_plastid[] = {8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 19, 19, 15, 15, 15, 15, 1, 18, 1, 9, 4, 9, 4};
+    const char * ccodstrnxs_gcode_plant_plastid[] = {"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG", "ACT", "AGA", "AGC", "AGG", "AGT", "ATA", "ATC", "ATG", "ATT", "CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG", "CCT", "CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG", "CTT", "GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG", "GCT", "GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG", "GTT", "TAC", "TAT", "TCA", "TCC", "TCG", "TCT", "TGC", "TGG", "TGT", "TTA", "TTC", "TTG", "TTT"};
+    std::copy(ccitacnxs_gcode_plant_plastid, ccitacnxs_gcode_plant_plastid + n, std::back_inserter(c.compressedCodonIndToAllCodonsInd));
+    std::copy(caaindnxs_gcode_plant_plastid, caaindnxs_gcode_plant_plastid + n, std::back_inserter(c.aaInd));
+    std::copy(ccodstrnxs_gcode_plant_plastid, ccodstrnxs_gcode_plant_plastid + n, std::back_inserter(c.codonStrings));
+    return c;
+  }
+  if(gCode == NXS_GCODE_ALT_YEAST) {
+    const int ccitacnxs_gcode_alt_yeast[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 51, 52, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63};
+    n = 61;
+    const int caaindnxs_gcode_alt_yeast[] = {8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 15, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 19, 19, 15, 15, 15, 15, 1, 18, 1, 9, 4, 9, 4};
+    const char * ccodstrnxs_gcode_alt_yeast[] = {"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG", "ACT", "AGA", "AGC", "AGG", "AGT", "ATA", "ATC", "ATG", "ATT", "CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG", "CCT", "CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG", "CTT", "GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG", "GCT", "GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG", "GTT", "TAC", "TAT", "TCA", "TCC", "TCG", "TCT", "TGC", "TGG", "TGT", "TTA", "TTC", "TTG", "TTT"};
+    std::copy(ccitacnxs_gcode_alt_yeast, ccitacnxs_gcode_alt_yeast + n, std::back_inserter(c.compressedCodonIndToAllCodonsInd));
+    std::copy(caaindnxs_gcode_alt_yeast, caaindnxs_gcode_alt_yeast + n, std::back_inserter(c.aaInd));
+    std::copy(ccodstrnxs_gcode_alt_yeast, ccodstrnxs_gcode_alt_yeast + n, std::back_inserter(c.codonStrings));
+    return c;
+  }
+  if(gCode == NXS_GCODE_ASCIDIAN_MITO) {
+    const int ccitacnxs_gcode_ascidian_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63};
+    n = 62;
+    const int caaindnxs_gcode_ascidian_mito[] = {8, 11, 8, 11, 16, 16, 16, 16, 5, 15, 5, 15, 10, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 19, 19, 15, 15, 15, 15, 18, 1, 18, 1, 9, 4, 9, 4};
+    const char * ccodstrnxs_gcode_ascidian_mito[] = {"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG", "ACT", "AGA", "AGC", "AGG", "AGT", "ATA", "ATC", "ATG", "ATT", "CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG", "CCT", "CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG", "CTT", "GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG", "GCT", "GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG", "GTT", "TAC", "TAT", "TCA", "TCC", "TCG", "TCT", "TGA", "TGC", "TGG", "TGT", "TTA", "TTC", "TTG", "TTT"};
+    std::copy(ccitacnxs_gcode_ascidian_mito, ccitacnxs_gcode_ascidian_mito + n, std::back_inserter(c.compressedCodonIndToAllCodonsInd));
+    std::copy(caaindnxs_gcode_ascidian_mito, caaindnxs_gcode_ascidian_mito + n, std::back_inserter(c.aaInd));
+    std::copy(ccodstrnxs_gcode_ascidian_mito, ccodstrnxs_gcode_ascidian_mito + n, std::back_inserter(c.codonStrings));
+    return c;
+  }
+  if(gCode == NXS_GCODE_ALT_FLATWORM_MITO) {
+    const int ccitacnxs_gcode_alt_flatworm_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63};
+    n = 63;
+    const int caaindnxs_gcode_alt_flatworm_mito[] = {11, 11, 8, 11, 16, 16, 16, 16, 15, 15, 15, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 19, 19, 19, 15, 15, 15, 15, 18, 1, 18, 1, 9, 4, 9, 4};
+    const char * ccodstrnxs_gcode_alt_flatworm_mito[] = {"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG", "ACT", "AGA", "AGC", "AGG", "AGT", "ATA", "ATC", "ATG", "ATT", "CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG", "CCT", "CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG", "CTT", "GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG", "GCT", "GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG", "GTT", "TAA", "TAC", "TAT", "TCA", "TCC", "TCG", "TCT", "TGA", "TGC", "TGG", "TGT", "TTA", "TTC", "TTG", "TTT"};
+    std::copy(ccitacnxs_gcode_alt_flatworm_mito, ccitacnxs_gcode_alt_flatworm_mito + n, std::back_inserter(c.compressedCodonIndToAllCodonsInd));
+    std::copy(caaindnxs_gcode_alt_flatworm_mito, caaindnxs_gcode_alt_flatworm_mito + n, std::back_inserter(c.aaInd));
+    std::copy(ccodstrnxs_gcode_alt_flatworm_mito, ccodstrnxs_gcode_alt_flatworm_mito + n, std::back_inserter(c.codonStrings));
+    return c;
+  }
+  if(gCode == NXS_GCODE_BLEPHARISMA_MACRO) {
+    const int ccitacnxs_gcode_blepharisma_macro[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 50, 51, 52, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63};
+    n = 62;
+    const int caaindnxs_gcode_blepharisma_macro[] = {8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 19, 13, 19, 15, 15, 15, 15, 1, 18, 1, 9, 4, 9, 4};
+    const char * ccodstrnxs_gcode_blepharisma_macro[] = {"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG", "ACT", "AGA", "AGC", "AGG", "AGT", "ATA", "ATC", "ATG", "ATT", "CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG", "CCT", "CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG", "CTT", "GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG", "GCT", "GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG", "GTT", "TAC", "TAG", "TAT", "TCA", "TCC", "TCG", "TCT", "TGC", "TGG", "TGT", "TTA", "TTC", "TTG", "TTT"};
+    std::copy(ccitacnxs_gcode_blepharisma_macro, ccitacnxs_gcode_blepharisma_macro + n, std::back_inserter(c.compressedCodonIndToAllCodonsInd));
+    std::copy(caaindnxs_gcode_blepharisma_macro, caaindnxs_gcode_blepharisma_macro + n, std::back_inserter(c.aaInd));
+    std::copy(ccodstrnxs_gcode_blepharisma_macro, ccodstrnxs_gcode_blepharisma_macro + n, std::back_inserter(c.codonStrings));
+    return c;
+  }
+  if(gCode == NXS_GCODE_CHLOROPHYCEAN_MITO) {
+    const int ccitacnxs_gcode_chlorophycean_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 50, 51, 52, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63};
+    n = 62;
+    const int caaindnxs_gcode_chlorophycean_mito[] = {8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 19, 9, 19, 15, 15, 15, 15, 1, 18, 1, 9, 4, 9, 4};
+    const char * ccodstrnxs_gcode_chlorophycean_mito[] = {"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG", "ACT", "AGA", "AGC", "AGG", "AGT", "ATA", "ATC", "ATG", "ATT", "CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG", "CCT", "CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG", "CTT", "GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG", "GCT", "GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG", "GTT", "TAC", "TAG", "TAT", "TCA", "TCC", "TCG", "TCT", "TGC", "TGG", "TGT", "TTA", "TTC", "TTG", "TTT"};
+    std::copy(ccitacnxs_gcode_chlorophycean_mito, ccitacnxs_gcode_chlorophycean_mito + n, std::back_inserter(c.compressedCodonIndToAllCodonsInd));
+    std::copy(caaindnxs_gcode_chlorophycean_mito, caaindnxs_gcode_chlorophycean_mito + n, std::back_inserter(c.aaInd));
+    std::copy(ccodstrnxs_gcode_chlorophycean_mito, ccodstrnxs_gcode_chlorophycean_mito + n, std::back_inserter(c.codonStrings));
+    return c;
+  }
+  if(gCode == NXS_GCODE_TREMATODE_MITO) {
+    const int ccitacnxs_gcode_trematode_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63};
+    n = 62;
+    const int caaindnxs_gcode_trematode_mito[] = {11, 11, 8, 11, 16, 16, 16, 16, 15, 15, 15, 15, 10, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 19, 19, 15, 15, 15, 15, 18, 1, 18, 1, 9, 4, 9, 4};
+    const char * ccodstrnxs_gcode_trematode_mito[] = {"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG", "ACT", "AGA", "AGC", "AGG", "AGT", "ATA", "ATC", "ATG", "ATT", "CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG", "CCT", "CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG", "CTT", "GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG", "GCT", "GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG", "GTT", "TAC", "TAT", "TCA", "TCC", "TCG", "TCT", "TGA", "TGC", "TGG", "TGT", "TTA", "TTC", "TTG", "TTT"};
+    std::copy(ccitacnxs_gcode_trematode_mito, ccitacnxs_gcode_trematode_mito + n, std::back_inserter(c.compressedCodonIndToAllCodonsInd));
+    std::copy(caaindnxs_gcode_trematode_mito, caaindnxs_gcode_trematode_mito + n, std::back_inserter(c.aaInd));
+    std::copy(ccodstrnxs_gcode_trematode_mito, ccodstrnxs_gcode_trematode_mito + n, std::back_inserter(c.codonStrings));
+    return c;
+  }
+  if(gCode == NXS_GCODE_SCENEDESMUS_MITO) {
+    const int ccitacnxs_gcode_scenedesmus_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 50, 51, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63};
+    n = 61;
+    const int caaindnxs_gcode_scenedesmus_mito[] = {8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 19, 9, 19, 15, 15, 15, 1, 18, 1, 9, 4, 9, 4};
+    const char * ccodstrnxs_gcode_scenedesmus_mito[] = {"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG", "ACT", "AGA", "AGC", "AGG", "AGT", "ATA", "ATC", "ATG", "ATT", "CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG", "CCT", "CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG", "CTT", "GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG", "GCT", "GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG", "GTT", "TAC", "TAG", "TAT", "TCC", "TCG", "TCT", "TGC", "TGG", "TGT", "TTA", "TTC", "TTG", "TTT"};
+    std::copy(ccitacnxs_gcode_scenedesmus_mito, ccitacnxs_gcode_scenedesmus_mito + n, std::back_inserter(c.compressedCodonIndToAllCodonsInd));
+    std::copy(caaindnxs_gcode_scenedesmus_mito, caaindnxs_gcode_scenedesmus_mito + n, std::back_inserter(c.aaInd));
+    std::copy(ccodstrnxs_gcode_scenedesmus_mito, ccodstrnxs_gcode_scenedesmus_mito + n, std::back_inserter(c.codonStrings));
+    return c;
+  }
+  if(gCode == NXS_GCODE_THRAUSTOCHYTRIUM_MITO) {
+    const int ccitacnxs_gcode_thraustochytrium_mito[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 51, 52, 53, 54, 55, 57, 58, 59, 61, 62, 63};
+    n = 60;
+    const int caaindnxs_gcode_thraustochytrium_mito[] = {8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 19, 19, 15, 15, 15, 15, 1, 18, 1, 4, 9, 4};
+    const char * ccodstrnxs_gcode_thraustochytrium_mito[] = {"AAA", "AAC", "AAG", "AAT", "ACA", "ACC", "ACG", "ACT", "AGA", "AGC", "AGG", "AGT", "ATA", "ATC", "ATG", "ATT", "CAA", "CAC", "CAG", "CAT", "CCA", "CCC", "CCG", "CCT", "CGA", "CGC", "CGG", "CGT", "CTA", "CTC", "CTG", "CTT", "GAA", "GAC", "GAG", "GAT", "GCA", "GCC", "GCG", "GCT", "GGA", "GGC", "GGG", "GGT", "GTA", "GTC", "GTG", "GTT", "TAC", "TAT", "TCA", "TCC", "TCG", "TCT", "TGC", "TGG", "TGT", "TTC", "TTG", "TTT"};
+    std::copy(ccitacnxs_gcode_thraustochytrium_mito, ccitacnxs_gcode_thraustochytrium_mito + n, std::back_inserter(c.compressedCodonIndToAllCodonsInd));
+    std::copy(caaindnxs_gcode_thraustochytrium_mito, caaindnxs_gcode_thraustochytrium_mito + n, std::back_inserter(c.aaInd));
+    std::copy(ccodstrnxs_gcode_thraustochytrium_mito, ccodstrnxs_gcode_thraustochytrium_mito + n, std::back_inserter(c.codonStrings));
+    return c;
+  }
+  throw NxsException("Unrecognized genetic code.");
+}
+
+CodonRecodingStruct NxsCharactersBlock::RemoveStopCodons(NxsGeneticCodesEnum gCode)
+{
+  NxsDiscreteDatatypeMapper * mapper = this->GetMutableDatatypeMapperForChar(0);
+  if (mapper == 0L)
+    throw NxsException("Invalid characters block (no datatype mapper)");
+  if (mapper->GetDatatype() != codon)
+    throw NxsException("Characters block must be of the type codons when RemoveStopCodons is called");
+  if (mapper->geneticCode != NXS_GCODE_NO_CODE)
+    throw NxsException("Characters block must be an uncompressed codons type when RemoveStopCodons is called");
+
+  const std::vector<NxsDiscreteStateCell> v = getToCodonRecodingMapper(gCode);
+  CodonRecodingStruct c = getCodonRecodingStruct(gCode);
+  const unsigned nRS = (unsigned)c.compressedCodonIndToAllCodonsInd.size();
+  const unsigned offset = 64 - nRS;
+  NxsDiscreteStateMatrix	dMat(this->discreteMatrix);
+  unsigned rowInd = 0;
+  for (NxsDiscreteStateMatrix::iterator rowIt = dMat.begin(); rowIt != dMat.end(); ++rowIt)
+    {
+      NxsDiscreteStateRow & row = *rowIt;
+      unsigned charInd = 0;
+      for (NxsDiscreteStateRow::iterator cellIt = row.begin(); cellIt != row.end(); ++cellIt)
+	{
+	  const NxsDiscreteStateCell cell = *cellIt;
+	  if (cell >= 64)
+	    *cellIt = cell - offset;
+	  else if (cell >= 0)
+	    {
+	      const NxsDiscreteStateCell recoded = v[cell];
+	      if (recoded < 0)
+		{
+		  NxsString m;
+		  m << "Stop codon found at character ";
+		  m << charInd + 1;
+		  m << " for taxon ";
+		  m << rowInd + 1;
+		  throw NxsException(m);
+		}
+	      *cellIt = recoded;
+	    }
+	  ++charInd;
+	}
+      ++rowInd;
+    }
+  dMat.swap(this->discreteMatrix);
+  std::set<NxsDiscreteStateCell> deletedInds;
+  for (NxsDiscreteStateCell i = 0; i < 64; ++i)
+    {
+      if (v[(int)i] < 0)
+	deletedInds.insert(i);
+    }
+  mapper->DeleteStateIndices(deletedInds);
+  return c;
+}
+
+unsigned NxsCharactersBlock::NumAmbigInTaxon(const unsigned taxInd, const NxsUnsignedSet * charIndices, const bool countOnlyCompletelyMissing, const bool treatGapsAsMissing) const
+{
+  const NxsDiscreteStateRow & row = GetDiscreteMatrixRow(taxInd);
+  unsigned nAmbig = 0;
+  const NxsDiscreteDatatypeMapper * m;
+  if (charIndices == NULL)
+    {
+      unsigned cInd = 0;
+      for (NxsDiscreteStateRow::const_iterator cellIt = row.begin(); cellIt != row.end(); ++cellIt)
+	{
+	  m = GetDatatypeMapperForChar(cInd++);
+	  NCL_ASSERT(m);
+	  const NxsDiscreteStateCell & c = *cellIt;
+	  if (c < 0 || c >= (NxsDiscreteStateCell) m->GetNumStates())
+	    {
+	      if (countOnlyCompletelyMissing)
+		{
+		  if (c == NXS_MISSING_CODE)
+		    nAmbig++;
+		}
+	      else
+		{
+		  if (c != NXS_GAP_STATE_CODE || treatGapsAsMissing)
+		    nAmbig++;
+		}
+	    }
+	}
+    }
+  else
+    {
+      for (NxsUnsignedSet::const_iterator c = charIndices->begin(); c != charIndices->end(); ++c)
+	{
+	  const unsigned cIndex = *c;
+	  m = GetDatatypeMapperForChar(cIndex);
+	  const NxsDiscreteStateCell & sc = row.at(cIndex);
+	  if (sc < 0 || sc >= (NxsDiscreteStateCell) m->GetNumStates())
+	    {
+	      if (countOnlyCompletelyMissing)
+		{
+		  if (sc == NXS_MISSING_CODE)
+		    nAmbig++;
+		}
+	      else
+		{
+		  if (sc != NXS_GAP_STATE_CODE || treatGapsAsMissing)
+		    nAmbig++;
+		}
+	    }
+	}
+    }
+  return nAmbig;
+}
+
+bool NxsCharactersBlock::FirstTaxonStatesAreSubsetOfSecond(
+							   const unsigned firstTaxonInd,
+							   const unsigned secondTaxonInd,
+							   const NxsUnsignedSet * charIndices,
+							   const bool treatAmbigAsMissing,
+							   const bool treatGapAsMissing) const
+{
+  const NxsDiscreteStateRow & firstRow = GetDiscreteMatrixRow(firstTaxonInd);
+  const NxsDiscreteStateRow & secondRow = GetDiscreteMatrixRow(secondTaxonInd);
+  const NxsDiscreteDatatypeMapper * m;
+  if (charIndices == NULL)
+    {
+      unsigned cInd = 0;
+      NxsDiscreteStateRow::const_iterator firstIt = firstRow.begin();
+      NxsDiscreteStateRow::const_iterator secondIt = secondRow.begin();
+      for (; firstIt != firstRow.end(); ++firstIt, ++secondIt)
+	{
+	  m = GetDatatypeMapperForChar(cInd++);
+	  const NxsDiscreteStateCell ns = (NxsDiscreteStateCell) m->GetNumStates();
+	  NxsDiscreteStateCell f = *firstIt;
+	  NxsDiscreteStateCell s = *secondIt;
+	  if (treatAmbigAsMissing)
+	    {
+	      if (f >= ns)
+		f = NXS_MISSING_CODE;
+	      if (s >= ns)
+		s = NXS_MISSING_CODE;
+	    }
+	  if (!m->FirstIsSubset(f, s, treatGapAsMissing))
+	    return false;
+	}
+    }
+  else
+    {
+      for (NxsUnsignedSet::const_iterator c = charIndices->begin(); c != charIndices->end(); ++c)
+	{
+	  const unsigned cIndex = *c;
+	  m = GetDatatypeMapperForChar(cIndex);
+	  const NxsDiscreteStateCell ns = m->GetNumStates();
+	  NxsDiscreteStateCell f = firstRow.at(cIndex);
+	  NxsDiscreteStateCell s = secondRow.at(cIndex);
+	  if (treatAmbigAsMissing)
+	    {
+	      if (f >= ns)
+		f = NXS_MISSING_CODE;
+	      if (s >= ns)
+		s = NXS_MISSING_CODE;
+	    }
+	  if (!m->FirstIsSubset(f, s, treatGapAsMissing))
+	    return false;
+	}
+    }
+  return true;
+}
+
+std::pair<unsigned, unsigned> NxsCharactersBlock::GetPairwiseDist(
+								  const unsigned firstTaxonInd,
+								  const unsigned secondTaxonInd,
+								  const NxsUnsignedSet * charIndices,
+								  const bool treatAmbigAsMissing,
+								  const bool treatGapAsMissing) const
+{
+  const NxsDiscreteStateRow & firstRow = GetDiscreteMatrixRow(firstTaxonInd);
+  const NxsDiscreteStateRow & secondRow = GetDiscreteMatrixRow(secondTaxonInd);
+  const NxsDiscreteDatatypeMapper * m;
+  unsigned nDiffs = 0;
+  unsigned nSites = 0;
+  if (charIndices == NULL)
+    {
+      unsigned cInd = 0;
+      NxsDiscreteStateRow::const_iterator firstIt = firstRow.begin();
+      NxsDiscreteStateRow::const_iterator secondIt = secondRow.begin();
+      for (; firstIt != firstRow.end(); ++firstIt, ++secondIt)
+	{
+	  m = GetDatatypeMapperForChar(cInd++);
+	  const NxsDiscreteStateCell ns = m->GetNumStates();
+	  NxsDiscreteStateCell f = *firstIt;
+	  NxsDiscreteStateCell s = *secondIt;
+	  if (treatAmbigAsMissing)
+	    {
+	      if (f >= ns)
+		f = NXS_MISSING_CODE;
+	      if (s >= ns)
+		s = NXS_MISSING_CODE;
+	    }
+	  if (f < 0 || s < 0)
+	    {
+	      if (treatGapAsMissing && (f == NXS_GAP_STATE_CODE || s == NXS_GAP_STATE_CODE))
+		continue;
+	      if (f == NXS_MISSING_CODE || s == NXS_MISSING_CODE)
+		continue;
+	    }
+	  nSites++;
+	  const std::set<NxsDiscreteStateCell> & ssim = m->GetStateIntersection(f, s);
+	  if (!ssim.empty())
+	    ++nDiffs;
+	}
+    }
+  else
+    {
+      for (NxsUnsignedSet::const_iterator c = charIndices->begin(); c != charIndices->end(); ++c)
+	{
+	  m = GetDatatypeMapperForChar(*c);
+	  const NxsDiscreteStateCell ns = (NxsDiscreteStateCell) m->GetNumStates();
+	  NxsDiscreteStateCell f = firstRow.at(*c);
+	  NxsDiscreteStateCell s = secondRow.at(*c);
+	  if (treatAmbigAsMissing)
+	    {
+	      if (f >= ns)
+		f = NXS_MISSING_CODE;
+	      if (s >= ns)
+		s = NXS_MISSING_CODE;
+	    }
+	  if (f < 0 || s < 0)
+	    {
+	      if (treatGapAsMissing && (f == NXS_GAP_STATE_CODE || s == NXS_GAP_STATE_CODE))
+		continue;
+	      if (f == NXS_MISSING_CODE || s == NXS_MISSING_CODE)
+		continue;
+	    }
+	  nSites++;
+	  const std::set<NxsDiscreteStateCell> & ssi = m->GetStateIntersection(f, s);
+	  if (!ssi.empty())
+	    ++nDiffs;
+	}
+    }
+  return std::pair<unsigned, unsigned>(nDiffs, nSites);
+}
+
+
+void NxsDiscreteDatatypeMapper::BuildStateSubsetMatrix() const
+{
+  if (stateIntersectionMatrix.empty())
+    BuildStateIntersectionMatrix();
+  isStateSubsetMatrix.clear();
+  isStateSubsetMatrixGapsMissing.clear();
+  const unsigned nsPlus = (unsigned)stateSetsVec.size();
+  IsStateSubsetRow r(nsPlus, false);
+  isStateSubsetMatrix.assign(nsPlus, r);
+  isStateSubsetMatrixGapsMissing.assign(nsPlus, r);
+  for (unsigned i = 0; i < nsPlus; ++i)
+    {
+      for (unsigned j = 0; j < nsPlus; ++j)
+	{
+	  if (!stateIntersectionMatrix[i][j].empty())
+	    {
+	      isStateSubsetMatrix[i][j] = true;
+	      isStateSubsetMatrixGapsMissing[i][j] = true;
+	    }
+	}
+    }
+  isStateSubsetMatrixGapsMissing[0][1] = true;
+  isStateSubsetMatrixGapsMissing[1][0] = true;
+}
+
+void NxsDiscreteDatatypeMapper::BuildStateIntersectionMatrix() const
+{
+  const std::set<NxsDiscreteStateCell> emptySet;
+
+  stateIntersectionMatrix.clear();
+
+  const unsigned nsPlus = (unsigned const)stateSetsVec.size();
+  const unsigned offset = (unsigned)(sclOffset + 2);
+  StateIntersectionRow emptyRow(nsPlus, emptySet);
+  stateIntersectionMatrix.assign(nsPlus, emptyRow);
+  for (unsigned i = offset; i < nsPlus; ++i)
+    {
+      for (unsigned j = i; j < nsPlus; ++j)
+	{
+	  const unsigned offi = i + sclOffset;
+	  const unsigned offj = j + sclOffset;
+	  std::set<NxsDiscreteStateCell> intersect;
+	  const std::set<NxsDiscreteStateCell>	&fs =  GetStateSetForCode(offi);
+	  const std::set<NxsDiscreteStateCell>	&ss =  GetStateSetForCode(offj);
+	  set_intersection(fs.begin(), fs.end(), ss.begin(), ss.end(), inserter(intersect, intersect.begin()));
+	  stateIntersectionMatrix[i - NXS_GAP_STATE_CODE][j - NXS_GAP_STATE_CODE] = intersect;
+	  if (i != j)
+	    stateIntersectionMatrix[j - NXS_GAP_STATE_CODE][i - NXS_GAP_STATE_CODE] = stateIntersectionMatrix[i - NXS_GAP_STATE_CODE][j - NXS_GAP_STATE_CODE];
+	}
+    }
+
+  std::set<NxsDiscreteStateCell> tmpSet;
+  NCL_ASSERT(1 == NXS_MISSING_CODE - NXS_GAP_STATE_CODE);
+  tmpSet.insert(NXS_GAP_STATE_CODE);
+  stateIntersectionMatrix[0][0] = tmpSet;
+
+  tmpSet.clear();
+  tmpSet.insert(NXS_MISSING_CODE);
+  stateIntersectionMatrix[1][1] = tmpSet;
+  for (unsigned i = offset; i < nsPlus; ++i)
+    {
+      const unsigned offi = i + sclOffset;
+      stateIntersectionMatrix[1][i - NXS_GAP_STATE_CODE] = GetStateSetForCode(offi);
+    }
+}
+
+
+NxsGeneticCodesEnum geneticCodeNameToEnum(std::string n)
+{
+  NxsString::to_lower(n);
+  if (n == "standard")
+    return NXS_GCODE_STANDARD;
+  if (n == "vertmito")
+    return NXS_GCODE_VERT_MITO;
+  if (n == "yeastmito")
+    return NXS_GCODE_YEAST_MITO;
+  if (n == "moldmito")
+    return NXS_GCODE_MOLD_MITO;
+  if (n == "invertmito")
+    return NXS_GCODE_INVERT_MITO;
+  if (n == "ciliate")
+    return NXS_GCODE_CILIATE;
+  if (n == "echinomito")
+    return NXS_GCODE_ECHINO_MITO;
+  if (n == "euplotid")
+    return NXS_GCODE_EUPLOTID;
+  if (n == "plantplastid")
+    return NXS_GCODE_PLANT_PLASTID;
+  if (n == "altyeast")
+    return NXS_GCODE_ALT_YEAST;
+  if (n == "ascidianmito")
+    return NXS_GCODE_ASCIDIAN_MITO;
+  if (n == "altflatwormmito")
+    return NXS_GCODE_ALT_FLATWORM_MITO;
+  if (n == "blepharismamacro")
+    return NXS_GCODE_BLEPHARISMA_MACRO;
+  if (n == "chlorophyceanmito")
+    return NXS_GCODE_CHLOROPHYCEAN_MITO;
+  if (n == "trematodemito")
+    return NXS_GCODE_TREMATODE_MITO;
+  if (n == "scenedesmusmito")
+    return NXS_GCODE_SCENEDESMUS_MITO;
+  if (n == "thraustochytriummito")
+    return NXS_GCODE_THRAUSTOCHYTRIUM_MITO;
+  NxsString err = "Unrecognized genetic code name: ";
+  err << n;
+  throw NxsException(err);
+}
+
+std::string geneticCodeEnumToName(NxsGeneticCodesEnum n)
+{
+  if (n == NXS_GCODE_STANDARD)
+    return "Standard";
+  if (n == NXS_GCODE_VERT_MITO)
+    return "VertMito";
+  if (n == NXS_GCODE_YEAST_MITO)
+    return "YeastMito";
+  if (n == NXS_GCODE_MOLD_MITO)
+    return "MoldMito";
+  if (n == NXS_GCODE_INVERT_MITO)
+    return "InvertMito";
+  if (n == NXS_GCODE_CILIATE)
+    return "Ciliate";
+  if (n == NXS_GCODE_ECHINO_MITO)
+    return "EchinoMito";
+  if (n == NXS_GCODE_EUPLOTID)
+    return "Euplotid";
+  if (n == NXS_GCODE_PLANT_PLASTID)
+    return "PlantPlastid";
+  if (n == NXS_GCODE_ALT_YEAST)
+    return "AltYeast";
+  if (n == NXS_GCODE_ASCIDIAN_MITO)
+    return "AscidianMito";
+  if (n == NXS_GCODE_ALT_FLATWORM_MITO)
+    return "AltFlatwormMito";
+  if (n == NXS_GCODE_BLEPHARISMA_MACRO)
+    return "BlepharismaMacro";
+  if (n == NXS_GCODE_CHLOROPHYCEAN_MITO)
+    return "ChlorophyceanMito";
+  if (n == NXS_GCODE_TREMATODE_MITO)
+    return "Trematodemito";
+  if (n == NXS_GCODE_SCENEDESMUS_MITO)
+    return "ScenedesmusMito";
+  if (n == NXS_GCODE_THRAUSTOCHYTRIUM_MITO)
+    return "ThraustochytriumMito";
+  NxsString err = "Unrecognized genetic code enumeration: ";
+  err << n;
+  throw NxsException(err);
+}
+
+std::vector<std::string> getGeneticCodeNames()
+{
+  std::vector<std::string> n(NXS_GCODE_CODE_ENUM_SIZE);
+  n[NXS_GCODE_STANDARD] = "Standard" ;
+  n[NXS_GCODE_VERT_MITO] = "VertMito" ;
+  n[NXS_GCODE_YEAST_MITO] = "YeastMito" ;
+  n[NXS_GCODE_MOLD_MITO] = "MoldMito" ;
+  n[NXS_GCODE_INVERT_MITO] = "InvertMito" ;
+  n[NXS_GCODE_CILIATE] = "Ciliate" ;
+  n[NXS_GCODE_ECHINO_MITO] = "EchinoMito" ;
+  n[NXS_GCODE_EUPLOTID] = "Euplotid" ;
+  n[NXS_GCODE_PLANT_PLASTID] = "PlantPlastid" ;
+  n[NXS_GCODE_ALT_YEAST] = "AltYeast" ;
+  n[NXS_GCODE_ASCIDIAN_MITO] = "AscidianMito" ;
+  n[NXS_GCODE_ALT_FLATWORM_MITO] = "AltFlatwormMito" ;
+  n[NXS_GCODE_BLEPHARISMA_MACRO] = "BlepharismaMacro" ;
+  n[NXS_GCODE_CHLOROPHYCEAN_MITO] = "ChlorophyceanMito" ;
+  n[NXS_GCODE_TREMATODE_MITO] = "TrematodeMito" ;
+  n[NXS_GCODE_SCENEDESMUS_MITO] = "ScenedesmusMito" ;
+  n[NXS_GCODE_THRAUSTOCHYTRIUM_MITO] = "ThraustochytriumMito" ;
+  return n;
+}
+
+
+
+/*
+  code index 0 => "Standard"
+  code index 1 => "Vertebrate Mitochondrial"
+  code index 2 => "Yeast Mitochondrial"
+  code index 3 => "Mold Mitochondrial; Protozoan Mitochondrial; Coelenterate Mitochondrial; Mycoplasma; Spiroplasma"
+  code index 4 => "Invertebrate Mitochondrial"
+  code index 5 => "Ciliate Nuclear; Dasycladacean Nuclear; Hexamita Nuclear"
+  code index 8 => "Echinoderm Mitochondrial; Flatworm Mitochondrial"
+  code index 9 => "Euplotid Nuclear"
+  code index 10 => "Bacterial and Plant Plastid"
+  code index 11 => "Alternative Yeast Nuclear"
+  code index 12 => "Ascidian Mitochondrial"
+  code index 13 => "Alternative Flatworm Mitochondrial"
+  code index 14 => "Blepharisma Macronuclear"
+  code index 15 => "Chlorophycean Mitochondrial"
+  code index 20 => "Trematode Mitochondrial"
+  code index 21 => "Scenedesmus obliquus Mitochondrial"
+  code index 22 => "Thraustochytrium Mitochondrial"
+*/
+std::string getGeneticCodeAAOrder(NxsGeneticCodesEnum codeIndex)
+{
+  std::vector<std::string> code(NXS_GCODE_CODE_ENUM_SIZE);
+  code[NXS_GCODE_STANDARD] =  "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*Y*YSSSS*CWCLFLF";
+  code[NXS_GCODE_VERT_MITO] = "KNKNTTTT*S*SMIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*Y*YSSSSWCWCLFLF";
+  code[NXS_GCODE_YEAST_MITO] = "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*Y*YSSSSWCWCLFLF";
+  code[NXS_GCODE_MOLD_MITO] = "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*Y*YSSSSWCWCLFLF";
+  code[NXS_GCODE_INVERT_MITO] = "KNKNTTTTSSSSMIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*Y*YSSSSWCWCLFLF";
+  code[NXS_GCODE_CILIATE] = "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVVQYQYSSSS*CWCLFLF";
+  code[NXS_GCODE_ECHINO_MITO] = "NNKNTTTTSSSSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*Y*YSSSSWCWCLFLF";
+  code[NXS_GCODE_EUPLOTID] = "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*Y*YSSSSCCWCLFLF";
+  code[NXS_GCODE_PLANT_PLASTID] = "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*Y*YSSSS*CWCLFLF";
+  code[NXS_GCODE_ALT_YEAST] = "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLSLEDEDAAAAGGGGVVVV*Y*YSSSS*CWCLFLF";
+  code[NXS_GCODE_ASCIDIAN_MITO] = "KNKNTTTTGSGSMIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*Y*YSSSSWCWCLFLF";
+  code[NXS_GCODE_ALT_FLATWORM_MITO] = "NNKNTTTTSSSSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVVYY*YSSSSWCWCLFLF";
+  code[NXS_GCODE_BLEPHARISMA_MACRO] = "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*YQYSSSS*CWCLFLF";
+  code[NXS_GCODE_CHLOROPHYCEAN_MITO] = "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*YLYSSSS*CWCLFLF";
+  code[NXS_GCODE_TREMATODE_MITO] = "NNKNTTTTSSSSMIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*Y*YSSSSWCWCLFLF";
+  code[NXS_GCODE_SCENEDESMUS_MITO] = "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*YLY*SSS*CWCLFLF";
+  code[NXS_GCODE_THRAUSTOCHYTRIUM_MITO] = "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*Y*YSSSS*CWC*FLF";
+  int c = (int) codeIndex;
+  return code.at(c);
+}
+
+
+
+std::vector<NxsDiscreteStateCell> getGeneticCodeIndicesAAOrder(const NxsGeneticCodesEnum codeIndex);
+
+
+std::vector<NxsDiscreteStateCell> getGeneticCodeIndicesAAOrder(const NxsGeneticCodesEnum codeIndex)
+{
+  std::vector<NxsDiscreteStateCell> aaInd(64);
+  aaInd[0] = 8;
+  aaInd[1] = 11;
+  aaInd[2] = 8;
+  aaInd[3] = 11;
+  aaInd[4] = 16;
+  aaInd[5] = 16;
+  aaInd[6] = 16;
+  aaInd[7] = 16;
+  aaInd[8] = 14;
+  aaInd[9] = 15;
+  aaInd[10] = 14;
+  aaInd[11] = 15;
+  aaInd[12] = 7;
+  aaInd[13] = 7;
+  aaInd[14] = 10;
+  aaInd[15] = 7;
+  aaInd[16] = 13;
+  aaInd[17] = 6;
+  aaInd[18] = 13;
+  aaInd[19] = 6;
+  aaInd[20] = 12;
+  aaInd[21] = 12;
+  aaInd[22] = 12;
+  aaInd[23] = 12;
+  aaInd[24] = 14;
+  aaInd[25] = 14;
+  aaInd[26] = 14;
+  aaInd[27] = 14;
+  aaInd[28] = 9;
+  aaInd[29] = 9;
+  aaInd[30] = 9;
+  aaInd[31] = 9;
+  aaInd[32] = 3;
+  aaInd[33] = 2;
+  aaInd[34] = 3;
+  aaInd[35] = 2;
+  aaInd[36] = 0;
+  aaInd[37] = 0;
+  aaInd[38] = 0;
+  aaInd[39] = 0;
+  aaInd[40] = 5;
+  aaInd[41] = 5;
+  aaInd[42] = 5;
+  aaInd[43] = 5;
+  aaInd[44] = 17;
+  aaInd[45] = 17;
+  aaInd[46] = 17;
+  aaInd[47] = 17;
+  aaInd[48] = 20;
+  aaInd[49] = 19;
+  aaInd[50] = 20;
+  aaInd[51] = 19;
+  aaInd[52] = 15;
+  aaInd[53] = 15;
+  aaInd[54] = 15;
+  aaInd[55] = 15;
+  aaInd[56] = 20;
+  aaInd[57] = 1;
+  aaInd[58] = 18;
+  aaInd[59] = 1;
+  aaInd[60] = 9;
+  aaInd[61] = 4;
+  aaInd[62] = 9;
+  aaInd[63] = 4;
+  if (codeIndex == NXS_GCODE_VERT_MITO) {
+    aaInd[8] = 20;
+    aaInd[10] = 20;
+    aaInd[12] = 10;
+    aaInd[56] = 18;
+  }
+  else if (codeIndex == NXS_GCODE_YEAST_MITO) {
+    aaInd[56] = 18;
+  }
+  else if (codeIndex == NXS_GCODE_MOLD_MITO) {
+    aaInd[56] = 18;
+  }
+  else if (codeIndex == NXS_GCODE_INVERT_MITO) {
+    aaInd[8] = 15;
+    aaInd[10] = 15;
+    aaInd[12] = 10;
+    aaInd[56] = 18;
+  }
+  else if (codeIndex == NXS_GCODE_CILIATE) {
+    aaInd[48] = 13;
+    aaInd[50] = 13;
+  }
+  else if (codeIndex == NXS_GCODE_ECHINO_MITO) {
+    aaInd[0] = 11;
+    aaInd[8] = 15;
+    aaInd[10] = 15;
+    aaInd[56] = 18;
+  }
+  else if (codeIndex == NXS_GCODE_EUPLOTID) {
+    aaInd[56] = 1;
+  }
+  else if (codeIndex == NXS_GCODE_ALT_YEAST) {
+    aaInd[30] = 15;
+  }
+  else if (codeIndex == NXS_GCODE_ASCIDIAN_MITO) {
+    aaInd[8] = 5;
+    aaInd[10] = 5;
+    aaInd[12] = 10;
+    aaInd[56] = 18;
+  }
+  else if (codeIndex == NXS_GCODE_ALT_FLATWORM_MITO) {
+    aaInd[0] = 11;
+    aaInd[8] = 15;
+    aaInd[10] = 15;
+    aaInd[48] = 19;
+    aaInd[56] = 18;
+  }
+  else if (codeIndex == NXS_GCODE_BLEPHARISMA_MACRO) {
+    aaInd[50] = 13;
+  }
+  else if (codeIndex == NXS_GCODE_CHLOROPHYCEAN_MITO) {
+    aaInd[50] = 9;
+  }
+  else if (codeIndex == NXS_GCODE_TREMATODE_MITO) {
+    aaInd[0] = 11;
+    aaInd[8] = 15;
+    aaInd[10] = 15;
+    aaInd[12] = 10;
+    aaInd[56] = 18;
+  }
+  else if (codeIndex == NXS_GCODE_SCENEDESMUS_MITO) {
+    aaInd[50] = 9;
+    aaInd[52] = 20;
+  }
+  else if (codeIndex == NXS_GCODE_THRAUSTOCHYTRIUM_MITO) {
+    aaInd[60] = 20;
+  }
+  return aaInd;
+}
+
+
+void NxsCharactersBlock::CodonPosPartitionToPosList(const NxsPartition &codonPos, std::list<int> * charIndices)
+{
+  if (charIndices == 0L)
+    return;
+  const NxsUnsignedSet * firstPos = 0L;
+  const NxsUnsignedSet * secondPos = 0L;
+  const NxsUnsignedSet * thirdPos = 0L;
+  for (NxsPartition::const_iterator pIt = codonPos.begin(); pIt != codonPos.end(); ++pIt)
+    {
+      if (pIt->first == "1")
+	{
+	  NCL_ASSERT(firstPos == 0L);
+	  firstPos = &(pIt->second);
+	}
+      else if (pIt->first == "2")
+	{
+	  NCL_ASSERT(secondPos == 0L);
+	  secondPos = &(pIt->second);
+	}
+      else if (pIt->first == "3")
+	{
+	  NCL_ASSERT(thirdPos == 0L);
+	  thirdPos = &(pIt->second);
+	}
+    }
+  if (firstPos == 0L || secondPos == 0L || thirdPos == 0L)
+    throw NxsException("Expecting partition subsets named 1, 2, and 3");
+  if (firstPos->size() != secondPos->size() || firstPos->size() != thirdPos->size())
+    throw NxsException("Expecting the partition subsets named 1, 2, and 3 to have the same size");
+  NxsUnsignedSet::const_iterator fIt = firstPos->begin();
+  NxsUnsignedSet::const_iterator sIt = secondPos->begin();
+  NxsUnsignedSet::const_iterator thIt = thirdPos->begin();
+  const NxsUnsignedSet::const_iterator endIt = firstPos->end();
+  for (; fIt != endIt; ++fIt, ++sIt, ++thIt)
+    {
+      charIndices->push_back(*fIt);
+      charIndices->push_back(*sIt);
+      charIndices->push_back(*thIt);
+    }
+}
+
+/* allocates a new charaters block with amino acids for the codons in the characters block (which should have datatype = codon).
+ */
+NxsCharactersBlock * NxsCharactersBlock::NewProteinCharactersBlock(
+								   const NxsCharactersBlock * codonBlock,
+								   bool mapPartialAmbigToUnknown,
+								   bool gapToUnknown,
+								   NxsGeneticCodesEnum codeIndex)
+{
+  std::vector<NxsDiscreteStateCell> aas = getGeneticCodeIndicesAAOrder(codeIndex);
+  return NxsCharactersBlock::NewProteinCharactersBlock(codonBlock, mapPartialAmbigToUnknown, gapToUnknown, aas);
+}
+
+
+/* allocates a new charaters block with amino acids for the codons in the characters block (which should have datatype = codon).
+
+ */
+NxsCharactersBlock * NxsCharactersBlock::NewProteinCharactersBlock(
+								   const NxsCharactersBlock * codonBlock,
+								   bool mapPartialAmbigToUnknown,
+								   bool gapToUnknown,
+								   const std::vector<NxsDiscreteStateCell> & aaIndices) /** the index of the amino acid symbols for the codon (where the order of codons is alphabetical: AAA, AAC, AAG, AAT, ACA, ...TTT **/
+{
+  if (!codonBlock)
+    return NULL;
+  if (codonBlock->GetDataType() != NxsCharactersBlock::codon)
+    throw NxsException("NewProteinCharactersBlock must be called with a block of codon datatype");
+  const unsigned nc = codonBlock->GetNCharTotal();
+
+  /* create a new characters block with the same TAXA, but no ASSUMPTIONS block */
+  NxsTaxaBlockAPI * taxa = codonBlock->GetTaxaBlockPtr(NULL);
+  NxsCharactersBlock * aaBlock = new NxsCharactersBlock(taxa, NULL);
+  aaBlock->SetNChar(nc);
+  aaBlock->SetNTax(codonBlock->GetNTaxWithData());
+  aaBlock->missing = codonBlock->missing;
+  aaBlock->gap = (gapToUnknown ? '\0' : codonBlock->gap);
+  aaBlock->gapMode = codonBlock->gapMode;
+  aaBlock->datatype = NxsCharactersBlock::protein;
+  aaBlock->originalDatatype = codonBlock->originalDatatype;
+  aaBlock->ResetSymbols();
+  aaBlock->tokens = false;
+
+
+  NxsPartition dummy;
+  std::vector<DataTypesEnum> dummyVec;
+  aaBlock->CreateDatatypeMapperObjects(dummy, dummyVec);
+  const NxsDiscreteDatatypeMapper * codonMapper = codonBlock->GetDatatypeMapperForChar(0);
+  NxsDiscreteDatatypeMapper * aaMapper = aaBlock->GetMutableDatatypeMapperForChar(0);
+  aaMapper->geneticCode = codonMapper->geneticCode;
+
+  const unsigned ntax = (taxa == 0L ? codonBlock->GetNTaxWithData() : taxa->GetNTax());
+  aaBlock->datatypeReadFromFormat = false;
+  aaBlock->statesFormat = STATES_PRESENT;
+  aaBlock->restrictionDataype = false;
+  aaBlock->supportMixedDatatype = false;
+  aaBlock->convertAugmentedToMixed = false;
+  aaBlock->writeInterleaveLen = INT_MAX;
+
+
+  NxsDiscreteStateRow matRow(nc, 0);
+  aaBlock->discreteMatrix.assign(ntax, matRow);
+  if (mapPartialAmbigToUnknown && (gapToUnknown || codonBlock->GetGapSymbol() != '\0'))
+    {
+      for (unsigned taxInd = 0; taxInd < ntax; ++taxInd)
+	{
+	  const NxsDiscreteStateRow & sourceRow = codonBlock->discreteMatrix.at(taxInd);
+	  NxsDiscreteStateRow & destRow = aaBlock->discreteMatrix.at(taxInd);
+	  for (unsigned c = 0; c < nc ; ++c)
+	    {
+	      const NxsDiscreteStateCell codon = sourceRow[c];
+	      if (codon < 0 || codon > 63)
+		destRow[c] = NXS_MISSING_CODE;
+	      else
+		destRow[c] = aaIndices.at(codon);
+	    }
+	}
+    }
+  else
+    {
+      throw NxsException("NewProteinCharactersBlock is not implemented for cases in which you are not mapping any ambiguity to the missing state code.");
+    }
+  return aaBlock;
+}
+
+
+/* allocates a new charaters block with all of the active characters in `charBlock`
+   but with a 64-state codon datatype. The order of codons is:
+   0   1   2   3   4   5  ... 63
+   AAA AAC AAG AAT ACA ACC ... TTT
+   The caller is responsible for deleting the new NxsCharactersBlock object
+
+   If honorCharActive is true, then inactive characters are simply skipped in the reading
+   frame (treated as if they were introns) rather than being treated as missing.
+*/
+NxsCharactersBlock * NxsCharactersBlock::NewCodonsCharactersBlock(
+								  const NxsCharactersBlock * dnaBlock,
+								  bool mapPartialAmbigToUnknown,
+								  bool gapsToUnknown,
+								  bool honorCharActive,
+								  const std::list<int> * charIndices,
+								  NxsCharactersBlock ** spareNucs)
+{
+  if (!dnaBlock)
+    return NULL;
+  DataTypesEnum nucType = dnaBlock->GetDataType();
+  if (nucType != NxsCharactersBlock::dna && nucType != NxsCharactersBlock::rna && nucType != NxsCharactersBlock::nucleotide)
+    return NULL;
+  std::list<int> charInds;
+  const std::list<int> * sourceChars;
+  std::list<int> culled;
+  NxsUnsignedSet untranslated;
+
+
+
+  unsigned nc = dnaBlock->GetNCharTotal();
+
+  if (charIndices == NULL)
+    {
+      for (unsigned i = 0; i < nc; ++i)
+	charInds.push_back((int)i);
+      sourceChars = &charInds;
+    }
+  else
+    sourceChars = charIndices;
+
+  if (honorCharActive)
+    {
+      for (std::list<int>::const_iterator cIt = sourceChars->begin(); cIt != sourceChars->end(); ++cIt)
+	{
+	  const int c = *cIt;
+	  if (c < 0 || dnaBlock->IsActiveChar((unsigned) c))
+	    culled.push_back(c);
+	}
+      if (spareNucs)
+	{
+	  for (unsigned c = 0; c < nc; ++c)
+	    {
+	      if (dnaBlock->IsActiveChar((unsigned) c))
+		untranslated.insert(c);
+	    }
+	}
+      sourceChars = &culled;
+    }
+  else if (spareNucs)
+    {
+      for (unsigned c = 0; c < nc; ++c)
+	untranslated.insert(c);
+    }
+
+  const unsigned nnucs = (const unsigned)sourceChars->size();
+  if (nnucs % 3)
+    throw NxsException("Cannot create a codons block with a number of characters that is not a multiple of 3");
+  const unsigned ncodons = nnucs/3;
+
+  /* create a new characters block with the same TAXA, but no ASSUMPTIONS block */
+  NxsTaxaBlockAPI * taxa = dnaBlock->GetTaxaBlockPtr(NULL);
+  NxsCharactersBlock * codonsBlock = new NxsCharactersBlock(taxa, NULL);
+  codonsBlock->SetNChar(ncodons);
+  codonsBlock->SetNTax(dnaBlock->GetNTaxWithData());
+  codonsBlock->missing = dnaBlock->missing;
+  codonsBlock->gap = (gapsToUnknown ? '\0' : dnaBlock->gap);
+  codonsBlock->gapMode = dnaBlock->gapMode;
+  codonsBlock->symbols.assign(64, '\0');
+  codonsBlock->tokens = false;
+  const char * gsl[] = {"AAA",  "AAC",  "AAG",  "AAT",  "ACA",  "ACC",  "ACG",  "ACT",  "AGA",  "AGC",  "AGG",  "AGT",  "ATA",  "ATC",  "ATG",  "ATT",  "CAA",  "CAC",  "CAG",  "CAT",  "CCA",  "CCC",  "CCG",  "CCT",  "CGA",  "CGC",  "CGG",  "CGT",  "CTA",  "CTC",  "CTG",  "CTT",  "GAA",  "GAC",  "GAG",  "GAT",  "GCA",  "GCC",  "GCG",  "GCT",  "GGA",  "GGC",  "GGG",  "GGT",  "GTA",  "GTC",  "GTG",  "GTT",  "TAA",  "TAC",  "TAG",  "TAT",  "TCA",  "TCC",  "TCG",  "TCT",  "TGA",  "TGC",  "TGG [...]
+
+  codonsBlock->globalStateLabels.reserve(64);
+  for (unsigned i = 0 ; i < 64; ++i)
+    codonsBlock->globalStateLabels.push_back(NxsString(gsl[i]));
+
+  /* equivalent of HandleFormat */
+  codonsBlock->datatype = NxsCharactersBlock::codon;
+  codonsBlock->originalDatatype = nucType;
+
+  const NxsPartition dummy;
+  const std::vector<DataTypesEnum> dummyVec;
+  codonsBlock->CreateDatatypeMapperObjects(dummy, dummyVec);
+  NxsDiscreteDatatypeMapper * codonMapper = codonsBlock->GetMutableDatatypeMapperForChar(0);
+  codonMapper->geneticCode = NXS_GCODE_NO_CODE;
+
+  const unsigned ntax = (taxa == 0L ? dnaBlock->GetNTaxWithData() : taxa->GetNTax());
+  codonsBlock->datatypeReadFromFormat = false;
+  codonsBlock->statesFormat = STATES_PRESENT;
+  codonsBlock->restrictionDataype = false;
+  codonsBlock->supportMixedDatatype = false;
+  codonsBlock->convertAugmentedToMixed = false;
+  codonsBlock->writeInterleaveLen = INT_MAX;
+
+
+  const int maxUnambigNucState = 3;
+  const NxsDiscreteStateCell codonMissingState = NXS_MISSING_CODE;
+  NxsDiscreteStateRow matRow(ncodons, 0);
+  codonsBlock->discreteMatrix.assign(ntax, matRow);
+  const std::list<int>::const_iterator endNucIt = sourceChars->end();
+  if (mapPartialAmbigToUnknown && (gapsToUnknown || dnaBlock->GetGapSymbol() != '\0'))
+    {
+      for (unsigned taxInd = 0; taxInd < ntax; ++taxInd)
+	{
+	  std::list<int>::const_iterator nucIt = sourceChars->begin();
+	  const NxsDiscreteStateRow & sourceRow = dnaBlock->discreteMatrix.at(taxInd);
+	  NxsDiscreteStateRow & destRow = codonsBlock->discreteMatrix.at(taxInd);
+	  for (unsigned codonInd = 0; codonInd < ncodons ; ++codonInd)
+	    {
+	      NCL_ASSERT(nucIt != endNucIt);
+	      const int fInd = *nucIt++;
+	      NCL_ASSERT(nucIt != endNucIt);
+	      const int sInd = *nucIt++;
+	      NCL_ASSERT(nucIt != endNucIt);
+	      const int tInd = *nucIt++;
+	      if (spareNucs)
+		{
+		  untranslated.erase(fInd);
+		  untranslated.erase(sInd);
+		  untranslated.erase(tInd);
+		}
+	      if (fInd < 0 || sInd < 0 || tInd < 0)
+		destRow[codonInd] = codonMissingState;
+	      else
+		{
+		  const NxsDiscreteStateCell fb = sourceRow[fInd];
+		  const NxsDiscreteStateCell sb = sourceRow[sInd];
+		  const NxsDiscreteStateCell tb = sourceRow[tInd];
+		  if (fb < 0 || sb < 0 || tb < 0 || fb > maxUnambigNucState || sb > maxUnambigNucState || tb > maxUnambigNucState)
+		    destRow[codonInd] = codonMissingState;
+		  else
+		    destRow[codonInd] = 16*fb + 4*sb + tb;
+		}
+	    }
+	}
+    }
+  else
+    {
+      throw NxsException("NewCodonsCharactersBlock is not implemented for cases in which you are not mapping any ambiguity to the missing state code.");
+    }
+  if (!untranslated.empty())
+    {
+      const unsigned nunt = (const unsigned)untranslated.size();
+
+      NxsCharactersBlock * untBlock = new NxsCharactersBlock(taxa, NULL);
+      untBlock->SetNChar(nunt);
+      untBlock->SetNTax(ntax);
+      untBlock->missing = dnaBlock->missing;
+      untBlock->gap = (gapsToUnknown ? '\0' : dnaBlock->gap);
+      untBlock->gapMode = dnaBlock->gapMode;
+      untBlock->datatype = nucType;
+      untBlock->originalDatatype = dnaBlock->originalDatatype;
+      untBlock->ResetSymbols();
+      untBlock->tokens = false;
+
+
+      untBlock->CreateDatatypeMapperObjects(dummy, dummyVec);
+      untBlock->datatypeReadFromFormat = false;
+      untBlock->statesFormat = STATES_PRESENT;
+      untBlock->restrictionDataype = false;
+      untBlock->supportMixedDatatype = false;
+      untBlock->convertAugmentedToMixed = false;
+      untBlock->writeInterleaveLen = INT_MAX;
+
+
+      NxsDiscreteStateRow umatRow(nunt, 0);
+      untBlock->discreteMatrix.assign(ntax, umatRow);
+      if (mapPartialAmbigToUnknown && (gapsToUnknown || dnaBlock->GetGapSymbol() != '\0'))
+	{
+	  for (unsigned taxInd = 0; taxInd < ntax; ++taxInd)
+	    {
+	      const NxsDiscreteStateRow & sourceRow = dnaBlock->discreteMatrix.at(taxInd);
+	      NxsDiscreteStateRow & destRow = untBlock->discreteMatrix.at(taxInd);
+	      unsigned untIndex = 0;
+	      for (NxsUnsignedSet::const_iterator uIt  = untranslated.begin(); uIt != untranslated.end() ; ++uIt, ++untIndex)
+		{
+		  const unsigned ind = *uIt;
+		  destRow.at(untIndex) = sourceRow[ind];
+		}
+	    }
+	}
+      else
+	{
+	  throw NxsException("NewProteinCharactersBlock is not implemented for cases in which you are not mapping any ambiguity to the missing state code.");
+	}
+      *spareNucs = untBlock;
+    }
+  else if (spareNucs)
+    *spareNucs = NULL;
+  return codonsBlock;
+}
+
+
+std::vector<double>  NxsTransformationManager::GetDoubleWeights(const std::string &set_name) const
+{
+  std::vector<double> r;
+  const ListOfDblWeights *p = 0L;
+  std::map<std::string, ListOfDblWeights>::const_iterator dIt = dblWtSets.begin();
+  for (; dIt != dblWtSets.end(); ++dIt)
+    {
+      if (NxsString::case_insensitive_equals(dIt->first.c_str(), set_name.c_str()))
+	{
+	  p = &(dIt->second);
+	  break;
+	}
+    }
+  if (p)
+    {
+      ListOfDblWeights::const_iterator wIt = p->begin();
+      const ListOfDblWeights::const_iterator ewIt = p->end();
+      for (; wIt != ewIt; ++wIt)
+	{
+	  double w = wIt->first;
+	  const std::set<unsigned> &s = wIt->second;
+	  std::set<unsigned>::const_reverse_iterator ip = s.rbegin();
+	  const std::set<unsigned>::const_reverse_iterator e = s.rend();
+	  for (; ip != e; ++ip)
+	    {
+	      if (*ip >= r.size())
+		r.resize(1 + *ip, 1.0);
+	      r[*ip] = w;
+	    }
+	}
+    }
+  return r;
+}
+
+std::vector<int> NxsTransformationManager::GetIntWeights(const std::string &set_name) const
+{
+  std::vector<int> r;
+  const ListOfIntWeights *p = 0L;
+  std::map<std::string, ListOfIntWeights>::const_iterator dIt = intWtSets.begin();
+  for (; dIt != intWtSets.end(); ++dIt)
+    {
+      if (NxsString::case_insensitive_equals(dIt->first.c_str(), set_name.c_str()))
+	{
+	  p = &(dIt->second);
+	  break;
+	}
+    }
+  if (p)
+    {
+      ListOfIntWeights::const_iterator wIt = p->begin();
+      const ListOfIntWeights::const_iterator ewIt = p->end();
+      for (; wIt != ewIt; ++wIt)
+	{
+	  int w = wIt->first;
+	  const std::set<unsigned> &s = wIt->second;
+	  std::set<unsigned>::const_reverse_iterator ip = s.rbegin();
+	  const std::set<unsigned>::const_reverse_iterator e = s.rend();
+	  for (; ip != e; ++ip)
+	    {
+	      if (*ip >= r.size())
+		r.resize(1 + *ip, 1);
+	      r[*ip] = w;
+	    }
+	}
+    }
+  return r;
+}
+
+/*! creates a datatype mapper from the parsing information (this is the ctor used
+  most frequently during a parse).
+*/
+NxsDiscreteDatatypeMapper::NxsDiscreteDatatypeMapper(
+						     NxsCharactersBlock::DataTypesEnum datatypeE,
+						     const std::string & symbolsStr,
+						     char missingChar,
+						     char gap,
+						     char matchingChar,
+						     bool respectingCase,
+						     const std::map<char, NxsString> & moreEquates)
+  :geneticCode(NXS_GCODE_NO_CODE),
+   cLookup(NULL),
+   stateCodeLookupPtr(NULL),
+   symbols(symbolsStr),
+   nStates(0),
+   matchChar(matchingChar),
+   gapChar(gap),
+   missing(missingChar),
+   respectCase(respectingCase),
+   extraEquates(moreEquates),
+  datatype(datatypeE),
+  restrictionDataype(false),
+  userDefinedEquatesBeforeConversion(false)
+{
+  if (symbols.empty())
+    symbols = NxsCharactersBlock::GetDefaultSymbolsForType(datatype);
+  if (datatype == NxsCharactersBlock::mixed)
+    throw NxsException("Cannot create a mixed datatype mapper"); // this should be the only empty string-generating datatype
+  RefreshMappings(0L);
+}
+
+void NxsDiscreteDatatypeMapper::DebugPrint(std::ostream & out) const
+{
+  out << GetNumStatesIncludingGap() << "states (";
+  if (gapChar == '\0')
+    out << "no gaps";
+  else
+    out << "including the gap \"state\"";
+  const int nsc = (int) stateSetsVec.size();
+  out << '\n' << nsc << " state codes.\n";
+  out << "NEXUS     State Code      States\n";
+  for (int sc = sclOffset; sc < sclOffset + nsc; ++sc)
+    {
+      std::string nex;
+      for (int c = 0; c < 127; ++c)
+	{
+	  if (cLookup[c] == sc)
+	    nex.append(1, (char) c);
+	}
+      int buf =  (int) (10 - nex.size());
+      nex.append(buf, ' ');
+      out << nex << "    " << sc << "     ";
+      const std::set<NxsDiscreteStateCell>	&ss = GetStateSetForCode(sc);
+      std::string decoded;
+      for (std::set<NxsDiscreteStateCell>::const_iterator s = ss.begin(); s != ss.end(); ++s)
+	decoded.append(StateCodeToNexusString(*s));
+      if (decoded.length() < 2)
+	out << decoded;
+      else if (IsPolymorphic(sc))
+	out << '(' << decoded << ')';
+      else
+	out << '{' << decoded << '}';
+      out << '\n';
+    }
+}
+
+/*!
+  Takes the parsed settings that pertain to the datatype and converts them into a set of NxsDiscreteDatatypeMapper
+  objects to be used to encode the characters.
+*/
+void NxsCharactersBlock::CreateDatatypeMapperObjects(const NxsPartition & dtParts, const std::vector<DataTypesEnum> & dtcodes)
+{
+  try {
+    mixedTypeMapping.clear();
+    if (datatype != mixed)
+      {
+	NxsDiscreteDatatypeMapper d(datatype, symbols, missing, gap, matchchar, respectingCase, userEquates);
+	datatype = d.GetDatatype();
+	DatatypeMapperAndIndexSet das(d, NxsUnsignedSet());
+	datatypeMapperVec.clear();
+	datatypeMapperVec.push_back(das);
+      }
+    else
+      {
+	datatypeMapperVec.clear();
+	NCL_ASSERT(dtParts.size() == dtcodes.size());
+	datatypeMapperVec.reserve(dtParts.size());
+	std::vector<DataTypesEnum>::const_iterator cIt = dtcodes.begin();
+	//@@@TMP add code to fill  DataTypesEnum -> NxsUnsignedSet map  here ! for DZ and DS.
+	for (NxsPartition::const_iterator pIt = dtParts.begin(); pIt != dtParts.end(); ++pIt, ++cIt)
+	  {
+	    std::string mt;
+	    if (*cIt == standard)
+	      mt.assign("0123456789"); /*mrbayes is the only program to support MIXED and it uses a default (not extendable) symbols list of 0123456789 rather than 01*/
+	    NxsDiscreteDatatypeMapper d(*cIt, mt, missing, gap, matchchar, respectingCase, userEquates);
+	    const NxsUnsignedSet & indexSet = pIt->second;
+	    DatatypeMapperAndIndexSet das(d, pIt->second);
+	    NxsUnsignedSet & mappedInds =  mixedTypeMapping[*cIt];
+	    mappedInds.insert(indexSet.begin(), indexSet.end());
+	    datatypeMapperVec.push_back(das);
+	  }
+      }
+  }
+  catch (const NxsException & x)
+    {
+      std::string y = "An error was detected while trying to create a datatype mapping structure.  This portion of code tends to generate cryptic error messages, so if the following message is not helpful, double check the syntax in the FORMAT command of your block.\n";
+      y.append(x.msg);
+      throw NxsException(y, x.pos, x.line, x.col);
+    }
+}
+
+
+
+
+/*!
+  If you say FORMAT DATATYPE=DNA SYMBOLS="01" ; then the valid symbols become "ACGT01"
+
+  AugmentedSymbolsToMixed tries to split such a matrix into a datatype=mixed(dna:charset_dna,standard:charset_std)
+  by inferring the charpartition (charset_dna,charset_std).  It does this by using GetNamedStateSetOfColumn to
+  detect which states were listed in a column.
+
+  Returns true if the translation to mixed was performed.  This will only occur if GetOriginalDataType() != GetDataType()
+  because this is the symptom that there was symbol augmentation of a built in datatype.
+
+  Note that in the GetNamedStateSetOfColumn
+  then ? will not expand the states present in a symbol. Thus when parsing:
+  Matrix 1:                     Matrix 2:
+  s   ACGT10{ACGT01-}           s   ACGT10?
+  t   ACGT100                   t   ACGT100
+  The last character of the first taxon would be parsed as having the potential to have states {ACGT01-}.
+  But when interperted with GetNamedStateSetOfColumn, Matrix 2 can be "explained" by four DNA columns, and three
+  Standard (01) columns.  Matrix 1, on the other hand would be found to have four DNA columns, and two
+  Standard (01) columns, and one standard ("ACGT01") column.
+  Note: this function ignores the gap mode setting and treats gaps as newstates for the purposes of
+  the conversion.
+
+  Temporary:  Will return false if userDefinedEquatesBeforeConversion is true
+*/
+bool NxsCharactersBlock::AugmentedSymbolsToMixed()
+{
+  DataTypesEnum odt = GetOriginalDataType();
+  if (IsMixedType() || (odt == GetDataType()))
+    return false;
+  const std::string origSymb = GetDefaultSymbolsForType(odt);
+  const std::string cutSymb = symbols.substr(0, origSymb.length());
+  if (origSymb != cutSymb)
+    return false;
+  const std::string augmentSymbols = symbols.substr(origSymb.length());
+  if (augmentSymbols.empty())
+    return false;
+  for (std::string::const_iterator a = augmentSymbols.begin(); a != augmentSymbols.end(); ++a)
+    {
+      if (!isdigit(*a))
+	return false;
+    }
+
+  NxsUnsignedSet stdTypeChars;
+  NxsUnsignedSet origTypeChars;
+  std::set<NxsDiscreteStateCell> torigStateInds;
+  std::set<NxsDiscreteStateCell> tstdStateInds;
+  torigStateInds.insert(NXS_GAP_STATE_CODE);
+  tstdStateInds.insert(NXS_GAP_STATE_CODE);
+  for (NxsDiscreteStateCell j = 0; j < (NxsDiscreteStateCell)origSymb.length(); ++j)
+    torigStateInds.insert(j);
+  for (NxsDiscreteStateCell j =  (NxsDiscreteStateCell)origSymb.length(); j < (NxsDiscreteStateCell)symbols.length(); ++j)
+    tstdStateInds.insert(j);
+  const std::set<NxsDiscreteStateCell> origStateInds(torigStateInds);
+  const unsigned nosi = (unsigned)origStateInds.size();
+  const std::set<NxsDiscreteStateCell> stdStateInds(tstdStateInds);
+  const unsigned nssi = (unsigned)stdStateInds.size();
+
+  /*Check each column for patterns that can not be mapped to origSymb or augmentSymbols */
+  const unsigned nChars = GetNCharTotal();
+  GapModeEnum cached_gap_mode = this->gapMode;
+  this->gapMode = GAP_MODE_NEWSTATE;
+  try {
+    for (unsigned colIndex = 0; colIndex < nChars; ++colIndex)
+      {
+	const std::set<NxsDiscreteStateCell> cs = GetNamedStateSetOfColumn(colIndex);
+	std::set<NxsDiscreteStateCell> origUnion;
+	set_union(origStateInds.begin(), origStateInds.end(), cs.begin(), cs.end(), inserter(origUnion, origUnion.begin()));
+	if (origUnion.size() > nosi)
+	  {
+	    std::set<NxsDiscreteStateCell> stdUnion;
+	    set_union(stdStateInds.begin(), stdStateInds.end(), cs.begin(), cs.end(), inserter(stdUnion, stdUnion.begin()));
+	    if (stdUnion.size() > nssi)
+	      return false;
+	    stdTypeChars.insert(colIndex);
+	  }
+	else
+	  origTypeChars.insert(colIndex);
+      }
+  }
+  catch (...)
+    {
+      this->gapMode = cached_gap_mode;
+      throw;
+    }
+  this->gapMode = cached_gap_mode;
+  /* If we get here then the mapping to mixed type will succeed */
+
+  /* copy the incoming matrix and mapper */
+  VecDatatypeMapperAndIndexSet mdm = datatypeMapperVec;
+  const NxsDiscreteDatatypeMapper & oldMapper = mdm[0].first;
+  if (oldMapper.GetUserDefinedEquatesBeforeConversion())
+    return false; /* dealing with equates correctly is not implemented below, so we'll bale out */
+
+  /* add the new mappers */
+  std::map<char, NxsString> noEquates;
+  datatypeMapperVec.clear();
+  NxsDiscreteDatatypeMapper o(odt, origSymb, missing, gap, matchchar, respectingCase, noEquates);
+  datatypeMapperVec.push_back(DatatypeMapperAndIndexSet(o, origTypeChars));
+  NxsDiscreteDatatypeMapper s(NxsCharactersBlock::standard, augmentSymbols, missing, gap, matchchar, respectingCase, noEquates);
+  datatypeMapperVec.push_back(DatatypeMapperAndIndexSet(s, stdTypeChars));
+
+
+  NxsDiscreteDatatypeMapper & newOrigTMapper = datatypeMapperVec[0].first;
+  NxsDiscreteDatatypeMapper & newStdTMapper = datatypeMapperVec[1].first;
+
+  /* now we recode discrete matrix with new state codes */
+  const NxsDiscreteStateCell nOrigStates = (NxsDiscreteStateCell) origSymb.size();
+  std::map<NxsDiscreteStateCell, NxsDiscreteStateCell> oldToNewStateCode;
+  NxsDiscreteStateMatrix::iterator rowIt = discreteMatrix.begin();
+  for (unsigned colIndex = 0; rowIt != discreteMatrix.end(); ++colIndex, ++rowIt)
+    {
+      NxsDiscreteStateRow & row = *rowIt;
+      unsigned column = 0;
+      for (NxsDiscreteStateRow::iterator cell = row.begin(); cell != row.end(); ++cell, ++column)
+	{
+	  const NxsDiscreteStateCell initStateCode = *cell;
+	  if (initStateCode  >= 0 ) //gap and missing codes do not need translation
+	    {
+	      std::map<NxsDiscreteStateCell, NxsDiscreteStateCell>::const_iterator otnIt = oldToNewStateCode.find(initStateCode);
+	      if (otnIt == oldToNewStateCode.end())
+		{
+		  const bool isOrigT = origTypeChars.count(column) > 0;
+		  const std::set<NxsDiscreteStateCell> oldSymbols = oldMapper.GetStateSetForCode(initStateCode);
+		  const std::string oldNexusString = oldMapper.StateCodeToNexusString(initStateCode);
+		  const char oldNexusChar = (oldNexusString.length() == 1 ? oldNexusString[0] : '\0');
+		  const bool isPoly =  oldMapper.IsPolymorphic(initStateCode);
+		  NxsDiscreteStateCell newStateCode ;
+		  if (isOrigT)
+		    { //old symbol indices will still be the new symbol indices
+		      newStateCode = newOrigTMapper.StateCodeForStateSet(oldSymbols, isPoly, true, oldNexusChar);
+		      newOrigTMapper.StateCodeToNexusString(newStateCode);
+		    }
+		  else
+		    {
+		      std::set<NxsDiscreteStateCell> transSymbols;
+		      for (std::set<NxsDiscreteStateCell>::const_iterator sIt = oldSymbols.begin(); sIt != oldSymbols.end(); ++sIt)
+			{
+			  if (*sIt >= nOrigStates)
+			    transSymbols.insert(*sIt - nOrigStates);
+			  else
+			    {
+			      NCL_ASSERT(*sIt < 0);
+			      transSymbols.insert(*sIt);
+			    }
+			}
+		      newStateCode = newStdTMapper.StateCodeForStateSet(transSymbols, isPoly, true, oldNexusChar);
+		      newStdTMapper.StateCodeToNexusString(newStateCode);
+		    }
+		  oldToNewStateCode[initStateCode] = newStateCode;
+		  *cell = newStateCode;
+		}
+	      else
+		*cell = otnIt->second;
+	    }
+	}
+    }
+  datatype = NxsCharactersBlock::mixed;
+  mixedTypeMapping.clear();
+  mixedTypeMapping[odt] = origTypeChars;
+  mixedTypeMapping[NxsCharactersBlock::standard] = stdTypeChars;
+  return true;
+}
+/*!
+  Called when FORMAT command needs to be parsed from within the DIMENSIONS block. Deals with everything after the
+  token FORMAT up to and including the semicolon that terminates the FORMAT command.
+*/
+void NxsCharactersBlock::HandleFormat(
+				      NxsToken &token)	/* the token used to read from `in' */
+{
+  errormsg.clear();
+  ProcessedNxsCommand tokenVec;
+  token.ProcessAsCommand( &tokenVec);
+
+  const ProcessedNxsCommand::const_iterator tvEnd = tokenVec.end();
+  NxsPartition dtParts;
+  std::vector<DataTypesEnum> dtv;
+  std::vector<bool> isR;
+  if (!datatypeReadFromFormat)
+    {
+      bool standardDataTypeAssumed = true;
+      bool ignoreCaseAssumed = true;
+      datatype = standard;
+      originalDatatype = standard;
+      ResetSymbols();
+      respectingCase = false;
+      restrictionDataype = false;
+      for (ProcessedNxsCommand::const_iterator wIt = tokenVec.begin(); wIt != tvEnd; ++wIt)
+	{
+	  if (wIt->Equals("DATATYPE"))
+	    {
+	      DemandEquals(wIt, tvEnd, " after keyword DATATYPE");
+	      ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, " after \"DATATYPE =\" in FORMAT command");
+	      if (wIt->Equals("STANDARD"))
+		{
+		  datatype = standard;
+		  symbols = "01";
+		}
+	      else if (wIt->Equals("DNA"))
+		datatype = dna;
+	      else if (wIt->Equals("RNA"))
+		datatype = rna;
+	      else if (wIt->Equals("NUCLEOTIDE"))
+		datatype = nucleotide;
+	      else if (wIt->Equals("PROTEIN"))
+		datatype = protein;
+	      else if (wIt->Equals("RESTRICTION"))
+		{
+		  datatype = standard;
+		  restrictionDataype = true;
+		}
+	      else if (wIt->Equals("CONTINUOUS"))
+		{
+		  datatype = continuous;
+		  statesFormat = INDIVIDUALS;
+		  items = std::vector<std::string>(1, std::string("AVERAGE"));
+		  tokens = true;
+		}
+	      else if (supportMixedDatatype && wIt->Equals("MIXED"))
+		{
+		  datatype = mixed;
+		  ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, " after \"DATATYPE=MIXED\" in FORMAT command. Expecting (");
+		  if (!wIt->Equals("("))
+		    {
+		      errormsg << "Expecting ( after \"DATATYPE=MIXED\" but found " << wIt->GetToken();
+		      throw NxsException(errormsg, *wIt);
+		    }
+		  ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, " after \"DATATYPE=MIXED(\" in FORMAT command. Expecting a datatype");
+		  ostringstream fakestream;
+		  while (!wIt->Equals(")"))
+		    {
+		      fakestream << ' ' << NxsString::GetEscaped(wIt->GetToken());
+		      ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, " in \"DATATYPE=MIXED\" in FORMAT command. Expecting a closing ) to terminate the list.");
+		    }
+		  fakestream << ';';
+		  const std::string accumulated = fakestream.str();
+		  istringstream fakeinput(accumulated);
+		  NxsToken subToken(fakeinput);
+		  try
+		    {
+		      std::string mt("mixed datatype definition");
+		      subToken.GetNextToken();
+		      this->ReadPartitionDef(dtParts, *this, mt, "Character", "Datatype=Mixed", subToken, false, true, false);
+		    }
+		  catch (NxsException & x)
+		    {
+		      errormsg = x.msg;
+		      throw NxsException(errormsg, *wIt);
+		    }
+		  catch (...)
+		    {
+		      errormsg << "Error parsing \"DATATYPE=MIXED\" subcommand in FORMAT the command.";
+		      throw NxsException(errormsg, *wIt);
+		    }
+		  for (NxsPartition::const_iterator pIt = dtParts.begin(); pIt != dtParts.end(); ++pIt)
+		    {
+		      NxsString name(pIt->first.c_str());
+		      name.ToUpper();
+		      if (name == "RESTRICTION")
+			{
+			  dtv.push_back(standard);
+			  isR.push_back(true);
+			}
+		      else
+			{
+			  isR.push_back(false);
+			  if (name == "STANDARD")
+			    dtv.push_back(standard);
+			  else if (name == "DNA")
+			    dtv.push_back(dna);
+			  else if (name == "RNA")
+			    dtv.push_back(rna);
+			  else if (name == "NUCLEOTIDE")
+			    dtv.push_back(nucleotide);
+			  else if (name == "PROTEIN")
+			    dtv.push_back(protein);
+			  else
+			    {
+			      errormsg << pIt->first <<  " is not a valid DATATYPE within a " <<  NCL_BLOCKTYPE_ATTR_NAME << " block";
+			      throw NxsException(errormsg, *wIt);
+			    }
+			}
+		    }
+		}
+	      else
+		{
+		  errormsg << wIt->GetToken() <<  " is not a valid DATATYPE within a " <<  NCL_BLOCKTYPE_ATTR_NAME << " block";
+		  throw NxsException(errormsg, *wIt);
+		}
+	      datatypeReadFromFormat = true;
+	      originalDatatype = datatype;
+	      ResetSymbols();
+	      standardDataTypeAssumed = false;
+	      if (!ignoreCaseAssumed)
+		break;
+	    }
+	  else if (wIt->Equals("RESPECTCASE"))
+	    {
+	      ignoreCaseAssumed = false;
+	      respectingCase = true;
+	      if (!standardDataTypeAssumed)
+		break;
+	    }
+	}
+    }
+  for (ProcessedNxsCommand::const_iterator wIt = tokenVec.begin(); wIt != tvEnd; ++wIt)
+    {
+
+      if (wIt->Equals("DATATYPE"))// we should have already processed this
+	{
+	  ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, "after DATATYPE in FORMAT command"); // =
+	  ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, "after DATATYPE = in FORMAT command"); // datatype
+	}
+      else if (wIt->Equals("RESPECTCASE"))
+	{
+	  if (!respectingCase)
+	    {
+	      errormsg << "Only one FORMAT command should occur per DATA or CHARACTERS block.";
+	      throw NxsException(errormsg, *wIt);
+	    }
+	}
+      else if (wIt->Equals("MISSING"))
+	{
+	  DemandEquals(wIt, tvEnd, "after keyword MISSING");
+	  ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, "after \"MISSING = \" in FORMAT command");
+	  const std::string t = wIt->GetToken();
+	  if (t.length() != 1)
+	    {
+	      errormsg << "MISSING symbol should be a single character, but " << t << " was specified";
+	      WarnDangerousContent(errormsg, *wIt);
+	    }
+	  else if (token.IsPunctuationToken(t) && !token.IsPlusMinusToken(t))
+	    {
+	      errormsg << "MISSING symbol specified cannot be a punctuation token (" << t << " was specified)";
+	      WarnDangerousContent(errormsg, *wIt);
+	    }
+	  else if (token.IsWhitespaceToken(t))
+	    {
+	      errormsg << "MISSING symbol specified cannot be a whitespace character (" << t << " was specified)";
+	      WarnDangerousContent(errormsg, *wIt);
+	    }
+	  missing = t[0];
+	}
+      else if (wIt->Equals("GAP"))
+	{
+	  DemandEquals(wIt, tvEnd, "after keyword GAP");
+	  ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, "after \"GAP = \" in FORMAT command");
+	  const std::string t = wIt->GetToken();
+	  if (t.length() != 1)
+	    {
+	      errormsg << "GAP symbol should be a single character, but " << t << " was specified";
+	      WarnDangerousContent(errormsg, *wIt);
+	    }
+	  else if (token.IsPunctuationToken(t) && !token.IsPlusMinusToken(t))
+	    {
+	      errormsg << "GAP symbol specified cannot be a punctuation token " << t << " was specified";
+	      WarnDangerousContent(errormsg, *wIt);
+	    }
+	  else if (token.IsWhitespaceToken(t))
+	    {
+	      errormsg << "GAP symbol specified cannot be a whitespace character " << t << " was specified";
+	      WarnDangerousContent(errormsg, *wIt);
+	    }
+	  gap = t[0];
+	}
+      else if (wIt->Equals("MATCHCHAR"))
+	{
+	  DemandEquals(wIt, tvEnd, "after keyword MATCHCHAR");
+	  ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, "after \"MATCHCHAR = \" in FORMAT command");
+	  const std::string t = wIt->GetToken();
+	  if (t.length() != 1)
+	    {
+	      errormsg << "MATCHCHAR symbol should be a single character, but " << t << " was specified";
+	      WarnDangerousContent(errormsg, *wIt);
+	    }
+	  else if (token.IsPunctuationToken(t) && !token.IsPlusMinusToken(t))
+	    {
+	      errormsg << "MATCHCHAR symbol specified cannot be a punctuation token (" << t << " was specified)";
+	      WarnDangerousContent(errormsg, *wIt);
+	    }
+	  else if (token.IsWhitespaceToken(t))
+	    {
+	      errormsg << "MATCHCHAR symbol specified cannot be a whitespace character (" << t << " was specified)";
+	      WarnDangerousContent(errormsg, *wIt);
+	    }
+	  matchchar = t[0];
+	}
+      else if (wIt->Equals("SYMBOLS") || wIt->Equals("SYMBOL"))
+	{
+	  if (datatype == NxsCharactersBlock::continuous)
+	    throw NxsException("SYMBOLS subcommand not allowed for DATATYPE=CONTINUOUS", *wIt);
+	  if (restrictionDataype)
+	    throw NxsException("SYMBOLS subcommand not allowed for DATATYPE=RESTRICTION", *wIt);
+	  NxsDiscreteStateCell numDefStates;
+	  unsigned maxNewStates = NCL_MAX_STATES;
+	  switch(datatype)
+	    {
+	    case NxsCharactersBlock::dna:
+	    case NxsCharactersBlock::rna:
+	    case NxsCharactersBlock::nucleotide:
+	      numDefStates = 4;
+	      maxNewStates = NCL_MAX_STATES-4;
+	      break;
+
+	    case NxsCharactersBlock::protein:
+	      numDefStates = 21;
+	      maxNewStates = NCL_MAX_STATES-21;
+	      break;
+
+	    default:
+	      numDefStates = 0; // replace symbols list for standard datatype
+	      symbols.clear();
+	      maxNewStates = NCL_MAX_STATES;
+	    }
+	  DemandEquals(wIt, tvEnd, "after keyword SYMBOLS");
+	  ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, "\" to start the symbols list");
+	  if (!wIt->Equals("\""))
+	    {
+	      errormsg << "Expecting \" after Symbols= but " << wIt->GetToken() << " was found";
+	      throw NxsException(errormsg, *wIt);
+	    }
+	  ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, "closing \" of symbols list");
+	  NxsString s;
+	  while (!wIt->Equals("\""))
+	    {
+	      s += wIt->GetToken().c_str();
+	      ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, "closing \" of symbols list");
+	    }
+
+	  const std::string tos = NxsString::strip_whitespace(s);
+	  const char * to = tos.c_str();
+	  unsigned tlen = (unsigned)tos.length();
+	  if (tlen > maxNewStates)
+	    {
+	      errormsg << "SYMBOLS defines " << tlen << " new states but only " << maxNewStates << " new states allowed for this DATATYPE";
+	      throw NxsException(errormsg, *wIt);
+	    }
+	  // Check to make sure user has not used any symbols already in the
+	  // default symbols list for this data type
+	  //
+	  std::string preprocessedS;
+	  for (unsigned i = 0; i < tlen; i++)
+	    {
+	      if (to[i] == '~')
+		{
+		  if (i == 0 || i == tlen -1)
+		    {
+		      errormsg << "A ~ in a SYMBOLS list is interpreted as a range of symbols.  The ~ cannot be the first or last character in the symbols list";
+		      throw NxsException(errormsg, token);
+		    }
+		  const int jj = i - 1 ;
+		  const char prevChar = to[jj];
+		  const char nextChar = to[i+1];
+		  if ((isdigit(prevChar) && isdigit(nextChar)) || (isalpha(prevChar) && isalpha(nextChar)))
+		    {
+		      if (nextChar > prevChar)
+			{
+			  for (char c = (char)((int)prevChar + 1) ; c < nextChar;)
+			    {
+			      preprocessedS.append(1, c);
+			      c = (char) ((int)c + 1);
+			    }
+			}
+		      else
+			{
+			  errormsg << "Endpoint of SYMBOLS range must be greater than the starting point.  This was not true of " << prevChar << '~' << nextChar;
+			  throw NxsException(errormsg, token);
+			}
+		    }
+		  else
+		    {
+		      errormsg << prevChar << '~' << nextChar << " is an illegal SYMBOLS range. A range must go from a letter to a letter or from a number to number" ;
+		      throw NxsException(errormsg, token);
+		    }
+		}
+	      else
+		preprocessedS += to[i];
+	    }
+	  NxsString processedS;
+	  for (std::string::const_iterator pp = preprocessedS.begin(); pp != preprocessedS.end(); ++pp)
+	    {
+	      const char c = *pp;
+	      if (IsInSymbols(c))
+		{
+		  errormsg << "The character " << c << " defined in SYMBOLS is predefined for this DATATYPE and should not occur in a SYMBOLS statement";
+		  if (nexusReader)
+		    {
+		      nexusReader->NexusWarnToken(errormsg, NxsReader::SKIPPING_CONTENT_WARNING, token);
+		      errormsg.clear();
+		    }
+		}
+	      else if (   (respectingCase && (userEquates.find(c) != userEquates.end()))
+			  || (! respectingCase && (userEquates.find(toupper(c)) != userEquates.end() || userEquates.find(tolower(*pp)) != userEquates.end())))
+		{
+		  errormsg << "The character " << *pp << " defined in SYMBOLS subcommand, has already been introduced as an EQUATE key.  The use of a character as both a state symbol and an equate key is not allowed.";
+		  throw NxsException(errormsg, token);
+		}
+	      else
+		processedS += *pp;
+	    }
+	  if (!processedS.empty())
+	    {
+	      if (this->datatype == dna || this->datatype == rna || this->restrictionDataype || this->datatype == protein)
+		{
+		  if (this->allowAugmentingOfSequenceSymbols)
+		    {
+		      errormsg << "Adding symbols to the " << GetNameOfDatatype(this->datatype) << " datatype will cause the matrix to be treated as if it were a";
+		      if (this->convertAugmentedToMixed)
+			errormsg << " MIXED datatype matrix";
+		      else
+			errormsg << " STANDARD datatype matrix";
+		      if (!this->convertAugmentedToMixed)
+			nexusReader->NexusWarnToken(errormsg, NxsReader::AMBIGUOUS_CONTENT_WARNING, token);
+		      errormsg.clear();
+		    }
+		  else
+		    {
+		      errormsg << "Symbols cannot be added to the " << GetNameOfDatatype(this->datatype) << " datatype.";
+		      throw NxsException(errormsg, token);
+		    }
+		}
+	      // If we've made it this far, go ahead and add the user-defined
+	      // symbols to the end of the list of predefined symbols
+	      //
+	      symbols += processedS.c_str();
+	    }
+	}
+
+      else if (wIt->Equals("EQUATE"))
+	{
+	  if (datatype == NxsCharactersBlock::continuous)
+	    throw NxsException("EQUATE subcommand not allowed for DATATYPE=CONTINUOUS", *wIt);
+
+	  DemandEquals(wIt, tvEnd, "after keyword EQUATE");
+	  ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, "\" to start the Equate definition");
+	  if (!wIt->Equals("\""))
+	    {
+	      errormsg << "Expecting '\"' after keyword EQUATE but found " << wIt->GetToken() << " instead";
+	      throw NxsException(errormsg, *wIt);
+	    }
+	  ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, "\" to end the Equate definition");
+	  while (!wIt->Equals("\""))
+	    {
+	      std::string t = wIt->GetToken();
+	      if (t.length() != 1)
+		{
+		  errormsg << "Expecting single-character EQUATE symbol but found " << wIt->GetToken() << " instead";
+		  throw NxsException(errormsg, *wIt);
+		}
+	      const char ch = t[0];
+	      bool badEquateSymbol = false;
+
+	      // Equate symbols cannot be punctuation (except for + and -)
+	      //
+	      if (token.IsPunctuationToken(t) && !token.IsPlusMinusToken(t))
+		badEquateSymbol = true;
+	      else if (ch == '^')
+		badEquateSymbol = true;
+	      if (badEquateSymbol)
+		{
+		  errormsg << "EQUATE symbol specified (" << wIt->GetToken() <<  ") is not valid. Equate symbols cannot be any of the following: ()[]{}/\\,;:=*'\"`<>^";
+		  WarnDangerousContent(errormsg, *wIt);
+		}
+	      if (ch == missing || ch == matchchar || ch == gap || IsInSymbols(ch))
+		{
+		  errormsg << "EQUATE symbol specified (" << wIt->GetToken() <<  ") is not valid; An Equate symbol cannot be a state symbol or identical to the  missing,  gap, or matchchar symbols.";
+		  throw NxsException(errormsg, *wIt);
+		}
+
+	      DemandEquals(wIt, tvEnd, " in EQUATE definition");
+	      ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, "State or set of states in Equate definition");
+	      NxsString s;
+	      s = wIt->GetToken().c_str();
+	      if (wIt->Equals("{"))
+		{
+		  while (!wIt->Equals("}"))
+		    {
+		      ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, "} to close the state set in an equate definition");
+		      s += wIt->GetToken().c_str();
+		    }
+		}
+	      else if (wIt->Equals("("))
+		{
+		  while (!wIt->Equals(")"))
+		    {
+		      ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, ") to close the state set in an equate definition");
+		      s += wIt->GetToken().c_str();
+		    }
+		}
+	      const std::string nows = NxsString::strip_whitespace(s);
+	      userEquates[ch] = NxsString(nows.c_str());
+	      ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, "\" to end the Equate definition");
+	    }
+	}
+
+      else if (wIt->Equals("LABELS"))
+	labels = true;
+      else if (wIt->Equals("NOLABELS"))
+	labels = false;
+      else if (wIt->Equals("TRANSPOSE"))
+	transposing = true;
+      else if (wIt->Equals("INTERLEAVE"))
+	interleaving = true;
+      else if (wIt->Equals("ITEMS"))
+	{
+	  DemandEquals(wIt, tvEnd, "after keyword ITEMS");
+	  items.clear();
+	  // This should be STATES (no other item is supported at this time)
+	  //
+	  ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, "after \"ITEMS =\" in FORMAT command");
+	  if (datatype == NxsCharactersBlock::continuous)
+	    {
+	      std::string s;
+	      if (wIt->Equals("("))
+		{
+		  ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, ") to close Items list in FORMAT command");
+		  while (!wIt->Equals(")"))
+		    {
+		      s = wIt->GetToken();
+		      NxsString::to_upper(s);
+		      items.push_back(std::string(s.c_str()));
+		      ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, ") to close Items list in FORMAT command");
+		    }
+		}
+	      else
+		{
+		  s = wIt->GetToken();
+		  NxsString::to_upper(s);
+		  items.push_back(std::string(s.c_str()));
+		}
+	    }
+	  else
+	    {
+	      if (!wIt->Equals("STATES"))
+		throw NxsException("Sorry, only ITEMS=STATES is supported for discrete datatypes at this time", *wIt);
+	      items = std::vector<std::string>(1, std::string("STATES"));
+	    }
+	}
+      else if (wIt->Equals("STATESFORMAT"))
+	{
+	  DemandEquals(wIt, tvEnd, "after keyword STATESFORMAT");
+	  ProcessedNxsToken::IncrementNotLast(wIt, tvEnd, "after \"STATESFORMAT =\" in FORMAT command");
+	  if (wIt->Equals("STATESPRESENT"))
+	    statesFormat = STATES_PRESENT;
+	  else
+	    {
+	      if (datatype == NxsCharactersBlock::continuous)
+		{
+		  if (wIt->Equals("INDIVIDUALS"))
+		    statesFormat = INDIVIDUALS;
+		  else
+		    throw NxsException("Sorry, only STATESFORMAT=STATESPRESENT or STATESFORMAT=INDIVIDUALS are supported for continuous datatypes at this time", *wIt);
+		}
+	      else
+		throw NxsException("Sorry, only STATESFORMAT=STATESPRESENT supported for discrete datatypes at this time", *wIt);
+	    }
+	}
+      else if (wIt->Equals("TOKENS"))
+	tokens = true;
+      else if (wIt->Equals("NOTOKENS"))
+	{
+	  if (datatype == NxsCharactersBlock::continuous)
+	    throw NxsException("NOTOKENS is not allowed for the CONTINUOUS datatype", *wIt);
+	  tokens = false;
+	}
+    }
+  if (IsInSymbols(missing))
+    {
+      errormsg << "The \"missing\" character \'" << missing << "\' may not be included in the SYMBOLS list.";
+      throw NxsException(errormsg, *tokenVec.begin());
+    }
+  if (IsInSymbols(matchchar))
+    {
+      errormsg << "The \"matchchar\" character \'" << matchchar << "\' may not be included in the SYMBOLS list.";
+      throw NxsException(errormsg, *tokenVec.begin());
+    }
+  if (IsInSymbols(gap))
+    {
+      errormsg << "The \"gap\" character \'" << gap << "\' may not be included in the SYMBOLS list.";
+      throw NxsException(errormsg, *tokenVec.begin());
+    }
+
+  if (matchchar != '\0')
+    {
+      if ((matchchar == gap) || (!respectingCase && toupper(matchchar) == toupper(gap)))
+	{
+	  errormsg << "MatchChar and Gap symbol cannot be identical!  Both were set to " << gap;
+	  throw NxsException(errormsg, *tokenVec.begin());
+	}
+      if ((matchchar == missing) || (!respectingCase && toupper(matchchar) == toupper(missing)))
+	{
+	  errormsg << "MatchChar and Missing symbol cannot be identical!  Both were set to " << missing;
+	  throw NxsException(errormsg, *tokenVec.begin());
+	}
+    }
+  if ((gap != '\0') && ((gap == missing) || (!respectingCase && toupper(gap) == toupper(missing))))
+    {
+      errormsg << "Gap symbol and Missing symbol cannot be identical!  Both were set to " << missing;
+      throw NxsException(errormsg, *tokenVec.begin());
+    }
+
+  // Perform some last checks before leaving the FORMAT command
+  //
+  if (!tokens && datatype == continuous)
+    GenerateNxsException(token, "TOKENS must be defined for DATATYPE=CONTINUOUS");
+  if (tokens && (datatype == dna || datatype == rna || datatype == nucleotide))
+    GenerateNxsException(token, "TOKENS not allowed for the DATATYPEs DNA, RNA, or NUCLEOTIDE");
+  CreateDatatypeMapperObjects(dtParts, dtv);
+  if (IsMixedType() && tokens)
+    {
+      errormsg = "The combination of DATATYPE=Mixed  and TOKENS are not currently supported.";
+      throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+    }
+  unsigned mapInd = 0;
+  for (std::vector<bool>::const_iterator b = isR.begin(); b != isR.end(); ++b, ++mapInd)
+    {
+      if (*b)
+	{
+	  DatatypeMapperAndIndexSet &mapper = datatypeMapperVec.at(mapInd);
+	  mapper.first.SetWasRestrictionDataype(true);
+	}
+    }
+}
+
+/*! creates a standard datatype mapper (symbols "01" and no gaps or equates) */
+NxsDiscreteDatatypeMapper::NxsDiscreteDatatypeMapper()
+  :geneticCode(NXS_GCODE_NO_CODE),
+   datatype(NxsCharactersBlock::standard),
+   restrictionDataype(false),
+   userDefinedEquatesBeforeConversion(false)
+{
+  symbols.assign("01");
+  matchChar = '\0';
+  gapChar = '\0';
+  missing = '?';
+  respectCase = false;
+  RefreshMappings(0L);
+}
+
+NxsDiscreteDatatypeMapper & NxsDiscreteDatatypeMapper::operator=(const NxsDiscreteDatatypeMapper& other)
+{
+  symbols = other.symbols;
+  lcsymbols = other.lcsymbols;
+  nStates = other.nStates;
+  matchChar = other.matchChar;
+  gapChar = other.gapChar;
+  missing = other.missing;
+  respectCase = other.respectCase;
+  extraEquates = other.extraEquates;
+  datatype = other.datatype;
+  geneticCode = other.geneticCode;
+  sclOffset = other.sclOffset;
+  stateSetsVec = other.stateSetsVec;
+  if (stateSetsVec.empty())
+    stateCodeLookupPtr = 0L;
+  else
+    stateCodeLookupPtr = &stateSetsVec[-sclOffset];
+  charToStateCodeLookup = other.charToStateCodeLookup;
+  if (charToStateCodeLookup.empty())
+    cLookup = 0L;
+  else
+    cLookup = &charToStateCodeLookup[127];
+  restrictionDataype = other.restrictionDataype;
+  userDefinedEquatesBeforeConversion = other.userDefinedEquatesBeforeConversion;
+  return *this;
+}
+
+/*! creates a datatype mapper for a datatype with the default symbols, and possibly a gap char.
+
+  Uses ? as the missing symbol.
+*/
+NxsDiscreteDatatypeMapper::NxsDiscreteDatatypeMapper(
+						     NxsCharactersBlock::DataTypesEnum datatypeE, /*!< the datatype enum facet -- cannot be mixed*/
+						     bool usegaps) /*!< if true then '-' will be used as the gapChar*/
+  :geneticCode(NXS_GCODE_NO_CODE),
+   cLookup(NULL),
+   stateCodeLookupPtr(NULL),
+   matchChar('.'),
+   gapChar('\0'),
+   missing('?'),
+   respectCase(false),
+   datatype(datatypeE),
+   restrictionDataype(false),
+   userDefinedEquatesBeforeConversion(false)
+{
+  symbols = NxsCharactersBlock::GetDefaultSymbolsForType(datatype);
+  if (usegaps)
+    gapChar = '-';
+  if (datatype == NxsCharactersBlock::mixed)
+    throw NxsException("Cannot create a mixed datatype mapper"); // this should be the only empty string-generating datatype
+  RefreshMappings(0L);
+}
+
+/*! \returns true if this and other have:
+  The same symbols list,
+  the same interpretation of state codes.
+
+  Note that the "keys" used in equates may differ (that is a syntactic difference not a semantic one) even if the function returns true.
+
+  This function is useful when checking to see if a Datatype differs significantly from the default type.  If two types are semantically
+  equivalent then their state-coded matrices can be concatenated (or you can manipulate either matrix using the same operations).
+*/
+bool NxsDiscreteDatatypeMapper::IsSemanticallyEquivalent(const NxsDiscreteDatatypeMapper &other) const
+{
+  if (datatype != other.datatype)
+    return false;
+  if (symbols != other.symbols)
+    return false;
+  bool thisHasGap = (gapChar != '\0');
+  bool otherHasGap = (other.gapChar != '\0');
+  if (thisHasGap != otherHasGap)
+    return false;
+  const NxsDiscreteStateCell nsc = (NxsDiscreteStateCell)GetHighestStateCode();
+  if(nsc != (NxsDiscreteStateCell) other.GetHighestStateCode())
+    return false;
+  for (NxsDiscreteStateCell i = 0; i <= nsc; ++i)
+    {
+      if (GetStateSetForCode(i) != other.GetStateSetForCode(i))
+	return false;
+    }
+  return true;
+}
+
+/*!
+  Must be called when the symbols list changes.
+  Uses symbols, gap, missing, respectCase,  extraEquates, and datatype fields to establish new mappings.
+  token can be NULL if the call is not triggered by the reading of a NEXUS token.
+*/
+void NxsDiscreteDatatypeMapper::RefreshMappings(NxsToken *token)
+{
+  nStates = (unsigned)symbols.length();
+  if (nStates ==  0)
+    {
+      if (datatype != NxsCharactersBlock::continuous)
+	throw NxsException("Cannot create a datatype mapper with no symbols");
+      return;
+    }
+  if (!respectCase)
+    {
+      NxsString::to_upper(symbols);
+      lcsymbols = symbols;
+    }
+  else
+    lcsymbols.clear();
+
+  NxsString::to_lower(lcsymbols);
+
+  if (missing == '\0')
+    throw NxsException("Cannot create a datatype mapper with no missing data symbol");
+
+  charToStateCodeLookup.assign(384, NXS_INVALID_STATE_CODE); /*256+128 = 384 -- this way we can deal with signed or unsigned chars by pointing cLookup to element 128*/
+  cLookup = &charToStateCodeLookup[127];
+  stateIntersectionMatrix.clear();
+  isStateSubsetMatrix.clear();
+  isStateSubsetMatrixGapsMissing.clear();
+
+  stateSetsVec.clear();
+  stateCodeLookupPtr = 0L;
+  sclOffset = (gapChar == '\0' ? -1 : -2);
+
+  std::string bogus;
+  std::istringstream bogusStream(bogus);
+  NxsToken bogusToken(bogusStream);
+  token = (token == NULL ? &bogusToken : token);
+
+  /* add the "fundamental" states. */
+  std::set<NxsDiscreteStateCell> stSet;
+  std::set<NxsDiscreteStateCell> missingSet;
+  if (gapChar != '\0')
+    {
+      stSet.insert(NXS_GAP_STATE_CODE);
+      /* this is the one of only 2 times that  we don't call AddStateSet to add a state set
+	 we do this to avoid illegal indexing of stateSets[1] when there
+	 is only one element in the vector.
+      */
+      stateSetsVec.push_back(NxsDiscreteStateSetInfo(stSet, false, gapChar));
+      cLookup[(int) gapChar] = NXS_GAP_STATE_CODE;
+
+      missingSet.insert(NXS_GAP_STATE_CODE);
+    }
+
+
+  /*
+    Add the missing state code
+    this is the other time that we don't call AddStateSet (to avoid illegal indexing).
+  */
+  NCL_ASSERT(missing != '\0');
+  NCL_ASSERT(nStates > 0);
+  for (NxsDiscreteStateCell s = 0; s < (NxsDiscreteStateCell) nStates; ++s)
+    missingSet.insert(s);
+
+  char sym = (respectCase ? missing : (char) toupper(missing));
+  stateSetsVec.push_back(NxsDiscreteStateSetInfo(missingSet, false, sym));
+  const NxsDiscreteStateCell stateCode = (const NxsDiscreteStateCell)stateSetsVec.size() + sclOffset - 1;
+  NCL_ASSERT(NXS_MISSING_CODE == stateCode);
+  if (respectCase)
+    cLookup[(int) missing] = stateCode;
+  else
+    {
+      cLookup[(int) tolower(missing)] = stateCode;
+      cLookup[(int) toupper(missing)] = stateCode;
+    }
+  NCL_ASSERT(cLookup[(int) missing] == NXS_MISSING_CODE);
+  for (NxsDiscreteStateCell s = 0; s < (NxsDiscreteStateCell) nStates; ++s)
+    {
+      stSet.clear();
+      stSet.insert(s);
+      AddStateSet(stSet, symbols[s], respectCase, false);
+    }
+
+  /* add the default equates */
+  std::map<char, NxsString> defEq = NxsCharactersBlock::GetDefaultEquates(datatype);
+
+
+
+  bool convertToStandard = false;
+  if (((datatype == NxsCharactersBlock::nucleotide) || (datatype == NxsCharactersBlock::dna)) && symbols != "ACGT")
+    convertToStandard = true;
+  else if ((datatype == NxsCharactersBlock::rna) && symbols != "ACGU")
+    convertToStandard = true;
+  else if ((datatype == NxsCharactersBlock::protein) && symbols != "ACDEFGHIKLMNPQRSTVWY*")
+    convertToStandard = true;
+  if (convertToStandard)
+    {
+      if (!extraEquates.empty())
+	userDefinedEquatesBeforeConversion = true;
+      defEq.insert(extraEquates.begin(), extraEquates.end());
+      extraEquates.clear();
+      defEq.swap(extraEquates);
+      /* respectcase is only "applicable" to Standard datatype
+	 Any symbol extension will be at the end of the symbols list,
+	 so here we add the lower case symbols as equates.
+      */
+      if (respectCase)
+	{
+	  std::string lcsym = NxsCharactersBlock::GetDefaultSymbolsForType(datatype);
+	  NxsString::to_lower(lcsym);
+	  std::string ucsym = lcsym;
+	  NxsString::to_upper(ucsym);
+	  for (unsigned i = 0; i < ucsym.length(); ++i)
+	    {
+	      if (ucsym[i] != lcsym[i])
+		{
+		  NxsString u;
+		  u.append(1, ucsym[i]);
+		  extraEquates[lcsym[i]] = u;
+		}
+	    }
+	}
+      datatype =  NxsCharactersBlock::standard;
+    }
+
+  /* It is nice to put the all-states code at state code = num_states So here, we'll put this equate in that slot (if such an equate exists)*/
+  std::set<char> targetSet(symbols.begin(), symbols.end());
+  char allStateEquateKey = '\0';
+  std::map<char, NxsString>::const_iterator eqIt = defEq.begin();
+  NxsString taxonName;
+  for (; eqIt != defEq.end(); ++eqIt)
+    {
+      const char c = eqIt->first;
+      const char u = toupper(c);
+      bool addEq = true;
+      if (c == missing || c == matchChar || c == gapChar)
+	addEq = false;
+      if (!respectCase && (u == toupper(missing) || u == toupper(matchChar) || u == toupper(gapChar)))
+	addEq = false;
+      if (addEq)
+	{
+	  const NxsString & s = eqIt->second;
+	  unsigned slen = (unsigned)s.length();
+	  if (slen == 2 + symbols.length())
+	    {
+	      if (s[0] == '{' && s[slen -1] == '}')
+		{
+		  std::set<char> contained;
+		  for (unsigned j = 1; j < slen - 1; ++j)
+		    contained.insert(s[j]);
+		  if (contained == targetSet)
+		    {
+		      allStateEquateKey = c;
+		      NxsDiscreteStateCell sc = StateCodeForNexusPossibleMultiStateSet(allStateEquateKey, s, *token, UINT_MAX, UINT_MAX, 0L, taxonName);
+		      cLookup[(int) allStateEquateKey] = sc;
+		      break;
+		    }
+		}
+	    }
+
+	}
+    }
+
+  eqIt = defEq.begin();
+  for (; eqIt != defEq.end(); ++eqIt)
+    {
+      const char c = eqIt->first;
+      if (c == allStateEquateKey)
+	continue;
+      const char u = toupper(c);
+      bool addEq = true;
+      if (c == missing || c == matchChar || c == gapChar)
+	addEq = false;
+      if (!respectCase && (u == toupper(missing) || u == toupper(matchChar) || u == toupper(gapChar)))
+	addEq = false;
+      if (addEq)
+	{
+	  const NxsString & s = eqIt->second;
+	  NxsDiscreteStateCell sc = StateCodeForNexusPossibleMultiStateSet(c, s, *token, UINT_MAX, UINT_MAX, 0L, taxonName);
+	  cLookup[(int) c] = sc;
+	}
+    }
+
+
+
+
+  /* add user-defined equates, and only retain the new ones (those that are not datatype defaults). */
+  std::map<char, NxsString> neededExtraEquates;
+  for (eqIt = extraEquates.begin(); eqIt != extraEquates.end(); ++eqIt)
+    {
+      const char c = eqIt->first;
+      const char u = toupper(c);
+      if (PositionInSymbols(c) == NXS_INVALID_STATE_CODE)
+	{
+	  bool addEq = true;
+	  if (c == missing || c == matchChar || c == gapChar)
+	    addEq = false;
+	  if (!respectCase && (u == toupper(missing) || u == toupper(matchChar) || u == toupper(gapChar)))
+	    addEq = false;
+	  if (addEq)
+	    {
+	      const NxsDiscreteStateCell prevCode = cLookup[(int) c];
+	      const NxsString & s = eqIt->second;
+	      NxsDiscreteStateCell sc = StateCodeForNexusPossibleMultiStateSet(c, s, *token, UINT_MAX, UINT_MAX, 0L, taxonName);
+	      cLookup[(int) c] = sc;
+	      if (sc != prevCode) /* the equate was new */
+		neededExtraEquates[c] = s;
+	    }
+	}
+      else
+	{
+	  NCL_ASSERT(convertToStandard); // a equate key that is equal to a symbol can happen if the symbols list is augmented (resulting in a conversion to standard datatype)
+	}
+    }
+  extraEquates = neededExtraEquates;
+}
+
+/*!
+  Returns the state code of a (possible new state set) `sset`.  This may trigger the reallocation of mapping info.
+  nexusSymbol can be '\0' if there is not a single-character symbol that represents this state set.
+
+  if `addToLookup` is false and the state set is not found then NXS_INVALID_STATE_CODE will be returned.
+
+  if the stateset is added with a `nexusSymbol` then the new "symbol" will be case-sensitive
+  (this is an mechanism for entering equates and equates are always case sensitive).
+
+  New "fundamental" states can NOT be introduced using this function -- if unknown states are encountered, an exception will be generated.
+*/
+NxsDiscreteStateCell NxsDiscreteDatatypeMapper::StateCodeForStateSet(const std::set<NxsDiscreteStateCell> & sset, bool isPolymorphic, bool addToLookup, char nexusSymbol)
+{
+  if (sset.size() == 1)
+    {
+      NxsDiscreteStateCell c = *sset.begin();
+      ValidateStateIndex(c);
+      return c;
+    }
+  NCL_ASSERT(stateCodeLookupPtr);
+  NxsDiscreteStateSetInfo *sclStart = stateCodeLookupPtr + nStates;
+  const NxsDiscreteStateCell nCodes = (NxsDiscreteStateCell)stateSetsVec.size();
+
+  /*we can start at nStates, because < nStates will be handled in the sset.size() == 1 above */
+  for (NxsDiscreteStateCell i = nStates - sclOffset; i < nCodes; ++i)
+    {
+      NxsDiscreteStateSetInfo & stateSetInfo = *sclStart++;
+      if (sset == stateSetInfo.states && isPolymorphic == stateSetInfo.isPolymorphic)
+	return i + sclOffset;
+    }
+  for (std::set<NxsDiscreteStateCell>::const_iterator sIt = sset.begin(); sIt != sset.end(); ++sIt)
+    ValidateStateIndex(*sIt);
+  if (!isPolymorphic)
+    {
+      const unsigned nsymbs = (const unsigned)sset.size();
+      if (gapChar != '\0' && nsymbs == GetNumStatesIncludingGap())
+	return NXS_MISSING_CODE;
+    }
+  if (!addToLookup)
+    return NXS_INVALID_STATE_CODE;
+  return AddStateSet(sset, nexusSymbol, true, isPolymorphic);
+}
+
+/*!
+  Adds a new state set and returns its code.
+  Does NOT check if the state set is present.
+  It is also MANDATORY that this function be called with the fundamental states first (and in order) before
+  being called with any multi state sets (this is done by RefreshMappings)
+*/
+NxsDiscreteStateCell NxsDiscreteDatatypeMapper::AddStateSet(const std::set<NxsDiscreteStateCell> & states, char nexusSymbol, bool symRespectCase, bool isPolymorphic)
+{
+  stateIntersectionMatrix.clear();
+  isStateSubsetMatrix.clear();
+  isStateSubsetMatrixGapsMissing.clear();
+
+
+  bool reallyIsPoly = (states.size() > 1 && isPolymorphic);
+  char sym = (symRespectCase ? nexusSymbol : (char) toupper(nexusSymbol));
+  stateSetsVec.push_back(NxsDiscreteStateSetInfo(states, reallyIsPoly, sym));
+  /* if we have gaps, then the sclOffset is -1 and we want to enable
+     stateCodeLookup[-1], so we set stateCodeLookup to &stateSets[1]
+     hence the -sclOffset below
+  */
+  stateCodeLookupPtr = &stateSetsVec[-sclOffset];
+
+  const NxsDiscreteStateCell stateCode = (const NxsDiscreteStateCell)stateSetsVec.size() + sclOffset - 1;
+  if (nexusSymbol != '\0')
+    {
+      if (symRespectCase)
+	cLookup[(int) nexusSymbol] = stateCode;
+      else
+	{
+	  cLookup[(int) tolower(nexusSymbol)] = stateCode;
+	  cLookup[(int) toupper(nexusSymbol)] = stateCode;
+	}
+    }
+  return stateCode;
+}
+
+
+
+/*!
+  Throws an NxsNCLAPIException  if `c` is not a valid index of one of the "fundamental" states for the datatype.
+*/
+void NxsDiscreteDatatypeMapper::ValidateStateIndex(NxsDiscreteStateCell c) const
+{
+  if (c < NXS_MISSING_CODE)
+    {
+      if (c == NXS_GAP_STATE_CODE)
+	{
+	  if (gapChar == '\0')
+	    throw NxsNCLAPIException("Illegal usage of NXS_GAP_STATE_CODE in a datatype without gaps");
+	  return;
+	}
+      if (c == NXS_INVALID_STATE_CODE)
+	throw NxsNCLAPIException("Illegal usage of NXS_INVALID_STATE_CODE as a state index");
+      throw NxsNCLAPIException("Illegal usage of unknown negative state index");
+    }
+  else if (c >= (NxsDiscreteStateCell) nStates)
+    throw NxsNCLAPIException("Illegal usage of state index >= the number of states");
+}
+
+/*!
+  Throws an NxsNCLAPIException  if `c` is not a valid state code.
+*/
+void NxsDiscreteDatatypeMapper::ValidateStateCode(NxsDiscreteStateCell c) const
+{
+  if (c < sclOffset)
+    {
+      if (c == NXS_GAP_STATE_CODE)
+	{
+	  if (gapChar == '\0')
+	    throw NxsNCLAPIException("Illegal usage of NXS_GAP_STATE_CODE in a datatype without gaps");
+	}
+      if (c == NXS_INVALID_STATE_CODE)
+	throw NxsNCLAPIException("Illegal usage of NXS_INVALID_STATE_CODE as a state code");
+      throw NxsNCLAPIException("Illegal usage of unknown negative state index");
+    }
+  else if (c >= (((NxsDiscreteStateCell) stateSetsVec.size()) + sclOffset))
+    {
+      NxsString err = "Illegal usage of state code > the highest state code. c = ";
+      err << int(c) << " (NxsDiscreteStateCell) stateSetsVec.size() = " << (NxsDiscreteStateCell) stateSetsVec.size();
+      err << " sclOffset = " << sclOffset;
+      throw NxsNCLAPIException(err);
+    }
+}
+
+
+void NxsDiscreteDatatypeMapper::GenerateNxsExceptionMatrixReading(char const* message, unsigned int taxInd, unsigned int charInd,
+								  NxsToken* token, const NxsString &nameStr)
+{
+  NxsString e = "Error reading character ";
+  e << charInd + 1<<" for taxon " << taxInd + 1;
+  if (!nameStr.empty())
+    {
+      NxsString nasn;
+      nasn << taxInd + 1;
+      if (nasn != nameStr)
+	e << " (name \""<< nameStr <<"\")";
+    }
+  e << ":\n" << message;
+  if (token)
+    throw NxsException(e, *token);
+  else
+    throw NxsException(e);
+}
+
+/*!
+  Returns true if the state code maps to a collection of states that were flagged as polymorphic.
+  generates a NxsNCLAPIException if `c` is not a valid state code
+*/
+bool NxsDiscreteDatatypeMapper::IsPolymorphic(NxsDiscreteStateCell c) const
+{
+  NCL_ASSERT(stateCodeLookupPtr);
+  ValidateStateCode(c);
+  return stateCodeLookupPtr[c].isPolymorphic;
+}
+
+
+/*!
+  Returns NXS_INVALID_STATE_CODE or the index of `c` in the symbols list.
+  case-sensitivity is controlled by this->respectCase attribute.
+
+  NOTE: the gap "state" and missing characters are NOT in the symbols list.
+*/
+NxsDiscreteStateCell NxsDiscreteDatatypeMapper::PositionInSymbols(char c) const
+{
+  NxsDiscreteStateCell p = (NxsDiscreteStateCell)symbols.find(c);
+  if (p >= 0 && p < (NxsDiscreteStateCell) nStates)
+    return p;
+  if (!respectCase)
+    {
+      p = (NxsDiscreteStateCell)lcsymbols.find(c);
+      if (p >= 0 && p < (NxsDiscreteStateCell) nStates)
+	return p;
+    }
+  return NXS_INVALID_STATE_CODE;
+}
+
+
+/*!
+  Returns the NEXUS reperesenation of the state code `scode` which may be a
+  multiple character string such as {DNY}
+  Generates a NxsNCLAPIException if `c` is not a valid state code.
+  If the string cannot be expressed (insufficient symbols are defined) then
+  `demandSymbols` controls the behavior.  If `demandSymbols` is true than a
+  NxsNCLAPIException is thrown. If `demandSymbols` is false then no output is
+  written.
+*/
+void NxsDiscreteDatatypeMapper::WriteStateCodeAsNexusString(std::ostream & out, NxsDiscreteStateCell scode, bool demandSymbols) const
+{
+  //out << "WriteStateCodeAsNexusString-debug scode=" << scode<< '\n';
+  ValidateStateCode(scode);
+  const NxsDiscreteStateSetInfo & stateSetInfo =  stateCodeLookupPtr[scode];
+  NCL_ASSERT (&(stateSetsVec.at(scode-sclOffset)) == &stateSetInfo);
+  char c = stateSetInfo.nexusSymbol;
+  if (c != '\0')
+    {
+      out << c;
+      return;
+    }
+  std::string towrite;
+  std::set<NxsDiscreteStateCell>::const_iterator sIt = stateSetInfo.states.begin();
+  const std::set<NxsDiscreteStateCell>::const_iterator endIt = stateSetInfo.states.end();
+  for (; sIt != endIt; ++sIt)
+    {
+      const NxsDiscreteStateCell state = *sIt;
+      const NxsDiscreteStateSetInfo & subStateSetInfo =  stateCodeLookupPtr[state];
+      const char subc = subStateSetInfo.nexusSymbol;
+      if (subc != '\0')
+	towrite.append(1, subc);
+      else if (demandSymbols)
+	{
+	  NxsString err("No symbol found for state code ");
+	  err << state;
+	  throw NxsNCLAPIException(err);
+	}
+      else
+	return;
+    }
+
+  out <<	(stateSetInfo.isPolymorphic ? '(' : '{');
+  out << towrite;
+  out <<	(stateSetInfo.isPolymorphic ? ')' : '}');
+}
+
+unsigned NxsDiscreteDatatypeMapper::GetNumStatesInStateCode(NxsDiscreteStateCell scode) const
+{
+  ValidateStateCode(scode);
+  const NxsDiscreteStateSetInfo & stateSetInfo =  stateCodeLookupPtr[scode];
+  return (unsigned)stateSetInfo.states.size();
+}
+
+void NxsDiscreteDatatypeMapper::WriteStartOfFormatCommand(std::ostream & out) const
+{
+  out << "    FORMAT Datatype=" << NxsCharactersBlock::GetNameOfDatatype(datatype);
+  if (this->missing != '?')
+    {
+      out << " Missing=";
+      out << this->missing;
+    }
+  if (this->gapChar != '\0')
+    {
+      out << "  Gap=";
+      out << this->gapChar;
+    }
+  if (this->datatype != NxsCharactersBlock::continuous)
+    {
+      unsigned numDefStates = 4;
+      if (this->datatype == NxsCharactersBlock::protein)
+	numDefStates = 21;
+      else if (this->datatype == NxsCharactersBlock::standard)
+	numDefStates = 0;
+      unsigned nSym = (unsigned)this->symbols.length();
+      if (nSym > numDefStates && this->datatype != NxsCharactersBlock::codon)
+	{
+	  out << " Symbols=\"";
+	  for (unsigned i = numDefStates; i < nSym; ++i)
+	    {
+	      char c = symbols[i];
+	      if (c == '\0')
+		break;
+	      out << c;
+	    }
+	  out <<"\"";
+	}
+    }
+  const std::map<char, NxsString> defEquates = NxsCharactersBlock::GetDefaultEquates(datatype);
+  std::map<char, NxsString> toWrite;
+  const std::map<char, NxsString>::const_iterator notFound = defEquates.end();
+  std::map<char, NxsString>::const_iterator inDefEquates;
+  for (std::map<char, NxsString>::const_iterator i = extraEquates.begin(); i != extraEquates.end(); ++i)
+    {
+      const char key =  (*i).first;
+      const NxsString val =  i->second;
+      inDefEquates = defEquates.find(key);
+      if (inDefEquates == notFound || inDefEquates->second != val)
+	toWrite[key] = val;
+    }
+  if (toWrite.size() > 0)
+    {
+      out << " Equate=\"";
+      for (std::map<char, NxsString>::const_iterator j = toWrite.begin(); j != toWrite.end(); ++j)
+	out << ' ' << j->first << '=' << j->second;
+      out <<"\"";
+    }
+}
+
+bool NxsCharactersBlock::HandleNextContinuousState(NxsToken &token, unsigned taxNum, unsigned charNum, ContinuousCharRow & row, const NxsString & )
+{
+  if (interleaving)
+    token.SetLabileFlagBit(NxsToken::newlineIsToken);
+  token.SetLabileFlagBit(NxsToken::hyphenNotPunctuation);
+  std::vector<double> v;
+  std::vector<int> scored;
+  token.GetNextToken();
+  NxsString t;
+  if (interleaving && token.AtEOL())
+    return false;
+  if (token.Equals("("))
+    {
+      token.SetLabileFlagBit(NxsToken::hyphenNotPunctuation);
+      token.GetNextToken();
+      while (!token.Equals(")"))
+	{
+	  t = token.GetToken();
+	  if (t.length() == 1 && (t[0] == missing || t[0] == gap))
+	    {
+	      v.push_back(DBL_MAX);
+	      scored.push_back(0);
+	    }
+	  else if (t.length() == 1 && t[0] == matchchar)
+	    {
+	      v.push_back(DBL_MAX);
+	      scored.push_back(2);
+	    }
+	  else if (!t.IsADouble())
+	    GenerateUnexpectedTokenNxsException(token, "a number");
+	  else
+	    {
+	      v.push_back(t.ConvertToDouble());
+	      scored.push_back(1);
+	    }
+	  token.SetLabileFlagBit(NxsToken::hyphenNotPunctuation);
+	  token.GetNextToken();
+	}
+    }
+  else
+    {
+      t = token.GetToken();
+      if (t.length() == 1 && (t[0] == missing || t[0] == gap))
+	{
+	  v.push_back(DBL_MAX);
+	  scored.push_back(0);
+	}
+      else if (t.length() == 1 && t[0] == matchchar)
+	{
+	  v.push_back(DBL_MAX);
+	  scored.push_back(2);
+	}
+      else if (!t.IsADouble())
+	GenerateUnexpectedTokenNxsException(token, "a number");
+      else
+	{
+	  v.push_back(t.ConvertToDouble());
+	  scored.push_back(1);
+	}
+    }
+  unsigned n_read = (unsigned)v.size();
+  if (n_read < items.size())
+    {
+      errormsg.clear();
+      errormsg << "For each cell of the MATRIX a value for each of the " << (unsigned)items.size() <<  " ITEMS listed in the FORMAT command is expected.\nOnly " <<  n_read << " values read.";
+      GenerateNxsException(token);
+    }
+  // We've read in the state now, so if this character has been eliminated, we don't want to go any further with it
+  //
+  if (charNum == UINT_MAX)
+    return true;
+
+  if (charNum > row.size())
+    GenerateNxsException(token, "Internal Error: character index out of range in continuousMatrix.");
+
+  ContinuousCharCell & cell = row[charNum];
+  cell.clear();
+
+  std::vector<std::string >::const_iterator itemIt = items.begin();
+  std::string key;
+  unsigned curr_ind_in_v = 0;
+  for (; itemIt != items.end(); ++itemIt, ++curr_ind_in_v)
+    {
+      key = *itemIt;
+      if (scored[curr_ind_in_v] == 1)
+	cell[key] = vector<double>(1, v[curr_ind_in_v]);
+      else if (scored[curr_ind_in_v] == 0)
+	cell[key] = vector<double>();
+      else
+	{
+	  if (taxNum == 0)
+	    GenerateNxsException(token, "MATCHCHAR cannot be used in the first taxon");
+	  const vector<double> & first_taxon_vector = continuousMatrix[0][charNum][key];
+	  if (first_taxon_vector.empty())
+	    GenerateNxsException(token, "First taxon does not have a value to copy, but a MATCHCHAR was found.");
+	  else
+	    cell[key] = vector<double>(1, first_taxon_vector[0]);
+	}
+    }
+  unsigned curr_ind_mapped = 1;
+  if (!key.empty() && curr_ind_in_v < n_read)
+    {
+      vector<double> & curr_cell_vector = cell[key];
+      for (; curr_ind_in_v < n_read; ++curr_ind_in_v, ++curr_ind_mapped)
+	{
+	  if (scored[curr_ind_in_v] == 1)
+	    curr_cell_vector.push_back(v[curr_ind_in_v]);
+	  else if (scored[curr_ind_in_v] != 0)
+	    curr_cell_vector.push_back(DBL_MAX);
+	  else
+	    {
+	      if (taxNum == 0)
+		GenerateNxsException(token, "MATCHCHAR cannot be used in the first taxon");
+	      const vector<double> & first_taxon_vector = continuousMatrix[0][charNum][key];
+	      if (first_taxon_vector.size() < curr_ind_mapped+1)
+		GenerateNxsException(token, "First taxon does not have a value to copy, but a MATCHCHAR was found.");
+	      else
+		curr_cell_vector.push_back(first_taxon_vector[curr_ind_mapped]);
+	    }
+	}
+    }
+  return true;
+}
+
+NxsDiscreteStateCell NxsDiscreteDatatypeMapper::StateCodeForNexusChar(
+								      const char currChar,
+								      NxsToken *token,
+								      unsigned taxNum,		/* the taxon index, in range [0..`ntax') */
+								      unsigned charNum,		/* the character index, in range [0..`nChar') */
+								      const NxsDiscreteStateRow * firstTaxonRow,
+								      const NxsString & nameStr) const
+{
+  NxsDiscreteStateCell currState = cLookup[static_cast<int>(currChar)];
+  if (currState == NXS_INVALID_STATE_CODE)
+    {
+      NxsString emsg;
+      if (currChar == matchChar)
+	{
+	  if (firstTaxonRow == NULL)
+	    GenerateNxsExceptionMatrixReading("Unexpected use of MatchChar in first taxon with data.", taxNum, charNum, token, nameStr);
+	  if (firstTaxonRow->size() <= charNum)
+	    {
+	      emsg << "MatchChar found for character number "  << charNum+1 << " but the first taxon does not have a character state stored for this character.";
+	      GenerateNxsExceptionMatrixReading(emsg, taxNum, charNum, token, nameStr);
+	    }
+	  currState = (*firstTaxonRow)[charNum];
+	}
+      else
+	{
+	  emsg << "Invalid state specified \"" << currChar << "\"";
+	  GenerateNxsExceptionMatrixReading(emsg, taxNum, charNum, token, nameStr);
+	}
+    }
+  return currState;
+}
+
+bool NxsCharactersBlock::HandleNextDiscreteState(
+						 NxsToken &token,
+						 unsigned taxNum,
+						 unsigned charNum,
+						 NxsDiscreteStateRow & row,
+						 NxsDiscreteDatatypeMapper &mapper,
+						 const NxsDiscreteStateRow * firstTaxonRow,
+						 const NxsString & nameStr)
+{
+  if (interleaving)
+    token.SetLabileFlagBit(NxsToken::newlineIsToken);
+  NCL_ASSERT(!tokens);
+  token.SetLabileFlagBit(NxsToken::parentheticalToken);
+  token.SetLabileFlagBit(NxsToken::curlyBracketedToken);
+  token.SetLabileFlagBit(NxsToken::singleCharacterToken);
+
+  token.GetNextToken();
+
+  if (interleaving && token.AtEOL())
+    return false;
+  const NxsString &stateAsNexus = token.GetTokenReference();
+  NxsDiscreteStateCell sc =  mapper.EncodeNexusStateString(stateAsNexus, token, taxNum, charNum, firstTaxonRow, nameStr);
+  NCL_ASSERT(charNum < row.size());
+  row[charNum] = sc;
+  return true;
+}
+
+NxsDiscreteStateCell NxsDiscreteDatatypeMapper::StateCodeForNexusPossibleMultiStateSet(
+										       const char nexusSymbol,
+										       const std::string &stateAsNexus,
+										       NxsToken & token,	/* the token used to read from `in' */
+										       const unsigned taxNum,		/* the taxon index, in range [0..`ntax') */
+										       const unsigned charNum,		/* the character index, in range [0..`nChar') */
+										       const NxsDiscreteStateRow * firstTaxonRow, const NxsString &nameStr)
+{
+  NCL_ASSERT(stateAsNexus.length() > 0);
+  const char firstChar = stateAsNexus[0];
+  if (firstChar == '(' || firstChar == '{')
+    return StateCodeForNexusMultiStateSet(nexusSymbol, stateAsNexus, &token, taxNum, charNum, firstTaxonRow, nameStr);
+  if (stateAsNexus.length() > 1)
+    {
+      NxsString emsg;
+      emsg << "Expecting  {} or () around a multiple character state set.  Found " << stateAsNexus << " for taxon " << nameStr;
+      GenerateNxsExceptionMatrixReading(emsg, taxNum, charNum, &token, nameStr);
+    }
+
+  NxsDiscreteStateCell currState = StateCodeForNexusChar(firstChar, &token, taxNum, charNum, firstTaxonRow, nameStr);
+  cLookup[(int) nexusSymbol] = currState;
+  return currState;
+}
+
+NxsDiscreteStateCell NxsDiscreteDatatypeMapper::StateCodeForNexusMultiStateSet(
+									       const char nexusSymbol,
+									       const std::string &stateAsNexus,
+									       NxsToken * token,	/* the token used to read from `in' */
+									       const unsigned taxNum,		/* the taxon index, in range [0..`ntax') */
+									       const unsigned charNum,		/* the character index, in range [0..`nChar') */
+									       const NxsDiscreteStateRow * firstTaxonRow,
+									       const NxsString &nameStr)
+{
+  const char firstChar = stateAsNexus[0];
+  NxsString emsg;
+  const bool poly = (firstChar == '(');
+  if ((!poly) && firstChar != '{')
+    {
+      emsg << "Expecting a state symbol of set of symbols in () or  {} braces.  Found " << stateAsNexus;
+      GenerateNxsExceptionMatrixReading(emsg, taxNum, charNum, token, nameStr);
+    }
+  bool tildeFound = false;
+  NxsDiscreteStateCell prevState = NXS_INVALID_STATE_CODE;
+  char prevChar = firstChar;
+  std::string::const_iterator cIt = stateAsNexus.begin();
+  std::string::const_iterator endIt = stateAsNexus.end();
+  --endIt;
+  NCL_ASSERT((poly && *endIt == ')') || (!poly && *endIt == '}'));
+  std::set<NxsDiscreteStateCell> sset;
+  for (++cIt; cIt != endIt; ++cIt)
+    {
+      const char currChar = *cIt;
+      if ((strchr("\n\r \t", currChar) == NULL) && currChar != ',')
+	{
+	  if (currChar == '~')
+	    {
+	      if (prevState < 0 || prevState >= (NxsDiscreteStateCell)nStates)
+		{
+		  emsg << "A state range cannot start with " << prevChar;
+		  GenerateNxsExceptionMatrixReading(emsg, taxNum, charNum, token, nameStr);
+		}
+	      tildeFound = true;
+	    }
+	  else
+	    {
+	      // Add state symbol and record if it is the first or last one in case we encounter a tilde
+	      NxsDiscreteStateCell currState;
+	      if (tildeFound)
+		{
+		  currState = PositionInSymbols(currChar);
+		  if (currState == NXS_INVALID_STATE_CODE)
+		    {
+		      emsg << "A state range cannot end with " << currChar;
+		      GenerateNxsExceptionMatrixReading(emsg, taxNum, charNum, token, nameStr);
+		    }
+		  if (currState < prevState)
+		    {
+		      emsg << prevChar << '~' << currChar << " is not a valid state range (the end state is a lower index than the start)";
+		      GenerateNxsExceptionMatrixReading(emsg, taxNum, charNum, token, nameStr);
+		    }
+		  for (NxsDiscreteStateCell i = prevState; i <= currState; ++i)
+		    sset.insert(i);
+		  tildeFound = false;
+		}
+	      else
+		{
+		  currState = StateCodeForNexusChar(currChar, token, taxNum, charNum, firstTaxonRow, nameStr);
+		  sset.insert(currState);
+		}
+	      prevState = currState;
+	      prevChar = currChar;
+	    }
+	}
+    }
+  if (prevChar == '~')
+    {
+      emsg << "State range not terminated -- ending in ~" << *endIt;
+      GenerateNxsExceptionMatrixReading(emsg, taxNum, charNum, token, nameStr);
+    }
+  if (sset.empty())
+    {
+      emsg << "An illegal (empty) state range was found \"" << stateAsNexus << '\"';
+      GenerateNxsExceptionMatrixReading(emsg, taxNum, charNum, token, nameStr);
+    }
+  return StateCodeForStateSet(sset, poly, true, nexusSymbol);
+}
+
+
+
+/*!
+  Called from HandleNextState to read in the next state when TOKENS was specified. Looks up state in character
+  states listed for the character to make sure it is a valid state, and returns state's value (0, 1, 2, ...). Note:
+  does NOT handle adding the state's value to matrix. Save the return value (call it k) and use the following command
+  to add it to matrix: matrix->AddState(i, j, k);
+*/
+bool NxsCharactersBlock::HandleNextTokenState(
+					      NxsToken &token,
+					      unsigned taxNum,
+					      unsigned charNum,
+					      NxsDiscreteStateRow & row,
+					      NxsDiscreteDatatypeMapper &mapper,
+					      const NxsDiscreteStateRow * firstTaxonRow,
+					      const NxsString & nameStr)
+{
+  if (interleaving)
+    token.SetLabileFlagBit(NxsToken::newlineIsToken);
+  token.GetNextToken();
+  if (interleaving && token.AtEOL())
+    return false;
+  if (token.GetTokenLength() ==  0)
+    GenerateNxsException(token, "Unexpected empty token encountered");
+
+  int polymorphism = token.Equals("(");
+  int uncertainty	 = token.Equals("{");
+  if (!uncertainty && !polymorphism)
+    {
+      row[charNum] = HandleTokenState(token, taxNum, charNum, mapper, firstTaxonRow, nameStr);
+      return true;
+    }
+
+  /*TODO - supporting this requires more bookeeping to allow the mapper to deal with
+    anonymous fundamental states  -- difficult because we don't know the number of symbols in TOKENS mode.*/
+  errormsg = "Currently polymorphism and ambiguity are not supported for matrices in TOKENS mode: ";
+  errormsg << token.GetToken() << " found while reading character " << charNum + 1 << " of taxon \"" << nameStr << '\"';
+  throw NxsException(errormsg, token);
+
+  bool tildeFound = false;
+  NxsDiscreteStateCell prevState = NXS_INVALID_STATE_CODE;
+  std::string prevToken = token.GetToken();
+  std::set<NxsDiscreteStateCell> sset;
+  for (;;)
+    {
+      // OPEN ISSUE: What about newlines if interleaving? I'm assuming
+      // that the newline must come between characters to count.
+
+      token.SetLabileFlagBit(NxsToken::tildeIsPunctuation);
+      token.GetNextToken();
+
+      if (token.Equals(","))
+	{
+	  ; /*Mesquite exports with , in state sets. We'll ignore the comma*/
+	}
+      if (polymorphism)
+	{
+	  if (token.Equals(")"))
+	    {
+	      if (tildeFound)
+		mapper.GenerateNxsExceptionMatrixReading("Range of states still being specified when ')' encountered", taxNum, charNum, &token, nameStr);
+	      break;
+	    }
+	  if (token.Equals("{"))
+	    mapper.GenerateNxsExceptionMatrixReading("Illegal range of states '{' found inside '()'", taxNum, charNum, &token, nameStr);
+
+	}
+      else if (uncertainty)
+	{
+	  if (token.Equals("}"))
+	    {
+	      if (tildeFound)
+		mapper.GenerateNxsExceptionMatrixReading("Range of states still being specified when '}' encountered", taxNum, charNum, &token, nameStr);
+	      break;
+	    }
+	  if (token.Equals("("))
+	    mapper.GenerateNxsExceptionMatrixReading("Illegal range of states '(' found inside '{}'", taxNum, charNum, &token, nameStr);
+	}
+      else if (token.Equals("~"))
+	{
+	  if (prevState < 0 || prevState >= (NxsDiscreteStateCell)symbols.length())
+	    {
+	      errormsg.clear();
+	      errormsg << "A state range cannot start with " << prevToken;
+	      mapper.GenerateNxsExceptionMatrixReading(errormsg, taxNum, charNum, &token, nameStr);
+	    }
+	  tildeFound = true;
+	}
+      else
+	{
+	  NxsDiscreteStateCell currState;
+	  if (tildeFound)
+	    {
+	      currState = HandleTokenState(token, taxNum, charNum, mapper, firstTaxonRow, nameStr);
+	      if (currState <= prevState)
+		{
+		  errormsg = "Last state in specified range (";
+		  errormsg << token.GetToken() << ") must be greater than the first";
+		  mapper.GenerateNxsExceptionMatrixReading(errormsg, taxNum, charNum, &token, nameStr);
+		}
+	      for (NxsDiscreteStateCell i = prevState; i <= currState; ++i)
+		sset.insert(i);
+	      tildeFound = false;
+	    }
+	  else
+	    {
+	      // Add current state, then set first to that state's value
+	      // State's value is its position within the list of states
+	      // for that character
+	      //
+	      currState = HandleTokenState(token, taxNum, charNum, mapper, firstTaxonRow, nameStr);
+	      sset.insert(currState);
+	    }
+	  prevState = currState;
+	  prevToken = token.GetToken();
+	}
+    }
+
+  if (prevToken == "~")
+    {
+      errormsg.clear();
+      errormsg << "State range not terminated -- ending in ~" << token.GetToken();
+      mapper.GenerateNxsExceptionMatrixReading(errormsg, taxNum, charNum, &token, nameStr);
+    }
+  if (sset.empty())
+    {
+      errormsg.clear();
+      errormsg << "An illegal (empty) state range -- either  {} or ()";
+      mapper.GenerateNxsExceptionMatrixReading(errormsg, taxNum, charNum, &token, nameStr);
+    }
+  row[charNum] = mapper.StateCodeForStateSet(sset, (const bool)(polymorphism != 0), true, '\0');
+  return true;
+}
+
+NxsDiscreteStateCell NxsCharactersBlock::HandleTokenState(
+							  NxsToken &token,	/* the token used to read from `in' */
+							  unsigned taxNum,
+							  unsigned charNum,
+							  NxsDiscreteDatatypeMapper &,
+							  const NxsDiscreteStateRow * ,
+							  const NxsString & nameStr)
+{
+  // Token may be one of the character states listed for character charNum in charStates
+  const std::string t = token.GetToken(respectingCase);
+  NxsStringVectorMap::const_iterator bagIter	= charStates.find(charNum);
+  /*
+    if (bagIter == charStates.end())
+    return mapper.EncodeNexusStateString(t, token, taxNum, charNum, firstTaxonRow);
+  */
+  NxsStringVector::const_iterator ci_begin	= bagIter->second.begin();
+  NxsStringVector::const_iterator ci_end		= bagIter->second.end();
+  NxsStringVector::const_iterator cit;
+  NxsDiscreteStateCell k = 0;
+  for (; ci_begin != ci_end; ++ci_begin, ++k)
+    {
+      if (respectingCase)
+	{
+	  if (*ci_begin == t)
+	    return k;
+	}
+      else
+	{
+	  if (NxsString::case_insensitive_equals(t.c_str(), ci_begin->c_str()))
+	    return k;
+	}
+    }
+  //return mapper.EncodeNexusStateString(t, token, taxNum, charNum, firstTaxonRow);
+  errormsg = "Unrecognized state ";
+  errormsg << t << " found while reading character " << charNum + 1 << " of taxon number " << taxNum + 1;
+  if (!nameStr.empty())
+    errormsg << "(name \"" << nameStr << "\")";
+  throw NxsException(errormsg, token);
+}
+
+
+/*!
+  Returns true if this set replaces an older definition.
+*/
+bool NxsCharactersBlock::AddNewCodonPosPartition(const std::string &label, const NxsPartition & inds, bool isDef)
+{
+  NxsString ls(label.c_str());
+  ls.ToUpper();
+  bool replaced = codonPosPartitions.count(ls) > 0;
+  codonPosPartitions[ls] = inds;
+  if (isDef)
+    defCodonPosPartitionName = ls;
+  return replaced;
+}
+
+/*!
+  Returns true if this set replaces an older definition.
+*/
+bool NxsCharactersBlock::AddNewExSet(const std::string &label, const NxsUnsignedSet & inds)
+{
+  NxsString ls(label.c_str());
+  bool replaced = exSets.count(ls) > 0;
+  exSets[ls] = inds;
+  return replaced;
+}
+
+/*! In v2.1 of the API, the NxsTaxaBlockAPI and NxsAssumptionsBlockAPI pointers
+  are usually NULL.  These block assignments are made during the parse.
+*/
+NxsCharactersBlock::NxsCharactersBlock(
+				       NxsTaxaBlockAPI *tb,			/* the taxa block object to consult for taxon labels (can be 0L)*/
+				       NxsAssumptionsBlockAPI *ab)	/* the assumptions block object to consult for exclusion sets (can be 0L) */
+  :NxsTaxaBlockSurrogate(tb, NULL)
+{
+  assumptionsBlock = ab;
+  NCL_BLOCKTYPE_ATTR_NAME = "CHARACTERS";
+  supportMixedDatatype = false;
+  convertAugmentedToMixed = false;
+  allowAugmentingOfSequenceSymbols = false;
+  writeInterleaveLen = -1;
+  Reset();
+}
+/*! Excludes characters whose indices are contained in the set `exset'.
+  \returns number of characters actually excluded (some may have already been excluded).
+*/
+unsigned NxsCharactersBlock::ApplyExset(
+					NxsUnsignedSet &exset)	/* set of character indices to exclude in range [0..`nChar') */
+{
+  excluded.clear();
+  set_union(eliminated.begin(), eliminated.end(), exset.begin(), exset.end(), inserter(excluded, excluded.begin()));
+  return (unsigned) excluded.size();
+}
+
+/*! Includes characters whose indices are contained in the set `inset'.
+  \returns number of characters that are included after the operation
+*/
+unsigned NxsCharactersBlock::ApplyIncludeset(
+					     NxsUnsignedSet &inset)	/* set of character indices to include in range [0..`nChar') */
+{
+  NxsUnsignedSet inc(inset);
+  inc.erase(eliminated.begin(), eliminated.end());
+  excluded.erase(inc.begin(), inc.end());
+  return nChar - (unsigned) excluded.size();
+}
+
+/*! Converts a character label to a 1-offset number corresponding to the character's position based on data from
+  the CharLabels NEXUS command.
+  If `s' is not a valid character label, returns the value 0.
+*/
+unsigned NxsCharactersBlock::CharLabelToNumber(
+					       const std::string &inp) const	/* the character label to convert */
+{
+  NxsString s(inp.c_str());
+  s.ToUpper();
+  std::map<std::string, unsigned>::const_iterator ltindIt = ucCharLabelToIndex.find(s);
+  if (ltindIt == ucCharLabelToIndex.end())
+    return 0;
+  return 1 + ltindIt->second;
+}
+
+/*!
+  Transfers all data from `other' to this object, leaving `other' completely empty. Used to convert a NxsDataBlock
+  object to a NxsCharactersBlock object in programs where it is desirable to just have a NxsCharactersBlock for
+  storage but also allow users to enter the information in the form of the deprecated NxsDataBlock. This function
+  does not make a copy of such things as the data matrix, instead just transferring the pointer to that object from
+  other to this. This is whay it was named Consume rather than CopyFrom.
+*/
+void NxsCharactersBlock::Consume(
+				 NxsCharactersBlock &other)	/* NxsCharactersBlock object from which to copy */
+{
+  if (assumptionsBlock)
+    assumptionsBlock->SetCallback(NULL);
+  assumptionsBlock = other.assumptionsBlock;
+  other.assumptionsBlock = NULL;
+  if (assumptionsBlock)
+    assumptionsBlock->SetCallback(this);
+
+  nChar = other.nChar;
+  nTaxWithData = other.nTaxWithData;
+  matchchar = other.matchchar;
+  respectingCase = other.respectingCase;
+  transposing = other.transposing;
+  interleaving = other.interleaving;
+  tokens = other.tokens;
+  labels = other.labels;
+  missing = other.missing;
+  gap = other.gap;
+  gapMode = other.gapMode;
+  symbols = other.symbols;
+  userEquates = other.userEquates;
+  defaultEquates = other.defaultEquates;
+  discreteMatrix = other.discreteMatrix;
+  continuousMatrix = other.continuousMatrix;
+  eliminated = other.eliminated;
+  excluded = other.excluded;
+  ucCharLabelToIndex = other.ucCharLabelToIndex;
+  indToCharLabel = other.indToCharLabel;
+  charStates = other.charStates;
+  globalStateLabels = other.globalStateLabels;
+  items = other.items;
+  charSets = other.charSets;
+  charPartitions = other.charPartitions;
+  exSets = other.exSets;
+  datatype = other.datatype;
+  originalDatatype = other.originalDatatype;
+  datatypeReadFromFormat = other.datatypeReadFromFormat;
+  statesFormat = other.statesFormat;
+  datatypeMapperVec = other.datatypeMapperVec;
+  isEmpty = false;
+  isUserSupplied = other.isUserSupplied;
+  supportMixedDatatype = other.supportMixedDatatype;
+  convertAugmentedToMixed = other.convertAugmentedToMixed;
+  allowAugmentingOfSequenceSymbols = other.allowAugmentingOfSequenceSymbols;
+  writeInterleaveLen = other.writeInterleaveLen;
+  other.Reset();
+  transfMgr.Reset();
+}
+
+
+void NxsCharactersBlock::WriteStatesForTaxonAsNexus(
+						    std::ostream &out,			/* output stream on which to print matrix */
+						    unsigned taxNum,
+						    unsigned beginCharInd,
+						    unsigned endCharInd) const	{
+  NCL_ASSERT(endCharInd <= this->nChar);
+
+  if (datatype == continuous)
+    {
+      const ContinuousCharRow & row = GetContinuousMatrixRow(taxNum);
+      if (!row.empty())
+	{
+	  NCL_ASSERT(endCharInd <= row.size());
+	  for (unsigned charInd = beginCharInd; charInd < endCharInd; ++charInd)
+	    {
+	      out << ' ';
+	      ShowStateLabels(out, taxNum, charInd, UINT_MAX);
+	    }
+	}
+    }
+  else
+    {
+      const NxsDiscreteStateRow & row = GetDiscreteMatrixRow(taxNum);
+      const unsigned rs = (const unsigned)row.size();
+      NCL_ASSERT(endCharInd <= rs);
+      if (rs > 0)
+	{
+	  if (this->datatype == NxsCharactersBlock::codon)
+	    {
+	      for (unsigned charInd = beginCharInd; charInd < endCharInd; ++charInd)
+		{
+		  NxsDiscreteStateCell sc = row[charInd];
+		  if (sc == NXS_GAP_STATE_CODE)
+		    out << gap << gap << gap;
+		  else if (sc >= 0 && sc < (NxsDiscreteStateCell) globalStateLabels.size())
+		    out << globalStateLabels[sc];
+		  else
+		    out << missing << missing << missing;
+		}
+	    }
+	  else
+	    {
+	      const NxsDiscreteDatatypeMapper * dm = GetDatatypeMapperForChar(0);
+	      if (dm == NULL)
+		throw NxsNCLAPIException("No DatatypeMapper in WriteStatesForTaxonAsNexus");
+	      if (IsMixedType())
+		{
+
+		  for (unsigned charInd = beginCharInd; charInd < endCharInd; ++charInd)
+		    {
+		      dm = GetDatatypeMapperForChar(charInd);
+		      if (dm == NULL)
+			{
+			  errormsg = "No DatatypeMapper for character ";
+			  errormsg << charInd + 1 << " in WriteStatesForTaxonAsNexus";
+			  throw NxsNCLAPIException(errormsg);
+			}
+		      const NxsDiscreteStateCell c = row.at(charInd);
+		      dm->WriteStateCodeAsNexusString(out, c);
+		    }
+		}
+	      else
+		{
+		  if (tokens)
+		    {
+		      for (unsigned charInd = beginCharInd; charInd < endCharInd; ++charInd)
+			{
+			  NxsDiscreteStateCell sc = row[charInd];
+			  out << ' ';
+			  if (sc == NXS_GAP_STATE_CODE)
+			    out << gap;
+			  else
+			    {
+			      NxsString sl = GetStateLabel(charInd, sc); /*v2.1to2.2 4 */
+			      if (sl == " ")
+				{
+				  errormsg = "Writing character state ";
+				  errormsg << 1 + sc << " for character " << 1+charInd << ", but no appropriate chararcter label or symbol was found.";
+				  throw NxsNCLAPIException(errormsg);
+				}
+			      else
+				out  << NxsString::GetEscaped(sl);
+			    }
+			}
+		    }
+		  else
+		    {
+		      std::vector<NxsDiscreteStateCell>::const_iterator endIt = row.begin() + beginCharInd;
+		      std::vector<NxsDiscreteStateCell>::const_iterator begIt = endIt;
+		      if (endCharInd == row.size())
+			endIt = row.end();
+		      else
+			endIt += endCharInd - beginCharInd;
+		      dm->WriteStateCodeRowAsNexus(out, begIt, endIt);
+		    }
+		}
+	    }
+	}
+    }
+}
+
+
+/*!
+  Provides a dump of the contents of the `matrix' variable. Useful for testing whether data is being read as
+  expected. If marginText is NULL, matrix output is placed flush left. If each line of output should be prefaced with
+  a tab character, specify "\t" for `marginText'.
+*/
+void NxsCharactersBlock::DebugShowMatrix(
+					 std::ostream &out,			/* output stream on which to print matrix */
+					 bool ,	/* deprecated, matchchar no longer used for output */
+					 const char *marginText) const /* for printing first on each line */
+{
+  if (!taxa)
+    return;
+  const unsigned width = taxa->GetMaxTaxonLabelLength();
+  const unsigned ntt = GetNTaxTotal();
+  for (unsigned i = 0; i < ntt; i++)
+    {
+      bool skip = true;
+      if (datatype == continuous)
+	{
+	  const ContinuousCharRow & row = GetContinuousMatrixRow(i);
+	  skip = row.empty();
+	}
+      else
+	{
+	  const NxsDiscreteStateRow & row = GetDiscreteMatrixRow(i);
+	  skip = row.empty();
+	}
+      if (!skip)
+	{
+	  if (marginText != NULL)
+	    out << marginText;
+	  const NxsString currTaxonLabel = taxa->GetTaxonLabel(i); /*v2.1to2.2 4 */
+	  out << currTaxonLabel;
+	  unsigned currTaxonLabelLen = (unsigned)currTaxonLabel.size();
+	  unsigned diff = width - currTaxonLabelLen;
+	  std::string spacer(diff+5, ' ');
+	  out << spacer;
+	  WriteStatesForTaxonAsNexus(out, i, 0, nChar);
+	  out << endl;
+	}
+    }
+}
+
+unsigned NxsCharactersBlock::GetMaxObsNumStates(bool countMissingStates, bool onlyActiveChars) NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+{
+  unsigned maxN = 1;
+  for (unsigned j = 0; j < nChar; j++)
+    {
+      if (!onlyActiveChars || IsActiveChar(j))
+	maxN = std::max(maxN, GetObsNumStates(j, countMissingStates));
+    }
+  return maxN;
+}
+
+/*!
+  Performs a count of the number of active characters.
+*/
+unsigned NxsCharactersBlock::GetNumActiveChar() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+{
+  unsigned num_active_char = 0;
+  for (unsigned i = 0; i < nChar; i++)
+    {
+      if (IsActiveChar(i))
+	num_active_char++;
+    }
+  return num_active_char;
+}
+
+
+
+/* Returns label for character state `j' at character `i', if a label has been specified. If no label was specified,
+   returns string containing a single blank (i.e., " ").
+*/
+NxsString NxsCharactersBlock::GetStateLabelImpl( /*v2.1to2.2 4 */
+						unsigned i,	/* the locus in range [0..`nChar') */
+						unsigned j) const	/* the 0-offset index of the state of interest */
+{
+  NxsString s = " ";
+  NxsStringVectorMap::const_iterator cib = charStates.find(i);
+  if (cib != charStates.end() && j < static_cast<unsigned>(cib->second.size()))
+    return cib->second[j];
+  if (!globalStateLabels.empty() && (j < globalStateLabels.size()))
+    return globalStateLabels[j];
+  return s;
+}
+
+
+/*!
+  Returns true if `ch' can be found in the `symbols' array. The value of `respectingCase' is used to determine
+  whether or not the search should be case sensitive. Assumes `symbols' is non-NULL.
+*/
+bool NxsCharactersBlock::IsInSymbols(
+				     char ch) NCL_COULD_BE_CONST /* the symbol character to search for */ /*v2.1to2.2 1 */
+{
+  char char_in_question = (respectingCase ? ch : (char)toupper(ch));
+  for (std::string::const_iterator sIt = symbols.begin(); sIt != symbols.end(); ++sIt)
+    {
+      const char char_in_symbols = (respectingCase ? *sIt : (char)toupper(*sIt));
+      if (char_in_symbols == char_in_question)
+	return true;
+    }
+  return false;
+}
+
+/*!
+  Called when CHARLABELS command needs to be parsed from within the DIMENSIONS block. Deals with everything after
+  the token CHARLABELS up to and including the semicolon that terminates the CHARLABELS command. If an ELIMINATE
+  command has been processed, labels for eliminated characters will not be stored.
+*/
+void NxsCharactersBlock::HandleCharlabels(
+					  NxsToken &token)	/* the token used to read from `in' */
+{
+  ucCharLabelToIndex.clear();
+  indToCharLabel.clear();
+  unsigned ind = 0;
+  for (;;)
+    {
+      token.GetNextToken();
+      if (token.Equals(";"))
+	break;
+      else
+	{
+	  if (ind >= nChar)
+	    GenerateNxsException(token, "Number of character labels exceeds NCHAR specified in DIMENSIONS command");
+	  NxsString t = token.GetToken();
+	  if (t != " ")
+	    {
+	      indToCharLabel[ind] = t;
+	      t.ToUpper();
+	      ucCharLabelToIndex[t] = ind;
+	    }
+	  ind++;
+	}
+    }
+}
+
+/*!
+  Called when CHARSTATELABELS command needs to be parsed from within the CHARACTERS block. Deals with everything
+  after the token CHARSTATELABELS up to and including the semicolon that terminates the CHARSTATELABELS command.
+  CharLabels data structures  will store labels only for characters that have not been eliminated, and likewise for
+  `charStates'. Specifically, `charStates[0]' refers to the vector of character state labels for the first
+  non-eliminated character.
+*/
+void NxsCharactersBlock::HandleCharstatelabels(
+					       NxsToken &token)	/* the token used to read from `in' */
+{
+  unsigned currChar = 0;
+  bool semicolonFoundInInnerLoop = false;
+  bool tokenAlreadyRead = false;
+  bool save = true;
+
+  charStates.clear();
+  ucCharLabelToIndex.clear();
+  indToCharLabel.clear();
+
+  for (;;)
+    {
+      save = true;
+
+      if (semicolonFoundInInnerLoop)
+	break;
+
+      if (tokenAlreadyRead)
+	tokenAlreadyRead = false;
+      else
+	token.GetNextToken();
+
+      if (token.Equals(";"))
+	break;
+
+      // Token should be the character number; create a new association
+      //
+      int sn = -1;
+      try {
+	sn = token.GetToken().ConvertToInt();
+      }
+      catch (NxsString::NxsX_NotANumber &x)
+	{
+	}
+      unsigned n = (unsigned)sn;
+      if (sn < 1 || n > nChar || n <= currChar)
+	{
+	  errormsg = "Invalid character number (";
+	  errormsg += token.GetToken();
+	  errormsg += ") found in CHARSTATELABELS command (either out of range or not interpretable as an integer)";
+	  throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+	}
+
+      currChar = n;
+
+      token.GetNextToken();
+
+      // Token should be the character label or / if there is no label
+      //	' ' is a placeholder for no label.
+      //
+      if (save)
+	{
+	  NxsString t = token.GetToken();
+	  if (t != " " && !token.Equals("/"))
+	    {
+	      indToCharLabel[currChar - 1] = t;
+	      t.ToUpper();
+	      ucCharLabelToIndex[t] = currChar - 1;
+	    }
+	}
+      if (!token.Equals("/"))
+	token.GetNextToken();
+
+      // Token should be a slash character if state labels were provided for this character; otherwise,
+      // token should be one of the following:
+      // 1) the comma separating information for different characters, in which case we read in the
+      //	  next token (which should be the next character number)
+      // 2) the semicolon indicating the end of the command
+      //
+      if (!token.Equals("/"))
+	{
+	  if (!token.Equals(",") && !token.Equals(";"))
+	    {
+	      errormsg = "Expecting a comma or semicolon here, but found \"";
+	      errormsg += token.GetToken();
+	      errormsg += "\" instead";
+	      throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+	    }
+	  if (token.Equals(","))
+	    token.GetNextToken();
+	  tokenAlreadyRead = true;
+	  continue;
+	}
+
+      // Now create a new association for the character states list
+
+      for (;;)
+	{
+	  token.GetNextToken();
+
+	  if (token.Equals(";"))
+	    {
+	      semicolonFoundInInnerLoop = true;
+	      break;
+	    }
+
+	  if (token.Equals(","))
+	    break;
+
+	  if (save)
+	    {
+	      if (datatype == continuous)
+		GenerateNxsException(token, "State Labels cannot be specified when the datatype is continuous");
+
+	      // Token should be a character state label; add it to the list
+	      NxsString cslabel = token.GetToken();
+	      charStates[n - 1].push_back(cslabel);
+	    }
+
+	} // inner for (;;) loop (grabbing state labels for character n)
+    } // outer for (;;) loop
+}
+
+/*!
+  Called when DIMENSIONS command needs to be parsed from within the CHARACTERS block. Deals with everything after
+  the token DIMENSIONS up to and including the semicolon that terminates the DIMENSIONs command. `newtaxaLabel',
+  `ntaxLabel' and `ncharLabel' are simply "NEWTAXA", "NTAX" and "NCHAR" for this class, but may be different for
+  derived classes that use `newtaxa', `ntax' and `nChar' for other things (e.g., ntax is number of populations in
+  an ALLELES block)
+*/
+void NxsCharactersBlock::HandleDimensions(
+					  NxsToken &token,			/* the token used to read from `in' */
+					  NxsString newtaxaLabel,	/* the label used in data file for `newtaxa' */
+					  NxsString ntaxLabel,		/* the label used in data file for `ntax' */
+					  NxsString ncharLabel)		/* the label used in data file for `nChar' */
+{
+  nChar = 0;
+  unsigned ntaxRead = 0;
+  for (;;)
+    {
+      token.GetNextToken();
+      if (token.Equals(newtaxaLabel))
+	newtaxa = true;
+      else if (token.Equals(ntaxLabel))
+	{
+	  DemandEquals(token, "after NTAX in DIMENSIONS command");
+	  ntaxRead = DemandPositiveInt(token, ntaxLabel.c_str());
+	}
+      else if (token.Equals(ncharLabel))
+	{
+	  DemandEquals(token, "in DIMENSIONS command");
+	  nChar = DemandPositiveInt(token, ncharLabel.c_str());
+	}
+      else if (token.Equals(";"))
+	break;
+    }
+
+  if (nChar == 0)
+    {
+      errormsg = "DIMENSIONS command must have an NCHAR subcommand .";
+      throw NxsException(errormsg, token);
+    }
+  if (newtaxa)
+    {
+      if (ntaxRead == 0)
+	{
+	  errormsg = "DIMENSIONS command must have an NTAX subcommand when the NEWTAXA option is in effect.";
+	  throw NxsException(errormsg, token);
+	}
+      AssureTaxaBlock(createImpliedBlock, token, "Dimensions");
+      if (!createImpliedBlock)
+	{
+	  taxa->Reset();
+	  if (nexusReader)
+	    nexusReader->RemoveBlockFromUsedBlockList(taxa);
+	}
+      taxa->SetNtax(ntaxRead);
+      nTaxWithData = ntaxRead;
+    }
+  else
+    {
+      AssureTaxaBlock(false, token, "Dimensions");
+      const unsigned ntaxinblock = taxa->GetNTax();
+      if (ntaxinblock == 0)
+	{
+	  errormsg = "A TAXA block must be read before character data, or the DIMENSIONS command must use the NEWTAXA.";
+	  throw NxsException(errormsg, token);
+	}
+
+      if (ntaxinblock < ntaxRead)
+	{
+	  errormsg = ntaxLabel;
+	  errormsg += " in ";
+	  errormsg += NCL_BLOCKTYPE_ATTR_NAME;
+	  errormsg += " block must be less than or equal to NTAX in TAXA block\nNote: one circumstance that can cause this error is \nforgetting to specify ";
+	  errormsg += ntaxLabel;
+	  errormsg += " in DIMENSIONS command when \na TAXA block has not been provided";
+	  throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+	}
+      nTaxWithData = (ntaxRead == 0 ? ntaxinblock : ntaxRead);
+    }
+}
+
+/*!
+  Called when ELIMINATE command needs to be parsed from within the CHARACTERS block. Deals with everything after the
+  token ELIMINATE up to and including the semicolon that terminates the ELIMINATE command. Any character numbers
+  or ranges of character numbers specified are stored in the NxsUnsignedSet `eliminated', which remains empty until
+  an ELIMINATE command is processed. Note that like all sets the character ranges are adjusted so that their offset
+  is 0. For example, given "eliminate 4-7;" in the data file, the eliminate array would contain the values 3, 4, 5
+  and 6 (not 4, 5, 6 and 7). It is assumed that the ELIMINATE command comes before character labels and/or character
+  state labels have been specified; an error message is generated if the user attempts to use ELIMINATE after a
+  CHARLABELS, CHARSTATELABELS, or STATELABELS command.
+*/
+void NxsCharactersBlock::HandleEliminate(
+					 NxsToken &token)	/* the token used to read from `in' */
+{
+  if (!eliminated.empty() && nexusReader)
+    nexusReader->NexusWarnToken("Only one ELIMINATE command should be used in a CHARACTERS or DATA block (it must appear before the MATRIX command).\n   New character eliminations will be added to the previous eliminated characters (the previously eliminated characters will continue to be excluded).", NxsReader::UNCOMMON_SYNTAX_WARNING, token);
+  token.GetNextToken();
+  NxsSetReader::ReadSetDefinition(token, *this, "Character", "Eliminate", &eliminated);
+  NCL_ASSERT(eliminated.size() <= nChar);
+  for (NxsUnsignedSet::const_iterator elIt = eliminated.begin(); elIt != eliminated.end(); ++elIt)
+    excluded.insert(*elIt);
+}
+
+
+
+/*!
+  Called from HandleMatrix function to read in a standard (i.e., non-transposed) matrix. Interleaving, if
+  applicable, is dealt with herein.
+*/
+void NxsCharactersBlock::HandleStdMatrix(
+					 NxsToken &token)	/* the token used to read from `in' */
+{
+  NCL_ASSERT(taxa != NULL);
+  unsigned indOfTaxInCommand;
+  unsigned indOfTaxInMemory;
+  unsigned currChar = 0;
+  unsigned firstChar = 0;
+  unsigned lastChar = nChar;
+  unsigned nextFirst = 0;
+  unsigned page = 0;
+  const bool continuousData =  (datatype == NxsCharactersBlock::continuous);
+  const unsigned ntlabels = taxa->GetNumTaxonLabels();
+  errormsg.clear();
+  bool taxaBlockNeedsLabels = (ntlabels == 0);
+  if (!taxaBlockNeedsLabels && ntlabels < nTaxWithData)
+    {
+      errormsg << "Not enough taxlabels are known to read characters for " << nTaxWithData << " taxa in the Matrix command.";
+      throw NxsException(errormsg, token);
+    }
+  ContinuousCharRow emptyContRow;
+  NxsDiscreteStateRow emptyDiscRow;
+  ContinuousCharRow *contRowPtr = NULL;
+  NxsDiscreteStateRow *discRowPtr = NULL;
+  ContinuousCharRow *ftContRowPtr = NULL;
+  NxsDiscreteStateRow *ftDiscRowPtr = NULL;
+  const bool isContinuous = (datatype == NxsCharactersBlock::continuous);
+  if (isContinuous)
+    emptyContRow.resize(nChar);
+  else
+    emptyDiscRow.assign(nChar, NXS_INVALID_STATE_CODE);
+  std::vector<unsigned> toInMem(nTaxWithData, UINT_MAX);
+  std::vector<unsigned> nCharsRead(nTaxWithData, 0);
+
+  unsigned numSigInts = NxsReader::getNumSignalIntsCaught();
+  const bool checkingSignals = NxsReader::getNCLCatchesSignals();
+  const unsigned MAX_NUM_CHARS_BETWEEN_SIGNAL_CHECKS = 1000;
+  for (; currChar < nChar; page++)
+    {
+      for (indOfTaxInCommand = 0; indOfTaxInCommand < nTaxWithData ; indOfTaxInCommand++)
+	{
+	  unsigned numCharsSinceLastSignalCheck = 0;
+	  if (checkingSignals && NxsReader::getNumSignalIntsCaught() != numSigInts)
+	    {
+	      if (datatype == NxsCharactersBlock::continuous)
+		continuousMatrix.clear();
+	      else
+		discreteMatrix.clear();
+	      throw NxsSignalCanceledParseException("Reading Characters Block");
+	    }
+	  NxsString nameStr;
+	  if (labels)
+	    {
+	      token.GetNextToken();
+	      nameStr = token.GetToken();
+	      if (taxaBlockNeedsLabels)
+		{
+		  if (taxa->IsAlreadyDefined(nameStr))
+		    {
+		      errormsg << "Data for this taxon (" << nameStr << ") has already been saved";
+		      throw NxsException(errormsg, token);
+		    }
+		  try {
+		    indOfTaxInMemory = taxa->AddTaxonLabel(nameStr);
+		  }
+		  catch (NxsException &x)
+		    {
+		      if (nameStr == ";")
+			{
+			  errormsg << "Unexpected ; after only " << indOfTaxInCommand << " taxa were read (expecting characters for " << nTaxWithData << " taxa).";
+			  throw NxsException(errormsg, token);
+			}
+		      x.addPositionInfo(token);
+		      throw x;
+		    }
+		}
+	      else
+		{
+		  unsigned numOfTaxInMemory = taxa->TaxLabelToNumber(nameStr);
+		  if (numOfTaxInMemory == 0)
+		    {
+		      if (token.Equals(";"))
+			{
+			  if (currChar != nChar)
+			    errormsg << "Unexpected ; (after only " << currChar << " characters were read)";
+			  else
+			    errormsg << "Unexpected ; (after characters were read for only " << indOfTaxInCommand << "out of " << nTaxWithData << " taxa)";
+			}
+		      else
+			errormsg << "Could not find taxon named \"" << nameStr << "\" among stored taxon labels";
+		      if (currChar > 0)
+			errormsg << "\n   Expecting data for taxon \"" << taxa->GetTaxonLabel(toInMem[indOfTaxInCommand]) << "\"";
+		      throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+		    }
+		  indOfTaxInMemory = numOfTaxInMemory - 1;
+		}
+	    }
+	  else
+	    {
+	      indOfTaxInMemory = indOfTaxInCommand;
+	      nameStr << (indOfTaxInMemory + 1);
+	    }
+	  if (page == 0)
+	    {
+	      if (isContinuous)
+		{
+		  NCL_ASSERT(indOfTaxInMemory < continuousMatrix.size());
+		  continuousMatrix[indOfTaxInMemory] = emptyContRow;
+		}
+	      else
+		{
+		  NCL_ASSERT(indOfTaxInMemory < discreteMatrix.size());
+		  discreteMatrix[indOfTaxInMemory] = emptyDiscRow;
+		}
+	      if (toInMem[indOfTaxInCommand] != UINT_MAX)
+		{
+		  errormsg << "Characters for taxon \"" << nameStr << "\" (number " << indOfTaxInMemory + 1 << "and \"" << taxa->GetTaxonLabel(indOfTaxInMemory) << "\" according to the taxa block) have already been stored";
+		  throw NxsException(errormsg, token);
+		}
+	      toInMem[indOfTaxInCommand] = indOfTaxInMemory;
+	    }
+	  else
+	    {
+	      if (toInMem[indOfTaxInCommand] != indOfTaxInMemory)
+		{
+		  errormsg << "Ordering of taxa must be identical to that in first interleave page. Taxon \"" << nameStr << "\" was not expected.";
+		  throw NxsException(errormsg, token);
+		}
+	    }
+
+	  if (firstChar > 0 && nCharsRead[indOfTaxInCommand] >= firstChar)
+	    {
+	      errormsg << "Data for this taxon (" << nameStr << ") have already been saved";
+	      throw NxsException(errormsg, token);
+	    }
+	  if (isContinuous)
+	    {
+	      contRowPtr = &continuousMatrix[indOfTaxInMemory];
+	      if (ftDiscRowPtr == NULL)
+		ftContRowPtr = contRowPtr;
+	    }
+	  else
+	    {
+	      discRowPtr = &discreteMatrix[indOfTaxInMemory];
+	      if (ftDiscRowPtr == NULL)
+		ftDiscRowPtr = discRowPtr;
+	    }
+
+	  //******************************************************
+	  //******** Beginning of loop through characters ********
+	  //******************************************************
+	  bool atEOL = false;
+	  for (currChar = firstChar; currChar < lastChar; currChar++)
+	    {
+	      if (checkingSignals)
+		{
+		  if (numCharsSinceLastSignalCheck >= MAX_NUM_CHARS_BETWEEN_SIGNAL_CHECKS)
+		    {
+		      if (NxsReader::getNumSignalIntsCaught() != numSigInts)
+			{
+			  if (datatype == NxsCharactersBlock::continuous)
+			    continuousMatrix.clear();
+			  else
+			    discreteMatrix.clear();
+			  throw NxsSignalCanceledParseException("Reading Characters Block");
+			}
+		      numCharsSinceLastSignalCheck = 0;
+		    }
+		  else
+		    numCharsSinceLastSignalCheck++;
+		}
+
+	      NxsDiscreteDatatypeMapper * currMapper =  GetMutableDatatypeMapperForChar(currChar);
+	      // atEOL will be false only if a newline character is encountered before character j processed
+	      if (continuousData)
+		atEOL = HandleNextContinuousState(token, indOfTaxInMemory, currChar, *contRowPtr, nameStr);
+	      else
+		{
+		  NCL_ASSERT(currMapper);
+		  if (tokens)
+		    atEOL = HandleNextTokenState(token, indOfTaxInMemory, currChar, *discRowPtr, *currMapper, ftDiscRowPtr, nameStr);
+		  else
+		    atEOL = HandleNextDiscreteState(token, indOfTaxInMemory, currChar, *discRowPtr, *currMapper, ftDiscRowPtr, nameStr);
+		}
+	      if (interleaving && !atEOL)
+		{
+		  if (lastChar < nChar && currChar != lastChar)
+		    {
+		      errormsg << "Each line within an interleave page must comprise the same number of characters.  Error reading taxon \"" << nameStr << '\"';
+		      throw NxsException(errormsg, token);
+		    }
+
+		  // currChar should be firstChar in next go around
+		  nextFirst = currChar;
+
+		  // Set lastChar to currChar so that we can check to make sure the remaining lines
+		  // in this interleave page end at the same place
+		  lastChar = currChar;
+		}
+	    }
+	  if (lastChar > 0)
+	    nCharsRead[indOfTaxInCommand] = lastChar - 1;
+	  if (lastChar < nChar && indOfTaxInCommand > 0)
+	    {
+	      token.SetLabileFlagBit(NxsToken::newlineIsToken);
+	      token.GetNextToken();
+	      if (!token.AtEOL())
+		{
+		  errormsg << "Each line within an interleave page must comprise the same number of characters\n. Expecting the end of a line, but found " << token.GetToken() << " when reading data for taxon \"" << nameStr << '\"';
+		  throw NxsException(errormsg, token);
+		}
+	    }
+	  else
+	    {
+	      const char nextch = token.PeekAtNextChar();
+	      if (indOfTaxInCommand > 0 && (!atEOL) && (strchr(";[\n\r \t", nextch) == NULL) && nexusReader)
+		{
+		  errormsg << "Expecting a whitespace character at the end of the characters for taxon \""<< nameStr << "\" but found " << nextch;
+		  nexusReader->NexusWarnToken(errormsg, NxsReader::UNCOMMON_SYNTAX_WARNING, token);
+		  errormsg.clear();
+		}
+	    }
+	}
+      firstChar = nextFirst;
+      lastChar = nChar;
+      taxaBlockNeedsLabels = false; /* taxaBlockNeedsLabels can only be true on the first page */
+    }
+}
+
+/*!
+  Called from HandleMatrix function to read in a transposed matrix. Interleaving, if applicable, is dealt with herein.
+*/
+void NxsCharactersBlock::HandleTransposedMatrix(
+						NxsToken &token)	/* the token used to read from in */
+{
+  NCL_ASSERT(taxa);
+  unsigned currTaxon = 0;
+  unsigned firstTaxon = 0;
+  unsigned lastTaxon = nTaxWithData;
+  unsigned nextFirst = 0;
+  unsigned page = 0;
+  const bool continuousData =  (datatype == NxsCharactersBlock::continuous);
+  unsigned indOfCharInCommand, indOfCharInMemory;
+  const bool isContinuous = (datatype == NxsCharactersBlock::continuous);
+
+  if (isContinuous)
+    {
+      ContinuousCharRow emptyContRow(nChar);
+      for (unsigned i = 0; i < nTaxWithData; ++ i)
+	continuousMatrix[i] = emptyContRow;
+    }
+  else
+    {
+      NxsDiscreteStateRow emptyDiscRow(nChar, NXS_INVALID_STATE_CODE);
+      for (unsigned i = 0; i < nTaxWithData; ++ i)
+	discreteMatrix[i] = emptyDiscRow;
+    }
+  vector<unsigned> toInMem(nChar, UINT_MAX);
+  vector<unsigned> nTaxRead(nChar, 0);
+  bool needsCharLabels = indToCharLabel.empty();
+  for (;;	page++)
+    {
+      for (indOfCharInCommand = 0; indOfCharInCommand < nChar; indOfCharInCommand++)
+	{
+	  NxsString rawToken;
+	  if (labels)
+	    {
+	      token.GetNextToken();
+	      if (needsCharLabels)
+		{
+		  rawToken = token.GetToken();
+		  NxsString s = rawToken;
+		  s.ToUpper();
+		  if (ucCharLabelToIndex.count(s) > 0)
+		    {
+		      errormsg << "Data for this character (" << token.GetToken() << ") has already been saved";
+		      throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+		    }
+		  ucCharLabelToIndex[s] = indOfCharInCommand;
+		  indToCharLabel[indOfCharInCommand] = rawToken;
+		  indOfCharInMemory = indOfCharInCommand;
+		}
+	      else // either not first interleaved page or character labels not previously defined
+		{
+		  rawToken = token.GetToken();
+		  NxsString s = rawToken;
+		  s.ToUpper();
+		  LabelToIndexMap::const_iterator iter = ucCharLabelToIndex.find(s);
+		  if (iter == ucCharLabelToIndex.end())
+		    {
+		      errormsg << "Could not find character named " << token.GetToken() <<  " among stored character labels";
+		      throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+		    }
+		  indOfCharInMemory = iter->second;
+		}
+	    }
+	  else
+	    indOfCharInMemory = indOfCharInCommand;
+
+	  if (page == 0)
+	    {
+	      if (toInMem[indOfCharInCommand] != UINT_MAX)
+		{
+		  errormsg << "States for character " << indOfCharInCommand;
+		  if (!rawToken.empty())
+		    errormsg << " (" << rawToken << ") ";
+		  errormsg << "have already been stored";
+		  throw NxsException(errormsg, token);
+		}
+	      toInMem[indOfCharInCommand] = indOfCharInMemory;
+	    }
+	  else
+	    {
+	      if (toInMem[indOfCharInCommand] != indOfCharInMemory)
+		{
+		  errormsg << "The order of characters must be in the same order in each page of the interleaved matrix. Character " << rawToken << " was unexpected.";
+		  throw NxsException(errormsg, token);
+		}
+	    }
+	  if (firstTaxon > 0 && nTaxRead[indOfCharInCommand] >= firstTaxon)
+	    {
+	      errormsg << "Data for this character ";
+	      if (!rawToken.empty())
+		errormsg << '(' << rawToken << ") ";
+	      errormsg << "has already been saved";
+	      throw NxsException(errormsg, token);
+	    }
+
+	  NxsDiscreteDatatypeMapper * currMapper =  GetMutableDatatypeMapperForChar(indOfCharInMemory);
+
+	  for (currTaxon = firstTaxon; currTaxon < lastTaxon; currTaxon++)
+	    {
+	      bool atEOL = false;
+	      NxsString nameStr;
+	      nameStr << 1+currTaxon;
+	      if (continuousData)
+		{
+		  ContinuousCharRow *contRowPtr = &continuousMatrix[currTaxon];
+		  atEOL = HandleNextContinuousState(token, currTaxon, indOfCharInMemory, *contRowPtr, nameStr);
+		}
+	      else
+		{
+		  NxsDiscreteStateRow *discRowPtr = &discreteMatrix[currTaxon];
+		  if (tokens)
+		    atEOL = HandleNextTokenState(token,  currTaxon, indOfCharInMemory, *discRowPtr, *currMapper, NULL, nameStr);
+		  else
+		    atEOL = HandleNextDiscreteState(token, currTaxon, indOfCharInMemory, *discRowPtr, *currMapper, NULL, nameStr);
+		}
+	      if (interleaving && !atEOL)
+		{
+		  if (lastTaxon < nTaxWithData && currTaxon != lastTaxon)
+		    GenerateNxsException(token, "Each line within an interleave page must comprise the same number of taxa");
+
+		  // currTaxon should be firstChar in next go around
+		  nextFirst = currTaxon;
+
+		  // Set lastTaxon to currTaxon so that we can check to make sure the
+		  // remaining lines in this interleave page end at the same place
+		  lastTaxon = currTaxon;
+		}
+	    }
+	  if (currTaxon > 0)
+	    nTaxRead[indOfCharInCommand] = currTaxon - 1;
+	  if (lastTaxon < nTaxWithData && indOfCharInCommand > 0)
+	    {
+	      token.SetLabileFlagBit(NxsToken::newlineIsToken);
+	      token.GetNextToken();
+	      if (!token.AtEOL())
+		{
+		  errormsg = "Each line within an interleave page must comprise the same number of taxa\n.";
+		  errormsg << "Expecting the end of a line, but found " << token.GetToken();
+		  throw NxsException(errormsg, token);
+		}
+	    }
+	}
+      firstTaxon = nextFirst;
+      lastTaxon = nTaxWithData;
+      if (currTaxon == nTaxWithData)
+	break;
+      needsCharLabels = false;
+    }
+}
+
+/*!
+  Called when MATRIX command needs to be parsed from within the CHARACTERS block. Deals with everything after the
+  token MATRIX up to and including the semicolon that terminates the MATRIX command.
+*/
+void NxsCharactersBlock::HandleMatrix(
+				      NxsToken &token)	/* the token used to read from `in' */
+{
+  const NxsPartition dtParts;
+  const std::vector<DataTypesEnum> dtv;
+  if (datatypeMapperVec.empty())
+    CreateDatatypeMapperObjects(dtParts, dtv);
+  if (taxa == NULL)
+    AssureTaxaBlock(false, token, "Matrix");
+
+  if (tokens && GetDataType() == standard)
+    {
+      /* we can run into trouble here because the number of states can be larger than the
+	 symbols list in the NxsDiscreteDatatypeMapper object (because CharState labels can be
+	 used in a matrix, and symbols don't have to be introduced for each character).
+
+	 We deal with that here, by introducing \0 symbols
+      */
+      const unsigned nStatesWSymbols = (const unsigned)symbols.length();
+      unsigned nStatesTotal = nStatesWSymbols;
+      for (NxsStringVectorMap::const_iterator cib = this->charStates.begin(); cib != this->charStates.end(); ++cib)
+	{
+	  const NxsStringVector & stateLabelsVec = cib->second;
+	  const unsigned ns = (unsigned)stateLabelsVec.size();
+	  if (ns > nStatesTotal)
+	    nStatesTotal = ns;
+	}
+      if (nStatesTotal > nStatesWSymbols)
+	{
+	  symbols.append(nStatesTotal-nStatesWSymbols, '\0');
+	  CreateDatatypeMapperObjects(dtParts, dtv);
+	}
+    }
+  const unsigned ntax = taxa->GetNTax();
+  if (ntax == 0)
+    {
+      errormsg = "Must precede ";
+      errormsg << NCL_BLOCKTYPE_ATTR_NAME << " block with a TAXA block or specify NEWTAXA and NTAX in the DIMENSIONS command";
+      throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+    }
+
+  discreteMatrix.clear();
+  continuousMatrix.clear();
+
+  if (datatype == NxsCharactersBlock::continuous)
+    {
+      continuousMatrix.clear();
+      continuousMatrix.resize(ntax);
+    }
+  else
+    {
+      discreteMatrix.clear();
+      discreteMatrix.resize(ntax);
+    }
+  if (IsMixedType())
+    {
+      if (transposing)
+	throw NxsUnimplementedException("Reading of transposed, mixed datatype matrices will probably never be supported by NCL");
+      /*	HandleMixedDatatypeMatrix(token); */
+    }
+  if (transposing)
+    HandleTransposedMatrix(token);
+  else
+    HandleStdMatrix(token);
+  DemandEndSemicolon(token, "MATRIX");
+  if (assumptionsBlock)
+    assumptionsBlock->SetCallback(this);
+  if (convertAugmentedToMixed)
+    AugmentedSymbolsToMixed();
+}
+
+/*!
+  Called when STATELABELS command needs to be parsed from within the DIMENSIONS block. Deals with everything after
+  the token STATELABELS up to and including the semicolon that terminates the STATELABELS command. Note that the
+  numbers of states are shifted back one before being stored so that the character numbers in the NxsStringVectorMap
+  objects are 0-offset rather than being 1-offset as in the NxsReader data file.
+*/
+void NxsCharactersBlock::HandleStatelabels(
+					   NxsToken &token)	/* the token used to read from `in' */
+{
+  if (datatype == continuous)
+    GenerateNxsException(token, "STATELABELS cannot be specified when the datatype is continuous");
+  charStates.clear();
+  for (;;)
+    {
+      token.GetNextToken();
+      if (token.Equals(";"))
+	break;
+      int n = -1;
+      try {
+	n = token.GetToken().ConvertToInt();
+      }
+      catch (NxsString::NxsX_NotANumber &x)
+	{
+	}
+      if (n < 1 || n > (int)nChar)
+	{
+	  errormsg = "Invalid character number (";
+	  errormsg << token.GetToken() << ") found in STATELABELS command (either out of range or not interpretable as an integer)";
+	  throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+	}
+      NxsStringVector & v = charStates[n - 1];
+      for (;;)
+	{
+	  token.GetNextToken();
+	  if (token.Equals(";") || token.Equals(","))
+	    break;
+	  v.push_back(token.GetToken());
+	}
+    }
+}
+
+/*!
+  This function provides the ability to read everything following the block name (which is read by the NxsReader
+  object) to the END or ENDBLOCK statement. Characters are read from the input stream `in'. Overrides the abstract
+  virtual function in the base class.
+*/
+void NxsCharactersBlock::Read(
+			      NxsToken &token)	/* the token used to read from `in' */
+{
+  isEmpty = false;
+  isUserSupplied = true;
+
+  NxsString s;
+  s = "BEGIN ";
+  s += NCL_BLOCKTYPE_ATTR_NAME;
+  DemandEndSemicolon(token, s.c_str());
+  nTaxWithData = 0;
+
+  for (;;)
+    {
+      token.GetNextToken();
+      NxsBlock::NxsCommandResult res = HandleBasicBlockCommands(token);
+      if (res == NxsBlock::NxsCommandResult(STOP_PARSING_BLOCK))
+	{
+	  if (discreteMatrix.empty() && continuousMatrix.empty())
+	    {
+	      errormsg.clear();
+	      errormsg << "\nA " << NCL_BLOCKTYPE_ATTR_NAME << " block must contain a Matrix command";
+	      throw NxsException(errormsg, token);
+	    }
+	  return;
+	}
+      if (res != NxsBlock::NxsCommandResult(HANDLED_COMMAND))
+	{
+	  if (token.Equals("DIMENSIONS"))
+	    HandleDimensions(token, "NEWTAXA", "NTAX", "NCHAR");
+	  else if (token.Equals("FORMAT"))
+	    HandleFormat(token);
+	  else if (token.Equals("ELIMINATE"))
+	    HandleEliminate(token);
+	  else if (token.Equals("TAXLABELS"))
+	    HandleTaxLabels(token);
+	  else if (token.Equals("CHARSTATELABELS"))
+	    HandleCharstatelabels(token);
+	  else if (token.Equals("CHARLABELS"))
+	    HandleCharlabels(token);
+	  else if (token.Equals("STATELABELS"))
+	    HandleStatelabels(token);
+	  else if (token.Equals("MATRIX"))
+	    HandleMatrix(token);
+	  else
+	    SkipCommand(token);
+	}
+    }
+}
+
+/*!
+  This function outputs a brief report of the contents of this CHARACTERS block. Overrides the abstract virtual
+  function in the base class.
+*/
+void NxsCharactersBlock::Report(
+				std::ostream &out) NCL_COULD_BE_CONST  /* the output stream to which to write the report */ /*v2.1to2.2 1 */
+{
+  out << '\n' << NCL_BLOCKTYPE_ATTR_NAME << " block contains ";
+  if (nTaxWithData == 0)
+    out << "no taxa";
+  else if (nTaxWithData == 1)
+    out << "one taxon";
+  else
+    out << nTaxWithData << " taxa";
+  out << " and ";
+  if (nChar == 0)
+    out << "no characters";
+  else if (nChar == 1)
+    out << "one character";
+  else
+    out << nChar << " characters";
+  out << endl;
+
+  out << "  Data type is \"" << this->GetDatatypeName() << "\"" << endl;
+
+  if (respectingCase)
+    out << "  Respecting case" << endl;
+  else
+    out << "  Ignoring case" << endl;
+
+  if (tokens)
+    out << "  Multicharacter tokens allowed in data matrix" << endl;
+  else
+    out << "  Data matrix entries are expected to be single symbols" << endl;
+
+  if (labels && transposing)
+    out << "  Character labels are expected on left side of matrix" << endl;
+  else if (labels && !transposing)
+    out << "  Taxon labels are expected on left side of matrix" << endl;
+  else
+    out << "  No labels are expected on left side of matrix" << endl;
+
+  if (!indToCharLabel.empty())
+    {
+      out << "  Character and character state labels:" << endl;
+      for (unsigned k = 0; k < nChar; k++)
+	{
+	  const std::map<unsigned, std::string>::const_iterator toLit = indToCharLabel.find(k);
+	  const unsigned kNum = 1 + k;
+	  if (toLit == indToCharLabel.end())
+	    out << "    " << kNum << "    (no label provided for this character)" << endl;
+	  else
+	    out << "    " << kNum << "    " << toLit->second << endl;
+
+	  // Output state labels if any are defined for this character
+	  //
+	  NxsStringVectorMap::const_iterator cib = charStates.find(k);
+	  if (cib != charStates.end())
+	    {
+	      int ns = (int)cib->second.size();
+	      for (int m = 0; m < ns; m++)
+		out << "        " << cib->second[m] << endl;
+	    }
+	}
+    }
+
+  if (transposing && interleaving)
+    out << "  Matrix transposed and interleaved" << endl;
+  else if (transposing && !interleaving)
+    out << "  Matrix transposed but not interleaved" << endl;
+  else if (!transposing && interleaving)
+    out << "  Matrix interleaved but not transposed" << endl;
+  else
+    out << "  Matrix neither transposed nor interleaved" << endl;
+
+  out << "  Missing data symbol is '" << missing << '\'' << endl;
+
+  if (matchchar != '\0')
+    out << "  Match character is '" << matchchar << '\'' << endl;
+  else
+    out << "  No match character specified" << endl;
+
+  if (gap != '\0')
+    out << "  Gap character specified is '" << gap << '\'' << endl;
+  else
+    out << "  No gap character specified" << endl;
+
+  out << "  Valid symbols are: " << symbols << endl;
+
+  int numEquateMacros = (int)(userEquates.size() + defaultEquates.size());
+  if (numEquateMacros > 0)
+    {
+      out << "  Equate macros in effect:" << endl;
+      std::map<char, NxsString>::const_iterator i = defaultEquates.begin();
+      for (; i != defaultEquates.end(); ++i)
+	{
+	  out << "   " << (*i).first << " = " << i->second << endl;
+	}
+      i = userEquates.begin();
+      for (; i != userEquates.end(); ++i)
+	{
+	  out << "   " << (*i).first << " = " << i->second << endl;
+	}
+    }
+  else
+    out << "  No equate macros have been defined" << endl;
+
+  if (eliminated.empty())
+    out << "  No characters were eliminated" << endl;
+  else
+    {
+      out << "  The following characters were eliminated:" << endl;
+      NxsUnsignedSet::const_iterator k;
+      for (k = eliminated.begin(); k != eliminated.end(); k++)
+	{
+	  out << "   " << ((*k)+1) << endl;
+	}
+    }
+
+
+  if (excluded.empty())
+    out << "  no characters excluded" << endl;
+  else
+    {
+      out << "  The following characters have been excluded:\n";
+      for (NxsUnsignedSet::const_iterator eIt = excluded.begin(); eIt != excluded.end(); ++eIt)
+	out << "   " << (*eIt+1) << endl;
+    }
+  out << "  Data matrix:" << endl;
+  DebugShowMatrix(out, false, "    ");
+}
+
+void NxsCharactersBlock::WriteAsNexus(std::ostream &out) const
+{
+  out << "BEGIN CHARACTERS;\n";
+  WriteBasicBlockCommands(out);
+  out << "    DIMENSIONS";
+  if (this->taxa)
+    {
+      const unsigned wod = GetNTaxWithData();
+      if (wod > 0)
+	{
+	  const unsigned tnt = taxa->GetNTax();
+	  if (wod != tnt)
+	    out << " NTax=" << wod;
+	}
+    }
+  const unsigned multiplier = (this->datatype == NxsCharactersBlock::codon ? 3 : 1);
+  out << " NChar=" << multiplier*(this->nChar) << ";\n";
+  this->WriteEliminateCommand(out);
+  this->WriteFormatCommand(out);
+  this->WriteCharStateLabelsCommand(out);
+  this->WriteMatrixCommand(out);
+  WriteSkippedCommands(out);
+  out << "END;\n";
+}
+
+
+void NxsCharactersBlock::WriteEliminateCommand(
+					       std::ostream &out) const /* output stream on which to print matrix */
+{
+  if (eliminated.empty())
+    return;
+  out << "    ELIMINATE";
+  for (NxsUnsignedSet::const_iterator u = this->eliminated.begin(); u != this->eliminated.end(); ++u)
+    out << ' ' << (1 + *u);
+  out << ";\n";
+}
+
+
+void NxsCharactersBlock::WriteMatrixCommand(
+					    std::ostream &out) const /* output stream on which to print matrix */
+{
+  if (taxa == NULL)
+    return;
+  unsigned width = taxa->GetMaxTaxonLabelLength();
+  const unsigned ntaxTotal = taxa->GetNTax();
+  out << "Matrix\n";
+  int prec = 6;
+  if (datatype == continuous)
+    prec = (int)out.precision(10);
+  unsigned stride = (this->writeInterleaveLen < 1 ? this->nChar : this->writeInterleaveLen);
+  unsigned begChar = 0;
+  while (begChar < this->nChar)
+    {
+      if (begChar > 0)
+	out << '\n';
+      unsigned endChar  = std::min(begChar + stride, this->nChar);
+      for (unsigned i = 0; i < ntaxTotal; i++)
+	{
+	  if (this->TaxonIndHasData(i))
+	    {
+	      const std::string currTaxonLabel = NxsString::GetEscaped(taxa->GetTaxonLabel(i));
+	      out << currTaxonLabel;
+	      unsigned currTaxonLabelLen = (unsigned)currTaxonLabel.size();
+	      unsigned diff = width - currTaxonLabelLen;
+	      for (unsigned k = 0; k < diff+5; k++)
+		out << ' ';
+
+	      WriteStatesForMatrixRow(out, i, UINT_MAX, begChar, endChar);
+	      out << '\n';
+	    }
+	}
+      begChar = endChar;
+    }
+  out << ";\n";
+  if (datatype == continuous)
+    out.precision(prec);
+}
+
+std::string NxsCharactersBlock::GetMatrixRowAsStr(const unsigned rowIndex) const /* output stream on which to print matrix */
+{
+  if (!this->TaxonIndHasData(rowIndex))
+    return std::string();
+  std::ostringstream o;
+  WriteStatesForMatrixRow(o, rowIndex, UINT_MAX, 0, this->nChar);
+  return o.str();
+}
+
+void NxsCharactersBlock::WriteStatesForMatrixRow(
+						 std::ostream &out,				/* the output stream on which to write */
+						 unsigned currTaxonIndex,	/* the taxon, in range [0..`ntax') */
+						 unsigned ,
+						 unsigned beginChar,
+						 unsigned endChar) const		/* the index of the first taxon (if UINT_MAX, don't use matchchar) */
+{
+  WriteStatesForTaxonAsNexus(out, currTaxonIndex, beginChar, endChar);
+}
+
+
+void NxsCharactersBlock::WriteCharLabelsCommand(std::ostream &out) const
+{
+  if (indToCharLabel.empty())
+    return;
+  out << "    CHARLABELS";
+  std::map<unsigned, std::string>::const_iterator resultSearchIt;
+  const std::map<unsigned, std::string>::const_iterator endIt = indToCharLabel.end();
+  unsigned emptyLabelsToWrite = 0;
+  for (unsigned oit = 0; oit < nChar; ++oit)
+    {
+      resultSearchIt = indToCharLabel.find(oit);
+      if (resultSearchIt == endIt)
+	emptyLabelsToWrite++;
+      else
+	{
+	  for (unsigned j = 0; j < emptyLabelsToWrite; ++j)
+	    out << " _";
+	  emptyLabelsToWrite = 0;
+	  out << ' ' << NxsString::GetEscaped(resultSearchIt->second);
+	}
+    }
+  out << ";\n";
+}
+
+void NxsCharactersBlock::WriteCharStateLabelsCommand(std::ostream &out) const
+{
+  if (charStates.empty())
+    {
+      this->WriteCharLabelsCommand(out);
+      return;
+    }
+  const NxsString mtString;
+  bool isFirst = true;
+  std::map<unsigned, std::string>::const_iterator resultSearchIt;
+  const std::map<unsigned, std::string>::const_iterator endIt = indToCharLabel.end();
+  const NxsStringVectorMap::const_iterator endCSIt = this->charStates.end();
+  for (unsigned oit = 0; oit < nChar; ++oit)
+    {
+      resultSearchIt = indToCharLabel.find(oit);
+      NxsString escapedCLabel;
+      if (resultSearchIt != endIt)
+	escapedCLabel = NxsString::GetEscaped(resultSearchIt->second).c_str();
+      const NxsStringVectorMap::const_iterator cib = this->charStates.find(oit);
+      if (isFirst)
+	{
+	  out << "    CharStateLabels \n      ";
+	  isFirst = false;
+	}
+      else
+	out << ",\n      ";
+      out << 1 + oit << ' ';
+      if (cib != endCSIt)
+	{
+	  const NxsStringVector & stateLabelsVec = cib->second;
+	  unsigned ns = (unsigned)stateLabelsVec.size();
+	  if (!escapedCLabel.empty())
+	    out << escapedCLabel;
+	  out << " / ";
+	  for (unsigned m = 0; m < ns; m++)
+	    out << " " << NxsString::GetEscaped(stateLabelsVec[m]);
+	}
+      else if (!escapedCLabel.empty())
+	out << escapedCLabel;
+      else out << '/';
+    }
+  out << ";\n";
+}
+
+void NxsCharactersBlock::WriteFormatCommand(std::ostream &out) const
+{
+  const NxsDiscreteDatatypeMapper * mapper =  GetDatatypeMapperForChar(0);
+  if (IsMixedType())
+    {
+      out << "    FORMAT Datatype=MIXED(";
+      bool first = true;
+      for (std::vector<DatatypeMapperAndIndexSet>::const_iterator mIt = datatypeMapperVec.begin(); mIt != datatypeMapperVec.end(); ++mIt)
+	{
+	  if (first)
+	    first = false;
+	  else
+	    out << ", ";
+	  out << GetNameOfDatatype(mIt->first.GetDatatype()) << ':';
+	  NxsSetReader::WriteSetAsNexusValue(mIt->second, out);
+	}
+      out << ')';
+      if (this->missing != '?')
+	out << " Missing=" << this->missing;
+      if (this->gap != '\0')
+	out << "  Gap=" << this->gap;
+    }
+  else
+    mapper->WriteStartOfFormatCommand(out);
+
+  if (this->respectingCase)
+    out << " RespectCase";
+
+  if (this->matchchar != '\0')
+    out << "  MatchChar=" << this->matchchar;
+  if (this->datatype == continuous)
+    {
+      out << " Items = (";
+      for (vector<std::string>::const_iterator iIt = items.begin(); iIt != items.end(); ++iIt)
+	out << *iIt << ' ';
+      out << ")";
+      if (this->statesFormat == STATES_PRESENT)
+	out << " StatesFormat=StatesPresent";
+    }
+  else if (this->statesFormat == INDIVIDUALS)
+    out << " StatesFormat=Individuals";
+
+  if (this->tokens && this->datatype != NxsCharactersBlock::continuous) /*TOKENS is the only choice for continuous data*/
+    out << " Tokens";
+  if (this->writeInterleaveLen > 1 && (this->nChar > (unsigned)this->writeInterleaveLen ))
+    {
+      out << " Interleave";
+    }
+  out << ";\n";
+}
+
+std::map<char, NxsString> NxsCharactersBlock::GetDefaultEquates(DataTypesEnum dt)
+{
+  std::map<char, NxsString> defEquates;
+  if (dt == NxsCharactersBlock::dna || dt == NxsCharactersBlock::rna || dt == NxsCharactersBlock::nucleotide)
+    {
+      defEquates['R'] = NxsString("{AG}");
+      defEquates['M'] = NxsString("{AC}");
+      defEquates['S'] = NxsString("{CG}");
+      defEquates['V'] = NxsString("{ACG}");
+      if (dt == NxsCharactersBlock::dna || dt == NxsCharactersBlock::nucleotide)
+	{
+	  defEquates['Y'] = NxsString("{CT}");
+	  defEquates['K'] = NxsString("{GT}");
+	  defEquates['W'] = NxsString("{AT}");
+	  defEquates['H'] = NxsString("{ACT}");
+	  defEquates['B'] = NxsString("{CGT}");
+	  defEquates['D'] = NxsString("{AGT}");
+	  defEquates['N'] = NxsString("{ACGT}");
+	  defEquates['X'] = NxsString("{ACGT}");
+	  if (dt == NxsCharactersBlock::nucleotide)
+	    defEquates['U'] ='T';
+	}
+      else
+	{
+	  defEquates['Y'] = NxsString("{CU}");
+	  defEquates['K'] = NxsString("{GU}");
+	  defEquates['W'] = NxsString("{AU}");
+	  defEquates['H'] = NxsString("{ACU}");
+	  defEquates['B'] = NxsString("{CGU}");
+	  defEquates['D'] = NxsString("{AGU}");
+	  defEquates['N'] = NxsString("{ACGU}");
+	  defEquates['X'] = NxsString("{ACGU}");
+	}
+    }
+  else if (dt == NxsCharactersBlock::protein)
+    {
+      defEquates['B'] = NxsString("{DN}");
+      defEquates['Z'] = NxsString("{EQ}");
+      defEquates['X'] = NxsString("{ACDEFGHIKLMNPQRSTVWY*}");
+    }
+  /* molecular datatypes are the only datatypes with default equates and
+     keys of either case are equivalent.
+  */
+  NxsString upperKeys;
+  for (std::map<char, NxsString>::const_iterator k = defEquates.begin(); k != defEquates.end(); ++k)
+    {
+      upperKeys += k->first;
+    }
+  for (std::string::const_iterator k = upperKeys.begin(); k != upperKeys.end(); ++k)
+    {
+      const char c = *k;
+      const char lc = (char)tolower(c);
+      defEquates[lc] = defEquates[c];
+    }
+
+  return defEquates;
+}
+
+const char * NxsCharactersBlock::GetNameOfDatatype(DataTypesEnum datatype)
+{
+  switch(datatype)
+    {
+    case NxsCharactersBlock::codon:
+    case NxsCharactersBlock::dna:
+      return "DNA";
+    case NxsCharactersBlock::rna:
+      return "RNA";
+    case NxsCharactersBlock::nucleotide:
+      return "Nucleotide";
+    case NxsCharactersBlock::protein:
+      return "Protein";
+    case NxsCharactersBlock::continuous:
+      return "Continuous"; // do not change!  phylobase uses this!!!
+    default:
+      return "Standard";
+    }
+}
+
+/*!
+  Returns NxsCharactersBlock object to the state it was in when first created.
+*/
+void NxsCharactersBlock::Reset()
+{
+  ResetSurrogate();
+  NxsBlock::Reset();
+  nTaxWithData = 0;
+  nChar = 0;
+  newtaxa				= false;
+  interleaving		= false;
+  transposing			= false;
+  respectingCase		= false;
+  labels				= true;
+  tokens				= false;
+  datatype			= NxsCharactersBlock::standard;
+  originalDatatype	= NxsCharactersBlock::standard;
+  datatypeReadFromFormat = false;
+  missing				= '?';
+  gap					= '\0';
+  gapMode = GAP_MODE_MISSING;
+  matchchar			= '\0';
+  symbols.clear();
+  ResetSymbols();
+
+  ucCharLabelToIndex.clear();
+  indToCharLabel.clear();
+  charSets.clear();
+  charPartitions.clear();
+  codonPosPartitions.clear();
+  defCodonPosPartitionName.clear();
+  exSets.clear();
+  charStates.clear();
+  globalStateLabels.clear();
+  userEquates.clear();
+  defaultEquates.clear();
+  eliminated.clear();
+  datatypeMapperVec.clear();
+  discreteMatrix.clear();
+  continuousMatrix.clear();
+  items = std::vector<std::string>(1, std::string("STATES"));
+  statesFormat = STATES_PRESENT;
+  restrictionDataype = false;
+}
+
+std::string NxsCharactersBlock::GetDefaultSymbolsForType(NxsCharactersBlock::DataTypesEnum dt)
+{
+  switch(dt)
+    {
+    case NxsCharactersBlock::nucleotide:
+    case NxsCharactersBlock::dna:
+      return std::string("ACGT");
+    case NxsCharactersBlock::rna:
+      return std::string("ACGU");
+    case NxsCharactersBlock::protein:
+      return std::string("ACDEFGHIKLMNPQRSTVWY*");
+    case NxsCharactersBlock::standard:
+      return std::string("01");
+    default:
+      return std::string();
+
+    }
+  return std::string();
+}
+/*!
+  Resets standard symbol set after a change in `datatype' is made. Also flushes equates list and installs standard
+  equate macros for the current `datatype'.
+*/
+void NxsCharactersBlock::ResetSymbols()
+{
+  symbols = GetDefaultSymbolsForType(datatype);
+  userEquates.clear();
+  defaultEquates = GetDefaultEquates(datatype);
+  datatypeMapperVec.clear();
+}
+
+/*!
+  Looks up the state(s) at row `i', column `charNum' of matrix and writes it (or them) to out. If there is uncertainty or
+  polymorphism, the list of states is surrounded by the appropriate set of symbols (i.e., parentheses for
+  polymorphism, curly brackets for uncertainty). If TOKENS was specified, the output takes the form of the defined
+  state labels; otherwise, the correct symbol is looked up in `symbols' and output.
+*/
+void NxsCharactersBlock::ShowStateLabels(
+					 std::ostream &out,				/* the output stream on which to write */
+					 unsigned taxInd,				/* the taxon, in range [0..`ntax') */
+					 unsigned charInd,				/* the character, in range [0..`nChar') */
+					 unsigned ) const		/* the index of the first taxon (if UINT_MAX, don't use matchchar) */
+{
+  if (datatype == continuous)
+    {
+      const ContinuousCharCell & cell = continuousMatrix.at(taxInd).at(charInd);
+      std::vector<std::string>::const_iterator itemIt = items.begin();
+      bool parensNeeded = items.size() > 1;
+      if (items.size() == 1)
+	{
+	  ContinuousCharCell::const_iterator oit = cell.find(*itemIt);
+	  if (oit != cell.end() && oit->second.size() > 1)
+	    parensNeeded = true;
+	}
+      if (parensNeeded)
+	out	 << '(';
+      for (; itemIt != items.end(); ++itemIt)
+	{
+	  ContinuousCharCell::const_iterator cit = cell.find(*itemIt);
+	  if (cit == cell.end())
+	    out << missing << ' ';
+	  else
+	    {
+	      if (cit->second.empty())
+		out << missing << ' ';
+	      else
+		{
+		  vector<double>::const_iterator vIt = cit->second.begin();
+		  for(; vIt != cit->second.end(); ++vIt)
+		    {
+		      if (*vIt == DBL_MAX)
+			out << missing << ' ';
+		      else
+			out << *vIt << ' ';
+		    }
+		}
+	    }
+	}
+      if (parensNeeded)
+	out	 << ") ";
+      else
+	out << ' ';
+      return;
+    }
+  const NxsDiscreteDatatypeMapper * mapper = GetDatatypeMapperForChar(charInd);
+  NCL_ASSERT(mapper != NULL);
+  const NxsDiscreteStateCell currStateCode = discreteMatrix.at(taxInd).at(charInd);
+  if (tokens)
+    {
+      out << ' ';
+      if (currStateCode >= 0 && currStateCode < (NxsDiscreteStateCell) mapper->GetNumStates())
+	{
+	  NxsStringVectorMap::const_iterator ci = charStates.find(charInd);
+	  if (ci != charStates.end() && ((NxsDiscreteStateCell) ci->second.size()) > currStateCode)
+	    out << ci->second[currStateCode];
+	  else if (currStateCode < 0)
+	    {
+	      if (currStateCode == NXS_MISSING_CODE)
+		out << this->GetMissingSymbol();
+	      else if (currStateCode == NXS_GAP_STATE_CODE)
+		out << this->GetGapSymbol();
+	      else
+		out << '_';
+	    }
+	  else if (globalStateLabels.size() > (unsigned) currStateCode)
+	    out << globalStateLabels[currStateCode];
+	  else
+	    out << '_';
+	  return;
+	}
+    }
+  mapper->WriteStateCodeAsNexusString(out, currStateCode);
+}
+
+/*!
+  Writes out the state (or states) stored in this NxsDiscreteDatum object to the buffer `s' using the symbols array
+  to do the necessary translation of the numeric state values to state symbols. In the case of polymorphism or
+  uncertainty, the list of states will be surrounded by brackets or parentheses (respectively). Assumes `s' is
+  non-NULL and long enough to hold everything printed.
+*/
+void NxsCharactersBlock::WriteStates(
+				     NxsDiscreteDatum &d,	/* the datum to be queried */
+				     char *s,				/* the buffer to which to print */
+				     unsigned slen) NCL_COULD_BE_CONST /* the length of the buffer `s' */ /*v2.1to2.2 1 */
+{
+  std::ostringstream outs;
+  ShowStates(outs, d.taxInd, d.charInd);
+  std::string sfo = outs.str();
+  if (s == NULL || sfo.length() > slen)
+    throw NxsNCLAPIException("Char buffer too small in NxsCharactersBlock::WriteStates");
+  strcpy(s, sfo.c_str());
+}
+
+/*!
+  This function is no longer the most efficient way to access parsed data (see notes on NxsCharacterBlock and
+  GetMatrix() and GetMatrixDecoder() methods.
+
+  Returns the number of states for taxon `i', character `j'.
+*/
+unsigned NxsCharactersBlock::GetNumStates(
+					  unsigned taxInd,	/* the taxon in range [0..`ntax') */
+					  unsigned charInd) NCL_COULD_BE_CONST /* the character in range [0..`nChar') */ /*v2.1to2.2 1 */
+{
+  const NxsDiscreteDatatypeMapper * mapper = GetDatatypeMapperForChar(charInd);
+  NCL_ASSERT(mapper != NULL);
+  const NxsDiscreteStateCell currStateCode = discreteMatrix.at(taxInd).at(charInd);
+  return mapper->GetNumStatesInStateCode(currStateCode);
+}
+
+/*! Excludes character with index `i`.
+ */
+void NxsCharactersBlock::ExcludeCharacter(
+					  unsigned i)	/* index of character to exclude in range [0..`nChar') */
+{
+  if (i >= nChar)
+    {
+      errormsg  = "Character index is ExcludeCharacter out-of-range.   Must be < ";
+      errormsg << nChar;
+      throw NxsNCLAPIException(errormsg);
+    }
+  excluded.insert(i);
+}
+/*! Includes (or "activates") character with index `i`.
+ */
+void NxsCharactersBlock::IncludeCharacter(
+					  unsigned i)	/* index of character to include in range [0..`nChar') */
+{
+  if (i >= nChar)
+    {
+      errormsg  = "Character index is ExcludeCharacter out-of-range.   Must be < ";
+      errormsg << nChar;
+      throw NxsNCLAPIException(errormsg);
+    }
+  excluded.erase(i);
+}
+
+bool NxsCharactersBlock::IsGapState(
+				    unsigned taxInd,	/* the taxon, in range [0..`ntax') */
+				    unsigned charInd) NCL_COULD_BE_CONST /* the character, in range [0..`nChar') */ /*v2.1to2.2 1 */
+{
+  if (this->datatype == continuous)
+    return false;
+  const NxsDiscreteStateRow & row = discreteMatrix.at(taxInd);
+  return (row.size() > charInd && row[charInd] == NXS_GAP_STATE_CODE);
+}
+
+bool NxsCharactersBlock::IsMissingState(
+					unsigned taxInd,	/* the taxon, in range [0..`ntax') */
+					unsigned charInd) NCL_COULD_BE_CONST /* the character, in range [0..`nChar') */ /*v2.1to2.2 1 */
+{
+  if (this->datatype == continuous)
+    {
+      return !continuousMatrix.at(taxInd).empty();
+    }
+  const NxsDiscreteStateRow & row = discreteMatrix.at(taxInd);
+  return (row.size() <= charInd || (row[charInd] == NXS_MISSING_CODE));
+}
+
+
+void NxsCharactersBlock::FindConstantCharacters(NxsUnsignedSet &c) const
+{
+  vector<NxsDiscreteStateCell> iv;
+  for (unsigned colIndex = 0; colIndex < nChar; ++colIndex)
+    {
+      const NxsDiscreteDatatypeMapper * mapper = GetDatatypeMapperForChar(colIndex);
+      if (mapper == NULL)
+	throw NxsNCLAPIException("No DatatypeMapper in FindConstantCharacters");
+
+      std::set<NxsDiscreteStateCell> intersectionSet = mapper->GetStateSetForCode(NXS_MISSING_CODE);
+      for (NxsDiscreteStateMatrix::const_iterator rowIt = discreteMatrix.begin(); rowIt != discreteMatrix.end(); ++rowIt)
+	{
+	  const NxsDiscreteStateRow & row = *rowIt;
+	  if (row.size() > colIndex)
+	    {
+	      const NxsDiscreteStateCell sc = row[colIndex];
+	      std::set<NxsDiscreteStateCell> currSet = mapper->GetStateSetForCode(sc);
+	      iv.clear();
+	      set_intersection(currSet.begin(), currSet.end(), intersectionSet.begin(), intersectionSet.end(), std::back_inserter(iv));
+	      intersectionSet.clear();
+	      if (iv.empty())
+		break;
+	      intersectionSet.insert(iv.begin(), iv.end());
+	    }
+	}
+      if (!intersectionSet.empty())
+	c.insert(colIndex);
+    }
+}
+
+void NxsCharactersBlock::FindGappedCharacters(NxsUnsignedSet &c) const
+{
+  vector<NxsDiscreteStateCell> iv;
+  for (unsigned colIndex = 0; colIndex < nChar; ++colIndex)
+    {
+      for (NxsDiscreteStateMatrix::const_iterator rowIt = discreteMatrix.begin(); rowIt != discreteMatrix.end(); ++rowIt)
+	{
+	  const NxsDiscreteStateRow & row = *rowIt;
+	  if (row.size() > colIndex && row[colIndex] == NXS_GAP_STATE_CODE)
+	    {
+	      c.insert(colIndex);
+	      break;
+	    }
+	}
+    }
+}
+
+/* Behaves like GetMaximalStateSetOfColumn except that missing data columns do not increase
+   size of the returned state set.
+   If GapMode is missing, then gaps are not counted.
+*/
+std::set<NxsDiscreteStateCell> NxsCharactersBlock::GetNamedStateSetOfColumn(const unsigned colIndex) const
+{
+  const NxsDiscreteDatatypeMapper * mapper = GetDatatypeMapperForChar(colIndex);
+  if (mapper == NULL)
+    throw NxsNCLAPIException("No DatatypeMapper in GetNamedStateSetOfColumn");
+
+  std::set<NxsDiscreteStateCell> sset;
+  std::set<NxsDiscreteStateCell> scodes;
+  const unsigned maxnstates = mapper->GetNumStatesIncludingGap();
+  for (NxsDiscreteStateMatrix::const_iterator rowIt = discreteMatrix.begin(); rowIt != discreteMatrix.end(); ++rowIt)
+    {
+      const NxsDiscreteStateRow & row = *rowIt;
+      if (row.size() > colIndex)
+	{
+	  const NxsDiscreteStateCell sc = row[colIndex];
+	  const bool isIgnoredGap = (sc == NXS_GAP_STATE_CODE) && (this->gapMode == GAP_MODE_MISSING);
+	  const bool toBeCounted = !(sc == NXS_MISSING_CODE || isIgnoredGap);
+	  if (toBeCounted && scodes.count(sc) == 0)
+	    {
+	      scodes.insert(sc);
+	      const std::set<NxsDiscreteStateCell>	& ts = mapper->GetStateSetForCode(sc);
+	      sset.insert(ts.begin(), ts.end());
+	      if (sset.size() == maxnstates)
+		break;
+	    }
+	}
+    }
+  return sset;
+}
+/* Returns the union of all states that are consistent with a column */
+std::set<NxsDiscreteStateCell> NxsCharactersBlock::GetMaximalStateSetOfColumn(const unsigned colIndex) const
+{
+  const NxsDiscreteDatatypeMapper * mapper = GetDatatypeMapperForChar(colIndex);
+  if (mapper == NULL)
+    throw NxsNCLAPIException("No DatatypeMapper in GetMaximalStateSetOfColumn");
+
+  std::set<NxsDiscreteStateCell> sset;
+  std::set<NxsDiscreteStateCell> scodes;
+  const unsigned maxnstates = mapper->GetNumStatesIncludingGap();
+  for (NxsDiscreteStateMatrix::const_iterator rowIt = discreteMatrix.begin(); rowIt != discreteMatrix.end(); ++rowIt)
+    {
+      const NxsDiscreteStateRow & row = *rowIt;
+      if (row.size() > colIndex)
+	{
+	  const NxsDiscreteStateCell sc = row[colIndex];
+	  if (scodes.count(sc) == 0)
+	    {
+	      scodes.insert(sc);
+	      const std::set<NxsDiscreteStateCell>	& ts = mapper->GetStateSetForCode(sc);
+	      sset.insert(ts.begin(), ts.end());
+	      if (sset.size() == maxnstates)
+		break;
+	    }
+	}
+    }
+  return sset;
+}
+
+bool NxsCharactersBlock::IsPolymorphic(
+				       unsigned taxInd,	/* the taxon in range [0..`ntax') */
+				       unsigned charInd) NCL_COULD_BE_CONST /* the character in range [0..`nChar') */ /*v2.1to2.2 1 */
+{
+  const NxsDiscreteDatatypeMapper * mapper = GetDatatypeMapperForChar(charInd);
+  NCL_ASSERT(mapper);
+  if (taxInd >= discreteMatrix.size())
+    throw NxsNCLAPIException("Taxon index out of range of NxsCharactersBlock::IsPolymorphic");
+  const NxsDiscreteStateRow & row = discreteMatrix[taxInd];
+  if (row.size() <= charInd)
+    throw NxsNCLAPIException("Character index out of range of NxsCharactersBlock::IsPolymorphic");
+  return mapper->IsPolymorphic(row[charInd]);
+}
+
+
+/*!
+  Shows the states for taxon `i', character `j', on the stream `out'. Uses `symbols' array to translate the states
+  from the way they are stored (as integers) to the symbol used in the original data matrix. Assumes `i' is in the
+  range [0..`ntax') and `j' is in the range [0..`nChar'). Also assumes `matrix' is non-NULL.
+*/
+void NxsCharactersBlock::ShowStates(
+				    std::ostream &out, /* the stream on which to show the state(s) */
+				    unsigned taxInd,	/* the (0-offset) index of the taxon in question */
+				    unsigned charInd) NCL_COULD_BE_CONST /* the (0-offset) index of the character in question */ /*v2.1to2.2 1 */
+{
+  bool ft = tokens;
+  tokens = false;
+  ShowStateLabels(out, taxInd, charInd, UINT_MAX);
+  tokens = ft;
+}
+
+/*---------------------------------------------------------------------------------------
+  Results in aliasing of the taxa, assumptionsBlock blocks!
+*/
+void NxsCharactersBlock::CopyCharactersContents(const NxsCharactersBlock &other)
+{
+  assumptionsBlock = other.assumptionsBlock;
+  nChar = other.nChar;
+  nTaxWithData = other.nTaxWithData;
+  matchchar = other.matchchar;
+  respectingCase = other.respectingCase;
+  transposing = other.transposing;
+  interleaving = other.interleaving;
+  tokens = other.tokens;
+  labels = other.labels;
+  missing = other.missing;
+  gap = other.gap;
+  gapMode = other.gapMode;
+  symbols = other.symbols;
+  userEquates = other.userEquates;
+  datatypeMapperVec = other.datatypeMapperVec;
+  discreteMatrix = other.discreteMatrix;
+  continuousMatrix = other.continuousMatrix;
+  eliminated = other.eliminated;
+  excluded = other.excluded;
+  ucCharLabelToIndex = other.ucCharLabelToIndex;
+  indToCharLabel = other.indToCharLabel;
+  charStates = other.charStates;
+  globalStateLabels = other.globalStateLabels;
+  items = other.items;
+  charSets = other.charSets;
+  exSets = other.exSets;
+  charPartitions = other.charPartitions;
+  codonPosPartitions = other.codonPosPartitions;
+  defCodonPosPartitionName = other.defCodonPosPartitionName;
+  transfMgr = other.transfMgr;
+  datatype = other.datatype;
+  statesFormat = other.statesFormat;
+  supportMixedDatatype = other.supportMixedDatatype;
+  convertAugmentedToMixed = other.convertAugmentedToMixed;
+  allowAugmentingOfSequenceSymbols = other.allowAugmentingOfSequenceSymbols;
+  restrictionDataype = other.restrictionDataype;
+  writeInterleaveLen = other.writeInterleaveLen;
+}
+
+
+NxsCharactersBlock *NxsCharactersBlockFactory::GetBlockReaderForID(const std::string & idneeded, NxsReader *reader, NxsToken *)
+{
+  if (reader == NULL || idneeded != "CHARACTERS")
+    return NULL;
+  NxsCharactersBlock * nb  = new NxsCharactersBlock(NULL, NULL);
+  nb->SetCreateImpliedBlock(true);
+  nb->SetImplementsLinkAPI(true);
+  return nb;
+}
+
+// returns a vector of vectors of  the states for each state code.
+// 	The second to the last element will be empty to correspond to  NXS_GAP_STATE_CODE = -2
+// 	The last element will be empty to correspond to NXS_MISSING_CODE = -1
+
+std::vector<std::vector<int> > NxsDiscreteDatatypeMapper::GetPythonicStateVectors() const
+{
+
+  std::vector<std::vector<int> > pv(this->GetNumStateCodes());
+
+  const int endIndex = (((int) stateSetsVec.size()) + sclOffset);
+  for (int i = 0; i < endIndex; ++i)
+    {
+      NxsDiscreteStateRow r = this->GetStateVectorForCode(i);
+      pv[i].reserve(r.size());
+      for (NxsDiscreteStateRow::const_iterator rIt = r.begin(); rIt != r.end(); ++rIt)
+	pv[i].push_back((int)*rIt);
+    }
+  return pv;
+}
diff --git a/lib/ncl-2.1.18/ncl/nxscharactersblock.h b/lib/ncl-2.1.18/ncl/nxscharactersblock.h
new file mode 100644
index 0000000..b87eab2
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxscharactersblock.h
@@ -0,0 +1,2073 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#ifndef NCL_NXSCHARACTERSBLOCK_H
+#define NCL_NXSCHARACTERSBLOCK_H
+
+#include <sstream>
+#include <cfloat>
+#include <climits>
+
+#include "ncl/nxsdefs.h"
+#include "ncl/nxsdiscretedatum.h"
+#include "ncl/nxstaxablock.h"
+
+
+class NxsTaxaBlockAPI;
+class NxsAssumptionsBlockAPI;
+class NxsDiscreteDatatypeMapper;
+
+void NxsWriteSetCommand(const char *cmd, const NxsUnsignedSetMap & usetmap, std::ostream &out, const char * nameOfDef = NULL);
+void NxsWritePartitionCommand(const char *cmd, const NxsPartitionsByName &partitions, std::ostream & out, const char * nameOfDef = NULL);
+
+/*! Internal representation of a stepmatrix with cells composed of doubles.
+  The ordering of columns and rows is identical, and is accessible via NxsRealStepMatrix::GetSymbols
+*/
+class NxsRealStepMatrix
+{
+ public:
+  typedef std::vector<double> DblVec;
+  typedef std::vector<DblVec> DblMatrix;
+
+ NxsRealStepMatrix(const std::vector<std::string> &symbolsOrder, const DblMatrix & mat)
+   :symbols(symbolsOrder),
+    matrix(mat)
+    {
+    }
+
+  const std::vector<std::string> & GetSymbols() const
+  {
+    return symbols;
+  }
+
+  const DblMatrix & GetMatrix() const
+  {
+    return matrix;
+  }
+ private:
+  std::vector<std::string> symbols;
+  DblMatrix matrix;
+};
+
+/*! Internal representation of a stepmatrix with cells composed of ints.
+  The ordering of columns and rows is identical, and is accessible via NxsRealStepMatrix::GetSymbols
+*/
+class NxsIntStepMatrix
+{
+ public:
+  typedef std::vector<int> IntVec;
+  typedef std::vector<IntVec> IntMatrix;
+
+ NxsIntStepMatrix(const std::vector<std::string> &symbolsOrder, const IntMatrix & mat)
+   :symbols(symbolsOrder),
+    matrix(mat)
+    {
+    }
+  const std::vector<std::string> & GetSymbols() const
+  {
+    return symbols;
+  }
+  const IntMatrix & GetMatrix() const
+  {
+    return matrix;
+  }
+ private:
+  std::vector<std::string> symbols;
+  IntMatrix matrix;
+};
+
+/* Work in progress...
+ */
+class NxsGeneticCodesManager
+{
+ public:
+  NxsGeneticCodesManager();
+  void Reset() {}
+  bool IsEmpty() const
+  {
+    return true;
+  }
+  void WriteGeneticCode(std::ostream &	) const
+  {}
+  bool IsValidCodeName(const std::string &cn) const;
+ protected:
+  std::set<std::string> standardCodeNames;
+  std::set<std::string> userDefinedCodeNames;
+
+};
+
+
+/*! NEXUS "types" (as in UserType and TypeSet commands) are assumptions about the costs of transformations of state (in
+  parsimony.
+
+*/
+class NxsTransformationManager
+{
+ public:
+  typedef std::pair<int, std::set<unsigned> > IntWeightToIndexSet;
+  typedef std::list<IntWeightToIndexSet> ListOfIntWeights;
+
+  typedef std::pair<double, std::set<unsigned> > DblWeightToIndexSet;
+  typedef std::list<DblWeightToIndexSet> ListOfDblWeights;
+
+  typedef std::pair<std::string, std::set<unsigned> > TypeNameToIndexSet;
+  typedef std::list<TypeNameToIndexSet> ListOfTypeNamesToSets;
+
+
+  NxsTransformationManager()
+    {
+      Reset();
+    }
+
+  /*! \return the weight for a character index from a weight set */
+  static int GetWeightForIndex(const ListOfIntWeights & wtset, /*!< the weight set */
+			       unsigned index); /*!< character index which should be in the range in [0, nchar) */
+
+  /*! \returns the weight for a character index from a weight set */
+  static double GetWeightForIndex(const ListOfDblWeights & wtset, /*!< the weight set */
+				  unsigned index); /*!< character index which should be in the range in [0, nchar) */
+
+
+  /*! \returns an integer step matrix for an ordered type with `nStates` states */
+  static const NxsIntStepMatrix::IntMatrix GetOrderedType(unsigned nStates);
+  /*! \returns an integer step matrix for an unorder type with `nStates` states (a matrix of 1's off the diagonal and 0's on the diagonal.*/
+  static const NxsIntStepMatrix::IntMatrix GetUnorderedType(unsigned nStates);
+
+  /*! \returns a set with all of the registered type names (the name will be all caps, not in the same case as the used in the NEXUS file)*/
+  const std::set<std::string> & GetTypeNames() const;
+  /*! \returns a set with all of the registered type names that were defined with UserType */
+  const std::set<std::string> & GetUserTypeNames() const;
+  /*! \returns a set with all of the builtin type names*/
+  const std::set<std::string> & GetStandardTypeNames() const;
+  /*! \returns the name of the current default type (starts as unorderd but can be overridden by a TypeSet command */
+  const std::string GetDefaultTypeName() const;
+  /*! \returns a set with all of the WtSet names */
+  std::set<std::string> GetWeightSetNames() const;
+  /*! \returns true if the name corresponds to a WtSet that is has double entries
+    If true, access the set via GetDoubleWeights
+    If false, retrieve the set by GetIntWeights
+  */
+  bool IsDoubleWeightSet(const std::string &) const;
+
+  /*! \returns the default ("active") weights as doubles. If the list is empty then the default weights are available from GetDefaultIntWeights or have not been set (implying equal weights) */
+  std::vector<double> GetDefaultDoubleWeights() const
+    {
+      return GetDoubleWeights(def_wtset);
+    }
+
+  /*! \returns the default ("active") weights as doubles. If the list is empty then the default weights are available from GetDefaultDoubleWeights or have not been set (implying equal weights) */
+  std::vector<int> GetDefaultIntWeights() const
+    {
+      return GetIntWeights(def_wtset);
+    }
+
+  /*! \returns the double weights assocaited with the WtSet with name `wtsetname`.
+
+    If the list is empty then the default weights are available from GetIntWeights or
+    wtsetname is not the name of o WtSet
+  */
+  std::vector<double> GetDoubleWeights(const std::string &wtsetname) const;
+  /*! \returns the int weights assocaited with the WtSet with name `wtsetname`.
+
+    If the list is empty then the default weights are available from GetDoubleWeights or
+    wtsetname is not the name of o WtSet
+  */
+  std::vector<int> GetIntWeights(const std::string &) const;
+
+  /*! \returns a set with all of the TypeSet names */
+  std::set<std::string> GetTypeSetNames() const;
+
+  /*! \returns the name of the active ("default") WtSet */
+  const std::string & GetDefaultWeightSetName() const;
+  /*! \returns the name of the active ("default") TypeSet */
+  const std::string & GetDefaultTypeSetName() const;
+
+  bool IsEmpty() const;
+
+  bool IsValidTypeName(const std::string & ) const;
+  bool IsStandardType(const std::string & ) const;
+  bool IsIntType(const std::string & ) const;
+
+  const NxsIntStepMatrix & GetIntType(const std::string & name) const;
+
+  const NxsRealStepMatrix & GetRealType(const std::string & name) const;
+
+
+  void SetDefaultTypeName(const std::string &);
+  bool AddIntType(const std::string &, const NxsIntStepMatrix &);
+  bool AddRealType(const std::string &, const NxsRealStepMatrix &);
+
+  bool AddIntWeightSet(const std::string &, const ListOfIntWeights &, bool isDefault);
+  bool AddRealWeightSet(const std::string &, const ListOfDblWeights &, bool isDefault);
+
+  bool AddTypeSet(const std::string &, const NxsPartition &, bool isDefault);
+
+  void Reset();
+
+  void WriteUserType(std::ostream &out) const;
+  void WriteWtSet(std::ostream &out) const;
+  void WriteTypeSet(std::ostream &out) const
+  {
+    NxsWritePartitionCommand("TypeSet", typeSets, out, def_typeset.c_str());
+  }
+
+ private:
+  std::set<std::string> standardTypeNames;
+  std::set<std::string> userTypeNames;
+  std::set<std::string> allTypeNames;
+  std::map<std::string, NxsRealStepMatrix> dblUserTypes;
+  std::map<std::string, NxsIntStepMatrix> intUserTypes;
+  std::set<std::string> allWtSetNames;
+  std::map<std::string, ListOfDblWeights> dblWtSets;
+  std::map<std::string, ListOfIntWeights> intWtSets;
+  NxsPartitionsByName typeSets;
+  std::string def_wtset;
+  std::string def_typeset;
+  std::string def_type;
+};
+
+inline const std::string NxsTransformationManager::GetDefaultTypeName() const
+{
+  return def_type;
+}
+inline const std::string & NxsTransformationManager::GetDefaultWeightSetName() const
+{
+  return def_wtset;
+}
+inline const std::string & NxsTransformationManager::GetDefaultTypeSetName() const
+{
+  return def_typeset;
+}
+inline const std::set<std::string> & NxsTransformationManager::GetTypeNames() const
+{
+  return allTypeNames;
+}
+inline const std::set<std::string> & NxsTransformationManager::GetUserTypeNames() const
+{
+  return userTypeNames;
+}
+inline const std::set<std::string> & NxsTransformationManager::GetStandardTypeNames() const
+{
+  return standardTypeNames;
+}
+inline bool NxsTransformationManager::IsDoubleWeightSet(const std::string &s) const
+{
+  const std::vector<double> d = GetDoubleWeights(s);
+  return !(d.empty());
+}
+
+/*! Intended to specify the interface of a NxsCharactersBlock, but actually does
+  not list all of the relevant functions. See NxsCharactersBlock documentation.
+*/
+class NxsCharactersBlockAPI
+: public NxsBlock, public NxsLabelToIndicesMapper
+{
+ public:
+  virtual unsigned	ApplyExset(NxsUnsignedSet &exset) = 0;
+  virtual bool AddNewExSet(const std::string &label, const NxsUnsignedSet & inds) = 0;
+  virtual bool IsRespectCase() const = 0;
+  virtual unsigned	GetNCharTotal() const = 0;
+  virtual NxsTransformationManager & GetNxsTransformationManagerRef() = 0;
+  virtual const NxsTransformationManager & GetNxsTransformationManagerRef() const = 0;
+  virtual std::vector<const NxsDiscreteDatatypeMapper *> GetAllDatatypeMappers() const = 0;
+  virtual bool AddNewCodonPosPartition(const std::string &label, const NxsPartition & inds, bool isDefault) = 0;
+  virtual std::string GetDefaultCodonPosPartitionName() const = 0;
+  virtual NxsPartition GetCodonPosPartition(const std::string &label) const = 0;
+  enum GapModeEnum
+  {
+    GAP_MODE_MISSING = 0,
+    GAP_MODE_NEWSTATE = 1
+  };
+  virtual GapModeEnum GetGapModeSetting() const = 0;
+  virtual void SetGapModeSetting(GapModeEnum m) = 0;
+
+};
+
+#if defined(NCL_SMALL_STATE_CELL)
+typedef signed char NxsDiscreteStateCell;
+#else
+typedef int NxsDiscreteStateCell;
+#endif
+typedef std::vector<NxsDiscreteStateCell> NxsDiscreteStateRow;
+typedef std::vector<NxsDiscreteStateRow> NxsDiscreteStateMatrix;
+
+
+/*!
+  NXS_INVALID_STATE_CODE is used as a flag for uninitialized or unrecognized values
+  NXS_GAP_STATE_CODE may not be found in all datatypes, but is always -2 when
+  it present.
+  NXS_MISSING_CODE is always -1. It must be distinguished from the ambiguous set of all states because ? does not
+  mean that a new state could necessarily be present. This arises is PAUP-style symbols extensions to the
+  built-in datatypes. If you say FORMAT DATATYPE=DNA SYMBOLS="01" ; then the valid symbols become "ACGT01"
+  See AugmentedSymbolsToMixed.
+*/
+enum {
+  NXS_INVALID_STATE_CODE = -3, /* this must be kept negative */
+  NXS_GAP_STATE_CODE = -2, /* this must be kept negative */
+  NXS_MISSING_CODE = -1 /* this must be kept negative */
+};
+
+class NxsCodonTriplet {
+ public:
+  unsigned char firstPos;
+  unsigned char secondPos;
+  unsigned char thirdPos;
+
+  NxsCodonTriplet(const char *triplet);
+  ////////////////////////////////////////////////////////////////////////
+  // returns for a this => other substitution a (from-base, to-base) pair or
+  // (-1,-1) for codons that differ by more than one position.
+  // If codons are identical, then (0,0) will be returned.
+  //
+  typedef std::pair<int, int> MutDescription;
+  MutDescription getSingleMut(const NxsCodonTriplet & other) const;
+
+};
+
+enum NxsGeneticCodesEnum {
+  NXS_GCODE_NO_CODE = -1,
+  NXS_GCODE_STANDARD = 0,
+  NXS_GCODE_VERT_MITO = 1,
+  NXS_GCODE_YEAST_MITO = 2,
+  NXS_GCODE_MOLD_MITO = 3,
+  NXS_GCODE_INVERT_MITO = 4,
+  NXS_GCODE_CILIATE = 5,
+  NXS_GCODE_ECHINO_MITO = 8,
+  NXS_GCODE_EUPLOTID = 9,
+  NXS_GCODE_PLANT_PLASTID = 10,
+  NXS_GCODE_ALT_YEAST = 11,
+  NXS_GCODE_ASCIDIAN_MITO = 12,
+  NXS_GCODE_ALT_FLATWORM_MITO = 13,
+  NXS_GCODE_BLEPHARISMA_MACRO = 14,
+  NXS_GCODE_CHLOROPHYCEAN_MITO = 15,
+  NXS_GCODE_TREMATODE_MITO = 20,
+  NXS_GCODE_SCENEDESMUS_MITO = 21,
+  NXS_GCODE_THRAUSTOCHYTRIUM_MITO = 22,
+  NXS_GCODE_CODE_ENUM_SIZE = 23
+};
+NxsGeneticCodesEnum geneticCodeNameToEnum(std::string);
+std::string geneticCodeEnumToName(NxsGeneticCodesEnum);
+std::string getGeneticCodeAAOrder(NxsGeneticCodesEnum codeIndex);
+std::vector<std::string> getGeneticCodeNames();
+
+/* structure used to store information about how the codon indices of a compressed
+   (no stop codons permitted) character matrix correspond to the:
+   * 64 codons in alphabetical order,
+   * the amino acids
+   * the codon strings ("AAA", "AAC"...)
+   */
+
+class CodonRecodingStruct
+{
+ public:
+  std::vector<int> compressedCodonIndToAllCodonsInd;
+  std::vector<int> aaInd; /* The index 0 to 20 of the amino acid for each codon - the order of the aas is "ACDEFGHIKLMNPQRSTVWY*" */
+  std::vector<std::string> codonStrings; /* The nucleotide abbreviations for each codon "AAA", "AAC"... */
+};
+
+class NxsDiscreteDatatypeMapper;
+/*! This class handles reading and storage for the NEXUS block CHARACTERS. It overrides the member functions Read and
+  Reset, which are abstract virtual functions in the base class NxsBlock.
+
+
+
+  \note{"ActiveChar" is equivalent to "IncludedChar". }
+
+
+  Important change in starting in version 2.1:
+  The ELIMINATE command is now dealt with as if it were an automatic exclude statment.
+  Previous versions of NCL were more in keeping with the NEXUS specification, in that NCL did not store
+  eliminate characters. This resulted
+  in a confusing situation in which the Characters block maintained an original index for a character and a
+  current index.	Some public functions of NxsCharactersBlock took arguments that needed the original character
+  index, while the vast majority of methods interpretted a character index as the current index of a character.
+  ELIMINATE commands are *very* rare in modern NEXUS files (Mesquite does not even recognize the command), thus
+  the increased complexity of the API that was caused by not storing ELIMINATED character was deemed a
+  counterproductive.
+  In NCL 2.1 (and later), the characters block stores every character, and the user of NCL can query the
+  NxsCharactersBlock about whether a character has been excluded or not (you can also ask for the set of
+  eliminated chararcters). Optimizations for avoiding excluded characters are no longer the responsibility
+  of NxsCharactersBlock.
+
+  Thus, a normal loop through all characters in the data matrix should look something
+  like this:
+  >
+  for(unsigned j = 0; j < nchar; j++)
+  {
+  if (IsExcluded(j))
+  continue;
+  .
+  .
+  .
+  }
+
+  Below is a table showing the correspondence between the elements of a CHARACTERS block in a NEXUS file and the
+  variables and member functions of the NxsCharactersBlock class that can be used to access each piece of information
+  stored. Items in parenthesis should be viewed as "see also" items.
+  >
+  NEXUS		  Command		 Data			Member
+  Command		  Atribute		 Member			Functions
+  ---------------------------------------------------------------------
+  DIMENSIONS	  NEWTAXA		 newtaxa
+
+
+  NCHAR			 nChar			GetNChar
+
+  FORMAT		  DATATYPE		 datatype		GetDataType
+
+  RESPECTCASE	 respectingCase IsRespectCase
+
+  MISSING		 missing		GetMissingSymbol
+
+  GAP			 gap			GetGapSymbol
+
+  SYMBOLS		 symbols		GetSymbols
+
+  EQUATE		 userEquates	GetEquateKey
+  GetEquateValue
+  GetNumEquates
+
+  MATCHCHAR		 matchchar		GetMatchcharSymbol
+
+  (NO)LABELS	 labels			IsLabels
+
+  TRANSPOSE		 transposing	IsTranspose
+
+  INTERLEAVE	 interleaving	IsInterleave
+
+  ITEMS							GetItems
+
+  STATESFORMAT					GetStatesPresent
+
+  (NO)TOKENS	 tokens			IsTokens
+
+  ELIMINATE					 eliminated		GetNumEliminated
+  IsExcluded
+  MATRIX						 matrix			GetState
+  GetInternalRepresentation
+  GetNumStates
+  GetNumMatrixRows
+  GetNumMatrixCols
+  IsPolymorphic
+  >
+*/
+class NxsCharactersBlock
+: public NxsCharactersBlockAPI, public NxsTaxaBlockSurrogate
+{
+  friend class NxsAssumptionsBlock;
+
+
+ public:
+  typedef std::map<std::string, std::vector<double> > ContinuousCharCell;
+  typedef std::vector<ContinuousCharCell> ContinuousCharRow;
+  typedef std::vector<ContinuousCharRow> ContinuousCharMatrix;
+  typedef std::vector<std::string> VecString;
+  typedef std::map<unsigned, std::string> IndexToLabelMap;
+  typedef std::map<std::string, unsigned> LabelToIndexMap;
+  typedef std::pair<NxsDiscreteDatatypeMapper, NxsUnsignedSet> DatatypeMapperAndIndexSet;
+  typedef std::vector<DatatypeMapperAndIndexSet> VecDatatypeMapperAndIndexSet;
+
+
+  enum DataTypesEnum /*! values used to represent different basic types of data stored in a CHARACTERS block, and used with the data member `datatype' */
+  {
+    standard = 1, /*! indicates `matrix' holds characters with arbitrarily-assigned, discrete states, such as discrete morphological data */
+    dna = 2, /*! indicates `matrix' holds DNA sequences (states A, C, G, T) */
+    rna = 3, /*! indicates `matrix' holds RNA sequences (states A, C, G, U) */
+    nucleotide = 4, /*! indicates `matrix' holds nucleotide sequences */
+    protein = 5, /*! indicates `matrix' holds amino acid sequences */
+    continuous = 6, /*! indicates `matrix' holds continuous data */
+    codon = 7, /*! AAA=>0, AAC=1, AAAG=>2, AAU=>3, ACA=>4... UUU=>63 */
+    mixed = 8 /*! indicates that there are multiple datatype mappers that must be used to decode the columns of the matrix (one mapper per column, but not one mapper per matrix). A MrBayes NEXUS feature*/
+  };
+  enum StatesFormatEnum
+  {
+    STATES_PRESENT = 1,
+    STATE_COUNT,
+    STATE_FREQUENCY,
+    INDIVIDUALS
+  };
+
+  /*! In v2.1 of the API, the NxsTaxaBlockAPI and NxsAssumptionsBlockAPI pointers
+    are usually NULL. These block assignments are made during the parse. */
+  NxsCharactersBlock(NxsTaxaBlockAPI *tb, /*!< the taxa block object to consult for taxon labels (can be 0L)*/
+		     NxsAssumptionsBlockAPI *ab);	/*!< the assumptions block object to consult for exclusion sets (can be 0L) */
+  virtual ~NxsCharactersBlock() {}
+
+  // Commonly used functions
+  //Configuration
+  /*! Controls whether or not a characters block reader will support MrBayes' datatype=MIXED extension to NEXUS
+    The default is false.
+    \ref mixedDatatypes
+  */
+  void SetSupportMixedDatatype(bool v)
+  {
+    supportMixedDatatype = v;
+  }
+  /*! \returns true if a sequence type will be converted to standard (default block would return false).
+    the "setter" function is NxsCharactersBlock::SetConvertAugmentedToMixed()
+
+    \ref mixedDatatypes
+  */
+  bool AugmentedSymbolsToMixed();
+  /*! Instructs the NxsCharactersBlock to convert sequence data character blocks that have
+    "augmented" symbols lists into a mixture datatype.
+
+    By default or after SetConvertAugmentedToMixed(false), the NxsCharacterBlock will change
+    the datatype to standard (to indicate that the datatype is no longer simply a sequence type).
+
+    Note that GetOriginalDataType() will still store the name of the type that occurred in the file.
+
+    This is only applicable if SetAllowAugmentingOfSequenceSymbols(true) has been called.
+    \ref mixedDatatypes
+  */
+  void SetConvertAugmentedToMixed(bool v)
+  {
+    convertAugmentedToMixed = v;
+  }
+  /*! Instructs the NxsCharactersBlock to accept extra symbols even if the datatype is
+    declared to be sequence data character blocks that have
+    "augmented" symbols lists into the standard datatype.
+  */
+  void SetAllowAugmentingOfSequenceSymbols(bool v)
+  {
+    allowAugmentingOfSequenceSymbols = v;
+  }
+
+  /*! \retutrns the setting of allowAugmentingOfSequenceSymbols.
+    The default is false.
+    \ref mixedDatatypes
+  */
+  bool GetAllowAugmentingOfSequenceSymbols() const
+  {
+    return allowAugmentingOfSequenceSymbols;
+  }
+  /*! \returns a data structure that allows you to identify the set of character
+    indices (each element in [0, nchar) range). If the type is not mixed, then
+    the map may be empty.
+  */
+  std::map<DataTypesEnum, NxsUnsignedSet> GetDatatypeMapForMixedType() const
+    {
+      return mixedTypeMapping;
+    }
+
+
+  /*! \returns a facet of the DataTypesEnum that indicates the general type
+    of data. Because symbols can be augmented non-default polymorphism codes
+    can be introduced, this is not a complete description of the datatype
+    encoding.
+
+    If you want to test if the internal representation datatype of a NxsCharactersBlock
+    has been modified use some form of this idiom:
+
+    mapper = charBlock.GetDatatypeMapperForChar(0);
+    const bool hasGaps = charBlock.GetGapSymbol() != '\0';
+    NxsDiscreteDatatypeMapper defaultMapper(NxsCharactersBlock::dna, hasGaps);
+    if (mapper->IsSemanticallyEquivalent(&defaultMapper))
+    {
+    // the datatype has not been changed in a substantive way.
+    }
+    else
+    {
+    // new state codes have been introduced, so routines that do not
+    //	interrogate the mapper to check the mapper about the status of all of the
+    //	states may fail.
+    }
+
+
+
+  */
+  DataTypesEnum GetDataType() const;
+  /*! Returns true If character `taxInd' has some stored character state. Assumes `taxInd' is in the range [0..`nchar').
+   */
+  bool TaxonIndHasData(const unsigned ind) const;
+  /*! \returns the number of characters stored in the block.*/
+  unsigned GetNCharTotal() const ;
+  /*! Returns datatype listed in the CHARACTERS block.
+    The original datatype can differ from the current datatype if the datatype
+    was listed as a sequence type, but the symbols list of a built in type was augmented
+    (thus converting it to standard).
+    This will only happen if SetAllowAugmentingOfSequenceSymbols(true) has been called on the block.
+    see \ref mixedDatatypes
+  */
+  DataTypesEnum GetOriginalDataType() const;
+  /*! Returns the number of characters that have not been exclude (via exset or eliminate command, for
+    example).
+    Synonymous with GetNumIncludedChars and (GetNChar - GetNumEliminated)
+  */
+  unsigned GetNumActiveChar() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+  /*! \returns a reference to the set of indices that are currently excluded. */
+  const NxsUnsignedSet & GetExcludedIndexSet() const;
+  /*! \returns true if character `j' is active. If character `j' has been excluded, returns false.
+    Assumes `j' is in the range [0..`nchar')
+  */
+  bool IsActiveChar(unsigned j) const;
+  /*!  excludes all of the  indices in exset.
+
+    indices should be in the range [0, nchar)
+  */
+  unsigned ApplyExset(NxsUnsignedSet &exset);
+  /*!  includes all of the  indices in exset.
+
+    indices should be in the range [0, nchar)
+  */
+  unsigned ApplyIncludeset(NxsUnsignedSet &inset);
+  /*!  excludes character `i`
+
+    i should be in the range [0, nchar)
+  */
+  void ExcludeCharacter(unsigned i);
+  /*!  includes character `i`
+
+    i should be in the range [0, nchar)
+  */
+  void IncludeCharacter(unsigned i);
+
+  /*! \returns the label for character `i` has a label or a string with a single space if the is no label*/
+  NxsString GetCharLabel(unsigned i) const; /*v2.1to2.2 4 */
+  /*! \returns true if charlabels were stored for the matrix*/
+  bool HasCharLabels() const;
+  /*! \returns the current gapMode setting
+    During a parse this is controlled by the OPTIONS command in the ASSUMPTIONS block).
+    \note{The gapmode setting basically just holds the value for the client code's convenience.
+    It only affects post-read operations, such as NxsCharactersBlock::GetObsStates.
+    It does NOT change the internal encoding of the data (just triggers some filtering) of the data}
+  */
+  GapModeEnum GetGapModeSetting() const
+  {
+    return this->gapMode;
+  }
+
+  //v2.0 API that queries based on symbols see \ref NxsCharacterBlockQueries
+  const char *GetSymbols() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+  unsigned GetNumStates(unsigned i, unsigned j) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+  char GetState(unsigned i, unsigned j, unsigned k = 0) const;
+  /*! \returns a reference to the Transformation Manager that stores information such as character transformation type (ORDERED, UNORDERED...)*/
+  const NxsTransformationManager & GetNxsTransformationManagerRef() const
+  {
+    return transfMgr;
+  }
+  /*! Returns true iff taxon `taxInd` has a gap for character `charInd` (both indices 0-based)*/
+  bool IsGapState(unsigned taxInd, unsigned charInd) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+  /*! Returns true iff taxon `taxInd` has is missing for character `charInd` (both indices 0-based) */
+  bool IsMissingState(unsigned i, unsigned j) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+  /*! Returns true iff taxon `taxInd` has is missing for character `charInd` (both indices 0-based) */
+  bool IsPolymorphic(unsigned i, unsigned j) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+
+  //v2.1 API for extracting character info
+  // for discrete characters
+  /*! \returns a const reference to the row of state codes for the taxon.
+
+    This enables faster access to the data. See \ref newerCharQueries
+
+    The row should not be modified by the caller.
+
+    taxonIndex should be in the range [0, ntax)
+  */
+  const NxsDiscreteStateRow & GetDiscreteMatrixRow(unsigned taxonIndex) const;
+  /* \returns a pointer to the the NxsDiscreteDatatypeMapper that "knows" how the
+     internal state code labellings corrspond to symbols.
+
+     If the datatype is not mixed, then the same instance will apply regardless of
+     character index.
+
+     charIndex should be in the range [0, nchar)
+  */
+  const NxsDiscreteDatatypeMapper * GetDatatypeMapperForChar(unsigned charIndex) const;
+  /*! \returns a vector of all of the NxsDiscreteDatatypeMapper used by any char in the matrix.
+
+    If the datatype is not mixed, then the vector should have length 1.
+
+    See GetDatatypeMapForMixedType().
+  */
+  std::vector<const NxsDiscreteDatatypeMapper *> GetAllDatatypeMappers() const;
+
+  // For continuous characters
+  /*! \returns the vector of values for the appropriate item `key` in the indicated cell of the matrix.
+
+    For continuous data matrices, each cell of the matrix can store multiple "items"
+    such as the average, range, max...
+    This function retrieves the collection of data for the taxon `taxIndex`
+    and the character `taxIndex` and then returns the values for the item designated by `key`
+
+    GetItems() returns the list of all possible items
+  */
+  std::vector<double> GetContinuousValues(unsigned taxIndex, unsigned charIndex, const std::string key) NCL_COULD_BE_CONST; /*v2.1to2.2 1 */
+  /*! \returns vector of items stored for each cell. (this is mainly relevant for continouos data).
+    For discrete data, only "STATES" is supported.
+  */
+  std::vector<std::string> GetItems() const;
+  /*! \returns a facet of the StatesFormatEnum to indicate what the states mean for a cell.
+
+    For discrete data, only STATES_PRESENT is accepted by NCL.
+    For continuous matrices either STATES_PRESENT or INDIVIDUALS will be accepted.
+  */
+  StatesFormatEnum GetStatesFormat() const;
+
+
+
+  // Functions that are used by many NCL-clients, but are often not needed
+  void FindConstantCharacters(NxsUnsignedSet &c) const;
+  void FindGappedCharacters(NxsUnsignedSet &c) const;
+  virtual const std::string & GetBlockName() const;
+  /*! sets the current gapMode setting.
+    During a parse this is controlled by the OPTIONS command in the ASSUMPTIONS block).
+    \note{The gapmode setting basically just holds the value for the client code's convenience.
+    It only affects post-read operations, such as NxsCharactersBlock::GetObsStates.
+    It does NOT change the internal encoding of the data (just triggers some filtering) of the data}
+  */
+  void SetGapModeSetting(GapModeEnum m)
+  {
+    this->gapMode = m;
+  }
+  static const char * GetNameOfDatatype(DataTypesEnum);
+  NxsDiscreteStateCell GetInternalRepresentation(unsigned i, unsigned j, unsigned k = 0) NCL_COULD_BE_CONST; /*v2.1to2.2 1 */
+  /*! \returns the maximum observed number of states for any character.
+    \note{this function is slow}
+
+    If `onlyActiveChars` is true then calculation will skip characters that have been excluded (eg. by an exset).
+
+  */
+  virtual unsigned GetMaxObsNumStates(bool countMissingStates=true, bool onlyActiveChars=false) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+  /*! \returns the number of states observed in a column
+    If `countMissingStates` is true then missing data is treated as an observation of each state. If
+    it is false then missing codes do not contribute to the count.
+    Partially ambiguous states result in all states in the cell being counted as observed.
+
+    columnIndex should be in [0, nchar)
+    \warning{If countMissingStates is true then it a gap as a state, if countMissingStates is false
+    the the gap will count as a state if the gapmode is GAP_MODE_NEWSTATE}
+  */
+  virtual unsigned GetNumObsStates(unsigned columnIndex, bool countMissingStates=true) NCL_COULD_BE_CONST { /*v2.1to2.2 1 */
+    return (unsigned)GetObsStates(columnIndex, countMissingStates).size();
+  }
+  /*! Returns the set of "fundamental" states seen in a column (possibly including the gap "state").
+
+    If `countMissingStates` is true then missing data is treated as an observation of each state. If
+    it is false then missing codes do not contribute to the count.
+    Partially ambiguous states result in all states in the cell being counted as observed.
+
+    columnIndex should be in [0, nchar)
+    \warning{If countMissingStates is true then it a gap as a state, if countMissingStates is false
+    a gap will count as a state if the gapmode is GAP_MODE_NEWSTATE}
+  */
+  std::set<NxsDiscreteStateCell> GetObsStates(unsigned columnIndex, bool countMissingStates=true) const {
+    if (countMissingStates)
+      return GetMaximalStateSetOfColumn(columnIndex);
+    return GetNamedStateSetOfColumn(columnIndex);
+  }
+
+  double GetSimpleContinuousValue(unsigned i, unsigned j) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+
+  /*! \returns label for character state `charStateIndex' at character `charIndex', if a label has been specified. If no label was specified,
+    returns string containing a single blank (i.e., " ").
+
+    Both charIndex and charStateIndex should be 0-based
+  */
+  NxsString GetStateLabel(unsigned charIndex, unsigned charStateIndex) const /*v2.1to2.2 4 */
+  {
+    return GetStateLabelImpl(charIndex, charStateIndex);
+  }
+  /*! If a datatype is standard, then it may have been originally specified as "restriction".
+
+    The restriction site datatype was added by MrBayes, It is supported by NCL, but you have
+    to call this function to see if the matrix was specified as restriction site data (we did not
+    add a facet to the DataTypesEnum to avoid the need to extend other code).
+  */
+  bool WasRestrictionDataype() const;
+
+
+
+  // Rarely-needed functions (usually used mainly internally by NCL)
+  static std::map<char, NxsString> GetDefaultEquates(DataTypesEnum);
+  static std::string GetDefaultSymbolsForType(DataTypesEnum dt);
+  const NxsDiscreteDatatypeMapper & GetDatatypeMapperForCharRef(unsigned charIndex) const;
+  /*! \return the datatype as a human-readable string (uses NxsCharactersBlock::GetNameOfDatatype)*/
+  const char * GetDatatypeName() const
+  {
+    return NxsCharactersBlock::GetNameOfDatatype(datatype);
+  }
+  char GetGapSymbol() const;
+  void SetGapSymbol(char);
+  char GetMatchcharSymbol() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+  char GetMissingSymbol() const;
+  unsigned GetMaxIndex() const;
+  const NxsDiscreteStateMatrix & GetRawDiscreteMatrixRef() const
+  {
+    return discreteMatrix;
+  }
+
+
+  // Low-level functions (difficult to use, or with potentially suprising behavior). These are used internally by NCL
+  virtual unsigned CharLabelToNumber(NxsString s) NCL_COULD_BE_CONST ; /*v2.1to2.2 d */
+  virtual unsigned CharLabelToNumber(const std::string & s) const;
+  unsigned GetIndexSet(const std::string &label, NxsUnsignedSet * toFill) const
+  {
+    return NxsLabelToIndicesMapper::GetIndicesFromSets(label, toFill, charSets);
+  }
+  unsigned GetIndicesForLabel(const std::string &label, NxsUnsignedSet *inds) const;
+  unsigned GetNCharTotal() ; // non const version for backwark compat.
+  unsigned GetNumIncludedChars() const ; // synonymous with GetNumActiveChar
+  unsigned GetNumEliminated() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */ //backward-compat.
+  unsigned GetNChar() const;
+  unsigned GetNumChar() const;
+  // poor function name -- same as GetNumObsStates. Backward compatibility \deprecated
+  virtual unsigned GetObsNumStates(unsigned columnIndex, bool countMissingStates=true) NCL_COULD_BE_CONST { /*v2.1to2.2 1 */
+    return (unsigned) GetObsStates(columnIndex, countMissingStates).size();
+  }
+  /*! Returns label for character state `charStateIndex' at character `charIndex', if a label has been specified. If no label was specified,
+    returns string containing a single blank (i.e., " ").
+  */
+  NxsString GetStateLabel(unsigned charIndex, unsigned charStateIndex) /*v2.1to2.2 4 */ //			non-const version for backward compat
+
+  {
+    return GetStateLabelImpl(charIndex, charStateIndex);
+  }
+  /* It is probably better to ask for the taxa block (via GetTaxaBlockPtr() method) and then have
+     the full TaxaBlockAPI to query from rather than ask about the taxa via the characters block.*/
+  NxsString GetTaxonLabel(unsigned i) const; /*v2.1to2.2 4 */
+
+  // non-const version
+  NxsTransformationManager & GetNxsTransformationManagerRef()
+    {
+      return transfMgr;
+    }
+  bool IsActiveChar(unsigned j) ; // non-const version for backward
+  bool IsEliminated(unsigned charIndex) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */ //same as (!IsActive(charIndex))
+  bool IsExcluded(unsigned j) const; //same as IsEliminated(j)
+  bool IsExcluded(unsigned j) ;  //same as IsEliminated(j) non-const for backward compat.
+  bool IsMixedType() const;
+
+  virtual unsigned TaxonLabelToNumber(NxsString s) const; /*v2.1to2.2 4 */
+  virtual bool AddNewCodonPosPartition(const std::string &label, const NxsPartition & inds, bool isDefault);
+  bool AddNewIndexSet(const std::string &label, const NxsUnsignedSet & inds);
+  bool AddNewExSet(const std::string &label, const NxsUnsignedSet & inds);
+  bool AddNewPartition(const std::string &label, const NxsPartition & inds);
+  void Consume(NxsCharactersBlock &other);
+  /*! Behaves like GetMaximalStateSetOfColumn except that missing data columns do not increase
+    size of the returned state set.
+    This function is sensitive to the gapmode setting. A gap will count as a state if the gapmode is
+    GAP_MODE_NEWSTATE.
+
+    columnIndex should be in [0, nchar)
+  */
+  std::set<NxsDiscreteStateCell> GetNamedStateSetOfColumn(const unsigned colIndex) const;
+  /*! Returns the set of "fundamental" states seen in a column (possibly including the gap "state").
+
+    Missing data, gaps, and partially ambiguous cells result in all states in the cell being counted as observed.
+
+    columnIndex should be in [0, nchar)
+
+  */
+  std::set<NxsDiscreteStateCell> GetMaximalStateSetOfColumn(const unsigned colIndex) const;
+
+
+
+
+  // Output/writing functions
+  virtual void Report(std::ostream &out) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+  void ShowStateLabels(std::ostream &out, unsigned i, unsigned c, unsigned first_taxon) const;
+  void WriteAsNexus(std::ostream &out) const;
+  virtual void DebugShowMatrix(std::ostream &out, bool use_matchchar, const char *marginText = NULL) const;
+  virtual void WriteLinkCommand(std::ostream &out) const;
+  void WriteStatesForTaxonAsNexus(std::ostream &out, unsigned taxNum, unsigned begChar, unsigned endChar) const;
+  void WriteCharLabelsCommand(std::ostream &out) const;
+  void WriteCharStateLabelsCommand(std::ostream &out) const;
+  void WriteEliminateCommand(std::ostream &out) const;
+  void WriteFormatCommand(std::ostream &out) const;
+  void WriteMatrixCommand(std::ostream &out) const;
+
+
+
+  // parsing related functions (used internally by NCL, rarely needed by client code)
+  bool IsInterleave() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+  bool IsLabels() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+  bool IsRespectCase() const;
+  bool IsTokens() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+  bool IsTranspose() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+  /* Returns the number of taxa that should be stored. Used during the parse.
+     \warning{After parsing, use TaxonIndHasData() for each taxon rather than this function.}
+     \todo{After the parse this, GetNTaxWithData() *should* agree with GetNTaxTotal(). We need a
+     test for this needed property of }
+  */
+  unsigned GetNTaxWithData() const ; //
+  virtual VecBlockPtr GetImpliedBlocks();
+  unsigned GetNumEquates() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+  unsigned GetNumUserEquates() const;
+  unsigned GetNumMatrixCols() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+  /* Returns the number of taxa (should agree with GetNTaxTotal()) */
+  unsigned GetNumMatrixRows() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+  virtual void Reset();
+  void SetNexus(NxsReader *nxsptr);
+  const ContinuousCharRow & GetContinuousMatrixRow(unsigned taxNum) const;
+
+
+  /*only used it the linkAPI is enabled*/
+  virtual void HandleLinkCommand(NxsToken & token);
+
+
+
+  /*---------------------------------------------------------------------------------------
+    | Results in aliasing of the taxa, assumptionsBlock blocks!
+  */
+  NxsCharactersBlock & operator=(const NxsCharactersBlock &other)
+    {
+      Reset();
+      CopyBaseBlockContents(static_cast<const NxsBlock &>(other));
+      CopyTaxaBlockSurrogateContents(other);
+      CopyCharactersContents(other);
+      return *this;
+    }
+
+  virtual void CopyCharactersContents(const NxsCharactersBlock &other);
+  virtual NxsCharactersBlock * Clone() const
+  {
+    NxsCharactersBlock * a = new NxsCharactersBlock(taxa, assumptionsBlock);
+    *a = *this;
+    return a;
+  }
+
+
+  void SetWriteInterleaveLen(int interleaveLen)
+  {
+    writeInterleaveLen = interleaveLen;
+  }
+
+  std::string GetMatrixRowAsStr(const unsigned rowIndex) const;
+  NxsDiscreteStateCell	GetStateIndex(unsigned i, unsigned j, unsigned k) const;
+
+
+  /** converts a CodonPosPartition into the list<int> argument needed for the NewCodonsCharactersBlock call */
+  static void CodonPosPartitionToPosList(const NxsPartition &codonPos, std::list<int> * charIndices);
+
+  /* allocates a new charaters block with all of the active characters in `charBlock`
+     but with a 64-state codon datatype. The order of codons is:
+     0   1   2   3   4   5  ... 63
+     AAA AAC AAG AAT ACA ACC ... TTT
+     The caller is responsible for deleting the new NxsCharactersBlock object
+     If charIndices is provided, it lists the bases in the RF by position the int can be < 0 to indicate that that position was not sampled
+  */
+  static NxsCharactersBlock * NewCodonsCharactersBlock(
+						       const NxsCharactersBlock * charBlock,
+						       bool mapPartialAmbigToUnknown,
+						       bool gapsToUnknown,
+						       bool honorCharActive, /* if true then inactive characters are treated as missing */
+						       const std::list<int> * charIndices = NULL, /* specifies the indices of the positions in the gene. -1 can be used to indicate tha codon position was not included in the original matrix */
+						       NxsCharactersBlock ** spareNucs = NULL /* If non-null, then, on exit the NxsCharactersBlock * pointer will refer to a new character block with all of the positions that were not translated (all of the non-coding nucleotide positions) */
+						       );
+  static NxsCharactersBlock * NewProteinCharactersBlock(
+							const NxsCharactersBlock * codonBlock,
+							bool mapPartialAmbigToUnknown,
+							bool gapToUnknown,
+							NxsGeneticCodesEnum codeIndex);
+  static NxsCharactersBlock * NewProteinCharactersBlock(
+							const NxsCharactersBlock * codonBlock,
+							bool mapPartialAmbigToUnknown,
+							bool gapToUnknown,
+							const std::vector<NxsDiscreteStateCell> & aaIndices); /** the index of the amino acid symbols for the codon (where the order of codons is alphabetical: AAA, AAC, AAG, AAT, ACA, ...TTT **/
+
+  virtual std::string GetDefaultCodonPosPartitionName() const {
+    return defCodonPosPartitionName;
+  }
+  virtual NxsPartition GetCodonPosPartition(const std::string &label) const {
+    NxsPartitionsByName::const_iterator pIt = codonPosPartitions.find(label);
+    if (pIt == codonPosPartitions.end())
+      return NxsPartition();
+    return pIt->second;
+  }
+
+  unsigned NumAmbigInTaxon(const unsigned taxInd, const NxsUnsignedSet * charIndices, const bool countOnlyCompletelyMissing, const bool treatGapsAsMissing) const;
+  bool FirstTaxonStatesAreSubsetOfSecond(const unsigned firstTaxonInd, const unsigned secondTaxonInd, const NxsUnsignedSet * charIndices, const bool treatAmbigAsMissing, const bool treatGapAsMissing) const;
+  //Returns the number of characters that differ, and the number of positions for which both taxa were non-missing
+
+  std::pair<unsigned, unsigned> GetPairwiseDist(const unsigned firstTaxonInd, const unsigned secondTaxonInd, const NxsUnsignedSet * charIndices, const bool treatAmbigAsMissing, const bool treatGapAsMissing) const;
+  CodonRecodingStruct RemoveStopCodons(NxsGeneticCodesEnum);
+  bool SwapEquivalentTaxaBlock(NxsTaxaBlockAPI * tb)
+  {
+    return SurrogateSwapEquivalentTaxaBlock(tb);
+  }
+
+  /*! Writes a range of characater states as NEXUS to out.
+
+   */
+  void WriteStatesForMatrixRow(std::ostream &out, /*!< ostream that will be written to.*/
+			       unsigned taxon, /*!< index of the row (taxon) to be written.  Should be in [0,ntax). */
+			       unsigned first_taxon, /*!< UINT_MAX to avoid using the matchchar in output. Otherwise the [0,ntax) index of the taxon that is printed first. */
+			       unsigned begChar, /*!< first character index to write. Should be in [0, nchar). */
+			       unsigned endChar) const; /*!< end of character range. This index is one greater than the last index to be printed. Should be in the range (begChar, nchar] */
+
+
+ protected:
+  // This function should not be called to remove characters, it is only used in the creation of new char blocks from existing blocks
+  void SetNChar(unsigned nc)
+  {
+    this->nChar = nc;
+  }
+  // This function should not be called to remove characters, it is only used in the creation of new char blocks from existing blocks
+  void SetNTax(unsigned nt)
+  {
+    this->nTaxWithData = nt;
+  }
+
+  NxsString GetStateLabelImpl(unsigned i, unsigned j) const; /*v2.1to2.2 4 */
+
+  NxsDiscreteDatatypeMapper * GetMutableDatatypeMapperForChar(unsigned charIndex);
+  bool IsInSymbols(char ch) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+  void ShowStates(std::ostream &out, unsigned i, unsigned j) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+
+  void HandleCharlabels(NxsToken &token);
+  void HandleCharstatelabels(NxsToken &token);
+  void HandleDimensions(NxsToken &token, NxsString newtaxaLabel, NxsString ntaxLabel, NxsString ncharLabel);
+  void HandleEliminate(NxsToken &token);
+  virtual void HandleFormat(NxsToken &token);
+  virtual void HandleMatrix(NxsToken &token);
+  bool HandleNextContinuousState(NxsToken &token, unsigned taxNum, unsigned charNum, ContinuousCharRow & row, const NxsString & nameStr);
+  bool HandleNextDiscreteState(NxsToken &token, unsigned taxNum, unsigned charNum, NxsDiscreteStateRow & row, NxsDiscreteDatatypeMapper &, const NxsDiscreteStateRow * firstTaxonRow, const NxsString & nameStr);
+  bool HandleNextTokenState(NxsToken &token, unsigned taxNum, unsigned charNum, NxsDiscreteStateRow & row, NxsDiscreteDatatypeMapper &, const NxsDiscreteStateRow * firstTaxonRow, const NxsString & nameStr);
+  void HandleStatelabels(NxsToken &token);
+  virtual void HandleStdMatrix(NxsToken &token);
+  virtual NxsDiscreteStateCell HandleTokenState(NxsToken &token, unsigned taxNum, unsigned charNum, NxsDiscreteDatatypeMapper &mapper, const NxsDiscreteStateRow * firstTaxonRow, const NxsString & nameStr);
+  virtual void HandleTransposedMatrix(NxsToken &token);
+  virtual void Read(NxsToken &token);
+  void ResetSymbols();
+
+  void WriteStates(NxsDiscreteDatum &d, char *s, unsigned slen) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+
+
+  NxsAssumptionsBlockAPI	*assumptionsBlock;	/* pointer to the ASSUMPTIONS block in which exsets, taxsets and charsets are stored */
+
+  unsigned nChar; /* number of columns in matrix	*/
+  unsigned nTaxWithData; /* number of non empty rows in the matrix*/
+
+  char matchchar; /* match symbol to use in matrix */
+  bool respectingCase; /* if true, RESPECTCASE keyword specified in FORMAT command */
+  bool transposing; /* indicates matrix will be in transposed format */
+  bool interleaving; /* indicates matrix will be in interleaved format */
+  mutable bool tokens; /* if false, data matrix entries must be single symbols; if true, multicharacter entries are allows */
+  bool labels; /* indicates whether or not labels will appear on left side of matrix */
+
+  char missing; /* missing data symbol */
+  char gap; /* gap symbol for use with molecular data */
+  GapModeEnum gapMode; /* manipulated by the assumptions block. This setting basically just holds the value. It only affects post-read operations, such as GetNamedStateSetOfColumn and it does NOT change the internal encoding of the data (just triggers some filtering) */
+  std::string symbols; /* list of valid character state symbols */
+  std::map<char, NxsString> userEquates; /* list of associations defined by EQUATE attribute of FORMAT command */
+  std::map<char, NxsString> defaultEquates;
+  VecDatatypeMapperAndIndexSet datatypeMapperVec;
+  NxsDiscreteStateMatrix	discreteMatrix; /* storage for discrete data */
+  ContinuousCharMatrix	continuousMatrix;	/* */
+
+  NxsUnsignedSet eliminated; /* array of (0-offset) character numbers that have been eliminated (will remain empty if no ELIMINATE command encountered) */
+  NxsUnsignedSet excluded; /* set of (0-offset) indices of characters that have been excluded.*/
+
+  LabelToIndexMap ucCharLabelToIndex;
+  IndexToLabelMap indToCharLabel;
+  NxsStringVectorMap charStates; /* storage for character state labels (if provided) */
+  NxsStringVector globalStateLabels; /* state labels that apply to all characters (if not pre-empted by thy charStates field) */
+  VecString items;
+
+  NxsUnsignedSetMap charSets;
+  NxsUnsignedSetMap exSets;
+  NxsPartitionsByName charPartitions;
+  NxsTransformationManager transfMgr;
+  bool datatypeReadFromFormat;
+  NxsPartitionsByName codonPosPartitions;
+  std::string defCodonPosPartitionName;
+  std::map<DataTypesEnum, NxsUnsignedSet> mixedTypeMapping;
+ private:
+  DataTypesEnum datatype; /* flag variable (see datatypes enum) */
+  DataTypesEnum originalDatatype; /* flag variable (see datatypes enum) */
+  StatesFormatEnum statesFormat;
+  bool restrictionDataype;
+  bool supportMixedDatatype;	/* (false by default) flag for whether or not MrBayes-style Mixed blocks should be supported */
+  bool convertAugmentedToMixed; /* false by default (see AugmentedSymbolsToMixed) */
+  bool allowAugmentingOfSequenceSymbols;
+  int writeInterleaveLen;
+
+  void CreateDatatypeMapperObjects(const NxsPartition & , const std::vector<DataTypesEnum> &);
+  friend class PublicNexusReader;
+  friend class MultiFormatReader;
+};
+
+typedef NxsCharactersBlock CharactersBlock;
+
+
+class NxsCharactersBlockFactory
+:public NxsBlockFactory
+{
+ public:
+  virtual NxsCharactersBlock	*	GetBlockReaderForID(const std::string & NCL_BLOCKTYPE_ATTR_NAME, NxsReader *reader, NxsToken *token);
+};
+
+class NxsDiscreteStateSetInfo
+{
+ public:
+ NxsDiscreteStateSetInfo(const std::set<NxsDiscreteStateCell> & stateSet, bool polymorphic=false, char symbol='\0')
+   :states(stateSet),
+    nexusSymbol(symbol),
+    isPolymorphic(polymorphic)
+    {}
+
+
+  std::set<NxsDiscreteStateCell> states;
+  char nexusSymbol;
+  bool isPolymorphic;
+};
+
+/*! This class stores the information needed to map the internal storage for a cell of a matrix (a "state code") to
+  the set of states that it corresponds to.
+*/
+class NxsDiscreteDatatypeMapper
+{
+ public:
+
+
+
+
+  static void GenerateNxsExceptionMatrixReading(const char *, unsigned taxInd, unsigned charInd, NxsToken *, const NxsString &nameStr);
+  static void GenerateNxsExceptionMatrixReading(const std::string &s, unsigned taxInd, unsigned charInd, NxsToken * token, const NxsString &nameStr)
+  {
+    GenerateNxsExceptionMatrixReading(s.c_str(), taxInd, charInd, token, nameStr);
+  }
+
+
+  NxsDiscreteDatatypeMapper();
+  NxsDiscreteDatatypeMapper(NxsCharactersBlock::DataTypesEnum datatypeE, bool hasGaps);
+  NxsDiscreteDatatypeMapper(NxsCharactersBlock::DataTypesEnum datatype, const std::string & symbols,
+			    char missingChar, char gapChar, char matchChar,
+			    bool respectCase, const std::map<char, NxsString> & extraEquates);
+
+  /*! \returns the number of state codes (including partially ambiguous) */
+  unsigned GetNumStateCodes() const
+  {
+    return (unsigned)stateSetsVec.size();
+  }
+
+  NxsCharactersBlock::DataTypesEnum GetDatatype() const
+    {
+      return datatype;
+    }
+  unsigned GetNumStates() const;
+  unsigned GetNumStatesIncludingGap() const;
+  std::string GetSymbols() const
+    {
+      return symbols;
+    }
+  std::string GetSymbolsWithGapChar() const
+    {
+      if (gapChar == '\0')
+	return GetSymbols();
+      std::string s;
+      s = symbols;
+      s.append(1, gapChar);
+      return s;
+    }
+
+  const std::set<NxsDiscreteStateCell> & GetStateSetForCode(NxsDiscreteStateCell stateCode) const;
+  bool IsSemanticallyEquivalent(const NxsDiscreteDatatypeMapper &other) const;
+  bool IsPolymorphic(NxsDiscreteStateCell stateCode) const;
+  NxsDiscreteStateCell PositionInSymbols(const char currChar) const;
+  /*! Returns a state code for a NEXUS symbol.
+
+    will return NXS_INVALID_STATE_CODE if the char is unknown
+  */
+  NxsDiscreteStateCell GetStateCodeStored(char currChar) const
+  {
+    return cLookup[static_cast<int>(currChar)];
+  }
+  /*! \returns the highest legal internal state code (this is note the number of
+    state codes because the missing data and gap codes are negative).
+
+    Note that this is the highest state code that the mapper understands, it does
+    not imply that the NxsCharacterBlock that "owns" the mapper has a matrix
+    with a state code that is as large as the number returned.
+
+  */
+  NxsDiscreteStateCell GetHighestStateCode() const
+  {
+    return ((NxsDiscreteStateCell) stateSetsVec.size()) + sclOffset - 1;
+  }
+
+
+
+
+
+ NxsDiscreteDatatypeMapper(const NxsDiscreteDatatypeMapper& other)
+   :datatype(other.datatype)
+    {
+      *this = other;
+    }
+  NxsDiscreteDatatypeMapper & operator=(const NxsDiscreteDatatypeMapper&);
+
+  char GetGapSymbol() const
+  {
+    return gapChar;
+  }
+  // warning: unsafe to call after reading -- does not recode data!
+  void SetGapSymbol(char c)
+  {
+    gapChar = c;
+  }
+  char GetMissingSymbol() const
+  {
+    return missing;
+  }
+  std::map<char, NxsString> GetExtraEquates() const
+    {
+      return extraEquates;
+    }
+  unsigned GetNumStatesInStateCode(NxsDiscreteStateCell stateCode) const;
+  NxsDiscreteStateCell GetOneStateForCode(NxsDiscreteStateCell stateCode, unsigned stateIndex) const;
+  NxsDiscreteStateRow GetStateVectorForCode(NxsDiscreteStateCell stateCode) const;
+  std::vector<std::vector<int> > GetPythonicStateVectors() const;
+  NxsDiscreteStateCell PositionInSymbolsOrGaps(const char currChar) const
+  {
+    if (currChar == gapChar)
+      return NXS_GAP_STATE_CODE;
+    return PositionInSymbols(currChar);
+  }
+  std::string StateCodeToNexusString(NxsDiscreteStateCell, bool demandSymbols = true) const;
+  NxsDiscreteStateCell StateCodeForNexusChar(const char currChar, NxsToken * token,
+					     unsigned taxInd, unsigned charInd,
+					     const NxsDiscreteStateRow * firstTaxonRow, const NxsString &nameStr) const;
+  void WriteStartOfFormatCommand(std::ostream & out) const;
+  void WriteStateCodeRowAsNexus(std::ostream & out, const std::vector<NxsDiscreteStateCell> &row) const;
+  void WriteStateCodeRowAsNexus(std::ostream & out, std::vector<NxsDiscreteStateCell>::const_iterator & begIt, const std::vector<NxsDiscreteStateCell>::const_iterator & endIt) const;
+  void WriteStateCodeAsNexusString(std::ostream & out, NxsDiscreteStateCell scode, bool demandSymbols = true) const;
+  bool WasRestrictionDataype() const;
+  void SetWasRestrictionDataype(bool v) {restrictionDataype = v;}
+  NxsDiscreteStateCell EncodeNexusStateString(const std::string &stateAsNexus, NxsToken & token,
+					      const unsigned taxInd, const unsigned charInd,
+					      const NxsDiscreteStateRow * firstTaxonRow, const NxsString &nameStr);
+  NxsDiscreteStateCell StateCodeForStateSet(const std::set<NxsDiscreteStateCell> &, const bool isPolymorphic,
+					    const bool addToLookup, const char symbol);
+
+  void DebugPrint(std::ostream &) const;
+
+  bool GetUserDefinedEquatesBeforeConversion() const
+  {
+    return userDefinedEquatesBeforeConversion;
+  }
+
+  bool IsRespectCase() const
+  {
+    return respectCase;
+  }
+
+  const std::set<NxsDiscreteStateCell> & GetStateIntersection(NxsDiscreteStateCell stateCode, NxsDiscreteStateCell otherStateCode) const
+  {
+    if (stateIntersectionMatrix.empty())
+      BuildStateIntersectionMatrix();
+    const NxsDiscreteStateCell sc = stateCode - NXS_GAP_STATE_CODE;
+    const NxsDiscreteStateCell osc = otherStateCode - NXS_GAP_STATE_CODE;
+    return stateIntersectionMatrix.at(sc).at(osc);
+  }
+
+  bool FirstIsSubset(NxsDiscreteStateCell stateCode, NxsDiscreteStateCell otherStateCode, bool treatGapAsMissing) const
+  {
+    if (isStateSubsetMatrix.empty())
+      BuildStateSubsetMatrix();
+    const NxsDiscreteStateCell sc = stateCode - NXS_GAP_STATE_CODE;
+    const NxsDiscreteStateCell osc = otherStateCode - NXS_GAP_STATE_CODE;
+    if (treatGapAsMissing)
+      return isStateSubsetMatrixGapsMissing.at(sc).at(osc);
+    return isStateSubsetMatrix.at(sc).at(osc);
+  }
+
+  NxsGeneticCodesEnum geneticCode; /* only used for compressed codon codings */
+
+  /*! can be used to "See" the mapping while debugging */
+  void DebugWriteMapperFields(std::ostream & out) const;
+ private:
+  NxsDiscreteStateCell AddStateSet(const std::set<NxsDiscreteStateCell> & states, char nexusSymbol, bool symRespectCase, bool isPolymorphic);
+  NxsDiscreteStateCell StateCodeForNexusMultiStateSet(const char nexusSymbol, const std::string & stateAsNexus, NxsToken * token,
+						      unsigned taxInd, unsigned charInd,
+						      const NxsDiscreteStateRow * firstTaxonRow, const NxsString &nameStr);
+  NxsDiscreteStateCell StateCodeForNexusPossibleMultiStateSet(const char nexusSymbol, const std::string & stateAsNexus, NxsToken & token,
+							      unsigned taxInd, unsigned charInd,
+							      const NxsDiscreteStateRow * firstTaxonRow, const NxsString &nameStr);
+
+  void RefreshMappings(NxsToken *token);
+  void ValidateStateIndex(NxsDiscreteStateCell state) const;
+  void ValidateStateCode(NxsDiscreteStateCell state) const;
+  void BuildStateSubsetMatrix() const;
+  void BuildStateIntersectionMatrix() const;
+  void DeleteStateIndices(const std::set<NxsDiscreteStateCell> & deletedInds);
+
+  NxsDiscreteStateCell * cLookup; /* Nexus char to state code lookup -- alias to member of charToStateCodeLookup*/
+  NxsDiscreteStateSetInfo * stateCodeLookupPtr; /* state code to NxsDiscreteStateSetInfo object table -- alias to stateSets */
+  std::string symbols;
+  std::string lcsymbols; /* lowercase symbols (in the same order as symbols) */
+  unsigned nStates;
+  char matchChar;
+  char gapChar;
+  char missing;
+  bool respectCase;
+  std::map<char, NxsString> extraEquates;
+  NxsCharactersBlock::DataTypesEnum datatype; /* flag variable (see datatypes enum) */
+  std::vector<NxsDiscreteStateSetInfo> stateSetsVec; /* memory management for cLookup*/
+  std::vector<NxsDiscreteStateCell> charToStateCodeLookup; /* stateCodeLookup */
+  int sclOffset; /* offset of stateCodeLookup in stateSets */
+  bool restrictionDataype;
+  bool userDefinedEquatesBeforeConversion;
+
+  typedef std::vector< std::set<NxsDiscreteStateCell> > StateIntersectionRow;
+  typedef std::vector< StateIntersectionRow > StateIntersectionMatrix;
+  typedef std::vector< bool > IsStateSubsetRow;
+  typedef std::vector< IsStateSubsetRow > IsStateSubsetMatrix;
+  mutable StateIntersectionMatrix stateIntersectionMatrix;
+  mutable IsStateSubsetMatrix isStateSubsetMatrix;
+  mutable IsStateSubsetMatrix isStateSubsetMatrixGapsMissing;
+
+  friend class NxsCharactersBlock;
+  friend class MultiFormatReader;
+};
+
+inline unsigned NxsDiscreteDatatypeMapper::GetNumStatesIncludingGap() const
+{
+  return nStates + (gapChar == '\0' ? 0 : 1);
+}
+
+inline unsigned NxsDiscreteDatatypeMapper::GetNumStates() const
+{
+  return nStates;
+}
+
+/*!
+  Returns the set of state indices that correspond to the states of state code `c`
+  Generates a NxsNCLAPIException if `c` is not a valid state code.
+  Not as efficient as GetStateSetForCode
+*/
+inline std::vector<NxsDiscreteStateCell> NxsDiscreteDatatypeMapper::GetStateVectorForCode(NxsDiscreteStateCell c) const
+{
+  const std::set<NxsDiscreteStateCell> & ss = GetStateSetForCode(c);
+  return std::vector<NxsDiscreteStateCell>(ss.begin(), ss.end());
+}
+
+/*!
+  Returns the set of state indices that correspond to the states of state code `c`
+  Generates a NxsNCLAPIException if `c` is not a valid state code.
+*/
+inline const std::set<NxsDiscreteStateCell>	& NxsDiscreteDatatypeMapper::GetStateSetForCode(NxsDiscreteStateCell c) const
+{
+  NCL_ASSERT(stateCodeLookupPtr);
+  ValidateStateCode(c);
+  return stateCodeLookupPtr[c].states;
+}
+
+/*!
+  Returns the `stateIndex`-th state for `stateCode` Thus if stateCode = 6 and this corresponds to {AG}
+  then:
+  GetOneStateForCode(6, 0) would return 0 (assuming that A is state 0), and
+  GetOneStateForCode(6, 1) would return 2 (assuming that G is state 2 in the symbols list)
+*/
+inline NxsDiscreteStateCell NxsDiscreteDatatypeMapper::GetOneStateForCode(NxsDiscreteStateCell stateCode, unsigned stateIndex) const
+{
+  const std::set<NxsDiscreteStateCell> & s = GetStateSetForCode(stateCode);
+  unsigned i = 0;
+  for (std::set<NxsDiscreteStateCell>::const_iterator sIt = s.begin(); sIt != s.end(); ++sIt, ++i)
+    {
+      if (i == stateIndex)
+	return *sIt;
+    }
+  NCL_ASSERT(false);
+  throw NxsException("State index out of range in NxsDiscreteDatatypeMapper::GetOneStateForCode");
+}
+
+/*!
+  Returns the NEXUS reperesenation of the state code `scode` which may be a multiple character string such as {DNY}
+  Generates a NxsNCLAPIException if `c` is not a valid state code.
+  If insufficient symbols exist, then `demandSymbols` controls the behavior (if true then an NxsNCLAPIException
+  is raised, otherwise an empty string is returned.
+
+  Note that
+  WriteStateCodeAsNexusString(out, c);
+  Is more efficient than
+  out << StateCodeToNexusString(c);
+*/
+inline std::string NxsDiscreteDatatypeMapper::StateCodeToNexusString(NxsDiscreteStateCell scode, bool demandSymbols) const
+{
+  std::ostringstream o;
+  WriteStateCodeAsNexusString(o, scode, demandSymbols);
+  return o.str();
+}
+
+
+/*!
+  Called from HandleStdMatrix or HandleTransposedMatrix function to read in the next state. Always returns true
+  except in the special case of an interleaved matrix, in which case it returns false if a newline character is
+  encountered before the next token.
+*/
+inline NxsDiscreteStateCell NxsDiscreteDatatypeMapper::EncodeNexusStateString(
+									      const std::string &stateAsNexus,
+									      NxsToken & token, /* the token used to read from `in' */
+									      const unsigned taxInd, /* the taxon index, in range [0..`ntax') */
+									      const unsigned charInd, /* the character index, in range [0..`nChar') */
+									      const NxsDiscreteStateRow * firstTaxonRow, const NxsString &nameStr)
+{
+  const unsigned tlen = (unsigned) stateAsNexus.length();
+  if (tlen == 0)
+    GenerateNxsExceptionMatrixReading("Unexpected empty token encountered", taxInd, charInd, &token, nameStr);
+  if (tlen == 1)
+    return StateCodeForNexusChar(stateAsNexus[0], &token, taxInd, charInd, firstTaxonRow, nameStr);
+  return StateCodeForNexusMultiStateSet('\0', stateAsNexus, &token, taxInd, charInd, firstTaxonRow, nameStr);
+}
+
+/*! MrBayes introduced the datatype=restriction syntax for 01 symbols.
+  NCL reads this type as standard, but sets a flag. If the datatype is reported as Standard, then you can call
+  WasRestrictionDataype to see if the datatype was declared "RESTRICTION"
+*/
+inline bool NxsDiscreteDatatypeMapper::WasRestrictionDataype() const
+{
+  return restrictionDataype;
+}
+/*! MrBayes introduced the datatype=restriction syntax for 01 symbols.
+  NCL reads this type as standard, but sets a flag. If the datatype is reported as Standard, then you can call
+  WasRestrictionDataype to see if the datatype was declared "RESTRICTION"
+*/
+inline bool NxsCharactersBlock::WasRestrictionDataype() const
+{
+  return restrictionDataype;
+}
+
+inline void NxsCharactersBlock::SetNexus(NxsReader *nxsptr)
+{
+  NxsBlock::SetNexus(nxsptr);
+  NxsTaxaBlockSurrogate::SetNexusReader(nxsptr);
+}
+
+inline bool NxsCharactersBlock::IsMixedType() const
+{
+  return (datatypeMapperVec.size() > 1);
+}
+
+/*! Returns the list of items that will be in each cell. This is always "STATES" for discrete datatypes, but can be
+  a vector of any string for continuous types
+*/
+inline std::vector<std::string> NxsCharactersBlock::GetItems() const
+{
+  return items;
+}
+
+/*!
+  Accessor for getting the list of continuous values associated with an "ITEM." Usually, these vectors will have
+  length of 1, but the "STATES" item may have a list of all observed values.
+
+  Values of DBL_MAX indicate missing data.
+  An empty vector indicates that the key was not used in this cell.
+*/
+inline std::vector<double> NxsCharactersBlock::GetContinuousValues(
+								   unsigned i, /* the taxon in range [0..`ntax') */
+								   unsigned j, /* the character in range [0..`nChar') */
+								   const std::string key) NCL_COULD_BE_CONST /* The name of the ITEM in the FORMAT command. Must be ALL CAPS.*/ /*v2.1to2.2 1 */
+{
+  const ContinuousCharCell & cell = continuousMatrix.at(i).at(j);
+  ContinuousCharCell::const_iterator cIt = cell.find(key);
+  if (cIt == cell.end())
+    return std::vector<double>();
+  return cIt->second;
+}
+
+/*! Short cut for returning the AVERAGE item, which is the default of a continuous cell type. Note this does not
+  compute the average, this is just a shortcut for dealing with simple continuous matrices that do not
+  use the ITEMS subcommand of FORMAT.
+
+  Values of DBL_MAX indicate missing data.
+*/
+inline double NxsCharactersBlock::GetSimpleContinuousValue(
+							   unsigned i, /* the taxon in range [0..`ntax') */
+							   unsigned j) NCL_COULD_BE_CONST /* the character in range [0..`nChar') */ /*v2.1to2.2 1 */
+{
+  const std::vector<double> av = GetContinuousValues(i, j, std::string("AVERAGE"));
+  if (av.empty())
+    return DBL_MAX;
+  return av.at(0);
+}
+
+
+/*!
+  Returns label for character `i' (starting at zero), if a label has been specified. If no label was specified, returns string
+  containing a single blank (i.e., " ").
+*/
+inline NxsString NxsCharactersBlock::GetCharLabel( /*v2.1to2.2 4 */
+						  unsigned i) const	/* the character in range [0..`nChar') */
+{
+  std::map<unsigned, std::string>::const_iterator tlIt = indToCharLabel.find(i);
+  if (tlIt == indToCharLabel.end())
+    return NxsString(" "); /*v2.1to2.2 4 */
+  return NxsString(tlIt->second.c_str()); /*v2.1to2.2 4 */
+}
+
+/*!
+  Returns true if at least one character has charlabels
+*/
+inline bool NxsCharactersBlock::HasCharLabels() const
+{
+  return !indToCharLabel.empty();
+}
+/*!
+  Returns the gap symbol currently in effect. If no gap symbol specified, returns '\0'.
+*/
+inline char NxsCharactersBlock::GetGapSymbol() const
+{
+  return gap;
+}
+
+/*!
+//Warning: this function is unsafe -- it only effects the writing of the matrix as NEXUS and it does not correctly
+recode the matrix.
+*/
+inline void NxsCharactersBlock::SetGapSymbol(char g)
+{
+  gap = g;
+  if (datatypeMapperVec.size() == 1)
+    datatypeMapperVec[0].first.SetGapSymbol(g);
+}
+
+
+/*! Returns value of `datatype' from the datatype mapper.
+  This if you have told NCL to read augmented symbols list (SetAllowAugmentingOfSequenceSymbols)
+  then it is possible that the datatype returned will be standard even if the GetOriginalDataType()
+  returns a molecular sequence datatype. This means that the symbols list was augmented.
+
+*/
+inline NxsCharactersBlock::DataTypesEnum NxsCharactersBlock::GetDataType() const
+{
+  if (datatypeMapperVec.empty())
+    return datatype;
+  if (datatypeMapperVec.size() > 1)
+    return mixed;
+  return datatypeMapperVec[0].first.GetDatatype();
+}
+
+inline NxsCharactersBlock::DataTypesEnum NxsCharactersBlock::GetOriginalDataType() const
+{
+  return originalDatatype;
+}
+
+/*!
+  Returns the `matchchar' symbol currently in effect. If no `matchchar' symbol specified, returns '\0'.
+*/
+inline char NxsCharactersBlock::GetMatchcharSymbol() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+{
+  return matchchar;
+}
+
+/*!
+  This function is no longer the most efficient way to access parsed data (see notes on NxsCharacterBlock and
+  GetMatrix() and GetMatrixDecoder() methods.
+
+  Returns internal representation of the state for taxon `i', character `j'. In the normal situation, `k' is 0 meaning
+  there is only one state with no uncertainty or polymorphism. If there are multiple states, specify a number in the
+  range [0..n) where n is the number of states returned by the GetNumStates function. Use the IsPolymorphic
+  function to determine whether the multiple states correspond to uncertainty in state assignment or polymorphism in
+  the taxon. The value returned from this function is one of the following:
+  ~
+  o -3 means gap state (see note below)
+  o -2 means missing state (see note below)
+  o an integer 0 or greater is internal representation of a state
+  ~
+  Note: gap and missing states are actually represented internally in a different way; for a description of the actual
+  internal representation of states, see the documentation for NxsDiscreteDatum.
+
+*/
+inline NxsDiscreteStateCell NxsCharactersBlock::GetInternalRepresentation(
+									  unsigned i,	/* the taxon in range [0..`ntax') */
+									  unsigned j,	/* the character in range [0..`nchar') */
+									  unsigned k) NCL_COULD_BE_CONST /* the 0-offset index of state to return */ /*v2.1to2.2 1 */
+{
+  if (IsGapState(i, j))
+    return -3;
+  else if (IsMissingState(i, j))
+    return -2;
+  else
+    return GetStateIndex(i, j, k);
+}
+
+/*!
+  Returns the missing data symbol currently in effect. If no missing data symbol specified, returns '\0'.
+*/
+inline char NxsCharactersBlock::GetMissingSymbol() const
+{
+  return missing;
+}
+
+/*!
+  Name change to reinforce the change in meaning -- in NCL after 2.1 this will behaves just like the
+  GetNCharTotal(). It returns the number of characters in the matrix (regardless of whether they have been excluded).
+  The old GetNChar() function is now called GetNumIncludedChars();
+*/
+inline unsigned NxsCharactersBlock::GetNumChar() const
+{
+  return nChar;
+}
+
+/*!
+  Note the change in meaning -- in NCL after 2.1 this will behaves just like the
+  GetNCharTotal(). It returns the number of characters in the matrix (regardless of whether they have been excluded).
+  The old GetNChar() function is now called GetNumIncludedChars();
+*/
+inline unsigned NxsCharactersBlock::GetNChar() const
+{
+  return nChar;
+}
+
+/*!
+  Returns the number of characters which are not excluded (or eliminated) this number is <= GetNumChar()
+*/
+inline unsigned NxsCharactersBlock::GetNumIncludedChars() const
+{
+  return (unsigned)nChar - (unsigned)excluded.size();
+}
+
+
+inline unsigned NxsCharactersBlock::GetNCharTotal()
+{
+  return nChar;
+}
+
+inline unsigned NxsCharactersBlock::GetNCharTotal() const
+{
+  return nChar;
+}
+
+inline unsigned NxsCharactersBlock::GetNTaxWithData() const
+{
+  return nTaxWithData;
+}
+
+/*!
+  Returns the number of characters eliminated with the ELIMINATE command.
+*/
+inline unsigned NxsCharactersBlock::GetNumEliminated() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+{
+  return (unsigned)eliminated.size();
+}
+
+/*!
+  Returns the number of stored equates associations.
+*/
+inline unsigned NxsCharactersBlock::GetNumUserEquates() const
+{
+  return (unsigned)(userEquates.size());
+}
+
+/*!
+  Returns the number of stored equates associations.
+*/
+inline unsigned NxsCharactersBlock::GetNumEquates() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+{
+  return (unsigned)(userEquates.size() + defaultEquates.size());
+}
+
+/*!
+  Returns the number of actual columns in `matrix'. This number is equal to `nchar', but can be smaller than
+  `ncharTotal' since the user could have eliminated some of the characters.
+*/
+inline unsigned NxsCharactersBlock::GetNumMatrixCols() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+{
+  return nChar;
+}
+
+/*!
+  Returns the number of actual rows in `matrix'. This number is equal to `ntax', but can be smaller than `ntaxTotal'
+  since the user did not have to provide data for all taxa specified in the TAXA block.
+*/
+inline unsigned NxsCharactersBlock::GetNumMatrixRows() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+{
+  return GetNTaxTotal();
+}
+
+inline NxsDiscreteStateCell NxsCharactersBlock::GetStateIndex(
+							      unsigned taxInd,	/* the taxon in range [0..`ntax') */
+							      unsigned charInd, /* the character in range [0..`nchar') */
+							      unsigned k) const
+{
+  const NxsDiscreteDatatypeMapper * currMapper =	GetDatatypeMapperForChar(charInd);
+  NCL_ASSERT(currMapper);
+  const NxsDiscreteStateRow & row = GetDiscreteMatrixRow(taxInd);
+  NCL_ASSERT(row.size() > charInd);
+  return currMapper->GetOneStateForCode(row[charInd], k);
+}
+/*! Returns symbol from symbols list representing the state for taxon `i' and character `j'.
+
+  The normal situation in which there is only one state with no uncertainty or polymorphism is
+  represented by `k' = 0.
+  If there are multiple states, specify a number in the range [0..n) where n is the number of states
+  returned by the GetNumStates function.
+  Use the IsPolymorphic function to determine whether the multiple states correspond to uncertainty in state
+  assignment or polymorphism in the taxon. Assumes `symbols' is non-NULL.
+
+  \warning{In NEXUS it is possible (via the TOKENS mode) to introduce a dataype that does not have unique single
+  char symbols for each state. This function is not guaranteed to succeed in such cases.
+  The NxsDiscreteDatatypeMapper method of accessing characters is more robust (and faster).
+  see \ref NxsCharacterBlockQueries
+  }
+*/
+inline char NxsCharactersBlock::GetState(
+					 unsigned i,	/* the taxon in range [0..`ntax') */
+					 unsigned j,	/* the character in range [0..`nchar') */
+					 unsigned k) const	/* the 0-offset index of the state to return */
+{
+  NCL_ASSERT(!symbols.empty());
+  const NxsDiscreteStateCell p = GetStateIndex(i, j, k);
+  if (p < 0)
+    {
+      NCL_ASSERT(p == NXS_GAP_STATE_CODE);
+      return gap;
+    }
+  NCL_ASSERT(p < (int)symbols.length());
+  return symbols[(int)p];
+}
+
+/*! \returns The symbols string	Warning: returned value may be NULL.
+ */
+inline const char *NxsCharactersBlock::GetSymbols() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+{
+  return symbols.c_str();
+}
+
+/*!
+  Returns label for taxon number `i' (`i' ranges from 0 to `ntax' - 1).
+*/
+inline NxsString NxsCharactersBlock::GetTaxonLabel( /*v2.1to2.2 4 */
+						   unsigned i) const	/* the taxon's position in the taxa block */
+{
+  NxsString s = taxa->GetTaxonLabel(i); /*v2.1to2.2 4 */
+  return s;
+}
+
+inline bool NxsCharactersBlock::TaxonIndHasData(
+						unsigned taxInd) const /* the character in question, in the range [0..`nchar') */
+{
+  if (datatype == continuous)
+    return (taxInd < continuousMatrix.size() && !continuousMatrix[taxInd].empty());
+  return (taxInd < discreteMatrix.size() && !discreteMatrix[taxInd].empty());
+}
+
+
+inline const NxsUnsignedSet & NxsCharactersBlock::GetExcludedIndexSet() const
+{
+  return excluded;
+}
+
+inline bool NxsCharactersBlock::IsActiveChar(
+					     unsigned j) const	/* the character in question, in the range [0..`nchar') */
+{
+  return (j < nChar && excluded.count(j) == 0);
+}
+
+
+/*!
+  Returns true if character `j' has been excluded. If character `j' is active, returns false. Assumes `j' is in the
+  range [0..`nchar').
+*/
+inline bool NxsCharactersBlock::IsExcluded(
+					   unsigned j) const	/* the character in question, in the range [0..`nchar') */
+{
+  return !IsActiveChar(j);
+}
+
+inline bool NxsCharactersBlock::IsActiveChar(
+					     unsigned j) /* the character in question, in the range [0..`nchar') */
+{
+  return (j < nChar && excluded.count(j) == 0);
+}
+
+
+/*!
+  Returns true if character `j' has been excluded. If character `j' is active, returns false. Assumes `j' is in the
+  range [0..`nchar').
+*/
+inline bool NxsCharactersBlock::IsExcluded(
+					   unsigned j) /* the character in question, in the range [0..`nchar') */
+{
+  return !IsActiveChar(j);
+}
+
+
+/*!
+  Returns true if INTERLEAVE was specified in the FORMAT command, false otherwise.
+*/
+inline bool NxsCharactersBlock::IsInterleave() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+{
+  return interleaving;
+}
+
+/*!
+  Returns true if LABELS was specified in the FORMAT command, false otherwise.
+*/
+inline bool NxsCharactersBlock::IsLabels() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+{
+  return labels;
+}
+
+/*!
+  Returns true if RESPECTCASE was specified in the FORMAT command, false otherwise.
+*/
+inline bool NxsCharactersBlock::IsRespectCase() const
+{
+  return respectingCase;
+}
+
+/*!
+  Returns true if TOKENS was specified in the FORMAT command, false otherwise.
+*/
+inline bool NxsCharactersBlock::IsTokens() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+{
+  return tokens;
+}
+
+/*!
+  Returns true if TRANSPOSE was specified in the FORMAT command, false otherwise.
+*/
+inline bool NxsCharactersBlock::IsTranspose() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+{
+  return transposing;
+}
+
+/*! Converts a taxon label to a number corresponding to the taxon's position within the list maintained by the
+  NxsTaxaBlockAPI object. This method overrides the virtual function of the same name in the NxsBlock base class. If
+  `s' is not a valid taxon label, returns the value 0.
+*/
+inline unsigned NxsCharactersBlock::TaxonLabelToNumber(
+						       NxsString s) const	/* the taxon label to convert */ /*v2.1to2.2 4 */
+{
+  try
+    {
+      return 1 + taxa->FindTaxon(s);
+    }
+  catch(NxsTaxaBlock::NxsX_NoSuchTaxon)
+    {
+    }
+
+  return 0;
+}
+
+
+inline VecBlockPtr NxsCharactersBlock::GetImpliedBlocks()
+{
+  return GetCreatedTaxaBlocks();
+}
+
+inline const std::string & NxsCharactersBlock::GetBlockName() const
+{
+  return NCL_BLOCKTYPE_ATTR_NAME;
+}
+inline void NxsCharactersBlock::HandleLinkCommand(NxsToken & token)
+{
+  HandleLinkTaxaCommand(token);
+}
+inline void NxsCharactersBlock::WriteLinkCommand(std::ostream &out) const
+{
+  WriteLinkTaxaCommand(out);
+}
+
+
+inline NxsCharactersBlock::StatesFormatEnum NxsCharactersBlock::GetStatesFormat() const
+{
+  return statesFormat;
+}
+
+inline	unsigned NxsCharactersBlock::CharLabelToNumber(NxsString s) NCL_COULD_BE_CONST /*v2.1to2.2 d */
+{ /*v2.1to2.2 d */
+  const NxsCharactersBlock *b = (const NxsCharactersBlock *)(this); /*v2.1to2.2 d */
+  return b->CharLabelToNumber(s); /*v2.1to2.2 d */
+} /*v2.1to2.2 d */
+
+/*!
+  Returns true if character with `charIndex' (0-based index) was eliminated, false otherwise.
+*/
+inline bool NxsCharactersBlock::IsEliminated(
+					     unsigned charIndex) NCL_COULD_BE_CONST /* the character in question */ /*v2.1to2.2 1 */
+{
+  return eliminated.count(charIndex) > 0 ;
+}
+
+/*
+  Returns an alias to the NxsDiscreteDatatypeMapper for character index.
+  NULL will be returned if the NxsCharactersBlock is not fully initialized or
+  if the block stores continuous characters.
+  The pointer is only guaranteed to be valid until the NxsCharactersBlock is modified.
+  (so do not store for long term usage).
+*/
+inline const NxsDiscreteDatatypeMapper * NxsCharactersBlock::GetDatatypeMapperForChar(unsigned charIndex) const
+{
+  NxsCharactersBlock *mt = const_cast<NxsCharactersBlock *>(this);
+  return mt->GetMutableDatatypeMapperForChar(charIndex);
+}
+
+inline const NxsDiscreteDatatypeMapper & NxsCharactersBlock::GetDatatypeMapperForCharRef(unsigned charIndex) const
+{
+  const NxsDiscreteDatatypeMapper * dm = this->GetDatatypeMapperForChar(charIndex);
+  NCL_ASSERT(dm);
+  return *dm;
+}
+
+inline const NxsDiscreteStateRow & NxsCharactersBlock::GetDiscreteMatrixRow(unsigned int taxIndex) const
+{
+  return discreteMatrix.at(taxIndex);
+}
+
+inline const NxsCharactersBlock::ContinuousCharRow & NxsCharactersBlock::GetContinuousMatrixRow(unsigned taxIndex) const
+{
+  return continuousMatrix.at(taxIndex);
+}
+
+/*!
+  Returns an alias to the NxsDiscreteDatatypeMapper for character index.
+  NULL will be returned if the NxsCharactersBlock is not fully initialized or
+  if the block stores continuous characters.
+  The pointer is only guaranteed to be valid until the NxsCharactersBlock is modified.
+  (so do not store for long term usage).
+*/
+inline NxsDiscreteDatatypeMapper * NxsCharactersBlock::GetMutableDatatypeMapperForChar(unsigned int charIndex)
+{
+  if (datatypeMapperVec.size() == 1)
+    return &(datatypeMapperVec[0].first);
+  for (VecDatatypeMapperAndIndexSet::iterator dmvIt = datatypeMapperVec.begin(); dmvIt != datatypeMapperVec.end(); ++dmvIt)
+    {
+      const NxsUnsignedSet & currCS = dmvIt->second;
+      if (currCS.count(charIndex) > 0)
+	return &(dmvIt->first);
+    }
+  return NULL;
+}
+
+inline std::vector<const NxsDiscreteDatatypeMapper *> NxsCharactersBlock::GetAllDatatypeMappers() const
+{
+  std::vector<const NxsDiscreteDatatypeMapper *> v;
+  for (VecDatatypeMapperAndIndexSet::const_iterator dmvIt = datatypeMapperVec.begin(); dmvIt != datatypeMapperVec.end(); ++dmvIt)
+    v.push_back(&(dmvIt->first));
+  return v;
+}
+
+inline void NxsDiscreteDatatypeMapper::WriteStateCodeRowAsNexus(std::ostream & out, const NxsDiscreteStateRow &row) const
+{//@mth optimize
+  std::vector<NxsDiscreteStateCell>::const_iterator b = row.begin();
+  const std::vector<NxsDiscreteStateCell>::const_iterator e = row.end();
+  WriteStateCodeRowAsNexus(out, b, e);
+}
+
+inline void NxsDiscreteDatatypeMapper::WriteStateCodeRowAsNexus(std::ostream & out, NxsDiscreteStateRow::const_iterator & begIt, const NxsDiscreteStateRow::const_iterator & endIt) const
+{//@mth optimize
+  for (; begIt != endIt; ++begIt)
+    WriteStateCodeAsNexusString(out, *begIt, true);
+}
+
+
+/*!
+  Returns true if this set replaces an older definition.
+*/
+inline bool NxsCharactersBlock::AddNewIndexSet(const std::string &label, const NxsUnsignedSet & inds)
+{
+  NxsString ls(label.c_str());
+  bool replaced = charSets.count(ls) > 0;
+  charSets[ls] = inds;
+  return replaced;
+}
+
+
+
+/*!
+  Returns true if this set replaces an older definition.
+*/
+inline bool NxsCharactersBlock::AddNewPartition(const std::string &label, const NxsPartition & inds)
+{
+  NxsString ls(label.c_str());
+  ls.ToUpper();
+  bool replaced = charPartitions.count(ls) > 0;
+  charPartitions[ls] = inds;
+  return replaced;
+}
+
+
+
+/*!
+  Returns the number of indices that correspond to the label (and the number
+  of items that would be added to *inds if inds points to an empty set).
+*/
+inline unsigned NxsCharactersBlock::GetIndicesForLabel(const std::string &label, NxsUnsignedSet *inds) const
+{
+  NxsString emsg;
+  const unsigned numb = CharLabelToNumber(label);
+  if (numb != 0)
+    {
+      if (inds)
+	inds->insert(numb - 1);
+      return 1;
+    }
+  if (!defCodonPosPartitionName.empty())
+    {
+      std::string t(label);
+      NxsString::to_upper(t);
+      std::string n;
+      if (t == "POS1")
+	n.assign("1");
+      else if (t == "POS2")
+	n.assign("2");
+      else if (t == "POS3")
+	n.assign("3");
+      else if (t == "NONCODING")
+	n.assign("N");
+      if (!n.empty())
+	{
+	  NxsPartitionsByName::const_iterator pit = codonPosPartitions.find(defCodonPosPartitionName);
+	  if (pit != codonPosPartitions.end())
+	    {
+	      const NxsPartition & p = pit->second;
+	      for (NxsPartition::const_iterator s = p.begin(); s != p.end(); ++s)
+		{
+		  if (NxsString::case_insensitive_equals(n.c_str(), s->first.c_str()))
+		    {
+		      unsigned nel = (unsigned)s->second.size();
+		      if (inds)
+			inds->insert(s->second.begin(), s->second.end());
+		      return nel;
+		    }
+		}
+	    }
+	}
+    }
+  if (NxsString::case_insensitive_equals(label.c_str(), "CONSTANT"))
+    {
+      NxsUnsignedSet c;
+      FindConstantCharacters(c);
+      if (inds)
+	inds->insert(c.begin(), c.end());
+      return (unsigned)c.size();
+    }
+  if (NxsString::case_insensitive_equals(label.c_str(), "GAPPED"))
+    {
+      NxsUnsignedSet c;
+      FindGappedCharacters(c);
+      if (inds)
+	inds->insert(c.begin(), c.end());
+      return (unsigned)c.size();
+    }
+  return GetIndicesFromSetOrAsNumber(label, inds, charSets, GetMaxIndex(), "character");
+}
+
+inline unsigned NxsCharactersBlock::GetMaxIndex() const
+{
+  unsigned nct = GetNCharTotal();
+  if (nct == 0)
+    return UINT_MAX;
+  return nct - 1;
+}
+
+#endif
diff --git a/lib/ncl-2.1.18/ncl/nxscharactersblock.lo b/lib/ncl-2.1.18/ncl/nxscharactersblock.lo
new file mode 100644
index 0000000..8b9e319
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxscharactersblock.lo
@@ -0,0 +1,12 @@
+# nxscharactersblock.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nxscharactersblock.o'
+
+# Name of the non-PIC object
+non_pic_object='nxscharactersblock.o'
+
diff --git a/lib/ncl-2.1.18/ncl/nxscxxdiscretematrix.cpp b/lib/ncl-2.1.18/ncl/nxscxxdiscretematrix.cpp
new file mode 100644
index 0000000..eab9c14
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxscxxdiscretematrix.cpp
@@ -0,0 +1,512 @@
+//	Copyright (C) 2008 Mark Holder
+//
+//	This file is part of NCL (Nexus Class Library) version 2.1
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+#include <iterator>
+#include "ncl/nxscxxdiscretematrix.h"
+#include "ncl/nxsutilcopy.h"
+#include <cassert>
+using std::string;
+using std::vector;
+using std::cout;
+using std::endl;
+
+/**===========================================================================
+| fills compressedTransposedMatrix and empties patternSet
+|
+| If `originalIndexToCompressed` or `compressedIndexToOriginal` are requested
+|   then the `compressedIndexPattern` mapping must be supplied. `compressedIndexPattern`
+|   must contain pointers to the keys in `patternSet.` Note that these will 
+|   be invalid after the call because patternSet will be emptied).
+*/
+void NxsConsumePatternSetToPatternVector(
+  std::set<NxsCharacterPattern> & patternSet, /* INPUT matrix that will hold the compressed columns */
+  std::vector<NxsCharacterPattern> & compressedTransposedMatrix, /* OUTPUT matrix that will hold the compressed columns */
+  const std::vector<const NxsCharacterPattern *> * compressedIndexPattern, /** INPUT This mapping must be provided if either  `originalIndexToCompressed` or `compressedIndexToOriginal` is requested */
+  std::vector<int> * originalIndexToCompressed, /** OUTPUT if not 0L, this will be filled to provide map an index in `mat` to the corresponding index in `compressedTransposedMatrix` (-1 in the vector indicates that the character was not included) */
+  std::vector<std::set<unsigned> > * compressedIndexToOriginal) /** OUTPUT  if not 0L, this will be filled to provide a map from an index in `compressedTransposedMatrix` to the original character count */
+{
+    const unsigned patternIndexOffset = (unsigned const)compressedTransposedMatrix.size();
+    const unsigned numCompressedPatterns = (unsigned const)patternSet.size();
+    if (originalIndexToCompressed != 0L || compressedIndexToOriginal != 0L)
+        {
+        if (compressedIndexPattern == 0L)
+            throw NxsException("compressedIndexPattern must be provided in ConsumePatternSetToPatternVector if mappings are requested");
+        unsigned patternIndex = 0;
+        for (std::set<NxsCharacterPattern>::iterator pIt = patternSet.begin(); pIt != patternSet.end(); ++pIt, ++patternIndex)
+            {
+            pIt->patternIndex = patternIndex + patternIndexOffset;
+            }
+        if (originalIndexToCompressed)
+            originalIndexToCompressed->resize(compressedIndexPattern->size());
+        if (compressedIndexToOriginal)
+            {
+            compressedIndexToOriginal->clear();
+            compressedIndexToOriginal->resize(numCompressedPatterns);
+            }
+        for (unsigned i = 0; i < compressedIndexPattern->size(); ++ i)
+            {
+            const NxsCharacterPattern * pat = (*compressedIndexPattern)[i];
+            if (pat)
+                {
+                if (originalIndexToCompressed)
+                    (*originalIndexToCompressed)[i] = pat->patternIndex;
+                if (compressedIndexToOriginal)
+                    {
+                    NCL_ASSERT(pat->patternIndex < numCompressedPatterns);
+                    compressedIndexToOriginal->at(pat->patternIndex).insert(i);
+                    }
+                }
+            else
+                {
+                if (originalIndexToCompressed)
+                    (*originalIndexToCompressed)[i] = -1;
+                }
+            }
+        }
+    compressedTransposedMatrix.reserve(numCompressedPatterns);
+    for (std::set<NxsCharacterPattern>::iterator pIt = patternSet.begin(); pIt != patternSet.end();)
+        {
+        compressedTransposedMatrix.push_back(*pIt);
+        std::set<NxsCharacterPattern>::iterator prevIt = pIt++;
+        patternSet.erase(prevIt);
+        }
+    patternSet.clear();
+}
+
+
+unsigned NxsCompressDiscreteMatrix(
+  const NxsCXXDiscreteMatrix & mat,			/**< is the data source */
+  std::set<NxsCharacterPattern> & patternSet, /* matrix that will hold the compressed columns */
+  std::vector<const NxsCharacterPattern *> * compressedIndexPattern, /** if not 0L, this will be filled to provide a map from an index in `compressedTransposedMatrix` to the original character count */
+  const NxsUnsignedSet * taxaToInclude,	/**< if not 0L, this should be  the indices of the taxa in `mat` to include (if 0L all characters will be included). Excluding taxa will result in shorter patterns (the skipped taxa will not be filled with empty codes, instead the taxon indexing will be frameshifted -- the client code must keep track of these frameshifts). */
+  const NxsUnsignedSet * charactersToInclude)
+    {
+    const unsigned origNumPatterns = (unsigned) patternSet.size();
+	unsigned ntax = mat.getNTax();
+	unsigned patternLength = ntax;
+	unsigned nchar = mat.getNChar();
+	if (compressedIndexPattern)
+	    {
+	    compressedIndexPattern->resize(nchar);
+	    }
+	NxsUnsignedSet allTaxaInds;
+	if (taxaToInclude)
+	    {
+	    if (taxaToInclude->empty())
+	        return 0; // might want to warn about this!
+	    const unsigned lastTaxonIndex = *(taxaToInclude->rbegin());
+	    if (lastTaxonIndex >= ntax)
+	        throw NxsException("Taxon index in taxaToInclude argument to NxsCompressDiscreteMatrix is out of range");
+        patternLength -= taxaToInclude->size();
+	    }
+    else
+        {
+        for (unsigned i = 0; i < ntax; ++i)
+            allTaxaInds.insert(i);
+        taxaToInclude = &allTaxaInds;
+        }
+	if (charactersToInclude)
+	    {
+	    if (charactersToInclude->empty())
+	        return 0; // might want to warn about this!
+	    const unsigned lastColumnIndex = *(charactersToInclude->rbegin());
+	    if (lastColumnIndex >= nchar)
+	        throw NxsException("Character index in charactersToInclude argument to NxsCompressDiscreteMatrix is out of range");
+	    }
+
+    // Create actingWeights vector and copy the integer weights from mat into it
+    // If there are no integer weights in mat, copy the floating point weights instead
+    // if floating point weights have been defined
+	const std::vector<int> & iwts = mat.getIntWeightsConst();
+	std::vector<double> actingWeights(nchar, 1.0);
+	bool weightsSpecified = false;
+	bool weightsAsInts = false;
+	if (!iwts.empty())
+		{
+		NCL_ASSERT(iwts.size() >= nchar);
+		weightsSpecified = true;
+		weightsAsInts = true;
+		for (unsigned j = 0; j < nchar; ++j)
+			actingWeights[j] = (double)iwts.at(j);
+		}
+	else
+		{
+		const std::vector<double> & dwts = mat.getDblWeightsConst();
+		if (!dwts.empty())
+			{
+    		weightsSpecified = true;
+			actingWeights = dwts;
+			NCL_ASSERT(actingWeights.size() == nchar);
+			}
+		}
+
+    // Set corresponding actingWeights elements to zero if any characters have been excluded in mat
+	const NxsUnsignedSet & excl = mat.getExcludedCharIndices();
+	for (NxsUnsignedSet::const_iterator eIt = excl.begin(); eIt != excl.end(); ++eIt)
+		{
+		NCL_ASSERT(*eIt < nchar);
+		actingWeights[*eIt] = 0.0;
+		}
+	const double * wts = &(actingWeights[0]);
+	
+	NxsCharacterPattern patternTemp;
+    patternTemp.count = 1;
+	for (unsigned j = 0; j < nchar; ++j)
+		{
+        double patternWeight = wts[j];
+        bool shouldInclude = (charactersToInclude == 0L || (charactersToInclude->find(j) != charactersToInclude->end()));
+        if (patternWeight > 0.0 &&  shouldInclude)
+            {
+            // Build up a vector representing the pattern of state codes at this site
+            patternTemp.stateCodes.clear();
+            patternTemp.stateCodes.reserve(patternLength);
+            patternTemp.sumOfPatternWeights = patternWeight;
+
+            unsigned indexInPattern = 0;
+            for (NxsUnsignedSet::const_iterator taxIndIt = taxaToInclude->begin(); taxIndIt != taxaToInclude->end(); ++taxIndIt, ++indexInPattern)
+                {
+                const unsigned taxonIndex = *taxIndIt;
+                const NxsCDiscreteStateSet * row	= mat.getRow(taxonIndex);
+                const NxsCDiscreteStateSet code = row[j];
+                patternTemp.stateCodes.push_back(code);
+                }
+            NCL_ASSERT(indexInPattern == patternLength);
+
+            std::set<NxsCharacterPattern>::iterator lowBoundLoc = patternSet.lower_bound(patternTemp);
+            if ((lowBoundLoc == patternSet.end()) || (patternTemp < *lowBoundLoc))
+                {
+                std::set<NxsCharacterPattern>::iterator insertedIt = patternSet.insert(lowBoundLoc, patternTemp);
+                if (compressedIndexPattern)
+                    {
+                    const NxsCharacterPattern & patInserted = *insertedIt;
+                    (*compressedIndexPattern)[j] = &patInserted;
+                    }
+                }
+            else
+                {
+                NCL_ASSERT(patternTemp == *lowBoundLoc);
+                lowBoundLoc->sumOfPatternWeights += patternWeight;
+                lowBoundLoc->count += 1;
+                if (compressedIndexPattern)
+                    {
+                    (*compressedIndexPattern)[j] = &(*lowBoundLoc);
+                    }
+                }
+            }
+		}
+	return (unsigned)patternSet.size() - origNumPatterns;	
+    }
+
+/*----------------------------------------------------------------------------------------------------------------------
+|	Copies data from `mat' to `pattern_vect' and `pattern_counts'. The `pattern_vect' vector holds the patterns while
+|	`pattern_counts' holds the count of the number of sites having each pattern. Additionally, the vectors 
+|	`pattern_to_sites' and `charIndexToPatternIndex' are built: `pattern_to_sites' allows you to get a list of sites
+|	given a specific pattern, and `charIndexToPatternIndex' lets you find the index of a pattern in `pattern_vect' and
+|	`pattern_counts' given an original site index.
+*/
+unsigned NxsCompressDiscreteMatrix(
+  const NxsCXXDiscreteMatrix & mat,
+  std::vector<NxsCharacterPattern> & compressedTransposedMatrix,
+  std::vector<int> * originalIndexToCompressed,
+  std::vector<std::set<unsigned> > * compressedIndexToOriginal,
+  const NxsUnsignedSet * taxaToInclude,
+  const NxsUnsignedSet * charactersToInclude)
+	{
+	std::set<NxsCharacterPattern> patternSet;
+	std::vector<const NxsCharacterPattern *> toPatternMap;
+	std::vector<const NxsCharacterPattern *> *toPatternMapPtr = 0L;
+	if (originalIndexToCompressed != 0L || compressedIndexToOriginal != 0L)
+	    toPatternMapPtr = &toPatternMap;
+
+	NxsCompressDiscreteMatrix(mat, patternSet, toPatternMapPtr, taxaToInclude, charactersToInclude);
+    const unsigned numPatternsAdded = (unsigned const)patternSet.size();
+	
+	NxsConsumePatternSetToPatternVector(patternSet, compressedTransposedMatrix, toPatternMapPtr, originalIndexToCompressed, compressedIndexToOriginal);
+	return numPatternsAdded;
+	}
+
+void NxsTransposeCompressedMatrix(
+  const std::vector<NxsCharacterPattern> & compressedTransposedMatrix, 
+  ScopedTwoDMatrix<NxsCDiscreteStateSet> & destination,
+  std::vector<unsigned> * patternCounts,
+  std::vector<double> * patternWeights)
+{
+	const unsigned npatterns = (unsigned const)compressedTransposedMatrix.size();
+	if (npatterns == 0)
+	    {
+	    destination.Initialize(0, 0);
+	    return;
+	    }
+	const unsigned ntaxa = (unsigned const)compressedTransposedMatrix[0].stateCodes.size();
+	destination.Initialize(ntaxa, npatterns);
+    NxsCDiscreteStateSet ** matrix = destination.GetAlias();			/** taxa x characters matrix of indices of state sets */
+    if (patternCounts)
+        patternCounts->resize(npatterns);
+    if (patternWeights)
+        patternWeights->resize(npatterns);
+	for (unsigned p = 0; p < npatterns; ++p)
+		{
+		const NxsCharacterPattern & pattern = compressedTransposedMatrix[p];
+		const std::vector<NxsCDiscreteState_t> & states = pattern.stateCodes;
+		for (unsigned t = 0; t < ntaxa; ++t)
+		    matrix[t][p] = states[t];
+        if (patternCounts)
+            (*patternCounts)[p] = pattern.count;
+        if (patternWeights)
+            (*patternWeights)[p] = pattern.sumOfPatternWeights;
+		}
+}
+
+NxsCXXDiscreteMatrix::NxsCXXDiscreteMatrix(const NxsCharactersBlock & cb, bool gapsToMissing, const NxsUnsignedSet * toInclude, bool standardizeCoding)
+	{
+	Initialize(&cb, gapsToMissing, toInclude, standardizeCoding);
+	}
+
+void NxsCXXDiscreteMatrix::Initialize(const NxsCharactersBlock * cb, bool gapsToMissing, const NxsUnsignedSet * toInclude, bool standardizeCoding)
+{
+	this->nativeCMatrix.stateList = 0L;
+	this->nativeCMatrix.stateListPos = 0L;
+	this->nativeCMatrix.matrix = 0L;
+	this->nativeCMatrix.symbolsList = 0L;
+	this->nativeCMatrix.nStates = 0;
+	this->nativeCMatrix.nChar = 0;
+	this->nativeCMatrix.nTax = 0L;
+	this->nativeCMatrix.nObservedStateSets = 0;
+	this->nativeCMatrix.datatype = NxsAltGeneric_Datatype;
+	this->symbolsStringAlias.clear();
+	this->matrixAlias.Initialize(0, 0);
+	this->stateListAlias.clear();
+	this->stateListPosAlias.clear();
+	this->intWts.clear();
+	this->dblWts.clear();
+	this->activeExSet.clear();
+	if (cb == NULL)
+		return;
+	std::vector<const NxsDiscreteDatatypeMapper *> mappers = cb->GetAllDatatypeMappers();
+	if (mappers.empty() || mappers[0] == NULL)
+		throw NxsException("no mappers");
+
+	std::set <const NxsDiscreteDatatypeMapper * > usedMappers;
+	NxsUnsignedSet scratchSet;
+	if (toInclude == 0L)
+		{
+		for (unsigned i = 0; i < cb->GetNChar(); ++i)
+			scratchSet.insert(i);
+		toInclude = & scratchSet;
+	 	}
+	for (NxsUnsignedSet::const_iterator indIt = toInclude->begin(); indIt != toInclude->end(); ++indIt)
+		{
+		unsigned charIndex = *indIt;
+		usedMappers.insert(cb->GetDatatypeMapperForChar(charIndex));
+		}
+	
+	
+	if (usedMappers.size() > 1)
+		throw NxsException("too many mappers");
+	if (usedMappers.empty())
+		throw NxsException("no mappers - or empty charset");
+	
+
+	const NxsDiscreteDatatypeMapper & mapper = **usedMappers.begin();
+	const NxsDiscreteStateMatrix & rawMatrix = cb->GetRawDiscreteMatrixRef();
+
+	NxsCharactersBlock::DataTypesEnum inDatatype = mapper.GetDatatype();
+	if (inDatatype < LowestNxsCDatatype || inDatatype > HighestNxsCDatatype)
+		throw NxsException("Datatype cannot be converted to NxsCDiscreteMatrix");
+	this->nativeCMatrix.datatype = NxsAltDatatypes(inDatatype);
+	this->nativeCMatrix.nStates = mapper.GetNumStates();
+	const std::string fundamentalSymbols = mapper.GetSymbols();
+	const std::string fundamentalSymbolsPlusGaps = mapper.GetSymbolsWithGapChar();
+	const bool hadGaps = !(fundamentalSymbols == fundamentalSymbolsPlusGaps);
+
+	this->symbolsStringAlias = fundamentalSymbols;
+	char missingSym = cb->GetMissingSymbol();
+	const NxsCDiscreteState_t newMissingStateCode = (standardizeCoding ? (NxsCDiscreteState_t) this->nativeCMatrix.nStates : (NxsCDiscreteState_t) NXS_MISSING_CODE);
+	NCL_ASSERT((int)NXS_MISSING_CODE < 0);
+	NCL_ASSERT((int)NXS_GAP_STATE_CODE < 0);
+	NxsDiscreteStateCell sclOffsetV;
+	if (hadGaps)
+		sclOffsetV = std::min((NxsDiscreteStateCell)NXS_GAP_STATE_CODE, (NxsDiscreteStateCell)NXS_MISSING_CODE);
+	else
+		sclOffsetV = NXS_MISSING_CODE;
+	const NxsDiscreteStateCell sclOffset(sclOffsetV);
+
+	const NxsDiscreteStateCell negSCLOffset = -sclOffset;
+	const unsigned nMapperStateCodes = mapper.GetNumStateCodes();
+	const unsigned recodeVecLen = nMapperStateCodes;
+	const unsigned nMapperPosStateCodes = nMapperStateCodes + sclOffset;
+	std::vector<NxsCDiscreteState_t> recodeVec(recodeVecLen + negSCLOffset, -2);
+	NxsCDiscreteState_t * recodeArr = &recodeVec[negSCLOffset];
+
+	if (fundamentalSymbols.length() < this->nativeCMatrix.nStates)
+		throw NxsException("Fundamental states missing from the symbols string");
+	const unsigned nfun_sym = (const unsigned)fundamentalSymbols.length();
+	for (NxsCDiscreteState_t i = 0; i < (NxsCDiscreteState_t)this->nativeCMatrix.nStates; ++i)
+		{
+		if (i < (NxsCDiscreteState_t)nfun_sym && (NxsCDiscreteState_t)fundamentalSymbols[i] == '\0' && mapper.PositionInSymbols(fundamentalSymbols[i]) != (NxsDiscreteStateCell) i)
+			{
+			NCL_ASSERT(i >= (NxsCDiscreteState_t)nfun_sym || fundamentalSymbols[i] == '\0' || mapper.PositionInSymbols(fundamentalSymbols[i]) == (NxsDiscreteStateCell) i);
+			}
+#		if !defined (NDEBUG)
+			const std::set<NxsDiscreteStateCell>	 & ss =  mapper.GetStateSetForCode(i);
+			NCL_ASSERT(ss.size() == 1);
+			NCL_ASSERT(*ss.begin() == i);
+#		endif
+		stateListAlias.push_back(1);
+		stateListAlias.push_back(i);
+		stateListPosAlias.push_back((unsigned) 2*i);
+		recodeArr[i] = i;
+		}
+
+	//NXS_INVALID_STATE_CODE
+
+	if (hadGaps)
+		{
+		if (standardizeCoding)
+		    recodeArr[NXS_GAP_STATE_CODE] = ((hadGaps && gapsToMissing)? newMissingStateCode : -1);
+        else
+		    recodeArr[NXS_GAP_STATE_CODE] = NXS_GAP_STATE_CODE;
+        }
+
+	if (missingSym == '\0')
+		missingSym = (hadGaps ? mapper.GetGapSymbol() : '?');
+	else
+		{
+		NCL_ASSERT(NXS_MISSING_CODE == mapper.GetStateCodeStored(missingSym));
+		}
+	recodeArr[NXS_MISSING_CODE] = newMissingStateCode;
+	const unsigned nCodesInMissing  = this->nativeCMatrix.nStates + (gapsToMissing ?  0 : 1);
+	if (standardizeCoding)
+	    {
+	    this->symbolsStringAlias.append(1, missingSym);
+        stateListPosAlias.push_back(2*this->nativeCMatrix.nStates);
+        stateListAlias.push_back(nCodesInMissing);
+        if (!gapsToMissing)
+            stateListAlias.push_back(-1);
+        for (NxsCDiscreteState_t i = 0; i < (NxsCDiscreteState_t)this->nativeCMatrix.nStates; ++i)
+            stateListAlias.push_back(i);
+        }
+
+	NxsCDiscreteState_t nextStateCode = (standardizeCoding ? (newMissingStateCode + 1) : this->nativeCMatrix.nStates);
+	for (NxsDiscreteStateCell i = (NxsDiscreteStateCell)this->nativeCMatrix.nStates; i < (NxsDiscreteStateCell) nMapperPosStateCodes; ++i)
+		{
+		const std::set<NxsDiscreteStateCell>	 &ss = mapper.GetStateSetForCode( i);
+		const unsigned ns = (const unsigned)ss.size();
+		const bool mapToMissing  = (!mapper.IsPolymorphic(i) && (nCodesInMissing + 1 == ns || nCodesInMissing == ns));
+		if (mapToMissing)
+			recodeArr[i] = newMissingStateCode;
+		else
+			{
+			recodeArr[i] = nextStateCode++;
+			stateListPosAlias.push_back((unsigned)stateListAlias.size());
+			stateListAlias.push_back(ns);
+			for (std::set<NxsDiscreteStateCell>::const_iterator sIt = ss.begin(); sIt != ss.end(); ++sIt)
+				stateListAlias.push_back((NxsCDiscreteState_t) *sIt);
+			std::string stateName = mapper.StateCodeToNexusString(i);
+			if (stateName.length() != 1)
+				this->symbolsStringAlias.append(1, ' ');
+			else
+				this->symbolsStringAlias.append(1, stateName[0]);
+			}
+		}
+	NCL_ASSERT(stateListPosAlias.size() == (unsigned)nextStateCode);
+	NCL_ASSERT(symbolsStringAlias.size() == (unsigned)nextStateCode);
+	this->nativeCMatrix.nObservedStateSets = nextStateCode;
+
+	this->nativeCMatrix.nTax = (unsigned)rawMatrix.size();
+	this->nativeCMatrix.nChar = (this->nativeCMatrix.nTax == 0 ? 0 : toInclude->size());
+	this->matrixAlias.Initialize(this->nativeCMatrix.nTax, this->nativeCMatrix.nChar);
+	nativeCMatrix.matrix = matrixAlias.GetAlias();
+	const unsigned nt = this->nativeCMatrix.nTax;
+	const unsigned nc = this->nativeCMatrix.nChar;
+	for (unsigned r = 0; r < nt; ++r)
+		{
+		NxsCDiscreteStateSet	 * recodedRow = nativeCMatrix.matrix[r];
+		const std::vector<NxsDiscreteStateCell> & rawRowVec = rawMatrix[r];
+		if (rawRowVec.empty())
+			{
+			NxsCDiscreteState_t recodedMissing = recodeArr[NXS_MISSING_CODE];
+			for (unsigned c = 0; c < nc; ++c)
+				*recodedRow++ = recodedMissing;
+			}
+		else
+			{
+			NCL_ASSERT(rawRowVec.size() >= nc);
+			const NxsDiscreteStateCell * rawRow = &rawRowVec[0];
+		    NxsUnsignedSet::const_iterator includedIt = toInclude->begin();
+			for (unsigned c = 0; c < nc; ++c)
+				{
+				unsigned charIndex = *includedIt++;
+				const NxsDiscreteStateCell rawC = rawRow[charIndex];
+				if ((unsigned)(rawC +  negSCLOffset) >= recodeVecLen)
+					{
+					NCL_ASSERT((unsigned)(rawC +  negSCLOffset) < recodeVecLen);
+					}
+				NCL_ASSERT(rawC >= sclOffset);
+				const NxsCDiscreteState_t recodedC = recodeArr[rawC];
+				NCL_ASSERT(recodedC > -2 || !standardizeCoding);
+				NCL_ASSERT(recodedC < nextStateCode);
+				*recodedRow++ = recodedC;
+				}
+			}
+		}
+	nativeCMatrix.symbolsList = symbolsStringAlias.c_str();
+	nativeCMatrix.stateListPos = &stateListPosAlias[0];
+	nativeCMatrix.stateList = &stateListAlias[0];
+
+	intWts.clear();
+	dblWts.clear();
+	const NxsTransformationManager &tm = cb->GetNxsTransformationManagerRef();
+	intWts = tm.GetDefaultIntWeights();
+	if (intWts.empty())
+		dblWts = tm.GetDefaultDoubleWeights();
+	activeExSet = cb->GetExcludedIndexSet();
+}
+
+/**
+ *	Constructs  from the native C struct NxsCDiscreteMatrix
+ *		by deep copy.
+ */
+NxsCXXDiscreteMatrix::NxsCXXDiscreteMatrix(const NxsCDiscreteMatrix & mat)
+	:nativeCMatrix(mat),//aliases pointers, but we'll fix this below
+	symbolsStringAlias(mat.symbolsList),
+	matrixAlias(mat.nTax, mat.nChar),
+	stateListPosAlias(mat.stateListPos, (mat.stateListPos + mat.nObservedStateSets))
+	{
+	nativeCMatrix.symbolsList = symbolsStringAlias.c_str();
+	nativeCMatrix.stateListPos = &stateListPosAlias[0];
+	if (mat.nObservedStateSets > 0)
+		{
+		const unsigned lastStateIndex = nativeCMatrix.stateListPos[nativeCMatrix.nObservedStateSets - 1];
+		const unsigned lenAmbigList = lastStateIndex + mat.stateList[lastStateIndex] + 1;
+		//	cout << "lenAmbigList = "<< lenAmbigList <<endl;
+		stateListAlias.reserve(lenAmbigList);
+		ncl_copy(mat.stateList, (mat.stateList + lenAmbigList), std::back_inserter(stateListAlias));
+		}
+	nativeCMatrix.stateList = &stateListAlias[0];
+	nativeCMatrix.matrix = matrixAlias.GetAlias();
+
+	// cout << "Matrix in NxsCXXDiscreteMatrix ctor:" << mat.nTax << ' '<< mat.nChar<< endl;
+	for (unsigned i = 0; i < mat.nTax; ++i)
+		{
+		if (mat.nChar > 0)
+			ncl_copy(mat.matrix[i], mat.matrix[i] + mat.nChar, nativeCMatrix.matrix[i]);
+		}
+
+	}
+
diff --git a/lib/ncl-2.1.18/ncl/nxscxxdiscretematrix.h b/lib/ncl-2.1.18/ncl/nxscxxdiscretematrix.h
new file mode 100644
index 0000000..7192f76
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxscxxdiscretematrix.h
@@ -0,0 +1,264 @@
+//	Copyright (C) 2008 Mark Holder
+//
+//	This file is part of NCL (Nexus Class Library) version 2.1
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+
+#if !defined(NXS_CXX_DISCRETE_MATRIX_H)
+#define NXS_CXX_DISCRETE_MATRIX_H
+
+#include <string>
+#include <vector>
+#include "ncl/nxsdefs.h"
+#include "ncl/nxsallocatematrix.h"
+#include "ncl/nxscharactersblock.h"
+#include "ncl/nxscdiscretematrix.h"
+
+class NxsCharacterPattern;
+	/**
+	 * A C++ class that wraps a CDiscretMatrix in order to handle the memory
+	 management more cleanly. This is intended to be an alternate, low-level way
+	 to get character data out of a NxsCharactersBlock
+	 */
+class NxsCXXDiscreteMatrix
+	{
+	public:
+		NxsCXXDiscreteMatrix()
+			{
+			Initialize(0L, false);
+			}
+		NxsCXXDiscreteMatrix(const NxsCDiscreteMatrix & );
+		NxsCXXDiscreteMatrix(const NxsCharactersBlock & cb, bool convertGapsToMissing, const NxsUnsignedSet * toInclude = 0L, bool standardizeCoding = true);
+
+		void Initialize(const NxsCharactersBlock * cb, bool convertGapsToMissing, const NxsUnsignedSet * toInclude = 0L, bool standardizeCoding = true);
+
+		const NxsCDiscreteMatrix & getConstNativeC() const
+			{
+			return nativeCMatrix;
+			}
+
+		NxsCDiscreteMatrix & getNativeC()
+			{
+			return nativeCMatrix;
+			}
+
+		unsigned	getNChar() const
+			{
+			return nativeCMatrix.nChar;
+			}
+
+		unsigned	getNTax() const
+			{
+			return nativeCMatrix.nTax;
+			}
+
+		unsigned	getNStates() const
+			{
+			return nativeCMatrix.nStates;
+			}
+
+		const char *	getSymbolsList() const   //POL added 15-Nov-2005
+			{
+			return nativeCMatrix.symbolsList;
+			}
+
+		const std::vector<int8_t> &getStateList() const
+			{
+			return stateListAlias;
+			}
+
+		const std::vector<unsigned> &getStateListPos() const
+			{
+			return stateListPosAlias;
+			}
+
+		const NxsCDiscreteStateSet *getRow(unsigned i) const
+			{
+			NCL_ASSERT(i < nativeCMatrix.nTax);
+			return nativeCMatrix.matrix[i];
+			}
+
+		const std::vector<int8_t> getRowAsVector(unsigned i) const
+			{
+			NCL_ASSERT(i < nativeCMatrix.nTax);
+			std::vector<int8_t> v;
+			for (unsigned j = 0; j < nativeCMatrix.nChar; j++)
+				{
+				v.push_back(nativeCMatrix.matrix[i][j]);
+				}
+			return v;
+			}
+
+		const NxsCDiscreteStateSet * const * getMatrix() const
+			{
+			return nativeCMatrix.matrix;
+			}
+
+		const int getDatatype() const
+			{
+			return (int)nativeCMatrix.datatype;
+			}
+
+		bool hasWeights() const
+			{
+			return hasIntWeights() || hasDblWeights();
+			}
+
+		bool hasIntWeights() const
+			{
+			return !(intWts.empty());
+			}
+
+		bool hasDblWeights() const
+			{
+			return !(dblWts.empty());
+			}
+
+		std::vector<int> & getIntWeights()
+			{
+			return intWts;
+			}
+
+		std::vector<double> & getDblWeights()
+			{
+			return dblWts;
+			}
+
+		const std::vector<int> & getIntWeightsConst() const
+			{
+			return intWts;
+			}
+
+		const std::vector<double> & getDblWeightsConst() const
+			{
+			return dblWts;
+			}
+
+		const std::set<unsigned> & getExcludedCharIndices() const
+			{
+			return activeExSet;
+			}
+
+		std::vector<unsigned> getExcludedCharIndicesAsVector() const
+			{
+			return std::vector<unsigned>(activeExSet.begin(), activeExSet.end());
+			}
+
+	private:
+		typedef ScopedTwoDMatrix<NxsCDiscreteStateSet> ScopedStateSetTwoDMatrix;
+
+		NxsCDiscreteMatrix			nativeCMatrix; 		/** taxa x characters matrix in a C struct*/
+		std::string					symbolsStringAlias;	/** memory management alias to symbols field of nativeCMatrix */
+		ScopedStateSetTwoDMatrix	matrixAlias;		/** memory management alias to matrix field of nativeCMatrix */
+		std::vector<NxsCDiscreteState_t>	stateListAlias;		/** memory management alias to ambigList field of nativeCMatrix */
+		std::vector<unsigned>		stateListPosAlias;		/** memory management alias to symbolsList field of nativeCMatrix */
+		std::vector<int>			intWts;
+		std::vector<double>			dblWts;
+		std::set<unsigned>			activeExSet;
+		NxsCXXDiscreteMatrix(const NxsCXXDiscreteMatrix &); /** don't define, not copyable*/
+		NxsCXXDiscreteMatrix & operator=(const NxsCXXDiscreteMatrix &); /** don't define, not copyable*/
+	};
+
+
+
+
+class NxsCharacterPattern
+    {
+    public: 
+        
+        bool operator < (const NxsCharacterPattern & other) const {
+            return this->stateCodes < other.stateCodes;
+        }
+        bool operator == (const NxsCharacterPattern & other) const {
+            return this->stateCodes == other.stateCodes;
+        }
+        // returns true if none of the state codes are the missing or gap codes (negative values
+        //  note this does not test if all of the state codes correspond to completely specified
+        //  cells that are only compatible with one state!
+        bool StateCodesAreNonNegative() const {
+            for (std::vector<NxsCDiscreteState_t>::const_iterator scIt = stateCodes.begin();
+                                                                  scIt != stateCodes.end(); 
+                                                                  ++scIt)
+                {
+                if (*scIt < 0)
+                    return false;
+                }
+            return true;
+        }
+        std::vector<NxsCDiscreteState_t> stateCodes;
+        mutable unsigned count;
+        mutable unsigned patternIndex; // used as scratchspace not always valid!!!
+        mutable double sumOfPatternWeights; // stored as float.  Use NxsCXXDiscreteMatrix::hasIntWeights of the original matrix to see if these weights should be interpretted as ints
+    };
+    
+
+/*----------------------------------------------------------------------------------------------------------------------
+| Fills `compressedTransposedMatrix` with the compressed patterns found in `mat`
+|
+| Data structure for mapping between indices in these patterns can be obtained by the client providing
+|   `compressedIndexPattern` arguments.
+|
+| Characters or taxa can be omitted by providing `taxaToInclude` or `charactersToInclude` arguments.
+|   If these arguments are 0L (or not provided) then all data will be included. Note that skipping taxa
+|   will cause the taxon indexing within a pattern to disagree with the overall taxon numbering because there will
+|   be "frameshifts" for all of the skipped taxa.  The included taxa will be present in the expected order, but it is 
+|   the caller code's responsibility to keep track of which taxa are included in the pattern.
+*/
+unsigned NxsCompressDiscreteMatrix(
+  const NxsCXXDiscreteMatrix & mat,			/**< is the data source */
+  std::set<NxsCharacterPattern> & patternSet, /* matrix that will hold the compressed columns */
+  std::vector<const NxsCharacterPattern *> * compressedIndexPattern = 0L, /** if not 0L, this will be filled to provide a map from an index in `compressedTransposedMatrix` to the original character count */
+  const NxsUnsignedSet * taxaToInclude = 0L,	/**< if not 0L, this should be  the indices of the taxa in `mat` to include (if 0L all characters will be included). Excluding taxa will result in shorter patterns (the skipped taxa will not be filled with empty codes, instead the taxon indexing will be frameshifted -- the client code must keep track of these frameshifts). */
+  const NxsUnsignedSet * charactersToInclude = 0L);	/**< if not 0L, this should be  the indices of the characters in `mat` to include (if 0L all characters will be included) */
+    
+/*----------------------------------------------------------------------------------------------------------------------
+| Fills `compressedTransposedMatrix` with the compressed patterns found in `mat`
+|
+| Data structure for mapping between indices in these representations can be obtained by the client providing
+|   `originalIndexToCompressed` and/or compressedIndexToOriginal arguments.
+|
+| Characters or taxa can be omitted by providing `taxaToInclude` or `charactersToInclude` arguments.
+|   If these arguments are 0L (or not provided) then all data will be included. Note that skipping taxa
+|   will cause the taxon indexing within a pattern to disagree with the overall taxon numbering because there will
+|   be "frameshifts" for all of the skipped taxa.  The included taxa will be present in the expected order, but it is 
+|   the caller code's responsibility to keep track of which taxa are included in the pattern.
+*/
+unsigned NxsCompressDiscreteMatrix(
+  const NxsCXXDiscreteMatrix & mat,			/**< is the data source */
+  std::vector<NxsCharacterPattern> & compressedTransposedMatrix, /* matrix that will hold the compressed columns */
+  std::vector<int> * originalIndexToCompressed, /** if not 0L, this will be filled to provide map an index in `mat` to the corresponding index in `compressedTransposedMatrix` (-1 in the vector indicates that the character was not included) */
+  std::vector<std::set<unsigned> > * compressedIndexToOriginal, /** if not 0L, this will be filled to provide a map from an index in `compressedTransposedMatrix` to the original character count */
+  const NxsUnsignedSet * taxaToInclude = 0L,	/**< if not 0L, this should be  the indices of the taxa in `mat` to include (if 0L all characters will be included). Excluding taxa will result in shorter patterns (the skipped taxa will not be filled with empty codes, instead the taxon indexing will be frameshifted -- the client code must keep track of these frameshifts). */
+  const NxsUnsignedSet * charactersToInclude = 0L);	/**< if not 0L, this should be  the indices of the characters in `mat` to include (if 0L all characters will be included) */
+	
+
+void NxsConsumePatternSetToPatternVector(
+  std::set<NxsCharacterPattern> & patternSet, /* INPUT matrix that will hold the compressed columns */
+  std::vector<NxsCharacterPattern> & compressedTransposedMatrix, /* OUTPUT matrix that will hold the compressed columns */
+  const std::vector<const NxsCharacterPattern *> * compressedIndexPattern = 0L, /** INPUT This mapping must be provided if either  `originalIndexToCompressed` or `compressedIndexToOriginal` is requested */
+  std::vector<int> * originalIndexToCompressed = 0L, /** OUTPUT if not 0L, this will be filled to provide map an index in `mat` to the corresponding index in `compressedTransposedMatrix` (-1 in the vector indicates that the character was not included) */
+  std::vector<std::set<unsigned> > * compressedIndexToOriginal = 0L); /** OUTPUT  if not 0L, this will be filled to provide a map from an index in `compressedTransposedMatrix` to the original character count */
+
+void NxsTransposeCompressedMatrix(
+  const std::vector<NxsCharacterPattern> & compressedTransposedMatrix, 
+  ScopedTwoDMatrix<NxsCDiscreteStateSet> & destination,
+  std::vector<unsigned> * patternCounts = 0L,
+  std::vector<double> * patternWeights = 0L);
+  
+ 
+
+#endif  // NXS_CXX_DISCRETE_MATRIX_H
diff --git a/lib/ncl-2.1.18/ncl/nxscxxdiscretematrix.lo b/lib/ncl-2.1.18/ncl/nxscxxdiscretematrix.lo
new file mode 100644
index 0000000..458484f
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxscxxdiscretematrix.lo
@@ -0,0 +1,12 @@
+# nxscxxdiscretematrix.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nxscxxdiscretematrix.o'
+
+# Name of the non-PIC object
+non_pic_object='nxscxxdiscretematrix.o'
+
diff --git a/lib/ncl-2.1.18/ncl/nxsdatablock.cpp b/lib/ncl-2.1.18/ncl/nxsdatablock.cpp
new file mode 100644
index 0000000..6f59c6b
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsdatablock.cpp
@@ -0,0 +1,63 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#include "ncl/nxsdatablock.h"
+
+/*!
+	Sets `NCL_BLOCKTYPE_ATTR_NAME' to "DATA" and `newtaxa' to true, and calls the base class (NxsCharactersBlock) constructor.
+*/
+NxsDataBlock::NxsDataBlock(
+  NxsTaxaBlockAPI *tb,			/* the taxa block object for storing taxon labels */
+  NxsAssumptionsBlockAPI *ab)	/* the assumptions block object for storing exsets */
+  : NxsCharactersBlock(tb, ab)
+	{
+	NCL_BLOCKTYPE_ATTR_NAME = "DATA";
+	Reset();
+	}
+
+/*!
+	Calls Reset function of the parent class (NxsCharactersBlock) and resets `newtaxa' to true in preparation for
+	reading another DATA block.
+*/
+void NxsDataBlock::Reset()
+	{
+	NxsCharactersBlock::Reset();
+	newtaxa = true;
+	}
+
+/*!
+	Converts this NxsDataBlock object into a NxsCharactersBlock object, storing the result in the supplied
+	NxsCharactersBlock object. This NxsDataBlock object will subsequently say it is empty when asked.
+*/
+void NxsDataBlock::TransferTo(
+  NxsCharactersBlock &charactersblock)	/* the NxsCharactersBlock object that will receive all the data from this object */
+	{
+	charactersblock.Reset();
+	charactersblock.Consume((NxsCharactersBlock &)(*this));
+	}
+
+NxsDataBlock *NxsDataBlockFactory::GetBlockReaderForID(const std::string & idneeded, NxsReader *reader, NxsToken *)
+	{
+	if (reader == NULL || idneeded != "DATA")
+		return NULL;
+	NxsDataBlock * nb = new NxsDataBlock(NULL, NULL);
+	nb->SetCreateImpliedBlock(true);
+	nb->SetImplementsLinkAPI(true);
+	return nb;
+	}
diff --git a/lib/ncl-2.1.18/ncl/nxsdatablock.h b/lib/ncl-2.1.18/ncl/nxsdatablock.h
new file mode 100644
index 0000000..b78d04f
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsdatablock.h
@@ -0,0 +1,69 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#ifndef NCL_NXSDATABLOCK_H
+#define NCL_NXSDATABLOCK_H
+
+#include "ncl/nxscharactersblock.h"
+/*!
+	This class handles reading and storage for the NEXUS block DATA. It is derived from the NxsCharactersBlock class,
+	and differs from NxsCharactersBlock only in name and the fact that `newtaxa' is initially true rather than false.
+*/
+class NxsDataBlock
+  : public NxsCharactersBlock
+	{
+	public:
+		NxsDataBlock(NxsTaxaBlockAPI *tb, NxsAssumptionsBlockAPI *ab);
+
+		/*---------------------------------------------------------------------------------------
+		| Results in aliasing of the taxa, assumptionsBlock blocks!
+		*/
+		NxsDataBlock & operator=(const NxsDataBlock &other)
+			{
+			Reset();
+			CopyBaseBlockContents(static_cast<const NxsBlock &>(other));
+			CopyTaxaBlockSurrogateContents(other);
+			CopyCharactersContents(other);
+			return *this;
+			}
+
+		virtual NxsDataBlock * Clone() const
+			{
+			NxsDataBlock * a = new NxsDataBlock(taxa, assumptionsBlock);
+			*a = *this;
+			return a;
+			}
+
+		void TransferTo(NxsCharactersBlock &charactersblock);
+		void Reset();
+	private:
+		friend class MultiFormatReader;
+
+	};
+
+typedef NxsDataBlock DataBlock;
+
+class NxsDataBlockFactory
+	:public NxsBlockFactory
+	{
+	public:
+		virtual NxsDataBlock  *	GetBlockReaderForID(const std::string & NCL_BLOCKTYPE_ATTR_NAME, NxsReader *reader, NxsToken *token);
+	};
+
+#endif
diff --git a/lib/ncl-2.1.18/ncl/nxsdatablock.lo b/lib/ncl-2.1.18/ncl/nxsdatablock.lo
new file mode 100644
index 0000000..6b6d5c3
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsdatablock.lo
@@ -0,0 +1,12 @@
+# nxsdatablock.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nxsdatablock.o'
+
+# Name of the non-PIC object
+non_pic_object='nxsdatablock.o'
+
diff --git a/lib/ncl-2.1.18/ncl/nxsdefs.h b/lib/ncl-2.1.18/ncl/nxsdefs.h
new file mode 100644
index 0000000..eb73b54
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsdefs.h
@@ -0,0 +1,108 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+#ifndef NCL_NXSDEFS_H
+#define NCL_NXSDEFS_H
+
+#include <iostream>
+#include <vector>
+#include <map>
+#include <set>
+#include <list>
+#include <utility>
+
+#define NCL_MAJOR_VERSION 2
+#define NCL_MINOR_VERSION 1
+#define NCL_NAME_AND_VERSION  "NCL version 2.1.17"
+#define NCL_COPYRIGHT         "Copyright (c) 1999-2011 by Paul O. Lewis and Mark T. Holder"
+#define NCL_HOMEPAGEURL       "http://sourceforge.net/projects/ncl"
+
+#if defined(RESERVE_ID_KEYWORD)
+#	define NCL_BLOCKTYPE_ATTR_NAME blockTypeName
+#else
+#	define NCL_BLOCKTYPE_ATTR_NAME id
+#endif
+// NCL_COULD_BE_CONST is a mechanism for declaring some old (v < 2.1) functions
+// 	to be const without breaking old client code.
+// If you would like your code to be more const-correct, then define NCL_CONST_FUNCS
+//	when you compile NCL and your code.  This will cause several functions that
+//	should have been declared as const to be declared that way in your code.
+// By default NCL_CONST_FUNCS will not be defined and these functions will not
+//	be defined as const member functions.
+#if defined(NCL_CONST_FUNCS) && NCL_CONST_FUNCS
+#	define NCL_COULD_BE_CONST const
+	int onlyDefinedInCouldBeConst();
+#else
+#	define NCL_COULD_BE_CONST
+#endif
+
+#if defined(IGNORE_NXS_ASSERT) || defined(NDEBUG)
+#	define NCL_ASSERT(expr)
+#else
+	void ncl_assertion_failed(char const * expr, char const * function, char const * file, long line);
+#	define NCL_ASSERT(expr)  if (!(expr)) ncl_assertion_failed((const char *)#expr, (const char *)__FUNCTION__, __FILE__, __LINE__)
+#endif
+
+// Maximum number of states that can be stored; the only limitation is that this
+// number be less than the maximum size of an int (not likely to be a problem).
+// A good number for this is 76, which is 96 (the number of distinct symbols
+// able to be input from a standard keyboard) less 20 (the number of symbols
+// symbols disallowed by the NEXUS standard for use as state symbols)
+//
+#define NCL_MAX_STATES         76
+
+typedef std::streampos	file_pos;
+
+#define	SUPPORT_OLD_NCL_NAMES
+
+class NxsString;
+
+typedef std::vector<bool> NxsBoolVector;
+typedef std::vector<char> NxsCharVector;
+typedef std::vector<int> NxsIntVector;
+typedef std::vector<unsigned> NxsUnsignedVector;
+typedef std::vector<NxsString> NxsStringVector;
+typedef std::vector<NxsStringVector> NxsAllelesVector;
+
+typedef std::set<unsigned> NxsUnsignedSet;
+
+typedef std::map< unsigned, NxsStringVector> NxsStringVectorMap;
+typedef std::map< NxsString, NxsString> NxsStringMap;
+typedef std::map< NxsString, NxsUnsignedSet> NxsUnsignedSetMap;
+
+typedef std::pair<std::string, NxsUnsignedSet> NxsPartitionGroup;
+typedef std::list<NxsPartitionGroup> NxsPartition;
+typedef std::map<std::string, NxsPartition> NxsPartitionsByName;
+
+// The following typedefs are simply for maintaining compatibility with existing code.
+// The names on the right are deprecated and should not be used.
+//
+typedef NxsBoolVector BoolVect;
+typedef NxsUnsignedSet IntSet;
+typedef NxsUnsignedSetMap IntSetMap;
+typedef NxsAllelesVector AllelesVect;
+typedef NxsStringVector LabelList;
+typedef NxsStringVector StrVec;
+typedef NxsStringVector vecStr;
+typedef NxsStringVectorMap LabelListBag;
+typedef NxsStringMap AssocList;
+
+class ProcessedNxsToken;
+typedef std::vector<ProcessedNxsToken> ProcessedNxsCommand;
+
+#endif
diff --git a/lib/ncl-2.1.18/ncl/nxsdiscretedatum.h b/lib/ncl-2.1.18/ncl/nxsdiscretedatum.h
new file mode 100644
index 0000000..26e39e0
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsdiscretedatum.h
@@ -0,0 +1,58 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#ifndef NCL_NXSDISCRETEDATUM_H
+#define NCL_NXSDISCRETEDATUM_H
+
+/*!
+	Reference to a cell in a DiscreteMatrix.  This class has been deprecated and is retained in NCL >= 2.1 for backward
+	compatibility only.
+	It no longer stores the data for a cell, but can refer to the cell in a matrix in the context in which the
+	matrix is at hand. The only time that NxsDiscreteDatum appears in the public NCL interface is as an argument to
+	NxsCharactersBlock::WriteStates().  The new implementation of NxsDiscreteDatum should continue to work in this
+	context because the NxsCharactersBlock holds the matrix
+*/
+class NxsDiscreteDatum
+	{
+	friend class NxsDiscreteMatrix;
+	friend class NxsUnalignedBlock;
+
+	public:
+		NxsDiscreteDatum(): taxInd(0), charInd(0){}
+		NxsDiscreteDatum(unsigned row, unsigned col): taxInd(row), charInd(col){}
+		void				CopyFrom(const NxsDiscreteDatum & other);
+
+		unsigned taxInd; /*row of the matrix */
+		unsigned charInd; /*col of the matrix */
+
+	};
+
+typedef NxsDiscreteDatum DiscreteDatum;
+
+/*!
+	This assignment operator calls the CopyFrom member function to make a copy of the NxsDiscreteDatum object `other'.
+*/
+inline void NxsDiscreteDatum::CopyFrom(
+  const NxsDiscreteDatum & other)	/* is the object to be copied */
+	{
+	taxInd = other.taxInd;
+	charInd = other.charInd;
+	}
+
+#endif
diff --git a/lib/ncl-2.1.18/ncl/nxsdistancedatum.h b/lib/ncl-2.1.18/ncl/nxsdistancedatum.h
new file mode 100644
index 0000000..bdde053
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsdistancedatum.h
@@ -0,0 +1,42 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#ifndef NCL_NXSDISTANCEDATUM_H
+#define NCL_NXSDISTANCEDATUM_H
+
+/*!
+	This class stores pairwise distance values. It has no public access functions, reflecting the fact that it is
+	manipulated strictly by its only friend class, the NxsDistancesBlock class.
+*/
+class NxsDistanceDatum
+	{
+	public:
+
+		NxsDistanceDatum()
+		:value(0.0),
+		missing(true)
+		{}
+
+		double		value;		/* the pairwise distance value stored */
+		bool		missing;	/* true if there is missing data for this pair */
+	};
+
+typedef NxsDistanceDatum DistanceDatum;
+
+#endif
diff --git a/lib/ncl-2.1.18/ncl/nxsdistancesblock.cpp b/lib/ncl-2.1.18/ncl/nxsdistancesblock.cpp
new file mode 100644
index 0000000..eb4e38b
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsdistancesblock.cpp
@@ -0,0 +1,714 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+#include <iomanip>
+#include <climits>
+#include <cstdlib>
+
+#include "ncl/nxsdistancesblock.h"
+#include "ncl/nxsreader.h"
+using namespace std;
+
+
+void NxsDistancesBlock::WriteFormatCommand(std::ostream &out) const
+	{
+	out << "    FORMAT Missing = " << missing << " Triangle = Lower Diagonal;\n";
+	}
+
+void NxsDistancesBlock::WriteMatrixCommand(std::ostream &out) const
+	{
+	if (taxa == NULL)
+		return;
+	unsigned width = taxa->GetMaxTaxonLabelLength();
+	const unsigned ntaxTotal = taxa->GetNTax();
+	out << "MATRIX";
+	int prec = (int)out.precision(10);
+	for (unsigned i = 0; i < ntaxTotal; i++)
+		{
+		const std::string currTaxonLabel = NxsString::GetEscaped(taxa->GetTaxonLabel(i));
+		out << '\n' << currTaxonLabel;
+		unsigned currTaxonLabelLen = (unsigned)currTaxonLabel.size();
+		unsigned diff = width - currTaxonLabelLen;
+		for (unsigned k = 0; k < diff+5; k++)
+			out << ' ';
+		for (unsigned j = 0; j< i; j++)
+			{
+			if (IsMissing(i,j))
+				out << ' ' << missing << "         ";
+			else
+				out << ' '<< GetDistance(i, j);
+			}
+		out << " 0.0";
+		}
+	out << ";\n";
+	out.precision(prec);
+	}
+
+void NxsDistancesBlock::WriteAsNexus(std::ostream &out) const
+	{
+	out << "BEGIN DISTANCES;\n";
+	WriteBasicBlockCommands(out);
+	if (nchar > 0)
+		out << "    DIMENSIONS NChar = " << nchar << ";\n";
+	WriteFormatCommand(out);
+	WriteMatrixCommand(out);
+	WriteSkippedCommands(out);
+	out << "END;\n";
+	}
+
+
+/*!
+	See Reset() for defaults
+*/
+NxsDistancesBlock::NxsDistancesBlock(
+  NxsTaxaBlockAPI *t)	/* the NxsTaxaBlockAPI that will keep track of taxon labels */
+  : NxsBlock(),
+  NxsTaxaBlockSurrogate(t, NULL)
+	{
+	NCL_BLOCKTYPE_ATTR_NAME = "DISTANCES";
+	Reset();
+	}
+
+/*!
+	Deletes `matrix' and `taxonPos' arrays.
+*/
+NxsDistancesBlock::~NxsDistancesBlock()
+	{
+	Reset();
+	}
+
+/*!
+	Called when DIMENSIONS command needs to be parsed from within the DISTANCES block. Deals with everything after the
+	token DIMENSIONS up to and including the semicolon that terminates the DIMENSIONS command.
+*/
+void NxsDistancesBlock::HandleDimensionsCommand(
+  NxsToken &token)	/* the token used to read from `in' */
+	{
+	nchar = 0;
+	unsigned ntaxRead = 0;
+	for (;;)
+		{
+		token.GetNextToken();
+		if (token.Equals("NEWTAXA"))
+			newtaxa = true;
+		else if (token.Equals("NTAX"))
+			{
+			DemandEquals(token, "after NTAX in DIMENSIONS command");
+			ntaxRead = DemandPositiveInt(token, "NTAX");
+			}
+		else if (token.Equals("NCHAR"))
+			{
+			DemandEquals(token, "in DIMENSIONS command");
+			nchar = DemandPositiveInt(token, "NCHAR");
+			}
+		else if (token.Equals(";"))
+			break;
+		}
+	if (newtaxa)
+		{
+		if (ntaxRead == 0)
+			{
+			errormsg = "DIMENSIONS command must have an NTAX subcommand when the NEWTAXA option is in effect.";
+			throw NxsException(errormsg, token);
+			}
+		expectedNtax = ntaxRead;
+		AssureTaxaBlock(createImpliedBlock, token, "Dimensions");
+		if (!createImpliedBlock)
+			{
+			taxa->Reset();
+			if (nexusReader)
+				nexusReader->RemoveBlockFromUsedBlockList(taxa);
+			}
+		taxa->SetNtax(expectedNtax);
+		}
+	else
+		{
+		AssureTaxaBlock(false, token, "Dimensions");
+		const unsigned ntaxinblock = taxa->GetNumTaxonLabels();
+		if (ntaxinblock == 0)
+			{
+			errormsg = "A TAXA block must be read before character data, or the DIMENSIONS command must use the NEWTAXA.";
+			throw NxsException(errormsg, token);
+			}
+		if (ntaxinblock < ntaxRead)
+			{
+			errormsg = "NTAX in ";
+			errormsg << NCL_BLOCKTYPE_ATTR_NAME << " block must be less than or equal to NTAX in TAXA block\nNote: one circumstance that can cause this error is \nforgetting to specify NTAX in DIMENSIONS command when \na TAXA block has not been provided";
+			throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+			}
+		expectedNtax = (ntaxRead == 0 ? ntaxinblock : ntaxRead);;
+		}
+	}
+
+/*!
+	Called when FORMAT command needs to be parsed from within the DISTANCES block. Deals with everything after the
+	token FORMAT up to and including the semicolon that terminates the FORMAT command.
+*/
+void NxsDistancesBlock::HandleFormatCommand(
+  NxsToken &token)	/* the token used to read from `in' */
+	{
+	for (;;)
+		{
+		token.GetNextToken();
+		if (token.Equals(";"))
+			break;
+		if (token.Equals("TRIANGLE"))
+			{
+			DemandEquals(token, "after TRIANGLE");
+			token.GetNextToken();
+			if (token.Equals("LOWER"))
+				triangle = NxsDistancesBlockEnum(lower);
+			else if (token.Equals("UPPER"))
+				triangle = NxsDistancesBlockEnum(upper);
+			else if (token.Equals("BOTH"))
+				triangle = NxsDistancesBlockEnum(both);
+			else
+				{
+				errormsg = "Expecting UPPER, LOWER, or BOTH but found ";
+				errormsg += token.GetToken();
+				errormsg += " instead";
+				throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+			}
+		else if (token.Equals("DIAGONAL"))
+			diagonal = true;
+		else if (token.Equals("NODIAGONAL"))
+			diagonal = false;
+		else if (token.Equals("LABELS"))
+			labels = true;
+		else if (token.Equals("NOLABELS"))
+			labels = false;
+		else if (token.Equals("INTERLEAVE"))
+			interleave = true;
+		else if (token.Equals("NOINTERLEAVE"))
+			interleave = false;
+		else if (token.Equals("MISSING"))
+			{
+			DemandEquals(token, "after MISSING");
+			token.GetNextToken();
+			if (token.GetTokenLength() != 1 || isdigit(token.GetTokenReference()[0]))
+				{
+				errormsg = "Missing data symbol specified (";
+				errormsg += token.GetToken();
+				errormsg += ") is invalid (must be a single character)";
+				throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+			missing = token.GetTokenReference()[0];
+			}
+		else
+			{
+			errormsg = "Token specified (";
+			errormsg += token.GetToken();
+			errormsg += ") is an invalid subcommand for the FORMAT command";
+			throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+			}
+		}
+	}
+
+/*!
+	Called from within HandleMatrix, this function is used to deal with interleaved matrices. It is called once for
+	each pass through the taxa. The local variable `jmax' records the number of columns read in the current interleaved
+	page and is used to determine the offset used for j in subsequent pages.
+*/
+bool NxsDistancesBlock::HandleNextPass(
+  NxsToken &token,	/* the token we are using for reading the data file */
+  unsigned &offset,	/* the offset */
+  vector<unsigned> & fileMatrixCmdOrderToTaxInd,
+  set<unsigned> & taxIndsRead)
+	{
+	unsigned jmax = 0;
+	bool done = false;
+
+	unsigned i_first = 0;
+	if (triangle == NxsDistancesBlockEnum(lower))
+		i_first = offset;
+	unsigned i_last = expectedNtax;
+	errormsg.clear();
+	for (unsigned i = i_first; i < i_last; i++)
+		{
+		// Deal with taxon label if provided. Here are the four situations we need to deal with:
+		//   newtaxa  (offset > 0)  handled by
+		//      0           0         case 1
+		//      0           1         case 1
+		//      1           0         case 2
+		//      1           1         case 1
+		//
+		if (labels && (!newtaxa || offset > 0))
+			{
+			// Case 1: Expecting taxon labels, and also expecting them to already be in taxa
+			//
+			do
+				{
+				token.SetLabileFlagBit(NxsToken::newlineIsToken);
+				token.GetNextToken();
+				}
+			while(token.AtEOL());
+
+			try
+				{
+				// Look up position of taxon in NxsTaxaBlockAPI list
+				//
+				unsigned k = taxa->FindTaxon(token.GetToken());
+				if (k != i && triangle != NxsDistancesBlockEnum(lower))
+					{
+					errormsg << "Taxon " << token.GetToken() << " was not expected in the DISTANCES matrix.\nTaxa should be in the same order as in the Taxon block";
+					throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+					}
+
+				// Array taxonPos is initialized to UINT_MAX and filled in as taxa are encountered
+				//
+				if (fileMatrixCmdOrderToTaxInd[i] == UINT_MAX)
+					{
+					fileMatrixCmdOrderToTaxInd[i] = k;
+					if (taxIndsRead.count(k) > 0)
+						{
+						errormsg << "Taxon " << token.GetToken() << " was encountered more than one time in the Distances Matrix.";
+						throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+						}
+					taxIndsRead.insert(k);
+					}
+				else if (fileMatrixCmdOrderToTaxInd[i] != k)
+					{
+					errormsg << "Taxon labeled " << token.GetToken() << " is out of order compared to previous interleave pages";
+					throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+					}
+				}
+			catch (NxsTaxaBlock::NxsX_NoSuchTaxon)
+				{
+				errormsg = "Could not find ";
+				errormsg += token.GetToken();
+				errormsg += " among taxa previously defined";
+				throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+			}
+
+		else if (labels && newtaxa)
+			{
+			// Case 2: Expecting taxon labels, and also expecting taxa block to be empty
+			//
+			do
+				{
+				token.SetLabileFlagBit(NxsToken::newlineIsToken);
+				token.GetNextToken();
+				}
+			while(token.AtEOL());
+			const NxsString t(token.GetToken().c_str());
+			taxa->AddTaxonLabel(t);
+			fileMatrixCmdOrderToTaxInd[i] = i;
+			taxIndsRead.insert(i);
+			}
+
+		// Now deal with the row of distance values
+		//
+		unsigned true_j = 0;
+		for (unsigned j = 0; j < expectedNtax; j++)
+			{
+			if (i == expectedNtax - 1)
+				{
+				if (j == expectedNtax - 1)
+					done = true;
+				if (true_j == expectedNtax - 1 || (!diagonal && triangle == NxsDistancesBlockEnum(upper)))
+					{
+					done = true;
+					break;
+					}
+				}
+			if (!diagonal && triangle == NxsDistancesBlockEnum(lower) && j == expectedNtax - offset - 1)
+				{
+				done = true;
+				break;
+				}
+
+			token.SetLabileFlagBit(NxsToken::newlineIsToken);
+			token.GetNextToken();
+
+			if (token.AtEOL())
+				{
+				if (j > jmax)
+					{
+					jmax = j;
+					if (!diagonal && triangle == NxsDistancesBlockEnum(upper) && i >= offset)
+						jmax++;
+					if (interleave && triangle == NxsDistancesBlockEnum(upper))
+						i_last = jmax + offset;
+					}
+				break;
+				}
+
+			true_j = j + offset;
+			if (triangle == NxsDistancesBlockEnum(upper) && i > offset)
+				true_j += (i - offset);
+			if (!diagonal && triangle == NxsDistancesBlockEnum(upper) && i >= offset)
+				true_j++;
+
+			if (true_j == expectedNtax)
+				{
+				errormsg = "Too many distances specified in row just read in";
+				throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+
+			string t = token.GetToken();
+			unsigned corrected_i = fileMatrixCmdOrderToTaxInd.at(i);
+			unsigned corrected_j = true_j;
+			if (triangle == NxsDistancesBlockEnum(lower))
+				corrected_j = fileMatrixCmdOrderToTaxInd.at(true_j);
+			if (corrected_i == UINT_MAX || corrected_j == UINT_MAX)
+				{
+				errormsg = "Illegal internal row number for taxon in Distance Matrix.";
+				throw NxsNCLAPIException(errormsg, token);
+				}
+			if (token.GetTokenLength() == 1 && t[0] == missing)
+				SetMissing(corrected_i, corrected_j);
+			else
+				SetDistance(corrected_i, corrected_j, atof(t.c_str()));
+			}
+		}
+	offset += jmax;
+	return done;
+	}
+
+void NxsDistancesBlock::CopyDistancesContents(const NxsDistancesBlock &other)
+	{
+	expectedNtax = other.expectedNtax;
+	nchar = other.nchar;
+	diagonal = other.diagonal;
+	interleave = other.interleave;
+	labels = other.labels;
+	triangle = other.triangle;
+	missing = other.missing;
+	matrix = other.matrix;
+	}
+
+/*!
+	Called when MATRIX command needs to be parsed from within the DISTANCES block. Deals with everything after the
+	token MATRIX up to and including the semicolon that terminates the MATRIX command.
+*/
+void NxsDistancesBlock::HandleMatrixCommand(
+  NxsToken &token)	/* the token used to read from `in' */
+	{
+	errormsg.clear();
+	if (expectedNtax == 0 || taxa == NULL)
+		{
+		AssureTaxaBlock(false, token, "Matrix");
+		expectedNtax = taxa->GetNumTaxonLabels();
+		}
+	if (expectedNtax == 0)
+		{
+		errormsg = "MATRIX command cannot be read if NTAX is zero";
+		throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+		}
+
+	if (triangle == NxsDistancesBlockEnum(both) && !diagonal)
+		{
+		errormsg = "Cannot specify NODIAGONAL and TRIANGLE=BOTH at the same time";
+		throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+		}
+	if (newtaxa)
+		taxa->Reset();
+
+	vector<unsigned> fileMatrixCmdOrderToTaxInd(expectedNtax, UINT_MAX);
+	set<unsigned> taxIndsRead;
+	unsigned nTaxInTaxBlock = taxa->GetNumTaxonLabels();
+	if (nTaxInTaxBlock < expectedNtax)
+		{
+		errormsg << "NTAX in " << NCL_BLOCKTYPE_ATTR_NAME << " block must be less than or equal to NTAX in TAXA block\nNote: one circumstance that can cause this error is \nforgetting to specify NTAX in DIMENSIONS command when \na TAXA block has not been provided";
+		throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+		}
+	NxsDistanceDatumRow row(nTaxInTaxBlock);
+	matrix.assign(nTaxInTaxBlock, row);
+	unsigned offset = 0;
+	for (;;)
+		{
+		if (HandleNextPass(token, offset, fileMatrixCmdOrderToTaxInd, taxIndsRead))
+			break;
+		}
+	DemandEndSemicolon(token, "MATRIX");
+	}
+
+/*!
+	This function provides the ability to read everything following the block name (which is read by the NEXUS object)
+	to the end or endblock statement. Characters are read from the input stream in. Overrides the abstract virtual
+	function in the base class.
+*/
+void NxsDistancesBlock::Read(
+  NxsToken &token)	/* the token used to read from `in' */
+	{
+	isEmpty = false;
+
+	DemandEndSemicolon(token, "BEGIN DISTANCES");
+
+	for (;;)
+		{
+		token.GetNextToken();
+		NxsBlock::NxsCommandResult res = HandleBasicBlockCommands(token);
+		if (res == NxsBlock::NxsCommandResult(STOP_PARSING_BLOCK))
+			return;
+		if (res != NxsBlock::NxsCommandResult(HANDLED_COMMAND))
+			{
+			if (token.Equals("DIMENSIONS"))
+				HandleDimensionsCommand(token);
+			else if (token.Equals("FORMAT"))
+				HandleFormatCommand(token);
+			else if (token.Equals("TAXLABELS"))
+				HandleTaxLabels(token);
+			else if (token.Equals("MATRIX"))
+				HandleMatrixCommand(token);
+			else
+				SkipCommand(token);
+			}
+		}
+	}
+
+/*!
+	This function outputs a brief report of the contents of this taxa block. Overrides the abstract virtual function in
+	the base class.
+*/
+void NxsDistancesBlock::Report(
+  std::ostream &out) NCL_COULD_BE_CONST /* the output stream to which to write the report */ /*v2.1to2.2 1 */
+	{
+	const unsigned ntaxTotal = taxa->GetNumTaxonLabels();
+
+	out << endl;
+	out << NCL_BLOCKTYPE_ATTR_NAME << " block contains ";
+	if (ntaxTotal == 0)
+		{
+		out << "no taxa" << endl;
+		}
+	else if (ntaxTotal == 1)
+		out << "one taxon" << endl;
+	else
+		out << ntaxTotal << " taxa" << endl;
+
+	if (IsLowerTriangular())
+		out << "  Matrix is lower-triangular" << endl;
+	else if (IsUpperTriangular())
+		out << "  Matrix is upper-triangular" << endl;
+	else
+		out << "  Matrix is rectangular" << endl;
+
+	if (IsInterleave())
+		out << "  Matrix is interleaved" << endl;
+	else
+		out << "  Matrix is non-interleaved" << endl;
+
+	if (IsLabels())
+		out << "  Taxon labels provided" << endl;
+	else
+		out << "  No taxon labels provided" << endl;
+
+	if (IsDiagonal())
+		out << "  Diagonal elements specified" << endl;
+	else
+		out << "  Diagonal elements not specified" << endl;
+
+	out << "  Missing data symbol is " << missing << endl;
+
+	if (expectedNtax == 0)
+		return;
+
+	out.setf(ios::fixed, ios::floatfield);
+	out.setf(ios::showpoint);
+	for (unsigned i = 0; i < ntaxTotal; i++)
+		{
+		if (labels)
+			out << setw(20) << taxa->GetTaxonLabel(i);
+		else
+			out << "        ";
+
+		for (unsigned j = 0; j < ntaxTotal; j++)
+			{
+			if (triangle == NxsDistancesBlockEnum(upper) && j < i)
+				out << setw(12) << " ";
+			else if (triangle == NxsDistancesBlockEnum(lower) && j > i)
+				continue;
+			else if (!diagonal && i == j)
+				{
+				out << setw(12) << " ";
+				}
+			else if (IsMissing(i, j))
+				out << setw(12) << missing;
+			else
+				out << setw(12) << GetDistance(i, j);
+			}
+
+		out << endl;
+		}
+	}
+
+/*!
+	Flushes taxonLabels and sets ntax to 0 in preparation for reading a new TAXA block.
+	`triangle' to `NxsDistancesBlockEnum::lower',
+	`missing' to '?',
+	`labels' and `diagonal' to true,
+	`newtaxa' and `interleave' to false,
+	`expectedNtax' and `nchar' to 0.
+	and clears the matrix.
+*/
+void NxsDistancesBlock::Reset()
+	{
+	NxsBlock::Reset();
+	ResetSurrogate();
+	matrix.clear();
+	expectedNtax        = 0;
+	nchar       = 0;
+	diagonal    = true;
+	labels      = true;
+	interleave  = false;
+	missing     = '?';
+	triangle    = NxsDistancesBlockEnum(lower);
+	}
+
+/*!
+	Returns the value of nchar.
+*/
+unsigned NxsDistancesBlock::GetNchar() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+	{
+	return nchar;
+	}
+
+/*!
+	Returns the value of the (`i', `j')th element of `matrix'. Assumes `i' and `j' are both in the range [0..`ntax')
+	and the distance stored at `matrix[i][j]' is not missing. Also assumes `matrix' is not NULL.
+*/
+double NxsDistancesBlock::GetDistance(
+  unsigned i,	/* the row */
+  unsigned j) const /* the column */
+	{
+	return GetCell(i,j).value;
+	}
+
+/*!
+	Returns the value of `missing'.
+*/
+char NxsDistancesBlock::GetMissingSymbol() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+	{
+	return missing;
+	}
+
+/*!
+	Returns the value of `triangle'.
+*/
+unsigned NxsDistancesBlock::GetTriangle() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+	{
+	return triangle;
+	}
+
+/*!
+	Returns true if the value of `triangle' is NxsDistancesBlockEnum(both), false otherwise.
+*/
+bool NxsDistancesBlock::IsRectangular() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+	{
+	return (triangle == NxsDistancesBlockEnum(both) ? true : false);
+	}
+
+/*!
+	Returns true if the value of triangle is NxsDistancesBlockEnum(upper), false otherwise.
+*/
+bool NxsDistancesBlock::IsUpperTriangular() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+	{
+	return (triangle == NxsDistancesBlockEnum(upper) ? true : false);
+	}
+
+/*!
+	Returns true if the value of triangle is NxsDistancesBlockEnum(lower), false otherwise.
+*/
+bool NxsDistancesBlock::IsLowerTriangular() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+	{
+	return (triangle == NxsDistancesBlockEnum(lower) ? true : false);
+	}
+
+/*!
+	Returns the value of diagonal.
+*/
+bool NxsDistancesBlock::IsDiagonal() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+	{
+	return diagonal;
+	}
+
+/*!
+	Returns the value of interleave.
+*/
+bool NxsDistancesBlock::IsInterleave() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+	{
+	return interleave;
+	}
+
+/*!
+	Returns the value of labels.
+*/
+bool NxsDistancesBlock::IsLabels() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+	{
+	return labels;
+	}
+
+/*!
+	Returns true if the (`i',`j')th distance is missing. Assumes `i' and `j' are both in the range [0..`ntax') and
+	`matrix' is not NULL.
+*/
+bool NxsDistancesBlock::IsMissing(
+  unsigned i,	/* the row */
+  unsigned j) const	/* the column */
+	{
+	return (bool)(GetCell(i,j).missing);
+	}
+
+/*!
+	Sets the value of the (`i',`j')th matrix element to `d' and `missing' to false . Assumes `i' and `j' are both in
+	the range [0..`ntax') and `matrix' is not NULL.
+*/
+void NxsDistancesBlock::SetDistance(
+  unsigned i,	/* the row */
+  unsigned j,	/* the column */
+  double d)		/* the distance value */
+	{
+	NxsDistanceDatum & c =  GetCell(i, j);
+	c.value = d;
+	c.missing = false;
+	}
+
+/*!
+	Sets the value of the (`i', `j')th `matrix' element to missing. Assumes `i' and `j' are both in the range
+	[0..`ntax') and `matrix' is not NULL.
+*/
+void NxsDistancesBlock::SetMissing(
+  unsigned i,	/* the row */
+  unsigned j)	/* the column */
+	{
+	NxsDistanceDatum & c =  GetCell(i, j);
+	c.missing = 1;
+	c.value = 0.0;
+	}
+
+/*!
+	Sets `nchar' to `n'.
+*/
+void NxsDistancesBlock::SetNchar(
+  unsigned n)	/* the number of characters */
+	{
+	nchar = n;
+	}
+
+NxsDistancesBlock *NxsDistancesBlockFactory::GetBlockReaderForID(const std::string & idneeded, NxsReader *reader, NxsToken *)
+	{
+	if (reader == NULL || idneeded != "DISTANCES")
+		return NULL;
+	NxsDistancesBlock * nb  = new NxsDistancesBlock(NULL);
+	nb->SetCreateImpliedBlock(true);
+	nb->SetImplementsLinkAPI(true);
+	return nb;
+	}
diff --git a/lib/ncl-2.1.18/ncl/nxsdistancesblock.h b/lib/ncl-2.1.18/ncl/nxsdistancesblock.h
new file mode 100644
index 0000000..39dd4d5
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsdistancesblock.h
@@ -0,0 +1,197 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#ifndef NCL_NXSDISTANCESBLOCK_H
+#define NCL_NXSDISTANCESBLOCK_H
+
+#include "ncl/nxsdefs.h"
+#include "ncl/nxstaxablock.h"
+#include "ncl/nxsdistancedatum.h"
+
+/*!
+	This class handles reading and storage for the NEXUS block DISTANCES. It overrides the member functions Read and
+	Reset, which are abstract virtual functions in the base class NxsBlock. Below is a table showing the correspondence
+	between the elements of a DISTANCES block and the variables and member functions that can be used to access each
+	piece of information stored.
+>
+	NEXUS command   Command attribute  Data Members        Member Functions
+	------------------------------------------------------------------------
+	DIMENSIONS      NEWTAXA            newtaxa
+
+	                NTAX               ntax                GetNtax
+
+	                NCHAR              nchar               GetNchar
+
+	FORMAT          TRIANGLE           triangle            GetTriangle
+	                                                       IsUpperTriangular
+	                                                       IsLowerTriangular
+	                                                       IsRectangular
+
+	                [NO]DIAGONAL       diagonal            IsDiagonal
+
+	                [NO]LABELS         labels              IsLabels
+
+	                MISSING            missing             GetMissingSymbol
+
+	                INTERLEAVE         interleave          IsInterleave
+
+	                TAXLABELS          (stored in the      (access through
+					                   NxsTaxaBlockAPI        data member taxa)
+									   object)
+
+	MATRIX                             matrix              GetDistance
+	                                                       IsMissing
+	                                                       SetMissing
+	                                                       SetDistance
+	------------------------------------------------------------------------
+>
+*/
+class NxsDistancesBlock
+  : public NxsBlock, public NxsTaxaBlockSurrogate
+	{
+	public:
+							NxsDistancesBlock(NxsTaxaBlockAPI *t);
+		virtual				~NxsDistancesBlock();
+
+		double				GetDistance(unsigned i, unsigned j) const;
+		char				GetMissingSymbol() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		unsigned			GetNchar() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		unsigned			GetTriangle() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		bool				IsRectangular() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		bool				IsBoth() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		bool				IsDiagonal() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		bool				IsInterleave() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		bool				IsLabels() NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		bool				IsLowerTriangular() NCL_COULD_BE_CONST ;  /*v2.1to2.2 1 */
+		bool				IsMissing(unsigned i, unsigned j) const;
+		bool				IsUpperTriangular() NCL_COULD_BE_CONST ;  /*v2.1to2.2 1 */
+		virtual void		Report(std::ostream &out) NCL_COULD_BE_CONST ;  /*v2.1to2.2 1 */
+		virtual void		Reset();
+		void				SetDistance(unsigned i, unsigned j, double d);
+		void				SetMissing(unsigned i, unsigned j);
+		void				SetNchar(unsigned i);
+		void				SetNexus(NxsReader *nxsptr)
+			{
+			NxsBlock::SetNexus(nxsptr);
+			NxsTaxaBlockSurrogate::SetNexusReader(nxsptr);
+			}
+			/*! \ref BlockTypeIDDiscussion */
+        virtual const std::string & GetBlockName() const
+            {
+            return NCL_BLOCKTYPE_ATTR_NAME;
+            }
+
+		enum NxsDistancesBlockEnum		/* used by data member triangle to determine which triangle(s) of the distance matrix is/are occupied */
+			{
+			upper			= 1,		/* matrix is upper-triangular */
+			lower			= 2,		/* matrix is lower-triangular */
+			both			= 3			/* matrix is rectangular */
+			};
+
+		virtual VecBlockPtr		GetImpliedBlocks()
+			{
+			return GetCreatedTaxaBlocks();
+			}
+
+		/*only used it the linkAPI is enabled*/
+		virtual void		HandleLinkCommand(NxsToken & token)
+			{
+			HandleLinkTaxaCommand(token);
+			}
+		virtual void		WriteLinkCommand(std::ostream &out) const
+			{
+			WriteLinkTaxaCommand(out);
+			}
+		void				WriteAsNexus(std::ostream &out) const;
+
+
+		NxsDistancesBlock &operator=(const NxsDistancesBlock &other)
+			{
+			Reset();
+			CopyBaseBlockContents(static_cast<const NxsBlock &>(other));
+			CopyTaxaBlockSurrogateContents(other);
+			CopyDistancesContents(other);
+			return *this;
+			}
+
+		void CopyDistancesContents(const NxsDistancesBlock &other);
+		NxsDistancesBlock * Clone() const
+			{
+			NxsDistancesBlock *d = new NxsDistancesBlock(taxa);
+			*d = *this;
+			return d;
+			}
+		bool 		SwapEquivalentTaxaBlock(NxsTaxaBlockAPI * tb)
+		{
+			return SurrogateSwapEquivalentTaxaBlock(tb);
+		}
+
+	protected:
+		void				WriteFormatCommand(std::ostream &out) const;
+		void				WriteMatrixCommand(std::ostream &out) const;
+
+		void				HandleDimensionsCommand(NxsToken &token);
+		void				HandleFormatCommand(NxsToken &token);
+		void				HandleMatrixCommand(NxsToken &token);
+		bool				HandleNextPass(NxsToken &token, unsigned &offset, std::vector<unsigned> & fileMatrixCmdOrderToTaxInd, std::set<unsigned> & taxIndsRead);
+		virtual void		Read(NxsToken &token);
+
+	private:
+		NxsDistanceDatum & GetCell(unsigned i, unsigned j)
+			{
+			return matrix.at(i).at(j);
+			}
+		const NxsDistanceDatum & GetCell(unsigned i, unsigned j) const
+			{
+			return matrix.at(i).at(j);
+			}
+		typedef std::vector<NxsDistanceDatum> NxsDistanceDatumRow;
+		typedef std::vector<NxsDistanceDatumRow> NxsDistanceDatumMatrix;
+
+		unsigned			expectedNtax;		/* number of taxa (determines dimensions of the matrix) */
+		unsigned			nchar;		/* the number of characters used in generating the pairwise distances */
+
+		bool				diagonal;	/* true if diagonal elements provided when reading in DISTANCES block */
+		bool				interleave;	/* true if interleave format used when reading in DISTANCES block */
+		bool				labels;		/* true if taxon labels were provided when reading in DISTANCES block */
+
+		int					triangle;	/* indicates whether matrix is upper triangular, lower triangular, or rectangular, taking on one of the elements of the NxsDistancesBlockEnum enumeration */
+
+		char				missing;	/* the symbol used to represent missing data (e.g. '?') */
+
+		NxsDistanceDatumMatrix	matrix;	/* the structure used for storing the pairwise distance matrix */
+		friend class PublicNexusReader;
+	};
+
+typedef NxsDistancesBlock	DistancesBlock;
+
+class NxsDistancesBlockFactory
+	:public NxsBlockFactory
+	{
+	public:
+		virtual NxsDistancesBlock  *	GetBlockReaderForID(const std::string & NCL_BLOCKTYPE_ATTR_NAME, NxsReader *reader, NxsToken *token);
+	};
+
+inline bool NxsDistancesBlock::IsBoth() NCL_COULD_BE_CONST /*v2.1to2.2 1 */
+	{
+	return this->IsRectangular();
+	}
+
+#endif
+
diff --git a/lib/ncl-2.1.18/ncl/nxsdistancesblock.lo b/lib/ncl-2.1.18/ncl/nxsdistancesblock.lo
new file mode 100644
index 0000000..f8cabc7
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsdistancesblock.lo
@@ -0,0 +1,12 @@
+# nxsdistancesblock.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nxsdistancesblock.o'
+
+# Name of the non-PIC object
+non_pic_object='nxsdistancesblock.o'
+
diff --git a/lib/ncl-2.1.18/ncl/nxsexception.cpp b/lib/ncl-2.1.18/ncl/nxsexception.cpp
new file mode 100644
index 0000000..3b3521a
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsexception.cpp
@@ -0,0 +1,106 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#include "ncl/nxsexception.h"
+#include "ncl/nxstoken.h"
+
+using namespace std;
+/*!
+	Copies 's' to msg and sets line, col and pos to the current line, column and position in the file where parsing
+	stopped.
+*/
+NxsException::NxsException(
+  const std::string & s,	/* the message for the user */
+  file_pos fp,	/* the current file position */
+  long fl,		/* the current file line */
+  long fc)		/* the current file column */
+	{
+	msg.assign(s);
+	addPositionInfo(fp, fl, fc);
+	}
+
+/*!
+	Creates a NxsException object with the specified message, getting file position information from the NxsToken.
+*/
+NxsException::NxsException(
+  const std::string &s,		/* message that describes the error */
+  const NxsToken &t)		/* NxsToken that was supplied the last token (the token that caused the error) */
+	{
+	msg		= NxsString(s.c_str());
+	this->addPositionInfo(t);
+  	}
+
+NxsException::NxsException(const std::string &s, const ProcessedNxsToken &t)
+	{
+	msg		= NxsString(s.c_str());
+	this->addPositionInfo(t);
+	}
+
+NxsException::NxsException(const std::string &s, const NxsTokenPosInfo &t)
+	{
+	msg		= NxsString(s.c_str());
+	this->addPositionInfo(t);
+	}
+
+const char * NxsException::nxs_what () const
+	{
+	std::string m = "Nexus Parsing error: ";
+	m.append(msg);
+	msg.assign(m);
+	if (line >= 0)
+		msg << " at line " << line;
+	if (col >= 0)
+		msg << " column " << col;
+	return msg.c_str();
+	}
+
+NxsSignalCanceledParseException::NxsSignalCanceledParseException(const std::string & s)
+	:NxsException(s)
+	{
+	msg = "Signal detected during NEXUS class library";
+	if (!s.empty())
+		msg << " in the processing step: " << s;
+	msg << '.';
+	}
+
+
+void NxsException::addPositionInfo(const NxsToken & t) 
+	{
+	pos = t.GetFilePosition();
+	line = t.GetFileLine();
+	col = t.GetFileColumn();
+	}
+void NxsException::addPositionInfo(const ProcessedNxsToken & t)
+	{
+	pos		= t.GetFilePosition();
+	line	= t.GetLineNumber();
+	col		= t.GetColumnNumber();
+	}
+void NxsException::addPositionInfo(const NxsTokenPosInfo & t)
+	{
+	pos		= t.GetFilePosition();
+	line	= t.GetLineNumber();
+	col		= t.GetColumnNumber();
+	}
+void NxsException::addPositionInfo(file_pos fp, long fl, long fc)
+	{
+	pos		= fp;
+	line	= fl;
+	col		= fc;
+	}
diff --git a/lib/ncl-2.1.18/ncl/nxsexception.h b/lib/ncl-2.1.18/ncl/nxsexception.h
new file mode 100644
index 0000000..ce10c9d
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsexception.h
@@ -0,0 +1,97 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#ifndef NCL_NXSEXCEPTION_H
+#define NCL_NXSEXCEPTION_H
+
+#include "ncl/nxsstring.h"
+
+class NxsToken;
+class ProcessedNxsToken;
+class NxsTokenPosInfo;
+/*!
+	Exception class that conveys a message specific to the problem encountered.
+*/
+class NxsException: public std::exception
+	{
+	public:
+		mutable NxsString	msg;	/* NxsString to hold message */
+		file_pos	pos;	/* current file position */
+		long		line;	/* current line in file */
+		long		col;	/* column of current line */
+		virtual ~NxsException() throw()
+			{
+			}
+
+		NxsException(const std::string & s, file_pos fp = 0, long fl = 0L, long fc = 0L);
+		NxsException(const std::string &s, const NxsToken &t);
+		NxsException(const std::string &s, const ProcessedNxsToken &t);
+		NxsException(const std::string &s, const NxsTokenPosInfo &t);
+		const char * what () const throw ()
+			{
+			return msg.empty() ? "Unknown Nexus Exception" : msg.c_str();
+			}
+		const char * nxs_what () const;
+		void addPositionInfo(const NxsToken & t);
+		void addPositionInfo(const ProcessedNxsToken & t);
+		void addPositionInfo(const NxsTokenPosInfo & t);
+		void addPositionInfo(file_pos fp, long fl, long fc);
+	};
+
+typedef NxsException XNexus;
+
+/*!
+	Thrown when a programming error (a violation of one of the APIs used in NCL) is revealed.
+*/
+class NxsNCLAPIException: public NxsException
+	{
+	public:
+		NxsNCLAPIException(NxsString s) :NxsException(s, 0, -1L,-1L){}
+		NxsNCLAPIException(NxsString s, NxsToken &t) :NxsException(s, t){}
+	};
+
+/*!
+	Thrown when an unimplemented method is called.
+*/
+class NxsUnimplementedException: public NxsNCLAPIException
+	{
+	public:
+		NxsUnimplementedException(NxsString s):NxsNCLAPIException(s){}
+		NxsUnimplementedException(NxsString s, NxsToken &t):NxsNCLAPIException(s,t){}
+	};
+
+
+class DuplicatedLabelNxsException: public NxsException
+	{
+	public:
+		DuplicatedLabelNxsException(const std::string & s):NxsException(s){}
+	};
+
+
+/*------------------------------------------------------------------------------
+ This exception will be thrown if NCL signal handling is activated (static
+	methods in NxsReader control this) and a SIGINT is detected during a
+	parse.
+*/
+class NxsSignalCanceledParseException: public NxsException
+	{
+	public:
+		NxsSignalCanceledParseException(const std::string & s);
+	};
+#endif
diff --git a/lib/ncl-2.1.18/ncl/nxsexception.lo b/lib/ncl-2.1.18/ncl/nxsexception.lo
new file mode 100644
index 0000000..2f25b5c
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsexception.lo
@@ -0,0 +1,12 @@
+# nxsexception.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nxsexception.o'
+
+# Name of the non-PIC object
+non_pic_object='nxsexception.o'
+
diff --git a/lib/ncl-2.1.18/ncl/nxsmultiformat.cpp b/lib/ncl-2.1.18/ncl/nxsmultiformat.cpp
new file mode 100644
index 0000000..5546b17
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsmultiformat.cpp
@@ -0,0 +1,1597 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis and Mark T. Holder
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+
+/* The phylip parser is based on code from PHYLIP which is:
+ * version 3.6. (c) Copyright 1993-2004 by the University of Washington.
+ * Written by Joseph Felsenstein, Akiko Fuseki, Sean Lamont, Andrew Keeffe,
+ * Mike Palczewski, Doug Buxton and Dan Fineman. Permission is granted to
+ * copy and use this program provided no fee is charged for it and provided
+ * that this copyright notice is not removed.
+ */
+
+
+/*
+ * This file is a phylip to NEXUS converter that consists of code from PHYLIP
+ * 3.6.5 (see copyright above) tweaked by Mark Holder to output NEXUS.
+ *
+ * This file was created by concatenating the headers, and .c files:
+ *	phylip.h,
+ *	seq.h,
+ *	discrete.h
+ *	phylip.c
+ *	seq.c,
+ *	pars.c, and
+ *	discrete.c concatenated
+ *	followed by removal of code that is unused in this simple program, and
+ * the addition of routines for printing out NEXUS.
+ */
+
+
+#include <cassert>
+#include <fstream>
+#include <algorithm>
+#include "ncl/nxsmultiformat.h"
+#include "ncl/nxsstring.h"
+
+const unsigned MAX_BUFFER_SIZE = 0x80000;
+
+
+
+
+
+
+
+const char * gFormatNames[] = {	"nexus",
+								"dnafasta",
+								"aafasta",
+								"rnafasta",
+								"dnaphylip",
+								"rnaphylip",
+								"aaphylip",
+								"discretephylip",
+								"dnaphylipinterleaved",
+								"rnaphylipinterleaved",
+								"aaphylipinterleaved",
+								"discretephylipinterleaved",
+								"dnarelaxedphylip",
+								"rnarelaxedphylip",
+								"aarelaxedphylip",
+								"discreterelaxedphylip",
+								"dnarelaxedphylipinterleaved",
+								"rnarelaxedphylipinterleaved",
+								"aarelaxedphylipinterleaved",
+								"discreterelaxedphylipinterleaved",
+								"dnaaln",
+								"rnaaln",
+								"aaaln",
+								"phyliptree",
+								"relaxedphyliptree",
+								"nexml",
+								"dnafin",
+								"aafin",
+								"rnafin"
+							};
+const unsigned gNumFormats = 29;
+const unsigned PHYLIP_NMLNGTH = 10;
+
+std::vector<std::string> MultiFormatReader::getFormatNames()
+	{
+	std::vector<std::string> v(gNumFormats);
+	for (unsigned i = 0; i < gNumFormats; ++i)
+		{
+		v[i] = std::string(gFormatNames[i]);
+		}
+	return v;
+	}
+
+
+
+class FileToCharBuffer
+{
+		char prevChar;
+		std::istream & inf;
+		unsigned remaining;
+		unsigned pos;
+	public:
+		unsigned totalSize;
+	protected:
+		unsigned lineNumber;
+		unsigned prevNewlinePos;
+	public:
+		/* reads at most MAX_BUFFER_SIZE characters from inf into the buffer that is
+		returned. The caller must delete the buffer.  On exit `len` will store the
+		length of the buffer.
+		*/
+
+		FileToCharBuffer(std::istream & instream);
+
+		/* reads at most maxLen characters from `inf` into the `buffer`
+		Returns false if no characters are read.
+		If true is returned then `maxLen` will indicate the number of characters read.
+		*/
+		bool refillBuffer(unsigned offset);
+		char current() const
+			{
+			return buffer[pos];
+			}
+		bool advance()
+			{
+			if (pos + 1 >= inbuffer)
+				{
+				if (!refillBuffer(0))
+					return false;
+				}
+			else
+				++pos;
+			const char c = current();
+			if (c == 13)
+				{
+				++lineNumber;
+				prevNewlinePos = position();
+				}
+			else if (c == 10)
+				{
+				if (prev() != 13)
+					++lineNumber;
+				prevNewlinePos = position();
+				}
+			return true;
+			}
+		bool advance_then_store(char & c)
+			{
+			if (!this->advance())
+				return false;
+			c = this->current();
+			return true;
+			}
+		bool skip_to_beginning_of_line(char & next);
+		char prev() const
+			{
+			if (pos == 0)
+				return prevChar;
+			return buffer[pos - 1];
+			}
+		~FileToCharBuffer()
+			{
+			delete [] buffer;
+			}
+		unsigned position() const
+			{
+			return totalSize +  pos - remaining - inbuffer;
+			}
+		unsigned line() const
+			{
+			return lineNumber;
+			}
+		unsigned column() const
+			{
+			unsigned p = position();
+			if (p < prevNewlinePos)
+				return 0;
+			return p - prevNewlinePos;
+			}
+		char * buffer;
+		unsigned inbuffer;
+
+};
+
+
+void MultiFormatReader::ReadFilepath(const char * filepath, const char * formatName)
+	{
+	if (!formatName)
+		return;
+	DataFormatType f =  formatNameToCode(formatName);
+	if (f == UNSUPPORTED_FORMAT)
+		{
+		NxsString m;
+		m << "Unsupported format: " << formatName;
+		throw NxsException(m);
+		}
+	this->ReadFilepath(filepath, f);
+	}
+
+void MultiFormatReader::ReadStream(std::istream & inf, const char * formatName)
+	{
+	if (!formatName)
+		return;
+	DataFormatType f =  formatNameToCode(formatName);
+	if (f == UNSUPPORTED_FORMAT)
+		{
+		NxsString m;
+		m << "Unsupported format: " << formatName;
+		throw NxsException(m);
+		}
+	this->ReadStream(inf, f);
+	}
+
+FileToCharBuffer::FileToCharBuffer(std::istream & instream)
+	:prevChar('\n'),
+	inf(instream),
+	pos(0),
+	totalSize(0),
+	lineNumber(1),
+	prevNewlinePos(0),
+	buffer(0L)
+	{
+	std::streampos s = inf.tellg();
+	inf.seekg (0, std::ios::end);
+	std::streampos e = inf.tellg();
+	if (e <= s)
+		{
+		inbuffer = 0;
+		remaining = 0;
+		return;
+		}
+	inf.seekg(s);
+	totalSize = static_cast<unsigned>(e - s);
+	inbuffer = std::min(MAX_BUFFER_SIZE, totalSize);
+	remaining = totalSize - inbuffer;
+	buffer = new char [inbuffer];
+	inf.read(buffer, inbuffer);
+	const char c = current();
+	if (c == 13)
+		{
+		++lineNumber;
+		prevNewlinePos = position();
+		}
+	else if (c == 10)
+		{
+		if (prev() != 13)
+			++lineNumber;
+		prevNewlinePos = position();
+		}
+	}
+
+bool FileToCharBuffer::refillBuffer(unsigned offset)
+	{
+	if (remaining  == 0)
+		return false;
+	if (offset == 0)
+		prevChar = buffer[inbuffer-1];
+	inbuffer = std::min(inbuffer - offset, remaining);
+	remaining -= inbuffer;
+	inf.read(buffer + offset, inbuffer);
+	pos = offset;
+	return true;
+	}
+
+
+MultiFormatReader::DataFormatType MultiFormatReader::formatNameToCode(const std::string &s)
+	{
+	std::string l(s);
+	NxsString::to_lower(l);
+	int ind = NxsString::index_in_array(l, gFormatNames, gNumFormats);
+	if (ind < 0)
+		return UNSUPPORTED_FORMAT;
+	NCL_ASSERT(ind < UNSUPPORTED_FORMAT);
+	return MultiFormatReader::DataFormatType(ind);
+	}
+
+
+
+/* Assumes that `contents` was returned from readFileToMemory() has been called
+	with `inf` and the `len` refers the size of the buffer allocated by
+	readFileToMemory
+*/
+bool  MultiFormatReader::readFastaSequences(
+	FileToCharBuffer & ftcb,
+	const NxsDiscreteDatatypeMapper &dm,
+	std::list<std::string> & taxaNames,
+	std::list<NxsDiscreteStateRow> & matList,
+	size_t & longest)
+	{
+	NCL_ASSERT(ftcb.buffer);
+	NxsString err;
+	for (;;)
+		{
+		if (ftcb.current() == '>' && ( ftcb.prev() == '\n' ||  ftcb.prev() == '\r'))
+			{
+			std::string n;
+			if (!ftcb.advance())
+				break;
+			for (;;)
+				{
+				char c = ftcb.current();
+				if (c == '\n' || c == '\r')
+					break;
+				n.append(1, c);
+				if (!ftcb.advance())
+					break;
+				}
+			std::string nameStripped = NxsString::strip_surrounding_whitespace(n);
+			if (this->coerceUnderscoresToSpaces)
+			    {
+			    NxsString x(nameStripped.c_str());
+			    x.UnderscoresToBlanks();
+			    nameStripped = x;
+			    }
+			taxaNames.push_back(nameStripped);
+
+			matList.push_back(NxsDiscreteStateRow());
+			if (!ftcb.advance())
+				break;
+			NxsDiscreteStateRow & row = *(matList.rbegin());
+			row.reserve(longest);
+			for (;;)
+				{
+				char c = ftcb.current();
+				if (c == '>' && (ftcb.prev() == '\n' || ftcb.prev() == '\r'))
+					break;
+				if (isgraph(c))
+					{
+					NxsDiscreteStateCell stateCode = dm.GetStateCodeStored(c);
+					if (stateCode == NXS_INVALID_STATE_CODE)
+						{
+						err << "Illegal state code \"" << c << "\" found when reading character " << (unsigned) row.size() << " for taxon " << n;
+						throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+						}
+					row.push_back(stateCode);
+					}
+				if (!ftcb.advance())
+					break;
+				}
+			longest = std::max(longest, row.size());
+			}
+		else 
+			{
+			if (isgraph(ftcb.current()))
+				{
+				err << "Illegal non-whitespace occurring outside of a name/sequence pair.  Expecting the first name to startwith > but found \"" << ftcb.current() << "\".";
+				throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+				}
+			if (!ftcb.advance())
+				break;
+			}
+		}
+	// pad with missing data to make even rows
+	std::list<NxsDiscreteStateRow>::iterator sIt = matList.begin();
+	bool allSameLength = true;
+	for (; sIt != matList.end(); ++sIt)
+		{
+		NxsDiscreteStateRow & row = *sIt;
+		if (row.size() < longest)
+			{
+			allSameLength = false;
+			break;
+			}
+		}
+	return allSameLength;
+	}
+
+std::string  MultiFormatReader::readPhylipName(FileToCharBuffer & ftcb, unsigned i, bool relaxedNames)
+	{
+	NxsString err;
+	std::string n;
+	if (relaxedNames)
+		{
+		do {
+			n.append(1,ftcb.current());
+			if (!ftcb.advance())
+				{
+				err << "End of file found when reading the name of taxon " << i+1 << ", \"" << n << "\"";
+				throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+				}
+			}
+		while (isgraph(ftcb.current()));
+		while (!isgraph(ftcb.current()))
+			{
+			if (!ftcb.advance())
+				{
+				err << "End of file found when expecting the beginning of the data for taxon " << i+1 << ", \"" << n << "\"";
+				throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+				}
+			}
+		}
+	else
+		{
+		std::string ws;
+		for (unsigned letter = 0; letter < PHYLIP_NMLNGTH; ++letter)
+			{
+			char c = ftcb.current();
+			if (isgraph(c))
+				{
+				n.append(ws);
+				n.append(1,c);
+				ws.clear();
+				}
+			else
+				ws.append(1, c);
+			if (!ftcb.advance())
+				{
+				err << "End of file found when reading the name for taxon " << i+1 << ", \"" << n << "\"";
+				throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+				}
+			}
+		}
+    if (this->coerceUnderscoresToSpaces)
+        {
+        NxsString x(n.c_str());
+        x.UnderscoresToBlanks();
+        n = x;
+        }
+
+	return n;
+	}
+
+void  MultiFormatReader::readPhylipData(
+	FileToCharBuffer & ftcb,
+	const NxsDiscreteDatatypeMapper &dm,
+	std::list<std::string> & taxaNames,
+	std::list<NxsDiscreteStateRow> & matList,
+	const unsigned n_taxa,
+	const unsigned n_char,
+	bool relaxedNames)
+	{
+	NCL_ASSERT(n_taxa > 0 && n_char > 0);
+	NxsString err;
+	matList.clear();
+	matList.assign(n_taxa, NxsDiscreteStateRow(n_char, NXS_INVALID_STATE_CODE));
+	std::list<NxsDiscreteStateRow>::iterator mIt = matList.begin();
+	while (!isgraph(ftcb.current()))
+		{
+		if (!ftcb.advance())
+			goto funcExit;
+		}
+
+	for (unsigned i = 0; i < n_taxa; ++i)
+		{
+		std::string n = readPhylipName(ftcb, i, relaxedNames);
+        taxaNames.push_back(n);
+		NCL_ASSERT(mIt != matList.end());
+		NxsDiscreteStateRow & row = *mIt++;
+		for (unsigned j = 0; j < n_char; ++j)
+			{
+			bool readChar = false;
+			for (;;)
+				{
+				const char c = ftcb.current();
+				if (isgraph(c))
+					{
+					if (isdigit(c))// I don't know why PHYLIP allows digits in the midst of the sequence, but it seems to.
+						{
+						err << "Number encountered (and ignored) within sequence for taxon " << n;
+						NexusWarn(err, NxsReader::PROBABLY_INCORRECT_CONTENT_WARNING, ftcb.position(), ftcb.line(), ftcb.column());
+						err.clear();
+						}
+					else
+						{
+						const NxsDiscreteStateCell stateCode = dm.GetStateCodeStored(c);
+						if (stateCode == NXS_INVALID_STATE_CODE)
+							{
+							if (c == '.')
+								{
+								if (i == 0)
+									{
+									err << "Illegal match character state code  \".\" found in the first taxon for character " << j + 1 ;
+									throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+									}
+								NxsDiscreteStateRow & firstRow = *(matList.begin());
+								row[j] = firstRow.at(j);
+								}
+							else
+								{
+								err << "Illegal state code \"" << c << "\" found when reading site " << j + 1 << " for taxon " << n;
+								throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+								}
+							}
+						else
+							row[j] = stateCode;
+						readChar = true;
+						}
+					}
+				if (!ftcb.advance())
+					goto funcExit;
+				if (readChar)
+					break;
+				}
+			}
+		char f = ftcb.current();
+		while (f != '\r' && f != '\n')
+			{
+			if (isgraph(f))
+				{
+				err << "Sequence longer than " << n_char << " found for taxon " << n << ". The character \""<< f << "\" was found, and will be ignored. If the file position of this error corresponds to sequences for the next taxon in the matrix, then that is an indication that the sequences for taxon " << n << " are too short.";
+				NexusWarn(err, NxsReader::PROBABLY_INCORRECT_CONTENT_WARNING, ftcb.position(), ftcb.line(), ftcb.column());
+				err.clear();
+				}
+			if (!ftcb.advance())
+				goto funcExit;
+			f = ftcb.current();
+			}
+		while (!isgraph(ftcb.current()))
+			{
+			if (!ftcb.advance())
+				goto funcExit;
+			}
+		}
+	funcExit:
+		if (matList.size() != n_taxa)
+			{
+			err << "Unexpected end of file.\nExpecting data for " << n_taxa << " taxa, but only found data for " << (unsigned) matList.size();
+			throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+			}
+		const NxsDiscreteStateRow & lastRow = *matList.rbegin();
+		if (lastRow.size() != n_char)
+			{
+			err << "Unexpected end of file.\nExpecting " << n_char << " characters for taxon " <<  *(taxaNames.rbegin()) << ", but only found " << (unsigned) lastRow.size() << " characters.";
+			throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+			}
+	}
+
+
+void  MultiFormatReader::readInterleavedPhylipData(
+	FileToCharBuffer & ftcb,
+	const NxsDiscreteDatatypeMapper &dm,
+	std::list<std::string> & taxaNames,
+	std::list<NxsDiscreteStateRow> & matList,
+	const unsigned n_taxa,
+	const unsigned n_char,
+	bool relaxedNames)
+	{
+	NCL_ASSERT(n_taxa > 0 && n_char > 0);
+	NxsString err;
+	matList.clear();
+	matList.assign(n_taxa, NxsDiscreteStateRow(n_char, NXS_INVALID_STATE_CODE));
+	std::list<NxsDiscreteStateRow>::iterator mIt = matList.begin();
+	unsigned startCharIndex = 0;
+	unsigned endCharIndex = n_char;
+	while (!isgraph(ftcb.current()))
+		{
+		if (!ftcb.advance())
+			goto funcExit;
+		}
+	while (startCharIndex < n_char)
+		{
+		for (unsigned i = 0; i < n_taxa; ++i)
+			{
+			if (startCharIndex == 0)
+				{
+				std::string n = readPhylipName(ftcb, i, relaxedNames);
+				taxaNames.push_back(n);
+				}
+			if (i == 0)
+				mIt = matList.begin();
+			NCL_ASSERT(mIt != matList.end());
+			NxsDiscreteStateRow & row = *mIt++;
+			unsigned j = startCharIndex;
+			for (;;)
+				{
+				const char c = ftcb.current();
+				if (isgraph(c))
+					{
+					if (j >= endCharIndex)
+						{
+						if (i == 0)
+							{
+							err << "Too many characters were found for the taxon " << *(taxaNames.begin());
+							throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+							}
+						else
+							{
+							std::list<std::string>::const_iterator nIt = taxaNames.begin();
+							for (unsigned q = 0; q < i ; ++q)
+								++nIt;
+							err << "Illegal character \"" << c << "\" found, after all of the data for this interleave page has been read for the taxon " << *nIt;
+							throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+							}
+						}
+					if (isdigit(c))// I don't know why PHYLIP allows digits in the midst of the sequence, but it seems to.
+						{
+						std::list<std::string>::const_iterator nIt = taxaNames.begin();
+						for (unsigned q = 0; q < i ; ++q)
+							++nIt;
+						err << "Number encountered (and ignored) within sequence for taxon " << *nIt;
+						NexusWarn(err, NxsReader::PROBABLY_INCORRECT_CONTENT_WARNING, ftcb.position(), ftcb.line(), ftcb.column());
+						err.clear();
+						}
+					else
+						{
+						const NxsDiscreteStateCell stateCode = dm.GetStateCodeStored(c);
+						if (stateCode == NXS_INVALID_STATE_CODE)
+							{
+							if (c == '.')
+								{
+								if (i == 0)
+									{
+									err << "Illegal match character state code  \".\" found in the first taxon for character " << j + 1 ;
+									throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+									}
+								NxsDiscreteStateRow & firstRow = *(matList.begin());
+								row[j] = firstRow.at(j);
+								}
+							else
+								{
+								std::list<std::string>::const_iterator nIt = taxaNames.begin();
+								for (unsigned q = 0; q < i ; ++q)
+									++nIt;
+								err << "Illegal state code \"" << c << "\" found when reading site " << j + 1 << " for taxon " << *nIt;
+								throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+								}
+							}
+						else
+							row[j] = stateCode;
+						j++;
+						}
+					}
+				else if (c == '\r' || c == '\n')
+					{
+					if (i == 0)
+						endCharIndex = j;
+					else if (j != endCharIndex)
+						{
+						std::list<std::string>::const_iterator nIt = taxaNames.begin();
+						for (unsigned q = 0; q < i ; ++q)
+							++nIt;
+						err << "Expecting " << endCharIndex -  startCharIndex << "characters  in this interleave page (based on the number of characters in the first taxon), but only found " << j - startCharIndex << " for taxon " << *nIt;
+						throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+						}
+					break;
+					}
+				if (!ftcb.advance())
+					goto funcExit;
+				}
+			while (!isgraph(ftcb.current()))
+				{
+				if (!ftcb.advance())
+					goto funcExit;
+				}
+			}
+		startCharIndex = endCharIndex;
+		endCharIndex = n_char;
+		}
+	funcExit:
+		if (matList.size() != n_taxa)
+			{
+			err << "Unexpected end of file.\nExpecting data for " << n_taxa << " taxa, but only found data for " << (unsigned) matList.size();
+			throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+			}
+		const NxsDiscreteStateRow & lastRow = *matList.rbegin();
+		if (lastRow.size() != n_char)
+			{
+			err << "Unexpected end of file.\nExpecting " << n_char << " characters for taxon " <<  *(taxaNames.rbegin()) << ", but only found " << (unsigned) lastRow.size() << " characters.";
+			throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+			}
+	}
+
+bool FileToCharBuffer::skip_to_beginning_of_line(char & next)
+	{
+	next = this->current();
+	for (;;)
+		{
+		const char c = next;
+		if (!this->advance_then_store(next))
+			return false;
+		if (c == '\n')
+			return true;
+		if (c == '\r')
+			{
+			if (next == '\n' && (!this->advance_then_store(next)))
+				return false;
+			return true;
+			}
+		}
+	}
+
+bool  MultiFormatReader::readAlnData(
+	FileToCharBuffer & ftcb,
+	const NxsDiscreteDatatypeMapper &dm,
+	std::list<std::string> & taxaNames,
+	std::list<NxsDiscreteStateRow> & matList)
+	{
+	taxaNames.clear();
+	NCL_ASSERT(ftcb.buffer);
+	NxsString err;
+	char c;
+	if (!ftcb.current())
+		throw NxsException("Could not read from file", ftcb.position(), ftcb.line(), ftcb.column());
+
+	c = ftcb.current();
+	unsigned index = 0;
+	const char * firstWord = "CLUSTAL";
+	std::string found;
+	const unsigned lenFirstWord = (unsigned const)strlen(firstWord);
+	while (index < lenFirstWord)
+		{
+		found.append(1, c);
+		if (toupper(c) != firstWord[index] || !ftcb.advance())
+			{
+			err << "Expecting file to start \"CLUSTAL\" found \"" << found << "\"";
+			throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+			}
+		++index;
+		c = ftcb.current();
+		}
+	do {
+		if (!ftcb.skip_to_beginning_of_line(c))
+			throw NxsException("Expecting multi-line file",ftcb.position(), ftcb.line(), ftcb.column());
+	} while (!isgraph(c));
+	bool readingFirstBlock = true;
+	for (;;)
+		{
+		// skip lines starting with whitespace
+		while (!isgraph(c))
+			{
+			if (!ftcb.skip_to_beginning_of_line(c))
+				{
+				if (taxaNames.empty())
+					throw NxsException("Sequences after clustal header", ftcb.position(), ftcb.line(), ftcb.column());
+				goto funcExit;
+				}
+			}
+		unsigned curr_tax_ind = 0;
+		std::list<std::string>::const_iterator taxNameIt;
+		std::list<NxsDiscreteStateRow>::iterator matRowIt;
+		if (!readingFirstBlock)
+			{
+			taxNameIt = taxaNames.begin();
+			matRowIt = matList.begin();
+			}
+		NxsDiscreteStateRow * row = NULL;
+		// this is the loop over taxa for a "page" of interleave data
+		for (;isgraph(c);)
+			{
+			std::string n;
+			for (;;)
+				{
+				n.append(1, c);
+				if (!ftcb.advance())
+					break;
+				c = ftcb.current();
+				if (!isgraph(c))
+					break;
+				}
+			if (readingFirstBlock)
+				{
+                if (this->coerceUnderscoresToSpaces)
+                    {
+                    NxsString x(n.c_str());
+                    x.UnderscoresToBlanks();
+                    n = x;
+                    }
+				taxaNames.push_back(n);
+				matList.push_back(NxsDiscreteStateRow());
+				row = &(*(matList.rbegin()));
+				}
+			else if (curr_tax_ind > taxaNames.size())
+				{
+				err << "Expecting a line beginning with whitespace (or a blank line), but found \"" << n << "\"";
+				throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+				}
+			else
+				{
+				std::string prev_name = *taxNameIt++;
+				if (!NxsString::case_insensitive_equals(prev_name.c_str(), n.c_str()))
+					{
+					err << "Expecting data for taxon # " << (1 + curr_tax_ind) << " \"" << prev_name << "\" but got \"" << n << "\"";
+					throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+					}
+				row = &(*matRowIt++);
+				}
+
+
+			while (ftcb.advance_then_store(c))
+				{
+				if (isgraph(c))
+					break;
+				}
+			if  (!isgraph(c))
+				{
+				err << "Unexpected end-of-file after taxon name \"" << n << "\"";
+				throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+				}
+			// this is the loop over states for a given taxon
+			bool eof = false;
+			bool eoseq = false;
+			for (;!eoseq;)
+				{
+				if (isgraph(c))
+					{
+					if (isdigit(c))
+						{
+						if (!ftcb.skip_to_beginning_of_line(c))
+							{
+							if (!readingFirstBlock && (curr_tax_ind + 1) != taxaNames.size())
+								{
+								err << "Unexpected End of file. Expecting data for " << (unsigned) taxaNames.size() << " sequences";
+								throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+								}
+							goto funcExit;
+							}
+						break;
+						}
+					else
+						{
+						NxsDiscreteStateCell stateCode = dm.GetStateCodeStored(c);
+						if (stateCode == NXS_INVALID_STATE_CODE)
+							{
+							err << "Illegal state code \"" << c << "\" found when reading character " << (unsigned long) row->size() << " for taxon " << n;
+							throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+							}
+						row->push_back(stateCode);
+						eof = !ftcb.advance_then_store(c);
+						}
+					}
+				if ((!eof) && (!isgraph(c)))
+					{
+					if (c == '\n')
+						{
+						eof = !ftcb.advance_then_store(c);
+						eoseq = true;
+						}
+					else if (c == '\r')
+						{
+						eof = !ftcb.advance_then_store(c);
+						if (!eof && c == '\n')
+							eof = !ftcb.advance_then_store(c);
+						eoseq = true;
+						}
+					else
+						eof = !ftcb.advance_then_store(c);
+					}
+				if (eof)
+					{
+					if (!readingFirstBlock && (curr_tax_ind + 1) != taxaNames.size())
+						{
+						err << "Unexpected End of file. Expecting data for " << (unsigned) taxaNames.size() << " sequences";
+						throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+						}
+					goto funcExit;
+					}
+				}
+			if (isgraph(c))
+				curr_tax_ind++;
+			else
+				{
+				if (!readingFirstBlock && (1 + curr_tax_ind) != taxaNames.size())
+					{
+					err << "Unexpected line beginning with whitespace. Expecting data for " << (unsigned) taxaNames.size() << " sequences";
+					throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+					}
+				curr_tax_ind = 0;
+				readingFirstBlock = false;
+				}
+			}
+		}
+
+	funcExit:
+		// pad with missing data to make even rows
+		std::list<NxsDiscreteStateRow>::iterator sIt = matList.begin();
+		long longest = -1;
+		for (; sIt != matList.end(); ++sIt)
+			{
+			NxsDiscreteStateRow & row = *sIt;
+			if (longest == -1)
+				longest = (long) row.size();
+			else if (longest != (long) row.size())
+				return false;
+			}
+		return true;
+	}
+
+void MultiFormatReader::addTaxaNames(const std::list<std::string> & taxaNames, NxsTaxaBlockAPI * taxa)
+	{
+	NCL_ASSERT(taxa);
+	std::list<std::string>::const_iterator nIt = taxaNames.begin();
+
+	std::vector<NxsNameToNameTrans> nameTrans;
+	bool nameTransNeeded = false;
+	NxsString t;
+
+	for (; nIt != taxaNames.end(); ++nIt)
+		{
+		std::string name = *nIt;
+		NxsNameToNameTrans trans(name, name);
+		for (unsigned i = 1; ; ++i)
+			{
+			try {
+				taxa->AddTaxonLabel(name);
+				break;
+				}
+			catch (DuplicatedLabelNxsException & x)
+				{
+				if (!this->conversionOutputRecord.addNumbersToDisambiguateNames)
+					throw;
+				nameTransNeeded = true;
+				t.assign(*nIt);
+				t << i;
+				trans.second = t;
+				name = t;
+				}
+			}
+		if (this->conversionOutputRecord.addNumbersToDisambiguateNames)
+			nameTrans.push_back(trans);
+		}
+
+
+	// write out a name translation file if we need to
+	if (nameTransNeeded && this->conversionOutputRecord.writeNameTranslationFile)
+		this->conversionOutputRecord.writeNameTranslation(nameTrans, taxa);
+	}
+
+void MultiFormatReader::moveDataToMatrix(std::list<NxsDiscreteStateRow> & matList,  NxsDiscreteStateMatrix &mat)
+	{
+	mat.clear();
+	mat.resize(matList.size());
+	NxsDiscreteStateMatrix::iterator dIt = mat.begin();
+	std::list<NxsDiscreteStateRow>::iterator sIt = matList.begin();
+	for (; sIt != matList.end(); ++sIt, ++dIt)
+		{
+		NxsDiscreteStateRow & source = *sIt;
+		NxsDiscreteStateRow & dest = *dIt;
+		dest.swap(source);
+		}
+	}
+
+void  MultiFormatReader::moveDataToDataBlock(const std::list<std::string> & taxaNames, std::list<NxsDiscreteStateRow> & matList, const unsigned nchar, NxsDataBlock * dataB)
+	{
+	NCL_ASSERT(dataB);
+	NxsString d;
+	d << "Dimensions ntax = " << (unsigned) matList.size() << " nchar = " << nchar << " ; ";
+	std::istringstream fakeDimStream(d);
+	NxsToken fakeDimToken(fakeDimStream);
+	NxsString newTaxLabel("NewTaxa");
+	NxsString ntaxLabel("NTax");
+	NxsString ncharLabel("NChar");
+	dataB->HandleDimensions(fakeDimToken, newTaxLabel, ntaxLabel, ncharLabel);
+
+	NCL_ASSERT(dataB->taxa);
+	addTaxaNames(taxaNames, dataB->taxa);
+
+	moveDataToMatrix(matList, dataB->discreteMatrix);
+	}
+
+void  MultiFormatReader::moveDataToUnalignedBlock(const std::list<std::string> & taxaNames, std::list<NxsDiscreteStateRow> & matList, NxsUnalignedBlock * uB)
+	{
+	NCL_ASSERT(uB);
+	NxsString d;
+	d << "Dimensions NewTaxa ntax = " << (unsigned) matList.size() << " ; ";
+	std::istringstream fakeDimStream(d);
+	NxsToken fakeDimToken(fakeDimStream);
+	uB->HandleDimensions(fakeDimToken);
+
+	NCL_ASSERT(uB->taxa);
+	addTaxaNames(taxaNames, uB->taxa);
+
+	moveDataToMatrix(matList, uB->uMatrix);
+	}
+
+void  MultiFormatReader::readFastaFile(std::istream & inf, NxsCharactersBlock::DataTypesEnum dt)
+	{
+	NxsString blockID("DATA");
+	NxsBlock *nb = cloneFactory.GetBlockReaderForID(blockID, this, NULL);
+	NCL_ASSERT(nb);
+	if (!nb)
+		return;
+	nb->SetNexus(this);
+
+	NxsDataBlock * dataB = static_cast<NxsDataBlock *>(nb); // this should be safe because we know that the PublicNexusReader has a DataBlock assigned to "DATA" -- unless the caller has replaced that clone template (gulp)
+	FileToCharBuffer ftcb(inf);
+	if (ftcb.buffer)
+		{
+		dataB->Reset();
+		dataB->datatype = dt;
+		dataB->ResetSymbols();
+		dataB->gap = '-';
+		NxsPartition dtParts;
+		std::vector<NxsCharactersBlock::DataTypesEnum> dtv;
+		dataB->CreateDatatypeMapperObjects(dtParts, dtv);
+
+		const NxsDiscreteDatatypeMapper * dm = dataB->GetDatatypeMapperForChar(0);
+
+		std::list<std::string> taxaNames;
+		std::list<NxsDiscreteStateRow> matList;
+		size_t longest = 0;
+		bool aligned = true;
+		try {
+			aligned = readFastaSequences(ftcb, *dm, taxaNames, matList, longest);
+			}
+		catch (...)
+			{
+			cloneFactory.BlockError(dataB);
+			throw;
+			}
+
+		if (aligned)
+			{
+			moveDataToDataBlock(taxaNames, matList, (unsigned int)longest, dataB);
+			BlockReadHook(blockID, dataB);
+			}
+		else
+			{
+			cloneFactory.BlockError(dataB);
+			blockID.assign("UNALIGNED");
+			NxsBlock * nub = cloneFactory.GetBlockReaderForID(blockID, this, NULL);
+			if (!nub)
+				{
+				NCL_ASSERT(nub);
+				return;
+				}
+			nub->SetNexus(this);
+
+			NxsUnalignedBlock * unalignedB = static_cast<NxsUnalignedBlock *>(nub); // this should be safe because we know that the PublicNexusReader has a DataBlock assigned to "DATA" -- unless the caller has replaced that clone template (gulp)
+			unalignedB->Reset();
+			unalignedB->datatype = dt;
+			unalignedB->ResetSymbols();
+			unalignedB->gap = '-';
+			unalignedB->ResetDatatypeMapper();
+			moveDataToUnalignedBlock(taxaNames, matList, unalignedB);
+			BlockReadHook(blockID, unalignedB);
+			}
+		}
+	else
+		{
+		cloneFactory.BlockError(dataB);
+		NxsString err;
+		err << "No Data read -- file appears to be empty";
+		this->NexusError(err, 0, -1, -1);
+		}
+	}
+
+
+/* Assumes that `contents` was returned from readFileToMemory() has been called
+	with `inf` and the `len` refers the size of the buffer allocated by
+	readFileToMemory
+*/
+bool  MultiFormatReader::readFinSequences(
+	FileToCharBuffer & ftcb,
+	NxsDiscreteDatatypeMapper &dm,
+	std::list<std::string> & taxaNames,
+	std::list<NxsDiscreteStateRow> & matList,
+	size_t & longest)
+	{
+	NCL_ASSERT(ftcb.buffer);
+	NxsString err;
+
+	std::string firstLine;
+	for (;;)
+		{
+		char c = ftcb.current();
+		if (c == '\n' || c == '\r')
+			break;
+		firstLine.append(1, c);
+		if (!ftcb.advance())
+			break;
+		}
+	std::string sfl = NxsString::strip_surrounding_whitespace(firstLine);
+	if (!NxsString::case_insensitive_equals(sfl.c_str(), "label data"))
+		{
+		err << "Expecting the first line of the file to contain just the words \"label data\", but found \"" << sfl << '\"';
+		throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+		}
+
+	for (;;)
+		{
+		const char cc = ftcb.current();
+		if (!isgraph(cc))
+			{
+			if (!ftcb.advance())
+				break;
+			}
+		else if (cc == '@')
+			break;
+		else 
+			{
+			std::string name;
+			bool commentLine= false;
+			if (ftcb.current() == '/')
+				{
+				if (!ftcb.advance())
+					{
+					err << "Unexpected end of file after / character";
+					throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+					}
+				if (ftcb.current() == '*')
+					{
+					commentLine = true;
+					bool prevStar = false;
+					for (;;)
+						{
+						if (!ftcb.advance())
+							{
+							err << "Unexpected end of file in comment";
+							throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+							}
+						char cmtc = ftcb.current();
+						if (prevStar && cmtc == '/')
+							break;
+						prevStar = (cmtc == '*');
+						}
+					if (!ftcb.advance())
+						break;
+					}
+				else
+					name.append(1, '/');
+				}
+			if (commentLine)
+				continue;
+			// read taxon name -- no escaping of characters will be done
+			for (;;)
+				{
+				char c = ftcb.current();
+				if (!isgraph(c))
+					break;
+				name.append(1, c);
+				if (!ftcb.advance())
+					break;
+				}
+			// skip ws
+			for (;;)
+				{
+				char sc = ftcb.current();
+				if (isgraph(sc))
+					break;
+				if (sc == '\n' || sc == '\r' || !ftcb.advance())
+					{
+					err << "Unexpected end of line (or end of file).  Expecting sequence for " << name;
+					throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+					}
+				}
+			if (this->coerceUnderscoresToSpaces)
+			    {
+			    NxsString x(name.c_str());
+			    x.UnderscoresToBlanks();
+			    name = x;
+			    }
+			taxaNames.push_back(name);
+			matList.push_back(NxsDiscreteStateRow());
+			NxsDiscreteStateRow & row = *(matList.rbegin());
+			row.reserve(longest);
+			// read sequence
+			for (;;)
+				{
+				char seqc = ftcb.current();
+				if (isgraph(seqc))
+					{
+					NxsDiscreteStateCell stateCode;
+					if (seqc == '[')
+						{
+						std::string recoded;
+						recoded.append(1, '{');
+						if (!ftcb.advance())
+							{
+							err << "Unexpected end of file is [ group!";
+							throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+							}
+						while (ftcb.current() != ']')
+							{
+							recoded.append(1, ftcb.current());
+							if (!ftcb.advance())
+								{
+								err << "Unexpected end of file is [ group!";
+								throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+								}
+							}
+						recoded.append(1, '}');
+						try{
+							NxsString nn;
+							nn << name;
+							stateCode = dm.StateCodeForNexusMultiStateSet('\0',
+  																	  recoded,
+  																	  0L,
+  																	  (unsigned int)taxaNames.size(),
+  																	  (unsigned int)row.size(),
+  																	  0L,
+  																	  nn);
+							}
+						catch (NxsException & x)
+							{
+							x.addPositionInfo(ftcb.position(), ftcb.line(), ftcb.column());
+							throw x;
+							}
+						}
+					else
+						{
+						stateCode = dm.GetStateCodeStored(seqc);
+						if (stateCode == NXS_INVALID_STATE_CODE)
+							{
+							err << "Illegal state code \"" << seqc << "\" found when reading character " << (unsigned) row.size() << " for taxon \"" << name << "\".";
+							throw NxsException(err, ftcb.position(), ftcb.line(), ftcb.column());
+							}
+						}
+					row.push_back(stateCode);
+					}
+				else if (seqc == '\n' || seqc == '\r')
+					break;
+				if (!ftcb.advance())
+					break;
+				}
+			longest = std::max(longest, row.size());
+			}
+		}
+	// pad with missing data to make even rows
+	std::list<NxsDiscreteStateRow>::iterator sIt = matList.begin();
+	bool allSameLength = true;
+	for (; sIt != matList.end(); ++sIt)
+		{
+		NxsDiscreteStateRow & row = *sIt;
+		if (row.size() < longest)
+			{
+			allSameLength = false;
+			break;
+			}
+		}
+	return allSameLength;
+	}
+
+
+void  MultiFormatReader::readFinFile(std::istream & inf, NxsCharactersBlock::DataTypesEnum dt)
+	{
+	NxsString blockID("DATA");
+	NxsBlock *nb = cloneFactory.GetBlockReaderForID(blockID, this, NULL);
+	NCL_ASSERT(nb);
+	if (!nb)
+		return;
+	nb->SetNexus(this);
+
+	NxsDataBlock * dataB = static_cast<NxsDataBlock *>(nb); // this should be safe because we know that the PublicNexusReader has a DataBlock assigned to "DATA" -- unless the caller has replaced that clone template (gulp)
+	FileToCharBuffer ftcb(inf);
+	if (ftcb.buffer)
+		{
+		dataB->Reset();
+		dataB->datatype = dt;
+		dataB->ResetSymbols();
+		dataB->gap = '-';
+		NxsPartition dtParts;
+		std::vector<NxsCharactersBlock::DataTypesEnum> dtv;
+		dataB->CreateDatatypeMapperObjects(dtParts, dtv);
+
+		NxsDiscreteDatatypeMapper * dm = dataB->GetMutableDatatypeMapperForChar(0);
+
+		std::list<std::string> taxaNames;
+		std::list<NxsDiscreteStateRow> matList;
+		size_t longest = 0;
+		bool aligned = true;
+		try {
+			aligned = readFinSequences(ftcb, *dm, taxaNames, matList, longest);
+			}
+		catch (...)
+			{
+			cloneFactory.BlockError(dataB);
+			throw;
+			}
+
+		if (aligned)
+			{
+			moveDataToDataBlock(taxaNames, matList, (unsigned int)longest, dataB);
+			BlockReadHook(blockID, dataB);
+			}
+		else
+			{
+			cloneFactory.BlockError(dataB);
+			blockID.assign("UNALIGNED");
+			NxsBlock * nub = cloneFactory.GetBlockReaderForID(blockID, this, NULL);
+			if (!nub)
+				{
+				NCL_ASSERT(nub);
+				return;
+				}
+			nub->SetNexus(this);
+
+			NxsUnalignedBlock * unalignedB = static_cast<NxsUnalignedBlock *>(nub); // this should be safe because we know that the PublicNexusReader has a DataBlock assigned to "DATA" -- unless the caller has replaced that clone template (gulp)
+			unalignedB->Reset();
+			unalignedB->datatype = dt;
+			unalignedB->ResetSymbols();
+			unalignedB->ResetDatatypeMapper();
+			moveDataToUnalignedBlock(taxaNames, matList, unalignedB);
+			BlockReadHook(blockID, unalignedB);
+			}
+		}
+	else
+		{
+		cloneFactory.BlockError(dataB);
+		NxsString err;
+		err << "No Data read -- file appears to be empty";
+		this->NexusError(err, 0, -1, -1);
+		}
+	}
+
+void  MultiFormatReader::ReadFilepath(const char * filepath, DataFormatType format)
+	{
+	if (format == NEXUS_FORMAT)
+		{
+		NxsReader::ReadFilepath(filepath);
+		}
+	else
+		{
+		std::ifstream inf;
+		try{
+			inf.open(filepath, std::ios::binary);
+			if (!inf.good())
+				{
+				NxsString err;
+				err << "Could not open the file \"" << filepath <<"\"";
+				this->NexusError(err, 0, -1, -1);
+				}
+			else
+				this->ReadStream(inf, format, filepath);
+			}
+		catch (NxsException & x)
+			{
+			this->NexusError(x.msg, x.pos, x.line, x.col);
+			}
+		catch (...)
+			{
+			NxsString err;
+			err << "Unknown error occurred while reading \"" << filepath <<"\"." ;
+			this->NexusError(err, 0, -1, -1);
+			}
+		
+		}
+	}
+
+void  MultiFormatReader::ReadStream(std::istream & inf, DataFormatType format, const char * filepath)
+	{
+	if (format == NEXUS_FORMAT)
+		{
+		NxsReader::ReadFilestream(inf);
+		}
+	else
+		{
+		if (format == FASTA_DNA_FORMAT)
+			readFastaFile(inf, NxsCharactersBlock::dna);
+		else if (format == FASTA_RNA_FORMAT)
+			readFastaFile(inf, NxsCharactersBlock::rna);
+		else if (format == FASTA_AA_FORMAT)
+			readFastaFile(inf, NxsCharactersBlock::protein);
+		else if (format == PHYLIP_DNA_FORMAT)
+			readPhylipFile(inf, NxsCharactersBlock::dna, false, false);
+		else if (format == PHYLIP_RNA_FORMAT)
+			readPhylipFile(inf, NxsCharactersBlock::rna, false, false);
+		else if (format == PHYLIP_AA_FORMAT)
+			readPhylipFile(inf, NxsCharactersBlock::protein, false, false);
+		else if (format == PHYLIP_DISC_FORMAT)
+			readPhylipFile(inf, NxsCharactersBlock::standard, false, false);
+		else if (format == INTERLEAVED_PHYLIP_DNA_FORMAT)
+			readPhylipFile(inf, NxsCharactersBlock::dna, false, true);
+		else if (format == INTERLEAVED_PHYLIP_RNA_FORMAT)
+			readPhylipFile(inf, NxsCharactersBlock::rna, false, true);
+		else if (format == INTERLEAVED_PHYLIP_AA_FORMAT)
+			readPhylipFile(inf, NxsCharactersBlock::protein, false, true);
+		else if (format == INTERLEAVED_PHYLIP_DISC_FORMAT)
+			readPhylipFile(inf, NxsCharactersBlock::standard, false, true);
+		else if (format == RELAXED_PHYLIP_DNA_FORMAT)
+			readPhylipFile(inf, NxsCharactersBlock::dna, true, false);
+		else if (format == RELAXED_PHYLIP_RNA_FORMAT)
+			readPhylipFile(inf, NxsCharactersBlock::rna, true, false);
+		else if (format == RELAXED_PHYLIP_AA_FORMAT)
+			readPhylipFile(inf, NxsCharactersBlock::protein, true, false);
+		else if (format == RELAXED_PHYLIP_DISC_FORMAT)
+			readPhylipFile(inf, NxsCharactersBlock::standard, true, false);
+		else if (format == INTERLEAVED_RELAXED_PHYLIP_DNA_FORMAT)
+			readPhylipFile(inf, NxsCharactersBlock::dna, true, true);
+		else if (format == INTERLEAVED_RELAXED_PHYLIP_RNA_FORMAT)
+			readPhylipFile(inf, NxsCharactersBlock::rna, true, true);
+		else if (format == INTERLEAVED_RELAXED_PHYLIP_AA_FORMAT)
+			readPhylipFile(inf, NxsCharactersBlock::protein, true, true);
+		else if (format == INTERLEAVED_RELAXED_PHYLIP_DISC_FORMAT)
+			readPhylipFile(inf, NxsCharactersBlock::standard, true, true);
+		else if (format == ALN_DNA_FORMAT)
+			readAlnFile(inf, NxsCharactersBlock::dna);
+		else if (format == ALN_RNA_FORMAT)
+			readAlnFile(inf, NxsCharactersBlock::rna);
+		else if (format == ALN_AA_FORMAT)
+			readAlnFile(inf, NxsCharactersBlock::protein);
+		else if (format == RELAXED_PHYLIP_TREE_FORMAT)
+			readPhylipTreeFile(inf, true);
+		else if (format == PHYLIP_TREE_FORMAT)
+			readPhylipTreeFile(inf, false);
+		else if (format == FIN_DNA_FORMAT)
+			readFinFile(inf, NxsCharactersBlock::dna);
+		else if (format == FIN_RNA_FORMAT)
+			readFinFile(inf, NxsCharactersBlock::rna);
+		else if (format == FIN_AA_FORMAT)
+			readFinFile(inf, NxsCharactersBlock::protein);
+		else
+			{
+			NxsString m;
+			if (filepath)
+				m << "The file " << filepath << " is not in a supported format.";
+			else
+				m << "Unsupported format.";
+			NexusError(m, 0, -1, -1);
+			return;
+			}
+		PostExecuteHook();
+		}
+	}
+// More tolerant than strict PHYLIP (tolerates any amount of whitespace before or
+// between ntax and nchar.
+// throws a NxsException if the header cannot be read.
+// returns the file position.
+unsigned MultiFormatReader::readPhylipHeader(std::istream & inf, unsigned & ntax, unsigned & nchar)
+	{
+	int ntaxi = 0;
+	int nchari = 0;
+	if (inf.good())
+		{
+		inf >> ntaxi;
+		}
+	else
+		{
+		NxsString err("Invalid file stream (this probably indicates an error occurred while opening the file).");
+		throw NxsException(err, 0, -1, -1);
+		}
+	
+	if (inf.good())
+		inf >> nchari;
+	else
+		{
+		NxsString err("A file error occurred while reading ntax.");
+		throw NxsException(err, 0, -1, -1);
+		}
+	if (!inf.good())
+		{
+		NxsString err("A file error occurred while reading ntax.");
+		throw NxsException(err, 0, -1, -1);
+		}
+	if (ntaxi < 1 || nchari < 1)
+		{
+		NxsString err("Expecting the file to start with positive number of taxa then the number of characters.");
+		throw NxsException(err, 0, -1, -1);
+		}
+	ntax = (unsigned) ntaxi;
+	nchar = (unsigned) nchari;
+	return (unsigned) inf.tellg();
+	}
+
+void MultiFormatReader::readPhylipTreeFile(std::istream & inf, bool relaxedNames)
+	{
+	NxsString blockID("TREES");
+	NxsBlock *nb = cloneFactory.GetBlockReaderForID(blockID, this, NULL);
+	NCL_ASSERT(nb);
+	if (!nb)
+		return;
+	nb->SetNexus(this);
+
+	/* this should be safe because we know that the PublicNexusReader has a
+		NxsTreesBlock assigned to "TREES" -- unless the caller has replaced that
+		clone template (gulp)
+	*/
+	NxsTreesBlock * treesB = static_cast<NxsTreesBlock *>(nb);
+	NxsString err;
+	try {
+		treesB->Reset();
+		NxsToken inTokens(inf);
+		treesB->ReadPhylipTreeFile(inTokens);
+		if (!relaxedNames)
+			{
+			const NxsTaxaBlockAPI * taxa = treesB->GetTaxaBlockPtr(0L);
+			if (!taxa)
+				{
+				err << "No taxa found in tree description (which probably means that no tree was found).";
+				throw NxsException(err, inTokens);
+				}
+			const std::vector<std::string> l = taxa->GetAllLabels();
+			for (std::vector<std::string>::const_iterator lIt = l.begin(); lIt != l.end(); ++lIt)
+				{
+				if (lIt->length() > PHYLIP_NMLNGTH)
+					{
+					err << "The taxon label " << *lIt << " has more than the allowed number of charcters (" << PHYLIP_NMLNGTH << ')';
+					throw NxsException(err);
+					}
+				}
+			}
+		BlockReadHook(blockID, treesB);
+		}
+	catch (...)
+		{
+		cloneFactory.BlockError(nb);
+		throw;
+		}
+	}
+
+/* if this returns NULL, then the read failed and gLogMessage will contain
+	and error message.
+*/
+void MultiFormatReader::readAlnFile(std::istream & inf, NxsCharactersBlock::DataTypesEnum dt)
+	{
+	NxsString blockID("DATA");
+	NxsBlock *nb = cloneFactory.GetBlockReaderForID(blockID, this, NULL);
+	NCL_ASSERT(nb);
+	if (!nb)
+		return;
+	nb->SetNexus(this);
+	/* this should be safe because we know that the PublicNexusReader has a
+		DataBlock assigned to "DATA" -- unless the caller has replaced that
+		clone template (gulp)
+	*/
+	NxsDataBlock * dataB = static_cast<NxsDataBlock *>(nb);
+
+	try {
+		dataB->Reset();
+		dataB->datatype = dt;
+		dataB->ResetSymbols();
+		dataB->gap = '-';
+		NxsPartition dtParts;
+		std::vector<NxsCharactersBlock::DataTypesEnum> dtv;
+		dataB->CreateDatatypeMapperObjects(dtParts, dtv);
+
+		const NxsDiscreteDatatypeMapper * dm = dataB->GetDatatypeMapperForChar(0);
+		NCL_ASSERT(dm);
+		FileToCharBuffer ftcb(inf);
+		if (ftcb.buffer)
+			{
+			std::list<std::string> taxaNames;
+			std::list<NxsDiscreteStateRow> matList;
+			if (!readAlnData(ftcb, *dm, taxaNames, matList))
+				throw NxsException("Expecting the same number of characters for all sequences in the ALN file");
+			const unsigned nchar = (unsigned const)matList.begin()->size();
+			moveDataToDataBlock(taxaNames, matList, nchar, dataB);
+			BlockReadHook(blockID, dataB);
+			}
+		}
+	catch (...)
+		{
+		cloneFactory.BlockError(nb);
+		throw;
+		}
+}
+
+/* if this returns NULL, then the read failed and gLogMessage will contain
+	and error message.
+*/
+void MultiFormatReader::readPhylipFile(std::istream & inf, NxsCharactersBlock::DataTypesEnum dt, bool relaxedNames, bool interleaved)
+	{
+	NxsString blockID("DATA");
+	NxsBlock *nb = cloneFactory.GetBlockReaderForID(blockID, this, NULL);
+	NCL_ASSERT(nb);
+	if (!nb)
+		return;
+	nb->SetNexus(this);
+	/* this should be safe because we know that the PublicNexusReader has a
+		DataBlock assigned to "DATA" -- unless the caller has replaced that
+		clone template (gulp)
+	*/
+	NxsDataBlock * dataB = static_cast<NxsDataBlock *>(nb);
+
+	try {
+		dataB->Reset();
+		dataB->datatype = dt;
+		dataB->ResetSymbols();
+		dataB->gap = '-';
+		NxsPartition dtParts;
+		std::vector<NxsCharactersBlock::DataTypesEnum> dtv;
+		dataB->CreateDatatypeMapperObjects(dtParts, dtv);
+
+		const NxsDiscreteDatatypeMapper * dm = dataB->GetDatatypeMapperForChar(0);
+		NCL_ASSERT(dm);
+		unsigned ntax = 0;
+		unsigned nchar = 0;
+		unsigned headerLen = readPhylipHeader(inf, ntax, nchar);
+		FileToCharBuffer ftcb(inf);
+		ftcb.totalSize += headerLen;
+		if (ftcb.buffer)
+			{
+			std::list<std::string> taxaNames;
+			std::list<NxsDiscreteStateRow> matList;
+			if (interleaved)
+				readInterleavedPhylipData(ftcb, *dm, taxaNames, matList, ntax, nchar, relaxedNames);
+			else
+				readPhylipData(ftcb, *dm, taxaNames, matList, ntax, nchar, relaxedNames);
+			moveDataToDataBlock(taxaNames, matList, nchar, dataB);
+			BlockReadHook(blockID, dataB);
+			}
+		}
+	catch (...)
+		{
+		cloneFactory.BlockError(nb);
+		throw;
+		}
+}
diff --git a/lib/ncl-2.1.18/ncl/nxsmultiformat.h b/lib/ncl-2.1.18/ncl/nxsmultiformat.h
new file mode 100644
index 0000000..79b50d2
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsmultiformat.h
@@ -0,0 +1,260 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis and Mark T. Holder
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#ifndef NCL_NXSMULTIFORMAT_H
+#define NCL_NXSMULTIFORMAT_H
+#include <iostream>
+
+#include "ncl/nxsdefs.h"
+#include "ncl/nxspublicblocks.h"
+class FileToCharBuffer;
+/*!
+	A special class of PublicNexusReader, that can parse
+		\li PHYLIP,
+		\li relaxed PHYLIP,
+		\li FASTA, and
+		\li ALN
+	formatted files in addition to NEXUS.  Non-NEXUS files are parsed and the
+	information from these files is added to the appropriate NxsBlock object.
+	So the parser essentially creates a the normal NCL interface even if the
+	input is not NEXUS
+*/
+class MultiFormatReader: public PublicNexusReader
+{
+	public:
+		/*! enumeration of all of the formats supported by MultiFormatReader
+
+			This enumeration type is used in calls to ReadStream and ReadFilepath
+			so that the reader knows what type of data to expect.
+		*/
+		enum DataFormatType
+			{
+				NEXUS_FORMAT,
+				FASTA_DNA_FORMAT,
+				FASTA_AA_FORMAT,
+				FASTA_RNA_FORMAT,
+				PHYLIP_DNA_FORMAT,
+				PHYLIP_RNA_FORMAT,
+				PHYLIP_AA_FORMAT,
+				PHYLIP_DISC_FORMAT,
+				INTERLEAVED_PHYLIP_DNA_FORMAT,
+				INTERLEAVED_PHYLIP_RNA_FORMAT,
+				INTERLEAVED_PHYLIP_AA_FORMAT,
+				INTERLEAVED_PHYLIP_DISC_FORMAT,
+				RELAXED_PHYLIP_DNA_FORMAT,
+				RELAXED_PHYLIP_RNA_FORMAT,
+				RELAXED_PHYLIP_AA_FORMAT,
+				RELAXED_PHYLIP_DISC_FORMAT,
+				INTERLEAVED_RELAXED_PHYLIP_DNA_FORMAT,
+				INTERLEAVED_RELAXED_PHYLIP_RNA_FORMAT,
+				INTERLEAVED_RELAXED_PHYLIP_AA_FORMAT,
+				INTERLEAVED_RELAXED_PHYLIP_DISC_FORMAT,
+				ALN_DNA_FORMAT,
+				ALN_RNA_FORMAT,
+				ALN_AA_FORMAT,
+				PHYLIP_TREE_FORMAT,
+				RELAXED_PHYLIP_TREE_FORMAT,
+				NEXML_FORMAT,
+				FIN_DNA_FORMAT,
+				FIN_AA_FORMAT,
+				FIN_RNA_FORMAT,
+				UNSUPPORTED_FORMAT // keep this last
+			};
+
+
+        void SetCoerceUnderscoresToSpaces(bool v) 
+            {
+            this->coerceUnderscoresToSpaces = v;
+            }
+
+        bool GetCoerceUnderscoresToSpaces() const
+            {
+            return this->coerceUnderscoresToSpaces;
+            }
+		
+		/*! \returns a vector with the "official" format names that can be used with formatNameToCode
+
+		Currently this list is:  {"nexus", "dnafasta", "aafasta", "rnafasta", "dnaphylip", "rnaphylip", "aaphylip", "discretephylip", "dnaphylipinterleaved", "rnaphylipinterleaved", "aaphylipinterleaved", "discretephylipinterleaved", "dnarelaxedphylip", "rnarelaxedphylip", "aarelaxedphylip", "discreterelaxedphylip", "dnarelaxedphylipinterleaved", "rnarelaxedphylipinterleaved", "aarelaxedphylipinterleaved", "discreterelaxedphylipinterleaved", "dnaaln", "rnaaln", "aaaln", "phyliptree", "relaxedp [...]
+
+		*/
+		static std::vector<std::string> getFormatNames();
+		/*! Converts a string such as "nexus" to the corresponding facet of the DataForamType enum.
+
+			Format names are not case sensitive
+		*/
+		static DataFormatType formatNameToCode(const std::string &);
+
+
+		/*!	Creates a new MultiFormatReader
+			\arg blocksToRead -1 indicates that every block type should be read.
+				alternatively, the caller can OR-together bits of the PublicNexusReader::NexusBlocksToRead enum
+				to indicate which blocks should be processed.
+			\arg mode should be a facet of the NxsReader::WarningHandlingMode enum
+				that indicates where warning messages should be directed.
+		*/
+		MultiFormatReader(const int blocksToRead = -1, NxsReader::WarningHandlingMode mode=NxsReader::WARNINGS_TO_STDERR)
+			:PublicNexusReader(blocksToRead, mode),
+			coerceUnderscoresToSpaces(false)
+			{}
+		virtual ~MultiFormatReader(){}
+		/*! Read the specified format
+			\arg inp the input stream
+			\arg formatName the "official" format name (list of legal choices is available from getFormatNames())
+		*/
+		void ReadStream(std::istream & inp, const char * formatName);
+		/*! Read the specified format
+			\arg inp the input stream
+			\arg format a facet of DataFormatType indicating the file format
+		*/
+		void ReadStream(std::istream & inp, DataFormatType format, const char * filepath=0L);
+
+		/*! Read a file of the specified format
+			\arg filepath the file path to open and read
+			\arg formatName the "official" format name (list of legal choices is available from getFormatNames())
+		*/
+		void ReadFilepath(const char * filepath, const char * formatName);
+		/*! Read a file of the specified format
+			\arg filepath the file path to open and read
+			\arg format a facet of DataFormatType indicating the file format
+		*/
+		void ReadFilepath(const char * filepath, DataFormatType format);
+
+		/*! A convenience function for reading FASTA files
+			\arg inf the input stream to read
+			\arg dt a facet of  NxsCharactersBlock::DataTypesEnum that indicates the expected datatype
+		*/
+		void readFastaFile(std::istream & inf, NxsCharactersBlock::DataTypesEnum dt);
+
+	private:
+		void addTaxaNames(const std::list<std::string> & taxaName, NxsTaxaBlockAPI * taxa);
+		void moveDataToDataBlock(const std::list<std::string> & taxaNames, std::list<NxsDiscreteStateRow> & matList, const unsigned nchar, NxsDataBlock * dataB);
+		void moveDataToMatrix(std::list<NxsDiscreteStateRow> & matList,  NxsDiscreteStateMatrix &mat);
+		void moveDataToUnalignedBlock(const std::list<std::string> & taxaNames, std::list<NxsDiscreteStateRow> & matList, NxsUnalignedBlock * uB);
+		bool readFastaSequences(FileToCharBuffer & ftcb, const NxsDiscreteDatatypeMapper &dm, std::list<std::string> & taxaNames, std::list<NxsDiscreteStateRow> & matList, size_t & longest);
+		bool readFinSequences(FileToCharBuffer & ftcb, NxsDiscreteDatatypeMapper &dm, std::list<std::string> & taxaNames, std::list<NxsDiscreteStateRow> & matList, size_t & longest);
+		void readPhylipFile(std::istream & inf, NxsCharactersBlock::DataTypesEnum dt, bool relaxedNames, bool interleaved);
+		void readPhylipTreeFile(std::istream & inf, bool relaxedNames);
+		void readAlnFile(std::istream & inf, NxsCharactersBlock::DataTypesEnum dt);
+		bool readAlnData(FileToCharBuffer & ftcb, const NxsDiscreteDatatypeMapper &dm, std::list<std::string> & taxaNames, std::list<NxsDiscreteStateRow> & matList);
+
+		unsigned readPhylipHeader(std::istream & inf, unsigned & ntax, unsigned & nchar);
+		void readPhylipData(FileToCharBuffer & ftcb, const NxsDiscreteDatatypeMapper &dm, std::list<std::string> & taxaNames, std::list<NxsDiscreteStateRow> & matList, const unsigned n_taxa, const unsigned n_char, bool relaxedNames);
+		void readInterleavedPhylipData(FileToCharBuffer & ftcb, const NxsDiscreteDatatypeMapper &dm, std::list<std::string> & taxaNames, std::list<NxsDiscreteStateRow> & matList, const unsigned n_taxa, const unsigned n_char, bool relaxedNames);
+		std::string readPhylipName(FileToCharBuffer & ftcb, unsigned i, bool relaxedNames);
+
+		/*! A convenience function for reading .fin files
+			\arg inf the input stream to read
+			\arg dt a facet of  NxsCharactersBlock::DataTypesEnum that indicates the expected datatype
+		*/
+		void readFinFile(std::istream & inf, NxsCharactersBlock::DataTypesEnum dt);
+		
+		bool coerceUnderscoresToSpaces;
+
+};
+
+/*! \enum MultiFormatReader::DataFormatType
+An enumeration of all of the formats supported by MultiFormatReader
+
+This enumeration type is used in calls to ReadStream and ReadFilepath
+so that the reader knows what type of data to expect.
+*/
+/*! var MultiFormatReader::NEXUS_FORMAT
+ read any NCL supported NEXUS block
+*/
+/*! var MultiFormatReader::FASTA_DNA_FORMAT
+ DNA sequence data in FASTA format
+*/
+/*! var MultiFormatReader::FASTA_AA_FORMAT
+ amino acid sequence data in FASTA format
+*/
+/*! var MultiFormatReader::FASTA_RNA_FORMAT
+ RNA sequence data in FASTA format
+*/
+/*! var MultiFormatReader::PHYLIP_DNA_FORMAT
+ DNA sequence data in non-interleaved PHYLIP format
+*/
+/*! var MultiFormatReader::PHYLIP_RNA_FORMAT
+ RNA sequence data in non-interleaved PHYLIP format
+*/
+/*! var MultiFormatReader::PHYLIP_AA_FORMAT
+ amino acid sequence data in non-interleaved PHYLIP format
+*/
+/*! var MultiFormatReader::PHYLIP_DISC_FORMAT
+ Discrete data (like the NEXUS "standard" format) in non-interleaved PHYLIP format
+*/
+/*! var MultiFormatReader::INTERLEAVED_PHYLIP_DNA_FORMAT
+ DNA sequence data in interleaved PHYLIP format
+*/
+/*! var MultiFormatReader::INTERLEAVED_PHYLIP_RNA_FORMAT
+ RNA sequence data in interleaved PHYLIP format
+*/
+/*! var MultiFormatReader::INTERLEAVED_PHYLIP_AA_FORMAT
+ amino acid sequence data in interleaved PHYLIP format
+*/
+/*! var MultiFormatReader::INTERLEAVED_PHYLIP_DISC_FORMAT
+ Discrete data (like the NEXUS "standard" format) data in interleaved PHYLIP format
+*/
+/*! var MultiFormatReader::RELAXED_PHYLIP_DNA_FORMAT
+ DNA sequence data in non-interleaved relaxed PHYLIP format
+*/
+/*! var MultiFormatReader::RELAXED_PHYLIP_RNA_FORMAT
+ RNA sequence data in non-interleaved relaxed PHYLIP format
+*/
+/*! var MultiFormatReader::RELAXED_PHYLIP_AA_FORMAT
+ amino acid sequence data in non-interleaved relaxed PHYLIP format
+*/
+/*! var MultiFormatReader::RELAXED_PHYLIP_DISC_FORMAT
+ Discrete data (like the NEXUS "standard" format) data in non-interleaved relaxed PHYLIP format
+*/
+/*! var MultiFormatReader::INTERLEAVED_RELAXED_PHYLIP_DNA_FORMAT
+ DNA sequence data in interleaved relaxed PHYLIP format
+*/
+/*! var MultiFormatReader::INTERLEAVED_RELAXED_PHYLIP_RNA_FORMAT
+ RNA sequence data in interleaved relaxed PHYLIP format
+*/
+/*! var MultiFormatReader::INTERLEAVED_RELAXED_PHYLIP_AA_FORMAT
+ Amino acid sequence data in interleaved relaxed PHYLIP format
+*/
+/*! var MultiFormatReader::INTERLEAVED_RELAXED_PHYLIP_DISC_FORMAT
+ Discrete data (like the NEXUS "standard" format) data in interleaved relaxed PHYLIP format
+*/
+/*! var MultiFormatReader::ALN_DNA_FORMAT
+ DNA sequence data in ALN format
+*/
+/*! var MultiFormatReader::ALN_RNA_FORMAT
+ RNA sequence data in ALN format
+*/
+/*! var MultiFormatReader::ALN_AA_FORMAT
+ Amino acid sequence data in ALN format
+*/
+/*! var MultiFormatReader::PHYLIP_TREE_FORMAT
+ Trees in NEWICK (PHYLIP) format
+*/
+/*! var MultiFormatReader::RELAXED_PHYLIP_TREE_FORMAT
+ Trees in NEWICK  format with relaxed phylip names
+*/
+/*! var MultiFormatReader::NEXML_FORMAT
+ NEXML formatted file currently unsupported, but support is planned
+*/
+/*! var MultiFormatReader::UNSUPPORTED_FORMAT
+For NCL internal use only ( to mark the end of the DataFormatType enum).
+*/
+
+#endif
+
diff --git a/lib/ncl-2.1.18/ncl/nxsmultiformat.lo b/lib/ncl-2.1.18/ncl/nxsmultiformat.lo
new file mode 100644
index 0000000..cb15a2f
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsmultiformat.lo
@@ -0,0 +1,12 @@
+# nxsmultiformat.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nxsmultiformat.o'
+
+# Name of the non-PIC object
+non_pic_object='nxsmultiformat.o'
+
diff --git a/lib/ncl-2.1.18/ncl/nxspublicblocks.cpp b/lib/ncl-2.1.18/ncl/nxspublicblocks.cpp
new file mode 100644
index 0000000..bbe6c30
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxspublicblocks.cpp
@@ -0,0 +1,808 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+
+
+#include <istream>
+#include <fstream>
+#include "ncl/nxspublicblocks.h"
+#include "ncl/nxsreader.h"
+using namespace std;
+
+
+/*! Registers the strings is the vector as taxon labels.
+
+	This is is a convenience function that creates a NxsTaxaBlock, fills it, and
+	then calls AddReadTaxaBlock.
+
+	\returns the block created.
+*/
+NxsTaxaBlock * PublicNexusReader::RegisterTaxa(const std::vector<std::string> & tl) {
+	if (tl.empty()) {
+		return 0L;
+	}
+	NxsTaxaBlock *tb = new NxsTaxaBlock();
+	tb->SetNtax( (unsigned)tl.size() );
+	for (std::vector<std::string>::const_iterator labelIt = tl.begin(); labelIt != tl.end(); ++labelIt)
+		tb->AddTaxonLabel(*labelIt);
+	AddReadTaxaBlock(tb);
+	return tb;
+}
+
+/*! A convenience function to get a list of NxsBlocks from a file path without having to create and dispose of a  PublicNexusReader object*/
+BlockReaderList PublicNexusReader::parseFileOrThrow(
+    const char *filepath, /* path of file to parse */
+    NxsReader::WarningHandlingMode mode,
+    bool parsePrivateBlocks, /* true to store the commands found in  private blocks */
+    bool storeTokenInfo)
+    {
+    PublicNexusReader nexusReader(mode);
+    return NxsReader::parseFileWithReader(nexusReader, filepath, parsePrivateBlocks, storeTokenInfo);
+    }
+
+BlockReaderList DefaultErrorReportNxsReader::parseFile(
+    const char *filepath, /* path of file to parse */
+    std::ostream * stdOutstream,
+    std::ostream * errOutstream,
+    bool parsePrivateBlocks, /* true to store the commands found in  private blocks */
+    bool storeTokenInfo)
+    {
+    DefaultErrorReportNxsReader nexusReader(stdOutstream, errOutstream);
+    return NxsReader::parseFileWithReader(nexusReader, filepath, parsePrivateBlocks, storeTokenInfo);
+    }
+
+/*! Convenience function for reading a filepath.
+   Returns a list of NxsBlock pointers (which the caller must delete)
+   corresponding to the NxsBlocks found in the file.
+   Raises NxsExceptions on errors.
+*/
+BlockReaderList NxsReader::parseFileWithReader(
+    NxsReader & nexusReader,
+    const char *filepath, /*!< path of file to parse */
+    bool parsePrivateBlocks, /*!< true to store the commands found in  private blocks */
+    bool storeTokenInfo) /*!< true for storage of full token info (such as file position) for private blocks */
+    {
+    if (!filepath)
+        nexusReader.NexusError("Invalid (NULL) file specified to be parsed", 0, -1, -1);
+    ifstream inf(filepath, ios::binary);
+    if (!inf.good())
+        {
+        NxsString err;
+        err << "Could not parse the file \"" << filepath <<"\"";
+        nexusReader.NexusError(err, 0, -1, -1);
+        }
+    nexusReader.statusMessage("Creating token");
+	NxsToken token(inf);
+	NxsDefaultPublicBlockFactory factory(parsePrivateBlocks, storeTokenInfo);
+	nexusReader.AddFactory(&factory);
+	try {
+        nexusReader.statusMessage("Executing");
+	    nexusReader.Execute(token);
+	    }
+	catch(...)
+	    {
+        nexusReader.RemoveFactory(&factory);
+        throw;
+	    }
+	nexusReader.RemoveFactory(&factory);
+	BlockReaderList brl = nexusReader.GetBlocksFromLastExecuteInOrder();
+	return brl;
+    }
+
+
+void NxsStoreTokensBlockReader::Reset()
+	{
+	NxsBlock::Reset();
+	commandsRead.clear();
+	}
+
+void NxsStoreTokensBlockReader::ReportConst(std::ostream &out) const
+	{
+	out << NCL_BLOCKTYPE_ATTR_NAME << " block contains ";
+	if (storeAllTokenInfo)
+		{
+		out << (unsigned)commandsRead.size() << " commands:\n";
+		for (std::list<ProcessedNxsCommand>::const_iterator cIt = commandsRead.begin(); cIt != commandsRead.end(); ++cIt)
+			{
+			const ProcessedNxsToken & t = (*cIt)[0];
+			out << "    " << t.GetToken() << "\n";
+			}
+		}
+	else
+		{
+		out << (unsigned)justTokens.size() << " commands:\n";
+		for (ListVecString::const_iterator cIt = justTokens.begin(); cIt != justTokens.end(); ++cIt)
+			out << "    " << cIt->at(0) << "\n";
+		}
+	}
+
+void NxsStoreTokensBlockReader::ReadCommand(
+  NxsToken &token)	/* the token used to read from in */
+	{
+	if (storeAllTokenInfo)
+		{
+		ProcessedNxsCommand fullTokens;
+		token.ProcessAsCommand(&fullTokens);
+		if (!fullTokens.empty())
+			commandsRead.push_back(fullTokens);
+		}
+	else
+		{
+		VecString justString;
+		while (!token.Equals(";"))
+			{
+			justString.push_back(token.GetToken());
+			token.GetNextToken();
+			}
+		if (!justString.empty())
+			justTokens.push_back(justString);
+		}
+	}
+
+void NxsStoreTokensBlockReader::Read(
+  NxsToken &token)	/* the token used to read from in */
+	{
+	isEmpty = false;
+	isUserSupplied = true;
+	NxsString begcmd("BEGIN ");
+	begcmd += this->NCL_BLOCKTYPE_ATTR_NAME;
+	DemandEndSemicolon(token, begcmd.c_str());
+
+	for(;;)
+		{
+		token.GetNextToken();
+        if (token.Equals("END") || token.Equals("ENDBLOCK"))
+            {
+            HandleEndblock(token);
+            return ;
+            }
+		this->ReadCommand(token);
+		}
+	}
+
+void NxsStoreTokensBlockReader::WriteAsNexus(std::ostream &out) const
+	{
+	out << "BEGIN " << NxsString::GetEscaped(this->NCL_BLOCKTYPE_ATTR_NAME) << ";\n";
+	if (storeAllTokenInfo)
+		{
+		for (std::list<ProcessedNxsCommand>::const_iterator cIt = commandsRead.begin(); cIt != commandsRead.end(); ++cIt)
+			{
+			const ProcessedNxsCommand & t = *cIt;
+			if (WriteCommandAsNexus(out, t))
+    			out << '\n';
+			}
+		}
+	else
+		{
+		for (ListVecString::const_iterator cIt = justTokens.begin(); cIt != justTokens.end(); ++cIt)
+			{
+			const VecString & t = *cIt;
+			out << "   ";
+			for (VecString::const_iterator wIt = t.begin(); wIt != t.end(); ++wIt)
+				out << ' ' << NxsString::GetEscaped(*wIt);
+			out << ";\n";
+			}
+		}
+	WriteSkippedCommands(out);
+	out << "END;\n";
+	}
+
+/*! Returns a new instance of a block  for the appropriate block type NCL_BLOCKTYPE_ATTR_NAME. \ref BlockTypeIDDiscussion
+*/
+NxsBlock  *NxsDefaultPublicBlockFactory::GetBlockReaderForID(
+  const std::string & NCL_BLOCKTYPE_ATTR_NAME, /*! \ref BlockTypeIDDiscussion */
+  NxsReader *reader,
+  NxsToken *token)
+	{
+	if (NCL_BLOCKTYPE_ATTR_NAME == "ASSUMPTIONS" || NCL_BLOCKTYPE_ATTR_NAME == "SETS")
+		return assumpBlockFact.GetBlockReaderForID(NCL_BLOCKTYPE_ATTR_NAME, reader, token);
+	if (NCL_BLOCKTYPE_ATTR_NAME == "CHARACTERS")
+		return charBlockFact.GetBlockReaderForID(NCL_BLOCKTYPE_ATTR_NAME, reader, token);
+	if (NCL_BLOCKTYPE_ATTR_NAME == "DATA")
+		return dataBlockFact.GetBlockReaderForID(NCL_BLOCKTYPE_ATTR_NAME, reader, token);
+	if (NCL_BLOCKTYPE_ATTR_NAME == "DISTANCES")
+		return distancesBlockFact.GetBlockReaderForID(NCL_BLOCKTYPE_ATTR_NAME, reader, token);
+	if (NCL_BLOCKTYPE_ATTR_NAME == "TAXA")
+		return taxaBlockFact.GetBlockReaderForID(NCL_BLOCKTYPE_ATTR_NAME, reader, token);
+	if (NCL_BLOCKTYPE_ATTR_NAME == "TREES")
+		return treesBlockFact.GetBlockReaderForID(NCL_BLOCKTYPE_ATTR_NAME, reader, token);
+	if (NCL_BLOCKTYPE_ATTR_NAME == "TAXAASSOCIATION")
+		return taxaAssociationBlockFact.GetBlockReaderForID(NCL_BLOCKTYPE_ATTR_NAME, reader, token);
+	if (NCL_BLOCKTYPE_ATTR_NAME == "UNALIGNED")
+		return unalignedBlockFact.GetBlockReaderForID(NCL_BLOCKTYPE_ATTR_NAME, reader, token);
+	if (tokenizeUnknownBlocks)
+		{
+		NxsStoreTokensBlockReader * nb = new NxsStoreTokensBlockReader(NCL_BLOCKTYPE_ATTR_NAME, storeTokenInfoArg);
+		nb->SetImplementsLinkAPI(false);
+    	return nb;
+        }
+	return NULL;
+	}
+
+/*! Creates a reader for the specified blocks.
+	The first argument is integer with bits that is composed of bits from PublicNexusReader::NexusBlocksToRead,
+		indicating which of the public blocks should be read. Either compose the
+		argument by ORing together bits (such as NEXUS_TREES_BLOCK_BIT|NEXUS_TAXA_BLOCK_BIT)
+		or simply pass in -1 to read all public blocks.
+	The "standard" NCL NxsBlock (NxsCharactersBlock, NxsTaxaBlock...) instances will be
+		created as initial clone block templates in the contained NxsCloneBlockFactory.
+		These instances can be altered by using getting pointers to them using the
+		GetAssumptionsBlockTemplate(), GetTaxaBlockTemplate()... methods.
+*/
+PublicNexusReader::PublicNexusReader(
+  const int blocksToRead, /*!< integer with bits that is composed of bits from PublicNexusReader::NexusBlocksToRead, indicating which of the public blocks should be read*/
+  NxsReader::WarningHandlingMode warnModeArg) /*!< warning mode (passed to ExceptionRaisingNxsReader::ExceptionRaisingNxsReader() */
+	:ExceptionRaisingNxsReader(warnModeArg),
+	bitsForBlocksToRead(blocksToRead),
+	assumptionsBlockTemplate(0L),
+	charactersBlockTemplate(0L),
+	dataBlockTemplate(0L),
+	distancesBlockTemplate(0L),
+	storerBlockTemplate(0L),
+	taxaBlockTemplate(0L),
+	taxaAssociationBlockTemplate(0L),
+	treesBlockTemplate(0L),
+	unalignedBlockTemplate(0L)
+{
+	this->AddFactory(&cloneFactory);
+
+	taxaBlockTemplate = new NxsTaxaBlock();
+	taxaBlockTemplate->SetImplementsLinkAPI(false);
+	cloneFactory.AddPrototype(taxaBlockTemplate);
+
+	if (blocksToRead & NEXUS_ASSUMPTIONS_BLOCK_BIT)
+		{
+		assumptionsBlockTemplate = new NxsAssumptionsBlock(0L);
+		assumptionsBlockTemplate->SetImplementsLinkAPI(true);
+		cloneFactory.AddPrototype(assumptionsBlockTemplate, "ASSUMPTIONS");
+		cloneFactory.AddPrototype(assumptionsBlockTemplate, "SETS");
+		cloneFactory.AddPrototype(assumptionsBlockTemplate, "CODONS");
+		}
+
+	if (blocksToRead & NEXUS_TREES_BLOCK_BIT)
+		{
+		treesBlockTemplate = new NxsTreesBlock(NULL);
+		treesBlockTemplate->SetCreateImpliedBlock(true);
+		treesBlockTemplate->SetImplementsLinkAPI(true);
+		treesBlockTemplate->SetProcessAllTreesDuringParse(true);
+		treesBlockTemplate->SetAllowImplicitNames(true);
+		treesBlockTemplate->SetWriteFromNodeEdgeDataStructure(true);
+		cloneFactory.AddPrototype(treesBlockTemplate);
+		}
+	if (blocksToRead & NEXUS_CHARACTERS_BLOCK_BIT)
+		{
+		charactersBlockTemplate = new NxsCharactersBlock(NULL, NULL);
+		charactersBlockTemplate->SetCreateImpliedBlock(true);
+		charactersBlockTemplate->SetImplementsLinkAPI(true);
+		charactersBlockTemplate->SetSupportMixedDatatype(true);
+		charactersBlockTemplate->SetConvertAugmentedToMixed(true);
+
+		dataBlockTemplate = new NxsDataBlock(NULL, NULL);
+		dataBlockTemplate->SetCreateImpliedBlock(true);
+		dataBlockTemplate->SetImplementsLinkAPI(true);
+		dataBlockTemplate->SetSupportMixedDatatype(true);
+		dataBlockTemplate->SetConvertAugmentedToMixed(true);
+		cloneFactory.AddPrototype(charactersBlockTemplate, "CHARACTERS");
+		cloneFactory.AddPrototype(dataBlockTemplate, "DATA");
+		}
+	if (blocksToRead & NEXUS_UNALIGNED_BLOCK_BIT)
+		{
+		unalignedBlockTemplate = new NxsUnalignedBlock(NULL);
+		unalignedBlockTemplate->SetCreateImpliedBlock(true);
+		unalignedBlockTemplate->SetImplementsLinkAPI(true);
+		cloneFactory.AddPrototype(unalignedBlockTemplate);
+		}
+	if (blocksToRead & NEXUS_DISTANCES_BLOCK_BIT)
+		{
+		distancesBlockTemplate = new NxsDistancesBlock(NULL);
+		distancesBlockTemplate->SetCreateImpliedBlock(true);
+		distancesBlockTemplate->SetImplementsLinkAPI(true);
+		cloneFactory.AddPrototype(distancesBlockTemplate);
+		}
+	if (blocksToRead & NEXUS_TAXAASSOCIATION_BLOCK_BIT)
+		{
+		taxaAssociationBlockTemplate = new NxsTaxaAssociationBlock();
+		cloneFactory.AddPrototype(taxaAssociationBlockTemplate);
+		}
+	if (blocksToRead & NEXUS_UNKNOWN_BLOCK_BIT)
+		{
+		std::string emptyString;
+		storerBlockTemplate = new NxsStoreTokensBlockReader(emptyString, true);
+		storerBlockTemplate->SetImplementsLinkAPI(false);
+		cloneFactory.AddDefaultPrototype(storerBlockTemplate);
+		}
+}
+
+/*! \ref NxsReader::Execute().  This method calls PostExecuteHook() after NxsReader::Execute
+		is completed.
+*/
+void PublicNexusReader::Execute(NxsToken& token, bool notifyStartStop)
+{
+	NxsReader::Execute(token, notifyStartStop);
+	PostExecuteHook();
+}
+
+/*! \ref Called after successful execute.
+	in the PublicNexusReader, this function up-casts blocks to the type that
+	they should be.
+
+	\warn if you derive from PublicNexusReader and change the type of the clone templates, then
+	you must override this function so that the casts in this function will be safe.
+*/
+void PublicNexusReader::PostExecuteHook()
+{
+	BlockReaderList blocks = GetBlocksFromLastExecuteInOrder();
+	for (BlockReaderList::const_iterator bIt = blocks.begin(); bIt != blocks.end(); ++bIt)
+		{
+		NxsBlock * b = *bIt;
+		const std::string NCL_BLOCKTYPE_ATTR_NAME = b->GetID();
+		const std::string capId = NxsString::get_upper(NCL_BLOCKTYPE_ATTR_NAME);
+		const char * capIdP = capId.c_str();
+		if (strcmp(capIdP, "TAXA") == 0)
+			taxaBlockVec.push_back(static_cast<NxsTaxaBlock *>(b));
+		else if (strcmp(capIdP, "TREES") == 0)
+			treesBlockVec.push_back(static_cast<NxsTreesBlock *>(b));
+		else if ((strcmp(capIdP, "CHARACTERS") == 0) || (strcmp(capIdP, "DATA") == 0))
+			charactersBlockVec.push_back(static_cast<NxsCharactersBlock *>(b));
+		else if ((strcmp(capIdP, "ASSUMPTIONS") == 0) || (strcmp(capIdP, "SETS") == 0) || (strcmp(capIdP, "CODONS") == 0))
+			assumptionsBlockVec.push_back(static_cast<NxsAssumptionsBlock *>(b));
+		else if (strcmp(capIdP, "DISTANCES") == 0)
+			distancesBlockVec.push_back(static_cast<NxsDistancesBlock *>(b));
+		else if (strcmp(capIdP, "TAXAASSOCIATION") == 0)
+			taxaAssociationBlockVec.push_back(static_cast<NxsTaxaAssociationBlock *>(b));
+		else if (strcmp(capIdP, "UNALIGNED") == 0)
+			unalignedBlockVec.push_back(static_cast<NxsUnalignedBlock *>(b));
+		else
+			{
+			storerBlockVec.push_back(static_cast<NxsStoreTokensBlockReader *>(b));
+			}
+		}
+}
+
+void PublicNexusReader::AddFactory(NxsBlockFactory *f)
+{
+	if (f == &cloneFactory)
+		NxsReader::AddFactory(f);
+	else
+		{
+		NCL_ASSERT(false);
+		}
+}
+
+PublicNexusReader::~PublicNexusReader()
+{
+	delete assumptionsBlockTemplate;
+	delete charactersBlockTemplate;
+	delete dataBlockTemplate;
+	delete distancesBlockTemplate;
+	delete storerBlockTemplate;
+	delete taxaBlockTemplate;
+	delete taxaAssociationBlockTemplate;
+	delete treesBlockTemplate;
+	delete unalignedBlockTemplate;
+}
+
+unsigned PublicNexusReader::GetNumAssumptionsBlocks(const NxsTaxaBlock *taxa) const
+	{
+	unsigned n = 0;
+	std::vector<NxsAssumptionsBlock *>::const_iterator bIt = assumptionsBlockVec.begin();
+	for (; bIt != assumptionsBlockVec.end(); ++bIt)
+		{
+		NxsAssumptionsBlock * b = *bIt;
+		if (taxa && taxa != b->taxa)
+			continue;
+		n++;
+		}
+	return n;
+	}
+
+NxsAssumptionsBlock * PublicNexusReader::GetAssumptionsBlock(const NxsTaxaBlock *taxa, unsigned index) const
+	{
+	unsigned n = 0;
+	std::vector<NxsAssumptionsBlock *>::const_iterator bIt = assumptionsBlockVec.begin();
+	for (; bIt != assumptionsBlockVec.end(); ++bIt)
+		{
+		NxsAssumptionsBlock * b = *bIt;
+		if (taxa && taxa != b->taxa)
+			continue;
+		if (index == n)
+			return b;
+		n++;
+		}
+	return 0L;
+	}
+
+unsigned PublicNexusReader::GetNumAssumptionsBlocks( const NxsCharactersBlock * chars) const
+	{
+	unsigned n = 0;
+	std::vector<NxsAssumptionsBlock *>::const_iterator bIt = assumptionsBlockVec.begin();
+	for (; bIt != assumptionsBlockVec.end(); ++bIt)
+		{
+		NxsAssumptionsBlock * b = *bIt;
+		if (chars && chars != b->charBlockPtr)
+			continue;
+		n++;
+		}
+	return n;
+	}
+
+NxsAssumptionsBlock * PublicNexusReader::GetAssumptionsBlock(const NxsCharactersBlock * chars, unsigned index) const
+	{
+	unsigned n = 0;
+	std::vector<NxsAssumptionsBlock *>::const_iterator bIt = assumptionsBlockVec.begin();
+	for (; bIt != assumptionsBlockVec.end(); ++bIt)
+		{
+		NxsAssumptionsBlock * b = *bIt;
+		if (chars && chars != b->charBlockPtr)
+			continue;
+		if (index == n)
+			return b;
+		n++;
+		}
+	return 0L;
+	}
+
+unsigned PublicNexusReader::GetNumAssumptionsBlocks(const NxsTreesBlock *tree) const
+	{
+	unsigned n = 0;
+	std::vector<NxsAssumptionsBlock *>::const_iterator bIt = assumptionsBlockVec.begin();
+	for (; bIt != assumptionsBlockVec.end(); ++bIt)
+		{
+		NxsAssumptionsBlock * b = *bIt;
+		if (tree && tree != b->treesBlockPtr)
+			continue;
+		n++;
+		}
+	return n;
+	}
+
+NxsAssumptionsBlock * PublicNexusReader::GetAssumptionsBlock(const NxsTreesBlock *tree, unsigned index) const
+	{
+	unsigned n = 0;
+	std::vector<NxsAssumptionsBlock *>::const_iterator bIt = assumptionsBlockVec.begin();
+	for (; bIt != assumptionsBlockVec.end(); ++bIt)
+		{
+		NxsAssumptionsBlock * b = *bIt;
+		if (tree && tree != b->treesBlockPtr)
+			continue;
+		if (index == n)
+			return b;
+		n++;
+		}
+	return 0L;
+	}
+
+unsigned PublicNexusReader::GetNumCharactersBlocks(const NxsTaxaBlock *taxa) const
+	{
+	unsigned n = 0;
+	std::vector<NxsCharactersBlock *>::const_iterator bIt = charactersBlockVec.begin();
+	for (; bIt != charactersBlockVec.end(); ++bIt)
+		{
+		NxsCharactersBlock * b = *bIt;
+		if (!taxa || taxa == b->taxa)
+			n++;
+		}
+	return n;
+	}
+
+NxsCharactersBlock * PublicNexusReader::GetCharactersBlock(const NxsTaxaBlock *taxa, unsigned index) const
+	{
+	unsigned n = 0;
+	std::vector<NxsCharactersBlock *>::const_iterator bIt = charactersBlockVec.begin();
+	for (; bIt != charactersBlockVec.end(); ++bIt)
+		{
+		NxsCharactersBlock * b = *bIt;
+		if (!taxa || taxa == b->taxa)
+			{
+			if (index == n)
+				return b;
+			n++;
+			}
+		}
+	return 0L;
+	}
+
+unsigned PublicNexusReader::GetNumDistancesBlocks(const NxsTaxaBlock *taxa) const
+	{
+	unsigned n = 0;
+	std::vector<NxsDistancesBlock *>::const_iterator bIt = distancesBlockVec.begin();
+	for (; bIt != distancesBlockVec.end(); ++bIt)
+		{
+		NxsDistancesBlock * b = *bIt;
+		if (!taxa || taxa == b->taxa)
+			n++;
+		}
+	return n;
+	}
+
+NxsDistancesBlock * PublicNexusReader::GetDistancesBlock(const NxsTaxaBlock *taxa, unsigned index) const
+	{
+	unsigned n = 0;
+	std::vector<NxsDistancesBlock *>::const_iterator bIt = distancesBlockVec.begin();
+	for (; bIt != distancesBlockVec.end(); ++bIt)
+		{
+		NxsDistancesBlock * b = *bIt;
+		if (!taxa || taxa == b->taxa)
+			{
+			if (index == n)
+				return b;
+			n++;
+			}
+		}
+	return 0L;
+	}
+
+unsigned PublicNexusReader::GetNumUnalignedBlocks(const NxsTaxaBlock *taxa) const
+	{
+	unsigned n = 0;
+	std::vector<NxsUnalignedBlock *>::const_iterator bIt = unalignedBlockVec.begin();
+	for (; bIt != unalignedBlockVec.end(); ++bIt)
+		{
+		NxsUnalignedBlock * b = *bIt;
+		if (!taxa || taxa == b->taxa)
+			n++;
+		}
+	return n;
+	}
+
+NxsUnalignedBlock * PublicNexusReader::GetUnalignedBlock(const NxsTaxaBlock *taxa, unsigned index) const
+	{
+	unsigned n = 0;
+	std::vector<NxsUnalignedBlock *>::const_iterator bIt = unalignedBlockVec.begin();
+	for (; bIt != unalignedBlockVec.end(); ++bIt)
+		{
+		NxsUnalignedBlock * b = *bIt;
+		if (!taxa || taxa == b->taxa)
+			{
+			if (index == n)
+				return b;
+			n++;
+			}
+		}
+	return 0L;
+	}
+
+
+unsigned PublicNexusReader::GetNumTaxaAssociationBlocks(const NxsTaxaBlock *taxa) const
+	{
+	unsigned n = 0;
+	std::vector<NxsTaxaAssociationBlock *>::const_iterator bIt = taxaAssociationBlockVec.begin();
+	for (; bIt != taxaAssociationBlockVec.end(); ++bIt)
+		{
+		NxsTaxaAssociationBlock * b = *bIt;
+		if (!taxa || taxa == b->GetFirstTaxaBlock() || taxa == b->GetSecondTaxaBlock())
+			n++;
+		}
+	return n;
+	}
+
+NxsTaxaAssociationBlock * PublicNexusReader::GetTaxaAssociationBlock(const NxsTaxaBlock *taxa, unsigned index) const
+	{
+	unsigned n = 0;
+	std::vector<NxsTaxaAssociationBlock *>::const_iterator bIt = taxaAssociationBlockVec.begin();
+	for (; bIt != taxaAssociationBlockVec.end(); ++bIt)
+		{
+		NxsTaxaAssociationBlock * b = *bIt;
+		if (!taxa || taxa == b->GetFirstTaxaBlock() || taxa == b->GetSecondTaxaBlock())
+			{
+			if (index == n)
+				return b;
+			n++;
+			}
+		}
+	return 0L;
+	}
+
+unsigned PublicNexusReader::GetNumTreesBlocks(const NxsTaxaBlock *taxa) const
+	{
+	unsigned n = 0;
+	std::vector<NxsTreesBlock *>::const_iterator bIt = treesBlockVec.begin();
+	for (; bIt != treesBlockVec.end(); ++bIt)
+		{
+		NxsTreesBlock * b = *bIt;
+		if (!taxa || taxa == b->taxa)
+			n++;
+		}
+	return n;
+	}
+
+NxsTreesBlock * PublicNexusReader::GetTreesBlock(const NxsTaxaBlock *taxa, unsigned index) const
+	{
+	unsigned n = 0;
+	std::vector<NxsTreesBlock *>::const_iterator bIt = treesBlockVec.begin();
+	for (; bIt != treesBlockVec.end(); ++bIt)
+		{
+		NxsTreesBlock * b = *bIt;
+		if (!taxa || taxa == b->taxa)
+			{
+			if (index == n)
+				return b;
+			n++;
+			}
+		}
+	return 0L;
+	}
+
+unsigned PublicNexusReader::GetNumUnknownBlocks() const
+	{
+	return (unsigned)storerBlockVec.size();
+	}
+
+NxsStoreTokensBlockReader * PublicNexusReader::GetUnknownBlock(unsigned index) const
+	{
+	if (index < storerBlockVec.size())
+		return storerBlockVec[index];
+	return 0L;
+	}
+
+unsigned PublicNexusReader::GetNumTaxaBlocks() const
+	{
+	return (unsigned)taxaBlockVec.size();
+	}
+
+NxsTaxaBlock * PublicNexusReader::GetTaxaBlock(unsigned index) const
+	{
+	if (index < taxaBlockVec.size())
+		return taxaBlockVec[index];
+	return 0L;
+	}
+
+void PublicNexusReader::ClearUsedBlockList()
+	{
+	NxsReader::ClearUsedBlockList();
+	assumptionsBlockVec.clear();
+	charactersBlockVec.clear();
+	dataBlockVec.clear();
+	distancesBlockVec.clear();
+	storerBlockVec.clear();
+	taxaBlockVec.clear();
+	taxaAssociationBlockVec.clear();
+	treesBlockVec.clear();
+	unalignedBlockVec.clear();
+	}
+
+
+
+
+bool fileExists(const std::string &fn);
+
+// this is not a great way to check for existence - we may lack read permissions.
+bool fileExists(const std::string &fn)
+{
+	std::ifstream inf;
+	inf.open(fn.c_str());
+	const bool b = inf.good();
+	inf.close();
+	return b;
+}
+
+std::string NxsConversionOutputRecord::getUniqueFilenameWithLowestIndex(const char * prefix)
+{
+	NxsString fn;
+	fn.assign(prefix);
+	const unsigned MAX_SUFFIX =  10000;
+	for (unsigned i = 1; i <= MAX_SUFFIX ; ++i)
+		{
+		if (!fileExists(fn))
+			return fn;
+		fn.assign(prefix);
+		fn << i;
+		}
+	fn.clear();
+	fn << "Files \"" << prefix << "\" through \"" << prefix << MAX_SUFFIX << "\" exist, and I am afraid to write any more files to that directory. I quit.";
+	throw NxsException(fn);
+}
+
+// writes the name pairs separated by newlines to a file whose filepath is specified
+//	by fn.
+void NxsConversionOutputRecord::writeTaxonNameTranslationFilepath(const char * fn, const std::vector<NxsNameToNameTrans> & nameTrans, const NxsTaxaBlockAPI *tb, bool verbose)
+{
+	std::ofstream tnf;
+	tnf.open(fn);
+	if (!tnf.good())
+		{
+		NxsString msg;
+		msg << "Could not open the file " << fn << " for writing translation of names";
+		throw NxsException(msg);
+		}
+	if (verbose)
+		std::cerr << "Writing \"" << fn << "\" to store the translation of names\n";
+	writeTaxonNameTranslationStream(tnf, nameTrans, tb);
+	tnf.close();
+}
+
+
+// writes the name pairs separated by newlines to the ostream tnf
+void NxsConversionOutputRecord::writeTaxonNameTranslationStream(std::ostream & tnf, const std::vector<NxsNameToNameTrans> & nameTrans, const NxsTaxaBlockAPI *tb)
+{
+	std::string blockLabel = tb->GetTitle();
+	tnf << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+	tnf << "<taxa label=";
+	writeAttributeValue(tnf, blockLabel);
+	tnf << " >\n";
+	for (std::vector<NxsNameToNameTrans>::const_iterator nIt = nameTrans.begin(); nIt != nameTrans.end(); ++nIt)
+		{
+		tnf << " <taxon src=";
+		writeAttributeValue(tnf, nIt->first);
+		tnf << " dest=";
+		writeAttributeValue(tnf, nIt->second);
+		tnf << " />\n";
+		}
+	tnf << "</taxa>\n";
+}
+
+void NxsConversionOutputRecord::writeNameTranslation(std::vector<NxsNameToNameTrans> nameTrans, const NxsTaxaBlockAPI * taxa)
+	{
+	if (taxaBlocksToConversionFiles.find(taxa) != taxaBlocksToConversionFiles.end())
+		return;
+	std::string fn;
+	if (this->numberTranslationFiles)
+		fn = getUniqueFilenameWithLowestIndex(this->translationFilename.c_str());
+	else
+		fn = this->translationFilename;
+	writeTaxonNameTranslationFilepath(fn.c_str(), nameTrans, taxa, this->verboseWritingOfNameTranslationFile);
+	taxaBlocksToConversionFiles[taxa] = fn;
+	}
+
+void writeAttributeValue(ostream & out, const std::string & v)
+	{
+	if (v.c_str() == NULL)
+		out << "\'\'";
+	else
+		{
+
+		if (v.find_first_of("\'\"&") != string::npos)
+			{
+			if (strchr(v.c_str(), '\'') != NULL)
+				{
+				out << '\"';
+				for (std::string::const_iterator cIt = v.begin(); cIt != v.end(); ++cIt)
+					{
+					const char & c = *cIt;
+					if (c == '\"')
+						out << """;
+					else if (c == '&')
+						out << "&";
+					else
+						out << c;
+					}
+				out << '\"';
+
+				}
+			else
+				{
+				out << '\'';
+				for (std::string::const_iterator cIt = v.begin(); cIt != v.end(); ++cIt)
+					{
+					const char & c = *cIt;
+					if (c == '&')
+						out << "&";
+					else
+						out << c;
+					}
+				out << '\'';
+				}
+			}
+		else
+			out << '\'' << v << '\'';
+		}
+	}
+
+
+
diff --git a/lib/ncl-2.1.18/ncl/nxspublicblocks.h b/lib/ncl-2.1.18/ncl/nxspublicblocks.h
new file mode 100644
index 0000000..9970456
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxspublicblocks.h
@@ -0,0 +1,731 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+#ifndef NCL_NXSPUBLICBLOCKS_H
+#define NCL_NXSPUBLICBLOCKS_H
+
+#include <vector>
+#include "ncl/nxsdefs.h"
+#include "ncl/nxsblock.h"
+#include "ncl/nxsassumptionsblock.h"
+#include "ncl/nxscharactersblock.h"
+#include "ncl/nxsdatablock.h"
+#include "ncl/nxsdistancesblock.h"
+#include "ncl/nxstaxablock.h"
+#include "ncl/nxstaxaassociationblock.h"
+#include "ncl/nxstreesblock.h"
+#include "ncl/nxsunalignedblock.h"
+#include "ncl/nxsreader.h"
+
+class NxsStoreTokensBlockReader
+	: public NxsBlock
+	{
+	public:
+		/*---------------------------------------------------------------------------------------
+		| If the blockname is empty then, any block will be read by the instance
+		*/
+		NxsStoreTokensBlockReader(std::string blockName, bool storeTokenInfo)
+			:storeAllTokenInfo(storeTokenInfo),
+			tolerateEOFInBlock(false)
+			{
+			NCL_BLOCKTYPE_ATTR_NAME = NxsString(blockName.c_str());
+			}
+		void Read(NxsToken &token);
+		void Reset();
+		void Report(std::ostream &out) NCL_COULD_BE_CONST  /*v2.1to2.2 1 */
+			{
+			ReportConst(out);
+			}
+		void WriteAsNexus(std::ostream &out) const;
+		/*---------------------------------------------------------------------------------------
+		| Results in aliasing of the taxa, assumptionsBlock blocks!
+		*/
+		NxsStoreTokensBlockReader & operator=(const NxsStoreTokensBlockReader &other)
+			{
+			Reset();
+			CopyBaseBlockContents(static_cast<const NxsBlock &>(other));
+			commandsRead = other.commandsRead;
+			justTokens = other.justTokens;
+			storeAllTokenInfo = other.storeAllTokenInfo;
+			tolerateEOFInBlock = other.tolerateEOFInBlock;
+			return *this;
+			}
+
+		NxsStoreTokensBlockReader * Clone() const
+			{
+			NxsStoreTokensBlockReader * b = new NxsStoreTokensBlockReader(NCL_BLOCKTYPE_ATTR_NAME, storeAllTokenInfo);
+			*b = *this;
+			return b;
+			}
+		/*! \ref BlockTypeIDDiscussion */
+		virtual bool CanReadBlockType(const NxsToken & token)
+			{
+			if (NCL_BLOCKTYPE_ATTR_NAME.length() == 0)
+				{
+				NCL_BLOCKTYPE_ATTR_NAME.assign(token.GetTokenReference().c_str());
+				NCL_BLOCKTYPE_ATTR_NAME.ToUpper();
+				return true;
+				}
+			return token.Equals(NCL_BLOCKTYPE_ATTR_NAME);
+			}
+		virtual bool TolerateEOFInBlock() const
+			{
+			return tolerateEOFInBlock; /*  */
+			}
+		void SetTolerateEOFInBlock(bool v)
+			{
+			tolerateEOFInBlock = v;
+			}
+		const std::list<ProcessedNxsCommand> & GetCommands() const
+			{
+			return commandsRead;
+			}
+	protected:
+		void ReadCommand(NxsToken &token);
+		void ReportConst(std::ostream &out) const;
+
+		typedef std::vector<std::string> VecString;
+		typedef std::list<VecString> ListVecString;
+
+
+		std::list<ProcessedNxsCommand> commandsRead;
+		ListVecString justTokens;
+		bool storeAllTokenInfo;
+		bool tolerateEOFInBlock;
+	};
+/*!
+ 	A factory class that delegates calls to the other "default" public block parsers that NCL provides.
+
+	Provided as a convenience class to make it possible to read all supported blocks with the addition of one factory
+		to the NxsReader.
+
+
+*/
+class NxsDefaultPublicBlockFactory
+	: public NxsBlockFactory
+	{
+	public:
+		/**----------------------------------------------------------------------------------------------------------------------
+		|	Constructor takes two booleans.
+		|	If readUnknownBlocks is "true" then a NxsStoreTokensBlockReader will be spawned for every unknown block.
+		|	storeTokenInfo is passed to the NxsStoreTokensBlockReader constructor (true for storage of full token info - such as
+		|		file position.
+		*/
+		NxsDefaultPublicBlockFactory(bool readUnknownBlocks, bool storeTokenInfo)
+			:tokenizeUnknownBlocks(readUnknownBlocks),
+			storeTokenInfoArg(storeTokenInfo)
+			{}
+		virtual NxsBlock  *	GetBlockReaderForID(const std::string & NCL_BLOCKTYPE_ATTR_NAME, NxsReader *reader, NxsToken *token);
+
+	protected:
+		NxsAssumptionsBlockFactory assumpBlockFact;
+		NxsCharactersBlockFactory charBlockFact;
+		NxsDataBlockFactory dataBlockFact;
+		NxsDistancesBlockFactory distancesBlockFact;
+		NxsTaxaBlockFactory taxaBlockFact;
+		NxsTaxaAssociationBlockFactory taxaAssociationBlockFact;
+		NxsTreesBlockFactory treesBlockFact;
+		NxsUnalignedBlockFactory unalignedBlockFact;
+
+		bool tokenizeUnknownBlocks;
+		bool storeTokenInfoArg;
+	};
+
+
+/*!
+ 	A factory class that takes examplar that will be cloned to read each block.
+
+	To use this factory you MUST overload NxsBlock::Clone() for class that you would like to use to parse blocks
+*/
+class NxsCloneBlockFactory
+	: public NxsBlockFactory
+	{
+	public:
+		NxsCloneBlockFactory()
+			:defPrototype(NULL)
+			{}
+		/*! \returns a new NxsBlock instance (or NULL) to read the NEXUS content
+		in a block of name `NCL_BLOCKTYPE_ATTR_NAME`.
+
+			This function is called by the NxsReader during the parse if no
+			NxsBlock instances for this block ID type were added to the reader.
+		*/
+		virtual NxsBlock  *	GetBlockReaderForID(const std::string & NCL_BLOCKTYPE_ATTR_NAME, /*!< The block ID \ref BlockTypeIDDiscussion */
+								NxsReader *, /*!< pointer to the NxsReader that is conducting the parse */
+								NxsToken *) /*!< pointer to the current NxsToken object that wraps the istream (this function should not advance the token) */
+			{
+			std::string b(NCL_BLOCKTYPE_ATTR_NAME.c_str());
+			NxsString::to_upper(b);
+			std::map<std::string , const NxsBlock *>::const_iterator pIt = prototypes.find(b);
+			if (pIt == prototypes.end())
+				return (defPrototype ? defPrototype->Clone() : NULL);
+			return pIt->second->Clone();
+			}
+
+		/*! Registers a block instance to be used whenever an unknown block (any
+		block with an ID that does not correspond with any of the registered blocks)
+		is encountered in a file.
+		*/
+		bool AddDefaultPrototype(const NxsBlock * exemplar)
+			{
+			bool replaced = defPrototype != NULL;
+			defPrototype = exemplar;
+			return replaced;
+			}
+		/*! Registers the block instance passed in as a template to clone a block reader
+			whenever a block with the name `blockName` is encountered.
+		*/
+		bool AddPrototype(const NxsBlock * exemplar, /*!< The block to be cloned */
+						  const char * blockName = NULL) /*!< The block ID \ref BlockTypeIDDiscussion */
+			{
+			std::string b;
+			if (blockName)
+				b.assign(blockName);
+			else
+				{
+				if (exemplar == NULL)
+					return false;
+				NxsString bId  = exemplar->GetID();
+				b.assign(bId.c_str());
+				}
+			NxsString::to_upper(b);
+			bool replaced = prototypes.find(b) != prototypes.end();
+			prototypes[b] = exemplar;
+			return replaced;
+			}
+
+	protected:
+		std::map<std::string , const NxsBlock *> prototypes;
+		const NxsBlock * defPrototype;
+	};
+
+
+
+typedef std::pair<std::string, std::string> NxsNameToNameTrans;
+
+/*! hacky (home-spun)  writing of XML attributes */
+void writeAttributeValue(std::ostream & out, const std::string & v);
+
+/*! This class is used internally to keep track of operations that may be needed
+to make taxon labels from different sources avoid clashing with each other.
+*/
+class NxsConversionOutputRecord
+	{
+	public:
+
+		NxsConversionOutputRecord()
+			:addNumbersToDisambiguateNames(false),
+			writeNameTranslationFile(true),
+			translationFilename("NameTranslationFile"),
+			numberTranslationFiles(true),
+			verboseWritingOfNameTranslationFile(true)
+			{}
+
+		void writeNameTranslation(std::vector<NxsNameToNameTrans>, const NxsTaxaBlockAPI * );
+
+		static std::string getUniqueFilenameWithLowestIndex(const char * prefix);
+		static void writeTaxonNameTranslationFilepath(const char * fn, const std::vector<NxsNameToNameTrans> & nameTrans, const NxsTaxaBlockAPI *, bool verbose=false);
+		static void writeTaxonNameTranslationStream(std::ostream & fn, const std::vector<NxsNameToNameTrans> & nameTrans, const NxsTaxaBlockAPI *);
+
+		//The following set of members were added to deal with name clashes that
+		//	are legal (but a very bad idea) in phylip.  If names are auto-translated
+		//	to unique names (by the addition of numbers, then it is very useful to print out a file
+		//	listing the translations.
+		bool addNumbersToDisambiguateNames; // if true, then taxon names may be altered on reading to  make them unique
+		bool writeNameTranslationFile; // if true, and taxon names are modified, then a translation file will be written
+		std::string translationFilename; // if writeNameTranslationFile is used, then this will be the file name or prefix
+		bool numberTranslationFiles; // if true, then translationFilename will serve as a prefix and the real filename may contain a number to make it unique.
+		bool verboseWritingOfNameTranslationFile; // if true, then writing a translationFilename will trigger a message to std::cerr
+		std::map<const NxsTaxaBlockAPI *, std::string> taxaBlocksToConversionFiles;
+	};
+
+
+/*!
+A NxsReader that uses clone factories to read public blocks.
+
+The blocks created by reading a file MUST BE DELETED by the caller (either by a
+	call to DeleteBlocksFromFactories() or by requesting each pointer to a block
+	and then deleting the blocks).
+
+Blocks are created by cloning a template block. If you would like to alter
+	the default behavior of a block, you can request a reference to the
+	"template" NxsBlock of the appropriate type, modify it, and then parse the file.
+
+You may give the reader "context" programatically by adding "Read" blocks (which
+	will mimic the behavior of those blocks having appeared in the file itself.
+
+Commands in Non-public blocks are dealt with by creating a NxsStoreTokensBlockReader
+	to store the commands.
+
+After parsing, the client can request the number of TAXA blocks read, and the
+	number of CHARACTERS, TREES, ... blocks that refer to a particular taxa
+	block.
+
+
+
+NOT COPYABLE
+*/
+class PublicNexusReader: public ExceptionRaisingNxsReader
+	{
+	public:
+
+		static BlockReaderList parseFileOrThrow(const char *filepath,
+												NxsReader::WarningHandlingMode mode = NxsReader::WARNINGS_TO_STDERR,
+												bool parsePrivateBlocks=true,
+												bool storeTokenInfo=true);
+
+		/*! Enumeration of bits used that can be "ORed" together to create an argument for
+			PublicNexusReader instance that will only read certain NEXUS blocks
+		*/
+		enum NexusBlocksToRead
+		{
+			NEXUS_TAXA_BLOCK_BIT = 0x01, /// Flags TAXA blocks as a type to be read
+			NEXUS_TREES_BLOCK_BIT = 0x02, /// Flags TREES blocks as a type to be read
+			NEXUS_CHARACTERS_BLOCK_BIT = 0x04, /// Flags CHARACTERS and DATA blocks as types to be read
+			NEXUS_ASSUMPTIONS_BLOCK_BIT = 0x08, /// Flags ASSUMPTIONS blocks as a type to be read
+			NEXUS_SETS_BLOCK_BIT = 0x10, /// Flags SETS blocks as a type to be read
+			NEXUS_UNALIGNED_BLOCK_BIT = 0x20, /// Flags UNALIGNED blocks as a type to be read
+			NEXUS_DISTANCES_BLOCK_BIT = 0x40, /// Flags DISTANCES blocks as a type to be read
+			NEXUS_TAXAASSOCIATION_BLOCK_BIT = 0x80, /// Flags TAXAASSOCIATION blocks to be read
+			NEXUS_UNKNOWN_BLOCK_BIT = 0x100 /// to be used internally
+		};
+
+		/*!	Creates a new PublicNexusReader
+			\arg blocksToRead -1 indicates that every block type should be read.
+				alternatively, the caller can OR-together bits of the NexusBlocksToRead enum
+				to indicate which blocks should be processed.
+			\arg mode should be a facet of the NxsReader::WarningHandlingMode enum
+				that indicates where warning messages should be directed.
+		*/
+		PublicNexusReader(const int blocksToRead = -1, NxsReader::WarningHandlingMode mode=NxsReader::WARNINGS_TO_STDERR);
+		virtual ~PublicNexusReader();
+
+		virtual void	Execute(NxsToken& token, bool notifyStartStop = true);
+		std::string GetErrorMessage()
+			{
+			return errorMsg;
+			}
+
+		/*! \arg a vector of taxon names.
+		 	\returns a new taxa block for the these taxa. This taxa block will also
+		 	be stored in the reader so that future files can refer to these taxa.
+
+		 	This function is useful if you want to programmatically create
+		 	a NEXUS TAXA block and have the reader treat it in the same way as
+		 	if the NxsTaxaBlock were read from a file
+		*/
+		NxsTaxaBlock * RegisterTaxa(const std::vector<std::string> & tl);
+
+		/*!	\returns a pointer to the template for the NxsAssumptionsBlock.
+			This object will be cloned whenever an ASSUMPTIONS or SETS block is encountered,
+			so modifying the default behavior of this instance will change the behavior
+			of every NxsAssumptionsBlock created by the reader.
+
+			Do NOT DELETE the template! (the client has to delete all spawned blocks, but
+			the PublicNexusReader deletes its own templates)
+		*/
+		NxsAssumptionsBlock * GetAssumptionsBlockTemplate() {return assumptionsBlockTemplate;}
+		/*!	\returns a pointer to the template for the NxsCharactersBlock.
+			This object will be cloned whenever a CHARACTERS block is encountered,
+			so modifying the default behavior of this instance will change the behavior
+			of every NxsCharactersBlock created by the reader.
+
+			Do NOT DELETE the template! (the client has to delete all spawned blocks, but
+			the PublicNexusReader deletes its own templates)
+		*/
+		NxsCharactersBlock * GetCharactersBlockTemplate() {return charactersBlockTemplate;}
+		/*!	\returns a pointer to the template for the NxsDataBlock.
+			This object will be cloned whenever a DATA block is encountered,
+			so modifying the default behavior of this instance will change the behavior
+			of every NxsDataBlock created by the reader.
+
+			Do NOT DELETE the template! (the client has to delete all spawned blocks, but
+			the PublicNexusReader deletes its own templates)
+		*/
+		NxsDataBlock * GetDataBlockTemplate() {return dataBlockTemplate;}
+		/*!	\returns a pointer to the template for the NxsDistancesBlock.
+			This object will be cloned whenever a DISTANCES block is encountered,
+			so modifying the default behavior of this instance will change the behavior
+			of every NxsDistancesBlock created by the reader.
+
+			Do NOT DELETE the template! (the client has to delete all spawned blocks, but
+			the PublicNexusReader deletes its own templates)
+		*/
+		NxsDistancesBlock * GetDistancesBlockTemplate() {return distancesBlockTemplate;}
+		/*!	\returns a pointer to the template for the NxsTaxaBlock.
+			This object will be cloned whenever a TAXA block is encountered,
+			so modifying the default behavior of this instance will change the behavior
+			of every NxsTaxaBlock created by the reader.
+
+			Do NOT DELETE the template! (the client has to delete all spawned blocks, but
+			the PublicNexusReader deletes its own templates)
+		*/
+		NxsTaxaBlock * GetTaxaBlockTemplate() {return taxaBlockTemplate;}
+		/*!	\returns a pointer to the template for the NxsTaxaAssociationBlock.
+			This object will be cloned whenever a TAXAASSOCIATION block is encountered,
+			so modifying the default behavior of this instance will change the behavior
+			of every NxsTaxaBlock created by the reader.
+
+			Do NOT DELETE the template! (the client has to delete all spawned blocks, but
+			the PublicNexusReader deletes its own templates)
+		*/
+		NxsTaxaAssociationBlock * GetTaxaAssociationBlockTemplate() {return taxaAssociationBlockTemplate;}
+		/*!	\returns a pointer to the template for the NxsTreesBlock.
+			This object will be cloned whenever a TREES block is encountered,
+			so modifying the default behavior of this instance will change the behavior
+			of every NxsTreesBlock created by the reader.
+
+			Do NOT DELETE the template! (the client has to delete all spawned blocks, but
+			the PublicNexusReader deletes its own templates)
+		*/
+		NxsTreesBlock * GetTreesBlockTemplate() {return treesBlockTemplate;}
+		/*!	\returns a pointer to the template for the GetUnalignedBlockTemplate.
+			This object will be cloned whenever an UNALIGNED block is encountered,
+			so modifying the default behavior of this instance will change the behavior
+			of every GetUnalignedBlockTemplate created by the reader.
+
+			Do NOT DELETE the template! (the client has to delete all spawned blocks, but
+			the PublicNexusReader deletes its own templates)
+		*/
+		NxsUnalignedBlock * GetUnalignedBlockTemplate() {return unalignedBlockTemplate;}
+		/*!	\returns a pointer to the template for the NxsStoreTokensBlockReader.
+			This object will be cloned whenever an unknown block is encountered,
+			so modifying the default behavior of this instance will change the behavior
+			of every NxsStoreTokensBlockReader created by the reader.
+
+			Do NOT DELETE the template! (the client has to delete all spawned blocks, but
+			the PublicNexusReader deletes its own templates)
+		*/
+		NxsStoreTokensBlockReader * GetUnknownBlockTemplate() const {return storerBlockTemplate;}
+
+		/*! \returns the number of NxsAssumptionsBlock objects created during the parse which
+				refer to the taxa block `taxa`
+			If `taxa` is 0L, then the total number of Assumptions blocks will be returned
+		*/
+		unsigned GetNumAssumptionsBlocks(const NxsTaxaBlock *taxa) const;
+		/*! \returns the number of NxsAssumptionsBlock objects created during the parse which
+				refer to the characters block `chars`
+			If `chars` is 0L, then the total number of Assumptions blocks will be returned
+		*/
+		unsigned GetNumAssumptionsBlocks(const NxsCharactersBlock *chars) const;
+		/*! \returns the number of NxsAssumptionsBlock objects created during the parse which
+				refer to the trees block `trees`
+			If `trees` is 0L, then the total number of Assumptions blocks will be returned
+		*/
+		unsigned GetNumAssumptionsBlocks(const NxsTreesBlock *trees) const;
+		/*! \returns a pointer to the NxsCharactersBlock with index
+			Indexing starts at 0 and refers to the index in a list of NxsCharactersBlock
+			objects that refer to the NxsTaxaBlock `taxa`.  Thus, the index does not
+			necessarily represent the position among ALL of the NxsDistancesBlock objects
+
+			0L will be returned if the index is out of range. Indices should be <
+				the number returned by GetNumCharactersBlocks(taxa).
+			If `taxa` is 0L, then the total block indexing scheme will refer to the
+				total number of Assumptions blocks read.
+		*/
+		NxsAssumptionsBlock * GetAssumptionsBlock(const NxsTaxaBlock *taxa, unsigned index) const;
+		NxsAssumptionsBlock * GetAssumptionsBlock(const NxsCharactersBlock *taxa, unsigned index) const;
+		NxsAssumptionsBlock * GetAssumptionsBlock(const NxsTreesBlock *taxa, unsigned index) const;
+
+		/*! \returns the number of NxsStoreTokensBlockReader objects created during the parse.
+		*/
+		unsigned GetNumUnknownBlocks() const;
+		/*! \returns a pointer to the NxsTaxaBlock with index (indexing starts at 0).
+				0L will be returned if the index is out of range. index should be < the
+				number returned by GetNumUnknownBlocks();
+		*/
+		NxsStoreTokensBlockReader * GetUnknownBlock(unsigned index) const;
+
+		/*! \returns the number of NxsCharactersBlock objects created during the parse which
+				refer to the taxa in `taxa`
+			If `taxa` is 0L, then the total number of Characters blocks will be returned
+		*/
+		unsigned GetNumCharactersBlocks(const NxsTaxaBlock *taxa) const;
+		/*! \returns a pointer to the NxsCharactersBlock with index
+			Indexing starts at 0 and refers to the index in a list of NxsCharactersBlock
+			objects that refer to the NxsTaxaBlock `taxa`.  Thus, the index does not
+			necessarily represent the position among ALL of the NxsDistancesBlock objects
+
+			0L will be returned if the index is out of range. Indices should be <
+				the number returned by GetNumCharactersBlocks(taxa).
+			If `taxa` is 0L, then the total block indexing scheme will refer to the
+				total number of Characters blocks read.
+		*/
+		NxsCharactersBlock * GetCharactersBlock(const NxsTaxaBlock *taxa, unsigned index) const;
+
+		/*! \returns the number of NxsDistancesBlock objects created during the parse which
+				refer to the taxa in `taxa`
+			If `taxa` is 0L, then the total number of Distances blocks will be returned
+		*/
+		unsigned GetNumDistancesBlocks(const NxsTaxaBlock *taxa) const;
+		/*! \returns a pointer to the NxsDistancesBlock with index
+			Indexing starts at 0 and refers to the index in a list of NxsDistancesBlock
+			objects that refer to the NxsTaxaBlock `taxa`.  Thus, the index does not
+			necessarily represent the position among ALL of the NxsDistancesBlock objects
+
+			0L will be returned if the index is out of range. Indices should be <
+				the number returned by GetNumDistancesBlocks(taxa).
+			If `taxa` is 0L, then the total block indexing scheme will refer to the
+				total number of Distances blocks read.
+		*/
+		NxsDistancesBlock * GetDistancesBlock(const NxsTaxaBlock *taxa, unsigned index) const;
+
+		/*! \returns the number of NxsTaxaBlock objects created during the parse (some
+		 	of these objects may be "implied" by another block, but the client
+		 	code can treat them as if they occurred in the file explicitly).
+		*/
+		unsigned GetNumTaxaBlocks() const;
+		/*! \returns a pointer to the NxsTaxaBlock with index (indexing starts at 0).
+				0L will be returned if the index is out of range.
+		*/
+		NxsTaxaBlock * GetTaxaBlock(unsigned index) const;
+
+		/*! \returns the number of NxsTaxaAssociationBlock objects created during the parse which
+				refer to the taxa as their first of second taxa block
+			If `taxa` is 0L, then the total number of Trees blocks will be returned
+		*/
+		unsigned GetNumTaxaAssociationBlocks(const NxsTaxaBlock *taxa) const;
+		/*! \returns a pointer to the NxsTaxaAssociationBlock with index
+			Indexing starts at 0 and refers to the index in a list of NxsTaxaAssociationBlock
+			objects that refer to the NxsTaxaBlock `taxa`.  Thus, the index does not
+			necessarily represent the position among ALL of the NxsTaxaAssociationBlock objects
+
+			0L will be returned if the index is out of range. Indices should be <
+				the number returned by GetNumTreesBlocks(taxa).
+			If `taxa` is 0L, then the total block indexing scheme will refer to the
+				total number of Trees blocks read.
+		*/
+		NxsTaxaAssociationBlock * GetTaxaAssociationBlock(const NxsTaxaBlock *taxa, unsigned index) const;
+
+		/*! \returns the number of NxsTreesBlock objects created during the parse which
+				refer to the taxa in `taxa`
+			If `taxa` is 0L, then the total number of Trees blocks will be returned
+		*/
+		unsigned GetNumTreesBlocks(const NxsTaxaBlock *taxa) const;
+		/*! \returns a pointer to the NxsTreesBlock with index
+			Indexing starts at 0 and refers to the index in a list of NxsTreesBlock
+			objects that refer to the NxsTaxaBlock `taxa`.  Thus, the index does not
+			necessarily represent the position among ALL of the NxsTreesBlock objects
+
+			0L will be returned if the index is out of range. Indices should be <
+				the number returned by GetNumTreesBlocks(taxa).
+			If `taxa` is 0L, then the total block indexing scheme will refer to the
+				total number of Trees blocks read.
+		*/
+		NxsTreesBlock * GetTreesBlock(const NxsTaxaBlock *taxa, unsigned index) const;
+
+		/*! \returns the number of NxsUnalignedBlock objects created during the parse which
+				refer to the taxa in `taxa`
+			If `taxa` is 0L, then the total number of Unaligned blocks will be returned
+		*/
+		unsigned GetNumUnalignedBlocks(const NxsTaxaBlock *taxa) const;
+		/*! \returns a pointer to the NxsUnalignedBlock with index
+			Indexing starts at 0 and refers to the index in a list of NxsUnalignedBlock
+			objects that refer to the NxsTaxaBlock `taxa`.  Thus, the index does not
+			necessarily represent the position among ALL of the NxsUnalignedBlock objects
+
+			0L will be returned if the index is out of range. Indices should be <
+				the number returned by GetNumUnalignedBlocks(taxa).
+			If `taxa` is 0L, then the total block indexing scheme will refer to the
+				total number of Unaligned blocks read.
+		*/
+		NxsUnalignedBlock * GetUnalignedBlock(const NxsTaxaBlock *taxa, unsigned index) const;
+
+
+		/*! Deletes all of the blocks that were spawned during the parse.
+			\warning Do not call this function if you still retain references
+			  to the spawned objects.
+		*/
+		virtual void DeleteBlocksFromFactories()
+			{
+			NxsReader::DeleteBlocksFromFactories();
+			ClearUsedBlockList();
+			}
+		/*! Mainly used internally.
+			\ref ClearContent() which is probably the function that you want
+			Removes the record of the order of blocks encountered during the
+				last parse.
+
+		*/
+		virtual void ClearUsedBlockList();
+		/*! Removes all references to blocks spawned during the parse, but does
+			NOT delete them.
+			Call this function if you want to reuse the parser and you want to
+
+			delete all of the spawned blocks yourself (after calling
+			ClearUsedBlockList() the DeleteBlocksFromFactories() function
+			will not delete blocks)
+		*/
+		virtual void ClearContent()
+			{
+			assumptionsBlockVec.clear();
+			charactersBlockVec.clear();
+			dataBlockVec.clear();
+			distancesBlockVec.clear();
+			storerBlockVec.clear();
+			taxaBlockVec.clear();
+			taxaAssociationBlockVec.clear();
+			treesBlockVec.clear();
+			unalignedBlockVec.clear();
+			ExceptionRaisingNxsReader::ClearContent();
+			}
+
+		/*! Adds (or "registers") a NxsAssumptionsBlock with the reader. Can be
+			useful if you:
+				-# obtain references to blocks you want to keep,
+				-# call ClearContent()
+				-# add back the block instances that provide necessary context for additional parses.
+		*/
+		void AddReadAssumptionsBlock(NxsAssumptionsBlock * block)
+			{
+			assumptionsBlockVec.push_back(block);
+			AddReadBlock("ASSUMPTIONS", block);
+			}
+		/*! Adds (or "registers") a NxsCharactersBlock with the reader. Can be
+			useful if you:
+				-# obtain references to blocks you want to keep,
+				-# call ClearContent()
+				-# add back the block instances that provide necessary context for additional parses.
+		*/
+		void AddReadCharactersBlock(NxsCharactersBlock * block)
+			{
+			charactersBlockVec.push_back(block);
+			AddReadBlock("CHARACTERS", block);
+			}
+		/*! Adds (or "registers") a NxsDataBlock with the reader. Can be
+			useful if you:
+				-# obtain references to blocks you want to keep,
+				-# call ClearContent()
+				-# add back the block instances that provide necessary context for additional parses.
+		*/
+		void AddReadDataBlock(NxsDataBlock * block)
+			{
+			dataBlockVec.push_back(block);
+			AddReadBlock("CHARACTERS", block);
+			}
+		/*! Adds (or "registers") a NxsDistancesBlock with the reader. Can be
+			useful if you:
+				-# obtain references to blocks you want to keep,
+				-# call ClearContent()
+				-# add back the block instances that provide necessary context for additional parses.
+		*/
+		void AddReadDistancesBlock(NxsDistancesBlock * block)
+			{
+			distancesBlockVec.push_back(block);
+			AddReadBlock("DISTANCES", block);
+			}
+		/*! Adds (or "registers") a NxsTaxaBlock with the reader. Can be
+			useful if you:
+				-# obtain references to blocks you want to keep,
+				-# call ClearContent()
+				-# add back the block instances that provide necessary context for additional parses.
+		*/
+		void AddReadTaxaBlock(NxsTaxaBlock * block)
+			{
+			taxaBlockVec.push_back(block);
+			AddReadBlock("TAXA", block);
+			}
+		/*! Adds (or "registers") a NxsTaxaAssociationBlock with the reader. Can be
+			useful if you:
+				-# obtain references to blocks you want to keep,
+				-# call ClearContent()
+				-# add back the block instances that provide necessary context for additional parses.
+		*/
+		void AddReadTaxaAssociationBlock(NxsTaxaAssociationBlock * block)
+			{
+			taxaAssociationBlockVec.push_back(block);
+			AddReadBlock("TAXAASSOCIATION", block);
+			}
+		/*! Adds (or "registers") a NxsTreesBlock with the reader. Can be
+			useful if you:
+				-# obtain references to blocks you want to keep,
+				-# call ClearContent()
+				-# add back the block instances that provide necessary context for additional parses.
+		*/
+		void AddReadTreesBlock(NxsTreesBlock * block)
+			{
+			treesBlockVec.push_back(block);
+			AddReadBlock("TREES", block);
+			}
+		/*! Adds (or "registers") a NxsUnalignedBlock with the reader. Can be
+			useful if you:
+				-# obtain references to blocks you want to keep,
+				-# call ClearContent()
+				-# add back the block instances that provide necessary context for additional parses.
+		*/
+		void AddReadUnalignedBlock(NxsUnalignedBlock * block)
+			{
+			unalignedBlockVec.push_back(block);
+			AddReadBlock("UNKNOWN", block);
+			}
+		/*! Adds (or "registers") a NxsStoreTokensBlockReader with the reader. Can be
+			useful if you:
+				-# obtain references to blocks you want to keep,
+				-# call ClearContent()
+				-# add back the block instances that provide necessary context for additional parses.
+		*/
+		void AddReadUnknownBlock(NxsStoreTokensBlockReader * block)
+			{
+			storerBlockVec.push_back(block);
+			AddReadBlock(block->GetID(), block);
+			}
+
+		/*! this public field is used in some hacks that relate to printing out
+			translation records during parsing (when names have to change in order
+			for the input file to be valid NEXUS, but we want the parser to be
+			loose but to log its changes).
+		*/
+		NxsConversionOutputRecord conversionOutputRecord;
+
+	protected:
+		void PostExecuteHook();
+		virtual void    AddFactory(NxsBlockFactory *);
+		int bitsForBlocksToRead;
+		NxsCloneBlockFactory cloneFactory;
+
+		NxsAssumptionsBlock * assumptionsBlockTemplate;
+		NxsCharactersBlock * charactersBlockTemplate;
+		NxsDataBlock * dataBlockTemplate;
+		NxsDistancesBlock * distancesBlockTemplate;
+		NxsStoreTokensBlockReader * storerBlockTemplate;
+		NxsTaxaBlock * taxaBlockTemplate;
+		NxsTaxaAssociationBlock * taxaAssociationBlockTemplate;
+		NxsTreesBlock * treesBlockTemplate;
+		NxsUnalignedBlock * unalignedBlockTemplate;
+
+		std::vector<NxsAssumptionsBlock *> assumptionsBlockVec;
+		std::vector<NxsCharactersBlock *> charactersBlockVec;
+		std::vector<NxsDataBlock *> dataBlockVec;
+		std::vector<NxsDistancesBlock *> distancesBlockVec;
+		std::vector<NxsStoreTokensBlockReader *> storerBlockVec;
+		std::vector<NxsTaxaBlock *> taxaBlockVec;
+		std::vector<NxsTaxaAssociationBlock *> taxaAssociationBlockVec;
+		std::vector<NxsTreesBlock *> treesBlockVec;
+		std::vector<NxsUnalignedBlock *> unalignedBlockVec;
+
+		std::string errorMsg;
+	private:
+		PublicNexusReader(const PublicNexusReader &); // do not define. Not copyable
+		PublicNexusReader & operator=(const PublicNexusReader &); // do not define. Not copyable
+
+	};
+
+
+#endif
+
+
diff --git a/lib/ncl-2.1.18/ncl/nxspublicblocks.lo b/lib/ncl-2.1.18/ncl/nxspublicblocks.lo
new file mode 100644
index 0000000..3f0ad11
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxspublicblocks.lo
@@ -0,0 +1,12 @@
+# nxspublicblocks.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nxspublicblocks.o'
+
+# Name of the non-PIC object
+non_pic_object='nxspublicblocks.o'
+
diff --git a/lib/ncl-2.1.18/ncl/nxsreader.cpp b/lib/ncl-2.1.18/ncl/nxsreader.cpp
new file mode 100644
index 0000000..b93f90d
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsreader.cpp
@@ -0,0 +1,1396 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+#include <csignal>
+#include <algorithm>
+#include <set>
+#include <fstream>
+#include <climits>
+#include <sstream>
+#include <iterator>
+#include "ncl/nxsreader.h"
+#include "ncl/nxsdefs.h"
+#include "ncl/nxscharactersblock.h"
+#include "ncl/nxstaxablock.h"
+#include "ncl/nxstreesblock.h"
+
+using namespace std;
+
+#if defined(NCL_CONST_FUNCS) && NCL_CONST_FUNCS
+	int onlyDefinedInCouldBeConst()
+	{
+		return 1;
+	}
+
+#endif
+
+
+static void NxsHandleSignalCallback(int);
+
+NxsReader::SignalHandlerFuncPtr NxsReader::prevSignalCatcher = 0L;
+bool NxsReader::nclCatchesSignals = false;
+unsigned NxsReader::numSigIntsCaught = 0;
+bool NxsReader::prevSignalStored = true;
+
+unsigned NxsReader::getNumSignalIntsCaught()
+	{
+	return NxsReader::numSigIntsCaught;
+	}
+
+void NxsReader::setNumSignalsIntsCaught(unsigned n)
+	{
+	NxsReader::numSigIntsCaught = n;
+	}
+
+void NxsReader::setNCLCatchesSignals(bool v)
+	{
+	NxsReader::nclCatchesSignals = v;
+	}
+
+bool NxsReader::getNCLCatchesSignals()
+	{
+	return NxsReader::nclCatchesSignals;
+	}
+
+
+void NxsHandleSignalCallback(int)
+	{
+	unsigned nc = NxsReader::getNumSignalIntsCaught();
+	NxsReader::setNumSignalsIntsCaught(1 + nc);
+	}
+
+void NxsReader::installNCLSignalHandler()
+	{
+	NxsReader::SignalHandlerFuncPtr prev = std::signal(SIGINT, SIG_IGN);
+	if (prev != SIG_IGN)
+		{
+		NxsReader::prevSignalCatcher = prev;
+		NxsReader::prevSignalStored = true;
+		std::signal(SIGINT, NxsHandleSignalCallback);
+		}
+	}
+
+void NxsReader::uninstallNCLSignalHandler()
+	{
+	if (prevSignalStored)
+		{
+		std::signal(SIGINT, NxsReader::prevSignalCatcher);
+		NxsReader::prevSignalCatcher = 0L;
+		NxsReader::prevSignalStored = false;
+		}
+	}
+
+
+
+/*! Reads a filename with NxsToken object. Calls NexusError on failures */
+void NxsReader::ReadFilepath(const char *filename)
+	{
+	std::ifstream inf;
+	try{
+		inf.open(filename, ios::binary);
+		if (!inf.good())
+			{
+			NxsString err;
+			err << "Could not open the file \"" << filename <<"\"";
+			this->NexusError(err, 0, -1, -1);
+			}
+		}
+	catch (...)
+		{
+		NxsString err;
+		err << '\"' << filename <<"\" does not refer to a valid file." ;
+		this->NexusError(err, 0, -1, -1);
+		}
+	this->ReadFilestream(inf);
+	}
+
+
+/*! Reads the content of string `s` as if it were NEXUS. */
+void NxsReader::ReadStringAsNexusContent(const std::string & s)
+	{
+	std::istringstream inf(s);
+	this->ReadFilestream(inf);
+	}
+
+/*! Reads the istream `inf` by creating a NxsToken object and then calling NxsReader::Execute() */
+void NxsReader::ReadFilestream(std::istream & inf)
+	{
+	NxsToken token(inf);
+	this->Execute(token);
+	}
+
+/*! Returns the set of blocks that have been created from factories, and
+	removes reference to from the NxsReader's collections.
+*/
+std::set<NxsBlock *> NxsReader::RemoveBlocksFromFactoriesFromUsedBlockLists()
+	{
+	std::set<NxsBlock *> todel;
+	BlockReaderList saved;
+	for (BlockReaderList::iterator bIt = blocksInOrder.begin(); bIt != blocksInOrder.end(); ++bIt)
+		{
+		NxsBlock * b  = *bIt;
+		if (BlockIsASingeltonReader(b))
+			saved.push_back(b);
+		else
+			{
+			todel.insert(b);
+			}
+		}
+	for (std::set<NxsBlock *>::iterator d = todel.begin(); d != todel.end(); ++d)
+		{
+		RemoveBlockFromUsedBlockList(*d);
+		}
+	return todel;
+	}
+
+/*! Deletes the set of blocks that have been created from factories and
+	removes reference to from the NxsReader's collections.
+*/
+void NxsReader::DeleteBlocksFromFactories()
+	{
+	std::set<NxsBlock *> todel = RemoveBlocksFromFactoriesFromUsedBlockLists();
+	for (std::set<NxsBlock *>::iterator d = todel.begin(); d != todel.end(); ++d)
+		delete *d;
+	}
+
+/*! \returns true if the block `b` is one of the registered block readers (rather
+	than a block from a factory).
+*/
+bool NxsReader::BlockIsASingeltonReader(NxsBlock *b) const
+	{
+	NxsBlock * sb = blockList;
+	while (sb)
+		{
+		if (b == sb)
+			return true;
+		sb = sb->next;
+		}
+	return false;
+	}
+
+/*! \returns a NxsBlock from `chosenBlockList` with a Title that matches `title`.
+	In the event of ties, the most recently read block is returned.
+	If `title` is NULL, then any block is considered a match.
+	On output *nMatches will be the number of matches (if `nMatches` is not NULL).
+	NULL will be returned if there are no matches.
+*/
+NxsBlock *NxsReader::FindBlockByTitle(const BlockReaderList & chosenBlockList, const char *title, unsigned *nMatches)
+	{
+	BlockReaderList  found = FindAllBlocksByTitle(chosenBlockList, title);
+
+	if (found.empty())
+		{
+		if (nMatches)
+			*nMatches = 0;
+		return NULL;
+		}
+	if (nMatches)
+		*nMatches = (unsigned)found.size();
+	return (NxsBlock *) found.back();
+	}
+
+
+
+BlockReaderList NxsReader::FindAllBlocksByTitle(const BlockReaderList & chosenBlockList, const char *title)
+	{
+	BlockReaderList found = FindAllBlocksByTitleNoPrioritization(chosenBlockList, title);
+	if (found.empty())
+		return found;
+	map<int, BlockReaderList> byPriority;
+	for (BlockReaderList::const_iterator fIt = found.begin(); fIt != found.end(); ++fIt)
+		{
+		NxsBlock * b = *fIt;
+		int priority = GetBlockPriority(b);
+		byPriority[priority].push_back(b);
+		}
+	NCL_ASSERT(!byPriority.empty());
+	return byPriority.rbegin()->second;
+	}
+
+BlockReaderList NxsReader::FindAllBlocksByTitleNoPrioritization(const BlockReaderList & chosenBlockList, const char *title)
+	{
+	BlockReaderList found;
+	if (chosenBlockList.empty() || title == NULL)
+		{
+		found = chosenBlockList;
+		}
+	else
+		{
+		bool emptyTitle = strlen(title) == 0;
+		for (BlockReaderList::const_iterator cblIt = chosenBlockList.begin(); cblIt != chosenBlockList.end(); ++cblIt)
+			{
+			NxsBlock * b = *cblIt;
+			std::vector<std::string> v = this->GetAllTitlesForBlock(b);
+			for (std::vector<std::string>::const_iterator vIt = v.begin(); vIt != v.end(); ++vIt)
+				{
+				const std::string & n = *vIt;
+				if ((emptyTitle && n.empty()) || (NxsString::case_insensitive_equals(title, n.c_str())))
+					{
+					found.push_back(b);
+					break;
+					}
+				}
+			}
+		}
+	return found;
+
+	}
+
+/*! 	\returns all of the TITLEs that have been used for the same block.
+
+	Identical blocks with the different titles can be stored once with all of the
+titles stored a list of "alias titles"
+
+	This will only happen for TAXA blocks, currently.
+*/
+std::vector<std::string> NxsReader::GetAllTitlesForBlock(const NxsBlock *b) const
+	{
+	std::vector<std::string> v;
+	v.push_back(b->GetTitle());
+	std::map<const NxsBlock *, std::list<std::string> >::const_iterator a = blockTitleAliases.find(b);
+	if (a != blockTitleAliases.end())
+		std::copy(a->second.begin(), a->second.end(), back_inserter(v));
+	return v;
+	}
+
+/*! 	used internally to register a new "alias title" for a block */
+void NxsReader::RegisterAltTitle(const NxsBlock * b, std::string t)
+	{
+	std::list<std::string> & v = blockTitleAliases[b];
+	v.push_back(t);
+	}
+
+/*! \returns the pointer to the block with type ID (TAXA, CHARACTERS, ...) matching `btype`
+	 and title matching `title` or 0L if there is no such block.
+	 on output `nMatches` (if it is not 0L) will list the number of blocks that match this
+	 criteria.
+*/
+NxsBlock *NxsReader::FindBlockOfTypeByTitle(const std::string &btype, const char *title, unsigned *nMatches)
+	{
+	BlockTypeToBlockList::const_iterator btblIt = blockTypeToBlockList.find(btype);
+	if (btblIt == blockTypeToBlockList.end())
+		{
+		if (nMatches)
+			*nMatches = 0;
+		return NULL;
+		}
+	const BlockReaderList & chosenBlockList = btblIt->second;
+	return FindBlockByTitle(chosenBlockList, title, nMatches);
+	}
+
+/*!
+	NOTE: cast to NxsTaxaBlockAPI *.  This should only called by NCL when factories and the Link API are in effect.
+	When using these APIs, block readers that read "TAXA" blocks in a NEXUS file must inherit from
+	NxsTaxaBlockAPI, or the behavior will be undefined.
+	This requirement also applies to "implied" taxa blocks that are returned from CHARACTERS (or other) blocks.
+*/
+NxsTaxaBlockAPI *NxsReader::GetTaxaBlockByTitle(const char *title, unsigned *nMatches)
+	{
+	const std::string btype("TAXA");
+	return static_cast<NxsTaxaBlockAPI *>(FindBlockOfTypeByTitle(btype, title, nMatches));
+	}
+
+/*!
+	NOTE: cast to NxsCharactersBlockAPI *.	This should only called by NCL when factories and the Link API are in effect.
+	When using these APIs, block readers that read "CHARACTERS" or "DATA" blocks in a NEXUS file must inherit from
+	NxsCharactersBlockAPI, or the behavior will be undefined.
+*/
+NxsCharactersBlockAPI	*NxsReader::GetCharBlockByTitle(const char *title, unsigned *nMatches)
+	{
+	const std::string btype("CHARACTERS");
+	return static_cast<NxsCharactersBlockAPI *>(FindBlockOfTypeByTitle(btype, title, nMatches));
+	}
+/*!
+	NOTE: cast to NxsTreesBlockAPI *.  This should only called by NCL when factories and the Link API are in effect.  In
+	this case block readers that read "TREES" blocks in a NEXUS file must inherit from NxsTaxaBlockAPI, or the
+	behavior will be undefined.
+*/
+NxsTreesBlockAPI *NxsReader::GetTreesBlockByTitle(const char *title, unsigned *nMatches)
+	{
+	const std::string btype("TREES");
+	return static_cast<NxsTreesBlockAPI *>(FindBlockOfTypeByTitle(btype, title, nMatches));
+	}
+
+/*! Initializes both `blockList' and `currBlock' to NULL.
+*/
+NxsReader::NxsReader() : currentWarningLevel(UNCOMMON_SYNTAX_WARNING), alwaysReportStatusMessages(false)
+	{
+	blockList	= NULL;
+	currBlock	= NULL;
+	taxaBlockFactory = NULL;
+	destroyRepeatedTaxaBlocks = false;
+	}
+
+NxsReader::~NxsReader()
+	{
+	NxsBlock *curr;
+	for (curr = blockList; curr;)
+		{
+		if (curr->GetNexus() == this)
+			curr->SetNexus(NULL);
+		curr = curr->next;
+		}
+	for (BlockReaderList::iterator b = blocksInOrder.begin(); b != blocksInOrder.end(); ++b)
+		{
+		if ((*b)->GetNexus() == this)
+			(*b)->SetNexus(NULL);
+		}
+
+	}
+
+/*!
+	Add a factory for NEXUS block readers to the front of the factories list.
+*/
+void NxsReader::AddFactory(NxsBlockFactory *f)
+	{
+	if (f)
+		factories.push_front(f);
+	}
+/*!
+	Remove a factory for NEXUS block readers.
+*/
+void NxsReader::RemoveFactory(NxsBlockFactory *f)
+	{
+	factories.remove(f);
+	}
+
+
+/*!
+	Adds `newBlock' to the end of the list of NxsBlock objects growing from `blockList'. If `blockList' points to NULL,
+	this function sets `blockList' to point to `newBlock'. Calls SetNexus method of `newBlock' to inform `newBlock' of
+	the NxsReader object that now owns it. This is useful when the `newBlock' object needs to communicate with the
+	outside world through the NxsReader object, such as when it issues progress reports as it is reading the contents
+	of its block.
+*/
+void NxsReader::Add(
+  NxsBlock *newBlock)	/* a pointer to an existing block object */
+	{
+	NCL_ASSERT(newBlock != NULL);
+
+	newBlock->SetNexus(this);
+
+	if (!blockList)
+		blockList = newBlock;
+	else
+		{
+		// Add new block to end of list
+		//
+		NxsBlock *curr;
+		for (curr = blockList; curr && curr->next;)
+			curr = curr->next;
+		NCL_ASSERT(curr && !curr->next);
+		curr->next = newBlock;
+		}
+	}
+
+/*!
+	\deprecated
+	Returns position (first block has position 0) of block `b' in `blockList'. Returns UINT_MAX if `b' cannot be found
+	in `blockList'.
+*/
+unsigned NxsReader::PositionInBlockList(
+  NxsBlock *b)	/* a pointer to an existing block object */
+	{
+	unsigned pos = 0;
+	NxsBlock *curr = blockList;
+
+	for (;;)
+		{
+		if (curr == NULL || curr == b)
+			break;
+		pos++;
+		curr = curr->next;
+		}
+
+	if (curr == NULL)
+		pos = UINT_MAX;
+
+	return pos;
+	}
+
+/*!
+	Reassign should be called if a block (`oldb') is about to be deleted (perhaps to make way for new data). Create
+	the new block (`newb') before deleting `oldb', then call Reassign to replace `oldb' in `blockList' with `newb'.
+	Assumes `oldb' exists and is in `blockList'.
+
+	This function is necessary in v2.0, but replacement of blocks is more easily done
+	with block factories in NCL v2.1 and higher.
+*/
+void NxsReader::Reassign(
+  NxsBlock *oldb,	/* a pointer to the block object soon to be deleted */
+  NxsBlock *newb)	/* a pointer to oldb's replacement */
+	{
+	NxsBlock *prev = NULL;
+	NxsBlock *curr = blockList;
+	newb->SetNexus(this);
+
+	for (;;)
+		{
+		if (curr == NULL || curr == oldb)
+			break;
+		prev = curr;
+		curr = curr->next;
+		}
+
+	NCL_ASSERT(curr != NULL);
+
+	newb->next = curr->next;
+	if (prev == NULL)
+		blockList = newb;
+	else
+		prev->next = newb;
+	curr->next = NULL;
+	curr->SetNexus(NULL);
+	}
+
+bool NxsReader::BlockListEmpty()
+	{
+	return (blockList == NULL ? true : false);
+	}
+
+/*!
+	This function was created for purposes of debugging a new NxsBlock. This version does nothing; to create an active
+	DebugReportBlock function, override this version in the derived class and call the Report function of `nexusBlock'.
+	This function is called whenever the main NxsReader Execute function encounters the [&spillall] command comment
+	between blocks in the data file. The Execute function goes through all blocks and passes them, in turn, to this
+	DebugReportBlock function so that their contents are displayed. Placing the [&spillall] command comment between
+	different versions of a block allows multiple blocks of the same type to be tested using one long data file. Say
+	you are interested in testing whether the normal, transpose, and interleave format of a matrix can all be read
+	correctly. If you put three versions of the block in the data file one after the other, the second one will wipe out
+	the first, and the third one will wipe out the second, unless you have a way to report on each one before the next
+	one is read. This function provides that ability.
+*/
+void NxsReader::DebugReportBlock(
+  NxsBlock &)	/* the block that should be reported */
+	{
+	}
+
+/*!
+	Detaches `oldBlock' from the list of NxsBlock objects growing from `blockList'. If `blockList' itself points to
+	`oldBlock', this function sets `blockList' to point to `oldBlock->next'. Note: the object pointed to by `oldBlock'
+	is not deleted, it is simply detached from the linked list. No harm is done in Detaching a block pointer that has
+	already been detached previously; if `oldBlock' is not found in the block list, Detach simply returns quietly. If
+	`oldBlock' is found, its SetNexus object is called to set the NxsReader pointer to NULL, indicating that it is no
+	longer owned by (i.e., attached to) a NxsReader object.
+*/
+void NxsReader::Detach(
+  NxsBlock *oldBlock)	/* a pointer to an existing block object */
+	{
+	NCL_ASSERT(oldBlock != NULL);
+	RemoveBlockFromUsedBlockList(oldBlock);
+	// Return quietly if there are not blocks attached
+	//
+	if (blockList == NULL)
+		return;
+
+	if (blockList == oldBlock)
+		{
+		blockList = oldBlock->next;
+		oldBlock->SetNexus(NULL);
+		}
+	else
+		{
+		// Bug fix MTH 6/17/2002: old version detached intervening blocks as well
+		//
+		NxsBlock *curr = blockList;
+		for (; curr->next != NULL && curr->next != oldBlock;)
+			curr = curr->next;
+
+		// Line below can be uncommented to find cases where Detach function is
+		// called for pointers that are not in the linked list. If line below is
+		// uncommented, the part of the descriptive comment that precedes this
+		// function about "...simply returns quietly" will be incorrect (at least
+		// in the Debugging version of the program where asserts are active).
+		//
+		//NCL_ASSERT(curr->next == oldBlock);
+
+		if (curr->next == oldBlock)
+			{
+			curr->next = oldBlock->next;
+			oldBlock->SetNexus(NULL);
+			}
+		}
+	}
+
+/*!
+	Called by the NxsReader object when a block named `blockName' is entered. Allows derived class overriding this
+	function to notify user of progress in parsing the NEXUS file. Also gives program the opportunity to ask user if it
+	is ok to purge data currently contained in this block. If user is asked whether existing data should be deleted, and
+	the answer comes back no, then then the overrided function should return false, otherwise it should return true.
+	This (base class) version always returns true.
+*/
+bool NxsReader::EnteringBlock(
+  NxsString )	/* the name of the block just entered */
+	{
+	return true;
+	}
+
+/*!
+	Called by the NxsReader object when a block named `blockName' is being exited. Allows derived class overriding this
+	function to notify user of progress in parsing the NEXUS file.
+*/
+void NxsReader::ExitingBlock(
+  NxsString )	/* the name of the block being exited */
+	{
+	}
+
+/*!
+	Called after `block' has returned from NxsBlock::Read()
+*/
+void NxsReader::PostBlockReadingHook(
+  NxsBlock & /*block*/) /// the block that was just read
+	{
+	}
+
+/*! Uses the registered Factories to spawn a reader for blocks with the name "currBlockName."
+	if sourceOfBlock is not NULL, then *sourceOfBlock will alias to the NxsBlockFactory used.
+	Returns NULL (and does not modify *sourceOfBlock), if no Factory is found that returns a block
+*/
+NxsBlock *NxsReader::CreateBlockFromFactories(const std::string & currBlockName, NxsToken &token, NxsBlockFactory **sourceOfBlock)
+	{
+	for (BlockFactoryList::iterator fIt = factories.begin(); currBlock == NULL && fIt != factories.end(); ++fIt)
+		{
+		NxsBlock *b = (*fIt)->GetBlockReaderForID(currBlockName, this, &token);
+		if (b)
+			{
+			if (b->CanReadBlockType(token))
+				{
+				if (sourceOfBlock)
+					*sourceOfBlock = *fIt;
+				b->SetNexus(this);
+				return b;
+				}
+			(*fIt)->BlockError(b);
+			}
+		}
+	return NULL;
+	}
+
+/*!
+	Reads the NxsReader data file from the input stream provided by `token'. This function is responsible for reading
+	through the name of a each block. Once it has read a block name, it searches for a block reader to
+	handle reading the remainder of the block's contents.
+
+	The block object's Read() method is responsible for reading the END or ENDBLOCK command as well as the trailing semicolon.
+
+	Execute() handles reading comments that are outside of blocks, as well as the initial "#NEXUS" keyword.
+
+	As discussed in \ref NexusErrors exceptions raised during parsing result in calls to ::NexusError()
+
+	If `notifyStartStop' is false then ExecuteStart and ExecuteStop functions will not to be called.
+
+	The order of operations is:
+		-# Read until next Begin command.
+		-# Search through the registered block instances to find one that returns
+			true from NxsBlock::CanReadBlockType()
+		-# If none is found then CreateBlockFromFactories is called.
+		-# If no appropriate block reader has been created, then SkippingBlock hook will
+			be called (and the NxsReader will call ReadUntilEndblock to read until
+			the END of the block before returning to step 1.
+		-# If an appropriate block reader was found in steps 2 or 3 then ExecuteBlock() will be called.
+
+*/
+void NxsReader::Execute(
+  NxsToken	&token,				/*!< the token object used to grab NxsReader tokens */
+  bool		notifyStartStop)	/*!< if true, ExecuteStarting and ExecuteStopping will be called */
+	{
+	bool signalHandlerInstalled = false;
+	unsigned numSigInts = 0;
+	if (NxsReader::nclCatchesSignals)
+		{
+		numSigInts = getNumSignalIntsCaught();
+		installNCLSignalHandler();
+		signalHandlerInstalled = true;
+		}
+	try {
+		CoreExecutionTasks(token, notifyStartStop);
+		}
+	catch (...)
+		{
+		if (signalHandlerInstalled)
+			uninstallNCLSignalHandler();
+		throw;
+		}
+	if (signalHandlerInstalled)
+		{
+		uninstallNCLSignalHandler();
+		if (numSigInts != getNumSignalIntsCaught())
+			throw NxsSignalCanceledParseException("Reading NEXUS content");
+		}
+	}
+
+/*! used internally to  do most of the work of Execute() */
+void NxsReader::CoreExecutionTasks(
+  NxsToken	&token,				/* the token object used to grab NxsReader tokens */
+  bool		notifyStartStop)	/* if true, ExecuteStarting and ExecuteStopping will be called */
+	{
+	unsigned numSigInts = NxsReader::getNumSignalIntsCaught();
+	const bool checkingSignals = NxsReader::getNCLCatchesSignals();
+
+	lastExecuteBlocksInOrder.clear();
+	currBlock = NULL;
+
+	NxsString errormsg;
+	token.SetEOFAllowed(true);
+
+	try
+		{
+		token.SetLabileFlagBit(NxsToken::saveCommandComments);
+		token.GetNextToken();
+		}
+	catch (NxsException x)
+		{
+		NexusError(token.errormsg, 0, 0, 0);
+		return;
+		}
+
+	if (token.Equals("#NEXUS"))
+		{
+		token.SetLabileFlagBit(NxsToken::saveCommandComments);
+		token.GetNextToken();
+		}
+	else
+		{
+		errormsg = "Expecting #NEXUS to be the first token in the file, but found ";
+		errormsg += token.GetToken();
+		errormsg += " instead";
+		/*mth changed this to a warning instead of an error	 because of the large number
+			of files that violate this requirement.
+		*/
+		NexusWarn(errormsg,  NxsReader::AMBIGUOUS_CONTENT_WARNING, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+		}
+
+	if (notifyStartStop)
+		ExecuteStarting();
+	bool keepReading = true;
+	for (;keepReading && !token.AtEOF();)
+		{
+		if (checkingSignals && NxsReader::getNumSignalIntsCaught() != numSigInts)
+			{
+			throw NxsSignalCanceledParseException("Reading NEXUS content");
+			}
+		if (token.Equals("BEGIN"))
+			{
+			token.SetEOFAllowed(false); /*must exit the block before and EOF*/
+			token.GetNextToken();
+			token.SetBlockName(token.GetTokenReference().c_str());
+			for (currBlock = blockList; currBlock != NULL; currBlock = currBlock->next)
+				{
+				if (currBlock->CanReadBlockType(token))
+					break;
+				}
+			NxsString currBlockName = token.GetToken();
+			currBlockName.ToUpper();
+			NxsBlockFactory * sourceOfBlock = NULL;
+			if (currBlock == NULL)
+				{
+				try
+					{
+					currBlock = CreateBlockFromFactories(currBlockName, token, &sourceOfBlock);
+					}
+				catch (NxsException x)
+					{
+					NexusError(x.msg, x.pos, x.line, x.col);
+					token.SetBlockName(0L);
+					token.SetEOFAllowed(true);
+					return;
+					}
+			    }
+			if (currBlock == NULL)
+				{
+				SkippingBlock(currBlockName);
+				if (!ReadUntilEndblock(token, currBlockName))
+					{
+					token.SetBlockName(0L);
+					token.SetEOFAllowed(true);
+					return;
+					}
+				}
+			else if (currBlock->IsEnabled())
+				keepReading = ExecuteBlock(token, currBlockName, currBlock, sourceOfBlock);
+			else
+				{
+				SkippingDisabledBlock(token.GetToken());
+				if (sourceOfBlock)
+					sourceOfBlock->BlockSkipped(currBlock);
+				if (!ReadUntilEndblock(token, currBlockName))
+					{
+					token.SetBlockName(0L);
+					token.SetEOFAllowed(true);
+					return;
+					}
+				}
+			currBlock = NULL;
+			token.SetEOFAllowed(true);
+			token.SetBlockName(0L);
+			}	// if (token.Equals("BEGIN"))
+		else if (token.Equals("&SHOWALL"))
+			{
+			for (NxsBlock*	showBlock = blockList; showBlock != NULL; showBlock = showBlock->next)
+				DebugReportBlock(*showBlock);
+			}
+		else if (token.Equals("&LEAVE"))
+			break;
+		if (keepReading)
+			{
+			token.SetLabileFlagBit(NxsToken::saveCommandComments);
+			token.GetNextToken();
+			}
+		}
+	if (notifyStartStop)
+		ExecuteStopping();
+
+	currBlock = NULL;
+	}
+
+void NxsReader::ClearContent()
+	{
+	for (currBlock = blockList; currBlock;)
+		{
+		currBlock->Reset();
+		currBlock = currBlock->next;
+		}
+	currBlock = blockList;
+	blocksInOrder.clear();
+	blockPriorities.clear();
+	lastExecuteBlocksInOrder.clear();
+	blockTypeToBlockList.clear();
+	blockTitleHistoryMap.clear();
+	blockTitleAliases.clear();
+	}
+
+
+/*! \returns a pointer to a previously process  NxsTaxaBlock with the same taxon
+	labels. The comparison of labels is case-insensitive and not affected by the
+	ordering of taxa within the block.
+
+	TAXA blocks are often repeated in sets of NEXUS files (because a bare TREES block
+	constitutes an illegal NEXUS file, and because NCL spawns implied Taxa blocks
+	if it reads just a Trees block).
+
+	If NxsReader::cullIdenticalTaxaBlocks(true) has been called then NxsReader::GetOriginalTaxaBlock
+	will be called as part of determining whether or not a taxa block should be deleted.
+
+	\warning: this is a hole in the const-correctness because the caller could (but shouldn't
+		modify the Taxa block).
+*/
+NxsTaxaBlockAPI * NxsReader::GetOriginalTaxaBlock(const NxsTaxaBlockAPI * testB) const
+	{
+	if (!testB)
+		return 0L;
+	const std::string idstring("TAXA");
+	BlockTypeToBlockList::const_iterator bttblIt = blockTypeToBlockList.find(idstring);
+	if (bttblIt == blockTypeToBlockList.end())
+		return 0L;
+	const BlockReaderList & brl = bttblIt->second;
+	const unsigned ntt = testB->GetNumTaxonLabels();
+	const std::vector<std::string> testL = testB->GetAllLabels();
+	for (BlockReaderList::const_iterator bIt = brl.begin(); bIt != brl.end(); ++bIt)
+		{
+		const NxsBlock * nb = *bIt;
+		const NxsTaxaBlockAPI * prev = (const NxsTaxaBlockAPI *) nb;
+		if (prev->GetNumTaxonLabels() == ntt)
+			{
+			const std::vector<std::string> prevL = prev->GetAllLabels();
+			std::vector<std::string>::const_iterator pIt = prevL.begin();
+			std::vector<std::string>::const_iterator testIt = testL.begin();
+
+			for (; (testIt != testL.end()) && (pIt != prevL.end()) ; ++testIt, ++pIt)
+				{
+				if (!NxsString::case_insensitive_equals(testIt->c_str(), pIt->c_str()))
+					break;
+				}
+			if (testIt == testL.end())
+				return const_cast<NxsTaxaBlockAPI *>(prev);
+			}
+		}
+
+	return 0L;
+	}
+
+
+/*! Called internally when the NxsReader has found the correct NxsBlock to read
+	a block in a file.
+
+	`token` will be at the block ID.
+	`currBlockName` will be the block ID as a string.
+	`currentBlock` will be the block reader to be used
+	`sourceOfBlock` is the factory  that created the block (or 0L). If sourceOfBlock
+		is not NULL then it will be alerted if the block is skipped (BlockSkipped() method)
+		or there was an error in the read (BlockError() method). The factory is expected
+		to delete the block instances in these cases (NxsReader will not refer to those
+		instances again).
+
+
+
+	The following steps occur:
+		- the EnteringBlock hook is called (if it returns false, the block will be skipped by calling
+			NxsReader::SkippingBlock
+		- NxsBlock::Reset() is called on the reader block
+		- NxsBlock::Read() method of the reader block is called
+		- If an exception is generated, the NexusError is called.
+		- If no exception is generated by Read then the block is processed:
+			- if NxsReader::cullIdenticalTaxaBlocks(true) has been called before Execute and this
+				is a repeated TAXA block, the block will be deleted.
+			- the BlockReadHook() will store all of the implied blocks
+				(by calling NxsBlock::GetImpliedBlocks()) and the block itself.
+			- if one of the implied blocks is a repeated TAXA block and
+				NxsReader::cullIdenticalTaxaBlocks(true) has been called, then
+				the blocks NxsBlock::SwapEquivalentTaxaBlock() method will determine
+				whether or not the duplicate taxa block can be deleted.
+			- each stored block will generate a call to NxsReader::AddBlockToUsedBlockList()
+		- ExitingBlock() is called
+		- PostBlockReadingHook() is called
+*/
+bool NxsReader::ExecuteBlock(NxsToken &token, const NxsString &currBlockName, NxsBlock *currentBlock, NxsBlockFactory * sourceOfBlock)
+	{
+	if (!EnteringBlock(currBlockName))
+		{
+		SkippingBlock(currBlockName);
+		if (sourceOfBlock)
+			sourceOfBlock->BlockSkipped(currentBlock);
+		if (!ReadUntilEndblock(token, currBlockName))
+			{
+			token.SetBlockName(0L);
+			token.SetEOFAllowed(true);
+			return false;
+			}
+		return true;
+		}
+	this->RemoveBlockFromUsedBlockList(currentBlock);
+	currentBlock->Reset();
+	// We need to back up currentBlock, because the Read statement might trigger
+	// a recursive call to Execute (if the block contains instructions to execute
+	// another file, then the same NxsReader object may be used and any member fields (e.g. currentBlock)
+	//	could be trashed.
+	//
+	bool eofFound = false;
+	try
+		{
+		try
+			{
+			currentBlock->Read(token);
+			}
+		catch (NxsX_UnexpectedEOF &eofx)
+			{
+			if (!currentBlock->TolerateEOFInBlock())
+				throw eofx;
+			NxsString m;
+			m << "Unexpected End of file in " << currBlockName << "block";
+			currentBlock->WarnDangerousContent(m, token);
+			eofFound = true;
+			}
+		if (destroyRepeatedTaxaBlocks && currBlockName.EqualsCaseInsensitive("TAXA"))
+			{
+			NxsTaxaBlockAPI * oldTB = this->GetOriginalTaxaBlock((NxsTaxaBlockAPI *) currentBlock);
+			if (oldTB)
+				{
+				const std::string altTitle = currentBlock->GetTitle();
+				this->RegisterAltTitle(oldTB, altTitle);
+				if (sourceOfBlock)
+					sourceOfBlock->BlockError(currentBlock);
+				return true;
+				}
+			}
+		BlockReadHook(currBlockName, currentBlock, &token);
+		}
+	catch (NxsException &x)
+		{
+		NxsString m;
+		if (currentBlock->errormsg.length() > 0)
+			m = currentBlock->errormsg;
+		else
+			m = x.msg;
+		currentBlock->Reset();
+		if (sourceOfBlock != 0)
+			{
+
+			sourceOfBlock->BlockError(currentBlock);
+			}
+		else
+
+		token.SetBlockName(0L);
+		token.SetEOFAllowed(true);
+		currentBlock = NULL;
+		NexusError(m, x.pos, x.line, x.col);
+		return false;
+		}	// catch (NxsException x)
+	ExitingBlock(currBlockName);
+	PostBlockReadingHook(*currentBlock);
+	return !eofFound;
+	}
+
+/*! Called by NxsReader::ExecuteBlock() to store the block and its implied blocks \ref NxsReader::ExecuteBlock()*/
+void NxsReader::BlockReadHook(const NxsString &currBlockName, NxsBlock *currentBlock, NxsToken * token)
+	{
+	VecBlockPtr implied = currentBlock->GetImpliedBlocks();
+	for (VecBlockPtr::iterator impIt = implied.begin(); impIt != implied.end(); ++impIt)
+		{
+		NxsBlock * nb = *impIt;
+		NCL_ASSERT(nb);
+		NxsString impID = nb->GetID();
+		bool storeBlock = true;
+		if (destroyRepeatedTaxaBlocks && impID.EqualsCaseInsensitive("TAXA"))
+			{
+			NxsTaxaBlockAPI * oldTB = this->GetOriginalTaxaBlock((NxsTaxaBlockAPI *) nb);
+			if (oldTB)
+				{
+				storeBlock = ! currentBlock->SwapEquivalentTaxaBlock(oldTB);
+				const std::string altTitle = nb->GetTitle();
+				this->RegisterAltTitle(oldTB, altTitle);
+				if (!storeBlock)
+					{
+					delete nb;
+					}
+
+				}
+			}
+		if (storeBlock)
+			{
+			NxsString m;
+			m << "storing implied block: " << impID;
+			this->statusMessage(m);
+			this->AddBlockToUsedBlockList(impID, nb, token);
+			}
+		}
+	NxsString s;
+	s << "storing read block: " << currentBlock->GetID();
+	this->statusMessage(s);
+	this->AddBlockToUsedBlockList(currBlockName, currentBlock, token);
+	}
+
+/*!
+	Returns a string containing the copyright notice for the NxsReader Class Library, useful for reporting the use of
+	this library by programs that interact with the user.
+*/
+const char * NxsReader::NCLCopyrightNotice()
+	{
+	return NCL_COPYRIGHT;
+	}
+
+/*!
+	Returns a string containing the URL for the NxsReader Class Library internet home page.
+*/
+const char * NxsReader::NCLHomePageURL()
+	{
+	return NCL_HOMEPAGEURL;
+	}
+
+/*!
+	Returns a string containing the name and current version of the NxsReader Class Library, useful for reporting the
+	use of this library by programs that interact with the user.
+*/
+const char * NxsReader::NCLNameAndVersion()
+	{
+	return NCL_NAME_AND_VERSION;
+	}
+
+/*!
+	Called just after Execute member function reads the opening "#NEXUS" token in a NEXUS data file. Override this
+	virtual base class function if your application needs to do anything at this point in the execution of a NEXUS data
+	file (e.g. good opportunity to pop up a dialog box showing progress). Be sure to call the Execute function with the
+	`notifyStartStop' argument set to true, otherwise ExecuteStarting will not be called.
+
+*/
+void NxsReader::ExecuteStarting()
+	{
+	}
+
+/*!
+	Called when Execute member function encounters the end of the NEXUS data file, or the special comment [&LEAVE] is
+	found between NEXUS blocks. Override this virtual base class function if your application needs to do anything at
+	this point in the execution of a NEXUS data file (e.g. good opportunity to hide or destroy a dialog box showing
+	progress). Be sure to call the Execute function with the `notifyStartStop' argument set to true, otherwise
+	ExecuteStopping will not be called.
+*/
+void NxsReader::ExecuteStopping()
+	{
+	}
+
+/*!
+	Called when an error is encountered in a NEXUS file. Allows program to give user details of the error as well as
+	the precise location of the error.
+*/
+void NxsReader::NexusError(
+  NxsString ,	/* the error message to be displayed */
+  file_pos	,	/* the current file position */
+  long	,	/* the current file line */
+  long	)	/* the current column within the current file line */
+	{
+	}
+
+/*!
+	This function may be used to report progess while reading through a file. For example, the NxsAllelesBlock class
+	uses this function to report the name of the population it is currently reading so the user doesn't think the
+	program has hung on large data sets.
+*/
+void NxsReader::OutputComment(
+  const NxsString &)	/* a comment to be shown on the output */
+	{
+	}
+
+/*!
+	This function is called when an unknown block named `blockName' is about to be skipped. Override this pure virtual
+	function to provide an indication of progress as the NEXUS file is being read.
+*/
+void NxsReader::SkippingBlock(
+  NxsString )	/* the name of the block being skipped */
+	{
+	}
+
+/*!
+	This function is called when a disabled block named `blockName' is encountered in a NEXUS data file being executed.
+	Override this pure virtual function to handle this event in an appropriate manner. For example, the program may
+	wish to inform the user that a data block was encountered in what is supposed to be a tree file.
+*/
+void NxsReader::SkippingDisabledBlock(
+  NxsString )	/* the name of the disabled block being skipped */
+	{
+	}
+
+
+/*! Used internally to skip until teh END; or ENDBLOCK; command. */
+bool NxsReader::ReadUntilEndblock(NxsToken &token, const std::string & )
+	{
+	for (;;)
+		{
+		token.GetNextToken();
+		if (token.Equals("END") || token.Equals("ENDBLOCK"))
+			{
+			token.GetNextToken();
+			if (!token.Equals(";"))
+				{
+				std::string errormsg = "Expecting ';' after END or ENDBLOCK command, but found ";
+				errormsg += token.GetToken();
+				errormsg += " instead";
+				NexusError(NxsString(errormsg.c_str()), token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				return false;
+				}
+			return true;
+			}
+		else
+			token.ProcessAsCommand(NULL);
+		}
+	}
+
+/*! Convenience function for setting the NxsTaxaBlockFactory */
+void NxsReader::SetTaxaBlockFactory(NxsTaxaBlockFactory *f)
+	{
+	if (this->taxaBlockFactory)
+		this->RemoveFactory(this->taxaBlockFactory);
+	this->taxaBlockFactory = f;
+	if (taxaBlockFactory)
+		this->AddFactory(this->taxaBlockFactory);
+	}
+/*! \returns the last TAXA block.
+	\warning: This should only called when the client knows that the TAXA block
+	inherits from NxsTaxaBlockAPI (static_cast is used). This will be true if the
+	client code has not derived its own NxsBlock for reading TAXA blocks
+*/
+NxsTaxaBlockAPI *NxsReader::GetLastStoredTaxaBlock()
+	{
+	const std::string idstring("TAXA");
+	NxsBlock * nb = GetLastStoredBlockByID(idstring);
+	return static_cast<NxsTaxaBlockAPI *>(nb); //dynamic_cast<NxsTaxaBlockAPI *>(nb);
+	}
+
+/*! \returns the last CHARACTERS/DATA block.
+	\warning: This should only called when the client knows that the TAXA block
+	inherits from NxsTaxaBlockAPI (static_cast is used). This will be true if the
+	client code has not derived its own NxsBlock for reading TAXA blocks
+*/
+NxsCharactersBlockAPI *NxsReader::GetLastStoredCharactersBlock()
+	{
+	const std::string idstring("CHARACTERS");
+	NxsBlock * nb = GetLastStoredBlockByID(idstring);
+	return static_cast<NxsCharactersBlockAPI *>(nb); //dynamic_cast<NxsCharactersBlockAPI *>(nb);
+	}
+
+/*! \returns the last TREES block.
+	\warning: This should only called when the client knows that the TAXA block
+	inherits from NxsTaxaBlockAPI (static_cast is used). This will be true if the
+	client code has not derived its own NxsBlock for reading TAXA blocks
+*/
+NxsTreesBlockAPI *NxsReader::GetLastStoredTreesBlock()
+	{
+	const std::string idstring("TREES");
+	NxsBlock * nb = GetLastStoredBlockByID(idstring);
+	return static_cast<NxsTreesBlockAPI *>(nb); //dynamic_cast<NxsTreesBlockAPI *>(nb);
+	}
+
+/*! \returns the last block with block ID ("TAXA", "DATA"...) indicated by key
+*/
+
+NxsBlock *NxsReader::GetLastStoredBlockByID(const std::string &key)
+	{
+	BlockTypeToBlockList::iterator bttblIt = blockTypeToBlockList.find(key);
+	if (bttblIt == blockTypeToBlockList.end())
+		return NULL;
+	return bttblIt->second.back();
+	}
+
+/*! Used internally. Called by AddBlockToUsedBlockList() this function will generate
+	a NxsException if the block's title is found in another block of the same block ID type (TAXA, CHARACTERS, ...)
+
+	If the block has no title, an automatically generated title will be supplied with the form
+		Untitled <block type ID> Block #
+*/
+void NxsReader::NewBlockTitleCheckHook(const std::string &blockname, NxsBlock *p, NxsToken *token)
+	{
+	NxsBlockTitleHistoryMap::iterator mIt = blockTitleHistoryMap.find(blockname);
+	if (mIt == blockTitleHistoryMap.end())
+		{
+		std::list<std::string> mt;
+		blockTitleHistoryMap[blockname] = NxsBlockTitleHistory(1, mt);
+		mIt = blockTitleHistoryMap.find(blockname);
+		NCL_ASSERT(mIt != blockTitleHistoryMap.end());
+		}
+	NxsBlockTitleHistory & titleHist = mIt->second;
+	unsigned n = titleHist.first;
+	std::list<std::string> & previousTitles = titleHist.second;
+	std::list<std::string>::iterator lsIt;
+	std::string pTitle = p->GetTitle();
+	std::string origTitle = pTitle;
+	NxsString::to_upper(pTitle);
+	if (pTitle.empty())
+		{
+		while (pTitle.empty())
+			{
+			NxsString autoName = "Untitled ";
+			autoName += p->GetID().c_str();
+			autoName += " Block ";
+			autoName += n++;
+			pTitle.assign(autoName.c_str());
+			NxsString::to_upper(pTitle);
+            lsIt = find(previousTitles.begin(), previousTitles.end(), pTitle);
+			if (lsIt == previousTitles.end())
+				{
+				p->SetTitle(autoName, true);
+				titleHist.first = n;
+				}
+			else
+				pTitle.clear();
+			}
+		}
+	else
+		{
+        lsIt = find(previousTitles.begin(), previousTitles.end(), pTitle);
+		if (lsIt != previousTitles.end())
+			{
+			NxsString msg = "Block titles cannot be repeated. The TITLE ";
+			msg += origTitle;
+			msg += " has already been used for a ";
+			msg += blockname;
+			msg += " block.";
+			if (token)
+				throw NxsException(msg, *token);
+			else
+				throw NxsException(msg, 0, -1, -1);
+			}
+		}
+	previousTitles.push_back(pTitle);
+	}
+
+/*! Used internally to store the correctly read block `p`
+	`token` is the token that is being parsed (or 0L).
+
+	\warning This can generate NxsExceptions if there are clashes in the block title
+*/
+void NxsReader::AddBlockToUsedBlockList(const std::string &blockTypeID, NxsBlock *p, NxsToken *token)
+	{
+	NCL_ASSERT(p);
+	std::string n;
+	if (blockTypeID == "DATA")
+		n = std::string("CHARACTERS");
+	else
+		n = blockTypeID;
+	NewBlockTitleCheckHook(n, p, token);
+	BlockTypeToBlockList::iterator bttblIt = blockTypeToBlockList.find(n);
+	if (bttblIt == blockTypeToBlockList.end())
+		blockTypeToBlockList[n] = BlockReaderList(1, p);
+	else
+		bttblIt->second.push_back(p);
+	blocksInOrder.remove(p);
+	blocksInOrder.push_back(p);
+	if (this->GetBlockPriority(p) < 0)
+		AssignBlockPriority(p, 0);
+
+	lastExecuteBlocksInOrder.remove(p);
+	lastExecuteBlocksInOrder.push_back(p);
+	}
+
+/*! Removes a block from the NxsReader's records. Does NOT delete the block!
+	\returns the number of times the block was in the reader's block lists (usually
+		either 0 or 1).
+*/
+unsigned NxsReader::RemoveBlockFromUsedBlockList(NxsBlock *p)
+	{
+	unsigned totalDel = 0;
+	unsigned before, after;
+	std::vector<std::string> keysToDel;
+	for (BlockTypeToBlockList::iterator bttblIt = blockTypeToBlockList.begin(); bttblIt != blockTypeToBlockList.end(); ++bttblIt)
+		{
+		BlockReaderList & brl = bttblIt->second;
+		before = (unsigned)brl.size();
+		brl.remove(p);
+		after = (unsigned)brl.size();
+		if (after == 0)
+			keysToDel.push_back(bttblIt->first);
+		totalDel += before - after;
+		}
+	for (std::vector<std::string>::const_iterator keyIt = keysToDel.begin(); keyIt != keysToDel.end(); ++keyIt)
+		blockTypeToBlockList.erase(*keyIt);
+	blocksInOrder.remove(p);
+	blockPriorities.erase(p);
+	lastExecuteBlocksInOrder.remove(p);
+	std::string blockID =  p->GetID();
+	NxsBlockTitleHistoryMap::iterator mIt = blockTitleHistoryMap.find(blockID);
+	if (mIt != blockTitleHistoryMap.end())
+		{
+		std::string blockName = p->GetTitle();
+		NxsBlockTitleHistory & titleHist = mIt->second;
+		std::list<std::string> & previousTitles = titleHist.second;
+		std::list<std::string>::iterator ptIt = previousTitles.begin();
+		while (ptIt != previousTitles.end())
+			{
+			if (NxsString::case_insensitive_equals(ptIt->c_str(), blockName.c_str()))
+				ptIt = previousTitles.erase(ptIt);
+			else
+				 ++ptIt;
+			}
+		}
+	return totalDel;
+	}
+
+/*! Returns a set of all of the blocks that have been successfully read.
+*/
+std::set<NxsBlock*> NxsReader::GetSetOfAllUsedBlocks()
+	{
+	std::set<NxsBlock*> s;
+	for (BlockTypeToBlockList::iterator bttblIt = blockTypeToBlockList.begin(); bttblIt != blockTypeToBlockList.end(); ++bttblIt)
+		{
+		BlockReaderList & brl = bttblIt->second;
+		s.insert(brl.begin(), brl.end());
+		}
+	return s;
+	}
+
+void ExceptionRaisingNxsReader::NexusWarn(const std::string &msg, NxsWarnLevel warnLevel, file_pos pos, long line, long col)
+	{
+	if (warnLevel < currentWarningLevel)
+		return;
+	if (warnLevel >= this->warningToErrorThreshold)
+		{
+		NxsString e(msg.c_str());
+		throw NxsException(e, pos, line, col);
+		}
+
+	if (warnMode == NxsReader::IGNORE_WARNINGS)
+		return;
+	if (warnMode == NxsReader::WARNINGS_TO_STDERR)
+		{
+		std::cerr << "\nWarning:  ";
+		std::cerr << "\n " << msg << std::endl;
+		if (line > 0 || pos > 0)
+			std::cerr << "at line " << line << ", column (approximately) " << col << " (file position " << pos << ")\n";
+		}
+	else if (warnMode != NxsReader::WARNINGS_TO_STDOUT)
+		{
+		std::cout << "\nWarning:  ";
+		if (line > 0 || pos > 0)
+			std::cout << "at line " << line << ", column " << col << " (file position " << pos << "):\n";
+		std::cout << "\n " << msg << '\n';
+		if (line > 0 || pos > 0)
+			std::cout << "at line " << line << ", column (approximately) " << col << " (file position " << pos << ')' << std::endl;
+		}
+	else
+		{
+		NxsString m("WARNING:\n ");
+		m += msg.c_str();
+		NexusError(m, pos, line, col);
+		}
+	}
+
+void ExceptionRaisingNxsReader::SkippingBlock(NxsString blockName)
+	{
+	if (warnMode == NxsReader::IGNORE_WARNINGS)
+		return;
+	if (warnMode == NxsReader::WARNINGS_TO_STDERR)
+		std::cerr << "[!Skipping unknown block (" << blockName << ")...]" << std::endl;
+	else if (warnMode != NxsReader::WARNINGS_TO_STDOUT)
+		std::cout << "[!Skipping unknown block (" << blockName << ")...]" << std::endl;
+	}
+
+void ExceptionRaisingNxsReader::SkippingDisabledBlock(NxsString blockName)
+	{
+	if (warnMode == NxsReader::IGNORE_WARNINGS)
+		return;
+	if (warnMode == NxsReader::WARNINGS_TO_STDERR)
+		std::cerr << "[!Skipping disabled block (" << blockName << ")...]" << std::endl;
+	else if (warnMode != NxsReader::WARNINGS_TO_STDOUT)
+		std::cout << "[!Skipping disabled block (" << blockName << ")...]" << std::endl;
+	}
+
+void NxsReader::statusMessage(const std::string & m) const
+{
+	if (alwaysReportStatusMessages || currentWarningLevel == UNCOMMON_SYNTAX_WARNING) {
+		std::cerr << m << std::endl;
+	}
+}
+
+/*! Clears the lists of all of the blocks that have been read.
+	NOTE: does NOT free any memory or call Reset() on any blocks"!!
+
+	This call can be used to "tell" a reader instance that you have taken
+	over the memory management for all of the blocks that it has read (or created).
+*/
+void NxsReader::ClearUsedBlockList()
+	{
+	RemoveBlocksFromFactoriesFromUsedBlockLists();
+	blocksInOrder.clear();
+	blockPriorities.clear();
+	lastExecuteBlocksInOrder.clear();
+	blockTypeToBlockList.clear();
+	}
+
+void NxsReader::AssignBlockPriority(NxsBlock *b, int priorityLevel)
+	{
+	blockPriorities[b] = priorityLevel;
+	}
+
+int	NxsReader::GetBlockPriority(NxsBlock *b) const
+	{
+	std::map<NxsBlock *, int>::const_iterator bIt = blockPriorities.find(b);
+	if (bIt == blockPriorities.end())
+		return 0;
+	return bIt->second;
+	}
+
+void NxsReader::DemoteBlocks(int priorityLevel)
+	{
+	BlockReaderList brl = GetUsedBlocksInOrder();
+	BlockReaderList::iterator brlIt = brl.begin();
+	for (; brlIt != brl.end(); ++brlIt)
+		{
+		NxsBlock * b = *brlIt;
+		AssignBlockPriority(b, priorityLevel);
+		}
+	}
+
+
+
diff --git a/lib/ncl-2.1.18/ncl/nxsreader.h b/lib/ncl-2.1.18/ncl/nxsreader.h
new file mode 100644
index 0000000..1f60eb1
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsreader.h
@@ -0,0 +1,612 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#ifndef NCL_NXSREADER_H
+#define NCL_NXSREADER_H
+
+#include "ncl/nxsdefs.h"
+#include "ncl/nxsstring.h"
+#include "ncl/nxsexception.h"
+#include "ncl/nxstoken.h"
+
+class NxsBlock;
+class NxsBlockFactory;
+class NxsTaxaBlockFactory;
+class NxsAssumptionsBlockAPI;
+class NxsCharactersBlockAPI;
+class NxsTaxaBlockAPI;
+class NxsTreesBlockAPI;
+
+typedef std::list<NxsBlock *> BlockReaderList;
+typedef std::map<std::string, BlockReaderList> BlockTypeToBlockList;
+
+
+/*!
+	This is the class that orchestrates the reading of a NEXUS data file, and so is the central class to NCL.
+
+	NxsReader does not call delete on any of the blocks that are added to it via the Add method.
+
+
+	In the "classic" (v2.0) NCL API:
+		-# An NxsReader is created.
+		-# pointers to instances of NxsBlocks that are expected to be needed should be added to `blockList' using the
+			NxsReader::Add() member function.
+		-# NxsReader::Execute() is then called, which reads the data file until encountering a block name, at which
+			point the correct block is looked up in `blockList' and that object's NxsBlock::Read() method is called.
+		-# NxsReader::PostBlockReadingHook(NxsBlock) is called after a block is successfully read.  This allows one to gather
+			the parsed data from the NxsBlock.  If another block of the same type is encountered, then NxsBlock::Reset()
+			will be called and the same NxsBlock instance will be used to read the next block.
+		.
+	Versions of NCL after 2.0.04 also support a "factory API" augments the former behavior:
+		-# An NxsReader is created.
+		-# In addition to NxsBlocks added using the Add method, you can register instances of a NxsBlockFactory using
+			the NxsReader::AddFactory() method.
+		-# In the NxsReader::Execute() method, if an appropriate block is not found in the `blockList` then the
+			the factories are asked to create a block for the current block name.  The first non-NULL block pointer
+			returned is used.
+		-#  PostBlockReadingHook is still called, but blocks created by a factory will not be "recycled" later in the
+			NxsReader::Execute(), so it is not necessary to pull all of the data out of them.
+		-#If a block created by a factory is skipped or has an error, then the factory will be notified using
+			NxsBlockFactory::BlockError(NxsBlock *) or NxsBlockFactory::BlockSkipped(NxsBlock *).  In the event of
+			skipping or an error, NxsReader will never refer to that instance of the factory-created block again.
+			Hence the base class behavior of BlockError() and BlockSkipped() is to delete the instance.
+		-#	Every time a NxsBlock successfully reads a NEXUS block, the NxsBlock is added to container of "used" blocks.
+			When a block is Reset() it is removed from this container.  NxsReader::GetUsedBlocks() can be called at any
+			point to get a copy of this container (which maps a block type name to a list of NxsBlock*). This container
+			thus stores the state of the parsed NEXUS file.  If no blocks were recycled (if all of the blocks came from
+			factories rather than blocks added using NxsReader::Add() method), then the GetUsedBlocks will contain binary
+			representation of every block parsed.
+		.
+
+	Important: The use of the factories that are supplied with NCL can trigger casts of pointers. This can be unsafe if
+		you create NxsBlocks that do not have the expected inheritance.  For example, if you create a class to
+		read Taxa blocks, but do NOT derive this class from NxsTaxaBlockAPI then the casts will be unsafe.  If you
+		do this, and you wish to use the factory API then you must write your own factories.
+
+	See NCL_TOP/examples/normalizer examples for an example of the factory API (using the MultiFormatReader).  In those
+		examples the PublicNexusReader::PublicNexusReader() constructor is the function that installs the templates for
+		a clone factory.
+
+	\section NexusErrors Errors in NEXUS files
+	When an illegal construct is found, a NxsException is raised. This exception is caught within NxsReader::Execute
+		and NxsReader::NexusError is called. This allows subclasses of NxsReader to handle exceptional circumstances by
+		overriding one function. Whenever you are using a NxsReader instance that is NOT a subclass of ExceptionRaisingNxsReader
+		this is still the behavior (thus any code that was written to the v2.0 API will still have this behavior).
+
+	ExceptionRaisingNxsReader implements NexusError by raising another NxsException.  This results in the exception
+		being propagated to the caller.  The newer NxsReader classes (including PublicNexusReader and MultiFormatReader)
+		are derived from ExceptionRaisingNxsReader. So their Execute methods will also raise NxsExceptions. Deriving a subclass
+		of these classes and overriding NexusError would prevent this behavior.
+
+	The advantage of ExceptionRaisingNxsReader is that one is no longer required to subclass NxsReader to handle errors.
+
+	\section signalsection Signal Handling in NCL:
+		Traditionally, the user of an application can send an SIGINT to cause it to stop. NCL has very limited support
+	for handling signals, and this support is turned off by default.
+
+		If you want NCL to raise an NxsSignalCanceledParseException if a signal is encountered during a parse then call:
+			NxsReader::setNCLCatchesSignals(true);
+	before calling Execute on your NxsReader instance. Note that only the slowly-parsed blocks (TREES and CHARACTERS) and
+	the NxsReader currently check to see if a signal has been caught.  So the NxsSignalCanceledParseException will often
+	have a generic message indicating that the signal was caught during the parse.
+
+		The NCL signal handler is only installed during NxsReader::Execute calls!
+
+		Note: that if you want your program to exit on SIGINT, you can leave the signal handling turned off. If you do turn
+			NCL's signal handling on, then after you do your apps clean up you'll have to exit by something like this:
+				signal(SIGINT, SIG_DFL);
+				kill(getpid(), SIGINT);
+			\see http://www.cons.org/cracauer/sigint.html
+
+*/
+class NxsReader
+	{
+		static void installNCLSignalHandler();
+		static void uninstallNCLSignalHandler();
+	public:
+		/** Enum of arguments for ExceptionRaisingNxsReader ctor */
+		enum WarningHandlingMode
+			{
+			IGNORE_WARNINGS,  /**< warnings that are not error-generating are ignored silently */
+			WARNINGS_TO_STDERR, /**< warnings that are not error-generating are written to standard error stream */
+			WARNINGS_TO_STDOUT, /**< warnings that are not error-generating are written to standard output stream */
+			WARNINGS_ARE_ERRORS /**< warnings that are not error-generating by some other mechanism are still converted to NxsException objects */
+			};
+		/** Enum different levels of warnings.  See NxsReader::SetWarningOutputLevel*/
+		enum NxsWarnLevel
+			{ //TODO: we need another warning level for status messages.
+			UNCOMMON_SYNTAX_WARNING = 0,  /**< Legal but uncommon syntax that could indicate a typo */
+			SKIPPING_CONTENT_WARNING = 1, /**< Content is being skipped by NCL */
+			OVERWRITING_CONTENT_WARNING = 2, /**< New content is replacing old information (eg. CharSets with the same name as a previously defined CharSet)*/
+			DEPRECATED_WARNING = 3, /**< Use of a deprecated feature */
+			AMBIGUOUS_CONTENT_WARNING = 4, /**< commands that could have multiple plausible interpretations */
+			ILLEGAL_CONTENT_WARNING = 5, /**< content that violates NEXUS rules, but is still parseable (eg. CharPartitions that only have some of the characters)*/
+			PROBABLY_INCORRECT_CONTENT_WARNING = 6, /**< Severe Warning that is generated when the file contains characters that should almost certainly be removed */
+			FATAL_WARNING = 7, /**< a higher warning level then any of the warning generated by NCL.  Primarily used in constructs such as (FATAL_WARNING - 1) to mean only the most severe warnings.*/
+			SUPPRESS_WARNINGS_LEVEL = 8 /**<  if the NxsReader's warning level is set to this, then warnings will be suppressed */
+			};
+
+		/*! If true then NCL will call a handler function if signals are encountered during NxsReader::Execute
+			(signal handling is off by default).
+			\sa The section on signal handling \ref signalsection
+		*/
+		static void setNCLCatchesSignals(bool);
+		/*! \returns true if NCL will call a handler function if signals are encountered during NxsReader::Execute
+					(signal handling is off by default).
+			\sa The section on signal handling \ref signalsection
+		*/
+		static bool getNCLCatchesSignals();
+		/*! Usually used internally when signal catching is enabled. If the number of sigints has changed, since the last
+			call, then NCL has detected a signal.
+			\sa The section on signal handling \ref signalsection
+		*/
+		static unsigned getNumSignalIntsCaught();
+		/*! Used internally.  If NCL is handling SIGINTs then this will be incremented with every SIGINT.
+			\sa The section on signal handling \ref signalsection
+		*/
+		static void setNumSignalsIntsCaught(unsigned);
+
+
+						NxsReader();
+		virtual			~NxsReader();
+
+
+		// functions to add and remove Block reader objects or factories for block readers.
+		virtual void    Add(NxsBlock *newBlock);
+		void			Detach(NxsBlock *newBlock);
+		virtual void    AddFactory(NxsBlockFactory *);
+		void			RemoveFactory(NxsBlockFactory *);
+
+		// trigger for NEXUS parsing.
+		virtual void	Execute(NxsToken& token, bool notifyStartStop = true);
+
+		// shortcuts for calling execute...
+		void			ReadFilepath(const char *filename);
+		void			ReadFilestream(std::istream & inf);
+		void			ReadStringAsNexusContent(const std::string & s);
+
+		virtual void	DebugReportBlock(NxsBlock &nexusBlock);
+
+		const char		*NCLNameAndVersion();
+		const char		*NCLCopyrightNotice();
+		const char		*NCLHomePageURL();
+
+		// hooks for subclasses to specialize the behavior
+		virtual void	ExecuteStarting();
+		virtual void	ExecuteStopping();
+		virtual bool	EnteringBlock(NxsString blockName);
+		virtual void	ExitingBlock(NxsString blockName);
+		virtual void	OutputComment(const NxsString &comment);
+		virtual void	SkippingDisabledBlock(NxsString blockName);
+		virtual void	SkippingBlock(NxsString blockName);
+
+		/*! This hook is called by the block readers when they encounter content
+			that is interpretable but is questionable (or even illegal according
+			to the NEXUS standard).
+
+			The default NexusWarn behavior is to generate a NexusException for any
+			warnLevel >= PROBABLY_INCORRECT_CONTENT_WARNING
+		 	and to ignore all other warnings.
+		*/
+		virtual void	NexusWarn(const std::string &s, NxsWarnLevel warnLevel, file_pos pos, long line, long col)
+			{
+			if (warnLevel >= PROBABLY_INCORRECT_CONTENT_WARNING)
+				{
+				NxsString e(s.c_str());
+				throw NxsException(e, pos, line, col);
+				}
+			}
+		/*! Used internally as a more convenient way of calling NexusWarn */
+		void	NexusWarnToken(const std::string &m, NxsWarnLevel warnLevel, const ProcessedNxsToken &token)
+			{
+			NexusWarn(m , warnLevel, token.GetFilePosition(), token.GetLineNumber(), token.GetColumnNumber());
+			}
+		/*! Used internally as a more convenient way of calling NexusWarn */
+		void	NexusWarnToken(const std::string &m, NxsWarnLevel warnLevel, const NxsToken &token)
+			{
+			NexusWarn(m , warnLevel, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+			}
+
+		/*! Called when a erron is detected */
+		virtual void	NexusError(NxsString msg, file_pos pos, long line, long col);
+
+
+
+		virtual void			ClearUsedBlockList();
+		NxsBlock 			   *CreateBlockFromFactories(const std::string & currBlockName, NxsToken &token, NxsBlockFactory **sourceOfBlock = NULL);
+		BlockReaderList 		GetUsedBlocksInOrder();
+		BlockReaderList 		GetBlocksFromLastExecuteInOrder();
+		BlockTypeToBlockList 	GetUsedBlocks();
+		std::set<NxsBlock*> 	GetSetOfAllUsedBlocks();
+
+		NxsTaxaBlockAPI 		*GetLastStoredTaxaBlock();
+		NxsCharactersBlockAPI 	*GetLastStoredCharactersBlock();
+		NxsTreesBlockAPI 		*GetLastStoredTreesBlock();
+
+
+		NxsTaxaBlockAPI 		*GetTaxaBlockByTitle(const char *title, unsigned *nMatches);
+		NxsCharactersBlockAPI 	*GetCharBlockByTitle(const char *title, unsigned *nMatches);
+		NxsTreesBlockAPI 		*GetTreesBlockByTitle(const char *title, unsigned *nMatches);
+
+		NxsTaxaBlockFactory 	*GetTaxaBlockFactory();
+		//NxsCharactersBlockFactory 	*GetCharBlockFactory();
+		//NxsTreesBlockFactory 	*GetTreesBlockFactory();
+
+		void			SetTaxaBlockFactory(NxsTaxaBlockFactory *);
+		//void			SetCharBlockFactory(NxsCharactersBlockFactory *);
+		//void			SetTreesBlockFactory(NxsTreesBlockFactory *);
+
+		virtual void    DeleteBlocksFromFactories();
+		unsigned		RemoveBlockFromUsedBlockList(NxsBlock *);
+
+		/*! throws away references to all blocks that that have been read. If the block
+			 was registered with the reader, then "Reset" is called on the block.
+				If the block came from a factory then the reference to the block is
+					removed from the reader (resulting in a memory leak if the client
+					code does not delete the block).
+			 This can be called if the client would like to store the information
+				from the NEXUS file, and get rid of the blocks to save memory (but
+				still maintain things like factories that were registered with the
+				NxsReader and tweaks to the default settings).
+		*/
+		virtual void	ClearContent();
+
+		/*!
+			 This function is useful after ClearContext() has been called.
+			 Instances of blocks that have been read can be registered with reader
+				so that future NEXUS files can be parsed with the context of those blocks.
+			 For example one might want to reregister a NxsTaxaBlock before reading
+				 a trees file, then you could call:
+				reader->AddReadBlock("TAXA", taxaB);
+			 NOTE: if you are using a PublicNexusReader, or MultiFormatReader
+				you should almost certainly call the type-specific forms such as
+				reader->AddReadTaxaBlock(taxaB);
+		*/
+		virtual void AddReadBlock(const NxsString &blockID, NxsBlock *block)
+			{
+			this->BlockReadHook(blockID, block);
+			}
+
+		/*! Call cullIdenticalTaxaBlocks(true) before reading a file if you want
+				the reader to discard a TaxaBlock that is identical to a previous
+				taxa block.  Use of this assumes that the reader of taxa blocks is
+				a NxsTaxaBlockAPI instance.
+			\warning: this function should only be called if you have registered
+				a NxsTaxaBlockFactory.  The culling of blocks WILL CALL DELETE
+				on them.
+		*/
+		void cullIdenticalTaxaBlocks(bool v=true)
+			{
+			this->destroyRepeatedTaxaBlocks = v;
+			}
+		std::vector<std::string> GetAllTitlesForBlock(const NxsBlock *b) const;
+
+
+		/*! Passing true to this method is a hacky way to enable all status messages while still filtering
+			NexusWarn messages.
+		*/
+		void SetAlwaysReportStatusMessages(bool v) {
+			this->alwaysReportStatusMessages = v;
+		}
+		/*! The reader's currentWarningLevel is set here.
+			By default this field is set to UNCOMMON_SYNTAX_WARNING.
+			By setting it to any other facet of NxsWarnLevel you can reduce the
+				number of warnings sent to std::cerr.
+			The warning level is checked in ExceptionRaisingNxsReader::NexusWarn
+				and NxsReader::statusMessage.
+			If the level of the message is greater or equal to the readers level
+				then the message will be sent to std::cerr
+			By calling SetWarningOutputLevel(SUPPRESS_WARNINGS_LEVEL) you can
+				make the reader ignore warnings.
+			\note if alwaysReportStatusMessages then NxsReader::statusMessage
+				will report all messages
+		*/
+		void SetWarningOutputLevel(NxsWarnLevel lev) {
+			currentWarningLevel = lev;
+		}
+		NxsWarnLevel GetWarningOutputLevel() const {
+			return currentWarningLevel;
+		}
+
+		/*! Messages about the status processing a file (such as "Executing...")
+			are sent here. If the reader's currentWarningLevel is set to the lowest
+			level (UNCOMMON_SYNTAX_WARNING) then these messages will show up in stderr.
+		*/
+		virtual void statusMessage(const std::string & m) const;
+
+		/*! \deprecated This function is almost never needed.
+			\returns if true no blocks have registered as readers (does not indicate
+				whether content has been read, nor does it indicate if any
+				factories have been added).
+		*/
+		bool			BlockListEmpty();
+		unsigned		PositionInBlockList(NxsBlock *b);
+
+		void			Reassign(NxsBlock *oldb, NxsBlock *newb);
+
+		/*! The block `b` will be given a priority level of `priorityLevel`
+
+			By default all blocks have priority level of 0. Lowering a blocks
+				priority level below 0, means that a Get....ByTitle() function
+				will not return the block if it finds a matching block that has
+				a higher priority
+
+			If you are re-using blocks (if you are not using the v2.1 API) be
+				aware that if a block has a low (negative) priority, but is then
+				used to read content then its priority will be bumped back up to 0.
+
+			The block priority affects calls Get...ByTitle() functions and
+				Find...ByTitle() functions.
+
+			This function is mainly used to "demote" NxsTaxaBlock instances so that they
+				will not clash with a TAXA block found in the file. \ref TaxaBlockClashes
+		*/
+		void AssignBlockPriority(NxsBlock *b, int priorityLevel);
+		/*! Returns the block priority for a block (or 0 if the block instance is unknown) */
+		int	GetBlockPriority(NxsBlock *b) const;
+		/*! Lowers the priority of all read blocks to `priorityLevel` */
+		void DemoteBlocks(int priorityLevel=-1);
+	protected:
+		/*! A convenience function to allow one to quickly get a list of block reader
+			that were generated (or used) in reading a filepath */
+		static 			BlockReaderList parseFileWithReader(NxsReader & reader, const char *filepath, bool parsePrivateBlocks=true, bool storeTokenInfo=true);
+		static bool nclCatchesSignals; // default False;
+		typedef void (*SignalHandlerFuncPtr) (int);
+		static SignalHandlerFuncPtr prevSignalCatcher; // the signal handler that was installed before NCL's signal handler
+		static unsigned numSigIntsCaught;
+		static bool prevSignalStored ;
+
+		void			CoreExecutionTasks(NxsToken& token, bool notifyStartStop = true);
+
+
+		void			AddBlockToUsedBlockList(const std::string &, NxsBlock *, NxsToken *);
+		bool 			BlockIsASingeltonReader(NxsBlock *) const ;
+		void 			BlockReadHook(const NxsString &currBlockName, NxsBlock *currBlock, NxsToken *token = NULL );
+		bool 			ExecuteBlock(NxsToken &token, const NxsString &currBlockName, NxsBlock *currBlock, NxsBlockFactory * sourceOfBlock);
+		NxsBlock	   *FindBlockOfTypeByTitle(const std::string &btype, const char *title, unsigned *nMatches);
+		NxsBlock	   *FindBlockByTitle(const BlockReaderList & chosenBlockList, const char *title, unsigned *nMatches);
+		BlockReaderList FindAllBlocksByTitle(const BlockReaderList & chosenBlockList, const char *title);
+		NxsBlock	   *GetLastStoredBlockByID(const std::string &key);
+		NxsTaxaBlockAPI *GetOriginalTaxaBlock(const NxsTaxaBlockAPI *) const;
+		bool			IsRepeatedTaxaBlock(const NxsTaxaBlockAPI *) const;
+		void 			NewBlockTitleCheckHook(const std::string &blockname, NxsBlock *p, NxsToken *token);
+		bool 			ReadUntilEndblock(NxsToken &token, const std::string & currBlockName);
+		void			RegisterAltTitle(const NxsBlock * b, std::string t);
+		std::set<NxsBlock *> RemoveBlocksFromFactoriesFromUsedBlockLists();
+		virtual void 	PostBlockReadingHook(NxsBlock &);
+
+
+		NxsBlock		*blockList;	/* pointer to first block in list of blocks */
+		NxsBlock		*currBlock;	/* pointer to current block in list of blocks */
+		typedef std::list<NxsBlockFactory *> BlockFactoryList;
+		NxsTaxaBlockFactory *taxaBlockFactory;
+		BlockFactoryList factories; /* list of pointers to factories capable of creating NxsBlock objects*/
+		bool destroyRepeatedTaxaBlocks;
+		NxsWarnLevel currentWarningLevel;
+		bool alwaysReportStatusMessages;
+
+	private:
+
+		BlockReaderList FindAllBlocksByTitleNoPrioritization(const BlockReaderList & chosenBlockList, const char *title);
+
+		BlockReaderList blocksInOrder;
+		std::map<NxsBlock *, int> blockPriorities;
+
+		BlockReaderList lastExecuteBlocksInOrder;
+		BlockTypeToBlockList blockTypeToBlockList;
+		typedef std::pair<unsigned, std::list<std::string> > NxsBlockTitleHistory;
+		typedef std::map<std::string, NxsBlockTitleHistory > NxsBlockTitleHistoryMap;
+		NxsBlockTitleHistoryMap blockTitleHistoryMap;
+		std::map<const NxsBlock *, std::list<std::string> > blockTitleAliases; // to deal with culling blocks and then using the titles of culled copies
+
+
+	};
+
+typedef NxsBlock NexusBlock;
+typedef NxsReader Nexus;
+
+/*! A subclass of NxsReader that is used in much of NCL v2.1.
+
+	The NexusError function raises a NxsException so that all errors are treated
+		as parse-ending conditions that the caller of Execute must handle.
+	See \ref NexusErrors
+*/
+class ExceptionRaisingNxsReader : public NxsReader
+	{
+	public:
+		/*! The `warnMode` argument should be a facet of NxsReader::WarningHandlingMode
+			this arguments determines what happens to warnings which are NOT converted
+			to exceptions -- by default only content that is probably incorrect will
+			be converted to a NxsException -- see ::SetWarningToErrorThreshold().
+
+
+		*/
+		ExceptionRaisingNxsReader(NxsReader::WarningHandlingMode mode=NxsReader::WARNINGS_TO_STDERR)
+			:warnMode(mode),
+			warningToErrorThreshold(PROBABLY_INCORRECT_CONTENT_WARNING)
+			{}
+		/*! Raise a NxsException. */
+		void NexusError(NxsString msg, file_pos pos, long line, long col)
+			{
+			throw NxsException(msg, pos, line, col);
+			}
+		virtual void NexusWarn(const std::string & msg, NxsWarnLevel level, file_pos pos, long line, long col);
+
+		void SkippingBlock(NxsString blockName);
+		void SkippingDisabledBlock(NxsString blockName);
+		/*! Sets the threshold for converting a warning into an error.   This
+			is useful for making the parser stricter.
+
+			Argument should be a facet of NxsReader::NxsWarnLevel.
+			Overrides the default setting of PROBABLY_INCORRECT_CONTENT_WARNING
+		*/
+		void SetWarningToErrorThreshold(int t)
+			{
+			warningToErrorThreshold = t;
+			}
+		virtual void ClearContent()
+			{
+			NxsReader::ClearContent();
+			}
+	private:
+		NxsReader::WarningHandlingMode warnMode;
+		int warningToErrorThreshold;
+	};
+
+/*! A subclass of NxsReader that is used preserves the same output style as version 2.0, but
+		allows for more flexibility in the streams that are used for output.
+
+	Messages from SkippingBlock, SkippingDisabledBlock, and Warnings are sent to the outstream
+	Warnings and Errors are written to the errstream
+
+*/
+class DefaultErrorReportNxsReader : public NxsReader
+	{
+	public:
+		static BlockReaderList parseFile(const char *filepath, std::ostream * stdOutstream, std::ostream * errOutstream, bool parsePrivateBlocks=true, bool storeTokenInfo=true);
+		/*! creates an instance that will write messages to the specified streams */
+		DefaultErrorReportNxsReader(std::ostream * stdOutstream, /*!< outputstream */
+									std::ostream * errOutstream) /*!< error stream */
+			:NxsReader(),
+			stdOut(stdOutstream),
+			errOut(errOutstream)
+			{
+			}
+
+		virtual ~DefaultErrorReportNxsReader() {}
+
+		/*! \returns true. silent */
+		virtual bool EnteringBlock(NxsString )
+			{
+			return true;
+			}
+
+		/*! writes a message to output  */
+		void SkippingBlock(NxsString blockName)
+			{
+			if (stdOut != 0L)
+				{
+				*stdOut << "[!Skipping unknown block (" << blockName << ")...]\n";
+				stdOut->flush();
+				}
+			}
+
+		/*! writes a message to output  */
+		void SkippingDisabledBlock(NxsString blockName)
+			{
+			if (stdOut != 0L)
+				{
+				*stdOut << "[!Skipping disabled block (" << blockName << ")...]\n";
+				stdOut->flush();
+				}
+			}
+
+		/*! writes a message to output and the error stream if the warnLevel >=  currentWarningLevel
+			If the message is = PROBABLY_INCORRECT_CONTENT_WARNING (and the reader is not
+			ignoring warnings, a NxsException will be raised.
+		*/
+		void NexusWarn(const std::string & msg, /*!< description of the warning */
+						NxsWarnLevel warnLevel, /*!< severity of the warning*/
+						file_pos pos, long line, long col)
+			{
+			if (warnLevel < currentWarningLevel)
+				return;
+			if (warnLevel >= PROBABLY_INCORRECT_CONTENT_WARNING)
+				{
+				NxsString e(msg.c_str());
+				throw NxsException(e, pos, line, col);
+				}
+			if (errOut != 0)
+				{
+				*errOut << "\nWarning:  ";
+				if (line > 0 || pos > 0)
+					*errOut << "at line " << line << ", column " << col << " (file position " << pos << "):\n";
+				*errOut  << msg << std::endl;
+				}
+			else if (stdOut != 0L)
+				{
+				*stdOut << "\nWarning:  ";
+				if (line > 0 || pos > 0)
+					*stdOut << "at line " << line << ", column " << col << " (file position " << pos << "):\n";
+				*stdOut  << msg << std::endl;
+				}
+			}
+
+		/*! Raises a NxsException.
+		*/
+		void NexusError(NxsString msg, file_pos pos, long line, long col)
+			{
+			NexusWarn(msg, NxsReader::FATAL_WARNING, pos, line, col);
+			throw NxsException(msg, pos, line, col);
+			}
+
+		std::ostream * stdOut;
+		std::ostream * errOut;
+	};
+
+/*!
+	Returns a map from all block ids that have been read to all instances that the NxsReader knows have been read and
+		have NOT been cleared.
+	NOTE:  If the factory interface to NCL is not being used this may not be a complete list of all of the blocks that
+		have been read!!!
+*/
+inline BlockTypeToBlockList NxsReader::GetUsedBlocks()
+	{
+	return blockTypeToBlockList;
+	}
+
+/*! Convenience function to get the factory for NxsTaxaBlocks */
+inline bool NxsReader::IsRepeatedTaxaBlock(const NxsTaxaBlockAPI * testB) const
+	{
+	return (GetOriginalTaxaBlock(testB) != NULL);
+	}
+
+
+/*! Returns a list of  all blocks that the NxsReader knows have been read and have NOT been cleared.
+
+	If a block has been "implied" by another block then the implied block will appear before the
+	explicit block.
+*/
+inline BlockReaderList NxsReader::GetUsedBlocksInOrder()
+	{
+	return blocksInOrder;
+	}
+
+/*! Similar to NxsReader::GetUsedBlocksInOrder, except this list of blocks is cleared at the beginning
+	of each  NxsReader::Execute  or (NxsReader::Read...) call. So the list returned list will
+	only reflect blocks from the last execution operation.
+
+	If a block has been "implied" by another block then the implied block will appear before the
+	explicit block.
+*/
+inline BlockReaderList NxsReader::GetBlocksFromLastExecuteInOrder()
+	{
+	return lastExecuteBlocksInOrder;
+	}
+
+/*! Convenience function to get the factory for NxsTaxaBlocks */
+inline NxsTaxaBlockFactory * NxsReader::GetTaxaBlockFactory()
+	{
+	return this->taxaBlockFactory;
+	}
+
+
+
+#endif
+
diff --git a/lib/ncl-2.1.18/ncl/nxsreader.lo b/lib/ncl-2.1.18/ncl/nxsreader.lo
new file mode 100644
index 0000000..574dc5e
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsreader.lo
@@ -0,0 +1,12 @@
+# nxsreader.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nxsreader.o'
+
+# Name of the non-PIC object
+non_pic_object='nxsreader.o'
+
diff --git a/lib/ncl-2.1.18/ncl/nxssetreader.cpp b/lib/ncl-2.1.18/ncl/nxssetreader.cpp
new file mode 100644
index 0000000..f4fe41d
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxssetreader.cpp
@@ -0,0 +1,536 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+#include <climits>
+#include "ncl/nxssetreader.h"
+#include "ncl/nxstoken.h"
+#include <algorithm>
+#include <iterator>
+using namespace std;
+
+void NxsSetReader::AddRangeToSet(unsigned first, unsigned last, unsigned stride, NxsUnsignedSet * destination, const NxsUnsignedSet * taboo, NxsToken &token)
+	{
+	NCL_ASSERT (last >= first);
+	NCL_ASSERT (last !=UINT_MAX);
+	NCL_ASSERT (stride !=UINT_MAX);
+	if (destination == NULL)
+		return;
+	NxsUnsignedSet::iterator dIt = destination->insert(first).first;
+	for (unsigned curr = first + stride; curr <= last; curr += stride)
+		{
+		if (taboo != NULL && taboo->count(curr) > 0)
+			{
+			NxsString errormsg;
+			errormsg << "Illegal repitition of an index (" << curr + 1 << ") in multiple subsets.";
+			throw NxsException(errormsg, token);
+			}
+		dIt = destination->insert(dIt, curr);
+		}
+	}
+
+/**
+	returns the number of indices added.
+*/
+unsigned NxsSetReader::InterpretTokenAsIndices(NxsToken &token,
+  const NxsLabelToIndicesMapper & mapper,
+  const char * setType,
+  const char * cmdName,
+  NxsUnsignedSet * destination)
+	{
+	try {
+		const std::string t = token.GetToken();
+		if (NxsString::case_insensitive_equals(t.c_str(), "ALL"))
+			{
+			unsigned m = mapper.GetMaxIndex();
+			NxsUnsignedSet s;
+			for (unsigned i = 0; i <= m; ++i)
+				s.insert(i);
+			destination->insert(s.begin(), s.end());
+			return (unsigned)s.size();
+			}
+		return mapper.GetIndicesForLabel(t, destination);
+		}
+	catch (const NxsException & x)
+		{
+		NxsString errormsg = "Error in the ";
+		errormsg << setType << " descriptor of a " << cmdName << " command.\n";
+		errormsg += x.msg;
+		throw NxsException(errormsg, token);
+		}
+	catch (...)
+		{
+		NxsString errormsg = "Expecting a ";
+		errormsg << setType << " descriptor (number or label) in the " << cmdName << ".  Encountered ";
+		errormsg <<  token.GetToken();
+		throw NxsException(errormsg, token);
+		}
+	}
+
+void NxsSetReader::ReadSetDefinition(
+  NxsToken &token,
+  const NxsLabelToIndicesMapper & mapper,
+  const char * setType, /* "TAXON" or "CHARACTER" -- for error messages only */
+  const char * cmdName, /* command name -- "TAXSET" or "EXSET"-- for error messages only */
+  NxsUnsignedSet * destination, /** to be filled */
+  const NxsUnsignedSet * taboo)
+	{
+	NxsString errormsg;
+	NxsUnsignedSet tmpset;
+	NxsUnsignedSet dummy;
+	if (destination == NULL)
+		destination = & dummy;
+	unsigned previousInd = UINT_MAX;
+	std::vector<unsigned> intersectVec;
+	while (!token.Equals(";"))
+		{
+		if (taboo && token.Equals(","))
+			return;
+		if (token.Equals("-"))
+			{
+			if (previousInd == UINT_MAX)
+				{
+				errormsg = "The '-' must be preceded by number or a ";
+				errormsg << setType << " label in the " << cmdName << " command.";
+				throw NxsException(errormsg, token);
+				}
+			token.GetNextToken();
+			if (token.Equals(";") || token.Equals("\\"))
+				{
+				errormsg = "Range in the ";
+				errormsg << setType << " set definition in the " << cmdName << " command must be closed with a number or label.";
+				throw NxsException(errormsg, token);
+				}
+			unsigned endpoint;
+			if (token.Equals("."))
+				endpoint = mapper.GetMaxIndex();
+			else
+				{
+				tmpset.clear();
+				unsigned nAdded = NxsSetReader::InterpretTokenAsIndices(token, mapper, setType, cmdName, &tmpset);
+				if (nAdded != 1)
+					{
+					errormsg = "End of a range in a ";
+					errormsg << setType << " set definition in the " << cmdName << " command must be closed with a single number or label (not a set).";
+					throw NxsException(errormsg, token);
+					}
+				endpoint = *(tmpset.begin());
+				if (endpoint < previousInd)
+					{
+					errormsg = "End of a range in a ";
+					errormsg << setType << " set definition in the " << cmdName << " command must be a larger index than the start of the range (found ";
+					errormsg << previousInd + 1 << " - " << token.GetToken();
+					throw NxsException(errormsg, token);
+					}
+				}
+			token.GetNextToken();
+			if (token.Equals("\\"))
+				{
+				token.GetNextToken();
+				NxsString t = token.GetToken();
+				unsigned stride = 0;
+				try
+					{
+					stride = t.ConvertToUnsigned();
+					}
+				catch (const NxsString::NxsX_NotANumber &)
+					{}
+				if (stride == 0)
+					{
+					errormsg = "Expecting a positive number indicating the 'stride' after the \\ in the ";
+					errormsg << setType << " set definition in the " << cmdName << " command. Encountered ";
+					errormsg << t;
+					throw NxsException(errormsg, token);
+					}
+				AddRangeToSet(previousInd, endpoint, stride, destination, taboo, token);
+				token.GetNextToken();
+				}
+			else
+				AddRangeToSet(previousInd, endpoint, 1, destination, taboo, token);
+			previousInd = UINT_MAX;
+			}
+		else
+			{
+			tmpset.clear();
+			const unsigned nAdded = NxsSetReader::InterpretTokenAsIndices(token, mapper, setType, cmdName, &tmpset);
+			if (taboo != NULL)
+				{
+				set_intersection(taboo->begin(), taboo->end(), tmpset.begin(), tmpset.end(), back_inserter(intersectVec));
+				if (!intersectVec.empty())
+					{
+					errormsg << "Illegal repitition of an index (" << 1 + *(intersectVec.begin()) << ") in multiple subsets.";
+					throw NxsException(errormsg, token);
+					}
+				}
+			if (nAdded == 1 )
+				{
+				previousInd = *(tmpset.begin());
+				destination->insert(previousInd);
+				}
+			else
+				{
+				previousInd = UINT_MAX;
+				destination->insert(tmpset.begin(), tmpset.end());
+				}
+			token.GetNextToken();
+			}
+		}
+	}
+
+/*!
+	Initializes `max' to maxValue, `settype' to `type', `token' to `t', `block' to `nxsblk' and `nxsset' to `iset',
+	then clears `nxsset'.
+*/
+NxsSetReader::NxsSetReader(
+  NxsToken			&t,			/* reference to the NxsToken being used to read in the NEXUS data file */
+  unsigned			maxValue,	/* maximum possible value allowed in this set (e.g. nchar or ntax) */
+  NxsUnsignedSet	&iset,		/* reference to the set object to store the set defined in the NEXUS data file */
+  NxsBlock			&nxsblk,	/* reference to the NxsBlock object (used for looking up taxon or character labels when encountered in the set definition) */
+  unsigned			type)		/* one of the elements in the NxsSetReaderEnum enumeration */
+  : block(nxsblk), token(t), nxsset(iset)
+	{
+	max		= maxValue;
+	settype	= type;
+	nxsset.clear();
+	}
+
+/*!
+	Adds the range specified by `first', `last', and `modulus' to the set. If `modulus' is zero it is ignored. The
+	parameters `first' and `last' refer to numbers found in the data file itself, and thus have range [1..`max']. They
+	are stored in `nxsset', however, with offset 0. For example, if the data file says "4-10\2" this function would be
+	called with `first' = 4, `last' = 10 and `modulus' = 2, and the values stored in `nxsset' would be 3, 5, 7, 9. The
+	return value is true unless `last' is greater than `max', `first' is less than 1, or `first' is greater than `last':
+	in any of these cases, the return value is false to indicate failure to store this range.
+*/
+bool NxsSetReader::AddRange(
+  unsigned first,		/* the first member of the range (inclusive, offset 1) */
+  unsigned last,		/* the last member of the range (inclusive, offset 1) */
+  unsigned modulus)		/* the modulus to use (if non-zero) */
+	{
+	if (last > max || first < 1 || first > last)
+		return false;
+
+	for (unsigned i = first - 1; i < last; i++)
+		{
+		unsigned diff = i - first + 1;
+		if (modulus > 0 && diff % modulus != 0)
+			continue;
+		nxsset.insert(i);
+		}
+
+	return true;
+	}
+
+/*!
+	Tries to interpret `token' as a number. Failing that, tries to interpret `token' as a character or taxon label,
+	which it then converts to a number. Failing that, it throws a NxsException exception.
+*/
+unsigned NxsSetReader::GetTokenValue()
+	{
+	int i = -1;
+	try {
+	    i = token.GetToken().ConvertToInt();
+	    }
+	catch (NxsString::NxsX_NotANumber &x)
+	    {
+	    }
+
+	unsigned v = 0;
+	if (i > 0)
+		v = (unsigned) i;
+
+	if (v == 0 && settype != NxsSetReader::generic)
+		{
+		if (settype == NxsSetReader::charset)
+			v = block.CharLabelToNumber(token.GetToken());
+		else if (settype == NxsSetReader::taxset)
+			v = block.TaxonLabelToNumber(token.GetToken());
+		}
+
+	if (v == 0)
+		{
+		block.errormsg = "Set element (";
+		block.errormsg += token.GetToken();
+		block.errormsg += ") not a number ";
+		if (settype == NxsSetReader::charset)
+			block.errormsg += "and not a valid character label";
+		else if (settype == NxsSetReader::taxset)
+			block.errormsg += "and not a valid taxon label";
+
+		throw NxsException(block.errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+		}
+
+	return v;
+	}
+
+std::vector<unsigned> NxsSetReader::GetSetAsVector(const NxsUnsignedSet &s)
+	{
+	std::vector<unsigned> u;
+	u.reserve(s.size());
+	for (NxsUnsignedSet::const_iterator sIt = s.begin(); sIt != s.end(); ++sIt)
+		u.push_back(*sIt);
+	return u;
+	}
+
+void NxsSetReader::WriteSetAsNexusValue(const NxsUnsignedSet & nxsset, std::ostream & out)
+	{
+	NxsUnsignedSet::const_iterator currIt = nxsset.begin();
+	const NxsUnsignedSet::const_iterator endIt = nxsset.end();
+	if (currIt == endIt)
+		return;
+	unsigned rangeBegin = 1 + *currIt++;
+	if (currIt == endIt)
+		{
+		out << ' ' << rangeBegin;
+		return;
+		}
+	unsigned prev = 1 + *currIt++;
+	if (currIt == endIt)
+		{
+		out << ' ' << rangeBegin << ' ' << prev;
+		return;
+		}
+	unsigned stride = prev - rangeBegin;
+	unsigned curr = 1 + *currIt++;
+	bool inRange = true;
+	while (currIt != endIt)
+		{
+		if (inRange)
+			{
+			if (curr - prev != stride)
+				{
+				if (prev - rangeBegin == stride)
+					{
+					out << ' ' << rangeBegin;
+					rangeBegin = prev;
+					stride = curr - prev;
+					}
+				else
+					{
+					if (stride > 1)
+						out << ' ' << rangeBegin << '-' << prev << " \\ " << stride;
+					else
+						out << ' ' << rangeBegin << '-' << prev ;
+					inRange = false;
+					}
+				}
+			}
+		else
+			{
+			inRange = true;
+			rangeBegin = prev;
+			stride = curr - prev;
+			}
+		prev = curr;
+		curr = 1 + *currIt;
+		currIt++;
+		}
+	if (inRange)
+		{
+		if (curr - prev != stride)
+			{
+			if (prev - rangeBegin == stride)
+				out << ' ' << rangeBegin << ' ' << prev;
+			else
+				{
+				if (stride > 1)
+					out << ' ' << rangeBegin << '-' << prev << " \\ " << stride;
+				else
+					out << ' ' << rangeBegin << '-' << prev ;
+				}
+			out << ' ' << curr;
+			}
+		else
+			{
+			if (stride > 1)
+				out << ' ' << rangeBegin << '-' << curr << " \\ " << stride;
+			else
+				out << ' ' << rangeBegin << '-' << curr ;
+			}
+		}
+	else
+		out << ' ' << prev << ' ' << curr;
+	}
+/*!
+	Reads in a set from a NEXUS data file. Returns true if the set was terminated by a semicolon, false otherwise.
+*/
+bool NxsSetReader::Run()
+	{
+	bool ok;
+	bool retval = false;
+
+	unsigned rangeBegin = UINT_MAX;
+	unsigned rangeEnd = rangeBegin;
+	bool insideRange = false;
+	unsigned modValue = 1;
+
+	for (;;)
+		{
+		// Next token should be one of the following:
+		//   ';'        --> set definition finished
+		//   '-'        --> range being defined
+		//   <integer>  --> member of set (or beginning or end of a range)
+		//   '.'        --> signifies the number max
+		//   '\'        --> signifies modulus value coming next
+		//
+		token.GetNextToken();
+
+		if (token.Equals("-"))
+			{
+			// We should not be inside a range when we encounter a hyphenation symbol.
+			// The hyphen is what _puts_ us inside a range!
+			//
+			if (insideRange)
+				{
+				block.errormsg = "The symbol '-' is out of place here";
+				throw NxsException(block.errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+			insideRange = true;
+			}
+
+		else if (token.Equals("."))
+			{
+			// We _should_ be inside a range if we encounter a period, as this
+			// is a range termination character
+			//
+			if (!insideRange)
+				{
+				block.errormsg = "The symbol '.' can only be used to specify the end of a range";
+				throw NxsException(block.errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+			rangeEnd = max;
+			}
+
+		else if (token.Equals("\\"))
+			{
+			// The backslash character is used to specify a modulus to a range, and
+			// thus should only be encountered if currently inside a range
+			//
+			if (!insideRange)
+				{
+				block.errormsg = "The symbol '\\' can only be used after the end of a range has been specified";
+				throw NxsException(block.errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+
+			// This should be the modulus value
+			//
+			modValue = NxsToken::DemandPositiveInt(token, block.errormsg, "The modulus value");
+			}
+
+		else if (insideRange && rangeEnd == UINT_MAX)
+			{
+			// The beginning of the range and the hyphen symbol have been read
+			// already, just need to store the end of the range at this point
+			//
+			rangeEnd = GetTokenValue();
+			}
+
+		else if (insideRange)
+			{
+			// If insideRange is true, we must have already stored the beginning
+			// of the range and read in the hyphen character. We would not have
+			// made it this far if we had also not already stored the range end.
+			// Thus, we can go ahead and add the range.
+			//
+			ok = AddRange(rangeBegin, rangeEnd, modValue);
+			modValue = 1;
+
+			if (!ok)
+				{
+				block.errormsg = "Character number out of range (or range incorrectly specified) in set specification";
+				throw NxsException(block.errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+
+			// We have actually already read in the next token, so deal with it
+			// now so that we don't end up skipping a token
+			//
+			if (token.Equals(";"))
+				{
+				retval = true;
+				break;
+				}
+			else if (token.Equals(","))
+				{
+				break;
+				}
+
+			rangeBegin = GetTokenValue();
+			rangeEnd = UINT_MAX;
+			insideRange = false;
+			}
+
+		else if (rangeBegin != UINT_MAX)
+			{
+			// If we were inside a range, we would have not gotten this far.
+			// If not in a range, we are either getting ready to begin a new
+			// range or have previously read in a single value. Handle the
+			// latter possibility here.
+			//
+			ok = AddRange(rangeBegin, rangeBegin, modValue);
+			modValue = 1;
+
+			if (!ok)
+				{
+				block.errormsg = "Number out of range (or range incorrectly specified) in set specification";
+				throw NxsException(block.errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+
+			if (token.Equals(";"))
+				{
+				retval = true;
+				break;
+				}
+			else if (token.Equals(","))
+				{
+				break;
+				}
+
+			rangeBegin = GetTokenValue();
+			rangeEnd = UINT_MAX;
+			}
+
+		else if (token.Equals(";"))
+			{
+			retval = true;
+			break;
+			}
+
+		else if (token.Equals(","))
+			{
+			break;
+			}
+
+		else if (token.Equals("ALL"))
+			{
+			rangeBegin = 1;
+			rangeEnd = max;
+			ok = AddRange(rangeBegin, rangeEnd);
+			}
+
+		else
+			{
+			// Can only get here if rangeBegin still equals UINT_MAX and thus we
+			// are reading in the very first token and that token is neither
+			// the word "all" nor is it a semicolon
+			//
+			rangeBegin = GetTokenValue();
+			rangeEnd = UINT_MAX;
+			}
+		}
+
+	return retval;
+	}
diff --git a/lib/ncl-2.1.18/ncl/nxssetreader.h b/lib/ncl-2.1.18/ncl/nxssetreader.h
new file mode 100644
index 0000000..14d20cb
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxssetreader.h
@@ -0,0 +1,104 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#ifndef NCL_NXSSETREADER_H
+#define NCL_NXSSETREADER_H
+#include <sstream>
+#include "ncl/nxstoken.h"
+#include "ncl/nxsblock.h"
+/*!
+	A class for reading NEXUS set objects and storing them in a set of int values. The NxsUnsignedSet `nxsset' will be
+	cleared, and `nxsset' will be built up as the set is read, with each element in the list storing a
+	member of the set (ranges are stored as individual elements). This class handles set descriptions of the following
+	form:
+>
+	4-7 15 20-.\3;
+>
+	The above set includes every number from 4 to 7 (inclusive), 15 and every third number from 20 to max, where `max'
+	would ordinarily be set to either the last character (if `settype' is `NxsSetReaderEnum::charset') or the last
+	taxon (if `settype' is `NxsSetReaderEnum::taxset'). If `max' equaled 30, the example above would be stored as
+	follows (remember that internally the numbers are stored with offset 0, even though in the NEXUS data file the
+	numbers always start at 1.
+>
+	3, 4, 5, 6, 14, 19, 22, 25, 28
+>
+	The following example of how NxsSetReader is used comes from the NxsCharactersBlock::HandleEliminate function:
+>
+	NxsSetReader(token, ncharTotal, eliminated, *this, NxsSetReader::charset).Run();
+>
+	This reads in a set of eliminated characters from a NEXUS data file, storing the resulting set in the data member
+	`eliminated'. In this case `max' is set to `ncharTotal' (the total number of characters), and the block reference
+	is set to the NxsCharactersBlock object, which provides a
+*/
+class NxsSetReader
+	{
+		static unsigned InterpretTokenAsIndices(NxsToken &t,
+								 const NxsLabelToIndicesMapper &,
+								 const char * setType,
+								 const char * cmd,
+								 NxsUnsignedSet * destination);
+		static void AddRangeToSet(unsigned first, unsigned last, unsigned stride, NxsUnsignedSet * destination, const NxsUnsignedSet * taboo, NxsToken &t);
+	public:
+		static void ReadSetDefinition(NxsToken &t,
+								 const NxsLabelToIndicesMapper &,
+								 const char * setType,
+								 const char * cmd,
+								 NxsUnsignedSet * destination,
+								 const NxsUnsignedSet * taboo = NULL);
+		static void	WriteSetAsNexusValue(const NxsUnsignedSet	&, std::ostream & out);
+		static std::string	GetSetAsNexusString(const NxsUnsignedSet &s)
+			{
+			std::stringstream os;
+			NxsSetReader::WriteSetAsNexusValue(s, os);
+			//os << ' ';
+			return os.str();
+			}
+		static std::vector<unsigned> GetSetAsVector(const NxsUnsignedSet &s);
+		enum NxsSetReaderEnum	/* For use with the variable `settype' */
+			{
+			generic = 1,		/* means expect a generic set (say, characters weights) */
+			charset,			/* means expect a character set */
+			taxset				/* means expect a taxon set */
+			};
+
+						NxsSetReader(NxsToken &t, unsigned maxValue, NxsUnsignedSet &iset, NxsBlock &nxsblk, unsigned type);
+
+		bool			Run();
+		void			WriteAsNexusValue(std::ostream & out) const
+			{
+			WriteSetAsNexusValue(nxsset, out);
+			}
+	protected:
+
+		bool			AddRange(unsigned first, unsigned last, unsigned modulus = 0);
+
+	private:
+
+		unsigned		GetTokenValue();
+
+		NxsBlock		█		/* reference to the block object used for looking up labels */
+		NxsToken		&token;		/* reference to the token being used to parse the NEXUS data file */
+		NxsUnsignedSet	&nxsset;	/* reference to the NxsUnsignedSet set being read */
+		unsigned		max;		/* maximum number of elements in the set */
+		unsigned		settype;	/* the type of set being read (see the NxsSetReaderEnum enumeration) */
+	};
+
+typedef NxsSetReader SetReader;
+
+#endif
diff --git a/lib/ncl-2.1.18/ncl/nxssetreader.lo b/lib/ncl-2.1.18/ncl/nxssetreader.lo
new file mode 100644
index 0000000..3855adf
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxssetreader.lo
@@ -0,0 +1,12 @@
+# nxssetreader.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nxssetreader.o'
+
+# Name of the non-PIC object
+non_pic_object='nxssetreader.o'
+
diff --git a/lib/ncl-2.1.18/ncl/nxsstring.cpp b/lib/ncl-2.1.18/ncl/nxsstring.cpp
new file mode 100644
index 0000000..84c8023
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsstring.cpp
@@ -0,0 +1,1041 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis and Mark T. Holder
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+#include <climits>
+#include <cstdarg>
+#include <cmath>
+#include <cfloat>
+#include <cstdlib>
+#include "ncl/nxsdefs.h"
+#include "ncl/nxsstring.h"
+
+using namespace std;
+
+// splits a string by whitespace and push the graphical strings to the back of r.
+//	Leading and trailing whitespace is lost ( there will be no empty strings added
+//		to the list.
+void NxsString::split(const std::string &s, std::list<std::string> * r)
+	{
+	NCL_ASSERT(r);
+	if (r == NULL)
+		return;
+	std::string current;
+	for (std::string::const_iterator sIt = s.begin(); sIt != s.end(); ++sIt)
+		{
+		const char c = *sIt;
+		if (isgraph(c))
+			current.append(1, c);
+		else if (!current.empty())
+			{
+			r->push_back(current);
+			current.clear();
+			}
+		}
+	if (!current.empty())
+		r->push_back(current);
+	}
+
+int NxsString::index_in_vector(const std::string &t, const std::vector<std::string> &v)
+	{
+	std::vector<std::string>::const_iterator vIt = v.begin();
+	int i = 0;
+	for (; vIt != v.end(); ++vIt, ++i)
+		{
+		if (t == *vIt)
+			return i;
+		}
+	return -1;
+	}
+
+int NxsString::index_in_array(const std::string &t, const char * * v, const unsigned n)
+	{
+	if (n > 0 && v)
+		{
+		for (int i = 0; i < (int) n; ++i)
+			{
+			if (v[i] && t == v[i])
+				return i;
+			}
+		}
+	return -1;
+	}
+
+
+/// Strips  whitespace from the front and end of a string
+std::string NxsString::strip_surrounding_whitespace(const std::string & s)
+	{
+	std::string l = strip_leading_whitespace(s);
+	return strip_trailing_whitespace(l);
+	}
+
+std::string NxsString::strip_leading_whitespace(const std::string & s)
+	{
+	std::string	t;
+	t.reserve(s.length());
+	bool graphFound = false;
+	for (std::string::const_iterator sIt = s.begin(); sIt != s.end(); ++sIt)
+		{
+		if (graphFound || isgraph(*sIt))
+			{
+			t.push_back(*sIt);
+			graphFound = true;
+			}
+		}
+	return t;
+	}
+
+
+std::string NxsString::strip_trailing_whitespace(const std::string & s)
+	{
+	std::string	t;
+	t.reserve(s.length());
+	bool graphFound = false;
+	for (std::string::const_reverse_iterator sIt = s.rbegin(); sIt != s.rend(); ++sIt)
+		{
+		if (graphFound || isgraph(*sIt))
+			{
+			t.push_back(*sIt);
+			graphFound = true;
+			}
+		}
+	return std::string(t.rbegin(), t.rend());
+	}
+
+/// Strips all whitespace
+std::string NxsString::strip_whitespace(const std::string & s)
+	{
+	std::string	t;
+	t.reserve(s.length());
+	for (std::string::const_iterator sIt = s.begin(); sIt != s.end(); ++sIt)
+		{
+		if (isgraph(*sIt))
+			t.push_back(*sIt);
+		}
+	return t;
+	}
+
+/*!
+	Returns true if `o` points to a string that represents a long (and `o` has no other characters than the long).
+	if n is not NULL, then when the function returns true, *n will be the long.
+*/
+bool NxsString::to_long(const char *o, long *n)
+	{
+	if (o == NULL)
+		return false;
+	if (strchr("0123456789-+",*o) != NULL) // strtol skips leading whitespace, but we don't  do that in
+		{
+		char * pEnd;
+		const long i = strtol (o, &pEnd, 10);
+		if (*pEnd != '\0')
+			return false;
+		if (n != NULL)
+			*n = i;
+		return true;
+		}
+	return false;
+	}
+
+/*!
+	Returns true if `o` points to a string that represents a double (and `o` has no other characters than the long).
+	if n is not NULL, then when the function returns true, *n will be the long.
+*/
+bool NxsString::to_double(const char *o, double *n)
+	{
+	if (o == NULL)
+		return false;
+	if (strchr("0123456789-.+",*o) != NULL ) // strtol skips leading whitespace, but we don't  do that in
+		{
+		char * pEnd;
+		const double i = strtod (o, &pEnd);
+		if (*pEnd != '\0')
+			return false;
+		if (n != NULL)
+			*n = i;
+		return true;
+		}
+	return false;
+	}
+
+bool NxsString::case_insensitive_equals(const char *o, const char * t)
+	{
+	if (o == 0L || t == 0L)
+		return false;
+    for (; toupper(*o) == toupper(*t); ++o, ++t)
+        {
+        if (*o == '\0')
+            return true;
+        }
+    return false;
+	}
+
+/*!
+	Capitalizes every character in s.
+*/
+std::string & NxsString::to_upper(std::string &s)
+	{
+	for (std::string::iterator sIt = s.begin(); sIt != s.end(); sIt++)
+		*sIt = (char) toupper(*sIt);
+	return s;
+	}
+/*!
+	Capitalizes every character in s.
+*/
+std::string & NxsString::to_lower(std::string &s)
+	{
+	for (std::string::iterator sIt = s.begin(); sIt != s.end(); sIt++)
+		*sIt = (char) tolower(*sIt);
+	return s;
+	}
+
+/*!
+	Appends a string representation of the supplied double to the stored string and returns a reference to itself.
+*/
+NxsString &NxsString::operator+=(
+  const double d)	/* the double value to append */
+	{
+	char tmp[81];
+
+	// Create a C-string representing the supplied double value.
+	// The # causes a decimal point to always be output.
+	//
+	std::sprintf(tmp, "%#3.6f", d);
+	unsigned tmplen = (unsigned)strlen(tmp);
+
+	// If the C-string has a lot of trailing zeros, lop them off
+	//
+	for (;;)
+		{
+		if (tmplen < 3 || tmp[tmplen-1] != '0' || tmp[tmplen-2] == '.')
+			break;
+		tmp[tmplen-1] = '\0';
+		tmplen--;
+		}
+
+	append(tmp);
+	return *this;
+	}
+
+/*!
+	Adds `n' copies of the character `c' to the end of the stored string and returns a reference to itself.
+*/
+NxsString &NxsString::AddTail(
+  char c,		/* the character to use in the appended tail */
+  unsigned n)	/* the number of times `c' is to be appended */
+	{
+	char s[2];
+	s[0] = c;
+	s[1] = '\0';
+
+	for (unsigned i = 0; i < n; i++)
+		append(s);
+
+	return *this;
+	}
+
+#if defined(_MSC_VER)
+#	pragma warning(disable:4786)
+#	pragma warning(disable:4291)
+#	if _MSC_VER >= 1500
+#		include <cstdio>
+#		if !defined(vsnprintf)
+#			define vsnprintf _vsnprintf_s
+#		endif
+#		define std::sprintf std::sprintf_s
+#   else
+#       define vsnprintf _vsnprintf
+#   endif
+#endif
+
+
+/*!
+	Appends a printf-style formatted string onto the end of this NxsString and returns the number of characters added to the
+	string. For example, the following code would result in the string s being set to "ts-tv rate ratio = 4.56789":
+>
+	double kappa = 4.56789;
+	NxsString s;
+	s.PrintF("ts-tv rate ratio = %.5f", kappa);
+>
+*/
+int NxsString::PrintF(
+  const char *formatStr,	/* the printf-style format string */
+  ...)						/* other arguments referred to by the format string */
+  	{
+  	const int kInitialBufferSize = 256;
+  	char buf[kInitialBufferSize];
+
+	// Create a pointer to the list of optional arguments
+	//
+  	va_list argList;
+
+	// Set arg_ptr to the first optional argument in argList. The
+	// second argument (formatStr) is the last non-optional argument.
+	//
+  	va_start(argList, formatStr);
+
+	// If vsnprintf returns -1, means kInitialBufferSize was not large enough.
+	// In this case, only kInitialBufferSize bytes are written.
+	//
+  	int nAdded = vsnprintf(buf, kInitialBufferSize, formatStr, argList);
+
+	// Reset the argument list pointer
+	//
+  	va_end(argList);
+
+	// Currently, if formatted string is too long to fit into the supplied buf,
+	// just adding a terminating '\0' and returning the truncated string
+	// Need to think of a better solution
+	//
+	if (nAdded  < 0 || nAdded >= kInitialBufferSize)
+		buf[kInitialBufferSize - 1] = '\0';
+
+	*this << buf;
+
+  	return nAdded;
+  	}
+
+/*!
+	Returns true if the string is a abbreviation (or complete copy) of the argument `s'.
+*/
+bool NxsString::IsStdAbbreviation(
+  const NxsString &s,	/* the string for which the stored string is potentially an abbreviation */
+  bool respectCase)		/* if true, comparison will be case-sensitive */
+  const
+	{
+	if (empty())
+		return false;
+
+	// s is the unabbreviated comparison string
+	//
+	const unsigned slen = static_cast<unsigned const>(s.size());
+
+	// t is the stored string
+	//
+	const unsigned tlen = static_cast<unsigned const>(size());
+
+	// t cannot be an abbreviation of s if it is longer than s
+	//
+	if (tlen > slen)
+		return false;
+
+	// Examine each character in t and return false (meaning "not an abbreviation")
+	// if at any point the corresponding character in s is different
+	//
+	for (unsigned k = 0; k < tlen; k++)
+		{
+		if (respectCase)
+			{
+			if ((*this)[k] != s[k])
+				return false;
+			}
+		else if (toupper((*this)[k]) != toupper(s[k]))
+			return false;
+		}
+
+	return true;
+	}
+
+/*!
+	Returns true if the stored string is a case-insensitive abbreviation (or complete copy) of `s' and the stored string
+ 	has all of the characters that are in the initial capitalized portion of `s'. For example if `s' is "KAPpa" then
+	"kappa", "kapp", or "kap" (with any capitalization pattern) will return true and all other strings will return false.
+	Always returns false if the stored string has length of zero.
+*/
+bool NxsString::IsCapAbbreviation(
+  const NxsString &s)	/* the string for which the stored string is potentially an abbreviation */
+  const
+	{
+	if (empty())
+		return false;
+
+	// s is the unabbreviated comparison string
+	//
+	const unsigned slen = static_cast<unsigned>(s.size());
+
+	// t is the stored string
+	//
+	const unsigned tlen = static_cast<unsigned>(size());
+
+	// If the stored string is longer than s then it cannot be an abbreviation of s
+	//
+	if (tlen > slen)
+		return false;
+
+	unsigned k = 0;
+	for (; k < slen; k++)
+		{
+		if (isupper(s[k]))
+			{
+			// If still in the uppercase portion of s and we've run out of characters
+			// in t, then t is not a valid abbrevation of s
+			//
+			if (k >= tlen)
+				return false;
+
+			// If kth character in t is not equal to kth character in s, then
+			// t is not an abbrevation of s
+			//
+			char tokenChar = (char)toupper((*this)[k]);
+			if (tokenChar != s[k])
+				return false;
+			}
+		else if (!isalpha(s[k]))
+			{
+			// Get here if we are no longer in the upper case portion of s and
+			// s[k] is not an alphabetic character. This section is necessary because
+			// we are dealing with a section of s that is not alphabetical and thus
+			// we cannot tell whether this should be part of the abbrevation or not
+			// (i.e. we cannot tell if it is capitalized or not). In this case, we
+			// pretend that we are still in the upper case portion of s and return
+			// false if we have run out of characters in t (meaning that the abbreviation
+			// was too short) or we find a mismatch.
+			//
+			if (k >= tlen)
+				return false;
+
+			if ((*this)[k] != s[k])
+				return false;
+			}
+		else
+			{
+			// Get here if we are no longer in the upper case portion of s and
+			// s[k] is an alphabetic character. Just break because we have determined
+			// that t is in fact a valid abbreviation of s.
+			//
+			break;
+			}
+		}
+
+	// Check the lower case portion of s and any corresponding characters in t for mismatches
+	// Even though the abbreviation is valid up to this point, it will become invalid if
+	// any mismatches are found beyond the upper case portion of s
+	//
+	for (; k < tlen; k++)
+		{
+  		const char tokenChar = (char)toupper((*this)[k]);
+  		const char otherChar = (char)toupper(s[k]);
+		if (tokenChar != otherChar)
+			return false;
+		}
+
+	return true;
+	}
+
+/*!
+	Right-justifies `x' in a field `w' characters wide, using blank spaces to fill in unused portions on the left-hand
+	side of the field. Specify true for `clear_first' to first empty the string. Assumes `w' is large enough to
+	accommodate the string representation of `x'.
+*/
+NxsString &NxsString::RightJustifyLong(
+  long x,			/* long value to right justify */
+  unsigned int w,	/* width of field */
+  bool clear_first)	/* if true, initialize string first to empty string */
+	{
+	bool x_negative = (x < 0L ? true : false);
+	unsigned long xabs = (x_negative ? (-x) : x);
+	unsigned num_spaces = w;
+
+	// If w = 10 and x = 123, we need 7 blank spaces before x
+	// log10(123) is 2.09, indicating that x is at least 10^2 = 100 but not
+	// 10^3 = 1000, thus x requires at least 3 characters to display
+	//
+	unsigned x_width = (x == 0 ? 1 :1 + (int)log10((double)xabs));
+	if (x_negative)
+		x_width++;	// for the minus sign
+
+	NCL_ASSERT(x_width <= num_spaces);
+	num_spaces -= x_width;
+
+	if (clear_first)
+		erase();
+
+	for (unsigned k = 0; k < num_spaces; k++)
+		*this += ' ';
+
+	if (x_negative)
+		*this += '-';
+
+	*this += xabs;
+	return *this;
+	}
+
+/*!
+	Right-justifies `x' in a field `w' characters wide with precision `p', using blank spaces to fill in unused
+	portions on the left-hand side of the field. Specify true for `clear_first' to first empty the string. Assumes that
+	the specified width is enough to accommodate the string representation of `x'.
+*/
+NxsString &NxsString::RightJustifyDbl(
+  double x,				/* double value to right justify */
+  unsigned w,			/* width of field */
+  unsigned p,			/* precision to use when displaying `x' */
+  bool clear_first)		/* if true, initialize stored string first to the empty string */
+	{
+	if (clear_first)
+		erase();
+
+	char fmtstr[81];
+	std::sprintf(fmtstr, "%%.%df", p);
+	NxsString tmp;
+	tmp.PrintF(fmtstr, x);
+
+	NCL_ASSERT(w >= tmp.length());
+	unsigned num_spaces = w - (unsigned)tmp.length();
+
+	for (unsigned k = 0; k < num_spaces; k++)
+		*this += ' ';
+
+	*this += tmp;
+	return *this;
+	}
+
+/*!
+	Right-justifies `s' in a field `w' characters wide, using blank spaces to fill in unused portions on the left-hand
+	side of the field. Specify true for `clear_first' to first empty the string. Assumes that the specified width is
+	enough to accommodate `s'.
+*/
+NxsString &NxsString::RightJustifyString(
+  const NxsString &s,	/* string to right justify */
+  unsigned w,			/* width of field */
+  bool clear_first)		/* if true, initialize string first to the empty string */
+	{
+	if (clear_first)
+		erase();
+
+	NCL_ASSERT(w >= s.length());
+	unsigned num_spaces = w - (unsigned)s.length();
+
+	for (unsigned k = 0; k < num_spaces; k++)
+		*this += ' ';
+
+	*this += s;
+	return *this;
+	}
+void NxsString::blanks_to_underscores(std::string &s)
+	{
+	for (std::string::iterator sIt = s.begin(); sIt != s.end(); sIt++)
+		{
+		if (*sIt == ' ')
+			*sIt =  '_';
+		}
+	}
+
+void NxsString::add_nxs_quotes(std::string &s)
+	{
+	std::string withQuotes;
+	unsigned len = (unsigned)s.length();
+	withQuotes.reserve(len + 4);
+	withQuotes.append(1,'\'');
+	for (std::string::const_iterator sIt = s.begin(); sIt != s.end(); sIt++)
+		{
+		withQuotes.append(1, *sIt);
+		if (*sIt == '\'')
+			withQuotes.append(1,'\'');
+		}
+	withQuotes.append(1,'\'');
+	s.swap(withQuotes);
+	}
+
+NxsString::NxsQuotingRequirements NxsString::determine_quoting_requirements(const std::string & s)
+	{
+	NxsQuotingRequirements nrq = kNoQuotesNeededForNexus;
+	for (std::string::const_iterator sIt = s.begin(); sIt != s.end(); ++sIt)
+		{
+		if (!isgraph(*sIt))
+			{
+			if (*sIt != ' ')
+				return kSingleQuotesNeededForNexus;
+			nrq  = kUnderscoresSufficeForNexus;
+			}
+		else if (strchr("(){}\"-]/\\,;:=*`+<>", *sIt) != NULL)
+			{
+			// Get here if c is any NEXUS punctuation mark except left square bracket ([) or apostrophe (').
+			// [ and ' never get returned as punctuation by NxsToken,
+			// so we should never encounter them here.
+			//
+			return (s.length() > 1 ? kSingleQuotesNeededForNexus : kNoQuotesNeededForNexus);
+			}
+		else if (strchr("\'[_", *sIt) != NULL)
+			{
+			// Get here if c is either an apostrophe or left square bracket. Quotes are needed if one of these
+			// characters is all there is to this string
+			//
+			return kSingleQuotesNeededForNexus;
+			}
+		}
+	return nrq;
+	}
+
+/*!
+	Returns true if the string needs to be surrounded by single-quotes to make it a single nexus token.
+*/
+bool NxsString::QuotesNeeded() const
+	{
+	for (NxsString::const_iterator sIt = begin(); sIt != end(); sIt++)
+		{
+		char c = (*sIt);
+		if (!isgraph(c))
+			return true;
+		else if (strchr("(){}\"-]/\\,;:=*`+<>", c) != NULL && length() > 1)
+			return true;
+		else if (c == '\'' || c == '_' || c == '[')
+			return true;
+		}
+	return false;
+	}
+
+/*!
+	Converts any blank spaces found in the stored string to the underscore character.
+*/
+NxsString &NxsString::BlanksToUnderscores()
+	{
+	unsigned len = (unsigned)length();
+	for (unsigned k = 0; k < len; k++)
+		{
+		char &ch = at(k);
+		if (ch == ' ')
+			ch = '_';
+		}
+	return *this;
+	}
+
+/*!
+	Converts any underscore characters found in the stored string to blank spaces.
+*/
+NxsString &NxsString::UnderscoresToBlanks()
+	{
+	unsigned len = (unsigned)length();
+	for (unsigned k = 0; k < len; k++)
+		{
+		char &ch = at(k);
+		if (ch == '_')
+			ch = ' ';
+		}
+	return *this;
+	}
+
+/*!
+	Shortens stored string to `n' - 3 characters, making the last three characters "...". If string is already less than
+	`n' characters in length, this function has no effect. This is useful when it is desirable to show some of the
+	contents of a string, even when the string will not fit in its entirety into the space available for displaying it.
+	Assumes that `n' is at least 4.
+*/
+NxsString &NxsString::ShortenTo(
+  unsigned n)	/* maximum number of characters available for displaying the string */
+	{
+	NCL_ASSERT(n > 3);
+	if (length() <= static_cast<unsigned>(n))
+		return *this;
+
+	NxsString s;
+	for (NxsString::iterator sIt = begin(); sIt != end(); sIt++)
+		{
+		s += (*sIt);
+		if (s.length() >= n - 3)
+			break;
+		}
+	s += "...";
+
+	*this = s;
+	return *this;
+	}
+
+
+/*!
+	Returns true if the stored string can be interpreted as a double value, and returns false otherwise.
+*/
+bool NxsString::IsADouble() const
+	{
+	const char	*str			= c_str();
+	unsigned	i				= 0;
+	bool		hadDecimalPt	= false;
+	bool		hadExp			= false;
+	bool		hadDigit		= false;
+	bool		hadDigitInExp	= false;
+
+	//	First char can be -
+	//
+	if (str[i]=='-' || str[i] == '+')
+		i++;
+
+	while (str[i])
+		{
+		if (isdigit(str[i]))
+			{
+			//	Digits are always OK
+			//
+			if (hadExp)
+				hadDigitInExp = true;
+			else
+				hadDigit = true;
+			}
+		else if (str[i] == '.')
+			{
+			//	One decimal point is allowed and it must be before the exponent
+			//
+			if (hadExp || hadDecimalPt)
+				return false;
+			hadDecimalPt = true;
+			}
+		else if (str[i] == 'e' || str[i] == 'E')
+			{
+			//	One e is allowed, but it must be after at least one digit
+			//
+			if (hadExp || !hadDigit)
+				return false;
+			hadExp = true;
+			}
+		else if (str[i] == '-')
+			{
+			//	Another - is allowed if it is preceded by e
+			//
+			if (!hadExp || (str[i-1] != 'e' && str[i-1] != 'E')	)
+				return false;
+			}
+		else
+			return false;
+		i++;
+		}
+
+	if (hadExp)
+		{
+		if (hadDigitInExp)
+			return true;
+		return false;
+		}
+
+	if (hadDigit)
+		return true;
+	return false;
+	}
+
+/*!
+	Returns true if stored string can be interpreted as a long integer.
+*/
+bool NxsString::IsALong() const
+	{
+	const char *str	= c_str();
+	unsigned i		= 0;
+
+	//	First char can be -
+	//
+	if (str[i]=='-')
+		i++;
+
+	if (!isdigit(str[i]))
+		return false;
+
+	while (str[i])
+		{
+		if (!isdigit(str[i]))
+			return false;
+		i++;
+		}
+
+	return true;
+	}
+
+/*!
+	Returns true if the stored string is a non-case-sensitive copy of the argument `s'. Note: will return true if both the
+	stored string and `s' are empty strings.
+*/
+bool NxsString::EqualsCaseInsensitive(
+  const NxsString &s)	/* the comparison string */
+  const
+	{
+	unsigned k;
+	unsigned slen = (unsigned)s.size();
+	unsigned tlen = (unsigned)size();
+	if (slen != tlen)
+		return false;
+
+	for (k = 0; k < tlen; k++)
+		{
+  		if ((char)toupper((*this)[k]) != (char)toupper(s[k]))
+			return false;
+		}
+
+	return true;
+	}
+
+/*!
+	Creates a string representation of the hexadecimal version of the long integer `p'. For example, if `p' equals 123,
+	and if 2 was specified for `nFours', the resulting string would be "7B". If 4 was specified for `nFours', then the
+	resulting string would be "007B".
+*/
+NxsString NxsString::ToHex(
+  long p,			/* the value to display in hexadecimal */
+  unsigned nFours)	/* the number of hexadecimal digits to display */
+	{
+	NxsString s;
+	char decod[] = "0123456789ABCDEF";
+	for (int i = nFours - 1; i >= 0 ; i--)
+		{
+		unsigned long k = (p >> (4*i));
+		unsigned long masked = (k & 0x000f);
+		s += decod[masked];
+		}
+	return s;
+	}
+
+/*!
+	Checks to see if the stored string begins with upper case letters and, if so, returns all of the contiguous capitalized
+	prefix. If the stored string begins with lower case letters, an empty string is returned.
+*/
+NxsString NxsString::UpperCasePrefix() const
+	{
+	NxsString x;
+	unsigned i = 0;
+	while (i < size() && isupper((*this)[i]))
+		x += (*this)[i++];
+	return x;
+	}
+
+/*!
+	Converts the stored string to an unsigned int using the standard C function strtol, throwing NxsX_NotANumber if the
+	conversion fails. Returns UINT_MAX if the number is too large to fit in an unsigned (or was a negative number).
+*/
+unsigned NxsString::ConvertToUnsigned() const
+	{
+	long l = ConvertToLong();
+	if (l < 0 || l >= (long) INT_MAX)
+		return UINT_MAX;
+	return static_cast<unsigned> (l);
+	}
+
+/*!
+	Converts the stored string to an int using the standard C function strtol, throwing NxsX_NotANumber if the conversion
+	fails. Returns INT_MAX if the number is too large to fit in an int or -INT_MAX if it is too small.
+*/
+int NxsString::ConvertToInt() const
+	{
+	long l = ConvertToLong();
+	if (l == LONG_MAX || l > INT_MAX)
+		return INT_MAX;
+	if (l == -LONG_MAX || l <-INT_MAX)
+		return -INT_MAX;
+	return static_cast<int> (l);
+	}
+
+/*!
+	Converts the stored string to a long using the standard C function strtol, throwing NxsX_NotANumber if the conversion
+	fails.
+*/
+long NxsString::ConvertToLong() const
+	{
+	if (length() == 0 || !(isdigit(at(0)) || at(0) == '-'))
+		throw NxsX_NotANumber();
+	const char *b = c_str();
+	char *endP;
+	long l = strtol(b, &endP, 10);
+#if defined(_MSC_VER)
+	if ((l == 0 && (endP - b) == 0))
+		throw NxsX_NotANumber();
+#else
+	if (l == 0 && endP == b)
+		throw NxsX_NotANumber();
+#endif
+	return l;
+	}
+
+/*!
+	Converts the stored string to a double using the standard C function strtod, throwing NxsX_NotANumber if the conversion
+	fails. Returns DBL_MAX or -DBL_MAX if the number is out of bounds.
+*/
+double NxsString::ConvertToDouble() const
+	{
+	if (length() == 0)
+		throw NxsX_NotANumber();
+
+	char ch = at(0);
+	if (isdigit(ch) || ch == '-' || ch == '.'|| toupper(ch) == 'E')
+		{
+		const char *b = c_str();
+		char *endP;
+		double d = strtod(b, &endP);
+#if defined(_MSC_VER)
+		if ((d == 0.0 && (endP - b) == 0))
+			throw NxsX_NotANumber();
+#else
+		if (d == 0.0 && endP == b)
+			throw NxsX_NotANumber();
+#endif
+		if (d == HUGE_VAL)
+			return DBL_MAX;
+		if (d == -HUGE_VAL)
+			return -DBL_MAX;
+		return d;
+		}
+	throw NxsX_NotANumber();
+#if defined (DEMANDS_UNREACHABLE_RETURN)
+	return DBL_MAX;
+#endif
+	}
+
+/*!
+	Transforms the vector of NxsString objects by making them all lower case and then capitalizing the first portion of
+	them so that the capitalized portion is enough to uniquely specify each. Returns true if the strings are long enough
+	to uniquely specify each. Horrendously bad algorithm, but shouldn't be called often.
+*/
+bool SetToShortestAbbreviation(
+  NxsStringVector	&strVec,		/* vector of NxsString objects */
+  bool 				allowTooShort)	/* */
+	{
+	NxsStringVector upperCasePortion;
+	unsigned i;
+	for (i = 0; i < strVec.size(); i++)
+		{
+		// Change the next string to lower case
+		//
+		strVec[i].ToLower();
+
+		unsigned prefLen = 0;
+		NxsString pref;
+
+		if (prefLen >= strVec[i].size())
+			return false;
+		pref += (char) toupper(strVec[i][prefLen++]);
+		bool moreChars = true;
+
+		// Keep adding letters from the current string until pref is unique.
+		// Then add this pref to upperCasePortion (vector of previous prefs)
+		//
+		for (;moreChars;)
+			{
+			unsigned prevInd = 0;
+			for (; prevInd < upperCasePortion.size(); prevInd++)
+				{
+				if (pref == upperCasePortion[prevInd])
+					{
+					// 	Conflict  - both abbreviations need to grow
+					//
+					if (prefLen >= strVec[i].size())
+						{
+						if (allowTooShort)
+							{
+							if (prefLen < strVec[prevInd].size())
+								upperCasePortion[prevInd] += (char) toupper(strVec[prevInd][prefLen]);
+							moreChars = false;
+							break;
+							}
+						else
+							return false;
+						}
+					pref += (char) toupper(strVec[i][prefLen]);
+					if (prefLen >= strVec[prevInd].size())
+						{
+						if (allowTooShort)
+							{
+							prevInd = 0;
+							prefLen++;
+							break;
+							}
+						else
+							return false;
+						}
+					upperCasePortion[prevInd] += (char) toupper(strVec[prevInd][prefLen++]);
+					prevInd = 0;
+					break;
+					}
+				else
+					{
+					unsigned j;
+					for (j = 0; j < prefLen; j++)
+						{
+						if (pref[j] != upperCasePortion[prevInd][j])
+							break;
+						}
+					if (j == prefLen)
+						{
+						//	pref agrees with the first part of another abbreviation, lengthen it.
+						//
+						if (prefLen >= strVec[i].size())
+							{
+							if (allowTooShort)
+								{
+								moreChars = false;
+								break;
+								}
+							else
+								return false;
+							}
+						pref += (char) toupper(strVec[i][prefLen++]);
+						break;
+						}
+					}
+				}
+			if (prevInd == upperCasePortion.size() || !moreChars)
+				{
+				// Made it all the way through with no problems, add this
+				// prefix as command i's upper case portion
+				//
+				upperCasePortion.push_back(pref);
+				break;
+				}
+			}
+		}
+
+	for (i = 0; i < strVec.size(); i++)
+		{
+		for (unsigned j = 0; j < upperCasePortion[i].size(); j++)
+			strVec[i][j] = upperCasePortion[i][j];
+		}
+
+	return true;
+	}
+
+/*!
+	Returns a vector of NxsString objects that match the entire `testStr'.
+*/
+NxsStringVector GetVecOfPossibleAbbrevMatches(
+  const NxsString		&testStr,		/* string to match */
+  const NxsStringVector	&possMatches)	/* vector of possible matches */
+	{
+	NxsStringVector matches;
+	for (unsigned i = 0; i < possMatches.size(); i++)
+		{
+		if (testStr.Abbreviates(possMatches[i]))
+			matches.push_back(possMatches[i]);
+		}
+	return matches;
+	}
+
+/*!
+	Written to make it easy to initialize a vector of strings. Similar to the perl split function. Converts a string like
+	this -- "A|bro|ken strin|g" -- to a vector of strings with four elements:  "A", "bro", "ken string", and "g".
+*/
+NxsStringVector BreakPipeSeparatedList(
+  const NxsString &strList)	/* the string submitted for splitting */
+  	{
+	NxsString::const_iterator p = strList.begin();
+	NxsString ss;
+	NxsStringVector retVec;
+	for (;;)
+		{
+		bool done = (p == strList.end());
+		if (done || (*p == '|'))
+			{
+			retVec.push_back(ss);
+			ss.clear();
+			if (done)
+				break;
+			p++;
+			}
+		ss += *p;
+		p++;
+		}
+	return retVec;
+	}
diff --git a/lib/ncl-2.1.18/ncl/nxsstring.h b/lib/ncl-2.1.18/ncl/nxsstring.h
new file mode 100644
index 0000000..7509ac0
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsstring.h
@@ -0,0 +1,742 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis and Mark T. Holder
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#ifndef NCL_NXSSTRING_H
+#define NCL_NXSSTRING_H
+
+
+#include <cstring>
+#include <cstdio>
+#include <functional>
+#include <ostream>
+#include <string>
+#include "ncl/nxsdefs.h"
+
+
+
+
+
+// Define HAVE_NCL_NXSSTRING_ENDL if your code needs it
+#if ! defined (HAVE_NCL_NXSSTRING_ENDL)
+#   define HIDE_NCL_NXSSTRING_ENDL
+#else
+#   warning "use of endl with NxsString instances has been deprecated"
+#endif
+class IndexSet;
+
+/*!
+	A string class for use with the Nexus Class Library. NxsString inherits most of its functionality from the standard
+	template library class string, adding certain abilities needed for use in NCL, such as the ability to discern
+	whether a short string represents an abbreviation for the string currently stored. Another important addition is
+	the member function PrintF, which accepts a format string and an arbitrary number of arguments, allowing a string
+	to be built in a manner similar to the standard C function printf. Many operators are also provided for appending
+	numbers to the ends of strings, an ability which is very useful for producing default labels (e.g. taxon1, taxon2,
+	etc.).
+*/
+class NxsString
+  : public std::string
+	{
+	public:
+		enum NxsQuotingRequirements
+			{
+			kNoQuotesNeededForNexus = 0, /// this enum value is kept equivalent to false
+			kSingleQuotesNeededForNexus, /// punctuation or non-space whitespace characters present
+			kUnderscoresSufficeForNexus  /// No nexus token-breakers
+			};
+
+		class NxsX_NotANumber {};	/* exception thrown if attempt to convert string to a number fails */
+		static bool case_insensitive_equals(const char *o, const char * t);
+		static bool to_long(const char *c, long *n);
+		static bool to_double(const char *c, double *n);
+		static std::string strip_leading_whitespace(const std::string & s);
+		static std::string strip_trailing_whitespace(const std::string & s);
+		static std::string strip_surrounding_whitespace(const std::string & s);
+		static std::string strip_whitespace(const std::string & s);
+		static void split(const std::string &s, std::list<std::string> *);
+		static std::string get_upper(const std::string &s)
+			{
+			std::string t(s);
+			to_upper(t);
+			return t;
+			}
+		static std::string & to_lower(std::string & s);
+		static std::string & to_upper(std::string & s);
+		static NxsQuotingRequirements determine_quoting_requirements(const std::string &);
+		static void blanks_to_underscores(std::string &s);
+		static void add_nxs_quotes(std::string &s);
+		static int index_in_vector(const std::string &t, const std::vector<std::string> &v);
+		static int index_in_array(const std::string &t, const char * * v, const unsigned n);
+
+		enum CmpEnum				/* enum that is used to specify string comparison modes */
+			{
+			respect_case,
+			no_respect_case,
+			abbrev
+			};
+
+							NxsString();
+							NxsString(const char *s);
+							NxsString(const NxsString &s);
+
+		static std::string	GetEscaped(const std::string &s);
+		static std::string	GetEscapedInt(const int &v);
+		static std::string	GetEscapedDouble(const double &v);
+		//	Accessors
+		//
+		bool				Abbreviates(const NxsString &s, NxsString::CmpEnum mode = NxsString::no_respect_case) const;
+		unsigned			ConvertToUnsigned() const;
+		int					ConvertToInt() const;
+		long				ConvertToLong() const;
+		double				ConvertToDouble() const;
+		bool				Equals(const NxsString &s, NxsString::CmpEnum mode = respect_case) const;
+		bool				EqualsCaseInsensitive(const NxsString &s) const;
+		NxsString			GetQuoted() const;
+		bool				IsADouble() const;
+		bool				IsALong() const;
+		bool				IsCapAbbreviation(const NxsString &s) const;
+		bool				IsInVector(const NxsStringVector &s, NxsString::CmpEnum mode = respect_case) const;
+		bool				IsStdAbbreviation(const NxsString &s, bool respectCase) const;
+		static bool			IsNexusPunctuation(const char c);
+		static bool         IsNewickPunctuation(const char c);
+		bool				QuotesNeeded() const;
+		NxsString 			UpperCasePrefix() const;
+		friend std::ostream &operator<<(std::ostream &out, const NxsString &s);
+
+		//	Modifiers
+		//
+		//NxsString		   &operator=(const NxsString &s);
+		NxsString			&operator=(char);
+		NxsString			&operator=(const char *s);
+		NxsString			&operator+=(const char *s);
+		NxsString			&operator+=(const std::string &s);
+		NxsString			&operator+=(const char c);
+		NxsString			&operator+=(const int i);
+		NxsString			&operator+=(unsigned i);
+		NxsString			&operator+=(unsigned long i);
+		NxsString			&operator+=(const long l);
+		NxsString			&operator+=(const double d);
+		NxsString			&operator+=(const IndexSet &d);
+		NxsString			&operator<<(int i);
+		NxsString			&operator<<(unsigned i);
+		NxsString			&operator<<(long l);
+		NxsString			&operator<<(unsigned long l);
+		NxsString			&operator<<(double d);
+		NxsString			&operator<<(const char *c);
+		NxsString			&operator<<(char c);
+		NxsString			&operator<<(const std::string &s);
+		NxsString			&operator<<(const IndexSet &s);
+#       if ! defined(HIDE_NCL_NXSSTRING_ENDL)
+            NxsString			&operator<<(NxsString &(*funcPtr)(NxsString	&));
+#       endif
+
+		// Functions that should be in base class string but aren't
+		void				clear();
+
+		int					PrintF(const char *formatStr, ...);
+
+		unsigned char		*p_str(unsigned char *) const;
+
+		NxsString			&AddQuotes();
+		NxsString 			&AddTail(char c, unsigned n);
+		NxsString			&NumberThenWord(unsigned i, NxsString s);
+		NxsString 			&ShortenTo(unsigned n);
+		NxsString			&AppendDouble(unsigned minFieldFormat, unsigned precFormat, double x);
+		NxsString 			&Capitalize();
+
+		NxsString 			&RightJustifyString(const NxsString &s, unsigned w, bool clear_first = false);
+		NxsString 			&RightJustifyLong(long x, unsigned w, bool clear_first = false);
+		NxsString 			&RightJustifyDbl(double x, unsigned w, unsigned p, bool clear_first = false);
+
+		NxsString 			&ToLower()
+			{
+			to_lower(*this);
+			return *this;
+			}
+		NxsString 			&ToUpper()
+			{
+			to_upper(*this);
+			return *this;
+			}
+
+
+		NxsString 			&BlanksToUnderscores();
+		NxsString 			&UnderscoresToBlanks();
+
+		//	Debugging
+		//
+		static NxsString 	ToHex(long p, unsigned nFours);
+	};
+
+#if defined (NXS_SUPPORT_OLD_NAMES)
+	typedef NxsString nxsstring;
+#endif
+
+
+/*!
+	Replaces the stored string with a copy of itself surrounded by single quotes (single quotes inside the string are
+	converted to the '' pair of characters that signify a single quote). Returns a reference to itself.
+*/
+inline NxsString &NxsString::AddQuotes()
+	{
+	add_nxs_quotes(*this);
+	return *this;
+	}
+
+inline std::string	NxsString::GetEscapedDouble(const double &v)
+	{
+	NxsString s;
+	s << v;
+	return NxsString::GetEscaped(s);
+	}
+
+inline std::string	NxsString::GetEscapedInt(const int &v)
+	{
+	NxsString s;
+	s << v;
+	return NxsString::GetEscaped(s);
+	}
+
+inline std::string	NxsString::GetEscaped(const std::string &s)
+	{
+	NxsQuotingRequirements r = determine_quoting_requirements(s);
+	if (r == kNoQuotesNeededForNexus)
+		return s;
+	std::string x(s.c_str());
+	if (r == kUnderscoresSufficeForNexus)
+		blanks_to_underscores(x);
+	else
+		add_nxs_quotes(x);
+	return x;
+	}
+
+
+/*!
+	Function object (Unary Predicate functor) that stores one string. The ()(const NxsString &) operator then returns the
+	result of a case-insensitive compare. Useful for STL find algorithms. Could be made faster than sequential case
+	insenstive comparisons, because the string stored in the object is just capitalized once.
+*/
+class NStrCaseInsensitiveEquals
+	{
+	public :
+
+					NStrCaseInsensitiveEquals(const NxsString &s);
+		bool		operator()(const NxsString &s);
+
+	protected :
+
+		NxsString	compStr;
+	};
+
+/*!
+	Function object (Unary Predicate functor) that stores one string. The ()(const NxsString &) operator then returns the
+	result of a case-sensitive compare. Useful for STL find algorithms.
+*/
+class NStrCaseSensitiveEquals
+	{
+	public :
+
+					NStrCaseSensitiveEquals(const NxsString &s);
+		bool		operator()(const NxsString &s) const;
+
+	protected :
+
+		NxsString	compStr;
+	};
+
+/*!
+	Binary function class that performs case-Insensitive string compares.
+*/
+struct NxsStringEqual
+  : public std::binary_function<NxsString, NxsString, bool>
+	{
+	bool operator()(const NxsString &x, const NxsString &y) const;
+	};
+
+// ############################# start NStrCaseInsensitiveEquals functions ##########################
+
+/*!
+	Creates a function object for case-insensitive comparisons of `s' to a container of strings.
+*/
+inline NStrCaseInsensitiveEquals::NStrCaseInsensitiveEquals(
+  const NxsString &s)	/* the string to be compared */
+	{
+	compStr = s;
+	compStr.Capitalize();
+	}
+
+/*!
+	Returns the result of a case-sensitive compare of `s' and the string stored when the NStrCaseInsensitiveEquals object
+	was created. Could be made more efficient (currently capitalizes the entire argument even though the first character may
+	be wrong).
+*/
+inline bool NStrCaseInsensitiveEquals::operator()(
+  const NxsString &s)	/* the string to be compared */
+	{
+	if (s.length() == compStr.length())
+		{
+		NxsString capS(s);
+		capS.Capitalize();
+		return capS == compStr;
+		}
+	return false;
+	}
+
+// ############################# start NStrCaseSensitiveEquals functions ##########################
+
+/*!
+	Creates a function object for case-sensitive comparisons of `s' to a container of strings.
+*/
+inline NStrCaseSensitiveEquals::NStrCaseSensitiveEquals(
+  const NxsString &s)	/* the string that all other strings will be compared to when the (const NxsString &) operator is called */
+	{
+	compStr = s;
+	}
+
+/*!
+	Returns the result of a case-sensitive compare of `s' and the string stored when the NStrCaseSensitiveEquals was
+	created.
+*/
+inline bool NStrCaseSensitiveEquals::operator()(
+  const NxsString &s)	/* the string to be compared */
+  const
+	{
+	return (compStr == s);
+	}
+
+// ############################# start NxsStringEqual functions ##########################
+
+/*!
+	Returns true if the strings `x' and `y' are identical (NOT case sensitive)
+*/
+inline bool NxsStringEqual::operator()(
+  const NxsString &x,	/* first string */
+  const NxsString &y)	/* second string to be compared with `x' */
+  const
+	{
+	return x.EqualsCaseInsensitive(y);
+	}
+
+// ############################# start NxsString functions ##########################
+
+/*!
+	The default constructor.
+*/
+inline NxsString::NxsString()
+	{
+	}
+
+/*!
+	Returns a single-quoted version of the NxsString. The calling object is not altered. Written for ease of use. Simply
+	copies the stored string, then returns the copy after calling its AddQuotes function.
+*/
+inline NxsString NxsString::GetQuoted()
+  const
+	{
+	NxsString s(*this);
+	s.AddQuotes();
+	return s;
+	}
+
+/*!
+	Most containers in the standard template library can be completely erased using the clear function, but none is
+	provided for the class string and hence is provided here.
+*/
+inline void NxsString::clear()
+	{
+	erase();
+	}
+
+/*!
+	Returns true if the Equals comparison function is true for this or any element in the vector `s'.
+*/
+inline bool NxsString::IsInVector(
+  const NxsStringVector &s, /* the vector of NxsString objects to be searched */
+  NxsString::CmpEnum mode)	/* the argument passed to the Equals function, which is called for every element in the vector `s' */
+  const
+	{
+	for (NxsStringVector::const_iterator sIt = s.begin(); sIt != s.end(); sIt++)
+		{
+		if (Equals(*sIt, mode))
+			return true;
+		}
+	return false;
+	}
+
+/*!
+	A copy constructor taking a C-string argument.
+*/
+inline NxsString::NxsString(
+  const char *s)	/* the C-string that forms the basis for the new NxsString object */
+	{
+	assign(s);
+	}
+
+/*!
+	A copy constructor taking a NxsString reference argument.
+*/
+inline NxsString::NxsString(
+  const NxsString &s)	/* reference to a NxsString to be used to create this copy */
+  :std::string()
+	{
+	assign(s);
+	}
+
+/*!
+	Sets the stored string equal to the supplied C-string `s'.
+*/
+inline NxsString &NxsString::operator=(
+  const char *s)	/* the string for comparison */
+	{
+	assign(s);
+	return *this;
+	}
+
+//inline NxsString& NxsString::operator=(
+//  const NxsString &s)
+//	{
+//	assign(s);
+//	return *this;
+//	}
+
+/*!
+	Appends the supplied C-string `s' to the stored string.
+*/
+inline NxsString &NxsString::operator+=(
+  const char *s)	/* the C-string to be appended */
+	{
+	append(std::string(s));
+	return *this;
+	}
+
+/*!
+	Appends the characters in the supplied NxsString reference `s' to the stored string.
+*/
+inline NxsString &NxsString::operator+=(
+  const std::string &s)	/* the string to append */
+	{
+	append(s);
+	return *this;
+	}
+
+/*!
+	Appends the character `c' to the stored string.
+*/
+inline NxsString &NxsString::operator+=(
+  const char c)	/* the character to append */
+	{
+	char s[2];
+	s[0] = c;
+	s[1] = '\0';
+	append(std::string(s));
+	return *this;
+	}
+
+/*!
+	Sets the stored std::string to the supplied character 'c'.
+*/
+inline NxsString &NxsString::operator=(
+  char c)	/* the character to which the stored std::string should be set */
+	{
+	clear();
+	return (*this += c);
+	}
+
+/*!
+	Uses the standard C sprintf function to append the character representation of the supplied integer i' to the stored
+	string (format code %d). For example, if the stored string is "taxon" and `i' is 9, the result is "taxon9".
+*/
+inline NxsString &NxsString::operator+=(
+  const int i)	/* the int to append */
+	{
+	char tmp[81];
+	std::sprintf(tmp, "%d", i);
+	append(tmp);
+	return *this;
+	}
+
+/*!
+	Capitalizes all lower case letters in the stored string by calling ToUpper.
+*/
+inline NxsString &NxsString::Capitalize()
+	{
+	ToUpper();
+	return *this;
+	}
+
+/*!
+	Returns true if the stored string is an abbreviation (or complete copy) of the supplied string `s'.
+*/
+inline bool NxsString::Abbreviates(
+  const NxsString	&s,		/* the full comparison string */
+  NxsString::CmpEnum	mode)	/* if equal to abbrev, a non-case-sensitive comparison will be made, otherwise comparison will respect case */
+  const
+	{
+	if (mode == NxsString::abbrev)
+		return IsCapAbbreviation(s);
+	else
+		return IsStdAbbreviation(s, mode == respect_case);
+	}
+
+/*!
+	Uses standard C function std::sprintf to append the unsigned integer `i' to the stored string (format code %u).
+*/
+inline NxsString& NxsString::operator+=(
+  unsigned i)	/* the integer to be appended */
+	{
+	char tmp[81];
+	std::sprintf(tmp, "%u", i);
+	append(tmp);
+	return *this;
+	}
+
+/*!
+	Uses standard C function std::sprintf to append the long integer `l' to the stored string (format code %ld).
+*/
+inline NxsString& NxsString::operator+=(
+  const long l)	/* the long integer to be appended */
+	{
+	char tmp[81];
+	std::sprintf(tmp, "%ld", l);
+	append(tmp);
+	return *this;
+	}
+
+/*!
+	Uses standard C function std::sprintf to append the unsigned long integer `l' to the stored string (format code %lu).
+*/
+inline NxsString& NxsString::operator+=(
+  const unsigned long l)	/* the unsigned long integer to be appended */
+	{
+	char tmp[81];
+	std::sprintf(tmp, "%lu", l);
+	append(tmp);
+	return *this;
+	}
+
+/*!
+	Uses the mode argument to call (and return the result of) the correct string comparison function.
+*/
+inline bool NxsString::Equals(
+  const NxsString &s,		/* the string to which *this is compared */
+  NxsString::CmpEnum mode)	/* should be one of these three: respect_case, no_respect_case or abbrev */
+  const
+	{
+	switch (mode) {
+		case NxsString::respect_case :
+			return (strcmp(this->c_str(), s.c_str()) == 0);
+		case NxsString::no_respect_case :
+			return this->EqualsCaseInsensitive(s);
+		case NxsString::abbrev :
+			return this->IsCapAbbreviation(s);
+		default :
+			NCL_ASSERT(0);// incorrect setting for mode
+		}
+	return false;
+	}
+
+# if ! defined(HIDE_NCL_NXSSTRING_ENDL)
+
+	Allows functions that take and return references to NxsString strings to be placed in a series of << operators.
+	See the NxsString endl function.
+inline NxsString &NxsString::operator<<(
+  NxsString &(*funcPtr)(NxsString &))	/* pointer to a function returning a reference to a NxsString */
+	{
+	return funcPtr(*this);
+	}
+#endif
+
+/*!
+	Returns true if `c' is any Nexus punctuation character:
+>
+	()[]{}/\,;:=*'"`-+<>
+>
+*/
+inline bool NxsString::IsNexusPunctuation(
+  const char c)	/* the character in question */
+	{
+	return (strchr("()[]{}/\\,;:=*\'\"`-+<>", c) != NULL);
+	}
+
+
+/*! Returns true if `c' is any Newick punctuation character:
+>
+	()[]':;,
+>
+List of punctuation taken from the "unquoted labels may not contain" section 
+of http://evolution.genetics.washington.edu/phylip/newick_doc.html
+
+Thanks to Andrew Lenards for pointing out the need for this when dealing with
+non-NEXUS trees.
+ parentheses, square brackets,
+        single_quotes, colons, semicolons, or commas
+*/
+inline bool NxsString::IsNewickPunctuation(
+  const char c)	/* the character in question */
+	{
+	const bool v = (strchr("()[]':;,", c) != NULL);
+	return v;
+	}
+
+
+/*!
+	Creates a new string (and returns a reference to the new string) composed of the integer `i' followed by a space and
+	then the string `s'. If `i' is not 1, then an 's' character is appended to make `s' plural. For example, if `i' were 0,
+	1, or 2, and `s' is "character", then the returned string would be "0 characters", "1 character" or "2 characters",
+	respectively. Obviously this only works if adding an 's' to the supplied string makes it plural.
+*/
+inline NxsString &NxsString::NumberThenWord(
+  unsigned i,			/* the number */
+  const NxsString s)	/* the string needing to be pluralized */
+  	{
+	(*this).erase();
+  	*this << i << ' ' << s;
+  	if (i != 1)
+  		*this << 's';
+  	return *this;
+  	}
+
+/*!
+	Another way to call the += operator (written to make it possible to use a NxsString like an std::ostream)
+*/
+inline NxsString &NxsString::operator<<(
+  int i)	/* the integer to append */
+  	{
+  	return (*this += i);
+  	}
+
+/*!
+	Another way to call the += operator (written to make it possible to use a NxsString like an std::ostream)
+*/
+inline NxsString &NxsString::operator<<(
+  unsigned i)	/* the unsigned integer to append */
+	{
+	return (*this += (int) i);
+	}
+
+/*!
+	Another way to call the += operator (written to make it possible to use a NxsString like an std::ostream)
+*/
+inline NxsString &NxsString::operator<<(
+  long l)	/* the long integer to append */
+	{
+	return (*this += l);
+	}
+
+/*!
+	Another way to call the += operator (written to make it possible to use a NxsString like an std::ostream)
+*/
+inline NxsString &NxsString::operator<<(
+  unsigned long l)	/* the unsigned long integer to append */
+	{
+	return (*this += l);
+	}
+
+/*!
+	Another way to call the += operator (written to make it possible to use a NxsString like an std::ostream)
+*/
+inline NxsString &NxsString::operator<<(
+  double d)	/* the double floating point value to append */
+	{
+	return (*this += d);
+	}
+
+/*!
+	Another way to call the += operator (written to make it possible to use a NxsString like an std::ostream)
+*/
+inline NxsString &NxsString::operator<<(
+  const char *c)	/* the C-string to append */
+	{
+	return (*this += c);
+	}
+
+/*!
+	Another way to call the += operator (written to make it possible to use a NxsString like an std::ostream)
+*/
+inline NxsString &NxsString::operator<<(
+  char c)	/* the char to append */
+	{
+	return (*this += c);
+	}
+
+/*!
+	Another way to call the += operator (written to make it possible to use a NxsString like an std::ostream)
+*/
+inline NxsString &NxsString::operator<<(
+  const std::string &s)	/* the NxsString to append */
+	{
+	return (*this += s);
+	}
+
+
+
+/*!
+	Returns string as a Pascal string (array of unsigned characters with the length in the first byte).
+*/
+inline unsigned char *NxsString::p_str(
+  unsigned char *buffer)	/* buffer to receive current string in Pascal form (i.e. length in first byte) */
+  const
+	{
+	memmove(buffer + 1, c_str(), length());
+	buffer[0] = (unsigned char)length();
+	return buffer;
+	}
+
+
+
+// ############################# start of standalone functions ##########################
+
+# if ! defined(HIDE_NCL_NXSSTRING_ENDL)
+/* "Define HIDE_NCL_NXSSTRING_ENDL to hide the dangerous definition of endl from NCLs nxsstring.h" */
+/*!
+	Appends a newline character to the string `s' and the returns a reference to `s'. Used with << operator to allow
+	strings to be written to like std::ostreams.
+*/
+inline NxsString &endl(
+  NxsString &s)	/* the string to which the newline character is to be appended */
+	{
+	return (s += '\n');
+	}
+#endif
+
+/*!
+	Appends a newline character to the string `s' and the returns a reference to `s'. Used with << operator to allow
+	strings to be written to like std::ostreams.
+*/
+inline NxsString &nxsendl(
+  NxsString &s)	/* the string to which the newline character is to be appended */
+	{
+	return (s += '\n');
+	}
+
+/*!
+	Writes the string `s' to the std::ostream `out'.
+*/
+inline std::ostream &operator<<(
+  std::ostream &out,			/* the stream to which the string `s' is to be written */
+  const NxsString &s)	/* the string to write */
+	{
+	out << s.c_str();
+	return out;
+	}
+
+NxsStringVector 	BreakPipeSeparatedList(const NxsString &strList);
+NxsStringVector 	GetVecOfPossibleAbbrevMatches(const NxsString &testStr,const NxsStringVector &possMatches);
+bool 				SetToShortestAbbreviation(NxsStringVector &strVec, bool allowTooShort = false);
+
+#endif
diff --git a/lib/ncl-2.1.18/ncl/nxsstring.lo b/lib/ncl-2.1.18/ncl/nxsstring.lo
new file mode 100644
index 0000000..1b4034d
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsstring.lo
@@ -0,0 +1,12 @@
+# nxsstring.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nxsstring.o'
+
+# Name of the non-PIC object
+non_pic_object='nxsstring.o'
+
diff --git a/lib/ncl-2.1.18/ncl/nxstaxaassociationblock.cpp b/lib/ncl-2.1.18/ncl/nxstaxaassociationblock.cpp
new file mode 100644
index 0000000..898dfa3
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxstaxaassociationblock.cpp
@@ -0,0 +1,237 @@
+ 
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+#include <iomanip>
+#include <cassert>
+#include <climits>
+#include <cstdlib>
+
+#include "ncl/nxstaxaassociationblock.h"
+#include "ncl/nxsreader.h"
+
+using namespace std;
+
+
+NxsTaxaAssociationBlock::NxsTaxaAssociationBlock()
+    :firstTaxaBlock(0L),
+    secondTaxaBlock(0L)
+    {
+    NCL_BLOCKTYPE_ATTR_NAME = "TAXAASSOCIATION";
+	Reset();
+	}
+
+NxsTaxaBlockAPI * NxsTaxaAssociationBlock::ProcessTaxaBlockName(const NxsString & value,  NxsToken &token) const {
+    assert(this->nexusReader);
+    NxsTaxaBlockAPI * cb = this->nexusReader->GetTaxaBlockByTitle(value.c_str(), NULL);
+    if (cb == NULL)
+        {
+        errormsg = "Unknown TAXA block (";
+        errormsg += value;
+        errormsg +=") referred to in the TAXA command";
+        throw NxsException(errormsg, token);
+        }
+    return cb;
+}
+
+void NxsTaxaAssociationBlock::HandleTaxaCommand(
+  NxsToken &token)
+{
+	if (!this->nexusReader)
+		NxsNCLAPIException("No NxsReader when reading TaxaAssociation block.");
+
+	token.GetNextToken();
+	this->firstTaxaBlock = this->ProcessTaxaBlockName(token.GetTokenReference(), token);
+	token.GetNextToken();
+	if (!token.Equals(","))
+	    {
+	    errormsg << "Expecting comma in the TAXA command, found \"" << token.GetTokenReference() << "\".";
+	    throw NxsException(errormsg, token);
+	    }
+	token.GetNextToken();
+	this->secondTaxaBlock = this->ProcessTaxaBlockName(token.GetTokenReference(), token);
+    NxsToken::DemandEndSemicolon(token, this->errormsg, "TAXA");
+}
+void NxsTaxaAssociationBlock::HandleAssociatesCommand(
+  NxsToken &token)
+{
+    if (this->firstTaxaBlock == 0L || this->secondTaxaBlock == 0L)
+        {
+        errormsg << "Expecting TAXA command to precede an ASSOCIATES command.";
+	    throw NxsException(errormsg, token);
+        }
+    token.GetNextToken();
+    for (;;)
+        {
+		std::set<unsigned> fSet;
+		while (!token.IsPunctuationToken() || !(token.Equals(";") || token.Equals(",") || token.Equals("/")))
+		    {
+		    try {
+		        this->firstTaxaBlock->GetIndicesForLabel(token.GetTokenReference(), &fSet);
+                }
+            catch(...)
+                {
+                errormsg << "Unrecognized taxon \"" << token.GetTokenReference() << "\" in ASSOCIATES command";
+                throw NxsException(errormsg, token);
+                }
+            token.GetNextToken();
+		    }
+		if (!token.Equals("/"))
+		    {
+            errormsg << "Expecting / in ASSOCIATES command, found \"" << token.GetTokenReference() << "\"";
+            throw NxsException(errormsg, token);
+		    }
+
+		if (fSet.empty())
+		    {
+            errormsg << "Expecting taxon labels from the first TAXA block before the / in ASSOCIATES command.";
+            throw NxsException(errormsg, token);
+		    }
+        token.GetNextToken();
+
+		std::set<unsigned> sSet;
+		
+		while (!token.IsPunctuationToken() || !(token.Equals(";") || token.Equals(",") || token.Equals("/")))
+		    {
+		    try {
+		        this->secondTaxaBlock->GetIndicesForLabel(token.GetTokenReference(), &sSet);
+                }
+            catch(...)
+                {
+                errormsg << "Unrecognized taxon \"" << token.GetTokenReference() << "\" in ASSOCIATES command";
+                throw NxsException(errormsg, token);
+                }
+            token.GetNextToken();
+		    }
+
+		if (!(token.Equals(";") || token.Equals(",")))
+		    {
+            errormsg << "Expecting , or ; in ASSOCIATES command, found \"" << token.GetTokenReference() << "\"";
+            throw NxsException(errormsg, token);
+		    }
+
+		if (sSet.empty())
+		    {
+            errormsg << "Expecting taxon labels from the second TAXA block after the / in ASSOCIATES command.";
+            throw NxsException(errormsg, token);
+		    }
+		
+		for (std::set<unsigned>::const_iterator fIt = fSet.begin(); fIt != fSet.end(); ++fIt)
+		    {
+		    this->AddAssociation(*fIt, sSet);
+		    }
+		if (token.Equals(";"))
+		    break;
+		token.GetNextToken();
+	    }
+}
+
+void NxsTaxaAssociationBlock::Read(
+  NxsToken &token)	/* the token used to read from `in' */
+	{
+	isEmpty = false;
+
+	DemandEndSemicolon(token, "BEGIN TAXAASSOCIATION");
+
+	for (;;)
+		{
+		token.GetNextToken();
+		NxsBlock::NxsCommandResult res = HandleBasicBlockCommands(token);
+		if (res == NxsBlock::NxsCommandResult(STOP_PARSING_BLOCK))
+			return;
+		if (res != NxsBlock::NxsCommandResult(HANDLED_COMMAND))
+			{
+			if (token.Equals("TAXA"))
+				HandleTaxaCommand(token);
+			else if (token.Equals("ASSOCIATES"))
+				HandleAssociatesCommand(token);
+			else
+				SkipCommand(token);
+			}
+		}
+	}
+
+void NxsTaxaAssociationBlock::Report(std::ostream &out) NCL_COULD_BE_CONST  /*v2.1to2.2 1 */
+{
+	out << '\n';
+	if (this->firstTaxaBlock && this->secondTaxaBlock)
+	    {
+        out << NCL_BLOCKTYPE_ATTR_NAME << " block contains the following:\n";
+        out << firstToSecond.size() << " associations between taxa in " << this->firstTaxaBlock->GetTitle() << " and " << this->secondTaxaBlock->GetTitle() << '\n';
+        out << secondToFirst.size() << " associations between taxa in " << this->secondTaxaBlock->GetTitle() << " and " << this->firstTaxaBlock->GetTitle() << '\n';
+	    }
+}
+
+void NxsTaxaAssociationBlock::Reset() 
+{
+	NxsBlock::Reset();
+    this->firstToSecond.clear();
+    this->secondToFirst.clear();
+    this->firstTaxaBlock = 0L;
+    this->secondTaxaBlock = 0L;
+}
+
+void NxsTaxaAssociationBlock::WriteAsNexus(std::ostream &out) const
+	{
+	if (this->firstTaxaBlock && this->secondTaxaBlock)
+	    {
+	    out << "BEGIN TAXAASSOCIATION;\n";
+        WriteBasicBlockCommands(out);
+
+        out << "    TAXA ";
+        std::string taxaBlockName = this->firstTaxaBlock->GetTitle();
+        out << NxsString::GetEscaped(taxaBlockName);
+        out << " , ";
+        taxaBlockName = this->secondTaxaBlock->GetTitle();
+        out << NxsString::GetEscaped(taxaBlockName);
+        out << ";\n";
+        
+        
+        out << "    ASSOCIATES\n        ";
+        bool firstAssoc = true;
+        for (AssociationMap::const_iterator ftsIt = this->firstToSecond.begin(); ftsIt != this->firstToSecond.end(); ++ftsIt)
+            {
+            if (!firstAssoc)
+                out << ",\n        ";
+            unsigned fTaxonInd = ftsIt->first;
+            std::string f = this->firstTaxaBlock->GetTaxonLabel(fTaxonInd);
+            out << NxsString::GetEscaped(f);
+            out << " / ";
+            const std::set<unsigned> & secSet = ftsIt->second;
+            for (std::set<unsigned>::const_iterator sIt = secSet.begin(); sIt != secSet.end(); ++sIt)
+                {
+                unsigned sTaxonInd = *sIt;
+                std::string s = this->secondTaxaBlock->GetTaxonLabel(sTaxonInd);
+                out << NxsString::GetEscaped(s) << ' ';
+                }
+            firstAssoc = false;
+            }
+        out << ";\n";
+        
+        out << "END;\n";
+        }
+	}
+
+NxsTaxaAssociationBlock *NxsTaxaAssociationBlockFactory::GetBlockReaderForID(const std::string & idneeded, NxsReader *reader, NxsToken *)
+	{
+	if (reader == NULL || idneeded != "TAXAASSOCIATION")
+		return NULL;
+	NxsTaxaAssociationBlock * nb  = new NxsTaxaAssociationBlock();
+	nb->SetImplementsLinkAPI(false);
+	return nb;
+	}
diff --git a/lib/ncl-2.1.18/ncl/nxstaxaassociationblock.h b/lib/ncl-2.1.18/ncl/nxstaxaassociationblock.h
new file mode 100644
index 0000000..e7bd99e
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxstaxaassociationblock.h
@@ -0,0 +1,139 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+#ifndef NCL_NXSTAXAASSOCIATIONBLOCK_H
+#define NCL_NXSTAXAASSOCIATIONBLOCK_H
+
+#include "ncl/nxsdefs.h"
+#include "ncl/nxstaxablock.h"
+
+/*! 
+*/
+class NxsTaxaAssociationBlockAPI
+  : public NxsBlock
+  {
+  public:
+		virtual NxsTaxaBlockAPI * GetFirstTaxaBlock() const = 0;
+		virtual NxsTaxaBlockAPI * GetSecondTaxaBlock() const = 0;
+		virtual std::set<unsigned> GetAssociatesForTaxonInFirstBlock(unsigned) const = 0;
+		virtual std::set<unsigned> GetAssociatesForTaxonInSecondBlock(unsigned) const = 0;
+  };
+
+/*! The default implementation of the NxsTaxaBlockAPI that is used to parse TAXA blocks into a list of
+	unique (case-insensitive) labels.
+
+*/
+class NxsTaxaAssociationBlock
+  : public NxsTaxaAssociationBlockAPI
+	{
+        typedef std::map<unsigned, std::set<unsigned> > AssociationMap;
+	public:
+							NxsTaxaAssociationBlock();
+		virtual				~NxsTaxaAssociationBlock() {}
+
+		virtual void AddAssociation(unsigned firstIndex, const std::set<unsigned> & secIndices) {
+		    std::set<unsigned> & former = this->firstToSecond[firstIndex];
+		    for (std::set<unsigned>::const_iterator sIt = secIndices.begin(); sIt != secIndices.end(); ++sIt) {
+		        const unsigned & secIndex = *sIt;
+		        former.insert(secIndex);
+		        this->secondToFirst[secIndex].insert(firstIndex);
+		    }
+		}
+		
+		
+		virtual void SetFirstTaxaBlock(NxsTaxaBlockAPI *f) {
+		    NxsTaxaBlockAPI * s = this->secondTaxaBlock;
+		    this->Reset();
+		    this->secondTaxaBlock = s;
+		    this->firstTaxaBlock = f;
+		}
+		virtual NxsTaxaBlockAPI * GetFirstTaxaBlock() const {
+		    return this->firstTaxaBlock;
+		}
+		virtual void SetSecondTaxaBlock(NxsTaxaBlockAPI *s) {
+		    NxsTaxaBlockAPI * f = this->firstTaxaBlock;
+		    this->Reset();
+		    this->secondTaxaBlock = s;
+		    this->firstTaxaBlock = f;
+		}
+		virtual NxsTaxaBlockAPI * GetSecondTaxaBlock() const {
+		    return this->secondTaxaBlock;
+		}
+		virtual std::set<unsigned> GetAssociatesForTaxonInFirstBlock(unsigned i) const {
+		    AssociationMap::const_iterator m = this->firstToSecond.find(i);
+		    if (m == this->firstToSecond.end()) {
+		        return std::set<unsigned>();
+		    }
+		    return m->second;
+		}
+		virtual std::set<unsigned> GetAssociatesForTaxonInSecondBlock(unsigned i) const  {
+		    AssociationMap::const_iterator m = this->secondToFirst.find(i);
+		    if (m == this->secondToFirst.end()) {
+		        return std::set<unsigned>();
+		    }
+		    return m->second;
+		}
+
+		virtual void		Report(std::ostream &out) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		virtual void 		Reset();
+		void				WriteAsNexus(std::ostream &out) const;
+
+
+		NxsTaxaAssociationBlock &operator=(const NxsTaxaAssociationBlock &other)
+			{
+			Reset();
+			CopyBaseBlockContents(static_cast<const NxsBlock &>(other));
+			CopyTaxaAssociationContents(other);
+			return *this;
+			}
+
+		void CopyTaxaAssociationContents(const NxsTaxaAssociationBlock &other)
+			{
+			firstToSecond = other.firstToSecond;
+			secondToFirst = other.secondToFirst;
+			firstTaxaBlock = other.firstTaxaBlock;
+			secondTaxaBlock = other.secondTaxaBlock;
+			}
+		NxsTaxaAssociationBlock * Clone() const
+			{
+			NxsTaxaAssociationBlock *taxa = new NxsTaxaAssociationBlock();
+			*taxa = *this;
+			return taxa;
+			}
+	protected:
+        AssociationMap firstToSecond;
+        AssociationMap secondToFirst;
+        NxsTaxaBlockAPI * firstTaxaBlock;
+        NxsTaxaBlockAPI * secondTaxaBlock;
+
+		virtual void 	Read(NxsToken &token);
+        void HandleTaxaCommand(NxsToken &token);
+        void HandleAssociatesCommand(NxsToken &token);
+        NxsTaxaBlockAPI * ProcessTaxaBlockName(const NxsString & value,  NxsToken &token) const;
+
+};
+
+class NxsTaxaAssociationBlockFactory
+	:public NxsBlockFactory
+	{
+	public:
+		virtual NxsTaxaAssociationBlock  *	GetBlockReaderForID(const std::string & NCL_BLOCKTYPE_ATTR_NAME, NxsReader *reader, NxsToken *token);
+	};
+
+#endif
+
diff --git a/lib/ncl-2.1.18/ncl/nxstaxaassociationblock.lo b/lib/ncl-2.1.18/ncl/nxstaxaassociationblock.lo
new file mode 100644
index 0000000..f92bcab
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxstaxaassociationblock.lo
@@ -0,0 +1,12 @@
+# nxstaxaassociationblock.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nxstaxaassociationblock.o'
+
+# Name of the non-PIC object
+non_pic_object='nxstaxaassociationblock.o'
+
diff --git a/lib/ncl-2.1.18/ncl/nxstaxablock.cpp b/lib/ncl-2.1.18/ncl/nxstaxablock.cpp
new file mode 100644
index 0000000..10f2c8f
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxstaxablock.cpp
@@ -0,0 +1,634 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+#include <climits>
+#include "ncl/nxstaxablock.h"
+#include "ncl/nxsreader.h"
+
+using namespace std;
+
+/*! \return (NTax - 1) or  UINT_MAX if NTax is 0
+*/
+unsigned NxsTaxaBlock::GetMaxIndex() const
+	{
+	unsigned nct = dimNTax;
+	if (nct == 0)
+		return UINT_MAX;
+	return nct - 1;
+	}
+unsigned NxsTaxaBlock::GetNumLabelsCurrentlyStored() const
+	{
+	return (unsigned)taxLabels.size();
+	}
+
+
+std::vector<std::string> NxsTaxaBlockAPI::GetAllLabels() const
+	{
+	const unsigned n = GetNTaxTotal();
+	std::vector<std::string> v(n);
+	for (unsigned i = 0; i < n; ++i)
+		{
+		NxsString nextLabel = GetTaxonLabel(i);  /*v2.1to2.2 4 */
+		v[i] = std::string(nextLabel.c_str());
+		}
+	return v;
+	}
+
+/* \returns a 1-based number of the taxon with label of `label` (not case-sensitive).
+	This is a low-level function not intended for widespread use (it is faster way to
+	query the label list because it does not throw exceptions or do the numeric interpretation
+	of labels).
+
+	\warning{does NOT apply the numeric interpretation of the label.}
+
+	\warning{ 1-based numbering}
+*/
+unsigned NxsTaxaBlock::TaxLabelToNumber(const std::string &label) const
+	{
+	std::string r(label.c_str());
+	NxsString::to_upper(r);
+	return CapitalizedTaxLabelToNumber(r);
+	}
+
+/* Used internally in reading of sets
+
+ \returns the number of indices that correspond to the label (and the number
+ of items that would be added to *inds if inds points to an empty set).
+*/
+unsigned NxsTaxaBlock::GetIndicesForLabel(const std::string &label, /*!< label, set name or string with the 1-based numeric representation of the object */
+	NxsUnsignedSet *inds) const /* The set of indices to add the taxa indices to (can be 0L). */
+	{
+	NxsString emsg;
+	const unsigned numb = TaxLabelToNumber(label);
+	if (numb != 0)
+		{
+		if (inds)
+			inds->insert(numb - 1);
+		return 1;
+		}
+	return GetIndicesFromSetOrAsNumber(label, inds, taxSets, GetMaxIndex(), "taxon");
+	}
+
+bool NxsTaxaBlock::AddNewIndexSet(const std::string &label, const NxsUnsignedSet & inds)
+	{
+	NxsString nlab(label.c_str());
+	const bool replaced = taxSets.count(nlab) > 0;
+	taxSets[nlab] = inds;
+	return replaced;
+	}
+/* Returns true if this set replaces an older definition.
+*/
+bool NxsTaxaBlock::AddNewPartition(const std::string &label, const NxsPartition & inds)
+	{
+	NxsString ls(label.c_str());
+	bool replaced = taxPartitions.count(ls) > 0;
+	taxPartitions[ls] = inds;
+	return replaced;
+	}
+
+/* Initializes NCL_BLOCKTYPE_ATTR_NAME to "TAXA" and dimNTax to 0.
+*/
+NxsTaxaBlock::NxsTaxaBlock()
+  	{
+	dimNTax	= 0;
+	NCL_BLOCKTYPE_ATTR_NAME		= "TAXA";
+	}
+
+NxsTaxaBlock::~NxsTaxaBlock()
+	{}
+
+/*! Other than the commands handled by NxsBlock::HandleBasicBlockCommands(), this
+	function will deal with Dimensions and call NxsTaxaBlock::HandleTaxLabels()
+	to parse the TaxLabels commands.
+
+	All other commands will be skipped
+*/
+void NxsTaxaBlock::Read(
+  NxsToken &token)	/* the token used to read from in */
+	{
+	Reset();
+	isEmpty				= false;
+	isUserSupplied		= true;
+
+	DemandEndSemicolon(token, "BEGIN TAXA");
+
+	for (;;)
+		{
+		token.GetNextToken();
+		NxsBlock::NxsCommandResult res = HandleBasicBlockCommands(token);
+		if (res == NxsBlock::NxsCommandResult(STOP_PARSING_BLOCK))
+			return;
+		if (res != NxsBlock::NxsCommandResult(HANDLED_COMMAND))
+			{
+			if (token.Equals("DIMENSIONS"))
+				{
+				token.GetNextToken();
+				if (!token.Equals("NTAX"))
+					{
+					errormsg = "Expecting NTAX keyword, but found ";
+					errormsg += token.GetToken();
+					errormsg += " instead";
+					throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+					}
+				DemandEquals(token, "after NTAX");
+				dimNTax = DemandPositiveInt(token, "NTAX");
+				taxLabels.reserve(dimNTax);
+				DemandEndSemicolon(token, "DIMENSIONS");
+				}	// if (token.Equals("DIMENSIONS"))
+			else if (token.Equals("TAXLABELS"))
+				HandleTaxLabels(token);
+			else
+				SkipCommand(token);
+			}
+		}	// GetNextToken loop
+	}
+
+/*! Resets the taxLabels. \throws NxsException for illegal or duplicated labels.
+
+	All other commands will be skipped.
+*/
+void NxsTaxaBlock::HandleTaxLabels(NxsToken &token)
+	{
+	if (dimNTax == 0)
+		{
+		errormsg = "NTAX must be specified before TAXLABELS command";
+		throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+		}
+	taxLabels.clear();
+	labelToIndex.clear();
+	for (unsigned i = 0; i < dimNTax; i++)
+		{
+		token.GetNextToken();
+		try
+			{
+			NxsString t = token.GetToken();
+			AddTaxonLabel(t);
+			}
+		catch (const NxsException & x)
+			{
+			throw NxsException(x.msg, token);
+			}
+		}
+	DemandEndSemicolon(token, "TAXLABELS");
+	}
+
+/* This function outputs a brief report of the contents of this taxa block. Overrides the abstract virtual function in
+	the base class.
+*/
+void NxsTaxaBlock::Report(
+  std::ostream &out) NCL_COULD_BE_CONST /* the output stream to which to write the report */ /*v2.1to2.2 1 */
+	{
+	out << endl;
+	out << NCL_BLOCKTYPE_ATTR_NAME << " block contains ";
+	if (dimNTax == 0)
+		{
+		out << "no taxa" << endl;
+		return;
+		}
+	if (dimNTax == 1)
+		out << "1 taxon" << endl;
+	else
+		out << dimNTax << " taxa" << endl;
+	for (unsigned k = 0; k < dimNTax; k++)
+		out << "    " << (k+1) << "    " << GetTaxonLabel(k) << endl;
+	}
+
+/* Writes contents of this block in NEXUS format to `out'.
+*/
+void NxsTaxaBlock::WriteAsNexus(std::ostream &out) const
+	{
+	out << "BEGIN TAXA;\n";
+	WriteBasicBlockCommands(out);
+	out << "    DIMENSIONS NTax = " << dimNTax << ";\n";
+	this->WriteTaxLabelsCommand(out);
+	WriteSkippedCommands(out);
+	out << "END;\n";
+	}
+
+/* Writes the NEXUS TaxLabels commands
+*/
+void NxsTaxaBlock::WriteTaxLabelsCommand(std::ostream &out) const
+	{
+	const unsigned nLabels = this->GetNumTaxonLabels();
+	if (nLabels > 0)
+		{
+		out << "    TAXLABELS";
+		for (NxsStringVector::const_iterator kIt = taxLabels.begin(); kIt != taxLabels.end(); ++kIt)
+			out << ' ' << NxsString::GetEscaped(*kIt);
+		out << ";\n";
+		}
+	}
+
+/* Flushes taxonLabels and sets dimNTax to 0 in preparation for reading a new TAXA block.
+*/
+void NxsTaxaBlock::Reset()
+	{
+	NxsBlock::Reset();
+	taxLabels.clear();
+	labelToIndex.clear();
+	dimNTax = 0;
+	inactiveTaxa.clear();
+	taxSets.clear();
+	taxPartitions.clear();
+	}
+
+/* Adds taxon label 's' to end of list of taxon labels and increments dimNTax by 1.
+
+	\returns the (0-based) index of taxon label just added.
+*/
+unsigned NxsTaxaBlock::AddTaxonLabel(
+  const std::string & rs)	/* the taxon label to add */
+	{
+	unsigned ind = (unsigned)taxLabels.size();
+	NxsString s(rs.c_str());
+	std::string x(rs.c_str());
+	NxsString::to_upper(x);
+	CheckCapitalizedTaxonLabel(x);
+	taxLabels.push_back(s);
+	labelToIndex[x] = ind;
+	return ind;
+	}
+
+/*  No action if the label `s` could be added to list of taxon labels
+
+	\throws a NxsException if the label `s` is illegal, and
+	\throws a DuplicatedLabelNxsException if the label is already in the block
+*/
+void NxsTaxaBlock::CheckCapitalizedTaxonLabel(
+  const std::string &s) const /*!< potential taxon label to check */
+  {
+	unsigned ind = (unsigned)taxLabels.size();
+	if (dimNTax < ind)
+		{
+		NxsString e;
+		e << "Number of stored labels (" << taxLabels.size() << ") exceeds the NTax specified (" << dimNTax<<").";
+		throw NxsException(e);
+		}
+	if (CapitalizedTaxLabelToNumber(s) != 0)
+		{
+		NxsString e = "TaxLabels cannot be repeated. The label ";
+		e << s << " has already been stored.";
+		throw DuplicatedLabelNxsException(e);
+		}
+	if (s.length() == 1 && NxsString::IsNexusPunctuation(s[0]))
+		{
+		NxsString e = "Illegal TaxLabel found:\n";
+		e << s << "\n TaxLabels cannot be punctuation.";
+		throw NxsException(e);
+		}
+	}
+
+
+void NxsTaxaBlock::ChangeTaxonLabel(
+  unsigned i,	/* the taxon label number to change */
+  NxsString s)	/* the string used to replace label i */ /*v2.1to2.2 4 */
+	{
+	if (i >= (unsigned)taxLabels.size())
+		{
+		NxsString e = "The label for taxon ";
+		e << (i+1) << " cannot be changed, because the only " << (unsigned)taxLabels.size() << " taxlabel(s) have been assigned.";
+		throw NxsNCLAPIException(e);
+		}
+	RemoveTaxonLabel(i);
+	std::string x(s.c_str());
+	NxsString::to_upper(x);
+	CheckCapitalizedTaxonLabel(x);
+	taxLabels[i] = NxsString(s.c_str()); /* odd construct for v2.1->v2.2 translation */
+	labelToIndex[x] = i;
+	}
+
+void NxsTaxaBlock::RemoveTaxonLabel(
+  unsigned i)	/* the taxon label number to remove */
+	{
+	std::string oldLabel(taxLabels[i].c_str());
+	NxsString::to_upper(oldLabel);
+	labelToIndex.erase(oldLabel);
+	taxLabels[i] = NxsString();
+	}
+
+/* Returns the length of the longest taxon label stored. Useful for formatting purposes in outputting the data matrix
+	(i.e., you want the left edge of the matrix to line up).
+*/
+unsigned NxsTaxaBlock::GetMaxTaxonLabelLength()
+	{
+	NxsStringVector::const_iterator tlIt = taxLabels.begin();
+	unsigned maxlen = 0;
+	for (; tlIt < taxLabels.end(); ++tlIt)
+		{
+		const unsigned thislen = (unsigned)tlIt->size();
+		if (thislen > maxlen)
+			maxlen = thislen;
+		}
+	return maxlen;
+	}
+
+/* Returns the label for taxon 'i'. where i is in the range [0-dimNTax)
+*/
+NxsString NxsTaxaBlock::GetTaxonLabel(unsigned i) const  /*v2.1to2.2 4 */
+	{
+	if (i >= dimNTax)
+		{
+		NxsString e = "The  taxon index ";
+		e << i  << " is out of range.  Only " << dimNTax << " taxa in block.";
+		throw NxsNCLAPIException(e);
+		}
+	if (i < (unsigned)taxLabels.size())
+		return taxLabels[i];
+	NxsString s;
+	s += (i + 1);
+	return s; /*the number is a default label*/
+	}
+
+/*!
+	Returns true if taxonLabels[i] contains embedded spaces and thus should be surrounded by single quotes if output is
+	NEXUS format.
+*/
+bool NxsTaxaBlock::NeedsQuotes(
+  unsigned i)	/* the taxon label number in question */
+	{
+	const NxsString x(GetTaxonLabel(i).c_str());
+	return x.QuotesNeeded();
+	}
+
+/*! Returns true if taxon label equal to 's' can be found in the taxonLabels list, and returns false otherwise.
+*/
+bool NxsTaxaBlock::IsAlreadyDefined(
+  const std::string & s)	/* the s to attempt to find in the taxonLabels list */
+	{
+	return (TaxLabelToNumber(s) != 0);
+	}
+
+/*!
+	Returns a (0-based) index of taxon named 's' in taxonLabels list. If taxon named 's' cannot be found, or if there are no
+	labels currently stored in the taxonLabels list, throws NxsX_NoSuchTaxon exception.
+*/
+unsigned NxsTaxaBlock::FindTaxon(
+  const NxsString &s) const /* the string to attempt to find in the taxonLabels list */  /*v2.1to2.2 4 */
+	{
+	unsigned k = TaxLabelToNumber(s);
+	if (k == 0)
+		throw NxsTaxaBlock::NxsX_NoSuchTaxon();
+	return (k - 1);
+	}
+
+/*! Returns number of taxon labels currently stored.
+*/
+unsigned NxsTaxaBlock::GetNumTaxonLabels() const
+	{
+	return (unsigned)taxLabels.size();
+	}
+
+/*! Sets dimNTax to n.
+*/
+void NxsTaxaBlock::SetNtax(
+  unsigned n)	/* the number of taxa */
+	{
+	dimNTax = n;
+	if (taxLabels.size() > dimNTax)
+		{
+		for (unsigned i = dimNTax; i < taxLabels.size(); i++)
+			RemoveTaxonLabel(i);
+		taxLabels.resize(dimNTax);
+		}
+	else
+		taxLabels.reserve(dimNTax);
+	}
+
+NxsTaxaBlock *NxsTaxaBlockFactory::GetBlockReaderForID(const std::string & idneeded, NxsReader *reader, NxsToken *)
+	{
+	if (reader == NULL || idneeded != "TAXA")
+		return NULL;
+	NxsTaxaBlock * nb = new NxsTaxaBlock();
+	nb->SetImplementsLinkAPI(false);
+	return nb;
+	}
+
+NxsTaxaBlockAPI * NxsTaxaBlockSurrogate::GetTaxaBlockPtr(int *status) const
+	{
+	if (status)
+		*status = GetTaxaLinkStatus();
+	return taxa;
+	}
+
+
+void NxsTaxaBlockSurrogate::SetTaxaLinkStatus(NxsBlock::NxsBlockLinkStatus s)
+	{
+	if (taxaLinkStatus & NxsBlock::BLOCK_LINK_USED)
+		{
+		throw NxsNCLAPIException("Resetting a used taxaLinkStatus");
+		}
+	taxaLinkStatus = s;
+	}
+
+
+void NxsTaxaBlockSurrogate::SetTaxaBlockPtr(NxsTaxaBlockAPI *c, NxsBlock::NxsBlockLinkStatus s)
+	{
+	SetTaxaLinkStatus(s);
+	taxa = c;
+	}
+
+/*only used it the linkAPI is enabled*/
+void NxsTaxaBlockSurrogate::HandleLinkTaxaCommand(NxsToken & token)
+	{
+	token.GetNextToken();
+	const std::map<std::string, std::string> kv = token.ProcessAsSimpleKeyValuePairs("LINK");
+	std::map<std::string, std::string>::const_iterator pairIt = kv.begin();
+	for (;pairIt != kv.end(); ++pairIt)
+		{
+		NxsTaxaBlockAPI *entryTaxa = taxa;
+		int entryTaxaLinkStatus = taxaLinkStatus;
+		NxsString key(pairIt->first.c_str());
+		key.ToUpper();
+		NxsString value(pairIt->second.c_str());
+		if (key == "TAXA")
+			{
+			if (taxa && !taxa->GetID().EqualsCaseInsensitive(value))
+				{
+				if (GetTaxaLinkStatus() & NxsBlock::BLOCK_LINK_USED)
+					{
+					NxsString errormsg = "LINK to a Taxa block must occur before commands that use a taxa block";
+					throw NxsException(errormsg, token);
+					}
+				SetTaxaBlockPtr(NULL, NxsBlock::BLOCK_LINK_UNINITIALIZED);
+				}
+			if (!taxa)
+				{
+				if (!nxsReader)
+					{
+					NxsString errormsg =  "API Error: No nxsReader during parse in NxsTaxaBlockSurrogate::HandleLinkTaxaCommand";
+					throw NxsNCLAPIException(errormsg, token);
+					}
+				NxsTaxaBlockAPI * cb = nxsReader->GetTaxaBlockByTitle(value.c_str(), NULL);
+				if (cb == NULL)
+					{
+					NxsString errormsg = "Unknown TAXA block (";
+					errormsg += value;
+					errormsg +=") referred to in the LINK command";
+					taxa = entryTaxa;
+					taxaLinkStatus = entryTaxaLinkStatus;
+					throw NxsException(errormsg, token);
+					}
+				SetTaxaBlockPtr(cb, NxsBlock::BLOCK_LINK_FROM_LINK_CMD);
+				}
+			}
+		else
+			{
+			NxsString errormsg = "Skipping unknown LINK subcommand: ";
+			errormsg += pairIt->first.c_str();
+			nxsReader->NexusWarnToken(errormsg, NxsReader::SKIPPING_CONTENT_WARNING, token);
+			errormsg.clear(); //this token pos will be off a bit.
+			}
+		}
+	}
+void NxsTaxaBlockSurrogate::WriteLinkTaxaCommand(std::ostream &out) const
+	{
+	if (taxa && !(taxa->GetTitle().empty()))
+		out << "    LINK TAXA = " << NxsString::GetEscaped(taxa->GetTitle()) << ";\n";
+	}
+
+/* This function is called by derived classes right before they start to parse a command
+	that requires a Taxa block.
+	If a taxa block has not been set at this point, and one cannot be created then
+	a NxsException will be generated.
+
+	This enables lazy initialization of the taxa field.
+*/
+void NxsTaxaBlockSurrogate::AssureTaxaBlock(bool allocBlock, NxsToken &token, const char *cmd)
+	{
+	if (!allocBlock)
+		{
+		if (taxa != NULL)
+			return;
+		if (!nxsReader)
+			{
+			NxsString  errormsg =  "API Error: No nxsReader during parse in NxsTaxaBlockSurrogate::AssureTaxaBlock";
+			throw NxsNCLAPIException(errormsg, token);
+			}
+		unsigned nTb;
+		NxsTaxaBlockAPI * cb = nxsReader->GetTaxaBlockByTitle(NULL, &nTb);
+		if (cb == NULL)
+			{
+			NxsString errormsg =  "TAXA Block has been not been read, but a ";
+			if (cmd)
+				errormsg += cmd;
+			errormsg += " command (which requires a TAXA block) has been encountered. Either add a TAXA block or (for blocks other than the TREES block) you may use a \"DIMENSIONS NEWTAXA NTAX= ...\" command to introduces taxa.";
+			throw NxsException(errormsg, token);
+			}
+		if (nTb > 1)
+			{
+			NxsString errormsg =  "Multiple TAXA Blocks have been read (or implied using NEWTAXA in other blocks) and a ";
+			if (cmd)
+				errormsg += cmd;
+			errormsg += " command (which requires a TAXA block) has been encountered";
+			std::string bn = token.GetBlockName();
+			if (!bn.empty())
+				{
+				errormsg += " in a ";
+				errormsg += bn;
+				errormsg += " block.";
+				}
+			errormsg += ".\nThis can be caused by reading multiple files. It is possible that\neach file is readable separately, but cannot be read unambiguously when read in sequence.\n";
+			errormsg += "One way to correct this is to use the\n    TITLE some-unique-name-here ;\ncommand in the TAXA block and an accompanying\n    LINK TAXA=the-unique-title-goes here;\n";
+			errormsg += "command to specify which TAXA block is needed.";
+			cb->WarnDangerousContent(errormsg, token);
+			}
+		taxa = cb;
+		return;
+		}
+	if (nxsReader != NULL)
+		{
+		NxsTaxaBlockFactory * tbf = nxsReader->GetTaxaBlockFactory();
+		if (tbf)
+			{
+			std::string s("TAXA");
+			taxa = tbf->GetBlockReaderForID(s, nxsReader, &token);
+			ownsTaxaBlock = true;
+			passedRefOfOwnedBlock = false;
+			taxaLinkStatus = NxsBlock::BLOCK_LINK_TO_IMPLIED_BLOCK;
+			}
+		}
+	if (taxa == NULL)
+		{
+		taxa = new NxsTaxaBlock();
+		ownsTaxaBlock = true;
+		passedRefOfOwnedBlock = false;
+		taxaLinkStatus = NxsBlock::BLOCK_LINK_TO_IMPLIED_BLOCK;
+		}
+	}
+
+bool NxsTaxaBlockSurrogate::SurrogateSwapEquivalentTaxaBlock(NxsTaxaBlockAPI * tb)
+	{
+		NxsTaxaBlockFactory * tbf = nxsReader->GetTaxaBlockFactory();
+		if (this->taxa && this->ownsTaxaBlock && tbf)
+			tbf->BlockError(taxa);
+		this->SetTaxaBlockPtr(tb, NxsBlock::BLOCK_LINK_EQUIVALENT_TO_IMPLIED);
+		return true;
+	}
+
+void NxsTaxaBlockSurrogate::ResetSurrogate()
+	{
+	if (ownsTaxaBlock)
+		{
+		if (!passedRefOfOwnedBlock)
+			{
+			if (taxa != NULL && nxsReader != NULL)
+				{
+				NxsTaxaBlockFactory * factory = nxsReader->GetTaxaBlockFactory();
+				if (factory)
+					{
+					factory->BlockError(taxa);
+					taxa = NULL;
+					}
+				}
+			if (taxa)
+				delete taxa;
+			}
+		taxa = NULL; /*potential memory leak, but a reference should be held, by the nexus reader.*/
+		ownsTaxaBlock = false;
+		taxaLinkStatus = NxsBlock::BLOCK_LINK_UNINITIALIZED;
+		}
+	newtaxa = false;
+	passedRefOfOwnedBlock = false;
+	}
+
+VecBlockPtr NxsTaxaBlockSurrogate::GetCreatedTaxaBlocks()
+	{
+	VecBlockPtr vbp;
+	if (newtaxa && taxa)
+		{
+		vbp.push_back(taxa);
+		passedRefOfOwnedBlock = true;
+		}
+	return vbp;
+	}
+/*!
+	Called when TAXLABELS command needs to be parsed from within the UNALIGNED block. Deals with everything after the
+	token TAXLABELS up to and including the semicolon that terminates the TAXLABELS command.
+*/
+void NxsTaxaBlockSurrogate::HandleTaxLabels(
+  NxsToken & token)	/* the token used to read from `in' */
+	{
+	if (!newtaxa || taxa == NULL)
+		{
+		NxsString errormsg = "NEWTAXA must have been specified in DIMENSIONS command to use the TAXLABELS command in a ";
+		errormsg << GetBlockName() << " block";
+		throw NxsException(errormsg, token);
+		}
+	taxa->HandleTaxLabels(token);
+	}
+
diff --git a/lib/ncl-2.1.18/ncl/nxstaxablock.h b/lib/ncl-2.1.18/ncl/nxstaxablock.h
new file mode 100644
index 0000000..8fd2498
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxstaxablock.h
@@ -0,0 +1,484 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+#ifndef NCL_NXSTAXABLOCK_H
+#define NCL_NXSTAXABLOCK_H
+
+#include "ncl/nxsdefs.h"
+#include "ncl/nxsblock.h"
+
+/*! This abstract class describes the interface that every block that wants to serve
+	as a reader of NEXUS TAXA blocks should fulfill.
+
+	A parsed taxa block in NEXUS is essentially a list of unique taxon labels.
+
+	When compared the label comparison is not case-sensitive.
+
+	The taxon can be referred to in NEXUS files by its number (numbering starting at 1), or its label.
+*/
+class NxsTaxaBlockAPI
+  : public NxsBlock, public NxsLabelToIndicesMapper
+  {
+  public:
+		/*! Adds taxon label 's' to end of list of taxon labels and increments dimNTax by 1.
+
+			\returns the (0-based) index of taxon label just added.
+		*/
+		virtual unsigned			AddTaxonLabel(const std::string & s) = 0;
+		/*! Changes the label for taxon `i` to `s`
+			The index `i` should be 0-based.
+			\throws NxsNCLAPIException if `i` is out of range.
+			\throws DuplicatedLabelNxsException if the label is already in the block
+			\throws NxsException if the label is not a legal taxon name (eg. it is a punctation character).
+		*/
+		virtual void  				ChangeTaxonLabel(unsigned i, NxsString s) = 0;  /*v2.1to2.2 4 */
+		/*! \returns the 0-based index of taxon named 's' in taxonLabels list.
+
+			\throws NxsX_NoSuchTaxon exception if taxon named 's' cannot be found.
+
+			\warning {This function does NOT implement the interpret-label-as-a-number functionality}
+		*/
+		virtual unsigned			FindTaxon(const NxsString & label) const  = 0;  /*v2.1to2.2 4 */
+		/*! \returns true if the label `label` already a taxon label (not case sensitive)
+		*/
+		virtual bool  				IsAlreadyDefined(const std::string & label) = 0;
+		/*! \returns the length of the longest label.
+
+			\note {The label length, does not include any extra characters (such as quotes) that may be needed to write the file
+			out to NEXUS format}
+		*/
+		virtual unsigned			GetMaxTaxonLabelLength() = 0;
+		/*! \returns the number of taxon labels (should be the same as GetNTax after a valid parse).
+		*/
+		virtual unsigned			GetNumTaxonLabels() const = 0;
+		/*! \returns the number of taxa
+		*/
+		virtual unsigned			GetNTax() const = 0;
+		/*! \returns the number of taxa
+			The prescence of this function and GetNTax is a historical artifact.  They have the same behavior.
+		*/
+		virtual unsigned			GetNTaxTotal() const = 0;
+		/*! \returns the label for taxon with (0-based) index of `i`
+
+			\throws NxsNCLAPIException if `i` is out of range.
+			\warning{Can return a 1-based number if the taxon lacks a name (in NEXUS parsing "1" refers to the first taxon).}
+		*/
+		virtual NxsString 			GetTaxonLabel(unsigned i) const = 0;  /*v2.1to2.2 4 */
+
+		/*! \returns a vector of all of the taxon labels */
+		virtual std::vector<std::string> GetAllLabels() const;
+
+		/*! \returns a 1-based number of the taxon with label of `label` (not case-sensitive).
+			This is a low-level function not intended for widespread use (it is faster way to
+			query the label list because it does not throw exceptions or do the numeric interpretation
+			of labels).
+
+			\warning{does NOT apply the numeric interpretation of the label.}
+
+			\warning{ 1-based numbering}
+		*/
+		virtual unsigned			TaxLabelToNumber(const std::string &label) const = 0;
+
+		/*! hook called during NxsTaxaBlock::Read() when the TaxLabels command is encountered */
+		virtual void 				HandleTaxLabels(NxsToken &token) = 0;
+		/*! writes the taxon labes as NEXUS to `out` */
+		virtual void 				WriteTaxLabelsCommand(std::ostream &out) const = 0;
+		/*! Sets the number of taxa to be included in the block
+
+			\warning{This can cause the cropping of labels.}
+		*/
+		virtual void 				SetNtax(unsigned n) = 0;
+
+		/*! \returns the number of taxa that have not been inactivated by calling InactivateTaxa
+		*/
+		virtual unsigned		 	GetNumActiveTaxa() const = 0;
+		/*! \returns true if the taxon (denoted by a 0-based index) is in range and not inactivated
+
+			\note{Works, but is not currently used by the library added for planned delete/restor functionality}
+		*/
+		virtual bool		 		IsActiveTaxon(unsigned i) const = 0;
+		/*! flags a set of taxa as inactive. Takes a set of 0-based indices.
+
+			\note{Works, but is not currently used by the library added for planned delete/restor functionality}
+		*/
+		virtual unsigned		 	InactivateTaxa(const std::set<unsigned> &s) = 0;
+		/*! flags a set of taxa as active. Takes a set of 0-based indices.
+
+			\note{Works, but is not currently used by the library added for planned delete/restor functionality}
+		*/
+		virtual unsigned		 	ActivateTaxa(const std::set<unsigned> &) = 0;
+		/*! flags a taxon as active. Takes a  0-based index.
+
+			\note{Works, but is not currently used by the library added for planned delete/restor functionality}
+		*/
+		virtual unsigned		 	InactivateTaxon(unsigned ) = 0;
+		/*! flags a taxon as active. Takes a  0-based index.
+
+			\note{Works, but is not currently used by the library added for planned delete/restor functionality}
+		*/
+		virtual unsigned		 	ActivateTaxon(unsigned ) = 0;
+
+  };
+
+/*! The default implementation of the NxsTaxaBlockAPI that is used to parse TAXA blocks into a list of
+	unique (case-insensitive) labels.
+
+*/
+class NxsTaxaBlock
+  : public NxsTaxaBlockAPI
+	{
+	friend class NxsDataBlock;
+	friend class NxsAllelesBlock;
+	friend class NxsCharactersBlock;
+	friend class NxsDistancesBlock;
+
+	public:
+							NxsTaxaBlock();
+		virtual				~NxsTaxaBlock();
+
+		virtual unsigned	AddTaxonLabel(const std::string & s);
+		void  				ChangeTaxonLabel(unsigned i, NxsString s); /*v2.1to2.2 4 */
+		unsigned			TaxLabelToNumber(const std::string &label) const;
+		unsigned			FindTaxon(const NxsString & label) const;  /*v2.1to2.2 4 */
+		bool  				IsAlreadyDefined(const std::string &label);
+		unsigned GetIndexSet(const std::string &label, NxsUnsignedSet * toFill) const
+			{
+			return NxsLabelToIndicesMapper::GetIndicesFromSets(label, toFill, taxSets);
+			}
+		unsigned			GetMaxTaxonLabelLength();
+		unsigned			GetNTax() const;
+		unsigned			GetNTaxTotal() const;
+		unsigned			GetNumTaxonLabels() const;
+		NxsString 			GetTaxonLabel(unsigned i) const;  /*v2.1to2.2 4 */
+		void 				HandleTaxLabels(NxsToken &token);
+		bool 				NeedsQuotes(unsigned i);
+		virtual void		Report(std::ostream &out) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		virtual void 		Reset();
+		void 				SetNtax(unsigned n);
+		void				WriteAsNexus(std::ostream &out) const;
+
+
+		virtual unsigned		 	GetNumActiveTaxa() const;
+		virtual bool		 		IsActiveTaxon(unsigned i) const;
+		virtual unsigned		 	InactivateTaxa(const std::set<unsigned> &);
+		virtual unsigned		 	ActivateTaxa(const std::set<unsigned> &);
+		virtual unsigned		 	InactivateTaxon(unsigned );
+		virtual unsigned		 	ActivateTaxon(unsigned );
+
+		class NxsX_NoSuchTaxon {};	/* thrown if FindTaxon cannot locate a supplied taxon label in the taxLabels vector */
+
+		void 				WriteTaxLabelsCommand(std::ostream &out) const;
+
+		unsigned GetMaxIndex() const;
+		unsigned GetNumLabelsCurrentlyStored() const;
+		unsigned GetIndicesForLabel(const std::string &label, NxsUnsignedSet *inds) const;
+		bool AddNewIndexSet(const std::string &label, const NxsUnsignedSet & inds);
+		bool AddNewPartition(const std::string &label, const NxsPartition & inds);
+
+		/*----------------------------------------------------------------------
+		| AppendNewLabel should not be called in most client code.  It is only
+		| 	added because some blocks create their own taxa block on-the-fly.
+		*/
+		virtual unsigned AppendNewLabel(std::string &label)
+			{
+			while (dimNTax <= taxLabels.size())
+				dimNTax++;
+			return AddTaxonLabel(label);
+			}
+
+		NxsTaxaBlock &operator=(const NxsTaxaBlock &other)
+			{
+			Reset();
+			CopyBaseBlockContents(static_cast<const NxsBlock &>(other));
+			CopyTaxaContents(other);
+			return *this;
+			}
+
+		void CopyTaxaContents(const NxsTaxaBlock &other)
+			{
+			taxLabels = other.taxLabels;
+			labelToIndex = other.labelToIndex;
+			dimNTax = other.dimNTax;
+			taxSets = taxSets;
+			taxPartitions = other.taxPartitions;
+			inactiveTaxa = other.inactiveTaxa;
+			}
+		NxsTaxaBlock * Clone() const
+			{
+			NxsTaxaBlock *taxa = new NxsTaxaBlock();
+			*taxa = *this;
+			return taxa;
+			}
+	protected:
+		NxsStringVector	taxLabels;	/* storage for list of taxon labels */
+		std::map<std::string, unsigned> labelToIndex;
+		unsigned		dimNTax;
+		NxsUnsignedSetMap taxSets;
+		NxsPartitionsByName taxPartitions;
+		std::set<unsigned> inactiveTaxa;
+
+		virtual void 	Read(NxsToken &token);
+		void CheckCapitalizedTaxonLabel(const std::string &s) const;
+		unsigned CapitalizedTaxLabelToNumber(const std::string & s) const;
+		void 			RemoveTaxonLabel(unsigned taxInd);
+	};
+
+
+/*! This class is the base class for blocks that can (in a pinch) serve as
+a TAXA block reader(NxsCharactersBlock, NxsTreesBlock, NxsUnalignedBlock, and NxsDistancesBlock)
+
+	Client code rarely needs to call the special functionality of this class.
+
+	In broad terms, this class delegates calls to the taxa block if there is an
+		external taxa block.
+	If no external taxa block has been associated with the NxsTaxaBlockSurrogate, then
+		will create one (which will later be returned to the NxsReader as an
+		implied block)
+*/
+class NxsTaxaBlockSurrogate
+	{
+	public:
+		void SetCreateImpliedBlock(bool v)
+        	{
+        	createImpliedBlock = v;
+        	}
+
+		/*! \returns an integer that will be a facet of NxsBlockLinkStatus which reflects how the taxa block was determined.*/
+		int GetTaxaLinkStatus() const
+			{
+			return taxaLinkStatus;
+			}
+
+		void SetTaxaLinkStatus(NxsBlock::NxsBlockLinkStatus s);
+		NxsTaxaBlockAPI * GetTaxaBlockPtr(int *status) const;
+		NxsTaxaBlockAPI * GetTaxaBlockPtr() {return GetTaxaBlockPtr(0L);}
+
+		virtual const std::string & GetBlockName() const = 0;
+
+		virtual unsigned			GetNTax() const;
+		virtual unsigned			GetNTaxTotal() const;
+		virtual unsigned			GetNumActiveTaxa() const;
+		virtual bool				IsActiveTaxon(unsigned i) const;
+		virtual unsigned			InactivateTaxa(const std::set<unsigned> &);
+		virtual unsigned			ActivateTaxa(const std::set<unsigned> &);
+		virtual unsigned			InactivateTaxon(unsigned );
+		virtual unsigned			ActivateTaxon(unsigned );
+
+		NxsTaxaBlockSurrogate &operator=(const NxsTaxaBlockSurrogate &other)
+			{
+			ResetSurrogate();
+			CopyTaxaBlockSurrogateContents(other);
+			return *this;
+			}
+
+		/*
+		|  Aliases the same taxa block as `other`, but `other` retains ownership!!
+		*/
+		virtual void CopyTaxaBlockSurrogateContents(const NxsTaxaBlockSurrogate &other)
+			{
+			ResetSurrogate();
+			taxa = other.taxa;
+			taxaLinkStatus = other.taxaLinkStatus;
+			newtaxa = other.newtaxa;
+			ownsTaxaBlock = false;
+			passedRefOfOwnedBlock = other.passedRefOfOwnedBlock;
+			createImpliedBlock = other.createImpliedBlock;
+			nxsReader = other.nxsReader;
+			}
+
+	protected:
+		NxsTaxaBlockSurrogate(NxsTaxaBlockAPI *tb, NxsReader * reader)
+			:taxa(tb),
+			newtaxa(false),
+			ownsTaxaBlock(false),
+			passedRefOfOwnedBlock(false),
+			createImpliedBlock(false),
+			nxsReader(reader)
+			{
+			taxaLinkStatus = (tb == NULL ? NxsBlock::BLOCK_LINK_UNINITIALIZED : NxsBlock::BLOCK_LINK_TO_ONLY_CHOICE);
+			}
+		virtual ~NxsTaxaBlockSurrogate()
+			{
+			ResetSurrogate();
+			}
+
+		void SetTaxaBlockPtr(NxsTaxaBlockAPI *c, NxsBlock::NxsBlockLinkStatus s);
+
+		VecBlockPtr GetCreatedTaxaBlocks();
+		void FlagTaxaBlockAsUsed()
+			{
+			taxaLinkStatus |= NxsBlock::BLOCK_LINK_USED;
+			}
+
+		void AssureTaxaBlock(bool allocBlock, NxsToken &, const char *cmd);
+		void ResetSurrogate();
+		void SetNexusReader(NxsReader *nxsptr)
+			{
+			nxsReader = nxsptr;
+			}
+		virtual void 			HandleTaxLabels(NxsToken & token);
+		virtual void			HandleLinkTaxaCommand(NxsToken & );
+		virtual void			WriteLinkTaxaCommand(std::ostream &out) const;
+		bool					SurrogateSwapEquivalentTaxaBlock(NxsTaxaBlockAPI * tb);
+
+		NxsTaxaBlockAPI			*taxa;				/* pointer to the TAXA block in which taxon labels are stored */
+		int						taxaLinkStatus;
+		bool					newtaxa;
+		bool					ownsTaxaBlock;
+		bool					passedRefOfOwnedBlock;
+		bool					createImpliedBlock; /*if true and NEWTAXA is read in the DIMENSIONS command, then a new TaxaBlock will be allocated (instead of resetting the TAXA block). false by default.*/
+		NxsReader 				*nxsReader;
+	};
+// The following typedef maintains compatibility with existing code.
+// The TaxaBlock class name is deprecated; please use NxsTaxaBlock instead.
+//
+typedef NxsTaxaBlock TaxaBlock;
+class NxsTaxaBlockFactory
+	:public NxsBlockFactory
+	{
+	public:
+		virtual NxsTaxaBlock  *	GetBlockReaderForID(const std::string & NCL_BLOCKTYPE_ATTR_NAME, NxsReader *reader, NxsToken *token);
+	};
+
+inline unsigned NxsTaxaBlock::GetNTax() const
+	{
+	return dimNTax;
+	}
+
+inline unsigned NxsTaxaBlock::GetNTaxTotal() const
+	{
+	return dimNTax;
+	}
+
+/*!	\returns a 1-based number of the taxon with label of `r` OR returns 0 to indicate that the label was not found.
+	Not for public usage
+
+	\warning{`r` must be capitalized for this function to work.}
+
+	\warning{does NOT apply the numeric interpretation of the label.}
+
+	\warning{ 1-based numbering}
+*/
+inline unsigned NxsTaxaBlock::CapitalizedTaxLabelToNumber(const std::string &r) const
+	{
+	std::map<std::string, unsigned>::const_iterator rIt = labelToIndex.find(r);
+	if (rIt == labelToIndex.end())
+		return 0;
+	return rIt->second + 1;
+	}
+
+
+/*!
+	Returns true if taxon `i' is active. If taxon `i' has been deleted, returns false. Assumes `i' is in the range
+	[0..`ntax').
+*/
+inline bool NxsTaxaBlockSurrogate::IsActiveTaxon(
+  unsigned taxInd) const	/* the taxon in question, in the range [0..`ntax') */
+	{
+	if (!taxa)
+	    throw NxsNCLAPIException("Calling IsActiveTaxon on uninitialized block");
+	return taxa->IsActiveTaxon(taxInd);
+	}
+inline unsigned NxsTaxaBlockSurrogate::GetNumActiveTaxa() const
+	{
+	if (!taxa)
+	    throw NxsNCLAPIException("Calling GetNumActiveTaxa on uninitialized block");
+	return taxa->GetNumActiveTaxa();
+	}
+inline unsigned NxsTaxaBlockSurrogate::InactivateTaxa(const std::set<unsigned> &s)
+	{
+	if (!taxa)
+	    throw NxsNCLAPIException("Calling InactivateTaxa on uninitialized block");
+	return taxa->InactivateTaxa(s);
+	}
+inline unsigned NxsTaxaBlockSurrogate::ActivateTaxa(const std::set<unsigned> &s)
+	{
+	if (!taxa)
+	    throw NxsNCLAPIException("Calling ActivateTaxa on uninitialized block");
+	return taxa->ActivateTaxa(s);
+	}
+
+inline unsigned NxsTaxaBlockSurrogate::InactivateTaxon(unsigned i)
+	{
+	if (!taxa)
+	    throw NxsNCLAPIException("Calling InactivateTaxon on uninitialized block");
+	return taxa->InactivateTaxon(i);
+	}
+
+inline unsigned NxsTaxaBlockSurrogate::ActivateTaxon(unsigned i)
+	{
+	if (!taxa)
+	    throw NxsNCLAPIException("Calling ActivateTaxon on uninitialized block");
+	return taxa->ActivateTaxon(i);
+	}
+
+inline unsigned NxsTaxaBlockSurrogate::GetNTax() const
+	{
+	if (!taxa)
+	    throw NxsNCLAPIException("Calling GetNTax on uninitialized block");
+	return taxa->GetNTax();
+	}
+
+inline unsigned NxsTaxaBlockSurrogate::GetNTaxTotal() const
+	{
+	if (!taxa)
+	    throw NxsNCLAPIException("Calling GetNTaxTotal on uninitialized block");
+	return taxa->GetNTaxTotal();
+	}
+
+
+inline unsigned NxsTaxaBlock::GetNumActiveTaxa() const
+	{
+	return GetNTax() - (unsigned)inactiveTaxa.size();
+	}
+
+inline bool NxsTaxaBlock::IsActiveTaxon(unsigned i) const
+	{
+	return i < GetNTax() && (inactiveTaxa.count(i) == 0);
+	}
+
+inline unsigned NxsTaxaBlock::InactivateTaxa(const std::set<unsigned> &s)
+	{
+	for (std::set<unsigned>::const_iterator sIt = s.begin(); sIt != s.end(); ++sIt)
+		InactivateTaxon(*sIt);
+	return GetNumActiveTaxa();
+	}
+
+inline unsigned NxsTaxaBlock::ActivateTaxa(const std::set<unsigned> &s)
+	{
+	for (std::set<unsigned>::const_iterator sIt = s.begin(); sIt != s.end(); ++sIt)
+		ActivateTaxon(*sIt);
+	return GetNumActiveTaxa();
+	}
+inline unsigned NxsTaxaBlock::InactivateTaxon(unsigned i)
+	{
+	if (i > GetNTax())
+		throw NxsNCLAPIException("Taxon index out of range in InactivateTaxon");
+	inactiveTaxa.insert(i);
+	return GetNumActiveTaxa();
+	}
+inline unsigned NxsTaxaBlock::ActivateTaxon(unsigned i)
+	{
+	if (i > GetNTax())
+		throw NxsNCLAPIException("Taxon index out of range in InactivateTaxon");
+	inactiveTaxa.erase(i);
+	return GetNumActiveTaxa();
+	}
+
+
+#endif
diff --git a/lib/ncl-2.1.18/ncl/nxstaxablock.lo b/lib/ncl-2.1.18/ncl/nxstaxablock.lo
new file mode 100644
index 0000000..05554f5
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxstaxablock.lo
@@ -0,0 +1,12 @@
+# nxstaxablock.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nxstaxablock.o'
+
+# Name of the non-PIC object
+non_pic_object='nxstaxablock.o'
+
diff --git a/lib/ncl-2.1.18/ncl/nxstoken.cpp b/lib/ncl-2.1.18/ncl/nxstoken.cpp
new file mode 100644
index 0000000..97de802
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxstoken.cpp
@@ -0,0 +1,1058 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+#include <cstdlib>
+#include <cassert>
+#include <sstream>
+#include "ncl/nxstoken.h"
+
+using namespace std;
+
+#define NEW_NXS_TOKEN_READ_CHAR
+
+
+
+
+/*!
+ * Parses a ProcessedNxsCommand assuming that it has the form:
+ *		cmd_name opt_name = opt_val multi_opt_name = (opt_val_1 opt_val2) ;
+ * Errors are produced if opt_names (or multi_opt_names) are repeated within a command.
+ */
+NxsSimpleCommandStrings ProcessedNxsToken::ParseSimpleCmd(
+  const std::vector<ProcessedNxsToken> &pnc,
+	bool convertToLower)
+{
+	NxsSimpleCommandStrings nscs;
+	if (pnc.empty())
+		return nscs;
+
+
+	std::vector<ProcessedNxsToken>::const_iterator wordIt = pnc.begin();
+
+	nscs.cmdName = wordIt->GetToken();
+	if (convertToLower)
+		NxsString::to_lower(nscs.cmdName);
+	nscs.cmdPos = wordIt->GetFilePosInfoConstRef();
+	++wordIt;
+
+	std::string key;
+
+	NxsString errorMsg;
+	NxsTokenPosInfo keyPos = nscs.cmdPos;
+	bool eqRead = false;
+	for (; wordIt != pnc.end(); ++wordIt)
+		{
+		std::string w = wordIt->GetToken();
+		if (convertToLower)
+			NxsString::to_lower(w);
+		if (key.empty())
+			{
+			key = w;
+			if (nscs.HasKey(key))
+				{
+				errorMsg << "Command option (" << key << ") repeated in the " << nscs.cmdName << " command.";
+				throw NxsException(errorMsg, wordIt->GetFilePosInfoConstRef());
+				}
+			keyPos = wordIt->GetFilePosInfoConstRef();
+			}
+		else if (!eqRead)
+			{
+			if (w != "=")
+				{
+				errorMsg << "Expecting an = after the  " << key << " command option of the  " << nscs.cmdName << " command.";
+				throw NxsException(errorMsg, wordIt->GetFilePosInfoConstRef());
+				}
+			eqRead = true;
+			}
+		else {
+			if (w == "(")
+				{
+				++wordIt;
+				w = wordIt->GetToken();
+				std::vector<std::string> vals;
+				NxsSimpleCommandStrings::MatString mat;
+				if (w == "(")
+					{
+					while (w != ")")
+						{
+						if (w != "(")
+							{
+							errorMsg << "Expecting a ( to begin another row of values in the " << key << " command option of the  " << nscs.cmdName << " command.";
+							throw NxsException(errorMsg, keyPos);
+							}
+
+						++wordIt;
+						w = wordIt->GetToken();
+						while (wordIt != pnc.end())
+							{
+							w = wordIt->GetToken();
+							if (convertToLower)
+								NxsString::to_lower(w);
+							if (w == ")")
+								break;
+							vals.push_back(w);
+							++wordIt;
+							}
+						if (wordIt == pnc.end())
+							{
+							errorMsg << "Expecting a ) to end the list of values for the " << key << " command option of the  " << nscs.cmdName << " command.";
+							throw NxsException(errorMsg, keyPos);
+							}
+						++wordIt;
+						mat.push_back(vals);
+						vals.clear();
+						w = wordIt->GetToken();
+						if (wordIt == pnc.end())
+							{
+							errorMsg << "Expecting a ) to end the list of values for the " << key << " command option of the  " << nscs.cmdName << " command.";
+							throw NxsException(errorMsg, keyPos);
+							}
+						}
+					nscs.matOpts[key] = NxsSimpleCommandStrings::MatFromFile(wordIt->GetFilePosInfoConstRef(), mat);
+					}
+				else
+					{
+					while (wordIt != pnc.end())
+						{
+						w = wordIt->GetToken();
+						if (convertToLower)
+							NxsString::to_lower(w);
+						if (w == ")")
+							break;
+						vals.push_back(w);
+						++wordIt;
+						}
+					if (wordIt == pnc.end())
+						{
+						errorMsg << "Expecting a ) to end the list of values for the " << key << " command option of the  " << nscs.cmdName << " command.";
+						throw NxsException(errorMsg, keyPos);
+						}
+					nscs.multiOpts[key] = NxsSimpleCommandStrings::MultiValFromFile(wordIt->GetFilePosInfoConstRef(), vals);
+					}
+				}
+			else
+				{
+				std::string val = w;
+				nscs.opts[key] = NxsSimpleCommandStrings::SingleValFromFile( wordIt->GetFilePosInfoConstRef(), val);
+				}
+			eqRead = false;
+			key.clear();
+			}
+		}
+	if (eqRead)
+		{
+		errorMsg << "Expecting a value after the = sign in the  " << key << " command option of the  " << nscs.cmdName << " command.";
+		throw NxsException(errorMsg, keyPos);
+		}
+	if (!key.empty())
+		{
+		errorMsg << "Expecting an = after the  " << key << " command option of the  " << nscs.cmdName << " command.";
+		throw NxsException(errorMsg, keyPos);
+		}
+	return nscs;
+}
+
+
+
+
+NxsX_UnexpectedEOF::NxsX_UnexpectedEOF(NxsToken &token)
+	:NxsException("Unexpected end-of-file", token)
+	{
+	std::string t = token.GetBlockName();
+	NxsString::to_upper(t);
+	if (!t.empty())
+		msg << " while reading " << t << " block.";
+	}
+
+/*! Writes the command `c` (with all embedded comments) a terminating ; will be written if any tokens are written. */
+bool WriteCommandAsNexus(std::ostream & out, const ProcessedNxsCommand &c)
+	{
+	if (c.empty())
+		return false;
+	out << "   "; /* command indentation  - 1 space*/
+	for(ProcessedNxsCommand::const_iterator cIt = c.begin(); cIt != c.end(); ++cIt)
+		{
+		out << ' ';
+		cIt->WriteAsNexus(out);
+		}
+	out << ";";
+	return true;
+	}
+
+
+
+/*!
+	Convenience function.
+ 	Raises an aprropriate NxsException (by appending  `contextString` to the phrase Unexpected ; "), if incrementing
+		`tokIt` makes it equal to `endIt`
+*/
+void ProcessedNxsToken::IncrementNotLast(std::vector<ProcessedNxsToken>::const_iterator & tokIt, const std::vector<ProcessedNxsToken>::const_iterator &endIt, const char * contextString)
+	{
+	++tokIt;
+	if (tokIt == endIt)
+		{
+		NxsString errormsg = "Unexpected ; ";
+		if (contextString)
+			errormsg.append(contextString);
+		--tokIt;
+		throw NxsException(errormsg, *tokIt);
+		}
+	}
+/*!
+ 	Advance the stream and store it in nextCharInStream.  Deal with the 3 ways of specifying return charaters
+		(nextCharInStream will be set to \n if any of the return styles are found)
+*/
+inline void NxsToken::AdvanceToNextCharInStream()
+	{
+	if (nextCharInStream == EOF)
+		return;
+	nextCharInStream  = (signed char) (inputStream.rdbuf())->sbumpc();
+	posOffBy = -1;
+	if (nextCharInStream == 13 || nextCharInStream == 10)
+		{
+		if(nextCharInStream == 13)
+			{
+			if ((inputStream.rdbuf())->sgetc() == 10)	//peeks at the next char
+				{
+				(inputStream.rdbuf())->sbumpc();
+				posOffBy = -2;
+				}
+			}
+		nextCharInStream = '\n';
+		}
+	}
+
+
+#if defined(NEW_NXS_TOKEN_READ_CHAR)
+/*!
+	returns the character that had been stored in nextCharInStream, but also calls AdvanceToNextCharInStream() so
+	nextCharInStream is advanced.
+	Does all of the fileposition bookkeeping.
+	Throws an NxsX_UnexpectedEOF exception if eof is found but eofAllowed is false.
+*/
+inline char NxsToken::GetNextChar()
+	{
+	//
+	// 	Why this was changed:  calls to tellg seem slow and unnecessary - we're storing filepos in terms of the
+	//	number of times we call sbumpc().
+	//	if we go back to getting the filepos via in.tellg(), remember to call it
+	//	twice after both sgetc() calls in the case of the \13\10 endline
+
+	signed char ch = nextCharInStream;
+	AdvanceToNextCharInStream();
+	if(ch == EOF)
+		{
+		atEOF = true;
+		if (eofAllowed)
+			return '\0';
+		throw NxsX_UnexpectedEOF(*this);
+		}
+	if(ch == '\n')
+		{
+		fileLine++;
+		fileColumn = 1L;
+		atEOL = true;
+		return '\n';
+		}
+	if (ch == '\t')
+		fileColumn += 4 - ((fileColumn - 1)%4);	//@assumes that tab will be 4 in the editor we use
+	else
+		fileColumn++;
+	atEOL = false;
+	return ch;
+	}
+
+#else //	if  !defined(NEW_NXS_TOKEN_READ_CHAR)
+
+/*!
+	Reads next character from in and does all of the following before returning it to the calling function:
+~
+	o if character read is either a carriage return or line feed, the variable line is incremented by one and the
+	  variable col is reset to zero
+	o if character read is a carriage return, and a peek at the next character to be read reveals that it is a line
+	  feed, then the next (line feed) character is read
+	o if either a carriage return or line feed is read, the character returned to the calling function is '\n' if
+	  character read is neither a carriage return nor a line feed, col is incremented by one and the character is
+	  returned as is to the calling function
+	o in all cases, the variable filepos is updated using a call to the tellg function of istream.
+~
+*/
+inline char NxsToken::GetNextChar()
+	{
+	int ch = inputStream.get();
+	int failed = inputStream.bad();
+	if (failed)
+		{
+		errormsg = "Unknown error reading data file (check to make sure file exists)";
+		throw NxsException(errormsg);
+		}
+
+	if (ch == 13 || ch == 10)
+		{
+		fileLine++;
+		fileColumn = 1L;
+
+		if (ch == 13 && (int)inputStream.peek() == 10)
+			ch = inputStream.get();
+
+		atEOL = 1;
+		}
+	else if (ch == EOF)
+		atEOF = 1;
+	else
+		{
+		fileColumn++;
+		atEOL = 0;
+		}
+
+#	if defined(__DECCXX)
+		filepos = 0L;
+#	else
+		file_pos filepos = inputStream.tellg();
+#	endif
+
+	if (atEOF)
+		return '\0';
+	else if (atEOL)
+		return '\n';
+	else
+		return (char)ch;
+	}
+#endif
+
+std::map<std::string, std::string> NxsToken::ParseAsSimpleKeyValuePairs(const ProcessedNxsCommand & tv, const char *cmdName)
+	{
+	std::map<std::string, std::string> kv;
+	std::string key;
+	ProcessedNxsCommand::const_iterator tvIt = tv.begin();
+	ProcessedNxsCommand::const_iterator prevIt;
+	ProcessedNxsCommand::const_iterator endIt = tv.end();
+	while (tvIt != endIt)
+		{
+		key = tvIt->GetToken().c_str();
+		prevIt = tvIt++;
+		if (tvIt == endIt || tvIt->GetToken() != "=")
+			{
+			NxsString m("Expecting = after ");
+			m += key.c_str();
+			m += " in ";
+			m += cmdName;
+			m += " command.";
+			if (tvIt == endIt)
+				throw NxsException(m, prevIt->GetFilePosition(), prevIt->GetLineNumber(), prevIt->GetColumnNumber());
+			else
+				throw NxsException(m, tvIt->GetFilePosition(), tvIt->GetLineNumber(), tvIt->GetColumnNumber());
+			}
+		prevIt = tvIt++;
+		if (tvIt == endIt)
+			{
+			NxsString m("Expecting a value after = in the  ");
+			m += key.c_str();
+			m += " subcommand of the in ";
+			m += cmdName;
+			m += " command.";
+			throw NxsException(m, prevIt->GetFilePosition(), prevIt->GetLineNumber(), prevIt->GetColumnNumber());
+			}
+		kv[key] = tvIt->GetToken();
+		tvIt++;
+		}
+	return kv;
+	}
+
+
+std::vector<ProcessedNxsToken> NxsToken::Tokenize(const std::string & toTokenize)
+    {
+	std::string bogusStr = toTokenize;
+	bogusStr.append(1, '\n');
+	std::istringstream bogusStream(bogusStr);
+	NxsToken bogusToken(bogusStream);
+	bogusToken.GetNextToken();
+	std::vector<ProcessedNxsToken>  tokenVec;
+	while (!bogusToken.AtEOF())
+		{
+		tokenVec.push_back(ProcessedNxsToken(bogusToken));
+		bogusToken.GetNextToken();
+		}
+    return tokenVec;
+    }
+
+
+/*!
+	Reads until ";" and fills the vector of ProcessedNxsToken objects.
+	Note the ";" is not included in the ProcessedNxsCommand, but it can be assumed that the semicolon followed.
+	The NxsToken objects file position will reflect the location of the semicolon.
+*/
+void NxsToken::ProcessAsCommand(ProcessedNxsCommand *tokenVec)
+	{
+	;
+	while (!this->Equals(";"))
+		{
+		if (tokenVec)
+			tokenVec->push_back(ProcessedNxsToken(*this));
+		this->GetNextToken();
+		}
+	}
+
+
+/*!
+	Returns copy of s but with quoting according to the NEXUS Standard (single quotes around the token and all internal
+		single quotes replaced with a pair of single quotes.
+*/
+std::string NxsToken::GetQuoted(const std::string &s)
+	{
+	std::string withQuotes;
+	withQuotes.reserve(s.length() + 4);
+	withQuotes.push_back('\'');
+	for (NxsString::const_iterator sIt = s.begin(); sIt != s.end(); sIt++)
+		{
+		withQuotes.push_back(*sIt);
+		if (*sIt == '\'')
+			withQuotes.push_back('\'');
+		}
+	withQuotes.push_back('\'');
+	return withQuotes;
+	}
+
+/*!
+	Advances the token, and returns the unsigned int that the token represents
+
+ 	Sets errormsg and raises a NxsException on failure.
+	`contextString` is used in error messages:
+		"${contextString} must be a number greater than 0"
+*/
+unsigned NxsToken::DemandPositiveInt(NxsToken &token, NxsString & errormsg, const char *contextString)
+	{
+	token.GetNextToken();
+	int i = -1;
+	try {
+	    i = token.GetToken().ConvertToInt();
+	    }
+	catch (NxsString::NxsX_NotANumber &x)
+	    {
+	    }
+//	int i = atoi(token.GetToken().c_str());
+	if (i <= 0)
+		{
+		errormsg.assign(contextString);
+		errormsg += " must be a number greater than 0. Found ";
+		errormsg += token.GetToken();
+		errormsg += " instead";
+		throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+		}
+	return (unsigned) i;
+	}
+
+
+/*!
+	Advances the token, and returns the unsigned int that the token represents
+
+ 	Sets errormsg and raises a NxsException on failure.
+	`contextString` is used in error messages:
+		"Expecting ';' to terminate the ${contextString} command"
+*/
+void NxsToken::DemandEndSemicolon(NxsToken &token, NxsString & errormsg, const char *contextString)
+	{
+	token.GetNextToken();
+	if (!token.Equals(";"))
+		{
+		errormsg = "Expecting ';' to terminate the ";
+		errormsg += contextString;
+		errormsg += " command, but found ";
+		errormsg += token.GetToken();
+		errormsg += " instead";
+		throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+		}
+	}
+/*!
+	Returns copy of s but with quoting according to the NEXUS Standard (single quotes around the token and all internal
+		single quotes replaced with a pair of single quotes.
+*/
+bool NxsToken::NeedsQuotes(const std::string &s)
+	{
+	for (std::string::const_iterator sIt = s.begin(); sIt != s.end(); sIt++)
+		{
+		const char &c = (*sIt);
+		if (!isgraph(c))
+			return true;
+		else if (strchr("\'[(){}\"-]/\\,;:=*`+<>", c) != NULL)
+			{
+			// ' and [ always need quotes.  other punctuation needs quotes if it is in a word of length > 1
+			if (c == '\'' || c == '[')
+				return true;
+			return (s.length() > 1);
+			}
+		}
+	return false;
+	}
+
+
+
+/*!
+	Sets atEOF and atEOL to false, comment and token to the empty string, fileColumn and fileLine to 1, filepos to 0,
+	labileFlags to 0 and saved and special to the null character. Initializes the istream reference data
+	member in to the supplied istream `i'.
+*/
+NxsToken::NxsToken(
+  istream &i)	/* the istream object to which the token is to be associated */
+  : inputStream(i),
+	eofAllowed(true)
+	{
+	posOffBy = 0;
+	atEOF		= false;
+	atEOL		= false;
+	comment.clear();
+	fileColumn	= 1L;
+	fileLine	= 1L;
+	labileFlags	= 0;
+	saved		= '\0';
+	special		= '\0';
+
+	whitespace[0]  = ' ';
+	whitespace[1]  = '\t';
+	whitespace[2]  = '\n';
+	whitespace[3]  = '\0';
+#	if defined(NEW_NXS_TOKEN_READ_CHAR)
+		nextCharInStream = 'a';	//anything other than EOF will work
+		AdvanceToNextCharInStream();
+#	endif
+    this->isPunctuationFn = &(NxsString::IsNexusPunctuation);
+	}
+
+/*!
+	Nothing needs to be done; all objects take care of deleting themselves.
+*/
+NxsToken::~NxsToken()
+	{
+	}
+
+/*!
+	Reads rest of comment (starting '[' already input) and acts accordingly. If comment is an output comment, and if
+	an output stream has been attached, writes the output comment to the output stream. Otherwise, output comments are
+	simply ignored like regular comments.
+	If the labileFlag bit saveCommandComments is in effect, and we are NOT in the middle of a token then the comment
+		(without the [] braces) will be stored in token.
+	All other comments are stored as embeddedComments.
+	Returns true if a command comment was read and stored as the token
+*/
+bool NxsToken::GetComment()
+	{
+	// Set comment level to 1 initially.  Every ']' encountered reduces
+	// level by one, so that we know we can stop when level becomes 0.
+	//
+	NxsString currentComment;
+	bool command = false;
+
+	bool formerEOFAllowed = eofAllowed;
+	eofAllowed = false;
+	try
+		{
+		char ch = GetNextChar();
+		// See if first character is the output comment symbol ('!')
+		// or command comment symbol (&)
+		//
+		int printing = 0;
+		if (ch == '!')
+			printing = 1;
+		else if (ch == '&' && (labileFlags & saveCommandComments) && token.empty())
+			command = true;
+		currentComment.push_back(ch);
+		if (ch != ']')
+			{
+			int level = 1;
+			for(;;)
+				{
+				ch = GetNextChar();
+				if (ch == ']')
+					{
+					level--;
+					if (level == 0)
+						break;
+					}
+				else if (ch == '[')
+					level++;
+				currentComment.push_back(ch);
+				}
+
+			if (printing)
+				{
+				// Allow output comment to be printed or displayed in most appropriate
+				// manner for target operating system
+				//
+				NxsString foroutput(currentComment.c_str() + 1);
+				comment = foroutput;
+				OutputComment(foroutput);
+				}
+			if (command)
+				token = currentComment;
+			else
+				embeddedComments.push_back(NxsComment(currentComment, GetFileLine(), GetFileColumn()));
+			}
+		}
+	catch (NxsX_UnexpectedEOF & x)
+		{
+		x.msg << " (end-of-file inside comment)";
+		eofAllowed = formerEOFAllowed;
+		throw x;
+		}
+	eofAllowed = formerEOFAllowed ;
+	return command;
+	}
+
+/*!
+	Reads rest of a token surrounded with curly brackets (the starting '{' has already been input) up to and including
+	the matching '}' character. All nested curly-bracketed phrases will be included.
+*/
+void NxsToken::GetCurlyBracketedToken()
+	{
+	bool formerEOFAllowed = eofAllowed;
+	eofAllowed = false;
+	try
+		{
+		int level = 1;
+		while(level > 0)
+			{
+			char ch = GetNextChar();
+			if (ch == '}')
+				level--;
+			else if (ch == '{')
+				level++;
+			AppendToToken(ch);
+			}
+		}
+	catch (NxsX_UnexpectedEOF & x)
+		{
+		x.msg << " (end-of-file inside {} braced statement)";
+		eofAllowed = formerEOFAllowed;
+		throw x;
+		}
+	eofAllowed = formerEOFAllowed ;
+	}
+
+/*!
+	Gets remainder of a double-quoted NEXUS word (the first double quote character was read in already by GetNextToken).
+	This function reads characters until the next double quote is encountered. Tandem double quotes within a
+	double-quoted NEXUS word are not allowed and will be treated as the end of the first word and the beginning of the
+	next double-quoted NEXUS word. Tandem single quotes inside a double-quoted NEXUS word are saved as two separate
+	single quote characters; to embed a single quote inside a double-quoted NEXUS word, simply use the single quote by
+	itself (not paired with another tandem single quote).
+*/
+void NxsToken::GetDoubleQuotedToken()
+	{
+	bool formerEOFAllowed = eofAllowed;
+	eofAllowed = false;
+	try
+		{
+		for(;;)
+			{
+			char ch = GetNextChar();
+			if (ch == '\"')
+				break;
+			else
+				AppendToToken(ch);
+			}
+		}
+	catch (NxsX_UnexpectedEOF & x)
+		{
+		x.msg << " (end-of-file inside \" quoted statement)";
+		eofAllowed = formerEOFAllowed;
+		throw x;
+		}
+	eofAllowed = formerEOFAllowed ;
+	}
+
+/*!
+	Gets remainder of a quoted NEXUS word (the first single quote character was read in already by GetNextToken). This
+	function reads characters until the next single quote is encountered. An exception occurs if two single quotes occur
+	one after the other, in which case the function continues to gather characters until an isolated single quote is
+	found. The tandem quotes are stored as a single quote character in the token NxsString.
+*/
+void NxsToken::GetQuoted()
+	{
+	bool formerEOFAllowed = eofAllowed;
+	eofAllowed = false;
+	long fl = fileLine;
+	long fc = fileColumn;
+
+	try
+		{
+		for(;;)
+			{
+			char ch = GetNextChar();
+			if (ch == '\'')
+				{
+				ch = GetNextChar();
+				if (ch == '\'')
+					AppendToToken(ch);
+				else
+					{
+					saved = ch;
+					break;
+					}
+				}
+			else
+				AppendToToken(ch);
+			}
+		}
+	catch (NxsX_UnexpectedEOF & x)
+		{
+		x.msg << " (end-of-file inside \' quoted token that started on line " << fl<< ", column " <<fc << ')';
+		eofAllowed = formerEOFAllowed;
+		throw x;
+		}
+	eofAllowed = formerEOFAllowed ;
+	}
+
+/*!
+	Reads rest of parenthetical token (starting '(' already input) up to and including the matching ')' character.  All
+	nested parenthetical phrases will be included.
+*/
+void NxsToken::GetParentheticalToken()
+	{
+	// Set level to 1 initially.  Every ')' encountered reduces
+	// level by one, so that we know we can stop when level becomes 0.
+	//
+	int level = 1;
+	std::vector<NxsComment> prevEmbedded = embeddedComments;
+	embeddedComments.clear();
+	char ch;
+	ch = GetNextChar();
+	for(;;)
+		{
+		if (atEOF)
+			break;
+
+		if (ch == '\'')
+			{
+			AppendToToken('\'');
+			GetQuoted();
+			AppendToToken('\'');
+			ch = saved;
+			saved = '\0';
+			if (atEOF)
+				{
+				if (ch == ')' && level == 1)
+					{
+					AppendToToken(')');
+					break;
+					}
+				else
+					{
+					NxsX_UnexpectedEOF x(*this);
+					x.msg << "(end-of-file inside () statement)";
+					}
+				}
+			continue;
+			}
+		if (ch == '[')
+			{
+			GetComment();
+			assert(embeddedComments.size() == 1);
+			AppendToToken('[');
+			const std::string & body =  embeddedComments[0].GetText();
+			token.append(body.begin(), body.end());
+			AppendToToken(']');
+			embeddedComments.clear();
+
+			}
+		else
+			{
+			if (ch == ')')
+				level--;
+			else if (ch == '(')
+				level++;
+
+			AppendToToken(ch);
+			}
+
+		if (level == 0)
+			break;
+		ch = GetNextChar();
+		}
+	embeddedComments = prevEmbedded;
+	}
+
+/*!
+	Returns true if token begins with the capitalized portion of `s' and, if token is longer than `s', the remaining
+	characters match those in the lower-case portion of `s'. The comparison is case insensitive. This function should be
+	used instead of the Begins function if you wish to allow for abbreviations of commands and also want to ensure that
+	user does not type in a word that does not correspond to any command.
+*/
+bool NxsToken::Abbreviation(
+  NxsString s)	/* the comparison string */
+	{
+	int k;
+	int slen = (int)s.size();
+	int tlen = (int)token.size();
+	char tokenChar, otherChar;
+
+	// The variable mlen refers to the "mandatory" portion
+	// that is the upper-case portion of s
+	//
+	int mlen;
+	for (mlen = 0; mlen < slen; mlen++)
+		{
+		if (!isupper(s[mlen]))
+			break;
+		}
+
+	// User must have typed at least mlen characters in
+	// for there to even be a chance at a match
+	//
+	if (tlen < mlen)
+		return false;
+
+	// If user typed in more characters than are contained in s,
+	// then there must be a mismatch
+	//
+	if (tlen > slen)
+		return false;
+
+	// Check the mandatory portion for mismatches
+	//
+	for (k = 0; k < mlen; k++)
+		{
+		tokenChar = (char)toupper( token[k]);
+		otherChar = s[k];
+		if (tokenChar != otherChar)
+			return false;
+		}
+
+	// Check the auxiliary portion for mismatches (if necessary)
+	//
+	for (k = mlen; k < tlen; k++)
+		{
+		tokenChar = (char)toupper( token[k]);
+		otherChar = (char)toupper( s[k]);
+		if (tokenChar != otherChar)
+			return false;
+		}
+
+	return true;
+	}
+
+/*!
+	Returns true if token NxsString begins with the NxsString `s'. This function should be used instead of the Equals
+	function if you wish to allow for abbreviations of commands.
+*/
+bool NxsToken::Begins(
+  NxsString s,			/* the comparison string */
+  bool respect_case)	/* determines whether comparison is case sensitive */
+	{
+	unsigned k;
+	char tokenChar, otherChar;
+
+	unsigned slen = (unsigned)s.size();
+	if (slen > token.size())
+		return false;
+
+	for (k = 0; k < slen; k++)
+		{
+		if (respect_case)
+			{
+			tokenChar = token[k];
+			otherChar = s[k];
+			}
+		else
+			{
+			tokenChar = (char)toupper( token[k]);
+			otherChar = (char)toupper( s[k]);
+			}
+
+		if (tokenChar != otherChar)
+			return false;
+		}
+
+	return true;
+	}
+
+/*!
+	Reads characters from in until a complete token has been read and stored in token. GetNextToken performs a number
+	of useful operations in the process of retrieving tokens:
+~
+	o any underscore characters encountered are stored as blank spaces (unless the labile flag bit preserveUnderscores
+	  is set)
+	o if the first character of the next token is an isolated single quote, then the entire quoted NxsString is saved
+	  as the next token
+	o paired single quotes are automatically converted to single quotes before being stored
+	o comments are handled automatically (normal comments are treated as whitespace and output comments are passed to
+	  the function OutputComment which does nothing in the NxsToken class but can be overridden in a derived class to
+	  handle these in an appropriate fashion)
+	o leading whitespace (including comments) is automatically skipped
+	o if the end of the file is reached on reading this token, the atEOF flag is set and may be queried using the AtEOF
+	  member function
+	o punctuation characters are always returned as individual tokens (see the Maddison, Swofford, and Maddison paper
+	  for the definition of punctuation characters) unless the flag ignorePunctuation is set in labileFlags,
+	  in which case the normal punctuation symbols are treated just like any other darkspace character.
+~
+	The behavior of GetNextToken may be altered by using labile flags. For example, the labile flag saveCommandComments
+	can be set using the member function SetLabileFlagBit. This will cause comments of the form [&X] to be saved as
+	tokens (without the square brackets), but only for the aquisition of the next token. Labile flags are cleared after
+	each application.
+*/
+void NxsToken::GetNextToken()
+	{
+	ResetToken();
+
+	char ch = ' ';
+	if (saved == '\0' || IsWhitespace(saved))
+		{
+		// Skip leading whitespace
+
+		while( IsWhitespace(ch) && !atEOF)
+			ch = GetNextChar();
+		saved = ch;
+		}
+
+	for(;;)
+		{
+		// Break now if singleCharacterToken mode on and token length > 0.
+		//
+		if (labileFlags & singleCharacterToken && !token.empty())
+			break;
+
+		// Get next character either from saved or from input stream.
+		//
+		if (saved != '\0')
+			{
+			ch = saved;
+			saved = '\0';
+			}
+		else
+			ch = GetNextChar();
+		// Break now if we've hit EOF.
+		//
+		if (atEOF)
+			break;
+		if (strchr("\n\r \t", ch) != NULL)//!isgraph(ch))
+			{
+			if (ch == '\n' && labileFlags & newlineIsToken)
+				{
+				if (token.empty())
+					{
+					atEOL = 1;
+					AppendToToken(ch);
+					}
+				else
+					{
+					// Newline came after token, save newline until next time when it will be
+					// reported as a separate token.
+					//
+					atEOL = 0;
+					saved = ch;
+					}
+				break;
+				}
+			else
+				{
+				// Break only if we've begun adding to token (remember, if we hit a comment before a token,
+				// there might be further white space between the comment and the next token).
+				//
+				if (!token.empty())
+					break;
+				}
+			}
+		else if (ch == '_')
+			{
+			// If underscores are discovered in unquoted tokens, they should be
+			// automatically converted to spaces.
+			//
+			if (!(labileFlags & preserveUnderscores))
+				ch = ' ';
+			AppendToToken(ch);
+			}
+
+		else if (ch == '[')
+			{
+			// Get rest of comment and deal with it, but notice that we only break if the comment ends a token,
+			// not if it starts one (comment counts as whitespace). In the case of command comments
+			// (if saveCommandComment) GetComment will add to the token NxsString, causing us to break because
+			// token.size() will be greater than 0.
+			comment.clear();
+			if (GetComment())
+				break;
+			}
+		else if (IsPunctuation(ch))
+			{
+			if (ch == '(' && (labileFlags & parentheticalToken))
+				{
+				AppendToToken(ch);
+				GetParentheticalToken();
+				}
+			else if (ch == '{' && (labileFlags & curlyBracketedToken))
+				{
+				AppendToToken(ch);
+				GetCurlyBracketedToken();
+				}
+			else if (ch == '\"' && (labileFlags & doubleQuotedToken))
+				GetDoubleQuotedToken();
+			else if (ch == '\'' && token.empty())
+				GetQuoted();
+			else
+				{
+				//save if we have started a token, consider the punctuation to
+				// be the full token.
+				if (token.size() > 0)
+					saved = ch;
+				else
+					AppendToToken(ch);
+				}
+			break;
+			}
+		else
+			AppendToToken(ch);
+		}
+
+	labileFlags = 0;
+	}
+
+/*!
+	Strips whitespace from currently-stored token. Removes leading, trailing, and embedded whitespace characters.
+*/
+void NxsToken::StripWhitespace()
+	{
+	NxsString s;
+	for (unsigned j = 0; j < token.size(); j++)
+		{
+		if (IsWhitespace( token[j]))
+			continue;
+		s += token[j];
+		}
+	token = s;
+	}
+
+/*!
+	Converts all alphabetical characters in token to upper case.
+*/
+void NxsToken::ToUpper()
+	{
+	for (unsigned i = 0; i < token.size(); i++)
+		token[i] = (char)toupper(token[i]);
+	}
+
+
+void NxsToken::UseNewickTokenization(bool v)
+    {
+    if (v)
+        {
+        this->isPunctuationFn = &(NxsString::IsNewickPunctuation);
+        }
+    else
+        {
+        this->isPunctuationFn = &(NxsString::IsNexusPunctuation);
+        }
+    }    
diff --git a/lib/ncl-2.1.18/ncl/nxstoken.h b/lib/ncl-2.1.18/ncl/nxstoken.h
new file mode 100644
index 0000000..e8e77f2
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxstoken.h
@@ -0,0 +1,874 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#ifndef NCL_NXSTOKEN_H
+#define NCL_NXSTOKEN_H
+
+#include "ncl/nxsexception.h"
+class NxsToken;
+
+class NxsX_UnexpectedEOF: public NxsException
+	{
+	public:
+		NxsX_UnexpectedEOF(NxsToken &);
+	};
+
+
+/*!
+     General notes on NexusTokenizing
+
+
+  File position information (pos, line and column) refer to the end of the token.
+
+  Note 1:  the GetEmbeddedComments methods of ProcessedNxsToken and NxsToken can be tricky to use if detailed
+    position location of the comment is required.  A vector of "embedded comments" in the NCL context is a collection of
+    all comments that were encountered during a GetNextToken operation.  The behavior depends on whether the tokenizer
+    can tell if a section of text is has the potential to span comment. Potentially comment-spanning tokens have to be
+    read until a token-breaker is found.  Thus they include trailing comments.  Thus it is not always easy (or possible)
+    for client code to determine  whether a specifie comment belongs "with" a particular NEXUS token rather than the
+    previous or next token.
+    For example:
+  Text                            Result as (token, {"embedded comment"}) pairs    Explanation
+  ============================    =============================================   =====================================
+  ;a[1]b;                         (;, {}), (ab, {1}), (;, {})                     ab is a comment-spanning token
+  ;[1]a[2]b;                      (;, {}), (ab, {1, 2}), (;, {})                  tokenizer realizes that ; is always a single token
+                                                                                    so [1] is not encountered until the second GetNextToken() call.
+  a[1];[2]b;                      (a, {1}), (;, {}) (b, {2}), (;, {})             First GetNextToken() call reads "a" token until ; (thus reading "[1]")
+                                                                                    ; is a single character token, so no comments are read, thus making
+                                                                                    [2] part of the third GetNextToken call().
+
+    In some cases the comment position information and token position information may reveal the exact location of the
+    comments.  Fortunately the relative order of comments is retained and the exact position is rarely needed.\
+
+  Note 2: Using the NxsToken class with the saveCommandComments LabileFlag causes [&comment text here] comments to be
+    returned as tokens ONLY if they are not preceded by potentially comment-spanning tokens. This "feature" is new to
+	 NCL v2.1 and is the result of a bug-fix (previous versions of NCL incorrectly broke tokens at the start of any comment).
+
+  Text                      Result as in saveCommandComments mode                Explanation
+  ========================= =============================================      =====================================
+  =[&R](1,                  ("=",{}) ("&R", {}), ("(",{}), ("1",{}), (",",{})  [&R] is not in the middle of potentially-comment-spanning token.
+  a[&R]b,                   ("ab",{"&R"}), (",",{})                            [&R] is in the middle of comment-spanning token "ab"
+  a[&R],                    ("a",{"&R"}), (",",{})                             [&R] is in on the trailing end of a potentially-comment-spanning token "a"
+                                                                                the tokenizer
+    This wart makes it more tedious to deal with command comments. However it is tolerable becuase the only supported use of command
+    comments in NCL is after single-character tokens (for example after = in a tree descpription).
+
+    The NHX command comments are not processed by NCL, but they occur in contexts in which it will be possible to determine
+    the correct location of the comment  (though it is necessary to check the embedded comments when processing NHX trees):
+
+ Text                      Result as NOT IN saveCommandComments mode                        Explanation
+ ========================= ===================================================      =====================================
+ ):3.5[&&NHXtext],         (")",{}) (":", {}), ("3.5",{"&&NHXtext"}), (",",{})      "3.5" is potentially-comment-spanning, but the comment still
+                                                                                      is stored with other metadata for the same edge.
+ )[&&NHXtext],             (")",{}) (",", {"&&NHXtext"})                            NHX comment is parsed with the second token, but
+                                                                                      because , is NOT potentially-comment-spanning
+                                                                                      know that [&&NHXtext] must have preceded the comma (the
+                                                                                      token and comment column numbers would also make this clear.
+*/
+
+/*!
+ New in 2.1
+	 - See Note 2 above (bug-fix, but wart introduced).  This could lead to loss of backward compatibility if client
+		code relies of saveCommandComments in contexts in which command comments occur within potentially comment-spanning
+       tokens.
+	 - NxsComment class.
+    - Comments are stored in tokenization (the GetNextToken() call will trash the previous comments, so client code
+		must store comments if they are needed permanently).
+	 - NxsToken::SetEOFAllowed method added and SetEOFAllowed(false) is called when entering a block.  This means that
+		when parsing block contents the NxsToken tokenizer will raise an NxsException if it runs out of file (thus
+		Block reader code no longer needs to check for atEOF() constantly to issue an appropriate error).
+	 - ProcessedNxsToken class, NxsToken:ProcessAsSimpleKeyValuePairs, and NxsToken:ProcessAsCommand methods.  This makes
+		it easier to parse commands (by allowing random access to the tokens in a command). These methods are not appropriate
+		for very long commands (such as MATRIX) or commands that require fiddling with the tokenizing rules (such as disabling
+		the hyphen as a token breaker)
+	 - lazy NxsToken::GetFilePosition() and low level io operations dramatically speed up tokenization (~10-20 times faster).
+	 - some other utility functions were added, and some refactoring (delegation to NxsString) was done to clean up
+*/
+
+
+
+
+/*!
+   Storage for a comment text and (end of the comment) file position information
+*/
+class NxsComment
+	{
+	public:
+		NxsComment(const std::string & s, long lineNumber, long colNumber)
+			:body(s),
+			line(lineNumber),
+			col(colNumber)
+			{}
+		long		GetLineNumber() const
+			{
+			return line;
+			}
+		long 		GetColumnNumber() const
+			{
+			return col;
+			}
+		const std::string & GetText() const
+			{
+			return body;
+			}
+		void WriteAsNexus(std::ostream &out) const
+			{
+			out << '[' << body << ']';
+			}
+	private:
+		std::string body;
+		long line;
+		long col;
+	};
+
+
+/*!
+   Storage for a file position, line number and column number.
+*/
+class NxsTokenPosInfo
+	{
+	public:
+		NxsTokenPosInfo()
+			:pos(0),
+			line(-1),
+			col(-1)
+			{}
+		NxsTokenPosInfo(file_pos position, long lineno, long columnno)
+			:pos(position),
+			line(lineno),
+			col(columnno)
+			{}
+		NxsTokenPosInfo(const NxsToken &);
+
+		file_pos 	GetFilePosition() const
+			{
+			return pos;
+			}
+
+		long		GetLineNumber() const
+			{
+			return line;
+			}
+
+		long 		GetColumnNumber() const
+			{
+			return col;
+			}
+
+
+		file_pos	pos;	/* current file position */
+		long		line;	/* current line in file */
+		long		col;	/* column of current line */
+	};
+
+
+/*!
+	A structure for storing the name of a command and to maps of option names
+ 		to value strings.
+	Produced by ProcessedNxsToken::ParseSimpleCmd (see that commands comments for rules on how it parses a NEXUS
+	command into a NxsSimpleCommandStrings struct).
+*/
+class NxsSimpleCommandStrings
+	{
+	public:
+		typedef std::vector<std::string> VecString;
+		typedef std::list<VecString> MatString;
+		typedef std::pair<NxsTokenPosInfo, std::string> SingleValFromFile;
+		typedef std::pair<NxsTokenPosInfo, VecString > MultiValFromFile;
+		typedef std::pair<NxsTokenPosInfo, MatString > MatFromFile;
+		typedef std::map<std::string, SingleValFromFile> StringToValFromFile;
+		typedef std::map<std::string,  MultiValFromFile> StringToMultiValFromFile;
+		typedef std::map<std::string,  MatFromFile> StringToMatFromFile;
+
+		// Looks for k in opts and multiOpts. Returns all of the values
+		// 	for the command option (will be an empty vector of strings if the option was not found).
+		// Case-sensitive!
+		// If an option is in multiOpts and opts, then only the value from opts will be returned!
+		MultiValFromFile GetOptValue(const std::string &k) const
+			{
+			MultiValFromFile mvff;
+			StringToValFromFile::const_iterator s = this->opts.find(k);
+			if (s != this->opts.end())
+				{
+				const SingleValFromFile & v(s->second);
+				mvff.first = v.first;
+				mvff.second.push_back(v.second);
+				}
+			else
+				{
+				StringToMultiValFromFile::const_iterator m = this->multiOpts.find(k);
+				if (m != this->multiOpts.end())
+					{
+					const MultiValFromFile & mv(m->second);
+					mvff.first = mv.first;
+					mvff.second  = mv.second;
+					}
+				}
+			return mvff;
+			}
+
+		MatFromFile GetMatOptValue(const std::string & k) const
+			{
+			StringToMatFromFile::const_iterator mIt = this->matOpts.find(k);
+			if (mIt ==  this->matOpts.end())
+				return MatFromFile();
+			return mIt->second;
+			}
+
+		bool HasKey(const std::string k) const
+			{
+			if (this->opts.find(k) !=  this->opts.end())
+				return true;
+			return ((this->multiOpts.find(k) !=  this->multiOpts.end()) || (this->matOpts.find(k) !=  this->matOpts.end()));
+			}
+
+	  	std::string cmdName;
+	  	NxsTokenPosInfo cmdPos;
+		StringToValFromFile opts;
+		StringToMultiValFromFile multiOpts;
+		StringToMatFromFile matOpts;
+	};
+
+/*!
+   Storage for a single NEXUS token, and embedded comments, along with end-of-the-token file position information.
+*/
+class ProcessedNxsToken
+	{
+	public:
+		static void IncrementNotLast(std::vector<ProcessedNxsToken>::const_iterator & it,
+									 const std::vector<ProcessedNxsToken>::const_iterator &endIt,
+									 const char * context);
+		static NxsSimpleCommandStrings ParseSimpleCmd(const std::vector<ProcessedNxsToken> &, bool convertToLower);
+
+
+		ProcessedNxsToken(const NxsToken &t);
+
+		ProcessedNxsToken(std::string &s)
+			:token(s)
+			{}
+
+		ProcessedNxsToken(std::string &s, file_pos position,long lineno, long columnno)
+			:token(s),
+			posInfo(position, lineno, columnno)
+			{}
+
+		std::string GetToken() const
+			{
+			return token;
+			}
+
+		const std::vector<NxsComment> & GetEmbeddedComments() const
+			{
+			return embeddedComments;
+			}
+
+		NxsTokenPosInfo 	GetFilePosInfo() const
+			{
+			return posInfo;
+			}
+		const NxsTokenPosInfo & GetFilePosInfoConstRef() const
+			{
+			return posInfo;
+			}
+
+		file_pos 	GetFilePosition() const
+			{
+			return posInfo.GetFilePosition();
+			}
+
+		long		GetLineNumber() const
+			{
+			return posInfo.GetLineNumber();
+			}
+
+		long 		GetColumnNumber() const
+			{
+			return posInfo.GetColumnNumber();
+			}
+
+		bool		Equals(const char *c) const
+			{
+			return NxsString::case_insensitive_equals(token.c_str(), c);
+			}
+		bool		EqualsCaseSensitive(const char *c) const
+			{
+			return (strcmp(token.c_str(), c) == 0);
+			}
+
+		void 		SetEmbeddedComments(const std::vector<NxsComment> & c)
+			{
+			embeddedComments = c;
+			}
+
+		void WriteAsNexus(std::ostream &out) const
+			{
+			for(std::vector<NxsComment>::const_iterator cIt = embeddedComments.begin(); cIt != embeddedComments.end(); ++cIt)
+				cIt->WriteAsNexus(out);
+			out << NxsString::GetEscaped(token);
+			}
+	private:
+		std::string token;
+		NxsTokenPosInfo posInfo;
+		std::vector<NxsComment> embeddedComments; /* comments that were processed in the same GetToken operation that created this token. */
+	};
+
+/*!
+  ProcessedNxsCommand is merely of a collection of ProcessedNxsToken objects. The NxsToken object can use a ; as a
+	separator to parse of its input stream until the next ";" and return a ProcessedNxsCommand.
+
+	See NxsToken::ProcessAsCommand method.
+*/
+typedef std::vector<ProcessedNxsToken> ProcessedNxsCommand;
+bool WriteCommandAsNexus(std::ostream &, const ProcessedNxsCommand &);
+
+
+/**---------------------------------------------------------------------------------------------------------------------
+	NxsToken objects are used by NxsReader to extract words (tokens) from a NEXUS data file. NxsToken objects know to
+	correctly skip NEXUS comments and understand NEXUS punctuation, making reading a NEXUS file as simple as repeatedly
+	calling the GetNextToken() function and then interpreting the token returned. If the token object is not attached
+	to an input stream, calls to GetNextToken() will have no effect. If the token object is not attached to an output
+	stream, output comments will be discarded (i.e., not output anywhere) and calls to Write or Writeln will be
+	ineffective. If input and output streams have been attached to the token object, however, tokens are read one at a
+	time from the input stream, and comments are correctly read and either written to the output stream (if an output
+	comment) or ignored (if not an output comment). Sequences of characters surrounded by single quotes are read in as
+	single tokens. A pair of adjacent single quotes are stored as a single quote, and underscore characters are stored
+	as blanks.
+*/
+class NxsToken
+	{
+	public:
+		static std::string	EscapeString(const std::string &);
+		static bool 		NeedsQuotes(const std::string &);
+		static std::string	GetQuoted(const std::string &);
+		static void 		DemandEndSemicolon(NxsToken &token, NxsString & errormsg, const char *contextString);
+		static unsigned 	DemandPositiveInt(NxsToken &token, NxsString & errormsg, const char *contextString);
+		static std::map<std::string, std::string> ParseAsSimpleKeyValuePairs(const ProcessedNxsCommand & tv, const char *cmdName);
+
+		static std::vector<ProcessedNxsToken> Tokenize(const std::string & );
+
+		enum NxsTokenFlags	/* For use with the variable labileFlags */
+			{
+			saveCommandComments		= 0x0001,	/* if set, command comments of the form [&X] are not ignored but are instead saved as regular tokens (without the square brackets, however) */
+			parentheticalToken		= 0x0002,	/* if set, and if next character encountered is a left parenthesis, token will include everything up to the matching right parenthesis */
+			curlyBracketedToken		= 0x0004,	/* if set, and if next character encountered is a left curly bracket, token will include everything up to the matching right curly bracket */
+			doubleQuotedToken		= 0x0008,	/* if set, grabs entire phrase surrounded by double quotes */
+			singleCharacterToken	= 0x0010,	/* if set, next non-whitespace character returned as token */
+			newlineIsToken			= 0x0020,	/* if set, newline character treated as a token and atEOL set if newline encountered */
+			tildeIsPunctuation		= 0x0040,	/* if set, tilde character treated as punctuation and returned as a separate token */
+			useSpecialPunctuation	= 0x0080,	/* if set, character specified by the data member special is treated as punctuation and returned as a separate token */
+			hyphenNotPunctuation	= 0x0100,	/* if set, the hyphen character is not treated as punctutation (it is normally returned as a separate token) */
+			preserveUnderscores		= 0x0200,	/* if set, underscore characters inside tokens are not converted to blank spaces (normally, all underscores are automatically converted to blanks) */
+			ignorePunctuation		= 0x0400	/* if set, the normal punctuation symbols are treated the same as any other darkspace characters */
+			};
+
+		NxsString		errormsg;
+
+						NxsToken(std::istream &i);
+		virtual			~NxsToken();
+
+		bool			AtEOF();
+		bool			AtEOL();
+		bool			Abbreviation(NxsString s);
+		bool			Begins(NxsString s, bool respect_case = false);
+		void			BlanksToUnderscores();
+		bool			Equals(NxsString s, bool respect_case = false) const;
+		bool		EqualsCaseSensitive(const char *c) const
+			{
+			return (strcmp(token.c_str(), c) == 0);
+			}
+
+		long			GetFileColumn() const;
+		file_pos		GetFilePosition() const;
+		long			GetFileLine() const;
+		void			GetNextToken();
+		NxsString		GetToken(bool respect_case = true);
+		const char		*GetTokenAsCStr(bool respect_case = true);
+		const NxsString	&GetTokenReference() const;
+		int				GetTokenLength() const;
+		bool			IsPlusMinusToken();
+		bool			IsPunctuationToken();
+		bool			IsWhitespaceToken();
+		bool			IsPlusMinusToken(const std::string & t);
+		bool			IsPunctuationToken(const std::string & t);
+		bool			IsWhitespaceToken(const std::string & t);
+		std::map<std::string, std::string> ProcessAsSimpleKeyValuePairs(const char *cmdName);
+		void 			ProcessAsCommand(ProcessedNxsCommand *tokenVec);
+		void			ReplaceToken(const NxsString s);
+		void			ResetToken();
+		void			SetSpecialPunctuationCharacter(char c);
+		void			SetLabileFlagBit(int bit);
+		bool			StoppedOn(char ch);
+		void			StripWhitespace();
+		void			ToUpper();
+		void			Write(std::ostream &out);
+		void			Writeln(std::ostream &out);
+
+		virtual void	OutputComment(const NxsString &msg);
+
+		void			SetEOFAllowed(bool e)
+			{
+			eofAllowed = e;
+			}
+		bool			GetEOFAllowed() const
+			{
+			return eofAllowed;
+			}
+		void			SetBlockName(const char *);
+		std::string 	GetBlockName();
+		const std::vector<NxsComment> & GetEmbeddedComments() const
+			{
+			return embeddedComments;
+			}
+		char			PeekAtNextChar() const;
+		
+		/// Calling with `true` will force the NxsToken to only consider newick's
+		//		punctuation characters to be punctuation (newick's punctuation
+		//		chars are ()[]':;, this is a subset of NEXUS punctuation.
+		//	Calling with `false` will restore NEXUS punctuation rules.
+		void UseNewickTokenization(bool v);
+
+	protected:
+
+		void			AppendToComment(char ch);
+		void			AppendToToken(char ch);
+		bool			GetComment();
+		void			GetCurlyBracketedToken();
+		void			GetDoubleQuotedToken();
+		void			GetQuoted();
+		void			GetParentheticalToken();
+		bool			IsPunctuation(char ch);
+		bool			IsWhitespace(char ch);
+
+	private:
+		void AdvanceToNextCharInStream();
+		char			GetNextChar();
+		//char ReadNextChar();
+
+		std::istream	&inputStream;		/* reference to input stream from which tokens will be read */
+		signed char		nextCharInStream;
+		file_pos		posOffBy;			/* offset of the file pos (according to the stream) and the tokenizer (which is usually a character or two behind, due to saved chars */
+		file_pos		usualPosOffBy;		/* default of posOffBy.  Usually this is -1, but it can be positive if a tokenizer is created from a substring of the file */
+		long			fileLine;			/* current file line */
+		long			fileColumn;			/* current column in current line (refers to column immediately following token just read) */
+		NxsString		token;				/* the character buffer used to store the current token */
+		NxsString		comment;			/* temporary buffer used to store output comments while they are being built */
+		bool			eofAllowed;
+		signed char		saved;				/* either '\0' or is last character read from input stream */
+		bool			atEOF;				/* true if end of file has been encountered */
+		bool			atEOL;				/* true if newline encountered while newlineIsToken labile flag set */
+		char			special;			/* ad hoc punctuation character; default value is '\0' */
+		int				labileFlags;		/* storage for flags in the NxsTokenFlags enum */
+		char			whitespace[4];		/* stores the 3 whitespace characters: blank space, tab and newline */
+		std::string 	currBlock;
+		std::vector<NxsComment>		embeddedComments;
+		typedef bool (* CharPredFunc)(const char);
+		CharPredFunc    isPunctuationFn;
+	};
+
+typedef NxsToken NexusToken;
+
+
+inline ProcessedNxsToken::ProcessedNxsToken(const NxsToken &t)
+	:token(t.GetTokenReference()),
+	posInfo(t)
+	{}
+
+inline NxsTokenPosInfo::NxsTokenPosInfo(const NxsToken &t)
+	:pos(t.GetFilePosition()),
+	line(t.GetFileLine()),
+	col(t.GetFileColumn())
+	{}
+
+/*!
+	Stores the current block name (for better error reporting only).  Use NULL to clear the currBlock name.
+*/
+inline void NxsToken::SetBlockName(const char *c)
+	{
+	if (c == 0L)
+		currBlock.clear();
+	else
+		currBlock.assign(c);
+	}
+
+/*!
+	Returns the token's block name (for better error reporting)
+*/
+inline std::string NxsToken::GetBlockName()
+	{
+	return currBlock;
+	}
+
+/*!
+	Returns copy of s but with quoting according to the NEXUS Standard iff s needs to be quoted.
+*/
+inline std::string NxsToken::EscapeString(const std::string &s)
+	{
+	return NxsString::GetEscaped(s);
+	}
+
+/*!
+	Returns the token for functions that only need read only access - faster than GetToken.
+*/
+inline const NxsString &NxsToken::GetTokenReference() const
+	{
+	return token;
+	}
+
+/**
+  This function is called whenever an output comment (i.e., a comment beginning with an exclamation point) is found
+	in the data file.
+
+  This base-class version of OutputComment suppresses these messages. You can override this virtual function to display
+    the output comment in the most appropriate way for application platform you are supporting.
+*/
+inline void NxsToken::OutputComment(
+  const NxsString &)	/* the contents of the printable comment discovered in the NEXUS data file */
+	{
+	}
+
+/*!
+	Adds `ch' to end of comment NxsString.
+*/
+inline void NxsToken::AppendToComment(
+  char ch)	/* character to be appended to comment */
+	{
+	comment += ch;
+	}
+
+/*!
+	Adds `ch' to end of current token.
+*/
+inline void NxsToken::AppendToToken(
+  char ch)	/* character to be appended to token */
+	{
+	token.push_back(ch);
+	}
+
+
+/*!
+	Returns true if character supplied is considered a whitespace character. Note: treats '\n' as darkspace if labile
+	flag newlineIsToken is in effect.
+*/
+inline bool NxsToken::IsWhitespace(
+  char ch)	/* the character in question */
+	{
+	bool ws = false;
+
+	// If ch is found in the whitespace array, it's whitespace
+	//
+	if (strchr(whitespace, ch) != NULL)
+		ws = true;
+
+	// Unless of course ch is the newline character and we're currently
+	// treating newlines as darkspace!
+	//
+	if (labileFlags & newlineIsToken && ch == '\n')
+		ws = false;
+
+	return ws;
+	}
+
+/*!
+	Returns true if and only if last call to GetNextToken encountered the end-of-file character (or for some reason the
+	input stream is now out of commission).
+*/
+inline bool NxsToken::AtEOF()
+	{
+	return atEOF;
+	}
+
+/*!
+	Returns true if and only if last call to GetNextToken encountered the newline character while the newlineIsToken
+	labile flag was in effect.
+*/
+inline bool NxsToken::AtEOL()
+	{
+	return atEOL;
+	}
+
+/*!
+	Converts all blanks in token to underscore characters. Normally, underscores found in the tokens read from a NEXUS
+	file are converted to blanks automatically as they are read; this function reverts the blanks back to underscores.
+*/
+inline void NxsToken::BlanksToUnderscores()
+	{
+	token.BlanksToUnderscores();
+	}
+
+/*!
+	Returns value stored in `filecol', which keeps track of the current column in the data file (i.e., number of
+	characters since the last new line was encountered).
+*/
+inline long  NxsToken::GetFileColumn() const
+	{
+	return fileColumn;
+	}
+
+/*!
+	Returns value stored in filepos, which keeps track of the current position in the data file (i.e., number of
+	characters since the beginning of the file).  Note: for Metrowerks compiler, you must use the offset() method of
+	the streampos class to use the value returned.
+*/
+inline file_pos  NxsToken::GetFilePosition() const
+	{
+	return inputStream.rdbuf()->pubseekoff(0,std::ios::cur, std::ios::in) + posOffBy;
+	}
+
+/*!
+	Returns value stored in `fileline', which keeps track of the current line in the data file (i.e., number of new
+	lines encountered thus far).
+*/
+inline long  NxsToken::GetFileLine() const
+	{
+	return fileLine;
+	}
+
+/*!
+	Returns the data member `token'. Specifying false for`respect_case' parameter causes all characters in `token'
+	to be converted to upper case before `token' is returned. Specifying true results in GetToken returning exactly
+	what it read from the file.
+*/
+inline NxsString NxsToken::GetToken(
+  bool respect_case)	/* determines whether token is converted to upper case before being returned */
+	{
+	if (!respect_case)
+		ToUpper();
+
+	return token;
+	}
+
+/*!
+	Returns the data member `token' as a C-style string. Specifying false for`respect_case' parameter causes all
+	characters in `token' to be converted to upper case before the `token' C-string is returned. Specifying true
+	results in GetTokenAsCStr returning exactly what it read from the file.
+*/
+inline const char *NxsToken::GetTokenAsCStr(
+  bool respect_case)	/* determines whether token is converted to upper case before being returned */
+	{
+	if (!respect_case)
+		ToUpper();
+
+	return token.c_str();
+	}
+
+/*!
+	Returns token.size().
+*/
+inline int NxsToken::GetTokenLength() const
+	{
+	return (int)token.size();
+	}
+
+/*!
+	Returns true if current token is a single character and this character is either '+' or '-'.
+*/
+inline bool NxsToken::IsPlusMinusToken()
+	{
+	return IsPlusMinusToken(token);
+	}
+
+/*!
+	Returns true if t is a single character and this character is either '+' or '-'.
+*/
+inline bool NxsToken::IsPlusMinusToken(const std::string &t)
+	{
+	return (t.size() == 1 && ( t[0] == '+' || t[0] == '-') );
+	}
+
+
+/*!
+	Returns true if character supplied is considered a punctuation character. The following twenty characters are
+	considered punctuation characters:
+>
+	()[]{}/\,;:=*'"`+-<>
+>
+	Exceptions:
+~
+	o The tilde character ('~') is also considered punctuation if the tildeIsPunctuation labile flag is set
+	o The special punctuation character (specified using the SetSpecialPunctuationCharacter) is also considered
+	  punctuation if the useSpecialPunctuation labile flag is set
+	o The hyphen (i.e., minus sign) character ('-') is not considered punctuation if the hyphenNotPunctuation
+	  labile flag is set
+~
+	Use the SetLabileFlagBit method to set one or more NxsLabileFlags flags in `labileFlags'
+*/
+inline bool NxsToken::IsPunctuation(
+  char ch)	/* the character in question */
+	{
+
+	// PAUP 4.0b10
+	//  o allows ]`<> inside taxon names
+	//  o allows `<> inside taxset names
+	//
+	if (isPunctuationFn(ch))
+		{
+		if  (labileFlags & hyphenNotPunctuation)
+#			if defined(NCL_VERSION_2_STYLE_HYPHEN) && NCL_VERSION_2_STYLE_HYPHEN
+				return (ch != '-');
+#			else
+				return (ch != '-'  && ch != '+');
+#			endif
+		return true;
+		}
+	if (labileFlags & tildeIsPunctuation  && ch == '~')
+		return true;
+	return (labileFlags & useSpecialPunctuation  && ch == special);
+	}
+
+
+/*!
+	Returns true if current token is a single character and this character is a punctuation character (as defined in
+	IsPunctuation function).
+*/
+inline bool NxsToken::IsPunctuationToken()
+	{
+	return IsPunctuationToken(token);
+	}
+
+/*!
+	Returns true if t is a single character and this character is a punctuation character (as defined in
+	IsPunctuation function).
+*/
+inline bool NxsToken::IsPunctuationToken(const std::string &t)
+	{
+	return (t.size() == 1 && IsPunctuation(t[0]));
+	}
+
+
+/*!
+	Returns true if current token is a single character and this character is a whitespace character (as defined in
+	IsWhitespace function).
+*/
+inline bool NxsToken::IsWhitespaceToken()
+	{
+	return IsWhitespaceToken(token);
+	}
+
+/*!
+	Returns true if t is a single character and this character is a whitespace character (as defined in IsWhitespace function).
+*/
+inline bool NxsToken::IsWhitespaceToken(const std::string &t)
+	{
+	return (t.size() == 1 && IsWhitespace( t[0]));
+	}
+
+/*!
+	Replaces current token NxsString with s.
+*/
+inline void NxsToken::ReplaceToken(
+  const NxsString s)	/* NxsString to replace current token NxsString */
+	{
+	token = s;
+	}
+
+/*!
+	Sets token to the empty NxsString ("").
+*/
+inline void NxsToken::ResetToken()
+	{
+	token.clear();
+	embeddedComments.clear();
+	}
+
+/*!
+	Sets the special punctuation character to `c'. If the labile bit useSpecialPunctuation is set, this character will
+	be added to the standard list of punctuation symbols, and will be returned as a separate token like the other
+	punctuation characters.
+*/
+inline void NxsToken::SetSpecialPunctuationCharacter(
+  char c)	/* the character to which `special' is set */
+	{
+	special = c;
+	}
+
+/*!
+	Sets the bit specified in the variable `labileFlags'. The available bits are specified in the NxsTokenFlags enum.
+	All bits in `labileFlags' are cleared after each token is read.
+*/
+inline void NxsToken::SetLabileFlagBit(
+  int bit)	/* the bit (see NxsTokenFlags enum) to set in `labileFlags' */
+	{
+	labileFlags |= bit;
+	}
+
+/*!
+	Checks character stored in the variable saved to see if it matches supplied character `ch'. Good for checking such
+	things as whether token stopped reading characters because it encountered a newline (and labileFlags bit
+	newlineIsToken was set):
+>
+	StoppedOn('\n');
+>
+	or whether token stopped reading characters because of a punctuation character such as a comma:
+>
+	StoppedOn(',');
+>
+*/
+inline bool NxsToken::StoppedOn(
+  char ch)	/* the character to compare with saved character */
+	{
+	if (saved == ch)
+		return true;
+	else
+		return false;
+	}
+inline char NxsToken::PeekAtNextChar() const
+	{
+	return nextCharInStream;
+	}
+/*!
+	Simply outputs the current NxsString stored in `token' to the output stream `out'. Does not send a newline to the
+	output stream afterwards.
+*/
+inline void NxsToken::Write(
+  std::ostream &out)	/* the output stream to which to write token NxsString */
+	{
+	out << token;
+	}
+
+/*!
+	Simply outputs the current NxsString stored in `token' to the output stream `out'. Sends a newline to the output
+	stream afterwards.
+*/
+inline void NxsToken::Writeln(
+  std::ostream &out)	/* the output stream to which to write `token' */
+	{
+	out << token << std::endl;
+	}
+
+inline std::map<std::string, std::string> NxsToken::ProcessAsSimpleKeyValuePairs(const char *cmdName)
+	{
+	ProcessedNxsCommand tokenVec;
+	ProcessAsCommand(&tokenVec);
+	return ParseAsSimpleKeyValuePairs(tokenVec, cmdName);
+	}
+
+/*!
+	Returns true if token NxsString exactly equals `s'. If abbreviations are to be allowed, either Begins or
+	Abbreviation should be used instead of Equals.
+*/
+inline bool NxsToken::Equals(
+  NxsString s, /* the string for comparison to the string currently stored in this token */
+  bool respect_case) const	/* if true, comparison will be case-sensitive */
+	{
+	if (respect_case)
+		return (strcmp(token.c_str(), s.c_str()) == 0);
+	return NxsString::case_insensitive_equals(token.c_str(), s.c_str());
+	}
+
+#endif
diff --git a/lib/ncl-2.1.18/ncl/nxstoken.lo b/lib/ncl-2.1.18/ncl/nxstoken.lo
new file mode 100644
index 0000000..73c4e19
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxstoken.lo
@@ -0,0 +1,12 @@
+# nxstoken.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nxstoken.o'
+
+# Name of the non-PIC object
+non_pic_object='nxstoken.o'
+
diff --git a/lib/ncl-2.1.18/ncl/nxstreesblock.cpp b/lib/ncl-2.1.18/ncl/nxstreesblock.cpp
new file mode 100644
index 0000000..b721c7c
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxstreesblock.cpp
@@ -0,0 +1,2045 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+#include <climits>
+#include <sstream>
+#include <stack>
+
+#include "ncl/nxstreesblock.h"
+#include "ncl/nxsreader.h"
+using namespace std;
+#define REGRESSION_TESTING_GET_TRANS_TREE_DESC 0
+#define DEBUGGING_TREES_BLOCK 0
+enum PrevTreeTokenDesc
+		{
+		NXS_TREE_OPEN_PARENS_TOKEN,
+		NXS_TREE_CLOSE_PARENS_TOKEN,
+		NXS_TREE_COMMA_TOKEN,
+		NXS_TREE_CLADE_NAME_TOKEN,
+		NXS_TREE_COLON_TOKEN,
+		NXS_TREE_BRLEN_TOKEN
+		};
+
+NxsSimpleNode * NxsSimpleNode::FindTaxonIndex(unsigned leafIndex)
+{
+	if (leafIndex == taxIndex)
+		return this;
+	NxsSimpleNode *n = lChild;
+	while (n)
+		{
+		NxsSimpleNode * r = n->FindTaxonIndex(leafIndex);
+		if (r)
+			return r;
+		n = n->rSib;
+		}
+	return NULL;
+}
+
+//Makes the leaf with taxIndex == leafIndex a child of the root of the tree
+// \returns the node that is the new child of the root.
+NxsSimpleNode * NxsSimpleTree::RerootAt(unsigned leafIndex)
+{
+	NxsSimpleNode * newRoot = NULL;
+	if (root)
+		{
+		if (leafIndex < leaves.size())
+			newRoot = leaves[leafIndex];
+		if (newRoot == NULL)
+			newRoot = root->FindTaxonIndex(leafIndex);
+		}
+	if (newRoot == NULL)
+		{
+		NxsString eMsg;
+		eMsg << "Reroot failed. Leaf number " << (leafIndex + 1) << " was not found in the tree.";
+		throw NxsNCLAPIException(eMsg);
+		}
+	return RerootAtNode(newRoot);
+}
+
+NxsSimpleNode * NxsSimpleTree::RerootAtNode(NxsSimpleNode *newRoot)
+{
+	NxsSimpleNode * p = newRoot->edgeToPar.parent;
+	if (!p || p == root)
+		return newRoot;
+	std::stack<NxsSimpleNode *> toFlip;
+	while (p != root)
+		{
+		toFlip.push(p);
+		p = p->edgeToPar.parent;
+		}
+	while (!toFlip.empty())
+		{
+		NxsSimpleNode *subRoot = toFlip.top();
+		toFlip.pop();
+		FlipRootsChildToRoot(subRoot);
+		}
+	return newRoot;
+}
+void NxsSimpleTree::FlipRootsChildToRoot(NxsSimpleNode *subRoot)
+{
+	std::vector<NxsSimpleNode *> rc = root->GetChildren();
+	if (rc.size() < 2)
+		{
+		NCL_ASSERT(!rc.empty());
+		NCL_ASSERT(rc[0] == subRoot);
+		/* root has degree 1 delete it */
+		std::vector<NxsSimpleNode *> tmp;
+		tmp.swap(allNodes);
+		allNodes.reserve(tmp.size() - 1);
+		for (std::vector<NxsSimpleNode *>::const_iterator nIt = tmp.begin(); nIt != tmp.end(); ++nIt)
+			{
+			if (*nIt != root)
+				allNodes.push_back(*nIt);
+			}
+		delete root;
+		root = subRoot;
+		subRoot->edgeToPar.parent = NULL;
+		return;
+		}
+
+	if (rc.size() == 2)
+		{
+		/* root has degree 2 delete it */
+
+		NxsSimpleNode * formerSib = subRoot->rSib;
+		if (formerSib == NULL)
+			formerSib = root->lChild;
+		NCL_ASSERT(formerSib != subRoot);
+
+		std::vector<NxsSimpleNode *> tmp;
+		tmp.swap(allNodes);
+		allNodes.reserve(tmp.size() - 1);
+		for (std::vector<NxsSimpleNode *>::const_iterator nIt = tmp.begin(); nIt != tmp.end(); ++nIt)
+			{
+			if (*nIt != root)
+				allNodes.push_back(*nIt);
+			}
+		delete root;
+		root = NULL;
+
+		formerSib->edgeToPar.parent = subRoot;
+		if (formerSib->edgeToPar.defaultEdgeLen)
+			{
+			if (!subRoot->edgeToPar.defaultEdgeLen)
+				{
+				formerSib->edgeToPar.defaultEdgeLen = false;
+				formerSib->edgeToPar.hasIntEdgeLens = subRoot->edgeToPar.hasIntEdgeLens;
+				formerSib->edgeToPar.iEdgeLen = subRoot->edgeToPar.iEdgeLen;
+				formerSib->edgeToPar.dEdgeLen = subRoot->edgeToPar.dEdgeLen;
+				}
+			}
+		else
+			{
+			if (!subRoot->edgeToPar.defaultEdgeLen)
+				{
+				if (formerSib->edgeToPar.hasIntEdgeLens)
+					{
+					if (subRoot->edgeToPar.hasIntEdgeLens)
+						formerSib->edgeToPar.iEdgeLen += subRoot->edgeToPar.iEdgeLen;
+					else
+						{
+						formerSib->edgeToPar.hasIntEdgeLens = false;
+						formerSib->edgeToPar.dEdgeLen = subRoot->edgeToPar.dEdgeLen + (double) formerSib->edgeToPar.iEdgeLen;
+						}
+					}
+				else
+					{
+					if (subRoot->edgeToPar.hasIntEdgeLens)
+						formerSib->edgeToPar.dEdgeLen += (double)subRoot->edgeToPar.iEdgeLen;
+					else
+						formerSib->edgeToPar.dEdgeLen += subRoot->edgeToPar.dEdgeLen;
+					}
+				}
+			}
+		NxsSimpleNode * subRootRChild = subRoot->GetLastChild();
+		if (subRootRChild == NULL)
+			subRoot->lChild = formerSib;
+		else
+			subRootRChild->rSib = formerSib;
+		subRoot->rSib = NULL;
+		root = subRoot;
+		subRoot->edgeToPar.parent = NULL;
+		}
+	else
+		{
+		/* root has degree > 2, preserve it */
+		root->edgeToPar = subRoot->edgeToPar;
+		std::swap(root->edgeToPar.child, root->edgeToPar.parent);
+		NxsSimpleNode * subRootRChild = subRoot->GetLastChild();
+		if (subRootRChild == NULL)
+			subRoot->lChild = root;
+		else
+			subRootRChild->rSib = root;
+		if (root->lChild == subRoot)
+			root->lChild = subRoot->rSib;
+		else
+			{
+			NxsSimpleNode * rOtherChild = root->lChild;
+			while (rOtherChild)
+				{
+				if (rOtherChild->rSib == subRoot)
+					{
+					rOtherChild->rSib = subRoot->rSib;
+					break;
+					}
+				rOtherChild = rOtherChild->rSib;
+				NCL_ASSERT(rOtherChild); // we trip this if subRoot is not in the rsib list
+				}
+			}
+		subRoot->rSib = NULL;
+		root = subRoot;
+		subRoot->edgeToPar.parent = NULL;
+		}
+}
+
+void NxsSimpleEdge::WriteAsNewick(std::ostream &out, bool nhx) const
+	{
+	if (!defaultEdgeLen)
+		{
+		out << ':';
+		if (lenAsString.empty())
+			if (hasIntEdgeLens)
+				out << iEdgeLen;
+			else
+				out << dEdgeLen;
+		else
+			out << lenAsString;
+		}
+	for (std::vector<NxsComment>::const_iterator uc = unprocessedComments.begin(); uc != unprocessedComments.end(); ++uc)
+		out << '[' << uc->GetText() << ']';
+	if (nhx && !parsedInfo.empty())
+		{
+		out << "[&&NHX";
+		for (std::map<std::string, std::string>::const_iterator p = parsedInfo.begin(); p != parsedInfo.end(); ++p)
+			out << ':' << p->first << '=' << p->second;
+		out << ']';
+		}
+	}
+
+void NxsSimpleNode::WriteAsNewick(std::ostream &out, bool nhx, bool useLeafNames, bool escapeNames, const NxsTaxaBlockAPI *taxa) const
+	{
+	if (lChild)
+		{
+		out << '(';
+		const std::vector<NxsSimpleNode *> children = GetChildren();
+		for (std::vector<NxsSimpleNode *>::const_iterator child = children.begin(); child != children.end(); ++child)
+			{
+			if (child != children.begin())
+				out << ',';
+			(*child)->WriteAsNewick(out, nhx, useLeafNames, escapeNames, taxa);
+			}
+		out << ')';
+		if (!name.empty())
+			{
+			if (escapeNames)
+				out << NxsString::GetEscaped(name);
+			else
+				out << name;
+			}
+		else if (taxIndex != UINT_MAX)
+			out << (1 + taxIndex);
+		}
+	else
+		{
+		NCL_ASSERT (taxIndex != UINT_MAX);
+		if (useLeafNames)
+			{
+			if (name.empty() && taxa)
+				{
+				std::string n = taxa->GetTaxonLabel(taxIndex);
+				if (escapeNames)
+					out << NxsString::GetEscaped(n);
+				else
+					out << n;
+				}
+			else
+				{
+				if (escapeNames)
+					out << NxsString::GetEscaped(name);
+				else
+					out << name;
+				}
+			}
+		else
+			out << (1 + taxIndex);
+		}
+	edgeToPar.WriteAsNewick(out, nhx);
+	}
+
+void NxsSimpleNode::AddSelfAndDesToPreorder(std::vector<const NxsSimpleNode *> &p) const
+	{
+#if  0
+	p.push_back(this);
+	NxsSimpleNode * currCh = this->lChild;
+	while (currCh)
+		{
+		currCh->AddSelfAndDesToPreorder(p);
+		currCh = currCh->rSib;
+		}
+#else
+	std::stack<const NxsSimpleNode *> ndStack;
+	const NxsSimpleNode * currCh = this;
+	for (;;)
+		{
+		p.push_back(currCh);
+		if (currCh->lChild) 
+			{
+			currCh = currCh->lChild;
+			if (currCh->rSib) 
+				{
+				ndStack.push(currCh->rSib);
+				}
+			}
+		else 
+			{
+			if (ndStack.empty())
+				break;
+			currCh = ndStack.top();
+			ndStack.pop();
+			if (currCh->rSib) 
+				{
+				ndStack.push(currCh->rSib);
+				}
+			}
+		}
+#endif
+	}
+
+std::vector<const NxsSimpleNode *> NxsSimpleTree::GetPreorderTraversal() const
+	{
+	std::vector<const NxsSimpleNode *> p;
+	if (root)
+		root->AddSelfAndDesToPreorder(p);
+	return p;
+	}
+
+std::vector<std::vector<int> > NxsSimpleTree::GetIntPathDistances(bool toMRCA) const
+	{
+	if (root == NULL || root->lChild == NULL)
+		return std::vector<std::vector<int> >();
+
+	typedef std::map<unsigned, int> TaxonIndToDistMap;
+	typedef std::map<unsigned, TaxonIndToDistMap> PairwiseDistMap;
+	typedef PairwiseDistMap::iterator PairwiseDistRow;
+
+	std::map<const NxsSimpleNode *,  TaxonIndToDistMap > ndToDist;
+	const std::vector<const NxsSimpleNode *> preord = GetPreorderTraversal();
+	unsigned maxIndex = 0;
+	PairwiseDistMap pairwiseDist;
+	for (std::vector<const NxsSimpleNode *>::const_reverse_iterator nIt = preord.rbegin(); nIt != preord.rend(); ++nIt)
+		{
+		const NxsSimpleNode *nd = *nIt;
+		if (nd->lChild)
+			{
+			TaxonIndToDistMap nm;
+			ndToDist[nd] = nm;
+			TaxonIndToDistMap & tidm = ndToDist[nd];
+			const NxsSimpleNode * currChild = nd->lChild;
+			if (nd->taxIndex != UINT_MAX)
+				{
+				if (maxIndex < nd->taxIndex)
+					maxIndex = nd->taxIndex;
+				tidm[nd->taxIndex] = 0;
+				}
+			while (currChild)
+				{
+				TaxonIndToDistMap currChildEls;
+				TaxonIndToDistMap * currChildElsPtr;
+				int currEdgeLen = currChild->edgeToPar.GetIntEdgeLen();
+				if (currChild->lChild)
+					{
+					NCL_ASSERT(ndToDist.find(currChild) != ndToDist.end());
+					currChildElsPtr = &(ndToDist[currChild]);
+					}
+				else
+					{
+					if (maxIndex < currChild->taxIndex)
+						maxIndex = currChild->taxIndex;
+					currChildEls[currChild->taxIndex] = 0;
+					currChildElsPtr = &currChildEls;
+					}
+				for (TaxonIndToDistMap::const_iterator i = tidm.begin(); i != tidm.end(); ++i)
+					{
+					const unsigned iIndex = i->first;
+					const int idist = i->second;
+					for (TaxonIndToDistMap::const_iterator j = currChildElsPtr->begin(); j != currChildElsPtr->end(); ++j)
+						{
+						const unsigned jIndex = j->first;
+						const int jdist = j->second;
+						const int ndToJDist = jdist + currEdgeLen;
+						if (toMRCA)
+							{
+							PairwiseDistRow  iRow = pairwiseDist.find(iIndex);
+							PairwiseDistRow  jRow = pairwiseDist.find(jIndex);
+							NCL_ASSERT(iRow == pairwiseDist.end() || (iRow->second.find(jIndex) == iRow->second.end()));
+							NCL_ASSERT(jRow == pairwiseDist.end() || (jRow->second.find(iIndex) == jRow->second.end()));
+							pairwiseDist[iIndex][jIndex] = idist;
+							pairwiseDist[jIndex][iIndex] = ndToJDist;
+							}
+						else
+							{
+							const unsigned fIndex = (iIndex < jIndex ? iIndex : jIndex);
+							const unsigned sIndex = (iIndex < jIndex ? jIndex : iIndex);
+							PairwiseDistRow  r = pairwiseDist.find(fIndex);
+							const bool found = (r != pairwiseDist.end() && (r->second.find(sIndex) != r->second.end()));
+							if (!found)
+								pairwiseDist[fIndex][sIndex] = currEdgeLen + idist + jdist;
+							}
+						}
+					}
+				for (TaxonIndToDistMap::const_iterator j = currChildElsPtr->begin(); j != currChildElsPtr->end(); ++j)
+					tidm[j->first] = currEdgeLen + j->second;
+				currChild = currChild->rSib;
+				}
+			}
+		}
+	if (maxIndex == 0)
+		return std::vector<std::vector<int> >();
+	std::vector<int> toTipDistRow(maxIndex+1, INT_MAX);
+	std::vector<std::vector<int> > pathDistMat(maxIndex+1, toTipDistRow);
+	for (unsigned diagInd = 0; diagInd <= maxIndex; ++diagInd)
+		pathDistMat[diagInd][diagInd] = 0;
+
+	for (PairwiseDistMap::const_iterator iit = pairwiseDist.begin(); iit != pairwiseDist.end(); ++iit)
+		{
+		const unsigned iInd = iit->first;
+		const TaxonIndToDistMap & toDistMap = iit->second;
+		for (TaxonIndToDistMap::const_iterator jit = toDistMap.begin(); jit != toDistMap.end(); ++jit)
+			{
+			const unsigned jInd = jit->first;
+			if (jInd != iInd)
+				{
+				const int d = jit->second;
+				pathDistMat[iInd][jInd] = d;
+				pathDistMat[jInd][iInd] = d;
+				}
+			}
+		}
+
+	return pathDistMat;
+	}
+
+/* if toMRCA is true the the row i col j element will be the distanc from tip i
+ to the MRCA of (i and j)
+*/
+std::vector<std::vector<double> > NxsSimpleTree::GetDblPathDistances(bool toMRCA) const
+	{
+	if (root == NULL || root->lChild == NULL)
+		return std::vector<std::vector<double> >();
+
+	typedef std::map<unsigned, double> TaxonIndToDistMap;
+	typedef std::map<unsigned, TaxonIndToDistMap> PairwiseDistMap;
+	typedef PairwiseDistMap::iterator PairwiseDistRow;
+
+	std::map<const NxsSimpleNode *,  TaxonIndToDistMap > ndToDist;
+	const std::vector<const NxsSimpleNode *> preord = GetPreorderTraversal();
+	unsigned maxIndex = 0;
+	PairwiseDistMap pairwiseDist;
+	for (std::vector<const NxsSimpleNode *>::const_reverse_iterator nIt = preord.rbegin(); nIt != preord.rend(); ++nIt)
+		{
+		const NxsSimpleNode *nd = *nIt;
+		if (nd->lChild)
+			{
+			TaxonIndToDistMap nm;
+			ndToDist[nd] = nm;
+			TaxonIndToDistMap & tidm = ndToDist[nd];
+			if (nd->taxIndex != UINT_MAX)
+				{
+				if (maxIndex < nd->taxIndex)
+					maxIndex = nd->taxIndex;
+				tidm[nd->taxIndex] = 0.0;
+				}
+			// loop over all of the children of nd
+			const NxsSimpleNode * currChild = nd->lChild;
+			while (currChild)
+				{
+				TaxonIndToDistMap currChildEls;
+				TaxonIndToDistMap * currChildElsPtr;
+				double currEdgeLen = currChild->edgeToPar.GetDblEdgeLen();
+				if (currChild->lChild)
+					{
+					NCL_ASSERT(ndToDist.find(currChild) != ndToDist.end());
+					currChildElsPtr = &(ndToDist[currChild]);
+					}
+				else
+					{
+					if (maxIndex < currChild->taxIndex)
+						maxIndex = currChild->taxIndex;
+					currChildEls[currChild->taxIndex] = 0.0;
+					currChildElsPtr = &currChildEls;
+					}
+				//for each leaf i ( the the previously encountered descendants of nd)...
+				for (TaxonIndToDistMap::const_iterator i = tidm.begin(); i != tidm.end(); ++i)
+					{
+					// compare it to leaf j (descendant of currChild).
+					const unsigned iIndex = i->first;
+					const double idist = i->second;
+					for (TaxonIndToDistMap::const_iterator j = currChildElsPtr->begin(); j != currChildElsPtr->end(); ++j)
+						{
+						const unsigned jIndex = j->first;
+						const double jdist = j->second;
+						const double ndToJDist = jdist + currEdgeLen;
+						if (toMRCA)
+							{
+							PairwiseDistRow  iRow = pairwiseDist.find(iIndex);
+							PairwiseDistRow  jRow = pairwiseDist.find(jIndex);
+							NCL_ASSERT(iRow == pairwiseDist.end() || (iRow->second.find(jIndex) == iRow->second.end()));
+							NCL_ASSERT(jRow == pairwiseDist.end() || (jRow->second.find(iIndex) == jRow->second.end()));
+							pairwiseDist[iIndex][jIndex] = idist;
+							pairwiseDist[jIndex][iIndex] = ndToJDist;
+							}
+						else
+							{
+							const unsigned fIndex = (iIndex < jIndex ? iIndex : jIndex);
+							const unsigned sIndex = (iIndex < jIndex ? jIndex : iIndex);
+							PairwiseDistRow  r = pairwiseDist.find(fIndex);
+							const bool found = (r != pairwiseDist.end() && (r->second.find(sIndex) != r->second.end()));
+							if (!found)
+								pairwiseDist[fIndex][sIndex] = idist + ndToJDist;
+							}
+						}
+					}
+				for (TaxonIndToDistMap::const_iterator j = currChildElsPtr->begin(); j != currChildElsPtr->end(); ++j)
+					tidm[j->first] = currEdgeLen + j->second;
+				currChild = currChild->rSib;
+				}
+			}
+		}
+	if (maxIndex == 0)
+		return std::vector<std::vector<double> >();
+	std::vector<double> toTipDistRow(maxIndex+1, DBL_MAX);
+	std::vector<std::vector<double> > pathDistMat(maxIndex+1, toTipDistRow);
+	for (unsigned diagInd = 0; diagInd <= maxIndex; ++diagInd)
+		pathDistMat[diagInd][diagInd] = 0.0;
+
+
+	for (PairwiseDistMap::const_iterator iit = pairwiseDist.begin(); iit != pairwiseDist.end(); ++iit)
+		{
+		const unsigned iInd = iit->first;
+		pathDistMat[iInd][iInd] = 0.0;
+		const TaxonIndToDistMap & toDistMap = iit->second;
+		for (TaxonIndToDistMap::const_iterator jit = toDistMap.begin(); jit != toDistMap.end(); ++jit)
+			{
+			const unsigned jInd = jit->first;
+			const double d = jit->second;
+			pathDistMat[iInd][jInd] = d;
+			if (!toMRCA)
+				pathDistMat[jInd][iInd] = d;
+			}
+		}
+
+	return pathDistMat;
+	}
+
+std::string parseNHXComment(const std::string comment, std::map<std::string, std::string> *infoMap)
+	{
+	if (comment.length() < 6 || comment[0] != '&' || comment[1] != '&' || comment[2] != 'N' ||comment[3] != 'H' || comment[4] != 'X' )
+		return comment;
+	size_t colonPos = comment.find(':', 5);
+	if (colonPos == string::npos)
+		return comment.substr(5, string::npos);
+	for (;;)
+		{
+		size_t eqPos = comment.find('=', colonPos);
+		if (eqPos == string::npos || (eqPos <= (colonPos + 1)))
+			return comment.substr(colonPos, string::npos);
+		std::string key = comment.substr(colonPos + 1, eqPos - 1 - colonPos);
+		colonPos = comment.find(':', eqPos + 1);
+		if (colonPos == eqPos + 1)
+			{
+			if (infoMap)
+				(*infoMap)[key] = string();
+			}
+		else if (colonPos == string::npos)
+			{
+			std::string lastVal = comment.substr(eqPos + 1);
+			if (infoMap)
+				(*infoMap)[key] = lastVal;
+			return std::string();
+			}
+		else
+			{
+			std::string value = comment.substr(eqPos + 1, colonPos - eqPos - 1);
+			if (infoMap)
+				(*infoMap)[key] = value;
+			}
+		}
+	}
+
+void NxsSimpleEdge::DealWithNexusComments(const std::vector<NxsComment> & ecs, bool NHXComments)
+	{
+	for (std::vector<NxsComment>::const_iterator ecsIt = ecs.begin(); ecsIt != ecs.end(); ++ecsIt)
+		{
+		if (NHXComments)
+			{
+			std::string ns = ecsIt->GetText();
+			std::map<std::string, std::string> currCmt;
+			std::string unparsed = parseNHXComment(ns, &currCmt);
+			for (std::map<std::string, std::string>::const_iterator c = currCmt.begin(); c != currCmt.end(); ++c)
+				{
+				const std::string & k = c->first;
+				const std::string & v = c->second;
+				this->parsedInfo[k] = v;
+				}
+			if (!unparsed.empty())
+				{
+				if (unparsed.length() == ns.length())
+					this->unprocessedComments.push_back(*ecsIt);
+				else
+					{
+					NxsComment nc(unparsed, ecsIt->GetLineNumber(), ecsIt->GetColumnNumber());
+					this->unprocessedComments.push_back(nc);
+					}
+				}
+			}
+		else
+			this->unprocessedComments.push_back(*ecsIt);
+		}
+	}
+
+void NxsSimpleTree::Initialize(const NxsFullTreeDescription & td)
+	{
+	if (!td.IsProcessed())
+		throw NxsNCLAPIException("A tree description must be processed by ProcessTree before calling NxsSimpleTree::NxsSimpleTree");
+	Clear();
+	std::string s;
+	const std::string & n = td.GetNewick();
+	s.reserve(n.length() + 1);
+	s.assign(n.c_str());
+	s.append(1, ';');
+	istringstream newickstream(s);
+	NxsToken token(newickstream);
+	if (td.RequiresNewickNameTokenizing())
+		{
+		token.UseNewickTokenization(true);
+		}
+	token.SetEOFAllowed(false);
+	realEdgeLens = td.SomeEdgesHaveLengths() && (! td.EdgeLengthsAreAllIntegers());
+	const bool NHXComments = td.HasNHXComments();
+	NxsString emsg;
+	double lastFltEdgeLen;
+	long lastIntEdgeLen;
+	long currTaxNumber;
+	token.GetNextToken();
+	NCL_ASSERT(token.Equals("("));
+	root = AllocNewNode(0L);
+	NxsSimpleNode * currNd = root;
+	NxsSimpleEdge * currEdge = &(currNd->edgeToPar);
+	NxsSimpleNode * tmpNode;
+	bool prevInternalOrLength;
+	bool currInternalOrLength = false;
+	for (;;)
+		{
+		currEdge->DealWithNexusComments(token.GetEmbeddedComments(), NHXComments);
+		if (token.Equals(";"))
+			{
+			if (currNd != root)
+				throw NxsNCLAPIException("Semicolon found before the end of the tree description.  This means that more \"(\" characters  than \")\"  were found.");
+			break;
+			}
+		const NxsString & tstr = token.GetTokenReference();
+		const char * t = tstr.c_str();
+		bool handled;
+		handled = false;
+		prevInternalOrLength = currInternalOrLength;
+		currInternalOrLength = false;
+
+		if (tstr.length() == 1)
+			{
+			handled = true;
+			if (t[0] == '(')
+				{
+				tmpNode = AllocNewNode(currNd);
+				currNd->AddChild(tmpNode);
+				currNd = tmpNode;
+				currEdge = &(currNd->edgeToPar);
+				}
+			else if (t[0] == ')')
+				{
+				currNd = currNd->GetParent();
+				NCL_ASSERT(currNd);
+				currEdge = &(currNd->edgeToPar);
+				currInternalOrLength = true;
+				}
+			else if (t[0] == ':')
+				{
+				token.SetLabileFlagBit(NxsToken::hyphenNotPunctuation); // this allows us to deal with sci. not. in branchlengths (and negative branch lengths).
+				token.GetNextToken();
+				currEdge->DealWithNexusComments(token.GetEmbeddedComments(), NHXComments);
+				t = token.GetTokenReference().c_str();
+				if (realEdgeLens)
+					{
+					if (!NxsString::to_double(t, &lastFltEdgeLen))
+						{
+						emsg << "Expecting a number as a branch length. Found " << tstr;
+						throw NxsException(emsg, token);
+						}
+					currEdge->SetDblEdgeLen(lastFltEdgeLen, t);
+					}
+				else
+					{
+					if (!NxsString::to_long(t, &lastIntEdgeLen))
+						{
+						emsg << "Expecting a number as a branch length. Found " << tstr;
+						throw NxsException(emsg, token);
+						}
+					currEdge->SetIntEdgeLen((int)lastIntEdgeLen, t);
+					}
+				currInternalOrLength = true;
+				}
+			else if (t[0] == ',')
+				{
+				currNd = currNd->GetParent();
+				NCL_ASSERT(currNd);
+				tmpNode = AllocNewNode(currNd);
+				currNd->AddChild(tmpNode);
+				currNd = tmpNode;
+				currEdge = &(currNd->edgeToPar);
+				}
+			else
+				handled = false;
+			}
+		if (!handled)
+			{
+			bool wasReadAsNumber = NxsString::to_long(t, &currTaxNumber);
+			if (wasReadAsNumber)
+				{
+				if (currTaxNumber < 1)
+					{
+					if (!prevInternalOrLength)
+						{
+						emsg << "Expecting a taxon number greater than 1. Found " << tstr;
+						throw NxsException(emsg, token);
+						}
+					wasReadAsNumber = false;
+					}
+				}
+			if (wasReadAsNumber)
+				{
+				currNd->taxIndex = (unsigned)currTaxNumber - 1;
+				if (currNd->lChild == NULL)
+					{
+					while (currNd->taxIndex >= leaves.size())
+						leaves.push_back(0L);
+					leaves[currNd->taxIndex] = currNd;
+					}
+				}
+			else
+				currNd->name = t;
+			}
+		token.GetNextToken();
+		}
+	}
+unsigned NxsTreesBlock::TreeLabelToNumber(const std::string & name) const
+	{
+	NxsString r(name.c_str());
+	r.ToUpper();
+	std::map<std::string, unsigned>::const_iterator cntiIt = capNameToInd.find(r);
+	if (cntiIt == capNameToInd.end())
+		return 0;
+	return cntiIt->second + 1;
+	}
+unsigned NxsTreesBlock::GetMaxIndex() const
+	{
+	if (trees.size() == 0)
+		return UINT_MAX;
+	return (unsigned)trees.size() - 1;
+	}
+/*!
+ Returns the number of indices that correspond to the label (and the number
+ of items that would be added to *inds if inds points to an empty set).
+*/
+unsigned NxsTreesBlock::GetIndicesForLabel(const std::string &label, NxsUnsignedSet *inds) const
+	{
+	NxsString emsg;
+	const unsigned numb = TreeLabelToNumber(label);
+	if (numb > 0)
+		{
+		if (inds)
+			inds->insert(numb - 1);
+		return 1;
+		}
+	return GetIndicesFromSetOrAsNumber(label, inds, treeSets, GetMaxIndex(), "tree");
+	}
+bool NxsTreesBlock::AddNewIndexSet(const std::string &label, const NxsUnsignedSet & inds)
+	{
+	NxsString  nlabel(label.c_str());
+	const bool replaced = treeSets.count(nlabel) > 0;
+	treeSets[nlabel] = inds;
+	return replaced;
+	}
+/*!
+	Returns true if this set replaces an older definition.
+*/
+bool NxsTreesBlock::AddNewPartition(const std::string &label, const NxsPartition & inds)
+	{
+	NxsString ls(label.c_str());
+	bool replaced = treePartitions.count(ls) > 0;
+	treePartitions[ls] = inds;
+	return replaced;
+	}
+/*!
+	Initializes `NCL_BLOCKTYPE_ATTR_NAME' to "TREES", `ntrees' to 0, `defaultTree' to 0, and `taxa' to `tb'. Assumes `tb' is non-NULL.
+*/
+NxsTreesBlock::NxsTreesBlock(
+  NxsTaxaBlockAPI *tb)	/* the NxsTaxaBlockAPI object to be queried for taxon names appearing in tree descriptions */
+  :NxsTaxaBlockSurrogate(tb, NULL),
+  processedTreeValidationFunction(NULL),
+  ptvArg(NULL)
+	{
+	NCL_BLOCKTYPE_ATTR_NAME = "TREES";
+	defaultTreeInd = UINT_MAX;
+	writeTranslateTable = true;
+	allowImplicitNames = false;
+	useNewickTokenizingDuringParse = false;
+	treatIntegerLabelsAsNumbers = false;
+	processAllTreesDuringParse = true;
+	writeFromNodeEdgeDataStructure = false;
+	validateInternalNodeLabels = true;
+	treatAsRootedByDefault = true;
+	allowNumericInterpretationOfTaxLabels = true;
+	}
+/*!
+	Clears `translateList', `rooted', `treeName' and `treeDescription'.
+*/
+NxsTreesBlock::~NxsTreesBlock()
+	{
+	}
+/*!
+	Makes data member `taxa' point to `tb' rather than the NxsTaxaBlockAPI object it was previously pointing to. Assumes
+	`tb' is non-NULL.
+*/
+void NxsTreesBlock::ReplaceTaxaBlockPtr(
+  NxsTaxaBlockAPI *tb)		/* pointer to new NxsTaxaBlockAPI object (does not attempt to delete the object previously pointed to) */
+	{
+	NCL_ASSERT(tb != NULL);
+	taxa = tb;
+	}
+/*! \returns the description of the tree stored at position `i' in `treeDescription'. Assumes that `i' will be in the
+	range [0..`ntrees').
+
+	in NCL version 2.1 and greater, this newick string is guaranteed to use taxon numbers (1-based)
+	in the newick string.  This makes it easier to parse.
+*/
+NxsString NxsTreesBlock::GetTreeDescription(
+  unsigned i)	/* the index of the tree for which the description is to be returned */
+	{
+	return NxsString(GetFullTreeDescription(i).GetNewick().c_str());
+	}
+/*!
+	Returns true if the `i'th tree (0-offset) is rooted, false otherwise. Assumes that `i' will be in the
+	range [0..ntrees).
+*/
+bool NxsTreesBlock::IsRootedTree(
+  unsigned i)	/* the index of the tree in question */
+  	{
+	return GetFullTreeDescription(i).IsRooted();
+	}
+/*!
+	Returns the name of the tree stored at position `i' in `treeName'. Assumes that `i' will be in the range
+	[0..`ntrees').
+*/
+NxsString NxsTreesBlock::GetTreeName(
+  unsigned i)	/* the index of the tree for which the name is to be returned */
+	{
+	return NxsString(GetFullTreeDescription(i).GetName().c_str());
+	}
+/*!
+	Returns true if the `i'th tree (0-offset) is the default tree, false otherwise. Assumes that `i' will be in the
+	range [0..ntrees).
+*/
+bool NxsTreesBlock::IsDefaultTree(
+  unsigned i)	/* the index of the tree in question */
+	{
+	return (i == GetNumDefaultTree());
+	}
+const NxsFullTreeDescription & NxsTreesBlock::GetFullTreeDescription(unsigned i) const
+	{
+	NCL_ASSERT(i < trees.size());
+	return trees.at(i);
+	}
+/*!
+	This function outputs a brief report of the contents of this block. Overrides the abstract virtual function in the
+	base class.
+*/
+void NxsTreesBlock::Report(
+  std::ostream &out) NCL_COULD_BE_CONST /* the output stream to which to write the report */ /*v2.1to2.2 1 */
+	{
+	const unsigned ntrees = GetNumTrees();
+	out << '\n' <<  NCL_BLOCKTYPE_ATTR_NAME << " block contains ";
+	if (ntrees == 0)
+		{
+		out << "no trees" << endl;
+		return;
+		}
+	if (ntrees == 1)
+		out << "one tree" << endl;
+	else
+		out << ntrees << " trees" << endl;
+	for (unsigned k = 0; k < ntrees; k++)
+		{
+		const NxsFullTreeDescription & tree = GetFullTreeDescription(k);
+		out << "    " << (k+1) << "    " << tree.GetName();
+		out << "    (";
+		if (tree.IsRooted())
+			out << "rooted";
+		else
+			out << "unrooted";
+		if (defaultTreeInd == k)
+			out << ",default tree)" << endl;
+		else
+			out << ')' << endl;
+		}
+	}
+/*!
+	Outputs a brief description of this block's contents to the referenced NxsString. An example of the output of this
+	command is shown below:
+>
+	TREES block contains 102 trees
+>
+*/
+void NxsTreesBlock::BriefReport(
+  NxsString &s) NCL_COULD_BE_CONST /* reference to the string in which to store the contents of the brief report */ /*v2.1to2.2 1 */
+	{
+	const unsigned ntrees = GetNumTrees();
+	s << "\n\n" << NCL_BLOCKTYPE_ATTR_NAME << " block contains ";
+	if (ntrees == 0)
+		s += "no trees\n";
+	else if (ntrees == 1)
+		s += "one tree\n";
+	else
+		s << ntrees << " trees\n";
+	}
+/*!
+	Flushes `treeName', `treeDescription', `translateList' and `rooted', and sets `ntrees' and `defaultTree' both to 0
+	in preparation for reading a new TREES block.
+*/
+void NxsTreesBlock::Reset()
+	{
+	NxsBlock::Reset();
+	ResetSurrogate();
+	defaultTreeInd = UINT_MAX;
+	trees.clear();
+	capNameToInd.clear();
+	treeSets.clear();
+	treePartitions.clear();
+	constructingTaxaBlock = false;
+	newtaxa = false;
+	}
+/*!
+	Returns the 0-offset index of the default tree, which will be 0 if there is only one tree stored or no trees
+	stored. If more than one tree is stored, the default tree will be the one specifically indicated by the user (using
+	an asterisk in the data file), or 0 if the user failed to specify.
+*/
+unsigned NxsTreesBlock::GetNumDefaultTree()
+	{
+	return (defaultTreeInd == UINT_MAX ? 0 : defaultTreeInd);
+	}
+/*!
+	Returns the number of trees stored in this NxsTreesBlock object.
+*/
+unsigned NxsTreesBlock::GetNumTrees() const
+	{
+	return (unsigned)trees.size();
+	}
+/*!
+	Returns the number of trees stored in this NxsTreesBlock object.
+*/
+unsigned NxsTreesBlock::GetNumTrees()
+	{
+	return (unsigned)trees.size();
+	}
+void NxsTreesBlock::WriteTranslateCommand(std::ostream & out) const
+	{
+	NCL_ASSERT(taxa);
+	out << "    TRANSLATE" << "\n";
+	const unsigned nt = taxa->GetNTaxTotal();
+	for (unsigned i = 0; i < nt; ++i)
+		{
+		if (i > 0)
+				out << ",\n";
+		out << "        " << i + 1 << ' ' << NxsString::GetEscaped(taxa->GetTaxonLabel(i));
+		}
+	out << ";\n";
+	}
+
+void NxsTreesBlock::WriteTreesCommand(std::ostream & out) const
+	{
+	if (constructingTaxaBlock)
+		{
+		// this check is intended to make sure that ProcessTree really behaves
+		//	as a const function.
+		// If we are constructingTaxaBlock, then the it can modify the contained taxa block
+		throw NxsNCLAPIException("WriteTreesCommand block cannot be called while the Trees Block is still being constructed");
+		}
+	NxsTreesBlock *ncthis = const_cast<NxsTreesBlock *>(this);
+	NxsSimpleTree nst(0, 0.0);
+	const bool useLeafNames = !(this->writeTranslateTable);
+	for (unsigned k = 0; k < trees.size(); k++)
+		{
+#		if defined REGRESSION_TESTING_GET_TRANS_TREE_DESC
+			NxsTreesBlock *nc = const_cast<NxsTreesBlock *>(this);
+			NxsString transTreeDesc = nc->GetTranslatedTreeDescription(k);
+#		endif
+		NxsFullTreeDescription & treeDesc = trees.at(k);
+		ncthis->ProcessTree(treeDesc);
+		const std::string & name = treeDesc.GetName();
+		out << "    TREE ";
+		if (k == defaultTreeInd)
+			out << "* ";
+		if (name.length() == 0)
+			out <<  "UnnamedTree = [&";
+		else
+			out << NxsString::GetEscaped(name) << " = [&";
+		out << (treeDesc.IsRooted() ? 'R' : 'U');
+		out << ']';
+		if (writeFromNodeEdgeDataStructure)
+			{
+			nst.Initialize(treeDesc);
+			nst.WriteAsNewick(out, true, useLeafNames, true, taxa);
+			}
+		else
+			out << treeDesc.GetNewick();
+		out << ";\n";
+		
+
+#		if defined(PHYLOBASE_TESTING)
+			const NxsTreesBlock * treeBlock = this;
+		    std::vector<std::string> treeNames;      //vector of tree names
+		    const NxsTaxaBlockAPI * taxaB = GetTaxaBlockPtr(0L);
+		    unsigned ntax = taxaB->GetNTax();
+
+
+        	std::vector<unsigned> parentVector; //Index of the parent. 0 means no parent.
+    	    std::vector<double> branchLengthVector; 
+			parentVector.clear();
+			branchLengthVector.clear();
+			const NxsFullTreeDescription & ftd = treeBlock->GetFullTreeDescription(k); 
+			treeNames.push_back(ftd.GetName());
+			NxsSimpleTree simpleTree(ftd, -1, -1.0);
+			std::vector<const NxsSimpleNode *> ndVector =  simpleTree.GetPreorderTraversal();
+			unsigned internalNdIndex = ntax;
+			for (std::vector<const NxsSimpleNode *>::const_iterator ndIt = ndVector.begin(); ndIt != ndVector.end(); ++ndIt)
+				{
+				NxsSimpleNode * nd = (NxsSimpleNode *) *ndIt;
+				unsigned nodeIndex;
+				if (nd->IsTip())
+					{
+					nodeIndex = nd->GetTaxonIndex();
+					std::cout << " leaf node # = " <<  nodeIndex << '\n';
+					}
+				else
+					{
+					nodeIndex = internalNdIndex++;
+					nd->SetTaxonIndex(nodeIndex);
+					std::cout << " internal node # = " << nd->GetTaxonIndex()  << '\n';
+					}
+				if (parentVector.size() < nodeIndex + 1)
+					{
+					parentVector.resize(nodeIndex + 1);
+					}
+				if (branchLengthVector.size() < nodeIndex + 1)
+					{
+					branchLengthVector.resize(nodeIndex + 1);
+					}
+				NxsSimpleEdge edge = nd->GetEdgeToParent();
+
+				NxsSimpleNode * par = 0L;
+				par = (NxsSimpleNode *) edge.GetParent();
+				if (par != 0L)
+					{
+					parentVector[nodeIndex] = 1 + par->GetTaxonIndex();
+					branchLengthVector[nodeIndex] = edge.GetDblEdgeLen();
+					}
+				else
+					{
+					parentVector[nodeIndex] = 0;
+					branchLengthVector[nodeIndex] = -1.0;
+					}
+				}
+			std::cout << "Parents = [";
+			for (std::vector<unsigned>::const_iterator nIt = parentVector.begin(); nIt != parentVector.end(); ++nIt)
+				{
+				std::cout << *nIt << ", ";				
+				}
+			std::cout << "]\nbranch lengths = [";
+			for (std::vector<double>::const_iterator nIt = branchLengthVector.begin(); nIt != branchLengthVector.end(); ++nIt)
+				{
+				std::cout << *nIt << ", ";				
+				}
+			std::cout << "]\n";
+#endif
+		}
+	}
+/*!
+	Writes contents of this block in NEXUS format to `out'.
+*/
+void NxsTreesBlock::WriteAsNexus(std::ostream &out) const
+	{
+	if (GetNumTrees() == 0)
+		return;
+	out << "BEGIN TREES;\n";
+	WriteBasicBlockCommands(out);
+	if (this->writeTranslateTable)
+		WriteTranslateCommand(out);
+	WriteTreesCommand(out);
+	WriteSkippedCommands(out);
+	out << "END;\n";
+	}
+NxsTreesBlock *NxsTreesBlockFactory::GetBlockReaderForID(const std::string & idneeded, NxsReader *reader, NxsToken *)
+	{
+	if (reader == NULL || idneeded != "TREES")
+		return NULL;
+	NxsTreesBlock * nb = new NxsTreesBlock(NULL);
+	nb->SetCreateImpliedBlock(true);
+	nb->SetImplementsLinkAPI(true);
+	return nb;
+	}
+void NxsTreesBlock::ConstructDefaultTranslateTable(NxsToken &token, const char * cmd)
+	{
+	if (taxa == NULL)
+		{
+		if (nxsReader == NULL)
+			GenerateNxsException(token, "A Taxa block must be read before the Trees block can be read.");
+		unsigned nTb;
+		nxsReader->GetTaxaBlockByTitle(NULL, &nTb);
+		AssureTaxaBlock(nTb == 0 && allowImplicitNames && createImpliedBlock, token, cmd);
+		}
+	const unsigned nt = taxa->GetNTaxTotal();
+	if (nt == 0)
+		{
+		if (allowImplicitNames)
+			{
+			if (nexusReader)
+				nexusReader->NexusWarnToken("A TAXA block should be read before the TREES block (but no TAXA block was found).  Taxa will be inferred from their usage in the TREES block.", NxsReader::AMBIGUOUS_CONTENT_WARNING , token);
+			constructingTaxaBlock = true;
+			newtaxa = true;
+			}
+		else
+			GenerateNxsException(token, "Taxa block must be read before the Trees block can be read.");
+		}
+	if (!constructingTaxaBlock)
+		{
+		for (unsigned i = 0; i < nt; ++i)
+			{
+			NxsString s;
+			s += (i + 1);
+			capNameToInd[s] = i;
+			NxsString t(taxa->GetTaxonLabel(i).c_str());
+			t.ToUpper();
+			capNameToInd[t] = i;
+			}
+		}
+	}
+void NxsTreesBlock::HandleTranslateCommand(NxsToken &token)
+	{
+	for (unsigned n = 0;; ++n)
+		{
+		token.GetNextToken();
+		if (token.Equals(";"))
+			break;
+		NxsString key(token.GetTokenReference().c_str());
+		unsigned keyInd = taxa->TaxLabelToNumber(key);
+		token.GetNextToken();
+		NxsString value(token.GetTokenReference().c_str());
+		unsigned valueInd = taxa->TaxLabelToNumber(value);
+		if (valueInd == 0)
+			{
+			if (constructingTaxaBlock)
+				{
+				taxa->SetNtax(n+1);
+				// bug fix March 10, 2009 we had had an erroneous "+ 1" added to the index
+				unsigned newVal = taxa->AddTaxonLabel(value);
+				NxsString numV;
+				numV += (1 + newVal);
+				if (capNameToInd.find(numV) == capNameToInd.end())
+					capNameToInd[numV] = newVal;
+				// bug fix March 10, 2009.  When we get no taxa block, but a translate
+				//	table we need to add the label to the translation table (because the
+				//	call to ConstructDefaultTranslateTable will not have been able
+				//	to fill in any taxon labels)
+				value.ToUpper();
+				if (capNameToInd.find(value) == capNameToInd.end())
+					capNameToInd[value] = newVal;
+
+				}
+			else if (nexusReader)
+				{
+				errormsg << "Unknown taxon " << value << " in TRANSLATE command.\nThe translate key "<< key << " has NOT been added to the translation table!";
+				nexusReader->NexusWarnToken(errormsg, NxsReader::PROBABLY_INCORRECT_CONTENT_WARNING, token);
+				errormsg.clear();
+				}
+			}
+		if (valueInd > 0)
+			{
+			if (keyInd != 0 && keyInd != valueInd && nexusReader)
+				{
+				errormsg << "TRANSLATE command overwriting the taxon " << key << " with a redirection to " << value;
+				nexusReader->NexusWarnToken(errormsg, NxsReader::OVERWRITING_CONTENT_WARNING, token);
+				errormsg.clear();
+				}
+			key.ToUpper();
+			capNameToInd[key] = valueInd - 1;
+			}
+		token.GetNextToken();
+		if (token.Equals(";"))
+			break;
+		if (!token.Equals(","))
+			{
+			errormsg << "Expecting a , or ; after a translate key-value pair. Found " << token.GetTokenReference();
+			throw NxsException(errormsg, token);
+			}
+		}
+	constructingTaxaBlock = false;
+	}
+
+/*
+ Converts to a Nexus token (and thus loses some of the file position information).
+*/
+void NxsTreesBlock::ProcessTokenVecIntoTree(
+  const ProcessedNxsCommand & tokenVec,
+  NxsFullTreeDescription & td,
+  NxsLabelToIndicesMapper *taxa,
+  std::map<std::string, unsigned> &capNameToInd,
+  bool allowNewTaxa,
+  NxsReader * nexusReader,
+  const bool respectCase,
+  const bool validateInternalNodeLabels,
+  const bool treatIntegerLabelsAsNumbers, 
+  const bool allowNumericInterpretationOfTaxLabels)
+	{
+	ProcessedNxsCommand::const_iterator tvIt = tokenVec.begin();
+	ostringstream tokenStream;
+	long line = 0;
+	long col = 0;
+	file_pos pos = 0;
+	if (!tokenVec.empty())
+		{
+		line = tvIt->GetLineNumber();
+		col = tvIt->GetColumnNumber();
+		pos = tvIt->GetFilePosition();
+		for (;tvIt != tokenVec.end(); ++tvIt)
+			tokenStream << NxsString::GetEscaped(tvIt->GetToken());
+		tokenStream << ';';
+		}
+	std::string s = tokenStream.str();
+	istringstream newickstream(s);
+	NxsToken token(newickstream);
+	if (td.RequiresNewickNameTokenizing())
+		{
+		token.UseNewickTokenization(true);
+		}
+
+	try
+		{
+		ProcessTokenStreamIntoTree(token, td, taxa, capNameToInd, allowNewTaxa, nexusReader, respectCase, 
+								   validateInternalNodeLabels,  treatIntegerLabelsAsNumbers, allowNumericInterpretationOfTaxLabels);
+		}
+	catch (NxsException & x)
+		{
+		x.pos += pos;
+		x.line += line;
+		x.col += col;
+		throw x;
+		}
+	}
+
+std::vector<std::string> NxsFullTreeDescription::GetTreeTokens() const
+	{
+	const std::string & n = this->GetNewick();
+	std::string y;
+	const std::string *p = &n;
+	if (n.empty() || *n.rend() != ';') {
+			y = n;
+			y.append(1, ';');
+			p = &y;
+		}
+	istringstream newickstream(*p);
+	NxsToken tokenizer(newickstream);
+	if (this->RequiresNewickNameTokenizing())
+		{
+		tokenizer.UseNewickTokenization(true);
+		}
+	std::list<std::string> tl;
+	tokenizer.SetLabileFlagBit(NxsToken::hyphenNotPunctuation);
+	tokenizer.GetNextToken();
+	while (!tokenizer.EqualsCaseSensitive(";"))
+		{
+		tl.push_back(tokenizer.GetTokenReference());
+		tokenizer.SetLabileFlagBit(NxsToken::hyphenNotPunctuation);
+		tokenizer.GetNextToken();
+		}
+	return std::vector<std::string>(tl.begin(), tl.end());
+	}
+
+
+void NxsTreesBlock::ProcessTokenStreamIntoTree(
+  NxsToken & token,
+  NxsFullTreeDescription & td,
+  NxsLabelToIndicesMapper *taxa,
+  std::map<std::string, unsigned> &capNameToInd,
+  bool allowNewTaxa,
+  NxsReader * nexusReader,
+  const bool respectCase,
+  const bool validateInternalNodeLabels,
+  const bool treatIntegerLabelsAsNumbers,
+  const bool allowNumericInterpretationOfTaxLabels)
+	{
+	bool previousNonIntegerLabels=false, previousAllIntegerLabels = false;
+	NxsString errormsg;
+	int & flags = td.flags;
+	bool NHXComments = false;
+	bool someMissingEdgeLens = false;
+	bool someHaveEdgeLens = false;
+	bool someRealEdgeLens = false;
+	bool hasPolytomies = false;
+	bool hasDegTwoNodes = false;
+	bool hasInternalLabels = false;
+	bool hasInternalLabelsInTaxa = false;
+	bool hasInternalLabelsNotInTaxa = false;
+	const bool rooted = (flags & NxsFullTreeDescription::NXS_IS_ROOTED_BIT);
+	std::stack<unsigned> nchildren;
+	std::set<unsigned> taxaEncountered;
+	double minDblEdgeLen = DBL_MAX;
+	int minIntEdgeLen = INT_MAX;
+	double lastFltEdgeLen;
+	long lastIntEdgeLen;
+	bool taxsetRead = false;
+	token.GetNextToken();
+	ostringstream newickStream;
+	if (!token.Equals("("))
+		{
+		errormsg << "Expecting a ( to start the tree description, but found " << token.GetTokenReference();
+		throw NxsException(errormsg, token);
+		}
+	nchildren.push(0);
+	newickStream << '(';
+	int prevToken = NXS_TREE_OPEN_PARENS_TOKEN;
+	token.GetNextToken();
+	for (;;)
+		{
+		const std::vector<NxsComment> & ecs = token.GetEmbeddedComments();
+		for (std::vector<NxsComment>::const_iterator ecsIt = ecs.begin(); ecsIt != ecs.end(); ++ecsIt)
+			{
+			if (!NHXComments)
+				{
+				const std::string & ns = ecsIt->GetText();
+				if (ns.length() > 5 && ns[0] == '&' && ns[1] == '&' && ns[2] == 'N' &&ns[3] == 'H' && ns[4] == 'X')
+					NHXComments = true;
+				}
+			ecsIt->WriteAsNexus(newickStream);
+			}
+		if (token.Equals(";"))
+			{
+			if (!nchildren.empty())
+				throw NxsException("Semicolon found before the end of the tree description.  This means that more \"(\" characters  than \")\"  were found.", token);
+			break;
+			}
+		const NxsString & tstr = token.GetTokenReference();
+		const char * t = tstr.c_str();
+		bool handled;
+		handled = false;
+		if (tstr.length() == 1)
+			{
+			if (t[0] == '(')
+				{
+				if (nchildren.empty())
+					throw NxsException("End of tree description.  Expected ; but found (", token);
+				if (prevToken == NXS_TREE_CLOSE_PARENS_TOKEN || prevToken == NXS_TREE_CLADE_NAME_TOKEN || prevToken == NXS_TREE_BRLEN_TOKEN)
+					{
+					errormsg << "Expecting a , before a new subtree definition:\n \")(\"\n \"name(\" and\n \"branch-length(\"\n are prohibited.";
+					if (nexusReader)
+						nexusReader->NexusWarnToken(errormsg, NxsReader::PROBABLY_INCORRECT_CONTENT_WARNING, token);
+					else
+						throw NxsException(errormsg, token);
+					/* if we did not throw an excection, then we are in relaxed parsing mode.
+						We'll add the implied ,
+					*/
+					if (!someMissingEdgeLens && (prevToken == NXS_TREE_CLOSE_PARENS_TOKEN || prevToken == NXS_TREE_CLADE_NAME_TOKEN))
+						someMissingEdgeLens = true;
+					newickStream << ',';
+					prevToken = NXS_TREE_COMMA_TOKEN;
+					}
+				else if (prevToken == NXS_TREE_COLON_TOKEN)
+					throw NxsException("Expecting a branch length after a : but found (", token);
+				nchildren.top() += 1;
+				nchildren.push(0);
+				newickStream << '(';
+				prevToken = NXS_TREE_OPEN_PARENS_TOKEN;
+				handled = true;
+				}
+			else if (t[0] == ')')
+				{
+				if (nchildren.empty())
+					throw NxsException("End of tree description.  Expected ; but found )", token);
+				if (prevToken == NXS_TREE_OPEN_PARENS_TOKEN || prevToken == NXS_TREE_COMMA_TOKEN)
+					throw NxsException("Expecting a clade description before the subtree's closing )\n \"()\" and \",)\" are prohibited.", token);
+				if (prevToken == NXS_TREE_COLON_TOKEN)
+					throw NxsException("Expecting a branch length after a : but found (", token);
+				if (!someMissingEdgeLens && (prevToken == NXS_TREE_CLOSE_PARENS_TOKEN || prevToken == NXS_TREE_CLADE_NAME_TOKEN))
+					someMissingEdgeLens = true;
+				if (nchildren.top() == 1)
+					hasDegTwoNodes = true;
+				else if (nchildren.top() > 2)
+					{
+					if (rooted)
+						hasPolytomies = true;
+					else if (nchildren.top() > 3 || nchildren.size() > 1) /* three children are allowed not considered a polytomy */
+						hasPolytomies = true;
+					}
+				nchildren.pop();
+				newickStream << ')';
+				prevToken = NXS_TREE_CLOSE_PARENS_TOKEN;
+				handled = true;
+				}
+			else if (t[0] == ':')
+				{
+				if (prevToken != NXS_TREE_CLOSE_PARENS_TOKEN && prevToken != NXS_TREE_CLADE_NAME_TOKEN)
+					throw NxsException("Found a : separator for a subtree at an inappropriate location. A colon is only permitted after a clade name or )-symbol.", token);
+				if (taxsetRead && prevToken == NXS_TREE_CLADE_NAME_TOKEN)
+					throw NxsException("Found a : separator after a taxset name. Branch lengths cannot be assigned to multi-taxon taxsets.", token);
+				newickStream << ':';
+				prevToken = NXS_TREE_COLON_TOKEN;
+				handled = true;
+				token.SetLabileFlagBit(NxsToken::hyphenNotPunctuation); // this allows us to deal with sci. not. in branchlengths (and negative branch lengths).
+				}
+			else if (t[0] == ',')
+				{
+				if (prevToken == NXS_TREE_OPEN_PARENS_TOKEN)
+					throw NxsException("Found a empty subclade found. The combination \"(,\" is prohibited.", token);
+				if (prevToken == NXS_TREE_COMMA_TOKEN)
+					throw NxsException("Found a empty subclade found. The combination \",,\" is prohibited.", token);
+				if (prevToken == NXS_TREE_COLON_TOKEN)
+					throw NxsException("Found a , when a branch length was expected found. The combination \":,\" is prohibited.", token);
+				if (!someMissingEdgeLens && (prevToken == NXS_TREE_CLOSE_PARENS_TOKEN || prevToken == NXS_TREE_CLADE_NAME_TOKEN))
+					someMissingEdgeLens = true;
+				newickStream << ',';
+				prevToken = NXS_TREE_COMMA_TOKEN;
+				handled = true;
+				}
+			}
+		if (!handled)
+			{
+			if (prevToken == NXS_TREE_COLON_TOKEN)
+				{
+				bool handledLength = false;
+				if (!someRealEdgeLens)
+					{
+					if (NxsString::to_long(t, &lastIntEdgeLen))
+						{
+						handledLength = true;
+						if (lastIntEdgeLen < minIntEdgeLen)
+							minIntEdgeLen = (int)lastIntEdgeLen;
+						}
+					}
+				if (!handledLength)
+					{
+					if (!NxsString::to_double(t, &lastFltEdgeLen))
+						{
+						errormsg << "Expecting a number as a branch length. Found " << tstr;
+						throw NxsException(errormsg, token);
+						}
+					someRealEdgeLens = true;
+					if (lastFltEdgeLen < minDblEdgeLen)
+						minDblEdgeLen = lastFltEdgeLen;
+					}
+				newickStream << tstr;
+				someHaveEdgeLens = true;
+				prevToken = NXS_TREE_BRLEN_TOKEN;
+				}
+			else
+				{
+				if (prevToken == NXS_TREE_BRLEN_TOKEN || prevToken == NXS_TREE_CLADE_NAME_TOKEN)
+					{
+					errormsg << "Found a name " << tstr << " which should be preceded by a ( or a ,";
+					throw NxsException(errormsg, token);
+					}
+				taxsetRead = false;
+				NxsString ucl(t);
+				if (!respectCase)
+					ucl.ToUpper();
+				NxsString toAppend;
+				if (prevToken == NXS_TREE_CLOSE_PARENS_TOKEN)
+					{
+					if (validateInternalNodeLabels)
+						{
+						std::map<std::string, unsigned>::const_iterator tt = capNameToInd.find(ucl);
+						unsigned ind = (tt == capNameToInd.end() ? UINT_MAX : tt->second);
+						if (taxaEncountered.find(ind) != taxaEncountered.end())
+							{
+							errormsg << "Taxon number " << ind + 1 << " (coded by the token " << tstr << ") has already been encountered in this tree. Duplication of taxa in a tree is prohibited.";
+							throw NxsException(errormsg, token);
+							}
+						hasInternalLabels = true;
+						if (ind == UINT_MAX)
+							{
+							hasInternalLabelsNotInTaxa = true;
+							toAppend += NxsString::GetEscaped(tstr);
+							}
+						else
+							{
+							hasInternalLabelsInTaxa = true;
+							taxaEncountered.insert(ind);
+							toAppend += (1 + ind);
+							}
+						}
+					else
+						{
+						hasInternalLabels = true;
+						hasInternalLabelsNotInTaxa = true;
+						toAppend += NxsString::GetEscaped(tstr);
+						}
+					}
+				else
+					{
+					std::map<std::string, unsigned>::const_iterator tt = capNameToInd.find(ucl);
+					unsigned ind = (tt == capNameToInd.end() ? UINT_MAX : tt->second);
+					if (taxaEncountered.find(ind) != taxaEncountered.end())
+						{
+						errormsg << "Taxon number " << ind + 1 << " (coded by the token " << tstr << ") has already been encountered in this tree. Duplication of taxa in a tree is prohibited.";
+						throw NxsException(errormsg, token);
+						}
+					if (ind == UINT_MAX)
+						{
+						std::set<unsigned> csinds;
+						if (allowNumericInterpretationOfTaxLabels) //@TEMPORARY hack
+							NxsLabelToIndicesMapper::allowNumberAsIndexPlusOne = false;
+						unsigned nadded = taxa->GetIndexSet(tstr, &csinds);
+						if (allowNumericInterpretationOfTaxLabels) //@TEMPORARY hack
+							NxsLabelToIndicesMapper::allowNumberAsIndexPlusOne = true;
+						if (nadded == 0)
+							{
+							if (!allowNewTaxa)
+								{
+								errormsg << "Expecting a Taxon label after a \"" << (prevToken == NXS_TREE_OPEN_PARENS_TOKEN ? '(' : ',') << "\" character. Found \"" << tstr << "\" but this is not a recognized taxon label.";
+								throw NxsException(errormsg, token);
+								}
+							long dummy;
+							if (treatIntegerLabelsAsNumbers && NxsString::to_long(ucl.c_str(), &dummy))
+								{
+								if (previousNonIntegerLabels)
+									{
+									errormsg << "Trees are being read in a mode that treats integer taxon labels as the number of the taxon. The mixing of integer and non-integer labels is not supported";
+									throw NxsException(errormsg, token);
+									}
+								previousAllIntegerLabels = true;
+								if (dummy < 1)
+									{
+									errormsg << "Trees are being read in a mode that treats integer taxon labels as the number of the taxon. All numbers are expected to be > 0";
+									throw NxsException(errormsg, token);
+									}
+								unsigned currNT = taxa->GetNumLabelsCurrentlyStored();
+								unsigned tn = (unsigned) dummy;
+								//errormsg << "numeric taxon handling -- currNT =  " << currNT << ". dummy= " << dummy << ".\n" ;
+								while (currNT < tn)
+									{
+									NxsString tasstring;
+									tasstring << ++currNT;
+									unsigned valueInd = taxa->AppendNewLabel(tasstring);
+									capNameToInd[tasstring] = valueInd;
+									//errormsg << "numeric taxon handling -- registering " << tasstring << " to " << valueInd << " mapping.\n";
+									}
+								std::map<std::string, unsigned>::const_iterator ttWithAdditions = capNameToInd.find(ucl);
+								unsigned indWithAdditions = (ttWithAdditions == capNameToInd.end() ? UINT_MAX : ttWithAdditions->second);
+								if (indWithAdditions == UINT_MAX)
+									{
+									errormsg << "Trees are being read in a mode that treats integer taxon labels as the number of the taxon - only numeric taxon labels were expected (the lookup table for "<< ucl << " failed to yield a hit, indicating that some non-numeric labels have been registered at some point)";
+									throw NxsException(errormsg, token);
+									}
+								taxaEncountered.insert(indWithAdditions);
+								nchildren.top() += 1;
+								toAppend += (1 + indWithAdditions);
+								}
+							else
+								{
+								if (treatIntegerLabelsAsNumbers)
+									{
+									if (previousAllIntegerLabels)
+										{
+										errormsg << "Trees are being read in a mode that treats integer taxon labels as the number of the taxon. The mixing of integer and non-integer labels (such as \"" << t << "\") is not supported";
+										throw NxsException(errormsg, token);
+										}
+									previousNonIntegerLabels = true;
+									}
+								std::string tasstring(tstr.c_str());
+								unsigned valueInd = taxa->AppendNewLabel(tasstring);
+								if (allowNumericInterpretationOfTaxLabels)
+									{
+									NxsString numV;
+									numV += (valueInd+1);
+									if (capNameToInd.find(numV) == capNameToInd.end())
+										capNameToInd[numV] = valueInd;
+									}
+								if (!respectCase)
+									NxsString::to_upper(tasstring);
+								capNameToInd[tasstring] = valueInd;
+								taxaEncountered.insert(valueInd);
+								nchildren.top() += 1;
+								toAppend += (1 + valueInd);
+								}
+							}
+						else
+							{
+							bool firstTaxonAdded = true;
+							for (std::set<unsigned>::const_iterator cit = csinds.begin(); cit != csinds.end(); ++cit)
+								{
+								if (taxaEncountered.find(*cit) != taxaEncountered.end())
+									{
+									errormsg << "Taxon number " << *cit + 1 << " (one of the members of the taxset " << tstr << ") has already been encountered in this tree. Duplication of taxa in a tree is prohibited.";
+									throw NxsException(errormsg, token);
+									}
+								taxaEncountered.insert(*cit);
+								nchildren.top() += 1;
+								if (!firstTaxonAdded)
+									toAppend.append(1, ',');
+								toAppend += (1 + *cit);
+								firstTaxonAdded = false;
+								}
+							if (nadded > 1)
+								{
+								taxsetRead = true;
+								someMissingEdgeLens = true;
+								}
+							}
+						}
+					else
+						{
+						taxaEncountered.insert(ind);
+						nchildren.top() += 1;
+						toAppend += (1 + ind);
+						}
+					}
+				newickStream << toAppend;
+				prevToken = NXS_TREE_CLADE_NAME_TOKEN;
+				}
+			}
+		token.GetNextToken();
+		}
+	td.flags |= NxsFullTreeDescription::NXS_TREE_PROCESSED;
+	if (someHaveEdgeLens)
+		{
+		flags |= NxsFullTreeDescription::NXS_HAS_SOME_EDGE_LENGTHS_BIT;
+		if (someRealEdgeLens)
+			{
+			flags &= ~(NxsFullTreeDescription::NXS_INT_EDGE_LENGTHS_BIT);
+			td.minDblEdgeLen = minDblEdgeLen;
+			}
+		else
+			{
+			flags |= NxsFullTreeDescription::NXS_INT_EDGE_LENGTHS_BIT;
+			td.minIntEdgeLen = minIntEdgeLen;
+			}
+		}
+	td.newick = newickStream.str();
+	if (someMissingEdgeLens)
+		flags |= NxsFullTreeDescription::NXS_MISSING_SOME_EDGE_LENGTHS_BIT;
+	if (hasPolytomies)
+		flags |= NxsFullTreeDescription::NXS_HAS_POLYTOMY_BIT;
+	if (hasDegTwoNodes)
+		flags |= NxsFullTreeDescription::NXS_HAS_DEG_TWO_NODES_BIT;
+	if (hasInternalLabels)
+		{
+		flags |= NxsFullTreeDescription::NXS_HAS_INTERNAL_NAMES_BIT;
+		if (hasInternalLabelsNotInTaxa)
+			flags |= NxsFullTreeDescription::NXS_HAS_NEW_INTERNAL_NAMES_BIT;
+		if (hasInternalLabelsInTaxa)
+			flags |= NxsFullTreeDescription::NXS_KNOWN_INTERNAL_NAMES_BIT;
+		}
+	if (NHXComments)
+		flags |= NxsFullTreeDescription::NXS_HAS_NHX_BIT;
+	if (taxaEncountered.size() == taxa->GetMaxIndex() + 1)
+		flags |= NxsFullTreeDescription::NXS_HAS_ALL_TAXA_BIT;
+	}
+
+void NxsTreesBlock::ProcessTree(NxsFullTreeDescription & ftd) const
+	{
+	if (ftd.flags & NxsFullTreeDescription::NXS_TREE_PROCESSED)
+		return;
+	ftd.newick.append(1, ';');
+	const std::string incomingNewick = ftd.newick;
+	ftd.newick.clear();
+	istringstream newickstream(incomingNewick);
+	NxsToken token(newickstream);
+	if (ftd.RequiresNewickNameTokenizing())
+		{
+		token.UseNewickTokenization(true);
+		}
+	ProcessTokenStreamIntoTree(token, ftd, taxa, capNameToInd, constructingTaxaBlock, nexusReader, false, 
+								validateInternalNodeLabels, treatIntegerLabelsAsNumbers, allowNumericInterpretationOfTaxLabels);
+	}
+
+void NxsTreesBlock::HandleTreeCommand(NxsToken &token, bool rooted)
+	{
+	NCL_ASSERT(taxa);
+	token.GetNextToken();
+	if (token.Equals("*"))
+		{
+		defaultTreeInd = (unsigned)trees.size();
+		token.GetNextToken();
+		}
+	NxsString treeName = token.GetToken();
+	DemandEquals(token, "after tree name in TREE command");
+	file_pos fp = 0;
+	int fline = (int)token.GetFileLine();
+	int fcol = (int)token.GetFileColumn();
+	fp = token.GetFilePosition();
+	try {
+		// This should be either a tree description or a command comment specifying
+		// whether this tree is to be rooted ([&R]) or unrooted ([&U]).
+		//
+		token.SetLabileFlagBit(NxsToken::saveCommandComments);
+		token.SetLabileFlagBit(NxsToken::parentheticalToken);
+		token.GetNextToken();
+		NxsString s = token.GetToken();
+		if (!s.empty() && s[0] == '&')
+			{
+			if (s[1] == 'R' || s[1] == 'r')
+				rooted = true;
+			else if (s[1] == 'U' || s[1] == 'u')
+				rooted = false;
+			else
+				{
+				errormsg << "[" << token.GetToken() << "] is not a valid command comment in a TREE command";
+				throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+			// now grab the tree description
+			token.SetLabileFlagBit(NxsToken::parentheticalToken);
+			token.GetNextToken();
+			s = token.GetToken();
+			}
+		if (!s.empty() && s[0] != '(')
+			{
+			errormsg << "Expecting command comment or tree description in TREE (or UTREE) command, but found " << token.GetToken() << " instead";
+			throw NxsException(errormsg);
+			}
+		}
+	catch (NxsX_UnexpectedEOF &)
+		{
+		errormsg << "Unexpected end of file in tree description.\n";
+		errormsg << "This probably indicates that the parentheses in the newick description are not balanced, and one or more closing parentheses are needed.";
+		throw NxsException(errormsg, fp, fline, fcol);
+		}
+	std::string mt;
+	int f = (rooted ? NxsFullTreeDescription::NXS_IS_ROOTED_BIT : 0);
+	trees.push_back(NxsFullTreeDescription(mt, treeName, f));
+	NxsFullTreeDescription & td = trees[trees.size() -1];
+	ReadTreeFromOpenParensToken(td, token);
+	}
+
+void NxsTreesBlock::ReadTreeFromOpenParensToken(NxsFullTreeDescription &td, NxsToken & token)
+	{
+	if (this->useNewickTokenizingDuringParse)
+		{
+		token.UseNewickTokenization(true);
+		td.SetRequiresNewickNameTokenizing(true);
+		}
+	try {
+		file_pos fp = 0;
+		int fline = (int)token.GetFileLine();
+		int fcol = (int)token.GetFileColumn();
+		ostringstream newickStream;
+		newickStream << token.GetTokenReference();
+		token.GetNextToken();
+		const std::vector<NxsComment> & ecs = token.GetEmbeddedComments();
+		for (std::vector<NxsComment>::const_iterator ecsIt = ecs.begin(); ecsIt != ecs.end(); ++ecsIt)
+			ecsIt->WriteAsNexus(newickStream);
+		while (!token.Equals(";"))
+			{
+			if (token.Equals("(") || token.Equals(")") || token.Equals(","))
+				GenerateUnexpectedTokenNxsException(token, "root taxon information");
+			newickStream << NxsString::GetEscaped(token.GetTokenReference());
+			token.GetNextToken();
+			const std::vector<NxsComment> & iecs = token.GetEmbeddedComments();
+			for (std::vector<NxsComment>::const_iterator iecsIt = iecs.begin(); iecsIt != iecs.end(); ++iecsIt)
+				iecsIt->WriteAsNexus(newickStream);
+			}
+		td.newick = newickStream.str();
+		if (processAllTreesDuringParse)
+			{
+			try
+				{
+				ProcessTree(td);
+				if (this->processedTreeValidationFunction)
+					{
+					if (!this->processedTreeValidationFunction(td, this->ptvArg, this))
+						trees.pop_back();
+					}
+				}
+			catch (NxsException &x)
+				{
+				x.pos += fp;
+				x.line += fline - 1; /*both tokenizers start at 1 instead of zero, so we need to decrement the line */
+				x.col += fcol;
+				throw x;
+				}
+			}
+		}
+	catch (...) 
+		{
+		if (this->useNewickTokenizingDuringParse) 
+			token.UseNewickTokenization(false);
+		throw;
+		}
+	if (this->useNewickTokenizingDuringParse)
+		token.UseNewickTokenization(false);
+	}
+/*!
+	This function provides the ability to read everything following the block name (which is read by the NxsReader
+	object) to the END or ENDBLOCK command. Characters are read from the input stream `in'. Overrides the abstract
+	virtual function in the base class.
+*/
+void NxsTreesBlock::Read(
+  NxsToken &token)	/* the token used to read from `in' */
+	{
+	isEmpty = false;
+	isUserSupplied = true;
+	DemandEndSemicolon(token, "BEGIN TREES");
+	//AssureTaxaBlock(createImpliedBlock, token, "BEGIN TREES");
+	bool readTranslate = false;
+	bool readTree = false;
+	errormsg.clear();
+	constructingTaxaBlock = false;
+	newtaxa = false;
+	capNameToInd.clear();
+	unsigned numSigInts = NxsReader::getNumSignalIntsCaught();
+	const bool checkingSignals = NxsReader::getNCLCatchesSignals();
+
+	for (;;)
+		{
+		token.GetNextToken();
+		if (checkingSignals && NxsReader::getNumSignalIntsCaught() != numSigInts)
+			{
+			throw NxsSignalCanceledParseException("Reading TREES Block");
+			}
+		NxsBlock::NxsCommandResult res = HandleBasicBlockCommands(token);
+		if (res == NxsBlock::NxsCommandResult(STOP_PARSING_BLOCK))
+			{
+			if (constructingTaxaBlock)
+				{
+				if (taxa && taxa->GetNTax() > 0)
+					newtaxa = true;
+				constructingTaxaBlock = false; /* we don't allow the construction of taxa blocks over repeated readings or after the block has been read */
+				}
+			return;
+			}
+		if (res != NxsBlock::NxsCommandResult(HANDLED_COMMAND))
+			{
+			if (token.Equals("TRANSLATE"))
+				{
+				if (readTree)
+					WarnDangerousContent("TRANSLATE command must precede any TREE commands in a TREES block", token);
+				if (readTranslate)
+					{
+					WarnDangerousContent("Only one TRANSLATE command may be read in a TREES block", token);
+					capNameToInd.clear();
+					}
+				readTranslate = true;
+				ConstructDefaultTranslateTable(token, "TRANSLATE");
+				HandleTranslateCommand(token);
+				}
+			else
+				{
+				bool utreeCmd = token.Equals("UTREE");
+				bool treeCmd = token.Equals("TREE");
+				bool readAsRooted = (treeCmd && this->treatAsRootedByDefault);
+				if (utreeCmd || treeCmd)
+					{
+					if (!readTranslate && ! readTree)
+						ConstructDefaultTranslateTable(token, token.GetTokenReference().c_str());
+					readTree = true;
+					HandleTreeCommand(token, readAsRooted);
+					}
+				else
+					SkipCommand(token);
+				}
+			}
+		}
+	}
+/*! Returns the description of the tree with index `i' where i is in [0..ntrees).
+	Node numbers will be translated to names in the resulting tree description.
+	Use GetTreeDescription if translation is not desired.
+
+	Note that if the Names are complex they may complicate simple parses of the tree
+	For example "A (" is a valid NEXUS taxon name (though one that I hope no one is crazy enough to use.
+*/
+NxsString NxsTreesBlock::GetTranslatedTreeDescription(
+  unsigned i)	/* the index of the tree for which the description is to be returned */
+	{
+	NCL_ASSERT(i < trees.size());
+	NCL_ASSERT(taxa);
+	NxsFullTreeDescription & ftd = trees.at(i);
+	ProcessTree(ftd);
+	std::string incomingNewick = ftd.newick;
+	incomingNewick.append(1, ';');
+	istringstream newickstream(incomingNewick);
+	NxsToken token(newickstream);
+	if (ftd.RequiresNewickNameTokenizing())
+		{
+		token.UseNewickTokenization(true);
+		}
+
+	token.GetNextToken();
+	if (!token.Equals("("))
+		{
+		errormsg << "Expecting a ( to start the tree description, but found " << token.GetTokenReference();
+		throw NxsException(errormsg, token);
+		}
+	int prevToken = NXS_TREE_OPEN_PARENS_TOKEN;
+	long taxIndLong;
+	const unsigned ntax = taxa->GetNTaxTotal();
+	ostringstream translated;
+	for (;;)
+		{
+		const std::vector<NxsComment> & ecs = token.GetEmbeddedComments();
+		for (std::vector<NxsComment>::const_iterator ecsIt = ecs.begin(); ecsIt != ecs.end(); ++ecsIt)
+			ecsIt->WriteAsNexus(translated);
+		if (token.Equals(";"))
+			break;
+		const NxsString & t = token.GetTokenReference();
+		bool handled;
+		handled = false;
+		if (t.length() == 1)
+			{
+			if (t[0] == '(')
+				{
+				translated <<  '(';
+				prevToken = NXS_TREE_OPEN_PARENS_TOKEN;
+				handled = true;
+				}
+			else if (t[0] == ')')
+				{
+				translated << ')';
+				prevToken = NXS_TREE_CLOSE_PARENS_TOKEN;
+				handled = true;
+				}
+			else if (t[0] == ':')
+				{
+				translated << ':';
+				prevToken = NXS_TREE_COLON_TOKEN;
+				handled = true;
+				token.SetLabileFlagBit(NxsToken::hyphenNotPunctuation); // this allows us to deal with sci. not. in branchlengths (and negative branch lengths).
+				}
+			else if (t[0] == ',')
+				{
+				translated << ',';
+				prevToken = NXS_TREE_COMMA_TOKEN;
+				handled = true;
+				}
+			}
+		if (!handled)
+			{
+			if (prevToken == NXS_TREE_COLON_TOKEN)
+				{
+				translated << t;
+				prevToken = NXS_TREE_BRLEN_TOKEN;
+				}
+			else
+				{
+				if (NxsString::to_long(t.c_str(), &taxIndLong) && taxIndLong <= (long) ntax && taxIndLong > 0)
+					translated << NxsString::GetEscaped(taxa->GetTaxonLabel((unsigned) taxIndLong - 1));
+				else if (prevToken == NXS_TREE_CLOSE_PARENS_TOKEN)
+					translated << t;
+				else
+					{
+					errormsg << "Expecting a taxon index in a tree description, but found " << t;
+					throw NxsException(errormsg, token);
+					}
+				}
+			}
+		token.GetNextToken();
+		}
+	return NxsString(translated.str().c_str());
+	}
+
+void NxsTreesBlock::ReadPhylipTreeFile(NxsToken & token)
+	{
+	bool prevAIN = allowImplicitNames;
+	bool prevUNTDP = useNewickTokenizingDuringParse;
+	allowImplicitNames = true;
+	bool firstTree = true;
+	const bool prevEOFAllowed = token.GetEOFAllowed();
+	token.SetEOFAllowed(false);
+	try
+		{
+		for (;;)
+			{
+			token.SetLabileFlagBit(NxsToken::saveCommandComments);
+			token.SetLabileFlagBit(NxsToken::parentheticalToken);
+			token.GetNextToken();
+			NxsString s = token.GetToken();
+			bool rooted = false;
+			if (!s.empty() && s[0] == '&')
+				{
+				if (s[1] == 'R' || s[1] == 'r')
+					rooted = true;
+				else if (s[1] == 'U' || s[1] == 'u')
+					rooted = false;
+				else
+					{
+					errormsg << "[" << token.GetToken() << "] is not a valid command comment in a TREE command";
+					throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+					}
+				// now grab the tree description
+				token.SetLabileFlagBit(NxsToken::parentheticalToken);
+				token.GetNextToken();
+				s = token.GetToken();
+				}
+			if (!s.empty() && s[0] != '(')
+				{
+				errormsg << "Expecting a tree description, but found \"" << token.GetToken() << "\" instead";
+				throw NxsException(errormsg);
+				}
+			if (firstTree)
+				{
+				ConstructDefaultTranslateTable(token, token.GetTokenReference().c_str());
+				firstTree = false;
+				}
+			int f = (rooted ? NxsFullTreeDescription::NXS_IS_ROOTED_BIT : 0);
+			std::string mt;
+			trees.push_back(NxsFullTreeDescription(mt, mt, f));
+			NxsFullTreeDescription & td = trees[trees.size() -1];
+			this->useNewickTokenizingDuringParse = true;
+			ReadTreeFromOpenParensToken(td, token);
+			this->useNewickTokenizingDuringParse = prevUNTDP;
+			this->constructingTaxaBlock = false; // we have to signal that we are done constructing the TAXA block
+			}
+		}
+	catch (NxsX_UnexpectedEOF &)
+		{
+		allowImplicitNames = prevAIN;
+		useNewickTokenizingDuringParse = prevUNTDP;
+		token.SetEOFAllowed(prevEOFAllowed);
+		if (firstTree)
+			{
+			errormsg << "Unexpected end of file in tree description.\n";
+			errormsg << "This probably indicates that the parentheses in the newick description are not balanced, and one or more closing parentheses are needed.";
+			throw NxsException(errormsg);
+			}
+		}
+	catch (...)
+		{
+		allowImplicitNames = prevAIN;
+		useNewickTokenizingDuringParse = prevUNTDP;
+		token.SetEOFAllowed(prevEOFAllowed);
+		throw;
+		}
+	token.SetEOFAllowed(prevEOFAllowed);
+	allowImplicitNames = prevAIN;
+	useNewickTokenizingDuringParse = prevUNTDP;
+	}
+
diff --git a/lib/ncl-2.1.18/ncl/nxstreesblock.h b/lib/ncl-2.1.18/ncl/nxstreesblock.h
new file mode 100644
index 0000000..f4049e4
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxstreesblock.h
@@ -0,0 +1,983 @@
+//	Copyright (C) 1999-2003 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#ifndef NCL_NXSTREESBLOCK_H
+#define NCL_NXSTREESBLOCK_H
+#include <climits>
+#include <cfloat>
+#include "ncl/nxsdefs.h"
+#include "ncl/nxstaxablock.h"
+
+class NxsTreesBlockAPI
+  : public NxsBlock, public NxsLabelToIndicesMapper
+	{
+ 	public:
+		virtual unsigned	GetNumDefaultTree() = 0;
+		virtual unsigned	GetNumTrees() = 0;
+		virtual NxsString	GetTreeName(unsigned i) = 0;
+		virtual NxsString	GetTreeDescription(unsigned i) = 0;
+		virtual NxsString	GetTranslatedTreeDescription(unsigned i) = 0;
+		virtual bool		IsDefaultTree(unsigned i) = 0;
+		virtual bool		IsRootedTree(unsigned i) = 0;
+	};
+/*! This function provides rudimentary support for parsing of NHX comments.
+	It is called during the creation of a NxsSimpleTree to handle any NHX comments
+
+	It fills `infoMap` with the key value pairs parsed from a comment that starts with
+		&&NHX
+	\returns the unparsed portion of the comment
+*/
+std::string parseNHXComment(const std::string comment, /*! the comment without the [] braces. If the comment does not start with &&NHX then the entire comment will be returned*/
+			std::map<std::string, std::string> *infoMap); /*!< the destination for key value pairs parsed out of the NHX comment */
+class NxsFullTreeDescription;
+class NxsSimpleNode;
+/*! The edge used by the NxsSimpleTree class.
+*/
+class NxsSimpleEdge
+	{
+	public:
+		bool EdgeLenIsDefaultValue() const
+			{
+			return defaultEdgeLen;
+			}
+
+		bool IsIntEdgeLen() const
+			{
+			return hasIntEdgeLens;
+			}
+
+		double GetDblEdgeLen() const
+			{
+			return hasIntEdgeLens ? (double) iEdgeLen : dEdgeLen ;
+			}
+
+		int GetIntEdgeLen() const
+			{
+			return hasIntEdgeLens ? iEdgeLen : (int) dEdgeLen ;
+			}
+
+		std::vector<NxsComment> GetUnprocessedComments() const
+			{
+			return unprocessedComments;
+			}
+
+		/*! \returns true if `key` was processed from a comment.
+			If the key was found and `value` pointer is not NULL, then the
+				*value will hold the value on exit
+		*/
+		bool GetInfo(const std::string &key, std::string *value) const
+			{
+			std::map<std::string, std::string>::const_iterator kvit = parsedInfo.find(key);
+			if (kvit == parsedInfo.end())
+				return false;
+			if (value != NULL)
+				*value = kvit->second;
+			return true;
+			}
+		/*! Returns a reference to the map that stores information in a generic
+			key to value mapping where both elements are strings.
+
+			This map is populated by the information from NHX comments during the creation of
+			a NxsSimpleTree.
+		*/
+		const std::map<std::string, std::string> & GetInfo() const
+			{
+			return parsedInfo;
+			}
+		const NxsSimpleNode * GetParent() const
+			{
+			return parent;
+			}
+		const NxsSimpleNode * GetChild() const
+			{
+			return child;
+			}
+
+		void SetDblEdgeLen(double e, const char *asString)
+			{
+			defaultEdgeLen = false;
+			hasIntEdgeLens = false;
+			dEdgeLen = e;
+			if (asString)
+				lenAsString.assign(asString);
+
+			}
+
+		void SetIntEdgeLen(int e, const char *asString)
+			{
+			defaultEdgeLen = false;
+			hasIntEdgeLens = true;
+			iEdgeLen = e;
+			if (asString)
+				lenAsString.assign(asString);
+			}
+		mutable void * scratch;
+		void SetParent(NxsSimpleNode *p) 
+		    {
+		    this->parent = p;
+		    }
+	private:
+		void WriteAsNewick(std::ostream &out, bool nhx) const;
+		void DealWithNexusComments(const std::vector<NxsComment> & ecs, bool NHXComments);
+
+		NxsSimpleEdge(NxsSimpleNode  *par, NxsSimpleNode * des, double edgeLen)
+			:scratch(0L),
+			parent(par),
+			child(des),
+			defaultEdgeLen(true),
+			hasIntEdgeLens(false),
+			dEdgeLen(edgeLen)
+			{
+			}
+
+		NxsSimpleEdge(int edgeLen, NxsSimpleNode *par, NxsSimpleNode * des)
+			:scratch(0L),
+			parent(par),
+			child(des),
+			defaultEdgeLen(true),
+			hasIntEdgeLens(true),
+			iEdgeLen(edgeLen)
+			{
+			}
+
+		NxsSimpleNode * GetMutableParent() const
+			{
+			return parent;
+			}
+
+		NxsSimpleNode * parent;
+		NxsSimpleNode * child;
+		bool			defaultEdgeLen;
+		bool			hasIntEdgeLens;
+		int				iEdgeLen;
+		double			dEdgeLen;
+		std::string		lenAsString; /*easy (but inefficient) means of preserving the formatting of the input branch length */
+		std::vector<NxsComment> unprocessedComments;
+		std::map<std::string, std::string> parsedInfo;
+		friend class NxsSimpleTree;
+		friend class NxsSimpleNode;
+	};
+
+/*! The node used by the NxsSimpleTree class.
+*/
+class NxsSimpleNode
+	{
+	public:
+		NxsSimpleEdge GetEdgeToParent() const
+			{
+			return edgeToPar;
+			}
+
+		const NxsSimpleEdge & GetEdgeToParentRef() const
+			{
+			return edgeToPar;
+			}
+
+		NxsSimpleEdge & GetMutableEdgeToParentRef()
+			{
+			return edgeToPar;
+			}
+
+		bool IsTip() const
+			{
+			return (lChild == 0L);
+			}
+		NxsSimpleNode *GetFirstChild() const
+			{
+			return lChild;
+			}
+		NxsSimpleNode * GetNextSib() const
+			{
+			return rSib;
+			}
+		NxsSimpleNode * GetLastChild() const
+			{
+			NxsSimpleNode * currNode = GetFirstChild();
+			if (!currNode)
+				return NULL;
+			NxsSimpleNode * nextNd = currNode->GetNextSib();
+			while (nextNd)
+				{
+				currNode = nextNd;
+				nextNd = currNode->GetNextSib();
+				}
+			return currNode;
+			}
+
+		std::vector<NxsSimpleNode *> GetChildren() const
+			{
+			std::vector<NxsSimpleNode *> children;
+			NxsSimpleNode * currNode = GetFirstChild();
+			while(currNode)
+				{
+				children.push_back(currNode);
+				currNode = currNode->GetNextSib();
+				}
+			return children;
+			}
+		// present for every leaf. UINT_MAX for internals labeled with taxlabels
+		unsigned GetTaxonIndex() const
+			{
+			return taxIndex;
+			}
+
+		// present for every leaf. UINT_MAX for internals labeled with taxlabels
+		void SetTaxonIndex(unsigned i)
+			{
+			taxIndex = i;
+			}
+
+		// non-empty only for internals that are labelled with names that are NOT taxLabels
+		std::string GetName() const
+			{
+			return name;
+			}
+		void SetName(const std::string &n)
+			{
+			name = n;
+			}
+		mutable void * scratch;
+
+		NxsSimpleNode(NxsSimpleNode *par, double edgeLen)
+			:scratch(0L),
+			lChild(0L),
+			rSib(0L),
+			edgeToPar(par, 0L, edgeLen),
+			taxIndex(UINT_MAX)
+			{
+			edgeToPar.child = this;
+			}
+
+
+	public:
+		void WriteAsNewick(std::ostream &out, bool nhx, bool useLeafNames, bool escapeNames, const NxsTaxaBlockAPI *taxa=0L) const;
+
+
+		NxsSimpleNode(int edgeLen, NxsSimpleNode *par)
+			:scratch(0L),
+			lChild(0L),
+			rSib(0L),
+			edgeToPar(edgeLen, par, 0L),
+			taxIndex(UINT_MAX)
+			{
+			edgeToPar.child = this;
+			}
+
+		NxsSimpleNode * GetParent() const
+			{
+			return edgeToPar.GetMutableParent();
+			}
+
+		void AddSib(NxsSimpleNode *n)
+			{
+			if (rSib)
+				rSib->AddSib(n);
+			else
+				rSib = n;
+			}
+		void AddChild(NxsSimpleNode *n)
+			{
+			if (lChild)
+				lChild->AddSib(n);
+			else
+				lChild = n;
+			}
+
+		bool RemoveChild(NxsSimpleNode *n)
+			{
+			if (n == 0L || lChild == 0L)
+			    return false;			
+			if (lChild == n)
+				lChild = lChild->rSib;
+			else 
+			    {
+			    NxsSimpleNode * c = lChild;
+				for (;;) 
+				    {
+				    if (c->rSib == n)
+				        {
+				        c->rSib = n->rSib;
+				        break;
+				        }
+				    if (c->rSib == 0L)
+				        return false;
+	    			}
+		    	}
+			n->edgeToPar.parent = 0L;
+			return true;
+			}
+		void AddSelfAndDesToPreorder(std::vector<const NxsSimpleNode *> &p) const;
+		NxsSimpleNode * FindTaxonIndex(unsigned leafIndex);
+
+        void LowLevelSetFirstChild(NxsSimpleNode *nd) {
+            lChild = nd;
+        }
+        void LowLevelSetNextSib(NxsSimpleNode *nd) {
+            rSib = nd;
+        }
+    private:
+		NxsSimpleNode * lChild;
+		NxsSimpleNode * rSib;
+		NxsSimpleEdge edgeToPar;
+		std::string name; // non-empty only for internals that are labelled with names that are NOT taxLabels
+		unsigned taxIndex; // present for every leaf. UINT_MAX for internals labeled with taxlabels
+		friend class NxsSimpleTree;
+	};
+/*! A simple tree class.
+	Internally NCL stores trees as newick strings with metadata (see the NxsFullTreeDescription class)
+	but you can create a NxsSimpleTree
+*/
+class NxsSimpleTree
+	{
+	public:
+		NxsSimpleTree(const NxsFullTreeDescription &ftd, const int defaultIntEdgeLen, const double defaultDblEdgeLen)
+			:defIntEdgeLen(defaultIntEdgeLen),
+			defDblEdgeLen(defaultDblEdgeLen),
+			realEdgeLens(false)
+			{
+			Initialize(ftd);
+			}
+		NxsSimpleTree(const int defaultIntEdgeLen, const double defaultDblEdgeLen)
+			:defIntEdgeLen(defaultIntEdgeLen),
+			defDblEdgeLen(defaultDblEdgeLen),
+			realEdgeLens(false)
+			{}
+		~NxsSimpleTree()
+			{
+			Clear();
+			}
+		void Initialize(const NxsFullTreeDescription &);
+
+
+		std::vector<const NxsSimpleNode *> GetPreorderTraversal() const;
+		std::vector<NxsSimpleNode *> & GetLeavesRef()
+			{
+			return leaves;
+			}
+		std::vector<std::vector<int> > GetIntPathDistances(bool toMRCA=false) const;
+		std::vector<std::vector<double> > GetDblPathDistances(bool toMRCA=false) const;
+
+		/** Writes just the newick description with numbers for leaf labels.
+			Neither the tree name or NEXUS ; are written
+		*/
+		void WriteAsNewick(std::ostream &out, bool nhx, bool useLeafNames, bool escapeNames, const NxsTaxaBlockAPI * taxa) const
+			{
+			if (root)
+				root->WriteAsNewick(out, nhx, useLeafNames, escapeNames, taxa);
+			}
+		NxsSimpleNode * RerootAt(unsigned leafIndex);
+        NxsSimpleNode * RerootAtNode(NxsSimpleNode *newRoot);
+
+		const NxsSimpleNode * GetRootConst() const
+			{
+			return root;
+			}
+	protected:
+		std::vector<NxsSimpleNode *> allNodes;
+		std::vector<NxsSimpleNode *> leaves;
+		NxsSimpleNode * root;
+		int defIntEdgeLen;
+		double defDblEdgeLen;
+		bool realEdgeLens;
+	public:
+		NxsSimpleNode * AllocNewNode(NxsSimpleNode *p)
+			{
+			NxsSimpleNode * nd;
+			if (realEdgeLens)
+				nd = new NxsSimpleNode(p, defDblEdgeLen);
+			else
+				nd = new NxsSimpleNode(defIntEdgeLen, p);
+			allNodes.push_back(nd);
+			return nd;
+			}
+
+		void Clear()
+			{
+			root = NULL;
+			for (std::vector<NxsSimpleNode *>::iterator nIt = allNodes.begin(); nIt != allNodes.end(); ++nIt)
+				delete *nIt;
+			allNodes.clear();
+			leaves.clear();
+			}
+		void FlipRootsChildToRoot(NxsSimpleNode *subRoot);
+		NxsSimpleTree(const NxsSimpleTree &); //not defined.  Not copyable
+		NxsSimpleTree & operator=(const NxsSimpleTree &); //not defined.  Not copyable
+	};
+
+/*! A class that encapsulates a newick string description of a tree and metadata about the tree.
+
+	the NxsTreesBlock stores the trees as NxsFullTreeDescription because during its parse
+	and validation of a tree string.
+	By default, NCL will "process" each tree -- converting the taxon labels to
+		numbers for the taxa (the number will be 1 + the taxon index).
+		During this processing, the trees block detects things about the tree such as whether
+		there are branch lengths on the tree, whether there are polytomies...
+
+	This data about the tree is then stored in a NxsFullTreeDescription
+	so that the client code can access some information about a tree before it parses
+	the newick string.
+
+	If you do not want to parse the newick string yourself, you can construct a
+		NxsSimpleTree object from a NxsFullTreeDescription object if the NxsFullTreeDescription
+		is "processed"
+
+	If the NxsTreesBlock is configured NOT to process trees (see NxsTreesBlock::SetProcessAllTreesDuringParse())
+*/
+class NxsFullTreeDescription
+	{
+	public:
+		enum TreeDescFlags
+			{ 	NXS_IS_ROOTED_BIT					= 0x0001,
+				NXS_HAS_SOME_EDGE_LENGTHS_BIT		= 0x0002,
+				NXS_MISSING_SOME_EDGE_LENGTHS_BIT	= 0x0004,
+				NXS_EDGE_LENGTH_UNION 				= 0x0006,
+				NXS_INT_EDGE_LENGTHS_BIT 			= 0x0008,
+				NXS_HAS_ALL_TAXA_BIT				= 0x0010,
+				NXS_HAS_NHX_BIT 					= 0x0020,
+				NXS_HAS_DEG_TWO_NODES_BIT			= 0x0040,
+				NXS_HAS_POLYTOMY_BIT				= 0x0080,
+				NXS_HAS_INTERNAL_NAMES_BIT			= 0x0100,
+				NXS_HAS_NEW_INTERNAL_NAMES_BIT		= 0x0200,
+				NXS_KNOWN_INTERNAL_NAMES_BIT		= 0x0400,
+				NXS_SOME_ZERO_EDGE_LEN_BIT			= 0x0800,
+				NXS_SOME_NEGATIVE_EDGE_LEN_BIT		= 0x1000,
+				NXS_TREE_PROCESSED 					= 0x2000
+			};
+		/*! Creates a Tree description from a newick string, name and int with bits that indicate
+			some metadata about the tree.
+		*/
+		NxsFullTreeDescription(const std::string & newickStr, /*!< the newick string */
+				const std::string &treeName, /*!< the name of the tree */
+				int infoFlags) /*!< union of the relevant bits from TreeDescFlags */
+			:newick(newickStr),
+			name(treeName),
+			flags(infoFlags),
+			minIntEdgeLen(INT_MAX),
+			minDblEdgeLen(DBL_MAX),
+			requireNewickNameTokenizing(false)
+			{}
+		/*! Tokenizes the tree into a vector of NEXUS tokens.
+			This makes it easier for to parse.
+		*/
+		std::vector<std::string> GetTreeTokens() const;
+
+		/** returns a newick string.
+			If the NxsFullTreeDescription is processed, then the string will have
+				1-based numbers corresponding to (1 + Taxa block's index of taxon)
+			If it is not processed, then it will correspond with the exact string
+				in the file. Handling unprocessed newick strings requires that the
+				client code consult the Translation table and implement NEXUS'
+				numeric interpretation of labels in order to decode correctly
+				decode all taxon labels
+		*/
+		const std::string &	GetNewick() const
+			{
+			return newick;
+			}
+		/*! \returns the name of the tree */
+		const std::string &	GetName() const
+			{
+			return name;
+			}
+		/*! \returns true if the newick string has been processed. */
+		bool IsProcessed() const
+			{
+			return (flags&NXS_TREE_PROCESSED) != 0;
+			}
+		/*! \throws a NxsNCLAPIException if the tree has not been "processed" */
+		void AssertProcessed() const
+			{
+			if (!IsProcessed())
+				throw NxsNCLAPIException("Tree description queries are only supported on processed tree descriptions.");
+			}
+		/*! \returns true if the tree was rooted.  */
+		bool IsRooted() const
+			{
+			AssertProcessed();
+			return (flags&NXS_IS_ROOTED_BIT) != 0;
+			}
+		/*! \returns true all of the edges in the tree have edge length.
+			\raises a NxsNCLAPIException if the tree has not been processed!
+		*/
+		bool AllEdgesHaveLengths() const
+			{
+			AssertProcessed();
+			return (flags&NXS_EDGE_LENGTH_UNION) == NXS_HAS_SOME_EDGE_LENGTHS_BIT;
+			}
+		/*! \returns true at least one edge in the tree have edge length
+			\raises a NxsNCLAPIException if the tree has not been processed!
+		*/
+		bool SomeEdgesHaveLengths() const
+			{
+			AssertProcessed();
+			return (flags&NXS_HAS_SOME_EDGE_LENGTHS_BIT) != 0;
+			}
+		/*! \returns true all of the edge lengths that are specified can be read as integers
+			\raises a NxsNCLAPIException if the tree has not been processed!
+		*/
+		bool EdgeLengthsAreAllIntegers() const
+			{
+			AssertProcessed();
+			return (flags&NXS_INT_EDGE_LENGTHS_BIT) != 0;
+			}
+		/*! \returns true if the tree contains all of the taxa listed in the NxsTaxaBlock associated with the trees block that generated this NxsFullTreeDescription
+			\raises a NxsNCLAPIException if the tree has not been processed!
+		*/
+		bool AllTaxaAreIncluded() const
+			{
+			AssertProcessed();
+			return (flags&NXS_HAS_ALL_TAXA_BIT) != 0;
+			}
+		/*! \returns true if some of the edges in the tree have New Hampshire Extended style comments  (see http://www.phylosoft.org/NHX)
+			\raises a NxsNCLAPIException if the tree has not been processed!
+		*/
+		bool HasNHXComments() const
+			{
+			AssertProcessed();
+			return (flags&NXS_HAS_NHX_BIT) != 0;
+			}
+		/*! \returns true if the tree has polytomies
+			\raises a NxsNCLAPIException if the tree has not been processed!
+		*/
+		bool HasPolytomies() const
+			{
+			AssertProcessed();
+			return (flags&NXS_HAS_POLYTOMY_BIT) != 0;
+			}
+		/*! \returns true if the tree some internal nodes that only have one child.
+			\raises a NxsNCLAPIException if the tree has not been processed!
+		*/
+		bool HasDegreeTwoNodes() const
+			{
+			AssertProcessed();
+			return (flags&NXS_HAS_DEG_TWO_NODES_BIT) != 0;
+			}
+		/*! If EdgeLengthsAreAllIntegers returns true then this will return the
+			shortest edge length in the tree (useful as means of checking for
+			constraints by programs that prohibit 0 or negative branch lengths)
+		*/
+		int smallestIntEdgeLength() const
+			{
+			return minIntEdgeLen;
+			}
+		/*!	If EdgeLengthsAreAllIntegers returns false then this will return the
+			shortest edge length in the tree (useful as means of checking for
+			constraints by programs that prohibit 0 or negative branch lengths)
+		*/
+		double smallestRealEdgeLength() const
+			{
+			return minDblEdgeLen;
+			}
+		bool RequiresNewickNameTokenizing() const 
+		    {
+		    return this->requireNewickNameTokenizing;
+		    }
+		void SetRequiresNewickNameTokenizing(bool v) 
+		    {
+		    this->requireNewickNameTokenizing = v;
+		    }
+	private:
+		std::string newick; /*with 1-based numbers corresponding to (1 + Taxa block's index of taxon)*/
+		std::string name;
+		int flags;
+		int minIntEdgeLen; /* if EdgeLengthsAreAllIntegers returns true then this will hold shortest edge length in the tree (useful as means of checking for constraints by programs that prohibit 0 or negative branch lengths)*/
+		double minDblEdgeLen; /* if EdgeLengthsAreAllIntegers returns false then this will hold shortest edge length in the tree (useful as means of checking for constraints by programs that prohibit 0 or negative branch lengths)*/
+		bool requireNewickNameTokenizing;  /* False by default. If true, then newick rather than NEXUS tokenizing rules should be used for the taxa names */
+
+	friend class NxsTreesBlock;
+	};
+class NxsTreesBlock;
+typedef bool (* ProcessedTreeValidationFunction)(NxsFullTreeDescription &, void *, NxsTreesBlock *);
+/*!
+	This class handles reading and storage for the NEXUS block TREES.
+	The class can  read the TRANSLATE and TREE commands.
+
+	The tree is validated during the parse and then stored as a NxsFullTreeDescription
+		object which will hold the newick string. This newick string will have
+		numbers rather than names. The numbers in the tree string start at 1 (like other NEXUS numbering),
+		but they are simply 1 + the taxon index.
+
+	In previous versions of NCL (before v2.1), the client code would have to use the translate
+		table to convert the newick string into the taxon numbers.
+
+	As of v2.1, NCL now does this translation.
+
+*/
+class NxsTreesBlock
+  : public NxsTreesBlockAPI, public NxsTaxaBlockSurrogate
+	{
+ 	public:
+							NxsTreesBlock(NxsTaxaBlockAPI *tb);
+		virtual				~NxsTreesBlock();
+
+		void		ReplaceTaxaBlockPtr(NxsTaxaBlockAPI *tb);
+		unsigned GetIndexSet(const std::string &label, NxsUnsignedSet * toFill) const
+			{
+			return NxsLabelToIndicesMapper::GetIndicesFromSets(label, toFill, treeSets);
+			}
+
+		/*! \returns the index of the default tree (the last tree in the TREES block with a * before its name)
+				if no default tree was specified than the first index (0) will be returned
+		*/
+		unsigned	GetNumDefaultTree();
+		/*! \returns the number of trees stored */
+		unsigned	GetNumTrees();
+		/*! \returns the number of trees stored */
+		unsigned	GetNumTrees() const;
+		/*! \returns the NxsFullTreeDescription for tree with index `i`
+		`i` should be in the range [0, num_trees)
+
+		If the NxsFullTreeDescription is processed (see NxsFullTreeDescription::IsProcessed())
+			then its newick string will have numbers rather than names. The numbers in the tree
+			string start at 1 (like other NEXUS numbering), but they are simply 1 + the taxon index.
+
+		In previous versions of NCL (before v2.1), the client code would have to use the translate
+			table to convert the newick string into the taxon numbers.
+
+
+		*/
+		const NxsFullTreeDescription & GetFullTreeDescription(unsigned i) const;
+		/*! \returns a 1-based number for the last tree read that has the name `name` */
+		unsigned	TreeLabelToNumber(const std::string & name) const;
+		/*! \returns the tree name for the tree with index `i`
+		i should be in the range [0, ntrees)
+		*/
+		NxsString	GetTreeName(unsigned i);
+		/*! \returns the tree description object for the tree with index `i`
+		i should be in the range [0, ntrees)
+		*/
+		NxsString	GetTreeDescription(unsigned i);
+		/*! \returns the newick string for the tree with index i. The string will have
+			the taxon names rather than numbers (or other translate table keys) in it.
+		i should be in the range [0, ntrees)
+		*/
+		NxsString	GetTranslatedTreeDescription(unsigned i);
+		/*! \returns true if the tree with index i is the default tree
+		i should be in the range [0, ntrees)
+		*/
+		bool		IsDefaultTree(unsigned i);
+		/*! \returns true if the tree is thought to be rooted (could be rooted
+			because this is NCL's default, or it could indicate that a [&R]
+			comment was encountered.
+		i should be in the range [0, ntrees)
+		*/
+		bool		IsRootedTree(unsigned i);
+		virtual void		Report(std::ostream &out) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		virtual void		BriefReport(NxsString &s) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		virtual void		Reset();
+		void				SetNexus(NxsReader *nxsptr)
+			{
+			NxsBlock::SetNexus(nxsptr);
+			NxsTaxaBlockSurrogate::SetNexusReader(nxsptr);
+			}
+		/*! \ref BlockTypeIDDiscussion */
+        virtual const std::string & GetBlockName() const
+            {
+            return NCL_BLOCKTYPE_ATTR_NAME;
+            }
+
+		void WriteAsNexus(std::ostream &out) const;
+
+		virtual VecBlockPtr	GetImpliedBlocks()
+			{
+			return GetCreatedTaxaBlocks();
+			}
+
+		/*only used it the linkAPI is enabled*/
+		virtual void		HandleLinkCommand(NxsToken & token)
+			{
+			HandleLinkTaxaCommand(token);
+			}
+		virtual void		WriteLinkCommand(std::ostream &out) const
+			{
+			WriteLinkTaxaCommand(out);
+			}
+
+		unsigned GetMaxIndex() const;
+		unsigned GetIndicesForLabel(const std::string &label, NxsUnsignedSet *inds) const;
+		bool AddNewIndexSet(const std::string &label, const NxsUnsignedSet & inds);
+		bool AddNewPartition(const std::string &label, const NxsPartition & inds);
+
+		bool GetAllowImplicitNames() const
+			{
+			return allowImplicitNames;
+			}
+		bool GetUseNewickTokenizingDuringParse() const 
+		    {
+		    return useNewickTokenizingDuringParse;
+		    }
+		/*! \returns true if the block uses the v2.1 style of parsing in which the tree is interpretted and converted into
+				a newick string with standard taxon numbering
+			If false, then the NxsTreesBlock uses the v2.0 API in which the tree reader simply stores the tree string
+				as written in the file (so the client code has to check the translate table in order to interpret
+				the newick stream).
+			true by default.
+		*/
+		bool GetProcessAllTreesDuringParse() const
+			{
+			return processAllTreesDuringParse;
+			}
+		void SetAllowImplicitNames(bool s)
+			{
+			allowImplicitNames = s;
+			}
+		void SetUseNewickTokenizingDuringParse(bool v) 
+		    {
+		    useNewickTokenizingDuringParse = v; 
+		    }
+		void SetTreatIntegerLabelsAsNumbers(bool s) 
+		    {
+		    treatIntegerLabelsAsNumbers = s;
+		    }
+		/*! If true then the block will use the v2.1 style of parsing in which the tree is interpretted and converted into
+				a newick string with standard taxon numbering
+			If false, then the NxsTreesBlock will use the v2.0 API in which the tree reader simply stores the tree string
+				as written in the file (so the client code has to check the translate table in order to interpret
+				the newick stream).
+			true by default.
+		*/
+		void SetProcessAllTreesDuringParse(bool s)
+			{
+			processAllTreesDuringParse = s;
+			}
+		/* Interprets the newick string as a tree. This converts the newick string
+			into one in which 1-based numbers are used for taxon labels (raw newick
+			strings can contain numbers, taxon labels, tax set names or translate
+			table keys as taxon identifiers).
+
+			\raises NxsException
+			This function builds trees as in memory. It may  reveal illegal newick strings that were not
+			detected as illegal on the parse, so NxsExceptions may  be raised.
+
+			Explicitly calling this function is not necessary unless
+			processAllTreesDuringParse is false (because of a previous call to
+			SetProcessAllTreesDuringParse()).
+		*/
+		void ProcessTree(NxsFullTreeDescription &treeDesc) const;
+		/* Convenience function that calls ProcessTree() one each stored
+			NxsFullTreeDescription instance.
+
+			\raises NxsException
+			This function builds trees as in memory. It may  reveal illegal newick strings that were not
+			detected as illegal on the parse, so NxsExceptions may  be raised.
+
+			Explicitly calling this function is not necessary unless
+			processAllTreesDuringParse is false (because of a previous call to
+			SetProcessAllTreesDuringParse()).
+		*/
+		void ProcessAllTrees() const
+			{
+			std::vector<NxsFullTreeDescription>::iterator trIt = trees.begin();
+			for (; trIt != trees.end(); ++trIt)
+				ProcessTree(*trIt);
+			}
+
+
+		/*---------------------------------------------------------------------------------------
+		| Results in aliasing of the taxa, assumptionsBlock blocks!
+		*/
+		NxsTreesBlock & operator=(const NxsTreesBlock &other)
+			{
+			Reset();
+			CopyBaseBlockContents(static_cast<const NxsBlock &>(other));
+			CopyTaxaBlockSurrogateContents(other);
+			CopyTreesBlockContents(other);
+			return *this;
+			}
+
+		/*---------------------------------------------------------------------------------------
+		| Results in aliasing of the taxa, assumptionsBlock blocks!
+		*/
+		virtual void CopyTreesBlockContents(const NxsTreesBlock &other)
+			{
+			allowImplicitNames = other.allowImplicitNames;
+			useNewickTokenizingDuringParse = other.useNewickTokenizingDuringParse;
+			treatIntegerLabelsAsNumbers = other.treatIntegerLabelsAsNumbers;
+			processAllTreesDuringParse = other.processAllTreesDuringParse;
+			writeFromNodeEdgeDataStructure = other.writeFromNodeEdgeDataStructure;
+			validateInternalNodeLabels = other.validateInternalNodeLabels;
+			allowNumericInterpretationOfTaxLabels = other.allowNumericInterpretationOfTaxLabels;
+			constructingTaxaBlock = other.constructingTaxaBlock;
+			newtaxa = other.newtaxa;
+			trees = other.trees;
+			capNameToInd = other.capNameToInd;
+			defaultTreeInd = other.defaultTreeInd;
+			writeTranslateTable = other.writeTranslateTable;
+			treeSets = other.treeSets;
+			treePartitions = other.treePartitions;
+			processedTreeValidationFunction = other.processedTreeValidationFunction;
+			ptvArg = other.ptvArg;
+			treatAsRootedByDefault = other.treatAsRootedByDefault;
+			}
+        bool GetTreatAsRootedByDefault() const {
+            return treatAsRootedByDefault;
+        }
+        void SetTreatAsRootedByDefault(bool v) {
+            this->treatAsRootedByDefault = v;
+        }
+		virtual NxsTreesBlock * Clone() const
+			{
+			NxsTreesBlock * a = new NxsTreesBlock(taxa);
+			*a = *this;
+			return a;
+			}
+		static void ProcessTokenVecIntoTree(const ProcessedNxsCommand & token, 
+		                                    NxsFullTreeDescription & ftd,
+		                                    NxsLabelToIndicesMapper *,
+		                                    std::map<std::string, unsigned> &capNameToInd,
+		                                    bool allowNewTaxa,
+		                                    NxsReader * nexusReader,
+		                                    const bool respectCase=false,
+		                                    const bool validateInternalNodeLabels=true,
+		                                    const bool treatIntegerLabelsAsNumbers=false,
+		                                    const bool allowNumericInterpretationOfTaxLabels=true);
+		static void ProcessTokenStreamIntoTree(NxsToken & token, NxsFullTreeDescription & ftd,
+		                                      NxsLabelToIndicesMapper *,
+		                                      std::map<std::string, unsigned> &capNameToInd,
+		                                      bool allowNewTaxa,
+		                                      NxsReader * nexusReader,
+		                                      const bool respectCase=false,
+		                                      const bool validateInternalNodeLabels=true,
+		                                      const bool treatIntegerLabelsAsNumbers=false,
+		                                      const bool allowNumericInterpretationOfTaxLabels=true);
+
+		void SetWriteFromNodeEdgeDataStructure(bool v)
+			{
+			writeFromNodeEdgeDataStructure = v;
+			}
+		/* 	Processes all trees and then
+			Provides lowlevel access to the "raw" vector of trees stored in the trees block
+		*/
+		std::vector<NxsFullTreeDescription> & GetProcessedTrees()
+			{
+			ProcessAllTrees();
+			return trees;
+			}
+
+		/*! This function allows you to register a callback function that is called after each tree is parsed.
+
+			The signature of your function should be:\n
+				\code
+				bool someFunctionName(NxsFullTreeDescription &treeDesc, void * blob, NxsTreesBlock * treesB);
+				\endcode
+			where:
+				- treeDesc is the NxsFullTreeDescription for the tree that was just read.
+				- blob is pointer to any object or 0L. You supply this blob of data as an argument in
+					setValidationCallbacks and the NxsTreesBlock passes it every time that it calls the callback.
+					By passing in your own object, you can do bookkeeping between calls without using global variables
+					(though you will have to cast the pointer to the blob of data, of course).
+				- treesB is a pointer to the block that is conducting the parse.
+
+			If your function returns false, then the trees block will not store.
+			If your callback function returns true, then the tree will be stored.
+			In either case the NxsTreesBlock will continue parsing after your function returns.
+
+			This Callback hook is convenient for rejecting unwanted trees to save on memory, but it can also
+			be used as an optimization.
+
+			See the example executable in example/splitsinfile.  This NCL client, uses this callback to store
+			the splits from a trees as the TREES block is being parsed.  It returns false in each case, so that
+			the trees are not stored after they are used.
+		*/
+
+		void setValidationCallbacks(
+			ProcessedTreeValidationFunction func, /*!< your pointer to your callback function */
+			void * blob) /*!< pointer to any object that you would like to access during parse */
+			{
+			this->processedTreeValidationFunction = func;
+			this->ptvArg = blob;
+			}
+		bool 		SwapEquivalentTaxaBlock(NxsTaxaBlockAPI * tb)
+		{
+			return SurrogateSwapEquivalentTaxaBlock(tb);
+		}
+		void ReadPhylipTreeFile(NxsToken & token);
+		void setWriteTranslateTable(bool wtt)
+		{
+			this->writeTranslateTable = wtt;
+		}
+		void setAllowNumericInterpretationOfTaxLabels(bool x) {
+			this->allowNumericInterpretationOfTaxLabels = x; 
+		}
+		/*! Sets the boolean field that determines whether or not the trees
+			block will validate treat internal node labels
+			as taxon labels during the parse. In this case the labels will
+			checked against the taxa block (true is the default).
+
+			This can cause problems if the internal node names are integers that
+			are not intended to be taxon labels (eg. support statements for the
+			subtending branches).
+		*/
+		void setValidateInternalNodeLabels(bool x) {
+			this->validateInternalNodeLabels = x; /** if true then labels that occur for internal nodes will be validated via the taxa block (true is the default).  This can cause problems if the internal node names are integer that are not intended to be taxon labels. */
+		}
+		/*! \returns true if the block will validate treat internal node labels
+			as taxon labels during the parse. In this case the labels will
+			checked against the taxa block (true is the default).
+
+			This can cause problems if the internal node names are integers that
+			are not intended to be taxon labels (eg. support statements for the
+			subtending branches).
+		*/
+		bool getValidateInternalNodeLabels() const {
+			return this->validateInternalNodeLabels;
+		}
+		void WriteTranslateCommand(std::ostream & out) const;
+	protected :
+		void ReadTreeFromOpenParensToken(NxsFullTreeDescription &td, NxsToken & token);
+
+		void WriteTreesCommand(std::ostream & out) const;
+		void ConstructDefaultTranslateTable(NxsToken &token, const char * cmd);
+
+		bool allowImplicitNames; /** false by default, true causes the trees block to create a taxa block from the labels found in the trees. */
+		bool useNewickTokenizingDuringParse; /** false by default */
+		bool treatIntegerLabelsAsNumbers; // if true and allowImplicitNames is true, then new taxon labels that are integers will be treated as the taxon number (rather than arbitrary labels)
+		bool processAllTreesDuringParse; /** true by default, false speeds processing but disables detection of errors*/
+		bool constructingTaxaBlock; /** true if new names are being tolerated */
+		bool writeFromNodeEdgeDataStructure; /**this will probably only ever be set to true in testing code. If true the WriteTrees function will convert each tree to NxsSimpleTree object to write the newick*/
+		bool validateInternalNodeLabels; /** if true then labels that occur for internal nodes will be validated via the taxa block (true is the default).  This can cause problems if the internal node names are integer that are not intended to be taxon labels. */
+		bool allowNumericInterpretationOfTaxLabels;
+
+		mutable std::vector<NxsFullTreeDescription> trees;
+		mutable std::map<std::string, unsigned> capNameToInd;
+		unsigned			defaultTreeInd;		/* 0-offset index of default tree specified by user, or 0 if user failed to specify a default tree using an asterisk in the NEXUS data file */
+		NxsUnsignedSetMap 	treeSets;
+		NxsPartitionsByName treePartitions;
+
+		bool writeTranslateTable ; // only affects writing to NEXUS. Default is true
+
+		ProcessedTreeValidationFunction processedTreeValidationFunction;
+		void * ptvArg;
+        bool treatAsRootedByDefault; /* true by default */
+		virtual	void		Read(NxsToken &token);
+		void				HandleTranslateCommand(NxsToken &token);
+		void				HandleTreeCommand(NxsToken &token, bool rooted);
+
+		friend class PublicNexusReader;
+	};
+
+typedef NxsTreesBlock TreesBlock;
+class NxsTreesBlockFactory
+	:public NxsBlockFactory
+	{
+	public:
+		virtual NxsTreesBlock  *	GetBlockReaderForID(const std::string & NCL_BLOCKTYPE_ATTR_NAME, NxsReader *reader, NxsToken *token);
+	};
+
+#endif
diff --git a/lib/ncl-2.1.18/ncl/nxstreesblock.lo b/lib/ncl-2.1.18/ncl/nxstreesblock.lo
new file mode 100644
index 0000000..4f6ff5e
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxstreesblock.lo
@@ -0,0 +1,12 @@
+# nxstreesblock.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nxstreesblock.o'
+
+# Name of the non-PIC object
+non_pic_object='nxstreesblock.o'
+
diff --git a/lib/ncl-2.1.18/ncl/nxsunalignedblock.cpp b/lib/ncl-2.1.18/ncl/nxsunalignedblock.cpp
new file mode 100644
index 0000000..7d8be95
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsunalignedblock.cpp
@@ -0,0 +1,917 @@
+//	Copyright (C) 2007 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#include <climits>
+#include "ncl/nxsunalignedblock.h"
+#include "ncl/nxsreader.h"
+using namespace std;
+
+//@POL Note: This file is not yet ready for use (Paul Lewis, 19-May-2007)
+
+/*!
+	Initializes `NCL_BLOCKTYPE_ATTR_NAME' to "UNALIGNED", `taxa' to `tb', `assumptionsBlock' to `ab', `ntax' and `ntaxTotal' to 0, `newtaxa'
+	and `respectingCase' to false, `labels' to true, `datatype' to `NxsUnalignedBlock::standard', `missing' to '?', and
+	`taxonPos' and `activeTaxon' to NULL. The `equates' map and `uMatrix' vector are both cleared. The ResetSymbols
+	function is called to reset the `symbols' data member.
+*/
+NxsUnalignedBlock::NxsUnalignedBlock(
+  NxsTaxaBlockAPI * tb)			/* is the taxa block object to consult for taxon labels */
+  : NxsBlock(),
+  NxsTaxaBlockSurrogate(tb, NULL)
+	{
+	NCL_BLOCKTYPE_ATTR_NAME = "UNALIGNED";
+	Reset();
+	}
+
+/*!
+	Deletes any memory allocated to the arrays `symbols', `taxonPos' and `activeTaxon'. Flushes the containers
+	`equates', and `uMatrix'.
+*/
+NxsUnalignedBlock::~NxsUnalignedBlock()
+	{
+	Reset();
+	}
+
+/*!
+	Returns NxsUnalignedBlock object to the state it was in when first created. See NxsUnalignedBlock constructor for
+	details.
+*/
+void NxsUnalignedBlock::Reset()
+	{
+	NxsBlock::Reset();
+	ResetSurrogate();
+	nTaxWithData = 0;
+	newtaxa = false;
+	respectingCase = false;
+	labels = true;
+	originalDatatype = datatype = NxsCharactersBlock::standard;
+	missing = '?';
+	gap = '\0';
+	ResetSymbols();	// also resets equates
+	nChar = 0;
+	uMatrix.clear();
+	}
+
+bool NxsUnalignedBlock::TaxonIndHasData(
+  unsigned taxInd) const /* the character in question, in the range [0..`nchar') */
+	{
+	return (taxInd < uMatrix.size() && !uMatrix[taxInd].empty());
+	}
+
+std::string NxsUnalignedBlock::GetMatrixRowAsStr(const unsigned rowIndex) const /* output stream on which to print matrix */
+	{
+	if (!this->TaxonIndHasData(rowIndex))
+		return std::string();
+	std::ostringstream o;
+	WriteStatesForMatrixRow(o, rowIndex);
+	return o.str();
+	}
+
+
+void NxsUnalignedBlock::ResetDatatypeMapper()
+	{
+	mapper = NxsDiscreteDatatypeMapper(datatype, symbols, missing, gap, matchchar, respectingCase, equates);
+	datatype = mapper.GetDatatype();
+	}
+/*!
+	Resets standard symbol set after a change in `datatype' is made. Also flushes equates list and installs standard
+	equate macros for the current `datatype'.
+*/
+void NxsUnalignedBlock::ResetSymbols()
+	{
+	switch(datatype)
+		{
+		case NxsCharactersBlock::nucleotide:
+		case NxsCharactersBlock::dna:
+			symbols =  "ACGT";
+			break;
+
+		case NxsCharactersBlock::rna:
+			symbols = "ACGU";
+			break;
+
+		case NxsCharactersBlock::protein:
+			symbols =  "ACDEFGHIKLMNPQRSTVWY*";
+			break;
+
+		default:
+			symbols = "01";
+		}
+
+	equates.clear();
+	this->equates = NxsCharactersBlock::GetDefaultEquates(datatype);
+	ResetDatatypeMapper();
+	}
+/*!
+	Provides a dump of the contents of the `uMatrix' variable. Useful for testing whether data is being read as
+	expected. If `marginText' is NULL, output is flush left. If each line of output should be prefaced with
+	a tab character, specify "\t" for `marginText'.
+*/
+void NxsUnalignedBlock::DebugShowMatrix(
+  std::ostream & out,		/* is the output stream on which to print */
+  const char * marginText) NCL_COULD_BE_CONST /* is text printed first on each line */ /*v2.1to2.2 1 */
+	{
+	if (!taxa)
+		return;
+	unsigned width = taxa->GetMaxTaxonLabelLength();
+	const unsigned ntt = GetNTaxTotal();
+	NCL_ASSERT(uMatrix.size() >= ntt);
+	for (unsigned i = 0; i < ntt; i++)
+		{
+		const NxsDiscreteStateRow * row = GetDiscreteMatrixRow(i);
+		if (row && !(row->empty()))
+			{
+			if (marginText != NULL)
+				out << marginText;
+			const NxsString currTaxonLabel = taxa->GetTaxonLabel(i); /*v2.1to2.2 4 */
+			out << currTaxonLabel;
+			unsigned currTaxonLabelLen = (unsigned)currTaxonLabel.size();
+			unsigned diff = width - currTaxonLabelLen;
+			std::string spacer(diff+5, ' ');
+			out << spacer;
+			mapper.WriteStateCodeRowAsNexus(out, *row);
+			}
+		}
+	}
+
+/*!
+	Returns a string containing a formatted representation of the state `x'.
+*/
+std::string NxsUnalignedBlock::FormatState(
+  NxsDiscreteDatum d)		/* is the element of `uMatrix' to format */
+  const
+	{
+	if (d.taxInd >= GetNTaxTotal())
+		throw NxsNCLAPIException("Taxon out of range in NxsUnalignedBlock::FormatState");
+	const NxsDiscreteStateRow & row = uMatrix[d.taxInd];
+	if (d.charInd >= row.size())
+		return std::string(1, missing);
+	return mapper.StateCodeToNexusString(row[d.charInd]);
+	}
+
+/*!
+	Returns true if `ch' can be found in the `symbols' array. The value of `respectingCase' is used to determine
+	whether or not the search should be case sensitive. Assumes `symbols' is non-NULL.
+*/
+bool NxsUnalignedBlock::IsInSymbols(
+  char ch)	/* the symbol character to search for */
+	{
+	char char_in_question = (respectingCase ? ch : (char)toupper(ch));
+	for (std::string::const_iterator sIt = symbols.begin(); sIt != symbols.end(); ++sIt)
+		{
+		const char char_in_symbols = (respectingCase ? *sIt : (char)toupper(*sIt));
+		if (char_in_symbols == char_in_question)
+			return true;
+		}
+	return false;
+	}
+
+/*!
+	Called when DIMENSIONS command needs to be parsed from within the UNALIGNED block. Deals with everything after the
+	token DIMENSIONS up to and including the semicolon that terminates the DIMENSIONS command.
+*/
+void NxsUnalignedBlock::HandleDimensions(
+  NxsToken & token)			/* the token used to read from `in' */
+	{
+	unsigned ntaxRead = 0;
+	for (;;)
+		{
+		token.GetNextToken();
+		if (token.Equals("NEWTAXA"))
+			newtaxa = true;
+		else if (token.Equals("NTAX"))
+			{
+			DemandEquals(token, "after NTAX in DIMENSIONS command");
+			ntaxRead = DemandPositiveInt(token, "NTAX");
+			}
+		else if (token.Equals(";"))
+			break;
+		}
+	if (newtaxa)
+		{
+		if (ntaxRead == 0)
+			{
+			errormsg = "DIMENSIONS command must have an NTAX subcommand when the NEWTAXA option is in effect.";
+			throw NxsException(errormsg, token);
+			}
+		AssureTaxaBlock(createImpliedBlock, token, "Dimensions");
+		if (!createImpliedBlock)
+			{
+			taxa->Reset();
+			if (nexusReader)
+				nexusReader->RemoveBlockFromUsedBlockList(taxa);
+			}
+		taxa->SetNtax(ntaxRead);
+		nTaxWithData = ntaxRead;
+		}
+	else
+		{
+		AssureTaxaBlock(false, token, "Dimensions");
+		const unsigned ntaxinblock = taxa->GetNTax();
+		if (ntaxinblock == 0)
+			{
+			errormsg = "A TAXA block must be read before character data, or the DIMENSIONS command must use the NEWTAXA.";
+			throw NxsException(errormsg, token);
+			}
+		if (ntaxinblock < ntaxRead)
+			{
+			errormsg = "NTAX in UNALIGNED block must be less than or equal to NTAX in TAXA block\nNote: one circumstance that can cause this error is \nforgetting to specify NTAX in DIMENSIONS command when \na TAXA block has not been provided";
+			throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+			}
+		nTaxWithData = (ntaxRead == 0 ? ntaxinblock : ntaxRead);
+		}
+	}
+
+/*!
+	Called when the END or ENDBLOCK command needs to be parsed from within the UNALIGNED block. Does two things:
+~
+	o checks to make sure the next token in the data file is a semicolon
+	o eliminates character labels and character state labels for characters that have been eliminated
+~
+*/
+void NxsUnalignedBlock::HandleEndblock(
+  NxsToken & token)		/* the token used to read from `in' */
+	{
+	DemandEndSemicolon(token, "END or ENDBLOCK");
+	}
+
+/*!
+	Called when FORMAT command needs to be parsed from within the DIMENSIONS block. Deals with everything after the
+	token FORMAT up to and including the semicolon that terminates the FORMAT command.
+*/
+void NxsUnalignedBlock::HandleFormat(
+  NxsToken & token)	/* is the token used to read from `in' */
+	{
+	bool standardDataTypeAssumed = false;
+	bool ignoreCaseAssumed = false;
+
+	for (;;)
+		{
+		token.GetNextToken();
+
+		if (token.Equals("DATATYPE"))
+			{
+			DemandEquals(token, "after keyword DATATYPE");
+			// This should be one of the following: STANDARD, DNA, RNA, NUCLEOTIDE or PROTEIN
+			token.GetNextToken();
+
+			if (token.Equals("STANDARD"))
+				datatype = NxsCharactersBlock::standard;
+			else if (token.Equals("DNA"))
+				datatype = NxsCharactersBlock::dna;
+			else if (token.Equals("RNA"))
+				datatype = NxsCharactersBlock::rna;
+			else if (token.Equals("NUCLEOTIDE"))
+				datatype = NxsCharactersBlock::nucleotide;
+			else if (token.Equals("PROTEIN"))
+				datatype = NxsCharactersBlock::protein;
+			else
+				{
+				errormsg = token.GetToken();
+				errormsg += " is not a valid DATATYPE within a ";
+				errormsg += NCL_BLOCKTYPE_ATTR_NAME;
+				errormsg += " block";
+				throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+			if (standardDataTypeAssumed && datatype != NxsCharactersBlock::standard)
+				{
+				errormsg = "DATATYPE must be specified first in FORMAT command";
+				throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+			originalDatatype = datatype;
+			ResetSymbols();
+			}
+		else if (token.Equals("RESPECTCASE"))
+			{
+			if (ignoreCaseAssumed)
+				{
+				errormsg = "RESPECTCASE must be specified before MISSING and SYMBOLS in FORMAT command";
+				throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+			standardDataTypeAssumed = true;
+			respectingCase = true;
+			}
+		else if (token.Equals("MISSING"))
+			{
+			DemandEquals(token, "after keyword MISSING");
+			// This should be the missing data symbol (single character)
+			token.GetNextToken();
+
+			if (token.GetTokenLength() != 1)
+				{
+				errormsg = "MISSING symbol should be a single character, but ";
+				errormsg += token.GetToken();
+				errormsg += " was specified";
+				throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+			else if (token.IsPunctuationToken() && !token.IsPlusMinusToken())
+				{
+				errormsg = "MISSING symbol specified cannot be a punctuation token (";
+				errormsg += token.GetToken();
+				errormsg += " was specified)";
+				throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+			else if (token.IsWhitespaceToken())
+				{
+				errormsg = "MISSING symbol specified cannot be a whitespace character (";
+				errormsg += token.GetToken();
+				errormsg += " was specified)";
+				throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+
+			missing = token.GetToken()[0];
+
+			ignoreCaseAssumed = true;
+			standardDataTypeAssumed = true;
+			}
+		else if (token.Equals("SYMBOLS") || token.Equals("SYMBOL"))
+			{
+			NxsDiscreteStateCell numDefStates;
+			unsigned maxNewStates;
+			switch(datatype)
+				{
+				case NxsCharactersBlock::dna:
+				case NxsCharactersBlock::rna:
+				case NxsCharactersBlock::nucleotide:
+					numDefStates = 4;
+					maxNewStates = NCL_MAX_STATES-4;
+					break;
+				case NxsCharactersBlock::protein:
+					numDefStates = 21;
+					maxNewStates = NCL_MAX_STATES-21;
+					break;
+				default:
+					numDefStates = 0; // replace symbols list for standard datatype
+					symbols[0] = '\0';
+					maxNewStates = NCL_MAX_STATES;
+				}
+			DemandEquals(token, "after keyword SYMBOLS");
+
+			// This should be the symbols list
+			token.SetLabileFlagBit(NxsToken::doubleQuotedToken);
+			token.GetNextToken();
+
+			token.StripWhitespace();
+			unsigned numNewSymbols = token.GetTokenLength();
+
+			if (numNewSymbols > maxNewStates)
+				{
+				errormsg = "SYMBOLS defines ";
+				errormsg += numNewSymbols;
+				errormsg += " new states but only ";
+				errormsg += maxNewStates;
+				errormsg += " new states allowed for this DATATYPE";
+				throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+
+			NxsString to = token.GetToken();
+			unsigned tlen = (unsigned)to.size();
+			NxsString processedS;
+			// Check to make sure user has not used any symbols already in the
+			// default symbols list for this data type
+			for (unsigned i = 0; i < tlen; i++)
+				{
+				if (IsInSymbols(to[i]))
+					{
+					errormsg = "The character ";
+					errormsg << to[i] << " defined in SYMBOLS is predefined for this DATATYPE and shoud not occur in a SYMBOLS subcommand of a FORMAT command.";
+					if (nexusReader)
+						{
+						nexusReader->NexusWarnToken(errormsg, NxsReader::SKIPPING_CONTENT_WARNING, token);
+						errormsg.clear();
+						}
+					}
+				else
+					processedS += to[i];
+				}
+
+			// If we've made it this far, go ahead and add the user-defined
+			// symbols to the end of the list of predefined symbols
+			symbols.append(processedS);
+
+			ignoreCaseAssumed = true;
+			standardDataTypeAssumed = true;
+			}
+
+		else if (token.Equals("EQUATE"))
+			{
+			DemandEquals(token, "after keyword EQUATE");
+
+			// This should be a double-quote character
+			token.GetNextToken();
+
+			if (!token.Equals("\""))
+				{
+				errormsg = "Expecting '\"' after keyword EQUATE but found ";
+				errormsg += token.GetToken();
+				errormsg += " instead";
+				throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+				}
+
+			// Loop until second double-quote character is encountered
+			for (;;)
+				{
+				token.GetNextToken();
+				if (token.Equals("\""))
+					break;
+
+				// If token is not a double-quote character, then it must be the equate symbol (i.e., the
+				// character to be replaced in the data matrix)
+				if (token.GetTokenLength() != 1)
+					{
+					errormsg = "Expecting single-character EQUATE symbol but found ";
+					errormsg += token.GetToken();
+					errormsg += " instead";
+					throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+					}
+
+				// Check for bad choice of equate symbol
+				NxsString t = token.GetToken();
+				const char ch = t[0];
+				bool badEquateSymbol = false;
+
+				// The character '^' cannot be an equate symbol
+				if (ch == '^')
+					badEquateSymbol = true;
+
+				// Equate symbols cannot be punctuation (except for + and -)
+				if (token.IsPunctuationToken() && !token.IsPlusMinusToken())
+					badEquateSymbol = true;
+
+				// Equate symbols cannot be same as matchchar, missing, or gap
+				if (ch == missing || ch == gap)
+					badEquateSymbol = true;
+
+				// Equate symbols cannot be one of the state symbols currently defined
+				if (IsInSymbols(ch))
+					badEquateSymbol = true;
+
+				if (badEquateSymbol)
+					{
+					errormsg = "EQUATE symbol specified (";
+					errormsg += token.GetToken();
+					errormsg += ") is not valid; must not be same as missing, \nmatchchar, gap, state symbols, or any of the following: ()[]{}/\\,;:=*'\"`<>^";
+					throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+					}
+
+				NxsString k = token.GetToken();
+
+				DemandEquals(token, "in EQUATE definition");
+
+				// This should be the token to be substituted in for the equate symbol
+				token.SetLabileFlagBit(NxsToken::parentheticalToken);
+				token.SetLabileFlagBit(NxsToken::curlyBracketedToken);
+				token.GetNextToken();
+				NxsString v = token.GetToken();
+
+				// Add the new equate association to the equates list
+				equates[ch] = v;
+				}
+
+			standardDataTypeAssumed = true;
+			}
+		else if (token.Equals("LABELS"))
+			{
+			labels = true;
+			standardDataTypeAssumed = true;
+			}
+		else if (token.Equals("NOLABELS"))
+			{
+			labels = false;
+			standardDataTypeAssumed = true;
+			}
+		else if (token.Equals(";"))
+			{
+			break;
+			}
+		}
+	ResetDatatypeMapper();
+	}
+
+/*!
+	Called from HandleMatrix function to read in the next state. Returns true if next token encountered is a comma,
+	false otherwise. A comma signals the end of data for the current taxon in an UNALIGNED block.
+*/
+bool NxsUnalignedBlock::HandleNextState(
+  NxsToken & token,			/* is the token used to read from `in' */
+  unsigned taxNum,				/* is the row in range [0..ntax) (used for error reporting only) */
+  unsigned charNum,				/* is the column (used for error reporting only) */
+  NxsDiscreteStateRow & row, const NxsString &nameStr)	/* is the container for storing new state */
+	{
+	token.SetLabileFlagBit(NxsToken::parentheticalToken);
+	token.SetLabileFlagBit(NxsToken::curlyBracketedToken);
+	token.SetLabileFlagBit(NxsToken::singleCharacterToken);
+
+	token.GetNextToken();
+
+	if (token.Equals(",") || token.Equals(";"))
+		return false;
+	const NxsString stateAsNexus = token.GetToken();
+	const NxsDiscreteStateCell stateCode = mapper.EncodeNexusStateString(stateAsNexus, token, taxNum, charNum, NULL, nameStr);
+	if (charNum < row.size())
+		row[charNum] = stateCode;
+	else
+		{
+		while (charNum < row.size())
+			row.push_back(NXS_INVALID_STATE_CODE);
+		row.push_back(stateCode);
+		}
+	return true;
+	}
+
+/*!
+	Called when MATRIX command needs to be parsed from within the UNALIGNED block. Deals with everything after the
+	token MATRIX up to and including the semicolon that terminates the MATRIX command.
+*/
+void NxsUnalignedBlock::HandleMatrix(
+  NxsToken & token)	/* is the token used to read from `in' */
+	{
+	if (taxa == NULL)
+		{
+		AssureTaxaBlock(false, token, "Matrix");
+		unsigned ntax = taxa->GetNTax();
+		if (ntax == 0)
+			{
+			errormsg = "Must precede ";
+			errormsg += NCL_BLOCKTYPE_ATTR_NAME;
+			errormsg += " block with a TAXA block or specify NEWTAXA and NTAX in the DIMENSIONS command";
+			throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+			}
+		}
+	const unsigned ntax = taxa->GetNTax();
+	uMatrix.clear();
+	uMatrix.resize(ntax);
+	unsigned indOfTaxInMemory = 0;
+	std::vector<unsigned> toInMem(nTaxWithData, UINT_MAX);
+	const unsigned ntlabels = taxa->GetNumTaxonLabels();
+	errormsg.clear();
+	bool taxaBlockNeedsLabels = (ntlabels == 0);
+	if (!taxaBlockNeedsLabels && ntlabels < nTaxWithData)
+		{
+		errormsg << "Not enough taxlabels are known to read characters for " << nTaxWithData << " taxa in the Matrix command.";
+		throw NxsException(errormsg, token);
+		}
+	for (unsigned indOfTaxInCommand = 0; indOfTaxInCommand < nTaxWithData; indOfTaxInCommand++)
+		{
+		NxsString nameStr;
+		if (labels)
+			{
+			token.GetNextToken();
+			nameStr = token.GetToken();
+			if (taxaBlockNeedsLabels)
+				{
+				if (taxa->IsAlreadyDefined(nameStr))
+					{
+					errormsg << "Data for this taxon (" << nameStr << ") has already been saved";
+					throw NxsException(errormsg, token);
+					}
+				try {
+					indOfTaxInMemory = taxa->AddTaxonLabel(nameStr);
+					}
+				catch (NxsException &x)
+					{
+					if (nameStr == ";")
+						{
+						errormsg << "Unexpected ; after only " << indOfTaxInCommand << " taxa were read (expecting characters for " << nTaxWithData << " taxa).";
+						throw NxsException(errormsg, token);
+						}
+					x.addPositionInfo(token);
+					throw x;
+					}
+				}
+			else
+				{
+				unsigned numOfTaxInMemory = taxa->TaxLabelToNumber(nameStr);
+				if (numOfTaxInMemory == 0)
+					{
+					if (token.Equals(";"))
+						errormsg << "Unexpected ;";
+					else
+						errormsg << "Could not find taxon named " << nameStr << " among stored taxon labels";
+					throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+					}
+				indOfTaxInMemory = numOfTaxInMemory - 1;
+				}
+			}
+		else
+			{
+			indOfTaxInMemory = indOfTaxInCommand;
+			nameStr << 1+indOfTaxInMemory;
+			}
+		if (toInMem[indOfTaxInCommand] != UINT_MAX)
+			{
+			errormsg << "Characters for taxon " << indOfTaxInCommand << " (" << taxa->GetTaxonLabel(indOfTaxInMemory) << ") have already been stored";
+			throw NxsException(errormsg, token);
+			}
+		toInMem[indOfTaxInCommand] = indOfTaxInMemory;
+		NxsDiscreteStateRow * new_row = &uMatrix[indOfTaxInMemory];
+		unsigned charInd = 0;
+		while (HandleNextState(token, indOfTaxInMemory, charInd, *new_row, nameStr))
+			charInd++;
+		}
+	}
+
+
+/*!
+	This function provides the ability to read everything following the block name (which is read by the NxsReader
+	object) to the END or ENDBLOCK statement. Characters are read from the input stream `in'. Overrides the abstract
+	virtual function in the base class.
+*/
+void NxsUnalignedBlock::Read(
+  NxsToken & token)	/* is the token used to read from `in' */
+	{
+	isEmpty = false;
+	isUserSupplied = true;
+
+	// This should be the semicolon after the block name
+	token.GetNextToken();
+	if (!token.Equals(";"))
+		{
+		errormsg = "Expecting ';' after ";
+		errormsg += NCL_BLOCKTYPE_ATTR_NAME;
+		errormsg += " block name, but found ";
+		errormsg += token.GetToken();
+		errormsg += " instead";
+		throw NxsException(errormsg, token.GetFilePosition(), token.GetFileLine(), token.GetFileColumn());
+		}
+	nTaxWithData = 0;
+
+	for (;;)
+		{
+		token.GetNextToken();
+		NxsBlock::NxsCommandResult res = HandleBasicBlockCommands(token);
+		if (res == NxsBlock::NxsCommandResult(STOP_PARSING_BLOCK))
+			return;
+		if (res != NxsBlock::NxsCommandResult(HANDLED_COMMAND))
+			{
+			if (token.Equals("DIMENSIONS"))
+				HandleDimensions(token);
+			else if (token.Equals("FORMAT"))
+				HandleFormat(token);
+			else if (token.Equals("TAXLABELS"))
+				HandleTaxLabels(token);
+			else if (token.Equals("MATRIX"))
+				HandleMatrix(token);
+			else
+				SkipCommand(token);
+			}
+		}	// for (;;)
+	}
+
+/*!
+	This function outputs a brief report of the contents of this UNALIGNED block. Overrides the abstract virtual
+	function in the base class.
+*/
+void NxsUnalignedBlock::Report(
+  std::ostream & out) NCL_COULD_BE_CONST /* is the output stream to which to write the report */ /*v2.1to2.2 1 */
+	{
+	out << '\n' << NCL_BLOCKTYPE_ATTR_NAME << " block contains ";
+	if (nTaxWithData == 0)
+		out << "no taxa";
+	else if (nTaxWithData == 1)
+		out << "one taxon";
+	else
+		out << nTaxWithData << " taxa";
+
+	out << "\n  Data type is \"" << this->GetDatatypeName() << "\"" << endl;
+
+	if (respectingCase)
+		out << "  Respecting case" << endl;
+	else
+		out << "  Ignoring case" << endl;
+
+	if (labels)
+		out << "  Taxon labels were provided on left side of matrix" << endl;
+	else
+		out << "  No taxon labels were provided on left side of matrix" << endl;
+
+	out << "  Missing data symbol is '" << missing << '\'' << endl;
+	out << "  Valid symbols are: " << symbols << endl;
+
+	int numEquateMacros = (int)equates.size();
+	if (numEquateMacros > 0)
+		{
+		out << "  Equate macros in effect:" << endl;
+		std::map<char, NxsString>::const_iterator i = equates.begin();
+		for (; i != equates.end(); ++i)
+			{
+			out << "    " << (*i).first << " = " << (*i).second << endl;
+			}
+		}
+	else
+		out << "  No equate macros have been defined" << endl;
+
+	out << "  Data matrix:" << endl;
+	DebugShowMatrix(out, "    ");
+	}
+
+/*!
+	Writes out the information in this block in NEXUS format to the specified std::ostream.
+*/
+void NxsUnalignedBlock::WriteAsNexus(
+  std::ostream & out)	/* is the output stream on which to write */
+  const
+	{
+	out << "BEGIN UNALIGNED;\n";
+	WriteBasicBlockCommands(out);
+	if (this->taxa && taxa->GetNumTaxonLabels() > this->nTaxWithData)
+		out << "    DIMENSIONS NTax=" << this->nTaxWithData << ";\n";
+
+	this->WriteFormatCommand(out);
+	this->WriteMatrixCommand(out);
+	WriteSkippedCommands(out);
+	out << "END;\n";
+	}
+
+/*!
+	Writes out the information in the MATRIX command in NEXUS format to the specified std::ostream.
+*/
+void NxsUnalignedBlock::WriteMatrixCommand(
+  std::ostream & out)	/* is the output stream on which to print the matrix */
+  const
+	{
+	NCL_ASSERT(taxa);
+	const unsigned ntax = taxa->GetNTax();
+	unsigned width = taxa->GetMaxTaxonLabelLength();
+	out << "Matrix";
+
+	//std::vector<unsigned> origIndexVec = this->GetOrigMatrixIndicesToWrite();
+	bool first = true;
+	for (unsigned i = 0; i < ntax; ++i)
+		{
+		if (!uMatrix[i].empty())
+			{
+			if (first)
+				out << "\n";
+			else
+				out << ",\n";
+			first = false;
+			NxsString nm = taxa->GetTaxonLabel(i); /*v2.1to2.2 4 */
+			std::string s = nm.c_str();
+			const std::string currTaxonLabel = NxsString::GetEscaped(taxa->GetTaxonLabel(i));
+			out << currTaxonLabel;
+
+			// Print out enough spaces to even up the left edge of the matrix output
+			unsigned currTaxonLabelLen = (unsigned)currTaxonLabel.size();
+			unsigned diff = width - currTaxonLabelLen;
+			for (unsigned k = 0; k < diff + 5; k++)
+				out << ' ';
+
+			WriteStatesForMatrixRow(out, i);
+			}
+		}
+	out << "\n;\n";
+	}
+
+void NxsUnalignedBlock::WriteStatesForMatrixRow(
+  std::ostream &out,				/* the output stream on which to write */
+  unsigned currTaxonIndex) const	/* the taxon, in range [0..`ntax') */
+	{
+	const NxsDiscreteStateRow & row = uMatrix[currTaxonIndex];
+	for (NxsDiscreteStateRow::const_iterator rIt = row.begin(); rIt != row.end(); ++rIt)
+		mapper.WriteStateCodeAsNexusString(out, *rIt);
+	}
+
+
+/*!
+	Writes out the information in the FORMAT command in NEXUS format to the specified std::ostream.
+*/
+void NxsUnalignedBlock::WriteFormatCommand(std::ostream &out) const
+	{
+	mapper.WriteStartOfFormatCommand(out);
+	if (this->respectingCase)
+		out << " RespectCase";
+	// Output terminating semicolon
+	out << ";\n";
+	}
+
+NxsUnalignedBlock *NxsUnalignedBlockFactory::GetBlockReaderForID(const std::string & idneeded, NxsReader *reader, NxsToken *)
+	{
+	if (reader == NULL || idneeded != "UNALIGNED")
+		return NULL;
+	NxsUnalignedBlock * nb  = new NxsUnalignedBlock(NULL);
+	nb->SetCreateImpliedBlock(true);
+	nb->SetImplementsLinkAPI(true);
+	return nb;
+	}
+
+/*!
+	Returns internal representation of the state for taxon `i', character `j', as a vector of integer values. In the
+	normal situation, there is only one state with no uncertainty or polymorphism and the vector returned will contain
+	only a single, positive integer value. If there are multiple states, the vector will contain k values, where k
+	equals the number of states plus 1. The first value in the vector will be either 0 (indicating ambiguity) or 1
+	(meaning polymorphism), and the remaining values will be positive integers each of which is an index into the
+	symbols array. In the case of missing data, an empty vector will be returned. In an UNALIGNED block, there are a
+	different number of characters for each taxon. Use NumCharsForTaxon before calling this function to make sure you
+	do not ask for a character beyond the end. If that happens, a NxsUnalignedBlock::NxsX_NoSuchCharacter exception
+	will be thrown. If no data is stored for taxon `i' in this UNALIGNED block, a NxsUnalignedBlock::NxsX_NoDataForTaxon
+	exception will be thrown, with the exception object storing the offending taxon index in its public data member
+	`taxon_index'.
+*/
+NxsDiscreteStateRow NxsUnalignedBlock::GetInternalRepresentation(
+  unsigned taxInd,	/* is the index of the taxon in the TAXA block in range [0..`ntaxTotal') */
+  unsigned charInd)	/* is the character index (greater than or equal to 0) */
+	{
+	if (taxInd >= uMatrix.size())
+		throw NxsUnalignedBlock::NxsX_NoDataForTaxon(taxInd);
+	NxsDiscreteStateRow & row = uMatrix[taxInd];
+	if (charInd >= (unsigned)row.size())
+		return NxsDiscreteStateRow();
+	return mapper.GetStateVectorForCode(row[charInd]);
+	}
+
+/*!
+	Returns number of characters stored for taxon whose index in the TAXA block is `i'. In an UNALIGNED block,
+	each taxon can have a different number of characters, and this function can be used to find out how many characters
+	are stored for any particular taxon. Note that `i' should be the index of the taxon of interest as it appears in
+	the TAXA block. Because there may be fewer taxa in this UNALIGNED block (`ntax') than there are in the TAXA block
+	(`ntaxTotal'), it is possible that no data were stored for the taxon having index `i', in which case a
+	NxsUnalignedBlock::NxsX_NoDataForTaxon exception is thrown.
+*/
+unsigned NxsUnalignedBlock::NumCharsForTaxon(
+  unsigned taxInd)	/* is the index of the taxon in range [0..`ntaxTotal') */
+	{
+	if (taxInd >= uMatrix.size())
+		throw NxsUnalignedBlock::NxsX_NoDataForTaxon(taxInd);
+	return (unsigned)uMatrix[taxInd].size();
+	}
+
+
+/*!
+	Returns the number of states for taxon `i', character `j'. If `j' is equal to or greater than the number of
+	characters for taxon `i', returns UINT_MAX. If there is missing data, the return value is 0, otherwise a positive
+	integer will be returned. An alternative is to use the function GetInternalRepresentation to obtain a vector of all
+	states, and the size of that vector could be used to determine both the number and the identity of the states. If
+	no data was stored for the taxon having index i in the UNALIGNED block, a NxsUnalignedBlock::NxsX_NoDataForTaxon
+	exception is thrown.
+*/
+unsigned NxsUnalignedBlock::GetNumStates(
+  unsigned taxInd,	/* the taxon in range [0..`ntaxTotal') */
+  unsigned charInd)	/* the character in range [0..`nchar') */
+	{
+	if (taxInd >= uMatrix.size())
+		throw NxsUnalignedBlock::NxsX_NoDataForTaxon(taxInd);
+	NxsDiscreteStateRow & row = uMatrix[taxInd];
+	if (charInd >= (unsigned)row.size())
+		return UINT_MAX;
+	return mapper.GetNumStatesInStateCode(row[charInd]);
+	}
+
+/*!
+	Returns true if the state at taxon `taxInd', character `j' is the missing state, false otherwise. Throws NxsException if
+	`j' is too large (i.e. specifies a character beyond the last character for `uMatrix' row `taxInd'). Calls
+	NxsUnalignedBlock::GetInternalRepresentation, so unless all you need is information about missing data, it is more
+	efficient to simply call GetInternalRepresentation and see if the returned vector is empty. Note that `taxInd' should be
+	the index of the taxon in the TAXA block. If data for that taxon has not been stored in this UNALIGNED block, then
+	a NxsUnalignedBlock::NxsX_NoDataForTaxon exception will be thrown by GetInternalRepresentation.
+*/
+bool NxsUnalignedBlock::IsMissingState(
+  unsigned taxInd,	/* the taxon, in range [0..`ntaxTotal') */
+  unsigned charInd)	/* the character, in range [0..infinity) */
+	{
+	if (taxInd >= uMatrix.size())
+		throw NxsNCLAPIException("Taxon index out of range of NxsUnalignedBlock::IsMissingState");
+	NxsDiscreteStateRow & row = uMatrix[taxInd];
+	if (charInd >= (unsigned)row.size())
+		throw NxsNCLAPIException("Character index out of range of NxsUnalignedBlock::IsMissingState");
+	return mapper.GetNumStates()  == (unsigned) row[charInd];
+	}
+
+/*!
+	Returns true if taxon `taxInd' is polymorphic for character `j', false otherwise. Throws NxsException if `j' is too large
+	(i.e. specifies a character beyond the last character for `uMatrix' row `taxInd'). Calls
+	NxsUnalignedBlock::GetInternalRepresentation, so unless all you need is information about polymorphism, it is more
+	efficient to simply call GetInternalRepresentation and extract the information you need from the returned vector.
+	Note that `taxInd' should be the index of the taxon in the TAXA block. If data for that taxon has not been stored in this
+	UNALIGNED block, then a NxsUnalignedBlock::NxsX_NoDataForTaxon exception will be thrown by
+	GetInternalRepresentation.
+*/
+bool NxsUnalignedBlock::IsPolymorphic(
+  unsigned taxInd,	/* the taxon in range [0..`ntaxTotal') */
+  unsigned charInd)	/* the character in range [0..infinity) */
+	{
+	if (taxInd >= uMatrix.size())
+		throw NxsNCLAPIException("Taxon index out of range of NxsUnalignedBlock::IsMissingState");
+	NxsDiscreteStateRow & row = uMatrix[taxInd];
+	if (charInd >= (unsigned)row.size())
+		throw NxsNCLAPIException("Character index out of range of NxsUnalignedBlock::IsMissingState");
+	return mapper.IsPolymorphic(row[charInd]);
+	}
+
+
diff --git a/lib/ncl-2.1.18/ncl/nxsunalignedblock.h b/lib/ncl-2.1.18/ncl/nxsunalignedblock.h
new file mode 100644
index 0000000..9826c41
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsunalignedblock.h
@@ -0,0 +1,332 @@
+//	Copyright (C) 2007 Paul O. Lewis
+//
+//	This file is part of NCL (Nexus Class Library) version 2.0.
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+#ifndef NCL_NXSUNALIGNEDBLOCK_H
+#define NCL_NXSUNALIGNEDBLOCK_H
+
+#include "ncl/nxsdefs.h"
+#include "ncl/nxstaxablock.h"
+#include "ncl/nxscharactersblock.h"
+//@POL Note: This file is not yet ready for use (Paul Lewis, 19-May-2007)
+
+class NxsTaxaBlockAPI;
+
+/*!
+	This class handles reading and storage for the NEXUS block UNALIGNED. It overrides the member functions Read and
+	Reset, which are abstract virtual functions in the base class NxsBlock.
+>
+	Below is a table showing the correspondence between the elements of an UNALIGNED block in a NEXUS file and the
+	variables and member functions of the NxsUnalignedBlock class that can be used to access each piece of information
+	stored. Items in parenthesis should be viewed as "see also" items.
+>
+	NEXUS		  Command		 Data			Member
+	Command		  Atribute		 Member			Functions
+	---------------------------------------------------------------------
+	DIMENSIONS	  NEWTAXA		 newtaxa
+
+				  NTAX			 ntax			GetNTax
+
+	FORMAT		  DATATYPE		 datatype		GetDataType
+
+				  RESPECTCASE	 respectingCase IsRespectCase
+
+				  MISSING		 missing		GetMissingSymbol
+
+				  SYMBOLS		 symbols		GetSymbols
+
+				  EQUATE		 equates		GetEquateKey
+												GetEquateValue
+												GetNumEquates
+
+				  (NO)LABELS	 labels			IsLabels
+
+	TAXLABELS					 taxonLabels	GetTaxonLabels
+
+	MATRIX						 matrix			GetState
+												GetInternalRepresentation
+												GetNumStates
+												GetNumMatrixRows
+												IsPolymorphic
+>
+*/
+class NxsUnalignedBlock
+  : public NxsBlock, public NxsTaxaBlockSurrogate
+	{
+	public:
+
+		class NxsX_NoDataForTaxon
+			{
+			public:
+				NxsX_NoDataForTaxon(unsigned i) : taxon_index(i) {}
+				unsigned taxon_index;
+			};	/* thrown if a function is called with an index to a taxon for which no data is stored */
+
+								NxsUnalignedBlock(NxsTaxaBlockAPI * tb);
+		virtual					~NxsUnalignedBlock();
+
+		void					ShowStateLabels(std::ostream & out, NxsDiscreteDatum s);
+		NxsCharactersBlock::DataTypesEnum	GetDataType() const ;
+		NxsCharactersBlock::DataTypesEnum	GetOriginalDataType() const ;
+		const NxsDiscreteStateRow * GetDiscreteMatrixRow(unsigned taxInd) const
+			{
+			if (taxInd >= uMatrix.size())
+				return NULL;
+			return &uMatrix[taxInd];
+			}
+		NxsDiscreteStateRow		GetInternalRepresentation(unsigned i, unsigned j);
+		unsigned				GetNTaxWithData();
+		unsigned				GetNTaxTotal();
+		unsigned				GetNTaxTotal() const;
+		unsigned				GetNumEquates();
+		unsigned				GetNumMatrixRows();
+		unsigned				GetNumStates(unsigned i, unsigned j);
+		unsigned				NumCharsForTaxon(unsigned i);
+		char					GetMissingSymbol();
+		bool					IsLabels();
+		bool					IsMissingState(unsigned i, unsigned j);
+		bool					IsPolymorphic(unsigned i, unsigned j);
+		bool					IsRespectCase();
+		unsigned				GetStateSymbolIndex(unsigned i, unsigned j, unsigned k = 0);	// added by mth for standard data types
+		const char *			GetSymbols();
+		virtual void			DebugShowMatrix(std::ostream & out, const char * marginText = NULL) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		virtual void			Report(std::ostream & out) NCL_COULD_BE_CONST ; /*v2.1to2.2 1 */
+		virtual void			Reset();
+		void					SetNexus(NxsReader *nxsptr)
+			{
+			NxsBlock::SetNexus(nxsptr);
+			NxsTaxaBlockSurrogate::SetNexusReader(nxsptr);
+			}
+		virtual const std::string & GetBlockName() const
+			{
+			return NCL_BLOCKTYPE_ATTR_NAME;
+			}
+
+		void					WriteAsNexus(std::ostream & out) const;
+		void					WriteFormatCommand(std::ostream & out) const;
+		void					WriteMatrixCommand(std::ostream & out) const;
+		const char *			GetDatatypeName() const
+			{
+			return NxsCharactersBlock::GetNameOfDatatype(datatype);
+			}
+
+		virtual VecBlockPtr		GetImpliedBlocks()
+			{
+			return GetCreatedTaxaBlocks();
+			}
+
+		/*only used it the linkAPI is enabled*/
+		virtual void		HandleLinkCommand(NxsToken & token)
+			{
+			HandleLinkTaxaCommand(token);
+			}
+		virtual void		WriteLinkCommand(std::ostream &out) const
+			{
+			WriteLinkTaxaCommand(out);
+			}
+
+		/*---------------------------------------------------------------------------------------
+		| Results in aliasing of the taxa, assumptionsBlock blocks!
+		*/
+		NxsUnalignedBlock & operator=(const NxsUnalignedBlock &other)
+			{
+			Reset();
+			CopyBaseBlockContents(static_cast<const NxsBlock &>(other));
+			CopyTaxaBlockSurrogateContents(other);
+			CopyUnalignedBlockContents(other);
+			return *this;
+			}
+
+		/*---------------------------------------------------------------------------------------
+		| Results in aliasing of the taxa, assumptionsBlock blocks!
+		*/
+		virtual void CopyUnalignedBlockContents(const NxsUnalignedBlock &other)
+			{
+			nChar = other.nChar;
+			nTaxWithData = other.nTaxWithData;
+			matchchar = other.matchchar;
+			respectingCase = other.respectingCase;
+			transposing = other.transposing;
+			labels = other.labels;
+			missing = other.missing;
+			gap = other.gap;
+			symbols = other.symbols;
+			equates = other.equates;
+			mapper = other.mapper;
+			uMatrix = other.uMatrix;
+			datatype = other.datatype;
+			statesFormat = other.statesFormat;
+			}
+
+		virtual NxsUnalignedBlock * Clone() const
+			{
+			NxsUnalignedBlock * a = new NxsUnalignedBlock(taxa);
+			*a = *this;
+			return a;
+			}
+		bool 		SwapEquivalentTaxaBlock(NxsTaxaBlockAPI * tb)
+		{
+			return SurrogateSwapEquivalentTaxaBlock(tb);
+		}
+        std::string GetMatrixRowAsStr(const unsigned rowIndex) const;
+	protected:
+		bool					IsInSymbols(char ch);
+		void					HandleDimensions(NxsToken & token);
+		void					HandleEndblock(NxsToken & token);
+		virtual void			HandleFormat(NxsToken & token);
+		virtual void			HandleMatrix(NxsToken & token);
+		virtual bool			HandleNextState(NxsToken & token, unsigned taxInd, unsigned charInd, NxsDiscreteStateRow & new_row, const NxsString &);
+		virtual void			Read(NxsToken & token);
+		void					ResetSymbols();
+		std::string				FormatState(NxsDiscreteDatum x) const;
+
+		void					WriteStatesForMatrixRow(std::ostream &out, unsigned currTaxonIndex) const;
+
+		unsigned				nChar;				/* number of columns in matrix	*/
+		unsigned				nTaxWithData;		/* number of non empty rows in the matrix*/
+
+		char					matchchar;			/* match symbol to use in matrix */
+		bool					respectingCase;		/* if true, RESPECTCASE keyword specified in FORMAT command */
+		bool					transposing;		/* indicates matrix will be in transposed format */
+		bool					labels;				/* indicates whether or not labels will appear on left side of matrix */
+
+		char					missing;			/* missing data symbol */
+		char                    gap; /* gap symbol, will often be \0, but can be - */
+
+		std::string				symbols;			/* list of valid character state symbols */
+		std::map<char, NxsString> equates;			/* list of associations defined by EQUATE attribute of FORMAT command */
+
+		NxsDiscreteDatatypeMapper mapper;
+		NxsDiscreteStateMatrix	uMatrix;		/* storage for unaligned data */
+
+	private:
+		NxsCharactersBlock::DataTypesEnum			datatype;			/* flag variable (see datatypes enum) */
+		NxsCharactersBlock::DataTypesEnum			originalDatatype;			/* flag variable (see datatypes enum) */
+		NxsCharactersBlock::StatesFormatEnum		statesFormat;
+
+		NxsDiscreteStateCell						GetStateIndex(unsigned i, unsigned j, unsigned k);
+		void					ResetDatatypeMapper();
+		bool					TaxonIndHasData(const unsigned ind) const;
+		friend class PublicNexusReader;
+		friend class MultiFormatReader;
+	};
+
+class NxsUnalignedBlockFactory
+	:public NxsBlockFactory
+	{
+	public:
+		virtual NxsUnalignedBlock  *GetBlockReaderForID(const std::string & NCL_BLOCKTYPE_ATTR_NAME, NxsReader *reader, NxsToken *token);
+	};
+
+/*!
+	Returns datatype listed in the CHARACTERS block.
+	The original datatype can differ from the current datatype if the symbols list of a built in type was augmented
+	(thus converting it to standard).
+*/
+inline NxsCharactersBlock::DataTypesEnum NxsUnalignedBlock::GetOriginalDataType() const
+	{
+	return originalDatatype;
+	}
+
+
+/*!
+	Returns value of `datatype' as an unsigned integer. If you want the name of the datatype, you should call
+	NxsUnalignedBlock::GetDatatypeName instead.
+*/
+inline NxsCharactersBlock::DataTypesEnum NxsUnalignedBlock::GetDataType() const
+	{
+	return datatype;
+	}
+
+
+/*!
+	Returns the missing data symbol currently in effect. If no missing data symbol specified, returns '\0'.
+*/
+inline char NxsUnalignedBlock::GetMissingSymbol()
+	{
+	return missing;
+	}
+
+/*!
+	Returns the number of taxa that have data (or will have data according to the Dimensions command, if the matrix
+		has not been read.
+*/
+inline unsigned NxsUnalignedBlock::GetNTaxWithData()
+	{
+	return nTaxWithData;
+	}
+
+/*!
+	Returns the number of taxa in the taxa block associated with the unaligned block.
+*/
+inline unsigned NxsUnalignedBlock::GetNTaxTotal()
+	{
+	return (unsigned)uMatrix.size();
+	}
+
+/*!
+	Returns the number of taxa in the taxa block associated with the unaligned block.
+*/
+inline unsigned NxsUnalignedBlock::GetNTaxTotal() const
+	{
+	return (unsigned)uMatrix.size();
+	}
+
+/*!
+	Returns the number of stored equate associations.
+*/
+inline unsigned NxsUnalignedBlock::GetNumEquates()
+	{
+	return (unsigned)equates.size();
+	}
+
+/*!
+	Returns the number of actual rows in `matrix'. This number is equal to `ntax', and hence this function is identical
+	to GetNTax. Note that `ntax' can be smaller than `ntaxTotal' since the user did not have to provide data for all
+	taxa specified in the TAXA block.
+*/
+inline unsigned NxsUnalignedBlock::GetNumMatrixRows()
+	{
+	return (unsigned)uMatrix.size();
+	}
+
+/*!
+	Returns data member `symbols'. Warning: returned value may be NULL.
+*/
+inline const char * NxsUnalignedBlock::GetSymbols()
+	{
+	return symbols.c_str();
+	}
+
+/*!
+	Returns true if LABELS was specified in the FORMAT command, false otherwise.
+*/
+inline bool NxsUnalignedBlock::IsLabels()
+	{
+	return labels;
+	}
+
+/*!
+	Returns true if RESPECTCASE was specified in the FORMAT command, false otherwise.
+*/
+inline bool NxsUnalignedBlock::IsRespectCase()
+	{
+	return respectingCase;
+	}
+
+#endif
diff --git a/lib/ncl-2.1.18/ncl/nxsunalignedblock.lo b/lib/ncl-2.1.18/ncl/nxsunalignedblock.lo
new file mode 100644
index 0000000..2555f55
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsunalignedblock.lo
@@ -0,0 +1,12 @@
+# nxsunalignedblock.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.1
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nxsunalignedblock.o'
+
+# Name of the non-PIC object
+non_pic_object='nxsunalignedblock.o'
+
diff --git a/lib/ncl-2.1.18/ncl/nxsutilcopy.h b/lib/ncl-2.1.18/ncl/nxsutilcopy.h
new file mode 100644
index 0000000..eee67e3
--- /dev/null
+++ b/lib/ncl-2.1.18/ncl/nxsutilcopy.h
@@ -0,0 +1,264 @@
+//	Copyright (C) 2008 Mark Holder
+//
+//	This file is part of NCL (Nexus Class Library) version 2.1
+//
+//	NCL is free software; you can redistribute it and/or modify
+//	it under the terms of the GNU General Public License as published by
+//	the Free Software Foundation; either version 2 of the License, or
+//	(at your option) any later version.
+//
+//	NCL is distributed in the hope that it will be useful,
+//	but WITHOUT ANY WARRANTY; without even the implied warranty of
+//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//	GNU General Public License for more details.
+//
+//	You should have received a copy of the GNU General Public License
+//	along with NCL; if not, write to the Free Software Foundation, Inc.,
+//	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+// This code is based on code developed by Mark Holder for the CIPRES project
+// Much of this file comes from Andrei Alexandrescu "Modern C++ Design"
+
+#if !defined NXS_UTIL_COPY_H
+#define NXS_UTIL_COPY_H
+#include <algorithm>
+#include <cstring>
+
+#if defined(_MSC_VER)
+#	undef	HAVE_COMPILE_TIME_DISPATCH
+#else
+#	define HAVE_COMPILE_TIME_DISPATCH
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+///	Int2Type<compile time constant integer> defines a unique (and stateless)
+///		class associated with a given integer.  Used for compile time dispatching
+///		of function calls or creation of appropriate templated classes.
+///
+///	defines an unnamed enum "value" that is equal to the integer used to
+///		define the class.
+///	\author	Andrei Alexandrescu "Modern C++ Design"
+//////////
+
+template<int v>
+class Int2Type
+	{
+		public:
+			enum {value = v};
+	};
+
+typedef Int2Type<true>  TrueAsAType;
+typedef Int2Type<false> FalseAsAType;
+
+////////////////////////////////////////////////////////////////////////////////
+///	Type2Type<typename> defines a unique (and stateless) class for each type
+///		that is specified as the template argument.
+///	This is useful in controlling the return type of templated functions in
+///		lieu of partial template specialization of templated functions (which is
+///		not allowed by the C++ standard)
+///	Defines the typedef OriginalType which corresponds to the template argument
+///	\author	Andrei Alexandrescu "Modern C++ Design"
+//////////
+
+template<typename T>
+class Type2Type
+	{
+		public:
+			typedef T OriginalType;
+	};
+
+
+namespace ncl
+{
+namespace hidden
+{
+// used by #COMPILE_TIME_ASSERT
+template<bool> struct CompileTimeChecker
+	{
+	CompileTimeChecker(...); //default
+	};
+// used by #COMPILE_TIME_ASSERT
+template<> struct CompileTimeChecker<false>{};
+}
+}
+
+////////////////////////////////////////////////////////////////////////////////
+///	\def COMPILE_TIME_ASSERT(condition, msg)
+///	\brief A error-detection macro for asserting that conditions are true at compile time.
+///
+///	Usage:
+///
+///		COMPILE_TIME_ASSERT(condition to test, error_clue)
+///
+///	\note	The error_clue must be one alphanumeric word (no spaces of punctaution).
+///	The condition to test must be known at compile time (if not a cryptic message such as "illegal non-type template argument"
+///	error will be generated.
+///	If the compile time assertion evaluates to false, a message such as "Illegal conversion
+///		from ERROR_error_clue to CompileTimeChecker<false> ..." will be generated.
+///
+///	Implementation Details:
+///
+///		ncl::hidden::CompileTimeChecker is a boolean-templated class.
+///		The constructor of ncl::hidden::CompileTimeChecker<true> accepts any type
+///		The the only constructor for ncl::hidden::CompileTimeChecker<false> is the default constructor
+///		The macro COMPILE_TIME_ASSERT(condition, msg):
+///			1	Declares a dummy class ERROR_msg
+///			2	checks if it can instantiate CompileTimeChecker<condition> from an ERROR_msg type object.
+///		If the condition is true, the construction will succeed, if not the error message will be generated
+///		Note that while the  CompileTimeChecker exists in ncl::hidden:: namespace.  The macro is visible
+///		by any file that includes compile_assert.h and the class such as ERROR_msg will be added to the global
+///		namespace.
+///		The resultign code is not affected by the insertion of COMPILE_TIME_ASSERT because the entire construction
+///		is inside a sizeof() so no objects are really instantiated.
+///
+///	\author	Andrei Alexandrescu "Modern C++ Design"
+///
+//////////
+#define COMPILE_TIME_ASSERT(condition, msg) {class ERROR_##msg {}; (void)sizeof(ncl::hidden::CompileTimeChecker<(condition)>(ERROR_##msg()));}
+
+#if defined(HAVE_COMPILE_TIME_DISPATCH)
+template<typename T> struct SupportsBitwiseCopy { enum {kResult = false};	};
+template<typename T> struct SupportsBitwiseCopy<T*> {	enum {kResult = true}; 	};
+template<> struct SupportsBitwiseCopy<short int> {	enum {kResult = true}; 	};
+template<> struct SupportsBitwiseCopy<int> {	enum {kResult = true}; 	};
+template<> struct SupportsBitwiseCopy<char> {	enum {kResult = true}; 	};
+template<> struct SupportsBitwiseCopy<long int> {	enum {kResult = true}; 	};
+template<> struct SupportsBitwiseCopy<double> {	enum {kResult = true}; 	};
+template<> struct SupportsBitwiseCopy<unsigned short int> {	enum {kResult = true}; 	};
+template<> struct SupportsBitwiseCopy<unsigned int> {	enum {kResult = true}; 	};
+template<> struct SupportsBitwiseCopy<unsigned char> {	enum {kResult = true}; 	};
+template<> struct SupportsBitwiseCopy<unsigned long int> {	enum {kResult = true}; 	};
+template<> struct SupportsBitwiseCopy<bool> {	enum {kResult = true}; 	};
+template<> struct SupportsBitwiseCopy<wchar_t> {	enum {kResult = true}; 	};
+template<> struct SupportsBitwiseCopy<float> {	enum {kResult = true}; 	};
+template<> struct SupportsBitwiseCopy<long double> {	enum {kResult = true}; 	};
+
+
+//	This file uses tricks discussed in Andrei Alexandrescu's book to
+//	implement a call to memcpy for primitive types or any class which
+//  has the statement template<> struct SupportsBitwiseCopy<CLASS> {	enum {kResult = true}; 	};
+//	because of potential portability issues with TypeList, primitive types are
+//	have SupportsBitwiseCopy specialized here by brute force enumeration
+
+
+class NullType {};
+
+template <typename T>
+class TypeTraits
+	{
+	private :
+		template <class U> struct PointerTraits
+			{
+				enum {kResult = false};
+				enum {kCopyWithMemCopy = false};	// only allowing memcpy on bare pointers
+				enum {kSizeOfPointee = 0};	// only allowing memcpy on bare pointers
+			};
+		template <class U> struct PointerTraits<U*>
+			{
+				enum {kResult = true};
+				enum {kCopyWithMemCopy = SupportsBitwiseCopy<U>::kResult};
+				enum {kSizeOfPointee = sizeof(U)};
+			};
+		template <class U> struct PointerTraits<const U*>
+			{
+				enum {kResult = true};
+				enum {kCopyWithMemCopy = SupportsBitwiseCopy<U>::kResult};
+				enum {kSizeOfPointee = sizeof(U)};
+			};
+	public:
+		enum {kIsPointer = PointerTraits<T>::kResult};
+		enum {kCanUseMemCpyOnPointee = PointerTraits<T>::kCopyWithMemCopy};
+		enum {kPointeeSize = PointerTraits<T>::kSizeOfPointee}; //only valid if kIsPointer !!
+	//	typedef PointerTraits<T>::PointeeType  PointeeType;
+	};
+
+template<class T, class U>
+class Conversion
+	{
+	public:
+		enum {kSameType = false};
+	};
+
+template<class T>
+class Conversion<T,T>
+	{
+	public:
+		enum {kSameType = true};
+	};
+
+template<class T>
+class Conversion<const T*,T*>
+	{
+	public:
+		enum {kSameType = true};
+	};
+
+template<class T>
+class Conversion<T*, const T*>
+	{
+	public:
+		enum {kSameType = true};
+	};
+
+enum CopyAlgoSeclector
+	{
+		kConservative,
+		kFast
+	};
+
+template <typename InIt, typename OutIt>
+inline OutIt CopyImpl(InIt first, InIt last, OutIt resultP, Int2Type<kConservative>)
+	{
+	return std::copy(first, last, resultP);
+	}
+
+template <typename InIt, typename OutIt>
+inline OutIt CopyImpl(InIt first, InIt last, OutIt resultP, Int2Type<kFast>)
+	{
+	return (OutIt) std::memcpy(resultP, first,  ((std::size_t) (last - first)) * sizeof(*first));
+	}
+
+template <typename InIt, typename OutIt>
+OutIt ncl_copy(InIt first, InIt last, OutIt resultP)
+	{
+		enum { kUseMemCpy =(TypeTraits<InIt>::kIsPointer &&
+							TypeTraits<OutIt>::kIsPointer &&
+							TypeTraits<InIt>::kCanUseMemCpyOnPointee &&
+							TypeTraits<OutIt>::kCanUseMemCpyOnPointee &&
+							int(TypeTraits<InIt>::kPointeeSize) == int(TypeTraits<OutIt>::kPointeeSize)) ? kFast : kConservative};
+		return CopyImpl(first, last, resultP, Int2Type<kUseMemCpy>());
+	}
+
+#else //HAVE_COMPILE_TIME_DISPATCH
+
+template <typename InIt, typename OutIt>
+inline OutIt ncl_copy(InIt first, InIt last, OutIt resultP)
+	{
+	return std::copy(first, last, resultP);
+	}
+
+#endif //HAVE_COMPILE_TIME_DISPATCH
+
+
+//adds an element from the first -> last array to the corresponding element in the result array
+template <typename InIt, typename OutIt>
+inline OutIt ncl_iadd(InIt first, InIt last, OutIt resultP)
+	{
+	for (; first != last; ++first, ++resultP)
+		*resultP += *first;
+	return resultP;
+	}
+
+//adds each element in resultP array with the correcpsonding element from the first -> last array
+template <typename InIt, typename OutIt>
+inline OutIt ncl_imult(InIt first, InIt last, OutIt resultP)
+	{
+	for (; first != last; ++first, ++resultP)
+		*resultP *= *first;
+	return resultP;
+	}
+
+
+#endif
+
diff --git a/lib/ncl-2.1.18/nclv2.1.pc b/lib/ncl-2.1.18/nclv2.1.pc
new file mode 100644
index 0000000..de101e7
--- /dev/null
+++ b/lib/ncl-2.1.18/nclv2.1.pc
@@ -0,0 +1,12 @@
+prefix=/usr/local
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+
+Name: NCL
+Description: NCL is a general purpose library for handling Nexus and other common formats used in phyloinformatics.
+Version: 2.1
+Libs: -L${libdir}/ncl -llibncl.la
+Cflags: -I${includedir}/ncl
+
+
diff --git a/lib/ncl-2.1.18/nclv2.1.pc.in b/lib/ncl-2.1.18/nclv2.1.pc.in
new file mode 100644
index 0000000..d409f8d
--- /dev/null
+++ b/lib/ncl-2.1.18/nclv2.1.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: NCL
+Description: NCL is a general purpose library for handling Nexus and other common formats used in phyloinformatics.
+Version: 2.1
+Libs: -L${libdir}/ncl -llibncl.la
+Cflags: -I${includedir}/ncl
+
+
diff --git a/lib/pll/alignment.c b/lib/pll/alignment.c
new file mode 100644
index 0000000..8082018
--- /dev/null
+++ b/lib/pll/alignment.c
@@ -0,0 +1,697 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file alignment.c
+ *
+ * @brief Collection of routines for reading alignments
+ *
+ * Auxiliary functions for storing alignments read from predefined file formats
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "pll.h"
+#include "pllInternal.h"
+
+/** @defgroup alignmentGroup Reading and parsing multiple sequence alignments
+    
+    This set of functions handles the reading and parsing of several file formats that describe multiple sequence alignments. They are also responsible for storing the alignment in an internal structure
+*/
+static pllAlignmentData * pllParsePHYLIP (const char * filename);
+static pllAlignmentData * pllParseFASTA (const char * filename);
+static int read_phylip_header (int * inp, int * sequenceCount, int * sequenceLength);
+static inline int parsedOk (int * actLen, int sequenceCount, int sequenceLength);
+static int parse_phylip (pllAlignmentData * alignmentData, int input);
+static int getFastaAlignmentInfo (int * inp, int * seqCount, int * seqLen);
+static int parseFastaAlignment (pllAlignmentData * alignmentData, int input);
+
+#ifdef __PLL_DEBUG_PARSER
+static int
+printTokens (int input)
+{
+  pllLexToken token;
+
+  do
+   {
+     NEXT_TOKEN
+
+     /* begin of parser */
+     switch (token.tokenType)
+      {
+        case PLL_TOKEN_NUMBER:
+          printf ("PLL_TOKEN_NUMBER (%.*s, %d)\n", token.len, token.lexeme, token.len);
+          break;
+        case PLL_TOKEN_STRING:
+          printf ("PLL_TOKEN_STRING (%.*s, %d)\n", token.len, token.lexeme, token.len);
+          break;
+        case PLL_TOKEN_EOF:
+          printf ("PLL_TOKEN_EOF\n");
+          break;
+        case PLL_TOKEN_WHITESPACE:
+          printf ("PLL_TOKEN_WHITESPACE\n");
+          break;
+        case PLL_TOKEN_NEWLINE:
+          printf ("PLL_TOKEN_NEWLINE\n");
+          break;
+        case PLL_TOKEN_UNKNOWN:
+          printf ("PLL_TOKEN_UNKNOWN (%.*s, %d)\n", token.len, token.lexeme, token.len);
+          break;
+        default:
+          break;
+      }
+     /* end of parser */
+
+
+   }
+  while (token.tokenType != PLL_TOKEN_EOF && token.tokenType != PLL_TOKEN_UNKNOWN);
+
+  if (token.tokenType == PLL_TOKEN_UNKNOWN) return (0);
+
+  return (1);
+}
+#endif
+
+/** @ingroup alignmentGroup
+    @brief Initialize alignment structure fields
+
+    Allocates memory for the data structure that will hold the alignment and
+    initializes it. It requires the number of sequences \a sequenceCount and
+    the length of sequences \a sequenceLength. It returns a pointer to the
+    initialized data structure.
+
+    @param sequenceCount
+      Number of sequences in the alignment
+    
+    @param sequenceLength
+      Length of the sequences
+
+    @param 
+      Initialized alignment data structured
+*/
+pllAlignmentData *
+pllInitAlignmentData (int sequenceCount, int sequenceLength)
+ {
+   int i;
+   pllAlignmentData * alignmentData;
+   void * mem;
+   
+   /** TODO */
+   alignmentData               =  (pllAlignmentData *) malloc (sizeof (pllAlignmentData));
+   alignmentData->sequenceData = (unsigned char **) malloc ((sequenceCount + 1) * sizeof (unsigned char *));
+   mem = (void *) malloc (sizeof (unsigned char) * (sequenceLength + 1) * sequenceCount);
+   for (i = 1; i <= sequenceCount; ++i)
+    {
+      alignmentData->sequenceData[i]                 = (unsigned char *) (mem + (i - 1) * (sequenceLength + 1) * sizeof (unsigned char));
+      alignmentData->sequenceData[i][sequenceLength] = 0;
+    }
+   alignmentData->sequenceData[0] = NULL;
+    
+   alignmentData->sequenceLabels = (char **) calloc ((sequenceCount + 1), sizeof (char *));
+
+   alignmentData->sequenceCount  = sequenceCount;
+   alignmentData->sequenceLength = sequenceLength;
+   /** TODO: remove siteWeights from alignment */
+   alignmentData->siteWeights    = NULL;
+
+   return (alignmentData);
+ }
+
+/** @ingroup alignmentGroup
+    @brief Deallocates the memory associated with the alignment data structure
+    
+    Deallocates the memory associated with the alignment data structure \a alignmentData.
+
+    @param alignmentData
+      The alignment data structure
+*/
+void
+pllAlignmentDataDestroy (pllAlignmentData * alignmentData)
+{
+  int i;
+
+  for (i = 1; i <= alignmentData->sequenceCount; ++ i)
+   {
+     rax_free (alignmentData->sequenceLabels[i]);
+   }
+  rax_free (alignmentData->sequenceLabels);
+  rax_free (alignmentData->sequenceData[1]);
+  rax_free (alignmentData->sequenceData);
+  rax_free (alignmentData->siteWeights);
+  rax_free (alignmentData);
+}
+
+
+/** @ingroup alignmentGroup
+    @brief Prints the alignment to the console
+
+    @param alignmentData
+      The alignment data structure
+*/
+void 
+pllAlignmentDataDumpConsole (pllAlignmentData * alignmentData)
+ {
+   int i;
+
+   printf ("%d %d\n", alignmentData->sequenceCount, alignmentData->sequenceLength);
+   for (i = 1; i <= alignmentData->sequenceCount; ++ i)
+    {
+      printf ("%s %s\n", alignmentData->sequenceLabels[i], alignmentData->sequenceData[i]);
+    }
+ }
+
+
+
+static void dump_fasta_content(FILE * fp, pllAlignmentData * alignmentData)
+{
+  int i;
+
+  for (i = 1; i <= alignmentData->sequenceCount; ++i)
+     fprintf (fp, ">%s\n%s\n", alignmentData->sequenceLabels[i], alignmentData->sequenceData[i]);
+}
+
+static void dump_phylip_content(FILE * fp, pllAlignmentData * alignmentData)
+{
+  int i;
+
+  for (i = 1; i <= alignmentData->sequenceCount; ++i)
+     fprintf (fp, "%s %s\n", alignmentData->sequenceLabels[i], alignmentData->sequenceData[i]);
+}
+
+/** @ingroup alignmentGroup
+    @brief Dump the alignment to a file of format \a fileFormat
+
+    Dumps the alignment contained in \a alignmentData to file \a filename of type \a fileFormat.
+
+    @note If \a filename exists, all contents will be erased
+
+    @param alignmentData
+      Alignment data structure
+
+    @param fileFormat
+      Format of output file. Can take the value \b PLL_FORMAT_PHYLIP or \b PLL_FORMAT_FASTA
+
+    @param filename
+      Output filename
+
+    @return
+      Returns \b PLL_TRUE on success, otherwise \b PLL_FALSE.
+*/
+int
+pllAlignmentDataDumpFile (pllAlignmentData * alignmentData, int fileFormat, const char * filename)
+{
+  FILE * fp;
+  void (*outfun)(FILE *, pllAlignmentData *);
+  
+  if (fileFormat != PLL_FORMAT_PHYLIP && fileFormat != PLL_FORMAT_FASTA) return (PLL_FALSE);
+
+  outfun = (fileFormat == PLL_FORMAT_PHYLIP) ? dump_phylip_content : dump_fasta_content;
+
+  fp = fopen (filename, "w");
+  if (!fp) return (PLL_FALSE);
+  
+  /* if PHYLIP print the silly header at the beginning */
+  if (fileFormat == PLL_FORMAT_PHYLIP)
+   {
+     fprintf (fp, "%d %d\n", alignmentData->sequenceCount, alignmentData->sequenceLength);
+   }
+  
+  outfun(fp, alignmentData);
+
+  fclose (fp);
+  return (PLL_TRUE);
+}
+
+
+
+/* ROUTINES FOR PHYLIP PARSING */
+/** @ingroup alignmentGroup
+    @brief Parse the PHYLIP file header
+*/
+static int
+read_phylip_header (int * inp, int * sequenceCount, int * sequenceLength)
+{
+  pllLexToken token;
+  int input;
+
+  input = *inp;
+
+
+  NEXT_TOKEN
+  CONSUME(PLL_TOKEN_WHITESPACE | PLL_TOKEN_NEWLINE)
+
+  if (token.tokenType != PLL_TOKEN_NUMBER) return (0);
+
+  *sequenceCount = atoi (token.lexeme);
+
+  NEXT_TOKEN
+  CONSUME(PLL_TOKEN_WHITESPACE | PLL_TOKEN_NEWLINE)
+  if (token.tokenType != PLL_TOKEN_NUMBER) return (0);
+
+  *sequenceLength = atoi (token.lexeme);
+
+  *inp = input;
+
+  return (*sequenceCount && *sequenceLength);
+}
+
+static inline int
+parsedOk (int * actLen, int sequenceCount, int sequenceLength)
+{
+  int i;
+
+  for (i = 1; i <= sequenceCount; ++ i)
+   {
+     if (actLen[i] != sequenceLength) return (0);
+   }
+  
+  return (1);
+}
+
+
+/** @ingroup alignmentGroup
+    @brief Parse the PHYLIP file body
+*/
+static int
+parse_phylip (pllAlignmentData * alignmentData, int input)
+{
+  int i,j;
+  pllLexToken token;
+  int * sequenceLength;
+  int rc;
+
+  sequenceLength = (int *) rax_calloc (alignmentData->sequenceCount + 1, sizeof (int));
+
+  NEXT_TOKEN
+  for (i = 0; ; ++i)
+  {
+    j = i % alignmentData->sequenceCount;
+    if (i < alignmentData->sequenceCount) 
+     {
+       if (token.tokenType == PLL_TOKEN_EOF)
+        {
+          rc = parsedOk (sequenceLength, alignmentData->sequenceCount, alignmentData->sequenceLength);
+          rax_free (sequenceLength);
+          return (rc);
+        }
+
+       if (token.tokenType == PLL_TOKEN_UNKNOWN)
+        {
+          rax_free (sequenceLength);
+          return (0);
+        }
+
+       CONSUME(PLL_TOKEN_WHITESPACE | PLL_TOKEN_NEWLINE)
+
+
+       if (token.tokenType != PLL_TOKEN_STRING && token.tokenType != PLL_TOKEN_NUMBER && token.tokenType != PLL_TOKEN_FLOAT)
+        {
+          rax_free (sequenceLength);
+          return (0);
+        }
+       alignmentData->sequenceLabels[i + 1] = strndup (token.lexeme, token.len);
+       NEXT_TOKEN
+       CONSUME(PLL_TOKEN_WHITESPACE | PLL_TOKEN_NEWLINE)
+     }
+    
+    while (1)
+     {
+       if (token.tokenType == PLL_TOKEN_EOF)
+        {
+          rc = parsedOk (sequenceLength, alignmentData->sequenceCount, alignmentData->sequenceLength);
+          rax_free (sequenceLength);
+          return (rc);
+        }
+
+       if (token.tokenType == PLL_TOKEN_UNKNOWN)
+        {
+         rax_free (sequenceLength);
+         return (0);
+        }
+       
+       if (token.tokenType == PLL_TOKEN_NEWLINE) break;
+
+       if (token.tokenType != PLL_TOKEN_STRING
+	   /* HACK: to make binary model work... */
+	   && token.tokenType != PLL_TOKEN_NUMBER
+	   )
+        {
+          rax_free (sequenceLength);
+          return (0);
+        }
+
+       if (sequenceLength[j + 1] + token.len > alignmentData->sequenceLength) 
+        {
+          fprintf (stderr, "Sequence %d is larger than specified\n", j + 1);
+          rax_free (sequenceLength);
+          return (0);
+        }
+       memmove (alignmentData->sequenceData[j + 1] + sequenceLength[j + 1], token.lexeme, token.len);
+       sequenceLength[j + 1] += token.len;
+
+       NEXT_TOKEN
+       CONSUME (PLL_TOKEN_WHITESPACE)
+     }
+    CONSUME(PLL_TOKEN_WHITESPACE | PLL_TOKEN_NEWLINE);
+  }
+}
+
+/* Phylip parsers. Use the following attributed grammar 
+ * 
+ *        S -> HEADER ENDL DATA
+ *   HEADER -> PLL_TOKEN_NUMBER PLL_TOKEN_WHITESPACE PLL_TOKEN_NUMBER ENDL |
+ *             PLL_TOKEN_WHITESPACE PLL_TOKEN_NUMBER PLL_TOKEN_WHITESPACE PLL_TOKEN_NUMBER ENDL
+ *     ENDL -> PLL_TOKEN_WHITESPACE PLL_TOKEN_NEWLINE | PLL_TOKEN_NEWLINE
+ *     DATA -> PLL_TOKEN_STRING PLL_TOKEN_WHITESPACE PLL_TOKEN_STRING ENDL DATA |
+ *             PLL_TOKEN_WHITESPACE PLL_TOKEN_STRING PLL_TOKEN_WHITESPACE PLL_TOKEN_STRING ENDL DATA | 
+ *             PLL_TOKEN_STRING PLL_TOKEN_WHITESPACE PLL_TOKEN_STRING PLL_TOKEN_EOF |
+ *             PLL_TOKEN_WHITESPACE PLL_TOKEN_STRING PLL_TOKEN_WHITESPACE PLL_TOKEN_STRING PLL_TOKEN_EOF
+ */
+
+/** @ingroup alignmentGroup
+    @brief Parse a PHYLIP file
+
+    Parses the PHYLIP file \a filename and returns a ::pllAlignmentData structure
+    with the alignment.
+
+    @param filename
+      Name of file to be parsed
+
+    @return
+      Returns a structure of type ::pllAlignmentData that contains the alignment, or \b NULL
+      in case of failure.
+*/
+static pllAlignmentData *
+pllParsePHYLIP (const char * filename)
+{
+  int 
+    i, input, sequenceCount, sequenceLength;
+  char * rawdata;
+  long filesize;
+  pllAlignmentData * alignmentData;
+
+  rawdata = pllReadFile (filename, &filesize);
+  if (!rawdata)
+   {
+     errno = PLL_ERROR_FILE_OPEN;
+     return (NULL);
+   }
+  
+  init_lexan (rawdata, filesize);
+  input = get_next_symbol();
+
+  /* parse the header to obtain the number of taxa and sequence length */
+  if (!read_phylip_header (&input, &sequenceCount, &sequenceLength))
+   {
+     rax_free (rawdata);
+     fprintf (stderr, "Error while parsing PHYLIP header (number of taxa and sequence length)\n");
+     errno = PLL_ERROR_PHYLIP_HEADER_SYNTAX;
+     return (NULL);
+   }
+
+  lex_table_amend_phylip();
+
+  /* allocate alignment structure */
+  alignmentData = pllInitAlignmentData (sequenceCount, sequenceLength);
+
+  if (! parse_phylip (alignmentData, input))
+   {
+     errno = PLL_ERROR_PHYLIP_BODY_SYNTAX;
+     pllAlignmentDataDestroy (alignmentData);
+     lex_table_restore();
+     rax_free (rawdata);
+     return (NULL);
+   }
+  
+  lex_table_restore();
+  rax_free (rawdata);
+
+  alignmentData->siteWeights  = (int *) rax_malloc (alignmentData->sequenceLength * sizeof (int));
+  for (i = 0; i < alignmentData->sequenceLength; ++ i) 
+    alignmentData->siteWeights[i] = 1;
+
+  return (alignmentData);
+}
+
+
+/* FASTA routines */
+/* only check whether it is a valid alignment in fasta format */
+/** @ingroup alignmentGroup
+    @brief Get information about the FASTA alignment
+
+    Get the information such as number of sequences and length of sequences of a FASTA alignment
+
+    @return
+      Returns \b PLL_TRUE if the alignment is valid, otherwise \b PLL_FALSE
+*/
+static int
+getFastaAlignmentInfo (int * inp, int * seqCount, int * seqLen)
+{
+  pllLexToken token;
+  int input;
+
+  input = *inp;
+
+  *seqCount = *seqLen = 0;
+
+  NEXT_TOKEN
+  CONSUME(PLL_TOKEN_WHITESPACE | PLL_TOKEN_NEWLINE)
+
+  if (token.tokenType != PLL_TOKEN_NUMBER && token.tokenType != PLL_TOKEN_STRING) return (PLL_FALSE);
+
+  while (1)
+   {
+     switch (token.tokenType)
+      {
+        case PLL_TOKEN_EOF:
+          return (PLL_TRUE);
+
+        case PLL_TOKEN_NUMBER:
+        case PLL_TOKEN_STRING:
+          if (token.len < 2 || token.lexeme[0] != '>') return (0);
+          break;
+        default:
+          return (PLL_FALSE);
+      }
+     
+     NEXT_TOKEN
+     CONSUME(PLL_TOKEN_WHITESPACE | PLL_TOKEN_NEWLINE)
+
+     /* read second token (sequence) */
+     switch (token.tokenType)
+      {
+        case PLL_TOKEN_EOF:
+          return (PLL_FALSE);
+          break;
+
+        case PLL_TOKEN_NUMBER:
+        case PLL_TOKEN_STRING:
+          if (!*seqLen)
+            *seqLen = token.len;
+          else
+           {
+             if (*seqLen != token.len) return (0);
+           }
+          break;
+        default:
+          return (PLL_FALSE);
+      }
+     NEXT_TOKEN
+     CONSUME(PLL_TOKEN_WHITESPACE | PLL_TOKEN_NEWLINE)
+     ++ (*seqCount);
+   }
+
+  return (PLL_TRUE);
+}
+
+/** @ingroup alignmentGroup
+    @brief Check whether the FASTA content is valid
+*/
+static int
+parseFastaAlignment (pllAlignmentData * alignmentData, int input)
+{
+  pllLexToken token;
+  int i;
+
+  NEXT_TOKEN
+  CONSUME(PLL_TOKEN_WHITESPACE | PLL_TOKEN_NEWLINE)
+
+  if (token.tokenType != PLL_TOKEN_NUMBER && token.tokenType != PLL_TOKEN_STRING) return (0);
+
+  i = 1;
+  while (1)
+   {
+     /* first parse the sequence label */
+     switch (token.tokenType)
+      {
+        case PLL_TOKEN_EOF:
+          return (1);
+          break;
+
+        case PLL_TOKEN_NUMBER:
+        case PLL_TOKEN_STRING:
+          alignmentData->sequenceLabels[i] = strndup (token.lexeme + 1, token.len - 1);
+          break;
+        default:
+          return (0);
+      }
+     
+     NEXT_TOKEN
+     CONSUME(PLL_TOKEN_WHITESPACE | PLL_TOKEN_NEWLINE)
+
+     /* now parse the sequence itself */
+     switch (token.tokenType)
+      {
+        case PLL_TOKEN_EOF:
+          return (0);
+          break;
+
+        case PLL_TOKEN_NUMBER:
+        case PLL_TOKEN_STRING:
+          memmove (alignmentData->sequenceData[i], token.lexeme, token.len);
+          break;
+        default:
+          return (0);
+      }
+     NEXT_TOKEN
+     CONSUME(PLL_TOKEN_WHITESPACE | PLL_TOKEN_NEWLINE)
+     ++ i;
+   }
+}
+
+
+/** @ingroup alignmentGroup
+    @brief Parse a FASTA file
+    
+    Parses the FASTA file \a filename and returns a ::pllAlignmentData structure
+    with the alignment.
+
+    @param filename
+      Name of file to be parsed
+
+    @return
+      Returns a structure of type ::pllAlignmentData that contains the alignment, or \b NULL
+      in case of failure.
+*/
+static pllAlignmentData *
+pllParseFASTA (const char * filename)
+{
+  int
+    i,
+    seqLen,
+    seqCount,
+    input;
+  long filesize;
+
+  char * rawdata;
+  pllAlignmentData * alignmentData;
+
+  rawdata = pllReadFile (filename, &filesize);
+  if (!rawdata)
+   {
+     errno = PLL_ERROR_FILE_OPEN;
+     return (NULL);
+   }
+
+  lex_table_amend_fasta ();
+  
+  init_lexan (rawdata, filesize);
+  input = get_next_symbol ();
+
+
+  if (!getFastaAlignmentInfo (&input, &seqCount, &seqLen))
+   {
+     errno = PLL_ERROR_FASTA_SYNTAX;
+     lex_table_restore ();
+     rax_free (rawdata);
+     return (NULL);
+   }
+  
+  alignmentData = pllInitAlignmentData (seqCount, seqLen);
+  
+  printf ("\n---------------\n\n");
+
+  init_lexan (rawdata, filesize);
+  input = get_next_symbol ();
+
+  if (!parseFastaAlignment (alignmentData, input))
+   {
+     errno = PLL_ERROR_FASTA_SYNTAX;
+     pllAlignmentDataDestroy (alignmentData);
+     lex_table_restore();
+     rax_free(rawdata);
+     return (NULL);
+   }
+
+  /* allocate alignment structure */
+
+
+  lex_table_restore ();
+  rax_free (rawdata);
+
+  alignmentData->siteWeights = (int *) rax_malloc (alignmentData->sequenceLength * sizeof (int));
+  for (i = 0; i < alignmentData->sequenceLength; ++ i)
+    alignmentData->siteWeights[i] = 1;
+
+  return (alignmentData);
+}
+
+
+
+/** @ingroup alignmentGroup
+    @brief Parse a file that contains a multiple sequence alignment
+
+    Parses the file \a filename of type \a fileType which contains a multiple sequence alignment.
+    The supported file types are the sequential and interleaved versions of PHYLIP format, and
+    the FASTA format. The parsed alignment is returned as a pointer to a structure of type
+    ::pllAlignmentData
+
+    @param fileType
+      Type of file to parse. Can be either \b PLL_FORMAT_PHYLIP or \b PLL_FORMAT_FASTA
+
+    @param filename
+      Name of file to parse
+
+    @return
+      Returns a structure of type ::pllAlignmentData that contains the multiple sequence alignment,
+      otherwise returns \b NULL in case of failure.
+*/
+pllAlignmentData *
+pllParseAlignmentFile (int fileType, const char * filename)
+{
+  switch (fileType)
+   {
+     case PLL_FORMAT_PHYLIP:
+       return (pllParsePHYLIP (filename));
+     case PLL_FORMAT_FASTA:
+       return (pllParseFASTA (filename));
+     default:
+       /* RTFM */
+       errno = PLL_ERROR_INVALID_FILETYPE;
+       return (NULL);
+   }
+}
diff --git a/lib/pll/avxLikelihood.c b/lib/pll/avxLikelihood.c
new file mode 100644
index 0000000..d306695
--- /dev/null
+++ b/lib/pll/avxLikelihood.c
@@ -0,0 +1,4106 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file avxLikelihood.c
+ *
+ * @brief AVX versions of the likelihood functions
+ *
+ * AVX versions of the likelihood functions
+ */
+#include <unistd.h>
+#include <math.h>
+#include <time.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdint.h>
+#include <limits.h>
+#include <stdint.h>
+#include <xmmintrin.h>
+#include <pmmintrin.h>
+#include <immintrin.h>
+#include <assert.h>
+
+#ifdef _FMA
+#include <x86intrin.h>
+#define FMAMACC(a,b,c) _mm256_fmadd_pd(b,c,a)
+#endif
+
+#include "pll.h"
+#include "pllInternal.h"
+
+extern const unsigned int mask32[32];
+
+const union __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)))
+{
+  uint64_t i[4];
+  __m256d m;
+  
+} absMask_AVX = {{0x7fffffffffffffffULL, 0x7fffffffffffffffULL, 0x7fffffffffffffffULL, 0x7fffffffffffffffULL}};
+
+
+
+static inline __m256d hadd4(__m256d v, __m256d u)
+{ 
+  __m256d
+    a, b;
+  
+  v = _mm256_hadd_pd(v, v);
+  a = _mm256_permute2f128_pd(v, v, 1);
+  v = _mm256_add_pd(a, v);
+
+  u = _mm256_hadd_pd(u, u);
+  b = _mm256_permute2f128_pd(u, u, 1);
+  u = _mm256_add_pd(b, u);
+
+  v = _mm256_mul_pd(v, u);	
+  
+  return v;
+}
+
+static inline __m256d hadd3(__m256d v)
+{ 
+  __m256d
+    a;
+  
+  v = _mm256_hadd_pd(v, v);
+  a = _mm256_permute2f128_pd(v, v, 1);
+  v = _mm256_add_pd(a, v);
+  
+  return v;
+}
+
+
+void  newviewGTRGAMMA_AVX(int tipCase,
+			 double *x1, double *x2, double *x3,
+			 double *extEV, double *tipVector,
+			 int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+			 const int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling
+			 )
+{
+ 
+  int  
+    i, 
+    k, 
+    scale, 
+    addScale = 0;
+ 
+  __m256d 
+    minlikelihood_avx = _mm256_set1_pd(PLL_MINLIKELIHOOD),
+    twoto = _mm256_set1_pd(PLL_TWOTOTHE256);
+ 
+
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:
+      {
+	double 
+	  *uX1, 
+	  umpX1[1024] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))), 
+	  *uX2, 
+	  umpX2[1024] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+	for (i = 1; i < 16; i++)
+	  {
+	    __m256d 
+	      tv = _mm256_load_pd(&(tipVector[i * 4]));
+
+	    int 
+	      j;
+	    
+	    for (j = 0; j < 4; j++)
+	      for (k = 0; k < 4; k++)
+		{		 
+		  __m256d 
+		    left1 = _mm256_load_pd(&left[j * 16 + k * 4]);		  		  		  
+
+		  left1 = _mm256_mul_pd(left1, tv);		  
+		  left1 = hadd3(left1);
+		  		  		  
+		  _mm256_store_pd(&umpX1[i * 64 + j * 16 + k * 4], left1);
+		}
+	  
+	    for (j = 0; j < 4; j++)
+	      for (k = 0; k < 4; k++)
+		{		 
+		  __m256d 
+		    left1 = _mm256_load_pd(&right[j * 16 + k * 4]);		  		  		  
+
+		  left1 = _mm256_mul_pd(left1, tv);		  
+		  left1 = hadd3(left1);
+		  		  		  
+		  _mm256_store_pd(&umpX2[i * 64 + j * 16 + k * 4], left1);
+		}	    
+	  }   	
+	  
+
+	for(i = 0; i < n; i++)
+	  {	    		 	    
+	    uX1 = &umpX1[64 * tipX1[i]];
+	    uX2 = &umpX2[64 * tipX2[i]];		  
+	    
+	    for(k = 0; k < 4; k++)
+	      {
+		__m256d	   
+		  xv = _mm256_setzero_pd();
+	       
+		int 
+		  l;
+		
+		for(l = 0; l < 4; l++)
+		  {	       	     				      	      																	   
+		    __m256d
+		      x1v =  _mm256_mul_pd(_mm256_load_pd(&uX1[k * 16 + l * 4]), _mm256_load_pd(&uX2[k * 16 + l * 4]));
+		
+		    __m256d 
+		      evv = _mm256_load_pd(&extEV[l * 4]);
+#ifdef _FMA
+		    xv = FMAMACC(xv,x1v,evv);
+#else						  
+		    xv = _mm256_add_pd(xv, _mm256_mul_pd(x1v, evv));
+#endif
+		  }
+		
+		_mm256_store_pd(&x3[16 * i + 4 * k], xv);
+	      }	         	   	    
+	  }
+      }
+      break;
+    case PLL_TIP_INNER:
+      {
+	double 
+	  *uX1, 
+	  umpX1[1024] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+	for (i = 1; i < 16; i++)
+	  {
+	    __m256d 
+	      tv = _mm256_load_pd(&(tipVector[i*4]));
+
+	    int 
+	      j;
+	    
+	    for (j = 0; j < 4; j++)
+	      for (k = 0; k < 4; k++)
+		{		 
+		  __m256d 
+		    left1 = _mm256_load_pd(&left[j * 16 + k * 4]);		  		  		  
+
+		  left1 = _mm256_mul_pd(left1, tv);		  
+		  left1 = hadd3(left1);
+		  		  		  
+		  _mm256_store_pd(&umpX1[i * 64 + j * 16 + k * 4], left1);
+		}	 	   
+	  }   	
+	
+	for(i = 0; i < n; i++)
+	  { 
+	    __m256d
+	      xv[4];	    	   
+	    
+	    scale = 1;
+	    uX1 = &umpX1[64 * tipX1[i]];
+
+	    for(k = 0; k < 4; k++)
+	      {
+		__m256d	   		 
+		  xvr = _mm256_load_pd(&(x2[i * 16 + k * 4]));
+
+		int 
+		  l;
+
+		xv[k]  = _mm256_setzero_pd();
+		  
+		for(l = 0; l < 4; l++)
+		  {	       	     				      	      															
+		    __m256d  
+		      x1v = _mm256_load_pd(&uX1[k * 16 + l * 4]),		     
+		      x2v = _mm256_mul_pd(xvr, _mm256_load_pd(&right[k * 16 + l * 4]));			    
+			
+		    x2v = hadd3(x2v);
+		    x1v = _mm256_mul_pd(x1v, x2v);			
+		
+		    __m256d 
+		      evv = _mm256_load_pd(&extEV[l * 4]);
+			
+#ifdef _FMA
+		    xv[k] = FMAMACC(xv[k],x1v,evv);
+#else			  
+		    xv[k] = _mm256_add_pd(xv[k], _mm256_mul_pd(x1v, evv));
+#endif
+		  }
+		    
+		if(scale)
+		  {
+		    __m256d 	     
+		      v1 = _mm256_and_pd(xv[k], absMask_AVX.m);
+
+		    v1 = _mm256_cmp_pd(v1,  minlikelihood_avx, _CMP_LT_OS);
+		    
+		    if(_mm256_movemask_pd( v1 ) != 15)
+		      scale = 0;
+		  }
+	      }	    
+
+	    if(scale)
+	      {
+		xv[0] = _mm256_mul_pd(xv[0], twoto);
+		xv[1] = _mm256_mul_pd(xv[1], twoto);
+		xv[2] = _mm256_mul_pd(xv[2], twoto);
+		xv[3] = _mm256_mul_pd(xv[3], twoto);
+
+		if(useFastScaling)
+		  addScale += wgt[i];
+		else
+		  ex3[i] += 1;
+	      }
+
+	    _mm256_store_pd(&x3[16 * i],      xv[0]);
+	    _mm256_store_pd(&x3[16 * i + 4],  xv[1]);
+	    _mm256_store_pd(&x3[16 * i + 8],  xv[2]);
+	    _mm256_store_pd(&x3[16 * i + 12], xv[3]);
+	  }
+      }
+      break;
+    case PLL_INNER_INNER:
+      {
+	for(i = 0; i < n; i++)
+	  {	
+	    __m256d
+	      xv[4];
+	    
+	    scale = 1;
+
+	    for(k = 0; k < 4; k++)
+	      {
+		__m256d	   
+		 
+		  xvl = _mm256_load_pd(&(x1[i * 16 + k * 4])),
+		  xvr = _mm256_load_pd(&(x2[i * 16 + k * 4]));
+
+		int 
+		  l;
+
+		xv[k] = _mm256_setzero_pd();
+
+		for(l = 0; l < 4; l++)
+		  {	       	     				      	      															
+		    __m256d 
+		      x1v = _mm256_mul_pd(xvl, _mm256_load_pd(&left[k * 16 + l * 4])),
+		      x2v = _mm256_mul_pd(xvr, _mm256_load_pd(&right[k * 16 + l * 4]));			    
+			
+		    x1v = hadd4(x1v, x2v);			
+		
+		    __m256d 
+		      evv = _mm256_load_pd(&extEV[l * 4]);
+						  
+		    xv[k] = _mm256_add_pd(xv[k], _mm256_mul_pd(x1v, evv));
+		  }
+		
+		if(scale)
+		  {
+		    __m256d 	     
+		      v1 = _mm256_and_pd(xv[k], absMask_AVX.m);
+
+		    v1 = _mm256_cmp_pd(v1,  minlikelihood_avx, _CMP_LT_OS);
+		    
+		    if(_mm256_movemask_pd( v1 ) != 15)
+		      scale = 0;
+		  }
+	      }
+
+	     if(scale)
+	      {
+		xv[0] = _mm256_mul_pd(xv[0], twoto);
+		xv[1] = _mm256_mul_pd(xv[1], twoto);
+		xv[2] = _mm256_mul_pd(xv[2], twoto);
+		xv[3] = _mm256_mul_pd(xv[3], twoto);
+
+		if(useFastScaling)
+		  addScale += wgt[i];
+		else
+		  ex3[i] += 1;		
+	      }
+		
+	    _mm256_store_pd(&x3[16 * i],      xv[0]);
+	    _mm256_store_pd(&x3[16 * i + 4],  xv[1]);
+	    _mm256_store_pd(&x3[16 * i + 8],  xv[2]);
+	    _mm256_store_pd(&x3[16 * i + 12], xv[3]);
+	  }
+      }
+      break;
+    default:
+      assert(0);
+    }
+
+  if(useFastScaling)
+    *scalerIncrement = addScale;
+  
+}
+
+void  newviewGTRGAMMA_AVX_GAPPED_SAVE(int tipCase,
+				      double *x1_start, double *x2_start, double *x3_start,
+				      double *extEV, double *tipVector,
+				      int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+				      const int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling,
+				      unsigned int *x1_gap, unsigned int *x2_gap, unsigned int *x3_gap, 
+				      double *x1_gapColumn, double *x2_gapColumn, double *x3_gapColumn
+				      )
+{
+ 
+  int  
+    i, 
+    k, 
+    scale,
+    scaleGap,
+    addScale = 0;
+ 
+  __m256d 
+    minlikelihood_avx = _mm256_set1_pd( PLL_MINLIKELIHOOD ),
+    twoto = _mm256_set1_pd(PLL_TWOTOTHE256);
+ 
+  double
+    *x1,
+    *x2,
+    *x3,
+    *x1_ptr = x1_start,
+    *x2_ptr = x2_start;
+
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:
+      {
+	double 
+	  *uX1, 
+	  umpX1[1024] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))), 
+	  *uX2, 
+	  umpX2[1024] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+	for (i = 1; i < 16; i++)
+	  {
+	    __m256d 
+	      tv = _mm256_load_pd(&(tipVector[i * 4]));
+
+	    int 
+	      j;
+	    
+	    for (j = 0; j < 4; j++)
+	      for (k = 0; k < 4; k++)
+		{		 
+		  __m256d 
+		    left1 = _mm256_load_pd(&left[j * 16 + k * 4]);		  		  		  
+
+		  left1 = _mm256_mul_pd(left1, tv);		  
+		  left1 = hadd3(left1);
+		  		  		  
+		  _mm256_store_pd(&umpX1[i * 64 + j * 16 + k * 4], left1);
+		}
+	  
+	    for (j = 0; j < 4; j++)
+	      for (k = 0; k < 4; k++)
+		{		 
+		  __m256d 
+		    left1 = _mm256_load_pd(&right[j * 16 + k * 4]);		  		  		  
+
+		  left1 = _mm256_mul_pd(left1, tv);		  
+		  left1 = hadd3(left1);
+		  		  		  
+		  _mm256_store_pd(&umpX2[i * 64 + j * 16 + k * 4], left1);
+		}	    
+	  }   	
+	  
+	x3 = x3_gapColumn;
+
+	{
+	  uX1 = &umpX1[960];
+	  uX2 = &umpX2[960];		  
+	  
+	  for(k = 0; k < 4; k++)
+	    {
+	      __m256d	   
+		xv = _mm256_setzero_pd();
+	      
+	      int 
+		l;
+	      
+	      for(l = 0; l < 4; l++)
+		{	       	     				      	      																	   
+		  __m256d
+		    x1v =  _mm256_mul_pd(_mm256_load_pd(&uX1[k * 16 + l * 4]), _mm256_load_pd(&uX2[k * 16 + l * 4]));
+		  
+		  __m256d 
+		    evv = _mm256_load_pd(&extEV[l * 4]);
+#ifdef _FMA
+		  xv = FMAMACC(xv,x1v,evv);
+#else						  
+		  xv = _mm256_add_pd(xv, _mm256_mul_pd(x1v, evv));
+#endif
+		}
+		    
+	      _mm256_store_pd(&x3[4 * k], xv);
+	    }
+	}
+	
+	x3 = x3_start;
+
+	for(i = 0; i < n; i++)
+	  {		    	    	
+	    if(!(x3_gap[i / 32] & mask32[i % 32]))	     
+	      {
+		uX1 = &umpX1[64 * tipX1[i]];
+		uX2 = &umpX2[64 * tipX2[i]];		  
+	    
+		for(k = 0; k < 4; k++)
+		  {
+		    __m256d	   
+		      xv = _mm256_setzero_pd();
+	       
+		    int 
+		      l;
+		
+		    for(l = 0; l < 4; l++)
+		      {	       	     				      	      																	   
+			__m256d
+			  x1v =  _mm256_mul_pd(_mm256_load_pd(&uX1[k * 16 + l * 4]), _mm256_load_pd(&uX2[k * 16 + l * 4]));
+			
+			__m256d 
+			  evv = _mm256_load_pd(&extEV[l * 4]);
+#ifdef _FMA
+			xv = FMAMACC(xv,x1v,evv);
+#else						  
+			xv = _mm256_add_pd(xv, _mm256_mul_pd(x1v, evv));
+#endif
+		      }
+		    
+		    _mm256_store_pd(&x3[4 * k], xv);
+		  }
+
+		x3 += 16;
+	      }
+	  }
+      }
+      break;
+    case PLL_TIP_INNER:
+      {
+	double 
+	  *uX1, 
+	  umpX1[1024] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+       
+	for (i = 1; i < 16; i++)
+	  {
+	    __m256d 
+	      tv = _mm256_load_pd(&(tipVector[i*4]));
+
+	    int 
+	      j;
+	    
+	    for (j = 0; j < 4; j++)
+	      for (k = 0; k < 4; k++)
+		{		 
+		  __m256d 
+		    left1 = _mm256_load_pd(&left[j * 16 + k * 4]);		  		  		  
+
+		  left1 = _mm256_mul_pd(left1, tv);		  
+		  left1 = hadd3(left1);
+		  		  		  
+		  _mm256_store_pd(&umpX1[i * 64 + j * 16 + k * 4], left1);
+		}	 	   
+	  }	
+
+	{ 
+	  __m256d
+	    xv[4];
+	  
+	  scaleGap = 1;
+	  uX1 = &umpX1[960];
+
+	  x2 = x2_gapColumn;			 
+	  x3 = x3_gapColumn;
+
+	  for(k = 0; k < 4; k++)
+	    {
+	      __m256d	   		 
+		xvr = _mm256_load_pd(&(x2[k * 4]));
+
+	      int 
+		l;
+
+	      xv[k]  = _mm256_setzero_pd();
+		  
+	      for(l = 0; l < 4; l++)
+		{	       	     				      	      															
+		  __m256d  
+		    x1v = _mm256_load_pd(&uX1[k * 16 + l * 4]),		     
+		    x2v = _mm256_mul_pd(xvr, _mm256_load_pd(&right[k * 16 + l * 4]));			    
+			
+		  x2v = hadd3(x2v);
+		  x1v = _mm256_mul_pd(x1v, x2v);			
+		
+		  __m256d 
+		    evv = _mm256_load_pd(&extEV[l * 4]);
+			
+#ifdef _FMA
+		  xv[k] = FMAMACC(xv[k],x1v,evv);
+#else			  
+		  xv[k] = _mm256_add_pd(xv[k], _mm256_mul_pd(x1v, evv));
+#endif
+		}
+		    
+	      if(scaleGap)
+		{
+		  __m256d 	     
+		    v1 = _mm256_and_pd(xv[k], absMask_AVX.m);
+		  
+		  v1 = _mm256_cmp_pd(v1,  minlikelihood_avx, _CMP_LT_OS);
+		    
+		  if(_mm256_movemask_pd( v1 ) != 15)
+		    scaleGap = 0;
+		}
+	    }
+	
+	  if(scaleGap)
+	    {
+	      xv[0] = _mm256_mul_pd(xv[0], twoto);
+	      xv[1] = _mm256_mul_pd(xv[1], twoto);
+	      xv[2] = _mm256_mul_pd(xv[2], twoto);
+	      xv[3] = _mm256_mul_pd(xv[3], twoto);	    
+	    }
+
+	  _mm256_store_pd(&x3[0],      xv[0]);
+	  _mm256_store_pd(&x3[4],  xv[1]);
+	  _mm256_store_pd(&x3[8],  xv[2]);
+	  _mm256_store_pd(&x3[12], xv[3]);
+	}
+	
+	x3 = x3_start;
+	
+	for(i = 0; i < n; i++)
+	  {
+	    if((x3_gap[i / 32] & mask32[i % 32]))
+	      {
+		if(scaleGap)
+		  {
+		    if(useFastScaling)
+		      addScale += wgt[i];
+		    else
+		      ex3[i]  += 1;
+		  }
+	      }
+	    else
+	      {
+		if(x2_gap[i / 32] & mask32[i % 32])
+		  x2 = x2_gapColumn;
+		else
+		  {
+		    x2 = x2_ptr;
+		    x2_ptr += 16;
+		  }
+		
+		__m256d
+		  xv[4];	    	   
+		
+		scale = 1;
+		uX1 = &umpX1[64 * tipX1[i]];
+		
+		for(k = 0; k < 4; k++)
+		  {
+		    __m256d	   		 
+		      xvr = _mm256_load_pd(&(x2[k * 4]));
+		    
+		    int 
+		      l;
+		    
+		    xv[k]  = _mm256_setzero_pd();
+		    
+		    for(l = 0; l < 4; l++)
+		      {	       	     				      	      															
+			__m256d  
+			  x1v = _mm256_load_pd(&uX1[k * 16 + l * 4]),		     
+			  x2v = _mm256_mul_pd(xvr, _mm256_load_pd(&right[k * 16 + l * 4]));			    
+			
+			x2v = hadd3(x2v);
+			x1v = _mm256_mul_pd(x1v, x2v);			
+			
+			__m256d 
+			  evv = _mm256_load_pd(&extEV[l * 4]);
+			
+#ifdef _FMA
+			xv[k] = FMAMACC(xv[k],x1v,evv);
+#else			  
+			xv[k] = _mm256_add_pd(xv[k], _mm256_mul_pd(x1v, evv));
+#endif
+		      }
+		    
+		    if(scale)
+		      {
+			__m256d 	     
+			  v1 = _mm256_and_pd(xv[k], absMask_AVX.m);
+			
+			v1 = _mm256_cmp_pd(v1,  minlikelihood_avx, _CMP_LT_OS);
+			
+			if(_mm256_movemask_pd( v1 ) != 15)
+			  scale = 0;
+		      }
+		  }	    
+	      
+		if(scale)
+		  {
+		    xv[0] = _mm256_mul_pd(xv[0], twoto);
+		    xv[1] = _mm256_mul_pd(xv[1], twoto);
+		    xv[2] = _mm256_mul_pd(xv[2], twoto);
+		    xv[3] = _mm256_mul_pd(xv[3], twoto);
+
+		    if(useFastScaling)
+		      addScale += wgt[i];
+		    else
+		      ex3[i] += 1;		   
+		  }
+	      
+		_mm256_store_pd(&x3[0],      xv[0]);
+		_mm256_store_pd(&x3[4],  xv[1]);
+		_mm256_store_pd(&x3[8],  xv[2]);
+		_mm256_store_pd(&x3[12], xv[3]);
+	      
+		x3 += 16;
+	      }
+	  }
+      }
+      break;
+    case PLL_INNER_INNER:
+      {          
+	{		
+	  x1 = x1_gapColumn;	     	    
+	  x2 = x2_gapColumn;	    
+	  x3 = x3_gapColumn;
+
+	  __m256d
+	    xv[4];
+	    
+	  scaleGap = 1;
+
+	  for(k = 0; k < 4; k++)
+	    {
+	      __m256d	   
+		
+		xvl = _mm256_load_pd(&(x1[k * 4])),
+		xvr = _mm256_load_pd(&(x2[k * 4]));
+
+	      int 
+		l;
+
+	      xv[k] = _mm256_setzero_pd();
+
+	      for(l = 0; l < 4; l++)
+		{	       	     				      	      															
+		  __m256d 
+		    x1v = _mm256_mul_pd(xvl, _mm256_load_pd(&left[k * 16 + l * 4])),
+		    x2v = _mm256_mul_pd(xvr, _mm256_load_pd(&right[k * 16 + l * 4]));			    
+		  
+		  x1v = hadd4(x1v, x2v);			
+		  
+		  __m256d 
+		    evv = _mm256_load_pd(&extEV[l * 4]);
+		  
+		  xv[k] = _mm256_add_pd(xv[k], _mm256_mul_pd(x1v, evv));
+		}
+		
+	      if(scaleGap)
+		  {
+		    __m256d 	     
+		      v1 = _mm256_and_pd(xv[k], absMask_AVX.m);
+
+		    v1 = _mm256_cmp_pd(v1,  minlikelihood_avx, _CMP_LT_OS);
+		    
+		    if(_mm256_movemask_pd( v1 ) != 15)
+		      scaleGap = 0;
+		  }
+	    }
+
+	  if(scaleGap)
+	    {
+	      xv[0] = _mm256_mul_pd(xv[0], twoto);
+	      xv[1] = _mm256_mul_pd(xv[1], twoto);
+	      xv[2] = _mm256_mul_pd(xv[2], twoto);
+	      xv[3] = _mm256_mul_pd(xv[3], twoto);	       
+	    }
+		
+	  _mm256_store_pd(&x3[0],  xv[0]);
+	  _mm256_store_pd(&x3[4],  xv[1]);
+	  _mm256_store_pd(&x3[8],  xv[2]);
+	  _mm256_store_pd(&x3[12], xv[3]);
+	}	  
+      
+	x3 = x3_start;
+
+	for(i = 0; i < n; i++)
+	  {
+	    if(x3_gap[i / 32] & mask32[i % 32])
+	      {	     
+		if(scaleGap)
+		  {
+		    if(useFastScaling)
+		      addScale += wgt[i];
+		    else
+		      ex3[i]  += 1; 	       
+		  }
+	      }
+	    else
+	      {	
+		if(x1_gap[i / 32] & mask32[i % 32])
+		  x1 = x1_gapColumn;
+		else
+		  {
+		    x1 = x1_ptr;
+		    x1_ptr += 16;
+		  }
+	     
+		if(x2_gap[i / 32] & mask32[i % 32])
+		  x2 = x2_gapColumn;
+		else
+		  {
+		    x2 = x2_ptr;
+		    x2_ptr += 16;
+		  }
+
+		__m256d
+		  xv[4];
+	    
+		scale = 1;
+
+		for(k = 0; k < 4; k++)
+		  {
+		    __m256d	   
+		      
+		      xvl = _mm256_load_pd(&(x1[k * 4])),
+		      xvr = _mm256_load_pd(&(x2[k * 4]));
+		    
+		    int 
+		      l;
+		    
+		    xv[k] = _mm256_setzero_pd();
+		    
+		    for(l = 0; l < 4; l++)
+		      {	       	     				      	      															
+			__m256d 
+			  x1v = _mm256_mul_pd(xvl, _mm256_load_pd(&left[k * 16 + l * 4])),
+			  x2v = _mm256_mul_pd(xvr, _mm256_load_pd(&right[k * 16 + l * 4]));			    
+			
+			x1v = hadd4(x1v, x2v);			
+			
+			__m256d 
+			  evv = _mm256_load_pd(&extEV[l * 4]);
+			
+			xv[k] = _mm256_add_pd(xv[k], _mm256_mul_pd(x1v, evv));
+		      }
+		    
+		    if(scale)
+		      {
+			__m256d 	     
+			  v1 = _mm256_and_pd(xv[k], absMask_AVX.m);
+			
+			v1 = _mm256_cmp_pd(v1,  minlikelihood_avx, _CMP_LT_OS);
+			
+			if(_mm256_movemask_pd( v1 ) != 15)
+			  scale = 0;
+		      }
+		  }
+
+		if(scale)
+		  {
+		    xv[0] = _mm256_mul_pd(xv[0], twoto);
+		    xv[1] = _mm256_mul_pd(xv[1], twoto);
+		    xv[2] = _mm256_mul_pd(xv[2], twoto);
+		    xv[3] = _mm256_mul_pd(xv[3], twoto);
+		    
+		    if(useFastScaling)
+		      addScale += wgt[i];
+		    else
+		      ex3[i] += 1;
+		  }
+		
+		_mm256_store_pd(&x3[0],      xv[0]);
+		_mm256_store_pd(&x3[4],  xv[1]);
+		_mm256_store_pd(&x3[8],  xv[2]);
+		_mm256_store_pd(&x3[12], xv[3]);
+	      
+		x3 += 16;
+	      }
+	  }
+      }
+      break;
+    default:
+      assert(0);
+    }
+
+  if(useFastScaling)
+    *scalerIncrement = addScale;
+  
+}
+
+
+
+
+void newviewGTRCAT_AVX(int tipCase,  double *EV,  int *cptr,
+			   double *x1_start, double *x2_start,  double *x3_start, double *tipVector,
+			   int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+			   int n,  double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling)
+{
+  double
+    *le,
+    *ri,
+    *x1,
+    *x2;
+    
+  int 
+    i, 
+    addScale = 0;
+   
+  __m256d 
+    minlikelihood_avx = _mm256_set1_pd( PLL_MINLIKELIHOOD ),
+    twoto = _mm256_set1_pd(PLL_TWOTOTHE256);
+  
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:      
+      for (i = 0; i < n; i++)
+	{	 
+	  int 
+	    l;
+	  
+	  le = &left[cptr[i] * 16];
+	  ri = &right[cptr[i] * 16];
+
+	  x1 = &(tipVector[4 * tipX1[i]]);
+	  x2 = &(tipVector[4 * tipX2[i]]);
+	  
+	  __m256d	   
+	    vv = _mm256_setzero_pd();
+	   	   	    
+	  for(l = 0; l < 4; l++)
+	    {	       	     				      	      															
+	      __m256d 
+		x1v = _mm256_mul_pd(_mm256_load_pd(x1), _mm256_load_pd(&le[l * 4])),
+		x2v = _mm256_mul_pd(_mm256_load_pd(x2), _mm256_load_pd(&ri[l * 4]));			    
+			
+	      x1v = hadd4(x1v, x2v);			
+		
+	      __m256d 
+		evv = _mm256_load_pd(&EV[l * 4]);
+#ifdef _FMA
+	      vv = FMAMACC(vv,x1v,evv);
+#else				
+	      vv = _mm256_add_pd(vv, _mm256_mul_pd(x1v, evv));						      	
+#endif
+	    }	  		  
+
+	  _mm256_store_pd(&x3_start[4 * i], vv);	    	   	    
+	}
+      break;
+    case PLL_TIP_INNER:      
+      for (i = 0; i < n; i++)
+	{
+	  int 
+	    l;
+
+	  x1 = &(tipVector[4 * tipX1[i]]);
+	  x2 = &x2_start[4 * i];	 
+	  
+	  le =  &left[cptr[i] * 16];
+	  ri =  &right[cptr[i] * 16];
+
+	  __m256d	   
+	    vv = _mm256_setzero_pd();
+	  
+	  for(l = 0; l < 4; l++)
+	    {	       	     				      	      															
+	      __m256d 
+		x1v = _mm256_mul_pd(_mm256_load_pd(x1), _mm256_load_pd(&le[l * 4])),
+		x2v = _mm256_mul_pd(_mm256_load_pd(x2), _mm256_load_pd(&ri[l * 4]));			    
+			
+	      x1v = hadd4(x1v, x2v);			
+		
+	      __m256d 
+		evv = _mm256_load_pd(&EV[l * 4]);
+				
+#ifdef _FMA
+	      vv = FMAMACC(vv,x1v,evv);
+#else	      
+	      vv = _mm256_add_pd(vv, _mm256_mul_pd(x1v, evv));
+#endif
+	    }	  		  
+	  
+	  
+	  __m256d 	     
+	    v1 = _mm256_and_pd(vv, absMask_AVX.m);
+
+	  v1 = _mm256_cmp_pd(v1,  minlikelihood_avx, _CMP_LT_OS);
+	    
+	  if(_mm256_movemask_pd( v1 ) == 15)
+	    {	     	      
+	      vv = _mm256_mul_pd(vv, twoto);	      
+	      
+	      if(useFastScaling)
+		addScale += wgt[i];
+	      else
+		ex3[i] += 1;	      	     
+	    }       
+	  
+	  _mm256_store_pd(&x3_start[4 * i], vv);	 	  	  
+	}
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+	{
+	  int 
+	    l;
+
+	  x1 = &x1_start[4 * i];
+	  x2 = &x2_start[4 * i];
+	  
+	  
+	  le =  &left[cptr[i] * 16];
+	  ri =  &right[cptr[i] * 16];
+
+	  __m256d	   
+	    vv = _mm256_setzero_pd();
+	  
+	  for(l = 0; l < 4; l++)
+	    {	       	     				      	      															
+	      __m256d 
+		x1v = _mm256_mul_pd(_mm256_load_pd(x1), _mm256_load_pd(&le[l * 4])),
+		x2v = _mm256_mul_pd(_mm256_load_pd(x2), _mm256_load_pd(&ri[l * 4]));			    
+			
+	      x1v = hadd4(x1v, x2v);			
+		
+	      __m256d 
+		evv = _mm256_load_pd(&EV[l * 4]);
+#ifdef _FMA
+	      vv = FMAMACC(vv,x1v,evv);
+#else						
+	      vv = _mm256_add_pd(vv, _mm256_mul_pd(x1v, evv));						      	
+#endif
+	    }	  		  
+
+	 
+	  __m256d 	     
+	    v1 = _mm256_and_pd(vv, absMask_AVX.m);
+
+	  v1 = _mm256_cmp_pd(v1,  minlikelihood_avx, _CMP_LT_OS);
+	    
+	  if(_mm256_movemask_pd( v1 ) == 15)
+	    {	
+	      vv = _mm256_mul_pd(vv, twoto);
+	      
+	      if(useFastScaling)
+		addScale += wgt[i];
+	      else
+		ex3[i] += 1;	   
+	    }	
+
+	  _mm256_store_pd(&x3_start[4 * i], vv);
+	  	  
+	}
+      break;
+    default:
+      assert(0);
+    }
+
+  if(useFastScaling)
+    *scalerIncrement = addScale;
+}
+
+
+void newviewGTRCAT_AVX_GAPPED_SAVE(int tipCase,  double *EV,  int *cptr,
+				   double *x1_start, double *x2_start,  double *x3_start, double *tipVector,
+				   int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+				   int n,  double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling,
+				   unsigned int *x1_gap, unsigned int *x2_gap, unsigned int *x3_gap,
+				   double *x1_gapColumn, double *x2_gapColumn, double *x3_gapColumn, const int maxCats)
+{
+  double
+    *le,
+    *ri,
+    *x1,
+    *x2, 
+    *x3,
+    *x1_ptr = x1_start,
+    *x2_ptr = x2_start, 
+    *x3_ptr = x3_start;
+  
+  int 
+    i, 
+    scaleGap = 0,
+    addScale = 0;
+   
+  __m256d 
+    minlikelihood_avx = _mm256_set1_pd( PLL_MINLIKELIHOOD ),
+    twoto = _mm256_set1_pd(PLL_TWOTOTHE256);
+  
+
+  {
+    int 
+      l;
+
+    x1 = x1_gapColumn;	      
+    x2 = x2_gapColumn;
+    x3 = x3_gapColumn;    	 
+	  	  
+    le =  &left[maxCats * 16];
+    ri =  &right[maxCats * 16];
+
+    __m256d	   
+      vv = _mm256_setzero_pd();
+	  
+    for(l = 0; l < 4; l++)
+      {	       	     				      	      															
+	__m256d 
+	  x1v = _mm256_mul_pd(_mm256_load_pd(x1), _mm256_load_pd(&le[l * 4])),
+	  x2v = _mm256_mul_pd(_mm256_load_pd(x2), _mm256_load_pd(&ri[l * 4]));			    
+	
+	x1v = hadd4(x1v, x2v);			
+	
+	__m256d 
+	  evv = _mm256_load_pd(&EV[l * 4]);
+#ifdef _FMA
+	vv = FMAMACC(vv,x1v,evv);
+#else						
+	vv = _mm256_add_pd(vv, _mm256_mul_pd(x1v, evv));						      	
+#endif
+      }	  		  
+
+    if(tipCase != PLL_TIP_TIP)
+      {
+	__m256d 	     
+	  v1 = _mm256_and_pd(vv, absMask_AVX.m);
+    
+	v1 = _mm256_cmp_pd(v1,  minlikelihood_avx, _CMP_LT_OS);
+    
+	if(_mm256_movemask_pd( v1 ) == 15)
+	  {
+	    vv = _mm256_mul_pd(vv, twoto);	      	 
+	    scaleGap = 1;
+	  }
+      }
+    
+    _mm256_store_pd(x3, vv);    
+  }
+
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:      
+      for (i = 0; i < n; i++)
+	{ 
+	  if(noGap(x3_gap, i))
+	    {	 
+	      int 
+		l;
+	      
+	      x1 = &(tipVector[4 * tipX1[i]]);
+	      x2 = &(tipVector[4 * tipX2[i]]);
+
+	      x3 = x3_ptr;
+
+	      if(isGap(x1_gap, i))
+		le =  &left[maxCats * 16];
+	      else	  	  
+		le =  &left[cptr[i] * 16];	  
+	      
+	      if(isGap(x2_gap, i))
+		ri =  &right[maxCats * 16];
+	      else	 	  
+		ri =  &right[cptr[i] * 16];
+	  	  
+	      __m256d	   
+		vv = _mm256_setzero_pd();
+	      
+	      for(l = 0; l < 4; l++)
+		{	       	     				      	      															
+		  __m256d 
+		    x1v = _mm256_mul_pd(_mm256_load_pd(x1), _mm256_load_pd(&le[l * 4])),
+		    x2v = _mm256_mul_pd(_mm256_load_pd(x2), _mm256_load_pd(&ri[l * 4]));			    
+		  
+		  x1v = hadd4(x1v, x2v);			
+		  
+		  __m256d 
+		    evv = _mm256_load_pd(&EV[l * 4]);
+#ifdef _FMA
+		  vv = FMAMACC(vv,x1v,evv);
+#else				
+		  vv = _mm256_add_pd(vv, _mm256_mul_pd(x1v, evv));						      	
+#endif
+		}	  		  
+
+	      _mm256_store_pd(x3, vv);	 
+	      
+	      x3_ptr += 4;
+	    }
+	}
+      break;
+    case PLL_TIP_INNER:      
+      for (i = 0; i < n; i++)
+	{ 
+	  if(isGap(x3_gap, i))
+	    {
+	      if(scaleGap)
+		{
+		  if(useFastScaling)
+		    addScale += wgt[i];
+		  else
+		    ex3[i] += 1;		   		    
+		}	       
+	    }
+	  else
+	    {
+	      int 
+		l;
+
+	      x1 = &(tipVector[4 * tipX1[i]]);    
+	      x3 = x3_ptr;
+
+	      if(isGap(x1_gap, i))
+		le =  &left[maxCats * 16];
+	      else
+		le =  &left[cptr[i] * 16];
+	  
+	      if(isGap(x2_gap, i))
+		{		 
+		  ri =  &right[maxCats * 16];
+		  x2 = x2_gapColumn;
+		}
+	      else
+		{
+		  ri =  &right[cptr[i] * 16];
+		  x2 = x2_ptr;
+		  x2_ptr += 4;
+		}	  	 
+
+	      __m256d	   
+		vv = _mm256_setzero_pd();
+	      
+	      for(l = 0; l < 4; l++)
+		{	       	     				      	      															
+		  __m256d 
+		    x1v = _mm256_mul_pd(_mm256_load_pd(x1), _mm256_load_pd(&le[l * 4])),
+		    x2v = _mm256_mul_pd(_mm256_load_pd(x2), _mm256_load_pd(&ri[l * 4]));			    
+		  
+		  x1v = hadd4(x1v, x2v);			
+		  
+		  __m256d 
+		    evv = _mm256_load_pd(&EV[l * 4]);
+		  
+#ifdef _FMA
+		  vv = FMAMACC(vv,x1v,evv);
+#else	      
+		  vv = _mm256_add_pd(vv, _mm256_mul_pd(x1v, evv));
+#endif
+		}	  		  
+	  
+	  
+	      __m256d 	     
+		v1 = _mm256_and_pd(vv, absMask_AVX.m);
+	      
+	      v1 = _mm256_cmp_pd(v1,  minlikelihood_avx, _CMP_LT_OS);
+	      
+	      if(_mm256_movemask_pd( v1 ) == 15)
+		{	     	      
+		  vv = _mm256_mul_pd(vv, twoto);	      
+		  
+		  if(useFastScaling)
+		    addScale += wgt[i];
+		  else
+		    ex3[i] += 1;		 
+		}       
+	  
+	      _mm256_store_pd(x3, vv);	 	  	  
+
+	      x3_ptr += 4;
+	    }
+	}
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+	{
+	  if(isGap(x3_gap, i))
+	    {
+	      if(scaleGap)		   		    
+		{
+		  if(useFastScaling)
+		    addScale += wgt[i];
+		  else
+		    ex3[i] += 1;
+		}	      
+	    }
+	  else
+	    {
+	      int 
+		l;
+	      
+	      x3 = x3_ptr;
+	      
+	      if(isGap(x1_gap, i))
+		{
+		  x1 = x1_gapColumn;
+		  le =  &left[maxCats * 16];
+		}
+	      else
+		{
+		  le =  &left[cptr[i] * 16];
+		  x1 = x1_ptr;
+		  x1_ptr += 4;
+		}
+
+	      if(isGap(x2_gap, i))	
+		{
+		  x2 = x2_gapColumn;
+		  ri =  &right[maxCats * 16];	    
+		}
+	      else
+		{
+		  ri =  &right[cptr[i] * 16];
+		  x2 = x2_ptr;
+		  x2_ptr += 4;
+		}	 	  	  	  
+	  
+	      __m256d	   
+		vv = _mm256_setzero_pd();
+	      
+	      for(l = 0; l < 4; l++)
+		{	       	     				      	      															
+		  __m256d 
+		    x1v = _mm256_mul_pd(_mm256_load_pd(x1), _mm256_load_pd(&le[l * 4])),
+		    x2v = _mm256_mul_pd(_mm256_load_pd(x2), _mm256_load_pd(&ri[l * 4]));			    
+		  
+		  x1v = hadd4(x1v, x2v);			
+		  
+		  __m256d 
+		    evv = _mm256_load_pd(&EV[l * 4]);
+#ifdef _FMA
+		  vv = FMAMACC(vv,x1v,evv);
+#else						
+		  vv = _mm256_add_pd(vv, _mm256_mul_pd(x1v, evv));						      	
+#endif
+		}	  		  
+	      
+	      
+	      __m256d 	     
+		v1 = _mm256_and_pd(vv, absMask_AVX.m);
+	      
+	      v1 = _mm256_cmp_pd(v1,  minlikelihood_avx, _CMP_LT_OS);
+	      
+	      if(_mm256_movemask_pd( v1 ) == 15)
+		{	
+		  vv = _mm256_mul_pd(vv, twoto);	      
+		  
+		  if(useFastScaling)
+		    addScale += wgt[i];
+		  else
+		    ex3[i] += 1;		
+		}	
+	      
+	      _mm256_store_pd(x3, vv);
+	      
+	      x3_ptr += 4;
+	    }	  	  
+	}
+      break;
+    default:
+      assert(0);
+    }
+
+  if(useFastScaling)
+    *scalerIncrement = addScale;
+}
+
+void newviewGTRCATPROT_AVX(int tipCase, double *extEV,
+			       int *cptr,
+			       double *x1, double *x2, double *x3, double *tipVector,
+			       int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+			       int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling)
+{
+  double
+    *le, *ri, *v, *vl, *vr;
+
+  int i, l, scale, addScale = 0;
+
+#ifdef _FMA
+  int k;
+#endif
+
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:
+      {
+	for (i = 0; i < n; i++)
+	  {	   
+	    le = &left[cptr[i] * 400];
+	    ri = &right[cptr[i] * 400];
+
+	    vl = &(tipVector[20 * tipX1[i]]);
+	    vr = &(tipVector[20 * tipX2[i]]);
+	    v  = &x3[20 * i];	    	    	   	    
+
+	    __m256d vv[5];
+	    
+	    vv[0] = _mm256_setzero_pd();
+	    vv[1] = _mm256_setzero_pd();
+	    vv[2] = _mm256_setzero_pd();
+	    vv[3] = _mm256_setzero_pd();
+	    vv[4] = _mm256_setzero_pd();	   	    
+
+	    for(l = 0; l < 20; l++)
+	      {	       
+		__m256d 
+		  x1v = _mm256_setzero_pd(),
+		  x2v = _mm256_setzero_pd();	
+				
+		double 
+		  *ev = &extEV[l * 20],
+		  *lv = &le[l * 20],
+		  *rv = &ri[l * 20];														
+
+#ifdef _FMA		
+		for(k = 0; k < 20; k += 4) 
+		  {
+		    __m256d vlv = _mm256_load_pd(&vl[k]);
+		    __m256d lvv = _mm256_load_pd(&lv[k]);
+		    x1v = FMAMACC(x1v,vlv,lvv);
+		    __m256d vrv = _mm256_load_pd(&vr[k]);
+		    __m256d rvv = _mm256_load_pd(&rv[k]);
+		    x2v = FMAMACC(x2v,vrv,rvv);
+		  }
+#else		
+		x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[0]), _mm256_load_pd(&lv[0])));
+		x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[4]), _mm256_load_pd(&lv[4])));
+		x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[8]), _mm256_load_pd(&lv[8])));
+		x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[12]), _mm256_load_pd(&lv[12])));
+		x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[16]), _mm256_load_pd(&lv[16])));
+
+		x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[0]), _mm256_load_pd(&rv[0])));			    
+		x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[4]), _mm256_load_pd(&rv[4])));				    
+		x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[8]), _mm256_load_pd(&rv[8])));			    
+		x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[12]), _mm256_load_pd(&rv[12])));				    
+		x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[16]), _mm256_load_pd(&rv[16])));	
+#endif
+
+		x1v = hadd4(x1v, x2v);			
+#ifdef _FMA
+		for(k = 0; k < 5; k++) 
+		  {
+		    __m256d evv = _mm256_load_pd(&ev[k*4]);
+		    vv[k] = FMAMACC(vv[k],x1v,evv);
+		  }	  
+#else		
+		__m256d 
+		  evv[5];
+	    	
+		evv[0] = _mm256_load_pd(&ev[0]);
+		evv[1] = _mm256_load_pd(&ev[4]);
+		evv[2] = _mm256_load_pd(&ev[8]);
+		evv[3] = _mm256_load_pd(&ev[12]);
+		evv[4] = _mm256_load_pd(&ev[16]);		
+		
+		vv[0] = _mm256_add_pd(vv[0], _mm256_mul_pd(x1v, evv[0]));
+		vv[1] = _mm256_add_pd(vv[1], _mm256_mul_pd(x1v, evv[1]));
+		vv[2] = _mm256_add_pd(vv[2], _mm256_mul_pd(x1v, evv[2]));
+		vv[3] = _mm256_add_pd(vv[3], _mm256_mul_pd(x1v, evv[3]));
+		vv[4] = _mm256_add_pd(vv[4], _mm256_mul_pd(x1v, evv[4]));				      		      	  
+#endif
+	      }
+	    _mm256_store_pd(&v[0], vv[0]);
+	    _mm256_store_pd(&v[4], vv[1]);
+	    _mm256_store_pd(&v[8], vv[2]);
+	    _mm256_store_pd(&v[12], vv[3]);
+	    _mm256_store_pd(&v[16], vv[4]);
+	  }
+      }
+      break;
+    case PLL_TIP_INNER:      	
+      for (i = 0; i < n; i++)
+	{
+	  le = &left[cptr[i] * 400];
+	  ri = &right[cptr[i] * 400];
+	  
+	  vl = &(tipVector[20 * tipX1[i]]);
+	  vr = &x2[20 * i];
+	  v  = &x3[20 * i];	   
+	  
+	  __m256d vv[5];
+	  
+	  vv[0] = _mm256_setzero_pd();
+	  vv[1] = _mm256_setzero_pd();
+	  vv[2] = _mm256_setzero_pd();
+	  vv[3] = _mm256_setzero_pd();
+	  vv[4] = _mm256_setzero_pd();
+	  
+	 
+
+	  for(l = 0; l < 20; l++)
+	    {	       
+	      __m256d 
+		x1v = _mm256_setzero_pd(),
+		x2v = _mm256_setzero_pd();	
+	      
+	      double 
+		*ev = &extEV[l * 20],
+		*lv = &le[l * 20],
+		*rv = &ri[l * 20];														
+#ifdef _FMA
+	      for(k = 0; k < 20; k += 4) 
+		{
+		  __m256d vlv = _mm256_load_pd(&vl[k]);
+		  __m256d lvv = _mm256_load_pd(&lv[k]);
+		  x1v = FMAMACC(x1v,vlv,lvv);
+		  __m256d vrv = _mm256_load_pd(&vr[k]);
+		  __m256d rvv = _mm256_load_pd(&rv[k]);
+		  x2v = FMAMACC(x2v,vrv,rvv);
+		}
+#else	      
+	      x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[0]), _mm256_load_pd(&lv[0])));
+	      x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[4]), _mm256_load_pd(&lv[4])));
+	      x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[8]), _mm256_load_pd(&lv[8])));
+	      x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[12]), _mm256_load_pd(&lv[12])));
+	      x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[16]), _mm256_load_pd(&lv[16])));
+	      
+	      x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[0]), _mm256_load_pd(&rv[0])));			    
+	      x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[4]), _mm256_load_pd(&rv[4])));				    
+	      x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[8]), _mm256_load_pd(&rv[8])));			    
+	      x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[12]), _mm256_load_pd(&rv[12])));				    
+	      x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[16]), _mm256_load_pd(&rv[16])));
+#endif
+
+	      x1v = hadd4(x1v, x2v);			
+	      
+	      __m256d 
+		evv[5];
+	      
+	      evv[0] = _mm256_load_pd(&ev[0]);
+	      evv[1] = _mm256_load_pd(&ev[4]);
+	      evv[2] = _mm256_load_pd(&ev[8]);
+	      evv[3] = _mm256_load_pd(&ev[12]);
+	      evv[4] = _mm256_load_pd(&ev[16]);		
+
+#ifdef _FMA
+	      for(k = 0; k < 5; k++)
+		vv[k] = FMAMACC(vv[k],x1v,evv[k]);		 
+#else	      
+	      vv[0] = _mm256_add_pd(vv[0], _mm256_mul_pd(x1v, evv[0]));
+	      vv[1] = _mm256_add_pd(vv[1], _mm256_mul_pd(x1v, evv[1]));
+	      vv[2] = _mm256_add_pd(vv[2], _mm256_mul_pd(x1v, evv[2]));
+	      vv[3] = _mm256_add_pd(vv[3], _mm256_mul_pd(x1v, evv[3]));
+	      vv[4] = _mm256_add_pd(vv[4], _mm256_mul_pd(x1v, evv[4]));				      	
+#endif
+	    }	  
+
+	   	     
+	  __m256d minlikelihood_avx = _mm256_set1_pd( PLL_MINLIKELIHOOD );
+	  
+	  scale = 1;
+	  
+	  for(l = 0; scale && (l < 20); l += 4)
+	    {	       
+	      __m256d 
+		v1 = _mm256_and_pd(vv[l / 4], absMask_AVX.m);
+	      v1 = _mm256_cmp_pd(v1,  minlikelihood_avx, _CMP_LT_OS);
+	      
+	      if(_mm256_movemask_pd( v1 ) != 15)
+		scale = 0;
+	    }	    	  	  
+	 
+
+	  if(scale)
+	    {
+	      __m256d 
+		twoto = _mm256_set1_pd(PLL_TWOTOTHE256);
+	      
+	      for(l = 0; l < 20; l += 4)
+		vv[l / 4] = _mm256_mul_pd(vv[l / 4] , twoto);		    		 
+	  
+	      if(useFastScaling)
+		addScale += wgt[i];
+	      else
+		ex3[i]  += 1;	      
+	    }
+
+	  _mm256_store_pd(&v[0], vv[0]);
+	  _mm256_store_pd(&v[4], vv[1]);
+	  _mm256_store_pd(&v[8], vv[2]);
+	  _mm256_store_pd(&v[12], vv[3]);
+	  _mm256_store_pd(&v[16], vv[4]);	       
+	}
+      break;
+    case PLL_INNER_INNER:
+      for(i = 0; i < n; i++)
+	{
+	  le = &left[cptr[i] * 400];
+	  ri = &right[cptr[i] * 400];
+
+	  vl = &x1[20 * i];
+	  vr = &x2[20 * i];
+	  v = &x3[20 * i];
+
+	  __m256d vv[5];
+	  
+	  vv[0] = _mm256_setzero_pd();
+	  vv[1] = _mm256_setzero_pd();
+	  vv[2] = _mm256_setzero_pd();
+	  vv[3] = _mm256_setzero_pd();
+	  vv[4] = _mm256_setzero_pd();
+	  
+	  for(l = 0; l < 20; l++)
+	    {	       
+	      __m256d 
+		x1v = _mm256_setzero_pd(),
+		x2v = _mm256_setzero_pd();	
+	      
+	      double 
+		*ev = &extEV[l * 20],
+		*lv = &le[l * 20],
+		*rv = &ri[l * 20];														
+	      
+	      x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[0]), _mm256_load_pd(&lv[0])));
+	      x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[4]), _mm256_load_pd(&lv[4])));
+	      x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[8]), _mm256_load_pd(&lv[8])));
+	      x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[12]), _mm256_load_pd(&lv[12])));
+	      x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[16]), _mm256_load_pd(&lv[16])));
+	      
+	      x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[0]), _mm256_load_pd(&rv[0])));			    
+	      x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[4]), _mm256_load_pd(&rv[4])));				    
+	      x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[8]), _mm256_load_pd(&rv[8])));			    
+	      x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[12]), _mm256_load_pd(&rv[12])));				    
+	      x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[16]), _mm256_load_pd(&rv[16])));
+
+	      x1v = hadd4(x1v, x2v);			
+#ifdef _FMA
+	       for(k = 0; k < 5; k++) 
+		 {
+		   __m256d evv = _mm256_load_pd(&ev[k*4]);
+		   vv[k] = FMAMACC(vv[k],x1v,evv);
+		 }
+#else	      
+	      __m256d 
+		evv[5];
+	      
+	      evv[0] = _mm256_load_pd(&ev[0]);
+	      evv[1] = _mm256_load_pd(&ev[4]);
+	      evv[2] = _mm256_load_pd(&ev[8]);
+	      evv[3] = _mm256_load_pd(&ev[12]);
+	      evv[4] = _mm256_load_pd(&ev[16]);		
+	      
+	      vv[0] = _mm256_add_pd(vv[0], _mm256_mul_pd(x1v, evv[0]));
+	      vv[1] = _mm256_add_pd(vv[1], _mm256_mul_pd(x1v, evv[1]));
+	      vv[2] = _mm256_add_pd(vv[2], _mm256_mul_pd(x1v, evv[2]));
+	      vv[3] = _mm256_add_pd(vv[3], _mm256_mul_pd(x1v, evv[3]));
+	      vv[4] = _mm256_add_pd(vv[4], _mm256_mul_pd(x1v, evv[4]));				      	
+#endif
+	    }	  
+
+	   	     
+	  __m256d minlikelihood_avx = _mm256_set1_pd( PLL_MINLIKELIHOOD );
+	  
+	  scale = 1;
+	  
+	  for(l = 0; scale && (l < 20); l += 4)
+	    {	       
+	      __m256d 
+		v1 = _mm256_and_pd(vv[l / 4], absMask_AVX.m);
+	      v1 = _mm256_cmp_pd(v1,  minlikelihood_avx, _CMP_LT_OS);
+	      
+	      if(_mm256_movemask_pd( v1 ) != 15)
+		scale = 0;
+	    }	    	  	  
+
+	  if(scale)
+	    {
+	      __m256d 
+		twoto = _mm256_set1_pd(PLL_TWOTOTHE256);
+	      
+	      for(l = 0; l < 20; l += 4)
+		vv[l / 4] = _mm256_mul_pd(vv[l / 4] , twoto);		    		 
+	  
+	      if(useFastScaling)
+		addScale += wgt[i];
+	      else
+		ex3[i]  += 1;	      
+	    }
+
+	  _mm256_store_pd(&v[0], vv[0]);
+	  _mm256_store_pd(&v[4], vv[1]);
+	  _mm256_store_pd(&v[8], vv[2]);
+	  _mm256_store_pd(&v[12], vv[3]);
+	  _mm256_store_pd(&v[16], vv[4]);
+	 
+	}
+      break;
+    default:
+      assert(0);
+    }
+  
+  if(useFastScaling)
+    *scalerIncrement = addScale;
+}
+
+void newviewGTRCATPROT_AVX_GAPPED_SAVE(int tipCase, double *extEV,
+				       int *cptr,
+				       double *x1, double *x2, double *x3, double *tipVector,
+				       int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+				       int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling,
+				       unsigned int *x1_gap, unsigned int *x2_gap, unsigned int *x3_gap,
+				       double *x1_gapColumn, double *x2_gapColumn, double *x3_gapColumn, const int maxCats)
+{
+  double
+    *le, 
+    *ri, 
+    *v, 
+    *vl, 
+    *vr,
+    *x1_ptr = x1,
+    *x2_ptr = x2, 
+    *x3_ptr = x3;
+  
+  int 
+    i, 
+    l, 
+    scale, 
+    addScale = 0,
+    scaleGap = 0;
+
+#ifdef _FMA
+  int k;
+#endif
+
+  {
+    le = &left[maxCats * 400];
+    ri = &right[maxCats * 400];
+    
+    vl = x1_gapColumn;
+    vr = x2_gapColumn;
+    v  = x3_gapColumn;
+
+    __m256d vv[5];
+    
+    vv[0] = _mm256_setzero_pd();
+    vv[1] = _mm256_setzero_pd();
+    vv[2] = _mm256_setzero_pd();
+    vv[3] = _mm256_setzero_pd();
+    vv[4] = _mm256_setzero_pd();
+    
+    for(l = 0; l < 20; l++)
+      {	       
+	__m256d 
+	  x1v = _mm256_setzero_pd(),
+	  x2v = _mm256_setzero_pd();	
+	
+	double 
+	  *ev = &extEV[l * 20],
+	  *lv = &le[l * 20],
+	  *rv = &ri[l * 20];														
+	
+	x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[0]), _mm256_load_pd(&lv[0])));
+	x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[4]), _mm256_load_pd(&lv[4])));
+	x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[8]), _mm256_load_pd(&lv[8])));
+	x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[12]), _mm256_load_pd(&lv[12])));
+	x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[16]), _mm256_load_pd(&lv[16])));
+	
+	x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[0]), _mm256_load_pd(&rv[0])));			    
+	x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[4]), _mm256_load_pd(&rv[4])));				    
+	x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[8]), _mm256_load_pd(&rv[8])));			    
+	x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[12]), _mm256_load_pd(&rv[12])));				    
+	x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[16]), _mm256_load_pd(&rv[16])));
+	
+	x1v = hadd4(x1v, x2v);			
+#ifdef _FMA
+	for(k = 0; k < 5; k++) 
+	  {
+	    __m256d evv = _mm256_load_pd(&ev[k*4]);
+	    vv[k] = FMAMACC(vv[k],x1v,evv);
+	  }
+#else	      
+	__m256d 
+	  evv[5];
+	
+	evv[0] = _mm256_load_pd(&ev[0]);
+	evv[1] = _mm256_load_pd(&ev[4]);
+	evv[2] = _mm256_load_pd(&ev[8]);
+	evv[3] = _mm256_load_pd(&ev[12]);
+	evv[4] = _mm256_load_pd(&ev[16]);		
+	
+	vv[0] = _mm256_add_pd(vv[0], _mm256_mul_pd(x1v, evv[0]));
+	vv[1] = _mm256_add_pd(vv[1], _mm256_mul_pd(x1v, evv[1]));
+	vv[2] = _mm256_add_pd(vv[2], _mm256_mul_pd(x1v, evv[2]));
+	vv[3] = _mm256_add_pd(vv[3], _mm256_mul_pd(x1v, evv[3]));
+	vv[4] = _mm256_add_pd(vv[4], _mm256_mul_pd(x1v, evv[4]));				      	
+#endif
+      }	  
+
+
+     if(tipCase != PLL_TIP_TIP)
+       {
+	 __m256d minlikelihood_avx = _mm256_set1_pd( PLL_MINLIKELIHOOD );
+	  
+	 scale = 1;
+	  
+	 for(l = 0; scale && (l < 20); l += 4)
+	   {	       
+	     __m256d 
+	       v1 = _mm256_and_pd(vv[l / 4], absMask_AVX.m);
+	     v1 = _mm256_cmp_pd(v1,  minlikelihood_avx, _CMP_LT_OS);
+	     
+	     if(_mm256_movemask_pd( v1 ) != 15)
+	       scale = 0;
+	   }	    	  	  
+
+	 if(scale)
+	   {
+	      __m256d 
+		twoto = _mm256_set1_pd(PLL_TWOTOTHE256);
+	      
+	      for(l = 0; l < 20; l += 4)
+		vv[l / 4] = _mm256_mul_pd(vv[l / 4] , twoto);		    		 	      	     	      
+	   
+	      scaleGap = 1;
+	   }
+       }
+
+     _mm256_store_pd(&v[0], vv[0]);
+     _mm256_store_pd(&v[4], vv[1]);
+     _mm256_store_pd(&v[8], vv[2]);
+     _mm256_store_pd(&v[12], vv[3]);
+     _mm256_store_pd(&v[16], vv[4]);     
+  }
+
+
+
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:
+      {
+	for (i = 0; i < n; i++)
+	  {
+	    if(noGap(x3_gap, i))	   
+	      {	    
+		vl = &(tipVector[20 * tipX1[i]]);
+		vr = &(tipVector[20 * tipX2[i]]);
+		v  = x3_ptr;	    	    	   	    
+
+		if(isGap(x1_gap, i))
+		  le =  &left[maxCats * 400];
+		else	  	  
+		  le =  &left[cptr[i] * 400];	  
+		
+		if(isGap(x2_gap, i))
+		  ri =  &right[maxCats * 400];
+		else	 	  
+		  ri =  &right[cptr[i] * 400];
+
+		__m256d vv[5];
+		
+		vv[0] = _mm256_setzero_pd();
+		vv[1] = _mm256_setzero_pd();
+		vv[2] = _mm256_setzero_pd();
+		vv[3] = _mm256_setzero_pd();
+		vv[4] = _mm256_setzero_pd();	   	    
+		
+		for(l = 0; l < 20; l++)
+		  {	       
+		    __m256d 
+		      x1v = _mm256_setzero_pd(),
+		      x2v = _mm256_setzero_pd();	
+		    
+		    double 
+		      *ev = &extEV[l * 20],
+		      *lv = &le[l * 20],
+		      *rv = &ri[l * 20];														
+		    
+#ifdef _FMA		
+		    for(k = 0; k < 20; k += 4) 
+		      {
+			__m256d vlv = _mm256_load_pd(&vl[k]);
+			__m256d lvv = _mm256_load_pd(&lv[k]);
+			x1v = FMAMACC(x1v,vlv,lvv);
+			__m256d vrv = _mm256_load_pd(&vr[k]);
+			__m256d rvv = _mm256_load_pd(&rv[k]);
+			x2v = FMAMACC(x2v,vrv,rvv);
+		      }
+#else		
+		    x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[0]), _mm256_load_pd(&lv[0])));
+		    x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[4]), _mm256_load_pd(&lv[4])));
+		    x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[8]), _mm256_load_pd(&lv[8])));
+		    x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[12]), _mm256_load_pd(&lv[12])));
+		    x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[16]), _mm256_load_pd(&lv[16])));
+		    
+		    x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[0]), _mm256_load_pd(&rv[0])));			    
+		    x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[4]), _mm256_load_pd(&rv[4])));				    
+		    x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[8]), _mm256_load_pd(&rv[8])));			    
+		    x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[12]), _mm256_load_pd(&rv[12])));				    
+		    x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[16]), _mm256_load_pd(&rv[16])));	
+#endif
+		    
+		    x1v = hadd4(x1v, x2v);			
+#ifdef _FMA
+		    for(k = 0; k < 5; k++) 
+		      {
+			__m256d evv = _mm256_load_pd(&ev[k*4]);
+			vv[k] = FMAMACC(vv[k],x1v,evv);
+		      }	  
+#else		
+		    __m256d 
+		      evv[5];
+		    
+		    evv[0] = _mm256_load_pd(&ev[0]);
+		    evv[1] = _mm256_load_pd(&ev[4]);
+		    evv[2] = _mm256_load_pd(&ev[8]);
+		    evv[3] = _mm256_load_pd(&ev[12]);
+		    evv[4] = _mm256_load_pd(&ev[16]);		
+		    
+		    vv[0] = _mm256_add_pd(vv[0], _mm256_mul_pd(x1v, evv[0]));
+		    vv[1] = _mm256_add_pd(vv[1], _mm256_mul_pd(x1v, evv[1]));
+		    vv[2] = _mm256_add_pd(vv[2], _mm256_mul_pd(x1v, evv[2]));
+		    vv[3] = _mm256_add_pd(vv[3], _mm256_mul_pd(x1v, evv[3]));
+		    vv[4] = _mm256_add_pd(vv[4], _mm256_mul_pd(x1v, evv[4]));				      		      	  
+#endif
+		  }
+		
+		_mm256_store_pd(&v[0], vv[0]);
+		_mm256_store_pd(&v[4], vv[1]);
+		_mm256_store_pd(&v[8], vv[2]);
+		_mm256_store_pd(&v[12], vv[3]);
+		_mm256_store_pd(&v[16], vv[4]);
+
+		x3_ptr += 20;
+	      }
+	  }
+      }
+      break;
+    case PLL_TIP_INNER:      	
+      for (i = 0; i < n; i++)
+	{
+	  if(isGap(x3_gap, i))
+	    {
+	      if(scaleGap)
+		{
+		  if(useFastScaling)
+		    addScale += wgt[i];
+		  else
+		    ex3[i] += 1;		   		    
+		}	     
+	    }
+	  else
+	    {
+	      vl = &(tipVector[20 * tipX1[i]]);
+
+	      vr = x2_ptr;
+	      v = x3_ptr;
+	      
+	      if(isGap(x1_gap, i))
+		le =  &left[maxCats * 400];
+	      else
+		le =  &left[cptr[i] * 400];
+	      
+	      if(isGap(x2_gap, i))
+		{		 
+		  ri =  &right[maxCats * 400];
+		  vr = x2_gapColumn;
+		}
+	      else
+		{
+		  ri =  &right[cptr[i] * 400];
+		  vr = x2_ptr;
+		  x2_ptr += 20;
+		}	  	  
+	  
+	      __m256d vv[5];
+	      
+	      vv[0] = _mm256_setzero_pd();
+	      vv[1] = _mm256_setzero_pd();
+	      vv[2] = _mm256_setzero_pd();
+	      vv[3] = _mm256_setzero_pd();
+	      vv[4] = _mm256_setzero_pd();
+	      	      	      
+	      for(l = 0; l < 20; l++)
+		{	       
+		  __m256d 
+		    x1v = _mm256_setzero_pd(),
+		    x2v = _mm256_setzero_pd();	
+		  
+		  double 
+		    *ev = &extEV[l * 20],
+		    *lv = &le[l * 20],
+		    *rv = &ri[l * 20];														
+#ifdef _FMA
+		  for(k = 0; k < 20; k += 4) 
+		    {
+		      __m256d vlv = _mm256_load_pd(&vl[k]);
+		      __m256d lvv = _mm256_load_pd(&lv[k]);
+		      x1v = FMAMACC(x1v,vlv,lvv);
+		      __m256d vrv = _mm256_load_pd(&vr[k]);
+		      __m256d rvv = _mm256_load_pd(&rv[k]);
+		      x2v = FMAMACC(x2v,vrv,rvv);
+		    }
+#else	      
+		  x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[0]), _mm256_load_pd(&lv[0])));
+		  x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[4]), _mm256_load_pd(&lv[4])));
+		  x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[8]), _mm256_load_pd(&lv[8])));
+		  x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[12]), _mm256_load_pd(&lv[12])));
+		  x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[16]), _mm256_load_pd(&lv[16])));
+		  
+		  x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[0]), _mm256_load_pd(&rv[0])));			    
+		  x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[4]), _mm256_load_pd(&rv[4])));				    
+		  x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[8]), _mm256_load_pd(&rv[8])));			    
+		  x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[12]), _mm256_load_pd(&rv[12])));				    
+		  x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[16]), _mm256_load_pd(&rv[16])));
+#endif
+		  
+		  x1v = hadd4(x1v, x2v);			
+		  
+		  __m256d 
+		    evv[5];
+		  
+		  evv[0] = _mm256_load_pd(&ev[0]);
+		  evv[1] = _mm256_load_pd(&ev[4]);
+		  evv[2] = _mm256_load_pd(&ev[8]);
+		  evv[3] = _mm256_load_pd(&ev[12]);
+		  evv[4] = _mm256_load_pd(&ev[16]);		
+		  
+#ifdef _FMA
+		  for(k = 0; k < 5; k++)
+		    vv[k] = FMAMACC(vv[k],x1v,evv[k]);		 
+#else	      
+		  vv[0] = _mm256_add_pd(vv[0], _mm256_mul_pd(x1v, evv[0]));
+		  vv[1] = _mm256_add_pd(vv[1], _mm256_mul_pd(x1v, evv[1]));
+		  vv[2] = _mm256_add_pd(vv[2], _mm256_mul_pd(x1v, evv[2]));
+		  vv[3] = _mm256_add_pd(vv[3], _mm256_mul_pd(x1v, evv[3]));
+		  vv[4] = _mm256_add_pd(vv[4], _mm256_mul_pd(x1v, evv[4]));				      	
+#endif
+		}	  
+
+	   	     
+	      __m256d minlikelihood_avx = _mm256_set1_pd( PLL_MINLIKELIHOOD );
+	  
+	      scale = 1;
+	      
+	      for(l = 0; scale && (l < 20); l += 4)
+		{	       
+		  __m256d 
+		    v1 = _mm256_and_pd(vv[l / 4], absMask_AVX.m);
+		  v1 = _mm256_cmp_pd(v1,  minlikelihood_avx, _CMP_LT_OS);
+		  
+		  if(_mm256_movemask_pd( v1 ) != 15)
+		    scale = 0;
+		}	    	  	  
+	 
+	      if(scale)
+		{
+		  __m256d 
+		    twoto = _mm256_set1_pd(PLL_TWOTOTHE256);
+		  
+		  for(l = 0; l < 20; l += 4)
+		    vv[l / 4] = _mm256_mul_pd(vv[l / 4] , twoto);		    		 
+		  
+		  if(useFastScaling)
+		    addScale += wgt[i];
+		  else
+		    ex3[i]  += 1;	      
+		}
+
+	      _mm256_store_pd(&v[0], vv[0]);
+	      _mm256_store_pd(&v[4], vv[1]);
+	      _mm256_store_pd(&v[8], vv[2]);
+	      _mm256_store_pd(&v[12], vv[3]);
+	      _mm256_store_pd(&v[16], vv[4]);	       
+	      
+	      x3_ptr += 20;
+	    }
+	}    
+      break;
+    case PLL_INNER_INNER:
+      for(i = 0; i < n; i++)
+	{
+	   if(isGap(x3_gap, i))
+	     {
+	       if(scaleGap)		   		    
+		 {
+		   if(useFastScaling)
+		     addScale += wgt[i];
+		   else
+		     ex3[i] += 1;
+		 }		 	       
+	     }
+	   else
+	     {
+
+	        v = x3_ptr;
+
+		if(isGap(x1_gap, i))
+		  {
+		    vl = x1_gapColumn;
+		    le =  &left[maxCats * 400];
+		  }
+		else
+		  {
+		    le =  &left[cptr[i] * 400];
+		    vl = x1_ptr;
+		    x1_ptr += 20;
+		  }
+		
+		if(isGap(x2_gap, i))	
+		  {
+		    vr = x2_gapColumn;
+		    ri =  &right[maxCats * 400];	    
+		  }
+		else
+		  {
+		    ri =  &right[cptr[i] * 400];
+		    vr = x2_ptr;
+		    x2_ptr += 20;
+		  }	 	  	 
+		
+		__m256d vv[5];
+		
+		vv[0] = _mm256_setzero_pd();
+		vv[1] = _mm256_setzero_pd();
+		vv[2] = _mm256_setzero_pd();
+		vv[3] = _mm256_setzero_pd();
+		vv[4] = _mm256_setzero_pd();
+		
+		for(l = 0; l < 20; l++)
+		  {	       
+		    __m256d 
+		      x1v = _mm256_setzero_pd(),
+		      x2v = _mm256_setzero_pd();	
+		    
+		    double 
+		      *ev = &extEV[l * 20],
+		      *lv = &le[l * 20],
+		      *rv = &ri[l * 20];														
+		    
+		    x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[0]), _mm256_load_pd(&lv[0])));
+		    x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[4]), _mm256_load_pd(&lv[4])));
+		    x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[8]), _mm256_load_pd(&lv[8])));
+		    x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[12]), _mm256_load_pd(&lv[12])));
+		    x1v = _mm256_add_pd(x1v, _mm256_mul_pd(_mm256_load_pd(&vl[16]), _mm256_load_pd(&lv[16])));
+		    
+		    x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[0]), _mm256_load_pd(&rv[0])));			    
+		    x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[4]), _mm256_load_pd(&rv[4])));				    
+		    x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[8]), _mm256_load_pd(&rv[8])));			    
+		    x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[12]), _mm256_load_pd(&rv[12])));				    
+		    x2v = _mm256_add_pd(x2v,  _mm256_mul_pd(_mm256_load_pd(&vr[16]), _mm256_load_pd(&rv[16])));
+		    
+		    x1v = hadd4(x1v, x2v);			
+#ifdef _FMA
+		    for(k = 0; k < 5; k++) 
+		      {
+			__m256d evv = _mm256_load_pd(&ev[k*4]);
+			vv[k] = FMAMACC(vv[k],x1v,evv);
+		      }
+#else	      
+		    __m256d 
+		      evv[5];
+		    
+		    evv[0] = _mm256_load_pd(&ev[0]);
+		    evv[1] = _mm256_load_pd(&ev[4]);
+		    evv[2] = _mm256_load_pd(&ev[8]);
+		    evv[3] = _mm256_load_pd(&ev[12]);
+		    evv[4] = _mm256_load_pd(&ev[16]);		
+		    
+		    vv[0] = _mm256_add_pd(vv[0], _mm256_mul_pd(x1v, evv[0]));
+		    vv[1] = _mm256_add_pd(vv[1], _mm256_mul_pd(x1v, evv[1]));
+		    vv[2] = _mm256_add_pd(vv[2], _mm256_mul_pd(x1v, evv[2]));
+		    vv[3] = _mm256_add_pd(vv[3], _mm256_mul_pd(x1v, evv[3]));
+		    vv[4] = _mm256_add_pd(vv[4], _mm256_mul_pd(x1v, evv[4]));				      	
+#endif
+		  }	  
+
+	   	     
+		__m256d minlikelihood_avx = _mm256_set1_pd( PLL_MINLIKELIHOOD );
+		
+		scale = 1;
+		
+		for(l = 0; scale && (l < 20); l += 4)
+		  {	       
+		    __m256d 
+		      v1 = _mm256_and_pd(vv[l / 4], absMask_AVX.m);
+		    v1 = _mm256_cmp_pd(v1,  minlikelihood_avx, _CMP_LT_OS);
+		    
+		    if(_mm256_movemask_pd( v1 ) != 15)
+		      scale = 0;
+		  }	    	  	  
+		
+		if(scale)
+		  {
+		    __m256d 
+		      twoto = _mm256_set1_pd(PLL_TWOTOTHE256);
+		    
+		    for(l = 0; l < 20; l += 4)
+		      vv[l / 4] = _mm256_mul_pd(vv[l / 4] , twoto);		    		 
+		    
+		    if(useFastScaling)
+		      addScale += wgt[i];
+		    else
+		      ex3[i]  += 1;	      
+		  }
+
+		_mm256_store_pd(&v[0], vv[0]);
+		_mm256_store_pd(&v[4], vv[1]);
+		_mm256_store_pd(&v[8], vv[2]);
+		_mm256_store_pd(&v[12], vv[3]);
+		_mm256_store_pd(&v[16], vv[4]);
+
+		 x3_ptr += 20;
+	     }
+	}   
+      break;
+    default:
+      assert(0);
+    }
+  
+  if(useFastScaling)
+    *scalerIncrement = addScale;
+}
+
+
+
+void newviewGTRGAMMAPROT_AVX_LG4(int tipCase,
+				 double *x1, double *x2, double *x3, double *extEV[4], double *tipVector[4],
+				 int *ex3, unsigned char *tipX1, unsigned char *tipX2, int n, 
+				 double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling) 
+{
+  double	
+    *uX1, 
+    *uX2, 
+    *v, 
+    x1px2, 
+    *vl, 
+    *vr;
+  
+  int	
+    i, 
+    j, 
+    l, 
+    k, 
+    scale, 
+    addScale = 0;
+
+ 
+#ifndef GCC_VERSION
+#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+#endif
+
+
+#if GCC_VERSION < 40500
+   __m256d
+    bitmask = _mm256_set_pd(0,0,0,-1);
+#else
+  __m256i
+    bitmask = _mm256_set_epi32(0, 0, 0, 0, 0, 0, -1, -1);
+#endif 
+  
+  switch(tipCase) 
+    {
+    case PLL_TIP_TIP: 
+      {
+       
+	double 
+	  umpX1[1840] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))), 
+	  umpX2[1840] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+	
+	for(i = 0; i < 23; i++) 
+	  {	    	    
+	    for(k = 0; k < 80; k++) 
+	      {
+		double 
+		  *ll =  &left[k * 20],
+		  *rr =  &right[k * 20];
+		
+		__m256d 
+		  umpX1v = _mm256_setzero_pd(),
+		  umpX2v = _mm256_setzero_pd();
+		
+		v = &(tipVector[k / 20][20 * i]);
+
+		for(l = 0; l < 20; l+=4) 
+		  {
+		    __m256d vv = _mm256_load_pd(&v[l]);
+#ifdef _FMA
+		    __m256d llv = _mm256_load_pd(&ll[l]);
+		    umpX1v = FMAMACC(umpX1v,vv,llv);
+		    __m256d rrv = _mm256_load_pd(&rr[l]);
+		    umpX2v = FMAMACC(umpX2v,vv,rrv);
+#else		    
+		    umpX1v = _mm256_add_pd(umpX1v,_mm256_mul_pd(vv,_mm256_load_pd(&ll[l])));
+		    umpX2v = _mm256_add_pd(umpX2v,_mm256_mul_pd(vv,_mm256_load_pd(&rr[l])));
+#endif
+		  }
+		
+		umpX1v = hadd3(umpX1v);
+		umpX2v = hadd3(umpX2v);
+		_mm256_maskstore_pd(&umpX1[80 * i + k], bitmask, umpX1v);
+		_mm256_maskstore_pd(&umpX2[80 * i + k], bitmask, umpX2v);
+	      } 
+	  }
+
+	for(i = 0; i < n; i++) 
+	  {	    
+	    uX1 = &umpX1[80 * tipX1[i]];
+	    uX2 = &umpX2[80 * tipX2[i]];
+	   
+	    for(j = 0; j < 4; j++) 
+	      {     	
+		__m256d vv[5];  
+
+		v = &x3[i * 80 + j * 20];
+			
+		vv[0] = _mm256_setzero_pd();
+		vv[1] = _mm256_setzero_pd();
+		vv[2] = _mm256_setzero_pd();
+		vv[3] = _mm256_setzero_pd();
+		vv[4] = _mm256_setzero_pd();
+
+		for(k = 0; k < 20; k++) 
+		  {			 
+		    x1px2 = uX1[j * 20 + k] * uX2[j * 20 + k];
+
+		    __m256d x1px2v = _mm256_set1_pd(x1px2);		    
+		    
+		    __m256d extEvv = _mm256_load_pd(&extEV[j][20 * k]);
+#ifdef _FMA
+		    vv[0] = FMAMACC(vv[0],x1px2v,extEvv);
+#else
+		    vv[0] = _mm256_add_pd(vv[0],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+		    _mm256_store_pd(&v[0],vv[0]);
+		    
+		    extEvv = _mm256_load_pd(&extEV[j][20 * k + 4]);
+#ifdef _FMA
+		    vv[1] = FMAMACC(vv[1],x1px2v,extEvv);
+#else
+		    vv[1] = _mm256_add_pd(vv[1],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+		    _mm256_store_pd(&v[4],vv[1]);
+
+		    extEvv = _mm256_load_pd(&extEV[j][20 * k + 8]);
+#ifdef _FMA
+		    vv[2] = FMAMACC(vv[2],x1px2v,extEvv);
+#else
+		    vv[2] = _mm256_add_pd(vv[2],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+		    _mm256_store_pd(&v[8],vv[2]);
+
+		    extEvv = _mm256_load_pd(&extEV[j][20 * k + 12]);
+#ifdef _FMA
+		    vv[3] = FMAMACC(vv[3],x1px2v,extEvv);
+#else
+		    vv[3] = _mm256_add_pd(vv[3],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+		    _mm256_store_pd(&v[12],vv[3]);
+
+		    extEvv = _mm256_load_pd(&extEV[j][20 * k + 16]);
+#ifdef _FMA
+		    vv[4] = FMAMACC(vv[4],x1px2v,extEvv);
+#else
+		    vv[4] = _mm256_add_pd(vv[4],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+		    _mm256_store_pd(&v[16],vv[4]);
+		  } 
+	      } 
+	  } 
+      } 
+      break;
+    case PLL_TIP_INNER: 
+      {
+
+	double 
+	  umpX1[1840] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))),
+	  ump_x2[20] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+	for(i = 0; i < 23; i++) 
+	  {	   
+	    for(k = 0; k < 80; k++) 
+	      {
+		__m256d umpX1v = _mm256_setzero_pd();
+		
+		 v = &(tipVector[k / 20][20 * i]);
+
+		for(l = 0; l < 20; l+=4) 
+		  {
+		    __m256d vv = _mm256_load_pd(&v[l]);
+		    __m256d leftv = _mm256_load_pd(&left[k * 20 + l]);
+#ifdef _FMA
+		   
+		    umpX1v = FMAMACC(umpX1v, vv, leftv);
+#else
+		    umpX1v = _mm256_add_pd(umpX1v, _mm256_mul_pd(vv, leftv));
+#endif
+		  }
+		umpX1v = hadd3(umpX1v);
+		_mm256_maskstore_pd(&umpX1[80 * i + k], bitmask, umpX1v);
+	      } 
+	  }
+	
+	for (i = 0; i < n; i++) 
+	  {	   
+	    uX1 = &umpX1[80 * tipX1[i]];
+	   	    
+	    for(k = 0; k < 4; k++) 
+	      {
+		v = &(x2[80 * i + k * 20]);
+		
+		for(l = 0; l < 20; l++) 
+		  {
+		    __m256d ump_x2v = _mm256_setzero_pd();
+		    		  
+		    __m256d vv = _mm256_load_pd(&v[0]);
+		    __m256d rightv = _mm256_load_pd(&right[k*400+l*20+0]);
+#ifdef _FMA
+		    ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+		    ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+		    
+		    vv = _mm256_load_pd(&v[4]);
+		    rightv = _mm256_load_pd(&right[k*400+l*20+4]);
+#ifdef _FMA
+		    ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+		    ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+
+		    vv = _mm256_load_pd(&v[8]);
+		    rightv = _mm256_load_pd(&right[k*400+l*20+8]);
+#ifdef _FMA
+		    ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+		    ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+
+		    vv = _mm256_load_pd(&v[12]);
+		    rightv = _mm256_load_pd(&right[k*400+l*20+12]);
+#ifdef _FMA
+		    ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+		    ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+
+		    vv = _mm256_load_pd(&v[16]);
+		    rightv = _mm256_load_pd(&right[k*400+l*20+16]);
+#ifdef _FMA
+		    ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+		    ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+		    
+		    ump_x2v = hadd3(ump_x2v);
+		    _mm256_maskstore_pd(&ump_x2[l], bitmask, ump_x2v);
+		  }
+		
+		v = &(x3[80 * i + 20 * k]);
+	
+
+		__m256d vv[5]; 
+
+		vv[0] = _mm256_setzero_pd();
+		vv[1] = _mm256_setzero_pd();
+		vv[2] = _mm256_setzero_pd();
+		vv[3] = _mm256_setzero_pd();
+		vv[4] = _mm256_setzero_pd();
+		
+		for(l = 0; l < 20; l++) 
+		  {
+		    x1px2 = uX1[k * 20 + l]	* ump_x2[l];
+		    __m256d x1px2v = _mm256_set1_pd(x1px2);	
+	    		 
+#ifdef _FMA
+		    __m256d ev = _mm256_load_pd(&extEV[k][l * 20 + 0]);
+		    vv[0] = FMAMACC(vv[0],x1px2v, ev);
+#else
+		    vv[0] = _mm256_add_pd(vv[0],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[k][l * 20 + 0])));
+#endif
+		    _mm256_store_pd(&v[0],vv[0]);
+
+#ifdef _FMA
+		    ev = _mm256_load_pd(&extEV[k][l * 20 + 4]);
+		    vv[1] = FMAMACC(vv[1],x1px2v, ev);
+#else
+		    vv[1] = _mm256_add_pd(vv[1],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[k][l * 20 + 4])));
+#endif
+		    _mm256_store_pd(&v[4],vv[1]);
+
+#ifdef _FMA
+		    ev = _mm256_load_pd(&extEV[k][l * 20 + 8]);
+		    vv[2] = FMAMACC(vv[2],x1px2v, ev);
+#else
+		    vv[2] = _mm256_add_pd(vv[2],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[k][l * 20 + 8])));
+#endif
+		    _mm256_store_pd(&v[8],vv[2]);
+		    
+#ifdef _FMA
+		    ev = _mm256_load_pd(&extEV[k][l * 20 + 12]);
+		    vv[3] = FMAMACC(vv[3],x1px2v, ev);
+#else
+		    vv[3] = _mm256_add_pd(vv[3],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[k][l * 20 + 12])));
+#endif
+		    _mm256_store_pd(&v[12],vv[3]);
+
+
+#ifdef _FMA
+		    ev = _mm256_load_pd(&extEV[k][l * 20 + 16]);
+		    vv[4] = FMAMACC(vv[4],x1px2v, ev);
+#else
+		    vv[4] = _mm256_add_pd(vv[4],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[k][l * 20 + 16])));
+#endif
+		    _mm256_store_pd(&v[16],vv[4]);
+
+		  } 
+	      }
+	   
+	    v = &x3[80 * i];
+	    __m256d minlikelihood_avx = _mm256_set1_pd(PLL_MINLIKELIHOOD);
+	    scale = 1;
+	    for(l = 0; scale && (l < 80); l += 4) 
+	      {
+		__m256d vv = _mm256_load_pd(&v[l]);
+		__m256d vv_abs = _mm256_and_pd(vv,absMask_AVX.m);
+		vv_abs = _mm256_cmp_pd(vv_abs,minlikelihood_avx,_CMP_LT_OS);
+		if(_mm256_movemask_pd(vv_abs) != 15)
+		  scale = 0;
+	      }
+	    
+	    if(scale) 
+	      {		
+		__m256d PLL_TWOTOTHE256v = _mm256_set_pd(PLL_TWOTOTHE256,PLL_TWOTOTHE256,PLL_TWOTOTHE256,PLL_TWOTOTHE256);
+		for(l = 0; l < 80; l += 4) 
+		  {
+		    __m256d vv = _mm256_load_pd(&v[l]);
+		    _mm256_store_pd(&v[l],_mm256_mul_pd(vv,PLL_TWOTOTHE256v));
+		  }
+		if(useFastScaling)
+		  addScale += wgt[i];				
+		else
+		  ex3[i] += 1;
+	      } 
+	  } 
+      } 
+      break;
+    case PLL_INNER_INNER:      
+      for(i = 0; i < n; i++) 
+	{ 
+	  scale = 1;
+	  
+	  for(k = 0; k < 4; k++) 
+	    {
+	      vl = &(x1[80 * i + 20 * k]);
+	      vr = &(x2[80 * i + 20 * k]);
+	      v  = &(x3[80 * i + 20 * k]);	      	   
+
+	      __m256d vv[5]; 
+	      
+	      vv[0] = _mm256_setzero_pd();
+	      vv[1] = _mm256_setzero_pd();
+	      vv[2] = _mm256_setzero_pd();
+	      vv[3] = _mm256_setzero_pd();
+	      vv[4] = _mm256_setzero_pd();
+	      
+	      for(l = 0; l < 20; l++) 
+		{		  
+		  __m256d al = _mm256_setzero_pd();
+		  __m256d ar = _mm256_setzero_pd();
+       		  
+		  __m256d leftv  = _mm256_load_pd(&left[k * 400 + l * 20 + 0]);
+		  __m256d rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 0]);
+		  __m256d vlv = _mm256_load_pd(&vl[0]);
+		  __m256d vrv = _mm256_load_pd(&vr[0]);
+		  
+#ifdef _FMA
+		    
+		  al = FMAMACC(al, vlv, leftv);
+		  ar = FMAMACC(ar, vrv, rightv);
+#else
+		  al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+		  ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));		  
+#endif
+
+		  leftv = _mm256_load_pd(&left[k * 400 + l * 20 + 4]);
+		  rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 4]);
+		  vlv = _mm256_load_pd(&vl[4]);
+		  vrv = _mm256_load_pd(&vr[4]);
+#ifdef _FMA
+		    
+		  al = FMAMACC(al, vlv, leftv);
+		  ar = FMAMACC(ar, vrv, rightv);
+#else
+		  al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+		  ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));
+#endif
+
+		  leftv = _mm256_load_pd(&left[k * 400 + l * 20 + 8]);
+		  rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 8]);
+		  vlv = _mm256_load_pd(&vl[8]);
+		  vrv = _mm256_load_pd(&vr[8]);
+#ifdef _FMA
+		    
+		  al = FMAMACC(al, vlv, leftv);
+		  ar = FMAMACC(ar, vrv, rightv);
+#else
+		  al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+		  ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));
+#endif
+
+		  leftv = _mm256_load_pd(&left[k * 400 + l * 20 + 12]);
+		  rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 12]);
+		  vlv = _mm256_load_pd(&vl[12]);
+		  vrv = _mm256_load_pd(&vr[12]);
+#ifdef _FMA
+		    
+		  al = FMAMACC(al, vlv, leftv);
+		  ar = FMAMACC(ar, vrv, rightv);
+#else
+		  al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+		  ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));
+#endif
+
+		  leftv = _mm256_load_pd(&left[k * 400 + l * 20 + 16]);
+		  rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 16]);
+		  vlv = _mm256_load_pd(&vl[16]);
+		  vrv = _mm256_load_pd(&vr[16]);
+
+#ifdef _FMA		    
+		  al = FMAMACC(al, vlv, leftv);
+		  ar = FMAMACC(ar, vrv, rightv);
+#else
+		  al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+		  ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));
+#endif
+
+		  /**************************************************************************************************************/
+
+		  al = hadd3(al);
+		  ar = hadd3(ar);
+		  al = _mm256_mul_pd(ar,al);
+		  
+		  /************************************************************************************************************/
+#ifdef _FMA		    
+		  __m256d ev =  _mm256_load_pd(&extEV[k][20 * l + 0]);
+		  vv[0] = FMAMACC(vv[0], al, ev);		 
+#else
+		  vv[0] = _mm256_add_pd(vv[0],_mm256_mul_pd(al, _mm256_load_pd(&extEV[k][20 * l + 0])));			  		 		  
+#endif
+		  _mm256_store_pd(&v[0],vv[0]);
+
+#ifdef _FMA		    
+		  ev =  _mm256_load_pd(&extEV[k][20 * l + 4]);
+		  vv[1] = FMAMACC(vv[1], al, ev);		 
+#else
+		  vv[1] = _mm256_add_pd(vv[1],_mm256_mul_pd(al, _mm256_load_pd(&extEV[k][20 * l + 4])));		  		 
+#endif
+		  _mm256_store_pd(&v[4],vv[1]);
+
+#ifdef _FMA		    
+		  ev =  _mm256_load_pd(&extEV[k][20 * l + 8]);
+		  vv[2] = FMAMACC(vv[2], al, ev);		 
+#else
+		  vv[2] = _mm256_add_pd(vv[2],_mm256_mul_pd(al, _mm256_load_pd(&extEV[k][20 * l + 8])));		  		 
+#endif
+		  _mm256_store_pd(&v[8],vv[2]);
+
+#ifdef _FMA		    
+		  ev =  _mm256_load_pd(&extEV[k][20 * l + 12]);
+		  vv[3] = FMAMACC(vv[3], al, ev);		 
+#else
+		  vv[3] = _mm256_add_pd(vv[3],_mm256_mul_pd(al, _mm256_load_pd(&extEV[k][20 * l + 12])));		  		 
+#endif
+		  _mm256_store_pd(&v[12],vv[3]);
+
+#ifdef _FMA		    
+		  ev =  _mm256_load_pd(&extEV[k][20 * l + 16]);
+		  vv[4] = FMAMACC(vv[4], al, ev);		 
+#else
+		  vv[4] = _mm256_add_pd(vv[4],_mm256_mul_pd(al, _mm256_load_pd(&extEV[k][20 * l + 16])));			 	  
+#endif
+		  _mm256_store_pd(&v[16],vv[4]);		 
+		} 
+	    }
+	  v = &(x3[80 * i]);
+	  scale = 1;
+	  __m256d minlikelihood_avx = _mm256_set1_pd(PLL_MINLIKELIHOOD);	 
+
+	  for(l = 0; scale && (l < 80); l += 4) 
+	    {
+	      __m256d vv = _mm256_load_pd(&v[l]);
+	      __m256d vv_abs = _mm256_and_pd(vv,absMask_AVX.m);
+	      vv_abs = _mm256_cmp_pd(vv_abs,minlikelihood_avx,_CMP_LT_OS);
+	      if(_mm256_movemask_pd(vv_abs) != 15)
+		scale = 0;	     
+	    }
+
+	  if(scale) 
+	    {		     	      
+	      __m256d PLL_TWOTOTHE256v = _mm256_set_pd(PLL_TWOTOTHE256,PLL_TWOTOTHE256,PLL_TWOTOTHE256,PLL_TWOTOTHE256);
+	      for(l = 0; l < 80; l += 4) 
+		{
+		  __m256d vv = _mm256_load_pd(&v[l]);
+		  _mm256_store_pd(&v[l],_mm256_mul_pd(vv,PLL_TWOTOTHE256v));
+		}
+	      if(useFastScaling)
+		addScale += wgt[i];					
+	      else
+		ex3[i] += 1;
+	    } 
+	}
+      break;
+    default:
+      assert(0);
+    }
+ 
+  if(useFastScaling)
+    *scalerIncrement = addScale;
+}
+ 
+
+void newviewGTRGAMMAPROT_AVX(int tipCase,
+			     double *x1, double *x2, double *x3, double *extEV, double *tipVector,
+			     int *ex3, unsigned char *tipX1, unsigned char *tipX2, int n, 
+			     double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling) 
+{
+  double	
+    *uX1, 
+    *uX2, 
+    *v, 
+    x1px2, 
+    *vl, 
+    *vr;
+  
+  int	
+    i, 
+    j, 
+    l, 
+    k, 
+    scale, 
+    addScale = 0;
+
+ 
+#ifndef GCC_VERSION
+#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+#endif
+
+
+#if GCC_VERSION < 40500
+   __m256d
+    bitmask = _mm256_set_pd(0,0,0,-1);
+#else
+  __m256i
+    bitmask = _mm256_set_epi32(0, 0, 0, 0, 0, 0, -1, -1);
+#endif 
+  
+  switch(tipCase) 
+    {
+    case PLL_TIP_TIP: 
+      {
+       
+	double 
+	  umpX1[1840] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))), 
+	  umpX2[1840] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+	for(i = 0; i < 23; i++) 
+	  {
+	    v = &(tipVector[20 * i]);
+	    
+	    for(k = 0; k < 80; k++) 
+	      {
+		double 
+		  *ll =  &left[k * 20],
+		  *rr =  &right[k * 20];
+		
+		__m256d 
+		  umpX1v = _mm256_setzero_pd(),
+		  umpX2v = _mm256_setzero_pd();
+		
+		for(l = 0; l < 20; l+=4) 
+		  {
+		    __m256d vv = _mm256_load_pd(&v[l]);
+#ifdef _FMA
+		    __m256d llv = _mm256_load_pd(&ll[l]);
+		    umpX1v = FMAMACC(umpX1v,vv,llv);
+		    __m256d rrv = _mm256_load_pd(&rr[l]);
+		    umpX2v = FMAMACC(umpX2v,vv,rrv);
+#else		    
+		    umpX1v = _mm256_add_pd(umpX1v,_mm256_mul_pd(vv,_mm256_load_pd(&ll[l])));
+		    umpX2v = _mm256_add_pd(umpX2v,_mm256_mul_pd(vv,_mm256_load_pd(&rr[l])));
+#endif
+		  }
+		
+		umpX1v = hadd3(umpX1v);
+		umpX2v = hadd3(umpX2v);
+		_mm256_maskstore_pd(&umpX1[80 * i + k], bitmask, umpX1v);
+		_mm256_maskstore_pd(&umpX2[80 * i + k], bitmask, umpX2v);
+	      } 
+	  }
+
+	for(i = 0; i < n; i++) 
+	  {	    
+	    uX1 = &umpX1[80 * tipX1[i]];
+	    uX2 = &umpX2[80 * tipX2[i]];
+	   
+	    for(j = 0; j < 4; j++) 
+	      {     	
+		__m256d vv[5];  
+
+		v = &x3[i * 80 + j * 20];
+			
+		vv[0] = _mm256_setzero_pd();
+		vv[1] = _mm256_setzero_pd();
+		vv[2] = _mm256_setzero_pd();
+		vv[3] = _mm256_setzero_pd();
+		vv[4] = _mm256_setzero_pd();
+
+		for(k = 0; k < 20; k++) 
+		  {			 
+		    x1px2 = uX1[j * 20 + k] * uX2[j * 20 + k];
+
+		    __m256d x1px2v = _mm256_set1_pd(x1px2);		    
+		    
+		    __m256d extEvv = _mm256_load_pd(&extEV[20 * k]);
+#ifdef _FMA
+		    vv[0] = FMAMACC(vv[0],x1px2v,extEvv);
+#else
+		    vv[0] = _mm256_add_pd(vv[0],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+		    _mm256_store_pd(&v[0],vv[0]);
+		    
+		    extEvv = _mm256_load_pd(&extEV[20 * k + 4]);
+#ifdef _FMA
+		    vv[1] = FMAMACC(vv[1],x1px2v,extEvv);
+#else
+		    vv[1] = _mm256_add_pd(vv[1],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+		    _mm256_store_pd(&v[4],vv[1]);
+
+		    extEvv = _mm256_load_pd(&extEV[20 * k + 8]);
+#ifdef _FMA
+		    vv[2] = FMAMACC(vv[2],x1px2v,extEvv);
+#else
+		    vv[2] = _mm256_add_pd(vv[2],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+		    _mm256_store_pd(&v[8],vv[2]);
+
+		    extEvv = _mm256_load_pd(&extEV[20 * k + 12]);
+#ifdef _FMA
+		    vv[3] = FMAMACC(vv[3],x1px2v,extEvv);
+#else
+		    vv[3] = _mm256_add_pd(vv[3],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+		    _mm256_store_pd(&v[12],vv[3]);
+
+		    extEvv = _mm256_load_pd(&extEV[20 * k + 16]);
+#ifdef _FMA
+		    vv[4] = FMAMACC(vv[4],x1px2v,extEvv);
+#else
+		    vv[4] = _mm256_add_pd(vv[4],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+		    _mm256_store_pd(&v[16],vv[4]);
+		  } 
+	      } 
+	  } 
+      } 
+      break;
+    case PLL_TIP_INNER: 
+      {
+
+	double 
+	  umpX1[1840] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))),
+	  ump_x2[20] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+	for(i = 0; i < 23; i++) 
+	  {
+	    v = &(tipVector[20 * i]);
+
+	    for(k = 0; k < 80; k++) 
+	      {
+		__m256d umpX1v = _mm256_setzero_pd();
+		for(l = 0; l < 20; l+=4) 
+		  {
+		    __m256d vv = _mm256_load_pd(&v[l]);
+		    __m256d leftv = _mm256_load_pd(&left[k * 20 + l]);
+#ifdef _FMA
+		   
+		    umpX1v = FMAMACC(umpX1v, vv, leftv);
+#else
+		    umpX1v = _mm256_add_pd(umpX1v, _mm256_mul_pd(vv, leftv));
+#endif
+		  }
+		umpX1v = hadd3(umpX1v);
+		_mm256_maskstore_pd(&umpX1[80 * i + k], bitmask, umpX1v);
+	      } 
+	  }
+	
+	for (i = 0; i < n; i++) 
+	  {	   
+	    uX1 = &umpX1[80 * tipX1[i]];
+	   	    
+	    for(k = 0; k < 4; k++) 
+	      {
+		v = &(x2[80 * i + k * 20]);
+		
+		for(l = 0; l < 20; l++) 
+		  {
+		    __m256d ump_x2v = _mm256_setzero_pd();
+		    		  
+		    __m256d vv = _mm256_load_pd(&v[0]);
+		    __m256d rightv = _mm256_load_pd(&right[k*400+l*20+0]);
+#ifdef _FMA
+		    ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+		    ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+		    
+		    vv = _mm256_load_pd(&v[4]);
+		    rightv = _mm256_load_pd(&right[k*400+l*20+4]);
+#ifdef _FMA
+		    ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+		    ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+
+		    vv = _mm256_load_pd(&v[8]);
+		    rightv = _mm256_load_pd(&right[k*400+l*20+8]);
+#ifdef _FMA
+		    ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+		    ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+
+		    vv = _mm256_load_pd(&v[12]);
+		    rightv = _mm256_load_pd(&right[k*400+l*20+12]);
+#ifdef _FMA
+		    ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+		    ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+
+		    vv = _mm256_load_pd(&v[16]);
+		    rightv = _mm256_load_pd(&right[k*400+l*20+16]);
+#ifdef _FMA
+		    ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+		    ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+		    
+		    ump_x2v = hadd3(ump_x2v);
+		    _mm256_maskstore_pd(&ump_x2[l], bitmask, ump_x2v);
+		  }
+		
+		v = &(x3[80 * i + 20 * k]);
+	
+
+		__m256d vv[5]; 
+
+		vv[0] = _mm256_setzero_pd();
+		vv[1] = _mm256_setzero_pd();
+		vv[2] = _mm256_setzero_pd();
+		vv[3] = _mm256_setzero_pd();
+		vv[4] = _mm256_setzero_pd();
+		
+		for(l = 0; l < 20; l++) 
+		  {
+		    x1px2 = uX1[k * 20 + l]	* ump_x2[l];
+		    __m256d x1px2v = _mm256_set1_pd(x1px2);	
+	    		 
+#ifdef _FMA
+		    __m256d ev = _mm256_load_pd(&extEV[l * 20 + 0]);
+		    vv[0] = FMAMACC(vv[0],x1px2v, ev);
+#else
+		    vv[0] = _mm256_add_pd(vv[0],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[l * 20 + 0])));
+#endif
+		    _mm256_store_pd(&v[0],vv[0]);
+
+#ifdef _FMA
+		    ev = _mm256_load_pd(&extEV[l * 20 + 4]);
+		    vv[1] = FMAMACC(vv[1],x1px2v, ev);
+#else
+		    vv[1] = _mm256_add_pd(vv[1],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[l * 20 + 4])));
+#endif
+		    _mm256_store_pd(&v[4],vv[1]);
+
+#ifdef _FMA
+		    ev = _mm256_load_pd(&extEV[l * 20 + 8]);
+		    vv[2] = FMAMACC(vv[2],x1px2v, ev);
+#else
+		    vv[2] = _mm256_add_pd(vv[2],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[l * 20 + 8])));
+#endif
+		    _mm256_store_pd(&v[8],vv[2]);
+		    
+#ifdef _FMA
+		    ev = _mm256_load_pd(&extEV[l * 20 + 12]);
+		    vv[3] = FMAMACC(vv[3],x1px2v, ev);
+#else
+		    vv[3] = _mm256_add_pd(vv[3],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[l * 20 + 12])));
+#endif
+		    _mm256_store_pd(&v[12],vv[3]);
+
+
+#ifdef _FMA
+		    ev = _mm256_load_pd(&extEV[l * 20 + 16]);
+		    vv[4] = FMAMACC(vv[4],x1px2v, ev);
+#else
+		    vv[4] = _mm256_add_pd(vv[4],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[l * 20 + 16])));
+#endif
+		    _mm256_store_pd(&v[16],vv[4]);
+
+		  } 
+	      }
+	   
+	    v = &x3[80 * i];
+	    __m256d minlikelihood_avx = _mm256_set1_pd(PLL_MINLIKELIHOOD);
+	    scale = 1;
+	    for(l = 0; scale && (l < 80); l += 4) 
+	      {
+		__m256d vv = _mm256_load_pd(&v[l]);
+		__m256d vv_abs = _mm256_and_pd(vv,absMask_AVX.m);
+		vv_abs = _mm256_cmp_pd(vv_abs,minlikelihood_avx,_CMP_LT_OS);
+		if(_mm256_movemask_pd(vv_abs) != 15)
+		  scale = 0;
+	      }
+	    
+	    if(scale) 
+	      {		
+		__m256d PLL_TWOTOTHE256v = _mm256_set_pd(PLL_TWOTOTHE256,PLL_TWOTOTHE256,PLL_TWOTOTHE256,PLL_TWOTOTHE256);
+		for(l = 0; l < 80; l += 4) 
+		  {
+		    __m256d vv = _mm256_load_pd(&v[l]);
+		    _mm256_store_pd(&v[l],_mm256_mul_pd(vv,PLL_TWOTOTHE256v));
+		  }
+		if(useFastScaling)
+		  addScale += wgt[i];				
+		else
+		  ex3[i] += 1;
+	      } 
+	  } 
+      } 
+      break;
+    case PLL_INNER_INNER:      
+      for(i = 0; i < n; i++) 
+	{ 
+	  scale = 1;
+	  
+	  for(k = 0; k < 4; k++) 
+	    {
+	      vl = &(x1[80 * i + 20 * k]);
+	      vr = &(x2[80 * i + 20 * k]);
+	      v  = &(x3[80 * i + 20 * k]);	      	   
+
+	      __m256d vv[5]; 
+	      
+	      vv[0] = _mm256_setzero_pd();
+	      vv[1] = _mm256_setzero_pd();
+	      vv[2] = _mm256_setzero_pd();
+	      vv[3] = _mm256_setzero_pd();
+	      vv[4] = _mm256_setzero_pd();
+	      
+	      for(l = 0; l < 20; l++) 
+		{		  
+		  __m256d al = _mm256_setzero_pd();
+		  __m256d ar = _mm256_setzero_pd();
+       		  
+		  __m256d leftv  = _mm256_load_pd(&left[k * 400 + l * 20 + 0]);
+		  __m256d rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 0]);
+		  __m256d vlv = _mm256_load_pd(&vl[0]);
+		  __m256d vrv = _mm256_load_pd(&vr[0]);
+		  
+#ifdef _FMA
+		    
+		  al = FMAMACC(al, vlv, leftv);
+		  ar = FMAMACC(ar, vrv, rightv);
+#else
+		  al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+		  ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));		  
+#endif
+
+		  leftv = _mm256_load_pd(&left[k * 400 + l * 20 + 4]);
+		  rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 4]);
+		  vlv = _mm256_load_pd(&vl[4]);
+		  vrv = _mm256_load_pd(&vr[4]);
+#ifdef _FMA
+		    
+		  al = FMAMACC(al, vlv, leftv);
+		  ar = FMAMACC(ar, vrv, rightv);
+#else
+		  al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+		  ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));
+#endif
+
+		  leftv = _mm256_load_pd(&left[k * 400 + l * 20 + 8]);
+		  rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 8]);
+		  vlv = _mm256_load_pd(&vl[8]);
+		  vrv = _mm256_load_pd(&vr[8]);
+#ifdef _FMA
+		    
+		  al = FMAMACC(al, vlv, leftv);
+		  ar = FMAMACC(ar, vrv, rightv);
+#else
+		  al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+		  ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));
+#endif
+
+		  leftv = _mm256_load_pd(&left[k * 400 + l * 20 + 12]);
+		  rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 12]);
+		  vlv = _mm256_load_pd(&vl[12]);
+		  vrv = _mm256_load_pd(&vr[12]);
+#ifdef _FMA
+		    
+		  al = FMAMACC(al, vlv, leftv);
+		  ar = FMAMACC(ar, vrv, rightv);
+#else
+		  al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+		  ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));
+#endif
+
+		  leftv = _mm256_load_pd(&left[k * 400 + l * 20 + 16]);
+		  rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 16]);
+		  vlv = _mm256_load_pd(&vl[16]);
+		  vrv = _mm256_load_pd(&vr[16]);
+
+#ifdef _FMA		    
+		  al = FMAMACC(al, vlv, leftv);
+		  ar = FMAMACC(ar, vrv, rightv);
+#else
+		  al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+		  ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));
+#endif
+
+		  /**************************************************************************************************************/
+
+		  al = hadd3(al);
+		  ar = hadd3(ar);
+		  al = _mm256_mul_pd(ar,al);
+		  
+		  /************************************************************************************************************/
+#ifdef _FMA		    
+		  __m256d ev =  _mm256_load_pd(&extEV[20 * l + 0]);
+		  vv[0] = FMAMACC(vv[0], al, ev);		 
+#else
+		  vv[0] = _mm256_add_pd(vv[0],_mm256_mul_pd(al, _mm256_load_pd(&extEV[20 * l + 0])));			  		 		  
+#endif
+		  _mm256_store_pd(&v[0],vv[0]);
+
+#ifdef _FMA		    
+		  ev =  _mm256_load_pd(&extEV[20 * l + 4]);
+		  vv[1] = FMAMACC(vv[1], al, ev);		 
+#else
+		  vv[1] = _mm256_add_pd(vv[1],_mm256_mul_pd(al, _mm256_load_pd(&extEV[20 * l + 4])));		  		 
+#endif
+		  _mm256_store_pd(&v[4],vv[1]);
+
+#ifdef _FMA		    
+		  ev =  _mm256_load_pd(&extEV[20 * l + 8]);
+		  vv[2] = FMAMACC(vv[2], al, ev);		 
+#else
+		  vv[2] = _mm256_add_pd(vv[2],_mm256_mul_pd(al, _mm256_load_pd(&extEV[20 * l + 8])));		  		 
+#endif
+		  _mm256_store_pd(&v[8],vv[2]);
+
+#ifdef _FMA		    
+		  ev =  _mm256_load_pd(&extEV[20 * l + 12]);
+		  vv[3] = FMAMACC(vv[3], al, ev);		 
+#else
+		  vv[3] = _mm256_add_pd(vv[3],_mm256_mul_pd(al, _mm256_load_pd(&extEV[20 * l + 12])));		  		 
+#endif
+		  _mm256_store_pd(&v[12],vv[3]);
+
+#ifdef _FMA		    
+		  ev =  _mm256_load_pd(&extEV[20 * l + 16]);
+		  vv[4] = FMAMACC(vv[4], al, ev);		 
+#else
+		  vv[4] = _mm256_add_pd(vv[4],_mm256_mul_pd(al, _mm256_load_pd(&extEV[20 * l + 16])));			 	  
+#endif
+		  _mm256_store_pd(&v[16],vv[4]);		 
+		} 
+	    }
+	  v = &(x3[80 * i]);
+	  scale = 1;
+	  __m256d minlikelihood_avx = _mm256_set1_pd(PLL_MINLIKELIHOOD);	 
+
+	  for(l = 0; scale && (l < 80); l += 4) 
+	    {
+	      __m256d vv = _mm256_load_pd(&v[l]);
+	      __m256d vv_abs = _mm256_and_pd(vv,absMask_AVX.m);
+	      vv_abs = _mm256_cmp_pd(vv_abs,minlikelihood_avx,_CMP_LT_OS);
+	      if(_mm256_movemask_pd(vv_abs) != 15)
+		scale = 0;	     
+	    }
+
+	  if(scale) 
+	    {		     	      
+	      __m256d PLL_TWOTOTHE256v = _mm256_set_pd(PLL_TWOTOTHE256,PLL_TWOTOTHE256,PLL_TWOTOTHE256,PLL_TWOTOTHE256);
+	      for(l = 0; l < 80; l += 4) 
+		{
+		  __m256d vv = _mm256_load_pd(&v[l]);
+		  _mm256_store_pd(&v[l],_mm256_mul_pd(vv,PLL_TWOTOTHE256v));
+		}
+	      if(useFastScaling)
+		addScale += wgt[i];					
+	      else
+		ex3[i] += 1;
+	    } 
+	}
+      break;
+    default:
+      assert(0);
+    }
+ 
+  if(useFastScaling)
+    *scalerIncrement = addScale;
+}
+
+
+
+void newviewGTRGAMMAPROT_AVX_GAPPED_SAVE(int tipCase,
+					 double *x1_start, double *x2_start, double *x3_start, double *extEV, double *tipVector,
+					 int *ex3, unsigned char *tipX1, unsigned char *tipX2, int n, 
+					 double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling,
+					 unsigned int *x1_gap, unsigned int *x2_gap, unsigned int *x3_gap, 
+					 double *x1_gapColumn, double *x2_gapColumn, double *x3_gapColumn) 
+{
+  double	
+    *x1 = x1_start,
+    *x2 = x2_start,
+    *x3_ptr = x3_start,
+    *x2_ptr = x2_start,
+    *x1_ptr = x1_start,
+    *uX1, 
+    *uX2, 
+    *v, 
+    x1px2, 
+    *vl, 
+    *vr;
+  
+  int	
+    i, 
+    j, 
+    l, 
+    k, 
+    gapScaling = 0,
+    scale, 
+    addScale = 0;
+
+ 
+#ifndef GCC_VERSION
+#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+#endif
+
+
+#if GCC_VERSION < 40500
+   __m256d
+    bitmask = _mm256_set_pd(0,0,0,-1);
+#else
+  __m256i
+    bitmask = _mm256_set_epi32(0, 0, 0, 0, 0, 0, -1, -1);
+#endif 
+  
+  switch(tipCase) 
+    {
+    case PLL_TIP_TIP: 
+      {       
+	double 
+	  umpX1[1840] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))), 
+	  umpX2[1840] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+
+
+	for(i = 0; i < 23; i++) 
+	  {
+	    v = &(tipVector[20 * i]);
+	    
+	    for(k = 0; k < 80; k++) 
+	      {
+		double 
+		  *ll =  &left[k * 20],
+		  *rr =  &right[k * 20];
+		
+		__m256d 
+		  umpX1v = _mm256_setzero_pd(),
+		  umpX2v = _mm256_setzero_pd();
+		
+		for(l = 0; l < 20; l+=4) 
+		  {
+		    __m256d vv = _mm256_load_pd(&v[l]);
+#ifdef _FMA
+		    __m256d llv = _mm256_load_pd(&ll[l]);
+		    umpX1v = FMAMACC(umpX1v,vv,llv);
+		    __m256d rrv = _mm256_load_pd(&rr[l]);
+		    umpX2v = FMAMACC(umpX2v,vv,rrv);
+#else		    
+		    umpX1v = _mm256_add_pd(umpX1v,_mm256_mul_pd(vv,_mm256_load_pd(&ll[l])));
+		    umpX2v = _mm256_add_pd(umpX2v,_mm256_mul_pd(vv,_mm256_load_pd(&rr[l])));
+#endif
+		  }
+		
+		umpX1v = hadd3(umpX1v);
+		umpX2v = hadd3(umpX2v);
+		_mm256_maskstore_pd(&umpX1[80 * i + k], bitmask, umpX1v);
+		_mm256_maskstore_pd(&umpX2[80 * i + k], bitmask, umpX2v);
+	      } 
+	  }
+
+	
+	{	    
+	  uX1 = &umpX1[1760];
+	  uX2 = &umpX2[1760];
+	  
+	  for(j = 0; j < 4; j++) 
+	    {     	
+	      __m256d vv[5];  
+	      
+	      v = &x3_gapColumn[j * 20];
+	      
+	      vv[0] = _mm256_setzero_pd();
+	      vv[1] = _mm256_setzero_pd();
+	      vv[2] = _mm256_setzero_pd();
+	      vv[3] = _mm256_setzero_pd();
+	      vv[4] = _mm256_setzero_pd();
+	      
+	      for(k = 0; k < 20; k++) 
+		{			 
+		  x1px2 = uX1[j * 20 + k] * uX2[j * 20 + k];
+		  
+		  __m256d x1px2v = _mm256_set1_pd(x1px2);		    
+		  
+		  __m256d extEvv = _mm256_load_pd(&extEV[20 * k]);
+#ifdef _FMA
+		  vv[0] = FMAMACC(vv[0],x1px2v,extEvv);
+#else
+		  vv[0] = _mm256_add_pd(vv[0],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+		  _mm256_store_pd(&v[0],vv[0]);
+		  
+		  extEvv = _mm256_load_pd(&extEV[20 * k + 4]);
+#ifdef _FMA
+		  vv[1] = FMAMACC(vv[1],x1px2v,extEvv);
+#else
+		  vv[1] = _mm256_add_pd(vv[1],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+		  _mm256_store_pd(&v[4],vv[1]);
+		  
+		  extEvv = _mm256_load_pd(&extEV[20 * k + 8]);
+#ifdef _FMA
+		  vv[2] = FMAMACC(vv[2],x1px2v,extEvv);
+#else
+		  vv[2] = _mm256_add_pd(vv[2],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+		  _mm256_store_pd(&v[8],vv[2]);
+		  
+		  extEvv = _mm256_load_pd(&extEV[20 * k + 12]);
+#ifdef _FMA
+		  vv[3] = FMAMACC(vv[3],x1px2v,extEvv);
+#else
+		  vv[3] = _mm256_add_pd(vv[3],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+		  _mm256_store_pd(&v[12],vv[3]);
+		  
+		  extEvv = _mm256_load_pd(&extEV[20 * k + 16]);
+#ifdef _FMA
+		  vv[4] = FMAMACC(vv[4],x1px2v,extEvv);
+#else
+		  vv[4] = _mm256_add_pd(vv[4],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+		  _mm256_store_pd(&v[16],vv[4]);
+		} 
+	    } 
+	}
+
+	
+	for(i = 0; i < n; i++) 
+	  {
+	    if(!(x3_gap[i / 32] & mask32[i % 32]))
+	      {	    
+		uX1 = &umpX1[80 * tipX1[i]];
+		uX2 = &umpX2[80 * tipX2[i]];
+	   
+		for(j = 0; j < 4; j++) 
+		  {     	
+		    __m256d vv[5];  
+		    
+		    v = &x3_ptr[j * 20];
+			
+		    vv[0] = _mm256_setzero_pd();
+		    vv[1] = _mm256_setzero_pd();
+		    vv[2] = _mm256_setzero_pd();
+		    vv[3] = _mm256_setzero_pd();
+		    vv[4] = _mm256_setzero_pd();
+
+		    for(k = 0; k < 20; k++) 
+		      {			 
+			x1px2 = uX1[j * 20 + k] * uX2[j * 20 + k];
+			
+			__m256d x1px2v = _mm256_set1_pd(x1px2);		    
+			
+			__m256d extEvv = _mm256_load_pd(&extEV[20 * k]);
+#ifdef _FMA
+			vv[0] = FMAMACC(vv[0],x1px2v,extEvv);
+#else
+			vv[0] = _mm256_add_pd(vv[0],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+			_mm256_store_pd(&v[0],vv[0]);
+			
+			extEvv = _mm256_load_pd(&extEV[20 * k + 4]);
+#ifdef _FMA
+			vv[1] = FMAMACC(vv[1],x1px2v,extEvv);
+#else
+			vv[1] = _mm256_add_pd(vv[1],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+			_mm256_store_pd(&v[4],vv[1]);
+			
+			extEvv = _mm256_load_pd(&extEV[20 * k + 8]);
+#ifdef _FMA
+			vv[2] = FMAMACC(vv[2],x1px2v,extEvv);
+#else
+			vv[2] = _mm256_add_pd(vv[2],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+			_mm256_store_pd(&v[8],vv[2]);
+			
+			extEvv = _mm256_load_pd(&extEV[20 * k + 12]);
+#ifdef _FMA
+			vv[3] = FMAMACC(vv[3],x1px2v,extEvv);
+#else
+			vv[3] = _mm256_add_pd(vv[3],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+			_mm256_store_pd(&v[12],vv[3]);
+			
+			extEvv = _mm256_load_pd(&extEV[20 * k + 16]);
+#ifdef _FMA
+			vv[4] = FMAMACC(vv[4],x1px2v,extEvv);
+#else
+			vv[4] = _mm256_add_pd(vv[4],_mm256_mul_pd(x1px2v,extEvv));
+#endif
+			_mm256_store_pd(&v[16],vv[4]);
+		      } 
+		  }
+		x3_ptr += 80;		  
+	      }
+	  }
+      }
+      break;
+    case PLL_TIP_INNER: 
+      {
+	double 
+	  umpX1[1840] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))),
+	  ump_x2[20] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+
+
+	for(i = 0; i < 23; i++) 
+	  {
+	    v = &(tipVector[20 * i]);
+
+	    for(k = 0; k < 80; k++) 
+	      {
+		__m256d umpX1v = _mm256_setzero_pd();
+		for(l = 0; l < 20; l+=4) 
+		  {
+		    __m256d vv = _mm256_load_pd(&v[l]);
+		    __m256d leftv = _mm256_load_pd(&left[k * 20 + l]);
+#ifdef _FMA
+		   
+		    umpX1v = FMAMACC(umpX1v, vv, leftv);
+#else
+		    umpX1v = _mm256_add_pd(umpX1v, _mm256_mul_pd(vv, leftv));
+#endif
+		  }
+		umpX1v = hadd3(umpX1v);
+		_mm256_maskstore_pd(&umpX1[80 * i + k], bitmask, umpX1v);
+	      } 
+	  }
+
+	{	   
+	  uX1 = &umpX1[1760];
+	   	    
+	  for(k = 0; k < 4; k++) 
+	    {
+	      v = &(x2_gapColumn[k * 20]);
+		
+		for(l = 0; l < 20; l++) 
+		  {
+		    __m256d ump_x2v = _mm256_setzero_pd();
+		    		  
+		    __m256d vv = _mm256_load_pd(&v[0]);
+		    __m256d rightv = _mm256_load_pd(&right[k*400+l*20+0]);
+#ifdef _FMA
+		    ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+		    ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+		    
+		    vv = _mm256_load_pd(&v[4]);
+		    rightv = _mm256_load_pd(&right[k*400+l*20+4]);
+#ifdef _FMA
+		    ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+		    ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+
+		    vv = _mm256_load_pd(&v[8]);
+		    rightv = _mm256_load_pd(&right[k*400+l*20+8]);
+#ifdef _FMA
+		    ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+		    ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+
+		    vv = _mm256_load_pd(&v[12]);
+		    rightv = _mm256_load_pd(&right[k*400+l*20+12]);
+#ifdef _FMA
+		    ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+		    ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+
+		    vv = _mm256_load_pd(&v[16]);
+		    rightv = _mm256_load_pd(&right[k*400+l*20+16]);
+#ifdef _FMA
+		    ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+		    ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+		    
+		    ump_x2v = hadd3(ump_x2v);
+		    _mm256_maskstore_pd(&ump_x2[l], bitmask, ump_x2v);
+		  }
+		
+		v = &x3_gapColumn[20 * k];
+	
+		__m256d vv[5]; 
+
+		vv[0] = _mm256_setzero_pd();
+		vv[1] = _mm256_setzero_pd();
+		vv[2] = _mm256_setzero_pd();
+		vv[3] = _mm256_setzero_pd();
+		vv[4] = _mm256_setzero_pd();
+		
+		for(l = 0; l < 20; l++) 
+		  {
+		    x1px2 = uX1[k * 20 + l]	* ump_x2[l];
+		    __m256d x1px2v = _mm256_set1_pd(x1px2);	
+	    		 
+#ifdef _FMA
+		    __m256d ev = _mm256_load_pd(&extEV[l * 20 + 0]);
+		    vv[0] = FMAMACC(vv[0],x1px2v, ev);
+#else
+		    vv[0] = _mm256_add_pd(vv[0],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[l * 20 + 0])));
+#endif
+		    _mm256_store_pd(&v[0],vv[0]);
+
+#ifdef _FMA
+		    ev = _mm256_load_pd(&extEV[l * 20 + 4]);
+		    vv[1] = FMAMACC(vv[1],x1px2v, ev);
+#else
+		    vv[1] = _mm256_add_pd(vv[1],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[l * 20 + 4])));
+#endif
+		    _mm256_store_pd(&v[4],vv[1]);
+
+#ifdef _FMA
+		    ev = _mm256_load_pd(&extEV[l * 20 + 8]);
+		    vv[2] = FMAMACC(vv[2],x1px2v, ev);
+#else
+		    vv[2] = _mm256_add_pd(vv[2],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[l * 20 + 8])));
+#endif
+		    _mm256_store_pd(&v[8],vv[2]);
+		    
+#ifdef _FMA
+		    ev = _mm256_load_pd(&extEV[l * 20 + 12]);
+		    vv[3] = FMAMACC(vv[3],x1px2v, ev);
+#else
+		    vv[3] = _mm256_add_pd(vv[3],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[l * 20 + 12])));
+#endif
+		    _mm256_store_pd(&v[12],vv[3]);
+
+
+#ifdef _FMA
+		    ev = _mm256_load_pd(&extEV[l * 20 + 16]);
+		    vv[4] = FMAMACC(vv[4],x1px2v, ev);
+#else
+		    vv[4] = _mm256_add_pd(vv[4],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[l * 20 + 16])));
+#endif
+		    _mm256_store_pd(&v[16],vv[4]);
+
+		  } 
+	      }
+	   
+	    v = x3_gapColumn;
+	    __m256d minlikelihood_avx = _mm256_set1_pd(PLL_MINLIKELIHOOD);
+	    scale = 1;
+	    for(l = 0; scale && (l < 80); l += 4) 
+	      {
+		__m256d vv = _mm256_load_pd(&v[l]);
+		__m256d vv_abs = _mm256_and_pd(vv,absMask_AVX.m);
+		vv_abs = _mm256_cmp_pd(vv_abs,minlikelihood_avx,_CMP_LT_OS);
+		if(_mm256_movemask_pd(vv_abs) != 15)
+		  scale = 0;
+	      }
+	    
+	    if(scale) 
+	      {		
+		__m256d PLL_TWOTOTHE256v = _mm256_set_pd(PLL_TWOTOTHE256,PLL_TWOTOTHE256,PLL_TWOTOTHE256,PLL_TWOTOTHE256);
+		gapScaling = 1;
+
+		for(l = 0; l < 80; l += 4) 
+		  {
+		    __m256d vv = _mm256_load_pd(&v[l]);
+		    _mm256_store_pd(&v[l],_mm256_mul_pd(vv,PLL_TWOTOTHE256v));
+		  }	
+	      } 
+	}       
+	
+	for (i = 0; i < n; i++) 
+	  {	   
+	    if((x3_gap[i / 32] & mask32[i % 32]))
+	      {	       
+		if(gapScaling)
+		  {
+		    if(useFastScaling)
+		      addScale += wgt[i];
+		    else
+		      ex3[i]  += 1;
+		  }
+	      }
+	    else
+	      {		
+		uX1 = &umpX1[80 * tipX1[i]];
+		
+		if(x2_gap[i / 32] & mask32[i % 32])
+		  x2 = x2_gapColumn;
+		else
+		  {
+		    x2 = x2_ptr;
+		    x2_ptr += 80;
+		  }	      
+	    
+		for(k = 0; k < 4; k++) 
+		  {
+		    v = &(x2[k * 20]);
+		    
+		    for(l = 0; l < 20; l++) 
+		      {
+			__m256d ump_x2v = _mm256_setzero_pd();
+		    	
+			__m256d vv = _mm256_load_pd(&v[0]);
+			__m256d rightv = _mm256_load_pd(&right[k*400+l*20+0]);
+#ifdef _FMA
+			ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+			ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+			
+			vv = _mm256_load_pd(&v[4]);
+			rightv = _mm256_load_pd(&right[k*400+l*20+4]);
+#ifdef _FMA
+			ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+			ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+			
+			vv = _mm256_load_pd(&v[8]);
+			rightv = _mm256_load_pd(&right[k*400+l*20+8]);
+#ifdef _FMA
+			ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+			ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+			
+			vv = _mm256_load_pd(&v[12]);
+			rightv = _mm256_load_pd(&right[k*400+l*20+12]);
+#ifdef _FMA
+			ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+			ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+			
+			vv = _mm256_load_pd(&v[16]);
+			rightv = _mm256_load_pd(&right[k*400+l*20+16]);
+#ifdef _FMA
+			ump_x2v = FMAMACC(ump_x2v,vv,rightv);
+#else
+			ump_x2v = _mm256_add_pd(ump_x2v, _mm256_mul_pd(vv, rightv));
+#endif
+			
+			ump_x2v = hadd3(ump_x2v);
+			_mm256_maskstore_pd(&ump_x2[l], bitmask, ump_x2v);
+		      }
+		  
+		    
+		    v = &x3_ptr[k * 20];
+		    
+		    __m256d vv[5]; 
+		    
+		    vv[0] = _mm256_setzero_pd();
+		    vv[1] = _mm256_setzero_pd();
+		    vv[2] = _mm256_setzero_pd();
+		    vv[3] = _mm256_setzero_pd();
+		    vv[4] = _mm256_setzero_pd();
+		    
+		    for(l = 0; l < 20; l++) 
+		      {
+			x1px2 = uX1[k * 20 + l]	* ump_x2[l];
+			__m256d x1px2v = _mm256_set1_pd(x1px2);	
+			
+#ifdef _FMA
+			__m256d ev = _mm256_load_pd(&extEV[l * 20 + 0]);
+			vv[0] = FMAMACC(vv[0],x1px2v, ev);
+#else
+			vv[0] = _mm256_add_pd(vv[0],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[l * 20 + 0])));
+#endif
+			_mm256_store_pd(&v[0],vv[0]);
+			
+#ifdef _FMA
+			ev = _mm256_load_pd(&extEV[l * 20 + 4]);
+			vv[1] = FMAMACC(vv[1],x1px2v, ev);
+#else
+			vv[1] = _mm256_add_pd(vv[1],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[l * 20 + 4])));
+#endif
+			_mm256_store_pd(&v[4],vv[1]);
+			
+#ifdef _FMA
+			ev = _mm256_load_pd(&extEV[l * 20 + 8]);
+			vv[2] = FMAMACC(vv[2],x1px2v, ev);
+#else
+			vv[2] = _mm256_add_pd(vv[2],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[l * 20 + 8])));
+#endif
+			_mm256_store_pd(&v[8],vv[2]);
+			
+#ifdef _FMA
+			ev = _mm256_load_pd(&extEV[l * 20 + 12]);
+			vv[3] = FMAMACC(vv[3],x1px2v, ev);
+#else
+			vv[3] = _mm256_add_pd(vv[3],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[l * 20 + 12])));
+#endif
+			_mm256_store_pd(&v[12],vv[3]);
+			
+			
+#ifdef _FMA
+			ev = _mm256_load_pd(&extEV[l * 20 + 16]);
+			vv[4] = FMAMACC(vv[4],x1px2v, ev);
+#else
+			vv[4] = _mm256_add_pd(vv[4],_mm256_mul_pd(x1px2v, _mm256_load_pd(&extEV[l * 20 + 16])));
+#endif
+			_mm256_store_pd(&v[16],vv[4]);
+			
+		      } 
+		  }
+		
+		v = x3_ptr;
+		__m256d minlikelihood_avx = _mm256_set1_pd(PLL_MINLIKELIHOOD);
+		scale = 1;
+		for(l = 0; scale && (l < 80); l += 4) 
+		  {
+		    __m256d vv = _mm256_load_pd(&v[l]);
+		    __m256d vv_abs = _mm256_and_pd(vv,absMask_AVX.m);
+		    vv_abs = _mm256_cmp_pd(vv_abs,minlikelihood_avx,_CMP_LT_OS);
+		    if(_mm256_movemask_pd(vv_abs) != 15)
+		      scale = 0;
+		  }
+	    
+		if(scale) 
+		  {		
+		    __m256d PLL_TWOTOTHE256v = _mm256_set_pd(PLL_TWOTOTHE256,PLL_TWOTOTHE256,PLL_TWOTOTHE256,PLL_TWOTOTHE256);
+		    for(l = 0; l < 80; l += 4) 
+		      {
+			__m256d vv = _mm256_load_pd(&v[l]);
+			_mm256_store_pd(&v[l],_mm256_mul_pd(vv,PLL_TWOTOTHE256v));
+		      }
+		    if(useFastScaling)
+		      addScale += wgt[i];				
+		    else
+		      ex3[i] += 1;
+		  }	      
+		x3_ptr += 80;
+	      }
+	  }
+      }
+      break;
+    case PLL_INNER_INNER:    	  
+      for(k = 0; k < 4; k++) 
+	{
+	  vl = &(x1_gapColumn[20 * k]);
+	  vr = &(x2_gapColumn[20 * k]);
+	  v  = &(x3_gapColumn[20 * k]);	      	   
+
+	  __m256d vv[5]; 
+	  
+	  vv[0] = _mm256_setzero_pd();
+	  vv[1] = _mm256_setzero_pd();
+	  vv[2] = _mm256_setzero_pd();
+	  vv[3] = _mm256_setzero_pd();
+	  vv[4] = _mm256_setzero_pd();
+	  
+	  for(l = 0; l < 20; l++) 
+	    {		  
+	      __m256d al = _mm256_setzero_pd();
+	      __m256d ar = _mm256_setzero_pd();
+	      
+	      __m256d leftv  = _mm256_load_pd(&left[k * 400 + l * 20 + 0]);
+	      __m256d rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 0]);
+	      __m256d vlv = _mm256_load_pd(&vl[0]);
+	      __m256d vrv = _mm256_load_pd(&vr[0]);
+	      
+#ifdef _FMA
+	      
+	      al = FMAMACC(al, vlv, leftv);
+	      ar = FMAMACC(ar, vrv, rightv);
+#else
+	      al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+	      ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));		  
+#endif
+	      
+	      leftv = _mm256_load_pd(&left[k * 400 + l * 20 + 4]);
+	      rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 4]);
+	      vlv = _mm256_load_pd(&vl[4]);
+	      vrv = _mm256_load_pd(&vr[4]);
+#ifdef _FMA
+	      
+	      al = FMAMACC(al, vlv, leftv);
+	      ar = FMAMACC(ar, vrv, rightv);
+#else
+	      al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+	      ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));
+#endif
+	      
+	      leftv = _mm256_load_pd(&left[k * 400 + l * 20 + 8]);
+	      rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 8]);
+	      vlv = _mm256_load_pd(&vl[8]);
+	      vrv = _mm256_load_pd(&vr[8]);
+#ifdef _FMA
+	      
+	      al = FMAMACC(al, vlv, leftv);
+	      ar = FMAMACC(ar, vrv, rightv);
+#else
+	      al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+	      ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));
+#endif
+	      
+	      leftv = _mm256_load_pd(&left[k * 400 + l * 20 + 12]);
+	      rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 12]);
+	      vlv = _mm256_load_pd(&vl[12]);
+	      vrv = _mm256_load_pd(&vr[12]);
+#ifdef _FMA
+	      
+	      al = FMAMACC(al, vlv, leftv);
+	      ar = FMAMACC(ar, vrv, rightv);
+#else
+	      al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+	      ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));
+#endif
+	      
+	      leftv = _mm256_load_pd(&left[k * 400 + l * 20 + 16]);
+	      rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 16]);
+	      vlv = _mm256_load_pd(&vl[16]);
+	      vrv = _mm256_load_pd(&vr[16]);
+	      
+#ifdef _FMA		    
+	      al = FMAMACC(al, vlv, leftv);
+	      ar = FMAMACC(ar, vrv, rightv);
+#else
+	      al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+	      ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));
+#endif
+	      
+	      /**************************************************************************************************************/
+	      
+	      al = hadd3(al);
+	      ar = hadd3(ar);
+	      al = _mm256_mul_pd(ar,al);
+	      
+	      /************************************************************************************************************/
+#ifdef _FMA		    
+	      __m256d ev =  _mm256_load_pd(&extEV[20 * l + 0]);
+	      vv[0] = FMAMACC(vv[0], al, ev);		 
+#else
+	      vv[0] = _mm256_add_pd(vv[0],_mm256_mul_pd(al, _mm256_load_pd(&extEV[20 * l + 0])));			  		 		  
+#endif
+	      _mm256_store_pd(&v[0],vv[0]);
+	      
+#ifdef _FMA		    
+	      ev =  _mm256_load_pd(&extEV[20 * l + 4]);
+	      vv[1] = FMAMACC(vv[1], al, ev);		 
+#else
+	      vv[1] = _mm256_add_pd(vv[1],_mm256_mul_pd(al, _mm256_load_pd(&extEV[20 * l + 4])));		  		 
+#endif
+	      _mm256_store_pd(&v[4],vv[1]);
+	      
+#ifdef _FMA		    
+	      ev =  _mm256_load_pd(&extEV[20 * l + 8]);
+	      vv[2] = FMAMACC(vv[2], al, ev);		 
+#else
+	      vv[2] = _mm256_add_pd(vv[2],_mm256_mul_pd(al, _mm256_load_pd(&extEV[20 * l + 8])));		  		 
+#endif
+	      _mm256_store_pd(&v[8],vv[2]);
+	      
+#ifdef _FMA		    
+	      ev =  _mm256_load_pd(&extEV[20 * l + 12]);
+	      vv[3] = FMAMACC(vv[3], al, ev);		 
+#else
+	      vv[3] = _mm256_add_pd(vv[3],_mm256_mul_pd(al, _mm256_load_pd(&extEV[20 * l + 12])));		  		 
+#endif
+	      _mm256_store_pd(&v[12],vv[3]);
+	      
+#ifdef _FMA		    
+	      ev =  _mm256_load_pd(&extEV[20 * l + 16]);
+	      vv[4] = FMAMACC(vv[4], al, ev);		 
+#else
+	      vv[4] = _mm256_add_pd(vv[4],_mm256_mul_pd(al, _mm256_load_pd(&extEV[20 * l + 16])));			 	  
+#endif
+	      _mm256_store_pd(&v[16],vv[4]);		 
+	    } 
+	}
+	
+      v = x3_gapColumn;
+      scale = 1;
+      __m256d minlikelihood_avx = _mm256_set1_pd(PLL_MINLIKELIHOOD);	 
+      
+      for(l = 0; scale && (l < 80); l += 4) 
+	{
+	  __m256d vv = _mm256_load_pd(&v[l]);
+	  __m256d vv_abs = _mm256_and_pd(vv,absMask_AVX.m);
+	  vv_abs = _mm256_cmp_pd(vv_abs,minlikelihood_avx,_CMP_LT_OS);
+	  if(_mm256_movemask_pd(vv_abs) != 15)
+	    scale = 0;	     
+	}
+
+      if(scale) 
+	{		     	      
+	  __m256d PLL_TWOTOTHE256v = _mm256_set_pd(PLL_TWOTOTHE256,PLL_TWOTOTHE256,PLL_TWOTOTHE256,PLL_TWOTOTHE256);
+	  gapScaling = 1;
+
+	  for(l = 0; l < 80; l += 4) 
+	    {
+	      __m256d vv = _mm256_load_pd(&v[l]);
+	      _mm256_store_pd(&v[l],_mm256_mul_pd(vv,PLL_TWOTOTHE256v));
+	    }
+	  
+	} 
+   
+     
+
+      for(i = 0; i < n; i++) 
+	{   
+	  
+	  if(x3_gap[i / 32] & mask32[i % 32])
+	    {	     
+	      if(gapScaling)
+		{
+		  if(useFastScaling)
+		    addScale += wgt[i];
+		  else
+		    ex3[i]  += 1; 	       
+		}
+	    }
+	  else
+	    {
+	      if(x1_gap[i / 32] & mask32[i % 32])
+		x1 = x1_gapColumn;
+	      else
+		{
+		  x1 = x1_ptr;
+		  x1_ptr += 80;
+		}
+
+	      if(x2_gap[i / 32] & mask32[i % 32])
+		x2 = x2_gapColumn;
+	      else
+		{
+		  x2 = x2_ptr;
+		  x2_ptr += 80;
+		}	   
+	  
+	      for(k = 0; k < 4; k++) 
+		{
+		  vl = &(x1[20 * k]);
+		  vr = &(x2[20 * k]);
+		  v  = &(x3_ptr[20 * k]);	      	   
+		  
+		  __m256d vv[5]; 
+		  
+		  vv[0] = _mm256_setzero_pd();
+		  vv[1] = _mm256_setzero_pd();
+		  vv[2] = _mm256_setzero_pd();
+		  vv[3] = _mm256_setzero_pd();
+		  vv[4] = _mm256_setzero_pd();
+		  
+		  for(l = 0; l < 20; l++) 
+		    {		  
+		      __m256d al = _mm256_setzero_pd();
+		      __m256d ar = _mm256_setzero_pd();
+		      
+		      __m256d leftv  = _mm256_load_pd(&left[k * 400 + l * 20 + 0]);
+		      __m256d rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 0]);
+		      __m256d vlv = _mm256_load_pd(&vl[0]);
+		      __m256d vrv = _mm256_load_pd(&vr[0]);
+		      
+#ifdef _FMA
+		      
+		      al = FMAMACC(al, vlv, leftv);
+		      ar = FMAMACC(ar, vrv, rightv);
+#else
+		      al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+		      ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));		  
+#endif
+		      
+		      leftv = _mm256_load_pd(&left[k * 400 + l * 20 + 4]);
+		      rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 4]);
+		      vlv = _mm256_load_pd(&vl[4]);
+		      vrv = _mm256_load_pd(&vr[4]);
+#ifdef _FMA
+		      
+		      al = FMAMACC(al, vlv, leftv);
+		      ar = FMAMACC(ar, vrv, rightv);
+#else
+		      al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+		      ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));
+#endif
+		      
+		      leftv = _mm256_load_pd(&left[k * 400 + l * 20 + 8]);
+		      rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 8]);
+		      vlv = _mm256_load_pd(&vl[8]);
+		      vrv = _mm256_load_pd(&vr[8]);
+#ifdef _FMA
+		      
+		      al = FMAMACC(al, vlv, leftv);
+		      ar = FMAMACC(ar, vrv, rightv);
+#else
+		      al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+		      ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));
+#endif
+		      
+		      leftv = _mm256_load_pd(&left[k * 400 + l * 20 + 12]);
+		      rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 12]);
+		      vlv = _mm256_load_pd(&vl[12]);
+		      vrv = _mm256_load_pd(&vr[12]);
+#ifdef _FMA
+		      
+		      al = FMAMACC(al, vlv, leftv);
+		      ar = FMAMACC(ar, vrv, rightv);
+#else
+		      al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+		      ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));
+#endif
+		      
+		      leftv = _mm256_load_pd(&left[k * 400 + l * 20 + 16]);
+		      rightv = _mm256_load_pd(&right[k * 400 + l * 20 + 16]);
+		      vlv = _mm256_load_pd(&vl[16]);
+		      vrv = _mm256_load_pd(&vr[16]);
+		      
+#ifdef _FMA		    
+		      al = FMAMACC(al, vlv, leftv);
+		      ar = FMAMACC(ar, vrv, rightv);
+#else
+		      al = _mm256_add_pd(al,_mm256_mul_pd(vlv,leftv));
+		      ar = _mm256_add_pd(ar,_mm256_mul_pd(vrv,rightv));
+#endif
+		      
+		      /**************************************************************************************************************/
+		      
+		      al = hadd3(al);
+		      ar = hadd3(ar);
+		      al = _mm256_mul_pd(ar,al);
+		      
+		      /************************************************************************************************************/
+#ifdef _FMA		    
+		      __m256d ev =  _mm256_load_pd(&extEV[20 * l + 0]);
+		      vv[0] = FMAMACC(vv[0], al, ev);		 
+#else
+		      vv[0] = _mm256_add_pd(vv[0],_mm256_mul_pd(al, _mm256_load_pd(&extEV[20 * l + 0])));			  		 		  
+#endif
+		      _mm256_store_pd(&v[0],vv[0]);
+		      
+#ifdef _FMA		    
+		      ev =  _mm256_load_pd(&extEV[20 * l + 4]);
+		      vv[1] = FMAMACC(vv[1], al, ev);		 
+#else
+		      vv[1] = _mm256_add_pd(vv[1],_mm256_mul_pd(al, _mm256_load_pd(&extEV[20 * l + 4])));		  		 
+#endif
+		      _mm256_store_pd(&v[4],vv[1]);
+		      
+#ifdef _FMA		    
+		      ev =  _mm256_load_pd(&extEV[20 * l + 8]);
+		      vv[2] = FMAMACC(vv[2], al, ev);		 
+#else
+		      vv[2] = _mm256_add_pd(vv[2],_mm256_mul_pd(al, _mm256_load_pd(&extEV[20 * l + 8])));		  		 
+#endif
+		      _mm256_store_pd(&v[8],vv[2]);
+		      
+#ifdef _FMA		    
+		      ev =  _mm256_load_pd(&extEV[20 * l + 12]);
+		      vv[3] = FMAMACC(vv[3], al, ev);		 
+#else
+		      vv[3] = _mm256_add_pd(vv[3],_mm256_mul_pd(al, _mm256_load_pd(&extEV[20 * l + 12])));		  		 
+#endif
+		      _mm256_store_pd(&v[12],vv[3]);
+		      
+#ifdef _FMA		    
+		      ev =  _mm256_load_pd(&extEV[20 * l + 16]);
+		      vv[4] = FMAMACC(vv[4], al, ev);		 
+#else
+		      vv[4] = _mm256_add_pd(vv[4],_mm256_mul_pd(al, _mm256_load_pd(&extEV[20 * l + 16])));			 	  
+#endif
+		      _mm256_store_pd(&v[16],vv[4]);		 
+		    }
+		}
+	      
+	      v = x3_ptr;
+	      scale = 1;
+	      
+	      __m256d minlikelihood_avx = _mm256_set1_pd(PLL_MINLIKELIHOOD);	 
+	      
+	      for(l = 0; scale && (l < 80); l += 4) 
+		{
+		  __m256d vv = _mm256_load_pd(&v[l]);
+		  __m256d vv_abs = _mm256_and_pd(vv,absMask_AVX.m);
+		  vv_abs = _mm256_cmp_pd(vv_abs,minlikelihood_avx,_CMP_LT_OS);
+		  if(_mm256_movemask_pd(vv_abs) != 15)
+		    scale = 0;	     
+		}
+	      
+	      if(scale) 
+		{		     	      
+		  __m256d PLL_TWOTOTHE256v = _mm256_set_pd(PLL_TWOTOTHE256,PLL_TWOTOTHE256,PLL_TWOTOTHE256,PLL_TWOTOTHE256);
+		  for(l = 0; l < 80; l += 4) 
+		    {
+		      __m256d vv = _mm256_load_pd(&v[l]);
+		      _mm256_store_pd(&v[l],_mm256_mul_pd(vv,PLL_TWOTOTHE256v));
+		    }
+		  if(useFastScaling)
+		    addScale += wgt[i];					
+		  else
+		    ex3[i] += 1;
+		}  
+	      x3_ptr += 80;
+	    }
+	}
+      break;
+    default:
+      assert(0);
+    }
+ 
+  if(useFastScaling)
+    *scalerIncrement = addScale;
+}
diff --git a/lib/pll/bipartitionList.c b/lib/pll/bipartitionList.c
new file mode 100644
index 0000000..c1791da
--- /dev/null
+++ b/lib/pll/bipartitionList.c
@@ -0,0 +1,434 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file bipartitionList.c
+ */
+#include "mem_alloc.h"
+
+#ifndef WIN32  
+#include <sys/times.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <unistd.h>  
+#endif
+
+#include <limits.h>
+#include <math.h>
+#include <time.h> 
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdint.h>
+#include <assert.h>
+
+#include "pll.h"
+#include "pllInternal.h"
+
+
+static pllBipartitionEntry *initEntry(void);
+static void getxnodeBips (nodeptr p);
+static void newviewBipartitions(unsigned int **bitVectors, 
+                                nodeptr p, 
+                                int numsp, 
+                                unsigned int vectorLength, 
+                                int processID);
+
+static void insertHashRF(unsigned int *bitVector, 
+                         pllHashTable *h, 
+                         unsigned int vectorLength, 
+                         int treeNumber, 
+                         int treeVectorLength, 
+                         hashNumberType position, 
+                         int support, 
+                         boolean computeWRF);
+
+extern const unsigned int mask32[32];
+
+
+static void getxnodeBips (nodeptr p)
+{
+  nodeptr  s;
+
+  if ((s = p->next)->xBips || (s = s->next)->xBips)
+    {
+      p->xBips = s->xBips;
+      s->xBips = 0;
+    }
+
+  assert(p->xBips);
+}
+
+
+static pllBipartitionEntry *initEntry(void)
+{
+  pllBipartitionEntry * e = (pllBipartitionEntry *)rax_malloc(sizeof(pllBipartitionEntry));
+
+  e->bitVector     = (unsigned int*)NULL;
+  e->treeVector    = (unsigned int*)NULL;
+  e->supportVector = (int*)NULL;
+  e->bipNumber  = 0;
+  e->bipNumber2 = 0;
+  e->supportFromTreeset[0] = 0;
+  e->supportFromTreeset[1] = 0;
+  e->next       = (pllBipartitionEntry *)NULL;
+
+  return e;
+} 
+
+void cleanupHashTable(pllHashTable *h, int state)
+{
+  unsigned int
+    k,
+    entryCount = 0,
+    removeCount = 0;
+ 
+  assert(state == 1 || state == 0);
+
+  for(k = 0, entryCount = 0; k < h->size; k++)       
+    { 
+      pllHashItem * start     = NULL;
+      pllHashItem * lastValid = NULL;
+      
+      pllHashItem * hitem = h->Items[k];
+      while (hitem)
+       {                           
+         pllBipartitionEntry *e = (pllBipartitionEntry *)(hitem->data);
+         if(state == 0)
+           {
+             e->treeVector[0] = e->treeVector[0] & 2;      
+             assert(!(e->treeVector[0] & 1));
+           }
+         else
+           {
+             e->treeVector[0] = e->treeVector[0] & 1;
+             assert(!(e->treeVector[0] & 2));
+           }
+         
+         if(e->treeVector[0] != 0)
+           {
+             if(!start)
+               start = hitem;
+             lastValid = hitem;
+             hitem = hitem->next;
+           }         
+         else
+           {
+             pllHashItem *tmp = hitem;
+             pllBipartitionEntry *remove = e;
+             hitem = hitem->next;
+             
+             removeCount++;
+
+             if(lastValid) lastValid->next = hitem;
+
+             if(remove->bitVector)     rax_free(remove->bitVector);
+             if(remove->treeVector)    rax_free(remove->treeVector);
+             if(remove->supportVector) rax_free(remove->supportVector);
+             rax_free(remove);              
+             rax_free(tmp);
+           }
+         entryCount++;
+       }
+
+      if(!start)
+        {
+          assert(!lastValid);
+          h->Items[k] = NULL;
+        }
+      else
+        {
+          h->Items[k] = start;
+        }            
+    }
+
+  assert(entryCount ==  h->entries);
+  h->entries-= removeCount;
+}
+
+
+
+
+
+
+
+
+
+
+
+unsigned int **initBitVector(int mxtips, unsigned int *vectorLength)
+{
+  unsigned int 
+    **bitVectors = (unsigned int **)rax_malloc(sizeof(unsigned int*) * 2 * (size_t)mxtips);
+  
+  int 
+    i;
+
+  if(mxtips % PLL_MASK_LENGTH == 0)
+    *vectorLength = mxtips / PLL_MASK_LENGTH;
+  else
+    *vectorLength = 1 + (mxtips / PLL_MASK_LENGTH); 
+  
+  for(i = 1; i <= mxtips; i++)
+    {
+      bitVectors[i] = (unsigned int *)rax_calloc((size_t)(*vectorLength), sizeof(unsigned int));
+      assert(bitVectors[i]);
+      bitVectors[i][(i - 1) / PLL_MASK_LENGTH] |= mask32[(i - 1) % PLL_MASK_LENGTH];
+    }
+  
+  for(i = mxtips + 1; i < 2 * mxtips; i++) 
+    {
+      bitVectors[i] = (unsigned int *)rax_malloc(sizeof(unsigned int) * (size_t)(*vectorLength));
+      assert(bitVectors[i]);
+    }
+
+  return bitVectors;
+}
+
+void freeBitVectors(unsigned int **v, int n)
+{
+  int i;
+
+  for(i = 1; i < n; i++)
+    rax_free(v[i]);
+}
+
+
+static void newviewBipartitions(unsigned int **bitVectors, 
+                                nodeptr p, 
+                                int numsp, 
+                                unsigned int vectorLength, 
+                                int processID)
+{
+  
+  if(isTip(p->number, numsp))
+    return;
+  {
+    nodeptr 
+      q = p->next->back, 
+      r = p->next->next->back;
+    
+    
+    
+    unsigned int       
+      *vector = bitVectors[p->number],
+      *left  = bitVectors[q->number],
+      *right = bitVectors[r->number];
+    unsigned 
+      int i;      
+    
+    assert(processID == 0);
+    
+
+    while(!p->xBips)
+      { 
+        if(!p->xBips)
+          getxnodeBips(p);
+      }
+
+    p->hash = q->hash ^ r->hash;
+
+    if(isTip(q->number, numsp) && isTip(r->number, numsp))
+      {         
+        for(i = 0; i < vectorLength; i++)
+          vector[i] = left[i] | right[i];               
+      }
+    else
+      { 
+        if(isTip(q->number, numsp) || isTip(r->number, numsp))
+          {
+            if(isTip(r->number, numsp))
+              { 
+                nodeptr tmp = r;
+                r = q;
+                q = tmp;
+              }    
+                    
+            while(!r->xBips)
+              {
+                if(!r->xBips)
+                  newviewBipartitions(bitVectors, r, numsp, vectorLength, processID);
+              }    
+
+            for(i = 0; i < vectorLength; i++)
+              vector[i] = left[i] | right[i];            
+          }
+        else
+          {         
+            while((!r->xBips) || (!q->xBips))
+              {
+                if(!q->xBips)
+                  newviewBipartitions(bitVectors, q, numsp, vectorLength, processID);
+                if(!r->xBips)
+                  newviewBipartitions(bitVectors, r, numsp, vectorLength, processID);
+              }                                    
+
+            for(i = 0; i < vectorLength; i++)
+              vector[i] = left[i] | right[i];    
+          }
+
+      }     
+  }     
+}
+
+
+
+
+static void insertHashRF(unsigned int *bitVector, 
+                         pllHashTable *h, 
+                         unsigned int vectorLength, 
+                         int treeNumber, 
+                         int treeVectorLength, 
+                         hashNumberType position, 
+                         int support, 
+                         boolean computeWRF)
+{
+  pllBipartitionEntry * e;
+  pllHashItem * hitem;
+
+  if(h->Items[position] != NULL)
+    {
+      for (hitem = h->Items[position]; hitem; hitem = hitem->next)
+        { 
+          e = (pllBipartitionEntry *)(hitem->data);
+          
+          if (!memcmp(bitVector, e->bitVector, vectorLength * sizeof(unsigned int)))
+            {
+              e->treeVector[treeNumber / PLL_MASK_LENGTH] |= mask32[treeNumber % PLL_MASK_LENGTH];
+              if(computeWRF)
+                {
+                  e->supportVector[treeNumber] = support;
+                  assert(0 <= treeNumber && treeNumber < treeVectorLength * PLL_MASK_LENGTH);
+                }
+              return;
+            }
+        }
+    }
+  e = initEntry(); 
+       
+  rax_posix_memalign ((void **)&(e->bitVector), PLL_BYTE_ALIGNMENT, (size_t)vectorLength * sizeof(unsigned int));
+  memset(e->bitVector, 0, vectorLength * sizeof(unsigned int));
+
+  e->treeVector = (unsigned int*)rax_calloc((size_t)treeVectorLength, sizeof(unsigned int));
+  if(computeWRF)
+    e->supportVector = (int*)rax_calloc((size_t)treeVectorLength * PLL_MASK_LENGTH, sizeof(int));
+
+  e->treeVector[treeNumber / PLL_MASK_LENGTH] |= mask32[treeNumber % PLL_MASK_LENGTH];
+  if(computeWRF)
+    {
+      e->supportVector[treeNumber] = support;
+     
+      assert(0 <= treeNumber && treeNumber < treeVectorLength * PLL_MASK_LENGTH);
+    }
+
+  memcpy(e->bitVector, bitVector, sizeof(unsigned int) * vectorLength);
+  
+  pllHashAdd (h, position, NULL, (void *)e);
+}
+
+
+
+void bitVectorInitravSpecial(unsigned int **bitVectors, nodeptr p, int numsp, unsigned int vectorLength, pllHashTable *h, int treeNumber, int function, branchInfo *bInf, 
+                             int *countBranches, int treeVectorLength, boolean traverseOnly, boolean computeWRF, int processID)
+{
+  if(isTip(p->number, numsp))
+    return;
+  else
+    {
+      nodeptr 
+        q = p->next;          
+
+      do 
+        {
+          bitVectorInitravSpecial(bitVectors, q->back, numsp, vectorLength, h, treeNumber, function, bInf, countBranches, treeVectorLength, traverseOnly, computeWRF, processID);
+          q = q->next;
+        }
+      while(q != p);
+           
+      newviewBipartitions(bitVectors, p, numsp, vectorLength, processID);
+      
+      assert(p->xBips);
+
+      assert(!traverseOnly);     
+
+      if(!(isTip(p->back->number, numsp)))
+        {
+          unsigned int 
+            *toInsert  = bitVectors[p->number];
+          
+          hashNumberType 
+            position = p->hash % h->size;
+         
+          assert(!(toInsert[0] & 1));
+          assert(!computeWRF);
+          
+          switch(function)
+            {        
+            case PLL_BIPARTITIONS_RF:        
+              insertHashRF(toInsert, h, vectorLength, treeNumber, treeVectorLength, position, 0, computeWRF);
+              *countBranches =  *countBranches + 1;
+              break;
+            default:
+              assert(0);
+            }             
+        }
+      
+    }
+}
+
+double convergenceCriterion(pllHashTable *h, int mxtips)
+{
+  int      
+    rf = 0; 
+
+  unsigned int 
+    k = 0, 
+    entryCount = 0;
+  
+  double    
+    rrf;  
+
+  pllHashItem * hitem;
+
+  for(k = 0, entryCount = 0; k < h->size; k++)          
+    {      
+      for (hitem = h->Items[k]; hitem; hitem = hitem->next)
+       {
+         pllBipartitionEntry *e = hitem->data;
+         unsigned int *vector = e->treeVector;          
+
+         if(((vector[0] & 1) > 0) + ((vector[0] & 2) > 0) == 1)
+           rf++;        
+          
+         entryCount++;
+         e = e->next;
+       }
+    }
+
+  assert(entryCount == h->entries);  
+  rrf = (double)rf/((double)(2 * (mxtips - 3)));  
+  return rrf;
+}
diff --git a/lib/pll/cycle.h b/lib/pll/cycle.h
new file mode 100644
index 0000000..6b86140
--- /dev/null
+++ b/lib/pll/cycle.h
@@ -0,0 +1,516 @@
+/*
+ * Copyright (c) 2003, 2007-8 Matteo Frigo
+ * Copyright (c) 2003, 2007-8 Massachusetts Institute of Technology
+ *
+ * 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.
+ *
+ */
+
+
+/* machine-dependent cycle counters code. Needs to be inlined. */
+
+/***************************************************************************/
+/* To use the cycle counters in your code, simply #include "cycle.h" (this
+   file), and then use the functions/macros:
+
+                 ticks getticks(void);
+
+   ticks is an opaque typedef defined below, representing the current time.
+   You extract the elapsed time between two calls to gettick() via:
+
+                 double elapsed(ticks t1, ticks t0);
+
+   which returns a double-precision variable in arbitrary units.  You
+   are not expected to convert this into human units like seconds; it
+   is intended only for *comparisons* of time intervals.
+
+   (In order to use some of the OS-dependent timer routines like
+   Solaris' gethrtime, you need to paste the autoconf snippet below
+   into your configure.ac file and #include "config.h" before cycle.h,
+   or define the relevant macros manually if you are not using autoconf.)
+*/
+
+/***************************************************************************/
+/* This file uses macros like HAVE_GETHRTIME that are assumed to be
+   defined according to whether the corresponding function/type/header
+   is available on your system.  The necessary macros are most
+   conveniently defined if you are using GNU autoconf, via the tests:
+   
+   dnl ---------------------------------------------------------------------
+
+   AC_C_INLINE
+   AC_HEADER_TIME
+   AC_CHECK_HEADERS([sys/time.h c_asm.h intrinsics.h mach/mach_time.h])
+
+   AC_CHECK_TYPE([hrtime_t],[AC_DEFINE(HAVE_HRTIME_T, 1, [Define to 1 if hrtime_t is defined in <sys/time.h>])],,[#if HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif])
+
+   AC_CHECK_FUNCS([gethrtime read_real_time time_base_to_time clock_gettime mach_absolute_time])
+
+   dnl Cray UNICOS _rtc() (real-time clock) intrinsic
+   AC_MSG_CHECKING([for _rtc intrinsic])
+   rtc_ok=yes
+   AC_TRY_LINK([#ifdef HAVE_INTRINSICS_H
+#include <intrinsics.h>
+#endif], [_rtc()], [AC_DEFINE(HAVE__RTC,1,[Define if you have the UNICOS _rtc() intrinsic.])], [rtc_ok=no])
+   AC_MSG_RESULT($rtc_ok)
+
+   dnl ---------------------------------------------------------------------
+*/
+
+/***************************************************************************/
+
+#ifdef TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# ifdef HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+
+
+
+#define INLINE_ELAPSED(INL) static INL double elapsed(ticks t1, ticks t0) \
+{									  \
+     return (double)t1 - (double)t0;					  \
+}
+
+/*----------------------------------------------------------------*/
+/* Solaris */
+#if defined(HAVE_GETHRTIME) && defined(HAVE_HRTIME_T) && !defined(HAVE_TICK_COUNTER)
+typedef hrtime_t ticks;
+
+#define getticks gethrtime
+
+INLINE_ELAPSED(inline)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+/* AIX v. 4+ routines to read the real-time clock or time-base register */
+#if defined(HAVE_READ_REAL_TIME) && defined(HAVE_TIME_BASE_TO_TIME) && !defined(HAVE_TICK_COUNTER)
+typedef timebasestruct_t ticks;
+
+static __inline ticks getticks(void)
+{
+     ticks t;
+     read_real_time(&t, TIMEBASE_SZ);
+     return t;
+}
+
+static __inline double elapsed(ticks t1, ticks t0) /* time in nanoseconds */
+{
+     time_base_to_time(&t1, TIMEBASE_SZ);
+     time_base_to_time(&t0, TIMEBASE_SZ);
+     return (((double)t1.tb_high - (double)t0.tb_high) * 1.0e9 + 
+	     ((double)t1.tb_low - (double)t0.tb_low));
+}
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+/*
+ * PowerPC ``cycle'' counter using the time base register.
+ */
+#if ((((defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))) || (defined(__MWERKS__) && defined(macintosh)))) || (defined(__IBM_GCC_ASM) && (defined(__powerpc__) || defined(__ppc__))))  && !defined(HAVE_TICK_COUNTER)
+typedef unsigned long long ticks;
+
+static __inline__ ticks getticks(void)
+{
+     unsigned int tbl, tbu0, tbu1;
+
+     do {
+	  __asm__ __volatile__ ("mftbu %0" : "=r"(tbu0));
+	  __asm__ __volatile__ ("mftb %0" : "=r"(tbl));
+	  __asm__ __volatile__ ("mftbu %0" : "=r"(tbu1));
+     } while (tbu0 != tbu1);
+
+     return (((unsigned long long)tbu0) << 32) | tbl;
+}
+
+INLINE_ELAPSED(__inline__)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/* MacOS/Mach (Darwin) time-base register interface (unlike UpTime,
+   from Carbon, requires no additional libraries to be linked). */
+#if defined(HAVE_MACH_ABSOLUTE_TIME) && defined(HAVE_MACH_MACH_TIME_H) && !defined(HAVE_TICK_COUNTER)
+#include <mach/mach_time.h>
+typedef uint64_t ticks;
+#define getticks mach_absolute_time
+INLINE_ELAPSED(__inline__)
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+/*
+ * Pentium cycle counter 
+ */
+#if (defined(__GNUC__) || defined(__ICC)) && defined(__i386__)  && !defined(HAVE_TICK_COUNTER)
+typedef unsigned long long ticks;
+
+static __inline__ ticks getticks(void)
+{
+     ticks ret;
+
+     __asm__ __volatile__("rdtsc": "=A" (ret));
+     /* no input, nothing else clobbered */
+     return ret;
+}
+
+INLINE_ELAPSED(__inline__)
+
+#define HAVE_TICK_COUNTER
+#define TIME_MIN 5000.0   /* unreliable pentium IV cycle counter */
+#endif
+
+/* Visual C++ -- thanks to Morten Nissov for his help with this */
+#if defined(_MSC_VER) && _MSC_VER >= 1200 && _M_IX86 >= 500 && !defined(HAVE_TICK_COUNTER)
+#include <windows.h>
+typedef LARGE_INTEGER ticks;
+#define RDTSC __asm __emit 0fh __asm __emit 031h /* hack for VC++ 5.0 */
+
+static __inline ticks getticks(void)
+{
+     ticks retval;
+
+     __asm {
+	  RDTSC
+	  mov retval.HighPart, edx
+	  mov retval.LowPart, eax
+     }
+     return retval;
+}
+
+static __inline double elapsed(ticks t1, ticks t0)
+{  
+     return (double)t1.QuadPart - (double)t0.QuadPart;
+}  
+
+#define HAVE_TICK_COUNTER
+#define TIME_MIN 5000.0   /* unreliable pentium IV cycle counter */
+#endif
+
+/*----------------------------------------------------------------*/
+/*
+ * X86-64 cycle counter
+ */
+#if (defined(__GNUC__) || defined(__ICC) || defined(__SUNPRO_C)) && defined(__x86_64__)  && !defined(HAVE_TICK_COUNTER)
+typedef unsigned long long ticks;
+
+static __inline__ ticks getticks(void)
+{
+     unsigned a, d; 
+     __asm volatile("rdtsc" : "=a" (a), "=d" (d)); 
+     return ((ticks)a) | (((ticks)d) << 32); 
+}
+
+INLINE_ELAPSED(__inline__)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/* PGI compiler, courtesy Cristiano Calonaci, Andrea Tarsi, & Roberto Gori.
+   NOTE: this code will fail to link unless you use the -Masmkeyword compiler
+   option (grrr). */
+#if defined(__PGI) && defined(__x86_64__) && !defined(HAVE_TICK_COUNTER) 
+typedef unsigned long long ticks;
+static ticks getticks(void)
+{
+    asm(" rdtsc; shl    $0x20,%rdx; mov    %eax,%eax; or     %rdx,%rax;    ");
+}
+INLINE_ELAPSED(__inline__)
+#define HAVE_TICK_COUNTER
+#endif
+
+/* Visual C++, courtesy of Dirk Michaelis */
+#if defined(_MSC_VER) && _MSC_VER >= 1400 && (defined(_M_AMD64) || defined(_M_X64)) && !defined(HAVE_TICK_COUNTER)
+
+#include <intrin.h>
+#pragma intrinsic(__rdtsc)
+typedef unsigned __int64 ticks;
+#define getticks __rdtsc
+INLINE_ELAPSED(__inline)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+/*
+ * IA64 cycle counter
+ */
+
+/* intel's icc/ecc compiler */
+#if (defined(__EDG_VERSION) || defined(__ECC)) && defined(__ia64__) && !defined(HAVE_TICK_COUNTER)
+typedef unsigned long ticks;
+#include <ia64intrin.h>
+
+static __inline__ ticks getticks(void)
+{
+     return __getReg(_IA64_REG_AR_ITC);
+}
+ 
+INLINE_ELAPSED(__inline__)
+ 
+#define HAVE_TICK_COUNTER
+#endif
+
+/* gcc */
+#if defined(__GNUC__) && defined(__ia64__) && !defined(HAVE_TICK_COUNTER)
+typedef unsigned long ticks;
+
+static __inline__ ticks getticks(void)
+{
+     ticks ret;
+
+     __asm__ __volatile__ ("mov %0=ar.itc" : "=r"(ret));
+     return ret;
+}
+
+INLINE_ELAPSED(__inline__)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/* HP/UX IA64 compiler, courtesy Teresa L. Johnson: */
+#if defined(__hpux) && defined(__ia64) && !defined(HAVE_TICK_COUNTER)
+#include <machine/sys/inline.h>
+typedef unsigned long ticks;
+
+static inline ticks getticks(void)
+{
+     ticks ret;
+
+     ret = _Asm_mov_from_ar (_AREG_ITC);
+     return ret;
+}
+
+INLINE_ELAPSED(inline)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/* Microsoft Visual C++ */
+#if defined(_MSC_VER) && defined(_M_IA64) && !defined(HAVE_TICK_COUNTER)
+typedef unsigned __int64 ticks;
+
+#  ifdef __cplusplus
+extern "C"
+#  endif
+ticks __getReg(int whichReg);
+#pragma intrinsic(__getReg)
+
+static __inline ticks getticks(void)
+{
+     volatile ticks temp;
+     temp = __getReg(3116);
+     return temp;
+}
+
+INLINE_ELAPSED(inline)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+/*
+ * PA-RISC cycle counter 
+ */
+#if defined(__hppa__) || defined(__hppa) && !defined(HAVE_TICK_COUNTER)
+typedef unsigned long ticks;
+
+#  ifdef __GNUC__
+static __inline__ ticks getticks(void)
+{
+     ticks ret;
+
+     __asm__ __volatile__("mfctl 16, %0": "=r" (ret));
+     /* no input, nothing else clobbered */
+     return ret;
+}
+#  else
+#  include <machine/inline.h>
+static inline unsigned long getticks(void)
+{
+     register ticks ret;
+     _MFCTL(16, ret);
+     return ret;
+}
+#  endif
+
+INLINE_ELAPSED(inline)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+/* S390, courtesy of James Treacy */
+#if defined(__GNUC__) && defined(__s390__) && !defined(HAVE_TICK_COUNTER)
+typedef unsigned long long ticks;
+
+static __inline__ ticks getticks(void)
+{
+     ticks cycles;
+     __asm__("stck 0(%0)" : : "a" (&(cycles)) : "memory", "cc");
+     return cycles;
+}
+
+INLINE_ELAPSED(__inline__)
+
+#define HAVE_TICK_COUNTER
+#endif
+/*----------------------------------------------------------------*/
+#if defined(__GNUC__) && defined(__alpha__) && !defined(HAVE_TICK_COUNTER)
+/*
+ * The 32-bit cycle counter on alpha overflows pretty quickly, 
+ * unfortunately.  A 1GHz machine overflows in 4 seconds.
+ */
+typedef unsigned int ticks;
+
+static __inline__ ticks getticks(void)
+{
+     unsigned long cc;
+     __asm__ __volatile__ ("rpcc %0" : "=r"(cc));
+     return (cc & 0xFFFFFFFF);
+}
+
+INLINE_ELAPSED(__inline__)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+#if defined(__GNUC__) && defined(__sparc_v9__) && !defined(HAVE_TICK_COUNTER)
+typedef unsigned long ticks;
+
+static __inline__ ticks getticks(void)
+{
+     ticks ret;
+     __asm__ __volatile__("rd %%tick, %0" : "=r" (ret));
+     return ret;
+}
+
+INLINE_ELAPSED(__inline__)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+#if (defined(__DECC) || defined(__DECCXX)) && defined(__alpha) && defined(HAVE_C_ASM_H) && !defined(HAVE_TICK_COUNTER)
+#  include <c_asm.h>
+typedef unsigned int ticks;
+
+static __inline ticks getticks(void)
+{
+     unsigned long cc;
+     cc = asm("rpcc %v0");
+     return (cc & 0xFFFFFFFF);
+}
+
+INLINE_ELAPSED(__inline)
+
+#define HAVE_TICK_COUNTER
+#endif
+/*----------------------------------------------------------------*/
+/* SGI/Irix */
+#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_SGI_CYCLE) && !defined(HAVE_TICK_COUNTER)
+typedef struct timespec ticks;
+
+static inline ticks getticks(void)
+{
+     struct timespec t;
+     clock_gettime(CLOCK_SGI_CYCLE, &t);
+     return t;
+}
+
+static inline double elapsed(ticks t1, ticks t0)
+{
+     return ((double)t1.tv_sec - (double)t0.tv_sec) * 1.0E9 +
+	  ((double)t1.tv_nsec - (double)t0.tv_nsec);
+}
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+/* Cray UNICOS _rtc() intrinsic function */
+#if defined(HAVE__RTC) && !defined(HAVE_TICK_COUNTER)
+#ifdef HAVE_INTRINSICS_H
+#  include <intrinsics.h>
+#endif
+
+typedef long long ticks;
+
+#define getticks _rtc
+
+INLINE_ELAPSED(inline)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+/* MIPS ZBus */
+#ifdef HAVE_MIPS_ZBUS_TIMER
+#if defined(__mips__) && !defined(HAVE_TICK_COUNTER)
+#include <sys/mman.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+typedef uint64_t ticks;
+
+static inline ticks getticks(void)
+{
+  static uint64_t* addr = 0;
+
+  if (addr == 0)
+  {
+    uint32_t rq_addr = 0x10030000;
+    int fd;
+    int pgsize;
+
+    pgsize = getpagesize();
+    fd = open ("/dev/mem", O_RDONLY | O_SYNC, 0);
+    if (fd < 0) {
+      perror("open");
+      return NULL;
+    }
+    addr = mmap(0, pgsize, PROT_READ, MAP_SHARED, fd, rq_addr);
+    close(fd);
+    if (addr == (uint64_t *)-1) {
+      perror("mmap");
+      return NULL;
+    }
+  }
+
+  return *addr;
+}
+
+INLINE_ELAPSED(inline)
+
+#define HAVE_TICK_COUNTER
+#endif
+#endif /* HAVE_MIPS_ZBUS_TIMER */
diff --git a/lib/pll/errcodes.h b/lib/pll/errcodes.h
new file mode 100644
index 0000000..ce81e68
--- /dev/null
+++ b/lib/pll/errcodes.h
@@ -0,0 +1,69 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file errcodes.h
+ */
+#ifndef ERRCODES_H
+#define ERRCODES_H
+
+#define PLL_ERROR_FILE_OPEN             1               /**< Error while opening file */
+#define PLL_ERROR_INVALID_FILETYPE      2               /**< Invalid fileType given at pllParseAlignmeFile */
+
+#define  PLL_NNI_P_TIP                  1 << 0          /**< Node p is a tip */
+#define  PLL_NNI_Q_TIP                  1 << 1          /**< Node p->back is a tip */
+
+#define  PLL_PARTITION_OUT_OF_BOUNDS    1 << 0      /**< Trying to access a partition index that is out of bounds */
+#define  PLL_BASE_FREQUENCIES_DO_NOT_SUM_TO_1 1 << 1      /**< base frequencies don't sum to 1.0 */
+
+#define PLL_LINKAGE_LIST_OUT_OF_BOUNDS 1 << 0      /**< trying to link a partition index that is out of bounds */
+
+#define PLL_SUBSTITUTION_RATE_OUT_OF_BOUNDS 1 << 0 /**< trying  to set a substitution rate to a value that is out of bounds */
+#define PLL_INVALID_Q_MATRIX_SYMMETRY       1 << 1 /**< specifyng an invalid parameter symmetry in the Q matrix */
+#define PLL_Q_MATRIX_SYMMETRY_OUT_OF_BOUNDS 1 << 2 /**<specifying a Q matrix symmetry that is out of bounds */
+
+#define PLL_UNKNOWN_MOLECULAR_DATA_TYPE 1 << 0 /**<PLL is trying to do something for an unknown data type */
+
+#define PLL_INCONSISTENT_SUBST_RATE_OPTIMIZATION_SETTING 1 << 0 /**<PLL detected an inconsistent setting for the Q matrix rate optimization */
+#define PLL_INCONSISTENT_Q_MATRIX_SYMMETRIES_ACROSS_LINKED_PARTITIONS 1 << 1 /**<Q matrix symmetry vector is not identical for linked partitions */
+#define PLL_INCONSISTENT_Q_MATRIX_ENTRIES_ACROSS_LINKED_PARTITIONS 1 << 2 /**<Q matrix entries are not identical for linked partitions */
+#define PLL_INCONSISTENT_ALPHA_STATES_ACROSS_LINKED_PARTITIONS 1 << 3 /**<alpha states are not identical across linked partitions */
+#define PLL_INCONSISTENT_ALPHA_VALUES_ACROSS_LINKED_PARTITIONS 1 << 4 /**<alpha values are not identical across linked partitions */
+#define PLL_INCONSISTENT_FREQUENCY_STATES_ACROSS_LINKED_PARTITIONS 1 << 5 /**<frequency states are not identical across linked partitions */
+#define PLL_INCONSISTENT_FREQUENCY_VALUES_ACROSS_LINKED_PARTITIONS 1 << 6 /**<frequency values are not identical across linked partitions */
+
+#define PLL_NEWICK_ROOTED_TREE          1 << 0          /**< @brief Binary root detected */
+#define PLL_NEWICK_BAD_STRUCTURE        1 << 1          /**< @brief Errornous tree detected */
+
+
+
+#define PLL_ERROR_PHYLIP_HEADER_SYNTAX         5
+#define PLL_ERROR_PHYLIP_BODY_SYNTAX           6
+#define PLL_ERROR_FASTA_SYNTAX                 7
+
+
+
+
+#endif
diff --git a/lib/pll/evaluateGenericSpecial.c b/lib/pll/evaluateGenericSpecial.c
new file mode 100644
index 0000000..37028a3
--- /dev/null
+++ b/lib/pll/evaluateGenericSpecial.c
@@ -0,0 +1,3284 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file evaluateGenericSpecial.c
+ *   
+ * @brief Functions for computing the log likelihood at a given branch of the tree (i.e. a virtual root that is placed at this branch)
+ */
+#include "mem_alloc.h"
+
+#ifndef WIN32 
+#include <unistd.h>
+#endif
+
+#include <math.h>
+#include <time.h> 
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+
+#include "pll.h"
+#include "pllInternal.h"
+
+#ifdef __MIC_NATIVE
+#include "mic_native.h"
+#endif
+
+/* the set of functions in here computes the log likelihood at a given branch (the virtual root of a tree) */
+
+/* includes for using SSE3 intrinsics */
+
+#ifdef __SSE3
+#include <xmmintrin.h>
+#include <pmmintrin.h>
+/*#include <tmmintrin.h>*/
+#endif
+
+
+/** @defgroup evaluateLikelihoodGroup Likelihood evaluation
+    
+    This set of functions deals with the evaluation of likelihood for the current topology
+*/
+
+
+
+
+
+
+
+/* below are the function headers for unreadeble highly optimized versions of the above functions 
+   for DNA and protein data that also use SSE3 intrinsics and implement some memory saving tricks.
+   The actual functions can be found at the end of this source file. 
+   All other likelihood function implementation files:
+
+   newviewGenericSpacial.c
+   makenewzSpecial.c
+   evaluatePartialGenericSpecial.c
+
+   are also structured like this 
+
+   To decide which set of function implementations to use you will have to undefine or define _OPTIMIZED_FUNCTIONS 
+   in the Makefile 
+   */
+#if (defined(__SSE3) || defined(__AVX))
+
+static double evaluateGTRGAMMAPROT_LG4(int *ex1, int *ex2, int *wptr,
+                                       double *x1, double *x2,  
+                                       double *tipVector[4], 
+                                       unsigned char *tipX1, int n, double *diagptable, const boolean fastScaling);
+
+/* GAMMA for proteins with memory saving */
+
+static double evaluateGTRGAMMAPROT_GAPPED_SAVE (const boolean fastScaling, int *ex1, int *ex2, int *wptr,
+                                                double *x1, double *x2,  
+                                                double *tipVector, 
+                                                unsigned char *tipX1, int n, double *diagptable, 
+                                                double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap);
+
+
+/* GAMMA for proteins */
+
+static double evaluateGTRGAMMAPROT (const boolean fastScaling, int *ex1, int *ex2, int *wptr,
+                                    double *x1, double *x2,  
+                                    double *tipVector, 
+                                    unsigned char *tipX1, int n, double *diagptable);
+
+/* CAT for proteins */
+
+static double evaluateGTRCATPROT (const boolean fastScaling, int *ex1, int *ex2, int *cptr, int *wptr,
+                                  double *x1, double *x2, double *tipVector,
+                                  unsigned char *tipX1, int n, double *diagptable_start);
+
+
+/* CAT for proteins with memory saving */
+
+static double evaluateGTRCATPROT_SAVE (const boolean fastScaling, int *ex1, int *ex2, int *cptr, int *wptr,
+                                       double *x1, double *x2, double *tipVector,
+                                       unsigned char *tipX1, int n, double *diagptable_start, 
+                                       double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap);
+
+/* analogous DNA fuctions */
+
+static double evaluateGTRCAT_SAVE (const boolean fastScaling, int *ex1, int *ex2, int *cptr, int *wptr,
+                                   double *x1_start, double *x2_start, double *tipVector,                     
+                                   unsigned char *tipX1, int n, double *diagptable_start,
+                                   double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap);
+
+static double evaluateGTRGAMMA_GAPPED_SAVE(const boolean fastScaling, int *ex1, int *ex2, int *wptr,
+                                           double *x1_start, double *x2_start, 
+                                           double *tipVector, 
+                                           unsigned char *tipX1, const int n, double *diagptable,
+                                           double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap);
+
+static double evaluateGTRGAMMA(const boolean fastScaling, int *ex1, int *ex2, int *wptr,
+                               double *x1_start, double *x2_start, 
+                               double *tipVector, 
+                               unsigned char *tipX1, const int n, double *diagptable);
+
+
+static double evaluateGTRCAT (const boolean fastScaling, int *ex1, int *ex2, int *cptr, int *wptr,
+                              double *x1_start, double *x2_start, double *tipVector,                  
+                              unsigned char *tipX1, int n, double *diagptable_start);
+
+
+#endif
+
+#if (defined(__AVX) || defined(__SSE3))
+static double evaluateGTRGAMMA_BINARY(int *ex1, int *ex2, int *wptr,
+                                      double *x1_start, double *x2_start, 
+                                      double *tipVector, 
+                                      unsigned char *tipX1, const int n, double *diagptable, const boolean fastScaling);
+
+static double evaluateGTRCAT_BINARY (int *ex1, int *ex2, int *cptr, int *wptr,
+                                     double *x1_start, double *x2_start, double *tipVector,                   
+                                     unsigned char *tipX1, int n, double *diagptable_start, const boolean fastScaling);
+#endif
+
+
+/* 
+   global variables of pthreads version, reductionBuffer is the global array 
+   that is used for implementing deterministic reduction operations, that is,
+   the total log likelihood over the partial log lieklihoods for the sites that each thread has computed 
+
+   NumberOfThreads is just the number of threads.
+
+   Note the volatile modifier here, that guarantees that the compiler will not do weird optimizations 
+   rearraengements of the code accessing those variables, because it does not know that several concurrent threads 
+   will access those variables simulatenously 
+
+   UPDATE: reductionBuffer is now merged with globalResult
+   */
+
+
+/* a pre-computed 32-bit integer mask */
+
+extern const unsigned int mask32[32];
+
+/* the function below computes the P matrix from the decomposition of the Q matrix and the respective rate categories for a single partition */
+
+/** @brief Compute the diagonal of P matrix for a specific edge
+
+    This function computes the diagonal of P matrix for a branch of length \a z
+    from the decomposition of the Q matrix specified in \a EIGN and the respective
+    rate categories \a rptr for a single partition. The diagonal is then stored in
+    \a diagptable. 
+
+    @param z                  Length of edge
+    @param states             Number of states
+    @param numberOfCategories Number of categories in the rate heterogeneity rate arrays
+    @param rptr               Rate heterogeneity rate arrays
+    @param EIGN               Eigenvalues
+    @param diagptable         Where to store the resulting P matrix
+*/
+static void calcDiagptable(const double z, const int states, const int numberOfCategories, const double *rptr, const double *EIGN, double *diagptable)
+{
+  int 
+    i, 
+    l;
+
+  double 
+    lz,
+    *lza = (double *)rax_malloc(sizeof(double) * states);
+
+  /* transform the root branch length to the log and check if it is not too small */
+
+  if (z < PLL_ZMIN) 
+    lz = log(PLL_ZMIN);
+  else
+    lz = log(z);
+
+  /* do some pre-computations to avoid redundant computations further below */
+
+  for(i = 1; i < states; i++)      
+    lza[i] = EIGN[i] * lz; 
+
+  /* loop over the number of per-site or discrete gamma rate categories */
+
+  for(i = 0; i < numberOfCategories; i++)
+  {                    
+    /* 
+       diagptable is a pre-allocated array of doubles that stores the P-Matrix 
+       the first entry is always 1.0 
+       */
+    diagptable[i * states] = 1.0;
+
+    /* compute the P matrix for all remaining states of the model */
+
+    for(l = 1; l < states; l++)
+      diagptable[i * states + l] = exp(rptr[i] * lza[l]);
+  }
+
+  rax_free(lza);
+}
+
+/** @brief Compute the diagonal of P matrix for a specific edge for the LG4 model
+
+    This function computes the diagonal of P matrix for a branch of length \a z
+    from the decomposition of the 4 LG4 Q matrices specified in \a EIGN and the respective
+    rate categories \a rptr for a single partition. The diagonal is then stored in
+    \a diagptable. 
+
+    @param z
+      Length of edge
+
+    @param states
+      Number of states
+
+    @param numberOfCategories
+      Number of categories in the rate heterogeneity rate arrays
+
+    @param rptr
+      Rate heterogeneity rate arrays
+
+    @param EIGN
+      Eigenvalues of the 4 Q matrices
+
+    @param diagptable
+      Where to store the resulting P matrix
+
+    @param numStates
+      Number of states
+*/
+static void calcDiagptableFlex_LG4(double z, int numberOfCategories, double *rptr, double *EIGN[4], double *diagptable, const int numStates)
+{
+  int 
+    i, 
+    l;
+  
+  double 
+    lz;
+  
+  assert(numStates <= 64);
+  
+  if (z < PLL_ZMIN) 
+    lz = log(PLL_ZMIN);
+  else
+    lz = log(z);
+
+  for(i = 0; i <  numberOfCategories; i++)
+    {                  
+      diagptable[i * numStates + 0] = 1.0;
+
+      for(l = 1; l < numStates; l++)
+        diagptable[i * numStates + l] = exp(rptr[i] * EIGN[i][l] * lz);                   
+    }        
+}
+
+static void ascertainmentBiasSequence(unsigned char tip[32], int numStates)
+{ 
+  assert(numStates <= 32 && numStates > 1);
+
+  switch(numStates)
+    {
+    case 2:     
+      tip[0] = 1;
+      tip[1] = 2;
+      break;
+    case 4:
+      tip[0] = 1;
+      tip[1] = 2;
+      tip[2] = 4;
+      tip[3] = 8;
+      break;
+    default:
+      {
+	int 
+	  i;
+	for(i = 0; i < numStates; i++)
+	  {
+	    tip[i] = i;
+	    //printf("%c ", inverseMeaningPROT[i]);
+	  }
+	//printf("\n");
+      }
+      break;
+    }
+}
+
+static double evaluateCatAsc(int *ex1, int *ex2,
+			     double *x1, double *x2,  
+			     double *tipVector, 
+			     unsigned char *tipX1, int n, double *diagptable, const int numStates)
+{
+  double
+    exponent,
+    logMin = log(PLL_TWOTOTHE256),
+    sum = 0.0, 
+    unobserved,
+    term,
+    *left, 
+    *right;
+  
+  int     
+    i,    
+    l;   
+         
+  unsigned char 
+    tip[32];
+
+  ascertainmentBiasSequence(tip, numStates);
+   
+  if(tipX1)
+    {               
+      for (i = 0; i < n; i++) 
+	{
+	  left = &(tipVector[numStates * tip[i]]);	  	  
+	  right = &(x2[i * numStates]);
+
+	  term = 0.0;
+	         	      
+	  for(l = 0; l < numStates; l++)
+	    term += left[l] * right[l] * diagptable[l];	      	 	 	  	 
+
+	  exponent = ((double)ex2[i] * logMin);	  
+
+	  assert(exponent < 700.0);
+
+	  unobserved = fabs(term) * exp(exponent);	    
+	  
+#ifdef _DEBUG_ASC
+	  if(ex2[i] > 0)
+	    {
+	      printf("s %d\n", ex2[i]);
+	      assert(0);
+	    }
+#endif	  
+	    
+	  sum += unobserved;
+	}              
+    }              
+  else
+    {           
+      for (i = 0; i < n; i++) 
+	{	  	 
+	  term = 0.0;
+	  	 
+	  left  = &(x1[i * numStates]);
+	  right = &(x2[i * numStates]);	    
+	      
+	  for(l = 0; l < numStates; l++)
+	    term += left[l] * right[l] * diagptable[l];		  
+	  
+	  //because of the way we scale for sites that only consist of a single character
+	  //ex1 and ex2 will mostly be zero, so there is no re-scaling that needs to be done
+
+	  exponent = ((double)(ex1[i] + ex2[i]) * logMin);
+	  
+#ifdef _DEBUG_ASC
+	  if(ex2[i] > 0 || ex1[i] > 0)
+	    {
+	      printf("s %d %d\n", ex1[i], ex2[i]);
+	      assert(0);
+	    }
+#endif
+
+	  assert(exponent < 700.0);
+	  
+	  unobserved = fabs(term) * exp(exponent);	  	  
+  
+	  sum += unobserved;
+	}             
+    }        
+
+  return  sum;
+}
+
+
+static double evaluateGammaAsc(int *ex1, int *ex2,
+				double *x1, double *x2,  
+				double *tipVector, 
+				unsigned char *tipX1, int n, double *diagptable, const int numStates)
+{
+  double
+    exponent,
+    logMin = log(PLL_TWOTOTHE256),
+    sum = 0.0, 
+    unobserved,
+    term,
+    *left, 
+    *right;
+  
+  int     
+    i, 
+    j, 
+    l;   
+  
+  const int 
+    gammaStates = numStates * 4;
+         
+  unsigned char 
+    tip[32];
+
+  ascertainmentBiasSequence(tip, numStates);
+   
+  if(tipX1)
+    {               
+      for (i = 0; i < n; i++) 
+	{
+	  left = &(tipVector[numStates * tip[i]]);	  	  
+	  
+	  for(j = 0, term = 0.0; j < 4; j++)
+	    {
+	      right = &(x2[gammaStates * i + numStates * j]);
+	      
+	      for(l = 0; l < numStates; l++)
+		term += left[l] * right[l] * diagptable[j * numStates + l];	      
+	    }	 	  	 
+
+	  exponent = ((double)ex2[i] * logMin);	  
+
+	  assert(exponent < 700.0);
+
+	  unobserved = 0.25 * fabs(term) * exp(exponent);	    
+	  
+#ifdef _DEBUG_ASC
+	  if(ex2[i] > 0)
+	    {
+	      printf("s %d\n", ex2[i]);
+	      assert(0);
+	    }
+#endif	  
+	    
+	  sum += unobserved;
+	}              
+    }              
+  else
+    {           
+      for (i = 0; i < n; i++) 
+	{	  	 	             
+	  
+	  for(j = 0, term = 0.0; j < 4; j++)
+	    {
+	      left  = &(x1[gammaStates * i + numStates * j]);
+	      right = &(x2[gammaStates * i + numStates * j]);	    
+	      
+	      for(l = 0; l < numStates; l++)
+		term += left[l] * right[l] * diagptable[j * numStates + l];	
+	    }
+	  
+	  //because of the way we scale for sites that only consist of a single character
+	  //ex1 and ex2 will mostly be zero, so there is no re-scaling that needs to be done
+
+	  exponent = ((double)(ex1[i] + ex2[i]) * logMin);
+	  
+#ifdef _DEBUG_ASC
+	  if(ex2[i] > 0 || ex1[i] > 0)
+	    {
+	      printf("s %d %d\n", ex1[i], ex2[i]);
+	      assert(0);
+	    }
+#endif
+
+	  assert(exponent < 700.0);
+	  
+	  unobserved = 0.25 * fabs(term) * exp(exponent);	  	  
+  
+	  sum += unobserved;
+	}             
+    }        
+
+  return  sum;
+}
+
+
+/** @ingroup evaluateLikelihoodGroup
+    @brief A generic (and slow) implementation of log likelihood evaluation of a tree using the GAMMA model of rate heterogeneity
+    
+    Computes the log likelihood of the topology for a specific partition, assuming
+    that the GAMMA model of rate heterogeneity is used. The likelihood is computed at
+    a virtual root placed at an edge whose two end-points (nodes) have the conditional
+    likelihood vectors \a x1 and \a x2. 
+    Furthermore, if \a getPerSiteLikelihoods is set to \b PLL_TRUE, then the log
+    likelihood for each site is also computed and stored at the corresponding position
+    in the array \a perSiteLikelihoods.
+
+    @param fastScaling
+      If set to \b PLL_FALSE, then the likelihood of each site is also multiplied by \a log(PLL_MINLIKELIHOOD) times the number
+      of times it has been scaled down
+
+    @param ex1
+      An array that holds how many times a site has been scaled and points at the entries for node \a p. This
+      parameter is used if \a fastScaling is set to \b PLL_FALSE.
+
+    @param ex2
+      An array that holds how many times a site has been scaled and points at the entries for node \a q. This
+      parameter is used if \a fastScaling is set to \b PLL_TRUE.
+
+    @param wptr
+      Array holding the weight for each site in the compressed partition alignment
+
+    @param x1_start
+      Conditional likelihood vectors for one of the two end-points of the specific edge for which we are evaluating the likelihood
+
+    @param x2_start
+      Conditional likelihood vectors for the other end-point of the specific edge for which we are evaluating the likelihood
+
+    @param tipVector
+      Precomputed table where the number of rows is equal to the number of possible basepair characters for the current data 
+      type, i.e.16 for DNA and 23 for AA, and each rows contains \a states elements each of which contains transition
+      probabilities computed from the eigenvectors of the decomposed Q matrix.
+
+    @param tipX1
+      If one of the two end-points (nodes) of the specific edge (for which we are evaluating the likelihood) is a tip, then
+      this holds a pointer to the sequence data (basepairs) already converted in the internal integer representation, and \a x2
+      holds the conditional likelihood vectors for the internal node.
+
+    @param n
+      Number of sites for which we are doing the evaluation. For the single-thread version this is the 
+      number of sites in the current partition, for multi-threads this is the number of sites assigned
+      to the running thread from the current partition.
+
+    @param diagptable
+      Start of the array that contains the P-Matrix diagonal of the specific edge for which we are
+      evaluating the likehood, and for each category of the GAMMA model
+
+    @param states
+      Number of states (4 for DNA, 20 for AA)
+
+    @param perSiteLikelihoods
+      Array to store per-site log likelihoods if \a getPerSiteLikelihoods is set to \b PLL_TRUE
+
+    @param getPerSiteLikelihoods
+      If set to \b PLL_TRUE then per-site log likelihoods are also computed and stored in \a perSiteLikelihoods
+
+    @return
+      The evaluated log likelihood of the tree topology
+*/
+static double evaluateGAMMA_FLEX(const boolean fastScaling, int *ex1, int *ex2, int *wptr,
+                                 double *x1_start, double *x2_start, 
+                                 double *tipVector, 
+                                 unsigned char *tipX1, const int n, double *diagptable, const int states, double *perSiteLikelihoods, boolean getPerSiteLikelihoods)
+{
+  double   
+    sum = 0.0, 
+    term,
+    *x1,
+    *x2;
+
+  int     
+    i, 
+    j,
+    k;
+
+  /* span is the offset within the likelihood array at an inner node that gets us from the values 
+     of site i to the values of site i + 1 */
+
+  const int 
+    span = states * 4;
+
+
+  /* we distingusih between two cases here: one node of the two nodes defining the branch at which we put the virtual root is 
+     a tip. Both nodes can not be tips because we do not allow for two-taxon trees ;-) 
+     Nota that, if a node is a tip, this will always be tipX1. This is done for code simplicity and the flipping of the nodes
+     is done before when we compute the traversal descriptor.     
+     */
+
+  /* the left node is a tip */
+  if(tipX1)
+  {             
+    /* loop over the sites of this partition */
+    for (i = 0; i < n; i++)
+    {
+      /* access pre-computed tip vector values via a lookup table */
+      x1 = &(tipVector[states * tipX1[i]]);      
+      /* access the other(inner) node at the other end of the branch */
+      x2 = &(x2_start[span * i]);        
+
+      /* loop over GAMMA rate categories, hard-coded as 4 in RAxML */
+      for(j = 0, term = 0.0; j < 4; j++)
+        /* loop over states and multiply them with the P matrix */
+        for(k = 0; k < states; k++)
+          term += x1[k] * x2[j * states + k] * diagptable[j * states + k];                                                        
+
+      /* take the log of the likelihood and multiply the per-gamma rate likelihood by 1/4.
+         Under the GAMMA model the 4 discrete GAMMA rates all have the same probability 
+         of 0.25 */
+
+      if(!fastScaling)
+        term = log(0.25 * fabs(term)) + (ex2[i] * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(0.25 * fabs(term));
+
+      /* if required get the per-site log likelihoods.
+         note that these are the plain per site log-likes, not 
+         multiplied with the pattern weight value */
+      
+      if(getPerSiteLikelihoods)
+        perSiteLikelihoods[i] = term;
+
+      sum += wptr[i] * term;
+    }     
+  }
+  else
+  {        
+    for (i = 0; i < n; i++) 
+    {
+      /* same as before, only that now we access two inner likelihood vectors x1 and x2 */
+
+      x1 = &(x1_start[span * i]);
+      x2 = &(x2_start[span * i]);                 
+
+      for(j = 0, term = 0.0; j < 4; j++)
+        for(k = 0; k < states; k++)
+          term += x1[j * states + k] * x2[j * states + k] * diagptable[j * states + k];
+
+      if(!fastScaling)
+        term = log(0.25 * fabs(term)) + ((ex1[i] + ex2[i])*log(PLL_MINLIKELIHOOD));
+      else
+        term = log(0.25 * fabs(term));
+      
+      if(getPerSiteLikelihoods)
+        perSiteLikelihoods[i] = term;
+
+      sum += wptr[i] * term;
+    }                           
+  }
+
+  return sum;
+} 
+
+#if (defined(__SSE3) || defined(__AVX))
+/** @ingroup evaluateLikelihoodGroup
+    @brief Memory saving version of the generic (and slow) implementation of log likelihood evaluation of a tree using the GAMMA model of rate heterogeneity
+
+    Computes the log likelihood of the topology for a specific partition, assuming
+    that the GAMMA model of rate heterogeneity is used and memory saving technique
+    is enabled. The likelihood is computed at a virtual root placed at an edge whose
+    two end-points (nodes) have the conditional likelihood vectors \a x1 and \a x2. 
+    Furthermore, if \a getPerSiteLikelihoods is set to \b PLL_TRUE, then the log
+    likelihood for each site is also computed and stored at the corresponding position
+    in the array \a perSiteLikelihoods.
+
+    @param fastScaling
+      If set to \b PLL_FALSE, then the likelihood of each site is also multiplied by \a log(PLL_MINLIKELIHOOD) times the number
+      of times it has been scaled down
+
+    @param ex1
+      An array that holds how many times a site has been scaled and points at the entries for node \a p. This
+      parameter is used if \a fastScaling is set to \b PLL_FALSE.
+
+    @param ex2
+      An array that holds how many times a site has been scaled and points at the entries for node \a q. This
+      parameter is used if \a fastScaling is set to \b PLL_TRUE.
+
+    @param wptr
+      Array holding the weight for each site in the compressed partition alignment
+
+    @param x1_start
+      Conditional likelihood vectors for one of the two end-points of the specific edge for which we are evaluating the likelihood
+
+    @param x2_start
+      Conditional likelihood vectors for the other end-point of the specific edge for which we are evaluating the likelihood
+
+    @param tipVector
+      Precomputed table where the number of rows is equal to the number of possible basepair characters for the current data 
+      type, i.e.16 for DNA and 23 for AA, and each rows contains \a states elements each of which contains transition
+      probabilities computed from the eigenvectors of the decomposed Q matrix.
+
+    @param tipX1
+      If one of the two end-points (nodes) of the specific edge (for which we are evaluating the likelihood) is a tip, then
+      this holds a pointer to the sequence data (basepairs) already converted in the internal integer representation, and \a x2
+      holds the conditional likelihood vectors for the internal node.
+
+    @param n
+      Number of sites for which we are doing the evaluation. For the single-thread version this is the 
+      number of sites in the current partition, for multi-threads this is the number of sites assigned
+      to the running thread from the current partition.
+
+    @param diagptable
+      Start of the array that contains the P-Matrix diagonal of the specific edge for which we are
+      evaluating the likehood, and for each category of the GAMMA model
+
+    @param states
+      Number of states (4 for DNA, 20 for AA)
+
+    @param perSiteLikelihoods
+      Array to store per-site log likelihoods if \a getPerSiteLikelihoods is set to \b PLL_TRUE
+
+    @param getPerSiteLikelihoods
+      If set to \b PLL_TRUE then per-site log likelihoods are also computed and stored in \a perSiteLikelihoods
+
+    @param x1_gapColumn
+
+    @param x2_gapColumn
+
+    @param x1_gap
+      Gap bitvector for the left child node
+
+    @param x2_gap
+      Gap bitvector for the right child node
+
+    @return
+      The evaluated log likelihood of the tree topology
+
+    @todo
+      Document x1_gapColumn, x2_gapColumn, x1_gap, x2_gap and add a brief description of how this technique works
+*/
+static double evaluateGAMMA_FLEX_SAVE(const boolean fastScaling, int *ex1, int *ex2, int *wptr,
+                                      double *x1_start, double *x2_start, 
+                                      double *tipVector, 
+                                      unsigned char *tipX1, const int n, double *diagptable, const int states, double *perSiteLikelihoods, boolean getPerSiteLikelihoods,
+                                      double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap)
+{
+  double   
+    sum = 0.0, 
+    term,
+    *x1,
+    *x2,
+    *x1_ptr = x1_start,
+    *x2_ptr = x2_start;
+    
+  int     
+    i, 
+    j,
+    k;
+
+  /* span is the offset within the likelihood array at an inner node that gets us from the values 
+     of site i to the values of site i + 1 */
+
+  const int 
+    span = states * 4;
+
+
+  /* we distingusih between two cases here: one node of the two nodes defining the branch at which we put the virtual root is 
+     a tip. Both nodes can not be tips because we do not allow for two-taxon trees ;-) 
+     Nota that, if a node is a tip, this will always be tipX1. This is done for code simplicity and the flipping of the nodes
+     is done before when we compute the traversal descriptor.     
+     */
+
+  /* the left node is a tip */
+  if(tipX1)
+  {             
+    /* loop over the sites of this partition */
+    for (i = 0; i < n; i++)
+    {
+      /* access pre-computed tip vector values via a lookup table */
+      x1 = &(tipVector[states * tipX1[i]]);      
+      /* access the other(inner) node at the other end of the branch */
+
+      if(x2_gap[i / 32] & mask32[i % 32])
+        x2 = x2_gapColumn;
+      else
+        {
+          x2 = x2_ptr;
+          x2_ptr += span;
+        }
+
+      /* loop over GAMMA rate categories, hard-coded as 4 in RAxML */
+      for(j = 0, term = 0.0; j < 4; j++)
+        /* loop over states and multiply them with the P matrix */
+        for(k = 0; k < states; k++)
+          term += x1[k] * x2[j * states + k] * diagptable[j * states + k];                                                        
+
+      /* take the log of the likelihood and multiply the per-gamma rate likelihood by 1/4.
+         Under the GAMMA model the 4 discrete GAMMA rates all have the same probability 
+         of 0.25 */
+
+      if(!fastScaling)
+        term = log(0.25 * fabs(term)) + (ex2[i] * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(0.25 * fabs(term));
+
+      /* if required get the per-site log likelihoods.
+         note that these are the plain per site log-likes, not 
+         multiplied with the pattern weight value */
+      
+      if(getPerSiteLikelihoods)
+        perSiteLikelihoods[i] = term;
+
+      sum += wptr[i] * term;
+    }     
+  }
+  else
+  {        
+    for (i = 0; i < n; i++) 
+    {
+      /* same as before, only that now we access two inner likelihood vectors x1 and x2 */
+      
+      if(x1_gap[i / 32] & mask32[i % 32])
+        x1 = x1_gapColumn;
+      else
+        {
+          x1 = x1_ptr;
+          x1_ptr += span;
+        }    
+
+      if(x2_gap[i / 32] & mask32[i % 32])
+        x2 = x2_gapColumn;
+      else
+        {
+          x2 = x2_ptr;
+          x2_ptr += span;
+        }                 
+
+      for(j = 0, term = 0.0; j < 4; j++)
+        for(k = 0; k < states; k++)
+          term += x1[j * states + k] * x2[j * states + k] * diagptable[j * states + k];
+
+      if(!fastScaling)
+        term = log(0.25 * fabs(term)) + ((ex1[i] + ex2[i])*log(PLL_MINLIKELIHOOD));
+      else
+        term = log(0.25 * fabs(term));
+      
+      if(getPerSiteLikelihoods)
+        perSiteLikelihoods[i] = term;
+
+      sum += wptr[i] * term;
+    }                           
+  }
+
+  return sum;
+} 
+#endif
+
+/** @ingroup evaluateLikelihoodGroup
+    @brief A generic (and slow) implementation of log likelihood evaluation of a tree using the CAT model of rate heterogeneity
+    
+    Computes the log likelihood of the topology for a specific partition, assuming
+    that the CAT model of rate heterogeneity is used. The likelihood is computed at
+    a virtual root placed at an edge whose two end-points (nodes) have the conditional
+    likelihood vectors \a x1 and \a x2. 
+    Furthermore, if \a getPerSiteLikelihoods is set to \b PLL_TRUE, then the log
+    likelihood for each site is also computed and stored at the corresponding position
+    in the array \a perSiteLikelihoods.
+
+    @param fastScaling
+      If set to \b PLL_FALSE, then the likelihood of each site is also multiplied by \a log(PLL_MINLIKELIHOOD) times the number
+      of times it has been scaled down
+
+    @param ex1
+      An array that holds how many times a site has been scaled and points at the entries for node \a p. This
+      parameter is used if \a fastScaling is set to \b PLL_FALSE.
+
+    @param ex2
+      An array that holds how many times a site has been scaled and points at the entries for node \a q. This
+      parameter is used if \a fastScaling is set to \b PLL_TRUE.
+
+    @param cptr
+      Array holding the rate for each site in the compressed partition alignment
+
+    @param wptr
+      Array holding the weight for each site in the compressed partition alignment
+
+    @param x1
+      Conditional likelihood vectors for one of the two end-points of the specific edge for which we are evaluating the likelihood
+
+    @param x2
+      Conditional likelihood vectors for the other end-point of the specific edge for which we are evaluating the likelihood
+
+    @param tipVector
+      Precomputed table where the number of rows is equal to the number of possible basepair characters for the current data type, 
+      i.e.16 for DNA and 23 for AA, and each rows contains \a states elements each of which contains transition probabilities 
+      computed from the eigenvectors of the decomposed Q matrix.
+
+    @param tipX1
+      If one of the two end-points (nodes) of the specific edge (for which we are evaluating the likelihood) is a tip, then
+      this holds a pointer to the sequence data (basepairs) already converted in the internal integer representation, and \a x2
+      holds the conditional likelihood vectors for the internal node.
+
+    @param n
+      Number of sites for which we are doing the evaluation. For the single-thread version this is the number of sites in the
+      current partition, for multi-threads this is the number of sites assigned to the running thread from the current partition.
+
+    @param diagptable_start
+      Start of the array that contains the P-Matrix diagonal of the specific edge for which we are evaluating the likehood,
+      and for each category of the CAT model
+
+    @param states
+      Number of states (4 for DNA, 20 for AA)
+
+    @param perSiteLikelihoods
+      Array to store per-site log likelihoods if \a getPerSiteLikelihoods is set to \b PLL_TRUE
+
+    @param getPerSiteLikelihoods
+      If set to \b PLL_TRUE then per-site log likelihoods are also computed and stored in \a perSiteLikelihoods
+
+    @return
+      The evaluated log likelihood of the tree topology
+*/
+static double evaluateCAT_FLEX (const boolean fastScaling, int *ex1, int *ex2, int *cptr, int *wptr,
+                                double *x1, double *x2, double *tipVector,
+                                unsigned char *tipX1, int n, double *diagptable_start, const int states, double *perSiteLikelihoods, boolean getPerSiteLikelihoods)
+{
+  double   
+    sum = 0.0, 
+    term,
+    *diagptable,  
+    *left, 
+    *right;
+
+  int     
+    i, 
+    l;                           
+
+  /* chosing between tip vectors and non tip vectors is identical in all flavors of this function ,regardless 
+     of whether we are using CAT, GAMMA, DNA or protein data etc */
+
+  if(tipX1)
+  {                 
+    for (i = 0; i < n; i++) 
+    {
+      /* same as in the GAMMA implementation */
+      left = &(tipVector[states * tipX1[i]]);
+      right = &(x2[states * i]);
+
+      /* important difference here, we do not have, as for GAMMA 
+         4 P matrices assigned to each site, but just one. However those 
+         P-Matrices can be different for the sites.
+         Hence we index into the precalculated P-matrices for individual sites 
+         via the category pointer cptr[i]
+         */
+      diagptable = &diagptable_start[states * cptr[i]];                  
+
+      /* similar to gamma, with the only difference that we do not integrate (sum)
+         over the discrete gamma rates, but simply compute the likelihood of the 
+         site and the given P-matrix */
+
+      for(l = 0, term = 0.0; l < states; l++)
+        term += left[l] * right[l] * diagptable[l];                        
+
+      /* take the log */
+       if(!fastScaling)
+         term = log(fabs(term)) + (ex2[i] * log(PLL_MINLIKELIHOOD));
+       else
+         term = log(fabs(term));
+
+       /* if required get the per-site log likelihoods.
+          note that these are the plain per site log-likes, not 
+          multiplied with the pattern weight value */
+
+       if(getPerSiteLikelihoods)
+         perSiteLikelihoods[i] = term;
+
+      /* 
+         multiply the log with the pattern weight of this site. 
+         The site pattern for which we just computed the likelihood may 
+         represent several alignment columns sites that have been compressed 
+         into one site pattern if they are exactly identical AND evolve under the same model,
+         i.e., form part of the same partition.
+         */                  
+
+      sum += wptr[i] * term;
+    }      
+  }    
+  else
+  {    
+    for (i = 0; i < n; i++) 
+    {   
+      /* as before we now access the likelihood arrayes of two inner nodes */
+      left  = &x1[states * i];
+      right = &x2[states * i];
+
+      diagptable = &diagptable_start[states * cptr[i]];         
+
+      for(l = 0, term = 0.0; l < states; l++)
+        term += left[l] * right[l] * diagptable[l];
+      
+      if(!fastScaling)
+        term = log(fabs(term)) + ((ex1[i] + ex2[i]) * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(fabs(term));  
+
+      if(getPerSiteLikelihoods)
+        perSiteLikelihoods[i] = term;
+
+      sum += wptr[i] * term;      
+    }
+  }
+
+  return  sum;         
+} 
+
+#if (defined(__SSE3) || defined(__AVX))
+/** @ingroup evaluateLikelihoodGroup
+    @brief A generic (and slow) implementation of log likelihood evaluation of a tree using the CAT model of rate heterogeneity with memory saving
+    
+    This is the same as ::evaluateCAT_FLEX but with the memory saving technique enabled.
+    Please check ::evaluateCAT_FLEX for more information and a description of the common
+    input parameters
+    
+    @param x1_gapColumn
+
+    @param x2_gapColumn
+
+    @param x1_gap
+      Gap bitvector for the left child node
+
+    @param x2_gap
+      Gap bitvector for the right child node
+    
+    @todo
+      Comment on x1_gapColumn and x2_gapColumn
+*/
+static double evaluateCAT_FLEX_SAVE (const boolean fastScaling, int *ex1, int *ex2, int *cptr, int *wptr,
+                                     double *x1, double *x2, double *tipVector,
+                                     unsigned char *tipX1, int n, double *diagptable_start, const int states, double *perSiteLikelihoods, boolean getPerSiteLikelihoods,
+                                     double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap)
+{
+  double   
+    sum = 0.0, 
+    term,
+    *diagptable,  
+    *left, 
+    *right,
+    *left_ptr = x1,
+    *right_ptr = x2;
+
+  int     
+    i, 
+    l;                           
+
+  /* chosing between tip vectors and non tip vectors is identical in all flavors of this function ,regardless 
+     of whether we are using CAT, GAMMA, DNA or protein data etc */
+
+  if(tipX1)
+  {                 
+    for (i = 0; i < n; i++) 
+    {
+      /* same as in the GAMMA implementation */
+      left = &(tipVector[states * tipX1[i]]);
+   
+      if(isGap(x2_gap, i))
+        right = x2_gapColumn;
+      else
+        {
+          right = right_ptr;
+          right_ptr += states;
+        }         
+      /* important difference here, we do not have, as for GAMMA 
+         4 P matrices assigned to each site, but just one. However those 
+         P-Matrices can be different for the sites.
+         Hence we index into the precalculated P-matrices for individual sites 
+         via the category pointer cptr[i]
+         */
+      diagptable = &diagptable_start[states * cptr[i]];                  
+
+      /* similar to gamma, with the only difference that we do not integrate (sum)
+         over the discrete gamma rates, but simply compute the likelihood of the 
+         site and the given P-matrix */
+
+      for(l = 0, term = 0.0; l < states; l++)
+        term += left[l] * right[l] * diagptable[l];                        
+
+      /* take the log */
+       if(!fastScaling)
+         term = log(fabs(term)) + (ex2[i] * log(PLL_MINLIKELIHOOD));
+       else
+         term = log(fabs(term));
+
+       /* if required get the per-site log likelihoods.
+          note that these are the plain per site log-likes, not 
+          multiplied with the pattern weight value */
+
+       if(getPerSiteLikelihoods)
+         perSiteLikelihoods[i] = term;
+
+      /* 
+         multiply the log with the pattern weight of this site. 
+         The site pattern for which we just computed the likelihood may 
+         represent several alignment columns sites that have been compressed 
+         into one site pattern if they are exactly identical AND evolve under the same model,
+         i.e., form part of the same partition.
+         */                  
+
+      sum += wptr[i] * term;
+    }      
+  }    
+  else
+  {    
+    for (i = 0; i < n; i++) 
+    {   
+      /* as before we now access the likelihood arrayes of two inner nodes */     
+
+      if(isGap(x1_gap, i))
+        left = x1_gapColumn;
+      else
+        {
+          left = left_ptr;
+          left_ptr += states;
+        }       
+
+      if(isGap(x2_gap, i))
+        right = x2_gapColumn;
+      else
+        {
+          right = right_ptr;
+          right_ptr += states;
+        }       
+
+      diagptable = &diagptable_start[states * cptr[i]];         
+
+      for(l = 0, term = 0.0; l < states; l++)
+        term += left[l] * right[l] * diagptable[l];
+      
+      if(!fastScaling)
+        term = log(fabs(term)) + ((ex1[i] + ex2[i]) * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(fabs(term));  
+
+      if(getPerSiteLikelihoods)
+        perSiteLikelihoods[i] = term;
+
+      sum += wptr[i] * term;      
+    }
+  }
+
+  return  sum;         
+} 
+#endif
+
+
+/* This is the core function for computing the log likelihood at a branch */
+/** @ingroup evaluateLikelihoodGroup
+    @brief Evaluate the log likelihood of a specific branch of the topology
+    
+    Evaluates the likelihood of the tree topology assuming a virtual root is
+    placed at the edge whose end-points are node with number \a pNumber and \a
+    qNumber in the first slot of the traversal descriptor. The function first
+    computes the conditional likelihoods for all necessary nodes (the ones in
+    the traversal descriptor list) by calling the function \a pllNewviewIterative
+    and then evaluates the likelihood at the root. In addition, if \a
+    getPerSiteLikelihoods is set to \b PLL_TRUE, the per-site likelihoods are
+    stored in \a tr->lhs.
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param getPerSiteLikelihoods
+      If set to \b PLL_TRUE, compute the log likelihood for each site. 
+
+    @note
+      This is an internal function and should not be called by the user. It assumes
+      that a valid traversal descriptor has already been computed. It also assumes
+      that the edge we are referring to is an edge that leads to a tip, i.e. either
+      p or q of the first entry of traversal descriptor are tips.
+*/
+void pllEvaluateIterative(pllInstance *tr, partitionList *pr, boolean getPerSiteLikelihoods)
+{
+  /* the branch lengths and node indices of the virtual root branch are always the first one that 
+     are stored in the very important traversal array data structure that describes a partial or full tree traversal */
+
+  /* get the branch length at the root */
+  double 
+    *pz = tr->td[0].ti[0].qz;   
+
+  /* get the node number of the node to the left and right of the branch that defines the virtual rooting */
+
+  int    
+    pNumber = tr->td[0].ti[0].pNumber, 
+    qNumber = tr->td[0].ti[0].qNumber, 
+    p_slot,
+    q_slot,
+    model;
+  
+  boolean
+    fastScaling = tr->fastScaling;
+
+  /* the slots are the entries in xVector where the LH vector is available */
+  if(tr->useRecom)
+    {
+      p_slot = tr->td[0].ti[0].slot_p;
+      q_slot = tr->td[0].ti[0].slot_q;
+    }
+  else
+    {
+      p_slot = pNumber - tr->mxtips - 1;
+      q_slot = qNumber - tr->mxtips - 1;
+    }
+  
+  /* before we can compute the likelihood at the virtual root, we need to do a partial or full tree traversal to compute 
+     the conditional likelihoods of the vectors as specified in the traversal descriptor. Maintaining this tarversal descriptor consistent 
+     will unfortunately be the responsibility of users. This is tricky, if as planned for here, we use a rooted view (described somewhere in Felsenstein's book)
+     for the conditional vectors with respect to the tree
+     */
+
+  /* iterate over all valid entries in the traversal descriptor */
+
+  pllNewviewIterative(tr, pr, 1);
+
+  /* after the above call we are sure that we have properly and consistently computed the 
+     conditionals to the right and left of the virtual root and we can now invoke the 
+     the log likelihood computation */
+
+  /* we need to loop over all partitions. Note that we may have a mix of DNA, protein binary data etc partitions */
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+    {    
+      /* whats' the number of sites of this partition (at the current thread) */
+      int           
+        width = pr->partitionData[model]->width;
+
+      /* 
+         Important part of the tarversal descriptor: 
+         figure out if we need to recalculate the likelihood of this 
+         partition: 
+         
+         The reasons why this is important in terms of performance are given in this paper 
+         here which you should actually read:
+         
+         A. Stamatakis, M. Ott: "Load Balance in the Phylogenetic Likelihood Kernel". Proceedings of ICPP 2009, accepted for publication, Vienna, Austria, September 2009
+         
+         The width > 0 check is for checking if under the cyclic data distribution of per-partition sites to threads this thread does indeed have a site 
+         of the current partition.
+         
+      */
+
+      if(tr->td[0].executeModel[model] && width > 0)
+        {       
+          int 
+#if (defined(__SSE3) || defined(__AVX))
+            rateHet = (int)discreteRateCategories(tr->rateHetModel),
+#endif
+            categories,
+            ascWidth = pr->partitionData[model]->states,
+            
+            /* get the number of states in the partition, e.g.: 4 = DNA, 20 = Protein */
+            
+            states = pr->partitionData[model]->states,
+            *ex1 = NULL,
+            *ex2 = NULL,
+            *ex1_asc = NULL,
+            *ex2_asc = NULL;
+          
+          double 
+            *rateCategories = (double*)NULL,
+            z, 
+            partitionLikelihood = 0.0,     
+            *x1_start           = NULL,
+            *x2_start           = NULL,
+            *diagptable         = NULL,
+            *x1_start_asc       = NULL,
+            *x2_start_asc       = NULL;
+
+#if (defined(__SSE3) || defined(__AVX))
+          double
+            *x1_gapColumn = (double*)NULL,
+            *x2_gapColumn = (double*)NULL;
+#endif
+          
+#if (defined(__SSE3) || defined(__AVX))
+          unsigned int
+            *x1_gap = (unsigned int*)NULL,
+            *x2_gap = (unsigned int*)NULL;       
+#endif
+          
+          unsigned char 
+            *tip = (unsigned char*)NULL;          
+          
+          /* 
+             figure out if we are using the CAT or GAMMA model of rate heterogeneity 
+             and set pointers to the rate heterogeneity rate arrays and also set the 
+             number of distinct rate categories appropriately.
+             
+             Under GAMMA this is constant and hard-coded as 4, weheras under CAT 
+             the number of site-wise rate categories can vary in the course of computations 
+             up to a user defined maximum value of site categories (default: 25)
+          */
+
+          if(tr->rateHetModel == PLL_CAT)
+            {        
+              rateCategories = pr->partitionData[model]->perSiteRates;
+              categories = pr->partitionData[model]->numberOfCategories;
+            }
+          else  /* GAMMA */
+            {        
+              rateCategories = pr->partitionData[model]->gammaRates;
+              categories = 4;
+            }
+          
+          /* set this pointer to the memory area where space has been reserved a priori for storing the 
+             P matrix at the root */
+          
+          diagptable = pr->partitionData[model]->left;
+          
+          /* figure out if we need to address tip vectors (a char array that indexes into a precomputed tip likelihood 
+             value array) or if we need to address inner vectors */
+          
+          /* either node p or node q is a tip */
+          
+          if(isTip(pNumber, tr->mxtips) || isTip(qNumber, tr->mxtips))
+            {                       
+              /* q is a tip */
+              
+              if(isTip(qNumber, tr->mxtips))
+                {       
+                  /* get the start address of the inner likelihood vector x2 for partition model,
+                     note that inner nodes are enumerated/indexed starting at 0 to save allocating some 
+                     space for additional pointers */
+
+                  x2_start = pr->partitionData[model]->xVector[p_slot];
+                  
+                  /* get the corresponding tip vector */
+                  
+                  tip      = pr->partitionData[model]->yVector[qNumber];
+                  
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+                  if (tr->threadID == 0 && pr->partitionData[model]->ascBias)
+#else
+                  if (pr->partitionData[model]->ascBias)
+#endif
+                   {
+                     x2_start_asc  = &pr->partitionData[model]->ascVector[(pNumber - tr->mxtips - 1) * pr->partitionData[model]->ascOffset];
+                     ex2_asc       = &pr->partitionData[model]->ascExpVector[(pNumber - tr->mxtips - 1) * ascWidth];
+                   }
+
+                  
+                  /* memory saving stuff, let's deal with this later or ask Fernando ;-) */
+                  
+#if (defined(__SSE3) || defined(__AVX))
+                  if(tr->saveMemory)
+                    {
+                      x2_gap         = &(pr->partitionData[model]->gapVector[pNumber * pr->partitionData[model]->gapVectorLength]);
+                      x2_gapColumn   = &(pr->partitionData[model]->gapColumn[(pNumber - tr->mxtips - 1) * states * rateHet]);
+                    }
+#endif
+                  /* per site likelihood scaling */
+
+                  if(!fastScaling)                  
+                    ex2 = pr->partitionData[model]->expVector[p_slot];              
+                }           
+              else
+                {       
+                  /* p is a tip, same as above */
+                  
+                  x2_start = pr->partitionData[model]->xVector[q_slot];
+                  tip = pr->partitionData[model]->yVector[pNumber];
+                  
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+                  if (tr->threadID == 0 && pr->partitionData[model]->ascBias)
+#else
+                  if (pr->partitionData[model]->ascBias)
+#endif
+                   {
+                     x2_start_asc  = &pr->partitionData[model]->ascVector[(qNumber - tr->mxtips - 1) * pr->partitionData[model]->ascOffset];
+                     ex2_asc       = &pr->partitionData[model]->ascExpVector[(qNumber - tr->mxtips - 1) * ascWidth];
+                   }
+                  
+#if (defined(__SSE3) || defined(__AVX))
+                  if(tr->saveMemory)
+                    {
+                      x2_gap         = &(pr->partitionData[model]->gapVector[qNumber * pr->partitionData[model]->gapVectorLength]);
+                      x2_gapColumn   = &(pr->partitionData[model]->gapColumn[(qNumber - tr->mxtips - 1) * states * rateHet]);
+                    }
+#endif
+
+                  /* per site likelihood scaling */
+
+                  if(!fastScaling)                  
+                    ex2 = pr->partitionData[model]->expVector[q_slot];             
+                }
+            }
+          else
+            {  
+              
+              assert(p_slot != q_slot);
+              /* neither p nor q are tips, hence we need to get the addresses of two inner vectors */
+              
+              x1_start = pr->partitionData[model]->xVector[p_slot];
+              x2_start = pr->partitionData[model]->xVector[q_slot];
+              
+              /* memory saving option */
+              
+#if (defined(__SSE3) || defined(__AVX))
+              if(tr->saveMemory)
+                {
+                  x1_gap = &(pr->partitionData[model]->gapVector[pNumber * pr->partitionData[model]->gapVectorLength]);
+                  x2_gap = &(pr->partitionData[model]->gapVector[qNumber * pr->partitionData[model]->gapVectorLength]);
+                  x1_gapColumn   = &pr->partitionData[model]->gapColumn[(pNumber - tr->mxtips - 1) * states * rateHet];
+                  x2_gapColumn   = &pr->partitionData[model]->gapColumn[(qNumber - tr->mxtips - 1) * states * rateHet];
+                }
+#endif
+                      
+              /* per site likelihood scaling */
+
+              if(!fastScaling)
+                {
+                  ex1      = pr->partitionData[model]->expVector[p_slot];
+                  ex2      = pr->partitionData[model]->expVector[q_slot];     
+                }
+              
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+              if (tr->threadID == 0 && pr->partitionData[model]->ascBias)
+#else
+              if (pr->partitionData[model]->ascBias)
+#endif
+               {
+                 x1_start_asc  = &pr->partitionData[model]->ascVector[(pNumber - tr->mxtips - 1) * pr->partitionData[model]->ascOffset];
+                 x2_start_asc  = &pr->partitionData[model]->ascVector[(qNumber - tr->mxtips - 1) * pr->partitionData[model]->ascOffset];
+
+                 ex1_asc       = &pr->partitionData[model]->ascExpVector[(pNumber - tr->mxtips - 1) * ascWidth];
+                 ex2_asc       = &pr->partitionData[model]->ascExpVector[(qNumber - tr->mxtips - 1) * ascWidth];
+               }
+
+
+
+            }
+          
+          
+          /* if we are using a per-partition branch length estimate, the branch has an index, otherwise, for a joint branch length
+             estimate over all partitions we just use the branch length value with index 0 */
+          
+          if(pr->perGeneBranchLengths)
+            z = pz[model];
+          else
+            z = pz[0];
+
+          /* calc P-Matrix at root for branch z connecting nodes p and q */
+          
+          if(pr->partitionData[model]->dataType == PLL_AA_DATA && pr->partitionData[model]->protModels == PLL_LG4)                                        
+            calcDiagptableFlex_LG4(z, 4, pr->partitionData[model]->gammaRates, pr->partitionData[model]->EIGN_LG4, diagptable, 20);
+          else
+	    calcDiagptable(z, states, categories, rateCategories, pr->partitionData[model]->EIGN, diagptable);
+          
+#if (!defined(__SSE3) && !defined(__AVX) && !defined(__MIC_NATIVE))
+          
+          /* generic slow functions, memory saving option is not implemented for these */
+          
+          assert(!tr->saveMemory);
+          
+          /* decide wheter CAT or GAMMA is used and compute log like */
+          if(tr->rateHetModel == PLL_CAT)
+            partitionLikelihood = evaluateCAT_FLEX(fastScaling, ex1, ex2, pr->partitionData[model]->rateCategory, pr->partitionData[model]->wgt, 
+                                                x1_start, x2_start, pr->partitionData[model]->tipVector,
+                                                tip, width, diagptable, states, pr->partitionData[model]->perSiteLikelihoods, getPerSiteLikelihoods);
+          else
+              partitionLikelihood = evaluateGAMMA_FLEX(fastScaling, ex1, ex2, pr->partitionData[model]->wgt,
+                                                x1_start, x2_start, pr->partitionData[model]->tipVector,
+                                                tip, width, diagptable, states, pr->partitionData[model]->perSiteLikelihoods, getPerSiteLikelihoods);
+#else
+   
+          /* if we want to compute the per-site likelihoods, we use the generic evaluate function implementations 
+             for this, because the slowdown is not that dramatic */
+
+          if(getPerSiteLikelihoods)
+            {         
+#ifdef __MIC_NATIVE
+			  // not supported on MIC!
+ 			  assert(0 && "Per-site LH calculations is not implemented on Intel MIC");
+#else
+        	  if(tr->rateHetModel == PLL_CAT)
+                {
+                   if(tr->saveMemory)
+                     partitionLikelihood = evaluateCAT_FLEX_SAVE(fastScaling, ex1, ex2, pr->partitionData[model]->rateCategory, pr->partitionData[model]->wgt,
+                                                                 x1_start, x2_start, pr->partitionData[model]->tipVector,
+                                                                 tip, width, diagptable, states, pr->partitionData[model]->perSiteLikelihoods, PLL_TRUE,
+                                                                 x1_gapColumn, x2_gapColumn, x1_gap, x2_gap);
+                   else
+                     partitionLikelihood = evaluateCAT_FLEX(fastScaling, ex1, ex2, pr->partitionData[model]->rateCategory, pr->partitionData[model]->wgt,
+                                                            x1_start, x2_start, pr->partitionData[model]->tipVector,
+                                                            tip, width, diagptable, states, pr->partitionData[model]->perSiteLikelihoods, PLL_TRUE);
+                }
+              else
+                {
+                  if(tr->saveMemory)
+                    partitionLikelihood = evaluateGAMMA_FLEX_SAVE(fastScaling, ex1, ex2, pr->partitionData[model]->wgt,
+                                                                  x1_start, x2_start, pr->partitionData[model]->tipVector,
+                                                                  tip, width, diagptable, states, pr->partitionData[model]->perSiteLikelihoods, PLL_TRUE, 
+                                                                  x1_gapColumn, x2_gapColumn, x1_gap, x2_gap);              
+                  else
+                    partitionLikelihood = evaluateGAMMA_FLEX(fastScaling, ex1, ex2, pr->partitionData[model]->wgt,
+                                                             x1_start, x2_start, pr->partitionData[model]->tipVector,
+                                                             tip, width, diagptable, states, pr->partitionData[model]->perSiteLikelihoods, PLL_TRUE);
+                }
+#endif
+            }
+          else
+            {
+              /* for the optimized functions we have a dedicated, optimized function implementation 
+                 for each rate heterogeneity and data type combination, we switch over the number of states 
+                 and the rate heterogeneity model */
+              
+              switch(states)
+                {         
+                case 2: /* binary */
+                  assert (!tr->saveMemory);
+                  if (tr->rateHetModel == PLL_CAT)
+                   {
+                     partitionLikelihood =  evaluateGTRCAT_BINARY(ex1, ex2, pr->partitionData[model]->rateCategory, pr->partitionData[model]->wgt,
+                                                                  x1_start, x2_start, pr->partitionData[model]->tipVector, 
+                                                                  tip, width, diagptable, fastScaling);
+                   }
+                  else
+                   {
+                     partitionLikelihood = evaluateGTRGAMMA_BINARY(ex1, ex2, pr->partitionData[model]->wgt,
+                                                                   x1_start, x2_start, pr->partitionData[model]->tipVector,
+                                                                   tip, width, diagptable, fastScaling);                 
+                   }
+                  break;
+                case 4: /* DNA */
+                  {
+
+#ifdef __MIC_NATIVE
+
+                  /* CAT & memory saving are not supported on MIC */
+
+                  assert(!tr->saveMemory);
+                  assert(tr->rateHetModel == PLL_GAMMA);
+
+                  partitionLikelihood =  evaluateGTRGAMMA_MIC(ex1, ex2, pr->partitionData[model]->wgt,
+                                              x1_start, x2_start, pr->partitionData[model]->tipVector,
+                                              tip, width, diagptable, fastScaling);
+#else
+                    if(tr->rateHetModel == PLL_CAT)
+                      {                           
+                        if(tr->saveMemory)
+                          partitionLikelihood =  evaluateGTRCAT_SAVE(fastScaling, ex1, ex2, pr->partitionData[model]->rateCategory, pr->partitionData[model]->wgt,
+                                                                     x1_start, x2_start, pr->partitionData[model]->tipVector,
+                                                                     tip, width, diagptable, x1_gapColumn, x2_gapColumn, x1_gap, x2_gap);
+                        else
+                          partitionLikelihood =  evaluateGTRCAT(fastScaling, ex1, ex2, pr->partitionData[model]->rateCategory, pr->partitionData[model]->wgt,
+                                                                x1_start, x2_start, pr->partitionData[model]->tipVector,
+                                                                tip, width, diagptable);
+                      }
+                    else
+                      {         
+                        if(tr->saveMemory)                 
+                          partitionLikelihood =  evaluateGTRGAMMA_GAPPED_SAVE(fastScaling, ex1, ex2, pr->partitionData[model]->wgt,
+                                                                              x1_start, x2_start, pr->partitionData[model]->tipVector,
+                                                                              tip, width, diagptable,
+                                                                              x1_gapColumn, x2_gapColumn, x1_gap, x2_gap);                  
+                        else
+                          partitionLikelihood =  evaluateGTRGAMMA(fastScaling, ex1, ex2, pr->partitionData[model]->wgt,
+                                                                  x1_start, x2_start, pr->partitionData[model]->tipVector,
+                                                                  tip, width, diagptable);                                
+                      }
+#endif
+                  }
+                  break;                                   
+                case 20: /* proteins */
+                  {
+
+#ifdef __MIC_NATIVE
+
+                  /* CAT & memory saving are not supported on MIC */
+
+                  assert(!tr->saveMemory);
+                  assert(tr->rateHetModel == PLL_GAMMA);
+
+                  if(pr->partitionData[model]->protModels == PLL_LG4)
+                    partitionLikelihood =  evaluateGTRGAMMAPROT_LG4_MIC(pr->partitionData[model]->wgt,
+                                                                    x1_start, x2_start, pr->partitionData[model]->tipVector_LG4,
+                                                                    tip, width, diagptable);
+                  else
+                	partitionLikelihood =  evaluateGTRGAMMAPROT_MIC(ex1, ex2, pr->partitionData[model]->wgt,
+                                              x1_start, x2_start, pr->partitionData[model]->tipVector,
+                                              tip, width, diagptable, fastScaling);
+
+//                  printf("tip: %p, width: %d,  lh: %f\n", tip, width, partitionLikelihood);
+//                  int g;
+//                  if (x1_start)
+//					  for (g = 0; g < 20; ++g)
+//						  printf("%f \t", x1_start[g]);
+//                  printf("\n");
+//                  if (x2_start)
+//					  for (g = 0; g < 20; ++g)
+//						  printf("%f \t", x2_start[g]);
+#else
+
+                      if(tr->rateHetModel == PLL_CAT)
+                      {                           
+                        if(tr->saveMemory)
+                          partitionLikelihood = evaluateGTRCATPROT_SAVE(fastScaling, ex1, ex2, pr->partitionData[model]->rateCategory, pr->partitionData[model]->wgt,
+                                                                        x1_start, x2_start, pr->partitionData[model]->tipVector,
+                                                                        tip, width, diagptable,  x1_gapColumn, x2_gapColumn, x1_gap, x2_gap);
+                        else
+                          partitionLikelihood = evaluateGTRCATPROT(fastScaling, ex1, ex2, pr->partitionData[model]->rateCategory, pr->partitionData[model]->wgt,
+                                                                   x1_start, x2_start, pr->partitionData[model]->tipVector,
+                                                                   tip, width, diagptable);               
+                      }
+                    else
+                      {                                               
+                        if(tr->saveMemory)
+                          partitionLikelihood = evaluateGTRGAMMAPROT_GAPPED_SAVE(fastScaling, ex1, ex2, pr->partitionData[model]->wgt,
+                                                                                 x1_start, x2_start, pr->partitionData[model]->tipVector,
+                                                                                 tip, width, diagptable,
+                                                                                 x1_gapColumn, x2_gapColumn, x1_gap, x2_gap);
+                        else
+                      {
+                        if(pr->partitionData[model]->protModels == PLL_LG4)
+                          partitionLikelihood =  evaluateGTRGAMMAPROT_LG4((int *)NULL, (int *)NULL, pr->partitionData[model]->wgt,
+                                                                          x1_start, x2_start, pr->partitionData[model]->tipVector_LG4,
+                                                                          tip, width, diagptable, PLL_TRUE);
+                        else
+                          partitionLikelihood = evaluateGTRGAMMAPROT(fastScaling, ex1, ex2, pr->partitionData[model]->wgt,
+                                                                     x1_start, x2_start, pr->partitionData[model]->tipVector,
+                                                                     tip, width, diagptable);           
+                      }
+                      }
+#endif
+                  }
+                  break;                            
+                default:
+                  assert(0);        
+                }
+            }
+#endif
+              
+          /* check that there was no major numerical screw-up, the log likelihood should be < 0.0 always */
+          
+          assert(partitionLikelihood < 0.0);
+          
+          /* now here is a nasty part, for each partition and each node we maintain an integer counter to count how often 
+             how many entries per node were scaled by a constant factor. Here we use this information generated during Felsenstein's 
+             pruning algorithm by the newview() functions to undo the preceding scaling multiplications at the root, for mathematical details 
+             you should actually read:
+             
+             A. Stamatakis: "Orchestrating the Phylogenetic Likelihood Function on Emerging Parallel Architectures". 
+             In B. Schmidt, editor, Bioinformatics: High Performance Parallel Computer Architectures, 85-115, CRC Press, Taylor & Francis, 2010.
+             
+             There's a copy of this book in my office 
+          */
+          
+          if(fastScaling)
+            partitionLikelihood += (pr->partitionData[model]->globalScaler[pNumber] + pr->partitionData[model]->globalScaler[qNumber]) * log(PLL_MINLIKELIHOOD);
+          
+          /* now we have the correct log likelihood for the current partition after undoing scaling multiplications */           
+          
+          /* finally, we also store the per partition log likelihood which is important for optimizing the alpha parameter 
+             of this partition for example */
+          
+          /* asc bias stuff */
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+          if (tr->threadID == 0 && pr->partitionData[model]->ascBias)
+#else
+          if (pr->partitionData[model]->ascBias)
+#endif
+           {
+             size_t
+               i;
+             
+             int        
+               w = 0;
+             
+             double                                
+               correction;
+
+             switch(tr->rateHetModel)
+               {
+               case PLL_CAT:
+                 {
+                   double 
+                     rates = 1.0;
+                   
+                   //need to re-calculate P-matrix for the correction here assuming a rate of 1.0 
+                   calcDiagptable(z, states, 1, &rates, pr->partitionData[model]->EIGN, diagptable);
+                   
+                   
+                   correction = evaluateCatAsc(ex1_asc, ex2_asc, x1_start_asc, x2_start_asc, pr->partitionData[model]->tipVector,
+                                               tip, ascWidth, diagptable, ascWidth);
+                 }
+                 break;
+               case PLL_GAMMA:                       
+                 correction = evaluateGammaAsc(ex1_asc, ex2_asc, x1_start_asc, x2_start_asc, pr->partitionData[model]->tipVector,
+                                               tip, ascWidth, diagptable, ascWidth);
+                 break;
+               default:
+                 assert(0);
+               }
+             
+             
+             
+             for(i = (size_t)pr->partitionData[model]->lower; i < (size_t)pr->partitionData[model]->upper; i++)
+               w += tr->aliaswgt[i];
+
+             partitionLikelihood = partitionLikelihood - (double)w * log(1.0 - correction);                  
+              
+           }
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+          if(!(pr->partitionData[model]->ascBias && tr->threadID == 0))
+           {
+#endif
+             if(partitionLikelihood >= 0.0)
+               {
+                 printf("positive log like: %f for partition %d\n", partitionLikelihood, model);
+                 assert(0);
+               }
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+           }
+#endif
+
+          
+          pr->partitionData[model]->partitionLH = partitionLikelihood;
+        }
+      else
+        {
+          /* if the current thread does not have a single site of this partition
+             it is important to set the per partition log like to 0.0 because 
+             of the reduction operation that will take place later-on.
+             That is, the values of tr->perPartitionLH across all threads 
+             need to be in a consistent state, always !
+          */
+          
+          if(width == 0)            
+            pr->partitionData[model]->partitionLH = 0.0;
+        }
+    }
+
+
+#ifdef DEBUG_PERSITE_LNL
+  /* per persite-stuff */
+  {
+    int model = 0; 
+    for(model = 0; model < pr->numberOfPartitions ; ++model)
+      {
+        int j= 0; 
+        pInfo *partition  =  pr->partitionData[model]; 
+        for(j = 0;  j < partition->width; ++j)
+          printf("[%d] lnl[%d]=%f\n", tr->threadID, j, partition->perSiteLikelihoods[j]); 
+
+      }
+  }
+
+#endif
+}
+
+
+
+/** @ingroup evaluateLikelihoodGroup
+    @brief Evaluate the log likelihood of the tree topology
+
+    Evaluate the log likelihood of the tree topology of instance \a tr by
+    assuming a virtual root between nodes \a p and \a p->back. If
+    \a fullTraversal is set to \b PLL_TRUE then the log likelihood vectors for
+    each node are recomputed from scratch.
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param p
+      Specifies the virtual root, which is assumed to be a (virtual node) connecting \a p and \a p->back
+
+    @param fullTraversal
+      If set to \b PLL_TRUE, then the likelihood vectors at all nodes are recomputed, otherwise only the
+      necessary vectors (those that are not oriented in the right direction) are recomputed.
+
+    @param getPerSiteLikelihoods
+      Also compute and store (in \a tr->lhs) the log likelihood of each site of the (compressed) alignment
+
+    @note
+      If \a getPerSiteLikelihoods is set to \b PLL_TRUE, then make sure that \a tr->fastScaling is set to
+      \b PLL_FALSE, otherwise an assertion will fail.
+*/
+void pllEvaluateLikelihood (pllInstance *tr, partitionList *pr, nodeptr p, boolean fullTraversal, boolean getPerSiteLikelihoods)
+{
+  /* now this may be the entry point of the library to compute 
+     the log like at a branch defined by p and p->back == q */
+
+  volatile double 
+    result = 0.0;
+
+  nodeptr 
+    q = p->back; 
+  
+
+  boolean
+        p_recom = PLL_FALSE, /* if one of was missing, we will need to force recomputation */
+        q_recom = PLL_FALSE;
+
+  int
+    i,
+    model,
+    numBranches = pr->perGeneBranchLengths? pr->numberOfPartitions : 1;
+
+  /* if evaluate shall return the per-site log likelihoods 
+     fastScaling needs to be disabled, otherwise this will 
+     not work */
+
+  if(getPerSiteLikelihoods)          
+    assert(!(tr->fastScaling)); 
+
+  /* set the first entry of the traversal descriptor to contain the indices
+     of nodes p and q */
+
+  tr->td[0].ti[0].pNumber = p->number;
+  tr->td[0].ti[0].qNumber = q->number;          
+
+  /* copy the branch lengths of the tree into the first entry of the traversal descriptor.
+     if -M is not used tr->numBranches must be 1 */
+
+  for(i = 0; i < numBranches; i++)
+    tr->td[0].ti[0].qz[i] =  q->z[i];
+
+  /* recom part */
+  if(tr->useRecom)
+  {
+    int slot = -1;
+    if(!isTip(q->number, tr->mxtips))
+    {
+      q_recom = getxVector(tr->rvec, q->number, &slot, tr->mxtips);
+      tr->td[0].ti[0].slot_q = slot;
+    }
+    if(!isTip(p->number, tr->mxtips))
+    {
+      p_recom = getxVector(tr->rvec, p->number, &slot, tr->mxtips);
+      tr->td[0].ti[0].slot_p = slot;
+    }
+    if(!isTip(p->number, tr->mxtips) &&  !isTip(q->number, tr->mxtips))
+      assert(tr->td[0].ti[0].slot_q != tr->td[0].ti[0].slot_p);
+  }
+
+
+  /* now compute how many conditionals must be re-computed/re-oriented by newview
+     to be able to calculate the likelihood at the root defined by p and q.
+     */
+
+  /* one entry in the traversal descriptor is already used, hence set the tarversal length counter to 1 */
+  tr->td[0].count = 1;
+
+  if(fullTraversal)
+  {
+    assert(isTip(q->back->number, tr->mxtips));
+    computeTraversal(tr, q, PLL_FALSE, numBranches);
+  }
+  else
+  {
+    if(p_recom || needsRecomp(tr->useRecom, tr->rvec, p, tr->mxtips))
+      computeTraversal(tr, p, PLL_TRUE, numBranches);
+
+    if(q_recom || needsRecomp(tr->useRecom, tr->rvec, q, tr->mxtips))
+      computeTraversal(tr, q, PLL_TRUE, numBranches);
+  }
+
+
+  /* now we copy this partition execute mask into the traversal descriptor which must come from the 
+     calling program, the logic of this should not form part of the library */
+
+  storeExecuteMaskInTraversalDescriptor(tr, pr);
+
+  /* also store in the traversal descriptor that something has changed i.e., in the parallel case that the 
+     traversal descriptor list of nodes needs to be broadcast once again */
+
+  tr->td[0].traversalHasChanged = PLL_TRUE;
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+
+  /* now here we enter the fork-join region for Pthreads */
+
+
+  /* start the parallel region and tell all threads to compute the log likelihood for 
+     their fraction of the data. This call is implemented in the case switch of execFunction in axml.c
+     */
+
+  if(getPerSiteLikelihoods)
+    {
+      memset(tr->lhs, 0, sizeof(double) * tr->originalCrunchedLength); 
+      pllMasterBarrier(tr, pr, PLL_THREAD_EVALUATE_PER_SITE_LIKES);
+    }
+  else
+    pllMasterBarrier (tr, pr, PLL_THREAD_EVALUATE);
+
+  /* and now here we explicitly do the reduction operation , that is add over the 
+     per-thread and per-partition log likelihoods to obtain the overall log like 
+     over all sites and partitions */
+
+ 
+  /* 
+     for unpartitioned data that's easy, we just sum over the log likes computed 
+     by each thread, thread 0 stores his results in reductionBuffer[0] thread 1 in 
+     reductionBuffer[1] and so on 
+     */
+
+  /* This reduction for the partitioned case is more complicated because each thread 
+     needs to store the partial log like of each partition and we then need to collect 
+     and add everything */
+
+#else
+  /* and here is just the sequential case, we directly call pllEvaluateIterative() above 
+     without having to tell the threads/processes that they need to compute this function now */
+
+  pllEvaluateIterative(tr, pr, getPerSiteLikelihoods); //PLL_TRUE
+
+  /*
+    if we want to obtain per-site rates they have initially been stored 
+     in arrays that are associated to the partition, now we 
+     copy them into the vector tr->lhs[].
+     We may also chose that the user needs to rpovide an array, but this can be decided later-on.
+  */
+
+  if(getPerSiteLikelihoods) //PLL_TRUE
+    {
+      for(model = 0; model < pr->numberOfPartitions; model++)
+        memcpy(&(tr->lhs[pr->partitionData[model]->lower]), pr->partitionData[model]->perSiteLikelihoods, pr->partitionData[model]->width  * sizeof(double));
+    }
+
+#endif
+
+
+  /* set the tree data structure likelihood value to the total likelihood */
+
+  tr->likelihood = result;    
+
+  /* the code below is mainly for testing if the per-site log 
+     likelihoods we have stored in tr->lhs yield the same 
+     likelihood as the likelihood we computed. 
+     For numerical reasons we need to make a dirt PLL_ABS(difference) < epsilon
+     comparison */
+     
+  if(getPerSiteLikelihoods) //PLL_TRUE
+    {
+      double 
+        likelihood = 0;
+      int i; 
+
+      /* note that in tr->lhs, we just store the likelihood of 
+         one representative of a potentially compressed pattern,
+         hence, we need to multiply the elemnts with the pattern 
+         weight vector */
+
+
+      for(i = 0; i < tr->originalCrunchedLength; i++)
+        {
+//          printf("lhs[%d]=%f * %d\n", i, tr->lhs[i], tr->aliaswgt[i]); 
+          likelihood += (tr->lhs[i]   * tr->aliaswgt[i] );
+        }
+         
+      if( PLL_ABS(tr->likelihood - likelihood) > 0.00001)
+        {
+  //        printf("likelihood was %f\t summed/weighted per-site-lnl was %f\n", tr->likelihood, likelihood); 
+        }
+
+        assert(PLL_ABS(tr->likelihood - likelihood) < 0.00001);
+    }
+
+
+  if(tr->useRecom)
+  {
+    unpinNode(tr->rvec, p->number, tr->mxtips);
+    unpinNode(tr->rvec, q->number, tr->mxtips);
+  }
+
+  /* do some bookkeeping to have traversalHasChanged in a consistent state */
+
+  tr->td[0].traversalHasChanged = PLL_FALSE;
+}
+
+
+void perSiteLogLikelihoods(pllInstance *tr, partitionList *pr, double *logLikelihoods)
+{
+#if (!defined(_USE_PTHREADS) && !defined(_FINE_GRAIN_MPI))
+  double 
+    //likelihood,
+    accumulatedPerSiteLikelihood = 0.0;
+
+  size_t
+    localCount,
+    i,
+    //globalCounter,
+    lower,
+    upper;
+  int model;
+#endif
+  /* compute the likelihood of the tree with the standard function to:
+     1. obtain the current score for error checking
+     2. store a full tree traversal in the traversal descriptor that 
+     will then be used for calculating per-site log likelihoods 
+     for each site individually and independently */
+
+  pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+
+  //likelihood = tr->likelihood;
+
+  /* now compute per-site log likelihoods using the respective functions */
+
+#if (defined( _USE_PTHREADS ) || defined(_FINE_GRAIN_MPI))
+  /* here we need a barrier to invoke a parallel region that calls 
+     function 
+     perSiteLogLikelihoodsPthreads(tree *tr, partitionList *pr, double *lhs, int n, int tid)
+     defined above and subsequently collects the per-site log likelihoods 
+     computed by the threads and stored in local per-thread memory 
+     and stores them in buffer tr->lhs.
+     This corresponds to a gather operation in MPI.
+     */
+
+  pllMasterBarrier (tr, pr, PLL_THREAD_PER_SITE_LIKELIHOODS);
+
+  /* 
+     when the parallel region has terminated, the per-site log likelihoods 
+     are stored in array tr->lhs of the master thread which we copy to the result buffer
+  */
+  
+  memcpy(logLikelihoods, tr->lhs, sizeof(double) * tr->originalCrunchedLength);
+
+
+#else
+
+  /* sequential case: just loop over all partitions and compute per site log likelihoods */
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+  {
+    lower = pr->partitionData[model]->lower;
+    upper = pr->partitionData[model]->upper;
+
+    for(i = lower, localCount = 0; i < upper; i++, localCount++)
+    {
+      double 
+        l;
+
+      /* 
+         we need to switch of rate heterogeneity implementations here.
+         when we have PSR we actually need to provide the per-site rate 
+         to the function evaluatePartialGeneric() that computes the 
+         per-site log likelihood.
+         Under GAMMA, the rate will just be ignored, here we just set it to 1.0
+         */
+
+      switch(tr->rateHetModel)
+      {
+        case PLL_CAT:
+          l = evaluatePartialGeneric (tr, pr, i, pr->partitionData[model]->perSiteRates[pr->partitionData[model]->rateCategory[localCount]], model);
+          break;
+        case PLL_GAMMA:
+          l = evaluatePartialGeneric (tr, pr, i, 1.0, model);
+          break;
+        default:
+          assert(0);
+      }
+
+      /* store value in result array and add the likelihood of this site to the overall likelihood */
+
+      logLikelihoods[i] = l;
+      accumulatedPerSiteLikelihood += l;
+    } 
+  }
+
+
+  /* error checking. We need a dirt PLL_ABS() < epsilon here, because the implementations 
+     (standard versus per-site) are pretty different and hence slight numerical 
+     deviations are expected */
+
+  assert(PLL_ABS(tr->likelihood - accumulatedPerSiteLikelihood) < 0.00001);
+  
+#endif
+  
+
+
+}
+
+#if (defined(__SSE3) || defined(__AVX))
+static double evaluateGTRCAT_BINARY (int *ex1, int *ex2, int *cptr, int *wptr,
+                                     double *x1_start, double *x2_start, double *tipVector,                   
+                                     unsigned char *tipX1, int n, double *diagptable_start, const boolean fastScaling)
+{
+  double  sum = 0.0, term;       
+  int     i;
+#if (!defined(__SSE3) && !defined(__AVX))
+  int j;  
+#endif
+  double  *diagptable, *x1, *x2;                            
+ 
+  if(tipX1)
+    {          
+      for (i = 0; i < n; i++) 
+        {
+#if (defined(__SSE3) || defined(__AVX))
+          double t[2] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+#endif
+          x1 = &(tipVector[2 * tipX1[i]]);
+          x2 = &(x2_start[2 * i]);
+          
+          diagptable = &(diagptable_start[2 * cptr[i]]);                          
+        
+#if (defined(__SSE3) || defined(__AVX))
+          _mm_store_pd(t, _mm_mul_pd(_mm_load_pd(x1), _mm_mul_pd(_mm_load_pd(x2), _mm_load_pd(diagptable))));
+          
+          if(fastScaling)
+            term = log(fabs(t[0] + t[1]));
+          else
+            term = log(fabs(t[0] + t[1])) + (ex2[i] * log(PLL_MINLIKELIHOOD));                           
+#else               
+          for(j = 0, term = 0.0; j < 2; j++)                         
+            term += x1[j] * x2[j] * diagptable[j];            
+                 
+          if(fastScaling)
+            term = log(fabs(term));
+          else
+            term = log(fabs(term)) + (ex2[i] * log(PLL_MINLIKELIHOOD));                                                      
+#endif    
+
+          sum += wptr[i] * term;
+        }       
+    }               
+  else
+    {
+      for (i = 0; i < n; i++) 
+        {       
+#if (defined(__SSE3) || defined(__AVX))
+          double t[2] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));                                 
+#endif                  
+          x1 = &x1_start[2 * i];
+          x2 = &x2_start[2 * i];
+          
+          diagptable = &diagptable_start[2 * cptr[i]];            
+#if (defined(__SSE3) || defined(__AVX))
+          _mm_store_pd(t, _mm_mul_pd(_mm_load_pd(x1), _mm_mul_pd(_mm_load_pd(x2), _mm_load_pd(diagptable))));
+          
+          if(fastScaling)
+            term = log(fabs(t[0] + t[1]));
+          else
+            term = log(fabs(t[0] + t[1])) + ((ex1[i] + ex2[i]) * log(PLL_MINLIKELIHOOD));                        
+#else     
+          for(j = 0, term = 0.0; j < 2; j++)
+            term += x1[j] * x2[j] * diagptable[j];   
+          
+          if(fastScaling)
+            term = log(fabs(term));
+          else
+            term = log(fabs(term)) + ((ex1[i] + ex2[i]) * log(PLL_MINLIKELIHOOD));
+#endif
+          
+          sum += wptr[i] * term;
+        }          
+    }
+       
+  return  sum;         
+} 
+
+
+static double evaluateGTRGAMMA_BINARY(int *ex1, int *ex2, int *wptr,
+                                      double *x1_start, double *x2_start, 
+                                      double *tipVector, 
+                                      unsigned char *tipX1, const int n, double *diagptable, const boolean fastScaling)
+{
+  double   sum = 0.0, term;    
+  int     i, j;
+#if (!defined(__SSE3) && !defined(__AVX))
+  int k;
+#endif 
+  double  *x1, *x2;             
+
+  if(tipX1)
+    {          
+      for (i = 0; i < n; i++)
+        {
+#if (defined(__SSE3) || defined(__AVX))
+          double t[2] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+          __m128d termv, x1v, x2v, dv;
+#endif
+          x1 = &(tipVector[2 * tipX1[i]]);       
+          x2 = &x2_start[8 * i];                                
+#if (defined(__SSE3) || defined(__AVX))
+          termv = _mm_set1_pd(0.0);                
+
+          for(j = 0; j < 4; j++)
+            {
+              x1v = _mm_load_pd(&x1[0]);
+              x2v = _mm_load_pd(&x2[j * 2]);
+              dv   = _mm_load_pd(&diagptable[j * 2]);
+              
+              x1v = _mm_mul_pd(x1v, x2v);
+              x1v = _mm_mul_pd(x1v, dv);
+              
+              termv = _mm_add_pd(termv, x1v);                 
+            }
+          
+          _mm_store_pd(t, termv);               
+          
+          if(fastScaling)
+            term = log(0.25 * (fabs(t[0] + t[1])));
+          else
+            term = log(0.25 * (fabs(t[0] + t[1]))) + (ex2[i] * log(PLL_MINLIKELIHOOD));       
+#else
+          for(j = 0, term = 0.0; j < 4; j++)
+            for(k = 0; k < 2; k++)
+              term += x1[k] * x2[j * 2 + k] * diagptable[j * 2 + k];                                                
+          
+          if(fastScaling)
+            term = log(0.25 * fabs(term));
+          else
+            term = log(0.25 * fabs(term)) + ex2[i] * log(PLL_MINLIKELIHOOD);
+#endif   
+          
+          sum += wptr[i] * term;
+        }         
+    }
+  else
+    {         
+      for (i = 0; i < n; i++) 
+        {
+#if (defined(__SSE3) || defined(__AVX))
+          double t[2] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+          __m128d termv, x1v, x2v, dv;
+#endif                            
+          x1 = &x1_start[8 * i];
+          x2 = &x2_start[8 * i];
+                  
+#if (defined(__SSE3) || defined(__AVX))
+          termv = _mm_set1_pd(0.0);                
+          
+          for(j = 0; j < 4; j++)
+            {
+              x1v = _mm_load_pd(&x1[j * 2]);
+              x2v = _mm_load_pd(&x2[j * 2]);
+              dv   = _mm_load_pd(&diagptable[j * 2]);
+              
+              x1v = _mm_mul_pd(x1v, x2v);
+              x1v = _mm_mul_pd(x1v, dv);
+              
+              termv = _mm_add_pd(termv, x1v);                 
+            }
+          
+          _mm_store_pd(t, termv);
+          
+          
+          if(fastScaling)
+            term = log(0.25 * (fabs(t[0] + t[1])));
+          else
+            term = log(0.25 * (fabs(t[0] + t[1]))) + ((ex1[i] +ex2[i]) * log(PLL_MINLIKELIHOOD));     
+#else     
+          for(j = 0, term = 0.0; j < 4; j++)
+            for(k = 0; k < 2; k++)
+              term += x1[j * 2 + k] * x2[j * 2 + k] * diagptable[j * 2 + k];                                          
+
+          if(fastScaling)
+            term = log(0.25 * fabs(term));
+          else
+            term = log(0.25 * fabs(term)) + (ex1[i] + ex2[i]) * log(PLL_MINLIKELIHOOD);
+#endif
+
+          sum += wptr[i] * term;
+        }                       
+    }
+
+  return sum;
+} 
+#endif
+
+
+
+#if (defined(__SSE3) || defined(__AVX))
+/* below are the optimized function versions with geeky intrinsics */
+
+/** @ingroup evaluateLikelihoodGroup
+    @brief Evaluation of log likelihood of a tree under the GAMMA model of rate heterogeneity and LG4 model of evolution
+    
+    This is the same as ::evaluateGAMMA_FLEX but for the LG4 model. It contains two implementations,
+    one which is the generic, and one that is optimized with SSE3 instructions. The two implementations
+    are separated by preprocessor macros.
+    The difference from ::evaluateGAMMA_FLEX is that we have 4 different tipVectors computed from the 4 different
+    Q matrix decompositions.
+    Please check ::evaluateGAMMA_FLEX for more information and a description of the common
+    input parameters.
+*/
+static double evaluateGTRGAMMAPROT_LG4(int *ex1, int *ex2, int *wptr,
+                                       double *x1, double *x2,  
+                                       double *tipVector[4], 
+                                       unsigned char *tipX1, int n, double *diagptable, const boolean fastScaling)
+{
+  double   sum = 0.0, term;        
+  int     i, j, l;   
+  double  *left, *right;              
+  
+  if(tipX1)
+    {               
+      for (i = 0; i < n; i++) 
+        {
+#if (defined(__SSE3) || defined(__AVX))
+          __m128d tv = _mm_setzero_pd();
+                                  
+          for(j = 0, term = 0.0; j < 4; j++)
+            {
+              double *d = &diagptable[j * 20];
+              left = &(tipVector[j][20 * tipX1[i]]);
+              right = &(x2[80 * i + 20 * j]);
+              for(l = 0; l < 20; l+=2)
+                {
+                  __m128d mul = _mm_mul_pd(_mm_load_pd(&left[l]), _mm_load_pd(&right[l]));
+                  tv = _mm_add_pd(tv, _mm_mul_pd(mul, _mm_load_pd(&d[l])));                
+                }                               
+            }
+          tv = _mm_hadd_pd(tv, tv);
+          _mm_storel_pd(&term, tv);
+          
+#else                             
+          for(j = 0, term = 0.0; j < 4; j++)
+            {
+              left = &(tipVector[j][20 * tipX1[i]]);
+              right = &(x2[80 * i + 20 * j]);
+              for(l = 0; l < 20; l++)
+                term += left[l] * right[l] * diagptable[j * 20 + l];          
+            }     
+#endif
+          
+          if(fastScaling)
+            term = log(0.25 * fabs(term));
+          else
+            term = log(0.25 * fabs(term)) + (ex2[i] * log(PLL_MINLIKELIHOOD));     
+          
+          sum += wptr[i] * term;
+        }               
+    }              
+  else
+    {
+      for (i = 0; i < n; i++) 
+        {                                    
+#if (defined(__SSE3) || defined(__AVX))
+          __m128d tv = _mm_setzero_pd();                          
+              
+          for(j = 0, term = 0.0; j < 4; j++)
+            {
+              double *d = &diagptable[j * 20];
+              left  = &(x1[80 * i + 20 * j]);
+              right = &(x2[80 * i + 20 * j]);
+              
+              for(l = 0; l < 20; l+=2)
+                {
+                  __m128d mul = _mm_mul_pd(_mm_load_pd(&left[l]), _mm_load_pd(&right[l]));
+                  tv = _mm_add_pd(tv, _mm_mul_pd(mul, _mm_load_pd(&d[l])));                
+                }                               
+            }
+          tv = _mm_hadd_pd(tv, tv);
+          _mm_storel_pd(&term, tv);       
+#else
+          for(j = 0, term = 0.0; j < 4; j++)
+            {
+              left  = &(x1[80 * i + 20 * j]);
+              right = &(x2[80 * i + 20 * j]);       
+              
+              for(l = 0; l < 20; l++)
+                term += left[l] * right[l] * diagptable[j * 20 + l];    
+            }
+#endif
+          
+          if(fastScaling)
+            term = log(0.25 * fabs(term));
+          else
+            term = log(0.25 * fabs(term)) + ((ex1[i] + ex2[i])*log(PLL_MINLIKELIHOOD));
+          
+          sum += wptr[i] * term;
+        }         
+    }
+       
+  return  sum;
+}
+
+/** @ingroup evaluateLikelihoodGroup
+    @brief Evaluation of log likelihood of a tree using the \b GAMMA model of rate heterogeneity 
+    and the memory saving technique (Optimized SSE3 version for AA data)
+ 
+    This is the SSE3 optimized version of ::evaluateGAMMA_FLEX_SAVE for evaluating the log
+    likelihood at some edge whose two end-points (nodes) have the conditional likelihood
+    vectors \a x1 and \a x2. Please check ::evaluateGAMMA_FLEX_SAVE for more information and
+    a description of the input parameters
+*/
+static double evaluateGTRGAMMAPROT_GAPPED_SAVE (const boolean fastScaling, int *ex1, int *ex2, int *wptr,
+                                                double *x1, double *x2,  
+                                                double *tipVector, 
+                                                unsigned char *tipX1, int n, double *diagptable, 
+                                                double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap)                                    
+{
+  double   sum = 0.0, term;        
+  int     i, j, l;   
+  double  
+    *left, 
+    *right,
+    *x1_ptr = x1,
+    *x2_ptr = x2,
+    *x1v,
+    *x2v;              
+
+  if(tipX1)
+  {               
+    for (i = 0; i < n; i++) 
+    {
+      if(x2_gap[i / 32] & mask32[i % 32])
+        x2v = x2_gapColumn;
+      else
+      {
+        x2v = x2_ptr;
+        x2_ptr += 80;
+      }
+
+      __m128d tv = _mm_setzero_pd();
+      left = &(tipVector[20 * tipX1[i]]);                 
+
+      for(j = 0, term = 0.0; j < 4; j++)
+      {
+        double *d = &diagptable[j * 20];
+        right = &(x2v[20 * j]);
+        for(l = 0; l < 20; l+=2)
+        {
+          __m128d mul = _mm_mul_pd(_mm_load_pd(&left[l]), _mm_load_pd(&right[l]));
+          tv = _mm_add_pd(tv, _mm_mul_pd(mul, _mm_load_pd(&d[l])));                
+        }                               
+      }
+
+      tv = _mm_hadd_pd(tv, tv);
+      _mm_storel_pd(&term, tv);
+
+
+      if(!fastScaling)
+        term = log(0.25 * fabs(term)) + (ex2[i] * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(0.25 * fabs(term));    
+
+      sum += wptr[i] * term;
+    }                   
+  }              
+  else
+  {
+    for (i = 0; i < n; i++) 
+    {
+      if(x1_gap[i / 32] & mask32[i % 32])
+        x1v = x1_gapColumn;
+      else
+      {
+        x1v = x1_ptr;
+        x1_ptr += 80;
+      }
+
+      if(x2_gap[i / 32] & mask32[i % 32])
+        x2v = x2_gapColumn;
+      else
+      {
+        x2v = x2_ptr;
+        x2_ptr += 80;
+      }
+
+      __m128d tv = _mm_setzero_pd();                      
+
+      for(j = 0, term = 0.0; j < 4; j++)
+      {
+        double *d = &diagptable[j * 20];
+        left  = &(x1v[20 * j]);
+        right = &(x2v[20 * j]);
+
+        for(l = 0; l < 20; l+=2)
+        {
+          __m128d mul = _mm_mul_pd(_mm_load_pd(&left[l]), _mm_load_pd(&right[l]));
+          tv = _mm_add_pd(tv, _mm_mul_pd(mul, _mm_load_pd(&d[l])));                
+        }                               
+      }
+      tv = _mm_hadd_pd(tv, tv);
+      _mm_storel_pd(&term, tv);   
+
+
+       if(!fastScaling)
+        term = log(0.25 * fabs(term)) + ((ex1[i] + ex2[i]) * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(0.25 * fabs(term));
+
+
+      sum += wptr[i] * term;
+    }         
+  }
+
+  return  sum;
+}
+
+
+
+/** @ingroup evaluateLikelihoodGroup
+    @brief Evaluation of log likelihood of a tree using the \b GAMMA model of rate heterogeneity 
+    (Optimized SSE3 version for AA data)
+ 
+    This is the SSE3 optimized version of ::evaluateGAMMA_FLEX for evaluating the log
+    likelihood at some edge whose two end-points (nodes) have the conditional likelihood
+    vectors \a x1 and \a x2. Please check ::evaluateGAMMA_FLEX for more information and
+    a description of the common input parameters
+*/
+static double evaluateGTRGAMMAPROT (const boolean fastScaling, int *ex1, int *ex2, int *wptr,
+                                    double *x1, double *x2,  
+                                    double *tipVector, 
+                                    unsigned char *tipX1, int n, double *diagptable)
+{
+  double   sum = 0.0, term;        
+  int     i, j, l;   
+  double  *left, *right;              
+
+  if(tipX1)
+  {               
+    for (i = 0; i < n; i++) 
+    {
+
+      __m128d tv = _mm_setzero_pd();
+      left = &(tipVector[20 * tipX1[i]]);                 
+
+      for(j = 0, term = 0.0; j < 4; j++)
+      {
+        double *d = &diagptable[j * 20];
+        right = &(x2[80 * i + 20 * j]);
+        for(l = 0; l < 20; l+=2)
+        {
+          __m128d mul = _mm_mul_pd(_mm_load_pd(&left[l]), _mm_load_pd(&right[l]));
+          tv = _mm_add_pd(tv, _mm_mul_pd(mul, _mm_load_pd(&d[l])));                
+        }                               
+      }
+      tv = _mm_hadd_pd(tv, tv);
+      _mm_storel_pd(&term, tv);
+
+
+      if(!fastScaling)
+        term = log(0.25 * fabs(term)) + (ex2[i] * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(0.25 * fabs(term));
+
+
+      sum += wptr[i] * term;
+    }                   
+  }              
+  else
+  {
+    for (i = 0; i < n; i++) 
+    {                                
+      __m128d tv = _mm_setzero_pd();                      
+
+      for(j = 0, term = 0.0; j < 4; j++)
+      {
+        double *d = &diagptable[j * 20];
+        left  = &(x1[80 * i + 20 * j]);
+        right = &(x2[80 * i + 20 * j]);
+
+        for(l = 0; l < 20; l+=2)
+        {
+          __m128d mul = _mm_mul_pd(_mm_load_pd(&left[l]), _mm_load_pd(&right[l]));
+          tv = _mm_add_pd(tv, _mm_mul_pd(mul, _mm_load_pd(&d[l])));                
+        }                               
+      }
+      tv = _mm_hadd_pd(tv, tv);
+      _mm_storel_pd(&term, tv);   
+
+
+       if(!fastScaling)
+        term = log(0.25 * fabs(term)) + ((ex1[i] + ex2[i]) * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(0.25 * fabs(term));
+
+
+      sum += wptr[i] * term;
+    }
+  }
+
+  return  sum;
+}
+
+
+/** @ingroup evaluateLikelihoodGroup
+    @brief Evaluation of log likelihood of a tree using the \b CAT model of rate heterogeneity 
+    (Optimized SSE3 version for AA data)
+ 
+    This is the SSE3 optimized version of ::evaluateCAT_FLEX for evaluating the log
+    likelihood at some edge whose two end-points (nodes) have the conditional likelihood
+    vectors \a x1 and \a x2. Please check ::evaluateCAT_FLEX for more information and
+    a description of the common input parameters
+*/
+static double evaluateGTRCATPROT (const boolean fastScaling, int *ex1, int *ex2, int *cptr, int *wptr,
+                                  double *x1, double *x2, double *tipVector,
+                                  unsigned char *tipX1, int n, double *diagptable_start)
+{
+  double   sum = 0.0, term;
+  double  *diagptable,  *left, *right;
+  int     i, l;                           
+
+  if(tipX1)
+  {                 
+    for (i = 0; i < n; i++) 
+    {           
+      left = &(tipVector[20 * tipX1[i]]);
+      right = &(x2[20 * i]);
+
+      diagptable = &diagptable_start[20 * cptr[i]];                      
+
+      __m128d tv = _mm_setzero_pd();        
+
+      for(l = 0; l < 20; l+=2)
+      {
+        __m128d lv = _mm_load_pd(&left[l]);
+        __m128d rv = _mm_load_pd(&right[l]);
+        __m128d mul = _mm_mul_pd(lv, rv);
+        __m128d dv = _mm_load_pd(&diagptable[l]);
+
+        tv = _mm_add_pd(tv, _mm_mul_pd(mul, dv));                  
+      }                         
+
+      tv = _mm_hadd_pd(tv, tv);
+      _mm_storel_pd(&term, tv);
+
+      if(!fastScaling)
+        term = log(fabs(term)) + (ex2[i] * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(fabs(term));
+
+      sum += wptr[i] * term;
+    }      
+  }    
+  else
+  {
+
+    for (i = 0; i < n; i++) 
+    {                                 
+      left  = &x1[20 * i];
+      right = &x2[20 * i];
+
+      diagptable = &diagptable_start[20 * cptr[i]];             
+
+      __m128d tv = _mm_setzero_pd();        
+
+      for(l = 0; l < 20; l+=2)
+      {
+        __m128d lv = _mm_load_pd(&left[l]);
+        __m128d rv = _mm_load_pd(&right[l]);
+        __m128d mul = _mm_mul_pd(lv, rv);
+        __m128d dv = _mm_load_pd(&diagptable[l]);
+
+        tv = _mm_add_pd(tv, _mm_mul_pd(mul, dv));                  
+      }                         
+
+      tv = _mm_hadd_pd(tv, tv);
+      _mm_storel_pd(&term, tv);
+
+      if(!fastScaling)
+        term = log(fabs(term)) + ((ex1[i] + ex2[i]) * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(fabs(term));  
+
+      sum += wptr[i] * term;      
+    }
+  }
+
+  return  sum;         
+} 
+
+
+/** @ingroup evaluateLikelihoodGroup
+    @brief Evaluation of log likelihood of a tree using the \b CAT model of rate heterogeneity with memory saving 
+    (Optimized SSE3 version for AA data)
+ 
+    This is the SSE3 optimized version of ::evaluateCAT_FLEX_SAVE for evaluating the log
+    likelihood at some edge whose two end-points (nodes) have the conditional likelihood
+    vectors \a x1 and \a x2. Please check ::evaluateCAT_FLEX_SAVE for more information and
+    a description of the common input parameters
+*/
+static double evaluateGTRCATPROT_SAVE (const boolean fastScaling, int *ex1, int *ex2, int *cptr, int *wptr,
+                                       double *x1, double *x2, double *tipVector,
+                                       unsigned char *tipX1, int n, double *diagptable_start, 
+                                       double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap)
+{
+  double   
+    sum = 0.0, 
+        term,
+        *diagptable,  
+        *left, 
+        *right,
+        *left_ptr = x1,
+        *right_ptr = x2;
+
+  int     
+    i, 
+    l;                           
+
+  if(tipX1)
+  {                 
+    for (i = 0; i < n; i++) 
+    {           
+      left = &(tipVector[20 * tipX1[i]]);
+
+      if(isGap(x2_gap, i))
+        right = x2_gapColumn;
+      else
+      {
+        right = right_ptr;
+        right_ptr += 20;
+      }          
+
+      diagptable = &diagptable_start[20 * cptr[i]];                      
+
+      __m128d tv = _mm_setzero_pd();        
+
+      for(l = 0; l < 20; l+=2)
+      {
+        __m128d lv = _mm_load_pd(&left[l]);
+        __m128d rv = _mm_load_pd(&right[l]);
+        __m128d mul = _mm_mul_pd(lv, rv);
+        __m128d dv = _mm_load_pd(&diagptable[l]);
+
+        tv = _mm_add_pd(tv, _mm_mul_pd(mul, dv));                  
+      }                         
+
+      tv = _mm_hadd_pd(tv, tv);
+      _mm_storel_pd(&term, tv);
+
+      if(!fastScaling)
+        term = log(fabs(term)) + (ex2[i] * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(fabs(term));
+
+      sum += wptr[i] * term;
+    }      
+  }    
+  else
+  {
+
+    for (i = 0; i < n; i++) 
+    {                                     
+      if(isGap(x1_gap, i))
+        left = x1_gapColumn;
+      else
+      {
+        left = left_ptr;
+        left_ptr += 20;
+      }
+
+      if(isGap(x2_gap, i))
+        right = x2_gapColumn;
+      else
+      {
+        right = right_ptr;
+        right_ptr += 20;
+      }
+
+      diagptable = &diagptable_start[20 * cptr[i]];             
+
+      __m128d tv = _mm_setzero_pd();        
+
+      for(l = 0; l < 20; l+=2)
+      {
+        __m128d lv = _mm_load_pd(&left[l]);
+        __m128d rv = _mm_load_pd(&right[l]);
+        __m128d mul = _mm_mul_pd(lv, rv);
+        __m128d dv = _mm_load_pd(&diagptable[l]);
+
+        tv = _mm_add_pd(tv, _mm_mul_pd(mul, dv));                  
+      }                         
+
+      tv = _mm_hadd_pd(tv, tv);
+      _mm_storel_pd(&term, tv);
+
+      if(!fastScaling)
+        term = log(fabs(term)) + ((ex1[i] + ex2[i]) * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(fabs(term));  
+
+      sum += wptr[i] * term;      
+    }
+  }
+
+  return  sum;         
+} 
+
+
+/** @ingroup evaluateLikelihoodGroup
+    @brief Evaluation of log likelihood of a tree using the \b CAT model of rate heterogeneity with memory saving 
+    (Optimized SSE3 version for DNA data)
+ 
+    This is the SSE3 optimized version of ::evaluateCAT_FLEX_SAVE for evaluating the log
+    likelihood at some edge whose two end-points (nodes) have the conditional likelihood
+    vectors \a x1 and \a x2. Please check ::evaluateCAT_FLEX_SAVE for more information and
+    a description of the common input parameters
+*/
+static double evaluateGTRCAT_SAVE (const boolean fastScaling, int *ex1, int *ex2, int *cptr, int *wptr,
+                                   double *x1_start, double *x2_start, double *tipVector,                     
+                                   unsigned char *tipX1, int n, double *diagptable_start,
+                                   double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap)
+{
+  double  sum = 0.0, term;       
+  int     i;
+
+  double  *diagptable, 
+          *x1, 
+          *x2,
+          *x1_ptr = x1_start,
+          *x2_ptr = x2_start;
+
+  if(tipX1)
+  {           
+    for (i = 0; i < n; i++) 
+    {   
+      double t[2] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+      __m128d x1v1, x1v2, x2v1, x2v2, dv1, dv2;
+
+      x1 = &(tipVector[4 * tipX1[i]]);
+
+      if(isGap(x2_gap, i))
+        x2 = x2_gapColumn;
+      else
+      {
+        x2 = x2_ptr;
+        x2_ptr += 4;
+      }
+
+      diagptable = &diagptable_start[4 * cptr[i]];
+
+      x1v1 =  _mm_load_pd(&x1[0]);
+      x1v2 =  _mm_load_pd(&x1[2]);
+      x2v1 =  _mm_load_pd(&x2[0]);
+      x2v2 =  _mm_load_pd(&x2[2]);
+      dv1  =  _mm_load_pd(&diagptable[0]);
+      dv2  =  _mm_load_pd(&diagptable[2]);
+
+      x1v1 = _mm_mul_pd(x1v1, x2v1);
+      x1v1 = _mm_mul_pd(x1v1, dv1);
+
+      x1v2 = _mm_mul_pd(x1v2, x2v2);
+      x1v2 = _mm_mul_pd(x1v2, dv2);
+
+      x1v1 = _mm_add_pd(x1v1, x1v2);
+
+      _mm_store_pd(t, x1v1);
+
+      if(!fastScaling)
+        term = log(fabs(t[0] + t[1])) + (ex2[i] * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(fabs(t[0] + t[1]));
+
+
+
+      sum += wptr[i] * term;
+    }   
+  }               
+  else
+  {
+    for (i = 0; i < n; i++) 
+    { 
+      double t[2] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+      __m128d x1v1, x1v2, x2v1, x2v2, dv1, dv2;
+
+      if(isGap(x1_gap, i))
+        x1 = x1_gapColumn;
+      else
+      {
+        x1 = x1_ptr;
+        x1_ptr += 4;
+      }
+
+      if(isGap(x2_gap, i))
+        x2 = x2_gapColumn;
+      else
+      {
+        x2 = x2_ptr;
+        x2_ptr += 4;
+      }
+
+      diagptable = &diagptable_start[4 * cptr[i]];      
+
+      x1v1 =  _mm_load_pd(&x1[0]);
+      x1v2 =  _mm_load_pd(&x1[2]);
+      x2v1 =  _mm_load_pd(&x2[0]);
+      x2v2 =  _mm_load_pd(&x2[2]);
+      dv1  =  _mm_load_pd(&diagptable[0]);
+      dv2  =  _mm_load_pd(&diagptable[2]);
+
+      x1v1 = _mm_mul_pd(x1v1, x2v1);
+      x1v1 = _mm_mul_pd(x1v1, dv1);
+
+      x1v2 = _mm_mul_pd(x1v2, x2v2);
+      x1v2 = _mm_mul_pd(x1v2, dv2);
+
+      x1v1 = _mm_add_pd(x1v1, x1v2);
+
+      _mm_store_pd(t, x1v1);
+
+
+       if(!fastScaling)
+        term = log(fabs(t[0] + t[1])) + ((ex1[i] + ex2[i]) * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(fabs(t[0] + t[1]));
+
+      sum += wptr[i] * term;
+    }    
+  }
+
+  return  sum;         
+} 
+
+
+/** @ingroup evaluateLikelihoodGroup
+    @brief Evaluation of log likelihood of a tree using the \b GAMMA model of rate heterogeneity with memory saving 
+    (Optimized SSE3 version for DNA data)
+ 
+    This is the SSE3 optimized version of ::evaluateGAMMA_FLEX_SAVE for evaluating the log
+    likelihood at some edge whose two end-points (nodes) have the conditional likelihood
+    vectors \a x1 and \a x2. Please check ::evaluateGAMMA_FLEX_SAVE for more information and
+    a description of the common input parameters
+*/
+static double evaluateGTRGAMMA_GAPPED_SAVE(const boolean fastScaling, int *ex1, int *ex2, int *wptr,
+                                           double *x1_start, double *x2_start, 
+                                           double *tipVector, 
+                                           unsigned char *tipX1, const int n, double *diagptable,
+                                           double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap)
+{
+  double   sum = 0.0, term;    
+  int     i, j;
+  double  
+    *x1, 
+    *x2,
+    *x1_ptr = x1_start,
+    *x2_ptr = x2_start;
+
+
+
+  if(tipX1)
+  {        
+
+
+    for (i = 0; i < n; i++)
+    {
+      double t[2] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+      __m128d termv, x1v, x2v, dv;
+
+      x1 = &(tipVector[4 * tipX1[i]]);   
+      if(x2_gap[i / 32] & mask32[i % 32])
+        x2 = x2_gapColumn;
+      else
+      {
+        x2 = x2_ptr;     
+        x2_ptr += 16;
+      }
+
+
+      termv = _mm_set1_pd(0.0);            
+
+      for(j = 0; j < 4; j++)
+      {
+        x1v = _mm_load_pd(&x1[0]);
+        x2v = _mm_load_pd(&x2[j * 4]);
+        dv   = _mm_load_pd(&diagptable[j * 4]);
+
+        x1v = _mm_mul_pd(x1v, x2v);
+        x1v = _mm_mul_pd(x1v, dv);
+
+        termv = _mm_add_pd(termv, x1v);
+
+        x1v = _mm_load_pd(&x1[2]);
+        x2v = _mm_load_pd(&x2[j * 4 + 2]);
+        dv   = _mm_load_pd(&diagptable[j * 4 + 2]);
+
+        x1v = _mm_mul_pd(x1v, x2v);
+        x1v = _mm_mul_pd(x1v, dv);
+
+        termv = _mm_add_pd(termv, x1v);
+      }
+
+      _mm_store_pd(t, termv);            
+
+       if(!fastScaling)
+        term = log(0.25 * fabs(t[0] + t[1])) + (ex2[i] * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(0.25 * fabs(t[0] + t[1]));
+
+
+      sum += wptr[i] * term;
+    }     
+  }
+  else
+  {        
+
+    for (i = 0; i < n; i++) 
+    {
+
+      double t[2] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+      __m128d termv, x1v, x2v, dv;
+
+      if(x1_gap[i / 32] & mask32[i % 32])
+        x1 = x1_gapColumn;
+      else
+      {
+        x1 = x1_ptr;              
+        x1_ptr += 16;
+      }
+
+      if(x2_gap[i / 32] & mask32[i % 32])
+        x2 = x2_gapColumn;
+      else
+      {
+        x2 = x2_ptr;
+        x2_ptr += 16;
+      }
+
+      termv = _mm_set1_pd(0.0);          
+
+      for(j = 0; j < 4; j++)
+      {
+        x1v = _mm_load_pd(&x1[j * 4]);
+        x2v = _mm_load_pd(&x2[j * 4]);
+        dv   = _mm_load_pd(&diagptable[j * 4]);
+
+        x1v = _mm_mul_pd(x1v, x2v);
+        x1v = _mm_mul_pd(x1v, dv);
+
+        termv = _mm_add_pd(termv, x1v);
+
+        x1v = _mm_load_pd(&x1[j * 4 + 2]);
+        x2v = _mm_load_pd(&x2[j * 4 + 2]);
+        dv   = _mm_load_pd(&diagptable[j * 4 + 2]);
+
+        x1v = _mm_mul_pd(x1v, x2v);
+        x1v = _mm_mul_pd(x1v, dv);
+
+        termv = _mm_add_pd(termv, x1v);
+      }
+
+      _mm_store_pd(t, termv);
+
+      if(!fastScaling)
+        term = log(0.25 * fabs(t[0] + t[1])) + ((ex1[i] + ex2[i]) * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(0.25 * fabs(t[0] + t[1]));
+
+
+      sum += wptr[i] * term;
+    }                           
+  }
+
+  return sum;
+} 
+
+
+/** @ingroup evaluateLikelihoodGroup
+    @brief Evaluation of log likelihood of a tree using the \b GAMMA model of rate heterogeneity (Optimized SSE3 version for DNA data)
+ 
+    This is the SSE3 optimized version of ::evaluateGAMMA_FLEX for evaluating the log
+    likelihood at some edge whose two end-points (nodes) have the conditional likelihood
+    vectors \a x1 and \a x2. Please check ::evaluateGAMMA_FLEX for more information and
+    a description of the common input parameters
+*/
+static double evaluateGTRGAMMA(const boolean fastScaling, int *ex1, int *ex2, int *wptr,
+                               double *x1_start, double *x2_start, 
+                               double *tipVector, 
+                               unsigned char *tipX1, const int n, double *diagptable)
+{
+  double   sum = 0.0, term;    
+  int     i, j;
+
+  double  *x1, *x2;             
+
+
+
+  if(tipX1)
+  {             
+    for (i = 0; i < n; i++)
+    {
+
+      double t[2] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+      __m128d termv, x1v, x2v, dv;
+
+      x1 = &(tipVector[4 * tipX1[i]]);   
+      x2 = &x2_start[16 * i];    
+
+
+      termv = _mm_set1_pd(0.0);            
+
+      for(j = 0; j < 4; j++)
+      {
+        x1v = _mm_load_pd(&x1[0]);
+        x2v = _mm_load_pd(&x2[j * 4]);
+        dv   = _mm_load_pd(&diagptable[j * 4]);
+
+        x1v = _mm_mul_pd(x1v, x2v);
+        x1v = _mm_mul_pd(x1v, dv);
+
+        termv = _mm_add_pd(termv, x1v);
+
+        x1v = _mm_load_pd(&x1[2]);
+        x2v = _mm_load_pd(&x2[j * 4 + 2]);
+        dv   = _mm_load_pd(&diagptable[j * 4 + 2]);
+
+        x1v = _mm_mul_pd(x1v, x2v);
+        x1v = _mm_mul_pd(x1v, dv);
+
+        termv = _mm_add_pd(termv, x1v);
+      }
+
+      _mm_store_pd(t, termv);
+
+
+       if(!fastScaling)
+        term = log(0.25 * fabs(t[0] + t[1])) + (ex2[i] * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(0.25 * fabs(t[0] + t[1]));
+
+
+
+      sum += wptr[i] * term;
+    }     
+  }
+  else
+  {        
+    for (i = 0; i < n; i++) 
+    {
+
+      double t[2] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+      __m128d termv, x1v, x2v, dv;
+
+
+      x1 = &x1_start[16 * i];
+      x2 = &x2_start[16 * i];             
+
+
+      termv = _mm_set1_pd(0.0);          
+
+      for(j = 0; j < 4; j++)
+      {
+        x1v = _mm_load_pd(&x1[j * 4]);
+        x2v = _mm_load_pd(&x2[j * 4]);
+        dv   = _mm_load_pd(&diagptable[j * 4]);
+
+        x1v = _mm_mul_pd(x1v, x2v);
+        x1v = _mm_mul_pd(x1v, dv);
+
+        termv = _mm_add_pd(termv, x1v);
+
+        x1v = _mm_load_pd(&x1[j * 4 + 2]);
+        x2v = _mm_load_pd(&x2[j * 4 + 2]);
+        dv   = _mm_load_pd(&diagptable[j * 4 + 2]);
+
+        x1v = _mm_mul_pd(x1v, x2v);
+        x1v = _mm_mul_pd(x1v, dv);
+
+        termv = _mm_add_pd(termv, x1v);
+      }
+
+      _mm_store_pd(t, termv);
+
+      if(!fastScaling)
+        term = log(0.25 * fabs(t[0] + t[1])) + ((ex1[i] + ex2[i]) * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(0.25 * fabs(t[0] + t[1]));
+
+
+
+      sum += wptr[i] * term;
+    }                           
+  }
+
+  return sum;
+} 
+
+
+/** @ingroup evaluateLikelihoodGroup
+    @brief Evaluation of log likelihood of a tree using the \b CAT model of rate heterogeneity (Optimized SSE3 version for DNA data)
+ 
+    This is the SSE3 optimized version of ::evaluateCAT_FLEX for evaluating the log
+    likelihood at some edge whose two end-points (nodes) have the conditional likelihood
+    vectors \a x1 and \a x2. Please check ::evaluateCAT_FLEX for more information and
+    a description of the common input parameters
+*/
+static double evaluateGTRCAT (const boolean fastScaling, int *ex1, int *ex2, int *cptr, int *wptr,
+                              double *x1_start, double *x2_start, double *tipVector,                  
+                              unsigned char *tipX1, int n, double *diagptable_start)
+{
+  double  sum = 0.0, term;       
+  int     i;
+
+  double  *diagptable, *x1, *x2;                            
+
+  if(tipX1)
+  {           
+    for (i = 0; i < n; i++) 
+    {   
+
+      double t[2] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+      __m128d x1v1, x1v2, x2v1, x2v2, dv1, dv2;
+
+      x1 = &(tipVector[4 * tipX1[i]]);
+      x2 = &x2_start[4 * i];
+
+      diagptable = &diagptable_start[4 * cptr[i]];
+
+
+      x1v1 =  _mm_load_pd(&x1[0]);
+      x1v2 =  _mm_load_pd(&x1[2]);
+      x2v1 =  _mm_load_pd(&x2[0]);
+      x2v2 =  _mm_load_pd(&x2[2]);
+      dv1  =  _mm_load_pd(&diagptable[0]);
+      dv2  =  _mm_load_pd(&diagptable[2]);
+
+      x1v1 = _mm_mul_pd(x1v1, x2v1);
+      x1v1 = _mm_mul_pd(x1v1, dv1);
+
+      x1v2 = _mm_mul_pd(x1v2, x2v2);
+      x1v2 = _mm_mul_pd(x1v2, dv2);
+
+      x1v1 = _mm_add_pd(x1v1, x1v2);
+
+      _mm_store_pd(t, x1v1);
+
+       if(!fastScaling)
+        term = log(fabs(t[0] + t[1])) + (ex2[i] * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(fabs(t[0] + t[1]));
+
+
+      sum += wptr[i] * term;
+    }   
+  }               
+  else
+  {
+    for (i = 0; i < n; i++) 
+    { 
+
+      double t[2] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+      __m128d x1v1, x1v2, x2v1, x2v2, dv1, dv2;
+
+      x1 = &x1_start[4 * i];
+      x2 = &x2_start[4 * i];
+
+      diagptable = &diagptable_start[4 * cptr[i]];      
+
+
+      x1v1 =  _mm_load_pd(&x1[0]);
+      x1v2 =  _mm_load_pd(&x1[2]);
+      x2v1 =  _mm_load_pd(&x2[0]);
+      x2v2 =  _mm_load_pd(&x2[2]);
+      dv1  =  _mm_load_pd(&diagptable[0]);
+      dv2  =  _mm_load_pd(&diagptable[2]);
+
+      x1v1 = _mm_mul_pd(x1v1, x2v1);
+      x1v1 = _mm_mul_pd(x1v1, dv1);
+
+      x1v2 = _mm_mul_pd(x1v2, x2v2);
+      x1v2 = _mm_mul_pd(x1v2, dv2);
+
+      x1v1 = _mm_add_pd(x1v1, x1v2);
+
+      _mm_store_pd(t, x1v1);
+
+      if(!fastScaling)
+        term = log(fabs(t[0] + t[1])) + ((ex1[i] + ex2[i]) * log(PLL_MINLIKELIHOOD));
+      else
+        term = log(fabs(t[0] + t[1]));
+
+
+      sum += wptr[i] * term;
+    }    
+  }
+
+  return  sum;         
+} 
+
+
+
+
+
+#endif
diff --git a/lib/pll/evaluatePartialGenericSpecial.c b/lib/pll/evaluatePartialGenericSpecial.c
new file mode 100644
index 0000000..f41c7d7
--- /dev/null
+++ b/lib/pll/evaluatePartialGenericSpecial.c
@@ -0,0 +1,1225 @@
+/*  RAxML-VI-HPC (version 2.2) a program for sequential and parallel estimation of phylogenetic trees 
+ *  Copyright August 2006 by Alexandros Stamatakis
+ *
+ *  Partially derived from
+ *  fastDNAml, a program for estimation of phylogenetic trees from sequences by Gary J. Olsen
+ *  
+ *  and 
+ *
+ *  Programs of the PHYLIP package by Joe Felsenstein.
+ 
+ *  This program is free software; you may redistribute it and/or modify its
+ *  under the terms of the GNU General Public License as published by the Free
+ *  Software Foundation; either version 2 of the License, or (at your option)
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ *  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  for more details.
+ * 
+ *
+ *  For any other enquiries send an Email to Alexandros Stamatakis
+ *  Alexandros.Stamatakis at epfl.ch
+ *
+ *  When publishing work that is based on the results from RAxML-VI-HPC please cite:
+ *
+ *  Alexandros Stamatakis:"RAxML-VI-HPC: maximum likelihood-based phylogenetic analyses with thousands of taxa and mixed models". 
+ *  Bioinformatics 2006; doi: 10.1093/bioinformatics/btl446
+ */
+
+#include "mem_alloc.h"
+
+#ifndef WIN32 
+#include <unistd.h>
+#endif
+
+#include <math.h>
+#include <time.h> 
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+#include "pll.h"
+#include "pllInternal.h"
+
+#ifdef __SSE3
+#include <xmmintrin.h>
+#include <pmmintrin.h>
+#endif
+
+
+/* optimized implementation for computing per-site log likelihoods under CAT and GAMMA for DNA and protein data */
+
+#if (defined(__SSE3) || defined(__AVX))
+static inline void computeVectorGTRCATPROT(double *lVector, int *eVector, double ki, int i, double qz, double rz,
+					   traversalInfo *ti, double *EIGN, double *EI, double *EV, double *tipVector, 
+					   unsigned  char **yVector, int mxtips);
+
+static double evaluatePartialGTRCATPROT(int i, double ki, int counter,  traversalInfo *ti, double qz,
+					int w, double *EIGN, double *EI, double *EV,
+					double *tipVector, unsigned char **yVector, 
+					int branchReference, int mxtips);
+
+static inline void computeVectorGTRGAMMAPROT(double *lVector, int *eVector, double *gammaRates, int i, double qz, double rz,
+					     traversalInfo *ti, double *EIGN, double *EI, double *EV, double *tipVector, 
+					     unsigned  char **yVector, int mxtips);
+
+static double evaluatePartialGTRGAMMAPROT(int i, int counter,  traversalInfo *ti, double qz,
+					  int w, double *EIGN, double *EI, double *EV,
+					  double *tipVector, unsigned char **yVector, 
+					  double *gammaRates,
+					  int branchReference, int mxtips);
+
+static inline void computeVectorGTRCAT(double *lVector, int *eVector, double ki, int i, double qz, double rz,
+				       traversalInfo *ti, double *EIGN, double *EI, double *EV, double *tipVector, 
+				       unsigned char **yVector, int mxtips);
+
+static double evaluatePartialGTRCAT(int i, double ki, int counter,  traversalInfo *ti, double qz,
+				    int w, double *EIGN, double *EI, double *EV,
+				    double *tipVector, unsigned  char **yVector, 
+				    int branchReference, int mxtips);
+
+static double evaluatePartialGTRGAMMA(int i, int counter,  traversalInfo *ti, double qz,
+				      int w, double *EIGN, double *EI, double *EV,
+				      double *tipVector, unsigned char **yVector, 
+				      double *gammaRates,
+				      int branchReference, int mxtips);
+#endif
+
+/* the next two functions are generic non-optimized versions of the per-site log likelihood calculations,
+   but only under the CAT model. There are no generic implementations available for GAMMA yet, since 
+   these functions were not needed in RAxML. However there exist optimized functions for GAMMA further below.
+   The only use of the CAT functions was to optimize per-site rates based on their likelihood for the CAT 
+   model of rate heterogeneity. */
+
+
+static inline void computeVectorCAT_FLEX(double *lVector, int *eVector, double ki, int i, double qz, double rz,
+					 traversalInfo *ti, double *EIGN, double *EI, double *EV, double *tipVector, 
+					 unsigned char **yVector, int mxtips, const int states)
+{      
+  /* allocate some space we need */
+ 
+  double  
+    *d1 =    (double *)rax_malloc(sizeof(double) * states), 
+    *d2 =    (double *)rax_malloc(sizeof(double) * states),  
+    *x1px2 = (double *)rax_malloc(sizeof(double) * states), 
+    ump_x1, 
+    ump_x2,    
+    lz1, 
+    lz2,
+    *x1, 
+    *x2, 
+    *x3;
+  
+  int 
+    scale,
+    j, 
+    k,
+    pNumber = ti->pNumber,
+    rNumber = ti->rNumber,
+    qNumber = ti->qNumber;
+ 
+  /* 
+     lVector holds the space for computing ancestral probablities on a single column of the tree 
+     hence under CAT we index the current space required to store the parent ancestral probability vector 
+     by multiplying the number of states with the offset in the array given by the inner node number
+   */
+
+  x3  = &lVector[states * (pNumber  - mxtips)];  
+ 
+  /* do a case switch to figure out how to index the child nodes x1 and x2,
+     analogous to the standard newview implementation.
+     Note the index i that we use to index the specific tip poistion/index 
+     for which we want to compute the per-site log likelihood */
+
+  switch(ti->tipCase)
+    {
+    case PLL_TIP_TIP:     
+      x1 = &(tipVector[states * yVector[qNumber][i]]);
+      x2 = &(tipVector[states * yVector[rNumber][i]]);    
+      break;
+    case PLL_TIP_INNER:     
+      x1 = &(tipVector[states * yVector[qNumber][i]]);
+      x2 = &(lVector[states * (rNumber - mxtips)]);           
+      break;
+    case PLL_INNER_INNER:            
+      x1 = &(lVector[states * (qNumber - mxtips)]);
+      x2 = &(lVector[states * (rNumber - mxtips)]);     
+      break;
+    default:
+      assert(0);
+    }
+     
+  /* multiply the branch lengths with the evolutionary rate */
+
+  lz1 = qz * ki;  
+  lz2 = rz * ki;
+  
+
+  /* exponentiate the branch lengths using the eigenvalues */
+
+  d1[0] = x1[0];
+  d2[0] = x2[0];
+
+
+  for(j = 1; j < states; j++)
+    {
+      d1[j] = x1[j] * exp(EIGN[j] * lz1);
+      d2[j] = x2[j] * exp(EIGN[j] * lz2);	    
+    }
+ 
+ 
+  /* now loop over all states */
+
+  for(j = 0; j < states; j++)
+    {         
+      ump_x1 = 0.0;
+      ump_x2 = 0.0;
+
+      for(k = 0; k < states; k++)
+	{
+	  ump_x1 += d1[k] * EI[j * states + k];
+	  ump_x2 += d2[k] * EI[j * states + k];
+	}
+      
+      x1px2[j] = ump_x1 * ump_x2;
+    }
+  
+  for(j = 0; j < states; j++)
+    x3[j] = 0.0;
+
+  /* multiply the result of looping over all states with the eigenvector matrix EV */
+
+  for(j = 0; j < states; j++)          
+    for(k = 0; k < states; k++)	
+      x3[k] +=  x1px2[j] *  EV[states * j + k];	   
+      
+  /* now determine if we need to scale the #states entries in x[3] to avoid 
+     numerical underflow. */
+     
+
+  scale = 1;
+  for(j = 0; scale && (j < states); j++)
+    scale = ((x3[j] < PLL_MINLIKELIHOOD) && (x3[j] > PLL_MINUSMINLIKELIHOOD));
+  
+  /* if we need to scale, we multiply all probabilities of the site with 2^256 
+     and increment the scaling counter by 1. 
+     The counter eVector is used for tracking/counting the number of scaling events 
+     at the site i for which we are computing the per-site log likelihood such that 
+     we can "undo" the scaling multiplications when we compute the log likelihood of the site 
+     at the virtual root */
+  
+  if(scale)
+    {
+      for(j = 0; j < states; j++)
+	x3[j] *= PLL_TWOTOTHE256;       
+      *eVector = *eVector + 1;
+    }	              
+
+  rax_free(d1);
+  rax_free(d2);
+  rax_free(x1px2);
+       
+  return;
+}
+
+
+/* the following function computes the per-site log likelihood of a given site i at the virtual root of the tree.
+   as input it takes the indeix i, of the site, the evolutionary rate ki (for computing Q^(rt) where r = ki) 
+   the traversalDescriptor defining the full tree traversal (felsenstein pruning algo) 
+   the branch length at the root qz, the weigth of the site pattern w, i.e., how many identical sites have been compressed 
+   into the current site pattern, the eigenvalues etc (EIGN, EI, EV) associated to the Eigenvector/Eigenvalue decomposition 
+   of the given instataneous substitution matrix Q, the tipVector lookup table for obtaining tip probability vectors, 
+   a pointer to the raw sequence data at the tips, a branch index (to get the correct branch length/index into the correct branch 
+   if -M is used, i.e., a per-partition branch length estimate is deployed, and finally the maximum number of tips in the comprehensive tree 
+   as well as the number of states in the current model. */
+
+#if (!defined(__SSE3) && !defined(__AVX))
+static double evaluatePartialCAT_FLEX(int i, double ki, int counter,  traversalInfo *ti, double qz,
+				      int w, double *EIGN, double *EI, double *EV,
+				      double *tipVector, unsigned  char **yVector, 
+				      int branchReference, int mxtips, const int states)
+{
+  int 
+    scale = 0, 
+    k;
+  
+  double 
+    /* lVector is a temporary buffer to store the ancestral probability vactors of 
+       a single site, thus we allocate states * mxtips space for storing probability values.
+       Essentially  only (states * (mxtips - 2)) space would be required, but I was to lazy 
+       to think if it has to be -1 or -2 here */
+    * lVector = NULL,   
+    * d = NULL,
+    lz, 
+    term, 
+    *x1, 
+    *x2; 
+
+  
+
+  traversalInfo 
+    *trav = &ti[0];
+ 
+  rax_posix_memalign ((void **)&lVector, PLL_BYTE_ALIGNMENT, sizeof(double) * states * mxtips);
+  rax_posix_memalign ((void **)&d,       PLL_BYTE_ALIGNMENT, sizeof(double) * states);
+  /* make sure that at one end of the branch into which we have placed the virtual root 
+     there actually is a tip!*/
+
+  assert(isTip(trav->pNumber, mxtips));
+     
+  /* for the tip we alread have the data, so just set the left probability vector to the 
+     corresponding address in the pre-computed tipVector[] lookup table */
+
+  x1 = &(tipVector[states *  yVector[trav->pNumber][i]]);   
+
+  /* now iterate over the traversal descriptor that contains the nodes of the tree in the order required 
+     by the Felsenstein pruning algorithm */
+
+  for(k = 1; k < counter; k++)    
+    {
+      /* obtain the branch lengths and take the logarithms */
+      
+      double 
+	qz = ti[k].qz[branchReference],
+	rz = ti[k].rz[branchReference];
+      
+      qz = (qz > PLL_ZMIN) ? log(qz) : log(PLL_ZMIN);
+      rz = (rz > PLL_ZMIN) ? log(rz) : log(PLL_ZMIN);
+
+      /* invoke essentially a newview() for one site on the entry k of the traversal descriptor.
+	 counter should always correspond to the number of inner nodes in the tree for which we need
+	 to compute ancestral probability values */
+
+      computeVectorCAT_FLEX(lVector, &scale, ki, i, qz, rz, &ti[k], 
+			    EIGN, EI, EV, 
+			    tipVector, yVector, mxtips, states);       
+    }
+   
+  /* now the ancestral probability values for site i at the node to the right of the virtual root 
+     are available and correctly computed, such that we can set the pointer to the right vector x2
+     to the corresponding entry */
+
+  x2 = &lVector[states * (trav->qNumber - mxtips)]; 
+
+  /* a paranoic assertion */
+
+  assert(0 <=  (trav->qNumber - mxtips) && (trav->qNumber - mxtips) < mxtips);  
+ 
+  /* now just compute the log likelihood score of this site */
+      
+  if(qz < PLL_ZMIN) 
+    lz = PLL_ZMIN;
+  lz  = log(qz); 
+  lz *= ki;  
+  
+  d[0] = 1.0; 
+
+  for(k = 1; k < states; k++)
+    d[k] = exp (EIGN[k] * lz);
+  
+  term = 0.0;
+
+  for(k = 0; k < states; k++) 
+    term += x1[k] * x2[k] * d[k];       
+
+  /* note the "scale * log(PLL_MINLIKELIHOOD)" term here which we use to undo/revert the scaling multiplications 
+     such that we obtain a correct log likelihood score. The integer variable scale, contains the number of times 
+     we had to scale (multiply by 2^256) for site i only during a full tree traversal using Felsenstein's algorithm */
+
+  term = log(fabs(term)) + (scale * log(PLL_MINLIKELIHOOD));   
+
+  /* multiply with the site pattern weight (site pattern compression factor */
+
+  term = term * w;
+
+  /* free the memory space used for likelihood computations on this site */
+
+  rax_free(lVector);  
+  rax_free(d);
+
+  return  term;
+}
+#endif
+
+/* this is the top-level function that can be called from other parts of the code.
+   As input it takes the tree data structure, the site index, the evolutionary rate ki, 
+   and the model index (partition index. It will return the 
+   log likelihood of site i. 
+   An important pre-condition is that the tree traversal descriptor must contain 
+   a full tree traversal starting at a tip !
+
+   Note that, if you wamt to obtain per-site log likes for other altered model parameters such 
+   as the Q matrix, you will have do re-invoke the eigenvalue/eigenvector decomposition prior 
+   to calling the function below.
+*/
+
+double evaluatePartialGeneric (pllInstance *tr, partitionList *pr, int i, double ki, int _model)
+{
+  double 
+    result;
+  
+  
+  int     
+    branchReference,
+
+    /* number of states of the data type in this partition */
+    states = pr->partitionData[_model]->states;
+    
+  /* SOS ATTENTION: note the different indexing used for the parallel and sequential versions ! */
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+  int index = i; 
+#else
+  int index = i - pr->partitionData[_model]->lower;
+#endif
+  
+  /* here we figure out if all partitions are linked via the same branch length, that is,
+     if we are conducting a joint branch length estimate or a per-partition branch length estimate */
+
+  if(pr->perGeneBranchLengths && pr->numberOfPartitions>1)
+    branchReference = _model;
+  else
+    branchReference = 0;
+
+  /* for the generic function implementation we only offer the CAT implementation for computing/optimizing per-site evolutionary rates */
+
+#if (!defined(__SSE3) && !defined(__AVX))
+  if(tr->rateHetModel == PLL_CAT)
+    result = evaluatePartialCAT_FLEX(index, ki, tr->td[0].count, tr->td[0].ti, tr->td[0].ti[0].qz[branchReference], 
+				     pr->partitionData[_model]->wgt[index],
+				     pr->partitionData[_model]->EIGN,
+				     pr->partitionData[_model]->EI,
+				     pr->partitionData[_model]->EV,
+				     pr->partitionData[_model]->tipVector,
+				     pr->partitionData[_model]->yVector, branchReference, tr->mxtips, states);
+  else
+    /* 
+       the per-site site likelihood function should only be called for the CAT model
+       under the GAMMA model this is required only for estimating per-site protein models 
+       which has however been removed in this version of the code
+    */
+    assert(0); 
+  
+ 
+#else
+  /* switch over the number of states of the data in the current model/partition */
+  switch(states)
+    {
+    case 2:   /* BINARY */
+   
+    case 4:   /* DNA */
+      /* switch over CAT versus GAMMA and pass all model parameters for the respective partition to the respective functions */
+      if(tr->rateHetModel == PLL_CAT)      
+	result = evaluatePartialGTRCAT(index, ki, tr->td[0].count, tr->td[0].ti, tr->td[0].ti[0].qz[branchReference], 
+				       pr->partitionData[_model]->wgt[index],
+				       pr->partitionData[_model]->EIGN,
+				       pr->partitionData[_model]->EI,
+				       pr->partitionData[_model]->EV,
+				       pr->partitionData[_model]->tipVector,
+				       pr->partitionData[_model]->yVector, branchReference, tr->mxtips);
+      else	
+	result = evaluatePartialGTRGAMMA(index, tr->td[0].count, tr->td[0].ti, tr->td[0].ti[0].qz[branchReference], 
+					 pr->partitionData[_model]->wgt[index],
+					 pr->partitionData[_model]->EIGN,
+					 pr->partitionData[_model]->EI,
+					 pr->partitionData[_model]->EV,
+					 pr->partitionData[_model]->tipVector,
+					 pr->partitionData[_model]->yVector,
+					 pr->partitionData[_model]->gammaRates,
+					 branchReference, tr->mxtips);	
+	
+      break;
+    case 20: /* proteins */     
+      if(tr->rateHetModel == PLL_CAT)
+	result = evaluatePartialGTRCATPROT(index, ki, tr->td[0].count, tr->td[0].ti, tr->td[0].ti[0].qz[branchReference], 
+					   pr->partitionData[_model]->wgt[index],
+					   pr->partitionData[_model]->EIGN,
+					   pr->partitionData[_model]->EI,
+					   pr->partitionData[_model]->EV,
+					   pr->partitionData[_model]->tipVector,
+					   pr->partitionData[_model]->yVector, branchReference, tr->mxtips);
+      else
+	result =  evaluatePartialGTRGAMMAPROT(index, tr->td[0].count, tr->td[0].ti, tr->td[0].ti[0].qz[branchReference], 
+					      pr->partitionData[_model]->wgt[index],
+					      pr->partitionData[_model]->EIGN,
+					      pr->partitionData[_model]->EI,
+					      pr->partitionData[_model]->EV,
+					      pr->partitionData[_model]->tipVector,
+					      pr->partitionData[_model]->yVector,
+					      pr->partitionData[_model]->gammaRates,
+					      branchReference, tr->mxtips);
+      break;   
+    default:
+      assert(0);
+    }
+  #endif
+ 
+
+  return result;
+}
+
+#if (defined(__SSE3) || defined(__AVX))
+/* optimized function implementations for computing per-site log likelihoods under CAT and GAMMA for protein and 
+   DNA data. 
+   The structure is analoguous as above with some data- and model-specific optimizations and vectorizations.
+*/
+
+static inline void computeVectorGTRGAMMAPROT(double *lVector, int *eVector, double *gammaRates, int i, double qz, double rz,
+					     traversalInfo *ti, double *EIGN, double *EI, double *EV, double *tipVector, 
+					     unsigned  char **yVector, int mxtips)
+{       
+  double   
+    *x1, 
+    *x2, 
+    *x3;  
+  
+  int
+    s,
+    pNumber = ti->pNumber,
+    rNumber = ti->rNumber,
+    qNumber = ti->qNumber,
+    index1[4],
+    index2[4];
+  
+ 
+  x3  = &(lVector[80 * (pNumber  - mxtips)]);     
+
+  switch(ti->tipCase)
+    {
+    case PLL_TIP_TIP:    
+      x1 = &(tipVector[20 * yVector[qNumber][i]]);
+      x2 = &(tipVector[20 * yVector[rNumber][i]]);     
+      for(s = 0; s < 4; s++)
+	{
+	  index1[s] = 0;
+	  index2[s] = 0;
+	}
+      break;
+    case PLL_TIP_INNER:     
+      x1 = &(tipVector[20 * yVector[qNumber][i]]);
+      x2 = &(  lVector[80 * (rNumber - mxtips)]);   
+      for(s = 0; s < 4; s++)       
+	index1[s] = 0;
+      for(s = 0; s < 4; s++)     
+	index2[s] = s;                     
+      break;
+    case PLL_INNER_INNER:            
+      x1 = &(lVector[80 * (qNumber - mxtips)]);
+      x2 = &(lVector[80 * (rNumber - mxtips)]); 
+      for(s = 0; s < 4; s++)
+	{
+	  index1[s] = s;
+	  index2[s] = s;
+	}                
+      break;    
+    default:
+      assert(0);
+    }
+     
+  {
+    double  
+      e1[20] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))),
+      e2[20] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))),
+      d1[20] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))), 
+      d2[20] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))), 
+      lz1, lz2;  
+    
+    int 
+      l, 
+      k, 
+      scale, 
+      j;
+     
+    for(j = 0; j < 4; j++)
+      {
+	lz1 = qz * gammaRates[j];            
+	lz2 = rz * gammaRates[j];        
+
+	e1[0] = 1.0;
+	e2[0] = 1.0;
+    
+	for(l = 1; l < 20; l++)
+	  {
+	    e1[l] = exp(EIGN[l] * lz1);
+	    e2[l] = exp(EIGN[l] * lz2);
+	  }
+
+	for(l = 0; l < 20; l+=2)
+	  {
+	    __m128d d1v = _mm_mul_pd(_mm_load_pd(&x1[20 * index1[j] + l]), _mm_load_pd(&e1[l]));
+	    __m128d d2v = _mm_mul_pd(_mm_load_pd(&x2[20 * index2[j] + l]), _mm_load_pd(&e2[l]));
+	    
+	    _mm_store_pd(&d1[l], d1v);
+	    _mm_store_pd(&d2[l], d2v);	
+	  }
+
+	__m128d zero = _mm_setzero_pd();
+
+	for(l = 0; l < 20; l+=2)
+	  _mm_store_pd(&x3[j * 20 + l], zero);
+                
+	for(l = 0; l < 20; l++)
+	  { 	      
+	    double *ev = &EV[l * 20];
+	    __m128d ump_x1v = _mm_setzero_pd();
+	    __m128d ump_x2v = _mm_setzero_pd();
+	    __m128d x1px2v;
+	    
+	    for(k = 0; k < 20; k+=2)
+	      {       
+		__m128d eiv = _mm_load_pd(&EI[20 * l + k]);
+		__m128d d1v = _mm_load_pd(&d1[k]);
+		__m128d d2v = _mm_load_pd(&d2[k]);
+		ump_x1v = _mm_add_pd(ump_x1v, _mm_mul_pd(d1v, eiv));
+		ump_x2v = _mm_add_pd(ump_x2v, _mm_mul_pd(d2v, eiv));	  
+	      }
+
+	    ump_x1v = _mm_hadd_pd(ump_x1v, ump_x1v);
+	    ump_x2v = _mm_hadd_pd(ump_x2v, ump_x2v);
+
+	    x1px2v = _mm_mul_pd(ump_x1v, ump_x2v);
+
+	    for(k = 0; k < 20; k+=2)
+	      {
+		__m128d ex3v = _mm_load_pd(&x3[j * 20 + k]);
+		__m128d EVV  = _mm_load_pd(&ev[k]);
+		ex3v = _mm_add_pd(ex3v, _mm_mul_pd(x1px2v, EVV));
+		
+		_mm_store_pd(&x3[j * 20 + k], ex3v);	   	   
+	      }
+	  }        
+      }
+    
+    scale = 1;
+    for(l = 0; scale && (l < 80); l++)
+      scale = ((x3[l] < PLL_MINLIKELIHOOD) && (x3[l] > PLL_MINUSMINLIKELIHOOD));	       	      	      	       	       
+    
+    if(scale)
+      {	      
+	__m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+
+	for(l = 0; l < 80; l+=2)
+	  {
+	    __m128d ex3v = _mm_mul_pd(_mm_load_pd(&x3[l]),twoto);
+	    _mm_store_pd(&x3[l], ex3v);	
+	  }
+
+	*eVector = *eVector + 1;
+      }
+    
+    return;      
+  }
+}
+
+static  void computeVectorGTRGAMMA(double *lVector, int *eVector, double *gammaRates, int i, double qz, double rz,
+					 traversalInfo *ti, double *EIGN, double *EI, double *EV, double *tipVector, 
+					 unsigned  char **yVector, int mxtips)
+{       
+  double   
+    *x1, 
+    *x2, 
+    *x3;   
+
+  int
+    s,
+    pNumber = ti->pNumber,
+    rNumber = ti->rNumber,
+    qNumber = ti->qNumber,
+    index1[4],
+    index2[4];
+  
+ 
+  x3  = &(lVector[16 * (pNumber  - mxtips)]);     
+
+  switch(ti->tipCase)
+    {
+    case PLL_TIP_TIP:          
+      x1 = &(tipVector[4 * yVector[qNumber][i]]);
+      x2 = &(tipVector[4 * yVector[rNumber][i]]);     
+      
+      for(s = 0; s < 4; s++)
+	{
+	  index1[s] = 0;
+	  index2[s] = 0;
+	}
+      break;
+    case PLL_TIP_INNER:     
+      x1 = &(tipVector[4 * yVector[qNumber][i]]);
+      x2 = &(lVector[16 * (rNumber - mxtips)]);   
+      for(s = 0; s < 4; s++)       
+	{
+	  index1[s] = 0;      
+	  index2[s] = s;  
+	}
+      break;
+    case PLL_INNER_INNER:            
+      x1 = &(lVector[16 * (qNumber - mxtips)]);
+      x2 = &(lVector[16 * (rNumber - mxtips)]);       
+      for(s = 0; s < 4; s++)
+	{
+	  index1[s] = s;
+	  index2[s] = s;
+	}                
+      break;    
+    default:
+      assert(0);
+    }
+     
+  {
+    double  
+      e1[4] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))),
+      e2[4] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))),
+      d1[4] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))), 
+      d2[4] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))), 
+      lz1, lz2;  
+    
+    int 
+      l, 
+      k, 
+      scale, 
+      j;
+     
+    for(j = 0; j < 4; j++)
+      {
+	lz1 = qz * gammaRates[j];            
+	lz2 = rz * gammaRates[j];        
+
+	e1[0] = 1.0;
+	e2[0] = 1.0;
+    
+	for(l = 1; l < 4; l++)
+	  {
+	    e1[l] = exp(EIGN[l] * lz1);
+	    e2[l] = exp(EIGN[l] * lz2);
+	  }
+
+	for(l = 0; l < 4; l+=2)
+	  {
+	    __m128d d1v = _mm_mul_pd(_mm_load_pd(&x1[4 * index1[j] + l]), _mm_load_pd(&e1[l]));
+	    __m128d d2v = _mm_mul_pd(_mm_load_pd(&x2[4 * index2[j] + l]), _mm_load_pd(&e2[l]));
+	    
+	    _mm_store_pd(&d1[l], d1v);
+	    _mm_store_pd(&d2[l], d2v);	
+	  }
+
+	__m128d zero = _mm_setzero_pd();
+
+	for(l = 0; l < 4; l+=2)
+	  _mm_store_pd(&x3[j * 4 + l], zero);
+                
+	for(l = 0; l < 4; l++)
+	  { 	      
+	    double *ev = &EV[l * 4];
+	    __m128d ump_x1v = _mm_setzero_pd();
+	    __m128d ump_x2v = _mm_setzero_pd();
+	    __m128d x1px2v;
+	    
+	    for(k = 0; k < 4; k+=2)
+	      {       
+		__m128d eiv = _mm_load_pd(&EI[4 * l + k]);
+		__m128d d1v = _mm_load_pd(&d1[k]);
+		__m128d d2v = _mm_load_pd(&d2[k]);
+		ump_x1v = _mm_add_pd(ump_x1v, _mm_mul_pd(d1v, eiv));
+		ump_x2v = _mm_add_pd(ump_x2v, _mm_mul_pd(d2v, eiv));	  
+	      }
+
+	    ump_x1v = _mm_hadd_pd(ump_x1v, ump_x1v);
+	    ump_x2v = _mm_hadd_pd(ump_x2v, ump_x2v);
+
+	    x1px2v = _mm_mul_pd(ump_x1v, ump_x2v);
+
+	    for(k = 0; k < 4; k+=2)
+	      {
+		__m128d ex3v = _mm_load_pd(&x3[j * 4 + k]);
+		__m128d EVV  = _mm_load_pd(&ev[k]);
+		ex3v = _mm_add_pd(ex3v, _mm_mul_pd(x1px2v, EVV));
+		
+		_mm_store_pd(&x3[j * 4 + k], ex3v);	   	   
+	      }
+	  }        
+      }
+    
+  
+    scale = 1;
+    for(l = 0; scale && (l < 16); l++)
+      scale = (PLL_ABS(x3[l]) < PLL_MINLIKELIHOOD);	       	      	      	       	       
+    
+    if(scale)
+      {	      
+	__m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+	
+	for(l = 0; l < 16; l+=2)
+	  {
+	    __m128d ex3v = _mm_mul_pd(_mm_load_pd(&x3[l]),twoto);
+	    _mm_store_pd(&x3[l], ex3v);	
+	  }
+	
+	*eVector = *eVector + 1;
+      }  
+    
+    return;      
+  }
+}
+
+
+static double evaluatePartialGTRGAMMAPROT(int i, int counter,  traversalInfo *ti, double qz,
+					  int w, double *EIGN, double *EI, double *EV,
+					  double *tipVector, unsigned char **yVector, 
+					  double *gammaRates,
+					  int branchReference, int mxtips)
+{
+  double lz, term;       
+  double  d[80];
+  double   *x1, *x2; 
+  int scale = 0, k, l, j;
+  double 
+    *lVector = NULL,
+    myEI[400]  __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+  traversalInfo 
+    *trav = &ti[0];
+
+  rax_posix_memalign ((void **)&lVector, PLL_BYTE_ALIGNMENT, sizeof(double) * 80 * mxtips);
+
+  for(k = 0; k < 20; k++)
+    {         
+      for(l = 0; l < 20; l++)
+	myEI[k * 20 + l] = EI[k * 20 + l];
+    }
+
+  assert(isTip(trav->pNumber, mxtips));
+     
+  x1 = &(tipVector[20 *  yVector[trav->pNumber][i]]);   
+
+  for(k = 1; k < counter; k++)                
+    {
+      double 
+	qz = ti[k].qz[branchReference],
+	rz = ti[k].rz[branchReference];
+      
+      qz = (qz > PLL_ZMIN) ? log(qz) : log(PLL_ZMIN);
+      rz = (rz > PLL_ZMIN) ? log(rz) : log(PLL_ZMIN);
+
+      computeVectorGTRGAMMAPROT(lVector, &scale, gammaRates, i, qz, rz, 
+				&ti[k], EIGN, myEI, EV, 
+				tipVector, yVector, mxtips);
+    }
+   
+  x2 = &lVector[80 * (trav->qNumber - mxtips)];       
+
+  assert(0 <=  (trav->qNumber - mxtips) && (trav->qNumber - mxtips) < mxtips);  
+  
+  lz = qz;
+
+  if(qz < PLL_ZMIN) 
+    lz = PLL_ZMIN;
+  lz  = log(qz);
+  
+  
+  
+  for(j = 0; j < 4; j++)
+    {
+      d[20 * j] = 1.0;
+      for(l = 1; l < 20; l++)
+	d[20 * j + l] = exp(EIGN[l] * lz * gammaRates[j]);
+    }
+
+ 
+  for(j = 0, term = 0.0; j < 4; j++)
+    {
+      for(l = 0; l < 20; l++)
+	term += x1[l] * x2[20 * j + l] * d[j * 20 + l];	      
+    }
+  
+  term = log(0.25 * fabs(term)) + (scale * log(PLL_MINLIKELIHOOD));   
+
+  term = term * w;
+
+ rax_free(lVector);
+  
+ 
+  return  term;
+}
+
+static double evaluatePartialGTRGAMMA(int i, int counter,  traversalInfo *ti, double qz,
+				      int w, double *EIGN, double *EI, double *EV,
+				      double *tipVector, unsigned char **yVector, 
+				      double *gammaRates,
+				      int branchReference, int mxtips)
+{
+  double lz, term;       
+  double  d[16];
+  double   *x1, *x2; 
+  int scale = 0, k, l, j;
+  double 
+    *lVector = NULL,
+    myEI[16]  __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+  traversalInfo 
+    *trav = &ti[0];
+
+  rax_posix_memalign ((void **)&lVector, PLL_BYTE_ALIGNMENT, sizeof(double) * 16 * mxtips);
+
+  for(k = 0; k < 4; k++)
+    {           
+      for(l = 0; l < 4; l++)
+	myEI[k * 4 + l] = EI[k * 4 + l];
+    }
+
+  assert(isTip(trav->pNumber, mxtips));
+     
+  x1 = &(tipVector[4 *  yVector[trav->pNumber][i]]);   
+
+  for(k = 1; k < counter; k++)                
+    {
+      double 
+	qz = ti[k].qz[branchReference],
+	rz = ti[k].rz[branchReference];
+      
+      qz = (qz > PLL_ZMIN) ? log(qz) : log(PLL_ZMIN);
+      rz = (rz > PLL_ZMIN) ? log(rz) : log(PLL_ZMIN);
+
+      computeVectorGTRGAMMA(lVector, &scale, gammaRates, i, qz, rz, 
+				&ti[k], EIGN, myEI, EV, 
+				tipVector, yVector, mxtips);
+    }
+   
+  x2 = &lVector[16 * (trav->qNumber - mxtips)];       
+
+  assert(0 <=  (trav->qNumber - mxtips) && (trav->qNumber - mxtips) < mxtips);  
+  
+  if(qz < PLL_ZMIN) 
+    lz = PLL_ZMIN;
+  lz  = log(qz); 
+  
+  for(j = 0; j < 4; j++)
+    {
+      d[4 * j] = 1.0;
+      for(l = 1; l < 4; l++)
+	d[4 * j + l] = exp(EIGN[l] * lz * gammaRates[j]);
+    }
+
+ 
+  for(j = 0, term = 0.0; j < 4; j++)
+    {
+      for(l = 0; l < 4; l++)
+	term += x1[l] * x2[4 * j + l] * d[j * 4 + l];	      
+    }
+
+  term = log(0.25 * fabs(term)) + (scale * log(PLL_MINLIKELIHOOD));   
+
+  term = term * w;
+
+  rax_free(lVector);
+  
+  
+  return  term;
+}
+
+
+
+
+static inline void computeVectorGTRCAT(double *lVector, int *eVector, double ki, int i, double qz, double rz,
+				       traversalInfo *ti, double *EIGN, double *EI, double *EV, double *tipVector, 
+				       unsigned char **yVector, int mxtips)
+{       
+  double  d1[3], d2[3],  ump_x1, ump_x2, x1px2[4], lz1, lz2; 
+  double *x1, *x2, *x3;
+  int j, k,
+    pNumber = ti->pNumber,
+    rNumber = ti->rNumber,
+    qNumber = ti->qNumber;
+ 
+  x3  = &lVector[4 * (pNumber  - mxtips)];  
+ 
+
+  switch(ti->tipCase)
+    {
+    case PLL_TIP_TIP:     
+      x1 = &(tipVector[4 * yVector[qNumber][i]]);
+      x2 = &(tipVector[4 * yVector[rNumber][i]]);    
+      break;
+    case PLL_TIP_INNER:     
+      x1 = &(tipVector[4 * yVector[qNumber][i]]);
+      x2 = &lVector[4 * (rNumber - mxtips)];           
+      break;
+    case PLL_INNER_INNER:            
+      x1 = &lVector[4 * (qNumber - mxtips)];
+      x2 = &lVector[4 * (rNumber - mxtips)];     
+      break;
+    default:
+      assert(0);
+    }
+     
+  lz1 = qz * ki;  
+  lz2 = rz * ki;
+  
+  for(j = 0; j < 3; j++)
+    {
+      d1[j] = 
+	x1[j + 1] * 
+	exp(EIGN[j + 1] * lz1);
+      d2[j] = x2[j + 1] * exp(EIGN[j + 1] * lz2);	    
+    }
+ 
+ 
+  for(j = 0; j < 4; j++)
+    {     
+      ump_x1 = x1[0];
+      ump_x2 = x2[0];
+      for(k = 0; k < 3; k++)
+	{
+	  ump_x1 += d1[k] * EI[j * 4 + k + 1];
+	  ump_x2 += d2[k] * EI[j * 4 + k + 1];
+	}
+      x1px2[j] = ump_x1 * ump_x2;
+    }
+  
+  for(j = 0; j < 4; j++)
+    x3[j] = 0.0;
+
+  for(j = 0; j < 4; j++)          
+    for(k = 0; k < 4; k++)	
+      x3[k] +=  x1px2[j] *  EV[4 * j + k];	   
+      
+  
+  if (x3[0] < PLL_MINLIKELIHOOD && x3[0] > PLL_MINUSMINLIKELIHOOD &&
+      x3[1] < PLL_MINLIKELIHOOD && x3[1] > PLL_MINUSMINLIKELIHOOD &&
+      x3[2] < PLL_MINLIKELIHOOD && x3[2] > PLL_MINUSMINLIKELIHOOD &&
+      x3[3] < PLL_MINLIKELIHOOD && x3[3] > PLL_MINUSMINLIKELIHOOD)
+    {	     
+      x3[0]   *= PLL_TWOTOTHE256;
+      x3[1]   *= PLL_TWOTOTHE256;
+      x3[2]   *= PLL_TWOTOTHE256;     
+      x3[3]   *= PLL_TWOTOTHE256;     
+      *eVector = *eVector + 1;
+    }	              
+
+  return;
+}
+
+
+
+
+
+
+
+
+static double evaluatePartialGTRCAT(int i, double ki, int counter,  traversalInfo *ti, double qz,
+				    int w, double *EIGN, double *EI, double *EV,
+				    double *tipVector, unsigned  char **yVector, 
+				    int branchReference, int mxtips)
+{
+  double lz, term;       
+  double  d[3];
+  double   *x1, *x2, *lVector = NULL; 
+  int scale = 0, k;
+  traversalInfo *trav = &ti[0];
+ 
+  rax_posix_memalign ((void **) &lVector, PLL_BYTE_ALIGNMENT, sizeof(double) * 4 * mxtips);    
+
+  assert(isTip(trav->pNumber, mxtips));
+     
+  x1 = &(tipVector[4 *  yVector[trav->pNumber][i]]);   
+
+  for(k = 1; k < counter; k++)    
+    {
+      double 
+	qz = ti[k].qz[branchReference],
+	rz = ti[k].rz[branchReference];
+      
+      qz = (qz > PLL_ZMIN) ? log(qz) : log(PLL_ZMIN);
+      rz = (rz > PLL_ZMIN) ? log(rz) : log(PLL_ZMIN);
+
+      computeVectorGTRCAT(lVector, &scale, ki, i, qz, rz, &ti[k], 
+			  EIGN, EI, EV, 
+			  tipVector, yVector, mxtips);       
+    }
+   
+  x2 = &lVector[4 * (trav->qNumber - mxtips)]; 
+
+  assert(0 <=  (trav->qNumber - mxtips) && (trav->qNumber - mxtips) < mxtips);  
+       
+  if(qz < PLL_ZMIN) 
+    lz = PLL_ZMIN;
+  lz  = log(qz); 
+  lz *= ki;  
+  
+  d[0] = exp (EIGN[1] * lz);
+  d[1] = exp (EIGN[2] * lz);
+  d[2] = exp (EIGN[3] * lz);       	   
+  
+  term =  x1[0] * x2[0];
+  term += x1[1] * x2[1] * d[0];
+  term += x1[2] * x2[2] * d[1];
+  term += x1[3] * x2[3] * d[2];     
+
+  term = log(fabs(term)) + (scale * log(PLL_MINLIKELIHOOD));   
+
+  term = term * w;
+
+  rax_free(lVector);  
+
+  return  term;
+}
+
+/**********************************************************************************/
+
+static inline void computeVectorGTRCATPROT(double *lVector, int *eVector, double ki, int i, double qz, double rz,
+				       traversalInfo *ti, double *EIGN, double *EI, double *EV, double *tipVector, 
+				       unsigned char **yVector, int mxtips)
+{       
+  double  d1[20], d2[20],  ump_x1, ump_x2, x1px2[20], lz1, lz2; 
+  double *x1, *x2, *x3;
+  int j, k,
+    scale = 1,
+    pNumber = ti->pNumber,
+    rNumber = ti->rNumber,
+    qNumber = ti->qNumber;
+ 
+  x3  = &lVector[20 * (pNumber  - mxtips)];  
+ 
+
+  switch(ti->tipCase)
+    {
+    case PLL_TIP_TIP:     
+      x1 = &(tipVector[20 * yVector[qNumber][i]]);
+      x2 = &(tipVector[20 * yVector[rNumber][i]]);    
+      break;
+    case PLL_TIP_INNER:     
+      x1 = &(tipVector[20 * yVector[qNumber][i]]);
+      x2 = &lVector[20 * (rNumber - mxtips)];           
+      break;
+    case PLL_INNER_INNER:            
+      x1 = &lVector[20 * (qNumber - mxtips)];
+      x2 = &lVector[20 * (rNumber - mxtips)];     
+      break;
+    default:
+      assert(0);
+    }
+     
+  lz1 = qz * ki;  
+  lz2 = rz * ki;
+  
+   d1[0] = x1[0];
+   d2[0] = x2[0];
+
+  for(j = 1; j < 20; j++)
+    {
+      d1[j] = x1[j] * exp(EIGN[j] * lz1);
+      d2[j] = x2[j] * exp(EIGN[j] * lz2);	    
+    }
+ 
+ 
+  for(j = 0; j < 20; j++)
+    {        
+      ump_x1 = 0;
+      ump_x2 = 0;
+
+      for(k = 0; k < 20; k++)
+	{
+	  ump_x1 += d1[k] * EI[j * 20 + k];
+	  ump_x2 += d2[k] * EI[j * 20 + k];
+	}
+      
+      x1px2[j] = ump_x1 * ump_x2;
+    }
+  
+  for(j = 0; j < 20; j++)
+    x3[j] = 0.0;
+
+  for(j = 0; j < 20; j++)          
+    for(k = 0; k < 20; k++)	
+      x3[k] +=  x1px2[j] *  EV[20 * j + k];	   
+      
+  scale = 1;
+  for(k = 0; (k < 20) && scale; k++)    
+    scale = ((x3[k] < PLL_MINLIKELIHOOD) && (x3[k] > PLL_MINUSMINLIKELIHOOD));    
+
+  if(scale)
+    {	        
+
+      for(k = 0; k < 20; k++)
+	x3[k]   *= PLL_TWOTOTHE256;
+         
+      *eVector = *eVector + 1;
+    }	              
+
+  return;
+}
+
+
+
+
+
+
+
+
+static double evaluatePartialGTRCATPROT(int i, double ki, int counter,  traversalInfo *ti, double qz,
+				    int w, double *EIGN, double *EI, double *EV,
+				    double *tipVector, unsigned  char **yVector, 
+				    int branchReference, int mxtips)
+{
+  double lz, term;       
+  double  d[20];
+  double   *x1, *x2, *lVector = NULL; 
+  int scale = 0, k;
+
+  traversalInfo *trav = &ti[0];
+ 
+  rax_posix_memalign ((void **)&lVector, PLL_BYTE_ALIGNMENT, sizeof(double) * 20 * mxtips);
+
+  assert(isTip(trav->pNumber, mxtips));
+     
+  x1 = &(tipVector[20 *  yVector[trav->pNumber][i]]);   
+
+  for(k = 1; k < counter; k++)    
+    {
+      double 
+	qz = ti[k].qz[branchReference],
+	rz = ti[k].rz[branchReference];
+      
+      qz = (qz > PLL_ZMIN) ? log(qz) : log(PLL_ZMIN);
+      rz = (rz > PLL_ZMIN) ? log(rz) : log(PLL_ZMIN);
+
+      computeVectorGTRCATPROT(lVector, &scale, ki, i, qz, rz, &ti[k], 
+			  EIGN, EI, EV, 
+			  tipVector, yVector, mxtips);       
+    }
+   
+  x2 = &lVector[20 * (trav->qNumber - mxtips)]; 
+
+  assert(0 <=  (trav->qNumber - mxtips) && (trav->qNumber - mxtips) < mxtips);  
+       
+  if(qz < PLL_ZMIN) 
+    lz = PLL_ZMIN;
+  lz  = log(qz); 
+  lz *= ki;  
+  
+  d[0] = 1.0;
+  
+  for(k = 1; k < 20; k++)
+    d[k] =  exp (EIGN[k] * lz);
+
+        	   
+  term =  0.0;
+  for(k = 0; k < 20; k++)
+    term += x1[k] * x2[k] * d[k];     
+
+  term = log(fabs(term)) + (scale * log(PLL_MINLIKELIHOOD));   
+
+  term = term * w;
+
+  rax_free(lVector);  
+
+  return  term;
+}
+
+/******************************************/
+
+
+
+#endif
diff --git a/lib/pll/fastDNAparsimony.c b/lib/pll/fastDNAparsimony.c
new file mode 100644
index 0000000..6302db2
--- /dev/null
+++ b/lib/pll/fastDNAparsimony.c
@@ -0,0 +1,1937 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file fastDNAparsimony.c
+ */
+
+#include "pll.h"
+#include "pllInternal.h"
+#include "globalVariables.h"
+#include "mem_alloc.h"
+
+
+
+#ifndef WIN32
+#include <sys/times.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <unistd.h>  
+#endif
+
+#include <limits.h>
+#include <math.h>
+#include <time.h> 
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdint.h>
+#include <assert.h>
+
+#if defined(__MIC_NATIVE)
+
+
+#include <immintrin.h>
+
+#define INTS_PER_VECTOR 16
+#define LONG_INTS_PER_VECTOR 8
+#define INT_TYPE __m512i
+#define CAST double*
+#define SET_ALL_BITS_ONE _mm512_set1_epi32(0xFFFFFFFF)
+#define SET_ALL_BITS_ZERO _mm512_setzero_epi32()
+#define VECTOR_LOAD _mm512_load_epi32
+#define VECTOR_STORE  _mm512_store_epi32
+#define VECTOR_BIT_AND _mm512_and_epi32
+#define VECTOR_BIT_OR  _mm512_or_epi32
+#define VECTOR_AND_NOT _mm512_andnot_epi32
+
+#elif defined(__AVX)
+
+#include <xmmintrin.h>
+#include <immintrin.h>
+#include <pmmintrin.h>
+
+#define INTS_PER_VECTOR 8
+#define LONG_INTS_PER_VECTOR 4
+#define INT_TYPE __m256d
+#define CAST double*
+#define SET_ALL_BITS_ONE (__m256d)_mm256_set_epi32(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)
+#define SET_ALL_BITS_ZERO (__m256d)_mm256_set_epi32(0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000)
+#define VECTOR_LOAD _mm256_load_pd
+#define VECTOR_BIT_AND _mm256_and_pd
+#define VECTOR_BIT_OR  _mm256_or_pd
+#define VECTOR_STORE  _mm256_store_pd
+#define VECTOR_AND_NOT _mm256_andnot_pd
+
+#elif (defined(__SSE3))
+
+#include <xmmintrin.h>
+#include <pmmintrin.h>
+  
+#define INTS_PER_VECTOR 4
+#ifdef __i386__
+#define LONG_INTS_PER_VECTOR 4
+#else
+#define LONG_INTS_PER_VECTOR 2
+#endif
+#define INT_TYPE __m128i
+#define CAST __m128i*
+#define SET_ALL_BITS_ONE _mm_set_epi32(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)
+#define SET_ALL_BITS_ZERO _mm_set_epi32(0x00000000, 0x00000000, 0x00000000, 0x00000000)
+#define VECTOR_LOAD _mm_load_si128
+#define VECTOR_BIT_AND _mm_and_si128
+#define VECTOR_BIT_OR  _mm_or_si128
+#define VECTOR_STORE  _mm_store_si128
+#define VECTOR_AND_NOT _mm_andnot_si128
+
+#endif
+
+#include "pll.h"
+#include "pllInternal.h"
+
+static boolean tipHomogeneityCheckerPars(pllInstance *tr, nodeptr p, int grouping);
+
+extern const unsigned int mask32[32]; 
+/* vector-specific stuff */
+
+
+extern double masterTime;
+
+/************************************************ pop count stuff ***********************************************/
+
+ unsigned int bitcount_32_bit(unsigned int i)
+{
+  return ((unsigned int) __builtin_popcount(i));
+}
+
+/* bit count for 64 bit integers */
+
+inline unsigned int bitcount_64_bit(unsigned long i)
+{
+  return ((unsigned int) __builtin_popcountl(i));
+}
+
+/* bit count for 128 bit SSE3 and 256 bit AVX registers */
+
+#if (defined(__SSE3) || defined(__AVX))
+static inline unsigned int vectorPopcount(INT_TYPE v)
+{
+  unsigned long
+    counts[LONG_INTS_PER_VECTOR] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+  int    
+    i,
+    sum = 0;
+  
+  VECTOR_STORE((CAST)counts, v);
+
+  for(i = 0; i < LONG_INTS_PER_VECTOR; i++)
+    sum += __builtin_popcountl(counts[i]);
+             
+  return ((unsigned int)sum);
+}
+#endif
+
+
+
+/********************************DNA FUNCTIONS *****************************************************************/
+
+
+static int checkerPars(pllInstance *tr, nodeptr p)
+{
+  int group = tr->constraintVector[p->number];
+
+  if(isTip(p->number, tr->mxtips))
+    {
+      group = tr->constraintVector[p->number];
+      return group;
+    }
+  else
+    {
+      if(group != -9) 
+        return group;
+
+      group = checkerPars(tr, p->next->back);
+      if(group != -9) 
+        return group;
+
+      group = checkerPars(tr, p->next->next->back);
+      if(group != -9) 
+        return group;
+
+      return -9;
+    }
+}
+
+static boolean tipHomogeneityCheckerPars(pllInstance *tr, nodeptr p, int grouping)
+{
+  if(isTip(p->number, tr->mxtips))
+    {
+      if(tr->constraintVector[p->number] != grouping) 
+        return PLL_FALSE;
+      else 
+        return PLL_TRUE;
+    }
+  else
+    {   
+      return  (tipHomogeneityCheckerPars(tr, p->next->back, grouping) && tipHomogeneityCheckerPars(tr, p->next->next->back,grouping));      
+    }
+}
+
+static void getxnodeLocal (nodeptr p)
+{
+  nodeptr  s;
+
+  if((s = p->next)->xPars || (s = s->next)->xPars)
+    {
+      p->xPars = s->xPars;
+      s->xPars = 0;
+    }
+
+  assert(p->next->xPars || p->next->next->xPars || p->xPars);
+
+}
+
+void computeTraversalInfoParsimony(nodeptr p, int *ti, int *counter, int maxTips, boolean full)
+{        
+  nodeptr 
+    q = p->next->back,
+    r = p->next->next->back;
+  
+  if(! p->xPars)
+    getxnodeLocal(p);  
+  
+  if(full)
+    {
+       if(q->number > maxTips) 
+         computeTraversalInfoParsimony(q, ti, counter, maxTips, full);
+      
+      if(r->number > maxTips) 
+        computeTraversalInfoParsimony(r, ti, counter, maxTips, full);
+    }
+  else
+    {
+      if(q->number > maxTips && !q->xPars) 
+        computeTraversalInfoParsimony(q, ti, counter, maxTips, full);
+      
+      if(r->number > maxTips && !r->xPars) 
+        computeTraversalInfoParsimony(r, ti, counter, maxTips, full);
+    }
+  
+  
+  ti[*counter]     = p->number;
+  ti[*counter + 1] = q->number;
+  ti[*counter + 2] = r->number;
+  *counter = *counter + 4;
+}
+
+
+
+
+
+
+
+#if (defined(__SSE3) || defined(__AVX))
+
+void newviewParsimonyIterativeFast(pllInstance *tr, partitionList *pr)
+{    
+  INT_TYPE
+    allOne = SET_ALL_BITS_ONE;
+
+  int 
+    model,
+    *ti = tr->ti,
+    count = ti[0],
+    index; 
+
+  for(index = 4; index < count; index += 4)
+    {      
+      unsigned int
+        totalScore = 0;
+
+      size_t
+        pNumber = (size_t)ti[index],
+        qNumber = (size_t)ti[index + 1],
+        rNumber = (size_t)ti[index + 2];
+      
+      for(model = 0; model < pr->numberOfPartitions; model++)
+        {
+	  unsigned int
+	    partitionScore = 0; 
+
+          size_t
+            k,
+            states = pr->partitionData[model]->states,
+            width = pr->partitionData[model]->parsimonyLength;
+            
+          unsigned int  
+            i;      
+                 
+          switch(states)
+            {
+            case 2:       
+              {
+                parsimonyNumber
+                  *left[2],
+                  *right[2],
+                  *this[2];
+
+                for(k = 0; k < 2; k++)
+                  {
+                    left[k]  = &(pr->partitionData[model]->parsVect[(width * 2 * qNumber) + width * k]);
+                    right[k] = &(pr->partitionData[model]->parsVect[(width * 2 * rNumber) + width * k]);
+                    this[k]  = &(pr->partitionData[model]->parsVect[(width * 2 * pNumber) + width * k]);
+                  }
+
+                for(i = 0; i < width; i += INTS_PER_VECTOR)
+                  {               
+                    INT_TYPE
+                      s_r, s_l, v_N,
+                      l_A, l_C,
+                      v_A, v_C;          
+                    
+                    s_l = VECTOR_LOAD((CAST)(&left[0][i]));
+                    s_r = VECTOR_LOAD((CAST)(&right[0][i]));
+                    l_A = VECTOR_BIT_AND(s_l, s_r);
+                    v_A = VECTOR_BIT_OR(s_l, s_r);
+                    
+                    s_l = VECTOR_LOAD((CAST)(&left[1][i]));
+                    s_r = VECTOR_LOAD((CAST)(&right[1][i]));
+                    l_C = VECTOR_BIT_AND(s_l, s_r);
+                    v_C = VECTOR_BIT_OR(s_l, s_r);                                                                
+                    
+                    v_N = VECTOR_BIT_OR(l_A, l_C);
+                    
+                    VECTOR_STORE((CAST)(&this[0][i]), VECTOR_BIT_OR(l_A, VECTOR_AND_NOT(v_N, v_A)));
+                    VECTOR_STORE((CAST)(&this[1][i]), VECTOR_BIT_OR(l_C, VECTOR_AND_NOT(v_N, v_C)));                                                                    
+                    
+                    v_N = VECTOR_AND_NOT(v_N, allOne);
+                    
+                    partitionScore += vectorPopcount(v_N);            
+                  }
+              }
+              break;
+            case 4:
+              {
+                parsimonyNumber
+                  *left[4],
+                  *right[4],
+                  *this[4];
+
+                for(k = 0; k < 4; k++)
+                  {
+                    left[k]  = &(pr->partitionData[model]->parsVect[(width * 4 * qNumber) + width * k]);
+                    right[k] = &(pr->partitionData[model]->parsVect[(width * 4 * rNumber) + width * k]);
+                    this[k]  = &(pr->partitionData[model]->parsVect[(width * 4 * pNumber) + width * k]);
+                  }
+
+                for(i = 0; i < width; i += INTS_PER_VECTOR)
+                  {               
+                    INT_TYPE
+                      s_r, s_l, v_N,
+                      l_A, l_C, l_G, l_T,
+                      v_A, v_C, v_G, v_T;                
+                    
+                    s_l = VECTOR_LOAD((CAST)(&left[0][i]));
+                    s_r = VECTOR_LOAD((CAST)(&right[0][i]));
+                    l_A = VECTOR_BIT_AND(s_l, s_r);
+                    v_A = VECTOR_BIT_OR(s_l, s_r);
+                    
+                    s_l = VECTOR_LOAD((CAST)(&left[1][i]));
+                    s_r = VECTOR_LOAD((CAST)(&right[1][i]));
+                    l_C = VECTOR_BIT_AND(s_l, s_r);
+                    v_C = VECTOR_BIT_OR(s_l, s_r);
+                    
+                    s_l = VECTOR_LOAD((CAST)(&left[2][i]));
+                    s_r = VECTOR_LOAD((CAST)(&right[2][i]));
+                    l_G = VECTOR_BIT_AND(s_l, s_r);
+                    v_G = VECTOR_BIT_OR(s_l, s_r);
+                    
+                    s_l = VECTOR_LOAD((CAST)(&left[3][i]));
+                    s_r = VECTOR_LOAD((CAST)(&right[3][i]));
+                    l_T = VECTOR_BIT_AND(s_l, s_r);
+                    v_T = VECTOR_BIT_OR(s_l, s_r);
+                    
+                    v_N = VECTOR_BIT_OR(VECTOR_BIT_OR(l_A, l_C), VECTOR_BIT_OR(l_G, l_T));                                
+                    
+                    VECTOR_STORE((CAST)(&this[0][i]), VECTOR_BIT_OR(l_A, VECTOR_AND_NOT(v_N, v_A)));
+                    VECTOR_STORE((CAST)(&this[1][i]), VECTOR_BIT_OR(l_C, VECTOR_AND_NOT(v_N, v_C)));
+                    VECTOR_STORE((CAST)(&this[2][i]), VECTOR_BIT_OR(l_G, VECTOR_AND_NOT(v_N, v_G)));
+                    VECTOR_STORE((CAST)(&this[3][i]), VECTOR_BIT_OR(l_T, VECTOR_AND_NOT(v_N, v_T)));                                                    
+                    
+                    v_N = VECTOR_AND_NOT(v_N, allOne);
+                    
+                    partitionScore += vectorPopcount(v_N);  
+                  }
+              }
+              break;
+            case 20:
+              {
+                parsimonyNumber
+                  *left[20],
+                  *right[20],
+                  *this[20];
+
+                for(k = 0; k < 20; k++)
+                  {
+                    left[k]  = &(pr->partitionData[model]->parsVect[(width * 20 * qNumber) + width * k]);
+                    right[k] = &(pr->partitionData[model]->parsVect[(width * 20 * rNumber) + width * k]);
+                    this[k]  = &(pr->partitionData[model]->parsVect[(width * 20 * pNumber) + width * k]);
+                  }
+
+                for(i = 0; i < width; i += INTS_PER_VECTOR)
+                  {               
+                    size_t j;
+                    
+                    INT_TYPE
+                      s_r, s_l, 
+                      v_N = SET_ALL_BITS_ZERO,
+                      l_A[20], 
+                      v_A[20];           
+                    
+                    for(j = 0; j < 20; j++)
+                      {
+                        s_l = VECTOR_LOAD((CAST)(&left[j][i]));
+                        s_r = VECTOR_LOAD((CAST)(&right[j][i]));
+                        l_A[j] = VECTOR_BIT_AND(s_l, s_r);
+                        v_A[j] = VECTOR_BIT_OR(s_l, s_r);
+                        
+                        v_N = VECTOR_BIT_OR(v_N, l_A[j]);
+                      }
+                    
+                    for(j = 0; j < 20; j++)                 
+                      VECTOR_STORE((CAST)(&this[j][i]), VECTOR_BIT_OR(l_A[j], VECTOR_AND_NOT(v_N, v_A[j])));                                                                    
+                    
+                    v_N = VECTOR_AND_NOT(v_N, allOne);
+                    
+                    partitionScore += vectorPopcount(v_N);
+                  }
+              }
+              break;
+            default:
+              {
+                parsimonyNumber
+                  *left[32], 
+                  *right[32],
+                  *this[32];
+
+                assert(states <= 32);
+                
+                for(k = 0; k < states; k++)
+                  {
+                    left[k]  = &(pr->partitionData[model]->parsVect[(width * states * qNumber) + width * k]);
+                    right[k] = &(pr->partitionData[model]->parsVect[(width * states * rNumber) + width * k]);
+                    this[k]  = &(pr->partitionData[model]->parsVect[(width * states * pNumber) + width * k]);
+                  }
+
+                for(i = 0; i < width; i += INTS_PER_VECTOR)
+                  {               
+                    size_t j;
+                    
+                    INT_TYPE
+                      s_r, s_l, 
+                      v_N = SET_ALL_BITS_ZERO,
+                      l_A[32], 
+                      v_A[32];           
+                    
+                    for(j = 0; j < states; j++)
+                      {
+                        s_l = VECTOR_LOAD((CAST)(&left[j][i]));
+                        s_r = VECTOR_LOAD((CAST)(&right[j][i]));
+                        l_A[j] = VECTOR_BIT_AND(s_l, s_r);
+                        v_A[j] = VECTOR_BIT_OR(s_l, s_r);
+                        
+                        v_N = VECTOR_BIT_OR(v_N, l_A[j]);
+                      }
+                    
+                    for(j = 0; j < states; j++)             
+                      VECTOR_STORE((CAST)(&this[j][i]), VECTOR_BIT_OR(l_A[j], VECTOR_AND_NOT(v_N, v_A[j])));                                                                    
+                    
+                    v_N = VECTOR_AND_NOT(v_N, allOne);
+                    
+                    partitionScore += vectorPopcount(v_N);
+                  }                             
+              }
+            }            
+
+	  if(tr->getParsimonyPerPartition)
+	    {
+	      pInfo* partition = pr->partitionData[model]; 
+	      partition->parsimonyScore[pNumber] = partitionScore + partition->parsimonyScore[rNumber] + partition->parsimonyScore[qNumber];      
+	    }
+
+	  totalScore += partitionScore; 
+        }
+
+      tr->parsimonyScore[pNumber] = totalScore + tr->parsimonyScore[rNumber] + tr->parsimonyScore[qNumber];      
+    }
+}
+
+
+
+unsigned int evaluateParsimonyIterativeFast(pllInstance *tr, partitionList *pr)
+{
+  INT_TYPE 
+    allOne = SET_ALL_BITS_ONE;
+
+  size_t 
+    pNumber = (size_t)tr->ti[1],
+    qNumber = (size_t)tr->ti[2];
+
+  int
+    model;
+
+  unsigned int 
+    bestScore = tr->bestParsimony,    
+    sum;
+
+  if(tr->ti[0] > 4)
+    newviewParsimonyIterativeFast(tr, pr);
+
+  sum = tr->parsimonyScore[pNumber] + tr->parsimonyScore[qNumber];
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+    {
+      unsigned int count = 0; 
+      pInfo *partition = pr->partitionData[model]; 
+      unsigned int parsScorePartition =  partition->parsimonyScore[pNumber] + partition->parsimonyScore[qNumber];
+
+      size_t
+        k,
+        states = pr->partitionData[model]->states,
+        width  = pr->partitionData[model]->parsimonyLength,
+        i;
+
+       switch(states)
+         {
+         case 2:
+           {
+             parsimonyNumber
+               *left[2],
+               *right[2];
+             
+             for(k = 0; k < 2; k++)
+               {
+                 left[k]  = &(pr->partitionData[model]->parsVect[(width * 2 * qNumber) + width * k]);
+                 right[k] = &(pr->partitionData[model]->parsVect[(width * 2 * pNumber) + width * k]);
+               }     
+             
+             for(i = 0; i < width; i += INTS_PER_VECTOR)
+               {                                               
+                 INT_TYPE      
+                   l_A = VECTOR_BIT_AND(VECTOR_LOAD((CAST)(&left[0][i])), VECTOR_LOAD((CAST)(&right[0][i]))),
+                   l_C = VECTOR_BIT_AND(VECTOR_LOAD((CAST)(&left[1][i])), VECTOR_LOAD((CAST)(&right[1][i]))),            
+                   v_N = VECTOR_BIT_OR(l_A, l_C);
+                 
+                 v_N = VECTOR_AND_NOT(v_N, allOne);
+		 
+		 count = vectorPopcount(v_N); 
+                 sum += count;
+		 parsScorePartition += count; 
+                 
+                 if(tr->fastParsimony && sum >= bestScore)
+                   return sum;                         
+               }
+           }
+           break;
+         case 4:
+           {
+             parsimonyNumber
+               *left[4],
+               *right[4];
+      
+             for(k = 0; k < 4; k++)
+               {
+                 left[k]  = &(pr->partitionData[model]->parsVect[(width * 4 * qNumber) + width * k]);
+                 right[k] = &(pr->partitionData[model]->parsVect[(width * 4 * pNumber) + width * k]);
+               }        
+
+             for(i = 0; i < width; i += INTS_PER_VECTOR)
+               {                                                
+                 INT_TYPE      
+                   l_A = VECTOR_BIT_AND(VECTOR_LOAD((CAST)(&left[0][i])), VECTOR_LOAD((CAST)(&right[0][i]))),
+                   l_C = VECTOR_BIT_AND(VECTOR_LOAD((CAST)(&left[1][i])), VECTOR_LOAD((CAST)(&right[1][i]))),
+                   l_G = VECTOR_BIT_AND(VECTOR_LOAD((CAST)(&left[2][i])), VECTOR_LOAD((CAST)(&right[2][i]))),
+                   l_T = VECTOR_BIT_AND(VECTOR_LOAD((CAST)(&left[3][i])), VECTOR_LOAD((CAST)(&right[3][i]))),
+                   v_N = VECTOR_BIT_OR(VECTOR_BIT_OR(l_A, l_C), VECTOR_BIT_OR(l_G, l_T));     
+                 
+                 v_N = VECTOR_AND_NOT(v_N, allOne);
+                 
+		 count = vectorPopcount(v_N); 
+                 sum += count;
+		 parsScorePartition += count;  
+                 
+                 if(tr->fastParsimony && sum >= bestScore)            
+                   return sum;          
+               }                 
+           }
+           break;
+         case 20:
+           {
+             parsimonyNumber
+               *left[20],
+               *right[20];
+             
+              for(k = 0; k < 20; k++)
+                {
+                  left[k]  = &(pr->partitionData[model]->parsVect[(width * 20 * qNumber) + width * k]);
+                  right[k] = &(pr->partitionData[model]->parsVect[(width * 20 * pNumber) + width * k]);
+                }  
+           
+              for(i = 0; i < width; i += INTS_PER_VECTOR)
+                {                              
+                  int 
+                    j;
+                  
+                  INT_TYPE      
+                    l_A,
+                    v_N = SET_ALL_BITS_ZERO;     
+                  
+                  for(j = 0; j < 20; j++)
+                    {
+                      l_A = VECTOR_BIT_AND(VECTOR_LOAD((CAST)(&left[j][i])), VECTOR_LOAD((CAST)(&right[j][i])));
+                      v_N = VECTOR_BIT_OR(l_A, v_N);
+                    }
+                  
+                  v_N = VECTOR_AND_NOT(v_N, allOne);
+                  
+		  count = vectorPopcount(v_N); 
+                  sum += count; 
+		  parsScorePartition += count; 
+                  
+                  if(tr->fastParsimony && sum >= bestScore)      
+                    return sum;                        
+                }
+           }
+           break;
+         default:
+           {
+             parsimonyNumber
+               *left[32],  
+               *right[32]; 
+
+             assert(states <= 32);
+
+             for(k = 0; k < states; k++)
+               {
+                 left[k]  = &(pr->partitionData[model]->parsVect[(width * states * qNumber) + width * k]);
+                 right[k] = &(pr->partitionData[model]->parsVect[(width * states * pNumber) + width * k]);
+               }  
+           
+             for(i = 0; i < width; i += INTS_PER_VECTOR)
+               {                               
+                 size_t
+                   j;
+                 
+                 INT_TYPE      
+                   l_A,
+                   v_N = SET_ALL_BITS_ZERO;     
+                 
+                 for(j = 0; j < states; j++)
+                   {
+                     l_A = VECTOR_BIT_AND(VECTOR_LOAD((CAST)(&left[j][i])), VECTOR_LOAD((CAST)(&right[j][i])));
+                     v_N = VECTOR_BIT_OR(l_A, v_N);
+                   }
+                 
+                 v_N = VECTOR_AND_NOT(v_N, allOne);
+                 
+		 count = vectorPopcount(v_N); 
+                 sum += count; 
+		 parsScorePartition += count; 
+                 
+                 if(tr->fastParsimony && sum >= bestScore)         
+                   return sum;                 
+               }
+           }
+         }
+
+       if(tr->getParsimonyPerPartition)
+	 partition->parsimonyScore[0] = parsScorePartition + tr->parsimonyScore[pNumber] + tr->parsimonyScore[qNumber]; ; 
+    }
+  
+  return sum;
+}
+
+
+#else
+void newviewParsimonyIterativeFast(pllInstance *tr, partitionList * pr)
+{    
+  int 
+    model,
+    *ti = tr->ti,
+    count = ti[0],
+    index; 
+
+  for(index = 4; index < count; index += 4)
+    {      
+      unsigned int
+        totalScore = 0;
+
+      size_t
+        pNumber = (size_t)ti[index],
+        qNumber = (size_t)ti[index + 1],
+        rNumber = (size_t)ti[index + 2];
+      
+      for(model = 0; model < pr->numberOfPartitions; model++)
+        {
+	  unsigned int partitionScore = 0 ; 
+
+          size_t
+            k,
+            states = pr->partitionData[model]->states,
+            width = pr->partitionData[model]->parsimonyLength;    
+            
+          unsigned int  
+            i;      
+                 
+          switch(states)
+            {
+            case 2:       
+              {
+                parsimonyNumber
+                  *left[2],
+                  *right[2],
+                  *this[2];
+                
+                parsimonyNumber
+                   o_A,
+                   o_C,
+                   t_A,
+                   t_C, 
+                   t_N;
+                
+                for(k = 0; k < 2; k++)
+                  {
+                    left[k]  = &(pr->partitionData[model]->parsVect[(width * 2 * qNumber) + width * k]);
+                    right[k] = &(pr->partitionData[model]->parsVect[(width * 2 * rNumber) + width * k]);
+                    this[k]  = &(pr->partitionData[model]->parsVect[(width * 2 * pNumber) + width * k]);
+                  }
+
+                for(i = 0; i < width; i++)
+                  {               
+                    t_A = left[0][i] & right[0][i];
+                    t_C = left[1][i] & right[1][i];                
+
+                    o_A = left[0][i] | right[0][i];
+                    o_C = left[1][i] | right[1][i];
+                  
+                    t_N = ~(t_A | t_C);   
+
+                    this[0][i] = t_A | (t_N & o_A);
+                    this[1][i] = t_C | (t_N & o_C);                
+                    
+                    partitionScore += ((unsigned int) __builtin_popcount(t_N));
+                  }
+              }
+              break;
+            case 4:
+              {
+                parsimonyNumber
+                  *left[4],
+                  *right[4],
+                  *this[4];
+
+                for(k = 0; k < 4; k++)
+                  {
+                    left[k]  = &(pr->partitionData[model]->parsVect[(width * 4 * qNumber) + width * k]);
+                    right[k] = &(pr->partitionData[model]->parsVect[(width * 4 * rNumber) + width * k]);
+                    this[k]  = &(pr->partitionData[model]->parsVect[(width * 4 * pNumber) + width * k]);
+                  }
+
+                parsimonyNumber
+                   o_A,
+                   o_C,
+                   o_G,
+                   o_T,
+                   t_A,
+                   t_C,
+                   t_G,
+                   t_T, 
+                   t_N;
+
+                for(i = 0; i < width; i++)
+                  {               
+                    t_A = left[0][i] & right[0][i];
+                    t_C = left[1][i] & right[1][i];
+                    t_G = left[2][i] & right[2][i];       
+                    t_T = left[3][i] & right[3][i];
+
+                    o_A = left[0][i] | right[0][i];
+                    o_C = left[1][i] | right[1][i];
+                    o_G = left[2][i] | right[2][i];       
+                    o_T = left[3][i] | right[3][i];
+
+                    t_N = ~(t_A | t_C | t_G | t_T);       
+
+                    this[0][i] = t_A | (t_N & o_A);
+                    this[1][i] = t_C | (t_N & o_C);
+                    this[2][i] = t_G | (t_N & o_G);
+                    this[3][i] = t_T | (t_N & o_T); 
+                    
+                    partitionScore += ((unsigned int) __builtin_popcount(t_N));
+                  }
+              }
+              break;
+            case 20:
+              {
+                parsimonyNumber
+                  *left[20],
+                  *right[20],
+                  *this[20];
+
+                parsimonyNumber
+                  o_A[20],
+                  t_A[20],        
+                  t_N;
+
+                for(k = 0; k < 20; k++)
+                  {
+                    left[k]  = &(pr->partitionData[model]->parsVect[(width * 20 * qNumber) + width * k]);
+                    right[k] = &(pr->partitionData[model]->parsVect[(width * 20 * rNumber) + width * k]);
+                    this[k]  = &(pr->partitionData[model]->parsVect[(width * 20 * pNumber) + width * k]);
+                  }
+
+                for(i = 0; i < width; i++)
+                  {               
+                    size_t k;
+                    
+                    t_N = 0;
+
+                    for(k = 0; k < 20; k++)
+                      {
+                        t_A[k] = left[k][i] & right[k][i];
+                        o_A[k] = left[k][i] | right[k][i];
+                        t_N = t_N | t_A[k];
+                      }
+                    
+                    t_N = ~t_N;
+
+                    for(k = 0; k < 20; k++)                   
+                      this[k][i] = t_A[k] | (t_N & o_A[k]);                
+                    
+                    partitionScore += ((unsigned int) __builtin_popcount(t_N));
+                  }
+              }
+              break;
+            default:
+              {         
+                parsimonyNumber
+                  *left[32],
+                  *right[32],
+                  *this[32];
+                
+                parsimonyNumber
+                  o_A[32],
+                  t_A[32],        
+                  t_N;
+                
+                assert(states <= 32);
+                
+                for(k = 0; k < states; k++)
+                  {
+                    left[k]  = &(pr->partitionData[model]->parsVect[(width * states * qNumber) + width * k]);
+                    right[k] = &(pr->partitionData[model]->parsVect[(width * states * rNumber) + width * k]);
+                    this[k]  = &(pr->partitionData[model]->parsVect[(width * states * pNumber) + width * k]);
+                  }
+                
+                for(i = 0; i < width; i++)
+                  {               
+                    t_N = 0;
+                    
+                    for(k = 0; k < states; k++)
+                      {
+                        t_A[k] = left[k][i] & right[k][i];
+                        o_A[k] = left[k][i] | right[k][i];
+                        t_N = t_N | t_A[k];
+                      }
+                    
+                    t_N = ~t_N;
+                    
+                    for(k = 0; k < states; k++)               
+                      this[k][i] = t_A[k] | (t_N & o_A[k]);                
+                    
+                    partitionScore += ((unsigned int) __builtin_popcount(t_N));
+                  }
+              }                       
+            } 
+	  
+	  if(tr->getParsimonyPerPartition)
+	    {
+	      pInfo* partition = pr->partitionData[model]; 
+	      partition->parsimonyScore[pNumber] = partitionScore + partition->parsimonyScore[rNumber] + partition->parsimonyScore[qNumber]; 
+	    }
+	  totalScore += partitionScore; 
+        }
+
+      tr->parsimonyScore[pNumber] = totalScore + tr->parsimonyScore[rNumber] + tr->parsimonyScore[qNumber];      
+    }
+}
+
+
+unsigned int evaluateParsimonyIterativeFast(pllInstance *tr, partitionList * pr)
+{
+  size_t 
+    pNumber = (size_t)tr->ti[1],
+    qNumber = (size_t)tr->ti[2];
+
+  int
+    model;
+
+  unsigned int 
+    bestScore = tr->bestParsimony,    
+    sum;
+
+  if(tr->ti[0] > 4)
+    newviewParsimonyIterativeFast(tr, pr); 
+
+  sum = tr->parsimonyScore[pNumber] + tr->parsimonyScore[qNumber];
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+    {
+      size_t
+        k,
+        states = pr->partitionData[model]->states,
+        width  = pr->partitionData[model]->parsimonyLength, 
+        i;
+
+       switch(states)
+         {
+         case 2:
+           {
+             parsimonyNumber 
+               t_A,
+               t_C,           
+               t_N,
+               *left[2],
+               *right[2];
+             
+             for(k = 0; k < 2; k++)
+               {
+                 left[k]  = &(pr->partitionData[model]->parsVect[(width * 2 * qNumber) + width * k]);
+                 right[k] = &(pr->partitionData[model]->parsVect[(width * 2 * pNumber) + width * k]);
+               }     
+             
+             for(i = 0; i < width; i++)
+               {                                               
+                 t_A = left[0][i] & right[0][i];
+                 t_C = left[1][i] & right[1][i];
+                 
+                  t_N = ~(t_A | t_C);
+
+                  sum += ((unsigned int) __builtin_popcount(t_N));
+                 
+                 if(tr->fastParsimony && sum >= bestScore)
+                   return sum;                         
+               }
+           }
+           break;
+         case 4:
+           {
+             parsimonyNumber
+               t_A,
+               t_C,
+               t_G,
+               t_T,
+               t_N,
+               *left[4],
+               *right[4];
+      
+             for(k = 0; k < 4; k++)
+               {
+                 left[k]  = &(pr->partitionData[model]->parsVect[(width * 4 * qNumber) + width * k]);
+                 right[k] = &(pr->partitionData[model]->parsVect[(width * 4 * pNumber) + width * k]);
+               }        
+
+             for(i = 0; i < width; i++)
+               {                                                
+                  t_A = left[0][i] & right[0][i];
+                  t_C = left[1][i] & right[1][i];
+                  t_G = left[2][i] & right[2][i];         
+                  t_T = left[3][i] & right[3][i];
+
+                  t_N = ~(t_A | t_C | t_G | t_T);
+
+                  sum += ((unsigned int) __builtin_popcount(t_N));
+                 
+                 if(tr->fastParsimony && sum >= bestScore)            
+                   return sum;          
+               }                 
+           }
+           break;
+         case 20:
+           {
+             parsimonyNumber
+               t_A,
+               t_N,
+               *left[20],
+               *right[20];
+             
+              for(k = 0; k < 20; k++)
+                {
+                  left[k]  = &(pr->partitionData[model]->parsVect[(width * 20 * qNumber) + width * k]);
+                  right[k] = &(pr->partitionData[model]->parsVect[(width * 20 * pNumber) + width * k]);
+                }  
+           
+              for(i = 0; i < width; i++)
+                { 
+                  t_N = 0;
+                  
+                  for(k = 0; k < 20; k++)
+                    {
+                      t_A = left[k][i] & right[k][i];
+                      t_N = t_N | t_A;
+                    }
+               
+                  t_N = ~t_N;
+
+                  sum += ((unsigned int) __builtin_popcount(t_N));
+                  
+                  if(tr->fastParsimony && sum >= bestScore)      
+                    return sum;                        
+                }
+           }
+           break;
+         default:
+           {
+             parsimonyNumber
+               t_A,
+               t_N,
+               *left[32], 
+               *right[32];  
+
+             assert(states <= 32);
+
+             for(k = 0; k < states; k++)
+               {
+                 left[k]  = &(pr->partitionData[model]->parsVect[(width * states * qNumber) + width * k]);
+                 right[k] = &(pr->partitionData[model]->parsVect[(width * states * pNumber) + width * k]);
+               }  
+           
+             for(i = 0; i < width; i++)
+               {                               
+                 t_N = 0;
+                  
+                 for(k = 0; k < states; k++)
+                   {
+                     t_A = left[k][i] & right[k][i];
+                     t_N = t_N | t_A;
+                   }
+               
+                  t_N = ~t_N;
+
+                  sum += ((unsigned int) __builtin_popcount(t_N));
+                                                 
+                 if(tr->fastParsimony && sum >= bestScore)                     
+                   return sum;                     
+               }                     
+           }
+         }
+    }
+  
+  return sum;
+}
+
+#endif
+
+
+
+
+
+
+unsigned int evaluateParsimony(pllInstance *tr, partitionList *pr, nodeptr p, boolean full)
+{
+  volatile unsigned int result;
+  nodeptr q = p->back;
+  int
+    *ti = tr->ti,
+    counter = 4;
+  
+  ti[1] = p->number;
+  ti[2] = q->number;
+
+  if(full)
+    {
+      if(p->number > tr->mxtips)
+        computeTraversalInfoParsimony(p, ti, &counter, tr->mxtips, full);
+      if(q->number > tr->mxtips)
+        computeTraversalInfoParsimony(q, ti, &counter, tr->mxtips, full); 
+    }
+  else
+    {
+      if(p->number > tr->mxtips && !p->xPars)
+        computeTraversalInfoParsimony(p, ti, &counter, tr->mxtips, full);
+      if(q->number > tr->mxtips && !q->xPars)
+        computeTraversalInfoParsimony(q, ti, &counter, tr->mxtips, full); 
+    }
+
+  ti[0] = counter;
+
+  result = evaluateParsimonyIterativeFast(tr, pr);
+
+  return result;
+}
+
+
+void newviewParsimony(pllInstance *tr, partitionList *pr, nodeptr  p)
+{     
+  if(p->number <= tr->mxtips)
+    return;
+
+  {
+    int 
+      counter = 4;     
+           
+    computeTraversalInfoParsimony(p, tr->ti, &counter, tr->mxtips, PLL_FALSE);              
+    tr->ti[0] = counter;            
+    
+    newviewParsimonyIterativeFast(tr, pr);
+  }
+}
+
+
+
+
+
+/****************************************************************************************************************************************/
+
+static void insertParsimony (pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q)
+{
+  nodeptr  r;
+  
+  r = q->back;
+  
+  hookupDefault(p->next,       q);
+  hookupDefault(p->next->next, r);
+   
+  newviewParsimony(tr, pr, p);
+} 
+
+
+
+static nodeptr buildNewTip (pllInstance *tr, nodeptr p)
+{ 
+  nodeptr  q;
+
+  q = tr->nodep[(tr->nextnode)++];
+  hookupDefault(p, q);
+  q->next->back = (nodeptr)NULL;
+  q->next->next->back = (nodeptr)NULL;
+ 
+  return  q;
+} 
+
+void buildSimpleTree (pllInstance *tr, partitionList *pr, int ip, int iq, int ir)
+{    
+  nodeptr  p, s;
+  int  i;
+  
+  i = PLL_MIN(ip, iq);
+  if (ir < i)  i = ir; 
+  tr->start = tr->nodep[i];
+  tr->ntips = 3;
+  p = tr->nodep[ip];
+  hookupDefault(p, tr->nodep[iq]);
+  s = buildNewTip(tr, tr->nodep[ir]);
+  insertParsimony(tr, pr, s, p);
+}
+
+
+static void testInsertParsimony (pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q, boolean saveBranches)
+{ 
+  unsigned int 
+    mp;
+ 
+  nodeptr  
+    r = q->back;   
+
+  boolean 
+    doIt = PLL_TRUE;
+
+  int numBranches = pr->perGeneBranchLengths?pr->numberOfPartitions:1;
+
+  if(tr->grouped)
+    {
+      int 
+        rNumber = tr->constraintVector[r->number],
+        qNumber = tr->constraintVector[q->number],
+        pNumber = tr->constraintVector[p->number];
+
+      doIt = PLL_FALSE;
+     
+      if(pNumber == -9)
+        pNumber = checkerPars(tr, p->back);
+      if(pNumber == -9)
+        doIt = PLL_TRUE;
+      else
+        {
+          if(qNumber == -9)
+            qNumber = checkerPars(tr, q);
+
+          if(rNumber == -9)
+            rNumber = checkerPars(tr, r);
+
+          if(pNumber == rNumber || pNumber == qNumber)
+            doIt = PLL_TRUE;       
+        }
+    }
+
+  if(doIt)
+    {
+      double 
+        z[PLL_NUM_BRANCHES];
+      
+      if(saveBranches)
+        {
+          int i;
+          
+          for(i = 0; i < numBranches; i++)
+            z[i] = q->z[i];
+        }
+
+      insertParsimony(tr, pr, p, q);
+  
+      mp = evaluateParsimony(tr, pr, p->next->next, PLL_FALSE);
+
+      if(mp < tr->bestParsimony)
+        {
+          tr->bestParsimony = mp;
+          tr->insertNode = q;
+          tr->removeNode = p;
+        }
+      
+      if(saveBranches)
+        hookup(q, r, z, numBranches);
+      else
+        hookupDefault(q, r);
+      
+      p->next->next->back = p->next->back = (nodeptr) NULL;
+    }
+       
+  return;
+} 
+
+
+static void restoreTreeParsimony(pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q)
+{ 
+  nodeptr
+    r = q->back;
+  
+  int counter = 4;
+  
+  hookupDefault(p->next,       q);
+  hookupDefault(p->next->next, r);
+  
+  computeTraversalInfoParsimony(p, tr->ti, &counter, tr->mxtips, PLL_FALSE);              
+  tr->ti[0] = counter;
+    
+  newviewParsimonyIterativeFast(tr, pr);
+}
+
+
+static void addTraverseParsimony (pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q, int mintrav, int maxtrav, boolean doAll, boolean saveBranches)
+{        
+  if (doAll || (--mintrav <= 0))               
+    testInsertParsimony(tr, pr, p, q, saveBranches);
+
+  if (((q->number > tr->mxtips)) && ((--maxtrav > 0) || doAll))
+    {         
+      addTraverseParsimony(tr, pr, p, q->next->back, mintrav, maxtrav, doAll, saveBranches);
+      addTraverseParsimony(tr, pr, p, q->next->next->back, mintrav, maxtrav, doAll, saveBranches);
+    }
+}
+
+
+
+
+
+void makePermutationFast(int *perm, int n, pllInstance *tr)
+{    
+  int  
+    i, 
+    j, 
+    k;
+
+  for (i = 1; i <= n; i++)    
+    perm[i] = i;               
+
+  for (i = 1; i <= n; i++) 
+    {      
+      double d =  randum(&tr->randomNumberSeed);
+
+      k =  (int)((double)(n + 1 - i) * d);
+      
+      j        = perm[i];
+
+      perm[i]     = perm[i + k];
+      perm[i + k] = j; 
+    }
+}
+
+//static nodeptr  removeNodeParsimony (nodeptr p, tree *tr)
+static nodeptr  removeNodeParsimony (nodeptr p)
+{ 
+  nodeptr  q, r;         
+
+  q = p->next->back;
+  r = p->next->next->back;   
+    
+  hookupDefault(q, r);
+
+  p->next->next->back = p->next->back = (node *) NULL;
+  
+  return  q;
+}
+
+static int rearrangeParsimony(pllInstance *tr, partitionList *pr, nodeptr p, int mintrav, int maxtrav, boolean doAll)
+{   
+  nodeptr  
+    p1, 
+    p2, 
+    q, 
+    q1, 
+    q2;
+  
+  int      
+    mintrav2; 
+
+  boolean 
+    doP = PLL_TRUE,
+    doQ = PLL_TRUE;
+           
+  if (maxtrav > tr->ntips - 3)  
+    maxtrav = tr->ntips - 3; 
+
+  assert(mintrav == 1);
+
+  if(maxtrav < mintrav)
+    return 0;
+
+  q = p->back;
+
+  if(tr->constrained)
+    {    
+      if(! tipHomogeneityCheckerPars(tr, p->back, 0))
+        doP = PLL_FALSE;
+        
+      if(! tipHomogeneityCheckerPars(tr, q->back, 0))
+        doQ = PLL_FALSE;
+                        
+      if(doQ == PLL_FALSE && doP == PLL_FALSE)
+        return 0;
+    }  
+
+  if((p->number > tr->mxtips) && doP) 
+    {     
+      p1 = p->next->back;
+      p2 = p->next->next->back;
+      
+      if ((p1->number > tr->mxtips) || (p2->number > tr->mxtips)) 
+        {                 
+          //removeNodeParsimony(p, tr);          
+          removeNodeParsimony(p);                
+
+          if ((p1->number > tr->mxtips)) 
+            {
+              addTraverseParsimony(tr, pr, p, p1->next->back, mintrav, maxtrav, doAll, PLL_FALSE);
+              addTraverseParsimony(tr, pr, p, p1->next->next->back, mintrav, maxtrav, doAll, PLL_FALSE);
+            }
+         
+          if ((p2->number > tr->mxtips)) 
+            {
+              addTraverseParsimony(tr, pr, p, p2->next->back, mintrav, maxtrav, doAll, PLL_FALSE);
+              addTraverseParsimony(tr, pr, p, p2->next->next->back, mintrav, maxtrav, doAll, PLL_FALSE);
+            }
+            
+           
+          hookupDefault(p->next,       p1);
+          hookupDefault(p->next->next, p2);
+
+          newviewParsimony(tr, pr, p);
+        }
+    }  
+       
+  if ((q->number > tr->mxtips) && (maxtrav > 0) && doQ) 
+    {
+      q1 = q->next->back;
+      q2 = q->next->next->back;
+
+      if (
+          (
+           (q1->number > tr->mxtips) && 
+           ((q1->next->back->number > tr->mxtips) || (q1->next->next->back->number > tr->mxtips))
+           )
+          ||
+          (
+           (q2->number > tr->mxtips) && 
+           ((q2->next->back->number > tr->mxtips) || (q2->next->next->back->number > tr->mxtips))
+           )
+          )
+        {          
+
+          //removeNodeParsimony(q, tr);
+          removeNodeParsimony(q);
+          
+          mintrav2 = mintrav > 2 ? mintrav : 2;
+          
+          if ((q1->number > tr->mxtips)) 
+            {
+              addTraverseParsimony(tr, pr, q, q1->next->back, mintrav2 , maxtrav, doAll, PLL_FALSE);
+              addTraverseParsimony(tr, pr, q, q1->next->next->back, mintrav2 , maxtrav, doAll, PLL_FALSE);
+            }
+         
+          if ((q2->number > tr->mxtips)) 
+            {
+              addTraverseParsimony(tr, pr, q, q2->next->back, mintrav2 , maxtrav, doAll, PLL_FALSE);
+              addTraverseParsimony(tr, pr, q, q2->next->next->back, mintrav2 , maxtrav, doAll, PLL_FALSE);
+            }      
+           
+          hookupDefault(q->next,       q1);
+          hookupDefault(q->next->next, q2);
+           
+          newviewParsimony(tr, pr, q);
+        }
+    }
+
+  return 1;
+} 
+
+
+static void restoreTreeRearrangeParsimony(pllInstance *tr, partitionList *pr)
+{    
+  removeNodeParsimony(tr->removeNode);  
+  //removeNodeParsimony(tr->removeNode, tr);  
+  restoreTreeParsimony(tr, pr, tr->removeNode, tr->insertNode);
+}
+
+/*
+static boolean isInformative2(pllInstance *tr, int site)
+{
+  int
+    informativeCounter = 0,
+    check[256],   
+    j,   
+    undetermined = 15;
+
+  unsigned char
+    nucleotide,
+    target = 0;
+        
+  for(j = 0; j < 256; j++)
+    check[j] = 0;
+  
+  for(j = 1; j <= tr->mxtips; j++)
+    {      
+      nucleotide = tr->yVector[j][site];            
+      check[nucleotide] =  check[nucleotide] + 1;                  
+    }
+  
+  
+  if(check[1] > 1)
+    {
+      informativeCounter++;    
+      target = target | 1;
+    }
+  if(check[2] > 1)
+    {
+      informativeCounter++; 
+      target = target | 2;
+    }
+  if(check[4] > 1)
+    {
+      informativeCounter++; 
+      target = target | 4;
+    }
+  if(check[8] > 1)
+    {
+      informativeCounter++; 
+      target = target | 8;
+    }
+          
+  if(informativeCounter >= 2)
+    return PLL_TRUE;    
+  else
+    {        
+      for(j = 0; j < undetermined; j++)
+        {
+          if(j == 3 || j == 5 || j == 6 || j == 7 || j == 9 || j == 10 || j == 11 || 
+             j == 12 || j == 13 || j == 14)
+            {
+              if(check[j] > 1)
+                {
+                  if(!(target & j))
+                    return PLL_TRUE;
+                }
+            }
+        } 
+    }
+     
+  return PLL_FALSE;          
+}
+*/
+
+static boolean isInformative(pllInstance *tr, int dataType, int site)
+{
+  int
+    informativeCounter = 0,
+    check[256],   
+    j,   
+    undetermined = getUndetermined(dataType);
+
+  const unsigned int
+    *bitVector = getBitVector(dataType);
+
+  unsigned char
+    nucleotide;
+  
+        
+  for(j = 0; j < 256; j++)
+    check[j] = 0;
+  
+  for(j = 1; j <= tr->mxtips; j++)
+    {      
+      nucleotide = tr->yVector[j][site];            
+      check[nucleotide] =  check[nucleotide] + 1;
+      assert(bitVector[nucleotide] > 0);                   
+    }
+  
+  for(j = 0; j < undetermined; j++)
+    {
+      if(check[j] > 0)
+        informativeCounter++;    
+    } 
+          
+  if(informativeCounter <= 1)
+    return PLL_FALSE;    
+  else
+    {        
+      for(j = 0; j < undetermined; j++)
+        {
+          if(check[j] > 1)
+            return PLL_TRUE;
+        } 
+    }
+     
+  return PLL_FALSE;          
+}
+
+
+static void determineUninformativeSites(pllInstance *tr, partitionList *pr, int *informative)
+{
+  int 
+    model,
+    number = 0,
+    i;
+
+  /* 
+     Not all characters are useful in constructing a parsimony tree. 
+     Invariant characters, those that have the same state in all taxa, 
+     are obviously useless and are ignored by the method. Characters in 
+     which a state occurs in only one taxon are also ignored. 
+     All these characters are called parsimony uninformative.
+
+     Alternative definition: informative columns contain at least two types
+     of nucleotides, and each nucleotide must appear at least twice in each 
+     column. Kind of a pain if we intend to check for this when using, e.g.,
+     amibiguous DNA encoding.
+  */
+
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+    {
+      for(i = pr->partitionData[model]->lower; i < pr->partitionData[model]->upper; i++)
+        {
+           if(isInformative(tr, pr->partitionData[model]->dataType, i))
+             informative[i] = 1;
+           else
+             {
+               informative[i] = 0;
+               number++;
+             }  
+        }      
+    }
+
+ 
+  /* printf("Uninformative Patterns: %d\n", number); */
+}
+
+
+static void reorderNodes(pllInstance *tr, nodeptr *np, nodeptr p, int *count)
+{
+  int i, found = 0;
+
+  if((p->number <= tr->mxtips))    
+    return;
+  else
+    {              
+      for(i = tr->mxtips + 1; (i <= (tr->mxtips + tr->mxtips - 1)) && (found == 0); i++)
+        {
+          if (p == np[i] || p == np[i]->next || p == np[i]->next->next)
+            {
+              if(p == np[i])                           
+                tr->nodep[*count + tr->mxtips + 1] = np[i];                             
+              else
+                {
+                  if(p == np[i]->next)            
+                    tr->nodep[*count + tr->mxtips + 1] = np[i]->next;                      
+                  else             
+                    tr->nodep[*count + tr->mxtips + 1] = np[i]->next->next;                                 
+                }
+
+              found = 1;                     
+              *count = *count + 1;
+            }
+        }            
+     
+      assert(found != 0);
+
+      reorderNodes(tr, np, p->next->back, count);     
+      reorderNodes(tr, np, p->next->next->back, count);                
+    }
+}
+
+
+
+static void nodeRectifierPars(pllInstance *tr)
+{
+  nodeptr *np = (nodeptr *)rax_malloc(2 * tr->mxtips * sizeof(nodeptr));
+  int i;
+  int count = 0;
+  
+  tr->start       = tr->nodep[1];
+  tr->rooted      = PLL_FALSE;
+
+  /* TODO why is tr->rooted set to PLL_FALSE here ?*/
+  
+  for(i = tr->mxtips + 1; i <= (tr->mxtips + tr->mxtips - 1); i++)
+    np[i] = tr->nodep[i];           
+  
+  reorderNodes(tr, np, tr->start->back, &count); 
+
+ 
+  rax_free(np);
+}
+
+
+  
+static void compressDNA(pllInstance *tr, partitionList *pr, int *informative)
+{
+  size_t
+    totalNodes,
+    i,
+    model;
+   
+  totalNodes = 2 * (size_t)tr->mxtips;
+
+  for(model = 0; model < (size_t) pr->numberOfPartitions; model++)
+    {
+      size_t
+        k,
+        states = (size_t)pr->partitionData[model]->states,
+        compressedEntries,
+        compressedEntriesPadded,
+        entries = 0, 
+        lower = pr->partitionData[model]->lower,
+        upper = pr->partitionData[model]->upper;
+
+      parsimonyNumber 
+        **compressedTips = (parsimonyNumber **)rax_malloc(states * sizeof(parsimonyNumber*)),
+        *compressedValues = (parsimonyNumber *)rax_malloc(states * sizeof(parsimonyNumber));
+      
+      for(i = lower; i < upper; i++)    
+        if(informative[i])
+          entries += (size_t)tr->aliaswgt[i];     
+  
+      compressedEntries = entries / PLL_PCF;
+
+      if(entries % PLL_PCF != 0)
+        compressedEntries++;
+
+#if (defined(__SSE3) || defined(__AVX))
+      if(compressedEntries % INTS_PER_VECTOR != 0)
+        compressedEntriesPadded = compressedEntries + (INTS_PER_VECTOR - (compressedEntries % INTS_PER_VECTOR));
+      else
+        compressedEntriesPadded = compressedEntries;
+#else
+      compressedEntriesPadded = compressedEntries;
+#endif     
+
+      
+      rax_posix_memalign ((void **) &(pr->partitionData[model]->parsVect), PLL_BYTE_ALIGNMENT, (size_t)compressedEntriesPadded * states * totalNodes * sizeof(parsimonyNumber));
+     
+      for(i = 0; i < compressedEntriesPadded * states * totalNodes; i++)      
+        pr->partitionData[model]->parsVect[i] = 0;
+
+      for(i = 0; i < (size_t)tr->mxtips; i++)
+        {
+          size_t
+            w = 0,
+            compressedIndex = 0,
+            compressedCounter = 0,
+            index = 0;
+
+          for(k = 0; k < states; k++)
+            {
+              compressedTips[k] = &(pr->partitionData[model]->parsVect[(compressedEntriesPadded * states * (i + 1)) + (compressedEntriesPadded * k)]);
+              compressedValues[k] = 0;
+            }                
+              
+          for(index = lower; index < (size_t)upper; index++)
+            {
+              if(informative[index])
+                {
+                  const unsigned int 
+                    *bitValue = getBitVector(pr->partitionData[model]->dataType);
+
+                  parsimonyNumber 
+                    value = bitValue[tr->yVector[i + 1][index]];          
+              
+                  for(w = 0; w < (size_t)tr->aliaswgt[index]; w++)
+                    {      
+                      for(k = 0; k < states; k++)
+                        {
+                          if(value & mask32[k])
+                            compressedValues[k] |= mask32[compressedCounter];
+                        }
+                     
+                      compressedCounter++;
+                  
+                      if(compressedCounter == PLL_PCF)
+                        {
+                          for(k = 0; k < states; k++)
+                            {
+                              compressedTips[k][compressedIndex] = compressedValues[k];
+                              compressedValues[k] = 0;
+                            }                    
+                          
+                          compressedCounter = 0;
+                          compressedIndex++;
+                        }
+                    }
+                }
+            }
+                           
+          for(;compressedIndex < compressedEntriesPadded; compressedIndex++)
+            {   
+              for(;compressedCounter < PLL_PCF; compressedCounter++)              
+                for(k = 0; k < states; k++)
+                  compressedValues[k] |= mask32[compressedCounter];               
+          
+              for(k = 0; k < states; k++)
+                {
+                  compressedTips[k][compressedIndex] = compressedValues[k];
+                  compressedValues[k] = 0;
+                }                     
+              
+              compressedCounter = 0;
+            }           
+        }               
+  
+      pr->partitionData[model]->parsimonyLength = compressedEntriesPadded;
+
+      rax_free(compressedTips);
+      rax_free(compressedValues);
+    }
+  
+  rax_posix_memalign ((void **) &(tr->parsimonyScore), PLL_BYTE_ALIGNMENT, sizeof(unsigned int) * totalNodes);  
+  
+  /* TODO initialize parsScorePerPartition, if you want to have it  */
+    
+  for(i = 0; i < totalNodes; i++) 
+    tr->parsimonyScore[i] = 0;
+}
+
+
+
+static void stepwiseAddition(pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q)
+{            
+  nodeptr 
+    r = q->back;
+
+  unsigned int 
+    mp;
+  
+  int 
+    counter = 4;
+  
+  p->next->back = q;
+  q->back = p->next;
+
+  p->next->next->back = r;
+  r->back = p->next->next;
+   
+  computeTraversalInfoParsimony(p, tr->ti, &counter, tr->mxtips, PLL_FALSE);              
+  tr->ti[0] = counter;
+  tr->ti[1] = p->number;
+  tr->ti[2] = p->back->number;
+    
+  mp = evaluateParsimonyIterativeFast(tr, pr);
+  
+  if(mp < tr->bestParsimony)
+    {    
+      tr->bestParsimony = mp;
+      tr->insertNode = q;     
+    }
+ 
+  q->back = r;
+  r->back = q;
+   
+  if(q->number > tr->mxtips && tr->parsimonyScore[q->number] > 0)
+    {         
+      stepwiseAddition(tr, pr, p, q->next->back);
+      stepwiseAddition(tr, pr, p, q->next->next->back);
+    }
+}
+
+
+
+void allocateParsimonyDataStructures(pllInstance *tr, partitionList *pr)
+{
+  int 
+    i,
+    *informative = (int *)rax_malloc(sizeof(int) * (size_t)tr->originalCrunchedLength);
+ 
+  determineUninformativeSites(tr, pr, informative);
+
+  compressDNA(tr, pr, informative);
+
+  for(i = tr->mxtips + 1; i <= tr->mxtips + tr->mxtips - 1; i++)
+    {
+      nodeptr 
+        p = tr->nodep[i];
+
+      p->xPars = 1;
+      p->next->xPars = 0;
+      p->next->next->xPars = 0;
+    }
+
+  tr->ti = (int*)rax_malloc(sizeof(int) * 4 * (size_t)tr->mxtips);  
+
+  rax_free(informative); 
+}
+
+void pllFreeParsimonyDataStructures(pllInstance *tr, partitionList *pr)
+{
+  size_t 
+    model;
+
+  rax_free(tr->parsimonyScore);
+  
+  for(model = 0; model < (size_t) pr->numberOfPartitions; ++model)
+    rax_free(pr->partitionData[model]->parsVect);
+  
+  rax_free(tr->ti);
+}
+
+
+void pllMakeParsimonyTreeFast(pllInstance *tr, partitionList *pr, boolean withSPRs)
+{   
+  nodeptr  
+    p, 
+    f;    
+
+  int 
+    i, 
+    nextsp,
+    *perm        = (int *)rax_malloc((size_t)(tr->mxtips + 1) * sizeof(int));  
+
+  unsigned int 
+    randomMP, 
+    startMP;         
+  
+  assert(!tr->constrained);
+
+  makePermutationFast(perm, tr->mxtips, tr);
+  
+  tr->ntips = 0;    
+  
+  tr->nextnode = tr->mxtips + 1;       
+  
+  buildSimpleTree(tr, pr, perm[1], perm[2], perm[3]);
+  
+  f = tr->start;       
+  
+  while(tr->ntips < tr->mxtips) 
+    {   
+      nodeptr q;
+      
+      tr->bestParsimony = INT_MAX;
+      nextsp = ++(tr->ntips);             
+      p = tr->nodep[perm[nextsp]];                 
+      q = tr->nodep[(tr->nextnode)++];
+      p->back = q;
+      q->back = p;
+        
+      if(tr->grouped)
+        {
+          int 
+            number = p->back->number;            
+
+          tr->constraintVector[number] = -9;
+        }
+          
+      stepwiseAddition(tr, pr, q, f->back);
+      
+      {
+        nodeptr   
+          r = tr->insertNode->back;
+        
+        int counter = 4;
+        
+        hookupDefault(q->next,       tr->insertNode);
+        hookupDefault(q->next->next, r);
+        
+        computeTraversalInfoParsimony(q, tr->ti, &counter, tr->mxtips, PLL_FALSE);              
+        tr->ti[0] = counter;
+        
+        newviewParsimonyIterativeFast(tr, pr);
+      }
+    }    
+
+  if(withSPRs)
+    {
+      nodeRectifierPars(tr);
+  
+      randomMP = tr->bestParsimony;        
+  
+      do
+	{
+	  startMP = randomMP;
+	  nodeRectifierPars(tr);
+	  for(i = 1; i <= tr->mxtips + tr->mxtips - 2; i++)
+	    {
+	      rearrangeParsimony(tr, pr, tr->nodep[i], 1, 20, PLL_FALSE);
+	      if(tr->bestParsimony < randomMP)
+		{           
+		  restoreTreeRearrangeParsimony(tr, pr);
+		  randomMP = tr->bestParsimony;
+		}
+	    }                          
+	}
+      while(randomMP < startMP);
+    }
+  
+  rax_free(perm);
+} 
diff --git a/lib/pll/genericParallelization.c b/lib/pll/genericParallelization.c
new file mode 100644
index 0000000..b44029b
--- /dev/null
+++ b/lib/pll/genericParallelization.c
@@ -0,0 +1,2182 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file genericParallelization.c
+ */
+#include "mem_alloc.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <limits.h>
+
+#ifdef MEASURE_TIME_PARALLEL
+#include <time.h>
+#endif
+
+#include <assert.h>
+
+#include "genericParallelization.h"
+#include "pllInternal.h"
+#include "pll.h"
+
+/** @file genericParallelization.c
+    
+    @brief Generic master-worker parallelization with either pthreads or MPI. 
+    
+    Worker threads/processes mostly work on a local
+    tree. Implementationwise, MPI operations are abstracted as good as
+    possible via defines (that translate to no-ops or memcpy-calls in
+    the pthreads version).
+
+    @todo the code still contains many memory copy operations that
+    could be executed more efficiently in-place  
+*/
+
+
+
+void perSiteLogLikelihoodsPthreads(pllInstance *tr, partitionList *pr, double *lhs, int n, int tid);
+void broadcastAfterRateOpt(pllInstance *tr, pllInstance *localTree, partitionList *pr, int n, int tid);
+void branchLength_parallelReduce(pllInstance *tr, double *dlnLdlz,  double *d2lnLdlz2, int numBranches );
+void pllMasterPostBarrier(pllInstance *tr, partitionList *pr, int jobType);
+static void distributeYVectors(pllInstance *localTree, pllInstance *tr, partitionList *localPr);
+static void distributeWeights(pllInstance *localTree, pllInstance *tr, partitionList *localPr);
+static boolean execFunction(pllInstance *tr, pllInstance *localTree, partitionList *pr, partitionList *localPr, int tid, int n);
+
+static void *likelihoodThread(void *tData); 
+
+static void multiprocessorScheduling(pllInstance * tr, partitionList *pr, int tid);
+
+static void computeFraction(partitionList *localPr, int tid, int n);
+static void computeFractionMany(partitionList *localPr, int tid);
+static void initializePartitionsMaster(pllInstance *tr, pllInstance *localTree, partitionList *pr, partitionList *localPr, int tid, int n);
+
+#ifdef _FINE_GRAIN_MPI
+static char* addBytes(char *buf, void *toAdd, size_t numBytes); 
+static char* popBytes(char *buf, void *result, size_t numBytes); 
+static void defineTraversalInfoMPI(void);
+static boolean pllWorkerTrap(pllInstance *tr, partitionList *pr);
+#endif
+
+#ifdef _USE_PTHREADS
+static pthread_t *threads;
+static threadData *tData;
+#endif
+
+extern volatile int jobCycle; 
+extern volatile int threadJob;          /**< current job to be done by worker threads/processes */
+extern boolean treeIsInitialized; 
+
+#ifdef MEASURE_TIME_PARALLEL
+extern double masterTimePerPhase; 
+double timeBuffer[NUM_PAR_JOBS]; 
+double timePerRegion[NUM_PAR_JOBS]; 
+#endif
+
+extern char* getJobName(int tmp); 
+
+//extern double *globalResult; 
+extern volatile char *barrierBuffer;
+
+
+#ifdef _FINE_GRAIN_MPI
+extern MPI_Datatype TRAVERSAL_MPI; 
+
+/** @brief Pthreads helper function for adding bytes to communication buffer.
+
+    Copy from \toAdd to \a buf \a numBytes bytes
+
+    @param buf
+      Where to place bytes
+
+    @pram toAdd
+      Where to copy them from
+
+    @para numBytes
+      How many to copy
+
+    @return
+      Pointer to the end of placed data in communication buffer (first free slot)
+ */ 
+static char* addBytes(char *buf, void *toAdd, size_t numBytes)
+{
+  memcpy(buf, toAdd, numBytes);  
+  return buf + numBytes;  
+}
+
+/** @brief Pthreads helper function for removing bytes from communication buffer
+    
+    Copies \a numBytes from communication buffer \a buf to some local buffer \a buf
+
+    @param buf
+      Where to store the bytes
+
+    @param result
+      Where to copy from
+
+    @param numBytes
+      How many to copy
+    
+    @return
+      Pointer to the end of read data in communication buffer (first free slot)
+ */ 
+static char* popBytes(char *buf, void *result, size_t numBytes)
+{
+  memcpy(result, buf, numBytes); 
+  return buf + numBytes;   
+}
+
+/** @brief Lock the MPI slave processes prior allocating partitions
+
+    MPI slave processes are locked and wait until the master process
+    has read the number of partitions, which it then broadcasts
+    to slaves, effectively unlocking them. The slave processes will
+    then allocate their own data structures and be locked in the
+    likelihood function.
+
+    @param tr
+      PLL instance
+    
+    @todo
+      This function should not be called by the user. It is called
+      at \a pllCreateInstance. Probably this function should be removed
+      and inline code be placed in \a pllCreateInstance.
+*/
+void pllLockMPI (pllInstance * tr)
+{
+  int numberOfPartitions;
+  partitionList * pr;
+
+  if (!MASTER_P) 
+   {
+     //MPI_Bcast (&numberOfPartitions, 1, MPI_INT, MPI_ROOT, MPI_COMM_WORLD);
+     MPI_Bcast (&numberOfPartitions, 1, MPI_INT, 0, MPI_COMM_WORLD);
+     pr = (partitionList *) calloc (1, sizeof (partitionList));
+     pr->numberOfPartitions = numberOfPartitions;
+
+     pllWorkerTrap (tr, pr);
+     MPI_Barrier (MPI_COMM_WORLD);
+     MPI_Finalize ();
+     exit(0);
+   }
+}
+
+/** Finalize MPI run
+
+    Finalizes MPI run by synchronizing all processes (master + slaves) with a
+    barrier so that all free their allocated resources. Then \a MPI_Finalize ()
+    is called.
+
+    @todo
+      Similarly as with the \a pllLockMPI function, this should not be called
+      by the user, but it is called implicitly at the end of \a pllDestroyInstance.
+      Probably this function should be removed and inline code be placed in
+      \a pllDestroyInstance.
+*/
+void pllFinalizeMPI (void)
+{
+  MPI_Barrier (MPI_COMM_WORLD);
+  MPI_Finalize ();
+}
+
+/**
+   @brief Sets up the MPI environment.  
+
+   Calls the \a MPI_Init function and makes sure all processes store
+   their process ID and the total number of processes, using a barrier.
+   
+   @note this should be the first call that is executed in your main
+   method.
+   
+   @param argc   
+     Address of argc from main
+   @param argv   
+     Address of argv from main
+ */
+void pllInitMPI(int * argc, char **argv[])
+{  
+  MPI_Init(argc, argv);
+  MPI_Comm_rank(MPI_COMM_WORLD, &processID);
+  MPI_Comm_size(MPI_COMM_WORLD, &processes);
+
+  /* if(MASTER_P) */
+  /*   printf("\nThis is RAxML Process Number: %d (MASTER)\n", processID); */
+  MPI_Barrier(MPI_COMM_WORLD);
+
+}
+
+
+/**
+   @brief Traps worker MPI processes.    
+   
+   @note  This function should be called immediately after initMPI()
+
+   @param tr 
+     PLL instance 
+
+   @param pr
+     List of partitions
+
+   @return
+     Returns /b PLL_FALSE if the callee was the master thread/process, otherwise /b PLL_TRUE
+ */ 
+static boolean pllWorkerTrap(pllInstance *tr, partitionList *pr)
+{
+  /// @note for the broadcasting, we need to, if the tree structure has already been initialized 
+  treeIsInitialized = PLL_FALSE; 
+
+  if(NOT MASTER_P) 
+    {
+      threadData tData; 
+      tData.tr = tr; 
+      tData.threadNumber = processID;
+      tData.pr = pr;
+      
+      likelihoodThread(&tData);
+
+      /* notice: the next call MUST be the return call from the main method */
+      return PLL_TRUE; 
+    }
+  return PLL_FALSE; 
+}
+
+
+#define ELEMS_IN_TRAV_INFO  9
+/** @brief Create a datastructure for sending the traversal descriptor.
+    
+    @note This seems to be a very safe method to define your own mpi
+   datatypes (often there are problems with padding). But it is not
+   entirely for the weak of heart...
+ */ 
+static void defineTraversalInfoMPI (void)
+{
+  MPI_Datatype *result  = &TRAVERSAL_MPI; 
+
+  int i ; 
+  MPI_Aint base; 
+  int blocklen[ELEMS_IN_TRAV_INFO+1] = {1, 1, 1, 1, PLL_NUM_BRANCHES, PLL_NUM_BRANCHES, 1,1,1,1}; 
+  MPI_Aint disp[ELEMS_IN_TRAV_INFO+1];
+  MPI_Datatype type[ELEMS_IN_TRAV_INFO+1] = {MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_DOUBLE, MPI_DOUBLE, MPI_INT, MPI_INT, MPI_INT, MPI_UB}; 
+  traversalInfo desc[2]; 
+
+  MPI_Get_address( desc, disp);
+  MPI_Get_address( &(desc[0].pNumber), disp + 1 );
+  MPI_Get_address( &(desc[0].qNumber), disp + 2 );  
+  MPI_Get_address( &(desc[0].rNumber), disp + 3); 
+  MPI_Get_address( desc[0].qz, disp + 4 );
+  MPI_Get_address( desc[0].rz, disp + 5 );
+  MPI_Get_address( &(desc[0].slot_p), disp + 6);
+  MPI_Get_address( &(desc[0].slot_q), disp + 7);
+  MPI_Get_address( &(desc[0].slot_r), disp + 8);
+  MPI_Get_address( desc + 1, disp + 9);
+
+  base = disp[0]; 
+  for(i = 0; i < ELEMS_IN_TRAV_INFO+1; ++i)
+    disp[i] -= base;
+
+  MPI_Type_create_struct( ELEMS_IN_TRAV_INFO+1 , blocklen, disp, type, result);
+  MPI_Type_commit(result);
+}
+
+
+#endif
+
+
+/********************/
+/* PTHREAD-SPECIFIC */
+/********************/
+#ifdef _USE_PTHREADS
+
+#ifndef _PORTABLE_PTHREADS
+/** @brief Pins a thread to a core (for efficiency). 
+
+    This is a non-portable function that works only on some linux distributions of pthreads.
+    It sets the affinity of each thread to a specific core so that the performance is not
+    degraded due to threads migration.
+
+    @note 
+      It is only called if \a _PORTABLE_PTHREADS is not defined
+
+    @param tid the thread id
+ */ 
+void pinToCore(int tid)
+{
+  static int nextCore = 0;
+
+  cpu_set_t cpuset;
+
+  CPU_ZERO(&cpuset);    
+  CPU_SET(nextCore++, &cpuset);
+
+  if(pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset) != 0)
+    {
+      assert(0);
+    }
+}
+#endif
+
+/**  Start PThreads
+
+     Start JOINABLE threads by executing \a pthread_create. The threads
+     are attached to the \a pllLikelihoodThread function
+
+     @param tr
+       PLL instance
+
+     @param pr
+       List of partitions
+
+     @todo
+       This function should never be called by the user. It is called
+       implicitly at \a pllInitModel. Perhaps we should add a check
+       or inline the code
+ */ 
+void pllStartPthreads (pllInstance *tr, partitionList *pr)
+{
+  pthread_attr_t attr;
+  int rc, t;
+  treeIsInitialized = PLL_FALSE; 
+
+  jobCycle        = 0;
+  threadJob       = 0;
+
+  /* printf("\nThis is the RAxML Master Pthread\n");   */
+
+#if (NOT defined(_USE_PTHREADS) && defined( MEASURE_TIME_PARALLEL))
+  timeBuffer = rax_calloc(NUM_PAR_JOBS * tr->numberOfThreads, sizeof(double)); 
+#endif
+
+  pthread_attr_init(&attr);
+  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+
+  threads    = (pthread_t *)rax_malloc((size_t)tr->numberOfThreads * sizeof(pthread_t));
+  tData      = (threadData *)rax_malloc((size_t)tr->numberOfThreads * sizeof(threadData));
+
+  barrierBuffer            = (volatile char *)  rax_malloc(sizeof(volatile char)   *  (size_t)tr->numberOfThreads);
+
+  for(t = 0; t < tr->numberOfThreads; t++)
+    barrierBuffer[t] = 0;
+
+  for(t = 1; t < tr->numberOfThreads; t++)
+    {
+      tData[t].tr  = tr;
+      tData[t].pr  = pr;
+      tData[t].threadNumber = t;
+      rc = pthread_create(&threads[t], &attr, likelihoodThread, (void *)(&tData[t]));
+      if(rc)
+	{
+	  printf("ERROR; return code from pthread_create() is %d\n", rc);
+	  exit(-1);
+	}
+    }
+  pthread_attr_destroy (&attr);
+}
+
+/** Stop PThread
+    
+    Stop threads by \a pthread_join
+
+    @param  tr
+      PLL instance
+
+    @todo
+      This function should never be called by the user. It is implicitly called
+      at \a pllPartitionsDestroy. We should inline the code
+*/
+void pllStopPthreads (pllInstance * tr)
+{
+  int i;
+
+  for (i = 1; i < tr->numberOfThreads; ++ i)
+   {
+     pthread_join (threads[i], NULL);
+   }
+ 
+  rax_free (threads);
+  rax_free (tData);
+  rax_free ((void *)barrierBuffer);
+  rax_free (globalResult);
+
+}
+#endif
+
+
+/** Compute per-site log likelihoods (PThreads version) 
+
+    Worker threads evaluate the likelihood on their sites
+
+    @param tr 
+      Tree instance
+
+    @param lhs
+      Likelihood array
+
+    @param n
+      Number of threads
+
+    @param tid
+      Thread id
+ */ 
+void perSiteLogLikelihoodsPthreads(pllInstance *tr, partitionList *pr, double *lhs, int n, int tid)
+{
+  size_t 
+    model, 
+    i;
+
+  for(model = 0; model < (size_t)pr->numberOfPartitions; model++)
+    {      
+      size_t 
+	localIndex = 0;
+
+      /* decide if this partition is handled by the thread when -Q is ativated 
+	 or when -Q is not activated figure out which sites have been assigned to the 
+	 current thread */
+
+      boolean 
+	execute = ((tr->manyPartitions && isThisMyPartition(pr, tid, model)) || (!tr->manyPartitions));
+
+      /* if the entire partition has been assigned to this thread (-Q) or if -Q is not activated 
+	 we need to compute some per-site log likelihoods with thread tid for this partition */
+
+      if(execute)
+	for(i = (size_t)(pr->partitionData[model]->lower);  i < (size_t)(pr->partitionData[model]->upper); i++)
+	  {
+	    /* if -Q is active we compute all per-site log likelihoods for the partition,
+	       othwerise we only compute those that have been assigned to thread tid 
+	       using the cyclic distribution scheme */
+
+	    if(tr->manyPartitions || (i % n == (size_t)tid))
+	      {
+		double 
+		  l;
+
+		/* now compute the per-site log likelihood at the current site */
+
+		switch(tr->rateHetModel)
+		  {
+		  case PLL_CAT:
+		    l = evaluatePartialGeneric (tr, pr, localIndex, pr->partitionData[model]->perSiteRates[pr->partitionData[model]->rateCategory[localIndex]], model);
+		    break;
+		  case PLL_GAMMA:
+		    l = evaluatePartialGeneric (tr, pr, localIndex, 1.0, model);
+		    break;
+		  default:
+		    assert(0);
+		  }
+
+		/* store it in an array that is local in memory to the current thread,
+		   see function collectDouble() in axml.c for understanding how we then collect these 
+		   values stored in local arrays from the threads */
+
+		lhs[i] = l;
+
+		localIndex++;
+	      }
+	  }
+    }
+}
+
+/** @brief Check if a partition is assign to a thread/process.
+
+    Checks whether partition \a model from partition list \a localPr is
+    assigned to be processed by process/thread with id \a tid.
+
+    @param localTree
+      Local PLL instance
+
+    @param tid 
+      Thread/Process id
+
+    @param model
+      Partition number
+ */ 
+boolean isThisMyPartition(partitionList *localPr, int tid, int model)
+{ 
+  if(localPr->partitionData[model]->partitionAssignment == tid)
+    return PLL_TRUE;
+  else
+    return PLL_FALSE;
+}
+
+/** @brief Computes partition size for all partitions (in case full partitions are assigns to workers). 
+
+    @param localPr the local partitions instance
+    
+    @param tid thread id    
+ */ 
+static void computeFractionMany(partitionList *localPr, int tid)
+{
+  int
+    sites = 0;
+
+  int   
+    model;
+
+  for(model = 0; model < localPr->numberOfPartitions; model++)
+    {
+      if(isThisMyPartition(localPr, tid, model))
+	{	 
+    	  localPr->partitionData[model]->width = localPr->partitionData[model]->upper - localPr->partitionData[model]->lower;
+	  sites += localPr->partitionData[model]->width;
+	}
+      else       	  
+    	  localPr->partitionData[model]->width = 0;
+    }
+
+
+}
+
+
+/** @brief Computes partition size for all partitions (for cyclic distribution of sites)
+    
+    @param localPr the local partitions instance
+    @param tid thread id
+    @param n number of workers
+ */ 
+static void computeFraction(partitionList *localPr, int tid, int n)
+{
+  int
+    i,
+    model;
+
+  for(model = 0; model < localPr->numberOfPartitions; model++)
+    {
+      int width = 0;
+
+      for(i = localPr->partitionData[model]->lower; i < localPr->partitionData[model]->upper; i++)
+	if(i % n == tid)
+	  width++;
+      localPr->partitionData[model]->width = width;
+    }
+}
+
+
+
+/** @brief Compare partition sizes. 
+    @param p1 pointer to a partition
+    @param p2 pointer to another partition
+ */ 
+static int partCompare(const void *p1, const void *p2)
+{
+  partitionType 
+    *rc1 = (partitionType *)p1,
+    *rc2 = (partitionType *)p2;
+
+  int 
+    i = rc1->partitionLength,
+    j = rc2->partitionLength;
+
+  if (i > j)
+    return (-1);
+  if (i < j)
+    return (1);
+  return (0);
+}
+
+
+/** @brief Top-level function for the multi processor scheduling
+    scheme (assigns full partitions to workers).
+    
+   tr->manyPartitions is set to PLL_TRUE if the user has indicated via -Q
+   that there are substantially more partitions than threads/cores
+   available. In that case we do not distribute sites from each
+   partition in a cyclic fashion to the cores , but distribute entire
+   partitions to cores.  Achieving a good balance of alignment sites
+   to cores boils down to the multi-processor scheduling problem known
+   from theoretical comp. sci.  which is NP-complete.  We have
+   implemented very simple "standard" heuristics for solving the
+   multiprocessor scheduling problem that turn out to work very well
+   and are cheap to compute.
+   
+   @param pr 
+     List of partitions
+
+   @param tid
+     Id of current process/thread 
+*/
+static void multiprocessorScheduling(pllInstance * tr, partitionList *pr, int tid)
+{
+  int 
+    s,
+    model,
+    modelStates[2] = {4, 20},
+    numberOfPartitions[2] = {0 , 0},
+      arrayLength = sizeof(modelStates) / sizeof(int);
+
+      /* check that we have not addedd any new models for data types with a different number of states
+	 and forgot to update modelStates */
+
+      for(model = 0; model < pr->numberOfPartitions; model++)
+	{        
+	  boolean 
+	    exists = PLL_FALSE;
+
+	  for(s = 0; s < arrayLength; s++)
+	    {
+	      exists = exists || (pr->partitionData[model]->states == modelStates[s]);
+	      if(pr->partitionData[model]->states == modelStates[s])
+		numberOfPartitions[s] += 1;
+	    }
+
+	  assert(exists);
+	}
+
+      for(s = 0; s < arrayLength; s++)
+	{
+	  if(numberOfPartitions[s] > 0)
+	    {
+	      size_t   
+		checkSum = 0,
+		sum = 0;
+
+	      int    
+		i,
+		k,
+#ifndef _FINE_GRAIN_MPI
+		n = tr->numberOfThreads,
+#else
+		n = processes,
+#endif
+		p = numberOfPartitions[s],    
+		*assignments = (int *)rax_calloc((size_t)n, sizeof(int));  
+
+	      partitionType 
+		*pt = (partitionType *)rax_malloc(sizeof(partitionType) * (size_t)p);
+
+
+
+	      for(i = 0, k = 0; i < pr->numberOfPartitions; i++)
+		{
+		  if(pr->partitionData[i]->states == modelStates[s])
+		    {
+		      pt[k].partitionNumber = i;
+		      pt[k].partitionLength = pr->partitionData[i]->upper - pr->partitionData[i]->lower;
+		      sum += (size_t)pt[k].partitionLength;
+		      k++;
+		    }
+		}
+
+	      assert(k == p);
+
+	      qsort(pt, p, sizeof(partitionType), partCompare);    
+
+	      for(i = 0; i < p; i++)
+		{
+		  int 
+		    k, 
+		    min = INT_MAX,
+		    minIndex = -1;
+
+		  for(k = 0; k < n; k++)	
+		    if(assignments[k] < min)
+		      {
+			min = assignments[k];
+			minIndex = k;
+		      }
+
+		  assert(minIndex >= 0);
+
+		  assignments[minIndex] +=  pt[i].partitionLength;
+		  assert(pt[i].partitionNumber >= 0 && pt[i].partitionNumber < pr->numberOfPartitions);
+		  pr->partitionData[pt[i].partitionNumber]->partitionAssignment = minIndex;
+		}
+
+
+              /* Process i gets assignments[i] sites for modelStates[s] state model */
+
+	      for(i = 0; i < n; i++)
+		checkSum += (size_t)assignments[i];
+
+	      assert(sum == checkSum);
+
+	      rax_free(assignments);
+	      rax_free(pt);
+	    }
+	}
+}
+
+
+
+/** @brief Reduce the first and second derivative of the likelihood
+    function.
+    
+    We collect the first and second derivatives from the various
+    threads and sum them up. It's similar to what we do in
+    pllEvaluateGeneric() with the only difference that we have to collect
+    two values (firsrt and second derivative) instead of onyly one (the
+    log likelihood
+
+   @warning operates on global reduction buffers \a globalResult
+   
+   @param tr tree 
+   @param dlnLdlz first derivative
+   @param d2lnLdlz2 second derivative
+*/
+void branchLength_parallelReduce(pllInstance *tr, double *dlnLdlz,  double *d2lnLdlz2, int numBranches )
+{
+#ifdef _REPRODUCIBLE_MPI_OR_PTHREADS
+
+  /* only the master executes this  */
+  assert(tr->threadID == 0); 
+  
+  int b; 
+  int t; 
+  for(b = 0; b < numBranches; ++b)
+    {
+      dlnLdlz[b] = 0; 
+      d2lnLdlz2[b] = 0; 
+
+      for(t = 0; t < tr->numberOfThreads; ++t)
+	{
+	  dlnLdlz[b] += globalResult[t * numBranches * 2 + b ];
+	  d2lnLdlz2[b] += globalResult[t * numBranches * 2 + numBranches + b];
+	}
+    }
+#else 
+  memcpy(dlnLdlz, globalResult, sizeof(double) * numBranches);
+  memcpy(d2lnLdlz2, globalResult + numBranches, sizeof(double) * numBranches);
+#endif
+}
+
+
+
+/** @brief Read from buffer or writes rates into buffer.  Return
+    number of elems written.
+
+    If \a read is set to \b PLL_TRUE, then the contents \a srcTar are
+    copied to \a buf. Otherwise, the contents of \a buf are moved to
+    \a srcTar.
+   
+   @param buf 
+     Buffer
+
+   @param srcTar 
+     Pointer to either source or destination array
+
+   @param tr
+     PLL instance
+
+   @param n number of workers
+
+   @param tid process id
+
+   @param read 
+     If read-mode then set to \b PLL_TRUE
+
+   @param countOnly
+     if \b PLL_TRUE, simply return the number of elements
+*/
+static int doublesToBuffer(double *buf, double *srcTar, pllInstance *tr, partitionList *pr, int n, int tid, boolean read, boolean countOnly)
+{
+  int 
+    model,
+    i;
+  double 
+    *initPtr = buf; 
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+    {
+      if(tr->manyPartitions)
+	{
+	  if(isThisMyPartition(pr, tid, model))
+	    for(i = pr->partitionData[model]->lower; i < pr->partitionData[model]->upper; i++)
+	      {
+		if(NOT countOnly)
+		  {
+		    if(read)
+		      *buf = srcTar[i]; 
+		    else 
+		      srcTar[i] = *buf; 
+		  }
+		buf++;
+	      }	  
+	}      
+      else
+	{
+	  for(i = pr->partitionData[model]->lower; i < pr->partitionData[model]->upper; i++)
+	    if(i % n == tid)
+	      {
+		if(NOT countOnly)
+		  {
+		    if(read)
+		      *buf = srcTar[i];
+		    else 
+		      srcTar[i] = *buf; 
+		  }
+		buf++; 
+	      }
+	}
+    }
+  
+  return buf - initPtr; 
+}
+
+
+
+
+/** @brief broadcast rates after rate optimization. 
+    
+    @param tre Library instance
+    @param localTree local library instance 
+    @param n number of workers 
+    @param tid worker id 
+    
+    @todo mpi_alltoallv/w may be more efficient, but it is a hell to set up
+ */ 
+void broadcastAfterRateOpt(pllInstance *tr, pllInstance *localTree, partitionList *pr, int n, int tid)
+{				  
+  int
+    num1 = 0,
+    num2 = 0,
+    num3 = 0, 
+    i ; 
+    
+  for(i = 0; i < n; ++i)
+    {
+      double
+	allBuf[tr->originalCrunchedLength * 3],
+	buf1[tr->originalCrunchedLength],
+	buf2[tr->originalCrunchedLength], 
+	buf3[tr->originalCrunchedLength]; 
+
+#ifdef _USE_PTHREADS
+      if(i != tid)
+	continue; 
+#endif
+      int numDouble = 0; 
+      
+      /* extract doubles  */
+
+      num1 = doublesToBuffer(buf1, localTree->patrat, tr, pr, n,i, PLL_TRUE, i!= tid);
+      num2 = doublesToBuffer(buf2, localTree->patratStored, tr, pr, n,i, PLL_TRUE, i!= tid);
+      num3 = doublesToBuffer(buf3, localTree->lhs, tr, pr, n,i, PLL_TRUE, i!= tid);
+
+      /* printf("%d + %d + %d\n", num1, num2, num3);  */
+
+      numDouble += num1 + num2 + num3; 
+
+      /* copy doubles  */
+      
+      memcpy(allBuf, buf1, num1 * sizeof(double)); 
+      memcpy(allBuf + num1, buf2, num2 * sizeof(double)); 
+      memcpy(allBuf + (num1 + num2) , buf3, num3 * sizeof(double)); 
+
+      BCAST_BUF(allBuf, numDouble, MPI_DOUBLE, i); 
+
+      memcpy(buf1, allBuf, num1 * sizeof(double)); 
+      memcpy(buf2, allBuf + num1, num2 * sizeof(double)); 
+      memcpy(buf3, allBuf + (num1 + num2), num3 * sizeof(double)); 
+      
+      /* re-insert doubles  */
+      int assertCtr = 0; 
+      assertCtr += doublesToBuffer(buf1, tr->patrat, tr, pr, n,i,PLL_FALSE, PLL_FALSE);
+      assertCtr += doublesToBuffer(buf2, tr->patratStored, tr, pr, n,i,PLL_FALSE, PLL_FALSE);
+      assertCtr += doublesToBuffer(buf3, tr->lhs, tr, pr, n,i,PLL_FALSE, PLL_FALSE);
+
+      assert(assertCtr == numDouble); 
+    }
+}
+
+
+/** @brief Collect doubles from workers to master.
+ 
+    
+
+    @param dst destination array
+    @param src source array
+    @param tr library instance 
+    @param n number of workers 
+    @param tid worker id 
+ */
+static void collectDouble(double *dst, double *src, pllInstance *tr, partitionList *pr, int n, int tid)
+{
+#ifdef _FINE_GRAIN_MPI    
+  int
+    assertNum = 0,
+    i, 
+    displacements[tr->numberOfThreads];
+  double 
+    buf[tr->originalCrunchedLength],
+    resultBuf[tr->originalCrunchedLength]; 
+
+  /* NOTE: This was moved here because it was an additional unnecessary move for the PTHREADS version. I didnt
+  have time to check the MPI version, have to get back to this and remove it */
+  /* gather own persite log likelihood values into local buffer  */
+  int numberCollected = doublesToBuffer(buf, src, tr, pr,n,tid,PLL_TRUE, PLL_FALSE);
+
+  /* this communicates all the values to the master */
+  
+  int numberPerWorker[tr->numberOfThreads];     
+  if(MASTER_P)			/* master counts number to receive, receives and writes back */
+    {
+      for(i = 0; i < n; ++i)
+	{
+	  numberPerWorker[i] = doublesToBuffer(buf,src,tr,pr,n,i,PLL_FALSE, PLL_TRUE);
+	  displacements[i] = i == 0 ? 0 : displacements[i-1] + numberPerWorker[i-1]; 
+	}
+      
+      MPI_Gatherv(buf, numberCollected, MPI_DOUBLE,
+		  resultBuf, numberPerWorker, displacements,  MPI_DOUBLE,
+		  0, MPI_COMM_WORLD); 
+
+      double *bufPtr = resultBuf; 
+      for(i = 0 ; i < n; ++i)
+	{
+	  int numberWritten = doublesToBuffer(bufPtr, dst,tr,pr,n,i, PLL_FALSE, PLL_FALSE);
+	  bufPtr += numberWritten; 
+	  assertNum += numberWritten; 
+	}    
+      
+      assert(assertNum == tr->originalCrunchedLength);
+    }
+  else 				/* workers only send their buffer   */
+    MPI_Gatherv(buf, numberCollected, MPI_DOUBLE, resultBuf, numberPerWorker, displacements, MPI_DOUBLE, 0, MPI_COMM_WORLD);   
+#else 
+  /* pthread version only writes to global space  */  
+
+  //assertNum = doublesToBuffer(buf, dst,tr,pr,n,tid, PLL_FALSE, PLL_FALSE);
+  doublesToBuffer (dst, src, tr, pr, n, tid, PLL_TRUE, PLL_FALSE);
+  //assert(assertNum == numberCollected); 
+#endif
+}
+
+
+
+/** @brief broadcast a new alpha (for the GAMMA model)
+    @param localTree local library instance
+    @param tr library instance
+    @param tid worker id 
+ */
+static void broadCastAlpha(partitionList *localPr, partitionList *pr)
+{
+  int  i, 
+    model; 
+
+#ifdef _FINE_GRAIN_MPI
+    int bufSize = localPr->numberOfPartitions * 4 * sizeof(double);
+  char bufDbl[bufSize]; 
+  char *bufPtrDbl = bufDbl;   
+#endif
+
+  RECV_BUF(bufDbl, bufSize, MPI_BYTE); 
+
+  for(model = 0; model < localPr->numberOfPartitions; model++)
+    for(i = 0; i < 4; ++i)
+      ASSIGN_BUF_DBL(localPr->partitionData[model]->gammaRates[i], pr->partitionData[model]->gammaRates[i]);
+  
+  SEND_BUF(bufDbl, bufSize, MPI_BYTE);  
+}
+
+
+/** @brief Master broadcasts rates.
+    
+    @param localTree local library instance
+    @param tr library instance
+    @param tid worker id     
+ */ 
+static void broadCastRates(partitionList *localPr, partitionList *pr)
+{
+  int 
+    model;
+
+  /* determine size of buffer needed first */
+#ifdef _FINE_GRAIN_MPI
+  int bufSize = 0; 
+
+  for(model = 0; model < localPr->numberOfPartitions; ++model )
+    {	  
+      const partitionLengths *pl = getPartitionLengths(pr->partitionData[model]); /* this is constant, isnt it?  */
+      bufSize += (pl->eignLength + pl->evLength + pl->eiLength + pl->tipVectorLength) * sizeof(double) ; 
+    }
+
+  char
+    bufDbl[bufSize]; 
+  char *bufPtrDbl = bufDbl; 
+#endif      
+ 
+  
+
+  RECV_BUF(bufDbl, bufSize, MPI_BYTE);
+  int i ; 
+
+  for(model = 0; model < localPr->numberOfPartitions; model++)
+    {
+      const partitionLengths *pl = getPartitionLengths(pr->partitionData[model]); /* this is constant, isnt it?  */
+
+      for(i = 0; i < pl->eignLength; ++i)
+	ASSIGN_BUF_DBL(localPr->partitionData[model]->EIGN[i], pr->partitionData[model]->EIGN[i]);
+      for(i = 0; i < pl->evLength; ++i)
+	ASSIGN_BUF_DBL(localPr->partitionData[model]->EV[i],pr->partitionData[model]->EV[i]);
+      for(i = 0; i  < pl->eiLength; ++i)
+	ASSIGN_BUF_DBL(localPr->partitionData[model]->EI[i], pr->partitionData[model]->EI[i]);
+      for(i = 0; i < pl->tipVectorLength; ++i)
+	ASSIGN_BUF_DBL(localPr->partitionData[model]->tipVector[i],   pr->partitionData[model]->tipVector[i]);
+    }
+  SEND_BUF(bufDbl, bufSize, MPI_BYTE); /*  */
+}
+
+
+
+/** @brief Evaluate the likelihood of this topology (PThreads/MPI implementation)
+
+    Evaluate the likelihood of the topology described in the PLL instance. First
+    every thread calls \a pllEvaluateIterative where it computes the log likelihoods
+    for the  portion of each assigned partition. The results (for all partition) are stored
+    as elements of a local buffer array (\a buf). This is done by all threads. Subsequently, 
+    an \a MPI_Reduce operation sums the contents of corresponding elements of the local
+    buffer arrays into another array (\a targetBuf) which are the log likelihoods of
+    each (complete) partition. Finally, the last array is copied to the master thread/process.
+    In addition, if \a getPerSiteLikelihoods is enabled the log likelihoods for each site
+    in the (compressed) alignment are stored in the array \a tr->lhs.
+
+    @param tr
+      PLL instance
+    @param tr
+      Local (thread/process) PLL instance
+
+    @param pr
+      Local (thread/process) list of partitions
+
+    @param tid
+      Thread/Process ID
+
+    @param getPerSiteLikelihoods 
+      If set to \b PLL_TRUE, compute the log likelihood for each site. 
+ */ 
+static void reduceEvaluateIterative(pllInstance *tr, pllInstance *localTree, partitionList *localPr, int tid, boolean getPerSiteLikelihoods)
+{
+  int model;
+
+  pllEvaluateIterative(localTree, localPr, getPerSiteLikelihoods);
+
+  /* when this is done we need to write the per-thread log likelihood to the 
+     global reduction buffer. Tid is the thread ID, hence thread 0 will write its 
+     results to reductionBuffer[0] thread 1 to reductionBuffer[1] etc.
+
+     the actual sum over the entries in the reduction buffer will then be computed 
+     by the master thread which ensures that the sum is determinsitic */
+
+  
+  /* if (getPerSiteLikelihoods == PLL_TRUE) store per-site likelihoods in array tr->lhs */
+  if(getPerSiteLikelihoods)
+    {    
+#ifdef _FINE_GRAIN_MPI
+      int n = processes; 
+#else 
+      int n = tr->numberOfThreads; 
+#endif
+
+      /* rearrange per site likelihoods into single local array for gathering */
+      int i ; 
+      for(model = 0; model < localPr->numberOfPartitions; ++model)
+	{
+	  pInfo *partition = localPr->partitionData[model]; 
+	  boolean isMyPartition  = isThisMyPartition(localPr, tid, model);
+
+	  int ctr = 0; 
+	  for(i = partition->lower; i < partition->upper; ++i)
+	    {
+	      if(tr->manyPartitions && isMyPartition)
+		localTree->lhs[i] = partition->perSiteLikelihoods[ ctr++]; 
+	      else if(NOT tr->manyPartitions && (i % n) == tid)
+		localTree->lhs[i] = partition->perSiteLikelihoods[ctr++];
+	    }
+	}
+      
+      /* gather all the double into the global array */
+      collectDouble(tr->lhs, localTree->lhs, localTree, localPr,  n, tid); 
+    }
+
+  /* printf("collecting done\n" ); */
+#ifdef _REPRODUCIBLE_MPI_OR_PTHREADS
+  /* 
+     aberer: I implemented this as a mpi_gather operation into this buffer, 
+     pthreads version emulates this gather; 
+     master takes care of the reduction; 
+  */
+
+  double 
+    buf[localPr->numberOfPartitions];
+
+  for(model = 0; model < localPr->numberOfPartitions; ++model)
+    buf[model] = localPr->partitionData[model]->partitionLH;
+
+  /* either make reproducible or efficient */
+  ASSIGN_GATHER(globalResult, buf, localPr->numberOfPartitions, DOUBLE, tid);
+
+  /* printf("gather worked\n"); */
+#else 
+  /* the efficient mpi version: a proper reduce  */
+  double 
+    buf[localPr->numberOfPartitions];
+  
+  for(model = 0; model < localPr->numberOfPartitions; ++model)
+    buf[model] = localPr->partitionData[model]->partitionLH;
+
+  double 
+    targetBuf[localPr->numberOfPartitions];
+  
+  memset(targetBuf, 0, sizeof(double) * localPr->numberOfPartitions);
+
+  MPI_Reduce(buf, targetBuf, localPr->numberOfPartitions, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
+  
+  if(MASTER_P) 
+    {
+      for(model = 0; model < localPr->numberOfPartitions; ++model) {
+	localPr->partitionData[model]->partitionLH = targetBuf[model];
+      }
+    }
+#endif
+}
+
+
+
+/*@ @brief Broadcast the traversal descriptor to worker threads. 
+
+  The one below is a hack we are re-assigning the local pointer to
+  the global one the memcpy version below is just for testing and
+  preparing the fine-grained MPI BlueGene version
+
+  @param localTree local library instance
+  @param tr library instance
+*/
+/* TODO: we should reset this at some point, the excplicit copy is just done for testing */
+inline static void broadcastTraversalInfo(pllInstance *localTree, pllInstance *tr, partitionList *localPr)
+{
+  /* @todo these two regions could be joined */
+#ifdef _USE_PTHREADS
+  /* memcpy -> memmove (see ticket #43). This function is sometimes called with localTree == tr,
+   * in which case some memcpy implementations can corrupt the buffers.
+   */
+  
+  localTree->td[0].functionType =            tr->td[0].functionType;
+  localTree->td[0].count =                   tr->td[0].count ;
+  localTree->td[0].traversalHasChanged =     tr->td[0].traversalHasChanged;
+
+  memmove(localTree->td[0].executeModel,    tr->td[0].executeModel,    sizeof(boolean) * localPr->numberOfPartitions);
+  memmove(localTree->td[0].parameterValues, tr->td[0].parameterValues, sizeof(double) * localPr->numberOfPartitions);
+  
+  if(localTree->td[0].traversalHasChanged)
+    memmove(localTree->td[0].ti, tr->td[0].ti, localTree->td[0].count * sizeof(traversalInfo));
+
+#else
+  /* MPI */
+  /* like in raxml-light: first we send a small message, if the
+     travesalDescriptor is longer, then resend */
+  
+  int length = treeIsInitialized ? localPr->numberOfPartitions : 0;
+  char broadCastBuffer[messageSize(length)]; 
+  char *bufPtr = broadCastBuffer; 
+  int i; 
+
+  RECV_BUF(broadCastBuffer, messageSize(length), MPI_BYTE); 
+
+  ASSIGN_BUF(localTree->td[0].functionType, tr->td[0].functionType , int);   
+  ASSIGN_BUF(localTree->td[0].count,  tr->td[0].count , int); 
+  ASSIGN_BUF(localTree->td[0].traversalHasChanged, tr->td[0].traversalHasChanged , int); 
+
+  if(treeIsInitialized)  
+    { 
+      for(i = 0; i < localPr->numberOfPartitions; ++i)
+	{
+	  ASSIGN_BUF(localTree->td[0].executeModel[i],      tr->td[0].executeModel[i], int); 
+	  ASSIGN_BUF(localTree->td[0].parameterValues[i],	 tr->td[0].parameterValues[i], double); 
+	}      
+
+      for(i = 0; i < TRAVERSAL_LENGTH; ++i )
+	ASSIGN_BUF(localTree->td[0].ti[i], tr->td[0].ti[i], traversalInfo); 
+    }
+    
+  SEND_BUF(broadCastBuffer, messageSize(length), MPI_BYTE); 
+
+  /* now we send the second part of the traversal descriptor, if we
+     exceed the pre-set number of elements */
+  if(treeIsInitialized && localTree->td[0].count > TRAVERSAL_LENGTH) 
+    {
+      /* lets use the MPI_Datatype for this thing, what I've read it's
+	 supposed to be more secure and efficient */
+      MPI_Bcast(localTree->td[0].ti + TRAVERSAL_LENGTH, localTree->td[0].count - TRAVERSAL_LENGTH, TRAVERSAL_MPI, 0, MPI_COMM_WORLD );
+    }
+#endif
+}
+
+
+/** @brief helper that yields a string representation of a parallel region. 
+    
+    @param type type of parallel region
+ */ 
+char* getJobName(int type)
+{
+  switch(type)  
+    {
+    case  PLL_THREAD_NEWVIEW:       
+      return "PLL_THREAD_NEWVIEW";
+    case PLL_THREAD_EVALUATE: 
+      return "PLL_THREAD_EVALUATE";
+    case PLL_THREAD_MAKENEWZ: 
+      return "PLL_THREAD_MAKENEWZ";
+    case PLL_THREAD_MAKENEWZ_FIRST: 
+      return "PLL_THREAD_MAKENEWZ_FIRST";
+    case PLL_THREAD_RATE_CATS: 
+      return "PLL_THREAD_RATE_CATS";
+    case PLL_THREAD_COPY_RATE_CATS: 
+      return "PLL_THREAD_COPY_RATE_CATS";
+    case PLL_THREAD_COPY_INIT_MODEL: 
+      return "PLL_THREAD_COPY_INIT_MODEL";
+    case PLL_THREAD_INIT_PARTITION: 
+      return "PLL_THREAD_INIT_PARTITION";
+    case PLL_THREAD_OPT_ALPHA: 
+      return "PLL_THREAD_OPT_ALPHA";
+    case PLL_THREAD_OPT_RATE: 
+      return "PLL_THREAD_OPT_RATE";
+    case PLL_THREAD_COPY_ALPHA: 
+      return "PLL_THREAD_COPY_ALPHA";
+    case PLL_THREAD_COPY_RATES: 
+      return "PLL_THREAD_COPY_RATES";
+    case PLL_THREAD_PER_SITE_LIKELIHOODS: 
+      return "PLL_THREAD_PER_SITE_LIKELIHOODS";
+    case PLL_THREAD_NEWVIEW_ANCESTRAL: 
+      return "PLL_THREAD_NEWVIEW_ANCESTRAL";
+    case PLL_THREAD_GATHER_ANCESTRAL: 
+      return "PLL_THREAD_GATHER_ANCESTRAL";
+    case PLL_THREAD_EXIT_GRACEFULLY: 
+      return "PLL_THREAD_EXIT_GRACEFULLY";
+    case PLL_THREAD_EVALUATE_PER_SITE_LIKES:
+      return "PLL_THREAD_EVALUATE_PER_SITE_LIKES";
+    default: assert(0); 
+    }
+}
+
+
+/**
+   @brief Generic entry point for parallel regions (mostly broadcasts
+   traversal descriptor first).
+
+   This function here handles all parallel regions in the Pthreads
+   version, when we enter this function pllMasterBarrier() has been called
+   by the master thread from within the sequential part of the
+   program, tr is the library instance (tree) at the master thread, 
+   localTree is the library instance (tree) at the worker threads
+
+   While this is not necessary, adress spaces of threads are indeed
+   separated for easier transition to a distributed memory paradigm
+   
+   @param tr library instance
+   @param localTree local library instance 
+   @param tid worker id 
+   @param n number of workers 
+*/
+static boolean execFunction(pllInstance *tr, pllInstance *localTree, partitionList *pr, partitionList *localPr, int tid, int n)
+{
+  int
+    i,
+    model,
+    localCounter;
+
+#ifdef MEASURE_TIME_PARALLEL
+  double timeForParallelRegion = gettime();
+#endif
+
+
+#ifdef _USE_PTHREADS
+  /* some stuff associated with the barrier implementation using Pthreads and busy wait */
+  int currentJob = threadJob >> 16;
+#endif
+
+  /* here the master sends and all threads/processes receive the traversal descriptor */
+  broadcastTraversalInfo(localTree, tr, localPr);
+
+#ifdef _USE_PTHREADS
+  /* make sure that nothing is going wrong */
+  assert(currentJob == localTree->td[0].functionType);
+#else   
+  localTree = tr; 
+  int currentJob = localTree->td[0].functionType; 
+#endif
+
+#ifdef DEBUG_PARALLEL
+  printf("[%d] working on %s\n", tid, getJobName(currentJob)); 
+#endif  
+
+  switch(currentJob)
+    { 
+    case PLL_THREAD_NEWVIEW: 
+      /* just a newview on the fraction of sites that have been assigned to this thread */
+
+      pllNewviewIterative(localTree, localPr, 0);
+      break;     
+    case PLL_THREAD_EVALUATE: 
+      reduceEvaluateIterative(tr, localTree, localPr, tid, PLL_FALSE);
+      break;	
+    case PLL_THREAD_MAKENEWZ_FIRST:
+
+      /* this is the first call from within makenewz that requires getting the likelihood vectors to the left and 
+         right of the branch via newview and doing some precomputations.
+	 
+         For details see comments in makenewzGenericSpecial.c 
+      */
+    case  PLL_THREAD_MAKENEWZ:
+      {	
+	double
+	  dlnLdlz[PLL_NUM_BRANCHES],
+	  d2lnLdlz2[PLL_NUM_BRANCHES]; 
+
+	if(localTree->td[0].functionType == PLL_THREAD_MAKENEWZ_FIRST)
+	  makenewzIterative(localTree, localPr);
+	execCore(localTree, localPr, dlnLdlz, d2lnLdlz2);
+
+	/* gather the first and second derivatives that have been written by each thread */
+	/* as for evaluate above, the final sum over the derivatives will be computed by the 
+	   master thread in its sequential part of the code */
+
+	int numBranches = localPr->perGeneBranchLengths?localPr->numberOfPartitions:1;
+
+#ifdef _REPRODUCIBLE_MPI_OR_PTHREADS
+	/* MPI: implemented as a gather again, pthreads: just buffer copying */	
+	double buf[ 2 * numBranches];
+	memcpy( buf, dlnLdlz, numBranches * sizeof(double) );
+	memcpy(buf + numBranches, d2lnLdlz2, numBranches * sizeof(double));
+
+	ASSIGN_GATHER(globalResult, buf,  2 * numBranches, DOUBLE, tid);
+#else 	
+	double result[numBranches];
+	memset(result,0, numBranches * sizeof(double));
+	MPI_Reduce( dlnLdlz , result , numBranches, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
+	if(MASTER_P)
+	  memcpy(globalResult, result, sizeof(double) * numBranches);
+	
+	memset(result,0,numBranches * sizeof(double));
+	MPI_Reduce( d2lnLdlz2 , result , numBranches, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
+	if(MASTER_P)
+	  memcpy(globalResult + numBranches, result, sizeof(double) * numBranches);
+#endif
+      }
+
+      break;
+
+    case PLL_THREAD_INIT_PARTITION:       
+
+      /* broadcast data and initialize and allocate arrays in partitions */
+      
+      initializePartitionsMaster(tr, localTree, pr, localPr, tid, n);
+
+      break;          
+    case PLL_THREAD_COPY_ALPHA: 
+    case PLL_THREAD_OPT_ALPHA:
+      /* this is when we have changed the alpha parameter, inducing a change in the discrete gamma rate categories.
+	 this is called when we are optimizing or sampling (in the Bayesioan case) alpha parameter values */
+      
+      /* distribute the new discrete gamma rates to the threads */
+      broadCastAlpha(localPr,pr);
+
+      /* compute the likelihood, note that this is always a full tree traversal ! */
+      if(localTree->td[0].functionType == PLL_THREAD_OPT_ALPHA)
+	reduceEvaluateIterative(tr, localTree, localPr, tid, PLL_FALSE);
+
+      break;           
+    case PLL_THREAD_OPT_RATE:
+    case PLL_THREAD_COPY_RATES:
+
+      /* if we are optimizing the rates in the transition matrix Q this induces recomputing the eigenvector eigenvalue 
+	 decomposition and the tipVector as well because of the special numerics in RAxML, the matrix of eigenvectors 
+	 is "rotated" into the tip lookup table.
+
+	 Hence if the sequantial part of the program that steers the Q matrix rate optimization has changed a rate we 
+	 need to broadcast all eigenvectors, eigenvalues etc to each thread 
+      */
+
+      broadCastRates(localPr, pr);
+
+      /* now evaluate the likelihood of the new Q matrix, this always requires a full tree traversal because the changes need
+	 to be propagated throughout the entire tree */
+
+      if(localTree->td[0].functionType == PLL_THREAD_OPT_RATE)
+	reduceEvaluateIterative(tr, localTree, localPr, tid, PLL_FALSE);
+
+      break;                       
+    case PLL_THREAD_COPY_INIT_MODEL:
+      {
+
+	/* need to be very careful here ! PLL_THREAD_COPY_INIT_MODEL is also used when the program is restarted 
+	   it is hence not sufficient to just initialize everything by the default values ! */
+
+	broadCastRates(localPr, pr);
+	broadCastAlpha(localPr, pr); /* isnt that only executed when we are on gamma?  */
+
+	/*
+	  copy initial model parameters, the Q matrix and alpha are initially, when we start our likelihood search 
+	  set to default values. 
+	  Hence we need to copy all those values that are required for computing the likelihood 
+	  with newview(), evaluate() and makenez() to the private memory of the threads 
+	*/
+
+
+	if( localTree->rateHetModel == PLL_CAT) /* TRICKY originally this should only be executed by workers  */
+	  { 	    
+#ifdef _FINE_GRAIN_MPI
+	    int bufSize = 2 * localTree->originalCrunchedLength * sizeof(double); 
+	    char bufDbl[bufSize], 
+	      *bufPtrDbl = bufDbl; 
+#endif
+
+	    RECV_BUF(bufDbl, bufSize,MPI_BYTE); 
+
+	    /* this should be local  */
+	    for(model = 0; model < localPr->numberOfPartitions; model++)
+	      localPr->partitionData[model]->numberOfCategories      = pr->partitionData[model]->numberOfCategories;
+
+
+	    /* this is only relevant for the PSR model, we can worry about this later */
+	    for(i = 0; i < localTree->originalCrunchedLength; ++i)
+	      {
+		ASSIGN_BUF_DBL(localTree->patrat[i], tr->patrat[i]);
+		ASSIGN_BUF_DBL(localTree->patratStored[i], tr->patratStored[i]); 
+	      }
+
+	    SEND_BUF(bufDbl, bufSize, MPI_BYTE); 
+	  }
+      } 
+      break;    
+    case PLL_THREAD_RATE_CATS: 
+      {
+	/* this is for optimizing per-site rate categories under PSR, let's worry about this later */
+
+	ASSIGN_DBL( localTree->lower_spacing,  tr->lower_spacing);
+	ASSIGN_DBL( localTree->upper_spacing,  tr->upper_spacing);
+
+	optRateCatPthreads(localTree, localPr, localTree->lower_spacing, localTree->upper_spacing, localTree->lhs, n, tid);
+
+	broadcastAfterRateOpt(tr, localTree, localPr, n,  tid);
+      }
+      break;
+    case PLL_THREAD_COPY_RATE_CATS:
+      {
+	/* 
+	   this is invoked when we have changed the per-site rate category assignment
+	   In essence it distributes the new per site rates to all threads 
+
+	   The pthread-version here simply assigns everything as ought to
+	   be. The MPI-version is configured to write to a buffer instead
+	   and SEND (master) or RECV (workers) it.
+
+	*/
+
+	/* 
+	   start of communication part 
+	*/
+
+	int i, 
+	  /* buf[localPr->numberOfPartitions], */
+	  /* assertCtr = 0,  */
+	  dblBufSize = 0; 
+
+#ifdef _FINE_GRAIN_MPI
+	int bufSize = localPr->numberOfPartitions * sizeof(int); 
+	char buf[bufSize]; 
+	char *bufPtr = buf; 
+#endif
+     
+	RECV_BUF(buf, bufSize, MPI_BYTE);
+
+	for( model = 0; model < localPr->numberOfPartitions; ++model)
+	  {
+	    ASSIGN_BUF(localPr->partitionData[model]->numberOfCategories, pr->partitionData[model]->numberOfCategories, int);
+	    dblBufSize += localPr->partitionData[model]->numberOfCategories * sizeof(double);
+	  }
+
+	SEND_BUF(buf, bufSize, MPI_BYTE); 
+
+
+	dblBufSize += 2 * localTree->originalCrunchedLength * sizeof(double); 
+
+#ifdef _FINE_GRAIN_MPI
+	char bufDbl[dblBufSize],
+	  *bufPtrDbl = bufDbl;
+#endif
+
+	RECV_BUF(bufDbl, dblBufSize, MPI_BYTE); 
+
+	for(i = 0; i < localTree->originalCrunchedLength; ++i)
+	  {	 
+	    ASSIGN_BUF_DBL(localTree->patrat[i], tr->patrat[i]); 
+	    ASSIGN_BUF_DBL(localTree->patratStored[i], tr->patratStored[i]); 
+	  }
+
+	for( model = 0; model < localPr->numberOfPartitions; ++model)
+	  for(i = 0; i < localPr->partitionData[model]->numberOfCategories; i++)
+	    ASSIGN_BUF_DBL(localPr->partitionData[model]->perSiteRates[i], pr->partitionData[model]->perSiteRates[i]);
+
+	SEND_BUF(bufDbl, dblBufSize, MPI_BYTE); 
+
+
+	/* lets test, if it is a good idea to send around the basic categories  */
+#ifdef _FINE_GRAIN_MPI
+	/* TODO this is inefficient, but is seems to have a small impact on performance */
+	MPI_Bcast(tr->rateCategory, tr->originalCrunchedLength, MPI_INT, 0, MPI_COMM_WORLD); 
+#endif
+
+
+	/* 
+	   now re-assign values 
+	*/
+	for(model = 0; model < localPr->numberOfPartitions; model++)
+	  {
+	    if(localTree->manyPartitions)
+	      {
+		if(isThisMyPartition(localPr, tid, model))
+		  for(localCounter = 0, i = localPr->partitionData[model]->lower;  i < localPr->partitionData[model]->upper; i++, localCounter++)
+		    {	     
+		      localPr->partitionData[model]->rateCategory[localCounter] = tr->rateCategory[i];
+		    } 
+	      }
+	    else	  
+	      {
+		for(localCounter = 0, i = localPr->partitionData[model]->lower;  i < localPr->partitionData[model]->upper; i++)
+		  {
+		    if(i % n == tid)
+		      {		 
+			localPr->partitionData[model]->rateCategory[localCounter] = tr->rateCategory[i];
+
+			localCounter++;
+		      }
+		  }
+	      }
+	  }
+      }
+      break;
+    case PLL_THREAD_PER_SITE_LIKELIHOODS:      
+      {
+
+	/* compute per-site log likelihoods for the sites/partitions 
+	   that are handled by this thread */
+	perSiteLogLikelihoodsPthreads(localTree, localPr, localTree->lhs, n, tid);
+
+	/* do a parallel gather operation, the threads will write their results 
+	   into the global buffer tr->lhs that will then contain all per-site log likelihoods
+	   in the proper order 
+	*/
+
+	collectDouble(tr->lhs,                localTree->lhs,                  localTree, localPr, n, tid);
+
+      }
+      break;
+      /* check for errors */
+    case PLL_THREAD_NEWVIEW_ANCESTRAL:       
+      assert(0);
+      break; 
+    case PLL_THREAD_GATHER_ANCESTRAL:
+      assert(0); 
+      break; 
+    case PLL_THREAD_EXIT_GRACEFULLY: 
+      {
+	/* cleans up the workers memory */
+
+#ifdef _USE_PTHREADS
+	/* TODO destroying the tree does not work yet in a highly
+	   generic manner. */
+
+	if(NOT MASTER_P)
+	  {
+	    pllPartitionsDestroy (localTree, &localPr);
+	    /* pllTreeDestroy (localTree); */
+	  }
+	else 
+	  {
+	    //pllPartitionsDestroy (tr, &pr);
+	    /* pllTreeDestroy (tr); */
+	  }
+
+#else 
+	//pllPartitionsDestroy (tr, &pr);
+	/* pllTreeDestroy (tr); */
+	
+	//MPI_Finalize();
+	//exit(0); 
+#endif	
+	return PLL_FALSE; 
+      }
+      break; 
+    case PLL_THREAD_EVALUATE_PER_SITE_LIKES: 
+      {
+	reduceEvaluateIterative(tr, localTree, localPr, tid, PLL_TRUE);
+      }
+      break;
+    default:
+      printf("Job %d\n", currentJob);
+      assert(0);
+    }
+
+  return PLL_TRUE; 
+}
+
+
+
+
+/**  Target function where the threads/processes are trapped
+
+     The threads/processes spend all of their time in this function
+     running operations on the data (computing likelihoods).
+
+     @param tData
+       Structure that contains the vital information for the thread/process, 
+       i.e. PLL instance, list of partitions and thread ID
+
+     @note
+       The data in \a tData are different for pthreads and MPI. 
+       Expand this section.
+ */ 
+static void *likelihoodThread(void *tData)
+{
+  threadData *td = (threadData*)tData;
+  pllInstance 
+    *tr = td->tr;
+  partitionList *pr = td->pr;
+
+#ifdef _USE_PTHREADS
+  pllInstance *localTree = rax_calloc(1,sizeof(pllInstance )); 
+  partitionList *localPr = rax_calloc(1,sizeof(partitionList));
+
+  int
+    myCycle = 0,
+    localTrap = 1;
+
+  const int 
+    n = td->tr->numberOfThreads,
+    tid = td->threadNumber;
+
+#ifndef _PORTABLE_PTHREADS
+  pinToCore(tid);
+#endif
+
+  /* printf("\nThis is RAxML Worker Pthread Number: %d\n", tid); */
+
+  while(localTrap)
+    {
+
+      while (myCycle == threadJob);
+      myCycle = threadJob;
+
+      if ((threadJob >> 16) != PLL_THREAD_INIT_PARTITION) {
+    	  localPr->perGeneBranchLengths = pr->perGeneBranchLengths;
+      	  localPr->numberOfPartitions = pr->numberOfPartitions;
+      }
+      localTrap = execFunction(tr, localTree, pr, localPr, tid, n);
+
+      barrierBuffer[tid] = 1;     
+    }
+    rax_free (localTree->td[0].executeModel); //localTree->td[0].executeModel = NULL;
+    rax_free (localTree->td[0].parameterValues); //localTree->td[0].parameterValues = NULL;
+    rax_free (localTree->rateCategory); //localTree->rateCategory = NULL;
+    rax_free (localTree->lhs); //localTree->lhs = NULL;
+    rax_free (localTree->patrat); //localTree->patrat = NULL;
+    rax_free (localTree->patratStored); //localTree->patratStored = NULL;
+    rax_free (localTree->td[0].ti); //localTree->td[0].ti = NULL;
+    rax_free (localTree);
+#else 
+  const int
+    n = processes, 
+    tid = td->threadNumber;
+  int i;
+
+  /* printf("\nThis is RAxML Worker Process Number: %d\n", tid); */
+
+  while(execFunction(tr, tr, pr, pr, tid,n));
+
+  rax_free (tr->lhs);
+  rax_free (tr->td[0].ti);
+  rax_free (tr->td[0].executeModel);
+  rax_free (tr->td[0].parameterValues);
+  rax_free (tr->patrat);
+  rax_free (tr->patratStored);
+  rax_free (tr->aliaswgt);
+  rax_free (tr->y_ptr);
+  for (i = 0; i < pr->numberOfPartitions; ++ i)
+    rax_free (pr->partitionData[i]);
+  rax_free (pr->partitionData);
+  rax_free (pr);
+  rax_free (tr);
+#endif
+
+  return (void*)NULL;
+}
+
+
+/**
+   @brief Cleanup step once the master barrier succeeded. 
+
+   This is master specific code called once the barrier is
+   passed. Stuff such as reduction operations.  If we execute this
+   here, we can keep the code mostly free from parallel -specific
+   code.
+   
+   @param tr 
+     PLL instance
+
+   @param pr
+     List of partitions
+
+   @param jobType 
+     Job that is to be executed
+*/
+void pllMasterPostBarrier(pllInstance *tr, partitionList *pr, int jobType)
+{
+  assert(tr->threadID == 0); 
+  
+  switch(jobType)
+    {
+    case PLL_THREAD_EVALUATE: 
+    case PLL_THREAD_OPT_RATE: 
+    case PLL_THREAD_OPT_ALPHA: 
+    case PLL_THREAD_EVALUATE_PER_SITE_LIKES: 
+      {
+#ifdef _REPRODUCIBLE_MPI_OR_PTHREADS
+	int i,j;
+	volatile double partitionResult;	
+
+	for(j = 0; j < pr->numberOfPartitions; j++)
+	  {
+	    for(i = 0, partitionResult = 0.0; i < tr->numberOfThreads; i++) 
+	      partitionResult += globalResult[i * pr->numberOfPartitions+ j];
+
+	    pr->partitionData[j]->partitionLH = partitionResult;
+	  }
+#endif      
+
+	break; 
+      } 
+    case PLL_THREAD_PER_SITE_LIKELIHOODS:
+      {
+	int i; 
+	/* now just compute the sum over per-site log likelihoods for error checking */      
+	double accumulatedPerSiteLikelihood = 0.; 
+	for(i = 0; i < tr->originalCrunchedLength; i++)
+	  accumulatedPerSiteLikelihood += tr->lhs[i];
+
+	/* printf("RESULT: %f\t%f", tr->likelihood, accumulatedPerSiteLikelihood);  */
+	assert(PLL_ABS(tr->likelihood - accumulatedPerSiteLikelihood) < 0.00001);
+      }
+      break;
+    default: 
+      ; 			/* dont do anything on default,
+				   mostly, we can skip that */
+    } 
+}
+
+/**
+   @brief A generic master barrier for executing parallel parts of the code
+
+   A generic master barrier through which the master thread/process controls
+   the work job execution. Through the parameter \a jobType the master instructs
+   the slaves of what type of work they must conduct.
+
+   @param tr
+     PLL instance
+
+   @param pr
+     List of partitions
+
+   @param jobType 
+     Type of job to be conducted
+ */ 
+void pllMasterBarrier(pllInstance *tr, partitionList *pr, int jobType)
+{
+
+#ifdef MEASURE_TIME_PARALLEL
+  assert(jobType < NUM_PAR_JOBS); 
+  timePerRegion[NUM_PAR_JOBS]  += gettime()- masterTimePerPhase ; 
+  masterTimePerPhase = gettime();
+#endif
+
+#ifdef _USE_PTHREADS
+  const int 
+    n = tr->numberOfThreads;
+
+  tr->td[0].functionType = jobType;
+
+  jobCycle = !jobCycle;
+  threadJob = (jobType << 16) + jobCycle;
+
+  execFunction(tr, tr, pr, pr, 0, n);
+
+  int 
+    i, 
+    sum;
+
+  do
+    {
+      for(i = 1, sum = 1; i < n; i++)
+	sum += barrierBuffer[i];
+    }
+  while(sum < n);  
+
+  for(i = 1; i < n; i++)
+    barrierBuffer[i] = 0;
+#else 
+  tr->td[0].functionType = jobType; 
+  execFunction(tr,tr,pr,pr,0,processes);
+#endif
+
+  /* code executed by the master, once the barrier is crossed */
+  pllMasterPostBarrier(tr, pr, jobType);
+
+#ifdef MEASURE_TIME_PARALLEL
+  timePerRegion[jobType] += gettime() - masterTimePerPhase; 
+  masterTimePerPhase = gettime();
+#endif
+}
+
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+
+/** @brief Initialize structures for slave process/threads
+ 
+    Allocate all memory structures required by slave threads/processes
+
+    @param tr 
+      PLL Instance
+
+    @param localTree 
+      A local PLL instance for the slave process/thread which is initialized in this function based on \a tr
+
+    @pram pr
+      List of partitions
+
+    @param localPr
+      A local list of partitions for the slave process/thread which will be initialized based on \a pr 
+
+    @pram tid
+      The slave process/thread ID
+
+    @note
+      This function should never be called by the master thread, but is called by master process in MPI implementation.
+ */ 
+static void assignAndInitPart1(pllInstance *localTree, pllInstance *tr, partitionList *localPr, partitionList *pr, int *tid)
+{
+  size_t
+    model; 
+  int
+    totalLength = 0; 
+
+#ifdef _USE_PTHREADS
+  localTree->threadID = *tid; 
+  /* printf("my id is %d\n", *tid);  */
+  assert(localTree != tr);
+  localTree->numberOfThreads = tr->numberOfThreads;
+#else  /* => MPI */
+  *tid = processID; 
+  localTree->threadID = processID; 
+  tr->numberOfThreads = processes;
+
+  int bufSize = (9 + pr->numberOfPartitions* 8) * sizeof(int);
+  char buf[bufSize], 
+    *bufPtr = buf;  
+#endif
+
+  RECV_BUF(buf, bufSize, MPI_BYTE); 
+
+  ASSIGN_BUF( localTree->useRecom,                  tr->useRecom, int);
+  ASSIGN_BUF( localTree->rateHetModel,              tr->rateHetModel, int);
+  ASSIGN_BUF( localTree->useMedian,                 tr->useMedian, int); 
+  ASSIGN_BUF( localTree->saveMemory,                tr->saveMemory, int);
+  ASSIGN_BUF( localTree->maxCategories,             tr->maxCategories, int);
+  ASSIGN_BUF( localTree->originalCrunchedLength,    tr->originalCrunchedLength, int);
+  ASSIGN_BUF( localTree->mxtips,                    tr->mxtips, int);
+  ASSIGN_BUF( localPr->numberOfPartitions,          pr->numberOfPartitions, int);
+  ASSIGN_BUF( localPr->perGeneBranchLengths,        pr->perGeneBranchLengths, boolean);
+
+  localTree->td[0].count = 0; 
+
+  if(NOT MASTER_P)
+    {
+      localTree->lhs                     = (double*)rax_calloc((size_t)localTree->originalCrunchedLength, sizeof(double));     
+      localPr->partitionData           = (pInfo**)rax_calloc(PLL_NUM_BRANCHES,sizeof(pInfo*));
+      for(model = 0; model < (size_t)localPr->numberOfPartitions; model++) {
+    	localPr->partitionData[model] = (pInfo*)rax_calloc(1,sizeof(pInfo));
+      }
+      localTree->td[0].ti              = (traversalInfo *)rax_malloc(sizeof(traversalInfo) * (size_t)localTree->mxtips);
+      localTree->td[0].executeModel    = (boolean *)rax_malloc(sizeof(boolean) * PLL_NUM_BRANCHES);
+      localTree->td[0].parameterValues = (double *)rax_malloc(sizeof(double) * PLL_NUM_BRANCHES);
+      localTree->patrat       = (double*)rax_malloc(sizeof(double) * (size_t)localTree->originalCrunchedLength);
+      localTree->patratStored = (double*)rax_malloc(sizeof(double) * (size_t)localTree->originalCrunchedLength);            
+    }
+  
+  for(model = 0; model < (size_t)localPr->numberOfPartitions; model++)
+    {
+      ASSIGN_BUF(localPr->partitionData[model]->numberOfCategories,     pr->partitionData[model]->numberOfCategories, int);
+      ASSIGN_BUF(localPr->partitionData[model]->states,                 pr->partitionData[model]->states, int);
+      ASSIGN_BUF(localPr->partitionData[model]->maxTipStates ,          pr->partitionData[model]->maxTipStates, int);
+      ASSIGN_BUF(localPr->partitionData[model]->dataType ,              pr->partitionData[model]->dataType, int);
+      ASSIGN_BUF(localPr->partitionData[model]->protModels ,            pr->partitionData[model]->protModels, int);
+      ASSIGN_BUF(localPr->partitionData[model]->protUseEmpiricalFreqs , pr->partitionData[model]->protUseEmpiricalFreqs, int);
+      ASSIGN_BUF(localPr->partitionData[model]->lower ,                 pr->partitionData[model]->lower, int);
+      ASSIGN_BUF(localPr->partitionData[model]->upper ,                 pr->partitionData[model]->upper, int);
+      ASSIGN_BUF(localPr->partitionData[model]->ascBias,                pr->partitionData[model]->ascBias, boolean);
+
+      localPr->partitionData[model]->partitionLH = 0.0;      
+
+      totalLength += (localPr->partitionData[model]->upper -  localPr->partitionData[model]->lower);
+    }
+
+  SEND_BUF(buf, bufSize, MPI_BYTE); 
+
+  assert(totalLength == localTree->originalCrunchedLength);
+
+  ASSIGN_DBL(localTree->vectorRecomFraction, tr->vectorRecomFraction); 
+}
+#endif
+
+
+/** @brief Distribute y-vectors during initialization. 
+
+    Distribute the alignment data to the slave process/threads. Each slave
+    copies the data (alignment) from its assigned partition to its local 
+    partition structure.
+
+    @param tr 
+      PLL instance
+    
+    @param localTree 
+      Local library instance for the current thread
+
+    @param localPr
+      Local list of partitions structure for the current thread
+ */ 
+static void distributeYVectors(pllInstance *localTree, pllInstance *tr, partitionList *localPr)
+{
+  size_t 
+    i,
+    n = localTree->numberOfThreads,
+    globalCounter = 0,
+    localCounter = 0,
+    model = 0, 
+    j; 
+  int tid = localTree->threadID; 
+  
+
+  /* distribute the y-vectors */
+  for(j = 1 ; j <= (size_t)localTree->mxtips; j++)	
+    {
+#ifdef _FINE_GRAIN_MPI
+      unsigned char yBuf[tr->originalCrunchedLength]; 	  
+      if(MASTER_P)
+	memcpy(yBuf, tr->yVector[j], tr->originalCrunchedLength * sizeof(unsigned char));
+      MPI_Bcast(  yBuf, tr->originalCrunchedLength, MPI_UNSIGNED_CHAR,0,MPI_COMM_WORLD); 
+#endif	  
+
+      for(model = 0, globalCounter = 0; model < (size_t)localPr->numberOfPartitions; model++)
+	{
+	  if(tr->manyPartitions)
+	    {
+	      if(isThisMyPartition(localPr, tid, model))
+		{
+		  assert(localPr->partitionData[model]->upper - localPr->partitionData[model]->lower == localPr->partitionData[model]->width);
+		  for(localCounter = 0, i = (size_t)localPr->partitionData[model]->lower;  i < (size_t)localPr->partitionData[model]->upper; i++, localCounter++, globalCounter++)
+#ifdef _USE_PTHREADS
+		    localPr->partitionData[model]->yVector[j][localCounter] = tr->yVector[j][globalCounter];
+#else 
+		  localPr->partitionData[model]->yVector[j][localCounter] = yBuf[globalCounter];
+#endif
+
+
+		}
+	      else
+		globalCounter += (localPr->partitionData[model]->upper - localPr->partitionData[model]->lower);
+	    }
+	  else 
+	    {
+	      for(localCounter = 0, i = (size_t)localPr->partitionData[model]->lower;  i < (size_t)localPr->partitionData[model]->upper; i++, globalCounter++)
+		{
+		  if(i % (size_t)n == (size_t)tid)
+		    {
+#ifdef _USE_PTHREADS
+		      localPr->partitionData[model]->yVector[j][localCounter] = tr->yVector[j][globalCounter];
+#else 
+		      localPr->partitionData[model]->yVector[j][localCounter] = yBuf[globalCounter];
+#endif
+		      ++localCounter; 
+		    }
+		}	   
+	    }
+	}
+    }
+}
+
+/** @brief Distribute the weights in the alignment of slave process/threads
+
+    Allocate space in the local tree structure for the alignment weights. Then
+    copy the weights vector from the master process/thread to the slaves.
+
+    @param tr 
+      PLL instance
+    
+    @param localTree 
+      Local library instance for the current process/thread
+
+    @param localPr
+      Local list of partitions for the current process/thread
+
+    @todo
+      The alignment weights should go to the partitions structure rather than the tree structure
+ */ 
+static void distributeWeights(pllInstance *localTree, pllInstance *tr, partitionList *localPr)
+{
+  int tid = localTree->threadID; 
+  int n = localTree->numberOfThreads; 
+
+  size_t     
+    globalCounter = 0,
+    i,
+    localCounter  = 0,
+    model; 
+
+
+
+  /* distribute the weights  */
+#ifdef _FINE_GRAIN_MPI 		/* need to broadcast a few things first */
+  if(NOT MASTER_P)
+    tr->aliaswgt = rax_malloc(sizeof(int) * tr->originalCrunchedLength); 
+  MPI_Bcast(tr->aliaswgt, tr->originalCrunchedLength, MPI_INT, 0, MPI_COMM_WORLD);      
+#endif
+  for(model = 0, globalCounter = 0; model < (size_t)localPr->numberOfPartitions; model++)
+    { 
+      if(tr->manyPartitions)
+	{
+	  if(isThisMyPartition(localPr, tid, model))
+	    {
+	      assert(localPr->partitionData[model]->upper - localPr->partitionData[model]->lower == localPr->partitionData[model]->width);
+	      for(localCounter = 0, i = (size_t)localPr->partitionData[model]->lower;  i < (size_t)localPr->partitionData[model]->upper; i++, localCounter++, globalCounter++)
+		localPr->partitionData[model]->wgt[localCounter]          = tr->aliaswgt[globalCounter];
+	    }
+	  else
+	    globalCounter += (localPr->partitionData[model]->upper - localPr->partitionData[model]->lower);
+	}
+      else 
+	{ 
+	  for(localCounter = 0, i = (size_t)localPr->partitionData[model]->lower;  i < (size_t)localPr->partitionData[model]->upper; i++, globalCounter++)
+	    {
+	      if(i % (size_t)n == (size_t)tid)
+		localPr->partitionData[model]->wgt[localCounter++]       = tr->aliaswgt[globalCounter];
+	    }	   
+	}
+    }
+}
+
+
+/** @brief Initialize the partitioning scheme (master function) in parallel environment.
+    
+    Initialize the partition scheme in all processes/threads. This is a wrapper function
+    that calls all necessary functions for allocating the local structures for slave threads
+    and for distributing all necessary data from the master threads, such as alignment data,
+    and weight vectors.
+
+    @param tr 
+      PLL instance
+
+    @param localTree 
+      Local PLL instance for the slave process/thread
+
+    @param pr
+      List of partitions
+
+    @param localPr
+      Local partition structure for the slave process/thread
+
+    @param tid
+      Process/thread id
+
+    @param n 
+      Number of processes/threads
+*/ 
+static void initializePartitionsMaster(pllInstance *tr, pllInstance *localTree, partitionList *pr, partitionList *localPr, int tid, int n)
+{ 
+  size_t
+    model;
+
+  treeIsInitialized = PLL_TRUE; 
+
+  ASSIGN_INT(localTree->manyPartitions, tr->manyPartitions);
+  ASSIGN_INT(localTree->numberOfThreads, tr->numberOfThreads);
+  ASSIGN_INT(localPr->numberOfPartitions, pr->numberOfPartitions);
+
+#ifdef _USE_PTHREADS
+  if(MASTER_P)
+    globalResult = rax_calloc((size_t) tr->numberOfThreads * (size_t)pr->numberOfPartitions* 2 ,sizeof(double));
+  else 
+    assignAndInitPart1(localTree, tr, localPr, pr, &tid);
+#else 
+  globalResult = rax_calloc((size_t) tr->numberOfThreads * (size_t)pr->numberOfPartitions* 2 ,sizeof(double));
+  assignAndInitPart1(localTree, tr, localPr, pr, &tid);
+  defineTraversalInfoMPI();
+#endif
+
+  for(model = 0; model < (size_t)localPr->numberOfPartitions; model++)
+    localPr->partitionData[model]->width        = 0;
+
+  if(tr->manyPartitions)    
+    {
+      multiprocessorScheduling(localTree, localPr, tid);
+      computeFractionMany(localPr, tid);
+    }
+  else
+    computeFraction(localPr, tid, n);
+
+  initializePartitionData(localTree, localPr);
+
+  {
+    size_t 
+      model,  
+      i,      
+      countOffset,
+      myLength = 0;
+
+    for(model = 0; model < (size_t)localPr->numberOfPartitions; model++)
+      myLength += localPr->partitionData[model]->width;
+
+    /* assign local memory for storing sequence data */
+    
+    localTree->y_ptr = (unsigned char *)rax_malloc(myLength * (size_t)(localTree->mxtips) * sizeof(unsigned char));
+    assert(localTree->y_ptr != NULL);
+
+    for(i = 0; i < (size_t)localTree->mxtips; i++)
+      {
+	for(model = 0, countOffset = 0; model < (size_t)localPr->numberOfPartitions; model++)
+	  {	    
+	    localPr->partitionData[model]->yVector[i+1]   = &localTree->y_ptr[i * myLength + countOffset];
+	    countOffset +=  localPr->partitionData[model]->width;
+	  }
+	assert(countOffset == myLength);
+      }
+
+    /* figure in data */
+
+    distributeWeights(localTree, tr, localPr);
+
+    distributeYVectors(localTree, tr, localPr);
+
+  }
+
+  initMemorySavingAndRecom(localTree, localPr);
+}
diff --git a/lib/pll/genericParallelization.h b/lib/pll/genericParallelization.h
new file mode 100644
index 0000000..6bf6744
--- /dev/null
+++ b/lib/pll/genericParallelization.h
@@ -0,0 +1,123 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file genericParallelization.h
+ */
+#ifndef _GENERIC_PARALL_H 
+#define _GENERIC_PARALL_H 
+
+
+extern double *globalResult; 
+
+
+/**********/
+/* CONFIG */
+/**********/
+
+/* #define MEASURE_TIME_PARALLEL */
+#define _PORTABLE_PTHREADS
+/* #define DEBUG_PARALLEL */ 
+/* #define DEBUG_MPI_EACH_SEND */
+/* #define _REPRODUCIBLE_MPI_OR_PTHREADS */
+#ifdef _USE_PTHREADS
+#ifndef _PORTABLE_PTHREADS
+void pinToCore(int tid);
+#endif
+#endif
+
+
+#define NOT ! 
+#define IS_PARALLEL (defined(_USE_PTHREADS) || defined(_FINE_GRAIN_MPI)) 
+
+
+
+#ifdef MEASURE_TIME_PARALLEL
+#define NUM_PAR_JOBS 16
+extern double masterTimePerPhase; 
+#endif
+
+
+/******************/
+/* MPI SPECIFIC   */
+/******************/
+#ifdef _FINE_GRAIN_MPI
+#include <mpi.h>
+#ifdef DEBUG_MPI_EACH_SEND
+#define DEBUG_PRINT(text, elem) printf(text, elem)
+#else 
+#define DEBUG_PRINT(text, elem) NULL
+#endif
+
+/* for the broadcast of traversal descriptor */
+#define TRAVERSAL_LENGTH 5
+#define traversalSize sizeof(traversalInfo)
+#define messageSize(x)   (3 * sizeof(int) +  x * (sizeof(int)+ sizeof(double)) + TRAVERSAL_LENGTH * traversalSize)
+
+#define VOLATILE_PAR 
+#define MASTER_P (processID == 0)
+#define POP_OR_PUT_BYTES(bufPtr, elem, type) (MASTER_P ? (bufPtr = addBytes((bufPtr), &(elem), sizeof(type))) : (bufPtr = popBytes((bufPtr), &(elem), sizeof(type))))
+
+#define ASSIGN_INT(x,y) (MPI_Bcast(&y,1,MPI_INT,0,MPI_COMM_WORLD),DEBUG_PRINT("\tSEND/RECV %d\n", y)) 
+#define ASSIGN_BUF(x,y,type) (POP_OR_PUT_BYTES(bufPtr, y,type))
+#define ASSIGN_BUF_DBL(x,y) (POP_OR_PUT_BYTES(bufPtrDbl,y, double))
+#define ASSIGN_DBL(x,y) (MPI_Bcast(&y,1,MPI_DOUBLE, 0, MPI_COMM_WORLD), DEBUG_PRINT("\tSEND/RECV %f\n", y)) 
+#define ASSIGN_DBLS(tar,src,length) MPI_Bcast(tar, length, MPI_DOUBLE, 0, MPI_COMM_WORLD)
+#define DOUBLE MPI_DOUBLE
+#define ASSIGN_GATHER(tar,src,length,type,tid) MPI_Gather(src,length,type,tar,length,type,0, MPI_COMM_WORLD)
+#define SEND_BUF(buf, bufSize,type) if(MASTER_P) MPI_Bcast(buf, bufSize, type, 0, MPI_COMM_WORLD) 
+#define RECV_BUF(buf, bufSize,type) if(NOT MASTER_P) MPI_Bcast(buf, bufSize, type, 0, MPI_COMM_WORLD) 
+#define BCAST_BUF(buf, bufSize,type,who)  MPI_Bcast(buf, bufSize, type, who,MPI_COMM_WORLD )
+
+
+
+extern int processes; 
+extern int processID; 
+#endif 
+
+/*********************/
+/* PTHREAD SPECIFIC  */
+/*********************/
+#ifdef _USE_PTHREADS
+#include <pthread.h>
+#define _REPRODUCIBLE_MPI_OR_PTHREADS
+#define VOLATILE_PAR volatile 
+#define MASTER_P (tid == 0)
+#define ASSIGN_INT(x,y) (x = y)
+#define ASSIGN_BUF(x,y,type) (x = y)
+#define ASSIGN_BUF_DBL(x,y) (x = y)
+#define ASSIGN_DBL(x,y) (x = y)
+#define ASSIGN_DBLS(tar,src,length) memmove(tar, src, length * sizeof(double))
+#define DOUBLE double 	/* just rededining that to make the source code less confusing */
+#define ASSIGN_GATHER(tar,src,length,type,tid) (memmove((tar) + (tid) * (length) ,src, length * sizeof(type)))
+#define SEND_BUF(buf, bufSize, type) 
+#define RECV_BUF(buf, bufSize, type) 
+#define BCAST_BUF(buf, bufSize,type,who)  
+#define TRAVERSAL_LENGTH 5
+#define messageSize(x) 0
+#endif
+
+
+#endif	/* end include guard  */
diff --git a/lib/pll/globalVariables.h b/lib/pll/globalVariables.h
new file mode 100644
index 0000000..16f83e0
--- /dev/null
+++ b/lib/pll/globalVariables.h
@@ -0,0 +1,173 @@
+/*  RAxML-VI-HPC (version 2.2) a program for sequential and parallel estimation of phylogenetic trees 
+ *  Copyright August 2006 by Alexandros Stamatakis
+ *
+ *  Partially derived from
+ *  fastDNAml, a program for estimation of phylogenetic trees from sequences by Gary J. Olsen
+ *  
+ *  and 
+ *
+ *  Programs of the PHYLIP package by Joe Felsenstein.
+ *
+ *  This program is free software; you may redistribute it and/or modify its
+ *  under the terms of the GNU General Public License as published by the Free
+ *  Software Foundation; either version 2 of the License, or (at your option)
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ *  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  for more details.
+ * 
+ *
+ *  For any other enquiries send an Email to Alexandros Stamatakis
+ *  Alexandros.Stamatakis at epfl.ch
+ *
+ *  When publishing work that is based on the results from RAxML-VI-HPC please cite:
+ *
+ *  Alexandros Stamatakis:"RAxML-VI-HPC: maximum likelihood-based phylogenetic analyses with thousands of taxa and mixed models". 
+ *  Bioinformatics 2006; doi: 10.1093/bioinformatics/btl446
+ */
+
+#ifdef GLOBAL_VARIABLES_DEFINITION
+
+int PLL_NUM_BRANCHES; 
+
+const char *protModels[PLL_NUM_PROT_MODELS] = {"PROT", /* dummy needed by exabayes ; just any model   */
+					       "DAYHOFF", "DCMUT", "JTT", "MTREV", "WAG", "RTREV", "CPREV", "VT", "BLOSUM62", "MTMAM", "LG", "MTART", "MTZOA", "PMB", 
+					       "HIVB", "HIVW", "JTTDCMUT", "FLU", "AUTO", "LG4", "GTR"};
+
+const char binaryStateNames[2]   = {'0', '1'};  
+
+const char dnaStateNames[4]      = {'A', 'C', 'G', 'T'};
+
+const char protStateNames[20]    = {'A','R', 'N', 'D', 'C', 'Q', 'E', 'G', 'H', 
+				    'I', 'L', 'K', 'M', 'F', 'P', 'S', 'T', 'W', 
+				    'Y', 'V'};
+
+const char inverseMeaningBINARY[4] = {'_', '0', '1', '-'};
+const char inverseMeaningDNA[16]   = {'_', 'A', 'C', 'M', 'G', 'R', 'S', 'V', 'T', 'W', 'Y', 'H', 'K', 'D', 'B', '-'};
+const char inverseMeaningPROT[23]  = {'A','R', 'N', 'D', 'C', 'Q', 'E', 'G', 'H', 'I', 'L', 'K', 'M', 'F', 'P', 'S', 
+			       'T', 'W', 'Y', 'V', 'B', 'Z', '-'};
+const char inverseMeaningGeneric32[33] = {'0', '1', '2', '3', '4', '5', '6', '7', 
+				    '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
+				    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
+				    'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
+				    '-'};
+const char inverseMeaningGeneric64[33] = {'0', '1', '2', '3', '4', '5', '6', '7', 
+				    '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
+				    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
+				    'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
+				    '-'};
+
+const unsigned int bitVectorIdentity[256] = {0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20 ,21 ,22 ,23 ,24 ,25 ,26 ,
+					     27 ,28 ,29 ,30 ,31 ,32 ,33 ,34 ,35 ,36 ,37 ,38 ,39 ,40 ,41 ,42 ,43 ,44 ,45 ,46 ,47 ,48 ,49 ,50 ,51 ,
+					     52 ,53 ,54 ,55 ,56 ,57 ,58 ,59 ,60 ,61 ,62 ,63 ,64 ,65 ,66 ,67 ,68 ,69 ,70 ,71 ,72 ,73 ,74 ,75 ,76 ,
+					     77 ,78 ,79 ,80 ,81 ,82 ,83 ,84 ,85 ,86 ,87 ,88 ,89 ,90 ,91 ,92 ,93 ,94 ,95 ,96 ,97 ,98 ,99 ,100 ,101 ,
+					     102 ,103 ,104 ,105 ,106 ,107 ,108 ,109 ,110 ,111 ,112 ,113 ,114 ,115 ,116 ,117 ,118 ,119 ,120 ,121 ,122 ,
+					     123 ,124 ,125 ,126 ,127 ,128 ,129 ,130 ,131 ,132 ,133 ,134 ,135 ,136 ,137 ,138 ,139 ,140 ,141 ,142 ,143 ,
+					     144 ,145 ,146 ,147 ,148 ,149 ,150 ,151 ,152 ,153 ,154 ,155 ,156 ,157 ,158 ,159 ,160 ,161 ,162 ,163 ,164 ,
+					     165 ,166 ,167 ,168 ,169 ,170 ,171 ,172 ,173 ,174 ,175 ,176 ,177 ,178 ,179 ,180 ,181 ,182 ,183 ,184 ,185 ,
+					     186 ,187 ,188 ,189 ,190 ,191 ,192 ,193 ,194 ,195 ,196 ,197 ,198 ,199 ,200 ,201 ,202 ,203 ,204 ,205 ,206 ,
+					     207 ,208 ,209 ,210 ,211 ,212 ,213 ,214 ,215 ,216 ,217 ,218 ,219 ,220 ,221 ,222 ,223 ,224 ,225 ,226 ,227 ,
+					     228 ,229 ,230 ,231 ,232 ,233 ,234 ,235 ,236 ,237 ,238 ,239 ,240 ,241 ,242 ,243 ,244 ,245 ,246 ,247 ,248 ,
+					     249 ,250 ,251 ,252 ,253 ,254 ,255};
+
+
+
+const unsigned int bitVectorAA[23] = {1, 2, 4, 8, 16, 32, 64, 128, 
+				      256, 512, 1024, 2048, 4096, 
+				      8192, 16384, 32768, 65536, 131072, 262144, 
+				      524288, 12 /* N | D */, 96 /*Q | E*/, 1048575 /* - */};
+
+const unsigned int bitVectorSecondary[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
+					      10, 11, 12, 13, 14, 15, 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 
+					      208, 224, 240, 0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 
+					      255, 0, 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 
+					      3584, 3840, 0, 257, 514, 771, 1028, 1285, 1542, 1799, 2056, 2313, 2570, 2827, 3084, 
+					      3341, 3598, 3855, 0, 272, 544, 816, 1088, 1360, 1632, 1904, 2176, 2448, 2720, 2992, 
+					      3264, 3536, 3808, 4080, 0, 273, 546, 819, 1092, 1365, 1638, 1911, 2184, 2457, 2730, 
+					      3003, 3276, 3549, 3822, 4095, 0, 4096, 8192, 12288, 16384, 20480, 24576, 28672, 32768, 
+					      36864, 40960, 45056, 49152, 53248, 57344, 61440, 0, 4097, 8194, 12291, 16388, 20485, 24582, 
+					      28679, 32776, 36873, 40970, 45067, 49164, 53261, 57358, 61455, 0, 4112, 8224, 12336, 16448, 
+					      20560, 24672, 28784, 32896, 37008, 41120, 45232, 49344, 53456, 57568, 61680, 0, 4113, 8226, 
+					      12339, 16452, 20565, 24678, 28791, 32904, 37017, 41130, 45243, 49356, 53469, 57582, 61695, 
+					      0, 4352, 8704, 13056, 17408, 21760, 26112, 30464, 34816, 39168, 43520, 47872, 52224, 56576, 
+					      60928, 65280, 0, 4353, 8706, 13059, 17412, 21765, 26118, 30471, 34824, 39177, 43530, 47883, 
+					      52236, 56589, 60942, 65295, 0, 4368, 8736, 13104, 17472, 21840, 26208, 30576, 34944, 39312, 
+					      43680, 48048, 52416, 56784, 61152, 65520, 0, 4369, 8738, 13107, 17476, 21845, 26214, 30583, 
+					      34952, 39321, 43690, 48059, 52428, 56797, 61166, 65535};
+
+const unsigned int bitVector32[33] = {1,     2,    4,    8,   16,   32,    64,   128,
+                                      256, 512, 1024, 2048, 4096, 8192, 16384, 32768,
+                                      65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608,
+                                      16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648u, 
+				      4294967295u};
+
+/*const unsigned int bitVector64[65] = {};*/
+/** @brief Array for setting bits 0 .. 31 in a bit vector, used in saveMemory technique for the gapVector */
+const unsigned int mask32[32] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 
+					262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 
+					268435456, 536870912, 1073741824, 2147483648U};
+
+const char *secondaryModelList[21] = { "S6A (GTR)", "S6B", "S6C", "S6D", "S6E", "S7A (GTR)", "S7B", "S7C", "S7D", "S7E", "S7F", "S16 (GTR)", "S16A", "S16B", "S16C", 
+				       "S16D", "S16E", "S16F", "S16I", "S16J", "S16K"};
+
+const partitionLengths pLengths[PLL_MAX_MODEL] = {
+  
+  /* BINARY */
+  {4,   4,   2,  4,  4, 1, 2,  8, 2, 2, PLL_FALSE, PLL_FALSE, 3, inverseMeaningBINARY, 2, PLL_FALSE, bitVectorIdentity},
+  
+  /* DNA */
+  {16,  16,  4, 16, 16, 6, 4, 64, 6, 4, PLL_FALSE, PLL_FALSE, 15, inverseMeaningDNA, 4, PLL_FALSE, bitVectorIdentity},
+        
+  /* AA */
+  {400, 400, 20, 400, 400, 190, 20, 460, 190, 20, PLL_FALSE, PLL_FALSE, 22, inverseMeaningPROT, 20, PLL_TRUE, bitVectorAA},
+  
+  /* SECONDARY_DATA */
+
+  {256, 256, 16, 256, 256, 120, 16, 4096, 120, 16, PLL_FALSE, PLL_FALSE, 255, (char*)NULL, 16, PLL_TRUE, bitVectorSecondary},
+
+  
+  /* SECONDARY_DATA_6 */
+  {36, 36,  6, 36, 36, 15, 6, 384, 15, 6, PLL_FALSE, PLL_FALSE, 63, (char*)NULL, 6, PLL_TRUE, bitVectorIdentity},
+
+  
+  /* SECONDARY_DATA_7 */
+  {49,   49,    7,   49, 49,  21, 7, 896, 21, 7, PLL_FALSE, PLL_FALSE, 127, (char*)NULL, 7, PLL_TRUE, bitVectorIdentity},
+
+  /* 32 states */
+  {1024, 1024, 32, 1024, 1024, 496, 32, 1056, 496, 32, PLL_FALSE, PLL_FALSE, 32, inverseMeaningGeneric32, 32, PLL_TRUE, bitVector32},
+  
+  /* 64 states */
+  {4096, 4096, 64, 4096, 4096, 2016, 64, 4160, 64, 2016, PLL_FALSE, PLL_FALSE, 64, (char*)NULL, 64, PLL_TRUE, (unsigned int*)NULL}
+};
+
+
+#if (defined(_USE_PTHREADS) || defined(_FINE_GRAIN_MPI))
+double *globalResult;
+boolean treeIsInitialized; 
+#ifdef MEASURE_TIME_PARALLEL
+double masterTimePerPhase; 
+#endif
+#endif
+
+#ifdef _USE_PTHREADS
+volatile int             jobCycle = 0;
+volatile int             threadJob = 0;
+volatile char            *barrierBuffer;
+#endif
+
+#ifdef _FINE_GRAIN_MPI
+int processes;
+int processID; 
+MPI_Datatype TRAVERSAL_MPI; 
+#endif
+
+#else
+extern int PLL_NUM_BRANCHES; 
+extern const partitionLengths pLengths[PLL_MAX_MODEL];
+extern const char * protModels[PLL_NUM_PROT_MODELS];
+extern char * secondaryModelList[21];
+//extern const unsigned int * mask32;
+
+#endif
diff --git a/lib/pll/hardware.c b/lib/pll/hardware.c
new file mode 100644
index 0000000..3d0aacf
--- /dev/null
+++ b/lib/pll/hardware.c
@@ -0,0 +1,150 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+#include "hardware.h"
+
+#define PLL_FEAT_AVAIL(x,y) (((x) & (y)) == (y))
+#define PLL_SYS_CPU_DIR_PATH "/sys/devices/system/cpu/"
+
+static inline void cpuid(unsigned int op, int count,
+                         unsigned int *eax, unsigned int *ebx,
+                         unsigned int *ecx, unsigned int *edx)
+{
+  *eax = op;
+  *ecx = count;
+
+  asm volatile("cpuid"
+        : "=a" (*eax),
+          "=b" (*ebx),
+          "=c" (*ecx),
+          "=d" (*edx)
+
+        : "0" (*eax), "2" (*ecx)
+        : "memory");
+}
+
+
+void show_hardware_info(pllHardwareInfo * hw)
+{
+  printf ("MMX.........: %d\n"
+          "SSE.........: %d\n"
+          "SSE2........: %d\n"
+          "SSE3........: %d\n"
+          "SSSE3.......: %d\n"
+          "FMA.........: %d\n"
+          "SSE4.1......: %d\n"
+          "SSE4.2......: %d\n"
+          "AVX.........: %d\n"
+          "AVX2........: %d\n"
+          "SSE4A.......: %d\n"
+          "FMA4........: %d\n\n"
+          "Core(s).....: %d\n"
+          "CPU Sockets.: %d\n",
+
+          hw->has_mmx, hw->has_sse, hw->has_sse2, hw->has_sse3, hw->has_ssse3,
+          hw->has_fma, hw->has_sse41, hw->has_sse42, hw->has_avx, hw->has_avx2,
+          hw->has_sse4a, hw->has_fma4, hw->cores, hw->cpu_sockets);
+}
+
+static int pll_probe_cpu (pllHardwareInfo * hw)
+{
+  struct stat cpustat;
+  char cpu[30];
+  char cpupath[100];
+  int i, id, max_physical_id = -1;
+  char * physical_id_path = "/topology/physical_package_id";
+  FILE * fd;
+
+  /* check whether the sys cpu dir exists */
+  if (stat(PLL_SYS_CPU_DIR_PATH, &cpustat)) return (0);
+  
+  /* and also check whether it is a dir */
+  if (!S_ISDIR(cpustat.st_mode)) return (0);
+
+  /* detect number of processors */
+  for (i = 0; ; ++i)
+   {
+     sprintf(cpu, "cpu%d", i);
+     strcpy (cpupath, PLL_SYS_CPU_DIR_PATH);
+     strcat (cpupath, cpu);
+     if (stat(cpupath, &cpustat)) break;
+
+     strcat (cpupath, physical_id_path);
+     if (!stat(cpupath, &cpustat))
+      {
+        fd = fopen (cpupath,"r");
+        fscanf (fd, "%d", &id);
+        /* printf ("Detected processor %d belonging to package %d\n", i, id); */
+        if (id > max_physical_id) max_physical_id = id;
+        fclose (fd);
+      }
+   }
+  
+  hw->cores       = i;
+  hw->cpu_sockets = max_physical_id + 1;
+
+  return (1);
+}
+
+static void pll_probe_hardware (pllHardwareInfo * hw)
+{
+  unsigned int a, b, c, d;
+  c = 0;
+
+  cpuid(0,0,&a,&b,&c,&d);
+  *((unsigned int *)(hw->vendor)    ) = b;
+  *((unsigned int *)(hw->vendor + 4)) = d;
+  *((unsigned int *)(hw->vendor + 8)) = c;
+  hw->vendor[12] = 0;
+
+  printf ("%s\n", hw->vendor);
+
+  cpuid(1,0,&a,&b,&c,&d);
+
+  hw->has_mmx   = PLL_FEAT_AVAIL(d,PLL_HAS_MMX); 
+  hw->has_sse   = PLL_FEAT_AVAIL(d,PLL_HAS_SSE);
+  hw->has_sse2  = PLL_FEAT_AVAIL(d,PLL_HAS_SSE2);
+
+  hw->has_sse3  = PLL_FEAT_AVAIL(c,PLL_HAS_SSE3);
+  hw->has_ssse3 = PLL_FEAT_AVAIL(c,PLL_HAS_SSSE3);
+  hw->has_fma   = PLL_FEAT_AVAIL(c,PLL_HAS_FMA);
+  hw->has_sse41 = PLL_FEAT_AVAIL(c,PLL_HAS_SSE41);
+  hw->has_sse42 = PLL_FEAT_AVAIL(c,PLL_HAS_SSE42);
+  hw->has_avx   = PLL_FEAT_AVAIL(c,PLL_HAS_AVX);
+
+  cpuid(7,0,&a,&b,&c,&d);
+
+  hw->has_avx2  = PLL_FEAT_AVAIL(b,PLL_HAS_AVX2);
+
+  /* TODO: note, here we have to check whether leaf 0x80000001 exists */
+  cpuid(0x80000001,0,&a,&b,&c,&d);
+
+  hw->has_sse4a = PLL_FEAT_AVAIL(c,PLL_HAS_SSE4A);
+  hw->has_fma4  = PLL_FEAT_AVAIL(c,PLL_HAS_FMA4);
+}
+
+int pllGetHardwareInfo (pllHardwareInfo * hw)
+{
+  pll_probe_hardware (&hw);
+  pll_probe_cpu (&hw);
+
+  /* TODO: finish failure checks in probe_hardware and probe_cpu */
+  return (1);
+
+}
+
+/* TODO: Remove after testing */
+/* 
+int main (int argc, char * argv[])
+{ 
+  pllHardwareInfo hw;
+
+  pll_probe_hardware(&hw);
+  pll_probe_cpu(&hw);
+
+  show_hardware_info(&hw);
+  return (EXIT_SUCCESS);
+}
+*/
diff --git a/lib/pll/hardware.h b/lib/pll/hardware.h
new file mode 100644
index 0000000..d1bfa33
--- /dev/null
+++ b/lib/pll/hardware.h
@@ -0,0 +1,48 @@
+#ifndef PLL_HARDWARE
+#define PLL_HARDWARE
+
+/* leaf 1 */
+/* edx */
+#define PLL_HAS_MMX             1 << 23
+#define PLL_HAS_SSE             1 << 25
+#define PLL_HAS_SSE2            1 << 26
+
+/* ecx */
+#define PLL_HAS_SSE3            1
+#define PLL_HAS_SSSE3           1 <<  9
+#define PLL_HAS_FMA             1 << 12
+#define PLL_HAS_SSE41           1 << 19
+#define PLL_HAS_SSE42           1 << 20
+#define PLL_HAS_AVX             1 << 28
+
+
+/* leaf 7 */
+/* ebx */
+#define PLL_HAS_AVX2            1 <<  5
+
+/* leaf 0x80000001 */
+/* ecx*/
+#define PLL_HAS_SSE4A           1 <<  6
+#define PLL_HAS_FMA4            1 << 16
+
+typedef struct
+{
+  int has_mmx;
+  int has_sse;
+  int has_sse2;
+  int has_sse3;
+  int has_ssse3;
+  int has_sse41;
+  int has_sse42;
+  int has_sse4a;
+  int has_avx;
+  int has_avx2;
+  int has_fma;
+  int has_fma4;
+  int cpu_sockets;
+  int cores;
+  char vendor[13];
+
+} pllHardwareInfo;
+
+#endif
diff --git a/lib/pll/hash.c b/lib/pll/hash.c
new file mode 100644
index 0000000..197461b
--- /dev/null
+++ b/lib/pll/hash.c
@@ -0,0 +1,219 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file hash.c
+ */
+#include <stdio.h>
+#include <string.h>
+#include "pll.h"
+#include "mem_alloc.h"
+
+static const unsigned int initTable[] = 
+  {
+    53,         97,         193,       389,       769,    
+    1543,       3079,       6151,      12289,     24593, 
+    49157,      98317,      196613,    393241,    786433, 
+    1572869,    3145739,    6291469,   12582917,  25165843, 
+    50331653,   100663319,  201326611, 402653189, 805306457, 
+    1610612741, 3221225473, 4294967291
+  };
+       
+/** @brief Generate the hash value for a string 
+
+    Generates the hash value of a string \a s.
+
+    @param s     The string to compute the hash for
+    @param size  Size of the hash table
+    @return      String hash \a s, i.e. index in hash table
+*/
+unsigned int pllHashString (const char * s, unsigned int size)
+{
+  unsigned int hash = 0;
+
+  for (; *s; ++s) hash = (hash << 5) - hash + (unsigned int )*s;
+
+  return (hash % size);
+}
+
+/** @brief Add a string and its data to a hashtable
+    
+    Add an \a item and possibly a string \a s to hashtable \a hTable at position
+    \a hash, where \a hash must be a value between 0 and \a hTable->size - 1. If
+    string \a s is given and another record with the same computed hash and the
+    same associated string exists in the hash table, then the new record will \b not be added and the
+    value \b PLL_FALSE is returned. Otherwise, the new item is added at the
+    beginning of the corresponding linked list and the value \b PLL_TRUE is
+    returned.
+
+    @param hTable Hashtable
+    @param hash   Position where to store in hash table
+    @param s      String
+    @param item   Data associated with \a s
+    @return       Returns \b PLL_TRUE if added with success, otherwise \b PLL_FALSE
+*/
+int pllHashAdd  (pllHashTable * hTable, unsigned int hash, const char * s, void * item)
+{
+  pllHashItem * hItem;
+
+  hItem = hTable->Items[hash];
+
+  /* If a string was given, check whether the record already exists */
+  if (s)
+   {
+  for (; hItem; hItem = hItem->next)
+   {
+        if (hItem->str && !strcmp (s, hItem->str)) return (PLL_FALSE);
+      }
+   }
+
+  hItem = (pllHashItem *) rax_malloc (sizeof (pllHashItem));
+
+  /* store the string together with the element if given */
+  if (s)
+   {
+  hItem->str = (char *) rax_malloc ((strlen(s) + 1) * sizeof (char));
+  strcpy (hItem->str, s);
+   }
+  else
+   hItem->str = NULL;
+
+  hItem->data = item;
+
+  hItem->next = hTable->Items[hash];
+  hTable->Items[hash] = hItem;
+  hTable->entries += 1;
+
+  return (PLL_TRUE);
+}
+
+       
+/** @brief Initialize hash table
+    
+    Create a hash table of size at least \a n. The size of the hash table will
+    be the first prime number higher or equal to \a n.
+
+    @param n  Minimum size of hash table
+    @return   In case of success, returns a pointer to the created hash table, otherwise returns \b NULL
+*/
+pllHashTable * pllHashInit (unsigned int n)
+{ 
+  pllHashTable * hTable;
+  unsigned int i;
+  unsigned int primeTableLength;
+       
+  hTable = (pllHashTable *) rax_malloc (sizeof (pllHashTable));
+  if (!hTable) return (NULL);
+  
+  primeTableLength = sizeof (initTable) / sizeof(initTable[0]);
+
+  i = 0;
+ 
+  while (initTable[i] < n && i < primeTableLength) ++ i;
+ 
+  n = initTable[i];  
+ 
+  hTable->Items = (pllHashItem **) rax_calloc (n, sizeof (pllHashItem *));
+  if (!hTable->Items)
+   {
+     rax_free (hTable);
+     return (NULL);
+   }
+  hTable->size  = n;
+  hTable->entries = 0;
+ 
+  return (hTable);
+}
+
+/** @brief Retrieve the data stored in hash table for a given string
+
+    Retrieve the data stored in hash table \a hTable under a given string \a s.
+    In case the string is found in the hash table, the associated data are
+    stored in \a item and the function returns \b PLL_TRUE. In the opposite
+    case, or if \a s is given as \b NULL then \b PLL_FALSE is returned.
+
+    @param hTable   Hash table to be searched
+    @param s        String to look for
+    @param item     Where to store the retrieved data
+    @return         Returns \b PLL_TRUE if the string was found, otherwise \b PLL_FALSE
+*/
+int pllHashSearch (pllHashTable * hTable, char * s, void ** item)
+{
+  unsigned int pos;
+  pllHashItem * hItem;
+
+  if (!s) return (PLL_FALSE);
+
+  pos   = pllHashString (s, hTable->size);
+  hItem = hTable->Items[pos];
+
+  for (; hItem; hItem = hItem->next)
+   {
+     if (hItem->str && !strcmp (s, hItem->str))
+      {
+        *item = hItem->data;
+        return (PLL_TRUE);
+      }
+   }
+
+  return (PLL_FALSE);
+}
+
+/** @brief Deallocate a hash table
+
+    Deallocates the hash table. A callback function may be specified as \a
+    cbDealloc which will be executed upon all \a data elements of the hash
+    table, for deallocating custom data. If no deallocation is required for the
+    custom data, then \a cbDealloc must be set to \b NULL. The strings
+    associated with each hash element are deallocated.
+
+    @param hTable    Hash table to be deallocated
+    @pram  cbDealloc Callback function to perform deallocation of each data element of the hash table
+    @notes
+      Deallocates the structure for the hash table. Note that the 
+      data associated with the indexed strings are not deallocated.
+*/
+void pllHashDestroy (pllHashTable ** hTable, void (*cbDealloc)(void *))
+{
+  unsigned int i;
+  pllHashItem * hItem;
+  pllHashItem * tmp;
+
+  for (i = 0; i < (*hTable)->size; ++ i)
+  {
+    hItem = (*hTable)->Items[i];
+    while (hItem)
+     {
+       tmp   = hItem;
+       hItem = hItem->next;
+       if (tmp->str)  rax_free (tmp->str);
+       if (cbDealloc) cbDealloc (tmp->data);
+       rax_free (tmp);
+     }
+  }
+  rax_free ((*hTable)->Items);
+  rax_free (*hTable);
+  *hTable = NULL;
+}
diff --git a/lib/pll/hash.h b/lib/pll/hash.h
new file mode 100644
index 0000000..a550f38
--- /dev/null
+++ b/lib/pll/hash.h
@@ -0,0 +1,50 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file hash.h
+ */
+#ifndef __pll_HASH__
+#define __pll_HASH__
+
+struct pllHashItem
+{
+  void * data;
+  char * str;
+  struct pllHashItem * next;
+};
+
+struct pllHashTable
+{
+  unsigned int size;
+  struct pllHashItem ** Items;
+};
+
+unsigned int pllHashString (const char * s, unsigned int size);
+int pllHashAdd  (struct pllHashTable * hTable, const char * s, void * item);
+struct pllHashTable * pllHashInit (unsigned int n);
+int pllHashSearch (struct pllHashTable * hTable, char * s, void ** item);
+void pllHashDestroy (struct pllHashTable ** hTable, int);
+#endif
diff --git a/lib/pll/lexer.c b/lib/pll/lexer.c
new file mode 100644
index 0000000..1cbf614
--- /dev/null
+++ b/lib/pll/lexer.c
@@ -0,0 +1,299 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file lexer.c
+ */
+#include <stdio.h>
+#include "lexer.h"
+
+static const char * rawtext;
+static long rawtext_size;
+static long pos = 0;
+
+int lex_table[PLL_ASCII_SIZE] = {
+/*      */ PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN,   PLL_SYM_UNKNOWN,
+/*      */ PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN,   PLL_SYM_UNKNOWN,
+/*      */ PLL_SYM_UNKNOWN,     PLL_SYM_TAB,      PLL_SYM_CR,   PLL_SYM_UNKNOWN,
+/*      */ PLL_SYM_UNKNOWN,      PLL_SYM_LF, PLL_SYM_UNKNOWN,   PLL_SYM_UNKNOWN,
+/*      */ PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN,   PLL_SYM_UNKNOWN,
+/*      */ PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN,   PLL_SYM_UNKNOWN,
+/*      */ PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN,   PLL_SYM_UNKNOWN,
+/*      */ PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN,   PLL_SYM_UNKNOWN,
+/*  !"# */   PLL_SYM_SPACE, PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN,   PLL_SYM_UNKNOWN,
+/* $%&' */ PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN,   PLL_SYM_UNKNOWN,
+/* ()*+ */  PLL_SYM_OPAREN,  PLL_SYM_CPAREN, PLL_SYM_UNKNOWN,      PLL_SYM_PLUS,
+/* ,-./ */   PLL_SYM_COMMA,    PLL_SYM_DASH,     PLL_SYM_DOT,     PLL_SYM_SLASH,
+/* 0123 */   PLL_SYM_DIGIT,   PLL_SYM_DIGIT,   PLL_SYM_DIGIT,     PLL_SYM_DIGIT,
+/* 4567 */   PLL_SYM_DIGIT,   PLL_SYM_DIGIT,   PLL_SYM_DIGIT,     PLL_SYM_DIGIT,
+/* 89:; */   PLL_SYM_DIGIT,   PLL_SYM_DIGIT,   PLL_SYM_COLON, PLL_SYM_SEMICOLON,
+/* <=>? */ PLL_SYM_UNKNOWN,   PLL_SYM_EQUAL, PLL_SYM_UNKNOWN,      PLL_SYM_CHAR,
+/* @ABC */ PLL_SYM_UNKNOWN,    PLL_SYM_CHAR,    PLL_SYM_CHAR,      PLL_SYM_CHAR,
+/* DEFG */    PLL_SYM_CHAR,    PLL_SYM_CHAR,    PLL_SYM_CHAR,      PLL_SYM_CHAR,
+/* HIJK */    PLL_SYM_CHAR,    PLL_SYM_CHAR,    PLL_SYM_CHAR,      PLL_SYM_CHAR,
+/* LMNO */    PLL_SYM_CHAR,    PLL_SYM_CHAR,    PLL_SYM_CHAR,      PLL_SYM_CHAR,
+/* PQRS */    PLL_SYM_CHAR,    PLL_SYM_CHAR,    PLL_SYM_CHAR,      PLL_SYM_CHAR,
+/* TUVW */    PLL_SYM_CHAR,    PLL_SYM_CHAR,    PLL_SYM_CHAR,      PLL_SYM_CHAR,
+/* XYZ[ */    PLL_SYM_CHAR,    PLL_SYM_CHAR,    PLL_SYM_CHAR,   PLL_SYM_UNKNOWN,
+/* \]^_ */ PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN,      PLL_SYM_CHAR,
+/* `abc */ PLL_SYM_UNKNOWN,    PLL_SYM_CHAR,    PLL_SYM_CHAR,      PLL_SYM_CHAR,
+/* defg */    PLL_SYM_CHAR,    PLL_SYM_CHAR,    PLL_SYM_CHAR,      PLL_SYM_CHAR,
+/* hijk */    PLL_SYM_CHAR,    PLL_SYM_CHAR,    PLL_SYM_CHAR,      PLL_SYM_CHAR,
+/* lmno */    PLL_SYM_CHAR,    PLL_SYM_CHAR,    PLL_SYM_CHAR,      PLL_SYM_CHAR,
+/* pqrs */    PLL_SYM_CHAR,    PLL_SYM_CHAR,    PLL_SYM_CHAR,      PLL_SYM_CHAR,
+/* tuvw */    PLL_SYM_CHAR,    PLL_SYM_CHAR,    PLL_SYM_CHAR,      PLL_SYM_CHAR,
+/* xyz{ */    PLL_SYM_CHAR,    PLL_SYM_CHAR,    PLL_SYM_CHAR,   PLL_SYM_UNKNOWN,
+/* |}~  */    PLL_SYM_CHAR, PLL_SYM_UNKNOWN, PLL_SYM_UNKNOWN,   PLL_SYM_UNKNOWN
+ };
+
+int 
+get_next_byte (void)
+{
+  if (pos == rawtext_size) 
+   {
+     ++pos;
+     return (PLL_EOS);
+   }
+
+  return (rawtext[pos++]);
+}
+
+int
+get_next_symbol (void)
+{
+  int ch, sym;
+
+  ch = get_next_byte ();
+
+  if (ch == PLL_EOS) return (PLL_SYM_EOF);
+  if (ch >= PLL_ASCII_SIZE) return (PLL_SYM_UNKNOWN);
+
+  sym = lex_table[ch];
+
+  if (sym == PLL_SYM_LF)
+   {
+     if (get_next_byte() == '\n')
+      {
+        sym = PLL_SYM_LFCR;
+      }
+     else
+      {
+        --pos;
+      }
+   }
+
+  return sym;
+}
+
+pllLexToken
+get_token (int * input)
+{
+  pllLexToken token;
+  int
+    start_pos,
+    isFloating = 0;
+
+  token.lexeme = rawtext + pos - 1;
+  start_pos    = pos;
+
+  switch (*input)
+   {
+     case PLL_SYM_SLASH:
+       token.tokenType = PLL_TOKEN_SLASH;
+       *input = get_next_symbol();
+       break;
+
+     case PLL_SYM_DASH:
+       token.tokenType = PLL_TOKEN_DASH;
+       *input = get_next_symbol();
+       break;
+
+     case PLL_SYM_EQUAL:
+       token.tokenType = PLL_TOKEN_EQUAL;
+       *input = get_next_symbol();
+       break;
+
+     case PLL_SYM_SEMICOLON:
+       token.tokenType = PLL_TOKEN_SEMICOLON;
+       *input = get_next_symbol();
+       break;
+
+     case PLL_SYM_COMMA:
+       token.tokenType = PLL_TOKEN_COMMA;
+       *input = get_next_symbol();
+       break;
+
+     case PLL_SYM_COLON:
+       token.tokenType = PLL_TOKEN_COLON;
+       *input = get_next_symbol();
+       break;
+
+     case PLL_SYM_OPAREN:
+       token.tokenType = PLL_TOKEN_OPAREN;
+       *input = get_next_symbol();
+       break;
+
+     case PLL_SYM_CPAREN:
+       token.tokenType = PLL_TOKEN_CPAREN;
+       *input = get_next_symbol();
+       break;
+
+     case PLL_SYM_SPACE:
+     case PLL_SYM_TAB:
+       do
+        {
+          *input = get_next_symbol();
+        } while (*input == PLL_SYM_SPACE || *input == PLL_SYM_TAB);
+       token.len   = pos - start_pos;
+       token.tokenType = PLL_TOKEN_WHITESPACE; 
+       if (*input == PLL_SYM_LFCR) --token.len;
+       break;
+       
+     case PLL_SYM_DIGIT:
+       do
+        {
+          *input = get_next_symbol();   
+        } while (*input == PLL_SYM_DIGIT);
+
+       if (*input == PLL_SYM_DOT)
+        {
+          isFloating = 1;
+          do
+           {
+             *input = get_next_symbol ();
+           } while (*input == PLL_SYM_DIGIT);
+        }
+
+       if (*input != PLL_SYM_CHAR)
+        {
+          token.len   = pos - start_pos;
+          if (!isFloating)
+            token.tokenType = PLL_TOKEN_NUMBER;
+          else
+            token.tokenType = PLL_TOKEN_FLOAT;
+        }
+       else
+        {
+          /* check for E notation */
+          if (rawtext[pos - 1] == 'E' || rawtext[pos - 1] == 'e')
+           {
+             *input = get_next_symbol ();
+
+             if (*input == PLL_SYM_PLUS || *input == PLL_SYM_DASH || *input == PLL_SYM_DIGIT)
+              {
+                do
+                 {
+                   *input = get_next_symbol ();
+                 } while (*input == PLL_SYM_DIGIT);
+
+                if (*input != PLL_SYM_CHAR)
+                 {
+                   token.len = pos - start_pos;
+                   token.tokenType = PLL_TOKEN_FLOAT;
+                 }
+              }
+             else
+              {
+                token.len = pos - start_pos;
+                token.tokenType = PLL_TOKEN_STRING;
+              }
+           }
+
+          if (*input == PLL_SYM_CHAR)
+           {
+             do {
+               *input = get_next_symbol();
+             } while (*input == PLL_SYM_CHAR || *input == PLL_SYM_DIGIT || *input == PLL_SYM_DOT);
+             token.len   = pos - start_pos;
+             token.tokenType = PLL_TOKEN_STRING;
+           }
+        }
+
+       if (*input == PLL_SYM_LFCR) --token.len;
+       break;
+
+     case PLL_SYM_CHAR:
+       do
+        {
+          *input = get_next_symbol();
+        } 
+       while (*input == PLL_SYM_CHAR  || 
+              *input == PLL_SYM_DIGIT || 
+              *input == PLL_SYM_DASH  ||
+              *input == PLL_SYM_DOT);
+       token.len   = pos - start_pos;
+       token.tokenType = PLL_TOKEN_STRING;
+       if (*input == PLL_SYM_LFCR) --token.len;
+       break;
+       
+     case PLL_SYM_EOF:
+       token.tokenType = PLL_TOKEN_EOF;
+       break;
+
+     case PLL_SYM_CR:
+     case PLL_SYM_LF:
+     case PLL_SYM_LFCR:
+       do
+        {
+          *input = get_next_symbol();
+        } while (*input == PLL_SYM_CR || *input == PLL_SYM_LFCR || *input == PLL_SYM_LF);
+       token.tokenType = PLL_TOKEN_NEWLINE;
+       break;
+     case PLL_SYM_UNKNOWN:
+     default:
+       token.tokenType = PLL_TOKEN_UNKNOWN;
+       break;
+   }
+
+  return (token);
+}
+
+void
+lex_table_amend_phylip (void)
+{
+  lex_table['-'] = lex_table['.'] = PLL_SYM_CHAR; 
+}
+
+void
+lex_table_amend_fasta (void)
+{
+  lex_table['-'] = lex_table['.'] = lex_table['>'] = PLL_SYM_CHAR; 
+}
+
+void
+lex_table_restore (void)
+{
+  lex_table['-'] = PLL_SYM_DASH;
+  lex_table['.'] = PLL_SYM_DOT; 
+  lex_table['>'] = PLL_SYM_UNKNOWN;
+}
+
+void
+init_lexan (const char * text, long n)
+{
+  rawtext      = text;
+  rawtext_size = n;
+  pos          = 0;
+}
diff --git a/lib/pll/lexer.h b/lib/pll/lexer.h
new file mode 100644
index 0000000..6924259
--- /dev/null
+++ b/lib/pll/lexer.h
@@ -0,0 +1,88 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file lexer.h
+ */
+#ifndef __pll_LEXER__
+#define __pll_LEXER__
+
+#define  PLL_ASCII_SIZE                128
+#define  PLL_EOS                       0x00000200
+
+#define  PLL_SYM_CR                    1 << 0
+#define  PLL_SYM_LF                    1 << 1
+#define  PLL_SYM_LFCR                  1 << 2
+#define  PLL_SYM_DIGIT                 1 << 3
+#define  PLL_SYM_CHAR                  1 << 4
+#define  PLL_SYM_SPACE                 1 << 5
+#define  PLL_SYM_TAB                   1 << 6
+#define  PLL_SYM_EOF                   1 << 7
+#define  PLL_SYM_UNKNOWN               1 << 8
+#define  PLL_SYM_DOT                   1 << 9
+#define  PLL_SYM_COLON                 1 << 10
+#define  PLL_SYM_OPAREN                1 << 11
+#define  PLL_SYM_CPAREN                1 << 12
+#define  PLL_SYM_COMMA                 1 << 13
+#define  PLL_SYM_SEMICOLON             1 << 14
+#define  PLL_SYM_EQUAL                 1 << 15
+#define  PLL_SYM_DASH                  1 << 16
+#define  PLL_SYM_SLASH                 1 << 17
+#define  PLL_SYM_PLUS                  1 << 18
+
+#define  PLL_TOKEN_NUMBER              1 << 0
+#define  PLL_TOKEN_STRING              1 << 1
+#define  PLL_TOKEN_EOF                 1 << 2
+#define  PLL_TOKEN_WHITESPACE          1 << 3
+#define  PLL_TOKEN_NEWLINE             1 << 4
+#define  PLL_TOKEN_UNKNOWN             1 << 5
+#define  PLL_TOKEN_COLON               1 << 6
+#define  PLL_TOKEN_OPAREN              1 << 7
+#define  PLL_TOKEN_CPAREN              1 << 8
+#define  PLL_TOKEN_FLOAT               1 << 9
+#define  PLL_TOKEN_COMMA               1 << 10
+#define  PLL_TOKEN_SEMICOLON           1 << 11
+#define  PLL_TOKEN_EQUAL               1 << 12
+#define  PLL_TOKEN_DASH                1 << 13
+#define  PLL_TOKEN_SLASH               1 << 14
+
+#define CONSUME(x)         while (token.tokenType & (x)) token = get_token (&input);
+#define NEXT_TOKEN         token = get_token (&input);
+
+typedef struct
+ {
+   int 	        tokenType;
+   const char * lexeme;
+   int          len;
+ } pllLexToken;
+
+int get_next_byte (void);
+int get_next_symbol (void);
+pllLexToken get_token (int * input);
+void init_lexan (const char * text, long n);
+void lex_table_amend_phylip (void);
+void lex_table_amend_fasta (void);
+void lex_table_restore (void);
+#endif
diff --git a/lib/pll/makenewzGenericSpecial.c b/lib/pll/makenewzGenericSpecial.c
new file mode 100644
index 0000000..21ad2b6
--- /dev/null
+++ b/lib/pll/makenewzGenericSpecial.c
@@ -0,0 +1,3090 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file bipartitionList.c
+ */
+#include "mem_alloc.h"
+
+#ifndef WIN32
+#include <unistd.h>
+#endif
+
+#include <math.h>
+#include <time.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+
+#include "pll.h"
+#include "pllInternal.h"
+
+#include "globalVariables.h"
+
+#ifdef __SSE3
+#include <xmmintrin.h>
+#include <pmmintrin.h>
+/*#include <tmmintrin.h>*/
+#endif
+
+#ifdef __MIC_NATIVE
+#include "mic_native.h"
+#endif
+
+
+/** @file makenewzGenericSpecial.c
+ *  
+ *  @brief Branch length optimization
+ */
+
+
+
+/* pointers to reduction buffers for storing and gathering the first and second derivative 
+   of the likelihood in Pthreads and MPI */
+
+#if IS_PARALLEL
+void branchLength_parallelReduce(pllInstance *tr, double *dlnLdlz,  double *d2lnLdlz2, int numBranches ) ;
+//extern double *globalResult;
+#endif
+
+
+extern const unsigned int mask32[32];
+
+#if (defined(__SSE3) || defined(__AVX))
+static void sumGAMMA_BINARY(int tipCase, double *sumtable, double *x1_start, double *x2_start, double *tipVector,
+                            unsigned char *tipX1, unsigned char *tipX2, int n);
+static void coreGTRGAMMA_BINARY(const int upper, double *sumtable,
+                                volatile double *d1,   volatile double *d2, double *EIGN, double *gammaRates, double lz, int *wrptr);
+static void coreGTRCAT_BINARY(int upper, int numberOfCategories, double *sum,
+                              volatile double *d1, volatile double *d2, 
+                              double *rptr, double *EIGN, int *cptr, double lz, int *wgt);
+static void sumCAT_BINARY(int tipCase, double *sum, double *x1_start, double *x2_start, double *tipVector,
+                          unsigned char *tipX1, unsigned char *tipX2, int n);
+#endif
+
+/*******************/
+
+
+/* generic function to get the required pointers to the data associated with the left and right node that define a branch */
+
+static void getVects(pllInstance *tr, 
+                     partitionList *pr, 
+                     unsigned char **tipX1, unsigned char **tipX2, 
+                     double **x1_start, double **x2_start, 
+                     int *tipCase, 
+                     int model, 
+                     double **x1_gapColumn, double **x2_gapColumn, 
+                     unsigned int **x1_gap, unsigned int **x2_gap,
+                     double ** x1_start_asc,
+                     double ** x2_start_asc)
+{
+  int    
+    rateHet = (int)discreteRateCategories(tr->rateHetModel),
+            states = pr->partitionData[model]->states,
+            pNumber, 
+            qNumber; 
+
+  /* get the left and right node number of the nodes defining the branch we want to optimize */
+
+  pNumber = tr->td[0].ti[0].pNumber;
+  qNumber = tr->td[0].ti[0].qNumber;
+
+  /* get the index where the ancestral vector is expected to be found */
+  int p_slot, q_slot;
+  if(tr->useRecom)
+  {
+    p_slot = tr->td[0].ti[0].slot_p; 
+    q_slot = tr->td[0].ti[0].slot_q;
+  }
+  else
+  {
+    p_slot = pNumber - tr->mxtips - 1;
+    q_slot = qNumber - tr->mxtips - 1;
+  }
+   
+
+  /* initialize to NULL */
+
+  *x1_start = (double*)NULL,
+    *x2_start = (double*)NULL;
+  
+  *tipX1 = (unsigned char*)NULL,
+    *tipX2 = (unsigned char*)NULL;
+
+  *x1_start_asc = NULL;
+  *x2_start_asc = NULL;
+
+  /* switch over the different tip cases again here */
+
+  if(isTip(pNumber, tr->mxtips) || isTip(qNumber, tr->mxtips))
+  {      
+    if(!( isTip(pNumber, tr->mxtips) && isTip(qNumber, tr->mxtips)) )
+    {
+      *tipCase = PLL_TIP_INNER;
+      if(isTip(qNumber, tr->mxtips))
+      {
+        *tipX1 = pr->partitionData[model]->yVector[qNumber];
+        *x2_start = pr->partitionData[model]->xVector[p_slot];
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+        if(pr->partitionData[model]->ascBias && tr->threadID == 0)
+#else
+          if(pr->partitionData[model]->ascBias)
+#endif
+          {
+            *x2_start_asc = &pr->partitionData[model]->ascVector[(pNumber - tr->mxtips - 1) * pr->partitionData[model]->ascOffset];
+          }
+
+        if(tr->saveMemory)
+        {
+          *x2_gap = &(pr->partitionData[model]->gapVector[pNumber * pr->partitionData[model]->gapVectorLength]);
+          *x2_gapColumn   = &pr->partitionData[model]->gapColumn[(pNumber - tr->mxtips - 1) * states * rateHet];
+        }
+      }
+      else
+      {
+        *tipX1 = pr->partitionData[model]->yVector[pNumber];
+        *x2_start = pr->partitionData[model]->xVector[q_slot];
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+        if(pr->partitionData[model]->ascBias && tr->threadID == 0)
+#else
+          if(pr->partitionData[model]->ascBias)
+#endif  
+          {
+            *x2_start_asc = &pr->partitionData[model]->ascVector[(qNumber - tr->mxtips - 1) * pr->partitionData[model]->ascOffset];
+          }
+
+        if(tr->saveMemory)
+        {
+          *x2_gap = &(pr->partitionData[model]->gapVector[qNumber * pr->partitionData[model]->gapVectorLength]);
+          *x2_gapColumn   = &pr->partitionData[model]->gapColumn[(qNumber - tr->mxtips - 1) * states * rateHet];
+        }
+      }
+    }
+    else
+    {
+      /* note that tip tip should normally not occur since this means that we are trying to optimize 
+         a branch in a two-taxon tree. However, this has been inherited be some RAxML function 
+         that optimized pair-wise distances between all taxa in a tree */
+
+      *tipCase = PLL_TIP_TIP;
+      *tipX1 = pr->partitionData[model]->yVector[pNumber];
+      *tipX2 = pr->partitionData[model]->yVector[qNumber];
+    }
+  }
+  else
+  {
+    *tipCase = PLL_INNER_INNER;
+
+    *x1_start = pr->partitionData[model]->xVector[p_slot];
+    *x2_start = pr->partitionData[model]->xVector[q_slot];
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+      if(pr->partitionData[model]->ascBias && tr->threadID == 0)
+#else
+        if(pr->partitionData[model]->ascBias)
+#endif
+        {
+          *x1_start_asc = &pr->partitionData[model]->ascVector[(pNumber - tr->mxtips - 1) * pr->partitionData[model]->ascOffset];
+          *x2_start_asc = &pr->partitionData[model]->ascVector[(qNumber - tr->mxtips - 1) * pr->partitionData[model]->ascOffset];
+        }           
+    if(tr->saveMemory)
+    {
+      *x1_gap = &(pr->partitionData[model]->gapVector[pNumber * pr->partitionData[model]->gapVectorLength]);
+      *x1_gapColumn   = &pr->partitionData[model]->gapColumn[(pNumber - tr->mxtips - 1) * states * rateHet];
+
+      *x2_gap = &(pr->partitionData[model]->gapVector[qNumber * pr->partitionData[model]->gapVectorLength]);
+      *x2_gapColumn   = &pr->partitionData[model]->gapColumn[(qNumber - tr->mxtips - 1) * states * rateHet];
+    }
+  }
+
+}
+
+
+/* this is actually a pre-computation and storage of values that remain constant while we change the value of the branch length 
+   we want to adapt. the target pointer sumtable is a single pre-allocated array that has the same 
+   size as a conditional likelihood vector at an inner node.
+
+   So if we want to do a Newton-Raphson optimization we only execute this function once in the beginning for each new branch we are considering !
+   */
+
+#if (!defined(__SSE3) && !defined(__AVX))
+static void sumCAT_FLEX(int tipCase, double *sumtable, double *x1, double *x2, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n, const int states)
+{
+  int 
+    i, 
+    l;
+
+  double 
+    *sum, 
+    *left, 
+    *right;
+
+  switch(tipCase)
+  {
+
+    /* switch over possible configurations of the nodes p and q defining the branch */
+
+    case PLL_TIP_TIP:
+      for (i = 0; i < n; i++)
+      {
+        left  = &(tipVector[states * tipX1[i]]);
+        right = &(tipVector[states * tipX2[i]]);
+        sum = &sumtable[states * i];
+
+        /* just multiply the values with each other for each site, note the similarity with evaluate() 
+           we precompute the product which will remain constant and then just multiply this pre-computed 
+           product with the changing P matrix exponentaions that depend on the branch lengths */
+
+        for(l = 0; l < states; l++)
+          sum[l] = left[l] * right[l];
+      }
+      break;
+    case PLL_TIP_INNER:
+
+      /* same as for PLL_TIP_TIP only that 
+         we now access on tip vector and one 
+         inner vector. 
+
+         You may also observe that we do not consider using scaling vectors anywhere here.
+
+         This is because we are interested in the first and second derivatives of the likelihood and 
+         hence the addition of the log() of the scaling factor times the number of scaling events
+         becomes obsolete through the derivative */
+
+      for (i = 0; i < n; i++)
+      {
+        left = &(tipVector[states * tipX1[i]]);
+        right = &x2[states * i];
+        sum = &sumtable[states * i];
+
+        for(l = 0; l < states; l++)
+          sum[l] = left[l] * right[l];
+      }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+      {
+        left  = &x1[states * i];
+        right = &x2[states * i];
+        sum = &sumtable[states * i];
+
+        for(l = 0; l < states; l++)
+          sum[l] = left[l] * right[l];
+      }
+      break;
+    default:
+      assert(0);
+  }
+}
+#endif
+
+
+
+#if (!defined(__SSE3) && !defined(__AVX))
+
+/* same thing for GAMMA models. The only noteworthy thing here is that we have an additional inner loop over the 
+   number of discrete gamma rates. The data access pattern is also different since for tip vector accesses through our 
+   lookup table, we do not distnguish between rates 
+
+   Note the different access pattern in PLL_TIP_INNER:
+
+   left = &(tipVector[states * tipX1[i]]);	  
+   right = &(x2[span * i + l * states]);
+
+*/
+
+static void sumGAMMA_FLEX(int tipCase, double *sumtable, double *x1, double *x2, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n, const int states)
+{
+  int 
+    i, 
+    l, 
+    k;
+
+  const int 
+    span = 4 * states;
+
+  double 
+    *left, 
+    *right, 
+    *sum;
+
+
+
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      for(i = 0; i < n; i++)
+      {
+        left  = &(tipVector[states * tipX1[i]]);
+        right = &(tipVector[states * tipX2[i]]);
+
+        for(l = 0; l < 4; l++)
+        {
+          sum = &sumtable[i * span + l * states];
+
+          for(k = 0; k < states; k++)
+            sum[k] = left[k] * right[k];
+
+        }
+      }
+      break;
+    case PLL_TIP_INNER:
+      //reorder_back( x2, n, span );
+      for(i = 0; i < n; i++)
+      {
+        left = &(tipVector[states * tipX1[i]]);
+
+        for(l = 0; l < 4; l++)
+        {
+          right = &(x2[span * i + l * states]);
+          sum = &sumtable[i * span + l * states];
+
+          for(k = 0; k < states; k++)
+            sum[k] = left[k] * right[k];
+
+        }
+      }
+      //reorder( x2, n, span );
+      break;
+    case PLL_INNER_INNER:
+      //reorder_back( x1, n, span );
+      //reorder_back( x2, n, span );
+      for(i = 0; i < n; i++)
+      {
+        for(l = 0; l < 4; l++)
+        {
+          left  = &(x1[span * i + l * states]);
+          right = &(x2[span * i + l * states]);
+          sum   = &(sumtable[i * span + l * states]);
+
+
+          for(k = 0; k < states; k++)
+            sum[k] = left[k] * right[k];
+        }
+      }
+      //reorder( x1, n, span );
+      //reorder( x2, n, span );
+      break;
+    default:
+      assert(0);
+  }
+}
+#endif
+
+/* optimized functions for branch length optimization */
+
+
+#if (defined(__SSE3) || defined(__AVX))
+
+static void sumCAT_SAVE(int tipCase, double *sum, double *x1_start, double *x2_start, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n, double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap);
+
+static void sumGAMMA_GAPPED_SAVE(int tipCase, double *sumtable, double *x1_start, double *x2_start, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n, 
+    double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap);
+
+static void sumGAMMA(int tipCase, double *sumtable, double *x1_start, double *x2_start, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n);
+
+static void sumCAT(int tipCase, double *sum, double *x1_start, double *x2_start, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n);
+
+static void sumGAMMAPROT_GAPPED_SAVE(int tipCase, double *sumtable, double *x1, double *x2, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n, 
+    double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap);
+
+static void sumGAMMAPROT_LG4(int tipCase, double *sumtable, double *x1, double *x2, double *tipVector[4],
+			     unsigned char *tipX1, unsigned char *tipX2, int n);
+
+static void sumGAMMAPROT(int tipCase, double *sumtable, double *x1, double *x2, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n);
+
+static void sumGTRCATPROT(int tipCase, double *sumtable, double *x1, double *x2, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n);
+
+static void sumGTRCATPROT_SAVE(int tipCase, double *sumtable, double *x1, double *x2, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n, 
+    double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap);
+
+static void coreGTRGAMMAPROT_LG4(double *gammaRates, double *EIGN[4], double *sumtable, int upper, int *wrptr,
+				 volatile double *ext_dlnLdlz,  volatile double *ext_d2lnLdlz2, double lz);
+
+static void coreGTRGAMMA(const int upper, double *sumtable,
+    volatile double *ext_dlnLdlz,  volatile double *ext_d2lnLdlz2, double *EIGN, double *gammaRates, double lz, int *wrptr);
+
+static void coreGTRCAT(int upper, int numberOfCategories, double *sum,
+    volatile double *d1, volatile double *d2, int *wgt, 
+    double *rptr, double *EIGN, int *cptr, double lz);
+
+
+static void coreGTRGAMMAPROT(double *gammaRates, double *EIGN, double *sumtable, int upper, int *wrptr,
+    volatile double *ext_dlnLdlz,  volatile double *ext_d2lnLdlz2, double lz);
+
+static void coreGTRCATPROT(double *EIGN, double lz, int numberOfCategories, double *rptr, int *cptr, int upper,
+    int *wgt, volatile double *ext_dlnLdlz,  volatile double *ext_d2lnLdlz2, double *sumtable);
+
+#endif
+
+
+/* now this is the core function of the newton-Raphson based branch length optimization that actually computes 
+   the first and second derivative of the likelihood given a new proposed branch length lz */
+
+static void ascertainmentBiasSequence(unsigned char tip[32], int numStates)
+{ 
+  assert(numStates <= 32 && numStates > 1);
+
+  switch(numStates)
+    {
+    case 2:     
+      tip[0] = 1;
+      tip[1] = 2;
+      break;
+    case 4:
+      tip[0] = 1;
+      tip[1] = 2;
+      tip[2] = 4;
+      tip[3] = 8;
+      break;
+    default:
+      {
+	int 
+	  i;
+	for(i = 0; i < numStates; i++)
+	  {
+	    tip[i] = i;
+	    //printf("%c ", inverseMeaningPROT[i]);
+	  }
+	//printf("\n");
+      }
+      break;
+    }
+}
+
+static double coreCatAsc(double *EIGN, double *sumtable, int upper,
+			 volatile double *ext_dlnLdlz,  volatile double *ext_d2lnLdlz2, double lz, const int numStates)
+{
+  double  
+    diagptable[1024], 
+    lh = 0.0,
+    dlnLdlz = 0.0,
+    d2lnLdlz2 = 0.0,
+    ki, 
+    kisqr;
+
+  int     
+    i,     
+    l;  
+
+ 
+  ki = 1.0;
+  kisqr = 1.0;
+
+  for(l = 1; l < numStates; l++)
+    {
+      diagptable[l * 4]     = exp(EIGN[l-1] * ki * lz);
+      diagptable[l * 4 + 1] = EIGN[l-1] * ki;
+      diagptable[l * 4 + 2] = EIGN[l-1] * EIGN[l-1] * kisqr;
+    }
+
+  for (i = 0; i < upper; i++)
+    {
+      double
+	*sum = &sumtable[i * numStates],
+	tmp,
+	inv_Li   = 0.0,
+	dlnLidlz = 0.0,
+	d2lnLidlz2 = 0.0;
+
+    
+      inv_Li += sum[0];
+
+      for(l = 1; l < numStates; l++)
+	{
+	  inv_Li     += (tmp = diagptable[l * 4] * sum[l]);
+	  dlnLidlz   += tmp * diagptable[l * 4 + 1];
+	  d2lnLidlz2 += tmp * diagptable[l * 4 + 2];
+	}	            
+            
+      inv_Li = fabs(inv_Li);             
+       
+      lh        += inv_Li;	  	 
+      dlnLdlz   += dlnLidlz;
+      d2lnLdlz2 += d2lnLidlz2;       
+    } 
+
+  *ext_dlnLdlz   = (dlnLdlz / (lh - 1.0));
+  *ext_d2lnLdlz2 = (((lh - 1.0) * (d2lnLdlz2) - (dlnLdlz * dlnLdlz)) / ((lh - 1.0) * (lh - 1.0)));  
+
+  return lh;
+}
+
+
+static double coreGammaAsc(double *gammaRates, double *EIGN, double *sumtable, int upper,
+			   volatile double *ext_dlnLdlz,  volatile double *ext_d2lnLdlz2, double lz, const int numStates)
+{
+  double  
+    diagptable[1024], 
+    lh = 0.0,
+    dlnLdlz = 0.0,
+    d2lnLdlz2 = 0.0,
+    ki, 
+    kisqr;
+
+  int     
+    i, 
+    j, 
+    l;  
+
+  const int 
+    gammaStates = 4 * numStates;
+
+  for(i = 0; i < 4; i++)
+    {
+      ki = gammaRates[i];
+      kisqr = ki * ki;
+
+      for(l = 1; l < numStates; l++)
+	{
+	  diagptable[i * gammaStates + l * 4]     = exp(EIGN[l-1] * ki * lz);
+	  diagptable[i * gammaStates + l * 4 + 1] = EIGN[l-1] * ki;
+	  diagptable[i * gammaStates + l * 4 + 2] = EIGN[l-1] * EIGN[l-1] * kisqr;
+	}
+    }
+
+  for (i = 0; i < upper; i++)
+    {
+      double
+	*sum = &sumtable[i * gammaStates],
+	tmp,
+	inv_Li   = 0.0,
+	dlnLidlz = 0.0,
+	d2lnLidlz2 = 0.0;
+
+      for(j = 0; j < 4; j++)
+	{
+	  inv_Li += sum[j * numStates];
+
+	  for(l = 1; l < numStates; l++)
+	    {
+	      inv_Li     += (tmp = diagptable[j * gammaStates + l * 4] * sum[j * numStates + l]);
+	      dlnLidlz   += tmp * diagptable[j * gammaStates + l * 4 + 1];
+	      d2lnLidlz2 += tmp * diagptable[j * gammaStates + l * 4 + 2];
+	    }	  
+	}    
+            
+      inv_Li = 0.25 * fabs(inv_Li);         
+      dlnLidlz *= 0.25;
+      d2lnLidlz2 *= 0.25;
+       
+      lh        += inv_Li;	  	 
+      dlnLdlz   += dlnLidlz;
+      d2lnLdlz2 += d2lnLidlz2;       
+    } 
+
+  *ext_dlnLdlz   = (dlnLdlz / (lh - 1.0));
+  *ext_d2lnLdlz2 = (((lh - 1.0) * (d2lnLdlz2) - (dlnLdlz * dlnLdlz)) / ((lh - 1.0) * (lh - 1.0)));  
+
+  return lh;
+}
+
+static void sumCatAsc(int tipCase, double *sumtable, double *x1, double *x2, double *tipVector,
+			int n, const int numStates)
+{
+  int i, k;
+  double *left, *right, *sum;
+
+  unsigned char 
+    tip[32];
+
+  ascertainmentBiasSequence(tip, numStates);
+
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:
+      for(i = 0; i < n; i++)
+	{
+	  left  = &(tipVector[numStates * tip[i]]);
+	  right = &(tipVector[numStates * tip[i]]);
+
+	  
+	  sum = &sumtable[i * numStates];
+	  
+	  for(k = 0; k < numStates; k++)
+	    sum[k] = left[k] * right[k];	  
+	}
+      break;
+    case PLL_TIP_INNER:
+      for(i = 0; i < n; i++)
+	{
+	  left = &(tipVector[numStates * tip[i]]);
+
+	  
+	  right = &(x2[i * numStates]);
+	  sum = &sumtable[i * numStates];
+
+	  for(k = 0; k < numStates; k++)
+	    sum[k] = left[k] * right[k];	 
+	}
+      break;
+    case PLL_INNER_INNER:
+      for(i = 0; i < n; i++)
+	{
+	  left  = &(x1[i * numStates]);
+	  right = &(x2[i * numStates]);
+	  sum   = &(sumtable[i * numStates]);
+
+	  for(k = 0; k < numStates; k++)
+	    sum[k] = left[k] * right[k];	 
+	}
+      break;
+    default:
+      assert(0);
+    }
+}
+
+static void sumGammaAsc(int tipCase, double *sumtable, double *x1, double *x2, double *tipVector,
+			int n, const int numStates)
+{
+  int i, l, k;
+  double *left, *right, *sum;
+
+  const int gammaStates = numStates * 4;
+
+  unsigned char 
+    tip[32];
+
+  ascertainmentBiasSequence(tip, numStates);
+
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:
+      for(i = 0; i < n; i++)
+	{
+	  left  = &(tipVector[numStates * tip[i]]);
+	  right = &(tipVector[numStates * tip[i]]);
+
+	  for(l = 0; l < 4; l++)
+	    {
+	      sum = &sumtable[i * gammaStates + l * numStates];
+	      for(k = 0; k < numStates; k++)
+		sum[k] = left[k] * right[k];
+	    }
+	}
+      break;
+    case PLL_TIP_INNER:
+      for(i = 0; i < n; i++)
+	{
+	  left = &(tipVector[numStates * tip[i]]);
+
+	  for(l = 0; l < 4; l++)
+	    {
+	      right = &(x2[gammaStates * i + l * numStates]);
+	      sum = &sumtable[i * gammaStates + l * numStates];
+
+	      for(k = 0; k < numStates; k++)
+		sum[k] = left[k] * right[k];
+	    }
+	}
+      break;
+    case PLL_INNER_INNER:
+      for(i = 0; i < n; i++)
+	{
+	  for(l = 0; l < 4; l++)
+	    {
+	      left  = &(x1[gammaStates * i + l * numStates]);
+	      right = &(x2[gammaStates * i + l * numStates]);
+	      sum   = &(sumtable[i * gammaStates + l * numStates]);
+
+	      for(k = 0; k < numStates; k++)
+		sum[k] = left[k] * right[k];
+	    }
+	}
+      break;
+    default:
+      assert(0);
+    }
+}
+
+
+
+
+#if (!defined(__AVX) && !defined(__SSE3))
+static void coreCAT_FLEX(int upper, int numberOfCategories, double *sum,
+    volatile double *d1, volatile double *d2, int *wgt,
+    double *rptr, double *EIGN, int *cptr, double lz, const int states)
+    /* rptr perSiteRates pointer, cptr rateCategory pointer */
+{
+  int 
+    i, 
+    l;
+
+  double 
+    *d, 
+
+    /* arrays to store stuff we can pre-compute */
+    *d_start = NULL,
+    *e = NULL,
+    *s = NULL,
+    *dd = NULL,
+    inv_Li, 
+    dlnLidlz, 
+    d2lnLidlz2,
+    dlnLdlz = 0.0,
+    d2lnLdlz2 = 0.0;
+
+  rax_posix_memalign ((void **) &d_start, PLL_BYTE_ALIGNMENT, numberOfCategories * states * sizeof(double));
+  rax_posix_memalign ((void **) &e,       PLL_BYTE_ALIGNMENT, (states * sizeof(double)));
+  rax_posix_memalign ((void **) &s,       PLL_BYTE_ALIGNMENT, states * sizeof(double));
+  rax_posix_memalign ((void **) &dd,      PLL_BYTE_ALIGNMENT, states * sizeof(double)),
+  d = d_start;
+
+  e[0] = 0.0;
+  s[0] = 0.0; 
+  dd[0] = 0.0;
+
+
+  /* we are pre-computing values for computing the first and second derivative of P(lz)
+     since this requires an exponetial that the only thing we really have to derive here */
+
+  for(l = 1; l < states; l++)
+  { 
+    s[l]  = EIGN[l];
+    e[l]  = EIGN[l] * EIGN[l];     
+    dd[l] = s[l] * lz;
+  }
+
+  /* compute the P matrices and their derivatives for 
+     all per-site rate categories */
+
+  for(i = 0; i < numberOfCategories; i++)
+  {      
+    d[states * i] = 1.0;
+    for(l = 1; l < states; l++)
+      d[states * i + l] = exp(dd[l] * rptr[i]);
+  }
+
+
+  /* now loop over the sites in this partition to obtain the per-site 1st and 2nd derivatives */
+
+  for (i = 0; i < upper; i++)
+  {    
+    /* get the correct p matrix for the rate at the current site i */
+
+    d = &d_start[states * cptr[i]];      
+
+    /* this is the likelihood at site i, NOT the log likelihood, we don't need the log 
+       likelihood to compute derivatives ! */
+
+    inv_Li     = sum[states * i]; 
+
+    /* those are for storing the first and second derivative of the Likelihood at site i */
+
+    dlnLidlz   = 0.0;
+    d2lnLidlz2 = 0.0;
+
+    /* now multiply the likelihood and the first and second derivative with the 
+       appropriate derivatives of P(lz) */
+
+    for(l = 1; l < states; l++)
+    {
+      double
+        tmpv = d[l] * sum[states * i + l];
+
+      inv_Li     += tmpv;	 	  
+      dlnLidlz   += tmpv * s[l];       
+      d2lnLidlz2 += tmpv * e[l];
+    }     
+
+    /* below we are implementing the other mathematical operations that are required 
+       to obtain the deirivatives */
+
+    inv_Li = 1.0 / fabs (inv_Li);
+
+    dlnLidlz   *= inv_Li;
+    d2lnLidlz2 *= inv_Li;
+
+    /* compute the accumulated first and second derivatives of this site */
+
+    dlnLdlz  += wgt[i] * rptr[cptr[i]] * dlnLidlz;
+    d2lnLdlz2 += wgt[i] * rptr[cptr[i]] * rptr[cptr[i]] * (d2lnLidlz2 - dlnLidlz * dlnLidlz);
+  }
+
+  /* 
+     set the result values, i.e., the sum of the per-site first and second derivatives of the likelihood function 
+     for this partition. 
+     */
+
+  *d1  = dlnLdlz;
+  *d2 = d2lnLdlz2;
+
+  /* free the temporary arrays */
+
+  rax_free(d_start);
+  rax_free(e);
+  rax_free(s);
+  rax_free(dd);
+}
+
+static void coreGAMMA_FLEX(int upper, double *sumtable, volatile double *ext_dlnLdlz,  volatile double *ext_d2lnLdlz2, 
+    double *EIGN, double *gammaRates, double lz, int *wrptr, const int states)
+{
+  double  
+    *sum, 
+    diagptable[1024], /* TODO make this dynamic */
+    dlnLdlz = 0.0,
+    d2lnLdlz2 = 0.0,
+    ki, 
+    kisqr,
+    tmp,
+    inv_Li, 
+    dlnLidlz, 
+    d2lnLidlz2;
+
+  int     
+    i, 
+    j, 
+    l;  
+
+  const int 
+    gammaStates = 4 * states;
+
+  /* pre-compute the derivatives of the P matrix for all discrete GAMMA rates */
+
+  for(i = 0; i < 4; i++)
+  {
+    ki = gammaRates[i];
+    kisqr = ki * ki;
+
+    for(l = 1; l < states; l++)
+    {
+      diagptable[i * gammaStates + l * 4]     = exp(EIGN[l] * ki * lz);
+      diagptable[i * gammaStates + l * 4 + 1] = EIGN[l] * ki;
+      diagptable[i * gammaStates + l * 4 + 2] = EIGN[l] * EIGN[l] * kisqr;
+    }
+  }
+
+  /* loop over sites in this partition */
+
+  for (i = 0; i < upper; i++)
+  {
+    /* access the array with pre-computed values */
+    sum = &sumtable[i * gammaStates];
+
+    /* initial per-site likelihood and 1st and 2nd derivatives */
+
+    inv_Li   = 0.0;
+    dlnLidlz = 0.0;
+    d2lnLidlz2 = 0.0;
+
+    /* loop over discrete GAMMA rates */
+
+    for(j = 0; j < 4; j++)
+    {
+      inv_Li += sum[j * states];
+
+      for(l = 1; l < states; l++)
+      {
+        inv_Li     += (tmp = diagptable[j * gammaStates + l * 4] * sum[j * states + l]);
+        dlnLidlz   +=  tmp * diagptable[j * gammaStates + l * 4 + 1];
+        d2lnLidlz2 +=  tmp * diagptable[j * gammaStates + l * 4 + 2];
+      }
+    }
+
+    /* finalize derivative computation */
+    /* note that wrptr[] here unlike in CAT above is the 
+       integer weight vector of the current site 
+
+       The operations:
+
+       EIGN[l] * ki;
+       EIGN[l] * EIGN[l] * kisqr;
+
+       that are hidden in CAT in wrptr (at least the * ki and * ki *ki part of them 
+       are done explicitely here 
+
+*/
+
+    inv_Li = 1.0 / fabs (inv_Li);
+
+    dlnLidlz   *= inv_Li;
+    d2lnLidlz2 *= inv_Li;
+
+    dlnLdlz   += wrptr[i] * dlnLidlz;
+    d2lnLdlz2 += wrptr[i] * (d2lnLidlz2 - dlnLidlz * dlnLidlz);
+  }
+
+  *ext_dlnLdlz   = dlnLdlz;
+  *ext_d2lnLdlz2 = d2lnLdlz2;
+
+}
+#endif
+
+//void sumGAMMA_FLEX_reorder(int tipCase, double *sumtable, double *x1, double *x2, double *tipVector,
+//    unsigned char *tipX1, unsigned char *tipX2, int n, const int states);
+
+/** @brief Precompute values (sumtable) from the 2 likelihood vectors of a given branch
+ *
+ * @warning These precomputations are stored in \a tr->partitionData[model].sumBuffer, which is used by function \a execCore
+ *
+ * @param tr
+ *   Library instance
+ *
+ * @warning the given branch is implicitly defined in \a tr by these nodes:
+ * pNumber = tr->td[0].ti[0].pNumber;
+ * qNumber = tr->td[0].ti[0].qNumber;
+ *
+ *
+ * @note This function should be called only once at the very beginning of each Newton-Raphson procedure for optimizing barnch lengths. It initially invokes an iterative newview call to get a consistent pair of vectors at the left and the right end of the branch and thereafter invokes the one-time only precomputation of values (sumtable) that can be re-used in each Newton-Raphson iteration. Once this function has been called we can execute the actual NR procedure
+ *
+ *
+ */
+void makenewzIterative(pllInstance *tr, partitionList * pr)
+{
+  int 
+    model, 
+    tipCase;
+
+  double
+    *x1_start     = NULL,
+    *x2_start     = NULL,
+    *x1_start_asc = NULL,
+    *x2_start_asc = NULL;
+
+
+  unsigned char
+    *tipX1,
+    *tipX2;
+
+  double
+    *x1_gapColumn = (double*)NULL,
+    *x2_gapColumn = (double*)NULL;
+
+  unsigned int
+    *x1_gap = (unsigned int*)NULL,
+    *x2_gap = (unsigned int*)NULL;			      
+
+  /* call newvieIterative to get the likelihood arrays to the left and right of the branch */
+
+  pllNewviewIterative(tr, pr, 1);
+
+
+  /* 
+     loop over all partoitions to do the precomputation of the sumTable buffer 
+     This is analogous to the pllNewviewIterative() and pllEvaluateIterative() 
+     implementations.
+     */
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+  { 
+    int 
+      width = pr->partitionData[model]->width;
+
+    if(tr->td[0].executeModel[model] && width > 0)
+    {
+      int 	   
+        states = pr->partitionData[model]->states;
+
+
+      getVects(tr, pr, &tipX1, &tipX2, &x1_start, &x2_start, &tipCase, model, &x1_gapColumn, &x2_gapColumn, &x1_gap, &x2_gap, &x1_start_asc, &x2_start_asc);
+
+#if (!defined(__SSE3) && !defined(__AVX) && !defined(__MIC_NATIVE))
+      assert(!tr->saveMemory);
+      if(tr->rateHetModel == PLL_CAT)
+        sumCAT_FLEX(tipCase, pr->partitionData[model]->sumBuffer, x1_start, x2_start, pr->partitionData[model]->tipVector, tipX1, tipX2,
+            width, states);
+      else
+        //sumGAMMA_FLEX_reorder(tipCase, pr->partitionData[model]->sumBuffer, x1_start, x2_start, pr->partitionData[model]->tipVector, tipX1, tipX2,
+          sumGAMMA_FLEX(tipCase, pr->partitionData[model]->sumBuffer, x1_start, x2_start, pr->partitionData[model]->tipVector, tipX1, tipX2,
+            width, states);
+#else
+      switch(states)
+      {
+      case 2: /* BINARY */
+          assert(!tr->saveMemory);
+          if (tr->rateHetModel == PLL_CAT)
+            sumCAT_BINARY(tipCase, pr->partitionData[model]->sumBuffer, x1_start, x2_start, pr->partitionData[model]->tipVector, tipX1, tipX2,
+                          width);
+          else
+            sumGAMMA_BINARY(tipCase, pr->partitionData[model]->sumBuffer, x1_start, x2_start, pr->partitionData[model]->tipVector, tipX1, tipX2,
+                            width);
+          break;
+      case 4: /* DNA */
+#ifdef __MIC_NATIVE
+      assert(!tr->saveMemory);
+      assert(tr->rateHetModel == PLL_GAMMA);
+
+      sumGTRGAMMA_MIC(tipCase, pr->partitionData[model]->sumBuffer, x1_start, x2_start, pr->partitionData[model]->tipVector, tipX1, tipX2,
+          width);
+#else
+          if(tr->rateHetModel == PLL_CAT)
+          {
+            if(tr->saveMemory)
+              sumCAT_SAVE(tipCase, pr->partitionData[model]->sumBuffer, x1_start, x2_start, pr->partitionData[model]->tipVector, tipX1, tipX2,
+                  width, x1_gapColumn, x2_gapColumn, x1_gap, x2_gap);
+            else
+              sumCAT(tipCase, pr->partitionData[model]->sumBuffer, x1_start, x2_start, pr->partitionData[model]->tipVector, tipX1, tipX2,
+                  width);
+          }
+          else
+          {
+            if(tr->saveMemory)
+              sumGAMMA_GAPPED_SAVE(tipCase, pr->partitionData[model]->sumBuffer, x1_start, x2_start, pr->partitionData[model]->tipVector, tipX1, tipX2,
+                  width, x1_gapColumn, x2_gapColumn, x1_gap, x2_gap);
+            else
+              sumGAMMA(tipCase, pr->partitionData[model]->sumBuffer, x1_start, x2_start, pr->partitionData[model]->tipVector, tipX1, tipX2,
+                  width);
+          }
+#endif
+          break;		
+        case 20: /* proteins */
+#ifdef __MIC_NATIVE
+          assert(!tr->saveMemory);
+          assert(tr->rateHetModel == PLL_GAMMA);
+
+	      if(pr->partitionData[model]->protModels == PLL_LG4)
+			  sumGTRGAMMAPROT_LG4_MIC(tipCase, pr->partitionData[model]->sumBuffer, x1_start, x2_start, pr->partitionData[model]->tipVector_LG4, tipX1, tipX2,
+				  width);
+	      else
+			  sumGTRGAMMAPROT_MIC(tipCase, pr->partitionData[model]->sumBuffer, x1_start, x2_start, pr->partitionData[model]->tipVector, tipX1, tipX2,
+				  width);
+#else
+
+            if(tr->rateHetModel == PLL_CAT)
+          {
+            if(tr->saveMemory)
+              sumGTRCATPROT_SAVE(tipCase, pr->partitionData[model]->sumBuffer, x1_start, x2_start, pr->partitionData[model]->tipVector,
+                  tipX1, tipX2, width, x1_gapColumn, x2_gapColumn, x1_gap, x2_gap);
+            else	      	      
+              sumGTRCATPROT(tipCase, pr->partitionData[model]->sumBuffer, x1_start, x2_start, pr->partitionData[model]->tipVector,
+                  tipX1, tipX2, width);
+          }
+          else
+          {
+
+            if(tr->saveMemory)
+              sumGAMMAPROT_GAPPED_SAVE(tipCase, pr->partitionData[model]->sumBuffer, x1_start, x2_start, pr->partitionData[model]->tipVector, tipX1, tipX2,
+                  width, x1_gapColumn, x2_gapColumn, x1_gap, x2_gap);
+	      else
+		    {
+		      if(pr->partitionData[model]->protModels == PLL_LG4)		      			   		
+			sumGAMMAPROT_LG4(tipCase,  pr->partitionData[model]->sumBuffer, x1_start, x2_start, pr->partitionData[model]->tipVector_LG4,
+					 tipX1, tipX2, width);
+            else
+              sumGAMMAPROT(tipCase, pr->partitionData[model]->sumBuffer, x1_start, x2_start, pr->partitionData[model]->tipVector,
+                  tipX1, tipX2, width);
+		    }
+          }
+#endif
+          break;		
+        default:
+          assert(0);
+      }
+#endif
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+      if (pr->partitionData[model]->ascBias && tr->threadID == 0)
+#else
+      if (pr->partitionData[model]->ascBias)
+#endif
+       {
+         if (tr->rateHetModel == PLL_CAT)
+           sumCatAsc  (tipCase, pr->partitionData[model]->ascSumBuffer, x1_start_asc, x2_start_asc, pr->partitionData[model]->tipVector, states, states);
+         else
+           sumGammaAsc(tipCase, pr->partitionData[model]->ascSumBuffer, x1_start_asc, x2_start_asc, pr->partitionData[model]->tipVector, states, states);
+       }
+    }
+  }
+}
+
+
+/** @brief Compute first and second derivatives of the likelihood with respect to a given branch length 
+ *
+ * @param tr
+ *   library instance
+ *
+ * @param _dlnLdlz 
+ *   First derivative dl/dlz
+ *
+ * @param _d2lnLdlz2
+ *   Second derivative d(dl/dlz)/dlz
+ *
+ * @warning \a makenewzIterative should have been called to precompute \a tr->partitionData[model].sumBuffer at the given branch
+ *
+ * @note  this function actually computes the first and second derivatives of the likelihood for a given branch stored in tr->coreLZ[model] Note that in the parallel case coreLZ must always be broadcasted together with the traversal descriptor, at least for optimizing branch lengths 
+ *
+ */
+void execCore(pllInstance *tr, partitionList *pr, volatile double *_dlnLdlz, volatile double *_d2lnLdlz2)
+{
+  int model, branchIndex;
+  int numBranches = pr->perGeneBranchLengths?pr->numberOfPartitions:1;
+
+  double lz;
+
+  _dlnLdlz[0]   = 0.0;
+  _d2lnLdlz2[0] = 0.0;
+
+  /* loop over partitions */
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+  {
+    int 
+      width = pr->partitionData[model]->width;
+
+    /* check if we (the present thread for instance) needs to compute something at 
+       all for the present partition */
+
+    if(tr->td[0].executeModel[model] && width > 0)
+    {
+      int 	    
+        states = pr->partitionData[model]->states;
+
+      double 
+        *sumBuffer       = (double*)NULL;
+
+
+      volatile double
+        dlnLdlz   = 0.0,
+                  d2lnLdlz2 = 0.0;
+
+      /* set a pointer to the part of the pre-computed sumBuffer we are going to access */
+
+      sumBuffer = pr->partitionData[model]->sumBuffer;
+
+      /* figure out if we are optimizing branch lengths individually per partition or jointly across 
+         all partitions. If we do this on a per partition basis, we also need to compute and store 
+         the per-partition derivatives of the likelihood separately, otherwise not */
+
+      if(numBranches > 1)
+      {
+        branchIndex = model;	      
+        lz = tr->td[0].parameterValues[model];
+        _dlnLdlz[model]   = 0.0;
+        _d2lnLdlz2[model] = 0.0;
+      }
+      else
+      {
+        branchIndex = 0;	      
+        lz = tr->td[0].parameterValues[0];
+      }
+
+#if (!defined(__SSE3) && !defined(__AVX) && !defined(__MIC_NATIVE))
+      /* compute first and second derivatives with the slow generic functions */
+
+      if(tr->rateHetModel == PLL_CAT)
+        coreCAT_FLEX(width, pr->partitionData[model]->numberOfCategories, sumBuffer,
+            &dlnLdlz, &d2lnLdlz2, pr->partitionData[model]->wgt,
+            pr->partitionData[model]->perSiteRates, pr->partitionData[model]->EIGN,  pr->partitionData[model]->rateCategory, lz, states);
+      else
+        coreGAMMA_FLEX(width, sumBuffer,
+            &dlnLdlz, &d2lnLdlz2, pr->partitionData[model]->EIGN, pr->partitionData[model]->gammaRates, lz,
+            pr->partitionData[model]->wgt, states);
+#else
+      switch(states)
+      {	   
+         case 2: /* BINARY */
+           if (tr->rateHetModel == PLL_CAT)
+              coreGTRCAT_BINARY(width, 
+                                pr->partitionData[model]->numberOfCategories, 
+                                sumBuffer,
+                                &dlnLdlz, 
+                                &d2lnLdlz2, 
+                                pr->partitionData[model]->perSiteRates, 
+                                pr->partitionData[model]->EIGN,  
+                                pr->partitionData[model]->rateCategory, 
+                                lz, 
+                                pr->partitionData[model]->wgt);
+           else
+              coreGTRGAMMA_BINARY(width, 
+                                   sumBuffer,
+                                   &dlnLdlz, 
+                                   &d2lnLdlz2, 
+                                   pr->partitionData[model]->EIGN,
+                                   pr->partitionData[model]->gammaRates, 
+                                   lz,
+                                   pr->partitionData[model]->wgt);
+           break;
+      case 4: /* DNA */
+#ifdef __MIC_NATIVE
+      assert(tr->rateHetModel == PLL_GAMMA);
+
+           coreGTRGAMMA_MIC(width, 
+                            sumBuffer,
+                            &dlnLdlz, 
+                            &d2lnLdlz2, 
+                            pr->partitionData[model]->EIGN, 
+                            pr->partitionData[model]->gammaRates, 
+                            lz,
+          pr->partitionData[model]->wgt);
+#else
+          if(tr->rateHetModel == PLL_CAT)
+            coreGTRCAT(width, pr->partitionData[model]->numberOfCategories, sumBuffer,
+                &dlnLdlz, &d2lnLdlz2, pr->partitionData[model]->wgt,
+                pr->partitionData[model]->perSiteRates, pr->partitionData[model]->EIGN,  pr->partitionData[model]->rateCategory, lz);
+          else 
+            coreGTRGAMMA(width, sumBuffer,
+                &dlnLdlz, &d2lnLdlz2, pr->partitionData[model]->EIGN, pr->partitionData[model]->gammaRates, lz,
+                pr->partitionData[model]->wgt);
+
+#endif
+          break;		    
+        case 20: /* proteins */
+
+#ifdef __MIC_NATIVE
+      assert(tr->rateHetModel == PLL_GAMMA);
+
+	  if(pr->partitionData[model]->protModels == PLL_LG4)
+		  coreGTRGAMMAPROT_LG4_MIC(width, sumBuffer,
+			  &dlnLdlz, &d2lnLdlz2, pr->partitionData[model]->EIGN_LG4, pr->partitionData[model]->gammaRates, lz,
+			  pr->partitionData[model]->wgt);
+	  else
+		  coreGTRGAMMAPROT_MIC(width, sumBuffer,
+			  &dlnLdlz, &d2lnLdlz2, pr->partitionData[model]->EIGN, pr->partitionData[model]->gammaRates, lz,
+			  pr->partitionData[model]->wgt);
+#else
+
+          if(tr->rateHetModel == PLL_CAT)
+            coreGTRCATPROT(pr->partitionData[model]->EIGN, lz, pr->partitionData[model]->numberOfCategories,  pr->partitionData[model]->perSiteRates,
+                pr->partitionData[model]->rateCategory, width,
+                pr->partitionData[model]->wgt,
+                &dlnLdlz, &d2lnLdlz2,
+                sumBuffer);
+	    else
+		{ 
+		  if(pr->partitionData[model]->protModels == PLL_LG4)		       
+		    coreGTRGAMMAPROT_LG4(pr->partitionData[model]->gammaRates, pr->partitionData[model]->EIGN_LG4,
+					 sumBuffer, width, pr->partitionData[model]->wgt,
+					 &dlnLdlz, &d2lnLdlz2, lz);
+          else
+
+            coreGTRGAMMAPROT(pr->partitionData[model]->gammaRates, pr->partitionData[model]->EIGN,
+                sumBuffer, width, pr->partitionData[model]->wgt,
+                &dlnLdlz, &d2lnLdlz2, lz);
+	    
+		}
+#endif
+          break;		   
+        default:
+          assert(0);
+      }
+#endif
+
+      /* store first and second derivative */
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+     if(pr->partitionData[model]->ascBias && tr->threadID == 0)
+#else
+     if(pr->partitionData[model]->ascBias)
+#endif  
+       {
+         size_t
+           i;
+
+         double 
+           correction;
+
+         int            
+           w = 0;
+         
+         volatile double 
+           d1 = 0.0,
+           d2 = 0.0;                   
+
+         for(i = (size_t)pr->partitionData[model]->lower; i < (size_t)pr->partitionData[model]->upper; i++)
+           w += tr->aliaswgt[i];     
+         
+          switch(tr->rateHetModel)
+            {
+            case PLL_CAT:
+              correction = coreCatAsc(pr->partitionData[model]->EIGN, pr->partitionData[model]->ascSumBuffer, states,
+                                        &d1,  &d2, lz, states);
+              break;
+            case PLL_GAMMA:
+              correction = coreGammaAsc(pr->partitionData[model]->gammaRates, pr->partitionData[model]->EIGN, pr->partitionData[model]->ascSumBuffer, states,
+                                        &d1,  &d2, lz, states);      
+              break;
+            default:
+              assert(0);
+            }
+        
+         correction = 1.0 - correction;
+     
+         _dlnLdlz[branchIndex]   =  _dlnLdlz[branchIndex] + dlnLdlz - (double)w * d1;
+         _d2lnLdlz2[branchIndex] =  _d2lnLdlz2[branchIndex] + d2lnLdlz2-  (double)w * d2;
+           
+       }  
+      else
+       {
+      _dlnLdlz[branchIndex]   = _dlnLdlz[branchIndex]   + dlnLdlz;
+      _d2lnLdlz2[branchIndex] = _d2lnLdlz2[branchIndex] + d2lnLdlz2;
+    }
+    }
+    else
+    {
+      /* set to 0 to make the reduction operation consistent */
+
+      if(width == 0 && (numBranches > 1))
+      {
+        _dlnLdlz[model]   = 0.0;
+        _d2lnLdlz2[model] = 0.0;
+      }			       	    	   
+    }
+  }
+
+}
+
+
+/* the function below actually implements the iterative Newton-Raphson procedure.
+   It is particularly messy and hard to read because for the case of per-partition branch length 
+   estimates it needs to keep track of whetehr the Newton Raphson procedure has 
+   converged for each partition individually. 
+
+   The rational efor doing it like this is also provided in:
+
+
+   A. Stamatakis, M. Ott: "Load Balance in the Phylogenetic Likelihood Kernel". Proceedings of ICPP 2009,
+
+*/
+
+static void topLevelMakenewz(pllInstance *tr, partitionList * pr, double *z0, int _maxiter, double *result)
+{
+  double   z[PLL_NUM_BRANCHES], zprev[PLL_NUM_BRANCHES], zstep[PLL_NUM_BRANCHES];
+  volatile double  dlnLdlz[PLL_NUM_BRANCHES], d2lnLdlz2[PLL_NUM_BRANCHES];
+  int i, maxiter[PLL_NUM_BRANCHES], model;
+  int numBranches = pr->perGeneBranchLengths?pr->numberOfPartitions:1;
+  boolean firstIteration = PLL_TRUE;
+  boolean outerConverged[PLL_NUM_BRANCHES];
+  boolean loopConverged;
+
+
+  /* figure out if this is on a per partition basis or jointly across all partitions */
+
+
+
+  /* initialize loop convergence variables etc. 
+     maxiter is the maximum number of NR iterations we are going to do before giving up */
+
+  for(i = 0; i < numBranches; i++)
+  {
+    z[i] = z0[i];
+    maxiter[i] = _maxiter;
+    outerConverged[i] = PLL_FALSE;
+    tr->curvatOK[i]       = PLL_TRUE;
+  }
+
+
+  /* nested do while loops of Newton-Raphson */
+
+  do
+  {
+
+    /* check if we ar done for partition i or if we need to adapt the branch length again */
+
+    for(i = 0; i < numBranches; i++)
+    {
+      if(outerConverged[i] == PLL_FALSE && tr->curvatOK[i] == PLL_TRUE)
+      {
+        tr->curvatOK[i] = PLL_FALSE;
+
+        zprev[i] = z[i];
+
+        zstep[i] = (1.0 - PLL_ZMAX) * z[i] + PLL_ZMIN;
+      }
+    }
+
+    for(i = 0; i < numBranches; i++)
+    {
+      /* other case, the outer loop hasn't converged but we are trying to approach 
+         the maximum from the wrong side */
+
+      if(outerConverged[i] == PLL_FALSE && tr->curvatOK[i] == PLL_FALSE)
+      {
+        double lz;
+
+        if (z[i] < PLL_ZMIN) z[i] = PLL_ZMIN;
+        else if (z[i] > PLL_ZMAX) z[i] = PLL_ZMAX;
+        lz    = log(z[i]);
+
+        tr->coreLZ[i] = lz;
+      }
+    }
+
+
+    /* set the execution mask */
+
+    if(numBranches > 1)
+    {
+      for(model = 0; model < pr->numberOfPartitions; model++)
+      {
+        if(pr->partitionData[model]->executeModel)
+          pr->partitionData[model]->executeModel = !tr->curvatOK[model];
+
+      }
+    }
+    else
+    {
+      for(model = 0; model < pr->numberOfPartitions; model++)
+        pr->partitionData[model]->executeModel = !tr->curvatOK[0];
+    }
+
+
+    /* store it in traversal descriptor */
+
+    storeExecuteMaskInTraversalDescriptor(tr, pr);
+
+    /* store the new branch length values to be tested in traversal descriptor */
+
+    storeValuesInTraversalDescriptor(tr, pr, &(tr->coreLZ[0]));
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+
+    /* if this is the first iteration of NR we will need to first do this one-time call 
+       of maknewzIterative() Note that, only this call requires broadcasting the traversal descriptor,
+       subsequent calls to pllMasterBarrier(PLL_THREAD_MAKENEWZ, tr); will not require this
+       */
+
+    if(firstIteration)
+      {
+	tr->td[0].traversalHasChanged = PLL_TRUE; 
+	pllMasterBarrier (tr, pr, PLL_THREAD_MAKENEWZ_FIRST);
+	firstIteration = PLL_FALSE; 
+	tr->td[0].traversalHasChanged = PLL_FALSE; 
+      }
+    else 
+      pllMasterBarrier(tr, pr, PLL_THREAD_MAKENEWZ);
+    branchLength_parallelReduce(tr, (double*)dlnLdlz, (double*)d2lnLdlz2, numBranches);
+#else 
+    /* sequential part, if this is the first newton-raphson implementation,
+       do the precomputations as well, otherwise just execute the computation
+       of the derivatives */
+    if(firstIteration)
+      {
+	makenewzIterative(tr, pr);
+	firstIteration = PLL_FALSE;
+      }
+    execCore(tr, pr, dlnLdlz, d2lnLdlz2);
+#endif
+
+    /* do a NR step, if we are on the correct side of the maximum that's okay, otherwise 
+       shorten branch */
+
+    for(i = 0; i < numBranches; i++)
+    {
+      if(outerConverged[i] == PLL_FALSE && tr->curvatOK[i] == PLL_FALSE)
+      {
+        if ((d2lnLdlz2[i] >= 0.0) && (z[i] < PLL_ZMAX))
+          zprev[i] = z[i] = 0.37 * z[i] + 0.63;  /*  Bad curvature, shorten branch */
+        else
+          tr->curvatOK[i] = PLL_TRUE;
+      }
+    }
+
+    /* do the standard NR step to obrain the next value, depending on the state for eahc partition */
+
+    for(i = 0; i < numBranches; i++)
+    {
+      if(tr->curvatOK[i] == PLL_TRUE && outerConverged[i] == PLL_FALSE)
+      {
+        if (d2lnLdlz2[i] < 0.0)
+        {
+          double tantmp = -dlnLdlz[i] / d2lnLdlz2[i];
+          if (tantmp < 100)
+          {
+            z[i] *= exp(tantmp);
+            if (z[i] < PLL_ZMIN)
+              z[i] = PLL_ZMIN;
+
+            if (z[i] > 0.25 * zprev[i] + 0.75)
+              z[i] = 0.25 * zprev[i] + 0.75;
+          }
+          else
+            z[i] = 0.25 * zprev[i] + 0.75;
+        }
+        if (z[i] > PLL_ZMAX) z[i] = PLL_ZMAX;
+
+        /* decrement the maximum number of itarations */
+
+        maxiter[i] = maxiter[i] - 1;
+
+        /* check if the outer loop has converged */
+
+        //old code below commented out, integrated new PRELIMINARY BUG FIX !
+        //this needs further work at some point!
+
+        /*
+        if(maxiter[i] > 0 && (PLL_ABS(z[i] - zprev[i]) > zstep[i]))
+          outerConverged[i] = PLL_FALSE;
+        else
+          outerConverged[i] = PLL_TRUE;
+        */
+
+        if((PLL_ABS(z[i] - zprev[i]) > zstep[i]))
+         {
+           /* We should make a more informed decision here,
+  	      based on the log like improvement */
+
+           if(maxiter[i] < -20)
+            {
+              z[i] = z0[i];
+              outerConverged[i] = PLL_TRUE;
+            }
+           else
+             outerConverged[i] = PLL_FALSE;
+         }
+        else
+          outerConverged[i] = PLL_TRUE;
+      }
+    }
+
+    /* check if the loop has converged for all partitions */
+
+    loopConverged = PLL_TRUE;
+    for(i = 0; i < numBranches; i++)
+      loopConverged = loopConverged && outerConverged[i];
+  }
+  while (!loopConverged);
+
+
+  /* reset  partition execution mask */
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+    pr->partitionData[model]->executeModel = PLL_TRUE;
+
+  /* copy the new branches in the result array of branches.
+     if we don't do a per partition estimate of 
+     branches this will only set result[0]
+     */
+
+  for(i = 0; i < numBranches; i++)
+    result[i] = z[i];
+}
+
+
+/** @brief Optimize branch length value(s) of a given branch with the Newton-Raphtson procedure 
+ *
+ * @warning A given branch may have one or several branch length values (up to PLL_NUM_BRANCHES), usually the later refers to partition-specific branch length values. Thus z0 and result represent collections rather than double values. The number of branch length values is given by \a tr->numBranches 
+ *
+ * @param tr
+ *   Library instance
+ *
+ * @param p
+ *   One node that defines the branch (p->z)
+ *
+ * @param q
+ *   The other node side of the branch (usually p->back), but the branch length can be estimated even if p and q are
+ *   not connected, e.g. before the insertion of a subtree.
+ *
+ * @param z0 
+ *   Initial branch length value(s) for the given branch \a p->z 
+ *
+ * @param maxiter 
+ *   Maximum number of iterations in the Newton-Raphson procedure 
+ *
+ * @param result 
+ *   Resulting branch length value(s) for the given branch \a p->z 
+ *
+ * @param mask 
+ *   Specifies if a mask to track partition convergence (\a tr->partitionConverged) is being used.
+ *
+ * @sa typical values for \a maxiter are constants \a iterations and \a PLL_NEWZPERCYCLE
+ * @note Requirement: q->z == p->z
+ */
+void makenewzGeneric(pllInstance *tr, partitionList * pr, nodeptr p, nodeptr q, double *z0, int maxiter, double *result, boolean mask)
+{
+  int i;
+  //boolean originalExecute[PLL_NUM_BRANCHES];
+  int numBranches = pr->perGeneBranchLengths?pr->numberOfPartitions:1;
+
+  boolean 
+    p_recom = PLL_FALSE, /* if one of was missing, we will need to force recomputation */
+    q_recom = PLL_FALSE;
+
+  /* the first entry of the traversal descriptor stores the node pair that defines 
+     the branch */
+
+  tr->td[0].ti[0].pNumber = p->number;
+  tr->td[0].ti[0].qNumber = q->number;
+
+  for(i = 0; i < numBranches; i++)
+  {
+    //originalExecute[i] =  pr->partitionData[i]->executeModel;
+    tr->td[0].ti[0].qz[i] =  z0[i];
+    if(mask)
+    {
+      if (tr->partitionConverged[i])
+        pr->partitionData[i]->executeModel = PLL_FALSE;
+      else
+        pr->partitionData[i]->executeModel = PLL_TRUE;
+    }
+  }
+  if (tr->useRecom)
+  {
+    int
+      slot = -1;
+      //count = 0;
+
+    /* Ensure p and q get a unpinnable slot in physical memory */
+    if(!isTip(q->number, tr->mxtips))
+    {
+      q_recom = getxVector(tr->rvec, q->number, &slot, tr->mxtips);
+      tr->td[0].ti[0].slot_q = slot;
+    }
+    if(!isTip(p->number, tr->mxtips))
+    {
+      p_recom = getxVector(tr->rvec, p->number, &slot, tr->mxtips);
+      tr->td[0].ti[0].slot_p = slot;
+    }
+  }
+
+
+  /* compute the traversal descriptor of the likelihood vectors  that need to be re-computed 
+     first in makenewzIterative */
+
+  tr->td[0].count = 1;
+
+  if(p_recom || needsRecomp(tr->useRecom, tr->rvec, p, tr->mxtips))
+    computeTraversal(tr, p, PLL_TRUE, numBranches);
+
+  if(q_recom || needsRecomp(tr->useRecom, tr->rvec, q, tr->mxtips))
+    computeTraversal(tr, q, PLL_TRUE, numBranches);
+
+  /* call the Newton-Raphson procedure */
+
+  topLevelMakenewz(tr, pr, z0, maxiter, result);
+
+  /* Mark node as unpinnable */
+  if(tr->useRecom)
+  {
+    unpinNode(tr->rvec, p->number, tr->mxtips);
+    unpinNode(tr->rvec, q->number, tr->mxtips);
+  }
+
+  /* fix eceuteModel this seems to be a bit redundant with topLevelMakenewz */ 
+
+  for(i = 0; i < numBranches; i++)
+    pr->partitionData[i]->executeModel = PLL_TRUE;
+}
+
+
+/* below are, once again the optimized functions */
+
+#if (defined(__SSE3) || defined(__AVX))
+
+
+static void sumCAT_BINARY(int tipCase, double *sum, double *x1_start, double *x2_start, double *tipVector,
+                          unsigned char *tipX1, unsigned char *tipX2, int n)
+
+{
+  int i;
+  
+#if (!defined(__SSE3) && !defined(__AVX))
+  int j;
+#endif
+  double *x1, *x2;
+
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:
+      for (i = 0; i < n; i++)
+        {
+          x1 = &(tipVector[2 * tipX1[i]]);
+          x2 = &(tipVector[2 * tipX2[i]]);
+
+#if (!defined(__SSE3) && !defined(__AVX))
+          for(j = 0; j < 2; j++)
+            sum[i * 2 + j]     = x1[j] * x2[j];
+#else
+          _mm_store_pd(&sum[i * 2], _mm_mul_pd( _mm_load_pd(x1), _mm_load_pd(x2)));
+#endif
+        }
+      break;
+    case PLL_TIP_INNER:
+      for (i = 0; i < n; i++)
+        {
+          x1 = &(tipVector[2 * tipX1[i]]);
+          x2 = &x2_start[2 * i];
+
+#if (!defined(__SSE3) && !defined(__AVX))
+          for(j = 0; j < 2; j++)
+            sum[i * 2 + j]     = x1[j] * x2[j];
+#else
+          _mm_store_pd(&sum[i * 2], _mm_mul_pd( _mm_load_pd(x1), _mm_load_pd(x2)));  
+#endif
+        }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+        {
+          x1 = &x1_start[2 * i];
+          x2 = &x2_start[2 * i];
+#if (!defined(__SSE3) && !defined(__AVX))
+          for(j = 0; j < 2; j++)
+            sum[i * 2 + j]     = x1[j] * x2[j];
+#else
+          _mm_store_pd(&sum[i * 2], _mm_mul_pd( _mm_load_pd(x1), _mm_load_pd(x2)));   
+#endif
+        }
+      break;
+    default:
+      assert(0);
+    }
+}
+
+
+static void sumCAT_SAVE(int tipCase, double *sum, double *x1_start, double *x2_start, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n, double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap)
+{
+  int i;
+  double 
+    *x1, 
+    *x2,    
+    *x1_ptr = x1_start,
+    *x2_ptr = x2_start;
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      for (i = 0; i < n; i++)
+      {
+        x1 = &(tipVector[4 * tipX1[i]]);
+        x2 = &(tipVector[4 * tipX2[i]]);
+
+        _mm_store_pd( &sum[i*4 + 0], _mm_mul_pd( _mm_load_pd( &x1[0] ), _mm_load_pd( &x2[0] )));
+        _mm_store_pd( &sum[i*4 + 2], _mm_mul_pd( _mm_load_pd( &x1[2] ), _mm_load_pd( &x2[2] )));
+      }
+      break;
+    case PLL_TIP_INNER:
+      for (i = 0; i < n; i++)
+      {
+        x1 = &(tipVector[4 * tipX1[i]]);
+        if(isGap(x2_gap, i))
+          x2 = x2_gapColumn;
+        else
+        {
+          x2 = x2_ptr;
+          x2_ptr += 4;
+        }
+
+        _mm_store_pd( &sum[i*4 + 0], _mm_mul_pd( _mm_load_pd( &x1[0] ), _mm_load_pd( &x2[0] )));
+        _mm_store_pd( &sum[i*4 + 2], _mm_mul_pd( _mm_load_pd( &x1[2] ), _mm_load_pd( &x2[2] )));
+      }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+      {
+        if(isGap(x1_gap, i))
+          x1 = x1_gapColumn;
+        else
+        {
+          x1 = x1_ptr;
+          x1_ptr += 4;
+        }
+
+        if(isGap(x2_gap, i))
+          x2 = x2_gapColumn;
+        else
+        {
+          x2 = x2_ptr;
+          x2_ptr += 4;
+        }
+
+        _mm_store_pd( &sum[i*4 + 0], _mm_mul_pd( _mm_load_pd( &x1[0] ), _mm_load_pd( &x2[0] )));
+        _mm_store_pd( &sum[i*4 + 2], _mm_mul_pd( _mm_load_pd( &x1[2] ), _mm_load_pd( &x2[2] )));
+
+      }    
+      break;
+    default:
+      assert(0);
+  }
+}
+
+static void sumGAMMA_BINARY(int tipCase, double *sumtable, double *x1_start, double *x2_start, double *tipVector,
+                            unsigned char *tipX1, unsigned char *tipX2, int n)
+{
+  double *x1, *x2, *sum;
+  int i, j;
+#if (!defined(_USE_PTHREADS) && !defined(_FINE_GRAIN_MPI))
+  int k;
+#endif
+
+  /* C-OPT once again switch over possible configurations at inner node */
+
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:
+      /* C-OPT main for loop overt alignment length */
+      for (i = 0; i < n; i++)
+        {
+          x1 = &(tipVector[2 * tipX1[i]]);
+          x2 = &(tipVector[2 * tipX2[i]]);
+          sum = &sumtable[i * 8];
+#if (!defined(_USE_PTHREADS) && !defined(_FINE_GRAIN_MPI))
+          for(j = 0; j < 4; j++)
+            for(k = 0; k < 2; k++)
+              sum[j * 2 + k] = x1[k] * x2[k];
+#else
+          for(j = 0; j < 4; j++)
+            _mm_store_pd( &sum[j*2], _mm_mul_pd( _mm_load_pd( &x1[0] ), _mm_load_pd( &x2[0] )));         
+#endif
+        }
+      break;
+    case PLL_TIP_INNER:
+      for (i = 0; i < n; i++)
+        {
+          x1  = &(tipVector[2 * tipX1[i]]);
+          x2  = &x2_start[8 * i];
+          sum = &sumtable[8 * i];
+
+#if (!defined(_USE_PTHREADS) && !defined(_FINE_GRAIN_MPI))
+          for(j = 0; j < 4; j++)
+            for(k = 0; k < 2; k++)
+              sum[j * 2 + k] = x1[k] * x2[j * 2 + k];
+#else
+          for(j = 0; j < 4; j++)
+            _mm_store_pd( &sum[j*2], _mm_mul_pd( _mm_load_pd( &x1[0] ), _mm_load_pd( &x2[j * 2] )));
+#endif
+        }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+        {
+          x1  = &x1_start[8 * i];
+          x2  = &x2_start[8 * i];
+          sum = &sumtable[8 * i];
+#if (!defined(_USE_PTHREADS) && !defined(_FINE_GRAIN_MPI))
+          for(j = 0; j < 4; j++)
+            for(k = 0; k < 2; k++)
+              sum[j * 2 + k] = x1[j * 2 + k] * x2[j * 2 + k];
+#else
+          for(j = 0; j < 4; j++)
+            _mm_store_pd( &sum[j*2], _mm_mul_pd( _mm_load_pd( &x1[j * 2] ), _mm_load_pd( &x2[j * 2] )));
+#endif
+        }
+      break;
+    default:
+      assert(0);
+    }
+}
+
+
+static void sumGAMMA_GAPPED_SAVE(int tipCase, double *sumtable, double *x1_start, double *x2_start, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n, 
+    double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap)
+{
+  double 
+    *x1, 
+    *x2, 
+    *sum,
+    *x1_ptr = x1_start,
+    *x2_ptr = x2_start;
+
+  int i, j, k; 
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:     
+      for (i = 0; i < n; i++)
+      {
+        x1 = &(tipVector[4 * tipX1[i]]);
+        x2 = &(tipVector[4 * tipX2[i]]);
+        sum = &sumtable[i * 16];
+
+        for(j = 0; j < 4; j++)	    
+          for(k = 0; k < 4; k+=2)
+            _mm_store_pd( &sum[j*4 + k], _mm_mul_pd( _mm_load_pd( &x1[k] ), _mm_load_pd( &x2[k] )));
+      }
+      break;
+    case PLL_TIP_INNER:
+      for (i = 0; i < n; i++)
+      {
+        x1  = &(tipVector[4 * tipX1[i]]);
+
+        if(x2_gap[i / 32] & mask32[i % 32])
+          x2 = x2_gapColumn;
+        else
+        {
+          x2  = x2_ptr;
+          x2_ptr += 16;
+        }
+
+        sum = &sumtable[16 * i];
+
+        for(j = 0; j < 4; j++)	    
+          for(k = 0; k < 4; k+=2)
+            _mm_store_pd( &sum[j*4 + k], _mm_mul_pd( _mm_load_pd( &x1[k] ), _mm_load_pd( &x2[j * 4 + k] )));
+      }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+      {
+        if(x1_gap[i / 32] & mask32[i % 32])
+          x1 = x1_gapColumn;
+        else
+        {
+          x1  = x1_ptr;
+          x1_ptr += 16;
+        }
+
+        if(x2_gap[i / 32] & mask32[i % 32])
+          x2 = x2_gapColumn;
+        else
+        {
+          x2  = x2_ptr;
+          x2_ptr += 16;
+        }
+
+        sum = &sumtable[16 * i];
+
+
+        for(j = 0; j < 4; j++)	    
+          for(k = 0; k < 4; k+=2)
+            _mm_store_pd( &sum[j*4 + k], _mm_mul_pd( _mm_load_pd( &x1[j * 4 + k] ), _mm_load_pd( &x2[j * 4 + k] )));
+      }
+      break;
+    default:
+      assert(0);
+  }
+}
+
+
+
+
+static void sumGAMMA(int tipCase, double *sumtable, double *x1_start, double *x2_start, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n)
+{
+  double *x1, *x2, *sum;
+  int i, j, k;
+
+  /* C-OPT once again switch over possible configurations at inner node */
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      /* C-OPT main for loop overt alignment length */
+      for (i = 0; i < n; i++)
+      {
+        x1 = &(tipVector[4 * tipX1[i]]);
+        x2 = &(tipVector[4 * tipX2[i]]);
+        sum = &sumtable[i * 16];
+
+        for(j = 0; j < 4; j++)	    
+          for(k = 0; k < 4; k+=2)
+            _mm_store_pd( &sum[j*4 + k], _mm_mul_pd( _mm_load_pd( &x1[k] ), _mm_load_pd( &x2[k] )));
+      }
+      break;
+    case PLL_TIP_INNER:
+      for (i = 0; i < n; i++)
+      {
+        x1  = &(tipVector[4 * tipX1[i]]);
+        x2  = &x2_start[16 * i];
+        sum = &sumtable[16 * i];
+
+        for(j = 0; j < 4; j++)	    
+          for(k = 0; k < 4; k+=2)
+            _mm_store_pd( &sum[j*4 + k], _mm_mul_pd( _mm_load_pd( &x1[k] ), _mm_load_pd( &x2[j * 4 + k] )));
+      }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+      {
+        x1  = &x1_start[16 * i];
+        x2  = &x2_start[16 * i];
+        sum = &sumtable[16 * i];
+
+        for(j = 0; j < 4; j++)	    
+          for(k = 0; k < 4; k+=2)
+            _mm_store_pd( &sum[j*4 + k], _mm_mul_pd( _mm_load_pd( &x1[j * 4 + k] ), _mm_load_pd( &x2[j * 4 + k] )));
+      }
+      break;
+    default:
+      assert(0);
+  }
+}
+
+
+static void sumCAT(int tipCase, double *sum, double *x1_start, double *x2_start, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n)
+{
+  int i;
+  double 
+    *x1, 
+    *x2;
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      for (i = 0; i < n; i++)
+      {
+        x1 = &(tipVector[4 * tipX1[i]]);
+        x2 = &(tipVector[4 * tipX2[i]]);
+
+        _mm_store_pd( &sum[i*4 + 0], _mm_mul_pd( _mm_load_pd( &x1[0] ), _mm_load_pd( &x2[0] )));
+        _mm_store_pd( &sum[i*4 + 2], _mm_mul_pd( _mm_load_pd( &x1[2] ), _mm_load_pd( &x2[2] )));
+      }
+      break;
+    case PLL_TIP_INNER:
+      for (i = 0; i < n; i++)
+      {
+        x1 = &(tipVector[4 * tipX1[i]]);
+        x2 = &x2_start[4 * i];
+
+        _mm_store_pd( &sum[i*4 + 0], _mm_mul_pd( _mm_load_pd( &x1[0] ), _mm_load_pd( &x2[0] )));
+        _mm_store_pd( &sum[i*4 + 2], _mm_mul_pd( _mm_load_pd( &x1[2] ), _mm_load_pd( &x2[2] )));
+      }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+      {
+        x1 = &x1_start[4 * i];
+        x2 = &x2_start[4 * i];
+
+        _mm_store_pd( &sum[i*4 + 0], _mm_mul_pd( _mm_load_pd( &x1[0] ), _mm_load_pd( &x2[0] )));
+        _mm_store_pd( &sum[i*4 + 2], _mm_mul_pd( _mm_load_pd( &x1[2] ), _mm_load_pd( &x2[2] )));
+
+      }    
+      break;
+    default:
+      assert(0);
+  }
+}
+static void sumGAMMAPROT_GAPPED_SAVE(int tipCase, double *sumtable, double *x1, double *x2, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n, 
+    double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap)
+{
+  int i, l, k;
+  double 
+    *left, 
+    *right, 
+    *sum,
+    *x1_ptr = x1,
+    *x2_ptr = x2,
+    *x1v,
+    *x2v;
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      for(i = 0; i < n; i++)
+      {
+        left  = &(tipVector[20 * tipX1[i]]);
+        right = &(tipVector[20 * tipX2[i]]);
+
+        for(l = 0; l < 4; l++)
+        {
+          sum = &sumtable[i * 80 + l * 20];
+
+          for(k = 0; k < 20; k+=2)
+          {
+            __m128d sumv = _mm_mul_pd(_mm_load_pd(&left[k]), _mm_load_pd(&right[k]));
+
+            _mm_store_pd(&sum[k], sumv);		 
+          }
+
+        }
+      }
+      break;
+    case PLL_TIP_INNER:
+      for(i = 0; i < n; i++)
+      {
+        left = &(tipVector[20 * tipX1[i]]);
+
+        if(x2_gap[i / 32] & mask32[i % 32])
+          x2v = x2_gapColumn;
+        else
+        {
+          x2v = x2_ptr;
+          x2_ptr += 80;
+        }
+
+        for(l = 0; l < 4; l++)
+        {
+          right = &(x2v[l * 20]);
+          sum = &sumtable[i * 80 + l * 20];
+
+          for(k = 0; k < 20; k+=2)
+          {
+            __m128d sumv = _mm_mul_pd(_mm_load_pd(&left[k]), _mm_load_pd(&right[k]));
+
+            _mm_store_pd(&sum[k], sumv);		 
+          }
+        }
+      }
+      break;
+    case PLL_INNER_INNER:
+      for(i = 0; i < n; i++)
+      {
+        if(x1_gap[i / 32] & mask32[i % 32])
+          x1v = x1_gapColumn;
+        else
+        {
+          x1v  = x1_ptr;
+          x1_ptr += 80;
+        }
+
+        if(x2_gap[i / 32] & mask32[i % 32])
+          x2v = x2_gapColumn;
+        else
+        {
+          x2v  = x2_ptr;
+          x2_ptr += 80;
+        }
+
+        for(l = 0; l < 4; l++)
+        {
+          left  = &(x1v[l * 20]);
+          right = &(x2v[l * 20]);
+          sum   = &(sumtable[i * 80 + l * 20]);
+
+          for(k = 0; k < 20; k+=2)
+          {
+            __m128d sumv = _mm_mul_pd(_mm_load_pd(&left[k]), _mm_load_pd(&right[k]));
+
+            _mm_store_pd(&sum[k], sumv);		 
+          }
+        }
+      }
+      break;
+    default:
+      assert(0);
+  }
+}
+
+
+static void sumGAMMAPROT_LG4(int tipCase, double *sumtable, double *x1, double *x2, double *tipVector[4],
+			     unsigned char *tipX1, unsigned char *tipX2, int n)
+{
+  int i, l, k;
+  double *left, *right, *sum;
+
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:
+      for(i = 0; i < n; i++)
+	{	  
+	  for(l = 0; l < 4; l++)
+	    {
+	      left  = &(tipVector[l][20 * tipX1[i]]);
+	      right = &(tipVector[l][20 * tipX2[i]]);
+
+	      sum = &sumtable[i * 80 + l * 20];
+#ifdef __SSE3
+	      for(k = 0; k < 20; k+=2)
+		{
+		  __m128d sumv = _mm_mul_pd(_mm_load_pd(&left[k]), _mm_load_pd(&right[k]));
+		  
+		  _mm_store_pd(&sum[k], sumv);		 
+		}
+#else
+	      for(k = 0; k < 20; k++)
+		sum[k] = left[k] * right[k];
+#endif
+	    }
+	}
+      break;
+    case PLL_TIP_INNER:
+      for(i = 0; i < n; i++)
+	{
+	 
+
+	  for(l = 0; l < 4; l++)
+	    { 
+	      left = &(tipVector[l][20 * tipX1[i]]);
+	      right = &(x2[80 * i + l * 20]);
+	      sum = &sumtable[i * 80 + l * 20];
+#ifdef __SSE3
+	      for(k = 0; k < 20; k+=2)
+		{
+		  __m128d sumv = _mm_mul_pd(_mm_load_pd(&left[k]), _mm_load_pd(&right[k]));
+		  
+		  _mm_store_pd(&sum[k], sumv);		 
+		}
+#else
+	      for(k = 0; k < 20; k++)
+		sum[k] = left[k] * right[k];
+#endif
+	    }
+	}
+      break;
+    case PLL_INNER_INNER:
+      for(i = 0; i < n; i++)
+	{
+	  for(l = 0; l < 4; l++)
+	    {
+	      left  = &(x1[80 * i + l * 20]);
+	      right = &(x2[80 * i + l * 20]);
+	      sum   = &(sumtable[i * 80 + l * 20]);
+
+#ifdef __SSE3
+	      for(k = 0; k < 20; k+=2)
+		{
+		  __m128d sumv = _mm_mul_pd(_mm_load_pd(&left[k]), _mm_load_pd(&right[k]));
+		  
+		  _mm_store_pd(&sum[k], sumv);		 
+		}
+#else
+	      for(k = 0; k < 20; k++)
+		sum[k] = left[k] * right[k];
+#endif
+	    }
+	}
+      break;
+    default:
+      assert(0);
+    }
+}
+
+
+static void sumGAMMAPROT(int tipCase, double *sumtable, double *x1, double *x2, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n)
+{
+  int i, l, k;
+  double *left, *right, *sum;
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      for(i = 0; i < n; i++)
+      {
+        left  = &(tipVector[20 * tipX1[i]]);
+        right = &(tipVector[20 * tipX2[i]]);
+
+        for(l = 0; l < 4; l++)
+        {
+          sum = &sumtable[i * 80 + l * 20];
+
+          for(k = 0; k < 20; k+=2)
+          {
+            __m128d sumv = _mm_mul_pd(_mm_load_pd(&left[k]), _mm_load_pd(&right[k]));
+
+            _mm_store_pd(&sum[k], sumv);		 
+          }
+
+        }
+      }
+      break;
+    case PLL_TIP_INNER:
+      for(i = 0; i < n; i++)
+      {
+        left = &(tipVector[20 * tipX1[i]]);
+
+        for(l = 0; l < 4; l++)
+        {
+          right = &(x2[80 * i + l * 20]);
+          sum = &sumtable[i * 80 + l * 20];
+
+          for(k = 0; k < 20; k+=2)
+          {
+            __m128d sumv = _mm_mul_pd(_mm_load_pd(&left[k]), _mm_load_pd(&right[k]));
+
+            _mm_store_pd(&sum[k], sumv);		 
+          }
+
+        }
+      }
+      break;
+    case PLL_INNER_INNER:
+      for(i = 0; i < n; i++)
+      {
+        for(l = 0; l < 4; l++)
+        {
+          left  = &(x1[80 * i + l * 20]);
+          right = &(x2[80 * i + l * 20]);
+          sum   = &(sumtable[i * 80 + l * 20]);
+
+
+          for(k = 0; k < 20; k+=2)
+          {
+            __m128d sumv = _mm_mul_pd(_mm_load_pd(&left[k]), _mm_load_pd(&right[k]));
+
+            _mm_store_pd(&sum[k], sumv);		 
+          }
+        }
+      }
+      break;
+    default:
+      assert(0);
+  }
+}
+
+
+static void sumGTRCATPROT(int tipCase, double *sumtable, double *x1, double *x2, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n)
+{
+  int i, l;
+  double *sum, *left, *right;
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      for (i = 0; i < n; i++)
+      {
+        left  = &(tipVector[20 * tipX1[i]]);
+        right = &(tipVector[20 * tipX2[i]]);
+        sum = &sumtable[20 * i];
+
+        for(l = 0; l < 20; l+=2)
+        {
+          __m128d sumv = _mm_mul_pd(_mm_load_pd(&left[l]), _mm_load_pd(&right[l]));
+
+          _mm_store_pd(&sum[l], sumv);		 
+        }
+
+      }
+      break;
+    case PLL_TIP_INNER:
+      for (i = 0; i < n; i++)
+      {
+        left = &(tipVector[20 * tipX1[i]]);
+        right = &x2[20 * i];
+        sum = &sumtable[20 * i];
+
+        for(l = 0; l < 20; l+=2)
+        {
+          __m128d sumv = _mm_mul_pd(_mm_load_pd(&left[l]), _mm_load_pd(&right[l]));
+
+          _mm_store_pd(&sum[l], sumv);		 
+        }
+
+      }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+      {
+        left  = &x1[20 * i];
+        right = &x2[20 * i];
+        sum = &sumtable[20 * i];
+
+        for(l = 0; l < 20; l+=2)
+        {
+          __m128d sumv = _mm_mul_pd(_mm_load_pd(&left[l]), _mm_load_pd(&right[l]));
+
+          _mm_store_pd(&sum[l], sumv);		 
+        }
+
+      }
+      break;
+    default:
+      assert(0);
+  }
+}
+
+
+static void sumGTRCATPROT_SAVE(int tipCase, double *sumtable, double *x1, double *x2, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n, 
+    double *x1_gapColumn, double *x2_gapColumn, unsigned int *x1_gap, unsigned int *x2_gap)
+{
+  int 
+    i, 
+    l;
+
+  double 
+    *sum, 
+    *left, 
+    *right,
+    *left_ptr = x1,
+    *right_ptr = x2;
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      for (i = 0; i < n; i++)
+      {
+        left  = &(tipVector[20 * tipX1[i]]);
+        right = &(tipVector[20 * tipX2[i]]);
+        sum = &sumtable[20 * i];
+
+        for(l = 0; l < 20; l+=2)
+        {
+          __m128d sumv = _mm_mul_pd(_mm_load_pd(&left[l]), _mm_load_pd(&right[l]));
+
+          _mm_store_pd(&sum[l], sumv);		 
+        }
+
+      }
+      break;
+    case PLL_TIP_INNER:
+      for (i = 0; i < n; i++)
+      {
+        left = &(tipVector[20 * tipX1[i]]);       
+
+        if(isGap(x2_gap, i))
+          right = x2_gapColumn;
+        else
+        {
+          right = right_ptr;
+          right_ptr += 20;
+        }
+
+        sum = &sumtable[20 * i];
+
+        for(l = 0; l < 20; l+=2)
+        {
+          __m128d sumv = _mm_mul_pd(_mm_load_pd(&left[l]), _mm_load_pd(&right[l]));
+
+          _mm_store_pd(&sum[l], sumv);		 
+        }
+
+      }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+      {	 
+        if(isGap(x1_gap, i))
+          left = x1_gapColumn;
+        else
+        {
+          left = left_ptr;
+          left_ptr += 20;
+        }
+
+        if(isGap(x2_gap, i))
+          right = x2_gapColumn;
+        else
+        {
+          right = right_ptr;
+          right_ptr += 20;
+        }
+
+        sum = &sumtable[20 * i];
+
+        for(l = 0; l < 20; l+=2)
+        {
+          __m128d sumv = _mm_mul_pd(_mm_load_pd(&left[l]), _mm_load_pd(&right[l]));
+
+          _mm_store_pd(&sum[l], sumv);		 
+        }
+      }
+      break;
+    default:
+      assert(0);
+  }
+}
+
+static void coreGTRGAMMA(const int upper, double *sumtable,
+    volatile double *ext_dlnLdlz,  volatile double *ext_d2lnLdlz2, double *EIGN, double *gammaRates, double lz, int *wrptr)
+{
+  double 
+    dlnLdlz = 0.0,
+            d2lnLdlz2 = 0.0,
+            ki, 
+            kisqr,  
+            inv_Li, 
+            dlnLidlz, 
+            d2lnLidlz2,  
+            *sum, 
+            diagptable0[16] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))),
+            diagptable1[16] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))),
+            diagptable2[16] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));    
+
+  int     
+    i, 
+    j, 
+    l;
+
+  for(i = 0; i < 4; i++)
+  {
+    ki = gammaRates[i];
+    kisqr = ki * ki;
+
+    diagptable0[i * 4] = 1.0;
+    diagptable1[i * 4] = 0.0;
+    diagptable2[i * 4] = 0.0;
+
+    for(l = 1; l < 4; l++)
+    {
+      diagptable0[i * 4 + l] = exp(EIGN[l] * ki * lz);
+      diagptable1[i * 4 + l] = EIGN[l] * ki;
+      diagptable2[i * 4 + l] = EIGN[l] * EIGN[l] * kisqr;
+    }
+  }
+
+  for (i = 0; i < upper; i++)
+  { 
+    __m128d a0 = _mm_setzero_pd();
+    __m128d a1 = _mm_setzero_pd();
+    __m128d a2 = _mm_setzero_pd();
+
+    sum = &sumtable[i * 16];         
+
+    for(j = 0; j < 4; j++)
+    {	 	  	
+      double 	   
+        *d0 = &diagptable0[j * 4],
+        *d1 = &diagptable1[j * 4],
+        *d2 = &diagptable2[j * 4];
+
+      for(l = 0; l < 4; l+=2)
+      {
+        __m128d tmpv = _mm_mul_pd(_mm_load_pd(&d0[l]), _mm_load_pd(&sum[j * 4 + l]));
+        a0 = _mm_add_pd(a0, tmpv);
+        a1 = _mm_add_pd(a1, _mm_mul_pd(tmpv, _mm_load_pd(&d1[l])));
+        a2 = _mm_add_pd(a2, _mm_mul_pd(tmpv, _mm_load_pd(&d2[l])));
+      }	 	  
+    }
+
+    a0 = _mm_hadd_pd(a0, a0);
+    a1 = _mm_hadd_pd(a1, a1);
+    a2 = _mm_hadd_pd(a2, a2);
+
+    _mm_storel_pd(&inv_Li, a0);     
+    _mm_storel_pd(&dlnLidlz, a1);
+    _mm_storel_pd(&d2lnLidlz2, a2); 
+
+    inv_Li = 1.0 / fabs (inv_Li);
+
+    dlnLidlz   *= inv_Li;
+    d2lnLidlz2 *= inv_Li;     
+
+    dlnLdlz   += wrptr[i] * dlnLidlz;
+    d2lnLdlz2 += wrptr[i] * (d2lnLidlz2 - dlnLidlz * dlnLidlz);
+  }
+
+
+  *ext_dlnLdlz   = dlnLdlz;
+  *ext_d2lnLdlz2 = d2lnLdlz2; 
+}
+
+static void coreGTRCAT_BINARY(int upper, int numberOfCategories, double *sum,
+                              volatile double *d1, volatile double *d2, 
+                              double *rptr, double *EIGN, int *cptr, double lz, int *wgt)
+{
+  int i;
+  double
+    *d, *d_start,
+    tmp_0, inv_Li, dlnLidlz, d2lnLidlz2,
+    dlnLdlz = 0.0,
+    d2lnLdlz2 = 0.0;
+  double e[2];
+  double dd1;
+
+  e[0] = EIGN[0];
+  e[1] = EIGN[0] * EIGN[0];
+
+
+  d = d_start = (double *)rax_malloc(numberOfCategories * sizeof(double));
+
+  dd1 = e[0] * lz;
+
+  for(i = 0; i < numberOfCategories; i++)
+    d[i] = exp(dd1 * rptr[i]);
+
+  for (i = 0; i < upper; i++)
+    {
+      double
+        r = rptr[cptr[i]],
+        wr1 = r * wgt[i],
+        wr2 = r * r * wgt[i];
+      
+      d = &d_start[cptr[i]];
+
+      inv_Li = sum[2 * i];
+      inv_Li += (tmp_0 = d[0] * sum[2 * i + 1]);
+
+      inv_Li = 1.0/fabs(inv_Li);
+
+      dlnLidlz   = tmp_0 * e[0];
+      d2lnLidlz2 = tmp_0 * e[1];
+
+      dlnLidlz   *= inv_Li;
+      d2lnLidlz2 *= inv_Li;
+
+      dlnLdlz   += wr1 * dlnLidlz;
+      d2lnLdlz2 += wr2 * (d2lnLidlz2 - dlnLidlz * dlnLidlz);
+    }
+
+  *d1 = dlnLdlz;
+  *d2 = d2lnLdlz2;
+
+  rax_free(d_start);
+}
+
+
+static void coreGTRCAT(int upper, int numberOfCategories, double *sum,
+    volatile double *d1, volatile double *d2, int *wgt,
+    double *rptr, double *EIGN, int *cptr, double lz)
+{
+  int i;
+  double
+    *d, *d_start = NULL,
+    inv_Li, dlnLidlz, d2lnLidlz2,
+    dlnLdlz = 0.0,
+    d2lnLdlz2 = 0.0;
+  double e1[4] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+  double e2[4] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+  double dd1, dd2, dd3;
+
+  __m128d
+    e1v[2],
+    e2v[2];
+
+  e1[0] = 0.0;
+  e2[0] = 0.0;
+  e1[1] = EIGN[1];
+  e2[1] = EIGN[1] * EIGN[1];
+  e1[2] = EIGN[2];
+  e2[2] = EIGN[2] * EIGN[2];
+  e1[3] = EIGN[3];
+  e2[3] = EIGN[3] * EIGN[3];
+
+  e1v[0]= _mm_load_pd(&e1[0]);
+  e1v[1]= _mm_load_pd(&e1[2]);
+
+  e2v[0]= _mm_load_pd(&e2[0]);
+  e2v[1]= _mm_load_pd(&e2[2]);
+
+  rax_posix_memalign ((void **) &d_start, PLL_BYTE_ALIGNMENT, numberOfCategories * 4 * sizeof(double));
+  d = d_start;
+
+  dd1 = EIGN[1] * lz;
+  dd2 = EIGN[2] * lz;
+  dd3 = EIGN[3] * lz;
+
+  for(i = 0; i < numberOfCategories; i++)
+  {
+    d[i * 4 + 0] = 1.0;
+    d[i * 4 + 1] = exp(dd1 * rptr[i]);
+    d[i * 4 + 2] = exp(dd2 * rptr[i]);
+    d[i * 4 + 3] = exp(dd3 * rptr[i]);
+  }
+
+  for (i = 0; i < upper; i++)
+  {
+    double *s = &sum[4 * i];
+    d = &d_start[4 * cptr[i]];  
+
+    __m128d tmp_0v =_mm_mul_pd(_mm_load_pd(&d[0]),_mm_load_pd(&s[0]));
+    __m128d tmp_1v =_mm_mul_pd(_mm_load_pd(&d[2]),_mm_load_pd(&s[2]));
+
+    __m128d inv_Liv    = _mm_add_pd(tmp_0v, tmp_1v);      
+
+    __m128d dlnLidlzv   = _mm_add_pd(_mm_mul_pd(tmp_0v, e1v[0]), _mm_mul_pd(tmp_1v, e1v[1]));	  
+    __m128d d2lnLidlz2v = _mm_add_pd(_mm_mul_pd(tmp_0v, e2v[0]), _mm_mul_pd(tmp_1v, e2v[1]));
+
+
+    inv_Liv   = _mm_hadd_pd(inv_Liv, inv_Liv);
+    dlnLidlzv = _mm_hadd_pd(dlnLidlzv, dlnLidlzv);
+    d2lnLidlz2v = _mm_hadd_pd(d2lnLidlz2v, d2lnLidlz2v);                 
+
+    _mm_storel_pd(&inv_Li, inv_Liv);     
+    _mm_storel_pd(&dlnLidlz, dlnLidlzv);                 
+    _mm_storel_pd(&d2lnLidlz2, d2lnLidlz2v);      
+
+    inv_Li = 1.0 / fabs (inv_Li);
+
+    dlnLidlz   *= inv_Li;
+    d2lnLidlz2 *= inv_Li;
+
+    dlnLdlz  += wgt[i] * rptr[cptr[i]] * dlnLidlz;
+    d2lnLdlz2 += wgt[i] * rptr[cptr[i]] * rptr[cptr[i]] * (d2lnLidlz2 - dlnLidlz * dlnLidlz);
+  }
+
+  *d1 = dlnLdlz;
+  *d2 = d2lnLdlz2;
+
+  rax_free(d_start);
+}
+
+#if (!defined(__SSE3) && !defined(__AVX))
+static void coreGTRGAMMA_BINARY(const int upper, double *sumtable,
+                                volatile double *d1,   volatile double *d2, double *EIGN, double *gammaRates, double lz, int *wrptr)
+{
+  int i, j;
+  double
+    *diagptable, *diagptable_start, *sum,
+    tmp_1, inv_Li, dlnLidlz, d2lnLidlz2, ki, kisqr,
+    dlnLdlz = 0.0,
+    d2lnLdlz2 = 0.0;
+
+  diagptable = diagptable_start = (double *)rax_malloc(sizeof(double) * 12);
+
+  for(i = 0; i < 4; i++)
+    {
+      ki = gammaRates[i];
+      kisqr = ki * ki;
+
+      diagptable[i * 3]     = exp (EIGN[0] * ki * lz);
+      diagptable[i * 3 + 1] = EIGN[0] * ki;
+      diagptable[i * 3 + 2] = EIGN[0] * EIGN[0] * kisqr;
+    }
+
+  for (i = 0; i < upper; i++)
+    {
+      diagptable = diagptable_start;
+      sum = &(sumtable[i * 8]);
+
+      inv_Li      = 0.0;
+      dlnLidlz    = 0.0;
+      d2lnLidlz2  = 0.0;
+
+      for(j = 0; j < 4; j++)
+        {
+          inv_Li += sum[2 * j];
+
+          tmp_1      =  diagptable[3 * j] * sum[2 * j + 1];
+          inv_Li     += tmp_1;
+          dlnLidlz   += tmp_1 * diagptable[3 * j + 1];
+          d2lnLidlz2 += tmp_1 * diagptable[3 * j + 2];
+        }
+
+      inv_Li = 1.0 / fabs(inv_Li);
+
+      dlnLidlz   *= inv_Li;
+      d2lnLidlz2 *= inv_Li;
+
+
+      dlnLdlz  += wrptr[i] * dlnLidlz;
+      d2lnLdlz2 += wrptr[i] * (d2lnLidlz2 - dlnLidlz * dlnLidlz);
+    }
+
+  *d1 = dlnLdlz;
+  *d2 = d2lnLdlz2;
+
+  rax_free(diagptable_start);
+}
+#else
+static void coreGTRGAMMA_BINARY(const int upper, double *sumtable,
+                                volatile double *d1,   volatile double *d2, double *EIGN, double *gammaRates, double lz, int *wrptr)
+{
+  double 
+    dlnLdlz = 0.0,
+    d2lnLdlz2 = 0.0,
+    ki, 
+    kisqr,  
+    inv_Li, 
+    dlnLidlz, 
+    d2lnLidlz2,  
+    *sum, 
+    diagptable0[8] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))),
+    diagptable1[8] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))),
+    diagptable2[8] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));    
+    
+  int     
+    i, 
+    j;
+  
+  for(i = 0; i < 4; i++)
+    {
+      ki = gammaRates[i];
+      kisqr = ki * ki;
+      
+      diagptable0[i * 2] = 1.0;
+      diagptable1[i * 2] = 0.0;
+      diagptable2[i * 2] = 0.0;
+     
+      diagptable0[i * 2 + 1] = exp(EIGN[0] * ki * lz);
+      diagptable1[i * 2 + 1] = EIGN[0] * ki;
+      diagptable2[i * 2 + 1] = EIGN[0] * EIGN[0] * kisqr;    
+    }
+
+  for (i = 0; i < upper; i++)
+    { 
+      __m128d a0 = _mm_setzero_pd();
+      __m128d a1 = _mm_setzero_pd();
+      __m128d a2 = _mm_setzero_pd();
+
+      sum = &sumtable[i * 8];         
+
+      for(j = 0; j < 4; j++)
+        {                       
+          double           
+            *d0 = &diagptable0[j * 2],
+            *d1 = &diagptable1[j * 2],
+            *d2 = &diagptable2[j * 2];
+                         
+          __m128d tmpv = _mm_mul_pd(_mm_load_pd(d0), _mm_load_pd(&sum[j * 2]));
+          a0 = _mm_add_pd(a0, tmpv);
+          a1 = _mm_add_pd(a1, _mm_mul_pd(tmpv, _mm_load_pd(d1)));
+          a2 = _mm_add_pd(a2, _mm_mul_pd(tmpv, _mm_load_pd(d2)));
+                          
+        }
+
+      a0 = _mm_hadd_pd(a0, a0);
+      a1 = _mm_hadd_pd(a1, a1);
+      a2 = _mm_hadd_pd(a2, a2);
+
+      _mm_storel_pd(&inv_Li, a0);     
+      _mm_storel_pd(&dlnLidlz, a1);
+      _mm_storel_pd(&d2lnLidlz2, a2); 
+
+      inv_Li = 1.0 / fabs(inv_Li);
+     
+      dlnLidlz   *= inv_Li;
+      d2lnLidlz2 *= inv_Li;     
+
+      dlnLdlz   += wrptr[i] * dlnLidlz;
+      d2lnLdlz2 += wrptr[i] * (d2lnLidlz2 - dlnLidlz * dlnLidlz);
+    }
+
+ 
+  *d1   = dlnLdlz;
+  *d2 = d2lnLdlz2; 
+}
+
+
+#endif
+
+static void coreGTRGAMMAPROT_LG4(double *gammaRates, double *EIGN[4], double *sumtable, int upper, int *wrptr,
+				 volatile double *ext_dlnLdlz,  volatile double *ext_d2lnLdlz2, double lz)
+{
+  double  *sum, 
+    diagptable0[80] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))),
+    diagptable1[80] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))),
+    diagptable2[80] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));    
+  int     i, j, l;
+  double  dlnLdlz = 0;
+  double d2lnLdlz2 = 0;
+  double ki, kisqr; 
+  double inv_Li, dlnLidlz, d2lnLidlz2;
+
+  for(i = 0; i < 4; i++)
+    {
+      ki = gammaRates[i];
+      kisqr = ki * ki;
+      
+      diagptable0[i * 20] = 1.0;
+      diagptable1[i * 20] = 0.0;
+      diagptable2[i * 20] = 0.0;
+
+      for(l = 1; l < 20; l++)
+	{
+          diagptable0[i * 20 + l] = exp(EIGN[i][l] * ki * lz);
+	  diagptable1[i * 20 + l] = EIGN[i][l] * ki;
+	  diagptable2[i * 20 + l] = EIGN[i][l] * EIGN[i][l] * kisqr;
+	}
+    }
+
+  for (i = 0; i < upper; i++)
+    { 
+      __m128d a0 = _mm_setzero_pd();
+      __m128d a1 = _mm_setzero_pd();
+      __m128d a2 = _mm_setzero_pd();
+
+      sum = &sumtable[i * 80];         
+
+      for(j = 0; j < 4; j++)
+	{	 	  	
+	  double 	   
+	    *d0 = &diagptable0[j * 20],
+	    *d1 = &diagptable1[j * 20],
+	    *d2 = &diagptable2[j * 20];
+  	 	 
+	  for(l = 0; l < 20; l+=2)
+	    {
+	      __m128d tmpv = _mm_mul_pd(_mm_load_pd(&d0[l]), _mm_load_pd(&sum[j * 20 +l]));
+	      a0 = _mm_add_pd(a0, tmpv);
+	      a1 = _mm_add_pd(a1, _mm_mul_pd(tmpv, _mm_load_pd(&d1[l])));
+	      a2 = _mm_add_pd(a2, _mm_mul_pd(tmpv, _mm_load_pd(&d2[l])));
+	    }	 	  
+	}
+
+      a0 = _mm_hadd_pd(a0, a0);
+      a1 = _mm_hadd_pd(a1, a1);
+      a2 = _mm_hadd_pd(a2, a2);
+
+      _mm_storel_pd(&inv_Li, a0);
+      _mm_storel_pd(&dlnLidlz, a1);
+      _mm_storel_pd(&d2lnLidlz2, a2);
+
+      inv_Li = 1.0 / fabs (inv_Li);
+
+      dlnLidlz   *= inv_Li;
+      d2lnLidlz2 *= inv_Li;
+
+      dlnLdlz   += wrptr[i] * dlnLidlz;
+      d2lnLdlz2 += wrptr[i] * (d2lnLidlz2 - dlnLidlz * dlnLidlz);
+    }
+
+  *ext_dlnLdlz   = dlnLdlz;
+  *ext_d2lnLdlz2 = d2lnLdlz2;
+}
+
+
+
+static void coreGTRGAMMAPROT(double *gammaRates, double *EIGN, double *sumtable, int upper, int *wrptr,
+    volatile double *ext_dlnLdlz,  volatile double *ext_d2lnLdlz2, double lz)
+{
+  double  *sum, 
+          diagptable0[80] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))),
+          diagptable1[80] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))),
+          diagptable2[80] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));    
+  int     i, j, l;
+  double  dlnLdlz = 0;
+  double d2lnLdlz2 = 0;
+  double ki, kisqr; 
+  double inv_Li, dlnLidlz, d2lnLidlz2;
+
+  for(i = 0; i < 4; i++)
+  {
+    ki = gammaRates[i];
+    kisqr = ki * ki;
+
+    diagptable0[i * 20] = 1.0;
+    diagptable1[i * 20] = 0.0;
+    diagptable2[i * 20] = 0.0;
+
+    for(l = 1; l < 20; l++)
+    {
+      diagptable0[i * 20 + l] = exp(EIGN[l] * ki * lz);
+      diagptable1[i * 20 + l] = EIGN[l] * ki;
+      diagptable2[i * 20 + l] = EIGN[l] * EIGN[l] * kisqr;
+    }
+  }
+
+  for (i = 0; i < upper; i++)
+  { 
+    __m128d a0 = _mm_setzero_pd();
+    __m128d a1 = _mm_setzero_pd();
+    __m128d a2 = _mm_setzero_pd();
+
+    sum = &sumtable[i * 80];         
+
+    for(j = 0; j < 4; j++)
+    {	 	  	
+      double 	   
+        *d0 = &diagptable0[j * 20],
+        *d1 = &diagptable1[j * 20],
+        *d2 = &diagptable2[j * 20];
+
+      for(l = 0; l < 20; l+=2)
+      {
+        __m128d tmpv = _mm_mul_pd(_mm_load_pd(&d0[l]), _mm_load_pd(&sum[j * 20 +l]));
+        a0 = _mm_add_pd(a0, tmpv);
+        a1 = _mm_add_pd(a1, _mm_mul_pd(tmpv, _mm_load_pd(&d1[l])));
+        a2 = _mm_add_pd(a2, _mm_mul_pd(tmpv, _mm_load_pd(&d2[l])));
+      }	 	  
+    }
+
+    a0 = _mm_hadd_pd(a0, a0);
+    a1 = _mm_hadd_pd(a1, a1);
+    a2 = _mm_hadd_pd(a2, a2);
+
+    _mm_storel_pd(&inv_Li, a0);
+    _mm_storel_pd(&dlnLidlz, a1);
+    _mm_storel_pd(&d2lnLidlz2, a2);
+
+    inv_Li = 1.0 / fabs (inv_Li);
+
+    dlnLidlz   *= inv_Li;
+    d2lnLidlz2 *= inv_Li;
+
+    dlnLdlz   += wrptr[i] * dlnLidlz;
+    d2lnLdlz2 += wrptr[i] * (d2lnLidlz2 - dlnLidlz * dlnLidlz);
+  }
+
+  *ext_dlnLdlz   = dlnLdlz;
+  *ext_d2lnLdlz2 = d2lnLdlz2;
+}
+
+
+
+static void coreGTRCATPROT(double *EIGN, double lz, int numberOfCategories, double *rptr, int *cptr, int upper,
+    int *wgt, volatile double *ext_dlnLdlz,  volatile double *ext_d2lnLdlz2, double *sumtable)
+{
+  int i, l;
+  double *d1, *d_start = NULL, *sum;
+  double 
+    e[20] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))), 
+    s[20] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))), 
+    dd[20] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+  double inv_Li, dlnLidlz, d2lnLidlz2;
+  double  dlnLdlz = 0.0;
+  double  d2lnLdlz2 = 0.0;
+
+  rax_posix_memalign ((void **)&d_start, PLL_BYTE_ALIGNMENT, numberOfCategories * 20 * sizeof(double));
+  d1 = d_start; 
+
+  e[0] = 0.0;
+  s[0] = 0.0; 
+
+  for(l = 1; l < 20; l++)
+  {
+    e[l]  = EIGN[l] * EIGN[l];
+    s[l]  = EIGN[l];
+    dd[l] = s[l] * lz;
+  }
+
+  for(i = 0; i < numberOfCategories; i++)
+  {      
+    d1[20 * i] = 1.0;
+    for(l = 1; l < 20; l++)
+      d1[20 * i + l] = exp(dd[l] * rptr[i]);
+  }
+
+  for (i = 0; i < upper; i++)
+  {
+    __m128d a0 = _mm_setzero_pd();
+    __m128d a1 = _mm_setzero_pd();
+    __m128d a2 = _mm_setzero_pd();
+
+    d1 = &d_start[20 * cptr[i]];
+    sum = &sumtable[20 * i];
+
+    for(l = 0; l < 20; l+=2)
+    {	  
+      __m128d tmpv = _mm_mul_pd(_mm_load_pd(&d1[l]), _mm_load_pd(&sum[l]));
+
+      a0 = _mm_add_pd(a0, tmpv);
+      __m128d sv = _mm_load_pd(&s[l]);	  
+
+      a1 = _mm_add_pd(a1, _mm_mul_pd(tmpv, sv));
+      __m128d ev = _mm_load_pd(&e[l]);	  
+
+      a2 = _mm_add_pd(a2, _mm_mul_pd(tmpv, ev));
+    }
+
+    a0 = _mm_hadd_pd(a0, a0);
+    a1 = _mm_hadd_pd(a1, a1);
+    a2 = _mm_hadd_pd(a2, a2);
+
+    _mm_storel_pd(&inv_Li, a0);     
+    _mm_storel_pd(&dlnLidlz, a1);                 
+    _mm_storel_pd(&d2lnLidlz2, a2);
+
+    inv_Li = 1.0 / fabs (inv_Li);
+
+    dlnLidlz   *= inv_Li;
+    d2lnLidlz2 *= inv_Li;
+
+    dlnLdlz  += wgt[i] * rptr[cptr[i]] * dlnLidlz;
+    d2lnLdlz2 += wgt[i] * rptr[cptr[i]] * rptr[cptr[i]] * (d2lnLidlz2 - dlnLidlz * dlnLidlz);
+  }
+
+  *ext_dlnLdlz   = dlnLdlz;
+  *ext_d2lnLdlz2 = d2lnLdlz2;
+
+  rax_free(d_start);
+}
+
+
+
+
+#endif
+
+
+
diff --git a/lib/pll/mem_alloc.c b/lib/pll/mem_alloc.c
new file mode 100644
index 0000000..68e928d
--- /dev/null
+++ b/lib/pll/mem_alloc.c
@@ -0,0 +1,228 @@
+
+#define MEM_ALLOC_NO_GUARDS 1
+
+#include "mem_alloc.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifndef __APPLE__
+#include <malloc.h>             // this is probably not necessary
+#endif
+
+#ifdef RAXML_USE_LLALLOC
+
+// the llalloc library implementation in lockless_alloc/ll_alloc.c exports the alloction functions prefixed
+// with 'llalloc'. The following are the forward declarations of the llalloc* functions 
+
+#define PREFIX(X)   llalloc##X
+
+void *PREFIX(memalign)(size_t align, size_t size);
+void *PREFIX(malloc)(size_t size);
+void *PREFIX(realloc)(void *p, size_t size);
+int PREFIX(posix_memalign)(void **p, size_t align, size_t size);
+void *PREFIX(calloc)(size_t n, size_t size);
+void PREFIX(free)(void *p);
+
+
+// wrappers that forward the rax_* functions to the corresponding llalloc* functions
+
+
+void *rax_memalign(size_t align, size_t size) {
+  return PREFIX(memalign)(align, size);
+}
+
+void *rax_malloc( size_t size ) {
+  return PREFIX(malloc)(size);
+}
+void *rax_realloc( void *p, size_t size ) {
+  return PREFIX(realloc)(p, size);
+}
+
+
+void rax_free(void *p) {
+  PREFIX(free)(p);
+}
+
+int rax_posix_memalign(void **p, size_t align, size_t size) {
+  return PREFIX(posix_memalign)(p, align, size);
+}
+void *rax_calloc(size_t n, size_t size) {
+  return PREFIX(calloc)(n,size);
+}
+
+void *rax_malloc_aligned(size_t size) 
+{
+  const size_t PLL_BYTE_ALIGNMENT = 32;
+  return rax_memalign(PLL_BYTE_ALIGNMENT, size);
+  
+}
+
+#else // RAXML_USE_LLALLOC
+// if llalloc should not be used, forward the rax_* functions to the corresponding standard function
+
+void *rax_memalign(size_t align, size_t size) {
+#if defined (__APPLE__)
+    void * mem;
+    if (posix_memalign (&mem, align, size))
+      return (NULL);
+    else
+      return (mem);
+#else
+    return memalign(align, size);
+#endif
+    
+}
+
+void *rax_malloc( size_t size ) {
+  return malloc(size);
+}
+void *rax_realloc( void *p, size_t size ) {
+  return realloc(p, size);
+}
+
+
+void rax_free(void *p) {
+  free(p);
+}
+
+int rax_posix_memalign(void **p, size_t align, size_t size) {
+  return posix_memalign(p, align, size);
+}
+void *rax_calloc(size_t n, size_t size) {
+  return calloc(n,size);
+}
+
+void *rax_malloc_aligned(size_t size) 
+{
+  const size_t PLL_BYTE_ALIGNMENT = 32;
+  return rax_memalign(PLL_BYTE_ALIGNMENT, size);
+  
+}
+
+#endif
+
+
+
+#if 0
+//
+// two test cases to check if the default malloc plays along well with lockless malloc. Normally there shoudl not be a
+// problem as long as everyone handles 'foreign' sbrk calls gracefully (as lockless and glibc seem to do). 
+// WARNING: there is a slightly worrying comment in glibc malloc, which seems to assume that magically no foreign sbrks
+// happen between two consecutive sbrk calls while re-establishing page alignment in some obscure special case. IMHO, this
+// is clearly an error (race) in multithreaded programs, as there is no way how a foreign sbrk user can properly lock anything.
+// see: http://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=0f1796c9134ffef289ec31fb1cd538f3a9490ae1;hb=HEAD#l2581
+//
+// If all threads consistently only use the rax_* wrappers this is not a problem, but as this is a library, we can not be sure 
+// that no other thread uses default malloc... note that lockless malloc only uses sbrk for the slab (=small block) area, while 
+// raxml heavy uses malloc/free only on much larger blocks...
+// If anything ever goes wrong while using mixed glibc/lockless malloc, this should be investigated.
+//
+// TODO: the potential race seems to be related to handling the case where a 'foreign sbrk' adjusted the break to a non page-boundary.
+// check if lockless malloc actually ever adjusts to non page-boundaries.
+
+
+void check_block( void *p, size_t size ) {
+    size_t i;
+    char *cp = (char*)p;
+    
+    for( i = 0; i < size; ++i ) {
+        
+        if( cp[i] != (char)i ) {
+            printf( "MEEEEEEEEEEEEEEEEEEEEP\n" );
+            abort();
+        }
+    }
+    
+}
+
+
+void fill_block( void *p, size_t size ) {
+    size_t i;
+    char *cp = (char*)p;
+    
+    for( i = 0; i < size; ++i ) {
+        cp[i] = (char)i;
+    }
+}
+
+
+void malloc_stress() {
+    const int n_slots = 100000;
+    
+    void *blocks1[n_slots];
+    size_t sizes1[n_slots];
+    void *blocks2[n_slots];
+    size_t sizes2[n_slots];
+    
+    memset( blocks1, 0, sizeof( void * ) * n_slots ); 
+    memset( blocks2, 0, sizeof( void * ) * n_slots ); 
+    
+    memset( sizes1, 0, sizeof( size_t ) * n_slots );
+    memset( sizes2, 0, sizeof( size_t ) * n_slots );
+    
+    
+    
+    while( 1 ) {
+        int r = rand() % n_slots;
+        
+        void *bs;
+        
+        
+        int size;
+        if( rand() % 2 == 0 ) {
+            size = rand() % (32 * 16); // hit slab
+        } else {
+            size = (rand() % 128) * 128; // not slab
+        }
+            
+            
+        if( 1 || rand() % 2 == 0 ) {
+            if( blocks1[r] == 0 ) {
+                blocks1[r] = malloc( size );
+                sizes1[r] = size;
+                fill_block( blocks1[r], sizes1[r] );
+            } else {
+                check_block( blocks1[r], sizes1[r] );
+                free( blocks1[r] );
+                blocks1[r] = 0;
+            }
+        } else {
+            if( blocks2[r] == 0 ) {
+                blocks2[r] = rax_malloc( size );
+                sizes2[r] = size;
+                fill_block( blocks2[r], sizes2[r] );
+            } else {
+                check_block( blocks2[r], sizes2[r] );
+                
+                rax_free( blocks2[r] );
+                blocks2[r] = 0;
+            }
+        }
+            
+       
+        
+    }
+    
+}
+
+
+void malloc_stress2() {
+    const size_t n_slots = 1000;
+    
+    void *blocks[n_slots];
+    size_t i;
+    for( i = 0; i < n_slots; ++i ) {
+        blocks[i] = malloc( (rand() % 32) * 1024 ); 
+        
+    }
+    sbrk( 10 );
+    for( i = 0; i < n_slots; ++i ) {
+        free(blocks[i]);
+        
+    }
+    
+    
+    
+}
+#endif
+
diff --git a/lib/pll/mem_alloc.h b/lib/pll/mem_alloc.h
new file mode 100644
index 0000000..b52f679
--- /dev/null
+++ b/lib/pll/mem_alloc.h
@@ -0,0 +1,41 @@
+#ifndef __mem_alloc_h
+#define __mem_alloc_h
+#include <stddef.h>
+#include <stdlib.h>
+// #ifdef __linux__
+// #include <malloc.h>
+// #endif
+#include "pll.h"
+
+#define rax_memalign memalign
+#define rax_malloc malloc
+#define rax_realloc realloc
+#define rax_free free
+#define rax_posix_memalign posix_memalign
+#define rax_calloc calloc
+//#define rax_malloc_aligned(x) memalign(PLL_BYTE_ALIGNMENT,x)
+
+//void *rax_memalign(size_t align, size_t size);
+//void *rax_malloc(size_t size);
+//void *rax_realloc(void *p, size_t size);
+//void rax_free(void *p);
+//int rax_posix_memalign(void **p, size_t align, size_t size);
+//void *rax_calloc(size_t n, size_t size);
+//
+//void *rax_malloc_aligned(size_t size);
+
+
+#if 0
+// using the following contraption to trigger a compile-time error does not work on some gcc versions. It will trigger a confising linker error in the best case, so it is deativated.
+
+#if defined(RAXML_USE_LLALLOC) && !defined(MEM_ALLOC_NO_GUARDS)
+#define malloc(x) XXX_DONT_USE_MALLOC_WITHOUT_RAX_PREFIX_XXX
+#define free(x) XXX_DONT_USE_FREE_WITHOUT_RAX_PREFIX_XXX
+#define calloc(x,y) XXX_DONT_USE_CALLOC_WITHOUT_RAX_PREFIX_XXX
+#define realloc(x,y) XXX_DONT_USE_REALLOC_WITHOUT_RAX_PREFIX_XXX
+#define malloc_aligned(x) XXX_DONT_USE_MALLOC_ALIGNED_WITHOUT_RAX_PREFIX_XXX
+#define posix_memalign(x,y,z) XXX_DONT_USE_POSIX_MEMALIGN_ALIGNED_WITHOUT_RAX_PREFIX_XXX
+#endif
+#endif
+
+#endif
diff --git a/lib/pll/mic_native.h b/lib/pll/mic_native.h
new file mode 100644
index 0000000..5e9f701
--- /dev/null
+++ b/lib/pll/mic_native.h
@@ -0,0 +1,56 @@
+#ifndef MIC_NATIVE_H_
+#define MIC_NATIVE_H_
+
+void newviewGTRGAMMA_MIC(int tipCase,
+                  double *x1, double *x2, double *x3, double *extEV, double *tipVector,
+                  int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                  int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling);
+
+double evaluateGTRGAMMA_MIC(int *ex1, int *ex2, int *wptr,
+                 double *x1_start, double *x2_start,
+                 double *tipVector,
+                 unsigned char *tipX1, const int n, double *diagptable, const boolean fastScaling);
+
+void sumGTRGAMMA_MIC(int tipCase, double *sumtable, double *x1_start, double *x2_start, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n);
+
+void coreGTRGAMMA_MIC(const int upper, double *sumtable,
+    volatile double *ext_dlnLdlz,  volatile double *ext_d2lnLdlz2, double *EIGN, double *gammaRates, double lz, int *wrptr);
+
+// protein data
+void newviewGTRGAMMAPROT_MIC(int tipCase,
+                  double *x1, double *x2, double *x3, double *extEV, double *tipVector,
+                  int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                  int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling);
+
+double evaluateGTRGAMMAPROT_MIC(int *ex1, int *ex2, int *wptr,
+                 double *x1_start, double *x2_start,
+                 double *tipVector,
+                 unsigned char *tipX1, const int n, double *diagptable, const boolean fastScaling);
+
+void sumGTRGAMMAPROT_MIC(int tipCase, double *sumtable, double *x1_start, double *x2_start, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n);
+
+void coreGTRGAMMAPROT_MIC(const int upper, double *sumtable,
+    volatile double *ext_dlnLdlz,  volatile double *ext_d2lnLdlz2, double *EIGN, double *gammaRates, double lz, int *wrptr);
+
+// protein data - LG4
+
+void newviewGTRGAMMAPROT_LG4_MIC(int tipCase,
+                  double *x1, double *x2, double *x3, double *extEV[4], double *tipVector[4],
+                  unsigned char *tipX1, unsigned char *tipX2,
+                  int n, double *left, double *right, int *wgt, int *scalerIncrement);
+
+double evaluateGTRGAMMAPROT_LG4_MIC(int *wptr,
+                 double *x1_start, double *x2_start,
+                 double *tipVector[4],
+                 unsigned char *tipX1, const int n, double *diagptable);
+
+void sumGTRGAMMAPROT_LG4_MIC(int tipCase, double *sumtable, double *x1_start, double *x2_start, double *tipVector[4],
+    unsigned char *tipX1, unsigned char *tipX2, int n);
+
+void coreGTRGAMMAPROT_LG4_MIC(const int upper, double *sumtable,
+    volatile double *ext_dlnLdlz,  volatile double *ext_d2lnLdlz2, double *EIGN[4], double *gammaRates, double lz, int *wrptr);
+
+
+#endif /* MIC_NATIVE_H_ */
diff --git a/lib/pll/mic_native_aa.c b/lib/pll/mic_native_aa.c
new file mode 100644
index 0000000..06f895b
--- /dev/null
+++ b/lib/pll/mic_native_aa.c
@@ -0,0 +1,1254 @@
+#include <omp.h>
+#include <immintrin.h>
+#include <string.h>
+#include <math.h>
+
+#include "pll.h"
+#include "mic_native.h"
+
+static const int states = 20;
+static const int statesSquare = 20 * 20;
+static const int span = 20 * 4;
+static const int maxStateValue = 23;
+
+inline void mic_fma4x80(const double* inv, double* outv, double* mulv)
+{
+    __mmask8 k1 = _mm512_int2mask(0x0F);
+    __mmask8 k2 = _mm512_int2mask(0xF0);
+    for(int l = 0; l < 80; l += 40)
+    {
+        __m512d t = _mm512_setzero_pd();
+
+        t = _mm512_extload_pd(&inv[l], _MM_UPCONV_PD_NONE, _MM_BROADCAST_1X8, _MM_HINT_NONE);
+        __m512d m = _mm512_load_pd(&mulv[l]);
+        __m512d acc = _mm512_load_pd(&outv[l]);
+        __m512d r = _mm512_fmadd_pd(t, m, acc);
+        _mm512_store_pd(&outv[l], r);
+
+        m = _mm512_load_pd(&mulv[l + 8]);
+        acc = _mm512_load_pd(&outv[l + 8]);
+        r = _mm512_fmadd_pd(t, m, acc);
+        _mm512_store_pd(&outv[l + 8], r);
+
+        t = _mm512_mask_extload_pd(t, k1, &inv[l], _MM_UPCONV_PD_NONE, _MM_BROADCAST_1X8, _MM_HINT_NONE);
+        t = _mm512_mask_extload_pd(t, k2, &inv[l+20], _MM_UPCONV_PD_NONE, _MM_BROADCAST_1X8, _MM_HINT_NONE);
+
+        m = _mm512_load_pd(&mulv[l + 16]);
+        acc = _mm512_load_pd(&outv[l + 16]);
+        r = _mm512_fmadd_pd(t, m, acc);
+        _mm512_store_pd(&outv[l + 16], r);
+
+        t = _mm512_extload_pd(&inv[l+20], _MM_UPCONV_PD_NONE, _MM_BROADCAST_1X8, _MM_HINT_NONE);
+        m = _mm512_load_pd(&mulv[l + 24]);
+        acc = _mm512_load_pd(&outv[l + 24]);
+        r = _mm512_fmadd_pd(t, m, acc);
+        _mm512_store_pd(&outv[l + 24], r);
+
+        m = _mm512_load_pd(&mulv[l + 32]);
+        acc = _mm512_load_pd(&outv[l + 32]);
+        r = _mm512_fmadd_pd(t, m, acc);
+        _mm512_store_pd(&outv[l + 32], r);
+    }
+}
+
+
+void newviewGTRGAMMAPROT_MIC(int tipCase,
+                  double *x1, double *x2, double *x3, double *extEV, double *tipVector,
+                  int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                  int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling)
+{
+  __m512d minlikelihood_MIC = _mm512_set1_pd(PLL_MINLIKELIHOOD);
+  __m512d twotothe256_MIC = _mm512_set1_pd(PLL_TWOTOTHE256);
+  __m512i absMask_MIC = _mm512_set1_epi64(0x7fffffffffffffffULL);
+
+  int addScale = 0;
+
+  double aEV[1600] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+  #pragma ivdep
+  for (int l = 0; l < 1600; ++l)
+  {
+      aEV[l] = extEV[(l / span) * states + (l % states)];
+  }
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      {
+        /* multiply all possible tip state vectors with the respective P-matrices
+        */
+
+        double umpX1[1840] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        double umpX2[1840] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+        for(int i = 0; i < maxStateValue; ++i)
+        {
+          for(int k = 0; k < span; ++k)
+          {
+              umpX1[i * span + k] = 0.0;
+              umpX2[i * span + k] = 0.0;
+
+              #pragma ivdep
+              for(int l = 0; l < states; ++l)
+              {
+                  umpX1[i * span + k] +=  tipVector[i * states + l] *  left[k * states + l];
+                  umpX2[i * span + k] +=  tipVector[i * states + l] * right[k * states + l];
+              }
+          }
+        }
+
+        for (int i = 0; i < n; i++)
+        {
+            const double *uX1 = &umpX1[span * tipX1[i]];
+            const double *uX2 = &umpX2[span * tipX2[i]];
+
+            double uX[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+            double* v3 = &x3[i * span];
+
+            #pragma ivdep
+            #pragma vector aligned
+            for(int l = 0; l < span; ++l)
+            {
+                uX[l] = uX1[l] * uX2[l];
+                v3[l] = 0.;
+            }
+
+            for(int k = 0; k < states; ++k)
+            {
+                for (int j = 0; j < span; j += 8)
+                {
+                    _mm_prefetch((const char *)&aEV[span*(k+1) + j], _MM_HINT_T0);
+                }
+
+                mic_fma4x80(&uX[k], v3, &aEV[k * span]);
+            }
+
+            // init scaling counter for the site
+            if (!fastScaling)
+                ex3[i] = 0;
+
+        } // sites loop
+      }
+      break;
+    case PLL_TIP_INNER:
+      {
+        /* we do analogous pre-computations as above, with the only difference that we now do them
+        only for one tip vector */
+
+          double umpX1[1840] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+        /* precompute P and left tip vector product */
+
+        for(int i = 0; i < maxStateValue; ++i)
+        {
+          for(int k = 0; k < span; ++k)
+          {
+              umpX1[i * span + k] = 0.0;
+
+              #pragma ivdep
+              for(int l = 0; l < states; ++l)
+              {
+                  umpX1[i * span + k] +=  tipVector[i * states + l] *  left[k * states + l];
+              }
+          }
+        }
+
+        // re-arrange right matrix for better memory layout
+        double aRight[4 * statesSquare] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        for(int j = 0; j < 4; j++)
+        {
+            for(int k = 0; k < states; k++)
+            {
+                for(int l = 0; l < states; l++)
+                {
+                    aRight[k * span + j * states + l] = right[j * statesSquare +  l * states + k];
+                }
+            }
+        }
+
+        for (int i = 0; i < n; i++)
+        {
+            #pragma unroll(10)
+            for (int j = 0; j < span; j += 8)
+            {
+                _mm_prefetch((const char *)&x2[span*(i+1) + j], _MM_HINT_T1);
+            }
+
+            /* access pre-computed value based on the raw sequence data tipX1 that is used as an index */
+            double* uX1 = &umpX1[span * tipX1[i]];
+            double uX2[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+            double uX[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+            double* v3 = &(x3[span * i]);
+
+            const double* v2 = &(x2[span * i]);
+
+            #pragma vector aligned
+            for(int l = 0; l < span; ++l)
+            {
+                uX2[l] = 0.;
+            }
+
+            for(int k = 0; k < states; ++k)
+            {
+                for (int j = 0; j < span; j += 8)
+                {
+                    _mm_prefetch((const char *)&aRight[span*(k+1) + j], _MM_HINT_T0);
+                }
+
+                mic_fma4x80(&v2[k], uX2, &aRight[k * span]);
+            }
+
+            #pragma ivdep
+            #pragma vector aligned
+            for(int l = 0; l < span; ++l)
+            {
+                uX[l] = uX1[l] * uX2[l];
+                v3[l] = 0.;
+            }
+
+            for(int k = 0; k < states; ++k)
+            {
+                for (int j = 0; j < span; j += 8)
+                {
+                    _mm_prefetch((const char *)&aEV[span*(k+1) + j], _MM_HINT_T0);
+                }
+
+                mic_fma4x80(&uX[k], v3, &aEV[k * span]);
+            }
+
+            __m512d t1 = _mm512_load_pd(&v3[0]);
+            t1 = _mm512_castsi512_pd(_mm512_and_epi64(_mm512_castpd_si512(t1), absMask_MIC));
+            double vmax = _mm512_reduce_gmax_pd(t1);
+            double mx[16] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+            for (int l = 8; l < span; l += 8)
+            {
+                __m512d t = _mm512_load_pd(&v3[l]);
+                t = _mm512_castsi512_pd(_mm512_and_epi64(_mm512_castpd_si512(t), absMask_MIC));
+                double vmax2 = _mm512_reduce_gmax_pd(t);
+                vmax = PLL_MAX(vmax, vmax2);
+            }
+
+            if (vmax < PLL_MINLIKELIHOOD)
+            {
+                #pragma vector aligned nontemporal
+                for(int l = 0; l < span; l++)
+                  v3[l] *= PLL_TWOTOTHE256;
+
+                if(!fastScaling)
+                  ex3[i] += 1;
+                else
+                  addScale += wgt[i];
+            }
+        } // site loop
+
+      }
+      break;
+    case PLL_INNER_INNER:
+    {
+      /* same as above, without pre-computations */
+
+
+        // re-arrange right matrix for better memory layout
+        double aLeft[4 * statesSquare] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        double aRight[4 * statesSquare] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        for(int j = 0; j < 4; j++)
+        {
+            for(int k = 0; k < states; k++)
+            {
+                for(int l = 0; l < states; l++)
+                {
+                    aLeft[k * span + j * states + l] = left[j * statesSquare + l * states + k];
+                    aRight[k * span + j * states + l] = right[j * statesSquare + l * states + k];
+                }
+            }
+        }
+
+        for (int i = 0; i < n; i++)
+        {
+
+            #pragma unroll(10)
+            for (int j = 0; j < span; j += 8)
+            {
+                _mm_prefetch((const char *)&x1[span*(i+1) + j], _MM_HINT_T1);
+                _mm_prefetch((const char *)&x2[span*(i+1) + j], _MM_HINT_T1);
+            }
+
+
+            double uX1[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+            double uX2[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+            double uX[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+            double* v3 = &(x3[span * i]);
+
+            const double* v1 = &(x1[span * i]);
+            const double* v2 = &(x2[span * i]);
+
+            #pragma vector aligned
+            for(int l = 0; l < span; ++l)
+            {
+                uX1[l] = 0.;
+                uX2[l] = 0.;
+            }
+
+            for(int k = 0; k < states; ++k)
+            {
+                for (int j = 0; j < span; j += 8)
+                {
+                    _mm_prefetch((const char *)&aRight[span*(k+1) + j], _MM_HINT_T0);
+                    _mm_prefetch((const char *)&aLeft[span*(k+1) + j], _MM_HINT_T0);
+                }
+
+                mic_fma4x80(&v1[k], uX1, &aLeft[k * span]);
+                mic_fma4x80(&v2[k], uX2, &aRight[k * span]);
+            }
+
+            #pragma ivdep
+            #pragma vector aligned
+            for(int l = 0; l < span; ++l)
+            {
+                uX[l] = uX1[l] * uX2[l];
+                v3[l] = 0.;
+            }
+
+            for(int k = 0; k < states; ++k)
+            {
+                for (int j = 0; j < span; j += 8)
+                {
+                    _mm_prefetch((const char *)&aEV[span*(k+1) + j], _MM_HINT_T0);
+                }
+
+                mic_fma4x80(&uX[k], v3, &aEV[k * span]);
+            }
+
+            __m512d t1 = _mm512_load_pd(&v3[0]);
+            t1 = _mm512_castsi512_pd(_mm512_and_epi64(_mm512_castpd_si512(t1), absMask_MIC));
+            double vmax = _mm512_reduce_gmax_pd(t1);
+            double mx[16] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+            for (int l = 8; l < span; l += 8)
+            {
+                __m512d t = _mm512_load_pd(&v3[l]);
+                t = _mm512_castsi512_pd(_mm512_and_epi64(_mm512_castpd_si512(t), absMask_MIC));
+                double vmax2 = _mm512_reduce_gmax_pd(t);
+                vmax = PLL_MAX(vmax, vmax2);
+            }
+
+            if (vmax < PLL_MINLIKELIHOOD)
+            {
+                #pragma vector aligned nontemporal
+                for(int l = 0; l < span; l++)
+                  v3[l] *= PLL_TWOTOTHE256;
+
+                if(!fastScaling)
+                  ex3[i] += 1;
+                else
+                  addScale += wgt[i];
+            }
+        }
+    } break;
+    default:
+//      assert(0);
+      break;
+  }
+
+  *scalerIncrement = addScale;
+
+}
+
+
+
+double evaluateGTRGAMMAPROT_MIC(int *ex1, int *ex2, int *wgt, double *x1_start, double *x2_start, double *tipVector,
+                 unsigned char *tipX1, const int n, double *diagptable, const boolean fastScaling)
+{
+    double sum = 0.0;
+
+    /* the left node is a tip */
+    if(tipX1)
+    {
+        double aTipVec[1840] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        for(int k = 0; k < maxStateValue; k++)
+        {
+            for(int l = 0; l < states; l++)
+            {
+                aTipVec[k*span + l] = aTipVec[k*span + states + l] = aTipVec[k*span + 2*states + l] = aTipVec[k*span + 3*states + l] = tipVector[k*states + l];
+            }
+        }
+
+        /* loop over the sites of this partition */
+        for (int i = 0; i < n; i++)
+        {
+          /* access pre-computed tip vector values via a lookup table */
+          const double *x1 = &(aTipVec[span * tipX1[i]]);
+          /* access the other(inner) node at the other end of the branch */
+          const double *x2 = &(x2_start[span * i]);
+
+          double term = 0.;
+
+          #pragma ivdep
+          #pragma vector aligned
+          for(int j = 0; j < span; j++) {
+              term += x1[j] * x2[j] * diagptable[j];
+          }
+
+          if(!fastScaling)
+              term = log(0.25 * fabs(term)) + (ex2[i] * log(PLL_MINLIKELIHOOD));
+          else
+              term = log(0.25 * fabs(term));
+
+          sum += wgt[i] * term;
+        }
+    }
+    else
+    {
+        for (int i = 0; i < n; i++)
+        {
+            _mm_prefetch((const char *) &x1_start[span*(i+8)], _MM_HINT_T1);
+            _mm_prefetch((const char *) &x1_start[span*(i+8) + 8], _MM_HINT_T1);
+            _mm_prefetch((const char *) &x2_start[span*(i+8)], _MM_HINT_T1);
+            _mm_prefetch((const char *) &x2_start[span*(i+8) + 8], _MM_HINT_T1);
+
+            _mm_prefetch((const char *) &x1_start[span*(i+1)], _MM_HINT_T0);
+            _mm_prefetch((const char *) &x1_start[span*(i+1) + 8], _MM_HINT_T0);
+            _mm_prefetch((const char *) &x2_start[span*(i+1)], _MM_HINT_T0);
+            _mm_prefetch((const char *) &x2_start[span*(i+1) + 8], _MM_HINT_T0);
+
+          const double *x1 = &(x1_start[span * i]);
+          const double *x2 = &(x2_start[span * i]);
+
+          double term = 0.;
+
+          #pragma ivdep
+          #pragma vector aligned
+          for(int j = 0; j < span; j++)
+              term += x1[j] * x2[j] * diagptable[j];
+
+          if(!fastScaling)
+              term = log(0.25 * fabs(term)) + ((ex1[i] + ex2[i]) * log(PLL_MINLIKELIHOOD));
+          else
+              term = log(0.25 * fabs(term));
+
+          sum += wgt[i] * term;
+        }
+    }
+
+    return sum;
+}
+
+void sumGTRGAMMAPROT_MIC(int tipCase, double *sumtable, double *x1_start, double *x2_start, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n)
+{
+    double aTipVec[1840] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+    for(int k = 0; k < maxStateValue; k++)
+    {
+        for(int l = 0; l < states; l++)
+        {
+            aTipVec[k*span + l] = aTipVec[k*span + states + l] = aTipVec[k*span + 2*states + l] = aTipVec[k*span + 3*states + l] = tipVector[k*states + l];
+        }
+    }
+
+    switch(tipCase)
+    {
+      case PLL_TIP_TIP:
+      {
+        for(int i = 0; i < n; i++)
+        {
+            const double *left  = &(aTipVec[span * tipX1[i]]);
+            const double *right = &(aTipVec[span * tipX2[i]]);
+
+            #pragma ivdep
+            #pragma vector aligned nontemporal
+            for(int l = 0; l < span; l++)
+            {
+                sumtable[i * span + l] = left[l] * right[l];
+            }
+        }
+      } break;
+      case PLL_TIP_INNER:
+      {
+        for(int i = 0; i < n; i++)
+        {
+          _mm_prefetch((const char *) &x2_start[span*(i+16)], _MM_HINT_T1);
+          _mm_prefetch((const char *) &x2_start[span*(i+16) + 8], _MM_HINT_T1);
+
+          _mm_prefetch((const char *) &x2_start[span*(i+2)], _MM_HINT_T0);
+          _mm_prefetch((const char *) &x2_start[span*(i+2) + 8], _MM_HINT_T0);
+
+          const double *left = &(aTipVec[span * tipX1[i]]);
+          const double *right = &(x2_start[span * i]);
+
+          #pragma ivdep
+          #pragma vector aligned nontemporal
+          for(int l = 0; l < span; l++)
+          {
+              sumtable[i * span + l] = left[l] * right[l];
+          }
+        }
+      } break;
+      case PLL_INNER_INNER:
+      {
+        for(int i = 0; i < n; i++)
+        {
+            _mm_prefetch((const char *) &x1_start[span*(i+16)], _MM_HINT_T1);
+            _mm_prefetch((const char *) &x1_start[span*(i+16) + 8], _MM_HINT_T1);
+            _mm_prefetch((const char *) &x2_start[span*(i+16)], _MM_HINT_T1);
+            _mm_prefetch((const char *) &x2_start[span*(i+16) + 8], _MM_HINT_T1);
+
+            _mm_prefetch((const char *) &x1_start[span*(i+2)], _MM_HINT_T0);
+            _mm_prefetch((const char *) &x1_start[span*(i+2) + 8], _MM_HINT_T0);
+            _mm_prefetch((const char *) &x2_start[span*(i+2)], _MM_HINT_T0);
+            _mm_prefetch((const char *) &x2_start[span*(i+2) + 8], _MM_HINT_T0);
+
+            const double *left  = &(x1_start[span * i]);
+            const double *right = &(x2_start[span * i]);
+
+            #pragma ivdep
+            #pragma vector aligned nontemporal
+            for(int l = 0; l < span; l++)
+            {
+                sumtable[i * span + l] = left[l] * right[l];
+            }
+        }
+      } break;
+  //    default:
+  //      assert(0);
+    }
+}
+
+void coreGTRGAMMAPROT_MIC(const int upper, double *sumtable,
+    volatile double *ext_dlnLdlz,  volatile double *ext_d2lnLdlz2, double *EIGN, double *gammaRates, double lz, int *wgt)
+{
+    double diagptable0[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+    double diagptable1[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+    double diagptable2[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+    double diagptable01[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+    double diagptable02[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+    /* pre-compute the derivatives of the P matrix for all discrete GAMMA rates */
+
+    for(int i = 0; i < 4; i++)
+    {
+        const double ki = gammaRates[i];
+        const double kisqr = ki * ki;
+
+        diagptable0[i*states] = 1.;
+        diagptable1[i*states] = 0.;
+        diagptable2[i*states] = 0.;
+
+        for(int l = 1; l < states; l++)
+        {
+          diagptable0[i * states + l]  = exp(EIGN[l] * ki * lz);
+          diagptable1[i * states + l] = EIGN[l] * ki;
+          diagptable2[i * states + l] = EIGN[l] * EIGN[l] * kisqr;
+        }
+    }
+
+    #pragma ivdep
+    for(int i = 0; i < span; i++)
+    {
+        diagptable01[i] = diagptable0[i] * diagptable1[i];
+        diagptable02[i] = diagptable0[i] * diagptable2[i];
+    }
+
+    /* loop over sites in this partition */
+
+    const int aligned_width = upper % PLL_VECTOR_WIDTH == 0 ? upper / PLL_VECTOR_WIDTH : upper / PLL_VECTOR_WIDTH + 1;
+
+    double dlnLdlz = 0.;
+    double d2lnLdlz2 = 0.;
+
+    __mmask16 k1 = _mm512_int2mask(0x000000FF);
+
+    for (int i = 0; i < aligned_width; i++)
+    {
+        _mm_prefetch((const char *) &sumtable[i * span * 8], _MM_HINT_T0);
+        _mm_prefetch((const char *) &sumtable[i * span * 8 + 8], _MM_HINT_T0);
+
+        /* access the array with pre-computed values */
+        const double *sum = &sumtable[i * span * PLL_VECTOR_WIDTH];
+
+        /* initial per-site likelihood and 1st and 2nd derivatives */
+
+        double invBuf[PLL_VECTOR_WIDTH] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        double d1Buf[PLL_VECTOR_WIDTH] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        double d2Buf[PLL_VECTOR_WIDTH] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+        __m512d invVec;
+        __m512d d1Vec;
+        __m512d d2Vec;
+        int mask = 0x01;
+
+        #pragma noprefetch sum
+        #pragma unroll(8)
+        for(int j = 0; j < PLL_VECTOR_WIDTH; j++)
+        {
+            _mm_prefetch((const char *) &sum[span*(j+8)], _MM_HINT_T1);
+            _mm_prefetch((const char *) &sum[span*(j+8) + 8], _MM_HINT_T1);
+
+            _mm_prefetch((const char *) &sum[span*(j+1)], _MM_HINT_T0);
+            _mm_prefetch((const char *) &sum[span*(j+1) + 8], _MM_HINT_T0);
+
+            __m512d inv_1 = _mm512_setzero_pd();
+            __m512d d1_1 = _mm512_setzero_pd();
+            __m512d d2_1 = _mm512_setzero_pd();
+
+            for (int offset = 0; offset < span; offset += 8)
+            {
+                __m512d d0_1 = _mm512_load_pd(&diagptable0[offset]);
+                __m512d d01_1 = _mm512_load_pd(&diagptable01[offset]);
+                __m512d d02_1 = _mm512_load_pd(&diagptable02[offset]);
+                __m512d s_1 = _mm512_load_pd(&sum[j*span + offset]);
+
+                inv_1 = _mm512_fmadd_pd(d0_1, s_1, inv_1);
+                d1_1 = _mm512_fmadd_pd(d01_1, s_1, d1_1);
+                d2_1 = _mm512_fmadd_pd(d02_1, s_1, d2_1);
+            }
+
+            __mmask8 k1 = _mm512_int2mask(mask);
+            mask <<= 1;
+
+            // reduce
+            inv_1 = _mm512_add_pd (inv_1, _mm512_swizzle_pd(inv_1, _MM_SWIZ_REG_CDAB));
+            inv_1 = _mm512_add_pd (inv_1, _mm512_swizzle_pd(inv_1, _MM_SWIZ_REG_BADC));
+            inv_1 = _mm512_add_pd (inv_1, _mm512_castsi512_pd(_mm512_permute4f128_epi32(_mm512_castpd_si512(inv_1), _MM_PERM_BADC)));
+            invVec = _mm512_mask_mov_pd(invVec, k1, inv_1);
+
+            d1_1 = _mm512_add_pd (d1_1, _mm512_swizzle_pd(d1_1, _MM_SWIZ_REG_CDAB));
+            d1_1 = _mm512_add_pd (d1_1, _mm512_swizzle_pd(d1_1, _MM_SWIZ_REG_BADC));
+            d1_1 = _mm512_add_pd (d1_1, _mm512_castsi512_pd(_mm512_permute4f128_epi32(_mm512_castpd_si512(d1_1), _MM_PERM_BADC)));
+            d1Vec = _mm512_mask_mov_pd(d1Vec, k1, d1_1);
+
+            d2_1 = _mm512_add_pd (d2_1, _mm512_swizzle_pd(d2_1, _MM_SWIZ_REG_CDAB));
+            d2_1 = _mm512_add_pd (d2_1, _mm512_swizzle_pd(d2_1, _MM_SWIZ_REG_BADC));
+            d2_1 = _mm512_add_pd (d2_1, _mm512_castsi512_pd(_mm512_permute4f128_epi32(_mm512_castpd_si512(d2_1), _MM_PERM_BADC)));
+            d2Vec = _mm512_mask_mov_pd(d2Vec, k1, d2_1);
+        }
+
+        _mm512_store_pd(&invBuf[0], invVec);
+        _mm512_store_pd(&d1Buf[0], d1Vec);
+        _mm512_store_pd(&d2Buf[0], d2Vec);
+
+        #pragma ivdep
+        #pragma vector aligned
+        for (int j = 0; j < PLL_VECTOR_WIDTH; ++j)
+        {
+            const double inv_Li = 1.0 / invBuf[j];
+
+            const double d1 = d1Buf[j] * inv_Li;
+            const double d2 = d2Buf[j] * inv_Li;
+
+            dlnLdlz += wgt[i * PLL_VECTOR_WIDTH + j] * d1;
+            d2lnLdlz2 += wgt[i * PLL_VECTOR_WIDTH + j] * (d2 - d1 * d1);
+        }
+    } // site loop
+
+    *ext_dlnLdlz   = dlnLdlz;
+    *ext_d2lnLdlz2 = d2lnLdlz2;
+}
+
+
+/****
+ *       PROTEIN - LG4
+ */
+
+void newviewGTRGAMMAPROT_LG4_MIC(int tipCase,
+                  double *x1, double *x2, double *x3, double *extEV[4], double *tipVector[4],
+                  unsigned char *tipX1, unsigned char *tipX2,
+                  int n, double *left, double *right, int *wgt, int *scalerIncrement)
+{
+
+  __m512d minlikelihood_MIC = _mm512_set1_pd(PLL_MINLIKELIHOOD);
+  __m512d twotothe256_MIC = _mm512_set1_pd(PLL_TWOTOTHE256);
+  __m512i absMask_MIC = _mm512_set1_epi64(0x7fffffffffffffffULL);
+
+  int addScale = 0;
+
+  double aEV[1600] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+  #pragma ivdep
+  for (int l = 0; l < 1600; ++l)
+  {
+      aEV[l] = extEV[(l % span) / states][(l / span) * states + (l % states)];
+  }
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      {
+        /* multiply all possible tip state vectors with the respective P-matrices
+        */
+
+        double umpX1[1840] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        double umpX2[1840] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+        for(int i = 0; i < 23; ++i)
+        {
+          for(int k = 0; k < span; ++k)
+          {
+              umpX1[i * span + k] = 0.0;
+              umpX2[i * span + k] = 0.0;
+              double *tipv = &(tipVector[k / states][i * states]);
+
+
+              #pragma ivdep
+              for(int l = 0; l < states; ++l)
+              {
+                  umpX1[i * span + k] +=  tipv[l] *  left[k * states + l];
+                  umpX2[i * span + k] +=  tipv[l] * right[k * states + l];
+              }
+          }
+        }
+
+        for (int i = 0; i < n; i++)
+        {
+            const double *uX1 = &umpX1[span * tipX1[i]];
+            const double *uX2 = &umpX2[span * tipX2[i]];
+
+            double uX[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+            double* v3 = &x3[i * span];
+
+            #pragma ivdep
+            #pragma vector aligned
+            for(int l = 0; l < span; ++l)
+            {
+                uX[l] = uX1[l] * uX2[l];
+                v3[l] = 0.;
+            }
+
+            for(int k = 0; k < states; ++k)
+            {
+                for (int j = 0; j < span; j += 8)
+                {
+                    _mm_prefetch((const char *)&aEV[span*(k+1) + j], _MM_HINT_T0);
+                }
+
+                mic_fma4x80(&uX[k], v3, &aEV[k * span]);
+            }
+
+        } // sites loop
+      }
+      break;
+    case PLL_TIP_INNER:
+      {
+        /* we do analogous pre-computations as above, with the only difference that we now do them
+        only for one tip vector */
+
+          double umpX1[1840] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+        /* precompute P and left tip vector product */
+
+        for(int i = 0; i < 23; ++i)
+        {
+          for(int k = 0; k < span; ++k)
+          {
+              umpX1[i * span + k] = 0.0;
+              double *tipv = &(tipVector[k / states][i * states]);
+
+              #pragma ivdep
+              for(int l = 0; l < states; ++l)
+              {
+                  umpX1[i * span + k] +=  tipv[l] *  left[k * states + l];
+              }
+          }
+        }
+
+        // re-arrange right matrix for better memory layout
+        double aRight[4 * statesSquare] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        for(int j = 0; j < 4; j++)
+        {
+            for(int k = 0; k < states; k++)
+            {
+                for(int l = 0; l < states; l++)
+                {
+                    aRight[k * span + j * states + l] = right[j * statesSquare +  l * states + k];
+                }
+            }
+        }
+
+        for (int i = 0; i < n; i++)
+        {
+            #pragma unroll(10)
+            for (int j = 0; j < span; j += 8)
+            {
+                _mm_prefetch((const char *)&x2[span*(i+1) + j], _MM_HINT_T1);
+            }
+
+            /* access pre-computed value based on the raw sequence data tipX1 that is used as an index */
+            double* uX1 = &umpX1[span * tipX1[i]];
+            double uX2[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+            double uX[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+            double* v3 = &(x3[span * i]);
+
+            const double* v2 = &(x2[span * i]);
+
+            #pragma vector aligned
+            for(int l = 0; l < span; ++l)
+            {
+                uX2[l] = 0.;
+            }
+
+            for(int k = 0; k < states; ++k)
+            {
+				#pragma unroll(10)
+            	for (int j = 0; j < span; j += 8)
+                {
+                    _mm_prefetch((const char *)&aRight[span*(k+1) + j], _MM_HINT_T0);
+                }
+
+                mic_fma4x80(&v2[k], uX2, &aRight[k * span]);
+            }
+
+            #pragma ivdep
+            #pragma vector aligned
+            for(int l = 0; l < span; ++l)
+            {
+                uX[l] = uX1[l] * uX2[l];
+                v3[l] = 0.;
+            }
+
+            for(int k = 0; k < states; ++k)
+            {
+				#pragma unroll(10)
+            	for (int j = 0; j < span; j += 8)
+                {
+                    _mm_prefetch((const char *)&aEV[span*(k+1) + j], _MM_HINT_T0);
+                }
+
+                mic_fma4x80(&uX[k], v3, &aEV[k * span]);
+            }
+
+
+            __m512d t1 = _mm512_load_pd(&v3[0]);
+            t1 = _mm512_castsi512_pd(_mm512_and_epi64(_mm512_castpd_si512(t1), absMask_MIC));
+            double vmax = _mm512_reduce_gmax_pd(t1);
+            double mx[16] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+            for (int l = 8; l < span; l += 8)
+            {
+                __m512d t = _mm512_load_pd(&v3[l]);
+                t = _mm512_castsi512_pd(_mm512_and_epi64(_mm512_castpd_si512(t), absMask_MIC));
+                double vmax2 = _mm512_reduce_gmax_pd(t);
+                vmax = PLL_MAX(vmax, vmax2);
+            }
+
+            if (vmax < PLL_MINLIKELIHOOD)
+            {
+                #pragma vector aligned nontemporal
+                for(int l = 0; l < span; l++)
+                  v3[l] *= PLL_TWOTOTHE256;
+
+                addScale += wgt[i];
+            }
+        } // site loop
+
+      }
+      break;
+    case PLL_INNER_INNER:
+    {
+      /* same as above, without pre-computations */
+
+        // re-arrange right matrix for better memory layout
+        double aLeft[4 * statesSquare] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        double aRight[4 * statesSquare] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        for(int j = 0; j < 4; j++)
+        {
+            for(int k = 0; k < states; k++)
+            {
+                for(int l = 0; l < states; l++)
+                {
+                    aLeft[k * span + j * states + l] = left[j * statesSquare + l * states + k];
+                    aRight[k * span + j * states + l] = right[j * statesSquare + l * states + k];
+                }
+            }
+        }
+
+        for (int i = 0; i < n; i++)
+        {
+
+            #pragma unroll(10)
+            for (int j = 0; j < span; j += 8)
+            {
+                _mm_prefetch((const char *)&x1[span*(i+1) + j], _MM_HINT_T1);
+                _mm_prefetch((const char *)&x2[span*(i+1) + j], _MM_HINT_T1);
+            }
+
+
+            double uX1[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+            double uX2[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+            double uX[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+            double* v3 = &(x3[span * i]);
+
+            const double* v1 = &(x1[span * i]);
+            const double* v2 = &(x2[span * i]);
+
+            #pragma vector aligned
+            for(int l = 0; l < span; ++l)
+            {
+                uX1[l] = 0.;
+                uX2[l] = 0.;
+            }
+
+            for(int k = 0; k < states; ++k)
+            {
+				#pragma unroll(10)
+            	for (int j = 0; j < span; j += 8)
+                {
+                    _mm_prefetch((const char *)&aRight[span*(k+1) + j], _MM_HINT_T0);
+                    _mm_prefetch((const char *)&aLeft[span*(k+1) + j], _MM_HINT_T0);
+                }
+
+                mic_fma4x80(&v1[k], uX1, &aLeft[k * span]);
+                mic_fma4x80(&v2[k], uX2, &aRight[k * span]);
+            }
+
+            #pragma ivdep
+            #pragma vector aligned
+            for(int l = 0; l < span; ++l)
+            {
+                uX[l] = uX1[l] * uX2[l];
+                v3[l] = 0.;
+            }
+
+            for(int k = 0; k < states; ++k)
+            {
+				#pragma unroll(10)
+            	for (int j = 0; j < span; j += 8)
+                {
+                    _mm_prefetch((const char *)&aEV[span*(k+1) + j], _MM_HINT_T0);
+                }
+
+                mic_fma4x80(&uX[k], v3, &aEV[k * span]);
+            }
+
+            __m512d t1 = _mm512_load_pd(&v3[0]);
+            t1 = _mm512_castsi512_pd(_mm512_and_epi64(_mm512_castpd_si512(t1), absMask_MIC));
+            double vmax = _mm512_reduce_gmax_pd(t1);
+            double mx[16] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+            for (int l = 8; l < span; l += 8)
+            {
+                __m512d t = _mm512_load_pd(&v3[l]);
+                t = _mm512_castsi512_pd(_mm512_and_epi64(_mm512_castpd_si512(t), absMask_MIC));
+                double vmax2 = _mm512_reduce_gmax_pd(t);
+                vmax = PLL_MAX(vmax, vmax2);
+            }
+
+            if (vmax < PLL_MINLIKELIHOOD)
+            {
+                #pragma vector aligned nontemporal
+                for(int l = 0; l < span; l++)
+                  v3[l] *= PLL_TWOTOTHE256;
+
+                addScale += wgt[i];
+            }
+        }
+    } break;
+    default:
+//      assert(0);
+      break;
+  }
+
+  *scalerIncrement = addScale;
+
+}
+
+
+
+double evaluateGTRGAMMAPROT_LG4_MIC(int *wgt, double *x1_start, double *x2_start, double *tipVector[4],
+                 unsigned char *tipX1, const int n, double *diagptable)
+{
+    double sum = 0.0;
+
+    /* the left node is a tip */
+    if(tipX1)
+    {
+        double aTipVec[1840] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        for(int k = 0; k < 23; k++)
+        {
+            for(int j = 0; j < 4; j++)
+            {
+				for(int l = 0; l < states; l++)
+				{
+					aTipVec[k*span + j*states + l] = tipVector[j][k*states + l];
+				}
+            }
+        }
+
+        /* loop over the sites of this partition */
+        for (int i = 0; i < n; i++)
+        {
+			/* access pre-computed tip vector values via a lookup table */
+			const double *x1 = &(aTipVec[span * tipX1[i]]);
+			/* access the other(inner) node at the other end of the branch */
+			const double *x2 = &(x2_start[span * i]);
+
+			#pragma unroll(10)
+			for (int k = 0; k < span; k += 8)
+			{
+				_mm_prefetch((const char *) &x2_start[span*(i+2) + k], _MM_HINT_T1);
+				_mm_prefetch((const char *) &x2_start[span*(i+1) + k], _MM_HINT_T0);
+			}
+
+			double term = 0.;
+
+			#pragma ivdep
+			#pragma vector aligned
+			#pragma noprefetch x2
+			for(int j = 0; j < span; j++) {
+			  term += x1[j] * x2[j] * diagptable[j];
+			}
+
+			term = log(0.25 * fabs(term));
+
+			sum += wgt[i] * term;
+        }
+    }
+    else
+    {
+        for (int i = 0; i < n; i++)
+        {
+			#pragma unroll(10)
+			for (int k = 0; k < span; k += 8)
+			{
+				_mm_prefetch((const char *) &x1_start[span*(i+2) + k], _MM_HINT_T1);
+				_mm_prefetch((const char *) &x1_start[span*(i+1) + k], _MM_HINT_T0);
+
+				_mm_prefetch((const char *) &x2_start[span*(i+2) + k], _MM_HINT_T1);
+				_mm_prefetch((const char *) &x2_start[span*(i+1) + k], _MM_HINT_T0);
+			}
+
+			const double *x1 = &(x1_start[span * i]);
+			const double *x2 = &(x2_start[span * i]);
+
+			double term = 0.;
+
+			#pragma ivdep
+			#pragma vector aligned
+			#pragma noprefetch x1 x2
+			for(int j = 0; j < span; j++)
+			  term += x1[j] * x2[j] * diagptable[j];
+
+			term = log(0.25 * fabs(term));
+
+			sum += wgt[i] * term;
+        }
+    }
+
+    return sum;
+}
+
+void sumGTRGAMMAPROT_LG4_MIC(int tipCase, double *sumtable, double *x1_start, double *x2_start, double *tipVector[4],
+    unsigned char *tipX1, unsigned char *tipX2, int n)
+{
+    double aTipVec[1840] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+    for(int k = 0; k < maxStateValue; k++)
+    {
+        for(int j = 0; j < 4; j++)
+        {
+			for(int l = 0; l < states; l++)
+			{
+				aTipVec[k*span + j*states + l] = tipVector[j][k*states + l];
+			}
+        }
+    }
+
+    switch(tipCase)
+    {
+      case PLL_TIP_TIP:
+      {
+        for(int i = 0; i < n; i++)
+        {
+            const double *left  = &(aTipVec[span * tipX1[i]]);
+            const double *right = &(aTipVec[span * tipX2[i]]);
+
+            #pragma ivdep
+            #pragma vector aligned nontemporal
+            for(int l = 0; l < span; l++)
+            {
+                sumtable[i * span + l] = left[l] * right[l];
+            }
+        }
+      } break;
+      case PLL_TIP_INNER:
+      {
+        for(int i = 0; i < n; i++)
+        {
+			#pragma unroll(10)
+			for (int k = 0; k < span; k += 8)
+			{
+				_mm_prefetch((const char *) &x2_start[span*(i+2) + k], _MM_HINT_T1);
+				_mm_prefetch((const char *) &x2_start[span*(i+1) + k], _MM_HINT_T0);
+			}
+
+          const double *left = &(aTipVec[span * tipX1[i]]);
+          const double *right = &(x2_start[span * i]);
+
+          #pragma ivdep
+          #pragma vector aligned nontemporal
+		  #pragma noprefetch right
+          for(int l = 0; l < span; l++)
+          {
+              sumtable[i * span + l] = left[l] * right[l];
+          }
+        }
+      } break;
+      case PLL_INNER_INNER:
+      {
+        for(int i = 0; i < n; i++)
+        {
+			#pragma unroll(10)
+			for (int k = 0; k < span; k += 8)
+			{
+				_mm_prefetch((const char *) &x1_start[span*(i+2) + k], _MM_HINT_T1);
+				_mm_prefetch((const char *) &x1_start[span*(i+1) + k], _MM_HINT_T0);
+
+				_mm_prefetch((const char *) &x2_start[span*(i+2) + k], _MM_HINT_T1);
+				_mm_prefetch((const char *) &x2_start[span*(i+1) + k], _MM_HINT_T0);
+			}
+
+            const double *left  = &(x1_start[span * i]);
+            const double *right = &(x2_start[span * i]);
+
+            #pragma ivdep
+            #pragma vector aligned nontemporal
+			#pragma noprefetch left right
+            for(int l = 0; l < span; l++)
+            {
+                sumtable[i * span + l] = left[l] * right[l];
+            }
+        }
+      } break;
+  //    default:
+  //      assert(0);
+    }
+}
+
+void coreGTRGAMMAPROT_LG4_MIC(const int upper, double *sumtable,
+    volatile double *ext_dlnLdlz,  volatile double *ext_d2lnLdlz2, double *EIGN[4], double *gammaRates, double lz, int *wgt)
+{
+    double diagptable0[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+    double diagptable1[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+    double diagptable2[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+    double diagptable01[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+    double diagptable02[span] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+    /* pre-compute the derivatives of the P matrix for all discrete GAMMA rates */
+
+    for(int i = 0; i < 4; i++)
+    {
+        const double ki = gammaRates[i];
+        const double kisqr = ki * ki;
+
+        diagptable0[i*states] = 1.;
+        diagptable1[i*states] = 0.;
+        diagptable2[i*states] = 0.;
+
+        for(int l = 1; l < states; l++)
+        {
+          diagptable0[i * states + l]  = exp(EIGN[i][l] * ki * lz);
+          diagptable1[i * states + l] = EIGN[i][l] * ki;
+          diagptable2[i * states + l] = EIGN[i][l] * EIGN[i][l] * kisqr;
+        }
+    }
+
+    #pragma ivdep
+    for(int i = 0; i < span; i++)
+    {
+        diagptable01[i] = diagptable0[i] * diagptable1[i];
+        diagptable02[i] = diagptable0[i] * diagptable2[i];
+    }
+
+    /* loop over sites in this partition */
+
+    const int aligned_width = upper % 8 == 0 ? upper / 8 : upper / 8 + 1;
+
+    double dlnLdlz = 0.;
+    double d2lnLdlz2 = 0.;
+
+    __mmask16 k1 = _mm512_int2mask(0x000000FF);
+
+    for (int i = 0; i < aligned_width; i++)
+    {
+        /* access the array with pre-computed values */
+        const double *sum = &sumtable[i * span * 8];
+
+        /* initial per-site likelihood and 1st and 2nd derivatives */
+
+        double invBuf[8] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        double d1Buf[8] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        double d2Buf[8] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+        __m512d invVec;
+        __m512d d1Vec;
+        __m512d d2Vec;
+        int mask = 0x01;
+
+        #pragma noprefetch sum
+        #pragma unroll(8)
+        for(int j = 0; j < 8; j++)
+        {
+
+        	#pragma unroll(10)
+			for (int k = 0; k < span; k += 8)
+			{
+				_mm_prefetch((const char *) &sum[span*(j+2) + k], _MM_HINT_T1);
+				_mm_prefetch((const char *) &sum[span*(j+1) + k], _MM_HINT_T0);
+			}
+
+            __m512d inv_1 = _mm512_setzero_pd();
+            __m512d d1_1 = _mm512_setzero_pd();
+            __m512d d2_1 = _mm512_setzero_pd();
+
+            for (int offset = 0; offset < span; offset += 8)
+            {
+                __m512d d0_1 = _mm512_load_pd(&diagptable0[offset]);
+                __m512d d01_1 = _mm512_load_pd(&diagptable01[offset]);
+                __m512d d02_1 = _mm512_load_pd(&diagptable02[offset]);
+                __m512d s_1 = _mm512_load_pd(&sum[j*span + offset]);
+
+                inv_1 = _mm512_fmadd_pd(d0_1, s_1, inv_1);
+                d1_1 = _mm512_fmadd_pd(d01_1, s_1, d1_1);
+                d2_1 = _mm512_fmadd_pd(d02_1, s_1, d2_1);
+            }
+
+            __mmask8 k1 = _mm512_int2mask(mask);
+            mask <<= 1;
+
+            // reduce
+            inv_1 = _mm512_add_pd (inv_1, _mm512_swizzle_pd(inv_1, _MM_SWIZ_REG_CDAB));
+            inv_1 = _mm512_add_pd (inv_1, _mm512_swizzle_pd(inv_1, _MM_SWIZ_REG_BADC));
+            inv_1 = _mm512_add_pd (inv_1, _mm512_castsi512_pd(_mm512_permute4f128_epi32(_mm512_castpd_si512(inv_1), _MM_PERM_BADC)));
+            invVec = _mm512_mask_mov_pd(invVec, k1, inv_1);
+
+            d1_1 = _mm512_add_pd (d1_1, _mm512_swizzle_pd(d1_1, _MM_SWIZ_REG_CDAB));
+            d1_1 = _mm512_add_pd (d1_1, _mm512_swizzle_pd(d1_1, _MM_SWIZ_REG_BADC));
+            d1_1 = _mm512_add_pd (d1_1, _mm512_castsi512_pd(_mm512_permute4f128_epi32(_mm512_castpd_si512(d1_1), _MM_PERM_BADC)));
+            d1Vec = _mm512_mask_mov_pd(d1Vec, k1, d1_1);
+
+            d2_1 = _mm512_add_pd (d2_1, _mm512_swizzle_pd(d2_1, _MM_SWIZ_REG_CDAB));
+            d2_1 = _mm512_add_pd (d2_1, _mm512_swizzle_pd(d2_1, _MM_SWIZ_REG_BADC));
+            d2_1 = _mm512_add_pd (d2_1, _mm512_castsi512_pd(_mm512_permute4f128_epi32(_mm512_castpd_si512(d2_1), _MM_PERM_BADC)));
+            d2Vec = _mm512_mask_mov_pd(d2Vec, k1, d2_1);
+        }
+
+        _mm512_store_pd(&invBuf[0], invVec);
+        _mm512_store_pd(&d1Buf[0], d1Vec);
+        _mm512_store_pd(&d2Buf[0], d2Vec);
+
+        #pragma ivdep
+        #pragma vector aligned
+        for (int j = 0; j < 8; ++j)
+        {
+            const double inv_Li = 1.0 / invBuf[j];
+
+            const double d1 = d1Buf[j] * inv_Li;
+            const double d2 = d2Buf[j] * inv_Li;
+
+            dlnLdlz += wgt[i * 8 + j] * d1;
+            d2lnLdlz2 += wgt[i * 8 + j] * (d2 - d1 * d1);
+        }
+    } // site loop
+
+    *ext_dlnLdlz   = dlnLdlz;
+    *ext_d2lnLdlz2 = d2lnLdlz2;
+}
+
diff --git a/lib/pll/mic_native_dna.c b/lib/pll/mic_native_dna.c
new file mode 100644
index 0000000..ecb4fa4
--- /dev/null
+++ b/lib/pll/mic_native_dna.c
@@ -0,0 +1,676 @@
+#include <omp.h>
+#include <immintrin.h>
+#include <string.h>
+#include <math.h>
+
+#include "pll.h"
+#include "mic_native.h"
+
+static const int states = 4;
+static const int statesSquare = 16;
+static const int span = 4 * 4;
+static const int maxStateValue = 16;
+
+inline void mic_broadcast16x64(const double* inv, double* outv)
+{
+    __mmask8 k1 = _mm512_int2mask(0x0F);
+    __mmask8 k2 = _mm512_int2mask(0xF0);
+    for(int l = 0; l < 16; l += 2)
+    {
+        __m512d t = _mm512_setzero_pd();
+        t = _mm512_mask_extload_pd(t, k1, &inv[(l%4)*4 + l/4], _MM_UPCONV_PD_NONE, _MM_BROADCAST_1X8, _MM_HINT_NONE);
+        t = _mm512_mask_extload_pd(t, k2, &inv[((l+1)%4)*4 + (l+1)/4], _MM_UPCONV_PD_NONE, _MM_BROADCAST_1X8, _MM_HINT_NONE);
+
+        _mm512_store_pd(&outv[l*4], t);
+    }
+}
+
+void newviewGTRGAMMA_MIC(int tipCase,
+                  double *x1, double *x2, double *x3, double *extEV, double *tipVector,
+                  int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                  int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling)
+{
+    __m512d minlikelihood_MIC = _mm512_set1_pd(PLL_MINLIKELIHOOD);
+    __m512d twotothe256_MIC = _mm512_set1_pd(PLL_TWOTOTHE256);
+    __m512i absMask_MIC = _mm512_set1_epi64(0x7fffffffffffffffULL);
+
+	int addScale = 0;
+
+    double aEV[64] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+    #pragma ivdep
+    for (int l = 0; l < 64; ++l)
+    {
+        aEV[l] = extEV[(l / 16) * 4 + (l % 4)];
+    }
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      {
+        /* multiply all possible tip state vectors with the respective P-matrices
+        */
+
+            double umpX1[256] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+            double umpX2[256] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+            for(int k = 0; k < 256; ++k)
+            {
+                umpX1[k] = 0.0;
+                umpX2[k] = 0.0;
+            }
+
+            for(int i = 0; i < maxStateValue; ++i)
+            {
+              for(int l = 0; l < states; ++l)
+              {
+                  #pragma ivdep
+                  for(int k = 0; k < span; ++k)
+                  {
+                      umpX1[16 * i + k] +=  tipVector[i * 4 + l] *  left[k * 4 + l];
+                      umpX2[16 * i + k] +=  tipVector[i * 4 + l] * right[k * 4 + l];
+                  }
+              }
+            }
+
+        double auX[64] __attribute__((align(64)));
+
+        for(int i = 0; i < n; ++i)
+        {
+            _mm_prefetch((const char*) (const char*) &x3[span*(i+8)], _MM_HINT_ET1);
+            _mm_prefetch((const char*) &x3[span*(i+8) + 8], _MM_HINT_ET1);
+
+            _mm_prefetch((const char*) &x3[span*(i+1)], _MM_HINT_ET0);
+            _mm_prefetch((const char*) &x3[span*(i+1) + 8], _MM_HINT_ET0);
+
+            const double *uX1 = &umpX1[16 * tipX1[i]];
+            const double *uX2 = &umpX2[16 * tipX2[i]];
+
+            double uX[16] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+            double* v = &x3[i * 16];
+
+            #pragma ivdep
+            #pragma vector aligned
+            for(int l = 0; l < 16; ++l)
+            {
+                uX[l] = uX1[l] * uX2[l];
+                v[l] = 0.;
+            }
+
+            mic_broadcast16x64(uX, auX);
+
+            for (int j = 0; j < 4; ++j)
+            {
+                #pragma ivdep
+                #pragma vector aligned
+                #pragma vector nontemporal
+                for(int k = 0; k < 16; ++k)
+                {
+                    v[k] += auX[j*16 + k] * aEV[j*16 + k];
+                }
+            }
+
+            // init scaling counter for the site
+            if (!fastScaling)
+                ex3[i] = 0;
+
+        } // sites loop
+
+      }
+      break;
+    case PLL_TIP_INNER:
+      {
+        /* we do analogous pre-computations as above, with the only difference that we now do them
+        only for one tip vector */
+
+          double umpX1[256] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+        /* precompute P and left tip vector product */
+
+        for(int k = 0; k < 256; ++k)
+        {
+            umpX1[k] = 0.0;
+        }
+
+        for(int i = 0; i < 16; ++i)
+        {
+          for(int l = 0; l < 4; ++l)
+          {
+              #pragma ivdep
+              for(int k = 0; k < 16; ++k)
+              {
+                  umpX1[16 * i + k] +=  tipVector[i * 4 + l] *  left[k * 4 + l];
+              }
+          }
+        }
+
+        // re-arrange right matrix for better memory layout
+        double aRight[64] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        for(int j = 0; j < 4; j++)
+        {
+            for(int l = 0; l < 16; l++)
+            {
+                aRight[j*16 + l] = right[l*4 + j];
+            }
+        }
+
+        for (int i = 0; i < n; i++)
+        {
+            _mm_prefetch((const char*) &x2[span*(i+16)], _MM_HINT_T1);
+            _mm_prefetch((const char*) &x2[span*(i+16) + 8], _MM_HINT_T1);
+            _mm_prefetch((const char*) &x3[span*(i+16)], _MM_HINT_ET1);
+            _mm_prefetch((const char*) &x3[span*(i+16) + 8], _MM_HINT_ET1);
+
+            _mm_prefetch((const char*) &x2[span*(i+1)], _MM_HINT_T0);
+            _mm_prefetch((const char*) &x2[span*(i+1) + 8], _MM_HINT_T0);
+            _mm_prefetch((const char*) &x3[span*(i+1)], _MM_HINT_ET0);
+            _mm_prefetch((const char*) &x3[span*(i+1) + 8], _MM_HINT_ET0);
+
+            /* access pre-computed value based on the raw sequence data tipX1 that is used as an index */
+            double* uX1 = &umpX1[span * tipX1[i]];
+            double uX2[16] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+            double uX[16] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+            #pragma vector aligned
+            for(int l = 0; l < 16; ++l)
+            {
+                uX2[l] = 0.;
+            }
+
+            double aV2[64] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+            const double* v2 = &(x2[16 * i]);
+
+            mic_broadcast16x64(v2, aV2);
+
+            for(int j = 0; j < 4; j++)
+            {
+                #pragma ivdep
+                #pragma vector aligned
+                for(int l = 0; l < 16; l++)
+                {
+                    uX2[l] += aV2[j*16 + l] * aRight[j*16 + l];
+                }
+            }
+
+            double* v3 = &(x3[span * i]);
+
+            #pragma ivdep
+            #pragma vector aligned
+            for(int l = 0; l < 16; ++l)
+            {
+                uX[l] = uX1[l] * uX2[l];
+                v3[l] = 0.;
+            }
+
+            double auX[64] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+            mic_broadcast16x64(uX, auX);
+
+            for (int j = 0; j < 4; ++j)
+            {
+                #pragma ivdep
+                #pragma vector aligned
+                for(int k = 0; k < 16; ++k)
+                {
+                    v3[k] += auX[j*16 + k] * aEV[j*16 + k];
+                }
+            }
+
+            __m512d t1 = _mm512_load_pd(&v3[0]);
+            t1 = _mm512_castsi512_pd(_mm512_and_epi64(_mm512_castpd_si512(t1), absMask_MIC));
+            double vmax1 = _mm512_reduce_gmax_pd(t1);
+            __m512d t2 = _mm512_load_pd(&v3[8]);
+            t2 = _mm512_castsi512_pd(_mm512_and_epi64(_mm512_castpd_si512(t2), absMask_MIC));
+            double vmax2 = _mm512_reduce_gmax_pd(t2);
+
+            if(vmax1 < PLL_MINLIKELIHOOD && vmax2 < PLL_MINLIKELIHOOD)
+            {
+				t1 = _mm512_mul_pd(t1, twotothe256_MIC);
+				_mm512_store_pd(&v3[0], t1);
+				t2 = _mm512_mul_pd(t2, twotothe256_MIC);
+				_mm512_store_pd(&v3[8], t2);
+
+                if(!fastScaling)
+                  ex3[i] += 1;
+                else
+                  addScale += wgt[i];
+            }
+        } // site loop
+      }
+      break;
+    case PLL_INNER_INNER:
+    {
+      /* same as above, without pre-computations */
+
+        // re-arrange right matrix for better memory layout
+        double aLeft[64] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        double aRight[64] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        for(int j = 0; j < 4; j++)
+        {
+            for(int l = 0; l < 16; l++)
+            {
+                aLeft[j*16 + l] = left[l*4 + j];
+                aRight[j*16 + l] = right[l*4 + j];
+            }
+        }
+
+        for (int i = 0; i < n; i++)
+        {
+            _mm_prefetch((const char*) &x1[span*(i+8)], _MM_HINT_T1);
+            _mm_prefetch((const char*) &x1[span*(i+8) + 8], _MM_HINT_T1);
+            _mm_prefetch((const char*) &x2[span*(i+8)], _MM_HINT_T1);
+            _mm_prefetch((const char*) &x2[span*(i+8) + 8], _MM_HINT_T1);
+            _mm_prefetch((const char*) &x3[span*(i+8)], _MM_HINT_ET1);
+            _mm_prefetch((const char*) &x3[span*(i+8) + 8], _MM_HINT_ET1);
+
+            _mm_prefetch((const char*) &x1[span*(i+1)], _MM_HINT_T0);
+            _mm_prefetch((const char*) &x1[span*(i+1) + 8], _MM_HINT_T0);
+            _mm_prefetch((const char*) &x2[span*(i+1)], _MM_HINT_T0);
+            _mm_prefetch((const char*) &x2[span*(i+1) + 8], _MM_HINT_T0);
+            _mm_prefetch((const char*) &x3[span*(i+1)], _MM_HINT_ET0);
+            _mm_prefetch((const char*) &x3[span*(i+1) + 8], _MM_HINT_ET0);
+
+            double uX1[16] __attribute__((align(64)));
+            double uX2[16] __attribute__((align(64)));
+            double uX[16] __attribute__((align(64)));
+
+            for(int l = 0; l < 16; l++)
+            {
+              uX1[l] = 0.;
+              uX2[l] = 0.;
+            }
+
+            double aV1[64] __attribute__((align(64)));
+            double aV2[64] __attribute__((align(64)));
+
+            const double* v1 = &(x1[span * i]);
+            const double* v2 = &(x2[span * i]);
+
+            mic_broadcast16x64(v1, aV1);
+
+            mic_broadcast16x64(v2, aV2);
+
+            for(int j = 0; j < 4; j++)
+            {
+                #pragma ivdep
+                #pragma vector aligned
+                for(int l = 0; l < 16; l++)
+                {
+                    uX1[l] += aV1[j*16 + l] * aLeft[j*16 + l];
+                    uX2[l] += aV2[j*16 + l] * aRight[j*16 + l];
+                }
+            }
+
+            double* v3 =  &(x3[span * i]);
+
+            #pragma ivdep
+            #pragma vector aligned
+            for(int l = 0; l < 16; ++l)
+            {
+                uX[l] = uX1[l] * uX2[l];
+                v3[l] = 0.;
+            }
+
+            double auX[64] __attribute__((align(64)));
+            mic_broadcast16x64(uX, auX);
+
+            for(int j = 0; j < 4; ++j)
+            {
+                #pragma ivdep
+                #pragma vector aligned
+                for(int k = 0; k < 16; ++k)
+                {
+                    v3[k] += auX[j*16 + k] * aEV[j*16 + k];
+                }
+            }
+
+
+            __m512d t1 = _mm512_load_pd(&v3[0]);
+            t1 = _mm512_castsi512_pd(_mm512_and_epi64(_mm512_castpd_si512(t1), absMask_MIC));
+            double vmax1 = _mm512_reduce_gmax_pd(t1);
+            __m512d t2 = _mm512_load_pd(&v3[8]);
+            t2 = _mm512_castsi512_pd(_mm512_and_epi64(_mm512_castpd_si512(t2), absMask_MIC));
+            double vmax2 = _mm512_reduce_gmax_pd(t2);
+
+            if(vmax1 < PLL_MINLIKELIHOOD && vmax2 < PLL_MINLIKELIHOOD)
+            {
+				t1 = _mm512_mul_pd(t1, twotothe256_MIC);
+				_mm512_store_pd(&v3[0], t1);
+				t2 = _mm512_mul_pd(t2, twotothe256_MIC);
+				_mm512_store_pd(&v3[8], t2);
+
+                if(!fastScaling)
+                  ex3[i] += 1;
+                else
+                  addScale += wgt[i];
+            }
+        }
+    } break;
+    default:
+//      assert(0);
+      break;
+  }
+
+  /* as above, increment the global counter that counts scaling multiplications by the scaling multiplications
+     carried out for computing the likelihood array at node p */
+
+  if (fastScaling)
+  {
+      *scalerIncrement = addScale;
+  }
+
+}
+
+double evaluateGTRGAMMA_MIC(int *ex1, int *ex2, int *wgt,
+                 double *x1_start, double *x2_start,
+                 double *tipVector,
+                 unsigned char *tipX1, const int n, double *diagptable, const boolean fastScaling)
+{
+	double sum = 0.0;
+
+    /* the left node is a tip */
+    if(tipX1)
+    {
+
+        double aTipVec[256] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+        for(int k = 0; k < 16; k++)
+        {
+            for(int l = 0; l < 4; l++)
+            {
+                aTipVec[k*16 + l] = aTipVec[k*16 + 4 + l] = aTipVec[k*16 + 8 + l] = aTipVec[k*16 + 12 + l] = tipVector[k*4 + l];
+            }
+        }
+
+        /* loop over the sites of this partition */
+        for (int i = 0; i < n; i++)
+        {
+            _mm_prefetch((const char*) &x2_start[span*(i+8)], _MM_HINT_T1);
+            _mm_prefetch((const char*) &x2_start[span*(i+8) + 8], _MM_HINT_T1);
+
+            _mm_prefetch((const char*) &x2_start[span*(i+1)], _MM_HINT_T0);
+            _mm_prefetch((const char*) &x2_start[span*(i+1) + 8], _MM_HINT_T0);
+
+          /* access pre-computed tip vector values via a lookup table */
+          const double *x1 = &(aTipVec[16 * tipX1[i]]);
+          /* access the other(inner) node at the other end of the branch */
+          const double *x2 = &(x2_start[span * i]);
+
+          double term = 0.;
+
+          #pragma ivdep
+          #pragma vector aligned
+          for(int j = 0; j < span; j++)
+              term += x1[j] * x2[j] * diagptable[j];
+
+          if(!fastScaling)
+              term = log(0.25 * term) + (ex2[i] * log(PLL_MINLIKELIHOOD));
+          else
+              term = log(0.25 * term);
+
+          sum += wgt[i] * term;
+        }
+    }
+    else
+    {
+        for (int i = 0; i < n; i++)
+        {
+            _mm_prefetch((const char*) &x1_start[span*(i+8)], _MM_HINT_T1);
+            _mm_prefetch((const char*) &x1_start[span*(i+8) + 8], _MM_HINT_T1);
+            _mm_prefetch((const char*) &x2_start[span*(i+8)], _MM_HINT_T1);
+            _mm_prefetch((const char*) &x2_start[span*(i+8) + 8], _MM_HINT_T1);
+
+            _mm_prefetch((const char*) &x1_start[span*(i+1)], _MM_HINT_T0);
+            _mm_prefetch((const char*) &x1_start[span*(i+1) + 8], _MM_HINT_T0);
+            _mm_prefetch((const char*) &x2_start[span*(i+1)], _MM_HINT_T0);
+            _mm_prefetch((const char*) &x2_start[span*(i+1) + 8], _MM_HINT_T0);
+
+          const double *x1 = &(x1_start[span * i]);
+          const double *x2 = &(x2_start[span * i]);
+
+          double term = 0.;
+
+          #pragma ivdep
+          #pragma vector aligned
+          for(int j = 0; j < span; j++)
+              term += x1[j] * x2[j] * diagptable[j];
+
+          if(!fastScaling)
+              term = log(0.25 * fabs(term)) + ((ex1[i] + ex2[i]) * log(PLL_MINLIKELIHOOD));
+          else
+              term = log(0.25 * term);
+
+          sum += wgt[i] * term;
+        }
+    }
+
+    return sum;
+}
+
+void sumGTRGAMMA_MIC(int tipCase, double *sumtable, double *x1_start, double *x2_start, double *tipVector,
+    unsigned char *tipX1, unsigned char *tipX2, int n)
+{
+	double aTipVec[256] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+    for(int k = 0; k < 16; k++)
+    {
+        for(int l = 0; l < 4; l++)
+        {
+            aTipVec[k*16 + l] = aTipVec[k*16 + 4 + l] = aTipVec[k*16 + 8 + l] = aTipVec[k*16 + 12 + l] = tipVector[k*4 + l];
+        }
+    }
+
+    switch(tipCase)
+    {
+      case PLL_TIP_TIP:
+      {
+        for(int i = 0; i < n; i++)
+        {
+            const double *left  = &(aTipVec[16 * tipX1[i]]);
+            const double *right = &(aTipVec[16 * tipX2[i]]);
+            double* sum = &sumtable[i * span];
+
+            #pragma ivdep
+            #pragma vector aligned nontemporal
+            for(int l = 0; l < span; l++)
+            {
+              sum[l] = left[l] * right[l];
+            }
+        }
+      } break;
+      case PLL_TIP_INNER:
+      {
+        for(int i = 0; i < n; i++)
+        {
+          _mm_prefetch((const char*) &x2_start[span*(i+32)], _MM_HINT_T1);
+          _mm_prefetch((const char*) &x2_start[span*(i+32) + 8], _MM_HINT_T1);
+
+          _mm_prefetch((const char*) &x2_start[span*(i+4)], _MM_HINT_T0);
+          _mm_prefetch((const char*) &x2_start[span*(i+4) + 8], _MM_HINT_T0);
+
+          const double *left = &(aTipVec[16 * tipX1[i]]);
+          const double *right = &(x2_start[span * i]);
+          double* sum = &sumtable[i * span];
+
+          #pragma ivdep
+          #pragma vector aligned nontemporal
+          for(int l = 0; l < span; l++)
+          {
+              sum[l] = left[l] * right[l];
+          }
+        }
+      } break;
+      case PLL_INNER_INNER:
+      {
+        for(int i = 0; i < n; i++)
+        {
+            _mm_prefetch((const char*) &x1_start[span*(i+32)], _MM_HINT_T1);
+            _mm_prefetch((const char*) &x1_start[span*(i+32) + 8], _MM_HINT_T1);
+            _mm_prefetch((const char*) &x2_start[span*(i+32)], _MM_HINT_T1);
+            _mm_prefetch((const char*) &x2_start[span*(i+32) + 8], _MM_HINT_T1);
+
+            _mm_prefetch((const char*) &x1_start[span*(i+4)], _MM_HINT_T0);
+            _mm_prefetch((const char*) &x1_start[span*(i+4) + 8], _MM_HINT_T0);
+            _mm_prefetch((const char*) &x2_start[span*(i+4)], _MM_HINT_T0);
+            _mm_prefetch((const char*) &x2_start[span*(i+4) + 8], _MM_HINT_T0);
+
+            const double *left  = &(x1_start[span * i]);
+            const double *right = &(x2_start[span * i]);
+            double* sum = &sumtable[i * span];
+
+            #pragma ivdep
+            #pragma vector aligned nontemporal
+            for(int l = 0; l < span; l++)
+            {
+                sum[l] = left[l] * right[l];
+            }
+        }
+      } break;
+  //    default:
+  //      assert(0);
+    }
+}
+
+void coreGTRGAMMA_MIC(const int upper, double *sumtable,
+    volatile double *ext_dlnLdlz,  volatile double *ext_d2lnLdlz2, double *EIGN, double *gammaRates, double lz, int *wgt)
+{
+	double diagptable0[16] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+    double diagptable1[16] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+    double diagptable2[16] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+    double diagptable01[16] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+    double diagptable02[16] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+
+    /* pre-compute the derivatives of the P matrix for all discrete GAMMA rates */
+
+    for(int i = 0; i < 4; i++)
+    {
+        const double ki = gammaRates[i];
+        const double kisqr = ki * ki;
+
+        diagptable0[i*4] = 1.;
+        diagptable1[i*4] = 0.;
+        diagptable2[i*4] = 0.;
+
+        for(int l = 1; l < states; l++)
+        {
+          diagptable0[i * 4 + l]  = exp(EIGN[l] * ki * lz);
+          diagptable1[i * 4 + l] = EIGN[l] * ki;
+          diagptable2[i * 4 + l] = EIGN[l] * EIGN[l] * kisqr;
+        }
+    }
+
+    #pragma ivdep
+    for(int i = 0; i < 16; i++)
+    {
+        diagptable01[i] = diagptable0[i] * diagptable1[i];
+        diagptable02[i] = diagptable0[i] * diagptable2[i];
+    }
+
+    /* loop over sites in this partition */
+
+    const int aligned_width = upper % 8 == 0 ? upper / 8 : upper / 8 + 1;
+
+    double dlnLBuf[8] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+    double d2lnLBuf[8] __attribute__((align(PLL_BYTE_ALIGNMENT)));
+    for (int j = 0; j < 8; ++j)
+    {
+        dlnLBuf[j] = 0.;
+        d2lnLBuf[j] = 0.;
+    }
+
+    __mmask16 k1 = _mm512_int2mask(0x000000FF);
+
+    for (int i = 0; i < aligned_width; i++)
+    {
+        _mm_prefetch((const char*) &sumtable[i * span * 8], _MM_HINT_T0);
+        _mm_prefetch((const char*) &sumtable[i * span * 8 + 8], _MM_HINT_T0);
+
+        /* access the array with pre-computed values */
+        const double *sum = &sumtable[i * span * 8];
+
+        /* initial per-site likelihood and 1st and 2nd derivatives */
+
+        double invBuf[8] __attribute__((align(64)));
+        double d1Buf[8] __attribute__((align(64)));
+        double d2Buf[8] __attribute__((align(64)));
+
+        __m512d invVec;
+        __m512d d1Vec;
+        __m512d d2Vec;
+        int mask = 0x01;
+
+        #pragma noprefetch sum
+        #pragma unroll(8)
+        for(int j = 0; j < 8; j++)
+        {
+            _mm_prefetch((const char*) &sum[span*(j+8)], _MM_HINT_T1);
+            _mm_prefetch((const char*) &sum[span*(j+8) + 8], _MM_HINT_T1);
+
+            _mm_prefetch((const char*) &sum[span*(j+1)], _MM_HINT_T0);
+            _mm_prefetch((const char*) &sum[span*(j+1) + 8], _MM_HINT_T0);
+
+            __m512d d0_1 = _mm512_load_pd(&diagptable0[0]);
+            __m512d d0_2 = _mm512_load_pd(&diagptable0[8]);
+
+            __m512d d01_1 = _mm512_load_pd(&diagptable01[0]);
+            __m512d d01_2 = _mm512_load_pd(&diagptable01[8]);
+
+            __m512d d02_1 = _mm512_load_pd(&diagptable02[0]);
+            __m512d d02_2 = _mm512_load_pd(&diagptable02[8]);
+
+            __m512d s_1 = _mm512_load_pd(&sum[j*16]);
+            __m512d s_2 = _mm512_load_pd(&sum[j*16 + 8]);
+            __m512d inv_1 = _mm512_mul_pd(d0_1, s_1);
+            __m512d d1_1 = _mm512_mul_pd(d01_1, s_1);
+            __m512d d2_1 = _mm512_mul_pd(d02_1, s_1);
+
+            __m512d inv_2 = _mm512_fmadd_pd(d0_2, s_2, inv_1);
+            __m512d d1_2 = _mm512_fmadd_pd(d01_2, s_2, d1_1);
+            __m512d d2_2 = _mm512_fmadd_pd(d02_2, s_2, d2_1);
+
+            __mmask8 k1 = _mm512_int2mask(mask);
+            mask <<= 1;
+
+            // reduce
+            inv_2 = _mm512_add_pd (inv_2, _mm512_swizzle_pd(inv_2, _MM_SWIZ_REG_CDAB));
+            inv_2 = _mm512_add_pd (inv_2, _mm512_swizzle_pd(inv_2, _MM_SWIZ_REG_BADC));
+            inv_2 = _mm512_add_pd (inv_2, _mm512_castsi512_pd(_mm512_permute4f128_epi32(_mm512_castpd_si512(inv_2), _MM_PERM_BADC)));
+            invVec = _mm512_mask_mov_pd(invVec, k1, inv_2);
+
+            d1_2 = _mm512_add_pd (d1_2, _mm512_swizzle_pd(d1_2, _MM_SWIZ_REG_CDAB));
+            d1_2 = _mm512_add_pd (d1_2, _mm512_swizzle_pd(d1_2, _MM_SWIZ_REG_BADC));
+            d1_2 = _mm512_add_pd (d1_2, _mm512_castsi512_pd(_mm512_permute4f128_epi32(_mm512_castpd_si512(d1_2), _MM_PERM_BADC)));
+            d1Vec = _mm512_mask_mov_pd(d1Vec, k1, d1_2);
+
+            d2_2 = _mm512_add_pd (d2_2, _mm512_swizzle_pd(d2_2, _MM_SWIZ_REG_CDAB));
+            d2_2 = _mm512_add_pd (d2_2, _mm512_swizzle_pd(d2_2, _MM_SWIZ_REG_BADC));
+            d2_2 = _mm512_add_pd (d2_2, _mm512_castsi512_pd(_mm512_permute4f128_epi32(_mm512_castpd_si512(d2_2), _MM_PERM_BADC)));
+            d2Vec = _mm512_mask_mov_pd(d2Vec, k1, d2_2);
+        }
+
+        _mm512_store_pd(&invBuf[0], invVec);
+        _mm512_store_pd(&d1Buf[0], d1Vec);
+        _mm512_store_pd(&d2Buf[0], d2Vec);
+
+        #pragma ivdep
+        #pragma vector aligned
+        for (int j = 0; j < 8; ++j)
+        {
+            const double inv_Li = 1.0 / invBuf[j];
+
+            const double d1 = d1Buf[j] * inv_Li;
+            const double d2 = d2Buf[j] * inv_Li;
+
+            dlnLBuf[j] += wgt[i * 8 + j] * d1;
+            d2lnLBuf[j] += wgt[i * 8 + j] * (d2 - d1 * d1);
+        }
+    } // site loop
+
+    double dlnLdlz = 0.;
+    double d2lnLdlz2 = 0.;
+    for (int j = 0; j < 8; ++j)
+    {
+        dlnLdlz += dlnLBuf[j];
+        d2lnLdlz2 += d2lnLBuf[j];
+    }
+
+    *ext_dlnLdlz   = dlnLdlz;
+    *ext_d2lnLdlz2 = d2lnLdlz2;
+}
diff --git a/lib/pll/models.c b/lib/pll/models.c
new file mode 100644
index 0000000..39e4e29
--- /dev/null
+++ b/lib/pll/models.c
@@ -0,0 +1,4311 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file models.c
+ *  
+ * @brief Model related code
+ *
+ * Detailed description to appear soon.
+ */ 
+
+
+#include "mem_alloc.h"
+
+#ifndef WIN32
+#include <sys/times.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <unistd.h> 
+#endif
+
+#include <math.h>
+#include <time.h> 
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+
+#include "pll.h"
+#include "pllInternal.h"
+
+
+extern const unsigned int bitVectorSecondary[256];
+extern const unsigned int bitVector32[33];
+extern const unsigned int bitVectorAA[23];
+extern const unsigned int bitVectorIdentity[256];
+
+extern const partitionLengths pLengths[PLL_MAX_MODEL];
+
+
+
+extern FILE *byteFile;
+
+
+
+
+
+
+
+
+
+/** @brief Hardcoded values for the WAG model
+  
+    Fill the \a ext_initialRates array with hardcoded substitution rates
+    of the WAG model.
+   
+    @param ext_initialRates
+      Where to place the substitution rates
+*/
+void putWAG(double *ext_initialRates)
+{ 
+  double
+    scaler,
+    q[20][20],
+    daa[400];
+
+  int 
+    i,
+    j,
+    r;
+
+  /* fill the triangle below the diagonal with values */
+  daa[ 1*20+ 0] =  55.15710; daa[ 2*20+ 0] =  50.98480; daa[ 2*20+ 1] =  63.53460; 
+  daa[ 3*20+ 0] =  73.89980; daa[ 3*20+ 1] =  14.73040; daa[ 3*20+ 2] = 542.94200; 
+  daa[ 4*20+ 0] = 102.70400; daa[ 4*20+ 1] =  52.81910; daa[ 4*20+ 2] =  26.52560; 
+  daa[ 4*20+ 3] =   3.02949; daa[ 5*20+ 0] =  90.85980; daa[ 5*20+ 1] = 303.55000; 
+  daa[ 5*20+ 2] = 154.36400; daa[ 5*20+ 3] =  61.67830; daa[ 5*20+ 4] =   9.88179; 
+  daa[ 6*20+ 0] = 158.28500; daa[ 6*20+ 1] =  43.91570; daa[ 6*20+ 2] =  94.71980; 
+  daa[ 6*20+ 3] = 617.41600; daa[ 6*20+ 4] =   2.13520; daa[ 6*20+ 5] = 546.94700; 
+  daa[ 7*20+ 0] = 141.67200; daa[ 7*20+ 1] =  58.46650; daa[ 7*20+ 2] = 112.55600; 
+  daa[ 7*20+ 3] =  86.55840; daa[ 7*20+ 4] =  30.66740; daa[ 7*20+ 5] =  33.00520; 
+  daa[ 7*20+ 6] =  56.77170; daa[ 8*20+ 0] =  31.69540; daa[ 8*20+ 1] = 213.71500; 
+  daa[ 8*20+ 2] = 395.62900; daa[ 8*20+ 3] =  93.06760; daa[ 8*20+ 4] =  24.89720; 
+  daa[ 8*20+ 5] = 429.41100; daa[ 8*20+ 6] =  57.00250; daa[ 8*20+ 7] =  24.94100; 
+  daa[ 9*20+ 0] =  19.33350; daa[ 9*20+ 1] =  18.69790; daa[ 9*20+ 2] =  55.42360; 
+  daa[ 9*20+ 3] =   3.94370; daa[ 9*20+ 4] =  17.01350; daa[ 9*20+ 5] =  11.39170; 
+  daa[ 9*20+ 6] =  12.73950; daa[ 9*20+ 7] =   3.04501; daa[ 9*20+ 8] =  13.81900; 
+  daa[10*20+ 0] =  39.79150; daa[10*20+ 1] =  49.76710; daa[10*20+ 2] =  13.15280; 
+  daa[10*20+ 3] =   8.48047; daa[10*20+ 4] =  38.42870; daa[10*20+ 5] =  86.94890; 
+  daa[10*20+ 6] =  15.42630; daa[10*20+ 7] =   6.13037; daa[10*20+ 8] =  49.94620; 
+  daa[10*20+ 9] = 317.09700; daa[11*20+ 0] =  90.62650; daa[11*20+ 1] = 535.14200; 
+  daa[11*20+ 2] = 301.20100; daa[11*20+ 3] =  47.98550; daa[11*20+ 4] =   7.40339; 
+  daa[11*20+ 5] = 389.49000; daa[11*20+ 6] = 258.44300; daa[11*20+ 7] =  37.35580; 
+  daa[11*20+ 8] =  89.04320; daa[11*20+ 9] =  32.38320; daa[11*20+10] =  25.75550; 
+  daa[12*20+ 0] =  89.34960; daa[12*20+ 1] =  68.31620; daa[12*20+ 2] =  19.82210; 
+  daa[12*20+ 3] =  10.37540; daa[12*20+ 4] =  39.04820; daa[12*20+ 5] = 154.52600; 
+  daa[12*20+ 6] =  31.51240; daa[12*20+ 7] =  17.41000; daa[12*20+ 8] =  40.41410; 
+  daa[12*20+ 9] = 425.74600; daa[12*20+10] = 485.40200; daa[12*20+11] =  93.42760; 
+  daa[13*20+ 0] =  21.04940; daa[13*20+ 1] =  10.27110; daa[13*20+ 2] =   9.61621; 
+  daa[13*20+ 3] =   4.67304; daa[13*20+ 4] =  39.80200; daa[13*20+ 5] =   9.99208; 
+  daa[13*20+ 6] =   8.11339; daa[13*20+ 7] =   4.99310; daa[13*20+ 8] =  67.93710; 
+  daa[13*20+ 9] = 105.94700; daa[13*20+10] = 211.51700; daa[13*20+11] =   8.88360; 
+  daa[13*20+12] = 119.06300; daa[14*20+ 0] = 143.85500; daa[14*20+ 1] =  67.94890; 
+  daa[14*20+ 2] =  19.50810; daa[14*20+ 3] =  42.39840; daa[14*20+ 4] =  10.94040; 
+  daa[14*20+ 5] =  93.33720; daa[14*20+ 6] =  68.23550; daa[14*20+ 7] =  24.35700; 
+  daa[14*20+ 8] =  69.61980; daa[14*20+ 9] =   9.99288; daa[14*20+10] =  41.58440; 
+  daa[14*20+11] =  55.68960; daa[14*20+12] =  17.13290; daa[14*20+13] =  16.14440; 
+  daa[15*20+ 0] = 337.07900; daa[15*20+ 1] = 122.41900; daa[15*20+ 2] = 397.42300; 
+  daa[15*20+ 3] = 107.17600; daa[15*20+ 4] = 140.76600; daa[15*20+ 5] = 102.88700; 
+  daa[15*20+ 6] =  70.49390; daa[15*20+ 7] = 134.18200; daa[15*20+ 8] =  74.01690; 
+  daa[15*20+ 9] =  31.94400; daa[15*20+10] =  34.47390; daa[15*20+11] =  96.71300; 
+  daa[15*20+12] =  49.39050; daa[15*20+13] =  54.59310; daa[15*20+14] = 161.32800; 
+  daa[16*20+ 0] = 212.11100; daa[16*20+ 1] =  55.44130; daa[16*20+ 2] = 203.00600; 
+  daa[16*20+ 3] =  37.48660; daa[16*20+ 4] =  51.29840; daa[16*20+ 5] =  85.79280; 
+  daa[16*20+ 6] =  82.27650; daa[16*20+ 7] =  22.58330; daa[16*20+ 8] =  47.33070; 
+  daa[16*20+ 9] = 145.81600; daa[16*20+10] =  32.66220; daa[16*20+11] = 138.69800; 
+  daa[16*20+12] = 151.61200; daa[16*20+13] =  17.19030; daa[16*20+14] =  79.53840; 
+  daa[16*20+15] = 437.80200; daa[17*20+ 0] =  11.31330; daa[17*20+ 1] = 116.39200; 
+  daa[17*20+ 2] =   7.19167; daa[17*20+ 3] =  12.97670; daa[17*20+ 4] =  71.70700; 
+  daa[17*20+ 5] =  21.57370; daa[17*20+ 6] =  15.65570; daa[17*20+ 7] =  33.69830; 
+  daa[17*20+ 8] =  26.25690; daa[17*20+ 9] =  21.24830; daa[17*20+10] =  66.53090; 
+  daa[17*20+11] =  13.75050; daa[17*20+12] =  51.57060; daa[17*20+13] = 152.96400; 
+  daa[17*20+14] =  13.94050; daa[17*20+15] =  52.37420; daa[17*20+16] =  11.08640; 
+  daa[18*20+ 0] =  24.07350; daa[18*20+ 1] =  38.15330; daa[18*20+ 2] = 108.60000; 
+  daa[18*20+ 3] =  32.57110; daa[18*20+ 4] =  54.38330; daa[18*20+ 5] =  22.77100; 
+  daa[18*20+ 6] =  19.63030; daa[18*20+ 7] =  10.36040; daa[18*20+ 8] = 387.34400; 
+  daa[18*20+ 9] =  42.01700; daa[18*20+10] =  39.86180; daa[18*20+11] =  13.32640; 
+  daa[18*20+12] =  42.84370; daa[18*20+13] = 645.42800; daa[18*20+14] =  21.60460; 
+  daa[18*20+15] =  78.69930; daa[18*20+16] =  29.11480; daa[18*20+17] = 248.53900; 
+  daa[19*20+ 0] = 200.60100; daa[19*20+ 1] =  25.18490; daa[19*20+ 2] =  19.62460; 
+  daa[19*20+ 3] =  15.23350; daa[19*20+ 4] = 100.21400; daa[19*20+ 5] =  30.12810; 
+  daa[19*20+ 6] =  58.87310; daa[19*20+ 7] =  18.72470; daa[19*20+ 8] =  11.83580; 
+  daa[19*20+ 9] = 782.13000; daa[19*20+10] = 180.03400; daa[19*20+11] =  30.54340; 
+  daa[19*20+12] = 205.84500; daa[19*20+13] =  64.98920; daa[19*20+14] =  31.48870; 
+  daa[19*20+15] =  23.27390; daa[19*20+16] = 138.82300; daa[19*20+17] =  36.53690; 
+  daa[19*20+18] =  31.47300; 
+
+  /* initialize a 20x20 matrix */
+  for(i = 0; i < 20; i++)
+    for(j = 0; j < 20; j++)
+      q[i][j] = 0.0;
+
+  /* fill the triangle above the diagonal with the corresponding values from the
+     lower triangle */
+  for (i=0; i<20; i++)  
+    for (j=0; j<i; j++)               
+      daa[j*20+i] = daa[i*20+j];
+
+  /* copy the triangle above the diagonal from daa (which is a linear block) to
+     the triangle above the diagonal of a square matrix q */
+  for(i = 0; i < 19; i++)
+    for(j = i + 1; j < 20; j++)      
+      q[i][j] = daa[i * 20 + j];
+
+  
+  /*
+    for (i=0; i<20; i++) 
+    {
+      for (j=0; j<20; j++)
+	printf("%1.2f ", q[i][j]);
+      printf("\n");
+    }
+    printf("\n");
+
+    printf("%f\n", q[18][19]);
+  */
+
+  /* create a scaler from the last value (last row last column) of the upper
+     triangle of q */
+  scaler = 1.0 / q[18][19];
+
+  
+
+  /* scale all values of the matrix */
+  for(i = 0; i < 19; i++)
+    for(j = i + 1; j < 20; j++)      
+      q[i][j] *= scaler;
+
+  /* copy the upper triangle of q to the linear array ext_initialRates */
+  for(i = 0, r = 0; i < 19; i++)          
+    for(j = i + 1; j < 20; j++)      
+      ext_initialRates[r++] = q[i][j];           
+      
+  /*
+    for (i=0; i<20; i++) 
+    {
+      for (j=0; j<20; j++)
+	printf("%1.2f ", q[i][j]);
+      printf("\n");
+    }
+    printf("\n");
+  */
+
+}
+
+
+
+/** @brief Initialize protein substitution rates matrix 
+  * 
+  * Initialize the array pointed to by \a ext_initialRates with the substitution
+  * rates of the corresponding protein model and set f to the appropriate
+  * stationary frequencies
+  *
+  * @param f
+  *   Array where to store the stationary frequency rates
+  *
+  * @param proteinMatrix
+  *   Which protein matrix to use  
+  *
+  * @param ext_initialRates
+      Where to store the retrieved substitution rates
+  *
+  * @param lg4_index
+  *   In case we are filling a substitution rates matrix of an LG4 model the index
+  *   specifies which of the four matrixes to use 
+  *
+*/
+static void initProtMat(double f[20], int proteinMatrix, double *ext_initialRates, int lg4_index)
+{ 
+  double q[20][20];
+  double daa[400], max, temp;
+  int i, j, r;
+  double *initialRates = ext_initialRates;
+  double scaler;
+
+  {
+      switch(proteinMatrix)
+	{
+	case PLL_DAYHOFF:
+	  {	
+	    daa[ 1*20+ 0] =   27.00; daa[ 2*20+ 0] =   98.00; daa[ 2*20+ 1] =   32.00; daa[ 3*20+ 0] =  120.00;
+	    daa[ 3*20+ 1] =    0.00; daa[ 3*20+ 2] =  905.00; daa[ 4*20+ 0] =   36.00; daa[ 4*20+ 1] =   23.00;
+	    daa[ 4*20+ 2] =    0.00; daa[ 4*20+ 3] =    0.00; daa[ 5*20+ 0] =   89.00; daa[ 5*20+ 1] =  246.00;
+	    daa[ 5*20+ 2] =  103.00; daa[ 5*20+ 3] =  134.00; daa[ 5*20+ 4] =    0.00; daa[ 6*20+ 0] =  198.00;
+	    daa[ 6*20+ 1] =    1.00; daa[ 6*20+ 2] =  148.00; daa[ 6*20+ 3] = 1153.00; daa[ 6*20+ 4] =    0.00;
+	    daa[ 6*20+ 5] =  716.00; daa[ 7*20+ 0] =  240.00; daa[ 7*20+ 1] =    9.00; daa[ 7*20+ 2] =  139.00;
+	    daa[ 7*20+ 3] =  125.00; daa[ 7*20+ 4] =   11.00; daa[ 7*20+ 5] =   28.00; daa[ 7*20+ 6] =   81.00;
+	    daa[ 8*20+ 0] =   23.00; daa[ 8*20+ 1] =  240.00; daa[ 8*20+ 2] =  535.00; daa[ 8*20+ 3] =   86.00;
+	    daa[ 8*20+ 4] =   28.00; daa[ 8*20+ 5] =  606.00; daa[ 8*20+ 6] =   43.00; daa[ 8*20+ 7] =   10.00;
+	    daa[ 9*20+ 0] =   65.00; daa[ 9*20+ 1] =   64.00; daa[ 9*20+ 2] =   77.00; daa[ 9*20+ 3] =   24.00;
+	    daa[ 9*20+ 4] =   44.00; daa[ 9*20+ 5] =   18.00; daa[ 9*20+ 6] =   61.00; daa[ 9*20+ 7] =    0.00;
+	    daa[ 9*20+ 8] =    7.00; daa[10*20+ 0] =   41.00; daa[10*20+ 1] =   15.00; daa[10*20+ 2] =   34.00;
+	    daa[10*20+ 3] =    0.00; daa[10*20+ 4] =    0.00; daa[10*20+ 5] =   73.00; daa[10*20+ 6] =   11.00;
+	    daa[10*20+ 7] =    7.00; daa[10*20+ 8] =   44.00; daa[10*20+ 9] =  257.00; daa[11*20+ 0] =   26.00;
+	    daa[11*20+ 1] =  464.00; daa[11*20+ 2] =  318.00; daa[11*20+ 3] =   71.00; daa[11*20+ 4] =    0.00;
+	    daa[11*20+ 5] =  153.00; daa[11*20+ 6] =   83.00; daa[11*20+ 7] =   27.00; daa[11*20+ 8] =   26.00;
+	    daa[11*20+ 9] =   46.00; daa[11*20+10] =   18.00; daa[12*20+ 0] =   72.00; daa[12*20+ 1] =   90.00;
+	    daa[12*20+ 2] =    1.00; daa[12*20+ 3] =    0.00; daa[12*20+ 4] =    0.00; daa[12*20+ 5] =  114.00;
+	    daa[12*20+ 6] =   30.00; daa[12*20+ 7] =   17.00; daa[12*20+ 8] =    0.00; daa[12*20+ 9] =  336.00;
+	    daa[12*20+10] =  527.00; daa[12*20+11] =  243.00; daa[13*20+ 0] =   18.00; daa[13*20+ 1] =   14.00;
+	    daa[13*20+ 2] =   14.00; daa[13*20+ 3] =    0.00; daa[13*20+ 4] =    0.00; daa[13*20+ 5] =    0.00;
+	    daa[13*20+ 6] =    0.00; daa[13*20+ 7] =   15.00; daa[13*20+ 8] =   48.00; daa[13*20+ 9] =  196.00;
+	    daa[13*20+10] =  157.00; daa[13*20+11] =    0.00; daa[13*20+12] =   92.00; daa[14*20+ 0] =  250.00;
+	    daa[14*20+ 1] =  103.00; daa[14*20+ 2] =   42.00; daa[14*20+ 3] =   13.00; daa[14*20+ 4] =   19.00;
+	    daa[14*20+ 5] =  153.00; daa[14*20+ 6] =   51.00; daa[14*20+ 7] =   34.00; daa[14*20+ 8] =   94.00;
+	    daa[14*20+ 9] =   12.00; daa[14*20+10] =   32.00; daa[14*20+11] =   33.00; daa[14*20+12] =   17.00;
+	    daa[14*20+13] =   11.00; daa[15*20+ 0] =  409.00; daa[15*20+ 1] =  154.00; daa[15*20+ 2] =  495.00;
+	    daa[15*20+ 3] =   95.00; daa[15*20+ 4] =  161.00; daa[15*20+ 5] =   56.00; daa[15*20+ 6] =   79.00;
+	    daa[15*20+ 7] =  234.00; daa[15*20+ 8] =   35.00; daa[15*20+ 9] =   24.00; daa[15*20+10] =   17.00;
+	    daa[15*20+11] =   96.00; daa[15*20+12] =   62.00; daa[15*20+13] =   46.00; daa[15*20+14] =  245.00;
+	    daa[16*20+ 0] =  371.00; daa[16*20+ 1] =   26.00; daa[16*20+ 2] =  229.00; daa[16*20+ 3] =   66.00;
+	    daa[16*20+ 4] =   16.00; daa[16*20+ 5] =   53.00; daa[16*20+ 6] =   34.00; daa[16*20+ 7] =   30.00;
+	    daa[16*20+ 8] =   22.00; daa[16*20+ 9] =  192.00; daa[16*20+10] =   33.00; daa[16*20+11] =  136.00;
+	    daa[16*20+12] =  104.00; daa[16*20+13] =   13.00; daa[16*20+14] =   78.00; daa[16*20+15] =  550.00;
+	    daa[17*20+ 0] =    0.00; daa[17*20+ 1] =  201.00; daa[17*20+ 2] =   23.00; daa[17*20+ 3] =    0.00;
+	    daa[17*20+ 4] =    0.00; daa[17*20+ 5] =    0.00; daa[17*20+ 6] =    0.00; daa[17*20+ 7] =    0.00;
+	    daa[17*20+ 8] =   27.00; daa[17*20+ 9] =    0.00; daa[17*20+10] =   46.00; daa[17*20+11] =    0.00;
+	    daa[17*20+12] =    0.00; daa[17*20+13] =   76.00; daa[17*20+14] =    0.00; daa[17*20+15] =   75.00;
+	    daa[17*20+16] =    0.00; daa[18*20+ 0] =   24.00; daa[18*20+ 1] =    8.00; daa[18*20+ 2] =   95.00;
+	    daa[18*20+ 3] =    0.00; daa[18*20+ 4] =   96.00; daa[18*20+ 5] =    0.00; daa[18*20+ 6] =   22.00;
+	    daa[18*20+ 7] =    0.00; daa[18*20+ 8] =  127.00; daa[18*20+ 9] =   37.00; daa[18*20+10] =   28.00;
+	    daa[18*20+11] =   13.00; daa[18*20+12] =    0.00; daa[18*20+13] =  698.00; daa[18*20+14] =    0.00;
+	    daa[18*20+15] =   34.00; daa[18*20+16] =   42.00; daa[18*20+17] =   61.00; daa[19*20+ 0] =  208.00;
+	    daa[19*20+ 1] =   24.00; daa[19*20+ 2] =   15.00; daa[19*20+ 3] =   18.00; daa[19*20+ 4] =   49.00;
+	    daa[19*20+ 5] =   35.00; daa[19*20+ 6] =   37.00; daa[19*20+ 7] =   54.00; daa[19*20+ 8] =   44.00;
+	    daa[19*20+ 9] =  889.00; daa[19*20+10] =  175.00; daa[19*20+11] =   10.00; daa[19*20+12] =  258.00;
+	    daa[19*20+13] =   12.00; daa[19*20+14] =   48.00; daa[19*20+15] =   30.00; daa[19*20+16] =  157.00;
+	    daa[19*20+17] =    0.00; daa[19*20+18] =   28.00;	    	    
+
+
+	    f[ 0] = 0.087000; f[ 1] = 0.041000; f[ 2] = 0.040000; f[ 3] = 0.047000;
+	    f[ 4] = 0.034000; f[ 5] = 0.038000; f[ 6] = 0.050000; f[ 7] = 0.089000;
+	    f[ 8] = 0.034000; f[ 9] = 0.037000; f[10] = 0.085000; f[11] = 0.080000;
+	    f[12] = 0.014000; f[13] = 0.040000; f[14] = 0.051000; f[15] = 0.070000;
+	    f[16] = 0.058000; f[17] = 0.011000; f[18] = 0.030000; f[19] = 0.064000;
+	  }
+	  break;
+	case PLL_DCMUT:
+	  {	
+	    daa[ 1*20+ 0] =   26.78280; daa[ 2*20+ 0] =   98.44740; daa[ 2*20+ 1] =   32.70590; daa[ 3*20+ 0] =  119.98050; 
+	    daa[ 3*20+ 1] =    0.00000; daa[ 3*20+ 2] =  893.15150; daa[ 4*20+ 0] =   36.00160; daa[ 4*20+ 1] =   23.23740; 
+	    daa[ 4*20+ 2] =    0.00000; daa[ 4*20+ 3] =    0.00000; daa[ 5*20+ 0] =   88.77530; daa[ 5*20+ 1] =  243.99390; 
+	    daa[ 5*20+ 2] =  102.85090; daa[ 5*20+ 3] =  134.85510; daa[ 5*20+ 4] =    0.00000; daa[ 6*20+ 0] =  196.11670; 
+	    daa[ 6*20+ 1] =    0.00000; daa[ 6*20+ 2] =  149.34090; daa[ 6*20+ 3] = 1138.86590; daa[ 6*20+ 4] =    0.00000; 
+	    daa[ 6*20+ 5] =  708.60220; daa[ 7*20+ 0] =  238.61110; daa[ 7*20+ 1] =    8.77910; daa[ 7*20+ 2] =  138.53520; 
+	    daa[ 7*20+ 3] =  124.09810; daa[ 7*20+ 4] =   10.72780; daa[ 7*20+ 5] =   28.15810; daa[ 7*20+ 6] =   81.19070; 
+	    daa[ 8*20+ 0] =   22.81160; daa[ 8*20+ 1] =  238.31480; daa[ 8*20+ 2] =  529.00240; daa[ 8*20+ 3] =   86.82410; 
+	    daa[ 8*20+ 4] =   28.27290; daa[ 8*20+ 5] =  601.16130; daa[ 8*20+ 6] =   43.94690; daa[ 8*20+ 7] =   10.68020; 
+	    daa[ 9*20+ 0] =   65.34160; daa[ 9*20+ 1] =   63.26290; daa[ 9*20+ 2] =   76.80240; daa[ 9*20+ 3] =   23.92480; 
+	    daa[ 9*20+ 4] =   43.80740; daa[ 9*20+ 5] =   18.03930; daa[ 9*20+ 6] =   60.95260; daa[ 9*20+ 7] =    0.00000; 
+	    daa[ 9*20+ 8] =    7.69810; daa[10*20+ 0] =   40.64310; daa[10*20+ 1] =   15.49240; daa[10*20+ 2] =   34.11130; 
+	    daa[10*20+ 3] =    0.00000; daa[10*20+ 4] =    0.00000; daa[10*20+ 5] =   73.07720; daa[10*20+ 6] =   11.28800; 
+	    daa[10*20+ 7] =    7.15140; daa[10*20+ 8] =   44.35040; daa[10*20+ 9] =  255.66850; daa[11*20+ 0] =   25.86350; 
+	    daa[11*20+ 1] =  461.01240; daa[11*20+ 2] =  314.83710; daa[11*20+ 3] =   71.69130; daa[11*20+ 4] =    0.00000; 
+	    daa[11*20+ 5] =  151.90780; daa[11*20+ 6] =   83.00780; daa[11*20+ 7] =   26.76830; daa[11*20+ 8] =   27.04750; 
+	    daa[11*20+ 9] =   46.08570; daa[11*20+10] =   18.06290; daa[12*20+ 0] =   71.78400; daa[12*20+ 1] =   89.63210; 
+	    daa[12*20+ 2] =    0.00000; daa[12*20+ 3] =    0.00000; daa[12*20+ 4] =    0.00000; daa[12*20+ 5] =  112.74990; 
+	    daa[12*20+ 6] =   30.48030; daa[12*20+ 7] =   17.03720; daa[12*20+ 8] =    0.00000; daa[12*20+ 9] =  333.27320; 
+	    daa[12*20+10] =  523.01150; daa[12*20+11] =  241.17390; daa[13*20+ 0] =   18.36410; daa[13*20+ 1] =   13.69060; 
+	    daa[13*20+ 2] =   13.85030; daa[13*20+ 3] =    0.00000; daa[13*20+ 4] =    0.00000; daa[13*20+ 5] =    0.00000; 
+	    daa[13*20+ 6] =    0.00000; daa[13*20+ 7] =   15.34780; daa[13*20+ 8] =   47.59270; daa[13*20+ 9] =  195.19510; 
+	    daa[13*20+10] =  156.51600; daa[13*20+11] =    0.00000; daa[13*20+12] =   92.18600; daa[14*20+ 0] =  248.59200; 
+	    daa[14*20+ 1] =  102.83130; daa[14*20+ 2] =   41.92440; daa[14*20+ 3] =   13.39400; daa[14*20+ 4] =   18.75500; 
+	    daa[14*20+ 5] =  152.61880; daa[14*20+ 6] =   50.70030; daa[14*20+ 7] =   34.71530; daa[14*20+ 8] =   93.37090; 
+	    daa[14*20+ 9] =   11.91520; daa[14*20+10] =   31.62580; daa[14*20+11] =   33.54190; daa[14*20+12] =   17.02050; 
+	    daa[14*20+13] =   11.05060; daa[15*20+ 0] =  405.18700; daa[15*20+ 1] =  153.15900; daa[15*20+ 2] =  488.58920; 
+	    daa[15*20+ 3] =   95.60970; daa[15*20+ 4] =  159.83560; daa[15*20+ 5] =   56.18280; daa[15*20+ 6] =   79.39990; 
+	    daa[15*20+ 7] =  232.22430; daa[15*20+ 8] =   35.36430; daa[15*20+ 9] =   24.79550; daa[15*20+10] =   17.14320; 
+	    daa[15*20+11] =   95.45570; daa[15*20+12] =   61.99510; daa[15*20+13] =   45.99010; daa[15*20+14] =  242.72020; 
+	    daa[16*20+ 0] =  368.03650; daa[16*20+ 1] =   26.57450; daa[16*20+ 2] =  227.16970; daa[16*20+ 3] =   66.09300; 
+	    daa[16*20+ 4] =   16.23660; daa[16*20+ 5] =   52.56510; daa[16*20+ 6] =   34.01560; daa[16*20+ 7] =   30.66620; 
+	    daa[16*20+ 8] =   22.63330; daa[16*20+ 9] =  190.07390; daa[16*20+10] =   33.10900; daa[16*20+11] =  135.05990; 
+	    daa[16*20+12] =  103.15340; daa[16*20+13] =   13.66550; daa[16*20+14] =   78.28570; daa[16*20+15] =  543.66740; 
+	    daa[17*20+ 0] =    0.00000; daa[17*20+ 1] =  200.13750; daa[17*20+ 2] =   22.49680; daa[17*20+ 3] =    0.00000; 
+	    daa[17*20+ 4] =    0.00000; daa[17*20+ 5] =    0.00000; daa[17*20+ 6] =    0.00000; daa[17*20+ 7] =    0.00000; 
+	    daa[17*20+ 8] =   27.05640; daa[17*20+ 9] =    0.00000; daa[17*20+10] =   46.17760; daa[17*20+11] =    0.00000; 
+	    daa[17*20+12] =    0.00000; daa[17*20+13] =   76.23540; daa[17*20+14] =    0.00000; daa[17*20+15] =   74.08190; 
+	    daa[17*20+16] =    0.00000; daa[18*20+ 0] =   24.41390; daa[18*20+ 1] =    7.80120; daa[18*20+ 2] =   94.69400; 
+	    daa[18*20+ 3] =    0.00000; daa[18*20+ 4] =   95.31640; daa[18*20+ 5] =    0.00000; daa[18*20+ 6] =   21.47170; 
+	    daa[18*20+ 7] =    0.00000; daa[18*20+ 8] =  126.54000; daa[18*20+ 9] =   37.48340; daa[18*20+10] =   28.65720; 
+	    daa[18*20+11] =   13.21420; daa[18*20+12] =    0.00000; daa[18*20+13] =  695.26290; daa[18*20+14] =    0.00000; 
+	    daa[18*20+15] =   33.62890; daa[18*20+16] =   41.78390; daa[18*20+17] =   60.80700; daa[19*20+ 0] =  205.95640; 
+	    daa[19*20+ 1] =   24.03680; daa[19*20+ 2] =   15.80670; daa[19*20+ 3] =   17.83160; daa[19*20+ 4] =   48.46780; 
+	    daa[19*20+ 5] =   34.69830; daa[19*20+ 6] =   36.72500; daa[19*20+ 7] =   53.81650; daa[19*20+ 8] =   43.87150; 
+	    daa[19*20+ 9] =  881.00380; daa[19*20+10] =  174.51560; daa[19*20+11] =   10.38500; daa[19*20+12] =  256.59550; 
+	    daa[19*20+13] =   12.36060; daa[19*20+14] =   48.50260; daa[19*20+15] =   30.38360; daa[19*20+16] =  156.19970; 
+	    daa[19*20+17] =    0.00000; daa[19*20+18] =   27.93790;   	    	   
+
+	    f[ 0] = 0.08700; f[ 1] = 0.04100; f[ 2] = 0.04000; f[ 3] = 0.04700;
+	    f[ 4] = 0.03300; f[ 5] = 0.03800; f[ 6] = 0.04900; f[ 7] = 0.08900;
+	    f[ 8] = 0.03400; f[ 9] = 0.03700; f[10] = 0.08500; f[11] = 0.08000;
+	    f[12] = 0.01500; f[13] = 0.04000; f[14] = 0.05200; f[15] = 0.06900;
+	    f[16] = 0.05900; f[17] = 0.01000; f[18] = 0.03000; f[19] = 0.06500;
+
+	  }
+	  break;
+	case PLL_JTT:
+	  {
+	    daa[ 1*20+ 0] =   58.00; daa[ 2*20+ 0] =   54.00; daa[ 2*20+ 1] =   45.00; daa[ 3*20+ 0] =   81.00;
+	    daa[ 3*20+ 1] =   16.00; daa[ 3*20+ 2] =  528.00; daa[ 4*20+ 0] =   56.00; daa[ 4*20+ 1] =  113.00;
+	    daa[ 4*20+ 2] =   34.00; daa[ 4*20+ 3] =   10.00; daa[ 5*20+ 0] =   57.00; daa[ 5*20+ 1] =  310.00;
+	    daa[ 5*20+ 2] =   86.00; daa[ 5*20+ 3] =   49.00; daa[ 5*20+ 4] =    9.00; daa[ 6*20+ 0] =  105.00;
+	    daa[ 6*20+ 1] =   29.00; daa[ 6*20+ 2] =   58.00; daa[ 6*20+ 3] =  767.00; daa[ 6*20+ 4] =    5.00;
+	    daa[ 6*20+ 5] =  323.00; daa[ 7*20+ 0] =  179.00; daa[ 7*20+ 1] =  137.00; daa[ 7*20+ 2] =   81.00;
+	    daa[ 7*20+ 3] =  130.00; daa[ 7*20+ 4] =   59.00; daa[ 7*20+ 5] =   26.00; daa[ 7*20+ 6] =  119.00;
+	    daa[ 8*20+ 0] =   27.00; daa[ 8*20+ 1] =  328.00; daa[ 8*20+ 2] =  391.00; daa[ 8*20+ 3] =  112.00;
+	    daa[ 8*20+ 4] =   69.00; daa[ 8*20+ 5] =  597.00; daa[ 8*20+ 6] =   26.00; daa[ 8*20+ 7] =   23.00;
+	    daa[ 9*20+ 0] =   36.00; daa[ 9*20+ 1] =   22.00; daa[ 9*20+ 2] =   47.00; daa[ 9*20+ 3] =   11.00;
+	    daa[ 9*20+ 4] =   17.00; daa[ 9*20+ 5] =    9.00; daa[ 9*20+ 6] =   12.00; daa[ 9*20+ 7] =    6.00;
+	    daa[ 9*20+ 8] =   16.00; daa[10*20+ 0] =   30.00; daa[10*20+ 1] =   38.00; daa[10*20+ 2] =   12.00;
+	    daa[10*20+ 3] =    7.00; daa[10*20+ 4] =   23.00; daa[10*20+ 5] =   72.00; daa[10*20+ 6] =    9.00;
+	    daa[10*20+ 7] =    6.00; daa[10*20+ 8] =   56.00; daa[10*20+ 9] =  229.00; daa[11*20+ 0] =   35.00;
+	    daa[11*20+ 1] =  646.00; daa[11*20+ 2] =  263.00; daa[11*20+ 3] =   26.00; daa[11*20+ 4] =    7.00;
+	    daa[11*20+ 5] =  292.00; daa[11*20+ 6] =  181.00; daa[11*20+ 7] =   27.00; daa[11*20+ 8] =   45.00;
+	    daa[11*20+ 9] =   21.00; daa[11*20+10] =   14.00; daa[12*20+ 0] =   54.00; daa[12*20+ 1] =   44.00;
+	    daa[12*20+ 2] =   30.00; daa[12*20+ 3] =   15.00; daa[12*20+ 4] =   31.00; daa[12*20+ 5] =   43.00;
+	    daa[12*20+ 6] =   18.00; daa[12*20+ 7] =   14.00; daa[12*20+ 8] =   33.00; daa[12*20+ 9] =  479.00;
+	    daa[12*20+10] =  388.00; daa[12*20+11] =   65.00; daa[13*20+ 0] =   15.00; daa[13*20+ 1] =    5.00;
+	    daa[13*20+ 2] =   10.00; daa[13*20+ 3] =    4.00; daa[13*20+ 4] =   78.00; daa[13*20+ 5] =    4.00;
+	    daa[13*20+ 6] =    5.00; daa[13*20+ 7] =    5.00; daa[13*20+ 8] =   40.00; daa[13*20+ 9] =   89.00;
+	    daa[13*20+10] =  248.00; daa[13*20+11] =    4.00; daa[13*20+12] =   43.00; daa[14*20+ 0] =  194.00;
+	    daa[14*20+ 1] =   74.00; daa[14*20+ 2] =   15.00; daa[14*20+ 3] =   15.00; daa[14*20+ 4] =   14.00;
+	    daa[14*20+ 5] =  164.00; daa[14*20+ 6] =   18.00; daa[14*20+ 7] =   24.00; daa[14*20+ 8] =  115.00;
+	    daa[14*20+ 9] =   10.00; daa[14*20+10] =  102.00; daa[14*20+11] =   21.00; daa[14*20+12] =   16.00;
+	    daa[14*20+13] =   17.00; daa[15*20+ 0] =  378.00; daa[15*20+ 1] =  101.00; daa[15*20+ 2] =  503.00;
+	    daa[15*20+ 3] =   59.00; daa[15*20+ 4] =  223.00; daa[15*20+ 5] =   53.00; daa[15*20+ 6] =   30.00;
+	    daa[15*20+ 7] =  201.00; daa[15*20+ 8] =   73.00; daa[15*20+ 9] =   40.00; daa[15*20+10] =   59.00;
+	    daa[15*20+11] =   47.00; daa[15*20+12] =   29.00; daa[15*20+13] =   92.00; daa[15*20+14] =  285.00;
+	    daa[16*20+ 0] =  475.00; daa[16*20+ 1] =   64.00; daa[16*20+ 2] =  232.00; daa[16*20+ 3] =   38.00;
+	    daa[16*20+ 4] =   42.00; daa[16*20+ 5] =   51.00; daa[16*20+ 6] =   32.00; daa[16*20+ 7] =   33.00;
+	    daa[16*20+ 8] =   46.00; daa[16*20+ 9] =  245.00; daa[16*20+10] =   25.00; daa[16*20+11] =  103.00;
+	    daa[16*20+12] =  226.00; daa[16*20+13] =   12.00; daa[16*20+14] =  118.00; daa[16*20+15] =  477.00;
+	    daa[17*20+ 0] =    9.00; daa[17*20+ 1] =  126.00; daa[17*20+ 2] =    8.00; daa[17*20+ 3] =    4.00;
+	    daa[17*20+ 4] =  115.00; daa[17*20+ 5] =   18.00; daa[17*20+ 6] =   10.00; daa[17*20+ 7] =   55.00;
+	    daa[17*20+ 8] =    8.00; daa[17*20+ 9] =    9.00; daa[17*20+10] =   52.00; daa[17*20+11] =   10.00;
+	    daa[17*20+12] =   24.00; daa[17*20+13] =   53.00; daa[17*20+14] =    6.00; daa[17*20+15] =   35.00;
+	    daa[17*20+16] =   12.00; daa[18*20+ 0] =   11.00; daa[18*20+ 1] =   20.00; daa[18*20+ 2] =   70.00;
+	    daa[18*20+ 3] =   46.00; daa[18*20+ 4] =  209.00; daa[18*20+ 5] =   24.00; daa[18*20+ 6] =    7.00;
+	    daa[18*20+ 7] =    8.00; daa[18*20+ 8] =  573.00; daa[18*20+ 9] =   32.00; daa[18*20+10] =   24.00;
+	    daa[18*20+11] =    8.00; daa[18*20+12] =   18.00; daa[18*20+13] =  536.00; daa[18*20+14] =   10.00;
+	    daa[18*20+15] =   63.00; daa[18*20+16] =   21.00; daa[18*20+17] =   71.00; daa[19*20+ 0] =  298.00;
+	    daa[19*20+ 1] =   17.00; daa[19*20+ 2] =   16.00; daa[19*20+ 3] =   31.00; daa[19*20+ 4] =   62.00;
+	    daa[19*20+ 5] =   20.00; daa[19*20+ 6] =   45.00; daa[19*20+ 7] =   47.00; daa[19*20+ 8] =   11.00;
+	    daa[19*20+ 9] =  961.00; daa[19*20+10] =  180.00; daa[19*20+11] =   14.00; daa[19*20+12] =  323.00;
+	    daa[19*20+13] =   62.00; daa[19*20+14] =   23.00; daa[19*20+15] =   38.00; daa[19*20+16] =  112.00;
+	    daa[19*20+17] =   25.00; daa[19*20+18] =   16.00;
+	    	    
+	    f[ 0] = 0.07700; f[ 1] = 0.05200; f[ 2] = 0.04200; f[ 3] = 0.05100;
+	    f[ 4] = 0.02000; f[ 5] = 0.04100; f[ 6] = 0.06200; f[ 7] = 0.07300;
+	    f[ 8] = 0.02300; f[ 9] = 0.05400; f[10] = 0.09200; f[11] = 0.05900;
+	    f[12] = 0.02400; f[13] = 0.04000; f[14] = 0.05100; f[15] = 0.06900;
+	    f[16] = 0.05800; f[17] = 0.01400; f[18] = 0.03200; f[19] = 0.06600;
+	  }
+	  break;
+	case  PLL_MTREV:
+	  {
+	    daa[ 1*20+ 0] =   23.18; daa[ 2*20+ 0] =   26.95; daa[ 2*20+ 1] =   13.24; daa[ 3*20+ 0] =   17.67;
+	    daa[ 3*20+ 1] =    1.90; daa[ 3*20+ 2] =  794.38; daa[ 4*20+ 0] =   59.93; daa[ 4*20+ 1] =  103.33;
+	    daa[ 4*20+ 2] =   58.94; daa[ 4*20+ 3] =    1.90; daa[ 5*20+ 0] =    1.90; daa[ 5*20+ 1] =  220.99;
+	    daa[ 5*20+ 2] =  173.56; daa[ 5*20+ 3] =   55.28; daa[ 5*20+ 4] =   75.24; daa[ 6*20+ 0] =    9.77;
+	    daa[ 6*20+ 1] =    1.90; daa[ 6*20+ 2] =   63.05; daa[ 6*20+ 3] =  583.55; daa[ 6*20+ 4] =    1.90;
+	    daa[ 6*20+ 5] =  313.56; daa[ 7*20+ 0] =  120.71; daa[ 7*20+ 1] =   23.03; daa[ 7*20+ 2] =   53.30;
+	    daa[ 7*20+ 3] =   56.77; daa[ 7*20+ 4] =   30.71; daa[ 7*20+ 5] =    6.75; daa[ 7*20+ 6] =   28.28;
+	    daa[ 8*20+ 0] =   13.90; daa[ 8*20+ 1] =  165.23; daa[ 8*20+ 2] =  496.13; daa[ 8*20+ 3] =  113.99;
+	    daa[ 8*20+ 4] =  141.49; daa[ 8*20+ 5] =  582.40; daa[ 8*20+ 6] =   49.12; daa[ 8*20+ 7] =    1.90;
+	    daa[ 9*20+ 0] =   96.49; daa[ 9*20+ 1] =    1.90; daa[ 9*20+ 2] =   27.10; daa[ 9*20+ 3] =    4.34;
+	    daa[ 9*20+ 4] =   62.73; daa[ 9*20+ 5] =    8.34; daa[ 9*20+ 6] =    3.31; daa[ 9*20+ 7] =    5.98;
+	    daa[ 9*20+ 8] =   12.26; daa[10*20+ 0] =   25.46; daa[10*20+ 1] =   15.58; daa[10*20+ 2] =   15.16;
+	    daa[10*20+ 3] =    1.90; daa[10*20+ 4] =   25.65; daa[10*20+ 5] =   39.70; daa[10*20+ 6] =    1.90;
+	    daa[10*20+ 7] =    2.41; daa[10*20+ 8] =   11.49; daa[10*20+ 9] =  329.09; daa[11*20+ 0] =    8.36;
+	    daa[11*20+ 1] =  141.40; daa[11*20+ 2] =  608.70; daa[11*20+ 3] =    2.31; daa[11*20+ 4] =    1.90;
+	    daa[11*20+ 5] =  465.58; daa[11*20+ 6] =  313.86; daa[11*20+ 7] =   22.73; daa[11*20+ 8] =  127.67;
+	    daa[11*20+ 9] =   19.57; daa[11*20+10] =   14.88; daa[12*20+ 0] =  141.88; daa[12*20+ 1] =    1.90;
+	    daa[12*20+ 2] =   65.41; daa[12*20+ 3] =    1.90; daa[12*20+ 4] =    6.18; daa[12*20+ 5] =   47.37;
+	    daa[12*20+ 6] =    1.90; daa[12*20+ 7] =    1.90; daa[12*20+ 8] =   11.97; daa[12*20+ 9] =  517.98;
+	    daa[12*20+10] =  537.53; daa[12*20+11] =   91.37; daa[13*20+ 0] =    6.37; daa[13*20+ 1] =    4.69;
+	    daa[13*20+ 2] =   15.20; daa[13*20+ 3] =    4.98; daa[13*20+ 4] =   70.80; daa[13*20+ 5] =   19.11;
+	    daa[13*20+ 6] =    2.67; daa[13*20+ 7] =    1.90; daa[13*20+ 8] =   48.16; daa[13*20+ 9] =   84.67;
+	    daa[13*20+10] =  216.06; daa[13*20+11] =    6.44; daa[13*20+12] =   90.82; daa[14*20+ 0] =   54.31;
+	    daa[14*20+ 1] =   23.64; daa[14*20+ 2] =   73.31; daa[14*20+ 3] =   13.43; daa[14*20+ 4] =   31.26;
+	    daa[14*20+ 5] =  137.29; daa[14*20+ 6] =   12.83; daa[14*20+ 7] =    1.90; daa[14*20+ 8] =   60.97;
+	    daa[14*20+ 9] =   20.63; daa[14*20+10] =   40.10; daa[14*20+11] =   50.10; daa[14*20+12] =   18.84;
+	    daa[14*20+13] =   17.31; daa[15*20+ 0] =  387.86; daa[15*20+ 1] =    6.04; daa[15*20+ 2] =  494.39;
+	    daa[15*20+ 3] =   69.02; daa[15*20+ 4] =  277.05; daa[15*20+ 5] =   54.11; daa[15*20+ 6] =   54.71;
+	    daa[15*20+ 7] =  125.93; daa[15*20+ 8] =   77.46; daa[15*20+ 9] =   47.70; daa[15*20+10] =   73.61;
+	    daa[15*20+11] =  105.79; daa[15*20+12] =  111.16; daa[15*20+13] =   64.29; daa[15*20+14] =  169.90;
+	    daa[16*20+ 0] =  480.72; daa[16*20+ 1] =    2.08; daa[16*20+ 2] =  238.46; daa[16*20+ 3] =   28.01;
+	    daa[16*20+ 4] =  179.97; daa[16*20+ 5] =   94.93; daa[16*20+ 6] =   14.82; daa[16*20+ 7] =   11.17;
+	    daa[16*20+ 8] =   44.78; daa[16*20+ 9] =  368.43; daa[16*20+10] =  126.40; daa[16*20+11] =  136.33;
+	    daa[16*20+12] =  528.17; daa[16*20+13] =   33.85; daa[16*20+14] =  128.22; daa[16*20+15] =  597.21;
+	    daa[17*20+ 0] =    1.90; daa[17*20+ 1] =   21.95; daa[17*20+ 2] =   10.68; daa[17*20+ 3] =   19.86;
+	    daa[17*20+ 4] =   33.60; daa[17*20+ 5] =    1.90; daa[17*20+ 6] =    1.90; daa[17*20+ 7] =   10.92;
+	    daa[17*20+ 8] =    7.08; daa[17*20+ 9] =    1.90; daa[17*20+10] =   32.44; daa[17*20+11] =   24.00;
+	    daa[17*20+12] =   21.71; daa[17*20+13] =    7.84; daa[17*20+14] =    4.21; daa[17*20+15] =   38.58;
+	    daa[17*20+16] =    9.99; daa[18*20+ 0] =    6.48; daa[18*20+ 1] =    1.90; daa[18*20+ 2] =  191.36;
+	    daa[18*20+ 3] =   21.21; daa[18*20+ 4] =  254.77; daa[18*20+ 5] =   38.82; daa[18*20+ 6] =   13.12;
+	    daa[18*20+ 7] =    3.21; daa[18*20+ 8] =  670.14; daa[18*20+ 9] =   25.01; daa[18*20+10] =   44.15;
+	    daa[18*20+11] =   51.17; daa[18*20+12] =   39.96; daa[18*20+13] =  465.58; daa[18*20+14] =   16.21;
+	    daa[18*20+15] =   64.92; daa[18*20+16] =   38.73; daa[18*20+17] =   26.25; daa[19*20+ 0] =  195.06;
+	    daa[19*20+ 1] =    7.64; daa[19*20+ 2] =    1.90; daa[19*20+ 3] =    1.90; daa[19*20+ 4] =    1.90;
+	    daa[19*20+ 5] =   19.00; daa[19*20+ 6] =   21.14; daa[19*20+ 7] =    2.53; daa[19*20+ 8] =    1.90;
+	    daa[19*20+ 9] = 1222.94; daa[19*20+10] =   91.67; daa[19*20+11] =    1.90; daa[19*20+12] =  387.54;
+	    daa[19*20+13] =    6.35; daa[19*20+14] =    8.23; daa[19*20+15] =    1.90; daa[19*20+16] =  204.54;
+	    daa[19*20+17] =    5.37; daa[19*20+18] =    1.90;
+	    
+	    
+	    f[ 0] = 0.072000; f[ 1] = 0.019000; f[ 2] = 0.039000; f[ 3] = 0.019000;
+	    f[ 4] = 0.006000; f[ 5] = 0.025000; f[ 6] = 0.024000; f[ 7] = 0.056000;
+	    f[ 8] = 0.028000; f[ 9] = 0.088000; f[10] = 0.169000; f[11] = 0.023000;
+	    f[12] = 0.054000; f[13] = 0.061000; f[14] = 0.054000; f[15] = 0.072000;
+	    f[16] = 0.086000; f[17] = 0.029000; f[18] = 0.033000; f[19] = 0.043000;
+	  }
+	  break;
+	case PLL_WAG:
+	  {
+	    daa[ 1*20+ 0] =  55.15710; daa[ 2*20+ 0] =  50.98480; daa[ 2*20+ 1] =  63.53460; 
+	    daa[ 3*20+ 0] =  73.89980; daa[ 3*20+ 1] =  14.73040; daa[ 3*20+ 2] = 542.94200; 
+	    daa[ 4*20+ 0] = 102.70400; daa[ 4*20+ 1] =  52.81910; daa[ 4*20+ 2] =  26.52560; 
+	    daa[ 4*20+ 3] =   3.02949; daa[ 5*20+ 0] =  90.85980; daa[ 5*20+ 1] = 303.55000; 
+	    daa[ 5*20+ 2] = 154.36400; daa[ 5*20+ 3] =  61.67830; daa[ 5*20+ 4] =   9.88179; 
+	    daa[ 6*20+ 0] = 158.28500; daa[ 6*20+ 1] =  43.91570; daa[ 6*20+ 2] =  94.71980; 
+	    daa[ 6*20+ 3] = 617.41600; daa[ 6*20+ 4] =   2.13520; daa[ 6*20+ 5] = 546.94700; 
+	    daa[ 7*20+ 0] = 141.67200; daa[ 7*20+ 1] =  58.46650; daa[ 7*20+ 2] = 112.55600; 
+	    daa[ 7*20+ 3] =  86.55840; daa[ 7*20+ 4] =  30.66740; daa[ 7*20+ 5] =  33.00520; 
+	    daa[ 7*20+ 6] =  56.77170; daa[ 8*20+ 0] =  31.69540; daa[ 8*20+ 1] = 213.71500; 
+	    daa[ 8*20+ 2] = 395.62900; daa[ 8*20+ 3] =  93.06760; daa[ 8*20+ 4] =  24.89720; 
+	    daa[ 8*20+ 5] = 429.41100; daa[ 8*20+ 6] =  57.00250; daa[ 8*20+ 7] =  24.94100; 
+	    daa[ 9*20+ 0] =  19.33350; daa[ 9*20+ 1] =  18.69790; daa[ 9*20+ 2] =  55.42360; 
+	    daa[ 9*20+ 3] =   3.94370; daa[ 9*20+ 4] =  17.01350; daa[ 9*20+ 5] =  11.39170; 
+	    daa[ 9*20+ 6] =  12.73950; daa[ 9*20+ 7] =   3.04501; daa[ 9*20+ 8] =  13.81900; 
+	    daa[10*20+ 0] =  39.79150; daa[10*20+ 1] =  49.76710; daa[10*20+ 2] =  13.15280; 
+	    daa[10*20+ 3] =   8.48047; daa[10*20+ 4] =  38.42870; daa[10*20+ 5] =  86.94890; 
+	    daa[10*20+ 6] =  15.42630; daa[10*20+ 7] =   6.13037; daa[10*20+ 8] =  49.94620; 
+	    daa[10*20+ 9] = 317.09700; daa[11*20+ 0] =  90.62650; daa[11*20+ 1] = 535.14200; 
+	    daa[11*20+ 2] = 301.20100; daa[11*20+ 3] =  47.98550; daa[11*20+ 4] =   7.40339; 
+	    daa[11*20+ 5] = 389.49000; daa[11*20+ 6] = 258.44300; daa[11*20+ 7] =  37.35580; 
+	    daa[11*20+ 8] =  89.04320; daa[11*20+ 9] =  32.38320; daa[11*20+10] =  25.75550; 
+	    daa[12*20+ 0] =  89.34960; daa[12*20+ 1] =  68.31620; daa[12*20+ 2] =  19.82210; 
+	    daa[12*20+ 3] =  10.37540; daa[12*20+ 4] =  39.04820; daa[12*20+ 5] = 154.52600; 
+	    daa[12*20+ 6] =  31.51240; daa[12*20+ 7] =  17.41000; daa[12*20+ 8] =  40.41410; 
+	    daa[12*20+ 9] = 425.74600; daa[12*20+10] = 485.40200; daa[12*20+11] =  93.42760; 
+	    daa[13*20+ 0] =  21.04940; daa[13*20+ 1] =  10.27110; daa[13*20+ 2] =   9.61621; 
+	    daa[13*20+ 3] =   4.67304; daa[13*20+ 4] =  39.80200; daa[13*20+ 5] =   9.99208; 
+	    daa[13*20+ 6] =   8.11339; daa[13*20+ 7] =   4.99310; daa[13*20+ 8] =  67.93710; 
+	    daa[13*20+ 9] = 105.94700; daa[13*20+10] = 211.51700; daa[13*20+11] =   8.88360; 
+	    daa[13*20+12] = 119.06300; daa[14*20+ 0] = 143.85500; daa[14*20+ 1] =  67.94890; 
+	    daa[14*20+ 2] =  19.50810; daa[14*20+ 3] =  42.39840; daa[14*20+ 4] =  10.94040; 
+	    daa[14*20+ 5] =  93.33720; daa[14*20+ 6] =  68.23550; daa[14*20+ 7] =  24.35700; 
+	    daa[14*20+ 8] =  69.61980; daa[14*20+ 9] =   9.99288; daa[14*20+10] =  41.58440; 
+	    daa[14*20+11] =  55.68960; daa[14*20+12] =  17.13290; daa[14*20+13] =  16.14440; 
+	    daa[15*20+ 0] = 337.07900; daa[15*20+ 1] = 122.41900; daa[15*20+ 2] = 397.42300; 
+	    daa[15*20+ 3] = 107.17600; daa[15*20+ 4] = 140.76600; daa[15*20+ 5] = 102.88700; 
+	    daa[15*20+ 6] =  70.49390; daa[15*20+ 7] = 134.18200; daa[15*20+ 8] =  74.01690; 
+	    daa[15*20+ 9] =  31.94400; daa[15*20+10] =  34.47390; daa[15*20+11] =  96.71300; 
+	    daa[15*20+12] =  49.39050; daa[15*20+13] =  54.59310; daa[15*20+14] = 161.32800; 
+	    daa[16*20+ 0] = 212.11100; daa[16*20+ 1] =  55.44130; daa[16*20+ 2] = 203.00600; 
+	    daa[16*20+ 3] =  37.48660; daa[16*20+ 4] =  51.29840; daa[16*20+ 5] =  85.79280; 
+	    daa[16*20+ 6] =  82.27650; daa[16*20+ 7] =  22.58330; daa[16*20+ 8] =  47.33070; 
+	    daa[16*20+ 9] = 145.81600; daa[16*20+10] =  32.66220; daa[16*20+11] = 138.69800; 
+	    daa[16*20+12] = 151.61200; daa[16*20+13] =  17.19030; daa[16*20+14] =  79.53840; 
+	    daa[16*20+15] = 437.80200; daa[17*20+ 0] =  11.31330; daa[17*20+ 1] = 116.39200; 
+	    daa[17*20+ 2] =   7.19167; daa[17*20+ 3] =  12.97670; daa[17*20+ 4] =  71.70700; 
+	    daa[17*20+ 5] =  21.57370; daa[17*20+ 6] =  15.65570; daa[17*20+ 7] =  33.69830; 
+	    daa[17*20+ 8] =  26.25690; daa[17*20+ 9] =  21.24830; daa[17*20+10] =  66.53090; 
+	    daa[17*20+11] =  13.75050; daa[17*20+12] =  51.57060; daa[17*20+13] = 152.96400; 
+	    daa[17*20+14] =  13.94050; daa[17*20+15] =  52.37420; daa[17*20+16] =  11.08640; 
+	    daa[18*20+ 0] =  24.07350; daa[18*20+ 1] =  38.15330; daa[18*20+ 2] = 108.60000; 
+	    daa[18*20+ 3] =  32.57110; daa[18*20+ 4] =  54.38330; daa[18*20+ 5] =  22.77100; 
+	    daa[18*20+ 6] =  19.63030; daa[18*20+ 7] =  10.36040; daa[18*20+ 8] = 387.34400; 
+	    daa[18*20+ 9] =  42.01700; daa[18*20+10] =  39.86180; daa[18*20+11] =  13.32640; 
+	    daa[18*20+12] =  42.84370; daa[18*20+13] = 645.42800; daa[18*20+14] =  21.60460; 
+	    daa[18*20+15] =  78.69930; daa[18*20+16] =  29.11480; daa[18*20+17] = 248.53900; 
+	    daa[19*20+ 0] = 200.60100; daa[19*20+ 1] =  25.18490; daa[19*20+ 2] =  19.62460; 
+	    daa[19*20+ 3] =  15.23350; daa[19*20+ 4] = 100.21400; daa[19*20+ 5] =  30.12810; 
+	    daa[19*20+ 6] =  58.87310; daa[19*20+ 7] =  18.72470; daa[19*20+ 8] =  11.83580; 
+	    daa[19*20+ 9] = 782.13000; daa[19*20+10] = 180.03400; daa[19*20+11] =  30.54340; 
+	    daa[19*20+12] = 205.84500; daa[19*20+13] =  64.98920; daa[19*20+14] =  31.48870; 
+	    daa[19*20+15] =  23.27390; daa[19*20+16] = 138.82300; daa[19*20+17] =  36.53690; 
+	    daa[19*20+18] =  31.47300; 
+	    	   
+	    f[0]  = 0.08700; f[1]  = 0.04400; f[2]  = 0.03900; f[3]  = 0.05700;
+	    f[4]  = 0.01900; f[5]  = 0.03700; f[6]  = 0.05800; f[7]  = 0.08300;
+	    f[8]  = 0.02400; f[9]  = 0.04900; f[10] = 0.08600; f[11] = 0.06200;
+	    f[12] = 0.02000; f[13] = 0.03800; f[14] = 0.04600; f[15] = 0.07000;
+	    f[16] = 0.06100; f[17] = 0.01400; f[18] = 0.03500; f[19] = 0.07100;   
+	  }
+	  break;
+	case PLL_RTREV:
+	  {
+	    daa[1*20+0]= 34;         daa[2*20+0]= 51;         daa[2*20+1]= 35;         daa[3*20+0]= 10;         
+	    daa[3*20+1]= 30;         daa[3*20+2]= 384;        daa[4*20+0]= 439;        daa[4*20+1]= 92;         
+	    daa[4*20+2]= 128;        daa[4*20+3]= 1;          daa[5*20+0]= 32;         daa[5*20+1]= 221;        
+	    daa[5*20+2]= 236;        daa[5*20+3]= 78;         daa[5*20+4]= 70;         daa[6*20+0]= 81;         
+	    daa[6*20+1]= 10;         daa[6*20+2]= 79;         daa[6*20+3]= 542;        daa[6*20+4]= 1;          
+	    daa[6*20+5]= 372;        daa[7*20+0]= 135;        daa[7*20+1]= 41;         daa[7*20+2]= 94;         
+	    daa[7*20+3]= 61;         daa[7*20+4]= 48;         daa[7*20+5]= 18;         daa[7*20+6]= 70;         
+	    daa[8*20+0]= 30;         daa[8*20+1]= 90;         daa[8*20+2]= 320;        daa[8*20+3]= 91;         
+	    daa[8*20+4]= 124;        daa[8*20+5]= 387;        daa[8*20+6]= 34;         daa[8*20+7]= 68;         
+	    daa[9*20+0]= 1;          daa[9*20+1]= 24;         daa[9*20+2]= 35;         daa[9*20+3]= 1;          
+	    daa[9*20+4]= 104;        daa[9*20+5]= 33;         daa[9*20+6]= 1;          daa[9*20+7]= 1;          
+	    daa[9*20+8]= 34;         daa[10*20+0]= 45;        daa[10*20+1]= 18;        daa[10*20+2]= 15;        
+	    daa[10*20+3]= 5;         daa[10*20+4]= 110;       daa[10*20+5]= 54;        daa[10*20+6]= 21;        
+	    daa[10*20+7]= 3;         daa[10*20+8]= 51;        daa[10*20+9]= 385;       daa[11*20+0]= 38;        
+	    daa[11*20+1]= 593;       daa[11*20+2]= 123;       daa[11*20+3]= 20;        daa[11*20+4]= 16;        
+	    daa[11*20+5]= 309;       daa[11*20+6]= 141;       daa[11*20+7]= 30;        daa[11*20+8]= 76;        
+	    daa[11*20+9]= 34;        daa[11*20+10]= 23;       daa[12*20+0]= 235;       daa[12*20+1]= 57;        
+	    daa[12*20+2]= 1;         daa[12*20+3]= 1;         daa[12*20+4]= 156;       daa[12*20+5]= 158;       
+	    daa[12*20+6]= 1;         daa[12*20+7]= 37;        daa[12*20+8]= 116;       daa[12*20+9]= 375;       
+	    daa[12*20+10]= 581;      daa[12*20+11]= 134;      daa[13*20+0]= 1;         daa[13*20+1]= 7;         
+	    daa[13*20+2]= 49;        daa[13*20+3]= 1;         daa[13*20+4]= 70;        daa[13*20+5]= 1;         
+	    daa[13*20+6]= 1;         daa[13*20+7]= 7;         daa[13*20+8]= 141;       daa[13*20+9]= 64;        
+	    daa[13*20+10]= 179;      daa[13*20+11]= 14;       daa[13*20+12]= 247;      daa[14*20+0]= 97;        
+	    daa[14*20+1]= 24;        daa[14*20+2]= 33;        daa[14*20+3]= 55;        daa[14*20+4]= 1;         
+	    daa[14*20+5]= 68;        daa[14*20+6]= 52;        daa[14*20+7]= 17;        daa[14*20+8]= 44;        
+	    daa[14*20+9]= 10;        daa[14*20+10]= 22;       daa[14*20+11]= 43;       daa[14*20+12]= 1;        
+	    daa[14*20+13]= 11;       daa[15*20+0]= 460;       daa[15*20+1]= 102;       daa[15*20+2]= 294;       
+	    daa[15*20+3]= 136;       daa[15*20+4]= 75;        daa[15*20+5]= 225;       daa[15*20+6]= 95;        
+	    daa[15*20+7]= 152;       daa[15*20+8]= 183;       daa[15*20+9]= 4;         daa[15*20+10]= 24;       
+	    daa[15*20+11]= 77;       daa[15*20+12]= 1;        daa[15*20+13]= 20;       daa[15*20+14]= 134;      
+	    daa[16*20+0]= 258;       daa[16*20+1]= 64;        daa[16*20+2]= 148;       daa[16*20+3]= 55;        
+	    daa[16*20+4]= 117;       daa[16*20+5]= 146;       daa[16*20+6]= 82;        daa[16*20+7]= 7;         
+	    daa[16*20+8]= 49;        daa[16*20+9]= 72;        daa[16*20+10]= 25;       daa[16*20+11]= 110;      
+	    daa[16*20+12]= 131;      daa[16*20+13]= 69;       daa[16*20+14]= 62;       daa[16*20+15]= 671;      
+	    daa[17*20+0]= 5;         daa[17*20+1]= 13;        daa[17*20+2]= 16;        daa[17*20+3]= 1;         
+	    daa[17*20+4]= 55;        daa[17*20+5]= 10;        daa[17*20+6]= 17;        daa[17*20+7]= 23;        
+	    daa[17*20+8]= 48;        daa[17*20+9]= 39;        daa[17*20+10]= 47;       daa[17*20+11]= 6;        
+	    daa[17*20+12]= 111;      daa[17*20+13]= 182;      daa[17*20+14]= 9;        daa[17*20+15]= 14;       
+	    daa[17*20+16]= 1;        daa[18*20+0]= 55;        daa[18*20+1]= 47;        daa[18*20+2]= 28;        
+	    daa[18*20+3]= 1;         daa[18*20+4]= 131;       daa[18*20+5]= 45;        daa[18*20+6]= 1;         
+	    daa[18*20+7]= 21;        daa[18*20+8]= 307;       daa[18*20+9]= 26;        daa[18*20+10]= 64;       
+	    daa[18*20+11]= 1;        daa[18*20+12]= 74;       daa[18*20+13]= 1017;     daa[18*20+14]= 14;       
+	    daa[18*20+15]= 31;       daa[18*20+16]= 34;       daa[18*20+17]= 176;      daa[19*20+0]= 197;       
+	    daa[19*20+1]= 29;        daa[19*20+2]= 21;        daa[19*20+3]= 6;         daa[19*20+4]= 295;       
+	    daa[19*20+5]= 36;        daa[19*20+6]= 35;        daa[19*20+7]= 3;         daa[19*20+8]= 1;         
+	    daa[19*20+9]= 1048;      daa[19*20+10]= 112;      daa[19*20+11]= 19;       daa[19*20+12]= 236;      
+	    daa[19*20+13]= 92;       daa[19*20+14]= 25;       daa[19*20+15]= 39;       daa[19*20+16]= 196;      
+	    daa[19*20+17]= 26;       daa[19*20+18]= 59;       
+	    
+	    f[0]= 0.0646;           f[1]= 0.0453;           f[2]= 0.0376;           f[3]= 0.0422;           
+	    f[4]= 0.0114;           f[5]= 0.0606;           f[6]= 0.0607;           f[7]= 0.0639;           
+	    f[8]= 0.0273;           f[9]= 0.0679;           f[10]= 0.1018;          f[11]= 0.0751;          
+	    f[12]= 0.015;           f[13]= 0.0287;          f[14]= 0.0681;          f[15]= 0.0488;          
+	    f[16]= 0.0622;          f[17]= 0.0251;          f[18]= 0.0318;          f[19]= 0.0619;	    	    
+	  }
+	  break;
+	case PLL_CPREV:
+	  {
+	    daa[1*20+0]= 105;        daa[2*20+0]= 227;        daa[2*20+1]= 357;        daa[3*20+0]= 175;        
+	    daa[3*20+1]= 43;         daa[3*20+2]= 4435;       daa[4*20+0]= 669;        daa[4*20+1]= 823;        
+	    daa[4*20+2]= 538;        daa[4*20+3]= 10;         daa[5*20+0]= 157;        daa[5*20+1]= 1745;       
+	    daa[5*20+2]= 768;        daa[5*20+3]= 400;        daa[5*20+4]= 10;         daa[6*20+0]= 499;        
+	    daa[6*20+1]= 152;        daa[6*20+2]= 1055;       daa[6*20+3]= 3691;       daa[6*20+4]= 10;         
+	    daa[6*20+5]= 3122;       daa[7*20+0]= 665;        daa[7*20+1]= 243;        daa[7*20+2]= 653;        
+	    daa[7*20+3]= 431;        daa[7*20+4]= 303;        daa[7*20+5]= 133;        daa[7*20+6]= 379;        
+	    daa[8*20+0]= 66;         daa[8*20+1]= 715;        daa[8*20+2]= 1405;       daa[8*20+3]= 331;        
+	    daa[8*20+4]= 441;        daa[8*20+5]= 1269;       daa[8*20+6]= 162;        daa[8*20+7]= 19;         
+	    daa[9*20+0]= 145;        daa[9*20+1]= 136;        daa[9*20+2]= 168;        daa[9*20+3]= 10;         
+	    daa[9*20+4]= 280;        daa[9*20+5]= 92;         daa[9*20+6]= 148;        daa[9*20+7]= 40;         
+	    daa[9*20+8]= 29;         daa[10*20+0]= 197;       daa[10*20+1]= 203;       daa[10*20+2]= 113;       
+	    daa[10*20+3]= 10;        daa[10*20+4]= 396;       daa[10*20+5]= 286;       daa[10*20+6]= 82;        
+	    daa[10*20+7]= 20;        daa[10*20+8]= 66;        daa[10*20+9]= 1745;      daa[11*20+0]= 236;       
+	    daa[11*20+1]= 4482;      daa[11*20+2]= 2430;      daa[11*20+3]= 412;       daa[11*20+4]= 48;        
+	    daa[11*20+5]= 3313;      daa[11*20+6]= 2629;      daa[11*20+7]= 263;       daa[11*20+8]= 305;       
+	    daa[11*20+9]= 345;       daa[11*20+10]= 218;      daa[12*20+0]= 185;       daa[12*20+1]= 125;       
+	    daa[12*20+2]= 61;        daa[12*20+3]= 47;        daa[12*20+4]= 159;       daa[12*20+5]= 202;       
+	    daa[12*20+6]= 113;       daa[12*20+7]= 21;        daa[12*20+8]= 10;        daa[12*20+9]= 1772;      
+	    daa[12*20+10]= 1351;     daa[12*20+11]= 193;      daa[13*20+0]= 68;        daa[13*20+1]= 53;        
+	    daa[13*20+2]= 97;        daa[13*20+3]= 22;        daa[13*20+4]= 726;       daa[13*20+5]= 10;        
+	    daa[13*20+6]= 145;       daa[13*20+7]= 25;        daa[13*20+8]= 127;       daa[13*20+9]= 454;       
+	    daa[13*20+10]= 1268;     daa[13*20+11]= 72;       daa[13*20+12]= 327;      daa[14*20+0]= 490;       
+	    daa[14*20+1]= 87;        daa[14*20+2]= 173;       daa[14*20+3]= 170;       daa[14*20+4]= 285;       
+	    daa[14*20+5]= 323;       daa[14*20+6]= 185;       daa[14*20+7]= 28;        daa[14*20+8]= 152;       
+	    daa[14*20+9]= 117;       daa[14*20+10]= 219;      daa[14*20+11]= 302;      daa[14*20+12]= 100;      
+	    daa[14*20+13]= 43;       daa[15*20+0]= 2440;      daa[15*20+1]= 385;       daa[15*20+2]= 2085;      
+	    daa[15*20+3]= 590;       daa[15*20+4]= 2331;      daa[15*20+5]= 396;       daa[15*20+6]= 568;       
+	    daa[15*20+7]= 691;       daa[15*20+8]= 303;       daa[15*20+9]= 216;       daa[15*20+10]= 516;      
+	    daa[15*20+11]= 868;      daa[15*20+12]= 93;       daa[15*20+13]= 487;      daa[15*20+14]= 1202;     
+	    daa[16*20+0]= 1340;      daa[16*20+1]= 314;       daa[16*20+2]= 1393;      daa[16*20+3]= 266;       
+	    daa[16*20+4]= 576;       daa[16*20+5]= 241;       daa[16*20+6]= 369;       daa[16*20+7]= 92;        
+	    daa[16*20+8]= 32;        daa[16*20+9]= 1040;      daa[16*20+10]= 156;      daa[16*20+11]= 918;      
+	    daa[16*20+12]= 645;      daa[16*20+13]= 148;      daa[16*20+14]= 260;      daa[16*20+15]= 2151;     
+	    daa[17*20+0]= 14;        daa[17*20+1]= 230;       daa[17*20+2]= 40;        daa[17*20+3]= 18;        
+	    daa[17*20+4]= 435;       daa[17*20+5]= 53;        daa[17*20+6]= 63;        daa[17*20+7]= 82;        
+	    daa[17*20+8]= 69;        daa[17*20+9]= 42;        daa[17*20+10]= 159;      daa[17*20+11]= 10;       
+	    daa[17*20+12]= 86;       daa[17*20+13]= 468;      daa[17*20+14]= 49;       daa[17*20+15]= 73;       
+	    daa[17*20+16]= 29;       daa[18*20+0]= 56;        daa[18*20+1]= 323;       daa[18*20+2]= 754;       
+	    daa[18*20+3]= 281;       daa[18*20+4]= 1466;      daa[18*20+5]= 391;       daa[18*20+6]= 142;       
+	    daa[18*20+7]= 10;        daa[18*20+8]= 1971;      daa[18*20+9]= 89;        daa[18*20+10]= 189;      
+	    daa[18*20+11]= 247;      daa[18*20+12]= 215;      daa[18*20+13]= 2370;     daa[18*20+14]= 97;       
+	    daa[18*20+15]= 522;      daa[18*20+16]= 71;       daa[18*20+17]= 346;      daa[19*20+0]= 968;       
+	    daa[19*20+1]= 92;        daa[19*20+2]= 83;        daa[19*20+3]= 75;        daa[19*20+4]= 592;       
+	    daa[19*20+5]= 54;        daa[19*20+6]= 200;       daa[19*20+7]= 91;        daa[19*20+8]= 25;        
+	    daa[19*20+9]= 4797;      daa[19*20+10]= 865;      daa[19*20+11]= 249;      daa[19*20+12]= 475;      
+	    daa[19*20+13]= 317;      daa[19*20+14]= 122;      daa[19*20+15]= 167;      daa[19*20+16]= 760;      
+	    daa[19*20+17]= 10;       daa[19*20+18]= 119;      
+	    
+	    f[0]= 0.076;            f[1]= 0.062;            f[2]= 0.041;            f[3]= 0.037;            
+	    f[4]= 0.009;            f[5]= 0.038;            f[6]= 0.049;            f[7]= 0.084;            
+	    f[8]= 0.025;            f[9]= 0.081;            f[10]= 0.101;           f[11]= 0.05;            
+	    f[12]= 0.022;           f[13]= 0.051;           f[14]= 0.043;           f[15]= 0.062;           
+	    f[16]= 0.054;           f[17]= 0.018;           f[18]= 0.031;           f[19]= 0.066; 
+	  }
+	  break;
+	case PLL_VT:
+	  {
+	    /*
+	      daa[1*20+0]= 0.233108;   daa[2*20+0]= 0.199097;   daa[2*20+1]= 0.210797;   daa[3*20+0]= 0.265145;   
+	      daa[3*20+1]= 0.105191;   daa[3*20+2]= 0.883422;   daa[4*20+0]= 0.227333;   daa[4*20+1]= 0.031726;   
+	      daa[4*20+2]= 0.027495;   daa[4*20+3]= 0.010313;   daa[5*20+0]= 0.310084;   daa[5*20+1]= 0.493763;   
+	      daa[5*20+2]= 0.2757;     daa[5*20+3]= 0.205842;   daa[5*20+4]= 0.004315;   daa[6*20+0]= 0.567957;   
+	      daa[6*20+1]= 0.25524;    daa[6*20+2]= 0.270417;   daa[6*20+3]= 1.599461;   daa[6*20+4]= 0.005321;   
+	      daa[6*20+5]= 0.960976;   daa[7*20+0]= 0.876213;   daa[7*20+1]= 0.156945;   daa[7*20+2]= 0.362028;   
+	      daa[7*20+3]= 0.311718;   daa[7*20+4]= 0.050876;   daa[7*20+5]= 0.12866;    daa[7*20+6]= 0.250447;   
+	      daa[8*20+0]= 0.078692;   daa[8*20+1]= 0.213164;   daa[8*20+2]= 0.290006;   daa[8*20+3]= 0.134252;   
+	      daa[8*20+4]= 0.016695;   daa[8*20+5]= 0.315521;   daa[8*20+6]= 0.104458;   daa[8*20+7]= 0.058131;   
+	      daa[9*20+0]= 0.222972;   daa[9*20+1]= 0.08151;    daa[9*20+2]= 0.087225;   daa[9*20+3]= 0.01172;    
+	      daa[9*20+4]= 0.046398;   daa[9*20+5]= 0.054602;   daa[9*20+6]= 0.046589;   daa[9*20+7]= 0.051089;   
+	      daa[9*20+8]= 0.020039;   daa[10*20+0]= 0.42463;   daa[10*20+1]= 0.192364;  daa[10*20+2]= 0.069245;  
+	      daa[10*20+3]= 0.060863;  daa[10*20+4]= 0.091709;  daa[10*20+5]= 0.24353;   daa[10*20+6]= 0.151924;  
+	      daa[10*20+7]= 0.087056;  daa[10*20+8]= 0.103552;  daa[10*20+9]= 2.08989;   daa[11*20+0]= 0.393245;  
+	      daa[11*20+1]= 1.755838;  daa[11*20+2]= 0.50306;   daa[11*20+3]= 0.261101;  daa[11*20+4]= 0.004067;  
+	      daa[11*20+5]= 0.738208;  daa[11*20+6]= 0.88863;   daa[11*20+7]= 0.193243;  daa[11*20+8]= 0.153323;  
+	      daa[11*20+9]= 0.093181;  daa[11*20+10]= 0.201204; daa[12*20+0]= 0.21155;   daa[12*20+1]= 0.08793;   
+	      daa[12*20+2]= 0.05742;   daa[12*20+3]= 0.012182;  daa[12*20+4]= 0.02369;   daa[12*20+5]= 0.120801;  
+	      daa[12*20+6]= 0.058643;  daa[12*20+7]= 0.04656;   daa[12*20+8]= 0.021157;  daa[12*20+9]= 0.493845;  
+	      daa[12*20+10]= 1.105667; daa[12*20+11]= 0.096474; daa[13*20+0]= 0.116646;  daa[13*20+1]= 0.042569;  
+	      daa[13*20+2]= 0.039769;  daa[13*20+3]= 0.016577;  daa[13*20+4]= 0.051127;  daa[13*20+5]= 0.026235;  
+	      daa[13*20+6]= 0.028168;  daa[13*20+7]= 0.050143;  daa[13*20+8]= 0.079807;  daa[13*20+9]= 0.32102;   
+	      daa[13*20+10]= 0.946499; daa[13*20+11]= 0.038261; daa[13*20+12]= 0.173052; daa[14*20+0]= 0.399143;  
+	      daa[14*20+1]= 0.12848;   daa[14*20+2]= 0.083956;  daa[14*20+3]= 0.160063;  daa[14*20+4]= 0.011137;  
+	      daa[14*20+5]= 0.15657;   daa[14*20+6]= 0.205134;  daa[14*20+7]= 0.124492;  daa[14*20+8]= 0.078892;  
+	      daa[14*20+9]= 0.054797;  daa[14*20+10]= 0.169784; daa[14*20+11]= 0.212302; daa[14*20+12]= 0.010363; 
+	      daa[14*20+13]= 0.042564; daa[15*20+0]= 1.817198;  daa[15*20+1]= 0.292327;  daa[15*20+2]= 0.847049;  
+	      daa[15*20+3]= 0.461519;  daa[15*20+4]= 0.17527;   daa[15*20+5]= 0.358017;  daa[15*20+6]= 0.406035;  
+	      daa[15*20+7]= 0.612843;  daa[15*20+8]= 0.167406;  daa[15*20+9]= 0.081567;  daa[15*20+10]= 0.214977; 
+	      daa[15*20+11]= 0.400072; daa[15*20+12]= 0.090515; daa[15*20+13]= 0.138119; daa[15*20+14]= 0.430431; 
+	      daa[16*20+0]= 0.877877;  daa[16*20+1]= 0.204109;  daa[16*20+2]= 0.471268;  daa[16*20+3]= 0.178197;  
+	      daa[16*20+4]= 0.079511;  daa[16*20+5]= 0.248992;  daa[16*20+6]= 0.321028;  daa[16*20+7]= 0.136266;  
+	      daa[16*20+8]= 0.101117;  daa[16*20+9]= 0.376588;  daa[16*20+10]= 0.243227; daa[16*20+11]= 0.446646; 
+	      daa[16*20+12]= 0.184609; daa[16*20+13]= 0.08587;  daa[16*20+14]= 0.207143; daa[16*20+15]= 1.767766; 
+	      daa[17*20+0]= 0.030309;  daa[17*20+1]= 0.046417;  daa[17*20+2]= 0.010459;  daa[17*20+3]= 0.011393;  
+	      daa[17*20+4]= 0.007732;  daa[17*20+5]= 0.021248;  daa[17*20+6]= 0.018844;  daa[17*20+7]= 0.02399;   
+	      daa[17*20+8]= 0.020009;  daa[17*20+9]= 0.034954;  daa[17*20+10]= 0.083439; daa[17*20+11]= 0.023321; 
+	      daa[17*20+12]= 0.022019; daa[17*20+13]= 0.12805;  daa[17*20+14]= 0.014584; daa[17*20+15]= 0.035933; 
+	      daa[17*20+16]= 0.020437; daa[18*20+0]= 0.087061;  daa[18*20+1]= 0.09701;   daa[18*20+2]= 0.093268;  
+	      daa[18*20+3]= 0.051664;  daa[18*20+4]= 0.042823;  daa[18*20+5]= 0.062544;  daa[18*20+6]= 0.0552;    
+	      daa[18*20+7]= 0.037568;  daa[18*20+8]= 0.286027;  daa[18*20+9]= 0.086237;  daa[18*20+10]= 0.189842; 
+	      daa[18*20+11]= 0.068689; daa[18*20+12]= 0.073223; daa[18*20+13]= 0.898663; daa[18*20+14]= 0.032043; 
+	      daa[18*20+15]= 0.121979; daa[18*20+16]= 0.094617; daa[18*20+17]= 0.124746; daa[19*20+0]= 1.230985;  
+	      daa[19*20+1]= 0.113146;  daa[19*20+2]= 0.049824;  daa[19*20+3]= 0.048769;  daa[19*20+4]= 0.163831;  
+	      daa[19*20+5]= 0.112027;  daa[19*20+6]= 0.205868;  daa[19*20+7]= 0.082579;  daa[19*20+8]= 0.068575;  
+	      daa[19*20+9]= 3.65443;   daa[19*20+10]= 1.337571; daa[19*20+11]= 0.144587; daa[19*20+12]= 0.307309; 
+	      daa[19*20+13]= 0.247329; daa[19*20+14]= 0.129315; daa[19*20+15]= 0.1277;   daa[19*20+16]= 0.740372; 
+	      daa[19*20+17]= 0.022134; daa[19*20+18]= 0.125733; 	    	    
+	      
+	      f[0]  = 0.07900;         f[1]= 0.05100;        f[2]  = 0.04200;         f[3]= 0.05300;         
+	      f[4]  = 0.01500;         f[5]= 0.03700;        f[6]  = 0.06200;         f[7]= 0.07100;         
+	      f[8]  = 0.02300;         f[9]= 0.06200;        f[10] = 0.09600;        f[11]= 0.05700;        
+	      f[12] = 0.02400;        f[13]= 0.04300;        f[14] = 0.04400;        f[15]= 0.06400;        
+	      f[16] = 0.05600;        f[17]= 0.01300;        f[18] = 0.03500;        f[19]= 0.07300; 
+	    */
+
+	    daa[1*20+0]=   1.2412691067876198;
+	    daa[2*20+0]=   1.2184237953498958;
+	    daa[2*20+1]=   1.5720770753326880;
+	    daa[3*20+0]=   1.3759368509441177;
+	    daa[3*20+1]=   0.7550654439001206;
+	    daa[3*20+2]=   7.8584219153689405;
+	    daa[4*20+0]=   2.4731223087544874;
+	    daa[4*20+1]=   1.4414262567428417;
+	    daa[4*20+2]=   0.9784679122774127;
+	    daa[4*20+3]=   0.2272488448121475;
+	    daa[5*20+0]=   2.2155167805137470;
+	    daa[5*20+1]=   5.5120819705248678;
+	    daa[5*20+2]=   3.0143201670924822;
+	    daa[5*20+3]=   1.6562495638176040;
+	    daa[5*20+4]=   0.4587469126746136;
+	    daa[6*20+0]=   2.3379911207495061;
+	    daa[6*20+1]=   1.3542404860613146;
+	    daa[6*20+2]=   2.0093434778398112;
+	    daa[6*20+3]=   9.6883451875685065;
+	    daa[6*20+4]=   0.4519167943192672;
+	    daa[6*20+5]=   6.8124601839937675;
+	    daa[7*20+0]=   3.3386555146457697;
+	    daa[7*20+1]=   1.3121700301622004;
+	    daa[7*20+2]=   2.4117632898861809;
+	    daa[7*20+3]=   1.9142079025990228;
+	    daa[7*20+4]=   1.1034605684472507;
+	    daa[7*20+5]=   0.8776110594765502;
+	    daa[7*20+6]=   1.3860121390169038;
+	    daa[8*20+0]=   0.9615841926910841;
+	    daa[8*20+1]=   4.9238668283945266;
+	    daa[8*20+2]=   6.1974384977884114;
+	    daa[8*20+3]=   2.1459640610133781;
+	    daa[8*20+4]=   1.5196756759380692;
+	    daa[8*20+5]=   7.9943228564946525;
+	    daa[8*20+6]=   1.6360079688522375;
+	    daa[8*20+7]=   0.8561248973045037;
+	    daa[9*20+0]=   0.8908203061925510;
+	    daa[9*20+1]=   0.4323005487925516;
+	    daa[9*20+2]=   0.9179291175331520;
+	    daa[9*20+3]=   0.2161660372725585;
+	    daa[9*20+4]=   0.9126668032539315;
+	    daa[9*20+5]=   0.4882733432879921;
+	    daa[9*20+6]=   0.4035497929633328;
+	    daa[9*20+7]=   0.2888075033037488;
+	    daa[9*20+8]=   0.5787937115407940;
+	    daa[10*20+0]=  1.0778497408764076;
+	    daa[10*20+1]=  0.8386701149158265;
+	    daa[10*20+2]=  0.4098311270816011;
+	    daa[10*20+3]=  0.3574207468998517;
+	    daa[10*20+4]=  1.4081315998413697;
+	    daa[10*20+5]=  1.3318097154194044;
+	    daa[10*20+6]=  0.5610717242294755;
+	    daa[10*20+7]=  0.3578662395745526;
+	    daa[10*20+8]=  1.0765007949562073;
+	    daa[10*20+9]=  6.0019110258426362;
+	    daa[11*20+0]=  1.4932055816372476;
+	    daa[11*20+1]=  10.017330817366002;
+	    daa[11*20+2]=  4.4034547578962568;
+	    daa[11*20+3]=  1.4521790561663968;
+	    daa[11*20+4]=  0.3371091785647479;
+	    daa[11*20+5]=  6.0519085243118811;
+	    daa[11*20+6]=  4.3290086529582830;
+	    daa[11*20+7]=  0.8945563662345198;
+	    daa[11*20+8]=  1.8085136096039203;
+	    daa[11*20+9]=  0.6244297525127139;
+	    daa[11*20+10]= 0.5642322882556321;
+	    daa[12*20+0]=  1.9006455961717605;
+	    daa[12*20+1]=  1.2488638689609959;
+	    daa[12*20+2]=  0.9378803706165143;
+	    daa[12*20+3]=  0.4075239926000898;
+	    daa[12*20+4]=  1.2213054800811556;
+	    daa[12*20+5]=  1.9106190827629084;
+	    daa[12*20+6]=  0.7471936218068498;
+	    daa[12*20+7]=  0.5954812791740037;
+	    daa[12*20+8]=  1.3808291710019667;
+	    daa[12*20+9]=  6.7597899772045418;
+	    daa[12*20+10]= 8.0327792947421148;
+	    daa[12*20+11]= 1.7129670976916258;
+	    daa[13*20+0]=  0.6883439026872615;
+	    daa[13*20+1]=  0.4224945197276290;
+	    daa[13*20+2]=  0.5044944273324311;
+	    daa[13*20+3]=  0.1675129724559251;
+	    daa[13*20+4]=  1.6953951980808002;
+	    daa[13*20+5]=  0.3573432522499545;
+	    daa[13*20+6]=  0.2317194387691585;
+	    daa[13*20+7]=  0.3693722640980460;
+	    daa[13*20+8]=  1.3629765501081097;
+	    daa[13*20+9]=  2.2864286949316077;
+	    daa[13*20+10]= 4.3611548063555778;
+	    daa[13*20+11]= 0.3910559903834828;
+	    daa[13*20+12]= 2.3201373546296349;
+	    daa[14*20+0]=  2.7355620089953550;
+	    daa[14*20+1]=  1.3091837782420783;
+	    daa[14*20+2]=  0.7103720531974738;
+	    daa[14*20+3]=  1.0714605979577547;
+	    daa[14*20+4]=  0.4326227078645523;
+	    daa[14*20+5]=  2.3019177728300728;
+	    daa[14*20+6]=  1.5132807416252063;
+	    daa[14*20+7]=  0.7744933618134962;
+	    daa[14*20+8]=  1.8370555852070649;
+	    daa[14*20+9]=  0.4811402387911145;
+	    daa[14*20+10]= 1.0084320519837335;
+	    daa[14*20+11]= 1.3918935593582853;
+	    daa[14*20+12]= 0.4953193808676289;
+	    daa[14*20+13]= 0.3746821107962129;
+	    daa[15*20+0]=  6.4208961859142883;
+	    daa[15*20+1]=  1.9202994262316166;
+	    daa[15*20+2]=  6.1234512396801764;
+	    daa[15*20+3]=  2.2161944596741829;
+	    daa[15*20+4]=  3.6366815408744255;
+	    daa[15*20+5]=  2.3193703643237220;
+	    daa[15*20+6]=  1.8273535587773553;
+	    daa[15*20+7]=  3.0637776193717610;
+	    daa[15*20+8]=  1.9699895187387506;
+	    daa[15*20+9]=  0.6047491507504744;
+	    daa[15*20+10]= 0.8953754669269811;
+	    daa[15*20+11]= 1.9776630140912268;
+	    daa[15*20+12]= 1.0657482318076852;
+	    daa[15*20+13]= 1.1079144700606407;
+	    daa[15*20+14]= 3.5465914843628927;
+	    daa[16*20+0]=  5.2892514169776437;
+	    daa[16*20+1]=  1.3363401740560601;
+	    daa[16*20+2]=  3.8852506105922231;
+	    daa[16*20+3]=  1.5066839872944762;
+	    daa[16*20+4]=  1.7557065205837685;
+	    daa[16*20+5]=  2.1576510103471440;
+	    daa[16*20+6]=  1.5839981708584689;
+	    daa[16*20+7]=  0.7147489676267383;
+	    daa[16*20+8]=  1.6136654573285647;
+	    daa[16*20+9]=  2.6344778384442731;
+	    daa[16*20+10]= 1.0192004372506540;
+	    daa[16*20+11]= 2.5513781312660280;
+	    daa[16*20+12]= 3.3628488360462363;
+	    daa[16*20+13]= 0.6882725908872254;
+	    daa[16*20+14]= 1.9485376673137556;
+	    daa[16*20+15]= 8.8479984061248178;
+	    daa[17*20+0]=  0.5488578478106930;
+	    daa[17*20+1]=  1.5170142153962840;
+	    daa[17*20+2]=  0.1808525752605976;
+	    daa[17*20+3]=  0.2496584188151770;
+	    daa[17*20+4]=  1.6275179891253113;
+	    daa[17*20+5]=  0.8959082681546182;
+	    daa[17*20+6]=  0.4198391148111098;
+	    daa[17*20+7]=  0.9349753595598769;
+	    daa[17*20+8]=  0.6301954684360302;
+	    daa[17*20+9]=  0.5604648274060783;
+	    daa[17*20+10]= 1.5183114434679339;
+	    daa[17*20+11]= 0.5851920879490173;
+	    daa[17*20+12]= 1.4680478689711018;
+	    daa[17*20+13]= 3.3448437239772266;
+	    daa[17*20+14]= 0.4326058001438786;
+	    daa[17*20+15]= 0.6791126595939816;
+	    daa[17*20+16]= 0.4514203099376473;
+	    daa[18*20+0]=  0.5411769916657778;
+	    daa[18*20+1]=  0.8912614404565405;
+	    daa[18*20+2]=  1.0894926581511342;
+	    daa[18*20+3]=  0.7447620891784513;
+	    daa[18*20+4]=  2.1579775140421025;
+	    daa[18*20+5]=  0.9183596801412757;
+	    daa[18*20+6]=  0.5818111331782764;
+	    daa[18*20+7]=  0.3374467649724478;
+	    daa[18*20+8]=  7.7587442309146040;
+	    daa[18*20+9]=  0.8626796044156272;
+	    daa[18*20+10]= 1.2452243224541324;
+	    daa[18*20+11]= 0.7835447533710449;
+	    daa[18*20+12]= 1.0899165770956820;
+	    daa[18*20+13]= 10.384852333133459;
+	    daa[18*20+14]= 0.4819109019647465;
+	    daa[18*20+15]= 0.9547229305958682;
+	    daa[18*20+16]= 0.8564314184691215;
+	    daa[18*20+17]= 4.5377235790405388;
+	    daa[19*20+0]=  4.6501894691803214;
+	    daa[19*20+1]=  0.7807017855806767;
+	    daa[19*20+2]=  0.4586061981719967;
+	    daa[19*20+3]=  0.4594535241660911;
+	    daa[19*20+4]=  2.2627456996290891;
+	    daa[19*20+5]=  0.6366932501396869;
+	    daa[19*20+6]=  0.8940572875547330;
+	    daa[19*20+7]=  0.6193321034173915;
+	    daa[19*20+8]=  0.5333220944030346;
+	    daa[19*20+9]=  14.872933461519061;
+	    daa[19*20+10]= 3.5458093276667237;
+	    daa[19*20+11]= 0.7801080335991272;
+	    daa[19*20+12]= 4.0584577156753401;
+	    daa[19*20+13]= 1.7039730522675411;
+	    daa[19*20+14]= 0.5985498912985666;
+	    daa[19*20+15]= 0.9305232113028208;
+	    daa[19*20+16]= 3.4242218450865543;
+	    daa[19*20+17]= 0.5658969249032649;
+	    daa[19*20+18]= 1.0000000000000000;
+	    
+	    f[0]=  0.0770764620135024;
+	    f[1]=  0.0500819370772208;
+	    f[2]=  0.0462377395993731;
+	    f[3]=  0.0537929860758246;
+	    f[4]=  0.0144533387583345;
+	    f[5]=  0.0408923608974345;
+	    f[6]=  0.0633579339160905;
+	    f[7]=  0.0655672355884439;
+	    f[8]=  0.0218802687005936;
+	    f[9]=  0.0591969699027449;
+	    f[10]= 0.0976461276528445;
+	    f[11]= 0.0592079410822730;
+	    f[12]= 0.0220695876653368;
+	    f[13]= 0.0413508521834260;
+	    f[14]= 0.0476871596856874;
+	    f[15]= 0.0707295165111524;
+	    f[16]= 0.0567759161524817;
+	    f[17]= 0.0127019797647213;
+	    f[18]= 0.0323746050281867;
+	    f[19]= 0.0669190817443274;
+	  }
+	  break;
+	case PLL_BLOSUM62:
+	  {
+	    daa[1*20+0]= 0.735790389698;  daa[2*20+0]= 0.485391055466;  daa[2*20+1]= 1.297446705134;  
+	    daa[3*20+0]= 0.543161820899;  
+	    daa[3*20+1]= 0.500964408555;  daa[3*20+2]= 3.180100048216;  daa[4*20+0]= 1.45999531047;   
+	    daa[4*20+1]= 0.227826574209;  
+	    daa[4*20+2]= 0.397358949897;  daa[4*20+3]= 0.240836614802;  daa[5*20+0]= 1.199705704602;  
+	    daa[5*20+1]= 3.020833610064;  
+	    daa[5*20+2]= 1.839216146992;  daa[5*20+3]= 1.190945703396;  daa[5*20+4]= 0.32980150463;   
+	    daa[6*20+0]= 1.1709490428;    
+	    daa[6*20+1]= 1.36057419042;   daa[6*20+2]= 1.24048850864;   daa[6*20+3]= 3.761625208368;  
+	    daa[6*20+4]= 0.140748891814;  
+	    daa[6*20+5]= 5.528919177928;  daa[7*20+0]= 1.95588357496;   daa[7*20+1]= 0.418763308518;  
+	    daa[7*20+2]= 1.355872344485;  
+	    daa[7*20+3]= 0.798473248968;  daa[7*20+4]= 0.418203192284;  daa[7*20+5]= 0.609846305383;  
+	    daa[7*20+6]= 0.423579992176;  
+	    daa[8*20+0]= 0.716241444998;  daa[8*20+1]= 1.456141166336;  daa[8*20+2]= 2.414501434208;  
+	    daa[8*20+3]= 0.778142664022;  
+	    daa[8*20+4]= 0.354058109831;  daa[8*20+5]= 2.43534113114;   daa[8*20+6]= 1.626891056982;  
+	    daa[8*20+7]= 0.539859124954;  
+	    daa[9*20+0]= 0.605899003687;  daa[9*20+1]= 0.232036445142;  daa[9*20+2]= 0.283017326278;  
+	    daa[9*20+3]= 0.418555732462;  
+	    daa[9*20+4]= 0.774894022794;  daa[9*20+5]= 0.236202451204;  daa[9*20+6]= 0.186848046932;  
+	    daa[9*20+7]= 0.189296292376;  
+	    daa[9*20+8]= 0.252718447885;  daa[10*20+0]= 0.800016530518; daa[10*20+1]= 0.622711669692; 
+	    daa[10*20+2]= 0.211888159615; 
+	    daa[10*20+3]= 0.218131577594; daa[10*20+4]= 0.831842640142; daa[10*20+5]= 0.580737093181; 
+	    daa[10*20+6]= 0.372625175087; 
+	    daa[10*20+7]= 0.217721159236; daa[10*20+8]= 0.348072209797; daa[10*20+9]= 3.890963773304; 
+	    daa[11*20+0]= 1.295201266783; 
+	    daa[11*20+1]= 5.411115141489; daa[11*20+2]= 1.593137043457; daa[11*20+3]= 1.032447924952; 
+	    daa[11*20+4]= 0.285078800906; 
+	    daa[11*20+5]= 3.945277674515; daa[11*20+6]= 2.802427151679; daa[11*20+7]= 0.752042440303; 
+	    daa[11*20+8]= 1.022507035889; 
+	    daa[11*20+9]= 0.406193586642; daa[11*20+10]= 0.445570274261;daa[12*20+0]= 1.253758266664; 
+	    daa[12*20+1]= 0.983692987457; 
+	    daa[12*20+2]= 0.648441278787; daa[12*20+3]= 0.222621897958; daa[12*20+4]= 0.76768882348;  
+	    daa[12*20+5]= 2.494896077113; 
+	    daa[12*20+6]= 0.55541539747;  daa[12*20+7]= 0.459436173579; daa[12*20+8]= 0.984311525359; 
+	    daa[12*20+9]= 3.364797763104; 
+	    daa[12*20+10]= 6.030559379572;daa[12*20+11]= 1.073061184332;daa[13*20+0]= 0.492964679748; 
+	    daa[13*20+1]= 0.371644693209; 
+	    daa[13*20+2]= 0.354861249223; daa[13*20+3]= 0.281730694207; daa[13*20+4]= 0.441337471187; 
+	    daa[13*20+5]= 0.14435695975;  
+	    daa[13*20+6]= 0.291409084165; daa[13*20+7]= 0.368166464453; daa[13*20+8]= 0.714533703928; 
+	    daa[13*20+9]= 1.517359325954; 
+	    daa[13*20+10]= 2.064839703237;daa[13*20+11]= 0.266924750511;daa[13*20+12]= 1.77385516883; 
+	    daa[14*20+0]= 1.173275900924; 
+	    daa[14*20+1]= 0.448133661718; daa[14*20+2]= 0.494887043702; daa[14*20+3]= 0.730628272998; 
+	    daa[14*20+4]= 0.356008498769; 
+	    daa[14*20+5]= 0.858570575674; daa[14*20+6]= 0.926563934846; daa[14*20+7]= 0.504086599527; daa[14*20+8]= 0.527007339151; 
+	    daa[14*20+9]= 0.388355409206; daa[14*20+10]= 0.374555687471;daa[14*20+11]= 1.047383450722;daa[14*20+12]= 0.454123625103;
+	    daa[14*20+13]= 0.233597909629;daa[15*20+0]= 4.325092687057; daa[15*20+1]= 1.12278310421;  daa[15*20+2]= 2.904101656456; 
+	    daa[15*20+3]= 1.582754142065; daa[15*20+4]= 1.197188415094; daa[15*20+5]= 1.934870924596; daa[15*20+6]= 1.769893238937; 
+	    daa[15*20+7]= 1.509326253224; daa[15*20+8]= 1.11702976291;  daa[15*20+9]= 0.35754441246;  daa[15*20+10]= 0.352969184527;
+	    daa[15*20+11]= 1.752165917819;daa[15*20+12]= 0.918723415746;daa[15*20+13]= 0.540027644824;daa[15*20+14]= 1.169129577716;
+	    daa[16*20+0]= 1.729178019485; daa[16*20+1]= 0.914665954563; daa[16*20+2]= 1.898173634533; daa[16*20+3]= 0.934187509431; 
+	    daa[16*20+4]= 1.119831358516; daa[16*20+5]= 1.277480294596; daa[16*20+6]= 1.071097236007; daa[16*20+7]= 0.641436011405; 
+	    daa[16*20+8]= 0.585407090225; daa[16*20+9]= 1.17909119726;  daa[16*20+10]= 0.915259857694;daa[16*20+11]= 1.303875200799;
+	    daa[16*20+12]= 1.488548053722;daa[16*20+13]= 0.488206118793;daa[16*20+14]= 1.005451683149;daa[16*20+15]= 5.15155629227; 
+	    daa[17*20+0]= 0.465839367725; daa[17*20+1]= 0.426382310122; daa[17*20+2]= 0.191482046247; daa[17*20+3]= 0.145345046279; 
+	    daa[17*20+4]= 0.527664418872; daa[17*20+5]= 0.758653808642; daa[17*20+6]= 0.407635648938; daa[17*20+7]= 0.508358924638; 
+	    daa[17*20+8]= 0.30124860078;  daa[17*20+9]= 0.34198578754;  daa[17*20+10]= 0.6914746346;  daa[17*20+11]= 0.332243040634;
+	    daa[17*20+12]= 0.888101098152;daa[17*20+13]= 2.074324893497;daa[17*20+14]= 0.252214830027;daa[17*20+15]= 0.387925622098;
+	    daa[17*20+16]= 0.513128126891;daa[18*20+0]= 0.718206697586; daa[18*20+1]= 0.720517441216; daa[18*20+2]= 0.538222519037; 
+	    daa[18*20+3]= 0.261422208965; daa[18*20+4]= 0.470237733696; daa[18*20+5]= 0.95898974285;  daa[18*20+6]= 0.596719300346; 
+	    daa[18*20+7]= 0.308055737035; daa[18*20+8]= 4.218953969389; daa[18*20+9]= 0.674617093228; daa[18*20+10]= 0.811245856323;
+	    daa[18*20+11]= 0.7179934869;  daa[18*20+12]= 0.951682162246;daa[18*20+13]= 6.747260430801;daa[18*20+14]= 0.369405319355;
+	    daa[18*20+15]= 0.796751520761;daa[18*20+16]= 0.801010243199;daa[18*20+17]= 4.054419006558;daa[19*20+0]= 2.187774522005; 
+	    daa[19*20+1]= 0.438388343772; daa[19*20+2]= 0.312858797993; daa[19*20+3]= 0.258129289418; daa[19*20+4]= 1.116352478606; 
+	    daa[19*20+5]= 0.530785790125; daa[19*20+6]= 0.524253846338; daa[19*20+7]= 0.25334079019;  daa[19*20+8]= 0.20155597175;  
+	    daa[19*20+9]= 8.311839405458; daa[19*20+10]= 2.231405688913;daa[19*20+11]= 0.498138475304;daa[19*20+12]= 2.575850755315;
+	    daa[19*20+13]= 0.838119610178;daa[19*20+14]= 0.496908410676;daa[19*20+15]= 0.561925457442;daa[19*20+16]= 2.253074051176;
+	    daa[19*20+17]= 0.266508731426;daa[19*20+18]= 1;             
+	    
+	    f[0]= 0.074;                 f[1]= 0.052;                 f[2]= 0.045;                 f[3]= 0.054;                 
+	    f[4]= 0.025;                 f[5]= 0.034;                 f[6]= 0.054;                 f[7]= 0.074;                 
+	    f[8]= 0.026;                 f[9]= 0.068;                 f[10]= 0.099;                f[11]= 0.058;                
+	    f[12]= 0.025;                f[13]= 0.047;                f[14]= 0.039;                f[15]= 0.057;                
+	    f[16]= 0.051;                f[17]= 0.013;                f[18]= 0.032;                f[19]= 0.073;
+	  }
+	  break;
+	case PLL_MTMAM:
+	  {
+	    daa[1*20+0]= 32;              daa[2*20+0]= 2;    daa[2*20+1]= 4;               daa[3*20+0]= 11;
+	    daa[3*20+1]= 0;               daa[3*20+2]= 864;  daa[4*20+0]= 0;               daa[4*20+1]= 186;
+	    daa[4*20+2]= 0;               daa[4*20+3]= 0;    daa[5*20+0]= 0;               daa[5*20+1]= 246;
+	    daa[5*20+2]= 8;               daa[5*20+3]= 49;   daa[5*20+4]= 0;               daa[6*20+0]= 0;
+	    daa[6*20+1]= 0;               daa[6*20+2]= 0;    daa[6*20+3]= 569;             daa[6*20+4]= 0;
+	    daa[6*20+5]= 274;             daa[7*20+0]= 78;   daa[7*20+1]= 18;              daa[7*20+2]= 47;
+	    daa[7*20+3]= 79;              daa[7*20+4]= 0;    daa[7*20+5]= 0;               daa[7*20+6]= 22;
+	    daa[8*20+0]= 8;               daa[8*20+1]= 232;  daa[8*20+2]= 458;             daa[8*20+3]= 11;
+	    daa[8*20+4]= 305;             daa[8*20+5]= 550;  daa[8*20+6]= 22;              daa[8*20+7]= 0;
+	    daa[9*20+0]= 75;              daa[9*20+1]= 0;    daa[9*20+2]= 19;              daa[9*20+3]= 0;
+	    daa[9*20+4]= 41;              daa[9*20+5]= 0;    daa[9*20+6]= 0;               daa[9*20+7]= 0;
+	    daa[9*20+8]= 0;               daa[10*20+0]= 21;  daa[10*20+1]= 6;              daa[10*20+2]= 0;
+	    daa[10*20+3]= 0;              daa[10*20+4]= 27;  daa[10*20+5]= 20;             daa[10*20+6]= 0;
+	    daa[10*20+7]= 0;              daa[10*20+8]= 26;  daa[10*20+9]= 232;            daa[11*20+0]= 0;
+	    daa[11*20+1]= 50;             daa[11*20+2]= 408; daa[11*20+3]= 0;              daa[11*20+4]= 0;
+	    daa[11*20+5]= 242;            daa[11*20+6]= 215; daa[11*20+7]= 0;              daa[11*20+8]= 0;
+	    daa[11*20+9]= 6;              daa[11*20+10]= 4;  daa[12*20+0]= 76;             daa[12*20+1]= 0;
+	    daa[12*20+2]= 21;             daa[12*20+3]= 0;   daa[12*20+4]= 0;              daa[12*20+5]= 22;
+	    daa[12*20+6]= 0;              daa[12*20+7]= 0;   daa[12*20+8]= 0;              daa[12*20+9]= 378;
+	    daa[12*20+10]= 609;           daa[12*20+11]= 59; daa[13*20+0]= 0;              daa[13*20+1]= 0;
+	    daa[13*20+2]= 6;              daa[13*20+3]= 5;   daa[13*20+4]= 7;              daa[13*20+5]= 0;
+	    daa[13*20+6]= 0;              daa[13*20+7]= 0;   daa[13*20+8]= 0;              daa[13*20+9]= 57;
+	    daa[13*20+10]= 246;           daa[13*20+11]= 0;  daa[13*20+12]= 11;            daa[14*20+0]= 53;
+	    daa[14*20+1]= 9;              daa[14*20+2]= 33;  daa[14*20+3]= 2;              daa[14*20+4]= 0;
+	    daa[14*20+5]= 51;             daa[14*20+6]= 0;   daa[14*20+7]= 0;              daa[14*20+8]= 53;
+	    daa[14*20+9]= 5;              daa[14*20+10]= 43; daa[14*20+11]= 18;            daa[14*20+12]= 0;
+	    daa[14*20+13]= 17;            daa[15*20+0]= 342; daa[15*20+1]= 3;              daa[15*20+2]= 446;
+	    daa[15*20+3]= 16;             daa[15*20+4]= 347; daa[15*20+5]= 30;             daa[15*20+6]= 21;
+	    daa[15*20+7]= 112;            daa[15*20+8]= 20;  daa[15*20+9]= 0;              daa[15*20+10]= 74;
+	    daa[15*20+11]= 65;            daa[15*20+12]= 47; daa[15*20+13]= 90;            daa[15*20+14]= 202;
+	    daa[16*20+0]= 681;            daa[16*20+1]= 0;   daa[16*20+2]= 110;            daa[16*20+3]= 0;
+	    daa[16*20+4]= 114;            daa[16*20+5]= 0;   daa[16*20+6]= 4;              daa[16*20+7]= 0;
+	    daa[16*20+8]= 1;              daa[16*20+9]= 360; daa[16*20+10]= 34;            daa[16*20+11]= 50;
+	    daa[16*20+12]= 691;           daa[16*20+13]= 8;  daa[16*20+14]= 78;            daa[16*20+15]= 614;
+	    daa[17*20+0]= 5;              daa[17*20+1]= 16;  daa[17*20+2]= 6;              daa[17*20+3]= 0;
+	    daa[17*20+4]= 65;             daa[17*20+5]= 0;   daa[17*20+6]= 0;              daa[17*20+7]= 0;
+	    daa[17*20+8]= 0;              daa[17*20+9]= 0;   daa[17*20+10]= 12;            daa[17*20+11]= 0;
+	    daa[17*20+12]= 13;            daa[17*20+13]= 0;  daa[17*20+14]= 7;             daa[17*20+15]= 17;
+	    daa[17*20+16]= 0;             daa[18*20+0]= 0;   daa[18*20+1]= 0;              daa[18*20+2]= 156;
+	    daa[18*20+3]= 0;              daa[18*20+4]= 530; daa[18*20+5]= 54;             daa[18*20+6]= 0;
+	    daa[18*20+7]= 1;              daa[18*20+8]= 1525;daa[18*20+9]= 16;             daa[18*20+10]= 25;
+	    daa[18*20+11]= 67;            daa[18*20+12]= 0;  daa[18*20+13]= 682;           daa[18*20+14]= 8;
+	    daa[18*20+15]= 107;           daa[18*20+16]= 0;  daa[18*20+17]= 14;            daa[19*20+0]= 398;
+	    daa[19*20+1]= 0;              daa[19*20+2]= 0;   daa[19*20+3]= 10;             daa[19*20+4]= 0;
+	    daa[19*20+5]= 33;             daa[19*20+6]= 20;  daa[19*20+7]= 5;              daa[19*20+8]= 0;
+	    daa[19*20+9]= 2220;           daa[19*20+10]= 100;daa[19*20+11]= 0;             daa[19*20+12]= 832;
+	    daa[19*20+13]= 6;             daa[19*20+14]= 0;  daa[19*20+15]= 0;             daa[19*20+16]= 237;
+	    daa[19*20+17]= 0;             daa[19*20+18]= 0;       
+	    
+	    f[0]= 0.06920;  f[1]=  0.01840;  f[2]= 0.04000;  f[3]= 0.018600;
+	    f[4]= 0.00650;  f[5]=  0.02380;  f[6]= 0.02360;  f[7]= 0.055700;
+	    f[8]= 0.02770;  f[9]=  0.09050;  f[10]=0.16750;  f[11]= 0.02210;
+	    f[12]=0.05610;  f[13]= 0.06110;  f[14]=0.05360;  f[15]= 0.07250;
+	    f[16]=0.08700;  f[17]= 0.02930;  f[18]=0.03400;  f[19]= 0.04280;
+	  }
+	  break;
+	case PLL_LG:
+	  {
+	    daa[1*20+0] = 0.425093;
+
+	    daa[2*20+0] = 0.276818; daa[2*20+1] = 0.751878;
+
+	    daa[3*20+0] = 0.395144; daa[3*20+1] = 0.123954; daa[3*20+2] = 5.076149;
+	    
+	    daa[4*20+0] = 2.489084; daa[4*20+1] = 0.534551; daa[4*20+2] = 0.528768; daa[4*20+3] = 0.062556;
+								 
+	    daa[5*20+0] = 0.969894; daa[5*20+1] = 2.807908; daa[5*20+2] = 1.695752; daa[5*20+3] = 0.523386; daa[5*20+4] = 0.084808;
+
+	    daa[6*20+0] = 1.038545; daa[6*20+1] = 0.363970; daa[6*20+2] = 0.541712; daa[6*20+3] = 5.243870; daa[6*20+4] = 0.003499; daa[6*20+5] = 4.128591;
+
+	    daa[7*20+0] = 2.066040; daa[7*20+1] = 0.390192; daa[7*20+2] = 1.437645; daa[7*20+3] = 0.844926; daa[7*20+4] = 0.569265; daa[7*20+5] = 0.267959; daa[7*20+6] = 0.348847;
+ 
+	    daa[8*20+0] = 0.358858; daa[8*20+1] = 2.426601; daa[8*20+2] = 4.509238; daa[8*20+3] = 0.927114; daa[8*20+4] = 0.640543; daa[8*20+5] = 4.813505; daa[8*20+6] = 0.423881; 
+	    daa[8*20+7] = 0.311484;
+
+	    daa[9*20+0] = 0.149830; daa[9*20+1] = 0.126991; daa[9*20+2] = 0.191503; daa[9*20+3] = 0.010690; daa[9*20+4] = 0.320627; daa[9*20+5] = 0.072854; daa[9*20+6] = 0.044265; 
+	    daa[9*20+7] = 0.008705; daa[9*20+8] = 0.108882; 
+
+	    daa[10*20+0] = 0.395337; daa[10*20+1] = 0.301848; daa[10*20+2] = 0.068427; daa[10*20+3] = 0.015076; daa[10*20+4] = 0.594007; daa[10*20+5] = 0.582457; daa[10*20+6] = 0.069673; 
+	    daa[10*20+7] = 0.044261; daa[10*20+8] = 0.366317; daa[10*20+9] = 4.145067 ;
+
+	    daa[11*20+0] = 0.536518; daa[11*20+1] = 6.326067; daa[11*20+2] = 2.145078; daa[11*20+3] = 0.282959; daa[11*20+4] = 0.013266; daa[11*20+5] = 3.234294; daa[11*20+6] = 1.807177; 
+	    daa[11*20+7] = 0.296636; daa[11*20+8] = 0.697264; daa[11*20+9] = 0.159069; daa[11*20+10] = 0.137500;
+
+
+	    daa[12*20+0] = 1.124035; daa[12*20+1] = 0.484133; daa[12*20+2] = 0.371004; daa[12*20+3] = 0.025548; daa[12*20+4] = 0.893680; daa[12*20+5] = 1.672569; daa[12*20+6] = 0.173735; 
+	    daa[12*20+7] = 0.139538; daa[12*20+8] = 0.442472; daa[12*20+9] = 4.273607; daa[12*20+10] = 6.312358; daa[12*20+11] = 0.656604;
+
+	    daa[13*20+0] = 0.253701; daa[13*20+1] = 0.052722;daa[13*20+2] = 0.089525; daa[13*20+3] = 0.017416; daa[13*20+4] = 1.105251; daa[13*20+5] = 0.035855; daa[13*20+6] = 0.018811; 
+	    daa[13*20+7] = 0.089586; daa[13*20+8] = 0.682139; daa[13*20+9] = 1.112727; daa[13*20+10] = 2.592692; daa[13*20+11] = 0.023918; daa[13*20+12] = 1.798853;
+
+	    daa[14*20+0] = 1.177651; daa[14*20+1] = 0.332533;daa[14*20+2] = 0.161787; daa[14*20+3] = 0.394456; daa[14*20+4] = 0.075382; daa[14*20+5] = 0.624294; daa[14*20+6] = 0.419409; 
+	    daa[14*20+7] = 0.196961; daa[14*20+8] = 0.508851; daa[14*20+9] = 0.078281; daa[14*20+10] = 0.249060; daa[14*20+11] = 0.390322; daa[14*20+12] = 0.099849; 
+	    daa[14*20+13] = 0.094464;
+ 
+	    daa[15*20+0] = 4.727182; daa[15*20+1] = 0.858151;daa[15*20+2] = 4.008358; daa[15*20+3] = 1.240275; daa[15*20+4] = 2.784478; daa[15*20+5] = 1.223828; daa[15*20+6] = 0.611973; 
+	    daa[15*20+7] = 1.739990; daa[15*20+8] = 0.990012; daa[15*20+9] = 0.064105; daa[15*20+10] = 0.182287; daa[15*20+11] = 0.748683; daa[15*20+12] = 0.346960; 
+	    daa[15*20+13] = 0.361819; daa[15*20+14] = 1.338132;
+ 
+	    daa[16*20+0] = 2.139501; daa[16*20+1] = 0.578987;daa[16*20+2] = 2.000679; daa[16*20+3] = 0.425860; daa[16*20+4] = 1.143480; daa[16*20+5] = 1.080136; daa[16*20+6] = 0.604545; 
+	    daa[16*20+7] = 0.129836; daa[16*20+8] = 0.584262; daa[16*20+9] = 1.033739; daa[16*20+10] = 0.302936; daa[16*20+11] = 1.136863; daa[16*20+12] = 2.020366; 
+	    daa[16*20+13] = 0.165001; daa[16*20+14] = 0.571468; daa[16*20+15] = 6.472279;
+
+	    daa[17*20+0] = 0.180717; daa[17*20+1] = 0.593607;daa[17*20+2] = 0.045376; daa[17*20+3] = 0.029890; daa[17*20+4] = 0.670128; daa[17*20+5] = 0.236199; daa[17*20+6] = 0.077852; 
+	    daa[17*20+7] = 0.268491; daa[17*20+8] = 0.597054; daa[17*20+9] = 0.111660; daa[17*20+10] = 0.619632; daa[17*20+11] = 0.049906; daa[17*20+12] = 0.696175; 
+	    daa[17*20+13] = 2.457121; daa[17*20+14] = 0.095131; daa[17*20+15] = 0.248862; daa[17*20+16] = 0.140825;
+
+	    daa[18*20+0] = 0.218959; daa[18*20+1] = 0.314440;daa[18*20+2] = 0.612025; daa[18*20+3] = 0.135107; daa[18*20+4] = 1.165532; daa[18*20+5] = 0.257336; daa[18*20+6] = 0.120037; 
+	    daa[18*20+7] = 0.054679; daa[18*20+8] = 5.306834; daa[18*20+9] = 0.232523; daa[18*20+10] = 0.299648; daa[18*20+11] = 0.131932; daa[18*20+12] = 0.481306; 
+	    daa[18*20+13] = 7.803902; daa[18*20+14] = 0.089613; daa[18*20+15] = 0.400547; daa[18*20+16] = 0.245841; daa[18*20+17] = 3.151815;
+
+	    daa[19*20+0] = 2.547870; daa[19*20+1] = 0.170887;daa[19*20+2] = 0.083688; daa[19*20+3] = 0.037967; daa[19*20+4] = 1.959291; daa[19*20+5] = 0.210332; daa[19*20+6] = 0.245034; 
+	    daa[19*20+7] = 0.076701; daa[19*20+8] = 0.119013; daa[19*20+9] = 10.649107; daa[19*20+10] = 1.702745; daa[19*20+11] = 0.185202; daa[19*20+12] = 1.898718; 
+	    daa[19*20+13] = 0.654683; daa[19*20+14] = 0.296501; daa[19*20+15] = 0.098369; daa[19*20+16] = 2.188158; daa[19*20+17] = 0.189510; daa[19*20+18] = 0.249313;
+	    
+	    f[0]  = 0.07906;
+	    f[1]  = 0.05594; 
+	    f[2]  = 0.04198; 
+	    f[3]  = 0.05305; 
+	    f[4]  = 0.01294; 
+	    f[5]  = 0.04077; 
+	    f[6]  = 0.07158; 
+	    f[7]  = 0.05734; 
+	    f[8]  = 0.02235; 
+	    f[9]  = 0.06216; 
+	    f[10] = 0.09908; 
+	    f[11] = 0.06460; 
+	    f[12] = 0.02295; 
+	    f[13] = 0.04230; 
+	    f[14] = 0.04404; 
+	    f[15] = 0.06120; 
+	    f[16] = 0.05329; 
+	    f[17] = 0.01207; 
+	    f[18] = 0.03415; 
+	    f[19] = 0.06915; 	   
+	  }	  
+	  break;
+	  case PLL_LG4:
+	  {
+	    double 
+	      rates[4][190] = 
+	      {
+		{
+		  0.269343
+		  , 0.254612, 0.150988
+		  , 0.236821, 0.031863, 0.659648
+		  , 2.506547, 0.938594, 0.975736, 0.175533
+		  , 0.359080, 0.348288, 0.697708, 0.086573, 0.095967
+		  , 0.304674, 0.156000, 0.377704, 0.449140, 0.064706, 4.342595
+		  , 1.692015, 0.286638, 0.565095, 0.380358, 0.617945, 0.202058, 0.264342
+		  , 0.251974, 0.921633, 1.267609, 0.309692, 0.390429, 2.344059, 0.217750, 0.104842
+		  , 1.085220, 0.325624, 0.818658, 0.037814, 1.144150, 0.534567, 0.222793, 0.062682, 0.567431
+		  , 0.676353, 0.602366, 0.217027, 0.007533, 1.595775, 0.671143, 0.158424, 0.070463, 0.764255, 8.226528
+		  , 0.179155, 0.971338, 1.343718, 0.133744, 0.122468, 0.983857, 0.994128, 0.220916, 0.410581, 0.387487, 0.181110
+		  , 1.636817, 0.515217, 0.670461, 0.071252, 1.534848, 5.288642, 0.255628, 0.094198, 0.257229, 25.667158, 6.819689, 1.591212
+		  , 0.235498, 0.123932, 0.099793, 0.030425, 0.897279, 0.112229, 0.022529, 0.047488, 0.762914, 1.344259, 0.865691, 0.038921, 2.030833
+		  , 1.265605, 0.040163, 0.173354, 0.027579, 0.259961, 0.580374, 0.088041, 0.145595, 0.143676, 0.298859, 1.020117, 0.000714, 0.190019, 0.093964
+		  , 5.368405, 0.470952, 5.267140, 0.780505, 4.986071, 0.890554, 0.377949, 1.755515, 0.786352, 0.527246, 0.667783, 0.659948, 0.731921, 0.837669, 1.355630
+		  , 1.539394, 0.326789, 1.688169, 0.283738, 1.389282, 0.329821, 0.231770, 0.117017, 0.449977, 3.531600, 0.721586, 0.497588, 2.691697, 0.152088, 0.698040, 16.321298
+		  , 0.140944, 0.375611, 0.025163, 0.002757, 0.801456, 0.257253, 0.103678, 0.132995, 0.345834, 0.377156, 0.839647, 0.176970, 0.505682, 1.670170, 0.091298, 0.210096, 0.013165
+		  , 0.199836, 0.146857, 0.806275, 0.234246, 1.436970, 0.319669, 0.010076, 0.036859, 3.503317, 0.598632, 0.738969, 0.154436, 0.579000, 4.245524, 0.074524, 0.454195, 0.232913, 1.178490
+		  , 9.435529, 0.285934, 0.395670, 0.130890, 6.097263, 0.516259, 0.503665, 0.222960, 0.149143, 13.666175, 2.988174, 0.162725, 5.973826, 0.843416, 0.597394, 0.701149, 4.680002, 0.300085, 0.416262
+		},
+		{
+		  0.133720
+		  , 0.337212, 0.749052
+		  , 0.110918, 0.105087, 4.773487
+		  , 3.993460, 0.188305, 1.590332, 0.304942
+		  , 0.412075, 2.585774, 1.906884, 0.438367, 0.242076
+		  , 0.435295, 0.198278, 0.296366, 7.470333, 0.008443, 3.295515
+		  , 7.837540, 0.164607, 0.431724, 0.153850, 1.799716, 0.269744, 0.242866
+		  , 0.203872, 2.130334, 9.374479, 1.080878, 0.152458, 12.299133, 0.279589, 0.089714
+		  , 0.039718, 0.024553, 0.135254, 0.014979, 0.147498, 0.033964, 0.005585, 0.007248, 0.022746
+		  , 0.075784, 0.080091, 0.084971, 0.014128, 0.308347, 0.500836, 0.022833, 0.022999, 0.161270, 1.511682
+		  , 0.177662, 10.373708, 1.036721, 0.038303, 0.043030, 2.181033, 0.321165, 0.103050, 0.459502, 0.021215, 0.078395
+		  , 0.420784, 0.192765, 0.329545, 0.008331, 0.883142, 1.403324, 0.168673, 0.160728, 0.612573, 1.520889, 7.763266, 0.307903
+		  , 0.071268, 0.019652, 0.088753, 0.013547, 0.566609, 0.071878, 0.020050, 0.041022, 0.625361, 0.382806, 1.763059, 0.044644, 1.551911
+		  , 0.959127, 1.496585, 0.377794, 0.332010, 0.318192, 1.386970, 0.915904, 0.224255, 2.611479, 0.029351, 0.068250, 1.542356, 0.047525, 0.182715
+		  , 11.721512, 0.359408, 2.399158, 0.219464, 9.104192, 0.767563, 0.235229, 3.621219, 0.971955, 0.033780, 0.043035, 0.236929, 0.319964, 0.124977, 0.840651
+		  , 2.847068, 0.218463, 1.855386, 0.109808, 4.347048, 0.765848, 0.164569, 0.312024, 0.231569, 0.356327, 0.159597, 0.403210, 1.135162, 0.106903, 0.269190, 9.816481
+		  , 0.030203, 0.387292, 0.118878, 0.067287, 0.190240, 0.122113, 0.007023, 0.137411, 0.585141, 0.020634, 0.228824, 0.000122, 0.474862, 3.135128, 0.030313, 0.093830, 0.119152
+		  , 0.067183, 0.130101, 0.348730, 0.061798, 0.301198, 0.095382, 0.095764, 0.044628, 2.107384, 0.046105, 0.100117, 0.017073, 0.192383, 8.367641, 0.000937, 0.137416, 0.044722, 4.179782
+		  , 0.679398, 0.041567, 0.092408, 0.023701, 1.271187, 0.115566, 0.055277, 0.086988, 0.060779, 8.235167, 0.609420, 0.061764, 0.581962, 0.184187, 0.080246, 0.098033, 1.438350, 0.023439, 0.039124
+		},	    
+		{
+		  0.421017
+		  , 0.316236, 0.693340
+		  , 0.285984, 0.059926, 6.158219
+		  , 4.034031, 1.357707, 0.708088, 0.063669
+		  , 0.886972, 2.791622, 1.701830, 0.484347, 0.414286
+		  , 0.760525, 0.233051, 0.378723, 4.032667, 0.081977, 4.940411
+		  , 0.754103, 0.402894, 2.227443, 1.102689, 0.416576, 0.459376, 0.508409
+		  , 0.571422, 2.319453, 5.579973, 0.885376, 1.439275, 4.101979, 0.576745, 0.428799
+		  , 0.162152, 0.085229, 0.095692, 0.006129, 0.490937, 0.104843, 0.045514, 0.004705, 0.098934
+		  , 0.308006, 0.287051, 0.056994, 0.007102, 0.958988, 0.578990, 0.067119, 0.024403, 0.342983, 3.805528
+		  , 0.390161, 7.663209, 1.663641, 0.105129, 0.135029, 3.364474, 0.652618, 0.457702, 0.823674, 0.129858, 0.145630
+		  , 1.042298, 0.364551, 0.293222, 0.037983, 1.486520, 1.681752, 0.192414, 0.070498, 0.222626, 4.529623, 4.781730, 0.665308
+		  , 0.362476, 0.073439, 0.129245, 0.020078, 1.992483, 0.114549, 0.023272, 0.064490, 1.491794, 1.113437, 2.132006, 0.041677, 1.928654
+		  , 1.755491, 0.087050, 0.099325, 0.163817, 0.242851, 0.322939, 0.062943, 0.198698, 0.192904, 0.062948, 0.180283, 0.059655, 0.129323, 0.065778
+		  , 3.975060, 0.893398, 5.496314, 1.397313, 3.575120, 1.385297, 0.576191, 1.733288, 1.021255, 0.065131, 0.129115, 0.600308, 0.387276, 0.446001, 1.298493
+		  , 2.565079, 0.534056, 2.143993, 0.411388, 2.279084, 0.893006, 0.528209, 0.135731, 0.518741, 0.972662, 0.280700, 0.890086, 1.828755, 0.189028, 0.563778, 7.788147
+		  , 0.283631, 0.497926, 0.075454, 0.043794, 1.335322, 0.308605, 0.140137, 0.150797, 1.409726, 0.119868, 0.818331, 0.080591, 1.066017, 3.754687, 0.073415, 0.435046, 0.197272
+		  , 0.242513, 0.199157, 0.472207, 0.085937, 2.039787, 0.262751, 0.084578, 0.032247, 7.762326, 0.153966, 0.299828, 0.117255, 0.438215, 14.506235, 0.089180, 0.352766, 0.215417, 5.054245
+		  , 2.795818, 0.107130, 0.060909, 0.029724, 2.986426, 0.197267, 0.196977, 0.044327, 0.116751, 7.144311, 1.848622, 0.118020, 1.999696, 0.705747, 0.272763, 0.096935, 1.820982, 0.217007, 0.172975
+		},
+		{
+		  0.576160
+		  , 0.567606, 0.498643
+		  , 0.824359, 0.050698, 3.301401
+		  , 0.822724, 4.529235, 1.291808, 0.101930
+		  , 1.254238, 2.169809, 1.427980, 0.449474, 0.868679
+		  , 1.218615, 0.154502, 0.411471, 3.172277, 0.050239, 2.138661
+		  , 1.803443, 0.604673, 2.125496, 1.276384, 1.598679, 0.502653, 0.479490
+		  , 0.516862, 2.874265, 4.845769, 0.719673, 3.825677, 4.040275, 0.292773, 0.596643
+		  , 0.180898, 0.444586, 0.550969, 0.023542, 2.349573, 0.370160, 0.142187, 0.016618, 0.500788
+		  , 0.452099, 0.866322, 0.201033, 0.026731, 2.813990, 1.645178, 0.135556, 0.072152, 1.168817, 5.696116
+		  , 0.664186, 2.902886, 2.101971, 0.127988, 0.200218, 2.505933, 0.759509, 0.333569, 0.623100, 0.547454, 0.363656
+		  , 0.864415, 0.835049, 0.632649, 0.079201, 2.105931, 1.633544, 0.216462, 0.252419, 0.665406, 7.994105, 11.751178, 1.096842
+		  , 0.324478, 0.208947, 0.280339, 0.041683, 4.788477, 0.107022, 0.067711, 0.171320, 3.324779, 2.965328, 5.133843, 0.084856, 4.042591
+		  , 1.073043, 0.173826, 0.041985, 0.270336, 0.121299, 0.351384, 0.228565, 0.225318, 0.376089, 0.058027, 0.390354, 0.214230, 0.058954, 0.126299
+		  , 3.837562, 0.884342, 4.571911, 0.942751, 6.592827, 1.080063, 0.465397, 3.137614, 1.119667, 0.362516, 0.602355, 0.716940, 0.506796, 1.444484, 1.432558
+		  , 2.106026, 0.750016, 2.323325, 0.335915, 1.654673, 1.194017, 0.617231, 0.318671, 0.801030, 4.455842, 0.580191, 1.384210, 3.522468, 0.473128, 0.432718, 5.716300
+		  , 0.163720, 0.818102, 0.072322, 0.068275, 3.305436, 0.373790, 0.054323, 0.476587, 1.100360, 0.392946, 1.703323, 0.085720, 1.725516, 5.436253, 0.053108, 0.498594, 0.231832
+		  , 0.241167, 0.302440, 1.055095, 0.246940, 9.741942, 0.249895, 0.129973, 0.052363, 11.542498, 1.047449, 1.319667, 0.139770, 1.330225, 26.562270, 0.046986, 0.737653, 0.313460, 5.165098
+		  , 1.824586, 0.435795, 0.179086, 0.091739, 3.609570, 0.649507, 0.656681, 0.225234, 0.473437, 19.897252, 3.001995, 0.452926, 3.929598, 1.692159, 0.370204, 0.373501, 3.329822, 0.326593, 0.860743
+		}
+	      };
+	    
+	    double
+	      freqs[4][20] = 
+	      {{0.082276,0.055172,0.043853,0.053484,0.018957,0.028152,0.046679,0.157817,0.033297,0.028284,0.054284,0.025275,0.023665,0.041874,0.063071,0.066501,0.065424,0.023837,0.038633,0.049465},
+	       {0.120900,0.036460,0.026510,0.040410,0.015980,0.021132,0.025191,0.036369,0.015884,0.111029,0.162852,0.024820,0.028023,0.074058,0.012065,0.041963,0.039072,0.012666,0.040478,0.114137},
+	       {0.072639,0.051691,0.038642,0.055580,0.009829,0.031374,0.048731,0.065283,0.023791,0.086640,0.120847,0.052177,0.026728,0.032589,0.039238,0.046748,0.053361,0.008024,0.037426,0.098662},
+	       {0.104843,0.078835,0.043513,0.090498,0.002924,0.066163,0.151640,0.038843,0.022556,0.018383,0.038687,0.104462,0.010166,0.009089,0.066950,0.053667,0.049486,0.004409,0.012924,0.031963}};
+	    
+	    int 
+	      i, 
+	      j, 
+	      r = 0;
+	    
+	    for(i = 1; i < 20; i++)
+	      for(j = 0; j < i; j++)
+		{
+		  daa[i * 20 + j] = rates[lg4_index][r];
+		  r++;
+		}
+	    
+	    assert(r == 190);
+	    
+	    for(i = 0; i < 20; i++)
+	      f[i] = freqs[lg4_index][i];	  
+	    
+	  }
+	  break;
+	case PLL_MTART:
+	  {
+	   
+
+	    daa[1*20+0]=   0.2;
+	    daa[2*20+0]=   0.2;
+           daa[2*20+1]=   0.2;
+           daa[3*20+0]=   1;
+           daa[3*20+1]=   4;
+           daa[3*20+2]=   500;
+           daa[4*20+0]=   254;
+           daa[4*20+1]=   36;
+           daa[4*20+2]=   98;
+           daa[4*20+3]=   11;
+           daa[5*20+0]=   0.2;
+           daa[5*20+1]=   154;
+           daa[5*20+2]=   262;
+           daa[5*20+3]=   0.2;
+           daa[5*20+4]=   0.2;
+           daa[6*20+0]=   0.2;
+           daa[6*20+1]=   0.2;
+           daa[6*20+2]=   183;
+           daa[6*20+3]=   862;
+           daa[6*20+4]=   0.2;
+           daa[6*20+5]=   262;
+           daa[7*20+0]=   200;
+           daa[7*20+1]=   0.2;
+           daa[7*20+2]=   121;
+           daa[7*20+3]=   12;
+           daa[7*20+4]=   81;
+           daa[7*20+5]=   3;
+           daa[7*20+6]=   44;
+           daa[8*20+0]=   0.2;
+           daa[8*20+1]=   41;
+           daa[8*20+2]=   180;
+           daa[8*20+3]=   0.2;
+           daa[8*20+4]=   12;
+           daa[8*20+5]=   314;
+           daa[8*20+6]=   15;
+           daa[8*20+7]=   0.2;
+           daa[9*20+0]=   26;
+           daa[9*20+1]=   2;
+           daa[9*20+2]=   21;
+           daa[9*20+3]=   7;
+           daa[9*20+4]=   63;
+           daa[9*20+5]=   11;
+           daa[9*20+6]=   7;
+           daa[9*20+7]=   3;
+           daa[9*20+8]=   0.2;
+           daa[10*20+0]=  4;
+           daa[10*20+1]=  2;
+           daa[10*20+2]=  13;
+           daa[10*20+3]=  1;
+           daa[10*20+4]=  79;
+           daa[10*20+5]=  16;
+           daa[10*20+6]=  2;
+           daa[10*20+7]=  1;
+           daa[10*20+8]=  6;
+           daa[10*20+9]=  515;
+           daa[11*20+0]=  0.2;
+           daa[11*20+1]=  209;
+           daa[11*20+2]=  467;
+           daa[11*20+3]=  2;
+           daa[11*20+4]=  0.2;
+           daa[11*20+5]=  349;
+           daa[11*20+6]=  106;
+           daa[11*20+7]=  0.2;
+           daa[11*20+8]=  0.2;
+           daa[11*20+9]=  3;
+           daa[11*20+10]= 4;
+           daa[12*20+0]=  121;
+           daa[12*20+1]=  5;
+           daa[12*20+2]=  79;
+           daa[12*20+3]=  0.2;
+           daa[12*20+4]=  312;
+           daa[12*20+5]=  67;
+           daa[12*20+6]=  0.2;
+           daa[12*20+7]=  56;
+           daa[12*20+8]=  0.2;
+           daa[12*20+9]=  515;
+           daa[12*20+10]= 885;
+           daa[12*20+11]= 106;
+           daa[13*20+0]=  13;
+           daa[13*20+1]=  5;
+           daa[13*20+2]=  20;
+           daa[13*20+3]=  0.2;
+           daa[13*20+4]=  184;
+           daa[13*20+5]=  0.2;
+           daa[13*20+6]=  0.2;
+           daa[13*20+7]=  1;
+           daa[13*20+8]=  14;
+           daa[13*20+9]=  118;
+           daa[13*20+10]= 263;
+           daa[13*20+11]= 11;
+           daa[13*20+12]= 322;
+           daa[14*20+0]=  49;
+           daa[14*20+1]=  0.2;
+           daa[14*20+2]=  17;
+           daa[14*20+3]=  0.2;
+           daa[14*20+4]=  0.2;
+           daa[14*20+5]=  39;
+           daa[14*20+6]=  8;
+           daa[14*20+7]=  0.2;
+           daa[14*20+8]=  1;
+           daa[14*20+9]=  0.2;
+           daa[14*20+10]= 12;
+           daa[14*20+11]= 17;
+           daa[14*20+12]= 5;
+           daa[14*20+13]= 15;
+           daa[15*20+0]=  673;
+           daa[15*20+1]=  3;
+           daa[15*20+2]=  398;
+           daa[15*20+3]=  44;
+           daa[15*20+4]=  664;
+           daa[15*20+5]=  52;
+           daa[15*20+6]=  31;
+           daa[15*20+7]=  226;
+           daa[15*20+8]=  11;
+           daa[15*20+9]=  7;
+           daa[15*20+10]= 8;
+           daa[15*20+11]= 144;
+           daa[15*20+12]= 112;
+           daa[15*20+13]= 36;
+           daa[15*20+14]= 87;
+           daa[16*20+0]=  244;
+           daa[16*20+1]=  0.2;
+           daa[16*20+2]=  166;
+           daa[16*20+3]=  0.2;
+           daa[16*20+4]=  183;
+           daa[16*20+5]=  44;
+           daa[16*20+6]=  43;
+           daa[16*20+7]=  0.2;
+           daa[16*20+8]=  19;
+           daa[16*20+9]=  204;
+           daa[16*20+10]= 48;
+           daa[16*20+11]= 70;
+           daa[16*20+12]= 289;
+           daa[16*20+13]= 14;
+           daa[16*20+14]= 47;
+           daa[16*20+15]= 660;
+           daa[17*20+0]=  0.2;
+           daa[17*20+1]=  0.2;
+           daa[17*20+2]=  8;
+           daa[17*20+3]=  0.2;
+           daa[17*20+4]=  22;
+           daa[17*20+5]=  7;
+           daa[17*20+6]=  11;
+           daa[17*20+7]=  2;
+           daa[17*20+8]=  0.2;
+           daa[17*20+9]=  0.2;
+           daa[17*20+10]= 21;
+           daa[17*20+11]= 16;
+           daa[17*20+12]= 71;
+           daa[17*20+13]= 54;
+           daa[17*20+14]= 0.2;
+           daa[17*20+15]= 2;
+           daa[17*20+16]= 0.2;
+           daa[18*20+0]=  1;
+           daa[18*20+1]=  4;
+           daa[18*20+2]=  251;
+           daa[18*20+3]=  0.2;
+           daa[18*20+4]=  72;
+           daa[18*20+5]=  87;
+           daa[18*20+6]=  8;
+           daa[18*20+7]=  9;
+           daa[18*20+8]=  191;
+           daa[18*20+9]=  12;
+           daa[18*20+10]= 20;
+           daa[18*20+11]= 117;
+           daa[18*20+12]= 71;
+           daa[18*20+13]= 792;
+           daa[18*20+14]= 18;
+           daa[18*20+15]= 30;
+           daa[18*20+16]= 46;
+           daa[18*20+17]= 38;
+           daa[19*20+0]=  340;
+           daa[19*20+1]=  0.2;
+           daa[19*20+2]=  23;
+           daa[19*20+3]=  0.2;
+           daa[19*20+4]=  350;
+           daa[19*20+5]=  0.2;
+           daa[19*20+6]=  14;
+           daa[19*20+7]=  3;
+           daa[19*20+8]=  0.2;
+           daa[19*20+9]=  1855;
+           daa[19*20+10]= 85;
+           daa[19*20+11]= 26;
+           daa[19*20+12]= 281;
+           daa[19*20+13]= 52;
+           daa[19*20+14]= 32;
+           daa[19*20+15]= 61;
+           daa[19*20+16]= 544;
+           daa[19*20+17]= 0.2;
+           daa[19*20+18]= 2;
+           
+           f[0]=  0.054116;
+           f[1]=  0.018227;
+           f[2]=  0.039903;
+           f[3]=  0.020160;
+           f[4]=  0.009709;
+           f[5]=  0.018781;
+           f[6]=  0.024289;
+           f[7]=  0.068183;
+           f[8]=  0.024518;
+           f[9]=  0.092638;
+           f[10]= 0.148658;
+           f[11]= 0.021718;
+           f[12]= 0.061453;
+           f[13]= 0.088668;
+           f[14]= 0.041826;
+           f[15]= 0.091030;
+           f[16]= 0.049194;
+           f[17]= 0.029786;
+           f[18]= 0.039443;
+           f[19]= 0.057700;
+	  }
+	  break;
+	case PLL_MTZOA:
+	  {
+           daa[1*20+0]=   3.3;
+           daa[2*20+0]=   1.7;
+           daa[2*20+1]=   33.6;
+           daa[3*20+0]=   16.1;
+           daa[3*20+1]=   3.2;
+           daa[3*20+2]=   617.0;
+           daa[4*20+0]=   272.5;
+           daa[4*20+1]=   61.1;
+           daa[4*20+2]=   94.6;
+           daa[4*20+3]=   9.5;
+           daa[5*20+0]=   7.3;
+           daa[5*20+1]=   231.0;
+           daa[5*20+2]=   190.3;
+           daa[5*20+3]=   19.3;
+           daa[5*20+4]=   49.1;
+           daa[6*20+0]=   17.1;
+           daa[6*20+1]=   6.4;
+           daa[6*20+2]=   174.0;
+           daa[6*20+3]=   883.6;
+           daa[6*20+4]=   3.4;
+           daa[6*20+5]=   349.4;
+           daa[7*20+0]=   289.3;
+           daa[7*20+1]=   7.2;
+           daa[7*20+2]=   99.3;
+           daa[7*20+3]=   26.0;
+           daa[7*20+4]=   82.4;
+           daa[7*20+5]=   8.9;
+           daa[7*20+6]=   43.1;
+           daa[8*20+0]=   2.3;
+           daa[8*20+1]=   61.7;
+           daa[8*20+2]=   228.9;
+           daa[8*20+3]=   55.6;
+           daa[8*20+4]=   37.5;
+           daa[8*20+5]=   421.8;
+           daa[8*20+6]=   14.9;
+           daa[8*20+7]=   7.4;
+           daa[9*20+0]=   33.2;
+           daa[9*20+1]=   0.2;
+           daa[9*20+2]=   24.3;
+           daa[9*20+3]=   1.5;
+           daa[9*20+4]=   48.8;
+           daa[9*20+5]=   0.2;
+           daa[9*20+6]=   7.3;
+           daa[9*20+7]=   3.4;
+           daa[9*20+8]=   1.6;
+           daa[10*20+0]=  15.6;
+           daa[10*20+1]=  4.1;
+           daa[10*20+2]=  7.9;
+           daa[10*20+3]=  0.5;
+           daa[10*20+4]=  59.7;
+           daa[10*20+5]=  23.0;
+           daa[10*20+6]=  1.0;
+           daa[10*20+7]=  3.5;
+           daa[10*20+8]=  6.6;
+           daa[10*20+9]=  425.2;
+           daa[11*20+0]=  0.2;
+           daa[11*20+1]=  292.3;
+           daa[11*20+2]=  413.4;
+           daa[11*20+3]=  0.2;
+           daa[11*20+4]=  0.2;
+           daa[11*20+5]=  334.0;
+           daa[11*20+6]=  163.2;
+           daa[11*20+7]=  10.1;
+           daa[11*20+8]=  23.9;
+           daa[11*20+9]=  8.4;
+           daa[11*20+10]= 6.7;
+           daa[12*20+0]=  136.5;
+           daa[12*20+1]=  3.8;
+           daa[12*20+2]=  73.7;
+           daa[12*20+3]=  0.2;
+           daa[12*20+4]=  264.8;
+           daa[12*20+5]=  83.9;
+           daa[12*20+6]=  0.2;
+           daa[12*20+7]=  52.2;
+           daa[12*20+8]=  7.1;
+           daa[12*20+9]=  449.7;
+           daa[12*20+10]= 636.3;
+           daa[12*20+11]= 83.0;
+           daa[13*20+0]=  26.5;
+           daa[13*20+1]=  0.2;
+           daa[13*20+2]=  12.9;
+           daa[13*20+3]=  2.0;
+           daa[13*20+4]=  167.8;
+           daa[13*20+5]=  9.5;
+           daa[13*20+6]=  0.2;
+           daa[13*20+7]=  5.8;
+           daa[13*20+8]=  13.1;
+           daa[13*20+9]=  90.3;
+           daa[13*20+10]= 234.2;
+           daa[13*20+11]= 16.3;
+           daa[13*20+12]= 215.6;
+           daa[14*20+0]=  61.8;
+           daa[14*20+1]=  7.5;
+           daa[14*20+2]=  22.6;
+           daa[14*20+3]=  0.2;
+           daa[14*20+4]=  8.1;
+           daa[14*20+5]=  52.2;
+           daa[14*20+6]=  20.6;
+           daa[14*20+7]=  1.3;
+           daa[14*20+8]=  15.6;
+           daa[14*20+9]=  2.6;
+           daa[14*20+10]= 11.4;
+           daa[14*20+11]= 24.3;
+           daa[14*20+12]= 5.4;
+           daa[14*20+13]= 10.5;
+           daa[15*20+0]=  644.9;
+           daa[15*20+1]=  11.8;
+           daa[15*20+2]=  420.2;
+           daa[15*20+3]=  51.4;
+           daa[15*20+4]=  656.3;
+           daa[15*20+5]=  96.4;
+           daa[15*20+6]=  38.4;
+           daa[15*20+7]=  257.1;
+           daa[15*20+8]=  23.1;
+           daa[15*20+9]=  7.2;
+           daa[15*20+10]= 15.2;
+           daa[15*20+11]= 144.9;
+           daa[15*20+12]= 95.3;
+           daa[15*20+13]= 32.2;
+           daa[15*20+14]= 79.7;
+           daa[16*20+0]=  378.1;
+           daa[16*20+1]=  3.2;
+           daa[16*20+2]=  184.6;
+           daa[16*20+3]=  2.3;
+           daa[16*20+4]=  199.0;
+           daa[16*20+5]=  39.4;
+           daa[16*20+6]=  34.5;
+           daa[16*20+7]=  5.2;
+           daa[16*20+8]=  19.4;
+           daa[16*20+9]=  222.3;
+           daa[16*20+10]= 50.0;
+           daa[16*20+11]= 75.5;
+           daa[16*20+12]= 305.1;
+           daa[16*20+13]= 19.3;
+           daa[16*20+14]= 56.9;
+           daa[16*20+15]= 666.3;
+           daa[17*20+0]=  3.1;
+           daa[17*20+1]=  16.9;
+           daa[17*20+2]=  6.4;
+           daa[17*20+3]=  0.2;
+           daa[17*20+4]=  36.1;
+           daa[17*20+5]=  6.1;
+           daa[17*20+6]=  3.5;
+           daa[17*20+7]=  12.3;
+           daa[17*20+8]=  4.5;
+           daa[17*20+9]=  9.7;
+           daa[17*20+10]= 27.2;
+           daa[17*20+11]= 6.6;
+           daa[17*20+12]= 48.7;
+           daa[17*20+13]= 58.2;
+           daa[17*20+14]= 1.3;
+           daa[17*20+15]= 10.3;
+           daa[17*20+16]= 3.6;
+           daa[18*20+0]=  2.1;
+           daa[18*20+1]=  13.8;
+           daa[18*20+2]=  141.6;
+           daa[18*20+3]=  13.9;
+           daa[18*20+4]=  76.7;
+           daa[18*20+5]=  52.3;
+           daa[18*20+6]=  10.0;
+           daa[18*20+7]=  4.3;
+           daa[18*20+8]=  266.5;
+           daa[18*20+9]=  13.1;
+           daa[18*20+10]= 5.7;
+           daa[18*20+11]= 45.0;
+           daa[18*20+12]= 41.4;
+           daa[18*20+13]= 590.5;
+           daa[18*20+14]= 4.2;
+           daa[18*20+15]= 29.7;
+           daa[18*20+16]= 29.0;
+           daa[18*20+17]= 79.8;
+           daa[19*20+0]=  321.9;
+           daa[19*20+1]=  5.1;
+           daa[19*20+2]=  7.1;
+           daa[19*20+3]=  3.7;
+           daa[19*20+4]=  243.8;
+           daa[19*20+5]=  9.0;
+           daa[19*20+6]=  16.3;
+           daa[19*20+7]=  23.7;
+           daa[19*20+8]=  0.3;
+           daa[19*20+9]=  1710.6;
+           daa[19*20+10]= 126.1;
+           daa[19*20+11]= 11.1;
+           daa[19*20+12]= 279.6;
+           daa[19*20+13]= 59.6;
+           daa[19*20+14]= 17.9;
+           daa[19*20+15]= 49.5;
+           daa[19*20+16]= 396.4;
+           daa[19*20+17]= 13.7;
+           daa[19*20+18]= 15.6;
+           
+           f[0]=  0.069;
+           f[1]=  0.021;
+           f[2]=  0.030;
+           f[3]=  0.020;
+           f[4]=  0.010;
+           f[5]=  0.019;
+           f[6]=  0.025;
+           f[7]=  0.072;
+           f[8]=  0.027;
+           f[9]=  0.085;
+           f[10]= 0.157;
+           f[11]= 0.019;
+           f[12]= 0.051;
+           f[13]= 0.082;
+           f[14]= 0.045;
+           f[15]= 0.081;
+           f[16]= 0.056;
+           f[17]= 0.028;
+           f[18]= 0.037;
+           f[19]= 0.066;
+	  }
+	  break;
+	case PLL_PMB:
+	  {
+           daa[1*20+0]=   0.674995699;
+           daa[2*20+0]=   0.589645178;
+           daa[2*20+1]=   1.189067034;
+           daa[3*20+0]=   0.462499504;
+           daa[3*20+1]=   0.605460903;
+           daa[3*20+2]=   3.573373315;
+           daa[4*20+0]=   1.065445546;
+           daa[4*20+1]=   0.31444833;
+           daa[4*20+2]=   0.589852457;
+           daa[4*20+3]=   0.246951424;
+           daa[5*20+0]=   1.111766964;
+           daa[5*20+1]=   2.967840934;
+           daa[5*20+2]=   2.299755865;
+           daa[5*20+3]=   1.686058219;
+           daa[5*20+4]=   0.245163782;
+           daa[6*20+0]=   1.046334652;
+           daa[6*20+1]=   1.201770702;
+           daa[6*20+2]=   1.277836748;
+           daa[6*20+3]=   4.399995525;
+           daa[6*20+4]=   0.091071867;
+           daa[6*20+5]=   4.15967899;
+           daa[7*20+0]=   1.587964372;
+           daa[7*20+1]=   0.523770553;
+           daa[7*20+2]=   1.374854049;
+           daa[7*20+3]=   0.734992057;
+           daa[7*20+4]=   0.31706632;
+           daa[7*20+5]=   0.596789898;
+           daa[7*20+6]=   0.463812837;
+           daa[8*20+0]=   0.580830874;
+           daa[8*20+1]=   1.457127446;
+           daa[8*20+2]=   2.283037894;
+           daa[8*20+3]=   0.839348444;
+           daa[8*20+4]=   0.411543728;
+           daa[8*20+5]=   1.812173605;
+           daa[8*20+6]=   0.877842609;
+           daa[8*20+7]=   0.476331437;
+           daa[9*20+0]=   0.464590585;
+           daa[9*20+1]=   0.35964586;
+           daa[9*20+2]=   0.426069419;
+           daa[9*20+3]=   0.266775558;
+           daa[9*20+4]=   0.417547309;
+           daa[9*20+5]=   0.315256838;
+           daa[9*20+6]=   0.30421529;
+           daa[9*20+7]=   0.180198883;
+           daa[9*20+8]=   0.285186418;
+           daa[10*20+0]=  0.804404505;
+           daa[10*20+1]=  0.520701585;
+           daa[10*20+2]=  0.41009447;
+           daa[10*20+3]=  0.269124919;
+           daa[10*20+4]=  0.450795211;
+           daa[10*20+5]=  0.625792937;
+           daa[10*20+6]=  0.32078471;
+           daa[10*20+7]=  0.259854426;
+           daa[10*20+8]=  0.363981358;
+           daa[10*20+9]=  4.162454693;
+           daa[11*20+0]=  0.831998835;
+           daa[11*20+1]=  4.956476453;
+           daa[11*20+2]=  2.037575629;
+           daa[11*20+3]=  1.114178954;
+           daa[11*20+4]=  0.274163536;
+           daa[11*20+5]=  3.521346591;
+           daa[11*20+6]=  2.415974716;
+           daa[11*20+7]=  0.581001076;
+           daa[11*20+8]=  0.985885486;
+           daa[11*20+9]=  0.374784947;
+           daa[11*20+10]= 0.498011337;
+           daa[12*20+0]=  1.546725076;
+           daa[12*20+1]=  0.81346254;
+           daa[12*20+2]=  0.737846301;
+           daa[12*20+3]=  0.341932741;
+           daa[12*20+4]=  0.618614612;
+           daa[12*20+5]=  2.067388546;
+           daa[12*20+6]=  0.531773639;
+           daa[12*20+7]=  0.465349326;
+           daa[12*20+8]=  0.380925433;
+           daa[12*20+9]=  3.65807012;
+           daa[12*20+10]= 5.002338375;
+           daa[12*20+11]= 0.661095832;
+           daa[13*20+0]=  0.546169219;
+           daa[13*20+1]=  0.303437244;
+           daa[13*20+2]=  0.425193716;
+           daa[13*20+3]=  0.219005213;
+           daa[13*20+4]=  0.669206193;
+           daa[13*20+5]=  0.406042546;
+           daa[13*20+6]=  0.224154698;
+           daa[13*20+7]=  0.35402891;
+           daa[13*20+8]=  0.576231691;
+           daa[13*20+9]=  1.495264661;
+           daa[13*20+10]= 2.392638293;
+           daa[13*20+11]= 0.269496317;
+           daa[13*20+12]= 2.306919847;
+           daa[14*20+0]=  1.241586045;
+           daa[14*20+1]=  0.65577338;
+           daa[14*20+2]=  0.711495595;
+           daa[14*20+3]=  0.775624818;
+           daa[14*20+4]=  0.198679914;
+           daa[14*20+5]=  0.850116543;
+           daa[14*20+6]=  0.794584081;
+           daa[14*20+7]=  0.588254139;
+           daa[14*20+8]=  0.456058589;
+           daa[14*20+9]=  0.366232942;
+           daa[14*20+10]= 0.430073179;
+           daa[14*20+11]= 1.036079005;
+           daa[14*20+12]= 0.337502282;
+           daa[14*20+13]= 0.481144863;
+           daa[15*20+0]=  3.452308792;
+           daa[15*20+1]=  0.910144334;
+           daa[15*20+2]=  2.572577221;
+           daa[15*20+3]=  1.440896785;
+           daa[15*20+4]=  0.99870098;
+           daa[15*20+5]=  1.348272505;
+           daa[15*20+6]=  1.205509425;
+           daa[15*20+7]=  1.402122097;
+           daa[15*20+8]=  0.799966711;
+           daa[15*20+9]=  0.530641901;
+           daa[15*20+10]= 0.402471997;
+           daa[15*20+11]= 1.234648153;
+           daa[15*20+12]= 0.945453716;
+           daa[15*20+13]= 0.613230817;
+           daa[15*20+14]= 1.217683028;
+           daa[16*20+0]=  1.751412803;
+           daa[16*20+1]=  0.89517149;
+           daa[16*20+2]=  1.823161023;
+           daa[16*20+3]=  0.994227284;
+           daa[16*20+4]=  0.847312432;
+           daa[16*20+5]=  1.320626678;
+           daa[16*20+6]=  0.949599791;
+           daa[16*20+7]=  0.542185658;
+           daa[16*20+8]=  0.83039281;
+           daa[16*20+9]=  1.114132523;
+           daa[16*20+10]= 0.779827336;
+           daa[16*20+11]= 1.290709079;
+           daa[16*20+12]= 1.551488041;
+           daa[16*20+13]= 0.718895136;
+           daa[16*20+14]= 0.780913179;
+           daa[16*20+15]= 4.448982584;
+           daa[17*20+0]=  0.35011051;
+           daa[17*20+1]=  0.618778365;
+           daa[17*20+2]=  0.422407388;
+           daa[17*20+3]=  0.362495245;
+           daa[17*20+4]=  0.445669347;
+           daa[17*20+5]=  0.72038474;
+           daa[17*20+6]=  0.261258229;
+           daa[17*20+7]=  0.37874827;
+           daa[17*20+8]=  0.72436751;
+           daa[17*20+9]=  0.516260502;
+           daa[17*20+10]= 0.794797115;
+           daa[17*20+11]= 0.43340962;
+           daa[17*20+12]= 0.768395107;
+           daa[17*20+13]= 3.29519344;
+           daa[17*20+14]= 0.499869138;
+           daa[17*20+15]= 0.496334956;
+           daa[17*20+16]= 0.38372361;
+           daa[18*20+0]=  0.573154753;
+           daa[18*20+1]=  0.628599063;
+           daa[18*20+2]=  0.720013799;
+           daa[18*20+3]=  0.436220437;
+           daa[18*20+4]=  0.55626163;
+           daa[18*20+5]=  0.728970584;
+           daa[18*20+6]=  0.50720003;
+           daa[18*20+7]=  0.284727562;
+           daa[18*20+8]=  2.210952064;
+           daa[18*20+9]=  0.570562395;
+           daa[18*20+10]= 0.811019594;
+           daa[18*20+11]= 0.664884513;
+           daa[18*20+12]= 0.93253606;
+           daa[18*20+13]= 5.894735673;
+           daa[18*20+14]= 0.433748126;
+           daa[18*20+15]= 0.593795813;
+           daa[18*20+16]= 0.523549536;
+           daa[18*20+17]= 2.996248013;
+           daa[19*20+0]=  2.063050067;
+           daa[19*20+1]=  0.388680158;
+           daa[19*20+2]=  0.474418852;
+           daa[19*20+3]=  0.275658381;
+           daa[19*20+4]=  0.998911631;
+           daa[19*20+5]=  0.634408285;
+           daa[19*20+6]=  0.527640634;
+           daa[19*20+7]=  0.314700907;
+           daa[19*20+8]=  0.305792277;
+           daa[19*20+9]=  8.002789424;
+           daa[19*20+10]= 2.113077156;
+           daa[19*20+11]= 0.526184203;
+           daa[19*20+12]= 1.737356217;
+           daa[19*20+13]= 0.983844803;
+           daa[19*20+14]= 0.551333603;
+           daa[19*20+15]= 0.507506011;
+           daa[19*20+16]= 1.89965079;
+           daa[19*20+17]= 0.429570747;
+           daa[19*20+18]= 0.716795463;
+           
+           f[0]=  0.076;
+           f[1]=  0.054;
+           f[2]=  0.038;
+           f[3]=  0.045;
+           f[4]=  0.028;
+           f[5]=  0.034;
+           f[6]=  0.053;
+           f[7]=  0.078;
+           f[8]=  0.030;
+           f[9]=  0.060;
+           f[10]= 0.096;
+           f[11]= 0.052;
+           f[12]= 0.022;
+           f[13]= 0.045;
+           f[14]= 0.042;
+           f[15]= 0.068;
+           f[16]= 0.056;
+           f[17]= 0.016;
+           f[18]= 0.036;
+           f[19]= 0.071;
+	  }
+	  break;
+	case PLL_HIVB:
+	  {
+           daa[1*20+0]=   0.30750700;
+           daa[2*20+0]=   0.00500000;
+           daa[2*20+1]=   0.29554300;
+           daa[3*20+0]=   1.45504000;
+           daa[3*20+1]=   0.00500000;
+           daa[3*20+2]=   17.66120000;
+           daa[4*20+0]=   0.12375800;
+           daa[4*20+1]=   0.35172100;
+           daa[4*20+2]=   0.08606420;
+           daa[4*20+3]=   0.00500000;
+           daa[5*20+0]=   0.05511280;
+           daa[5*20+1]=   3.42150000;
+           daa[5*20+2]=   0.67205200;
+           daa[5*20+3]=   0.00500000;
+           daa[5*20+4]=   0.00500000;
+           daa[6*20+0]=   1.48135000;
+           daa[6*20+1]=   0.07492180;
+           daa[6*20+2]=   0.07926330;
+           daa[6*20+3]=   10.58720000;
+           daa[6*20+4]=   0.00500000;
+           daa[6*20+5]=   2.56020000;
+           daa[7*20+0]=   2.13536000;
+           daa[7*20+1]=   3.65345000;
+           daa[7*20+2]=   0.32340100;
+           daa[7*20+3]=   2.83806000;
+           daa[7*20+4]=   0.89787100;
+           daa[7*20+5]=   0.06191370;
+           daa[7*20+6]=   3.92775000;
+           daa[8*20+0]=   0.08476130;
+           daa[8*20+1]=   9.04044000;
+           daa[8*20+2]=   7.64585000;
+           daa[8*20+3]=   1.91690000;
+           daa[8*20+4]=   0.24007300;
+           daa[8*20+5]=   7.05545000;
+           daa[8*20+6]=   0.11974000;
+           daa[8*20+7]=   0.00500000;
+           daa[9*20+0]=   0.00500000;
+           daa[9*20+1]=   0.67728900;
+           daa[9*20+2]=   0.68056500;
+           daa[9*20+3]=   0.01767920;
+           daa[9*20+4]=   0.00500000;
+           daa[9*20+5]=   0.00500000;
+           daa[9*20+6]=   0.00609079;
+           daa[9*20+7]=   0.00500000;
+           daa[9*20+8]=   0.10311100;
+           daa[10*20+0]=  0.21525600;
+           daa[10*20+1]=  0.70142700;
+           daa[10*20+2]=  0.00500000;
+           daa[10*20+3]=  0.00876048;
+           daa[10*20+4]=  0.12977700;
+           daa[10*20+5]=  1.49456000;
+           daa[10*20+6]=  0.00500000;
+           daa[10*20+7]=  0.00500000;
+           daa[10*20+8]=  1.74171000;
+           daa[10*20+9]=  5.95879000;
+           daa[11*20+0]=  0.00500000;
+           daa[11*20+1]=  20.45000000;
+           daa[11*20+2]=  7.90443000;
+           daa[11*20+3]=  0.00500000;
+           daa[11*20+4]=  0.00500000;
+           daa[11*20+5]=  6.54737000;
+           daa[11*20+6]=  4.61482000;
+           daa[11*20+7]=  0.52170500;
+           daa[11*20+8]=  0.00500000;
+           daa[11*20+9]=  0.32231900;
+           daa[11*20+10]= 0.08149950;
+           daa[12*20+0]=  0.01866430;
+           daa[12*20+1]=  2.51394000;
+           daa[12*20+2]=  0.00500000;
+           daa[12*20+3]=  0.00500000;
+           daa[12*20+4]=  0.00500000;
+           daa[12*20+5]=  0.30367600;
+           daa[12*20+6]=  0.17578900;
+           daa[12*20+7]=  0.00500000;
+           daa[12*20+8]=  0.00500000;
+           daa[12*20+9]=  11.20650000;
+           daa[12*20+10]= 5.31961000;
+           daa[12*20+11]= 1.28246000;
+           daa[13*20+0]=  0.01412690;
+           daa[13*20+1]=  0.00500000;
+           daa[13*20+2]=  0.00500000;
+           daa[13*20+3]=  0.00500000;
+           daa[13*20+4]=  9.29815000;
+           daa[13*20+5]=  0.00500000;
+           daa[13*20+6]=  0.00500000;
+           daa[13*20+7]=  0.29156100;
+           daa[13*20+8]=  0.14555800;
+           daa[13*20+9]=  3.39836000;
+           daa[13*20+10]= 8.52484000;
+           daa[13*20+11]= 0.03426580;
+           daa[13*20+12]= 0.18802500;
+           daa[14*20+0]=  2.12217000;
+           daa[14*20+1]=  1.28355000;
+           daa[14*20+2]=  0.00739578;
+           daa[14*20+3]=  0.03426580;
+           daa[14*20+4]=  0.00500000;
+           daa[14*20+5]=  4.47211000;
+           daa[14*20+6]=  0.01202260;
+           daa[14*20+7]=  0.00500000;
+           daa[14*20+8]=  2.45318000;
+           daa[14*20+9]=  0.04105930;
+           daa[14*20+10]= 2.07757000;
+           daa[14*20+11]= 0.03138620;
+           daa[14*20+12]= 0.00500000;
+           daa[14*20+13]= 0.00500000;
+           daa[15*20+0]=  2.46633000;
+           daa[15*20+1]=  3.47910000;
+           daa[15*20+2]=  13.14470000;
+           daa[15*20+3]=  0.52823000;
+           daa[15*20+4]=  4.69314000;
+           daa[15*20+5]=  0.11631100;
+           daa[15*20+6]=  0.00500000;
+           daa[15*20+7]=  4.38041000;
+           daa[15*20+8]=  0.38274700;
+           daa[15*20+9]=  1.21803000;
+           daa[15*20+10]= 0.92765600;
+           daa[15*20+11]= 0.50411100;
+           daa[15*20+12]= 0.00500000;
+           daa[15*20+13]= 0.95647200;
+           daa[15*20+14]= 5.37762000;
+           daa[16*20+0]=  15.91830000;
+           daa[16*20+1]=  2.86868000;
+           daa[16*20+2]=  6.88667000;
+           daa[16*20+3]=  0.27472400;
+           daa[16*20+4]=  0.73996900;
+           daa[16*20+5]=  0.24358900;
+           daa[16*20+6]=  0.28977400;
+           daa[16*20+7]=  0.36961500;
+           daa[16*20+8]=  0.71159400;
+           daa[16*20+9]=  8.61217000;
+           daa[16*20+10]= 0.04376730;
+           daa[16*20+11]= 4.67142000;
+           daa[16*20+12]= 4.94026000;
+           daa[16*20+13]= 0.01412690;
+           daa[16*20+14]= 2.01417000;
+           daa[16*20+15]= 8.93107000;
+           daa[17*20+0]=  0.00500000;
+           daa[17*20+1]=  0.99133800;
+           daa[17*20+2]=  0.00500000;
+           daa[17*20+3]=  0.00500000;
+           daa[17*20+4]=  2.63277000;
+           daa[17*20+5]=  0.02665600;
+           daa[17*20+6]=  0.00500000;
+           daa[17*20+7]=  1.21674000;
+           daa[17*20+8]=  0.06951790;
+           daa[17*20+9]=  0.00500000;
+           daa[17*20+10]= 0.74884300;
+           daa[17*20+11]= 0.00500000;
+           daa[17*20+12]= 0.08907800;
+           daa[17*20+13]= 0.82934300;
+           daa[17*20+14]= 0.04445060;
+           daa[17*20+15]= 0.02487280;
+           daa[17*20+16]= 0.00500000;
+           daa[18*20+0]=  0.00500000;
+           daa[18*20+1]=  0.00991826;
+           daa[18*20+2]=  1.76417000;
+           daa[18*20+3]=  0.67465300;
+           daa[18*20+4]=  7.57932000;
+           daa[18*20+5]=  0.11303300;
+           daa[18*20+6]=  0.07926330;
+           daa[18*20+7]=  0.00500000;
+           daa[18*20+8]=  18.69430000;
+           daa[18*20+9]=  0.14816800;
+           daa[18*20+10]= 0.11198600;
+           daa[18*20+11]= 0.00500000;
+           daa[18*20+12]= 0.00500000;
+           daa[18*20+13]= 15.34000000;
+           daa[18*20+14]= 0.03043810;
+           daa[18*20+15]= 0.64802400;
+           daa[18*20+16]= 0.10565200;
+           daa[18*20+17]= 1.28022000;
+           daa[19*20+0]=  7.61428000;
+           daa[19*20+1]=  0.08124540;
+           daa[19*20+2]=  0.02665600;
+           daa[19*20+3]=  1.04793000;
+           daa[19*20+4]=  0.42002700;
+           daa[19*20+5]=  0.02091530;
+           daa[19*20+6]=  1.02847000;
+           daa[19*20+7]=  0.95315500;
+           daa[19*20+8]=  0.00500000;
+           daa[19*20+9]=  17.73890000;
+           daa[19*20+10]= 1.41036000;
+           daa[19*20+11]= 0.26582900;
+           daa[19*20+12]= 6.85320000;
+           daa[19*20+13]= 0.72327400;
+           daa[19*20+14]= 0.00500000;
+           daa[19*20+15]= 0.07492180;
+           daa[19*20+16]= 0.70922600;
+           daa[19*20+17]= 0.00500000;
+           daa[19*20+18]= 0.04105930;
+           
+           f[0]=  0.060;
+           f[1]=  0.066;
+           f[2]=  0.044;
+           f[3]=  0.042;
+           f[4]=  0.020;
+           f[5]=  0.054;
+           f[6]=  0.071;
+           f[7]=  0.072;
+           f[8]=  0.022;
+           f[9]=  0.070;
+           f[10]= 0.099;
+           f[11]= 0.057;
+           f[12]= 0.020;
+           f[13]= 0.029;
+           f[14]= 0.046;
+           f[15]= 0.051;
+           f[16]= 0.054;
+           f[17]= 0.033;
+           f[18]= 0.028;
+           f[19]= 0.062;
+	  }
+	  break;
+	case PLL_HIVW:
+	  {
+           daa[1*20+0]=   0.0744808;
+           daa[2*20+0]=   0.6175090;
+           daa[2*20+1]=   0.1602400;
+           daa[3*20+0]=   4.4352100;
+           daa[3*20+1]=   0.0674539;
+           daa[3*20+2]=   29.4087000;
+           daa[4*20+0]=   0.1676530;
+           daa[4*20+1]=   2.8636400;
+           daa[4*20+2]=   0.0604932;
+           daa[4*20+3]=   0.0050000;
+           daa[5*20+0]=   0.0050000;
+           daa[5*20+1]=   10.6746000;
+           daa[5*20+2]=   0.3420680;
+           daa[5*20+3]=   0.0050000;
+           daa[5*20+4]=   0.0050000;
+           daa[6*20+0]=   5.5632500;
+           daa[6*20+1]=   0.0251632;
+           daa[6*20+2]=   0.2015260;
+           daa[6*20+3]=   12.1233000;
+           daa[6*20+4]=   0.0050000;
+           daa[6*20+5]=   3.2065600;
+           daa[7*20+0]=   1.8685000;
+           daa[7*20+1]=   13.4379000;
+           daa[7*20+2]=   0.0604932;
+           daa[7*20+3]=   10.3969000;
+           daa[7*20+4]=   0.0489798;
+           daa[7*20+5]=   0.0604932;
+           daa[7*20+6]=   14.7801000;
+           daa[8*20+0]=   0.0050000;
+           daa[8*20+1]=   6.8440500;
+           daa[8*20+2]=   8.5987600;
+           daa[8*20+3]=   2.3177900;
+           daa[8*20+4]=   0.0050000;
+           daa[8*20+5]=   18.5465000;
+           daa[8*20+6]=   0.0050000;
+           daa[8*20+7]=   0.0050000;
+           daa[9*20+0]=   0.0050000;
+           daa[9*20+1]=   1.3406900;
+           daa[9*20+2]=   0.9870280;
+           daa[9*20+3]=   0.1451240;
+           daa[9*20+4]=   0.0050000;
+           daa[9*20+5]=   0.0342252;
+           daa[9*20+6]=   0.0390512;
+           daa[9*20+7]=   0.0050000;
+           daa[9*20+8]=   0.0050000;
+           daa[10*20+0]=  0.1602400;
+           daa[10*20+1]=  0.5867570;
+           daa[10*20+2]=  0.0050000;
+           daa[10*20+3]=  0.0050000;
+           daa[10*20+4]=  0.0050000;
+           daa[10*20+5]=  2.8904800;
+           daa[10*20+6]=  0.1298390;
+           daa[10*20+7]=  0.0489798;
+           daa[10*20+8]=  1.7638200;
+           daa[10*20+9]=  9.1024600;
+           daa[11*20+0]=  0.5927840;
+           daa[11*20+1]=  39.8897000;
+           daa[11*20+2]=  10.6655000;
+           daa[11*20+3]=  0.8943130;
+           daa[11*20+4]=  0.0050000;
+           daa[11*20+5]=  13.0705000;
+           daa[11*20+6]=  23.9626000;
+           daa[11*20+7]=  0.2794250;
+           daa[11*20+8]=  0.2240600;
+           daa[11*20+9]=  0.8174810;
+           daa[11*20+10]= 0.0050000;
+           daa[12*20+0]=  0.0050000;
+           daa[12*20+1]=  3.2865200;
+           daa[12*20+2]=  0.2015260;
+           daa[12*20+3]=  0.0050000;
+           daa[12*20+4]=  0.0050000;
+           daa[12*20+5]=  0.0050000;
+           daa[12*20+6]=  0.0050000;
+           daa[12*20+7]=  0.0489798;
+           daa[12*20+8]=  0.0050000;
+           daa[12*20+9]=  17.3064000;
+           daa[12*20+10]= 11.3839000;
+           daa[12*20+11]= 4.0956400;
+           daa[13*20+0]=  0.5979230;
+           daa[13*20+1]=  0.0050000;
+           daa[13*20+2]=  0.0050000;
+           daa[13*20+3]=  0.0050000;
+           daa[13*20+4]=  0.3629590;
+           daa[13*20+5]=  0.0050000;
+           daa[13*20+6]=  0.0050000;
+           daa[13*20+7]=  0.0050000;
+           daa[13*20+8]=  0.0050000;
+           daa[13*20+9]=  1.4828800;
+           daa[13*20+10]= 7.4878100;
+           daa[13*20+11]= 0.0050000;
+           daa[13*20+12]= 0.0050000;
+           daa[14*20+0]=  1.0098100;
+           daa[14*20+1]=  0.4047230;
+           daa[14*20+2]=  0.3448480;
+           daa[14*20+3]=  0.0050000;
+           daa[14*20+4]=  0.0050000;
+           daa[14*20+5]=  3.0450200;
+           daa[14*20+6]=  0.0050000;
+           daa[14*20+7]=  0.0050000;
+           daa[14*20+8]=  13.9444000;
+           daa[14*20+9]=  0.0050000;
+           daa[14*20+10]= 9.8309500;
+           daa[14*20+11]= 0.1119280;
+           daa[14*20+12]= 0.0050000;
+           daa[14*20+13]= 0.0342252;
+           daa[15*20+0]=  8.5942000;
+           daa[15*20+1]=  8.3502400;
+           daa[15*20+2]=  14.5699000;
+           daa[15*20+3]=  0.4278810;
+           daa[15*20+4]=  1.1219500;
+           daa[15*20+5]=  0.1602400;
+           daa[15*20+6]=  0.0050000;
+           daa[15*20+7]=  6.2796600;
+           daa[15*20+8]=  0.7251570;
+           daa[15*20+9]=  0.7400910;
+           daa[15*20+10]= 6.1439600;
+           daa[15*20+11]= 0.0050000;
+           daa[15*20+12]= 0.3925750;
+           daa[15*20+13]= 4.2793900;
+           daa[15*20+14]= 14.2490000;
+           daa[16*20+0]=  24.1422000;
+           daa[16*20+1]=  0.9282030;
+           daa[16*20+2]=  4.5420600;
+           daa[16*20+3]=  0.6303950;
+           daa[16*20+4]=  0.0050000;
+           daa[16*20+5]=  0.2030910;
+           daa[16*20+6]=  0.4587430;
+           daa[16*20+7]=  0.0489798;
+           daa[16*20+8]=  0.9595600;
+           daa[16*20+9]=  9.3634500;
+           daa[16*20+10]= 0.0050000;
+           daa[16*20+11]= 4.0480200;
+           daa[16*20+12]= 7.4131300;
+           daa[16*20+13]= 0.1145120;
+           daa[16*20+14]= 4.3370100;
+           daa[16*20+15]= 6.3407900;
+           daa[17*20+0]=  0.0050000;
+           daa[17*20+1]=  5.9656400;
+           daa[17*20+2]=  0.0050000;
+           daa[17*20+3]=  0.0050000;
+           daa[17*20+4]=  5.4989400;
+           daa[17*20+5]=  0.0443298;
+           daa[17*20+6]=  0.0050000;
+           daa[17*20+7]=  2.8258000;
+           daa[17*20+8]=  0.0050000;
+           daa[17*20+9]=  0.0050000;
+           daa[17*20+10]= 1.3703100;
+           daa[17*20+11]= 0.0050000;
+           daa[17*20+12]= 0.0050000;
+           daa[17*20+13]= 0.0050000;
+           daa[17*20+14]= 0.0050000;
+           daa[17*20+15]= 1.1015600;
+           daa[17*20+16]= 0.0050000;
+           daa[18*20+0]=  0.0050000;
+           daa[18*20+1]=  0.0050000;
+           daa[18*20+2]=  5.0647500;
+           daa[18*20+3]=  2.2815400;
+           daa[18*20+4]=  8.3483500;
+           daa[18*20+5]=  0.0050000;
+           daa[18*20+6]=  0.0050000;
+           daa[18*20+7]=  0.0050000;
+           daa[18*20+8]=  47.4889000;
+           daa[18*20+9]=  0.1145120;
+           daa[18*20+10]= 0.0050000;
+           daa[18*20+11]= 0.0050000;
+           daa[18*20+12]= 0.5791980;
+           daa[18*20+13]= 4.1272800;
+           daa[18*20+14]= 0.0050000;
+           daa[18*20+15]= 0.9331420;
+           daa[18*20+16]= 0.4906080;
+           daa[18*20+17]= 0.0050000;
+           daa[19*20+0]=  24.8094000;
+           daa[19*20+1]=  0.2794250;
+           daa[19*20+2]=  0.0744808;
+           daa[19*20+3]=  2.9178600;
+           daa[19*20+4]=  0.0050000;
+           daa[19*20+5]=  0.0050000;
+           daa[19*20+6]=  2.1995200;
+           daa[19*20+7]=  2.7962200;
+           daa[19*20+8]=  0.8274790;
+           daa[19*20+9]=  24.8231000;
+           daa[19*20+10]= 2.9534400;
+           daa[19*20+11]= 0.1280650;
+           daa[19*20+12]= 14.7683000;
+           daa[19*20+13]= 2.2800000;
+           daa[19*20+14]= 0.0050000;
+           daa[19*20+15]= 0.8626370;
+           daa[19*20+16]= 0.0050000;
+           daa[19*20+17]= 0.0050000;
+           daa[19*20+18]= 1.3548200;
+           
+           f[0]=  0.038;
+           f[1]=  0.057;
+           f[2]=  0.089;
+           f[3]=  0.034;
+           f[4]=  0.024;
+           f[5]=  0.044;
+           f[6]=  0.062;
+           f[7]=  0.084;
+           f[8]=  0.016;
+           f[9]=  0.098;
+           f[10]= 0.058;
+           f[11]= 0.064;
+           f[12]= 0.016;
+           f[13]= 0.042;
+           f[14]= 0.046;
+           f[15]= 0.055;
+           f[16]= 0.081;
+           f[17]= 0.020;
+           f[18]= 0.021;
+           f[19]= 0.051;
+	  }
+	  break;
+	case PLL_JTTDCMUT:
+	  {
+           daa[1*20+0]=   0.531678;
+           daa[2*20+0]=   0.557967;
+           daa[2*20+1]=   0.451095;
+           daa[3*20+0]=   0.827445;
+           daa[3*20+1]=   0.154899;
+           daa[3*20+2]=   5.549530;
+           daa[4*20+0]=   0.574478;
+           daa[4*20+1]=   1.019843;
+           daa[4*20+2]=   0.313311;
+           daa[4*20+3]=   0.105625;
+           daa[5*20+0]=   0.556725;
+           daa[5*20+1]=   3.021995;
+           daa[5*20+2]=   0.768834;
+           daa[5*20+3]=   0.521646;
+           daa[5*20+4]=   0.091304;
+           daa[6*20+0]=   1.066681;
+           daa[6*20+1]=   0.318483;
+           daa[6*20+2]=   0.578115;
+           daa[6*20+3]=   7.766557;
+           daa[6*20+4]=   0.053907;
+           daa[6*20+5]=   3.417706;
+           daa[7*20+0]=   1.740159;
+           daa[7*20+1]=   1.359652;
+           daa[7*20+2]=   0.773313;
+           daa[7*20+3]=   1.272434;
+           daa[7*20+4]=   0.546389;
+           daa[7*20+5]=   0.231294;
+           daa[7*20+6]=   1.115632;
+           daa[8*20+0]=   0.219970;
+           daa[8*20+1]=   3.210671;
+           daa[8*20+2]=   4.025778;
+           daa[8*20+3]=   1.032342;
+           daa[8*20+4]=   0.724998;
+           daa[8*20+5]=   5.684080;
+           daa[8*20+6]=   0.243768;
+           daa[8*20+7]=   0.201696;
+           daa[9*20+0]=   0.361684;
+           daa[9*20+1]=   0.239195;
+           daa[9*20+2]=   0.491003;
+           daa[9*20+3]=   0.115968;
+           daa[9*20+4]=   0.150559;
+           daa[9*20+5]=   0.078270;
+           daa[9*20+6]=   0.111773;
+           daa[9*20+7]=   0.053769;
+           daa[9*20+8]=   0.181788;
+           daa[10*20+0]=  0.310007;
+           daa[10*20+1]=  0.372261;
+           daa[10*20+2]=  0.137289;
+           daa[10*20+3]=  0.061486;
+           daa[10*20+4]=  0.164593;
+           daa[10*20+5]=  0.709004;
+           daa[10*20+6]=  0.097485;
+           daa[10*20+7]=  0.069492;
+           daa[10*20+8]=  0.540571;
+           daa[10*20+9]=  2.335139;
+           daa[11*20+0]=  0.369437;
+           daa[11*20+1]=  6.529255;
+           daa[11*20+2]=  2.529517;
+           daa[11*20+3]=  0.282466;
+           daa[11*20+4]=  0.049009;
+           daa[11*20+5]=  2.966732;
+           daa[11*20+6]=  1.731684;
+           daa[11*20+7]=  0.269840;
+           daa[11*20+8]=  0.525096;
+           daa[11*20+9]=  0.202562;
+           daa[11*20+10]= 0.146481;
+           daa[12*20+0]=  0.469395;
+           daa[12*20+1]=  0.431045;
+           daa[12*20+2]=  0.330720;
+           daa[12*20+3]=  0.190001;
+           daa[12*20+4]=  0.409202;
+           daa[12*20+5]=  0.456901;
+           daa[12*20+6]=  0.175084;
+           daa[12*20+7]=  0.130379;
+           daa[12*20+8]=  0.329660;
+           daa[12*20+9]=  4.831666;
+           daa[12*20+10]= 3.856906;
+           daa[12*20+11]= 0.624581;
+           daa[13*20+0]=  0.138293;
+           daa[13*20+1]=  0.065314;
+           daa[13*20+2]=  0.073481;
+           daa[13*20+3]=  0.032522;
+           daa[13*20+4]=  0.678335;
+           daa[13*20+5]=  0.045683;
+           daa[13*20+6]=  0.043829;
+           daa[13*20+7]=  0.050212;
+           daa[13*20+8]=  0.453428;
+           daa[13*20+9]=  0.777090;
+           daa[13*20+10]= 2.500294;
+           daa[13*20+11]= 0.024521;
+           daa[13*20+12]= 0.436181;
+           daa[14*20+0]=  1.959599;
+           daa[14*20+1]=  0.710489;
+           daa[14*20+2]=  0.121804;
+           daa[14*20+3]=  0.127164;
+           daa[14*20+4]=  0.123653;
+           daa[14*20+5]=  1.608126;
+           daa[14*20+6]=  0.191994;
+           daa[14*20+7]=  0.208081;
+           daa[14*20+8]=  1.141961;
+           daa[14*20+9]=  0.098580;
+           daa[14*20+10]= 1.060504;
+           daa[14*20+11]= 0.216345;
+           daa[14*20+12]= 0.164215;
+           daa[14*20+13]= 0.148483;
+           daa[15*20+0]=  3.887095;
+           daa[15*20+1]=  1.001551;
+           daa[15*20+2]=  5.057964;
+           daa[15*20+3]=  0.589268;
+           daa[15*20+4]=  2.155331;
+           daa[15*20+5]=  0.548807;
+           daa[15*20+6]=  0.312449;
+           daa[15*20+7]=  1.874296;
+           daa[15*20+8]=  0.743458;
+           daa[15*20+9]=  0.405119;
+           daa[15*20+10]= 0.592511;
+           daa[15*20+11]= 0.474478;
+           daa[15*20+12]= 0.285564;
+           daa[15*20+13]= 0.943971;
+           daa[15*20+14]= 2.788406;
+           daa[16*20+0]=  4.582565;
+           daa[16*20+1]=  0.650282;
+           daa[16*20+2]=  2.351311;
+           daa[16*20+3]=  0.425159;
+           daa[16*20+4]=  0.469823;
+           daa[16*20+5]=  0.523825;
+           daa[16*20+6]=  0.331584;
+           daa[16*20+7]=  0.316862;
+           daa[16*20+8]=  0.477355;
+           daa[16*20+9]=  2.553806;
+           daa[16*20+10]= 0.272514;
+           daa[16*20+11]= 0.965641;
+           daa[16*20+12]= 2.114728;
+           daa[16*20+13]= 0.138904;
+           daa[16*20+14]= 1.176961;
+           daa[16*20+15]= 4.777647;
+           daa[17*20+0]=  0.084329;
+           daa[17*20+1]=  1.257961;
+           daa[17*20+2]=  0.027700;
+           daa[17*20+3]=  0.057466;
+           daa[17*20+4]=  1.104181;
+           daa[17*20+5]=  0.172206;
+           daa[17*20+6]=  0.114381;
+           daa[17*20+7]=  0.544180;
+           daa[17*20+8]=  0.128193;
+           daa[17*20+9]=  0.134510;
+           daa[17*20+10]= 0.530324;
+           daa[17*20+11]= 0.089134;
+           daa[17*20+12]= 0.201334;
+           daa[17*20+13]= 0.537922;
+           daa[17*20+14]= 0.069965;
+           daa[17*20+15]= 0.310927;
+           daa[17*20+16]= 0.080556;
+           daa[18*20+0]=  0.139492;
+           daa[18*20+1]=  0.235601;
+           daa[18*20+2]=  0.700693;
+           daa[18*20+3]=  0.453952;
+           daa[18*20+4]=  2.114852;
+           daa[18*20+5]=  0.254745;
+           daa[18*20+6]=  0.063452;
+           daa[18*20+7]=  0.052500;
+           daa[18*20+8]=  5.848400;
+           daa[18*20+9]=  0.303445;
+           daa[18*20+10]= 0.241094;
+           daa[18*20+11]= 0.087904;
+           daa[18*20+12]= 0.189870;
+           daa[18*20+13]= 5.484236;
+           daa[18*20+14]= 0.113850;
+           daa[18*20+15]= 0.628608;
+           daa[18*20+16]= 0.201094;
+           daa[18*20+17]= 0.747889;
+           daa[19*20+0]=  2.924161;
+           daa[19*20+1]=  0.171995;
+           daa[19*20+2]=  0.164525;
+           daa[19*20+3]=  0.315261;
+           daa[19*20+4]=  0.621323;
+           daa[19*20+5]=  0.179771;
+           daa[19*20+6]=  0.465271;
+           daa[19*20+7]=  0.470140;
+           daa[19*20+8]=  0.121827;
+           daa[19*20+9]=  9.533943;
+           daa[19*20+10]= 1.761439;
+           daa[19*20+11]= 0.124066;
+           daa[19*20+12]= 3.038533;
+           daa[19*20+13]= 0.593478;
+           daa[19*20+14]= 0.211561;
+           daa[19*20+15]= 0.408532;
+           daa[19*20+16]= 1.143980;
+           daa[19*20+17]= 0.239697;
+           daa[19*20+18]= 0.165473;
+           
+           f[0]=  0.077;
+           f[1]=  0.051;
+           f[2]=  0.043;
+           f[3]=  0.051;
+           f[4]=  0.020;
+           f[5]=  0.041;
+           f[6]=  0.062;
+           f[7]=  0.075;
+           f[8]=  0.023;
+           f[9]=  0.053;
+           f[10]= 0.091;
+           f[11]= 0.059;
+           f[12]= 0.024;
+           f[13]= 0.040;
+           f[14]= 0.051;
+           f[15]= 0.068;
+           f[16]= 0.059;
+           f[17]= 0.014;
+           f[18]= 0.032;
+           f[19]= 0.066;
+	  }
+	  break;
+	case PLL_FLU:
+	  {
+	    daa[ 1*20+ 0] 	=	0.138658765	;
+	    daa[ 2*20+ 0] 	=	0.053366579	;
+	    daa[ 2*20+ 1] 	=	0.161000889	;
+	    daa[ 3*20+ 0] 	=	0.584852306	;
+	    daa[ 3*20+ 1] 	=	0.006771843	;
+	    daa[ 3*20+ 2] 	=	7.737392871	;
+	    daa[ 4*20+ 0] 	=	0.026447095	;
+	    daa[ 4*20+ 1] 	=	0.167207008	;
+	    daa[ 4*20+ 2] 	=	1.30E-05	;
+	    daa[ 4*20+ 3] 	=	1.41E-02	;
+	    daa[ 5*20+ 0] 	=	0.353753982	;
+	    daa[ 5*20+ 1] 	=	3.292716942	;
+	    daa[ 5*20+ 2] 	=	0.530642655	;
+	    daa[ 5*20+ 3] 	=	0.145469388	;
+	    daa[ 5*20+ 4] 	=	0.002547334	;
+	    daa[ 6*20+ 0] 	=	1.484234503	;
+	    daa[ 6*20+ 1] 	=	0.124897617	;
+	    daa[ 6*20+ 2] 	=	0.061652192	;
+	    daa[ 6*20+ 3] 	=	5.370511279	;
+	    daa[ 6*20+ 4] 	=	3.91E-11	;
+	    daa[ 6*20+ 5] 	=	1.195629122	;
+	    daa[ 7*20+ 0] 	=	1.132313122	;
+	    daa[ 7*20+ 1] 	=	1.190624465	;
+	    daa[ 7*20+ 2] 	=	0.322524648	;
+	    daa[ 7*20+ 3] 	=	1.934832784	;
+	    daa[ 7*20+ 4] 	=	0.116941459	;
+	    daa[ 7*20+ 5] 	=	0.108051341	;
+	    daa[ 7*20+ 6] 	=	1.593098825	;
+	    daa[ 8*20+ 0] 	=	0.214757862	;
+	    daa[ 8*20+ 1] 	=	1.879569938	;
+	    daa[ 8*20+ 2] 	=	1.387096032	;
+	    daa[ 8*20+ 3] 	=	0.887570549	;
+	    daa[ 8*20+ 4] 	=	2.18E-02	;
+	    daa[ 8*20+ 5] 	=	5.330313412	;
+	    daa[ 8*20+ 6] 	=	0.256491863	;
+	    daa[ 8*20+ 7] 	=	0.058774527	;
+	    daa[ 9*20+ 0] 	=	0.149926734	;
+	    daa[ 9*20+ 1] 	=	0.246117172	;
+	    daa[ 9*20+ 2] 	=	0.218571975	;
+	    daa[ 9*20+ 3] 	=	0.014085917	;
+	    daa[ 9*20+ 4] 	=	0.001112158	;
+	    daa[ 9*20+ 5] 	=	0.02883995	;
+	    daa[ 9*20+ 6] 	=	1.42E-02	;
+	    daa[ 9*20+ 7] 	=	1.63E-05	;
+	    daa[ 9*20+ 8] 	=	0.243190142	;
+	    daa[10*20+ 0] 	=	0.023116952	;
+	    daa[10*20+ 1] 	=	0.296045557	;
+	    daa[10*20+ 2] 	=	8.36E-04	;
+	    daa[10*20+ 3] 	=	0.005730682	;
+	    daa[10*20+ 4] 	=	0.005613627	;
+	    daa[10*20+ 5] 	=	1.020366955	;
+	    daa[10*20+ 6] 	=	0.016499536	;
+	    daa[10*20+ 7] 	=	0.006516229	;
+	    daa[10*20+ 8] 	=	0.321611694	;
+	    daa[10*20+ 9] 	=	3.512072282	;
+	    daa[11*20+ 0] 	=	0.47433361	;
+	    daa[11*20+ 1] 	=	15.30009662	;
+	    daa[11*20+ 2] 	=	2.646847965	;
+	    daa[11*20+ 3] 	=	0.29004298	;
+	    daa[11*20+ 4] 	=	3.83E-06	;
+	    daa[11*20+ 5] 	=	2.559587177	;
+	    daa[11*20+ 6] 	=	3.881488809	;
+	    daa[11*20+ 7] 	=	0.264148929	;
+	    daa[11*20+ 8] 	=	0.347302791	;
+	    daa[11*20+ 9] 	=	0.227707997	;
+	    daa[11*20+10] 	=	0.129223639	;
+	    daa[12*20+ 0] 	=	0.058745423	;
+	    daa[12*20+ 1] 	=	0.890162346	;
+	    daa[12*20+ 2] 	=	0.005251688	;
+	    daa[12*20+ 3] 	=	0.041762964	;
+	    daa[12*20+ 4] 	=	0.11145731	;
+	    daa[12*20+ 5] 	=	0.190259181	;
+	    daa[12*20+ 6] 	=	0.313974351	;
+	    daa[12*20+ 7] 	=	0.001500467	;
+	    daa[12*20+ 8] 	=	0.001273509	;
+	    daa[12*20+ 9] 	=	9.017954203	;
+	    daa[12*20+10] 	=	6.746936485	;
+	    daa[12*20+11] 	=	1.331291619	;
+	    daa[13*20+ 0] 	=	0.080490909	;
+	    daa[13*20+ 1] 	=	1.61E-02	;
+	    daa[13*20+ 2] 	=	8.36E-04	;
+	    daa[13*20+ 3] 	=	1.06E-06	;
+	    daa[13*20+ 4] 	=	0.104053666	;
+	    daa[13*20+ 5] 	=	0.032680657	;
+	    daa[13*20+ 6] 	=	0.001003501	;
+	    daa[13*20+ 7] 	=	0.001236645	;
+	    daa[13*20+ 8] 	=	0.119028506	;
+	    daa[13*20+ 9] 	=	1.463357278	;
+	    daa[13*20+10] 	=	2.986800036	;
+	    daa[13*20+11] 	=	3.20E-01	;
+	    daa[13*20+12] 	=	0.279910509	;
+	    daa[14*20+ 0] 	=	0.659311478	;
+	    daa[14*20+ 1] 	=	0.15402718	;
+	    daa[14*20+ 2] 	=	3.64E-02	;
+	    daa[14*20+ 3] 	=	0.188539456	;
+	    daa[14*20+ 4] 	=	1.59E-13	;
+	    daa[14*20+ 5] 	=	0.712769599	;
+	    daa[14*20+ 6] 	=	0.319558828	;
+	    daa[14*20+ 7] 	=	0.038631761	;
+	    daa[14*20+ 8] 	=	0.924466914	;
+	    daa[14*20+ 9] 	=	0.080543327	;
+	    daa[14*20+10] 	=	0.634308521	;
+	    daa[14*20+11] 	=	0.195750632	;
+	    daa[14*20+12] 	=	5.69E-02	;
+	    daa[14*20+13] 	=	0.00713243	;
+	    daa[15*20+ 0] 	=	3.011344519	;
+	    daa[15*20+ 1] 	=	0.95013841	;
+	    daa[15*20+ 2] 	=	3.881310531	;
+	    daa[15*20+ 3] 	=	0.338372183	;
+	    daa[15*20+ 4] 	=	0.336263345	;
+	    daa[15*20+ 5] 	=	0.487822499	;
+	    daa[15*20+ 6] 	=	0.307140298	;
+	    daa[15*20+ 7] 	=	1.585646577	;
+	    daa[15*20+ 8] 	=	0.58070425	;
+	    daa[15*20+ 9] 	=	0.290381075	;
+	    daa[15*20+10] 	=	0.570766693	;
+	    daa[15*20+11] 	=	0.283807672	;
+	    daa[15*20+12] 	=	0.007026588	;
+	    daa[15*20+13] 	=	0.99668567	;
+	    daa[15*20+14] 	=	2.087385344	;
+	    daa[16*20+ 0] 	=	5.418298175	;
+	    daa[16*20+ 1] 	=	0.183076905	;
+	    daa[16*20+ 2] 	=	2.140332316	;
+	    daa[16*20+ 3] 	=	0.135481233	;
+	    daa[16*20+ 4] 	=	0.011975266	;
+	    daa[16*20+ 5] 	=	0.602340963	;
+	    daa[16*20+ 6] 	=	0.280124895	;
+	    daa[16*20+ 7] 	=	0.01880803	;
+	    daa[16*20+ 8] 	=	0.368713573	;
+	    daa[16*20+ 9] 	=	2.904052286	;
+	    daa[16*20+10] 	=	0.044926357	;
+	    daa[16*20+11] 	=	1.5269642	;
+	    daa[16*20+12] 	=	2.031511321	;
+	    daa[16*20+13] 	=	0.000134906	;
+	    daa[16*20+14] 	=	0.542251094	;
+	    daa[16*20+15] 	=	2.206859934	;
+	    daa[17*20+ 0] 	=	1.96E-01	;
+	    daa[17*20+ 1] 	=	1.369429408	;
+	    daa[17*20+ 2] 	=	5.36E-04	;
+	    daa[17*20+ 3] 	=	1.49E-05	;
+	    daa[17*20+ 4] 	=	0.09410668	;
+	    daa[17*20+ 5] 	=	4.40E-02	;
+	    daa[17*20+ 6] 	=	0.155245492	;
+	    daa[17*20+ 7] 	=	0.196486447	;
+	    daa[17*20+ 8] 	=	2.24E-02	;
+	    daa[17*20+ 9] 	=	0.03213215	;
+	    daa[17*20+10] 	=	0.431277663	;
+	    daa[17*20+11] 	=	4.98E-05	;
+	    daa[17*20+12] 	=	0.070460039	;
+	    daa[17*20+13] 	=	0.814753094	;
+	    daa[17*20+14] 	=	0.000431021	;
+	    daa[17*20+15] 	=	0.099835753	;
+	    daa[17*20+16] 	=	0.207066206	;
+	    daa[18*20+ 0] 	=	0.018289288	;
+	    daa[18*20+ 1] 	=	0.099855497	;
+	    daa[18*20+ 2] 	=	0.373101927	;
+	    daa[18*20+ 3] 	=	0.525398543	;
+	    daa[18*20+ 4] 	=	0.601692431	;
+	    daa[18*20+ 5] 	=	0.072205935	;
+	    daa[18*20+ 6] 	=	0.10409287	;
+	    daa[18*20+ 7] 	=	0.074814997	;
+	    daa[18*20+ 8] 	=	6.448954446	;
+	    daa[18*20+ 9] 	=	0.273934263	;
+	    daa[18*20+10] 	=	0.340058468	;
+	    daa[18*20+11] 	=	0.012416222	;
+	    daa[18*20+12] 	=	0.874272175	;
+	    daa[18*20+13] 	=	5.393924245	;
+	    daa[18*20+14] 	=	1.82E-04	;
+	    daa[18*20+15] 	=	0.39255224	;
+	    daa[18*20+16] 	=	0.12489802	;
+	    daa[18*20+17] 	=	0.42775543	;
+	    daa[19*20+ 0] 	=	3.53200527	;
+	    daa[19*20+ 1] 	=	0.103964386	;
+	    daa[19*20+ 2] 	=	0.010257517	;
+	    daa[19*20+ 3] 	=	0.297123975	;
+	    daa[19*20+ 4] 	=	0.054904564	;
+	    daa[19*20+ 5] 	=	0.406697814	;
+	    daa[19*20+ 6] 	=	0.285047948	;
+	    daa[19*20+ 7] 	=	0.337229619	;
+	    daa[19*20+ 8] 	=	0.098631355	;
+	    daa[19*20+ 9] 	=	14.39405219	;
+	    daa[19*20+10] 	=	0.890598579	;
+	    daa[19*20+11] 	=	0.07312793	;
+	    daa[19*20+12] 	=	4.904842235	;
+	    daa[19*20+13] 	=	0.592587985	;
+	    daa[19*20+14] 	=	0.058971975	;
+	    daa[19*20+15] 	=	0.088256423	;
+	    daa[19*20+16] 	=	0.654109108	;
+	    daa[19*20+17] 	=	0.256900461	;
+	    daa[19*20+18] 	=	0.167581647	;
+	    
+ 
+  
+	    f[0]	=	0.0471	;
+	    f[1]	=	0.0509	;
+	    f[2]	=	0.0742	;
+	    f[3]	=	0.0479	;
+	    f[4]	=	0.0250	;
+	    f[5]	=	0.0333	;
+	    f[6]	=	0.0546	;
+	    f[7]	=	0.0764	;
+	    f[8]	=	0.0200	;
+	    f[9]	=	0.0671	;
+	    f[10]	=	0.0715	;
+	    f[11]	=	0.0568	;
+	    f[12]	=	0.0181	;
+	    f[13]	=	0.0305	;
+	    f[14]	=	0.0507	;
+	    f[15]	=	0.0884	;
+	    f[16]	=	0.0743	;
+	    f[17]	=	0.0185	;
+	    f[18]	=	0.0315	;
+	    f[19]	=	0.0632	;
+	  }
+	  break;     
+	default: 
+	  assert(0);
+	}
+    }
+
+
+  /*
+    
+  TODO review frequency sums for fixed as well as empirical base frequencies !
+  
+  NUMERICAL BUG fix, rounded AA freqs in some models, such that 
+  they actually really sum to 1.0 +/- epsilon 
+  
+  {
+    double acc = 0.0;
+  
+    for(i = 0; i < 20; i++)
+      acc += f[i];
+    
+    printf("%1.80f\n", acc);
+    assert(acc == 1.0);  
+  }
+  */
+ 
+
+
+  /* fill the upper triangle (above the diagonal) with the corresponding values
+     from the lower triangle */
+  for (i=0; i<20; i++)  
+    for (j=0; j<i; j++)               
+      daa[j*20+i] = daa[i*20+j];
+
+  
+  /*
+    for (i=0; i<20; i++)  
+    {
+    for (j=0; j<20; j++)
+    {
+    if(i == j)
+    printf("0.0 ");
+    else
+    printf("%f ", daa[i * 20 + j]);
+    }
+    printf("\n");
+    }
+    
+    for (i=0; i<20; i++) 
+    printf("%f ", f[i]);
+    printf("\n");
+  */
+  
+
+  max = 0;
+  
+  /* copy the triangle above the diagonal from daa (which is a linear block) to
+     the triangle above the diagonal of a square matrix q. Store the maximal
+     value in variable max */
+  for(i = 0; i < 19; i++)
+    for(j = i + 1; j < 20; j++)
+      {
+	q[i][j] = temp = daa[i * 20 + j];
+	if(temp > max) 
+	  max = temp;
+      }
+ 
+  scaler = PLL_AA_SCALE / max;
+   
+  /* SCALING HAS BEEN RE-INTRODUCED TO RESOLVE NUMERICAL  PROBLEMS */   
+
+  /* copy and scale values to the initialRates array */
+  r = 0;
+  for(i = 0; i < 19; i++)
+    {      
+      for(j = i + 1; j < 20; j++)
+	{  
+	
+	  q[i][j] *= scaler;
+	  
+	  
+	  assert(q[i][j] <= PLL_AA_SCALE_PLUS_EPSILON);
+	  
+	  initialRates[r++] = q[i][j];
+	}
+    }             
+}
+
+/** @brief Set the frac
+  *
+  * Update \a partitionContribution in each partition by setting it to the fraction of sites in
+  * that partition to the total number of sites. Also set \a tr->fracchange according to the
+  * computes \a fracchange of each partition.
+  *
+  * @param tr
+  *   PLL instance
+  *
+  * @param pr
+  *   List of partitions
+  * 
+  * @todo 
+      I understand how fracchange is computed for each partition, but I dont know
+      what is it for. Also what is tr->fracchange for?
+*/
+static void updateFracChange(pllInstance *tr, partitionList *pr)
+{   
+  int numberOfModels = pr->numberOfPartitions;
+  if(numberOfModels == 1)
+    {   
+      assert(pr->partitionData[0]->fracchange != -1.0);
+     
+      tr->fracchange = pr->partitionData[0]->fracchange; 
+      //printf("Set %f\n", tr->fracchange);
+
+      /* must this be -1.0? */
+      /* pr->partitionData[0]->fracchange = -1.0; */
+      
+    }      
+  else
+    {
+      int model;
+      double *modelWeights = (double *)rax_calloc((size_t)numberOfModels, sizeof(double));
+      double wgtsum = 0.0;  
+     
+      assert(numberOfModels > 1);
+
+      tr->fracchange = 0.0;	         
+      
+#if 0 				/* EXABAYES  */
+       for(model = 0; model < numberOfModels; model++)
+	 {
+	   size_t
+	     lower = pr->partitionData[model]->lower,
+	     upper = pr->partitionData[model]->upper,
+	     i;
+	   
+	   for(i = lower; i < upper; i++)
+	     {
+	       modelWeights[model] += (double)tr->aliaswgt[i];
+	       wgtsum              += (double)tr->aliaswgt[i];
+	     }
+	 }
+#endif
+
+       /*for(i = 0; i < tr->originalCrunchedLength; i++)
+	{
+	  modelWeights[tr->model[i]]  += (double)tr->aliaswgt[i];
+	  wgtsum                      += (double)tr->aliaswgt[i];
+	  }*/  
+
+      
+ 	        
+      for(model = 0; model < numberOfModels; model++)
+	{	      	  	 
+#if 0  				/* EXABAYES */
+	  pr->partitionData[model]->partitionContribution = modelWeights[model] / wgtsum;
+#endif
+	  tr->fracchange +=  pr->partitionData[model]->partitionContribution * pr->partitionData[model]->fracchange;
+	}	      
+    
+      rax_free(modelWeights);
+    }
+}
+
+/** @brief Not sure what this function does
+  * 
+  * @todo
+  *   Comment this function
+  */
+static void mytred2(double **a, const int n, double *d, double *e)
+{
+  int     l, k, j, i;
+  double  scale, hh, h, g, f; 
+ 
+  for (i = n; i > 1; i--)
+    {
+      l = i - 1;
+      h = 0.0;
+      scale = 0.0;
+      
+      if (l > 1)
+        {
+	  for (k = 1; k <= l; k++)
+	    scale += fabs(a[k - 1][i - 1]);
+	  if (scale == 0.0)
+	    e[i - 1] = a[l - 1][i - 1];
+	  else
+            {
+	      for (k = 1; k <= l; k++)
+                {
+		  a[k - 1][i - 1] /= scale;
+		  h += a[k - 1][i - 1] * a[k - 1][i - 1];
+                }
+	      f = a[l - 1][i - 1];
+	      g = ((f > 0) ? -sqrt(h) : sqrt(h)); /* diff */
+	      e[i - 1] = scale * g;
+	      h -= f * g;
+	      a[l - 1][i - 1] = f - g;
+	      f = 0.0;
+	      for (j = 1; j <= l; j++)
+		{
+		  a[i - 1][j - 1] = a[j - 1][i - 1] / h;
+		  g = 0.0;
+		  for (k = 1; k <= j; k++)
+		    g += a[k - 1][j - 1] * a[k - 1][i - 1];
+		  for (k = j + 1; k <= l; k++)
+		    g += a[j - 1][k - 1] * a[k - 1][i - 1];
+		  e[j - 1] = g / h;
+		  f += e[j - 1] * a[j - 1][i - 1];
+		}
+	      hh = f / (h + h);
+	      for (j = 1; j <= l; j++)
+		{
+		  f = a[j - 1][i - 1];
+		  g = e[j - 1] - hh * f;
+		  e[j - 1] = g;
+		  for (k = 1; k <= j; k++)
+		    a[k - 1][j - 1] -= (f * e[k - 1] + g * a[k - 1][i - 1]);
+                }
+	    }
+	} 
+      else
+	e[i - 1] = a[l - 1][i - 1];
+      d[i - 1] = h;
+    }
+  d[0] = 0.0;
+  e[0] = 0.0;
+  
+  for (i = 1; i <= n; i++)
+    {
+      l = i - 1;
+      if (d[i - 1] != 0.0)
+	{
+	  for (j = 1; j <= l; j++)
+            {
+                g = 0.0;
+                for (k = 1; k <= l; k++)
+		  g += a[k - 1][i - 1] * a[j - 1][k - 1];
+                for(k = 1; k <= l; k++)
+		  a[j - 1][k - 1] -= g * a[i - 1][k - 1];
+            }
+        }
+      d[i - 1] = a[i - 1][i - 1];
+      a[i - 1][i - 1] = 1.0;
+      for (j = 1; j <= l; j++)
+	a[i - 1][j - 1] = a[j - 1][i - 1] = 0.0;
+    }
+ 
+ 
+}
+/*#define MYSIGN(a,b) ((b)<0 ? -fabs(a) : fabs(a))*/
+
+/** @brief Not sure what this function does
+  * 
+  * @todo
+  *   Comment this function
+  */
+static int mytqli(double *d, double *e, const int n, double **z)
+{
+  int     m, l, iter, i, k;
+  double  s, r, p, g, f, dd, c, b;
+   
+  for (i = 2; i <= n; i++)
+    e[i - 2] = e[i - 1];
+
+  e[n - 1] = 0.0;
+
+  for (l = 1; l <= n; l++)
+    {
+      iter = 0;
+      do
+	{
+	  for (m = l; m <= n - 1; m++)
+            {
+	      dd = fabs(d[m - 1]) + fabs(d[m]);
+	      if (fabs(e[m - 1]) + dd == dd)
+		break;
+	    }
+
+	  if (m != l)
+           {
+	     assert(iter < 30);
+	     
+	     g = (d[l] - d[l - 1]) / (2.0 * e[l - 1]);
+	     r = sqrt((g * g) + 1.0);
+	     g = d[m - 1] - d[l - 1] + e[l - 1] / (g + ((g < 0)?-fabs(r):fabs(r)));/*MYSIGN(r, g));*/
+	     s = c = 1.0;
+	     p = 0.0;
+
+	     for (i = m - 1; i >= l; i--)
+               {
+		 f = s * e[i - 1];
+		 b = c * e[i - 1];
+		 if (fabs(f) >= fabs(g))
+		   {
+		     c = g / f;
+		     r = sqrt((c * c) + 1.0);
+		     e[i] = f * r;
+		     c *= (s = 1.0 / r);
+		   } 
+		 else
+		   {
+		     s = f / g;
+		     r = sqrt((s * s) + 1.0);
+		     e[i] = g * r;
+		     s *= (c = 1.0 / r);
+		   }
+		 g = d[i] - p;
+		 r = (d[i - 1] - g) * s + 2.0 * c * b;
+		 p = s * r;
+		 d[i] = g + p;
+		 g = c * r - b;
+		 for (k = 1; k <= n; k++)
+		   {
+		     f = z[i][k-1];
+		     z[i][k-1] = s * z[i - 1][k - 1] + c * f;
+		     z[i - 1][k - 1] = c * z[i - 1][k - 1] - s * f;
+		   }
+	       }
+
+	     d[l - 1] = d[l - 1] - p;
+	     e[l - 1] = g;
+	     e[m - 1] = 0.0;
+	   }
+	} 
+      while (m != l);
+    }
+
+    
+ 
+    return (1);
+ }
+
+
+/** @brief Compute the eigenvectors and eigenvalues
+  *
+  * @param _a
+  *   The Q matrix
+  *
+  * @param states
+  *   Number of states
+  *
+  * @param d
+  *  Eigenvalues I think? 
+  * 
+  * @param e
+  *  Not sure why this is passed as a parameter. It is uninitialized, it is first set in mytqli(...) and it is never used in initGeneric()
+  *
+  * @todo
+  *   Remove e from parameter?
+*/
+static void makeEigen(double **_a, const int states, double *d, double *e)
+{
+  mytred2(_a, states, d, e);
+  mytqli(d, e, states, _a);
+}
+
+/** @brief Generic initialization of parameters and decomposition of the Q matrix
+  *
+  * Decompose the Q matrix into eigenvectors and eigenvalues. 
+  *
+  * @param states
+  *  Number of states of the current model
+  *
+  * @param valueVector
+  *  Pointer where the tipVector will be stored
+  *
+  * @param valueVectorLength
+  *  Number of elements (of size \a states) of the tipVector
+  *
+  * @param fracchange
+  *  Variable where the computed fracchange will be stored
+  *
+  * @param ext_EIGN
+  *   Array where the eigenvalues will be stored
+  *
+  * @param EV
+  *   Array where the eigenvectors will be stored
+  *  
+  * @param EI
+  *   Array where the inverse eigenvectors will be stored
+  *
+  * @param frequencies
+  *   The model frequencies
+  *
+  * @param ext_initialRates
+  *   The model substitution rates
+  *
+  * @param tipVector
+  *   Array where the computed tipVector will be stored
+  *
+  * @todo
+  *   Perhaps we could change this also to the way pllOptRatesGeneric and other functions are implemented.
+  *   That is, instead of passing all these parameters, pass the partition index instead and load the
+  *   values within the code. Will make the code more readable. 
+*/
+static void initGeneric(const int states, 
+                        const unsigned int *valueVector, 
+                        int valueVectorLength,
+                        double *fracchange,
+                        double *ext_EIGN,
+                        double *EV,
+                        double *EI,
+                        double *frequencies,
+                        double *ext_initialRates,
+                        double *tipVector
+ 		      )
+{
+  double 
+    **r, 
+    **a, 
+    **EIGV,
+    *initialRates = ext_initialRates, 
+    *f, 
+    *e, 
+    *d, 
+    *invfreq, 
+    *EIGN,
+    *eptr; 
+  
+  int 
+    i, 
+    j, 
+    k, 
+    m, 
+    l;  
+
+  r    = (double **)rax_malloc((size_t)states * sizeof(double *));
+  EIGV = (double **)rax_malloc((size_t)states * sizeof(double *));  
+  a    = (double **)rax_malloc((size_t)states * sizeof(double *));	  
+  
+  for(i = 0; i < states; i++)
+    {
+      a[i]    = (double*)rax_malloc((size_t)states * sizeof(double));
+      EIGV[i] = (double*)rax_malloc((size_t)states * sizeof(double));
+      r[i]    = (double*)rax_malloc((size_t)states * sizeof(double));
+    }
+
+  f       = (double*)rax_malloc((size_t)states * sizeof(double));
+  e       = (double*)rax_malloc((size_t)states * sizeof(double));
+  d       = (double*)rax_malloc((size_t)states * sizeof(double));
+  invfreq = (double*)rax_malloc((size_t)states * sizeof(double));
+  EIGN    = (double*)rax_malloc((size_t)states * sizeof(double));
+  
+  for(l = 0; l < states; l++) 
+    f[l] = frequencies[l];	
+    
+  
+  i = 0;
+  
+  for(j = 0; j < states; j++)	 
+    for(k = 0; k < states; k++)
+      r[j][k] = 0.0;
+  
+  for(j = 0; j < states - 1; j++)
+    for (k = j + 1; k < states; k++)      	  
+      r[j][k] = initialRates[i++];         
+  
+  for (j = 0; j < states; j++) 
+    {
+      r[j][j] = 0.0;
+      for (k = 0; k < j; k++)
+	r[j][k] = r[k][j];
+    }                         
+  
+  
+
+  *fracchange = 0.0;
+  
+  for (j = 0; j < states; j++)
+    for (k = 0; k < states; k++)
+      *fracchange += f[j] * r[j][k] * f[k];
+  
+  m = 0;
+  
+  for(i=0; i< states; i++) 
+    a[i][i] = 0;
+  
+  /*  assert(r[states - 2][states - 1] == 1.0);*/
+  
+  /* compute a matrix from the rates such that each element of the diagonal
+     equals to the negative sum of all other values in the current row */
+  for(i = 0; i < states; i++) 
+    {
+      for(j = i + 1;  j < states; j++) 
+	{
+	  double factor =  initialRates[m++];
+	  a[i][j] = a[j][i] = factor * sqrt( f[i] * f[j]);
+	  a[i][i] -= factor * f[j];
+	  a[j][j] -= factor * f[i];
+	}
+    }             	        
+
+  makeEigen(a, states, d, e);
+  
+ 
+  
+  for (i = 0; i < states; i++)     
+    for (j = 0; j < states; j++)       
+      a[i][j] *= sqrt(f[j]);
+   
+  
+  
+  for (i = 0; i < states; i++)
+    {	  
+      if (d[i] > -1e-8) 
+	{	      
+	  if (i != 0) 
+	    {		    
+	      double tmp = d[i], sum=0;
+	      d[i] = d[0];
+	      d[0] = tmp;
+	      for (j=0; j < states; j++) 
+		{
+		  tmp = a[i][j];
+		  a[i][j] = a[0][j];
+		  sum += (a[0][j] = tmp);
+		}
+	      for (j=0; j < states; j++) 
+		a[0][j] /= sum;
+	    }
+	  break;
+	}
+    }
+  
+  for (i = 0; i < states; i++) 
+    {
+      EIGN[i] = -d[i];
+      
+      for (j=0; j < states; j++)
+	EIGV[i][j] = a[j][i];
+      invfreq[i] = 1 / EIGV[i][0]; 
+    }                                    
+  
+  ext_EIGN[0] = 0.0;
+
+  for (l = 1; l < states; l++)
+    {
+      ext_EIGN[l] = EIGN[l]; 
+      assert(ext_EIGN[l] > 0.0);
+    }
+  
+  eptr = EV;
+  
+  for (i = 0; i < states; i++)		  
+    for (j = 0; j < states; j++)
+      {
+	*eptr++ = EIGV[i][j];	 /* EIGV: Eigenvalues */ 
+	
+      }
+  for (i = 0; i < states; i++)
+    for (j = 0; j < states; j++)
+      {
+	if(j == 0)
+	  EI[i * states + j] = 1.0;
+	else
+	  EI[i * states + j] = EV[i * states + j] * invfreq[i];   /* EV = Eigenvector, EI = Inverse Eigenvector,   $ u_{i,x}^{-1} = \pi_x u_{x,i} */
+      }
+  
+  for (i = 0; i < valueVectorLength; i++)
+    {
+      unsigned int value = valueVector[i];
+      
+      for(j = 0; j < states; j++)
+	tipVector[i * states + j]     = 0;	            
+
+      if(value > 0)
+	{		      
+	  for (j = 0; j < states; j++) 
+	    {	    
+	      if ((value >> j) & 1) 
+		{
+		  int l;
+		  for (l = 0; l < states; l++)
+		    tipVector[i * states + l] += EIGV[j][l];
+		}	     		  
+	    }	    
+	}     
+    }
+
+  for (i = 0; i < valueVectorLength; i++)
+    {
+       for(j = 0; j < states; j++)
+	 if(tipVector[i * states + j] > PLL_MAX_TIP_EV)
+	   tipVector[i * states + j] = PLL_MAX_TIP_EV;
+    }
+
+
+  
+
+  for (i = 0; i < states; i++)
+    {
+      rax_free(EIGV[i]);
+      rax_free(a[i]);
+      rax_free(r[i]);
+    }
+
+  rax_free(r);
+  rax_free(a);
+  rax_free(EIGV);
+
+  rax_free(f);
+  rax_free(e);
+  rax_free(d);
+  rax_free(invfreq);
+  rax_free(EIGN);
+}
+
+/** @brief Initialize GTR
+  *
+  * Wrapper function for the decomposition of the substitution rates matrix
+  * into eigenvectors and eigenvalues
+  *
+  * @param tr
+  *   PLL instance
+  *
+  * @param pr
+  *   List of partitions
+  *
+  * @param model
+  *   Partition index
+  */
+void pllInitReversibleGTR(pllInstance * tr, partitionList * pr, int model)
+{ 
+ double   
+   *ext_EIGN         = pr->partitionData[model]->EIGN,
+   *EV               = pr->partitionData[model]->EV,
+   *EI               = pr->partitionData[model]->EI,
+   *frequencies      = pr->partitionData[model]->frequencies,
+   *empiricalFrequencies = pr->partitionData[model]->empiricalFrequencies,
+   *ext_initialRates = pr->partitionData[model]->substRates,
+   *tipVector        = pr->partitionData[model]->tipVector,
+   *fracchange       = &(pr->partitionData[model]->fracchange);
+ 
+  
+ int states = pr->partitionData[model]->states;
+
+ switch(pr->partitionData[model]->dataType)
+   { 
+   case PLL_GENERIC_32:
+   case PLL_GENERIC_64:
+   case PLL_SECONDARY_DATA_6:
+   case PLL_SECONDARY_DATA_7: 
+   case PLL_SECONDARY_DATA:
+   case PLL_DNA_DATA:
+   case PLL_BINARY_DATA:    
+     initGeneric(states, 
+		 getBitVector(pr->partitionData[model]->dataType),
+		 getUndetermined(pr->partitionData[model]->dataType) + 1,
+		 fracchange,
+		 ext_EIGN, 
+		 EV, 
+		 EI, 
+		 frequencies, 
+		 ext_initialRates,
+		 tipVector
+		 // model
+		);
+     break;   
+   case PLL_AA_DATA:
+     if(pr->partitionData[model]->protModels != PLL_GTR)
+       {
+	 double f[20];
+	 int l;
+
+	 if(pr->partitionData[model]->protModels == PLL_LG4)
+	   {
+	     int 
+	       i;
+	     
+	     for(i = 0; i < 4; i++)
+	       {		 
+		 initProtMat(f, pr->partitionData[model]->protModels, &(pr->partitionData[model]->substRates_LG4[i][0]), i);
+		 
+		 if(!pr->partitionData[model]->optimizeBaseFrequencies)
+		 {
+		   if(!pr->partitionData[model]->protUseEmpiricalFreqs)
+		   {
+		     for(l = 0; l < 20; l++)		
+		       pr->partitionData[model]->frequencies_LG4[i][l] = f[l];
+		   }
+                   else
+		   {
+		     for(l = 0; l < 20; l++)		
+		       pr->partitionData[model]->frequencies_LG4[i][l] = empiricalFrequencies[l];
+		   }
+	 	 }
+		 else
+		 {
+		   memcpy(pr->partitionData[model]->frequencies_LG4[i], frequencies, 20 * sizeof(double));
+		 }
+	       }
+	   }
+	 else
+	   {
+             if(pr->partitionData[model]->protModels == PLL_AUTO)
+	       initProtMat(f, pr->partitionData[model]->autoProtModels, ext_initialRates, 0);
+	     else	  
+	       {
+		 initProtMat(f, pr->partitionData[model]->protModels, ext_initialRates, 0);
+	       }
+
+	     /*if(adef->protEmpiricalFreqs && tr->NumberOfModels == 1)
+	       assert(tr->partitionData[model].protUseEmpiricalFreqs);*/
+	 
+              if (!pr->partitionData[model]->optimizeBaseFrequencies) {
+                  if(!pr->partitionData[model]->protUseEmpiricalFreqs)
+                  {	     	    
+                      for(l = 0; l < 20; l++)		
+                         frequencies[l] = f[l];
+                  } else {
+                      for(l = 0; l < 20; l++)		
+                         frequencies[l] = empiricalFrequencies[l];
+                  }
+              }
+           }  
+       }
+               
+     if(pr->partitionData[model]->protModels == PLL_LG4)
+       {
+         int 
+           i;
+
+         double 
+           *fracchanges_LG4[4],
+           acc = 0.0;
+
+         /* TODO frac change !*/
+
+         for(i = 0; i < 4; i++)
+           {
+             fracchanges_LG4[i]  = (double *)rax_malloc(pr->numberOfPartitions * sizeof(double));
+             initGeneric(states, 
+                         bitVectorAA, 
+                         23, 
+                         fracchanges_LG4[i],
+                         pr->partitionData[model]->EIGN_LG4[i], 
+                         pr->partitionData[model]->EV_LG4[i],
+                         pr->partitionData[model]->EI_LG4[i],
+                         pr->partitionData[model]->frequencies_LG4[i],
+                         pr->partitionData[model]->substRates_LG4[i],
+                         pr->partitionData[model]->tipVector_LG4[i]
+             //            model
+                        );   
+           }
+
+         for(i = 0; i < 4; i++)
+           {	    
+             acc += fracchanges_LG4[i][model];
+             rax_free(fracchanges_LG4[i]);
+           }
+
+         //tr->fracchanges[model] = acc / 4;
+         //TODO check if valid
+         fracchange[model] = acc / 4;
+       }
+     else
+       initGeneric(states, 
+                   bitVectorAA, 
+                   23, 
+                   fracchange,
+                   ext_EIGN, 
+                   EV, 
+                   EI, 
+                   frequencies, 
+                   ext_initialRates,
+                   tipVector
+       //            model
+                  );
+    break;  
+   default:
+     assert(0);
+   } 
+
+ updateFracChange(tr, pr);
+}
+
+
+double LnGamma (double alpha)
+{
+/* returns ln(gamma(alpha)) for alpha>0, accurate to 10 decimal places.  
+   Stirling's formula is used for the central polynomial part of the procedure.
+   Pike MC & Hill ID (1966) Algorithm 291: Logarithm of the gamma function.
+   Communications of the Association for Computing Machinery, 9:684
+*/
+  double x, f, z, result;
+
+  x = alpha;
+  f = 0.0;
+  
+  if ( x < 7.0) 
+     {
+       f = 1.0;  
+       z = alpha - 1.0;
+      
+       while ((z = z + 1.0) < 7.0)  
+	 {	  
+	   f *= z;
+	 }
+       x = z;   
+     
+       assert(f != 0.0);
+	
+       f=-log(f);
+     }
+   
+   z = 1/(x*x);
+   
+   result = f + (x-0.5)*log(x) - x + .918938533204673 
+	  + (((-.000595238095238*z+.000793650793651)*z-.002777777777778)*z
+	       +.083333333333333)/x;  
+
+   return result;
+}
+
+
+
+double IncompleteGamma (double x, double alpha, double ln_gamma_alpha)
+{
+/* returns the incomplete gamma ratio I(x,alpha) where x is the upper 
+	   limit of the integration and alpha is the shape parameter.
+   returns (-1) if in error
+   ln_gamma_alpha = ln(Gamma(alpha)), is almost redundant.
+   (1) series expansion     if (alpha>x || x<=1)
+   (2) continued fraction   otherwise
+   RATNEST FORTRAN by
+   Bhattacharjee GP (1970) The incomplete gamma integral.  Applied Statistics,
+   19: 285-287 (AS32)
+*/
+   int i;
+   double p=alpha, g=ln_gamma_alpha;
+   double accurate=1e-8, overflow=1e30;
+   double factor, gin=0, rn=0, a=0,b=0,an=0,dif=0, term=0, pn[6];
+
+
+   if (x==0) return (0);
+   if (x<0 || p<=0) return (-1);
+
+   
+   factor=exp(p*log(x)-x-g);   
+   if (x>1 && x>=p) goto l30;
+   /* (1) series expansion */
+   gin=1;  term=1;  rn=p;
+ l20:
+   rn++;
+   term*=x/rn;   gin+=term;
+
+   if (term > accurate) goto l20;
+   gin*=factor/p;
+   goto l50;
+ l30:  
+   /* (2) continued fraction */
+   a=1-p;   b=a+x+1;  term=0;
+   pn[0]=1;  pn[1]=x;  pn[2]=x+1;  pn[3]=x*b;
+   gin=pn[2]/pn[3];   
+ l32:  
+   a++;  
+   b+=2;  
+   term++;   
+   an=a*term;
+   for (i=0; i<2; i++) 
+     pn[i+4]=b*pn[i+2]-an*pn[i];
+   if (pn[5] == 0) goto l35;
+   rn=pn[4]/pn[5];   
+   dif=fabs(gin-rn);  
+   if (dif>accurate) goto l34;
+   if (dif<=accurate*rn) goto l42;
+ l34:   
+   gin=rn;
+ l35: 
+   for (i=0; i<4; i++) 
+     pn[i]=pn[i+2];
+   if (fabs(pn[4]) < overflow)            
+     goto l32;        
+   
+   for (i=0; i<4; i++) 
+     pn[i]/=overflow;
+
+   
+   goto l32;
+ l42:  
+   gin=1-factor*gin;
+
+ l50: 
+   return (gin);
+}
+
+
+
+
+double PointNormal (double prob)
+{
+/* returns z so that Prob{x<z}=prob where x ~ N(0,1) and (1e-12)<prob<1-(1e-12)
+   returns (-9999) if in error
+   Odeh RE & Evans JO (1974) The percentage points of the normal distribution.
+   Applied Statistics 22: 96-97 (AS70)
+
+   Newer methods:
+     Wichura MJ (1988) Algorithm AS 241: the percentage points of the
+       normal distribution.  37: 477-484.
+     Beasley JD & Springer SG  (1977).  Algorithm AS 111: the percentage 
+       points of the normal distribution.  26: 118-121.
+
+*/
+   double a0=-.322232431088, a1=-1, a2=-.342242088547, a3=-.0204231210245;
+   double a4=-.453642210148e-4, b0=.0993484626060, b1=.588581570495;
+   double b2=.531103462366, b3=.103537752850, b4=.0038560700634;
+   double y, z=0, p=prob, p1;
+
+   p1 = (p<0.5 ? p : 1-p);
+   if (p1<1e-20) return (-9999);
+
+   y = sqrt (log(1/(p1*p1)));   
+   z = y + ((((y*a4+a3)*y+a2)*y+a1)*y+a0) / ((((y*b4+b3)*y+b2)*y+b1)*y+b0);
+   return (p<0.5 ? -z : z);
+}
+
+
+double PointChi2 (double prob, double v)
+{
+/* returns z so that Prob{x<z}=prob where x is Chi2 distributed with df=v
+   returns -1 if in error.   0.000002<prob<0.999998
+   RATNEST FORTRAN by
+       Best DJ & Roberts DE (1975) The percentage points of the 
+       Chi2 distribution.  Applied Statistics 24: 385-388.  (AS91)
+   Converted into C by Ziheng Yang, Oct. 1993.
+*/
+   double e=.5e-6, aa=.6931471805, p=prob, g;
+   double xx, c, ch, a=0,q=0,p1=0,p2=0,t=0,x=0,b=0,s1,s2,s3,s4,s5,s6;
+  
+   if (p<.000002 || p>.999998 || v<=0) return (-1);
+  
+   g = LnGamma(v/2);
+   
+   xx=v/2;   c=xx-1;
+   if (v >= -1.24*log(p)) goto l1;
+
+   ch=pow((p*xx*exp(g+xx*aa)), 1/xx);
+   if (ch-e<0) return (ch);
+   goto l4;
+l1:
+   if (v>.32) goto l3;
+   ch=0.4;   a=log(1-p);
+l2:
+   q=ch;  p1=1+ch*(4.67+ch);  p2=ch*(6.73+ch*(6.66+ch));
+   t=-0.5+(4.67+2*ch)/p1 - (6.73+ch*(13.32+3*ch))/p2;
+   ch-=(1-exp(a+g+.5*ch+c*aa)*p2/p1)/t;
+   if (fabs(q/ch-1)-.01 <= 0) goto l4;
+   else                       goto l2;
+  
+l3:    
+   x=PointNormal (p);
+   p1=0.222222/v;   ch=v*pow((x*sqrt(p1)+1-p1), 3.0);
+   if (ch>2.2*v+6)  ch=-2*(log(1-p)-c*log(.5*ch)+g);
+l4:
+   q=ch;   p1=.5*ch;   
+   if ((t=IncompleteGamma (p1, xx, g))< 0.0) 
+     {
+       printf ("IncompleteGamma \n");      
+       return (-1);
+     }
+  
+   p2=p-t;
+   t=p2*exp(xx*aa+g+p1-c*log(ch));   
+   b=t/ch;  a=0.5*t-b*c;
+
+   s1=(210+a*(140+a*(105+a*(84+a*(70+60*a))))) / 420;
+   s2=(420+a*(735+a*(966+a*(1141+1278*a))))/2520;
+   s3=(210+a*(462+a*(707+932*a)))/2520;
+   s4=(252+a*(672+1182*a)+c*(294+a*(889+1740*a)))/5040;
+   s5=(84+264*a+c*(175+606*a))/2520;
+   s6=(120+c*(346+127*c))/5040;
+   ch+=t*(1+0.5*t*s1-b*c*(s1-b*(s2-b*(s3-b*(s4-b*(s5-b*s6))))));
+   if (fabs(q/ch-1) > e) goto l4;
+
+   return (ch);
+}
+
+/** @brief Compute the gamma rates
+    
+    Compute the gamma rates
+
+    @param alpha
+      Alpha parameter
+
+    @param gammaRates
+      Array where to store the computed gamma rates
+
+    @param K
+      Number of categories
+
+    @param useMedian
+      Boolean flag whether to use a median or not
+
+    @todo
+       Document this more.
+*/
+void pllMakeGammaCats(double alpha, double *gammaRates, int K, boolean useMedian)
+{
+  int 
+    i;
+
+  double 
+    factor = alpha / alpha * K, 
+    lnga1, 
+    alfa = alpha, 
+    beta = alpha,
+    *gammaProbs = (double *)rax_malloc(K * sizeof(double));
+
+  /* Note that PLL_ALPHA_MIN setting is somewhat critical due to   */
+  /* numerical instability caused by very small rate[0] values */
+  /* induced by low alpha values around 0.01 */
+
+  assert(alfa >= PLL_ALPHA_MIN); 
+
+  if(useMedian)
+    {
+      double  
+	middle = 1.0 / (2.0*K),
+	t = 0.0; 
+      
+      for(i = 0; i < K; i++)     
+        gammaRates[i] = PLL_POINT_GAMMA((double)(i * 2 + 1) * middle, alfa, beta);
+      
+      for (i = 0; i < K; i++) 
+	t += gammaRates[i];
+       for( i = 0; i < K; i++)     
+	 gammaRates[i] *= factor / t;
+    }
+  else
+    {
+      lnga1 = LnGamma(alfa + 1);
+
+      for (i = 0; i < K - 1; i++)
+        gammaProbs[i] = PLL_POINT_GAMMA((i + 1.0) / K, alfa, beta);
+
+      for (i = 0; i < K - 1; i++)
+	gammaProbs[i] = IncompleteGamma(gammaProbs[i] * beta, alfa + 1, lnga1);   
+
+      gammaRates[0] = gammaProbs[0] * factor;
+      
+      gammaRates[K - 1] = (1 - gammaProbs[K - 2]) * factor;
+
+      for (i= 1; i < K - 1; i++)  
+	gammaRates[i] = (gammaProbs[i] - gammaProbs[i - 1]) * factor;      
+    }
+  /* assert(gammaRates[0] >= 0.00000000000000000000000000000044136090435925743185910935350715027016962154188875); */
+
+  rax_free(gammaProbs);
+  
+  return;  
+}
+
+
+/** @brief Set the substitution rates
+  *
+  * @brief Set \a rates - 1  substitution rates. Set the last rate to 1.
+  *
+  * @param r
+  *  Array of substitution rates
+  *
+  * @param rates
+  *   Number of rates to set
+  */
+static void setRates(double *r, int rates)
+{
+  int i;
+
+  //changed to 1.0 instead of 0.5 for making the 
+  //implementation of an interface function to set other models 
+  //than GTR easier 
+
+  for(i = 0; i < rates - 1; i++)
+    r[i] = 1.0;
+
+  r[rates - 1] = 1.0;
+}
+
+/** @brief Initialize the substitution rates matrix
+  *
+  * Initialize the substitution rates matrices for all partitions
+  *
+  * @param tr
+  *   The PLL instance
+  *
+  * @param pr
+  *   List of partitions
+  *
+  * @todo
+  *   Do we need the secondary structure and binary? Will we only use GTR? If yes,
+  *   we could rename this function to initRateMatrixGTR
+  */
+void initRateMatrix(pllInstance *tr, partitionList *pr)
+{
+  int model;
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+    {	
+      int 	
+	i,
+	states = pr->partitionData[model]->states,
+	rates  = (states * states - states) / 2;
+      
+      switch(pr->partitionData[model]->dataType)
+	{
+	case PLL_BINARY_DATA:
+	case PLL_DNA_DATA:
+	case PLL_SECONDARY_DATA:
+	case PLL_SECONDARY_DATA_6:
+	case PLL_SECONDARY_DATA_7:
+	  setRates(pr->partitionData[model]->substRates, rates);
+	  break;	  
+	case PLL_GENERIC_32:
+	case PLL_GENERIC_64:	  
+	  switch(tr->multiStateModel)
+	    {
+	    case PLL_ORDERED_MULTI_STATE:
+	      {
+		int 
+		  j, 
+		  k, 
+		  i = 0;
+		
+		for(j = 0; j < states; j++)
+		  for(k = j + 1; k < states; k++)
+		    pr->partitionData[model]->substRates[i++] = (double)(k - j);
+		assert(i == rates);		
+	      }
+	      break;
+	    case PLL_MK_MULTI_STATE:
+	      for(i = 0; i < rates; i++)
+		pr->partitionData[model]->substRates[i] = 1.0;
+	      
+	      break;
+	    case PLL_GTR_MULTI_STATE:
+	      setRates(pr->partitionData[model]->substRates, rates);
+	      break;
+	    default:
+	      assert(0);
+	    }
+	  break;
+	case PLL_AA_DATA:
+	  if(pr->partitionData[model]->protModels == PLL_GTR)
+	    {
+	      //set optimizeSubstRates to true !
+	      pr->partitionData[model]->optimizeSubstitutionRates = PLL_TRUE;
+	      putWAG(pr->partitionData[model]->substRates);
+	    }
+	  break;
+	default:
+	  assert(0);
+	}           
+      
+      if(pr->partitionData[model]->nonGTR)
+	{
+	  assert(pr->partitionData[model]->dataType == PLL_SECONDARY_DATA ||
+		 pr->partitionData[model]->dataType == PLL_SECONDARY_DATA_6 ||
+		 pr->partitionData[model]->dataType == PLL_SECONDARY_DATA_7);
+	  	  
+	  for(i = 0; i < rates; i++)
+	    {
+	      if(pr->partitionData[model]->symmetryVector[i] == -1)
+		pr->partitionData[model]->substRates[i] = 0.0;
+	      else
+		{
+		  if(pr->partitionData[model]->symmetryVector[i] == pr->partitionData[model]->symmetryVector[rates - 1])
+		    pr->partitionData[model]->substRates[i] = 1.0;
+		}
+	    }
+	}
+    }  
+}
+
+/** @brief Function for setting secondary structure symmetries
+  *
+  * @todo
+  *   Do we need this function?
+*/
+static void setSymmetry(int *s, int *sDest, const int sCount, int *f, int *fDest, const int fCount)
+{
+  int i;
+
+  for(i = 0; i < sCount; i++)
+    sDest[i] = s[i];
+
+  for(i = 0; i < fCount; i++)
+    fDest[i] = f[i];
+}
+
+/** @brief Wrapper function for setting secondary structure symmetries
+  *
+  * @todo
+  *   Do we need this function?
+*/
+static void setupSecondaryStructureSymmetries(pllInstance *tr, partitionList *partitions)
+{
+  int model;
+  int numberOfModels = partitions->numberOfPartitions;
+
+  for(model = 0; model < numberOfModels; model++)
+    {
+      if(partitions->partitionData[model]->dataType == PLL_SECONDARY_DATA ||
+    		  partitions->partitionData[model]->dataType == PLL_SECONDARY_DATA_6 ||
+    		  partitions->partitionData[model]->dataType == PLL_SECONDARY_DATA_7)
+	{	
+	  switch(tr->secondaryStructureModel)
+	    {
+	    case PLL_SEC_6_A:
+	    	partitions->partitionData[model]->nonGTR = PLL_FALSE;
+	      break;
+	    case PLL_SEC_6_B:
+	      {
+		int f[6]  = {0, 1, 2, 3, 4, 5};
+		int s[15] = {2, 0, 1, 2, 2, 2, 2, 0, 1, 1, 2, 2, 2, 2, 1};
+
+		setSymmetry(s, partitions->partitionData[model]->symmetryVector, 15, f, partitions->partitionData[model]->frequencyGrouping, 6);
+		  
+		partitions->partitionData[model]->nonGTR = PLL_TRUE;
+	      }
+	      break;
+	    case PLL_SEC_6_C:
+	      {
+		int f[6]  = {0, 2, 2, 1, 0, 1};
+		int s[15] = {2, 0, 1, 2, 2, 2, 2, 0, 1, 1, 2, 2, 2, 2, 1};
+
+		setSymmetry(s, partitions->partitionData[model]->symmetryVector, 15, f, partitions->partitionData[model]->frequencyGrouping, 6);
+		
+		partitions->partitionData[model]->nonGTR = PLL_TRUE;
+	      }
+	      break;
+	    case PLL_SEC_6_D:
+	      {
+		int f[6]  = {0, 2, 2, 1, 0, 1};
+		int s[15] = {2, -1, 1, 2, 2, 2, 2, -1, 1, 1, 2, 2, 2, 2, 1};
+
+		setSymmetry(s, partitions->partitionData[model]->symmetryVector, 15, f, partitions->partitionData[model]->frequencyGrouping, 6);
+
+		partitions->partitionData[model]->nonGTR = PLL_TRUE;
+	      }
+	      break;
+	    case PLL_SEC_6_E:
+	      {
+		int f[6]  = {0, 1, 2, 3, 4, 5};
+		int s[15] = {2, -1, 1, 2, 2, 2, 2, -1, 1, 1, 2, 2, 2, 2, 1};
+
+		setSymmetry(s, partitions->partitionData[model]->symmetryVector, 15, f, partitions->partitionData[model]->frequencyGrouping, 6);
+
+		partitions->partitionData[model]->nonGTR = PLL_TRUE;
+	      }
+	      break;
+	    case PLL_SEC_7_A:
+	    	partitions->partitionData[model]->nonGTR = PLL_FALSE;
+	      break;
+	    case PLL_SEC_7_B:
+	      {
+	      	int f[7]  = {0, 2, 2, 1, 0, 1, 3};
+		int s[21] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+		
+		setSymmetry(s, partitions->partitionData[model]->symmetryVector, 21, f, partitions->partitionData[model]->frequencyGrouping, 7);
+
+		partitions->partitionData[model]->nonGTR = PLL_TRUE;
+
+	      }
+	      break;
+	    case PLL_SEC_7_C:
+	      {
+	      	int f[7]  = {0, 1, 2, 3, 4, 5, 6};
+		int s[21] = {-1, -1, 0, -1, -1, 4, -1, -1, -1, 3, 5, 1, -1, -1, 6, -1, -1, 7, 2, 8, 9};
+		
+		setSymmetry(s, partitions->partitionData[model]->symmetryVector, 21, f, partitions->partitionData[model]->frequencyGrouping, 7);
+
+		partitions->partitionData[model]->nonGTR = PLL_TRUE;
+
+	      }
+	      break;
+	    case PLL_SEC_7_D:
+	      {
+	      	int f[7]  = {0, 1, 2, 3, 4, 5, 6};
+		int s[21] = {2, 0, 1, 2, 2, 3, 2, 2, 0, 1, 3, 1, 2, 2, 3, 2, 2, 3, 1, 3, 3};
+		
+		setSymmetry(s, partitions->partitionData[model]->symmetryVector, 21, f, partitions->partitionData[model]->frequencyGrouping, 7);
+
+		partitions->partitionData[model]->nonGTR = PLL_TRUE;
+
+	      }
+	      break;
+	    case PLL_SEC_7_E:
+	      {
+	      	int f[7]  = {0, 1, 2, 3, 4, 5, 6};
+		int s[21] = {-1, -1, 0, -1, -1, 1, -1, -1, -1, 0, 1, 0, -1, -1, 1, -1, -1, 1, 0, 1, 1};
+		
+		setSymmetry(s, partitions->partitionData[model]->symmetryVector, 21, f, partitions->partitionData[model]->frequencyGrouping, 7);
+
+		partitions->partitionData[model]->nonGTR = PLL_TRUE;
+
+	      }
+	      break;
+	    case PLL_SEC_7_F:
+	      {
+	      	int f[7]  = {0, 2, 2, 1, 0, 1, 3};
+		int s[21] = {2, 0, 1, 2, 2, 3, 2, 2, 0, 1, 3, 1, 2, 2, 3, 2, 2, 3, 1, 3, 3};		
+		
+		setSymmetry(s, partitions->partitionData[model]->symmetryVector, 21, f, partitions->partitionData[model]->frequencyGrouping, 7);
+
+		partitions->partitionData[model]->nonGTR = PLL_TRUE;
+
+	      }
+	      break;
+	      
+	    case PLL_SEC_16:
+	    	partitions->partitionData[1]->nonGTR = PLL_FALSE;
+	      break;
+	    case PLL_SEC_16_A:
+	      {
+	      	int f[16]  = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
+		int s[120] = {/* AA */  4,  4,  3,  4, -1, -1, -1,  4, -1, -1, -1,  3, -1, -1, -1,
+			      /* AC */  4,  3, -1,  4, -1, -1, -1,  3, -1, -1, -1,  4, -1, -1,
+			      /* AG */  3, -1, -1,  3, -1, -1, -1,  4, -1, -1, -1,  3, -1,
+			      /* AU */ -1, -1,  2,  3, -1,  0, -1,  1,  2, -1,  2,  3,
+			      /* CA */  4,  3,  4,  4, -1, -1, -1,  3, -1, -1, -1,
+			      /* CC */  3,  4, -1,  3, -1, -1, -1,  4, -1, -1,
+			      /* CG */  3, -1,  2,  3,  2,  0, -1,  1, -1,
+			      /* CU */ -1, -1, -1,  3, -1, -1, -1,  4,
+			      /* GA */  3,  4,  3,  3, -1, -1, -1,
+			      /* GC */  3,  1,  2,  3,  2, -1,
+			      /* GG */  3, -1, -1,  3, -1,
+			      /* GU */  2, -1,  2,  3,
+			      /* UA */  3,  1,  3,
+			      /* UC */  3,  4,
+			      /* UG */  3};
+			      
+		
+		setSymmetry(s, partitions->partitionData[model]->symmetryVector, 120, f, partitions->partitionData[model]->frequencyGrouping, 16);
+			      
+		partitions->partitionData[model]->nonGTR = PLL_TRUE;
+
+		}
+	      break;
+	    case PLL_SEC_16_B:
+	      {
+		int f[16]  = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
+		int s[120] = {/* AA */  0,  0,  0,  0, -1, -1, -1,  0, -1, -1, -1,  0, -1, -1, -1,
+			      /* AC */  0,  0, -1,  0, -1, -1, -1,  0, -1, -1, -1,  0, -1, -1,
+			      /* AG */  0, -1, -1,  0, -1, -1, -1,  0, -1, -1, -1,  0, -1,
+			      /* AU */ -1, -1,  0,  0, -1,  0, -1,  0,  0, -1,  0,  0,
+			      /* CA */  0,  0,  0,  0, -1, -1, -1,  0, -1, -1, -1,
+			      /* CC */  0,  0, -1,  0, -1, -1, -1,  0, -1, -1,
+			      /* CG */  0, -1,  0,  0,  0,  0, -1,  0, -1,
+			      /* CU */ -1, -1, -1,  0, -1, -1, -1,  0,
+			      /* GA */  0,  0,  0,  0, -1, -1, -1,
+			      /* GC */  0,  0,  0,  0,  0, -1,
+			      /* GG */  0, -1, -1,  0, -1,
+			      /* GU */  0, -1,  0,  0,
+			      /* UA */  0,  0,  0,
+			      /* UC */  0,  0,
+			      /* UG */  0};
+			      
+		
+		setSymmetry(s, partitions->partitionData[model]->symmetryVector, 120, f, partitions->partitionData[model]->frequencyGrouping, 16);
+			      
+		partitions->partitionData[model]->nonGTR = PLL_TRUE;
+	      }
+	      break;
+	    case PLL_SEC_16_C:	      
+	    case PLL_SEC_16_D:
+	    case PLL_SEC_16_E:
+	    case PLL_SEC_16_F:
+	    case PLL_SEC_16_I:
+	    case PLL_SEC_16_J:
+	    case PLL_SEC_16_K:
+	      assert(0);
+	    default:
+	      assert(0);
+	    }
+	}
+
+    }
+
+}
+
+/** @brief Initialize base frequencies in partition data
+  *
+  * Copy the computed empirical frequencies for each partition from the \a empiricalFrequencies
+  * structure to each partition structure.
+  *
+  * @param pr
+  *   List of partitions
+  *
+  * @param empiricalFrequencies
+  *   Array containing the empirical frequencies
+*/
+static void initializeBaseFreqs(partitionList *pr, double **empiricalFrequencies)
+{
+  size_t 
+    model;
+  int
+    l,
+    numFreqs;
+  double f;
+
+  for(model = 0; model < (size_t)pr->numberOfPartitions; model++)
+    {
+      if(pr->partitionData[model]->optimizeBaseFrequencies)
+       {
+         //set all base frequencies to identical starting values 1.0 / numberOfDataStates
+         numFreqs = pr->partitionData[model]->states;
+         f = 1.0 / ((double)numFreqs);
+
+         for(l = 0; l < numFreqs; l++)
+          {
+            pr->partitionData[model]->frequencies[l]          = f;
+            pr->partitionData[model]->empiricalFrequencies[l] = f;
+          }
+       }
+      else
+       {
+         memcpy(pr->partitionData[model]->frequencies,          empiricalFrequencies[model], sizeof(double) * pr->partitionData[model]->states);
+         memcpy(pr->partitionData[model]->empiricalFrequencies, empiricalFrequencies[model], sizeof(double) * pr->partitionData[model]->states);
+       }
+    }
+}
+
+
+/** @brief Initialize the model parameters
+  * 
+  * Initialize the model parameters. Specifically
+  *   - Base frequencies
+  *   - Rate matrix
+  *
+  * @param tr
+  *   The PLL instance
+  *
+  * @param empiricalFrequencies
+  *   Pointer to the empirical frequencies array
+  *
+  * @param partitions
+  *   Pointer to the partitions structure
+  *
+  * @todo
+  *   What is tr->optimizeRateCategoryInvocations = 1 ?
+  */
+void initModel(pllInstance *tr, double **empiricalFrequencies, partitionList * partitions)
+{  
+  int model, j;
+  double  temp;  
+     
+  tr->optimizeRateCategoryInvocations = 1;      
+  tr->numberOfInvariableColumns = 0;
+  tr->weightOfInvariableColumns = 0;	       
+  
+  for (j = 0; j < tr->originalCrunchedLength; j++) 
+    {
+      tr->patrat[j] = temp = 1.0;
+      tr->patratStored[j] = 1.0;
+      tr->rateCategory[j] = 0;           
+    } 
+
+  /* PSR (CAT) model init */
+#if 0 				/* TODO exabayes issue  */
+  for(model = 0; model < partitions->numberOfPartitions; model++)
+    {            
+      partitions->partitionData[model]->numberOfCategories = 1;
+      partitions->partitionData[model]->perSiteRates[0] = 1.0;
+    }
+
+  updatePerSiteRates(tr, partitions, PLL_FALSE);
+#endif
+
+  setupSecondaryStructureSymmetries(tr, partitions);
+
+  initRateMatrix(tr, partitions);
+
+  initializeBaseFreqs(partitions, empiricalFrequencies);
+  
+  for(model = 0; model < partitions->numberOfPartitions; model++)
+   {
+     int
+       k;
+
+     partitions->partitionData[model]->alpha = 1.0;
+     if(partitions->partitionData[model]->dataType == PLL_AA_DATA && partitions->partitionData[model]->protModels == PLL_AUTO)
+       partitions->partitionData[model]->autoProtModels = PLL_WAG; /* initialize by WAG per default */
+      
+     pllInitReversibleGTR(tr, partitions, model); /* Decomposition of Q matrix */
+      /* GAMMA model init */
+     pllMakeGammaCats(partitions->partitionData[model]->alpha, partitions->partitionData[model]->gammaRates, 4, tr->useMedian);
+
+#if 0 
+     /* todo this should be solved in exabayes */
+     for(k = 0; k < partitions->partitionData[model]->states; k++)
+       partitions->partitionData[model]->freqExponents[k] = 0.0;	
+#endif
+   }                   		       
+  
+   
+  /* 
+     printf ("Fracchange: %f\n", tr->fracchange);
+     printf ("originalCrunchedLength: %d\n", tr->originalCrunchedLength);
+     printf ("num of parts: %d\n", partitions->numberOfPartitions);
+  */
+
+  if(partitions->numberOfPartitions > 1)
+    {
+      tr->fracchange = 0;
+      for(model = 0; model < partitions->numberOfPartitions; model++) 
+	tr->fracchange += partitions->partitionData[model]->fracchange;
+      
+      tr->fracchange /= ((double)partitions->numberOfPartitions);
+    }
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+  pllMasterBarrier(tr, partitions, PLL_THREAD_COPY_INIT_MODEL);
+#endif
+}
+
+
+
+
diff --git a/lib/pll/newick.c b/lib/pll/newick.c
new file mode 100644
index 0000000..a0fbc6b
--- /dev/null
+++ b/lib/pll/newick.c
@@ -0,0 +1,592 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file newick.c
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <math.h>
+
+#include "pll.h"
+#include "pllInternal.h"
+
+
+/** @file  newick.c
+
+    @brief Collection of routines for reading and parsing newick trees
+
+    Auxiliary functions for reading and parsing newick tree formats
+*/
+
+
+/** @defgroup newickParseGroup Reading and parsing newick trees
+    
+    This set of functions handles the reading and parsing of newick tree formats
+*/
+
+static int
+parse_newick (pllStack ** stack, int * inp)
+{
+  pllNewickNodeInfo * item = NULL;
+  int item_active = 0;
+  pllLexToken token;
+  int input;
+  pllLexToken prev_token;
+  int nop = 0;          /* number of open parentheses */
+  int depth = 0;
+
+  prev_token.tokenType = PLL_TOKEN_UNKNOWN;
+
+  input = *inp;
+
+  NEXT_TOKEN
+  
+  while (token.tokenType != PLL_TOKEN_EOF && token.tokenType != PLL_TOKEN_UNKNOWN)
+  {
+    switch (token.tokenType)
+     {
+       case PLL_TOKEN_OPAREN:
+#ifdef PLLDEBUG
+       printf ("PLL_TOKEN_OPAREN\n");
+#endif
+        ++nop;
+        memcpy (&prev_token, &token, sizeof (pllLexToken));
+        ++depth;
+        break;
+
+       case PLL_TOKEN_CPAREN:
+#ifdef PLLDEBUG
+       printf ("PLL_TOKEN_CPAREN\n");
+#endif
+        if (prev_token.tokenType != PLL_TOKEN_CPAREN  &&
+            prev_token.tokenType != PLL_TOKEN_UNKNOWN &&
+            prev_token.tokenType != PLL_TOKEN_STRING  &&
+            prev_token.tokenType != PLL_TOKEN_NUMBER  &&
+            prev_token.tokenType != PLL_TOKEN_FLOAT) return (0);
+
+        if (!nop) return (0);
+        --nop;
+        memcpy (&prev_token, &token, sizeof (pllLexToken));
+
+        /* push to the stack */
+        if (!item) item = (pllNewickNodeInfo *) rax_calloc (1, sizeof (pllNewickNodeInfo)); // possibly not nec
+        //if (item->name   == NULL) item->name   = strdup ("INTERNAL_NODE");
+        if (item->name == NULL) 
+         {
+           item->name = (char *) rax_malloc ((strlen("INTERNAL_NODE") + 1) * sizeof (char));
+           strcpy (item->name, "INTERNAL_NODE");
+         }
+
+        //if (item->branch == NULL) item->branch = strdup ("0.000000"); 
+        if (item->branch == NULL) 
+         {
+           item->branch = (char *) rax_malloc ((strlen("0.000000") + 1) * sizeof (char));
+           strcpy (item->branch, "0.000000");
+         }
+        item->depth = depth;
+        pllStackPush (stack, item);
+        item_active  = 1;       /* active = 1 */
+        item = NULL;
+        --depth;
+        break;
+
+       case PLL_TOKEN_STRING:
+#ifdef PLLDEBUG
+       printf ("PLL_TOKEN_STRING      %.*s\n", token.len, token.lexeme);
+#endif
+        if (prev_token.tokenType != PLL_TOKEN_OPAREN &&
+            prev_token.tokenType != PLL_TOKEN_CPAREN &&
+            prev_token.tokenType != PLL_TOKEN_UNKNOWN &&
+            prev_token.tokenType != PLL_TOKEN_COMMA) return (0);
+        if (!item) item = (pllNewickNodeInfo *) rax_calloc (1, sizeof (pllNewickNodeInfo));
+        //item->name = strndup (token.lexeme, token.len);
+        item->name = (char *) rax_malloc ((token.len + 1) * sizeof (char));
+        strncpy (item->name, token.lexeme, token.len);
+        item->name[token.len] = 0;
+
+        item_active = 1;
+        item->depth = depth;
+        if (prev_token.tokenType == PLL_TOKEN_COMMA  ||
+            prev_token.tokenType == PLL_TOKEN_OPAREN ||
+            prev_token.tokenType == PLL_TOKEN_UNKNOWN) item->leaf = 1;
+        memcpy (&prev_token, &token, sizeof (pllLexToken));
+        break;
+
+       case PLL_TOKEN_FLOAT:
+       case PLL_TOKEN_NUMBER:
+#ifdef PLLDEBUG
+       if (token.tokenType == PLL_TOKEN_FLOAT) printf ("PLL_TOKEN_FLOAT\n"); else printf ("PLL_TOKEN_NUMBER\n");
+#endif
+         if  (prev_token.tokenType != PLL_TOKEN_OPAREN &&
+              prev_token.tokenType != PLL_TOKEN_CPAREN &&
+              prev_token.tokenType != PLL_TOKEN_COLON  &&
+              prev_token.tokenType != PLL_TOKEN_UNKNOWN &&
+              prev_token.tokenType != PLL_TOKEN_COMMA) return (0);
+        if (!item) item = (pllNewickNodeInfo *) rax_calloc (1, sizeof (pllNewickNodeInfo));
+        if (prev_token.tokenType == PLL_TOKEN_COLON)
+         {
+           //item->branch = strndup (token.lexeme, token.len);
+           item->branch = (char *) rax_malloc ((token.len + 1) * sizeof (char));
+           strncpy (item->branch, token.lexeme, token.len);
+           item->branch[token.len] = 0;
+         }
+        else
+         {
+           if (prev_token.tokenType == PLL_TOKEN_COMMA  ||
+               prev_token.tokenType == PLL_TOKEN_OPAREN ||
+               prev_token.tokenType == PLL_TOKEN_UNKNOWN) item->leaf = 1;
+           //if (prev_token.tokenType != PLL_TOKEN_UNKNOWN) ++ indent;
+           //item->name = strndup (token.lexeme, token.len);
+           item->name = (char *) rax_malloc ((token.len + 1) * sizeof (char));
+           strncpy (item->name, token.lexeme, token.len);
+           item->name[token.len] = 0;
+         }
+        item_active = 1;
+        item->depth = depth;
+        memcpy (&prev_token, &token, sizeof (pllLexToken));
+        break;
+
+       case PLL_TOKEN_COLON:
+#ifdef PLLDEBUG
+       printf ("PLL_TOKEN_COLON\n");
+#endif
+        if (prev_token.tokenType != PLL_TOKEN_CPAREN &&
+            prev_token.tokenType != PLL_TOKEN_STRING &&
+            prev_token.tokenType != PLL_TOKEN_FLOAT  &&
+            prev_token.tokenType != PLL_TOKEN_NUMBER) return (0);
+        memcpy (&prev_token, &token, sizeof (pllLexToken));
+        break;
+
+       case PLL_TOKEN_COMMA:
+#ifdef PLLDEBUG
+       printf ("PLL_TOKEN_COMMA\n");
+#endif
+        if (prev_token.tokenType != PLL_TOKEN_CPAREN &&
+             prev_token.tokenType != PLL_TOKEN_STRING &&
+             prev_token.tokenType != PLL_TOKEN_FLOAT && 
+             prev_token.tokenType != PLL_TOKEN_NUMBER) return (0);
+        memcpy (&prev_token, &token, sizeof (pllLexToken));
+        
+        /* push to the stack */
+        if (!item) item = (pllNewickNodeInfo *) rax_calloc (1, sizeof (pllNewickNodeInfo)); // possibly not nece
+        //if (item->name   == NULL) item->name   = strdup ("INTERNAL_NODE");
+        if (item->name == NULL) 
+         {
+           item->name = (char *) rax_malloc ((strlen("INTERNAL_NODE") + 1) * sizeof (char));
+           strcpy (item->name, "INTERNAL_NODE");
+         }
+        //if (item->branch == NULL) item->branch = strdup ("0.000000"); 
+        if (item->branch == NULL) 
+         {
+           item->branch = (char *) rax_malloc ((strlen("0.000000") + 1) * sizeof (char));
+           strcpy (item->branch, "0.000000");
+         }
+        item->depth = depth;
+        pllStackPush (stack, item);
+        item_active  = 0;
+        item = NULL;
+        break;
+
+       case PLL_TOKEN_SEMICOLON:
+#ifdef PLLDEBUG
+        printf ("PLL_TOKEN_SEMICOLON\n");
+#endif
+        /* push to the stack */
+        if (!item) item = (pllNewickNodeInfo *) rax_calloc (1, sizeof (pllNewickNodeInfo));
+        //if (item->name   == NULL) item->name   = strdup ("ROOT_NODE");
+        if (item->name == NULL) 
+         {
+           item->name = (char *) rax_malloc ((strlen("ROOT_NODE") + 1) * sizeof (char));
+           strcpy (item->name, "ROOT_NODE");
+         }
+        //if (item->branch == NULL) item->branch = strdup ("0.000000"); 
+        if (item->branch == NULL) 
+         {
+           item->branch = (char *) rax_malloc ((strlen("0.000000") + 1) * sizeof (char));
+           strcpy (item->branch, "0.000000");
+         }
+        pllStackPush (stack, item);
+        item_active  = 0;
+        item = NULL;
+        break;
+       default:
+#ifdef __DEBUGGING_MODE
+         printf ("Unknown token: %d\n", token.tokenType);
+#endif
+       // TODO: Finish this part and add error codes
+        break;
+     }
+    NEXT_TOKEN
+    CONSUME(PLL_TOKEN_WHITESPACE | PLL_TOKEN_NEWLINE);
+  }
+  if (item_active)
+   {
+     if (!item) item = (pllNewickNodeInfo *) rax_calloc (1, sizeof (pllNewickNodeInfo));
+     //if (item->name   == NULL) item->name   = strdup ("ROOT_NODE");
+     if (item->name == NULL) 
+      {
+        item->name = (char *) rax_malloc ((strlen("ROOT_NODE") + 1) * sizeof (char));
+        strcpy (item->name, "ROOT_NODE");
+      }
+     //if (item->branch == NULL) item->branch = strdup ("0.000000"); 
+     if (item->branch == NULL) 
+      {
+        item->branch = (char *) rax_malloc ((strlen("0.000000") + 1) * sizeof (char));
+        strcpy (item->branch, "0.000000");
+      }
+     pllStackPush (stack, item);
+     item_active  = 0;
+   }
+
+  if (nop || token.tokenType == PLL_TOKEN_UNKNOWN) 
+   {
+     return (0);
+   }
+
+  return (1);
+}
+
+#ifdef __DEBUGGING_MODE
+void stack_dump(pllStack ** stack)
+{
+  pllNewickNodeInfo * item;
+  pllStack * head;
+  int i;
+
+  head = *stack;
+  while (head)
+   {
+     item = (pllNewickNodeInfo *) head->item;
+
+     for (i = 0; i < item->depth; ++ i) printf ("\t");
+
+     printf ("%s:%s\n", item->name, item->branch);
+
+     head = head->next;
+   }
+}
+#endif
+
+static void
+assign_ranks (pllStack * stack, int * nodes, int * leaves)
+{
+  pllStack * head;
+  pllNewickNodeInfo * item, * tmp;
+  pllStack * preorder = NULL;
+  int children;
+  int depth;
+
+  *nodes = *leaves = 0;
+
+
+  head = stack;
+  while (head)
+  {
+    assert (head->item);
+    item = (pllNewickNodeInfo *) head->item;
+    
+    if (item->leaf)  ++ (*leaves);
+
+    if (preorder)
+     {
+       tmp = (pllNewickNodeInfo *) preorder->item;
+       children = 0;
+       while (item->depth < tmp->depth)
+        {
+          children = 1;
+          depth = tmp->depth;
+          pllStackPop (&preorder);
+          tmp = preorder->item;
+          while (tmp->depth == depth)
+           {
+             ++ children;
+             pllStackPop (&preorder);
+             tmp = (pllNewickNodeInfo *)preorder->item;
+           }
+          tmp->rank += children;
+        }
+     }
+    
+    ++ (*nodes);
+    head = head->next;
+
+    if (item->leaf)
+     {
+       if (!preorder) return;
+
+       children = 1;
+       tmp = preorder->item;
+       while (tmp->depth == item->depth)
+        {
+          ++ children;
+          pllStackPop (&preorder);
+          assert (preorder);
+          tmp = (pllNewickNodeInfo *)preorder->item;
+        }
+       tmp->rank += children;
+     }
+    else
+     {
+       pllStackPush (&preorder, item);
+     }
+  }
+  
+  while (preorder->item != stack->item)
+  {
+    item = (pllNewickNodeInfo *)pllStackPop (&preorder);
+    tmp  = (pllNewickNodeInfo *) preorder->item;
+    children = 1;
+
+    while (tmp->depth == item->depth)
+     {
+       ++ children;
+       item = (pllNewickNodeInfo *) pllStackPop (&preorder);
+       tmp  = (pllNewickNodeInfo *) preorder->item;
+     }
+    tmp->rank += children;
+    children = 0;
+  }
+ assert (preorder->item == stack->item);
+ 
+ pllStackClear (&preorder);
+}
+
+/** @ingroup newickParseGroup
+    @brief Validate if a newick tree is a valid phylogenetic tree
+
+    A valid tree is one where the root node is binary or ternary
+    and all other internal nodes are binary. In case the root
+    is ternary then the tree must contain at least another internal
+    node and the total number of nodes must be equal to 
+    \f$ 2l - 2\f$, where \f$l\f$ is the number of leaves. If the
+    root is binary, then the total number of nodes must be equal
+    to \f$2l - 1\f$.
+
+    @param tree
+      Newick tree wrapper structure which contains the stack representation of the parsed newick tree
+
+    @return
+      Returns \b 1 in case of success, otherwise \b 0
+*/
+int
+pllValidateNewick (pllNewickTree * t)
+{
+  pllStack * head;
+  pllNewickNodeInfo * item;
+  int correct = 0;
+ 
+  item = t->tree->item;
+  if (item->rank != 2 && item->rank != 3) return (0);
+  head = t->tree->next;
+  while (head)
+  {
+    item = head->item;
+    if (item->rank != 2 && item->rank != 0) 
+     {
+       return (0);
+     }
+    head = head->next;
+  }
+  
+  item = t->tree->item;
+
+  if (item->rank == 2) 
+   {
+     correct = (t->nodes == 2 * t->tips -1);
+     if (correct)
+      {
+        errno = PLL_NEWICK_ROOTED_TREE;
+      }
+     else
+      {
+        errno = PLL_NEWICK_BAD_STRUCTURE;
+      }
+     return (PLL_FALSE);
+   }
+   
+  
+  correct = ((t->nodes == 2 * t->tips - 2) && t->nodes != 4);
+  if (correct) return (PLL_TRUE);
+
+  errno = PLL_NEWICK_BAD_STRUCTURE;
+
+  return (1);
+}
+
+
+/** @ingroup newickParseGroup
+    @brief Convert a binary rooted trree to a binary unrooted tree
+
+    Changes the root of the node to have 3 descendants instead of two, deletes its last immediate descendant internal node
+    and takes the two children (of the deleted internal node) as its children.
+
+    @param
+      Newick tree
+    
+    @return
+      \b PLL_TRUE in case of success, otherwise \b PLL_FALSE and \a errno is set
+*/
+int
+pllNewickUnroot (pllNewickTree * t)
+{
+  pllStack * tmp;
+  pllNewickNodeInfo * item;
+
+  item = t->tree->item;
+  if (item->rank == 2)
+   {
+     item->rank = 3;
+     t->nodes--;
+     item = t->tree->next->item;
+     if (item->rank == 0)
+      {
+        tmp = t->tree->next->next;
+        t->tree->next->next = t->tree->next->next->next;
+      }
+     else
+      {
+        tmp = t->tree->next;
+        t->tree->next = t->tree->next->next;
+      }
+     item = tmp->item;
+     free (item->name);
+     free (tmp->item);
+     free (tmp);
+   }
+
+  return (pllValidateNewick (t));
+}
+
+
+/** @ingroup newickParseGroup
+    @brief Parse a newick tree string
+  
+    Parse a newick string and create a stack structure which represents the tree
+    in a preorder traversal form. Each element of the stack represents one node
+    and consists of its name, branch length, number of children and depth. The
+    stack structure is finally wrapped in a \a pllNewickTree structure which
+    also contains the number of nodes and leaves.
+
+    @param newick
+      String containing the newick tree
+
+    @return
+      Returns a pointer to the created \a pllNewickTree structure in case of success, otherwise \b NULL
+*/
+pllNewickTree *
+pllNewickParseString (const char * newick)
+{
+  int n, input, rc;
+  pllNewickTree * t;
+  int nodes, leaves;
+  
+  t = (pllNewickTree *) calloc (1, sizeof (pllNewickTree));
+
+  n = strlen (newick);
+
+  init_lexan (newick, n);
+  input = get_next_symbol();
+
+  rc = parse_newick (&(t->tree), &input);
+  if (!rc)
+   {
+     /* TODO: properly clean t->tree */
+     rax_free (t);
+     t = NULL;
+   }
+  else
+   {
+     assign_ranks (t->tree, &nodes, &leaves);
+     t->nodes = nodes;
+     t->tips  = leaves;
+   }
+
+  return (t);
+}
+
+/** @ingroup newickParseGroup
+    @brief Deallocate newick parser stack structure
+
+    Deallocates the newick parser stack structure that represents the parsed tree. It
+    also frees all memory allocated by elements of the stack structure.
+
+    @param tree
+      The tree stack structure
+*/
+void pllNewickParseDestroy (pllNewickTree ** t)
+{
+  pllNewickNodeInfo *  item;
+
+  while ((item = (pllNewickNodeInfo *)pllStackPop (&((*t)->tree))))
+   {
+     rax_free (item->name);
+     rax_free (item->branch);
+     rax_free (item);
+   }
+  rax_free (*t);
+  (*t) = NULL;
+}
+
+/** @ingroup newickParseGroup
+    @brief Parse a newick tree file
+  
+    Parse a newick file and create a stack structure which represents the tree
+    in a preorder traversal form. Each element of the stack represents one node
+    and consists of its name, branch length, number of children (rank) and depth. The
+    stack structure is finally wrapped in a \a pllNewickTree structure which
+    also contains the number of nodes and leaves.
+
+    @param filename
+      Filename containing the newick tree
+
+    @return
+      Returns a pointer to the created \a pllNewickTree structure in case of success, otherwise \b NULL
+*/
+pllNewickTree *
+pllNewickParseFile (const char * filename)
+{
+  long n;
+  char * rawdata;
+  pllNewickTree * t;
+
+  rawdata = pllReadFile (filename, &n);
+  if (!rawdata)
+   {
+     fprintf (stderr, "Error while opening/reading file %s\n", filename);
+     return (0);
+   }
+
+  //printf ("%s\n\n", rawdata);
+
+  t = pllNewickParseString (rawdata);
+
+  rax_free (rawdata);
+
+  return (t);
+}
+
diff --git a/lib/pll/newick.h b/lib/pll/newick.h
new file mode 100644
index 0000000..8810598
--- /dev/null
+++ b/lib/pll/newick.h
@@ -0,0 +1,61 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file newick.h
+ */
+#ifndef __pll_NEWICK__
+#define __pll_NEWICK__
+#include "stack.h"
+/** @brief Intermediate structure for storing a newick tree 
+    
+    Holds the structure of a parsed newick tree. The number of inner nodes is stored in \a nodes
+*/
+typedef struct
+{
+  int nodes;                    /**< @brief Total number of nodes in the tree == 2*tips - 1 for rooted and 2*tips -2 for unrooted */
+  int tips;                     /**< @brief Number of leaves (tips) in the tree */
+  pllStack * tree;              /**< @brief Parsed tree represented as elements of a stack. Corresponds to placing the postorder traversal of a rooted tree in a pushdown store */
+} pllNewickTree;
+
+
+/** @brief Information describing the parsed newick tree nodes 
+    
+    This structure is placed in the ::pllNewickTree LIFO element pllNewickTree::tree
+    and described each node of the parsed tree.
+
+    @todo Rename this to something more proper
+*/
+typedef struct
+{
+  int depth;                    /**< @brief Distance of node from root */
+  char * name;                  /**< @brief Name of the taxon represented by the node (in case it is a leaf) */
+  char * branch;                /**< @brief Length of branch that leads to its parent */
+  int leaf;                     /**< @brief \b PLL_TRUE if the node is a leaf, otherwise \b PLL_FALSE */
+  int rank;                     /**< @brief Rank of the node, i.e. how many children it has */
+} pllNewickNodeInfo;
+
+
+#endif
diff --git a/lib/pll/newviewGenericSpecial.c b/lib/pll/newviewGenericSpecial.c
new file mode 100644
index 0000000..d9d1147
--- /dev/null
+++ b/lib/pll/newviewGenericSpecial.c
@@ -0,0 +1,8738 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file newviewGenericSpecial.c
+ *  
+ * @brief Functions that deal (mostly) with conditional likelihood (re)computation
+ */
+
+#include "mem_alloc.h"
+
+#ifndef WIN32
+#include <unistd.h>
+#endif
+
+#include <math.h>
+#include <time.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdint.h>
+#include <limits.h>
+#include <assert.h>
+
+#include "pll.h"
+#include "pllInternal.h"
+
+#ifdef __MIC_NATIVE
+#include "mic_native.h"
+#endif
+
+
+#ifdef __SSE3
+#include <stdint.h>
+#include <xmmintrin.h>
+#include <pmmintrin.h>
+#include "cycle.h"
+
+static void computeTraversalInfo(nodeptr, traversalInfo *, int *, int, int, boolean, recompVectors *, boolean);
+static void makeP(double z1, double z2, double *rptr, double *EI,  double *EIGN, int numberOfCategories, double *left, double *right, boolean saveMem, int maxCat, const int states);
+#if (defined(__SSE3) && !defined(__AVX))
+static void newviewGTRGAMMAPROT_LG4(int tipCase,
+                                    double *x1, double *x2, double *x3, double *extEV[4], double *tipVector[4],
+                                    int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                    int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling);
+
+static void newviewGTRGAMMA_GAPPED_SAVE(int tipCase,
+                                        double *x1_start, double *x2_start, double *x3_start,
+                                        double *EV, double *tipVector,
+                                        int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                        const int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling,
+                                        unsigned int *x1_gap, unsigned int *x2_gap, unsigned int *x3_gap, 
+                                        double *x1_gapColumn, double *x2_gapColumn, double *x3_gapColumn);
+
+static void newviewGTRGAMMA(int tipCase,
+                            double *x1_start, double *x2_start, double *x3_start,
+                            double *EV, double *tipVector,
+                            int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                            const int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling
+                            );
+
+static void newviewGTRCAT( int tipCase,  double *EV,  int *cptr,
+                           double *x1_start, double *x2_start,  double *x3_start, double *tipVector,
+                           int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                           int n,  double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling);
+
+
+static void newviewGTRCAT_SAVE( int tipCase,  double *EV,  int *cptr,
+                                double *x1_start, double *x2_start,  double *x3_start, double *tipVector,
+                                int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                int n,  double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling,
+                                unsigned int *x1_gap, unsigned int *x2_gap, unsigned int *x3_gap,
+                                double *x1_gapColumn, double *x2_gapColumn, double *x3_gapColumn, const int maxCats);
+
+static void newviewGTRGAMMAPROT_GAPPED_SAVE(int tipCase,
+                                            double *x1, double *x2, double *x3, double *extEV, double *tipVector,
+                                            int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                            int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling,
+                                            unsigned int *x1_gap, unsigned int *x2_gap, unsigned int *x3_gap,  
+                                            double *x1_gapColumn, double *x2_gapColumn, double *x3_gapColumn
+                                            );
+
+static void newviewGTRGAMMAPROT(int tipCase,
+                                double *x1, double *x2, double *x3, double *extEV, double *tipVector,
+                                int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling);
+
+static void newviewGTRCATPROT(int tipCase, double *extEV,
+                              int *cptr,
+                              double *x1, double *x2, double *x3, double *tipVector,
+                              int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                              int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling);
+
+static void newviewGTRCATPROT_SAVE(int tipCase, double *extEV,
+                                   int *cptr,
+                                   double *x1, double *x2, double *x3, double *tipVector,
+                                   int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                   int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling,
+                                   unsigned int *x1_gap, unsigned int *x2_gap, unsigned int *x3_gap,
+                                   double *x1_gapColumn, double *x2_gapColumn, double *x3_gapColumn, const int maxCats);
+
+#endif
+#if (defined(__AVX) || defined(__SSE3))
+static void newviewGTRCAT_BINARY( int tipCase,  double *EV,  int *cptr,
+                                  double *x1_start,  double *x2_start,  double *x3_start,  double *tipVector,
+                                  int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                  int n,  double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling);
+static void newviewGTRGAMMA_BINARY(int tipCase,
+                                   double *x1_start, double *x2_start, double *x3_start,
+                                   double *EV, double *tipVector,
+                                   int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                   const int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling);
+#endif
+
+/* required to compute the absolute values of double precision numbers with SSE3 */
+
+const union __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)))
+{
+  uint64_t i[2];
+  __m128d m;
+} absMask = {{0x7fffffffffffffffULL , 0x7fffffffffffffffULL }};
+
+
+
+#endif
+
+static int pllGetTransitionMatrixNormal (pllInstance * tr, partitionList * pr, nodeptr p, int model, int rate, double * outBuffer);
+static int pllGetTransitionMatrixLG4 (partitionList * pr, nodeptr p, int model, double * outBuffer);
+
+extern const char binaryStateNames[2];  /**< @brief Alphabet of binary states */
+extern const char dnaStateNames[4];     /**< @brief DNA alphabet  */
+extern const char protStateNames[20];   /**< @brief Amino-acid alphabet */
+extern const unsigned int mask32[32];   /**< @brief Contains the first 32 powers of 2, i.e. 2^0 upto 2^31 */
+     
+static void ascertainmentBiasSequence(unsigned char tip[32], int numStates)
+{ 
+  assert(numStates <= 32 && numStates > 1);
+
+  switch(numStates)
+    {
+    case 2:     
+      tip[0] = 1;
+      tip[1] = 2;
+      break;
+    case 4:
+      tip[0] = 1;
+      tip[1] = 2;
+      tip[2] = 4;
+      tip[3] = 8;
+      break;
+    default:
+      {
+	int 
+	  i;
+	for(i = 0; i < numStates; i++)
+	  {
+	    tip[i] = i;
+	    //printf("%c ", inverseMeaningPROT[i]);
+	  }
+	//printf("\n");
+      }
+      break;
+    }
+}
+
+static void newviewAscCat(int tipCase,
+			  double *x1, double *x2, double *x3, double *extEV, double *tipVector,
+			  int *ex3, 
+			  const int n, double *left, double *right, 			    
+			  const int numStates)
+{
+  double
+    *le, *ri, *v, *vl, *vr,
+    ump_x1, ump_x2, x1px2;
+     
+  int 
+    i, l, j, scale;
+
+     
+  unsigned char 
+    tip[32];
+     
+  ascertainmentBiasSequence(tip, numStates);
+
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:
+      {
+	for (i = 0; i < n; i++)
+	  {
+	    le = &left[0];
+	    ri = &right[0];
+
+	    vl = &(tipVector[numStates * tip[i]]);
+	    vr = &(tipVector[numStates * tip[i]]);
+	    v  = &x3[numStates * i];
+
+	    for(l = 0; l < numStates; l++)
+	      v[l] = 0.0;
+
+	    for(l = 0; l < numStates; l++)
+	      {
+		ump_x1 = 0.0;
+		ump_x2 = 0.0;
+
+		for(j = 0; j < numStates; j++)
+		  {
+		    ump_x1 += vl[j] * le[l * numStates + j];
+		    ump_x2 += vr[j] * ri[l * numStates + j];
+		  }
+
+		x1px2 = ump_x1 * ump_x2;
+
+		for(j = 0; j < numStates; j++)
+		  v[j] += x1px2 * extEV[l * numStates + j];
+	      }	    
+	  }
+  }
+      break;
+    case PLL_TIP_INNER:
+      {
+	for (i = 0; i < n; i++)
+	  {
+	    le = &left[0];
+	    ri = &right[0];
+
+	    vl = &(tipVector[numStates * tip[i]]);
+	    vr = &x2[numStates * i];
+	    v  = &x3[numStates * i];
+
+	    for(l = 0; l < numStates; l++)
+	      v[l] = 0.0;
+
+	    for(l = 0; l < numStates; l++)
+  {
+		ump_x1 = 0.0;
+		ump_x2 = 0.0;
+
+		for(j = 0; j < numStates; j++)
+    {
+		    ump_x1 += vl[j] * le[l * numStates + j];
+		    ump_x2 += vr[j] * ri[l * numStates + j];
+    }
+
+		x1px2 = ump_x1 * ump_x2;
+
+		for(j = 0; j < numStates; j++)
+		  v[j] += x1px2 * extEV[l * numStates + j];
+	      }
+
+	    scale = 1;
+	    for(l = 0; scale && (l < numStates); l++)
+	      scale = ((v[l] < PLL_MINLIKELIHOOD) && (v[l] > PLL_MINUSMINLIKELIHOOD));	    
+
+	    if(scale)
+      {
+		for(l = 0; l < numStates; l++)
+		  v[l] *= PLL_TWOTOTHE256;
+			
+		ex3[i]  += 1;	      
+      }
+    }
+  }
+      break;
+    case PLL_INNER_INNER:
+      for(i = 0; i < n; i++)
+	{
+	  le = &left[0];
+	  ri = &right[0];
+
+	  vl = &x1[numStates * i];
+	  vr = &x2[numStates * i];
+	  v = &x3[numStates * i];
+
+	  for(l = 0; l < numStates; l++)
+	    v[l] = 0.0;
+
+	  for(l = 0; l < numStates; l++)
+  {
+	      ump_x1 = 0.0;
+	      ump_x2 = 0.0;
+
+	      for(j = 0; j < numStates; j++)
+    {
+		  ump_x1 += vl[j] * le[l * numStates + j];
+		  ump_x2 += vr[j] * ri[l * numStates + j];
+    }
+
+	      x1px2 =  ump_x1 * ump_x2;
+
+	      for(j = 0; j < numStates; j++)
+		v[j] += x1px2 * extEV[l * numStates + j];
+  }
+
+	   scale = 1;
+	   for(l = 0; scale && (l < numStates); l++)
+	     scale = ((v[l] < PLL_MINLIKELIHOOD) && (v[l] > PLL_MINUSMINLIKELIHOOD));
+
+	   if(scale)
+	     {
+	       for(l = 0; l < numStates; l++)
+		 v[l] *= PLL_TWOTOTHE256;
+
+	       ex3[i]  += 1;	     
+	     }
+	}
+      break;
+    default:
+      assert(0);
+    }
+
+}
+
+static void newviewAscGamma(int tipCase,
+			    double *x1, double *x2, double *x3, double *extEV, double *tipVector,
+			    int *ex3, 
+			    const int n, double *left, double *right, 			    
+			    const int numStates)
+{
+  
+  int
+    i, j, l, k, scale;
+  
+  const int 
+    statesSquare = numStates * numStates,
+    gammaStates = 4 * numStates;
+
+  double
+    *vl, *vr, al, ar, *v, x1px2;
+
+  unsigned char 
+    tip[32];
+
+  ascertainmentBiasSequence(tip, numStates);
+  
+  switch(tipCase)
+   {
+    case PLL_TIP_TIP:
+      {
+	for(i = 0; i < n; i++)
+      {
+	    for(k = 0; k < 4; k++)
+         {
+		vl = &(tipVector[numStates * tip[i]]);
+		vr = &(tipVector[numStates * tip[i]]);
+		v =  &(x3[gammaStates * i + numStates * k]);
+
+		for(l = 0; l < numStates; l++)
+		  v[l] = 0;
+
+		for(l = 0; l < numStates; l++)
+   {
+		    al = 0.0;
+		    ar = 0.0;
+		    for(j = 0; j < numStates; j++)
+		      {
+			al += vl[j] * left[k * statesSquare + l * numStates + j];
+			ar += vr[j] * right[k * statesSquare + l * numStates + j];
+		      }
+
+		    x1px2 = al * ar;
+		    for(j = 0; j < numStates; j++)
+		      v[j] += x1px2 * extEV[numStates * l + j];
+		  }
+	      }	    
+   }
+      }
+      break;
+    case PLL_TIP_INNER:
+      {
+	for (i = 0; i < n; i++)
+	  {
+	    for(k = 0; k < 4; k++)
+	      {
+		vl = &(tipVector[numStates * tip[i]]);
+		vr = &(x2[gammaStates * i + numStates * k]);
+		v =  &(x3[gammaStates * i + numStates * k]);
+
+		for(l = 0; l < numStates; l++)
+		  v[l] = 0;
+
+		for(l = 0; l < numStates; l++)
+		  {
+		    al = 0.0;
+		    ar = 0.0;
+		    for(j = 0; j < numStates; j++)
+		      {
+			al += vl[j] * left[k * statesSquare + l * numStates + j];
+			ar += vr[j] * right[k * statesSquare + l * numStates + j];
+         }
+
+		    x1px2 = al * ar;
+		    for(j = 0; j < numStates; j++)
+		      v[j] += x1px2 * extEV[numStates * l + j];
+      }
+   }
+
+	    v = &x3[gammaStates * i];
+	    scale = 1;
+	    for(l = 0; scale && (l < gammaStates); l++)
+	      scale = (PLL_ABS(v[l]) < PLL_MINLIKELIHOOD);
+
+	    if(scale)
+	      {		
+		for(l = 0; l < gammaStates; l++)
+		  v[l] *= PLL_TWOTOTHE256;
+		
+		ex3[i]  += 1;	      
+	      }
+	  }
+      }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+       {
+	 for(k = 0; k < 4; k++)
+	   {
+	     vl = &(x1[gammaStates * i + numStates * k]);
+	     vr = &(x2[gammaStates * i + numStates * k]);
+	     v =  &(x3[gammaStates * i + numStates * k]);
+
+	     for(l = 0; l < numStates; l++)
+	       v[l] = 0;
+
+	     for(l = 0; l < numStates; l++)
+	       {
+		 al = 0.0;
+		 ar = 0.0;
+		 for(j = 0; j < numStates; j++)
+		   {
+		     al += vl[j] * left[k * statesSquare + l * numStates + j];
+		     ar += vr[j] * right[k * statesSquare + l * numStates + j];
+		   }
+
+		 x1px2 = al * ar;
+		 for(j = 0; j < numStates; j++)
+		   v[j] += x1px2 * extEV[numStates * l + j];
+	       }
+	   }
+	 
+	 v = &(x3[gammaStates * i]);
+	 scale = 1;
+	 for(l = 0; scale && (l < gammaStates); l++)
+	   scale = ((PLL_ABS(v[l]) <  PLL_MINLIKELIHOOD));
+
+	 if(scale)
+	   {	    
+	     for(l = 0; l < gammaStates; l++)
+	       v[l] *= PLL_TWOTOTHE256;
+	     
+	     ex3[i]  += 1;	    
+	   }
+       }
+      break;
+    default:
+      assert(0);
+    }  
+}
+
+
+/* generic function for computing the P matrices, for computing the conditional likelihood at a node p, given child nodes q and r 
+   we compute P(z1) and P(z2) here */
+
+/** @brief Computes two P matrices for two edges.
+
+    Generic function for computing the P matrices of two nodes based on their edges. This is used to 
+    (later) compute the the conditional likelihood at a node p which has two descendants \a q and \r, 
+    which in turn have the edges \a z1 and \a z2 that connect them with \a p. Given those edges, we
+    compute two P matrices \a P(z1) and \a P(z2) which are stored in the arrays \a left and \a right.
+ 
+    The following value is computed here: 
+    \f[
+     EI\cdot exp( EIGN \cdot z)
+     \f]
+     to fill up the P matrix.
+     
+    @param z1    Branch length leading to left descendant node (let's call it \a q)
+    @param z2    Branch length leading to right descendant node (let's call it \a r)
+    @param rptr  Array of values for rate categories
+    @param EI    Inverse eigenvectors of Q-matrix
+    @param EIGN  Eigenvalues of Q-matrix
+    @param numberOfCategories How many rate heterogeneity categories we have, depending on GAMMA and CAT
+    @param left  Where to store the left P matrix (for node \a q)
+    @param right Where to store the right P matrix (for node \a r)
+    @param saveMem If set to \b PLL_TRUE, memory saving technique is enabled
+    @param maxCat Maximum number of rate categories
+    @param states Number of states for the particular data (4 for DNA or 20 for AA)
+*/
+static void  makeP(double z1, 
+                   double z2, 
+                   double *rptr, 
+                   double *EI,  
+                   double *EIGN, 
+                   int numberOfCategories, 
+                   double *left, 
+                   double *right, 
+                   boolean saveMem, 
+                   int maxCat, 
+                   const int states)
+{
+  int  i, j, k, statesSquare = states * states;
+
+  /* assign some space for pre-computing and later re-using functions */
+
+  double 
+    *lz1 = (double*)rax_malloc(sizeof(double) * states),
+    *lz2 = (double*)rax_malloc(sizeof(double) * states),
+    *d1 = (double*)rax_malloc(sizeof(double) * states),
+    *d2 = (double*)rax_malloc(sizeof(double) * states);
+
+  /* multiply branch lengths with eigenvalues */
+
+  for(i = 1; i < states; i++)
+  {
+    lz1[i] = EIGN[i] * z1;
+    lz2[i] = EIGN[i] * z2;
+  }
+
+
+  /* loop over the number of rate categories, this will be 4 for the GAMMA model and 
+     variable for the CAT model */
+
+  for(i = 0; i < numberOfCategories; i++)
+  {
+    /* exponentiate the rate multiplied by the branch */
+
+    for(j = 1; j < states; j++)
+    {
+      d1[j] = exp(rptr[i] * lz1[j]);
+      d2[j] = exp(rptr[i] * lz2[j]);
+
+    }
+
+    /* now fill the P matrices for the two branch length values */
+
+    for(j = 0; j < states; j++)
+    {
+      /* left and right are pre-allocated arrays */
+
+      left[statesSquare * i  + states * j] = 1.0;
+      right[statesSquare * i + states * j] = 1.0;         
+
+      for(k = 1; k < states; k++)
+      {
+        left[statesSquare * i + states * j + k]  = d1[k] * EI[states * j + k];
+        right[statesSquare * i + states * j + k] = d2[k] * EI[states * j + k];
+      }
+    }
+  }
+
+
+  /* if memory saving is enabled and we are using CAT we need to do one additional P matrix 
+     calculation for a rate of 1.0 to compute the entries of a column/tree site comprising only gaps */
+
+
+  if(saveMem)
+  {
+    i = maxCat;
+
+    for(j = 1; j < states; j++)
+    {
+      d1[j] = exp (lz1[j]);
+      d2[j] = exp (lz2[j]);
+    }
+
+    for(j = 0; j < states; j++)
+    {
+      left[statesSquare * i  + states * j] = 1.0;
+      right[statesSquare * i + states * j] = 1.0;
+
+      for(k = 1; k < states; k++)
+      {
+        left[statesSquare * i + states * j + k]  = d1[k] * EI[states * j + k];
+        right[statesSquare * i + states * j + k] = d2[k] * EI[states * j + k];
+      }
+    }
+  }
+
+  /* free the temporary buffers */
+
+  rax_free(lz1);
+  rax_free(lz2);
+  rax_free(d1);
+  rax_free(d2);
+}
+
+
+/** Compute the transition probability matrix for a given branch
+
+    Computes the transition probability matrix for the branch \a p->z and partition \a model given the
+    PLL instance \a tr and list of partitions \a pr. The result is stored in \a outBuffer which must
+    be of sufficient size, i.e states * states * (numberOfRateCategories + 1) * sizeof(double);
+
+    @param tr  PLL instance
+    @param pr  List of partitions
+    @param model  Partition index for which to take the branch length
+    @param p  Adjacent node to the edge we want to compute the trans. prob. matrix
+    @param outBuffer Output buffer where to store the transition probability matrix
+
+*/
+int pllGetTransitionMatrix (pllInstance * tr, partitionList * pr, nodeptr p, int model, int rate, double * outBuffer)
+{
+  if (tr->rateHetModel == PLL_CAT)
+   {
+     if (rate >= pr->partitionData[model]->numberOfCategories) return (PLL_FALSE);
+   }
+  else
+   {
+     if (rate >= 4) return (PLL_FALSE);
+   }
+
+  if (pr->partitionData[model]->dataType == PLL_AA_DATA && pr->partitionData[model]->protModels == PLL_LG4)
+    return (pllGetTransitionMatrixLG4 (pr, p, model, outBuffer));
+    
+    
+  return (pllGetTransitionMatrixNormal (tr, pr, p, model, rate, outBuffer));
+}
+
+
+/* TODO: Fix this function according to pllGetTransitionMatrixNormal */
+static int pllGetTransitionMatrixLG4 (partitionList * pr, nodeptr p, int model, double * outBuffer)
+{
+  int
+    i, j, k,
+    states = pr->partitionData[model]->states,
+    numberOfCategories = 4;
+  double
+    d[64],
+    *  rptr = pr->partitionData[model]->gammaRates,
+    ** EI   = pr->partitionData[model]->EI_LG4,
+    ** EIGN = pr->partitionData[model]->EIGN_LG4;
+
+  assert (states == 20);
+
+  for (i = 0; i < numberOfCategories; ++i)
+   {
+     for (j = 1; j < states; ++j)
+      {
+        d[j] = exp(rptr[i] * EIGN[i][j] * p->z[model]);
+      }
+     for (j = 0; j < states; ++ j)
+      {
+        outBuffer[states * states * i + states * j] = 1.0;
+        for (k = 1; k < states; ++k) 
+         {
+           outBuffer[states * states * i + states * j + k] = d[k] * EI[i][states * j + k];
+         }
+      }
+   }
+  return (PLL_TRUE);
+}
+
+static int pllGetTransitionMatrixNormal (pllInstance * tr, partitionList * pr, nodeptr p, int model, int rate, double * outBuffer)
+{
+  int 
+    i, j, k,
+    /* numberOfCategories, */
+    states = pr->partitionData[model]->states;
+  double
+    * d = (double *)rax_malloc(sizeof(double) * states),
+    * rptr,
+    * EI   = pr->partitionData[model]->EI,
+    * EIGN = pr->partitionData[model]->EIGN,
+    * EV = pr->partitionData[model]->EV;
+  
+  double lz = (p->z[model] > PLL_ZMIN) ? log(p->z[model]) : log(PLL_ZMIN);                        
+
+  if (tr->rateHetModel == PLL_CAT)
+   {
+     rptr               = pr->partitionData[model]->perSiteRates;
+     /* numberOfCategories = pr->partitionData[model]->numberOfCategories; */
+   }
+  else
+   {
+     rptr               = pr->partitionData[model]->gammaRates;
+     /* numberOfCategories = 4; */
+   }
+
+  for (i = 0; i < states * states; ++ i) outBuffer[i] = 0;
+
+  d[0] = 1.0;
+  for (j = 1; j < states; ++ j)
+   {
+     d[j] = exp(rptr[rate] * EIGN[j] * lz);
+   }
+
+  for (i = 0; i < states; ++ i)
+   {
+     for (j = 0; j < states; ++ j)
+      {
+        for (k = 0; k < states; ++ k)
+         {
+           outBuffer[states * i + j] += (d[k] * EI[states * i + k] * EV[states * j + k]);
+         }
+      }
+   }
+
+  assert (!tr->saveMemory);
+  // TODO: Fix the following snippet
+  //if (tr->saveMemory)
+  // {
+  //   i = tr->maxCategories;
+  //   
+  //   for (j = 1; j < states; ++j)
+  //    {
+  //      d[j] = EXP(EIGN[j] * p->z[model]);
+  //    }
+
+  //   for (j = 0; j < states; ++j)
+  //    {
+  //      outBuffer[states * states * i + states * j] = 1.0;
+  //      for (k = 1; k < states; ++k)
+  //       {
+  //         outBuffer[states * states * i + states * j + k] = d[k] * EI[states * j + k];
+  //       }
+  //    }
+  // }
+
+  rax_free(d);
+
+  return (PLL_TRUE);
+}
+
+
+/** @brief Compute two P matrices for two edges for the LG4 model
+    
+    Computing the P matrices of two nodes based on their edges for the LG4 model. This is used to 
+    (later) compute the the conditional likelihood at a node p which has two descendants \a q and \r, 
+    which in turn have the edges \a z1 and \a z2 that connect them with \a p. Given those edges, we
+    compute two P matrices \a P(z1) and \a P(z2) which are stored in the arrays \a left and \a right.
+
+    @param z1
+      Branch length leading to left descendant node (let's call it \a q)
+     
+    @param z2
+      Branch length leading to right descendant node (let's call it \a r)
+
+    @param rptr
+      Array of values for rate categories
+
+    @param EI
+      Inverse eigenvectors of 4 Q-matrices
+     
+    @param EIGN
+      Eigenvalues of 4 Q-matrix
+
+    @param numberOfCategories
+      How many rate heterogeneity categories we have, depending on GAMMA and CAT
+     
+    @param left
+      Where to store the left P matrix (for node \a q)
+     
+    @param right
+      Where to store the right P matrix (for node \a r)
+
+    @param numStates
+      Number of states for the particular data (4 for DNA or 20 for AA)
+
+    @todo
+      Present the maths here as in ::makeP
+
+*/
+static void makeP_FlexLG4(double z1, double z2, double *rptr, double *EI[4],  double *EIGN[4], int numberOfCategories, double *left, double *right, const int numStates)
+{
+  int 
+    i,
+    j,
+    k;
+  
+  const int
+    statesSquare = numStates * numStates;
+
+  double    
+    d1[64],  
+    d2[64];
+
+  assert(numStates <= 64);
+       
+  for(i = 0; i < numberOfCategories; i++)
+    {
+      for(j = 1; j < numStates; j++)
+        {
+          d1[j] = exp (rptr[i] * EIGN[i][j] * z1);
+          d2[j] = exp (rptr[i] * EIGN[i][j] * z2);
+        }
+
+      for(j = 0; j < numStates; j++)
+        {
+          left[statesSquare * i  + numStates * j] = 1.0;
+          right[statesSquare * i + numStates * j] = 1.0;
+
+          for(k = 1; k < numStates; k++)
+            {
+              left[statesSquare * i + numStates * j + k]  = d1[k] * EI[i][numStates * j + k];
+              right[statesSquare * i + numStates * j + k] = d2[k] * EI[i][numStates * j + k];
+            }
+        }
+    }  
+}
+
+#if (!defined(__AVX) && !defined(__SSE3))
+
+/** @brief Computation of conditional likelihood arrays for CAT
+ 
+    This is a generic, slow but readable function implementation for computing the 
+     conditional likelihood arrays at p, given child nodes q and r using the CAT
+     mode of rate heterogeneity. Depending whether \a q, resp. \r, are tips or internal
+     nodes (indicated by \a tipCase) the conditional likelihoods are computed based on
+     \a x1 if \a q is an inner node or \a tipX1 if it is a tip, resp. \a x2 if \a r
+     is an inner node or \a tipX2 if it is a tip. Output array \a ex3 stores the
+     number of times the likelihood of each site for each internal node has been scaled.
+     The conditional likelihood vectors for any possible base-pair (which is useful when
+     \a q or \a r are tips) has been already precomputed from the eigenvalues of the Q
+     matrix in the array \a tipVector. In case the conditional likelihood for a particular
+     site is very small in terms of a floating point number, then it is multiplied by a
+     very large number (scaling), and then number of times it has been scaled (per node) is
+     stored in the array \a ex3, if \a fastScaling is set to \b PLL_FALSE. Otherwise, the
+     total number of scalings for all sites and all nodes is stored in a single variable
+     \a scalerIncrement.
+
+    @param tipCase
+      Can be either \b PLL_TIP_TIP, or \b PLL_TIP_INNER or \b PLL_INNER_INNER, and describes the
+      descendants of the node for which we currently compute the condition likelihood
+      vector, i.e. whether they are both tips (leaves), or one is tip and the other
+      an inner node, or both are inner nodes.
+
+    @param extEV
+      Eigenvectors of Q matrix
+      
+    @param cptr
+      Array where the rate for each site in the compressed partition alignment is stored
+
+    @param x1
+      Conditional likelihood vectors of the first child node, in case it is an internal node
+
+    @param x2
+      Conditional likelihood vectors of the second child node, in case it is an internal node
+
+    @param x3
+      Pointer to where the computed conditional likelihood vector of node \a p will be stored
+
+    @param tipVector
+      Vector contining sums of left eigenvectors for likelihood computation at tips.
+
+    @param ex3
+      Pointer to an array of whose elements correspond to the number of times the likelihood of
+      a particular site of a particular internal nodeis scaled. Those elements are incremented
+      at every scaling operation and only if \a fastScaling flag is set to \b PLL_FALSE. This 
+      array will be used later when evaluating the likelihood of the whole tree.
+
+    @param tipX1
+      Pointer to the alignment data (sequence) of first child node, in case it is a tip
+
+    @param tipX2
+      Pointer to the alignment data (sequence) of second child node, in case it is a tip
+
+    @param n
+      Number of sites for which we are doing the evaluation. For the single-thread version this is the number of sites in the
+      current partition, for multi-threads this is the number of sites assigned to the running thread from the current partition.
+
+    @param left
+      Pointer to the P matrix of the left child
+
+    @param right
+      Pointer to the P matrix of the right child
+
+    @param wgt
+      Array of weights for each site
+
+    @param scalerIncrement
+      Where to store the number of scalings carried out in case \a fastScaling is set to \b PLL_TRUE.
+
+    @param fastScaling
+      If set to \b PLL_TRUE, only the total number of scalings for all sites of the partition will be
+      stored in \a scalerIncrement, otherwise per-site scalings are stored in the array \a ex3. 
+
+    @param states
+      Number of states for the particular data (4 for DNA or 20 for AA)
+ */
+static void newviewCAT_FLEX(int tipCase, double *extEV,
+                            int *cptr,
+                            double *x1, double *x2, double *x3, double *tipVector,
+                            int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                            int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling, const int states)
+{
+  double
+    *le, 
+    *ri, 
+    *v, 
+    *vl, 
+    *vr,
+    ump_x1, 
+    ump_x2, 
+    x1px2;
+
+  int 
+    i, 
+    l, 
+    j, 
+    scale, 
+    addScale = 0;
+
+  const int 
+    statesSquare = states * states;
+
+
+  /* here we switch over the different cases for efficiency, but also because 
+     each case accesses different data types.
+
+     We consider three cases: either q and r are both tips, q or r are tips, and q and r are inner 
+     nodes.
+     */
+
+
+  switch(tipCase)
+  {
+
+    /* both child nodes of p weher we want to update the conditional likelihood are tips */
+    case PLL_TIP_TIP:     
+      /* loop over sites */
+      for (i = 0; i < n; i++)
+      {
+        /* set a pointer to the P-Matrices for the rate category of this site */
+        le = &left[cptr[i] * statesSquare];
+        ri = &right[cptr[i] * statesSquare];
+
+        /* pointers to the likelihood entries of the tips q (vl) and r (vr) 
+           We will do reading accesses to these values only.
+           */
+        vl = &(tipVector[states * tipX1[i]]);
+        vr = &(tipVector[states * tipX2[i]]);
+
+        /* address of the conditional likelihood array entres at site i. This is 
+           a writing access to v */
+        v  = &x3[states * i];
+
+        /* initialize v */
+        for(l = 0; l < states; l++)
+          v[l] = 0.0;
+
+        /* loop over states to compute the cond likelihoods at p (v) */
+
+        for(l = 0; l < states; l++)
+        {             
+          ump_x1 = 0.0;
+          ump_x2 = 0.0;
+
+          /* le and ri are the P-matrices */
+
+          for(j = 0; j < states; j++)
+          {
+            ump_x1 += vl[j] * le[l * states + j];
+            ump_x2 += vr[j] * ri[l * states + j];
+          }
+
+          x1px2 = ump_x1 * ump_x2;
+
+          /* multiply with matrix of eigenvectors extEV */
+
+          for(j = 0; j < states; j++)
+            v[j] += x1px2 * extEV[l * states + j];
+        }          
+      }    
+      break;
+    case PLL_TIP_INNER:      
+
+      /* same as above, only that now vl is a tip and vr is the conditional probability vector 
+         at an inner node. Note that, if we have the case that either q or r is a tip, the 
+         nodes will be flipped to ensure that tipX1 always points to the sequence at the tip.
+         */
+
+      for (i = 0; i < n; i++)
+      {
+        le = &left[cptr[i] * statesSquare];
+        ri = &right[cptr[i] * statesSquare];
+
+        /* access tip vector lookup table */
+        vl = &(tipVector[states * tipX1[i]]);
+
+        /* access conditional likelihoo arrays */
+        /* again, vl and vr are reading accesses, while v is a writing access */
+        vr = &x2[states * i];
+        v  = &x3[states * i];
+
+        /* same as in the loop above */
+
+        for(l = 0; l < states; l++)
+          v[l] = 0.0;
+
+        for(l = 0; l < states; l++)
+        {
+          ump_x1 = 0.0;
+          ump_x2 = 0.0;
+
+          for(j = 0; j < states; j++)
+          {
+            ump_x1 += vl[j] * le[l * states + j];
+            ump_x2 += vr[j] * ri[l * states + j];
+          }
+
+          x1px2 = ump_x1 * ump_x2;
+
+          for(j = 0; j < states; j++)
+            v[j] += x1px2 * extEV[l * states + j];
+        }
+
+        /* now let's check for numerical scaling. 
+           The maths in RAxML are a bit non-standard to avoid/economize on arithmetic operations 
+           at the virtual root and for branch length optimization and hence values stored 
+           in the conditional likelihood vectors can become negative.
+           Below we check if all absolute values stored at position i of v are smaller 
+           than a pre-defined value in pll.h. If they are all smaller we can then safely 
+           multiply them by a large, constant number PLL_TWOTOTHE256 (without numerical overflow) 
+           that is also speced in pll.h */
+
+        scale = 1;
+        for(l = 0; scale && (l < states); l++)
+          scale = ((v[l] < PLL_MINLIKELIHOOD) && (v[l] > PLL_MINUSMINLIKELIHOOD));         
+
+        if(scale)
+        {
+          for(l = 0; l < states; l++)
+            v[l] *= PLL_TWOTOTHE256;
+
+          /* if we have scaled the entries to prevent underflow, we need to keep track of how many scaling 
+             multiplications we did per node such as to undo them at the virtual root, e.g., in 
+             evaluateGeneric() 
+             Note here, that, if we scaled the site we need to increment the scaling counter by the wieght, i.e., 
+             the number of sites this potentially compressed pattern represents ! */ 
+
+          if(!fastScaling)
+            ex3[i] += 1;
+          else
+            addScale += wgt[i];   
+          
+        }
+      }   
+      break;
+    case PLL_INNER_INNER:
+
+      /* same as above, only that the two child nodes q and r are now inner nodes */
+
+      for(i = 0; i < n; i++)
+      {
+        le = &left[cptr[i] * statesSquare];
+        ri = &right[cptr[i] * statesSquare];
+
+        /* index conditional likelihood vectors of inner nodes */
+
+        vl = &x1[states * i];
+        vr = &x2[states * i];
+        v = &x3[states * i];
+
+        for(l = 0; l < states; l++)
+          v[l] = 0.0;
+
+        for(l = 0; l < states; l++)
+        {
+          ump_x1 = 0.0;
+          ump_x2 = 0.0;
+
+          for(j = 0; j < states; j++)
+          {
+            ump_x1 += vl[j] * le[l * states + j];
+            ump_x2 += vr[j] * ri[l * states + j];
+          }
+
+          x1px2 =  ump_x1 * ump_x2;
+
+          for(j = 0; j < states; j++)
+            v[j] += x1px2 * extEV[l * states + j];            
+        }
+
+        scale = 1;
+        for(l = 0; scale && (l < states); l++)
+          scale = ((v[l] < PLL_MINLIKELIHOOD) && (v[l] > PLL_MINUSMINLIKELIHOOD));
+
+        if(scale)
+        {
+          for(l = 0; l < states; l++)
+            v[l] *= PLL_TWOTOTHE256;
+          
+          if(!fastScaling)
+            ex3[i] += 1;
+          else
+            addScale += wgt[i];    
+        }
+      }
+      break;
+    default:
+      assert(0);
+  }
+
+  /* increment the scaling counter by the additional scalings done at node p */
+
+  if(fastScaling)
+    *scalerIncrement = addScale;
+}
+
+/** @brief Computation of conditional likelihood arrays for \b GAMMA
+ 
+    This is a generic, slow but readable function implementation for computing the 
+     conditional likelihood arrays at \a p, given child nodes \a q and \a r using the \b GAMMA
+     model of rate heterogeneity. Depending whether \a q, resp. \r, are tips or internal
+     nodes (indicated by \a tipCase) the conditional likelihoods are computed based on
+     \a x1 if \a q is an inner node or \a tipX1 if it is a tip, resp. \a x2 if \a r
+     is an inner node or \a tipX2 if it is a tip. Output array \a ex3 stores the
+     number of times the likelihood of each site for each internal node has been scaled.
+     The conditional likelihood vectors for any possible base-pair (which is useful when
+     \a q or \a r are tips) has been already precomputed from the eigenvalues of the Q
+     matrix in the array \a tipVector. In case the conditional likelihood for a particular
+     site is very small in terms of a floating point number, then it is multiplied by a
+     very large number (scaling), and then number of times it has been scaled (per node) is
+     stored in the array \a ex3, if \a fastScaling is set to \b PLL_FALSE. Otherwise, the
+     total number of scalings for all sites and all nodes is stored in a single variable
+     \a scalerIncrement.
+
+    @param tipCase
+      Can be either \b PLL_TIP_TIP, or \b PLL_TIP_INNER or \b PLL_INNER_INNER, and describes the
+      descendants of the node for which we currently compute the condition likelihood
+      vector, i.e. whether they are both tips (leaves), or one is tip and the other
+      an inner node, or both are inner nodes.
+
+    @param x1
+      Conditional likelihood vectors of the first child node, in case it is an internal node
+
+    @param x2
+      Conditional likelihood vectors of the second child node, in case it is an internal node
+
+    @param x3
+      Pointer to where the computed conditional likelihood vector of node \a p will be stored
+
+    @param extEV
+      Eigenvectors of Q matrix
+
+    @param tipVector
+      Vector contining sums of left eigenvectors for likelihood computation at tips.
+
+    @param ex3
+      Pointer to an array of whose elements correspond to the number of times the likelihood of
+      a particular site of a particular internal nodeis scaled. Those elements are incremented
+      at every scaling operation and only if \a fastScaling flag is set to \b PLL_FALSE. This 
+      array will be used later when evaluating the likelihood of the whole tree.
+
+    @param tipX1
+      Pointer to the alignment data (sequence) of first child node, in case it is a tip
+
+    @param tipX2
+      Pointer to the alignment data (sequence) of second child node, in case it is a tip
+
+    @param n
+      Number of sites to be processed
+
+    @param left
+      Pointer to the P matrix of the left child
+
+    @param right
+      Pointer to the P matrix of the right child
+
+    @param wgt
+      Array of weights for each site
+
+    @param scalerIncrement
+      Where to store the number of scalings carried out in case \a fastScaling is set to \b PLL_TRUE.
+
+    @param fastScaling
+      If set to \b PLL_TRUE, only the total number of scalings for all sites of the partition will be
+      stored in \a scalerIncrement, otherwise per-site scalings are stored in the array \a ex3. 
+
+    @param states
+      Number of states for the particular data (4 for DNA or 20 for AA)
+
+    @param maxStateValue
+      Number of all possible base-pairs including degenerate characters, i.e. 16 for  DNA and 23 for AA
+ */
+static void newviewGAMMA_FLEX(int tipCase,
+                              double *x1, double *x2, double *x3, double *extEV, double *tipVector,
+                              int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                              int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling, const int states, const int maxStateValue)
+{
+  double  
+    *uX1, 
+    *uX2, 
+    *v, 
+    x1px2, 
+    *vl, 
+    *vr, 
+    al, 
+    ar;
+
+  int  
+    i, 
+    j, 
+    l, 
+    k, 
+    scale, 
+    addScale = 0;
+
+  const int     
+    statesSquare = states * states,
+                 span = states * 4,
+                 /* this is required for doing some pre-computations that help to save 
+                    numerical operations. What we are actually computing here are additional lookup tables 
+                    for each possible state a certain data-type can assume.
+                    for DNA with ambuguity coding this is 15, for proteins this is 22 or 23, since there 
+                    also exist one or two amibguity codes for protein data.
+                    Essentially this is very similar to the tip vectors which we also use as lookup tables */
+                 precomputeLength = maxStateValue * span;
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      {
+        /* allocate pre-compute memory space */
+
+        double 
+          *umpX1 = (double*)rax_malloc(sizeof(double) * precomputeLength),
+          *umpX2 = (double*)rax_malloc(sizeof(double) * precomputeLength);
+
+        /* multiply all possible tip state vectors with the respective P-matrices 
+        */
+
+        for(i = 0; i < maxStateValue; i++)
+        {
+          v = &(tipVector[states * i]);
+
+          for(k = 0; k < span; k++)
+          {
+
+            umpX1[span * i + k] = 0.0;
+            umpX2[span * i + k] = 0.0;
+
+            for(l = 0; l < states; l++)
+            {
+              umpX1[span * i + k] +=  v[l] *  left[k * states + l];
+              umpX2[span * i + k] +=  v[l] * right[k * states + l];
+            }
+
+          }
+        }
+
+        for(i = 0; i < n; i++)
+        {
+          /* access the precomputed arrays (pre-computed multiplication of conditional with the tip state) 
+          */
+
+          uX1 = &umpX1[span * tipX1[i]];
+          uX2 = &umpX2[span * tipX2[i]];
+
+          /* loop over discrete GAMMA rates */
+
+          for(j = 0; j < 4; j++)
+          {
+            /* the rest is the same as for CAT */
+            v = &x3[i * span + j * states];
+
+            for(k = 0; k < states; k++)
+              v[k] = 0.0;
+
+            for(k = 0; k < states; k++)
+            {              
+              x1px2 = uX1[j * states + k] * uX2[j * states + k];
+
+              for(l = 0; l < states; l++)                                                       
+                v[l] += x1px2 * extEV[states * k + l];               
+            }
+
+          }        
+        }
+
+        /* free precomputed vectors */
+
+        rax_free(umpX1);
+        rax_free(umpX2);
+      }
+      break;
+    case PLL_TIP_INNER:
+      {
+        /* we do analogous pre-computations as above, with the only difference that we now do them 
+           only for one tip vector */
+
+        double 
+          *umpX1 = (double*)rax_malloc(sizeof(double) * precomputeLength),
+          *ump_x2 = (double*)rax_malloc(sizeof(double) * states);
+
+        /* precompute P and left tip vector product */
+
+        for(i = 0; i < maxStateValue; i++)
+        {
+          v = &(tipVector[states * i]);
+
+          for(k = 0; k < span; k++)
+          {
+
+            umpX1[span * i + k] = 0.0;
+
+            for(l = 0; l < states; l++)
+              umpX1[span * i + k] +=  v[l] * left[k * states + l];
+
+
+          }
+        }
+
+        for (i = 0; i < n; i++)
+        {
+          /* access pre-computed value based on the raw sequence data tipX1 that is used as an index */
+
+          uX1 = &umpX1[span * tipX1[i]];
+
+          /* loop over discrete GAMMA rates */
+
+          for(k = 0; k < 4; k++)
+          {
+            v = &(x2[span * i + k * states]);
+
+            for(l = 0; l < states; l++)
+            {
+              ump_x2[l] = 0.0;
+
+              for(j = 0; j < states; j++)
+                ump_x2[l] += v[j] * right[k * statesSquare + l * states + j];
+            }
+
+            v = &(x3[span * i + states * k]);
+
+            for(l = 0; l < states; l++)
+              v[l] = 0;
+
+            for(l = 0; l < states; l++)
+            {
+              x1px2 = uX1[k * states + l]  * ump_x2[l];
+              for(j = 0; j < states; j++)
+                v[j] += x1px2 * extEV[l * states  + j];
+            }
+          }
+
+          /* also do numerical scaling as above. Note that here we need to scale 
+             4 * 4 values for DNA or 4 * 20 values for protein data.
+             If they are ALL smaller than our threshold, we scale. Note that,
+             this can cause numerical problems with GAMMA, if the values generated 
+             by the four discrete GAMMA rates are too different.
+
+             For details, see: 
+
+             F. Izquierdo-Carrasco, S.A. Smith, A. Stamatakis: "Algorithms, Data Structures, and Numerics for Likelihood-based Phylogenetic Inference of Huge Trees"
+
+*/
+
+
+          v = &x3[span * i];
+          scale = 1;
+          for(l = 0; scale && (l < span); l++)
+            scale = (PLL_ABS(v[l]) <  PLL_MINLIKELIHOOD);
+
+
+          if (scale)
+          {
+            for(l = 0; l < span; l++)
+              v[l] *= PLL_TWOTOTHE256;
+            
+            if(!fastScaling)
+              ex3[i] += 1;
+            else
+              addScale += wgt[i];                   
+          }
+        }
+
+        rax_free(umpX1);
+        rax_free(ump_x2);
+      }
+      break;
+    case PLL_INNER_INNER:
+
+      /* same as above, without pre-computations */
+
+      for (i = 0; i < n; i++)
+      {
+        for(k = 0; k < 4; k++)
+        {
+          vl = &(x1[span * i + states * k]);
+          vr = &(x2[span * i + states * k]);
+          v =  &(x3[span * i + states * k]);
+
+
+          for(l = 0; l < states; l++)
+            v[l] = 0;
+
+
+          for(l = 0; l < states; l++)
+          {              
+
+            al = 0.0;
+            ar = 0.0;
+
+            for(j = 0; j < states; j++)
+            {
+              al += vl[j] * left[k * statesSquare + l * states + j];
+              ar += vr[j] * right[k * statesSquare + l * states + j];
+            }
+
+            x1px2 = al * ar;
+
+            for(j = 0; j < states; j++)
+              v[j] += x1px2 * extEV[states * l + j];
+
+          }
+        }
+
+        v = &(x3[span * i]);
+        scale = 1;
+        for(l = 0; scale && (l < span); l++)
+          scale = ((PLL_ABS(v[l]) <  PLL_MINLIKELIHOOD));
+
+        if(scale)
+        {  
+          for(l = 0; l < span; l++)
+            v[l] *= PLL_TWOTOTHE256;
+          
+          if(!fastScaling)
+            ex3[i] += 1;
+          else
+            addScale += wgt[i];           
+        }
+      }
+      break;
+    default:
+      assert(0);
+  }
+
+  /* as above, increment the global counter that counts scaling multiplications by the scaling multiplications 
+     carried out for computing the likelihood array at node p */
+
+  if(fastScaling)
+    *scalerIncrement = addScale;
+}
+
+
+/* Candidate for deletion */
+/*
+static void newviewGTRCAT( int tipCase,  double *EV,  int *cptr,
+                           double *x1_start,  double *x2_start,  double *x3_start,  double *tipVector,
+                           int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                           int n,  double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling)
+{
+  double
+    *le,
+    *ri,
+    *x1, *x2, *x3;
+  double
+    ump_x1, ump_x2, x1px2[4];
+  int i, j, k, scale, addScale = 0;
+
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:
+      {
+        for (i = 0; i < n; i++)
+          {
+            x1 = &(tipVector[4 * tipX1[i]]);
+            x2 = &(tipVector[4 * tipX2[i]]);
+            x3 = &x3_start[4 * i];
+
+            le =  &left[cptr[i] * 16];
+            ri =  &right[cptr[i] * 16];
+
+            for(j = 0; j < 4; j++)
+              {
+                ump_x1 = 0.0;
+                ump_x2 = 0.0;
+                for(k = 0; k < 4; k++)
+                  {
+                    ump_x1 += x1[k] * le[j * 4 + k];
+                    ump_x2 += x2[k] * ri[j * 4 + k];
+                  }
+                x1px2[j] = ump_x1 * ump_x2;
+              }
+
+            for(j = 0; j < 4; j++)
+              x3[j] = 0.0;
+
+            for(j = 0; j < 4; j++)
+              for(k = 0; k < 4; k++)
+                x3[k] += x1px2[j] * EV[j * 4 + k];          
+          }
+      }
+      break;
+    case PLL_TIP_INNER:
+      {
+        for (i = 0; i < n; i++)
+          {
+            x1 = &(tipVector[4 * tipX1[i]]);
+            x2 = &x2_start[4 * i];
+            x3 = &x3_start[4 * i];
+
+            le =  &left[cptr[i] * 16];
+            ri =  &right[cptr[i] * 16];
+
+            for(j = 0; j < 4; j++)
+              {
+                ump_x1 = 0.0;
+                ump_x2 = 0.0;
+                for(k = 0; k < 4; k++)
+                  {
+                    ump_x1 += x1[k] * le[j * 4 + k];
+                    ump_x2 += x2[k] * ri[j * 4 + k];
+                  }
+                x1px2[j] = ump_x1 * ump_x2;
+              }
+
+            for(j = 0; j < 4; j++)
+              x3[j] = 0.0;
+
+            for(j = 0; j < 4; j++)
+              for(k = 0; k < 4; k++)
+                x3[k] +=  x1px2[j] *  EV[4 * j + k];       
+
+            scale = 1;
+            for(j = 0; j < 4 && scale; j++)
+              scale = (x3[j] < PLL_MINLIKELIHOOD && x3[j] > PLL_MINUSMINLIKELIHOOD);               
+                    
+            if(scale)
+              {             
+                for(j = 0; j < 4; j++)
+                  x3[j] *= PLL_TWOTOTHE256;
+                
+                if(useFastScaling)
+                  addScale += wgt[i];
+                else
+                  ex3[i]  += 1;         
+              }      
+          }
+      }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+        {
+          x1 = &x1_start[4 * i];
+          x2 = &x2_start[4 * i];
+          x3 = &x3_start[4 * i];
+
+          le = &left[cptr[i] * 16];
+          ri = &right[cptr[i] * 16];
+
+          for(j = 0; j < 4; j++)
+            {
+              ump_x1 = 0.0;
+              ump_x2 = 0.0;
+              for(k = 0; k < 4; k++)
+                {
+                  ump_x1 += x1[k] * le[j * 4 + k];
+                  ump_x2 += x2[k] * ri[j * 4 + k];
+                }
+              x1px2[j] = ump_x1 * ump_x2;
+            }
+
+          for(j = 0; j < 4; j++)
+            x3[j] = 0.0;
+
+          for(j = 0; j < 4; j++)
+            for(k = 0; k < 4; k++)
+              x3[k] +=  x1px2[j] *  EV[4 * j + k];
+        
+          scale = 1;
+          for(j = 0; j < 4 && scale; j++)
+            scale = (x3[j] < PLL_MINLIKELIHOOD && x3[j] > PLL_MINUSMINLIKELIHOOD);
+
+          if(scale)
+            {               
+              for(j = 0; j < 4; j++)
+                x3[j] *= PLL_TWOTOTHE256;
+              
+              if(useFastScaling)
+                addScale += wgt[i];
+              else
+                ex3[i]  += 1;           
+            }     
+        }
+      break;
+    default:
+      assert(0);
+    }
+
+  if(useFastScaling)
+    *scalerIncrement = addScale;
+
+}
+*/
+#if 0
+static void newviewGTRGAMMA_BINARY(int tipCase,
+                                   double *x1_start, double *x2_start, double *x3_start,
+                                   double *EV, double *tipVector,
+                                   int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                   const int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling
+                                   )
+{
+  double
+    *x1, *x2, *x3;
+  double
+    ump_x1,
+    ump_x2,
+    x1px2[4];
+  int i, j, k, l, scale, addScale = 0;
+
+
+  /* C-OPT figure out if we are at an inner node who has two tips/leaves
+     as descendants TIP_TIP, a tip and another inner node as descendant
+     TIP_INNER, or two inner nodes as descendants INNER_INNER */
+
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:
+      {
+        for (i = 0; i < n; i++)
+          {
+            x1 = &(tipVector[2 * tipX1[i]]);
+            x2 = &(tipVector[2 * tipX2[i]]);
+            x3 = &x3_start[i * 8];
+
+            for(j = 0; j < 8; j++)
+              x3[j] = 0.0;
+
+            for (j = 0; j < 4; j++)
+              {
+                for (k = 0; k < 2; k++)
+                  {
+                    ump_x1 = 0.0;
+                    ump_x2 = 0.0;
+
+                    for (l=0; l < 2; l++)
+                      {
+                        ump_x1 += x1[l] * left[ j*4 + k*2 + l];
+                        ump_x2 += x2[l] * right[j*4 + k*2 + l];
+                      }
+
+                    x1px2[k] = ump_x1 * ump_x2;
+                  }
+
+                for(k = 0; k < 2; k++)
+                  for (l = 0; l < 2; l++)
+                    x3[j * 2 + l] +=  x1px2[k] * EV[2 * k + l];
+
+              }    
+          }
+      }
+      break;
+    case PLL_TIP_INNER:
+      {
+         for (i = 0; i < n; i++)
+           {
+             x1 = &(tipVector[2 * tipX1[i]]);
+             x2 = &x2_start[i * 8];
+             x3 = &x3_start[i * 8];
+
+             for(j = 0; j < 8; j++)
+               x3[j] = 0.0;
+
+             for (j = 0; j < 4; j++)
+               {
+                 for (k = 0; k < 2; k++)
+                   {
+                     ump_x1 = 0.0;
+                     ump_x2 = 0.0;
+
+                     for (l=0; l < 2; l++)
+                       {
+                         ump_x1 += x1[l] * left[ j*4 + k*2 + l];
+                         ump_x2 += x2[j*2 + l] * right[j*4 + k*2 + l];
+                       }
+
+                     x1px2[k] = ump_x1 * ump_x2;
+                   }
+
+                 for(k = 0; k < 2; k++)
+                   for (l = 0; l < 2; l++)
+                     x3[j * 2 + l] +=  x1px2[k] * EV[2 * k + l];
+
+               }            
+
+             scale = 1;
+             for(l = 0; scale && (l < 8); l++)
+               scale = (PLL_ABS(x3[l]) <  PLL_MINLIKELIHOOD);
+
+             if(scale)
+               {
+                 for (l=0; l < 8; l++)
+                   x3[l] *= PLL_TWOTOTHE256;
+                 
+                 if(useFastScaling)
+                   addScale += wgt[i];
+                 else
+                   ex3[i]  += 1;               
+               }
+
+           }
+      }
+      break;
+    case PLL_INNER_INNER:
+
+      /* C-OPT here we don't do any pre-computations
+         This should be the most compute intensive loop of the three
+         cases here. If we have one or two tips as descendants
+         we can take a couple of shortcuts */
+
+
+     for (i = 0; i < n; i++)
+       {
+         x1 = &x1_start[i * 8];
+         x2 = &x2_start[i * 8];
+         x3 = &x3_start[i * 8];
+
+         for(j = 0; j < 8; j++)
+           x3[j] = 0.0;
+
+         for (j = 0; j < 4; j++)
+           {
+             for (k = 0; k < 2; k++)
+               {
+                 ump_x1 = 0.0;
+                 ump_x2 = 0.0;
+
+                 for (l=0; l < 2; l++)
+                   {
+                     ump_x1 += x1[j*2 + l] * left[ j*4 + k*2 + l];
+                     ump_x2 += x2[j*2 + l] * right[j*4 + k*2 + l];
+                   }
+
+                 x1px2[k] = ump_x1 * ump_x2;
+               }
+
+             for(k = 0; k < 2; k++)
+               for (l = 0; l < 2; l++)
+                 x3[j * 2 + l] +=  x1px2[k] * EV[2 * k + l];
+
+           }
+         
+         scale = 1;
+         for(l = 0; scale && (l < 8); l++)
+           scale = (PLL_ABS(x3[l]) <  PLL_MINLIKELIHOOD);
+
+
+         if(scale)
+           {
+             for (l=0; l<8; l++)
+               x3[l] *= PLL_TWOTOTHE256;
+
+             if(useFastScaling)
+               addScale += wgt[i];
+             else
+               ex3[i]  += 1;      
+           }
+       }
+     break;
+
+    default:
+      assert(0);
+    }
+
+  if(useFastScaling)
+    *scalerIncrement = addScale;
+
+}
+
+static void newviewGTRCAT_BINARY( int tipCase,  double *EV,  int *cptr,
+				  double *x1_start,  double *x2_start,  double *x3_start,  double *tipVector,
+				  int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+				  int n,  double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling)
+{
+  double
+    *le,
+    *ri,
+    *x1, *x2, *x3;
+  double
+    ump_x1, ump_x2, x1px2[2];
+  int i, j, k, scale, addScale = 0;
+
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:
+      {
+	for (i = 0; i < n; i++)
+	  {
+	    x1 = &(tipVector[2 * tipX1[i]]);
+	    x2 = &(tipVector[2 * tipX2[i]]);
+	    x3 = &x3_start[2 * i];	    
+
+	    le =  &left[cptr[i] * 4];
+	    ri =  &right[cptr[i] * 4];
+
+	    for(j = 0; j < 2; j++)
+	      {
+		ump_x1 = 0.0;
+		ump_x2 = 0.0;
+		for(k = 0; k < 2; k++)
+		  {
+		    ump_x1 += x1[k] * le[j * 2 + k];
+		    ump_x2 += x2[k] * ri[j * 2 + k];
+		  }
+		x1px2[j] = ump_x1 * ump_x2;
+	      }
+
+	    for(j = 0; j < 2; j++)
+	      x3[j] = 0.0;
+
+	    for(j = 0; j < 2; j++)
+	      for(k = 0; k < 2; k++)
+		x3[k] += x1px2[j] * EV[j * 2 + k];	   
+	  }
+      }
+      break;
+    case PLL_TIP_INNER:
+      {
+	for (i = 0; i < n; i++)
+	  {
+	    x1 = &(tipVector[2 * tipX1[i]]);
+	    x2 = &x2_start[2 * i];
+	    x3 = &x3_start[2 * i];
+	    
+	    le =  &left[cptr[i] * 4];
+	    ri =  &right[cptr[i] * 4];
+
+	    for(j = 0; j < 2; j++)
+	      {
+		ump_x1 = 0.0;
+		ump_x2 = 0.0;
+		for(k = 0; k < 2; k++)
+		  {
+		    ump_x1 += x1[k] * le[j * 2 + k];
+		    ump_x2 += x2[k] * ri[j * 2 + k];
+		  }
+		x1px2[j] = ump_x1 * ump_x2;
+	      }
+
+	    for(j = 0; j < 2; j++)
+	      x3[j] = 0.0;
+
+	    for(j = 0; j < 2; j++)
+	      for(k = 0; k < 2; k++)
+		x3[k] +=  x1px2[j] *  EV[2 * j + k];	   
+
+	    scale = 1;
+	    for(j = 0; j < 2 && scale; j++)
+	      scale = (x3[j] < PLL_MINLIKELIHOOD && x3[j] > PLL_MINUSMINLIKELIHOOD);
+
+	    if(scale)
+	      {
+		for(j = 0; j < 2; j++)
+		  x3[j] *= PLL_TWOTOTHE256;
+
+		if(useFastScaling)
+		  addScale += wgt[i];
+		else
+		  ex3[i]  += 1;	       
+	      }
+	  }
+      }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+	{
+	  x1 = &x1_start[2 * i];
+	  x2 = &x2_start[2 * i];
+	  x3 = &x3_start[2 * i];
+
+	  le = &left[cptr[i] * 4];
+	  ri = &right[cptr[i] * 4];
+
+	  for(j = 0; j < 2; j++)
+	    {
+	      ump_x1 = 0.0;
+	      ump_x2 = 0.0;
+	      for(k = 0; k < 2; k++)
+		{
+		  ump_x1 += x1[k] * le[j * 2 + k];
+		  ump_x2 += x2[k] * ri[j * 2 + k];
+		}
+	      x1px2[j] = ump_x1 * ump_x2;
+	    }
+
+	  for(j = 0; j < 2; j++)
+	    x3[j] = 0.0;
+
+	  for(j = 0; j < 2; j++)
+	    for(k = 0; k < 2; k++)
+	      x3[k] +=  x1px2[j] *  EV[2 * j + k];	  
+
+	  scale = 1;
+	  for(j = 0; j < 2 && scale; j++)
+	    scale = (x3[j] < PLL_MINLIKELIHOOD && x3[j] > PLL_MINUSMINLIKELIHOOD);
+
+	  if(scale)
+	    {
+	      for(j = 0; j < 2; j++)
+		x3[j] *= PLL_TWOTOTHE256;
+
+	      if(useFastScaling)
+		addScale += wgt[i];
+	      else
+		ex3[i]  += 1;	   
+	    }
+	}
+      break;
+    default:
+      assert(0);
+    }
+
+  if(useFastScaling)
+    *scalerIncrement = addScale;
+
+}
+#endif    /* end if 0 */
+#endif
+
+#if (defined(__AVX) || defined(__SSE3))
+static void newviewGTRCAT_BINARY( int tipCase,  double *EV,  int *cptr,
+                                  double *x1_start,  double *x2_start,  double *x3_start,  double *tipVector,
+                                  int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                  int n,  double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling)
+{
+  double
+    *le,
+    *ri,
+    *x1, *x2, *x3;
+  int i, l, scale, addScale = 0;
+
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:
+      {
+        for(i = 0; i < n; i++)
+          {
+            x1 = &(tipVector[2 * tipX1[i]]);
+            x2 = &(tipVector[2 * tipX2[i]]);
+            x3 = &x3_start[2 * i];         
+
+            le =  &left[cptr[i] * 4];
+            ri =  &right[cptr[i] * 4];
+
+            _mm_store_pd(x3, _mm_setzero_pd());     
+                     
+            for(l = 0; l < 2; l++)
+              {                                                                                                                          
+                __m128d al = _mm_mul_pd(_mm_load_pd(x1), _mm_load_pd(&le[l * 2]));
+                __m128d ar = _mm_mul_pd(_mm_load_pd(x2), _mm_load_pd(&ri[l * 2]));
+                
+                al = _mm_hadd_pd(al, al);
+                ar = _mm_hadd_pd(ar, ar);
+                
+                al = _mm_mul_pd(al, ar);
+                
+                __m128d vv  = _mm_load_pd(x3);
+                __m128d EVV = _mm_load_pd(&EV[2 * l]);
+
+                vv = _mm_add_pd(vv, _mm_mul_pd(al, EVV));
+
+                _mm_store_pd(x3, vv);                                                     
+              }            
+            }
+      }
+      break;
+    case PLL_TIP_INNER:
+      {
+        for (i = 0; i < n; i++)
+          {
+            x1 = &(tipVector[2 * tipX1[i]]);
+            x2 = &x2_start[2 * i];
+            x3 = &x3_start[2 * i];
+
+            le =  &left[cptr[i] * 4];
+            ri =  &right[cptr[i] * 4];
+
+            _mm_store_pd(x3, _mm_setzero_pd());     
+
+            for(l = 0; l < 2; l++)
+            {
+                __m128d al = _mm_mul_pd(_mm_load_pd(x1), _mm_load_pd(&le[l * 2]));
+                __m128d ar = _mm_mul_pd(_mm_load_pd(x2), _mm_load_pd(&ri[l * 2]));
+
+                al = _mm_hadd_pd(al, al);
+                ar = _mm_hadd_pd(ar, ar);
+
+                al = _mm_mul_pd(al, ar);
+
+                __m128d vv  = _mm_load_pd(x3);
+                __m128d EVV = _mm_load_pd(&EV[2 * l]);
+
+                vv = _mm_add_pd(vv, _mm_mul_pd(al, EVV));
+                
+                _mm_store_pd(x3, vv);                                                     
+              }  
+
+            __m128d minlikelihood_sse = _mm_set1_pd(PLL_MINLIKELIHOOD);
+
+          scale = 1;
+
+            __m128d v1 = _mm_and_pd(_mm_load_pd(x3), absMask.m);
+            v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+            if(_mm_movemask_pd( v1 ) != 3)
+              scale = 0;                         
+
+            if(scale)
+          {
+                __m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+            
+                __m128d ex3v = _mm_load_pd(x3);           
+                _mm_store_pd(x3, _mm_mul_pd(ex3v,twoto));                                                 
+                
+                if(useFastScaling)
+              addScale += wgt[i];                   
+                else
+                  ex3[i]  += 1;   
+          }
+        }
+      }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+      {
+          x1 = &x1_start[2 * i];
+          x2 = &x2_start[2 * i];
+          x3 = &x3_start[2 * i];
+
+          le = &left[cptr[i] * 4];
+          ri = &right[cptr[i] * 4];
+
+          _mm_store_pd(x3, _mm_setzero_pd());       
+
+          for(l = 0; l < 2; l++)
+          {              
+              __m128d al = _mm_mul_pd(_mm_load_pd(x1), _mm_load_pd(&le[l * 2]));
+              __m128d ar = _mm_mul_pd(_mm_load_pd(x2), _mm_load_pd(&ri[l * 2]));
+
+              al = _mm_hadd_pd(al, al);
+              ar = _mm_hadd_pd(ar, ar);
+
+              al = _mm_mul_pd(al, ar);
+
+              __m128d vv  = _mm_load_pd(x3);
+              __m128d EVV = _mm_load_pd(&EV[2 * l]);
+
+              vv = _mm_add_pd(vv, _mm_mul_pd(al, EVV));
+
+              _mm_store_pd(x3, vv);                                                       
+        }
+
+          __m128d minlikelihood_sse = _mm_set1_pd(PLL_MINLIKELIHOOD);
+         
+        scale = 1;
+                  
+          __m128d v1 = _mm_and_pd(_mm_load_pd(x3), absMask.m);
+          v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+          if(_mm_movemask_pd( v1 ) != 3)
+            scale = 0;                   
+
+        if(scale)
+        {  
+              __m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+          
+              __m128d ex3v = _mm_load_pd(x3);             
+              _mm_store_pd(x3, _mm_mul_pd(ex3v,twoto));                                           
+             
+              if(useFastScaling)
+            addScale += wgt[i];           
+              else
+                ex3[i]  += 1;     
+        }
+      }
+      break;
+    default:
+      assert(0);
+  }
+
+  if(useFastScaling)
+    *scalerIncrement = addScale;
+
+}
+
+static void newviewGTRGAMMA_BINARY(int tipCase,
+				   double *x1_start, double *x2_start, double *x3_start,
+				   double *EV, double *tipVector,
+                           int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+				   const int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling
+				   )
+{
+  double
+    *x1, *x2, *x3;
+ 
+  int i, k, l, scale, addScale = 0; 
+
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:
+        for (i = 0; i < n; i++)
+          {
+	 x1  = &(tipVector[2 * tipX1[i]]);
+	 x2  = &(tipVector[2 * tipX2[i]]);
+
+                for(k = 0; k < 4; k++)
+                  {
+	     x3 = &(x3_start[8 * i + 2 * k]);	     
+
+	     _mm_store_pd(x3, _mm_setzero_pd());	    
+
+	     for(l = 0; l < 2; l++)
+	       {		 		 						   		  		 		 
+		 __m128d al = _mm_mul_pd(_mm_load_pd(x1), _mm_load_pd(&left[k * 4 + l * 2]));
+		 __m128d ar = _mm_mul_pd(_mm_load_pd(x2), _mm_load_pd(&right[k * 4 + l * 2]));
+		 		       
+		 al = _mm_hadd_pd(al, al);
+		 ar = _mm_hadd_pd(ar, ar);
+		   
+		 al = _mm_mul_pd(al, ar);
+		   
+		 __m128d vv  = _mm_load_pd(x3);
+		 __m128d EVV = _mm_load_pd(&EV[2 * l]);
+		 
+		 vv = _mm_add_pd(vv, _mm_mul_pd(al, EVV));
+		 
+		 _mm_store_pd(x3, vv);		     	  		   		  
+	       }	     	    
+          }
+      }
+      break;
+    case PLL_TIP_INNER:
+        for (i = 0; i < n; i++)
+          {
+	 x1  = &(tipVector[2 * tipX1[i]]);
+
+                for(k = 0; k < 4; k++)
+                  {
+	     x2 = &(x2_start[8 * i + 2 * k]);
+	     x3 = &(x3_start[8 * i + 2 * k]);	     
+	    	         
+	     _mm_store_pd(x3, _mm_setzero_pd());	    
+	    	     
+	     for(l = 0; l < 2; l++)
+	       {		 		 						   		  		 		 
+		 __m128d al = _mm_mul_pd(_mm_load_pd(x1), _mm_load_pd(&left[k * 4 + l * 2]));
+		 __m128d ar = _mm_mul_pd(_mm_load_pd(x2), _mm_load_pd(&right[k * 4 + l * 2]));
+		 		       
+		 al = _mm_hadd_pd(al, al);
+		 ar = _mm_hadd_pd(ar, ar);
+		   
+		 al = _mm_mul_pd(al, ar);
+		   
+		 __m128d vv  = _mm_load_pd(x3);
+		 __m128d EVV = _mm_load_pd(&EV[2 * l]);
+		 
+		 vv = _mm_add_pd(vv, _mm_mul_pd(al, EVV));
+		 
+		 _mm_store_pd(x3, vv);		     	  		   		  
+                  }
+              }
+
+	 x3 = &(x3_start[8 * i]);
+	 __m128d minlikelihood_sse = _mm_set1_pd( PLL_MINLIKELIHOOD );
+
+            scale = 1;
+	 for(l = 0; scale && (l < 8); l += 2)
+	   {
+	     __m128d vv = _mm_load_pd(&x3[l]);
+	     __m128d v1 = _mm_and_pd(vv, absMask.m);
+	     v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+	     if(_mm_movemask_pd( v1 ) != 3)
+	       scale = 0;
+	   }	    	         
+                    
+            if(scale)
+              {             
+	     __m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+	     
+	     for(l = 0; l < 8; l+=2)
+	       {
+		 __m128d ex3v = _mm_load_pd(&x3[l]);		  
+		 _mm_store_pd(&x3[l], _mm_mul_pd(ex3v,twoto));	
+	       }		   		  
+                
+                if(useFastScaling)
+                  addScale += wgt[i];
+                else
+                  ex3[i]  += 1;         
+              }      
+          }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+        {
+	 for(k = 0; k < 4; k++)
+	   {	     
+	     x1 = &(x1_start[8 * i + 2 * k]);
+	     x2 = &(x2_start[8 * i + 2 * k]);
+	     x3 = &(x3_start[8 * i + 2 * k]);	     
+
+	     _mm_store_pd(x3, _mm_setzero_pd());	    
+
+	     for(l = 0; l < 2; l++)
+                {
+		 __m128d al = _mm_mul_pd(_mm_load_pd(x1), _mm_load_pd(&left[k * 4 + l * 2]));
+		 __m128d ar = _mm_mul_pd(_mm_load_pd(x2), _mm_load_pd(&right[k * 4 + l * 2]));
+		 		       
+		 al = _mm_hadd_pd(al, al);
+		 ar = _mm_hadd_pd(ar, ar);
+		   
+		 al = _mm_mul_pd(al, ar);
+		   
+		 __m128d vv  = _mm_load_pd(x3);
+		 __m128d EVV = _mm_load_pd(&EV[2 * l]);
+		 
+		 vv = _mm_add_pd(vv, _mm_mul_pd(al, EVV));
+		 
+		 _mm_store_pd(x3, vv);		     	  		   		  
+                }
+            }
+
+	 x3 = &(x3_start[8 * i]);
+	 __m128d minlikelihood_sse = _mm_set1_pd( PLL_MINLIKELIHOOD );
+        
+          scale = 1;
+	 for(l = 0; scale && (l < 8); l += 2)
+	   {
+	     __m128d vv = _mm_load_pd(&x3[l]);
+	     __m128d v1 = _mm_and_pd(vv, absMask.m);
+	     v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+	     if(_mm_movemask_pd( v1 ) != 3)
+	       scale = 0;
+	   }	    	         
+
+          if(scale)
+            {               
+	     __m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+	     
+	     for(l = 0; l < 8; l+=2)
+	       {
+		 __m128d ex3v = _mm_load_pd(&x3[l]);		  
+		 _mm_store_pd(&x3[l], _mm_mul_pd(ex3v,twoto));	
+	       }		   		  
+              
+              if(useFastScaling)
+                addScale += wgt[i];
+              else
+                ex3[i]  += 1;           
+            }     
+        }
+      break;
+
+    default:
+      assert(0);
+    }
+
+  if(useFastScaling)
+    *scalerIncrement = addScale;
+
+}
+
+
+#endif
+
+
+
+
+/* The function below computes partial traversals only down to the point/node in the tree where the 
+   conditional likelihhod vector summarizing a subtree is already oriented in the correct direction */
+
+
+/** @brief Compute a partial or full traversal descriptor for a subtree of the topology
+
+   Unless the \a partialTraversal is set to \b PLL_TRUE, compute a partial traversal descriptor down 
+   to the point/node in the tree where the conditional likelihood vector representing a subtree is
+   already oriented in the correct direction. The elements of the traversal descriptor are stored in
+   \a ti and a \a counter keeps track of the number of elements.
+
+   @param p
+     Root of the  subtree for which we want to compute the traversal descriptor. The two descendents are \a p->next->back and \a p->next->next->back
+
+   @param ti
+i    Traversal descriptor element structure
+
+   @param counter
+     Number of elements in the traversal descriptor. Updated when an element is added
+
+   @param maxTips
+     Number of tips in the tree structure
+
+   @param numBranches
+     Number of branches
+   
+   @param partialTraversal
+     If \b PLL_TRUE, a partial traversal descriptor is computed, otherwise a full
+
+   @param rvec
+     Parameter concerning ancestral state recomputation. Please document
+
+   @param useRecom
+     If \b PLL_TRUE, then ancestral state recomputation is enabled.
+   
+   @todo Fill in the ancestral recomputation parameter information 
+ */
+static void computeTraversalInfo(nodeptr p, traversalInfo *ti, int *counter, int maxTips, int numBranches, boolean partialTraversal, recompVectors *rvec, boolean useRecom)
+{
+  /* if it's a tip we don't do anything */
+
+  if(isTip(p->number, maxTips))
+    return;
+
+  {
+    int 
+      i;
+
+    /* recom default values */
+    int slot = -1,
+        unpin1 = -1, 
+        unpin2 = -1;
+    /* get the left and right descendants */
+
+    nodeptr 
+      q = p->next->back,
+        r = p->next->next->back;   
+
+    /* if the left and right children are tips there is not that much to do */
+    if(isTip(r->number, maxTips) && isTip(q->number, maxTips))
+    {
+      /* fix the orientation of p->x */
+
+      if (! p->x)
+        getxnode(p);    
+      
+      assert(p->x);
+
+      /* add the current node triplet p,q,r to the traversal descriptor */
+      ti[*counter].tipCase = PLL_TIP_TIP;
+      ti[*counter].pNumber = p->number;
+      ti[*counter].qNumber = q->number;
+      ti[*counter].rNumber = r->number;
+
+
+      /* copy branches to traversal descriptor */
+      for(i = 0; i < numBranches; i++)
+      {     
+        ti[*counter].qz[i] = q->z[i];
+        ti[*counter].rz[i] = r->z[i];
+      }
+
+      /* recom - add the slot to the traversal descriptor */
+      if(useRecom)
+      {
+        getxVector(rvec, p->number, &slot, maxTips);
+        ti[*counter].slot_p = slot;
+        ti[*counter].slot_q = -1;
+        ti[*counter].slot_r = -1;
+      }
+
+      /* increment length counter */
+
+      *counter = *counter + 1;
+    }
+    else
+    {
+      /* if either r or q are tips, flip them to make sure that the tip data is stored 
+         for q */
+      if(isTip(r->number, maxTips) || isTip(q->number, maxTips))
+      {     
+        if(isTip(r->number, maxTips))
+        {
+          nodeptr 
+            tmp = r;
+          r = q;
+          q = tmp;
+        }
+
+
+        /* if the orientation of the liklihood vector at r is not correct we need to re-compute it 
+           and descend into its subtree to figure out if there are more vrctors in there to re-compute and 
+           re-orient */
+
+        if(needsRecomp(useRecom, rvec, r, maxTips) || !partialTraversal) 
+          computeTraversalInfo(r, ti, counter, maxTips, numBranches, partialTraversal, rvec, useRecom);
+        else
+          {
+            if(useRecom)
+              /* the node is available,  now make sure it will not be unpinned until it is read */
+              protectNode(rvec, r->number, maxTips);
+          }
+        /* Now that r is oriented, we can safely set the orientation of p */
+        if(! p->x)
+          getxnode(p);   
+
+        /* make sure that everything is consistent now */
+
+        assert(p->x && r->x);
+
+        /* store data for p, q, r in the traversal descriptor */
+
+        ti[*counter].tipCase = PLL_TIP_INNER;
+        ti[*counter].pNumber = p->number;
+        ti[*counter].qNumber = q->number;
+        ti[*counter].rNumber = r->number;
+
+        for(i = 0; i < numBranches; i++)
+        {       
+          ti[*counter].qz[i] = q->z[i];
+          ti[*counter].rz[i] = r->z[i];
+        }
+
+        if(useRecom)
+        {
+          getxVector(rvec, r->number, &slot, maxTips);
+          ti[*counter].slot_r = slot;
+
+          getxVector(rvec, p->number, &slot, maxTips);
+          ti[*counter].slot_p = slot;
+
+          ti[*counter].slot_q = -1;
+
+          unpin2 = r->number; /* when PLL_TIP_INNER finishes, the INNER input vector r can be unpinned*/
+        }
+
+        *counter = *counter + 1;
+      }
+      else
+      {
+        /* same as above, only now q and r are inner nodes. Hence if they are not 
+           oriented correctly they will need to be recomputed and we need to descend into the 
+           respective subtrees to check if everything is consistent in there, potentially expanding 
+           the traversal descriptor */
+        if(( useRecom && (!partialTraversal) ) || 
+            ( useRecom && needsRecomp(useRecom, rvec, q, maxTips) && needsRecomp(useRecom, rvec, r, maxTips) ))
+        {
+          /* PLL_INNER_INNER and recomputation implies that the order we descend q and r matters, 
+           * if we are in a partial traversal, this is only relevant if both require recomputation
+           * see TODOFER add ref. */
+
+          int q_stlen = rvec->stlen[q->number - maxTips - 1],
+              r_stlen = rvec->stlen[q->number - maxTips - 1];
+          assert(q_stlen >= 2 && q_stlen <= maxTips - 1);
+          assert(r_stlen >= 2 && r_stlen <= maxTips - 1);
+
+          if(q_stlen > r_stlen)
+          {
+            computeTraversalInfo(q, ti, counter, maxTips, numBranches, partialTraversal, rvec, useRecom);
+            computeTraversalInfo(r, ti, counter, maxTips, numBranches, partialTraversal, rvec, useRecom);
+          }
+          else
+          {
+            computeTraversalInfo(r, ti, counter, maxTips, numBranches, partialTraversal, rvec, useRecom);
+            computeTraversalInfo(q, ti, counter, maxTips, numBranches, partialTraversal, rvec, useRecom);
+          }
+        }
+        else
+        {
+          /* Now the order does not matter */
+          /* If we are in a recomputation and partial, only either q or r will be descended */
+
+          if(!partialTraversal || needsRecomp(useRecom, rvec, q, maxTips))
+            computeTraversalInfo(q, ti, counter, maxTips, numBranches, partialTraversal, rvec, useRecom);
+          else
+          {
+            if(useRecom)
+              /* the node is available,  now make sure it will not be unpinned until it is read */
+              protectNode(rvec, q->number, maxTips);
+          }
+
+          if(!partialTraversal || needsRecomp(useRecom, rvec, r, maxTips))
+            computeTraversalInfo(r, ti, counter, maxTips, numBranches, partialTraversal, rvec, useRecom);
+          else
+          {
+            if(useRecom)
+              protectNode(rvec, r->number, maxTips);
+          }
+        }
+
+
+        if(! p->x)
+          getxnode(p);
+
+        /* check that the vector orientations are consistent now */
+
+        assert(p->x && r->x && q->x);
+
+        ti[*counter].tipCase = PLL_INNER_INNER;
+        ti[*counter].pNumber = p->number;
+        ti[*counter].qNumber = q->number;
+        ti[*counter].rNumber = r->number;
+
+        if(useRecom)
+        {
+          /* We check that the strategy cannot re-use slots */
+          getxVector(rvec, q->number, &slot, maxTips);
+          ti[*counter].slot_q = slot;
+
+          getxVector(rvec, r->number, &slot, maxTips);
+          ti[*counter].slot_r = slot;
+          assert(slot != ti[*counter].slot_q);
+
+          getxVector(rvec, p->number, &slot, maxTips);
+          ti[*counter].slot_p = slot;
+          assert(slot != ti[*counter].slot_q);
+          assert(slot != ti[*counter].slot_r);
+
+          /* And at these point both input INNER can be marked as unpinned */
+          unpin2 = r->number;
+          unpin1 = q->number;
+        }
+
+        for(i = 0; i < numBranches; i++)
+        {       
+          ti[*counter].qz[i] = q->z[i];
+          ti[*counter].rz[i] = r->z[i];
+        }
+
+        *counter = *counter + 1;
+      }
+    }
+    if(useRecom)
+    {
+      /* Mark the nodes as unpinnable(will be unpinned while executing the replacement strategy only if required)*/
+      unpinNode(rvec, unpin1, maxTips);
+      unpinNode(rvec, unpin2, maxTips);
+    }
+  }
+}
+
+/* below are the optimized unrolled, and vectorized versions of the above generi cfunctions 
+   for computing the conditional likelihood at p given child nodes q and r. The actual implementation is located at the end/bottom of this 
+   file.
+   */
+/* now this is the function that just iterates over the length of the traversal descriptor and 
+   just computes the conditional likelihhod arrays in the order given by the descriptor.
+   So in a sense, this function has no clue that there is any tree-like structure 
+   in the traversal descriptor, it just operates on an array of structs of given length */ 
+
+
+/** @brief Compute the conditional likelihood for each entry (node) of the traversal descriptor
+
+    Computes the conditional likelihood vectors for each entry (node) in the already computed
+    traversal descriptor, starting from the \a startIndex entry.
+     
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param startIndex
+      From which node to start computing the conditional likelihood vectors in the traversal
+      descriptor
+     
+    @note This function just iterates over the length of the traversal descriptor and 
+      computes the conditional likelihhod arrays in the order given by the descriptor.
+      So in a sense, this function has no clue that there is any tree-like structure 
+      in the traversal descriptor, it just operates on an array of structs of given length.
+ */
+void pllNewviewIterative (pllInstance *tr, partitionList *pr, int startIndex)
+{
+  traversalInfo 
+    *ti   = tr->td[0].ti;
+
+  int 
+    i, 
+    model;
+
+  int 
+    p_slot = -1, 
+    q_slot = -1, 
+    r_slot = -1;
+
+#ifdef _DEBUG_RECOMPUTATION
+  /* recom */
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+#else
+  countTraversal(tr);
+#endif
+  /* E recom */
+#endif
+
+  /* loop over traversal descriptor length. Note that on average we only re-compute the conditionals on 3 -4 
+     nodes in RAxML */
+
+  for(i = startIndex; i < tr->td[0].count; i++)
+  {
+
+    traversalInfo 
+      *tInfo = &ti[i];
+    
+    /* Note that the slots refer to different things if recomputation is applied */
+    if(tr->useRecom)
+      {
+        /* a slot has been assigned while computing the traversal descriptor  */
+        p_slot = tInfo->slot_p;
+        q_slot = tInfo->slot_q;
+        r_slot = tInfo->slot_r;
+      }
+    else
+      {
+        /* a fixed slot is always given for each inner node, we only need an offset to get the right index */
+        p_slot = tInfo->pNumber - tr->mxtips - 1;
+        q_slot = tInfo->qNumber - tr->mxtips - 1;
+        r_slot = tInfo->rNumber - tr->mxtips - 1;
+      }
+
+    /* now loop over all partitions for nodes p, q, and r of the current traversal vector entry */
+
+    for(model = 0; model < pr->numberOfPartitions; model++)
+    {
+      /* number of sites in this partition */
+      size_t            
+        width  = (size_t)pr->partitionData[model]->width;
+
+      /* this conditional statement is exactly identical to what we do in pllEvaluateIterative */
+
+      if(tr->td[0].executeModel[model] && width > 0)
+	{       
+        double
+          *x1_start = (double*)NULL,
+          *x2_start = (double*)NULL,
+          *x3_start = pr->partitionData[model]->xVector[p_slot],
+          *left     = (double*)NULL,
+          *right    = (double*)NULL,            
+#if (defined(__SSE3) || defined(__AVX))
+          *x1_gapColumn = (double*)NULL,
+          *x2_gapColumn = (double*)NULL,
+          *x3_gapColumn = (double*)NULL,
+#endif
+          *rateCategories = (double*)NULL,
+          *x1_ascColumn = NULL,
+          *x2_ascColumn = NULL,
+          *x3_ascColumn = NULL;
+
+        int
+          categories,
+          scalerIncrement = 0,
+
+          /* integer wieght vector with pattern compression weights */
+
+          *wgt = pr->partitionData[model]->wgt;
+
+        /* pointers for per-site scaling array at node p */
+        
+        int      
+          *ex3     = NULL,
+          *ex3_asc = NULL;
+
+        /* select fastScaling or per-site scaling of conidtional likelihood entries */
+
+        boolean
+          fastScaling = tr->fastScaling;
+
+#if (defined(__SSE3) || defined(__AVX))
+        unsigned int
+          *x1_gap = (unsigned int*)NULL,
+          *x2_gap = (unsigned int*)NULL,
+          *x3_gap = (unsigned int*)NULL;
+#endif
+
+        unsigned char
+          *tipX1 = (unsigned char *)NULL,
+          *tipX2 = (unsigned char *)NULL;
+
+        double 
+          qz, 
+          rz;        
+
+        size_t
+#if (defined(__SSE3) || defined(__AVX))
+          gapOffset = 0,
+#endif
+          rateHet = discreteRateCategories(tr->rateHetModel),
+          ascWidth = (size_t)pr->partitionData[model]->states,
+
+          /* get the number of states in the data stored in partition model */
+          
+          states = (size_t)pr->partitionData[model]->states,
+          
+          /* get the length of the current likelihood array stored at node p. This is 
+             important mainly for the SEV-based memory saving option described in here:
+             
+             F. Izquierdo-Carrasco, S.A. Smith, A. Stamatakis: "Algorithms, Data Structures, and Numerics for Likelihood-based Phylogenetic Inference of Huge Trees".
+             
+             So pr->partitionData[model]->xSpaceVector[i] provides the length of the allocated conditional array of partition model
+             and node i 
+          */
+          
+          availableLength = pr->partitionData[model]->xSpaceVector[p_slot],
+          requiredLength = 0;        
+        
+        /* figure out what kind of rate heterogeneity approach we are using */
+
+        if(tr->rateHetModel == PLL_CAT)
+          {              
+            rateCategories = pr->partitionData[model]->perSiteRates;
+            categories = pr->partitionData[model]->numberOfCategories;
+          }
+        else
+          {                              
+            rateCategories = pr->partitionData[model]->gammaRates;
+            categories = 4;
+          }
+
+        /* memory saving stuff, not important right now, but if you are interested ask Fernando */
+
+#if (defined(__SSE3) || defined(__AVX))
+        if(tr->saveMemory)
+          {
+            size_t
+              j,
+              setBits = 0;                
+            
+            gapOffset = states * (size_t)getUndetermined(pr->partitionData[model]->dataType);
+            
+            x1_gap = &(pr->partitionData[model]->gapVector[tInfo->qNumber * pr->partitionData[model]->gapVectorLength]);
+            x2_gap = &(pr->partitionData[model]->gapVector[tInfo->rNumber * pr->partitionData[model]->gapVectorLength]);
+            x3_gap = &(pr->partitionData[model]->gapVector[tInfo->pNumber * pr->partitionData[model]->gapVectorLength]);
+            
+            for(j = 0; j < (size_t)pr->partitionData[model]->gapVectorLength; j++)
+              {              
+                x3_gap[j] = x1_gap[j] & x2_gap[j];
+                setBits += (size_t)(bitcount_32_bit(x3_gap[j])); 
+              }
+            
+            requiredLength = (width - setBits)  * rateHet * states * sizeof(double);            
+          }
+        else
+#endif
+          {
+            /* if we are not trying to save memory the space required to store an inner likelihood array 
+               is the number of sites in the partition times the number of states of the data type in the partition 
+               times the number of discrete GAMMA rates (1 for CAT essentially) times 8 bytes */
+            requiredLength  =  virtual_width( width ) * rateHet * states * sizeof(double);
+            
+            // printf( "req: %d %d %d %d\n", requiredLength, width, virtual_width(width), model );
+          }
+        
+        /* Initially, even when not using memory saving no space is allocated for inner likelihood arrats hence 
+           availableLength will be zero at the very first time we traverse the tree.
+           Hence we need to allocate something here */
+
+        if(requiredLength != availableLength)
+          {            
+
+	    /* this must never happen in exabayes ; please remove, when propagating to the PLL */
+	    /* assert(0); */
+
+            /* if there is a vector of incorrect length assigned here i.e., x3 != NULL we must free 
+               it first */
+            if(x3_start)
+              rax_free(x3_start);
+            
+            /* allocate memory: note that here we use a byte-boundary aligned malloc, because we need the vectors
+               to be aligned at 16 BYTE (SSE3) or 32 BYTE (AVX) boundaries! */
+            
+            rax_posix_memalign ((void **)&x3_start, PLL_BYTE_ALIGNMENT, requiredLength);              
+            
+            /* update the data structures for consistent bookkeeping */
+            pr->partitionData[model]->xVector[p_slot]      = x3_start;
+            pr->partitionData[model]->xSpaceVector[p_slot] = requiredLength;
+          }
+        
+
+        /* 
+           if we are not using fast scaling, we need to assign memory for storing 
+           integer vectors at each inner node that are as long as the sites of the 
+           partition. IMPORTANT: while this looks as if this might be a memory saving trick 
+           it is not. The ex3 vectors will be allocated once during the very first tree 
+           traversal and then never again because they will always have the required length!
+        */
+
+        if(!fastScaling)
+          {
+            size_t
+              availableExpLength = pr->partitionData[model]->expSpaceVector[p_slot],
+              requiredExpLength  = width * sizeof(int);
+            
+            ex3 = pr->partitionData[model]->expVector[p_slot];
+            
+            if(requiredExpLength != availableExpLength)
+              {
+                if(ex3)
+                  rax_free(ex3);
+                
+                rax_posix_memalign ((void **)&ex3, PLL_BYTE_ALIGNMENT, requiredExpLength);               
+                
+                pr->partitionData[model]->expVector[p_slot] = ex3;
+                
+                pr->partitionData[model]->expSpaceVector[p_slot] = requiredExpLength;
+              }
+          }
+
+        /* now just set the pointers for data accesses in the newview() implementations above to the corresponding values 
+           according to the tip case */
+        
+        switch(tInfo->tipCase)
+          {
+          case PLL_TIP_TIP:           
+            tipX1    = pr->partitionData[model]->yVector[tInfo->qNumber];
+            tipX2    = pr->partitionData[model]->yVector[tInfo->rNumber];
+
+	    assert(tipX2 != NULL && tipX1 != NULL); 
+
+#if (defined(__SSE3) || defined(__AVX))
+            if(tr->saveMemory)
+              {
+                x1_gapColumn   = &(pr->partitionData[model]->tipVector[gapOffset]);
+                x2_gapColumn   = &(pr->partitionData[model]->tipVector[gapOffset]);
+                x3_gapColumn   = &(pr->partitionData[model]->gapColumn[(tInfo->pNumber - tr->mxtips - 1) * states * rateHet]);
+              }
+#endif            
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+            if(pr->partitionData[model]->ascBias && tr->threadID == 0)
+#else
+            if(pr->partitionData[model]->ascBias)
+#endif
+             {
+              size_t
+                k;
+              
+              x3_ascColumn = &pr->partitionData[model]->ascVector[(tInfo->pNumber - tr->mxtips - 1) * pr->partitionData[model]->ascOffset];
+              ex3_asc      = &pr->partitionData[model]->ascExpVector[(tInfo->pNumber - tr->mxtips - 1) * ascWidth];
+
+              for(k = 0; k < ascWidth; k++)
+                ex3_asc[k] = 0;               
+             }
+            /* if we do per-site log likelihood scaling, and both child nodes are tips,
+               just initialize the vector with zeros, i.e., no scaling events */
+
+            if(!fastScaling)
+              {
+                size_t
+                  k;                                 
+
+                for(k = 0; k < width; k++)
+                  ex3[k] = 0;
+              }
+            break;
+          case PLL_TIP_INNER:                
+            tipX1    =  pr->partitionData[model]->yVector[tInfo->qNumber];
+            x2_start = pr->partitionData[model]->xVector[r_slot];
+            assert(r_slot != p_slot);
+            
+#if (defined(__SSE3) || defined(__AVX))
+            if(tr->saveMemory)
+              { 
+                x1_gapColumn   = &(pr->partitionData[model]->tipVector[gapOffset]);
+                x2_gapColumn   = &pr->partitionData[model]->gapColumn[(tInfo->rNumber - tr->mxtips - 1) * states * rateHet];
+                x3_gapColumn   = &pr->partitionData[model]->gapColumn[(tInfo->pNumber - tr->mxtips - 1) * states * rateHet];
+              }
+#endif
+            
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+            if(pr->partitionData[model]->ascBias && tr->threadID == 0)
+#else
+              if(pr->partitionData[model]->ascBias)
+#endif      
+              {   
+                size_t
+                  k;
+
+                int 
+                  *ex2_asc;
+                
+                x2_ascColumn = &pr->partitionData[model]->ascVector[(tInfo->rNumber - tr->mxtips - 1) * pr->partitionData[model]->ascOffset];
+                x3_ascColumn = &pr->partitionData[model]->ascVector[(tInfo->pNumber - tr->mxtips - 1) * pr->partitionData[model]->ascOffset];
+                
+                ex2_asc = &pr->partitionData[model]->ascExpVector[(tInfo->rNumber - tr->mxtips - 1) * ascWidth];
+                ex3_asc = &pr->partitionData[model]->ascExpVector[(tInfo->pNumber - tr->mxtips - 1) * ascWidth];
+
+                for(k = 0; k < ascWidth; k++)
+                  ex3_asc[k] = ex2_asc[k];
+              }
+            
+            /* if one child node is not a tip, just copy the values from there, coudl also be done with memcpy of course 
+               the elements of ex3[] will then potentially be further incremented in the actual newview() if scaling events 
+               take place */
+
+            if(!fastScaling)
+              {
+                size_t 
+                  k;
+                int
+                  *ex2 = pr->partitionData[model]->expVector[r_slot];                
+                      
+                for(k = 0; k < width; k++)
+                  ex3[k] = ex2[k];
+              }
+            break;
+          case PLL_INNER_INNER:                              
+            x1_start       = pr->partitionData[model]->xVector[q_slot];
+            x2_start       = pr->partitionData[model]->xVector[r_slot];
+            assert(r_slot != p_slot);
+            assert(q_slot != p_slot);
+            assert(q_slot != r_slot);
+            
+#if (defined(__SSE3) || defined(__AVX))
+            if(tr->saveMemory)
+              {
+                x1_gapColumn   = &pr->partitionData[model]->gapColumn[(tInfo->qNumber - tr->mxtips - 1) * states * rateHet];
+                x2_gapColumn   = &pr->partitionData[model]->gapColumn[(tInfo->rNumber - tr->mxtips - 1) * states * rateHet];
+                x3_gapColumn   = &pr->partitionData[model]->gapColumn[(tInfo->pNumber - tr->mxtips - 1) * states * rateHet];
+              }
+#endif
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+              if(pr->partitionData[model]->ascBias && tr->threadID == 0)
+#else
+              if(pr->partitionData[model]->ascBias)
+#endif          
+               {                
+                 size_t
+                   k;
+
+                 int 
+                   *ex1_asc,
+                   *ex2_asc;
+                 
+                 x1_ascColumn = &pr->partitionData[model]->ascVector[(tInfo->qNumber - tr->mxtips - 1) * pr->partitionData[model]->ascOffset];
+                 x2_ascColumn = &pr->partitionData[model]->ascVector[(tInfo->rNumber - tr->mxtips - 1) * pr->partitionData[model]->ascOffset];
+                 x3_ascColumn = &pr->partitionData[model]->ascVector[(tInfo->pNumber - tr->mxtips - 1) * pr->partitionData[model]->ascOffset];
+                 
+                 ex1_asc = &pr->partitionData[model]->ascExpVector[(tInfo->qNumber - tr->mxtips - 1) * ascWidth];
+                 ex2_asc = &pr->partitionData[model]->ascExpVector[(tInfo->rNumber - tr->mxtips - 1) * ascWidth];
+                 ex3_asc = &pr->partitionData[model]->ascExpVector[(tInfo->pNumber - tr->mxtips - 1) * ascWidth];
+
+                 for(k = 0; k < ascWidth; k++)
+                   ex3_asc[k] = ex1_asc[k] + ex2_asc[k];
+               }
+            /* both child nodes are inner nodes, thus the initial value of the scaling vector 
+               ex3 is the sum of the scaling values of the left and right child node */
+
+            if(!fastScaling)
+              {
+                size_t
+                  k;
+                      
+                int            
+                  *ex1      = pr->partitionData[model]->expVector[q_slot],
+                  *ex2      = pr->partitionData[model]->expVector[r_slot];                    
+                      
+                  for(k = 0; k < width; k++)
+                    ex3[k] = ex1[k] + ex2[k];
+              }
+            break;
+          default:
+            assert(0);
+          }
+
+        /* set the pointers to the left and right P matrices to the pre-allocated memory space for storing them */
+
+        left  = pr->partitionData[model]->left;
+        right = pr->partitionData[model]->right;
+
+        /* if we use per-partition branch length optimization 
+           get the branch length of partition model and take the log otherwise 
+           use the joint branch length among all partitions that is always stored 
+           at index [0] */
+
+        if(pr->perGeneBranchLengths)
+        {
+          qz = tInfo->qz[model];                                    
+          rz = tInfo->rz[model];                  
+        }
+        else
+        {
+          qz = tInfo->qz[0];
+          rz = tInfo->rz[0];
+        }
+
+        qz = (qz > PLL_ZMIN) ? log(qz) : log(PLL_ZMIN);                        
+        rz = (rz > PLL_ZMIN) ? log(rz) : log(PLL_ZMIN);                       
+
+        /* compute the left and right P matrices */
+
+        if(pr->partitionData[model]->dataType == PLL_AA_DATA && pr->partitionData[model]->protModels == PLL_LG4)                     
+                makeP_FlexLG4(qz, rz, pr->partitionData[model]->gammaRates,
+                              pr->partitionData[model]->EI_LG4,
+                              pr->partitionData[model]->EIGN_LG4,
+                              4, left, right, 20);
+        else
+        makeP(qz, rz, rateCategories,   pr->partitionData[model]->EI,
+              pr->partitionData[model]->EIGN, categories,
+              left, right, tr->saveMemory, tr->maxCategories, states);
+
+
+#if (!defined(__SSE3) && !defined(__AVX) && !defined(__MIC_NATIVE))
+        assert(!tr->saveMemory);
+
+        /* figure out if we need to compute the CAT or GAMMA model of rate heterogeneity */
+
+        if(tr->rateHetModel == PLL_CAT)
+         {
+
+           newviewCAT_FLEX(tInfo->tipCase,  pr->partitionData[model]->EV, pr->partitionData[model]->rateCategory,
+                           x1_start, x2_start, x3_start, pr->partitionData[model]->tipVector,
+                           ex3, tipX1, tipX2,
+                           width, left, right, wgt, &scalerIncrement, fastScaling, states);
+         }
+        else 
+         {
+            newviewGAMMA_FLEX(tInfo->tipCase,
+                 x1_start, x2_start, x3_start, pr->partitionData[model]->EV, pr->partitionData[model]->tipVector,
+                 0, tipX1, tipX2,
+                 width, left, right, wgt, &scalerIncrement, fastScaling, states, getUndetermined(pr->partitionData[model]->dataType) + 1);
+         }
+#else
+        /* dedicated highly optimized functions. Analogously to the functions in evaluateGeneric() 
+           we also siwtch over the state number */
+
+        switch(states)
+        {               
+        case 2:
+          assert (!tr->saveMemory);
+          if (tr->rateHetModel == PLL_CAT)
+           {
+             newviewGTRCAT_BINARY(tInfo->tipCase,  pr->partitionData[model]->EV, pr->partitionData[model]->rateCategory,
+                                  x1_start, x2_start, x3_start, pr->partitionData[model]->tipVector,
+                                  ex3, tipX1, tipX2,
+                                  width, left, right, wgt, &scalerIncrement, fastScaling);
+           }
+          else
+           {
+             newviewGTRGAMMA_BINARY(tInfo->tipCase,
+                                    x1_start, x2_start, x3_start, pr->partitionData[model]->EV, pr->partitionData[model]->tipVector,
+                                    ex3, tipX1, tipX2,
+                                    width, left, right, wgt, &scalerIncrement, fastScaling);                  
+           }
+          break;
+
+        case 4: /* DNA */
+#ifdef __MIC_NATIVE
+
+              /* CAT & memory saving are not supported on MIC */
+
+              assert(!tr->saveMemory);
+              assert(tr->rateHetModel == PLL_GAMMA);
+
+              newviewGTRGAMMA_MIC(tInfo->tipCase,
+                                x1_start, x2_start, x3_start, pr->partitionData[model]->EV, pr->partitionData[model]->tipVector,
+                                ex3, tipX1, tipX2,
+                                width, left, right, wgt, &scalerIncrement, fastScaling);
+#else
+          if(tr->rateHetModel == PLL_CAT)
+            {                                
+              
+              if(tr->saveMemory)
+#ifdef __AVX
+                newviewGTRCAT_AVX_GAPPED_SAVE(tInfo->tipCase,  pr->partitionData[model]->EV, pr->partitionData[model]->rateCategory,
+                                              x1_start, x2_start, x3_start, pr->partitionData[model]->tipVector,
+                                              ex3, tipX1, tipX2,
+                                              width, left, right, wgt, &scalerIncrement, fastScaling, x1_gap, x2_gap, x3_gap,
+                                              x1_gapColumn, x2_gapColumn, x3_gapColumn, tr->maxCategories);
+#else
+                newviewGTRCAT_SAVE(tInfo->tipCase,  pr->partitionData[model]->EV, pr->partitionData[model]->rateCategory,
+                                   x1_start, x2_start, x3_start, pr->partitionData[model]->tipVector,
+                                   ex3, tipX1, tipX2,
+                                   width, left, right, wgt, &scalerIncrement, fastScaling, x1_gap, x2_gap, x3_gap,
+                                   x1_gapColumn, x2_gapColumn, x3_gapColumn, tr->maxCategories);
+#endif
+              else
+#ifdef __AVX
+                newviewGTRCAT_AVX(tInfo->tipCase,  pr->partitionData[model]->EV, pr->partitionData[model]->rateCategory,
+                                  x1_start, x2_start, x3_start, pr->partitionData[model]->tipVector,
+                                  ex3, tipX1, tipX2,
+                                  width, left, right, wgt, &scalerIncrement, fastScaling);
+#else
+              newviewGTRCAT(tInfo->tipCase,  pr->partitionData[model]->EV, pr->partitionData[model]->rateCategory,
+                            x1_start, x2_start, x3_start, pr->partitionData[model]->tipVector,
+                            ex3, tipX1, tipX2,
+                            width, left, right, wgt, &scalerIncrement, fastScaling);
+#endif
+            }
+          else
+            {
+              
+              if(tr->saveMemory)
+#ifdef __AVX
+                newviewGTRGAMMA_AVX_GAPPED_SAVE(tInfo->tipCase,
+                                                x1_start, x2_start, x3_start, pr->partitionData[model]->EV, pr->partitionData[model]->tipVector,
+                                                ex3, tipX1, tipX2,
+                                                width, left, right, wgt, &scalerIncrement, fastScaling,
+                                                x1_gap, x2_gap, x3_gap, 
+                                                x1_gapColumn, x2_gapColumn, x3_gapColumn);
+
+#else
+              newviewGTRGAMMA_GAPPED_SAVE(tInfo->tipCase,
+                                          x1_start, x2_start, x3_start, pr->partitionData[model]->EV, pr->partitionData[model]->tipVector,
+                                          ex3, tipX1, tipX2,
+                                          width, left, right, wgt, &scalerIncrement, fastScaling,
+                                          x1_gap, x2_gap, x3_gap, 
+                                          x1_gapColumn, x2_gapColumn, x3_gapColumn);
+#endif
+              else
+#ifdef __AVX
+                newviewGTRGAMMA_AVX(tInfo->tipCase,
+                                    x1_start, x2_start, x3_start, pr->partitionData[model]->EV, pr->partitionData[model]->tipVector,
+                                    ex3, tipX1, tipX2,
+                                    width, left, right, wgt, &scalerIncrement, fastScaling);
+#else
+              newviewGTRGAMMA(tInfo->tipCase,
+                              x1_start, x2_start, x3_start, pr->partitionData[model]->EV, pr->partitionData[model]->tipVector,
+                              ex3,tipX1, tipX2,
+                              width, left, right, wgt, &scalerIncrement, fastScaling);
+#endif
+            }
+#endif
+
+            break;                  
+          case 20: /* proteins */
+
+#ifdef __MIC_NATIVE
+
+			/* CAT & memory saving are not supported on MIC */
+
+			assert(!tr->saveMemory);
+			assert(tr->rateHetModel == PLL_GAMMA);
+
+			if(pr->partitionData[model]->protModels == PLL_LG4)
+			{
+				  newviewGTRGAMMAPROT_LG4_MIC(tInfo->tipCase,
+	                    x1_start, x2_start, x3_start, pr->partitionData[model]->EV_LG4, pr->partitionData[model]->tipVector_LG4,
+	                    tipX1, tipX2,
+	                    width, left, right, wgt, &scalerIncrement);
+			}
+			else
+			{
+				  newviewGTRGAMMAPROT_MIC(tInfo->tipCase,
+						x1_start, x2_start, x3_start, pr->partitionData[model]->EV, pr->partitionData[model]->tipVector,
+						ex3, tipX1, tipX2,
+						width, left, right, wgt, &scalerIncrement, fastScaling);
+			}
+#else
+
+            if(tr->rateHetModel == PLL_CAT)
+            {
+
+
+              if(tr->saveMemory)
+#ifdef __AVX
+                newviewGTRCATPROT_AVX_GAPPED_SAVE(tInfo->tipCase,  pr->partitionData[model]->EV, pr->partitionData[model]->rateCategory,
+                                                  x1_start, x2_start, x3_start, pr->partitionData[model]->tipVector,
+                                                  ex3, tipX1, tipX2, width, left, right, wgt, &scalerIncrement, fastScaling, 
+                                                  x1_gap, x2_gap, x3_gap,
+                                                  x1_gapColumn, x2_gapColumn, x3_gapColumn, tr->maxCategories);
+#else
+              newviewGTRCATPROT_SAVE(tInfo->tipCase,  pr->partitionData[model]->EV, pr->partitionData[model]->rateCategory,
+                                     x1_start, x2_start, x3_start, pr->partitionData[model]->tipVector,
+                                     ex3, tipX1, tipX2, width, left, right, wgt, &scalerIncrement, fastScaling, x1_gap, x2_gap, x3_gap,
+                                     x1_gapColumn, x2_gapColumn, x3_gapColumn, tr->maxCategories);
+#endif
+              else
+#ifdef __AVX
+                newviewGTRCATPROT_AVX(tInfo->tipCase,  pr->partitionData[model]->EV, pr->partitionData[model]->rateCategory,
+                                      x1_start, x2_start, x3_start, pr->partitionData[model]->tipVector,
+                                      ex3, tipX1, tipX2, width, left, right, wgt, &scalerIncrement, fastScaling);
+#else
+              newviewGTRCATPROT(tInfo->tipCase,  pr->partitionData[model]->EV, pr->partitionData[model]->rateCategory,
+                                x1_start, x2_start, x3_start, pr->partitionData[model]->tipVector,
+                                ex3, tipX1, tipX2, width, left, right, wgt, &scalerIncrement, fastScaling);                     
+#endif
+            }
+            else
+            {
+
+              
+
+              if(tr->saveMemory)
+#ifdef __AVX
+                newviewGTRGAMMAPROT_AVX_GAPPED_SAVE(tInfo->tipCase,
+                                                    x1_start, x2_start, x3_start,
+                                                    pr->partitionData[model]->EV,
+                                                    pr->partitionData[model]->tipVector,
+                                                    ex3, tipX1, tipX2,
+                                                    width, left, right, wgt, &scalerIncrement, fastScaling,
+                                                    x1_gap, x2_gap, x3_gap,
+                                                    x1_gapColumn, x2_gapColumn, x3_gapColumn);
+#else
+                newviewGTRGAMMAPROT_GAPPED_SAVE(tInfo->tipCase,
+                                                x1_start, x2_start, x3_start,
+                                                pr->partitionData[model]->EV,
+                                                pr->partitionData[model]->tipVector,
+                                                ex3, tipX1, tipX2,
+                                                width, left, right, wgt, &scalerIncrement, fastScaling,
+                                                x1_gap, x2_gap, x3_gap,
+                                                x1_gapColumn, x2_gapColumn, x3_gapColumn);
+#endif
+            
+             else
+                        {
+                          if(pr->partitionData[model]->protModels == PLL_LG4)
+                            {
+#ifdef __AVX 
+                              newviewGTRGAMMAPROT_AVX_LG4(tInfo->tipCase,
+                                                          x1_start, x2_start, x3_start,
+                                                          pr->partitionData[model]->EV_LG4,
+                                                          pr->partitionData[model]->tipVector_LG4,
+                                                          (int*)NULL, tipX1, tipX2,
+                                                          width, left, right, wgt, &scalerIncrement, PLL_TRUE);
+#else
+                              newviewGTRGAMMAPROT_LG4(tInfo->tipCase,
+                                                      x1_start, x2_start, x3_start,
+                                                      pr->partitionData[model]->EV_LG4,
+                                                      pr->partitionData[model]->tipVector_LG4,
+                                                      (int*)NULL, tipX1, tipX2,
+                                                      width, left, right, 
+                                                      wgt, &scalerIncrement, PLL_TRUE);
+#endif                      
+                            }
+              else
+#ifdef __AVX
+                newviewGTRGAMMAPROT_AVX(tInfo->tipCase,
+                                        x1_start, x2_start, x3_start, pr->partitionData[model]->EV, pr->partitionData[model]->tipVector,
+                                        ex3, tipX1, tipX2,
+                                        width, left, right, wgt, &scalerIncrement, fastScaling);
+#else
+              newviewGTRGAMMAPROT(tInfo->tipCase,
+                                  x1_start, x2_start, x3_start, pr->partitionData[model]->EV, pr->partitionData[model]->tipVector,
+                                  ex3, tipX1, tipX2,
+                                  width, left, right, wgt, &scalerIncrement, fastScaling);
+#endif                 
+            }   
+        }
+#endif
+            
+            break;      
+          default:
+            assert(0);
+        }
+#endif
+
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+       if(pr->partitionData[model]->ascBias && tr->threadID == 0)
+#else
+       if(pr->partitionData[model]->ascBias)
+#endif         
+         {
+           switch(tr->rateHetModel)
+             {
+             case PLL_CAT:
+               {
+                 double 
+                   rates = 1.0;
+                 
+                 //need to re-calculate transition probabilities assuming a rate of 1.0 
+                 makeP(qz, rz, 
+                       &rates,  
+                       pr->partitionData[model]->EI,
+                       pr->partitionData[model]->EIGN,
+                       1, 
+                       left, right, 
+                       tr->saveMemory,
+                       tr->maxCategories,
+                       states);
+                 
+                 newviewAscCat(tInfo->tipCase,
+                               x1_ascColumn, x2_ascColumn, x3_ascColumn,
+                               pr->partitionData[model]->EV,
+                               pr->partitionData[model]->tipVector,
+                               ex3_asc,
+                               states, left, right, states);
+               }
+               break;
+             case PLL_GAMMA:
+               newviewAscGamma(tInfo->tipCase,
+                               x1_ascColumn, x2_ascColumn, x3_ascColumn,
+                               pr->partitionData[model]->EV,
+                               pr->partitionData[model]->tipVector,
+                               ex3_asc,
+                               states, left, right, states);                        
+               break;
+             default:
+               assert(0);
+             }
+         }
+
+
+        /* important step, here we essentiallt recursively compute the number of scaling multiplications 
+           at node p: it's the sum of the number of scaling multiplications already conducted 
+           for computing nodes q and r plus the scaling multiplications done at node p */
+
+        if(fastScaling)
+          {
+            pr->partitionData[model]->globalScaler[tInfo->pNumber] =
+              pr->partitionData[model]->globalScaler[tInfo->qNumber] +
+              pr->partitionData[model]->globalScaler[tInfo->rNumber] +
+              (unsigned int)scalerIncrement;
+            
+            /* check that we are not getting an integer overflow ! */
+
+            assert(pr->partitionData[model]->globalScaler[tInfo->pNumber] < INT_MAX);
+          }
+        
+        /* show the output vector */
+      } 
+    }
+  }
+}
+
+/** @brief Compute the traversal descriptor of the subtree rooted at \a p.
+    
+    Computes the traversal descriptor of the subtree with root \a p. By traversal
+    descriptory we essentially mean a preorder traversal of the unrooted topology
+    by rooting it at a node \a p.
+    If \a partialTraversal is set to \b PLL_TRUE then subtrees which are oriented
+    correctly (i.e. if root node \a r of a subtree has \a r->x == 1) are not
+    included in the traversal descriptor.
+
+    @param tr
+      PLL instance
+
+    @param p
+      Node assumed to be the root
+
+    @param partialTraversal
+      If set to \b PLL_TRUE, then a partial traversal descriptor is computed.
+
+    @param numBranches
+      Number of branches (either per-partition branch or joint branch estimate)
+*/
+void computeTraversal(pllInstance *tr, nodeptr p, boolean partialTraversal, int numBranches)
+{
+  /* Only if we apply recomputations we need the additional step of updating the subtree lengths */
+  if(tr->useRecom)
+  {
+    int traversal_counter = 0;
+    if(partialTraversal)
+      computeTraversalInfoStlen(p, tr->mxtips, tr->rvec, &traversal_counter);
+    else
+      computeFullTraversalInfoStlen(p, tr->mxtips, tr->rvec);
+  }
+  computeTraversalInfo(p, &(tr->td[0].ti[0]), &(tr->td[0].count), tr->mxtips, numBranches, partialTraversal, tr->rvec, tr->useRecom);
+}
+
+
+/** @brief Computes the conditional likelihood vectors of all nodes in the subtree rooted at \a p
+  
+    Compute the conditional likelihood vectors of all nodes in the subtree rooted at node \a p. The
+    conditional likelihood vector at node \a p is recomputed regardless of whether the orientation (i.e. \a p->x) 
+    is correct or not, and, recursuvely, the likelihoods at each node in the subtree as needed and if necessary.
+    In case \a masked is set to \b PLL_TRUE, the computation will not take place at partitions for which the 
+    conditional likelihood has converged (for example as a reult of previous branch length optimization).
+    
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param p
+      Root of the subtree for which we want to recompute the conditional likelihood vectors
+
+    @param masked
+      If set to \b PLL_TRUE, then likelihood vectors of partitions that are converged are
+      not recomputed.
+ */
+void pllUpdatePartials (pllInstance *tr, partitionList *pr, nodeptr p, boolean masked)
+{  
+  /* if it's a tip there is nothing to do */
+
+  if(isTip(p->number, tr->mxtips))
+    return;
+
+  /* the first entry of the traversal descriptor is always reserved for evaluate or branch length optimization calls,
+     hence we start filling the array at the second entry with index one. This is not very nice and should be fixed 
+     at some point */
+
+  tr->td[0].count = 0;
+
+  /* compute the traversal descriptor, which will include nodes-that-need-update descending the subtree  p */
+  computeTraversal(tr, p, PLL_TRUE, pr->perGeneBranchLengths?pr->numberOfPartitions : 1);
+
+  /* the traversal descriptor has been recomputed -> not sure if it really always changes, something to 
+     optimize in the future */
+  tr->td[0].traversalHasChanged = PLL_TRUE;
+
+  /* We do a masked newview, i.e., do not execute newvies for each partition, when for example 
+     doing a branch length optimization on the entire tree when branches are estimated on a per partition basis.
+
+     you may imagine that for partition 5 the branch length optimization has already converged whereas 
+     for partition 6 we still need to go over the tree again.
+
+     This is explained in more detail in:
+
+     A. Stamatakis, M. Ott: "Load Balance in the Phylogenetic Likelihood Kernel". Proceedings of ICPP 2009
+
+     The external boolean array tr->partitionConverged[] contains exactly that information and is copied 
+     to executeModel and subsequently to the executeMask of the traversal descriptor 
+
+*/
+
+
+  if(masked)
+  {
+    int model;
+
+    for(model = 0; model < pr->numberOfPartitions; model++)
+    {
+      if(tr->partitionConverged[model])
+        pr->partitionData[model]->executeModel = PLL_FALSE;
+      else
+        pr->partitionData[model]->executeModel = PLL_TRUE;
+    }
+  }
+
+  /* if there is something to re-compute */
+
+  if(tr->td[0].count > 0)
+  {
+    /* store execute mask in traversal descriptor */
+
+    storeExecuteMaskInTraversalDescriptor(tr, pr);
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+    /* do the parallel for join for pthreads
+       not that we do not need a reduction operation here, but just a barrier to make 
+       sure that all threads are done with their partition */
+
+    pllMasterBarrier(tr, pr, PLL_THREAD_NEWVIEW);
+#else
+    /* in the sequential case we now simply call pllNewviewIterative() */
+
+    pllNewviewIterative(tr, pr, 0);
+#endif
+
+  }
+
+  /* clean up */
+
+  if(masked)
+  {
+    int model;
+
+    for(model = 0; model < pr->numberOfPartitions; model++)
+      pr->partitionData[model]->executeModel = PLL_TRUE;
+  }
+
+  tr->td[0].traversalHasChanged = PLL_FALSE;
+}
+
+/* function to compute the marginal ancestral probability vector at a node p for CAT/PSR model */
+
+/** @brief Compute the marginal ancestral probability vector for CAT/PSR model
+    
+    Computes the marginal ancestral probability vector for CAT/PSR model, given the conditional likelihood
+    vector \a x3 of some node, and a zero branch length P matrix \a diagptable.
+
+    @param x3
+      Conditional likelihood of the node for which we are computing the ancestral vector
+
+    @param ancestralBuffer
+      Buffer where to store the marginal ancestral probability vector
+
+    @param diagptable
+      A zero branch length P matrix
+
+    @param n
+      Number of sites in the partition to process (in the case of MPI/PTHREADS, the number of sites in the partition assigned to the current thread/process)
+
+    @param numStates
+      Number of states
+
+    @param cptr
+      Array where the rate for each site in the compressed partition alignment is stored
+      
+ */
+static void ancestralCat(double *x3, double *ancestralBuffer, double *diagptable, const int n, const int numStates, int *cptr)
+{ 
+  double 
+    *term = (double*)rax_malloc(sizeof(double) * numStates);
+
+  int 
+    i;
+
+  const int
+    statesSquare = numStates * numStates;
+  
+  for(i = 0; i < n; i++)
+    {
+      double 
+        sum = 0.0,
+        *v = &x3[numStates * i],
+        *ancestral = &ancestralBuffer[numStates * i],
+        *d = &diagptable[cptr[i] * statesSquare];            
+
+      int 
+        l,
+        j;
+
+      for(l = 0; l < numStates; l++)
+        {
+          double 
+            ump_x1 = 0.0;
+      
+          for(j = 0; j < numStates; j++)        
+            ump_x1 += v[j] * d[l * numStates + j];
+
+          sum += ump_x1;
+          term[l] = ump_x1;      
+        }
+                
+      for(l = 0; l < numStates; l++)          
+        ancestral[l] = term[l] / sum;   
+    }
+   
+  rax_free(term);
+}
+
+
+/* compute marginal ancestral states for GAMMA models,
+   for the euqation to obtain marginal ancestral states 
+   see Ziheng Yang's book */
+
+/** @brief Compute the marginal ancestral probability vector for GAMMA model
+    
+    Computes the marginal ancestral probability vector for the GAMMA model, given the conditional likelihood
+    vector \a x3 of some node, and a zero branch length P matrix \a diagptable.
+
+    @param x3
+      Conditional likelihood of the node for which we are computing the ancestral vector
+
+    @param ancestralBuffer
+      Buffer where to store the marginal ancestral probability vector
+
+    @param diagptable
+      A zero branch length P matrix
+
+    @param n
+      Number of sites in the partition to process (in the case of MPI/PTHREADS, the number of sites in the partition assigned to the current thread/process)
+
+    @param numStates
+      Number of states
+
+    @param gammaStates
+      Number of GAMMA categories times number of states
+      
+ */
+static void ancestralGamma(double *x3, double *ancestralBuffer, double *diagptable, const int n, const int numStates, const int gammaStates)
+{
+  int 
+    i;
+
+  const int
+    statesSquare = numStates * numStates;
+
+  double    
+    *term = (double*)rax_malloc(sizeof(double) * numStates);                  
+  
+  for(i = 0; i < n; i++)
+    {
+      double 
+        sum = 0.0,
+        *_v = &x3[gammaStates * i],
+        *ancestral = &ancestralBuffer[numStates * i];  
+      
+      int
+        k,
+        j,
+        l;
+      
+      for(l = 0; l < numStates; l++)
+        term[l] = 0.0;
+
+      for(k = 0; k < 4; k++)
+        {
+          double 
+            *v =  &(_v[numStates * k]);
+
+          for(l = 0; l < numStates; l++)
+            {
+              double
+                al = 0.0;
+              
+              for(j = 0; j < numStates; j++)        
+                al += v[j] * diagptable[k * statesSquare + l * numStates + j];
+          
+              term[l] += al;
+              sum += al;
+            }
+        }
+  
+      for(l = 0; l < numStates; l++)        
+        ancestral[l] = term[l] / sum;       
+    }
+   
+  rax_free(term);
+}
+
+/* compute dedicated zero branch length P matrix */
+/** @brief Compute a dedicated zero branch length P matrix
+   
+    Computes a P matrix by assuming a branch length of zero. This is used
+    for the marginal ancestral probabilities recomputation.
+
+    @param rptr
+      Array of values for rate categories
+
+    @param EI
+      Inverse eigenvector of Q matrix
+
+    @param EIGN
+      Eigenvalues of Q matrix
+
+    @param numberOfCategories
+      Number of rate categories
+
+    @param left
+      Where to store the resulting P matrix
+
+    @param numStates
+      Number of states
+ */
+static void calc_diagp_Ancestral(double *rptr, double *EI,  double *EIGN, int numberOfCategories, double *left, const int numStates)
+{
+  int 
+    i,
+    j,
+    k;
+  
+  const int   
+    statesSquare = numStates * numStates;
+
+  double 
+    z1 = 0.0,
+    lz1[64],
+    d1[64];
+
+  assert(numStates <= 64);
+     
+  for(i = 0; i < numStates; i++)    
+    lz1[i] = EIGN[i] * z1;
+     
+
+  for(i = 0; i < numberOfCategories; i++)
+    {
+      d1[0] = 1.0;
+
+      for(j = 1; j < numStates; j++)    
+        d1[j] = exp(rptr[i] * lz1[j]);
+         
+      for(j = 0; j < numStates; j++)
+        {
+          left[statesSquare * i  + numStates * j] = 1.0;         
+
+          for(k = 1; k < numStates; k++)            
+            left[statesSquare * i + numStates * j + k]  = d1[k] * EI[numStates * j + k];             
+        }
+    }  
+}
+
+/** @brief A very simple iterative function, we only access the conditional likelihood vector at node \a p
+ *
+ *
+ */
+void newviewAncestralIterative(pllInstance *tr, partitionList *pr)
+{
+  traversalInfo 
+    *ti    = tr->td[0].ti,
+    *tInfo = &ti[0];
+
+  int    
+    model,
+    p_slot = -1;
+
+  /* make sure that the traversal descriptor has length 1 */
+
+  assert(tr->td[0].count == 1);
+  assert(!tr->saveMemory);
+
+  /* get the index to the conditional likelihood vector depending on whether recomputation is used or not */
+
+  if(tr->useRecom)    
+    p_slot = tInfo->slot_p;         
+  else    
+    p_slot = tInfo->pNumber - tr->mxtips - 1;         
+
+  /* now loop over all partitions for nodes p of the current traversal vector entry */
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+    {
+      /* number of sites in this partition */
+      size_t            
+        width  = (size_t)pr->partitionData[model]->width;
+
+      /* this conditional statement is exactly identical to what we do in pllEvaluateIterative */
+
+      if(tr->td[0].executeModel[model] && width > 0)
+        {             
+          double         
+            *x3_start = pr->partitionData[model]->xVector[p_slot],
+//          *left     = (double*)NULL,
+//          *right    = (double*)NULL,                 
+            *rateCategories = (double*)NULL,
+            *diagptable = (double*)NULL;
+
+          int
+            categories;
+        
+          size_t                  
+            states = (size_t)pr->partitionData[model]->states,
+            availableLength = pr->partitionData[model]->xSpaceVector[p_slot],
+            requiredLength = 0,
+            rateHet = discreteRateCategories(tr->rateHetModel);   
+
+        /* figure out what kind of rate heterogeneity approach we are using */
+
+          if(tr->rateHetModel == PLL_CAT)
+            {            
+              rateCategories = pr->partitionData[model]->perSiteRates;
+              categories     = pr->partitionData[model]->numberOfCategories;
+            }
+          else
+            {                            
+              rateCategories = pr->partitionData[model]->gammaRates;
+              categories     = 4;
+            }
+          
+          /* allocate some space for a special P matrix with a branch length of 0 into which we mingle 
+             the eignevalues. This will allow us to obtain real probabilites from the internal RAxML 
+             representation */
+
+          rax_posix_memalign ((void **)&diagptable, PLL_BYTE_ALIGNMENT, categories * states * states * sizeof(double));
+          
+          requiredLength  =  virtual_width( width ) * rateHet * states * sizeof(double);
+          
+          /* make sure that this vector had already been allocated. This must be PLL_TRUE since we first invoked a standard newview() on this */
+
+          assert(requiredLength == availableLength);                                     
+
+          /* now compute the special P matrix */
+
+          calc_diagp_Ancestral(rateCategories, pr->partitionData[model]->EI,  pr->partitionData[model]->EIGN, categories, diagptable, states);
+          
+          /* switch over the rate heterogeneity model 
+             and call generic functions that compute the marginal ancestral states and 
+             store them in pr->partitionData[model]->ancestralBuffer
+          */
+
+          if(tr->rateHetModel == PLL_CAT)       
+            ancestralCat(x3_start, pr->partitionData[model]->ancestralBuffer, diagptable, width, states, pr->partitionData[model]->rateCategory);
+          else
+            ancestralGamma(x3_start, pr->partitionData[model]->ancestralBuffer, diagptable, width, states, categories * states);
+          
+          rax_free(diagptable);                   
+        }       
+    }
+}
+
+/** @brief Computes the Conditional Likelihood Vector (CLV) for each rate of some internal node.
+
+    Computes the conditional likelihood vectors of node \a p for each rate, given the partition
+    index \a partition. The result is placed in the array \a outProbs, which must be pre-allocated
+    by the caller, and must be of size \a sites * categories * states * sizeof(double). The structure of
+    the resulting array is the following:
+    For each site we have \a categories * states cells of size \a double. Those cells are divided per rate
+    category, i.e. first \a states cells are the probabilities for the states of rate 1 (ordered alphabetically
+    by base name), next \a states cells for rate 2 and so on.
+
+    @param tr   PLL instance
+    @param pr     List of partitions
+    @param p Node for which we want to compute the CLV
+    @param partition   Index of the partition for which to compute the CLV
+    @param outProbs    Pre-allocated array where the result will be stored
+
+    @returns Returns \b PLL_TRUE on success, \b PLL_FALSE on failure
+
+    @todo       Fix to work with CAT
+*/
+int pllGetCLV (pllInstance * tr, partitionList * pr, nodeptr p, int partition, double * outProbs)
+{
+  size_t i, j, k, l;
+
+  if (tr->rateHetModel != PLL_GAMMA) return (PLL_FALSE);
+
+  int p_slot;
+  size_t states = (size_t)pr->partitionData[partition]->states;
+
+  double
+    *term = (double*)rax_malloc(sizeof(double) * states);
+
+  if(tr->useRecom)
+    p_slot = p->number;
+  else
+    p_slot = p->number - tr->mxtips - 1;
+
+  size_t width = (size_t) pr->partitionData[partition]->width;
+  double * diagptable = NULL;
+  double * rateCategories = pr->partitionData[partition]->gammaRates;
+  double * x3 = pr->partitionData[partition]->xVector[p_slot];
+  size_t categories = 4;
+
+  rax_posix_memalign ((void **)&diagptable, PLL_BYTE_ALIGNMENT, categories * states * states * sizeof (double));
+
+  calc_diagp_Ancestral(rateCategories, pr->partitionData[partition]->EI,  pr->partitionData[partition]->EIGN, categories, diagptable, states);
+
+  for (i = 0; i < width; ++ i)
+   {
+     double
+       *_v  = &x3[categories * states * i],
+       *clv = &outProbs[categories * states * i];
+
+     for (k = 0; k < categories; ++ k)
+      {
+        double
+         sum = 0.0,
+         *v = &(_v[states * k]);
+
+        for (l = 0; l < states; ++ l)
+         {
+           double al = 0.0;
+
+           for (j = 0; j < states; ++ j)
+             al += v[j] * diagptable[k * states * states + l * states + j];
+
+           term[l] = al;
+           sum += al;
+         }
+        for (l = 0; l < states; ++ l)
+           clv[k * categories + l] = term[l] / sum;
+      }
+   }
+
+  rax_free(term);
+  rax_free(diagptable);
+
+  return (PLL_TRUE);
+}
+
+/* this is very similar to pllUpdatePartials, except that it also computes the marginal ancestral probabilities 
+   at node p. To simplify the code I am re-using newview() here to first get the likelihood vector p->x at p
+   and then I deploy newviewAncestralIterative(tr); that should always only have a traversal descriptor of lenth 1,
+   to do some mathematical transformations that are required to obtain the marginal ancestral probabilities from 
+   the conditional likelihood array at p.
+
+   Note that the marginal ancestral probability vector summarizes the subtree rooted at p! */
+
+/** @brief Computes the conditional likelihood vectors of all nodes in the subtree rooted at \a p
+    and the marginal ancestral probabilities at node \a p
+
+    Compute the conditional likelihood vectors of all nodes in the subtree rooted at node \a p. The
+    conditional likelihood vector at node \a p is recomputed regardless of whether the orientation (i.e. \a p->x)
+    is correct or not, and, recursively, the likelihoods at each node in the subtree as needed and if necessary.
+    In addition, the marginal ancestral probability vector for node \a p is also computed.
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param p
+      Node for which we want to compute the ancestral vector
+
+    @note
+      This function is not implemented with the saveMemory technique. 
+*/
+void pllUpdatePartialsAncestral(pllInstance *tr, partitionList *pr, nodeptr p)
+{
+  /* error check, we don't need to compute anything for tips */
+  
+  if(isTip(p->number, tr->mxtips))
+    {
+      printf("You are trying to compute the ancestral states on a tip node of the tree\n");
+      assert(0);
+    }
+
+  /* doesn't work yet in conjunction with SEVs, can be implemented though at some point 
+     if urgently required */
+
+  if(tr->saveMemory)
+    {
+      printf("ancestral state implementation will not work with memory saving (SEVs) enabled!\n");
+      printf("returning without computing anything ... \n");
+      return;
+    }
+
+  /* first call pllUpdatePartials() with mask set to PLL_FALSE such that the likelihood vector is there ! */
+
+  pllUpdatePartials(tr, pr, p, PLL_FALSE);
+
+  /* now let's compute the ancestral states using this vector ! */
+  
+  /* to make things easy and reduce code size, let's re-compute a standard traversal descriptor for node p,
+     hence we need to set the count to 0 */
+
+  tr->td[0].count = 0;
+
+  computeTraversalInfo(p, &(tr->td[0].ti[0]), &(tr->td[0].count), tr->mxtips, pr->perGeneBranchLengths?pr->numberOfPartitions : 1, PLL_TRUE, tr->rvec, tr->useRecom);
+
+  tr->td[0].traversalHasChanged = PLL_TRUE;
+
+  /* here we actually assert, that the traversal descriptor only contains one node triplet p, p->next->back, p->next->next->back
+     this must be PLL_TRUE because we have alread invoked the standard pllUpdatePartials() on p.
+  */ 
+
+  assert(tr->td[0].count == 1);  
+  
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+  /* use the pthreads barrier to invoke newviewAncestralIterative() on a per-thread basis */
+
+  pllMasterBarrier (tr, pr, PLL_THREAD_NEWVIEW_ANCESTRAL);
+#else
+  /* now call the dedicated function that does the mathematical transformation of the 
+     conditional likelihood vector at p to obtain the marginal ancestral states */
+
+  newviewAncestralIterative(tr, pr);
+#endif
+
+  tr->td[0].traversalHasChanged = PLL_FALSE;
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+  /* invoke another parallel region to gather the marginal ancestral probabilities 
+     from the threads/MPI processes */
+
+  pllMasterBarrier (tr, pr, PLL_THREAD_GATHER_ANCESTRAL);
+#endif
+
+  
+}
+
+/* returns the character representation of an enumerated DNA or AA state */
+
+/** @brief Get the character representation of an enumerated DNA or AA state
+    
+    Returns the character representation of the enumarates DNA or AA state,
+    from the constant arrays \a dnaStateNames (for DNA) or \a protStateNames (for proteins).
+
+    @param dataType
+      Type of data, i.e. \b PLL_DNA_DATA or \b PLL_AA_DATA
+
+    @param state
+      The number which we want to decode to a letter
+
+    @return
+      Returns the decoded character
+ */
+static char getStateCharacter(int dataType, int state)
+{
+  char 
+    result;
+
+  switch(dataType)
+    {    
+    case PLL_BINARY_DATA:
+       result = binaryStateNames[state];
+       break;
+    case PLL_DNA_DATA:
+       result = dnaStateNames[state];
+      break;
+    case PLL_AA_DATA:
+      result =  protStateNames[state];
+      break;    
+    default:
+      assert(0);
+    }
+
+  return  result;
+}
+
+/** @brief Prints the ancestral state information for a node \a p to the terminal 
+ 
+    Prints the ancestral state information for a node \a p to the terminal. 
+    The ancestral state sequence, resp. marginal ancestral state probabilities, is printed
+    depending on whether \a \a printStates, resp. \a printProbs, is set to \b PLL_TRUE.
+
+    @param p
+      The node for which to print the ancestral state sequence
+
+    @param printStates
+      If set to \b PLL_TRUE then the ancestral state sequence is printed
+
+    @param printProbs
+      If set to \b PLL_TRUE then the marginal ancestral state probabilities are printed
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+ 
+    @note  Here one can see how to store the ancestral probabilities in a dedicated data structure
+ */
+void printAncestralState(nodeptr p, boolean printStates, boolean printProbs, pllInstance *tr, partitionList *pr)
+{
+#ifdef _USE_PTHREADS
+  size_t 
+    accumulatedOffset = 0;
+#endif
+
+  int
+    j,
+    k,
+    model,
+    globalIndex = 0;
+  
+  /* allocate an array of structs for storing ancestral prob vector info/data */
+
+  ancestralState 
+    *a = (ancestralState *)rax_malloc(sizeof(ancestralState) * tr->originalCrunchedLength);   
+
+  /* loop over partitions */
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+    {
+      int            
+        i,
+        width = pr->partitionData[model]->upper - pr->partitionData[model]->lower,
+        states = pr->partitionData[model]->states;
+      
+      /* set pointer to ancestral probability vector */
+
+#ifdef _USE_PTHREADS
+      double
+        *ancestral = &tr->ancestralVector[accumulatedOffset];
+#else
+      double 
+        *ancestral = pr->partitionData[model]->ancestralBuffer;
+#endif        
+      
+      /* loop over the sites of the partition */
+
+      for(i = 0; i < width; i++, globalIndex++)
+        {
+          double
+            equal = 1.0 / (double)states,
+            max = -1.0;
+            
+          boolean
+            approximatelyEqual = PLL_TRUE;
+
+          int
+            max_l = -1,
+            l;
+          
+          char 
+            c;
+
+          /* stiore number of states for this site */
+
+          a[globalIndex].states = states;
+
+          /* alloc space for storing marginal ancestral probabilities */
+
+          a[globalIndex].probs = (double *)rax_malloc(sizeof(double) * states);
+          
+          /* loop over states to store probabilities and find the maximum */
+
+          for(l = 0; l < states; l++)
+            {
+              double 
+                value = ancestral[states * i + l];
+
+              if(value > max)
+                {
+                  max = value;
+                  max_l = l;
+                }
+              
+              /* this is used for discretizing the ancestral state sequence, if all marginal ancestral 
+                 probabilities are approximately equal we output a ? */
+
+              approximatelyEqual = approximatelyEqual && (PLL_ABS(equal - value) < 0.000001);
+              
+              a[globalIndex].probs[l] = value;                
+            }
+
+          
+          /* figure out the discrete ancestral nucleotide */
+
+          if(approximatelyEqual)
+            c = '?';      
+          else
+            c = getStateCharacter(pr->partitionData[model]->dataType, max_l);
+          
+          a[globalIndex].c = c;   
+        }
+
+#ifdef _USE_PTHREADS
+      accumulatedOffset += width * states;
+#endif            
+    }
+
+  /* print marginal ancestral probs to terminal */
+
+  if(printProbs)
+    {
+      printf("%d\n", p->number);
+      
+      for(k = 0; k < tr->originalCrunchedLength; k++)
+        {
+          for(j = 0; j < a[k].states; j++)
+            printf("%f ", a[k].probs[j]);
+          printf("\n");      
+        }
+      
+      printf("\n");
+    }
+ 
+  /* print discrete state ancestrakl sequence to terminal */
+
+  if(printStates)
+    {
+      printf("%d ", p->number);
+
+      for(k = 0; k < tr->originalCrunchedLength; k++)          
+        printf("%c", a[k].c);   
+  
+      printf("\n");
+    }
+  
+  /* free the ancestral state data structure */
+          
+  for(j = 0; j < tr->originalCrunchedLength; j++)
+    rax_free(a[j].probs);  
+
+  rax_free(a);
+}
+
+void pllGetAncestralState(pllInstance *tr, partitionList *pr, nodeptr p, double * outProbs, char * outSequence)
+{
+#ifdef _USE_PTHREADS
+  size_t 
+    accumulatedOffset = 0;
+#endif
+
+  int
+    j,
+    k,
+    model,
+    globalIndex = 0;
+     
+  pllUpdatePartialsAncestral(tr, pr, p);
+  
+  /* allocate an array of structs for storing ancestral prob vector info/data */
+
+  ancestralState 
+    *a = (ancestralState *)rax_malloc(sizeof(ancestralState) * tr->originalCrunchedLength);   
+
+  /* loop over partitions */
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+    {
+      int            
+        i,
+        width = pr->partitionData[model]->upper - pr->partitionData[model]->lower,
+        states = pr->partitionData[model]->states;
+      
+      /* set pointer to ancestral probability vector */
+
+#ifdef _USE_PTHREADS
+      double
+        *ancestral = &tr->ancestralVector[accumulatedOffset];
+#else
+      double 
+        *ancestral = pr->partitionData[model]->ancestralBuffer;
+#endif        
+      
+      /* loop over the sites of the partition */
+
+      for(i = 0; i < width; i++, globalIndex++)
+        {
+          double
+            equal = 1.0 / (double)states,
+            max = -1.0;
+            
+          boolean
+            approximatelyEqual = PLL_TRUE;
+
+          int
+            max_l = -1,
+            l;
+          
+          char 
+            c;
+
+          /* stiore number of states for this site */
+
+          a[globalIndex].states = states;
+
+          /* alloc space for storing marginal ancestral probabilities */
+
+          a[globalIndex].probs = (double *)rax_malloc(sizeof(double) * states);
+          
+          /* loop over states to store probabilities and find the maximum */
+
+          for(l = 0; l < states; l++)
+            {
+              double 
+                value = ancestral[states * i + l];
+
+              if(value > max)
+                {
+                  max = value;
+                  max_l = l;
+                }
+              
+              /* this is used for discretizing the ancestral state sequence, if all marginal ancestral 
+                 probabilities are approximately equal we output a ? */
+
+              approximatelyEqual = approximatelyEqual && (PLL_ABS(equal - value) < 0.000001);
+              
+              a[globalIndex].probs[l] = value;                
+            }
+
+          
+          /* figure out the discrete ancestral nucleotide */
+
+          if(approximatelyEqual)
+            c = '?';      
+          else
+            c = getStateCharacter(pr->partitionData[model]->dataType, max_l);
+          
+          a[globalIndex].c = c;   
+        }
+
+#ifdef _USE_PTHREADS
+      accumulatedOffset += width * states;
+#endif            
+    }
+
+  /* print marginal ancestral probs to terminal */
+
+  for(k = 0; k < tr->originalCrunchedLength; k++)
+    {
+      for(j = 0; j < a[k].states; j++)
+        outProbs[k * a[k].states + j] = a[k].probs[j];
+    }
+ 
+  /* print discrete state ancestrakl sequence to terminal */
+
+  for(k = 0; k < tr->originalCrunchedLength; k++)          
+      outSequence[k] = a[k].c;
+  outSequence[tr->originalCrunchedLength] = 0;
+  
+  /* free the ancestral state data structure */
+          
+  for(j = 0; j < tr->originalCrunchedLength; j++)
+    rax_free(a[j].probs);  
+
+  rax_free(a);
+}
+/* optimized function implementations */
+
+
+/**
+ *  @defgroup group1 Optimized functions
+ *  This is the optimized functions group
+ */
+
+#if (!defined(__AVX) && defined(__SSE3))
+
+/** @ingroup group1
+ *  @brief Computation of conditional likelihood arrray for GTR GAMMA with memory saving (Optimized SSE3 version for DNA data)
+
+    This is the SSE3 optimized version of ::newviewGAMMA_FLEX for computing the conditional
+    likelihood arrays at some node \a p, given child nodes \a q and \a r using the \b GAMMA
+    model of rate heterogeneity. The memory saving technique is incorporated.
+
+    @note
+    For more details and function argument description check the function ::newviewGAMMA_FLEX
+*/
+static void newviewGTRGAMMA_GAPPED_SAVE(int tipCase,
+                                        double *x1_start, double *x2_start, double *x3_start,
+                                        double *EV, double *tipVector,
+                                        int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                        const int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling,
+                                        unsigned int *x1_gap, unsigned int *x2_gap, unsigned int *x3_gap, 
+                                        double *x1_gapColumn, double *x2_gapColumn, double *x3_gapColumn)
+{
+  int     
+    i, 
+    j, 
+    k, 
+    l,
+    addScale = 0, 
+    scaleGap = 0;
+
+  double
+    *x1,
+    *x2,
+    *x3,
+    *x1_ptr = x1_start,
+    *x2_ptr = x2_start,       
+    max,
+    maxima[2] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))),        
+    EV_t[16] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));      
+
+  __m128d 
+    values[8],
+    EVV[8];  
+
+  for(k = 0; k < 4; k++)
+    for (l=0; l < 4; l++)
+      EV_t[4 * l + k] = EV[4 * k + l];
+
+  for(k = 0; k < 8; k++)
+    EVV[k] = _mm_load_pd(&EV_t[k * 2]);      
+
+
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      {
+        double *uX1, umpX1[256] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))), *uX2, umpX2[256] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+
+        for (i = 1; i < 16; i++)
+        {           
+          __m128d x1_1 = _mm_load_pd(&(tipVector[i*4]));
+          __m128d x1_2 = _mm_load_pd(&(tipVector[i*4 + 2]));       
+
+          for (j = 0; j < 4; j++)
+            for (k = 0; k < 4; k++)
+            {                            
+              __m128d left1 = _mm_load_pd(&left[j*16 + k*4]);
+              __m128d left2 = _mm_load_pd(&left[j*16 + k*4 + 2]);
+
+              __m128d acc = _mm_setzero_pd();
+
+              acc = _mm_add_pd(acc, _mm_mul_pd(left1, x1_1));
+              acc = _mm_add_pd(acc, _mm_mul_pd(left2, x1_2));
+
+              acc = _mm_hadd_pd(acc, acc);
+              _mm_storel_pd(&umpX1[i*16 + j*4 + k], acc);
+            }
+
+          for (j = 0; j < 4; j++)
+            for (k = 0; k < 4; k++)
+            {
+              __m128d left1 = _mm_load_pd(&right[j*16 + k*4]);
+              __m128d left2 = _mm_load_pd(&right[j*16 + k*4 + 2]);
+
+              __m128d acc = _mm_setzero_pd();
+
+              acc = _mm_add_pd(acc, _mm_mul_pd(left1, x1_1));
+              acc = _mm_add_pd(acc, _mm_mul_pd(left2, x1_2));
+
+              acc = _mm_hadd_pd(acc, acc);
+              _mm_storel_pd(&umpX2[i*16 + j*4 + k], acc);
+
+            }
+        }                 
+
+        uX1 = &umpX1[240];
+        uX2 = &umpX2[240];                          
+
+        for (j = 0; j < 4; j++)
+        {                                                                                  
+          __m128d uX1_k0_sse = _mm_load_pd( &uX1[j * 4] );
+          __m128d uX1_k2_sse = _mm_load_pd( &uX1[j * 4 + 2] );
+
+          __m128d uX2_k0_sse = _mm_load_pd( &uX2[j * 4] );
+          __m128d uX2_k2_sse = _mm_load_pd( &uX2[j * 4 + 2] );
+
+          __m128d x1px2_k0 = _mm_mul_pd( uX1_k0_sse, uX2_k0_sse );
+          __m128d x1px2_k2 = _mm_mul_pd( uX1_k2_sse, uX2_k2_sse );                                                 
+
+          __m128d EV_t_l0_k0 = EVV[0];
+          __m128d EV_t_l0_k2 = EVV[1];
+          __m128d EV_t_l1_k0 = EVV[2];
+          __m128d EV_t_l1_k2 = EVV[3];
+          __m128d EV_t_l2_k0 = EVV[4];
+          __m128d EV_t_l2_k2 = EVV[5];
+          __m128d EV_t_l3_k0 = EVV[6]; 
+          __m128d EV_t_l3_k2 = EVV[7];
+
+          EV_t_l0_k0 = _mm_mul_pd( x1px2_k0, EV_t_l0_k0 );
+          EV_t_l0_k2 = _mm_mul_pd( x1px2_k2, EV_t_l0_k2 );
+          EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l0_k2 );
+
+          EV_t_l1_k0 = _mm_mul_pd( x1px2_k0, EV_t_l1_k0 );
+          EV_t_l1_k2 = _mm_mul_pd( x1px2_k2, EV_t_l1_k2 );
+
+          EV_t_l1_k0 = _mm_hadd_pd( EV_t_l1_k0, EV_t_l1_k2 );
+          EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l1_k0 );
+
+          EV_t_l2_k0 = _mm_mul_pd( x1px2_k0, EV_t_l2_k0 );
+          EV_t_l2_k2 = _mm_mul_pd( x1px2_k2, EV_t_l2_k2 );
+          EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l2_k2 );
+
+          EV_t_l3_k0 = _mm_mul_pd( x1px2_k0, EV_t_l3_k0 );
+          EV_t_l3_k2 = _mm_mul_pd( x1px2_k2, EV_t_l3_k2 );
+          EV_t_l3_k0 = _mm_hadd_pd( EV_t_l3_k0, EV_t_l3_k2 );
+
+          EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l3_k0 );
+
+          _mm_store_pd( &x3_gapColumn[j * 4 + 0], EV_t_l0_k0 );
+          _mm_store_pd( &x3_gapColumn[j * 4 + 2], EV_t_l2_k0 );    
+        }  
+
+
+        x3 = x3_start;
+
+        for (i = 0; i < n; i++)
+        {           
+          if(!(x3_gap[i / 32] & mask32[i % 32]))             
+          {
+            uX1 = &umpX1[16 * tipX1[i]];
+            uX2 = &umpX2[16 * tipX2[i]];                                        
+
+            for (j = 0; j < 4; j++)
+            {                                                                              
+              __m128d uX1_k0_sse = _mm_load_pd( &uX1[j * 4] );
+              __m128d uX1_k2_sse = _mm_load_pd( &uX1[j * 4 + 2] );
+
+
+              __m128d uX2_k0_sse = _mm_load_pd( &uX2[j * 4] );
+              __m128d uX2_k2_sse = _mm_load_pd( &uX2[j * 4 + 2] );
+
+
+              //
+              // multiply left * right
+              //
+
+              __m128d x1px2_k0 = _mm_mul_pd( uX1_k0_sse, uX2_k0_sse );
+              __m128d x1px2_k2 = _mm_mul_pd( uX1_k2_sse, uX2_k2_sse );
+
+
+              //
+              // multiply with EV matrix (!?)
+              //
+
+              __m128d EV_t_l0_k0 = EVV[0];
+              __m128d EV_t_l0_k2 = EVV[1];
+              __m128d EV_t_l1_k0 = EVV[2];
+              __m128d EV_t_l1_k2 = EVV[3];
+              __m128d EV_t_l2_k0 = EVV[4];
+              __m128d EV_t_l2_k2 = EVV[5];
+              __m128d EV_t_l3_k0 = EVV[6]; 
+              __m128d EV_t_l3_k2 = EVV[7];
+
+              EV_t_l0_k0 = _mm_mul_pd( x1px2_k0, EV_t_l0_k0 );
+              EV_t_l0_k2 = _mm_mul_pd( x1px2_k2, EV_t_l0_k2 );
+              EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l0_k2 );
+
+              EV_t_l1_k0 = _mm_mul_pd( x1px2_k0, EV_t_l1_k0 );
+              EV_t_l1_k2 = _mm_mul_pd( x1px2_k2, EV_t_l1_k2 );
+
+              EV_t_l1_k0 = _mm_hadd_pd( EV_t_l1_k0, EV_t_l1_k2 );
+              EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l1_k0 );
+
+              EV_t_l2_k0 = _mm_mul_pd( x1px2_k0, EV_t_l2_k0 );
+              EV_t_l2_k2 = _mm_mul_pd( x1px2_k2, EV_t_l2_k2 );
+              EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l2_k2 );
+
+              EV_t_l3_k0 = _mm_mul_pd( x1px2_k0, EV_t_l3_k0 );
+              EV_t_l3_k2 = _mm_mul_pd( x1px2_k2, EV_t_l3_k2 );
+              EV_t_l3_k0 = _mm_hadd_pd( EV_t_l3_k0, EV_t_l3_k2 );
+
+              EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l3_k0 );
+
+              _mm_store_pd( &x3[j * 4 + 0], EV_t_l0_k0 );
+              _mm_store_pd( &x3[j * 4 + 2], EV_t_l2_k0 );
+            }
+
+            x3 += 16;
+          }
+        }
+      }
+      break;
+    case PLL_TIP_INNER:
+      { 
+        double 
+          *uX1, 
+          umpX1[256] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));                 
+
+        for (i = 1; i < 16; i++)
+        {
+          __m128d x1_1 = _mm_load_pd(&(tipVector[i*4]));
+          __m128d x1_2 = _mm_load_pd(&(tipVector[i*4 + 2]));       
+
+          for (j = 0; j < 4; j++)
+            for (k = 0; k < 4; k++)
+            {            
+              __m128d left1 = _mm_load_pd(&left[j*16 + k*4]);
+              __m128d left2 = _mm_load_pd(&left[j*16 + k*4 + 2]);
+
+              __m128d acc = _mm_setzero_pd();
+
+              acc = _mm_add_pd(acc, _mm_mul_pd(left1, x1_1));
+              acc = _mm_add_pd(acc, _mm_mul_pd(left2, x1_2));
+
+              acc = _mm_hadd_pd(acc, acc);
+              _mm_storel_pd(&umpX1[i*16 + j*4 + k], acc);                
+            }
+        }
+
+        {
+          __m128d maxv =_mm_setzero_pd();
+
+          scaleGap = 0;
+
+          x2 = x2_gapColumn;                     
+          x3 = x3_gapColumn;
+
+          uX1 = &umpX1[240];         
+
+          for (j = 0; j < 4; j++)
+          {                                
+            double *x2_p = &x2[j*4];
+            double *right_k0_p = &right[j*16];
+            double *right_k1_p = &right[j*16 + 1*4];
+            double *right_k2_p = &right[j*16 + 2*4];
+            double *right_k3_p = &right[j*16 + 3*4];
+            __m128d x2_0 = _mm_load_pd( &x2_p[0] );
+            __m128d x2_2 = _mm_load_pd( &x2_p[2] );
+
+            __m128d right_k0_0 = _mm_load_pd( &right_k0_p[0] );
+            __m128d right_k0_2 = _mm_load_pd( &right_k0_p[2] );
+            __m128d right_k1_0 = _mm_load_pd( &right_k1_p[0] );
+            __m128d right_k1_2 = _mm_load_pd( &right_k1_p[2] );
+            __m128d right_k2_0 = _mm_load_pd( &right_k2_p[0] );
+            __m128d right_k2_2 = _mm_load_pd( &right_k2_p[2] );
+            __m128d right_k3_0 = _mm_load_pd( &right_k3_p[0] );
+            __m128d right_k3_2 = _mm_load_pd( &right_k3_p[2] );
+
+            right_k0_0 = _mm_mul_pd( x2_0, right_k0_0);
+            right_k0_2 = _mm_mul_pd( x2_2, right_k0_2);
+
+            right_k1_0 = _mm_mul_pd( x2_0, right_k1_0);
+            right_k1_2 = _mm_mul_pd( x2_2, right_k1_2);
+
+            right_k0_0 = _mm_hadd_pd( right_k0_0, right_k0_2);
+            right_k1_0 = _mm_hadd_pd( right_k1_0, right_k1_2);
+            right_k0_0 = _mm_hadd_pd( right_k0_0, right_k1_0);
+
+            right_k2_0 = _mm_mul_pd( x2_0, right_k2_0);
+            right_k2_2 = _mm_mul_pd( x2_2, right_k2_2);
+
+            right_k3_0 = _mm_mul_pd( x2_0, right_k3_0);
+            right_k3_2 = _mm_mul_pd( x2_2, right_k3_2);
+
+            right_k2_0 = _mm_hadd_pd( right_k2_0, right_k2_2);
+            right_k3_0 = _mm_hadd_pd( right_k3_0, right_k3_2);
+            right_k2_0 = _mm_hadd_pd( right_k2_0, right_k3_0);
+
+            __m128d uX1_k0_sse = _mm_load_pd( &uX1[j * 4] );
+            __m128d uX1_k2_sse = _mm_load_pd( &uX1[j * 4 + 2] );
+
+            __m128d x1px2_k0 = _mm_mul_pd( uX1_k0_sse, right_k0_0 );
+            __m128d x1px2_k2 = _mm_mul_pd( uX1_k2_sse, right_k2_0 );
+
+            __m128d EV_t_l0_k0 = EVV[0];
+            __m128d EV_t_l0_k2 = EVV[1];
+            __m128d EV_t_l1_k0 = EVV[2];
+            __m128d EV_t_l1_k2 = EVV[3];
+            __m128d EV_t_l2_k0 = EVV[4];
+            __m128d EV_t_l2_k2 = EVV[5];
+            __m128d EV_t_l3_k0 = EVV[6]; 
+            __m128d EV_t_l3_k2 = EVV[7];
+
+            EV_t_l0_k0 = _mm_mul_pd( x1px2_k0, EV_t_l0_k0 );
+            EV_t_l0_k2 = _mm_mul_pd( x1px2_k2, EV_t_l0_k2 );
+            EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l0_k2 );
+
+            EV_t_l1_k0 = _mm_mul_pd( x1px2_k0, EV_t_l1_k0 );
+            EV_t_l1_k2 = _mm_mul_pd( x1px2_k2, EV_t_l1_k2 );
+
+            EV_t_l1_k0 = _mm_hadd_pd( EV_t_l1_k0, EV_t_l1_k2 );
+            EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l1_k0 );
+
+            EV_t_l2_k0 = _mm_mul_pd( x1px2_k0, EV_t_l2_k0 );
+            EV_t_l2_k2 = _mm_mul_pd( x1px2_k2, EV_t_l2_k2 );
+            EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l2_k2 );
+
+            EV_t_l3_k0 = _mm_mul_pd( x1px2_k0, EV_t_l3_k0 );
+            EV_t_l3_k2 = _mm_mul_pd( x1px2_k2, EV_t_l3_k2 );
+            EV_t_l3_k0 = _mm_hadd_pd( EV_t_l3_k0, EV_t_l3_k2 );
+
+            EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l3_k0 );
+
+            values[j * 2]     = EV_t_l0_k0;
+            values[j * 2 + 1] = EV_t_l2_k0;                                
+
+            maxv = _mm_max_pd(maxv, _mm_and_pd(EV_t_l0_k0, absMask.m));
+            maxv = _mm_max_pd(maxv, _mm_and_pd(EV_t_l2_k0, absMask.m));                                    
+          }
+
+
+          _mm_store_pd(maxima, maxv);
+
+          max = PLL_MAX(maxima[0], maxima[1]);
+
+          if(max < PLL_MINLIKELIHOOD)
+          {
+            scaleGap = 1;
+
+            __m128d sv = _mm_set1_pd(PLL_TWOTOTHE256);
+
+            _mm_store_pd(&x3[0], _mm_mul_pd(values[0], sv));       
+            _mm_store_pd(&x3[2], _mm_mul_pd(values[1], sv));
+            _mm_store_pd(&x3[4], _mm_mul_pd(values[2], sv));
+            _mm_store_pd(&x3[6], _mm_mul_pd(values[3], sv));
+            _mm_store_pd(&x3[8], _mm_mul_pd(values[4], sv));       
+            _mm_store_pd(&x3[10], _mm_mul_pd(values[5], sv));
+            _mm_store_pd(&x3[12], _mm_mul_pd(values[6], sv));
+            _mm_store_pd(&x3[14], _mm_mul_pd(values[7], sv));                        
+          }
+          else
+          {
+            _mm_store_pd(&x3[0], values[0]);       
+            _mm_store_pd(&x3[2], values[1]);
+            _mm_store_pd(&x3[4], values[2]);
+            _mm_store_pd(&x3[6], values[3]);
+            _mm_store_pd(&x3[8], values[4]);       
+            _mm_store_pd(&x3[10], values[5]);
+            _mm_store_pd(&x3[12], values[6]);
+            _mm_store_pd(&x3[14], values[7]);
+          }
+        }                       
+
+        x3 = x3_start;
+
+        for (i = 0; i < n; i++)
+        {
+          if((x3_gap[i / 32] & mask32[i % 32]))
+          {            
+            if(scaleGap)
+            {   
+              if(!fastScaling)
+                ex3[i] += 1;
+              else
+                addScale += wgt[i];                  
+            }
+          }
+          else
+          {                              
+            __m128d maxv =_mm_setzero_pd();              
+
+            if(x2_gap[i / 32] & mask32[i % 32])
+              x2 = x2_gapColumn;
+            else
+            {
+              x2 = x2_ptr;
+              x2_ptr += 16;
+            }
+
+            uX1 = &umpX1[16 * tipX1[i]];             
+
+
+            for (j = 0; j < 4; j++)
+            {                              
+              double *x2_p = &x2[j*4];
+              double *right_k0_p = &right[j*16];
+              double *right_k1_p = &right[j*16 + 1*4];
+              double *right_k2_p = &right[j*16 + 2*4];
+              double *right_k3_p = &right[j*16 + 3*4];
+              __m128d x2_0 = _mm_load_pd( &x2_p[0] );
+              __m128d x2_2 = _mm_load_pd( &x2_p[2] );
+
+              __m128d right_k0_0 = _mm_load_pd( &right_k0_p[0] );
+              __m128d right_k0_2 = _mm_load_pd( &right_k0_p[2] );
+              __m128d right_k1_0 = _mm_load_pd( &right_k1_p[0] );
+              __m128d right_k1_2 = _mm_load_pd( &right_k1_p[2] );
+              __m128d right_k2_0 = _mm_load_pd( &right_k2_p[0] );
+              __m128d right_k2_2 = _mm_load_pd( &right_k2_p[2] );
+              __m128d right_k3_0 = _mm_load_pd( &right_k3_p[0] );
+              __m128d right_k3_2 = _mm_load_pd( &right_k3_p[2] );
+
+
+              right_k0_0 = _mm_mul_pd( x2_0, right_k0_0);
+              right_k0_2 = _mm_mul_pd( x2_2, right_k0_2);
+
+              right_k1_0 = _mm_mul_pd( x2_0, right_k1_0);
+              right_k1_2 = _mm_mul_pd( x2_2, right_k1_2);
+
+              right_k0_0 = _mm_hadd_pd( right_k0_0, right_k0_2);
+              right_k1_0 = _mm_hadd_pd( right_k1_0, right_k1_2);
+              right_k0_0 = _mm_hadd_pd( right_k0_0, right_k1_0);
+
+
+              right_k2_0 = _mm_mul_pd( x2_0, right_k2_0);
+              right_k2_2 = _mm_mul_pd( x2_2, right_k2_2);
+
+
+              right_k3_0 = _mm_mul_pd( x2_0, right_k3_0);
+              right_k3_2 = _mm_mul_pd( x2_2, right_k3_2);
+
+              right_k2_0 = _mm_hadd_pd( right_k2_0, right_k2_2);
+              right_k3_0 = _mm_hadd_pd( right_k3_0, right_k3_2);
+              right_k2_0 = _mm_hadd_pd( right_k2_0, right_k3_0);
+
+              {
+                //
+                // load left side from tip vector
+                //
+
+                __m128d uX1_k0_sse = _mm_load_pd( &uX1[j * 4] );
+                __m128d uX1_k2_sse = _mm_load_pd( &uX1[j * 4 + 2] );
+
+
+                //
+                // multiply left * right
+                //
+
+                __m128d x1px2_k0 = _mm_mul_pd( uX1_k0_sse, right_k0_0 );
+                __m128d x1px2_k2 = _mm_mul_pd( uX1_k2_sse, right_k2_0 );
+
+
+                //
+                // multiply with EV matrix (!?)
+                //                                
+
+                __m128d EV_t_l0_k0 = EVV[0];
+                __m128d EV_t_l0_k2 = EVV[1];
+                __m128d EV_t_l1_k0 = EVV[2];
+                __m128d EV_t_l1_k2 = EVV[3];
+                __m128d EV_t_l2_k0 = EVV[4];
+                __m128d EV_t_l2_k2 = EVV[5];
+                __m128d EV_t_l3_k0 = EVV[6]; 
+                __m128d EV_t_l3_k2 = EVV[7];
+
+
+                EV_t_l0_k0 = _mm_mul_pd( x1px2_k0, EV_t_l0_k0 );
+                EV_t_l0_k2 = _mm_mul_pd( x1px2_k2, EV_t_l0_k2 );
+                EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l0_k2 );
+
+                EV_t_l1_k0 = _mm_mul_pd( x1px2_k0, EV_t_l1_k0 );
+                EV_t_l1_k2 = _mm_mul_pd( x1px2_k2, EV_t_l1_k2 );
+
+                EV_t_l1_k0 = _mm_hadd_pd( EV_t_l1_k0, EV_t_l1_k2 );
+                EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l1_k0 );
+
+                EV_t_l2_k0 = _mm_mul_pd( x1px2_k0, EV_t_l2_k0 );
+                EV_t_l2_k2 = _mm_mul_pd( x1px2_k2, EV_t_l2_k2 );
+                EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l2_k2 );
+
+                EV_t_l3_k0 = _mm_mul_pd( x1px2_k0, EV_t_l3_k0 );
+                EV_t_l3_k2 = _mm_mul_pd( x1px2_k2, EV_t_l3_k2 );
+                EV_t_l3_k0 = _mm_hadd_pd( EV_t_l3_k0, EV_t_l3_k2 );
+
+                EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l3_k0 );
+
+                values[j * 2]     = EV_t_l0_k0;
+                values[j * 2 + 1] = EV_t_l2_k0;                            
+
+                maxv = _mm_max_pd(maxv, _mm_and_pd(EV_t_l0_k0, absMask.m));
+                maxv = _mm_max_pd(maxv, _mm_and_pd(EV_t_l2_k0, absMask.m));                
+              }            
+            }
+
+
+            _mm_store_pd(maxima, maxv);
+
+            max = PLL_MAX(maxima[0], maxima[1]);
+
+            if(max < PLL_MINLIKELIHOOD)
+            {
+              __m128d sv = _mm_set1_pd(PLL_TWOTOTHE256);
+
+              _mm_store_pd(&x3[0], _mm_mul_pd(values[0], sv));     
+              _mm_store_pd(&x3[2], _mm_mul_pd(values[1], sv));
+              _mm_store_pd(&x3[4], _mm_mul_pd(values[2], sv));
+              _mm_store_pd(&x3[6], _mm_mul_pd(values[3], sv));
+              _mm_store_pd(&x3[8], _mm_mul_pd(values[4], sv));     
+              _mm_store_pd(&x3[10], _mm_mul_pd(values[5], sv));
+              _mm_store_pd(&x3[12], _mm_mul_pd(values[6], sv));
+              _mm_store_pd(&x3[14], _mm_mul_pd(values[7], sv));      
+
+              if(!fastScaling)
+                ex3[i] += 1;
+              else
+                addScale += wgt[i];
+
+            }
+            else
+            {
+              _mm_store_pd(&x3[0], values[0]);     
+              _mm_store_pd(&x3[2], values[1]);
+              _mm_store_pd(&x3[4], values[2]);
+              _mm_store_pd(&x3[6], values[3]);
+              _mm_store_pd(&x3[8], values[4]);     
+              _mm_store_pd(&x3[10], values[5]);
+              _mm_store_pd(&x3[12], values[6]);
+              _mm_store_pd(&x3[14], values[7]);
+            }            
+
+            x3 += 16;
+          }
+        }
+      }
+      break;
+    case PLL_INNER_INNER:         
+      {
+        __m128d maxv =_mm_setzero_pd();
+
+        scaleGap = 0;
+
+        x1 = x1_gapColumn;                  
+        x2 = x2_gapColumn;          
+        x3 = x3_gapColumn;
+
+        for (j = 0; j < 4; j++)
+        {
+
+          double *x1_p = &x1[j*4];
+          double *left_k0_p = &left[j*16];
+          double *left_k1_p = &left[j*16 + 1*4];
+          double *left_k2_p = &left[j*16 + 2*4];
+          double *left_k3_p = &left[j*16 + 3*4];
+
+          __m128d x1_0 = _mm_load_pd( &x1_p[0] );
+          __m128d x1_2 = _mm_load_pd( &x1_p[2] );
+
+          __m128d left_k0_0 = _mm_load_pd( &left_k0_p[0] );
+          __m128d left_k0_2 = _mm_load_pd( &left_k0_p[2] );
+          __m128d left_k1_0 = _mm_load_pd( &left_k1_p[0] );
+          __m128d left_k1_2 = _mm_load_pd( &left_k1_p[2] );
+          __m128d left_k2_0 = _mm_load_pd( &left_k2_p[0] );
+          __m128d left_k2_2 = _mm_load_pd( &left_k2_p[2] );
+          __m128d left_k3_0 = _mm_load_pd( &left_k3_p[0] );
+          __m128d left_k3_2 = _mm_load_pd( &left_k3_p[2] );
+
+          left_k0_0 = _mm_mul_pd(x1_0, left_k0_0);
+          left_k0_2 = _mm_mul_pd(x1_2, left_k0_2);
+
+          left_k1_0 = _mm_mul_pd(x1_0, left_k1_0);
+          left_k1_2 = _mm_mul_pd(x1_2, left_k1_2);
+
+          left_k0_0 = _mm_hadd_pd( left_k0_0, left_k0_2 );
+          left_k1_0 = _mm_hadd_pd( left_k1_0, left_k1_2);
+          left_k0_0 = _mm_hadd_pd( left_k0_0, left_k1_0);
+
+          left_k2_0 = _mm_mul_pd(x1_0, left_k2_0);
+          left_k2_2 = _mm_mul_pd(x1_2, left_k2_2);
+
+          left_k3_0 = _mm_mul_pd(x1_0, left_k3_0);
+          left_k3_2 = _mm_mul_pd(x1_2, left_k3_2);
+
+          left_k2_0 = _mm_hadd_pd( left_k2_0, left_k2_2);
+          left_k3_0 = _mm_hadd_pd( left_k3_0, left_k3_2);
+          left_k2_0 = _mm_hadd_pd( left_k2_0, left_k3_0);
+
+
+          double *x2_p = &x2[j*4];
+          double *right_k0_p = &right[j*16];
+          double *right_k1_p = &right[j*16 + 1*4];
+          double *right_k2_p = &right[j*16 + 2*4];
+          double *right_k3_p = &right[j*16 + 3*4];
+          __m128d x2_0 = _mm_load_pd( &x2_p[0] );
+          __m128d x2_2 = _mm_load_pd( &x2_p[2] );
+
+          __m128d right_k0_0 = _mm_load_pd( &right_k0_p[0] );
+          __m128d right_k0_2 = _mm_load_pd( &right_k0_p[2] );
+          __m128d right_k1_0 = _mm_load_pd( &right_k1_p[0] );
+          __m128d right_k1_2 = _mm_load_pd( &right_k1_p[2] );
+          __m128d right_k2_0 = _mm_load_pd( &right_k2_p[0] );
+          __m128d right_k2_2 = _mm_load_pd( &right_k2_p[2] );
+          __m128d right_k3_0 = _mm_load_pd( &right_k3_p[0] );
+          __m128d right_k3_2 = _mm_load_pd( &right_k3_p[2] );
+
+          right_k0_0 = _mm_mul_pd( x2_0, right_k0_0);
+          right_k0_2 = _mm_mul_pd( x2_2, right_k0_2);
+
+          right_k1_0 = _mm_mul_pd( x2_0, right_k1_0);
+          right_k1_2 = _mm_mul_pd( x2_2, right_k1_2);
+
+          right_k0_0 = _mm_hadd_pd( right_k0_0, right_k0_2);
+          right_k1_0 = _mm_hadd_pd( right_k1_0, right_k1_2);
+          right_k0_0 = _mm_hadd_pd( right_k0_0, right_k1_0);
+
+          right_k2_0 = _mm_mul_pd( x2_0, right_k2_0);
+          right_k2_2 = _mm_mul_pd( x2_2, right_k2_2);
+
+          right_k3_0 = _mm_mul_pd( x2_0, right_k3_0);
+          right_k3_2 = _mm_mul_pd( x2_2, right_k3_2);
+
+          right_k2_0 = _mm_hadd_pd( right_k2_0, right_k2_2);
+          right_k3_0 = _mm_hadd_pd( right_k3_0, right_k3_2);
+          right_k2_0 = _mm_hadd_pd( right_k2_0, right_k3_0);                                    
+
+          __m128d x1px2_k0 = _mm_mul_pd( left_k0_0, right_k0_0 );
+          __m128d x1px2_k2 = _mm_mul_pd( left_k2_0, right_k2_0 );                                          
+
+          __m128d EV_t_l0_k0 = EVV[0];
+          __m128d EV_t_l0_k2 = EVV[1];
+          __m128d EV_t_l1_k0 = EVV[2];
+          __m128d EV_t_l1_k2 = EVV[3];
+          __m128d EV_t_l2_k0 = EVV[4];
+          __m128d EV_t_l2_k2 = EVV[5];
+          __m128d EV_t_l3_k0 = EVV[6]; 
+          __m128d EV_t_l3_k2 = EVV[7];
+
+          EV_t_l0_k0 = _mm_mul_pd( x1px2_k0, EV_t_l0_k0 );
+          EV_t_l0_k2 = _mm_mul_pd( x1px2_k2, EV_t_l0_k2 );
+          EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l0_k2 );
+
+          EV_t_l1_k0 = _mm_mul_pd( x1px2_k0, EV_t_l1_k0 );
+          EV_t_l1_k2 = _mm_mul_pd( x1px2_k2, EV_t_l1_k2 );
+
+          EV_t_l1_k0 = _mm_hadd_pd( EV_t_l1_k0, EV_t_l1_k2 );
+          EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l1_k0 );
+
+          EV_t_l2_k0 = _mm_mul_pd( x1px2_k0, EV_t_l2_k0 );
+          EV_t_l2_k2 = _mm_mul_pd( x1px2_k2, EV_t_l2_k2 );
+          EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l2_k2 );
+
+          EV_t_l3_k0 = _mm_mul_pd( x1px2_k0, EV_t_l3_k0 );
+          EV_t_l3_k2 = _mm_mul_pd( x1px2_k2, EV_t_l3_k2 );
+          EV_t_l3_k0 = _mm_hadd_pd( EV_t_l3_k0, EV_t_l3_k2 );
+
+          EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l3_k0 );
+
+
+          values[j * 2] = EV_t_l0_k0;
+          values[j * 2 + 1] = EV_t_l2_k0;                           
+
+          maxv = _mm_max_pd(maxv, _mm_and_pd(EV_t_l0_k0, absMask.m));
+          maxv = _mm_max_pd(maxv, _mm_and_pd(EV_t_l2_k0, absMask.m));
+        }
+
+        _mm_store_pd(maxima, maxv);
+
+        max = PLL_MAX(maxima[0], maxima[1]);
+
+        if(max < PLL_MINLIKELIHOOD)
+        {
+          __m128d sv = _mm_set1_pd(PLL_TWOTOTHE256);
+
+          scaleGap = 1;
+
+          _mm_store_pd(&x3[0], _mm_mul_pd(values[0], sv));         
+          _mm_store_pd(&x3[2], _mm_mul_pd(values[1], sv));
+          _mm_store_pd(&x3[4], _mm_mul_pd(values[2], sv));
+          _mm_store_pd(&x3[6], _mm_mul_pd(values[3], sv));
+          _mm_store_pd(&x3[8], _mm_mul_pd(values[4], sv));         
+          _mm_store_pd(&x3[10], _mm_mul_pd(values[5], sv));
+          _mm_store_pd(&x3[12], _mm_mul_pd(values[6], sv));
+          _mm_store_pd(&x3[14], _mm_mul_pd(values[7], sv));                      
+        }
+        else
+        {
+          _mm_store_pd(&x3[0], values[0]);         
+          _mm_store_pd(&x3[2], values[1]);
+          _mm_store_pd(&x3[4], values[2]);
+          _mm_store_pd(&x3[6], values[3]);
+          _mm_store_pd(&x3[8], values[4]);         
+          _mm_store_pd(&x3[10], values[5]);
+          _mm_store_pd(&x3[12], values[6]);
+          _mm_store_pd(&x3[14], values[7]);
+        }
+      }
+
+
+      x3 = x3_start;
+
+      for (i = 0; i < n; i++)
+      { 
+        if(x3_gap[i / 32] & mask32[i % 32])
+        {            
+          if(scaleGap)
+          {     
+            if(!fastScaling)
+              ex3[i] += 1;
+            else
+              addScale += wgt[i];                              
+          }
+        }
+        else
+        {
+          __m128d maxv =_mm_setzero_pd();                   
+
+          if(x1_gap[i / 32] & mask32[i % 32])
+            x1 = x1_gapColumn;
+          else
+          {
+            x1 = x1_ptr;
+            x1_ptr += 16;
+          }
+
+          if(x2_gap[i / 32] & mask32[i % 32])
+            x2 = x2_gapColumn;
+          else
+          {
+            x2 = x2_ptr;
+            x2_ptr += 16;
+          }
+
+
+          for (j = 0; j < 4; j++)
+          {
+
+            double *x1_p = &x1[j*4];
+            double *left_k0_p = &left[j*16];
+            double *left_k1_p = &left[j*16 + 1*4];
+            double *left_k2_p = &left[j*16 + 2*4];
+            double *left_k3_p = &left[j*16 + 3*4];
+
+            __m128d x1_0 = _mm_load_pd( &x1_p[0] );
+            __m128d x1_2 = _mm_load_pd( &x1_p[2] );
+
+            __m128d left_k0_0 = _mm_load_pd( &left_k0_p[0] );
+            __m128d left_k0_2 = _mm_load_pd( &left_k0_p[2] );
+            __m128d left_k1_0 = _mm_load_pd( &left_k1_p[0] );
+            __m128d left_k1_2 = _mm_load_pd( &left_k1_p[2] );
+            __m128d left_k2_0 = _mm_load_pd( &left_k2_p[0] );
+            __m128d left_k2_2 = _mm_load_pd( &left_k2_p[2] );
+            __m128d left_k3_0 = _mm_load_pd( &left_k3_p[0] );
+            __m128d left_k3_2 = _mm_load_pd( &left_k3_p[2] );
+
+            left_k0_0 = _mm_mul_pd(x1_0, left_k0_0);
+            left_k0_2 = _mm_mul_pd(x1_2, left_k0_2);
+
+            left_k1_0 = _mm_mul_pd(x1_0, left_k1_0);
+            left_k1_2 = _mm_mul_pd(x1_2, left_k1_2);
+
+            left_k0_0 = _mm_hadd_pd( left_k0_0, left_k0_2 );
+            left_k1_0 = _mm_hadd_pd( left_k1_0, left_k1_2);
+            left_k0_0 = _mm_hadd_pd( left_k0_0, left_k1_0);
+
+            left_k2_0 = _mm_mul_pd(x1_0, left_k2_0);
+            left_k2_2 = _mm_mul_pd(x1_2, left_k2_2);
+
+            left_k3_0 = _mm_mul_pd(x1_0, left_k3_0);
+            left_k3_2 = _mm_mul_pd(x1_2, left_k3_2);
+
+            left_k2_0 = _mm_hadd_pd( left_k2_0, left_k2_2);
+            left_k3_0 = _mm_hadd_pd( left_k3_0, left_k3_2);
+            left_k2_0 = _mm_hadd_pd( left_k2_0, left_k3_0);
+
+
+            //
+            // multiply/add right side
+            //
+            double *x2_p = &x2[j*4];
+            double *right_k0_p = &right[j*16];
+            double *right_k1_p = &right[j*16 + 1*4];
+            double *right_k2_p = &right[j*16 + 2*4];
+            double *right_k3_p = &right[j*16 + 3*4];
+            __m128d x2_0 = _mm_load_pd( &x2_p[0] );
+            __m128d x2_2 = _mm_load_pd( &x2_p[2] );
+
+            __m128d right_k0_0 = _mm_load_pd( &right_k0_p[0] );
+            __m128d right_k0_2 = _mm_load_pd( &right_k0_p[2] );
+            __m128d right_k1_0 = _mm_load_pd( &right_k1_p[0] );
+            __m128d right_k1_2 = _mm_load_pd( &right_k1_p[2] );
+            __m128d right_k2_0 = _mm_load_pd( &right_k2_p[0] );
+            __m128d right_k2_2 = _mm_load_pd( &right_k2_p[2] );
+            __m128d right_k3_0 = _mm_load_pd( &right_k3_p[0] );
+            __m128d right_k3_2 = _mm_load_pd( &right_k3_p[2] );
+
+            right_k0_0 = _mm_mul_pd( x2_0, right_k0_0);
+            right_k0_2 = _mm_mul_pd( x2_2, right_k0_2);
+
+            right_k1_0 = _mm_mul_pd( x2_0, right_k1_0);
+            right_k1_2 = _mm_mul_pd( x2_2, right_k1_2);
+
+            right_k0_0 = _mm_hadd_pd( right_k0_0, right_k0_2);
+            right_k1_0 = _mm_hadd_pd( right_k1_0, right_k1_2);
+            right_k0_0 = _mm_hadd_pd( right_k0_0, right_k1_0);
+
+            right_k2_0 = _mm_mul_pd( x2_0, right_k2_0);
+            right_k2_2 = _mm_mul_pd( x2_2, right_k2_2);
+
+
+            right_k3_0 = _mm_mul_pd( x2_0, right_k3_0);
+            right_k3_2 = _mm_mul_pd( x2_2, right_k3_2);
+
+            right_k2_0 = _mm_hadd_pd( right_k2_0, right_k2_2);
+            right_k3_0 = _mm_hadd_pd( right_k3_0, right_k3_2);
+            right_k2_0 = _mm_hadd_pd( right_k2_0, right_k3_0);     
+
+            //
+            // multiply left * right
+            //
+
+            __m128d x1px2_k0 = _mm_mul_pd( left_k0_0, right_k0_0 );
+            __m128d x1px2_k2 = _mm_mul_pd( left_k2_0, right_k2_0 );
+
+
+            //
+            // multiply with EV matrix (!?)
+            //       
+
+            __m128d EV_t_l0_k0 = EVV[0];
+            __m128d EV_t_l0_k2 = EVV[1];
+            __m128d EV_t_l1_k0 = EVV[2];
+            __m128d EV_t_l1_k2 = EVV[3];
+            __m128d EV_t_l2_k0 = EVV[4];
+            __m128d EV_t_l2_k2 = EVV[5];
+            __m128d EV_t_l3_k0 = EVV[6]; 
+            __m128d EV_t_l3_k2 = EVV[7];
+
+
+            EV_t_l0_k0 = _mm_mul_pd( x1px2_k0, EV_t_l0_k0 );
+            EV_t_l0_k2 = _mm_mul_pd( x1px2_k2, EV_t_l0_k2 );
+            EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l0_k2 );
+
+            EV_t_l1_k0 = _mm_mul_pd( x1px2_k0, EV_t_l1_k0 );
+            EV_t_l1_k2 = _mm_mul_pd( x1px2_k2, EV_t_l1_k2 );
+
+            EV_t_l1_k0 = _mm_hadd_pd( EV_t_l1_k0, EV_t_l1_k2 );
+            EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l1_k0 );
+
+            EV_t_l2_k0 = _mm_mul_pd( x1px2_k0, EV_t_l2_k0 );
+            EV_t_l2_k2 = _mm_mul_pd( x1px2_k2, EV_t_l2_k2 );
+            EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l2_k2 );
+
+
+            EV_t_l3_k0 = _mm_mul_pd( x1px2_k0, EV_t_l3_k0 );
+            EV_t_l3_k2 = _mm_mul_pd( x1px2_k2, EV_t_l3_k2 );
+            EV_t_l3_k0 = _mm_hadd_pd( EV_t_l3_k0, EV_t_l3_k2 );
+
+            EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l3_k0 );
+
+
+            values[j * 2] = EV_t_l0_k0;
+            values[j * 2 + 1] = EV_t_l2_k0;                         
+
+            maxv = _mm_max_pd(maxv, _mm_and_pd(EV_t_l0_k0, absMask.m));
+            maxv = _mm_max_pd(maxv, _mm_and_pd(EV_t_l2_k0, absMask.m));
+          }
+
+
+          _mm_store_pd(maxima, maxv);
+
+          max = PLL_MAX(maxima[0], maxima[1]);
+
+          if(max < PLL_MINLIKELIHOOD)
+          {
+            __m128d sv = _mm_set1_pd(PLL_TWOTOTHE256);
+
+            _mm_store_pd(&x3[0], _mm_mul_pd(values[0], sv));       
+            _mm_store_pd(&x3[2], _mm_mul_pd(values[1], sv));
+            _mm_store_pd(&x3[4], _mm_mul_pd(values[2], sv));
+            _mm_store_pd(&x3[6], _mm_mul_pd(values[3], sv));
+            _mm_store_pd(&x3[8], _mm_mul_pd(values[4], sv));       
+            _mm_store_pd(&x3[10], _mm_mul_pd(values[5], sv));
+            _mm_store_pd(&x3[12], _mm_mul_pd(values[6], sv));
+            _mm_store_pd(&x3[14], _mm_mul_pd(values[7], sv));        
+
+            if(!fastScaling)
+              ex3[i] += 1;
+            else
+              addScale += wgt[i];
+
+          }
+          else
+          {
+            _mm_store_pd(&x3[0], values[0]);       
+            _mm_store_pd(&x3[2], values[1]);
+            _mm_store_pd(&x3[4], values[2]);
+            _mm_store_pd(&x3[6], values[3]);
+            _mm_store_pd(&x3[8], values[4]);       
+            _mm_store_pd(&x3[10], values[5]);
+            _mm_store_pd(&x3[12], values[6]);
+            _mm_store_pd(&x3[14], values[7]);
+          }      
+
+
+
+          x3 += 16;
+
+        }
+      }
+      break;
+    default:
+      assert(0);
+  }
+
+  if(fastScaling)
+    *scalerIncrement = addScale;
+}
+
+
+
+/** @ingroup group1
+ *  @brief Computation of conditional likelihood arrray for GTR GAMMA (Optimized SSE3 version for DNA data)
+
+    This is the SSE3 optimized version of ::newviewGAMMA_FLEX for computing the conditional
+    likelihood arrays at some node \a p, given child nodes \a q and \a r using the \b GAMMA
+    model of rate heterogeneity.
+
+    @note
+    For more details and function argument description check the function ::newviewGAMMA_FLEX
+*/
+static void newviewGTRGAMMA(int tipCase,
+                            double *x1_start, double *x2_start, double *x3_start,
+                            double *EV, double *tipVector,
+                            int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                            const int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling
+                            )
+{
+  int 
+    i, 
+    j, 
+    k, 
+    l,
+    addScale = 0;
+
+  //int scaling = 0;
+
+  double
+    *x1,
+    *x2,
+    *x3,
+    max,
+    maxima[2] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))),       
+    EV_t[16] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));      
+
+  __m128d 
+    values[8],
+    EVV[8];  
+
+  for(k = 0; k < 4; k++)
+    for (l=0; l < 4; l++)
+      EV_t[4 * l + k] = EV[4 * k + l];
+
+  for(k = 0; k < 8; k++)
+    EVV[k] = _mm_load_pd(&EV_t[k * 2]);
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      {
+        double *uX1, umpX1[256] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT))), *uX2, umpX2[256] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+
+        for (i = 1; i < 16; i++)
+        {
+          __m128d x1_1 = _mm_load_pd(&(tipVector[i*4]));
+          __m128d x1_2 = _mm_load_pd(&(tipVector[i*4 + 2]));       
+
+          for (j = 0; j < 4; j++)
+
+            for (k = 0; k < 4; k++) {
+              __m128d left1 = _mm_load_pd(&left[j*16 + k*4]);
+              __m128d left2 = _mm_load_pd(&left[j*16 + k*4 + 2]);
+
+              __m128d acc = _mm_setzero_pd();
+
+              acc = _mm_add_pd(acc, _mm_mul_pd(left1, x1_1));
+              acc = _mm_add_pd(acc, _mm_mul_pd(left2, x1_2));
+
+              acc = _mm_hadd_pd(acc, acc);
+              _mm_storel_pd(&umpX1[i*16 + j*4 + k], acc);
+            }
+
+          for (j = 0; j < 4; j++)
+            for (k = 0; k < 4; k++)
+            {
+              __m128d left1 = _mm_load_pd(&right[j*16 + k*4]);
+              __m128d left2 = _mm_load_pd(&right[j*16 + k*4 + 2]);
+
+              __m128d acc = _mm_setzero_pd();
+
+              acc = _mm_add_pd(acc, _mm_mul_pd(left1, x1_1));
+              acc = _mm_add_pd(acc, _mm_mul_pd(left2, x1_2));
+
+              acc = _mm_hadd_pd(acc, acc);
+              _mm_storel_pd(&umpX2[i*16 + j*4 + k], acc);
+
+            }
+        }       
+
+        for (i = 0; i < n; i++)
+        {
+          x3 = &x3_start[i * 16];
+
+
+          uX1 = &umpX1[16 * tipX1[i]];
+          uX2 = &umpX2[16 * tipX2[i]];                      
+
+          for (j = 0; j < 4; j++)
+          {                                                                                
+            __m128d uX1_k0_sse = _mm_load_pd( &uX1[j * 4] );
+            __m128d uX1_k2_sse = _mm_load_pd( &uX1[j * 4 + 2] );
+
+
+            __m128d uX2_k0_sse = _mm_load_pd( &uX2[j * 4] );
+            __m128d uX2_k2_sse = _mm_load_pd( &uX2[j * 4 + 2] );
+
+
+            //
+            // multiply left * right
+            //
+
+            __m128d x1px2_k0 = _mm_mul_pd( uX1_k0_sse, uX2_k0_sse );
+            __m128d x1px2_k2 = _mm_mul_pd( uX1_k2_sse, uX2_k2_sse );
+
+
+            //
+            // multiply with EV matrix (!?)
+            //
+
+            __m128d EV_t_l0_k0 = EVV[0];
+            __m128d EV_t_l0_k2 = EVV[1];
+            __m128d EV_t_l1_k0 = EVV[2];
+            __m128d EV_t_l1_k2 = EVV[3];
+            __m128d EV_t_l2_k0 = EVV[4];
+            __m128d EV_t_l2_k2 = EVV[5];
+            __m128d EV_t_l3_k0 = EVV[6]; 
+            __m128d EV_t_l3_k2 = EVV[7];
+
+            EV_t_l0_k0 = _mm_mul_pd( x1px2_k0, EV_t_l0_k0 );
+            EV_t_l0_k2 = _mm_mul_pd( x1px2_k2, EV_t_l0_k2 );
+            EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l0_k2 );
+
+            EV_t_l1_k0 = _mm_mul_pd( x1px2_k0, EV_t_l1_k0 );
+            EV_t_l1_k2 = _mm_mul_pd( x1px2_k2, EV_t_l1_k2 );
+
+            EV_t_l1_k0 = _mm_hadd_pd( EV_t_l1_k0, EV_t_l1_k2 );
+            EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l1_k0 );
+
+            EV_t_l2_k0 = _mm_mul_pd( x1px2_k0, EV_t_l2_k0 );
+            EV_t_l2_k2 = _mm_mul_pd( x1px2_k2, EV_t_l2_k2 );
+            EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l2_k2 );
+
+            EV_t_l3_k0 = _mm_mul_pd( x1px2_k0, EV_t_l3_k0 );
+            EV_t_l3_k2 = _mm_mul_pd( x1px2_k2, EV_t_l3_k2 );
+            EV_t_l3_k0 = _mm_hadd_pd( EV_t_l3_k0, EV_t_l3_k2 );
+
+            EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l3_k0 );
+
+            _mm_store_pd( &x3[j * 4 + 0], EV_t_l0_k0 );
+            _mm_store_pd( &x3[j * 4 + 2], EV_t_l2_k0 );
+          }
+        }
+      }
+      break;
+    case PLL_TIP_INNER:
+      { 
+        double *uX1, umpX1[256] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+
+        for (i = 1; i < 16; i++)
+        {
+          __m128d x1_1 = _mm_load_pd(&(tipVector[i*4]));
+          __m128d x1_2 = _mm_load_pd(&(tipVector[i*4 + 2]));       
+
+          for (j = 0; j < 4; j++)
+            for (k = 0; k < 4; k++)
+            {            
+              __m128d left1 = _mm_load_pd(&left[j*16 + k*4]);
+              __m128d left2 = _mm_load_pd(&left[j*16 + k*4 + 2]);
+
+              __m128d acc = _mm_setzero_pd();
+
+              acc = _mm_add_pd(acc, _mm_mul_pd(left1, x1_1));
+              acc = _mm_add_pd(acc, _mm_mul_pd(left2, x1_2));
+
+              acc = _mm_hadd_pd(acc, acc);
+              _mm_storel_pd(&umpX1[i*16 + j*4 + k], acc);                
+            }
+        }
+
+        for (i = 0; i < n; i++)
+        {
+          __m128d maxv =_mm_setzero_pd();
+
+          x2 = &x2_start[i * 16];
+          x3 = &x3_start[i * 16];
+
+          uX1 = &umpX1[16 * tipX1[i]];       
+
+          for (j = 0; j < 4; j++)
+          {
+
+            //
+            // multiply/add right side
+            //
+            double *x2_p = &x2[j*4];
+            double *right_k0_p = &right[j*16];
+            double *right_k1_p = &right[j*16 + 1*4];
+            double *right_k2_p = &right[j*16 + 2*4];
+            double *right_k3_p = &right[j*16 + 3*4];
+            __m128d x2_0 = _mm_load_pd( &x2_p[0] );
+            __m128d x2_2 = _mm_load_pd( &x2_p[2] );
+
+            __m128d right_k0_0 = _mm_load_pd( &right_k0_p[0] );
+            __m128d right_k0_2 = _mm_load_pd( &right_k0_p[2] );
+            __m128d right_k1_0 = _mm_load_pd( &right_k1_p[0] );
+            __m128d right_k1_2 = _mm_load_pd( &right_k1_p[2] );
+            __m128d right_k2_0 = _mm_load_pd( &right_k2_p[0] );
+            __m128d right_k2_2 = _mm_load_pd( &right_k2_p[2] );
+            __m128d right_k3_0 = _mm_load_pd( &right_k3_p[0] );
+            __m128d right_k3_2 = _mm_load_pd( &right_k3_p[2] );
+
+
+
+            right_k0_0 = _mm_mul_pd( x2_0, right_k0_0);
+            right_k0_2 = _mm_mul_pd( x2_2, right_k0_2);
+
+            right_k1_0 = _mm_mul_pd( x2_0, right_k1_0);
+            right_k1_2 = _mm_mul_pd( x2_2, right_k1_2);
+
+            right_k0_0 = _mm_hadd_pd( right_k0_0, right_k0_2);
+            right_k1_0 = _mm_hadd_pd( right_k1_0, right_k1_2);
+            right_k0_0 = _mm_hadd_pd( right_k0_0, right_k1_0);
+
+
+            right_k2_0 = _mm_mul_pd( x2_0, right_k2_0);
+            right_k2_2 = _mm_mul_pd( x2_2, right_k2_2);
+
+
+            right_k3_0 = _mm_mul_pd( x2_0, right_k3_0);
+            right_k3_2 = _mm_mul_pd( x2_2, right_k3_2);
+
+            right_k2_0 = _mm_hadd_pd( right_k2_0, right_k2_2);
+            right_k3_0 = _mm_hadd_pd( right_k3_0, right_k3_2);
+            right_k2_0 = _mm_hadd_pd( right_k2_0, right_k3_0);
+
+            {
+              //
+              // load left side from tip vector
+              //
+
+              __m128d uX1_k0_sse = _mm_load_pd( &uX1[j * 4] );
+              __m128d uX1_k2_sse = _mm_load_pd( &uX1[j * 4 + 2] );
+
+
+              //
+              // multiply left * right
+              //
+
+              __m128d x1px2_k0 = _mm_mul_pd( uX1_k0_sse, right_k0_0 );
+              __m128d x1px2_k2 = _mm_mul_pd( uX1_k2_sse, right_k2_0 );
+
+
+              //
+              // multiply with EV matrix (!?)
+              //                                  
+
+              __m128d EV_t_l0_k0 = EVV[0];
+              __m128d EV_t_l0_k2 = EVV[1];
+              __m128d EV_t_l1_k0 = EVV[2];
+              __m128d EV_t_l1_k2 = EVV[3];
+              __m128d EV_t_l2_k0 = EVV[4];
+              __m128d EV_t_l2_k2 = EVV[5];
+              __m128d EV_t_l3_k0 = EVV[6]; 
+              __m128d EV_t_l3_k2 = EVV[7];
+
+
+              EV_t_l0_k0 = _mm_mul_pd( x1px2_k0, EV_t_l0_k0 );
+              EV_t_l0_k2 = _mm_mul_pd( x1px2_k2, EV_t_l0_k2 );
+              EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l0_k2 );
+
+              EV_t_l1_k0 = _mm_mul_pd( x1px2_k0, EV_t_l1_k0 );
+              EV_t_l1_k2 = _mm_mul_pd( x1px2_k2, EV_t_l1_k2 );
+
+              EV_t_l1_k0 = _mm_hadd_pd( EV_t_l1_k0, EV_t_l1_k2 );
+              EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l1_k0 );
+
+              EV_t_l2_k0 = _mm_mul_pd( x1px2_k0, EV_t_l2_k0 );
+              EV_t_l2_k2 = _mm_mul_pd( x1px2_k2, EV_t_l2_k2 );
+              EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l2_k2 );
+
+              EV_t_l3_k0 = _mm_mul_pd( x1px2_k0, EV_t_l3_k0 );
+              EV_t_l3_k2 = _mm_mul_pd( x1px2_k2, EV_t_l3_k2 );
+              EV_t_l3_k0 = _mm_hadd_pd( EV_t_l3_k0, EV_t_l3_k2 );
+
+              EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l3_k0 );
+
+              values[j * 2]     = EV_t_l0_k0;
+              values[j * 2 + 1] = EV_t_l2_k0;                              
+
+              maxv = _mm_max_pd(maxv, _mm_and_pd(EV_t_l0_k0, absMask.m));
+              maxv = _mm_max_pd(maxv, _mm_and_pd(EV_t_l2_k0, absMask.m));                  
+            }
+          }
+
+
+          _mm_store_pd(maxima, maxv);
+
+          max = PLL_MAX(maxima[0], maxima[1]);
+
+          if(max < PLL_MINLIKELIHOOD)
+          {
+            __m128d sv = _mm_set1_pd(PLL_TWOTOTHE256);
+
+            _mm_store_pd(&x3[0], _mm_mul_pd(values[0], sv));       
+            _mm_store_pd(&x3[2], _mm_mul_pd(values[1], sv));
+            _mm_store_pd(&x3[4], _mm_mul_pd(values[2], sv));
+            _mm_store_pd(&x3[6], _mm_mul_pd(values[3], sv));
+            _mm_store_pd(&x3[8], _mm_mul_pd(values[4], sv));       
+            _mm_store_pd(&x3[10], _mm_mul_pd(values[5], sv));
+            _mm_store_pd(&x3[12], _mm_mul_pd(values[6], sv));
+            _mm_store_pd(&x3[14], _mm_mul_pd(values[7], sv));        
+
+             if(!fastScaling)
+               ex3[i] += 1;
+             else
+               addScale += wgt[i];
+
+          }
+          else
+          {
+            _mm_store_pd(&x3[0], values[0]);       
+            _mm_store_pd(&x3[2], values[1]);
+            _mm_store_pd(&x3[4], values[2]);
+            _mm_store_pd(&x3[6], values[3]);
+            _mm_store_pd(&x3[8], values[4]);       
+            _mm_store_pd(&x3[10], values[5]);
+            _mm_store_pd(&x3[12], values[6]);
+            _mm_store_pd(&x3[14], values[7]);
+          }
+        }
+      }
+      break;
+    case PLL_INNER_INNER:
+
+      for (i = 0; i < n; i++)
+      {
+        __m128d maxv =_mm_setzero_pd();
+
+
+        x1 = &x1_start[i * 16];
+        x2 = &x2_start[i * 16];
+        x3 = &x3_start[i * 16];
+
+        for (j = 0; j < 4; j++)
+        {
+
+          double *x1_p = &x1[j*4];
+          double *left_k0_p = &left[j*16];
+          double *left_k1_p = &left[j*16 + 1*4];
+          double *left_k2_p = &left[j*16 + 2*4];
+          double *left_k3_p = &left[j*16 + 3*4];
+
+          __m128d x1_0 = _mm_load_pd( &x1_p[0] );
+          __m128d x1_2 = _mm_load_pd( &x1_p[2] );
+
+          __m128d left_k0_0 = _mm_load_pd( &left_k0_p[0] );
+          __m128d left_k0_2 = _mm_load_pd( &left_k0_p[2] );
+          __m128d left_k1_0 = _mm_load_pd( &left_k1_p[0] );
+          __m128d left_k1_2 = _mm_load_pd( &left_k1_p[2] );
+          __m128d left_k2_0 = _mm_load_pd( &left_k2_p[0] );
+          __m128d left_k2_2 = _mm_load_pd( &left_k2_p[2] );
+          __m128d left_k3_0 = _mm_load_pd( &left_k3_p[0] );
+          __m128d left_k3_2 = _mm_load_pd( &left_k3_p[2] );
+
+          left_k0_0 = _mm_mul_pd(x1_0, left_k0_0);
+          left_k0_2 = _mm_mul_pd(x1_2, left_k0_2);
+
+          left_k1_0 = _mm_mul_pd(x1_0, left_k1_0);
+          left_k1_2 = _mm_mul_pd(x1_2, left_k1_2);
+
+          left_k0_0 = _mm_hadd_pd( left_k0_0, left_k0_2 );
+          left_k1_0 = _mm_hadd_pd( left_k1_0, left_k1_2);
+          left_k0_0 = _mm_hadd_pd( left_k0_0, left_k1_0);
+
+          left_k2_0 = _mm_mul_pd(x1_0, left_k2_0);
+          left_k2_2 = _mm_mul_pd(x1_2, left_k2_2);
+
+          left_k3_0 = _mm_mul_pd(x1_0, left_k3_0);
+          left_k3_2 = _mm_mul_pd(x1_2, left_k3_2);
+
+          left_k2_0 = _mm_hadd_pd( left_k2_0, left_k2_2);
+          left_k3_0 = _mm_hadd_pd( left_k3_0, left_k3_2);
+          left_k2_0 = _mm_hadd_pd( left_k2_0, left_k3_0);
+
+
+          //
+          // multiply/add right side
+          //
+          double *x2_p = &x2[j*4];
+          double *right_k0_p = &right[j*16];
+          double *right_k1_p = &right[j*16 + 1*4];
+          double *right_k2_p = &right[j*16 + 2*4];
+          double *right_k3_p = &right[j*16 + 3*4];
+          __m128d x2_0 = _mm_load_pd( &x2_p[0] );
+          __m128d x2_2 = _mm_load_pd( &x2_p[2] );
+
+          __m128d right_k0_0 = _mm_load_pd( &right_k0_p[0] );
+          __m128d right_k0_2 = _mm_load_pd( &right_k0_p[2] );
+          __m128d right_k1_0 = _mm_load_pd( &right_k1_p[0] );
+          __m128d right_k1_2 = _mm_load_pd( &right_k1_p[2] );
+          __m128d right_k2_0 = _mm_load_pd( &right_k2_p[0] );
+          __m128d right_k2_2 = _mm_load_pd( &right_k2_p[2] );
+          __m128d right_k3_0 = _mm_load_pd( &right_k3_p[0] );
+          __m128d right_k3_2 = _mm_load_pd( &right_k3_p[2] );
+
+          right_k0_0 = _mm_mul_pd( x2_0, right_k0_0);
+          right_k0_2 = _mm_mul_pd( x2_2, right_k0_2);
+
+          right_k1_0 = _mm_mul_pd( x2_0, right_k1_0);
+          right_k1_2 = _mm_mul_pd( x2_2, right_k1_2);
+
+          right_k0_0 = _mm_hadd_pd( right_k0_0, right_k0_2);
+          right_k1_0 = _mm_hadd_pd( right_k1_0, right_k1_2);
+          right_k0_0 = _mm_hadd_pd( right_k0_0, right_k1_0);
+
+          right_k2_0 = _mm_mul_pd( x2_0, right_k2_0);
+          right_k2_2 = _mm_mul_pd( x2_2, right_k2_2);
+
+
+          right_k3_0 = _mm_mul_pd( x2_0, right_k3_0);
+          right_k3_2 = _mm_mul_pd( x2_2, right_k3_2);
+
+          right_k2_0 = _mm_hadd_pd( right_k2_0, right_k2_2);
+          right_k3_0 = _mm_hadd_pd( right_k3_0, right_k3_2);
+          right_k2_0 = _mm_hadd_pd( right_k2_0, right_k3_0);       
+
+          //
+          // multiply left * right
+          //
+
+          __m128d x1px2_k0 = _mm_mul_pd( left_k0_0, right_k0_0 );
+          __m128d x1px2_k2 = _mm_mul_pd( left_k2_0, right_k2_0 );
+
+
+          //
+          // multiply with EV matrix (!?)
+          //         
+
+          __m128d EV_t_l0_k0 = EVV[0];
+          __m128d EV_t_l0_k2 = EVV[1];
+          __m128d EV_t_l1_k0 = EVV[2];
+          __m128d EV_t_l1_k2 = EVV[3];
+          __m128d EV_t_l2_k0 = EVV[4];
+          __m128d EV_t_l2_k2 = EVV[5];
+          __m128d EV_t_l3_k0 = EVV[6]; 
+          __m128d EV_t_l3_k2 = EVV[7];
+
+
+          EV_t_l0_k0 = _mm_mul_pd( x1px2_k0, EV_t_l0_k0 );
+          EV_t_l0_k2 = _mm_mul_pd( x1px2_k2, EV_t_l0_k2 );
+          EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l0_k2 );
+
+          EV_t_l1_k0 = _mm_mul_pd( x1px2_k0, EV_t_l1_k0 );
+          EV_t_l1_k2 = _mm_mul_pd( x1px2_k2, EV_t_l1_k2 );
+
+          EV_t_l1_k0 = _mm_hadd_pd( EV_t_l1_k0, EV_t_l1_k2 );
+          EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l1_k0 );
+
+          EV_t_l2_k0 = _mm_mul_pd( x1px2_k0, EV_t_l2_k0 );
+          EV_t_l2_k2 = _mm_mul_pd( x1px2_k2, EV_t_l2_k2 );
+          EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l2_k2 );
+
+
+          EV_t_l3_k0 = _mm_mul_pd( x1px2_k0, EV_t_l3_k0 );
+          EV_t_l3_k2 = _mm_mul_pd( x1px2_k2, EV_t_l3_k2 );
+          EV_t_l3_k0 = _mm_hadd_pd( EV_t_l3_k0, EV_t_l3_k2 );
+
+          EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l3_k0 );
+
+
+          values[j * 2] = EV_t_l0_k0;
+          values[j * 2 + 1] = EV_t_l2_k0;                           
+
+          maxv = _mm_max_pd(maxv, _mm_and_pd(EV_t_l0_k0, absMask.m));
+          maxv = _mm_max_pd(maxv, _mm_and_pd(EV_t_l2_k0, absMask.m));
+        }
+
+
+        _mm_store_pd(maxima, maxv);
+
+        max = PLL_MAX(maxima[0], maxima[1]);
+
+        if(max < PLL_MINLIKELIHOOD)
+        {
+          __m128d sv = _mm_set1_pd(PLL_TWOTOTHE256);
+
+          _mm_store_pd(&x3[0], _mm_mul_pd(values[0], sv));         
+          _mm_store_pd(&x3[2], _mm_mul_pd(values[1], sv));
+          _mm_store_pd(&x3[4], _mm_mul_pd(values[2], sv));
+          _mm_store_pd(&x3[6], _mm_mul_pd(values[3], sv));
+          _mm_store_pd(&x3[8], _mm_mul_pd(values[4], sv));         
+          _mm_store_pd(&x3[10], _mm_mul_pd(values[5], sv));
+          _mm_store_pd(&x3[12], _mm_mul_pd(values[6], sv));
+          _mm_store_pd(&x3[14], _mm_mul_pd(values[7], sv));          
+
+           if(!fastScaling)
+             ex3[i] += 1;
+           else
+             addScale += wgt[i];        
+        }
+        else
+        {
+          _mm_store_pd(&x3[0], values[0]);         
+          _mm_store_pd(&x3[2], values[1]);
+          _mm_store_pd(&x3[4], values[2]);
+          _mm_store_pd(&x3[6], values[3]);
+          _mm_store_pd(&x3[8], values[4]);         
+          _mm_store_pd(&x3[10], values[5]);
+          _mm_store_pd(&x3[12], values[6]);
+          _mm_store_pd(&x3[14], values[7]);
+        }        
+      }
+
+      break;
+    default:
+      assert(0);
+  }
+
+  if(fastScaling)
+    *scalerIncrement = addScale;
+}
+
+
+/** @ingroup group1
+ *  @brief Computation of conditional likelihood arrray for GTR CAT (Optimized SSE3 version for DNA data)
+
+    This is the SSE3 optimized version of ::newviewCAT_FLEX for computing the conditional
+    likelihood arrays at some node \a p, given child nodes \a q and \a r using the \b CAT
+    model of rate heterogeneity.
+
+    @note
+    For more details and function argument description check the function ::newviewCAT_FLEX
+*/
+static void newviewGTRCAT( int tipCase,  double *EV,  int *cptr,
+                           double *x1_start, double *x2_start,  double *x3_start, double *tipVector,
+                           int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                           int n,  double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling)
+{
+  double
+    *le,
+    *ri,
+    *x1,
+    *x2, 
+    *x3, 
+    EV_t[16] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+  int 
+    i, 
+    j, 
+    scale, 
+    addScale = 0;
+
+  __m128d
+    minlikelihood_sse = _mm_set1_pd( PLL_MINLIKELIHOOD ),
+                      sc = _mm_set1_pd(PLL_TWOTOTHE256),
+                      EVV[8];  
+
+  for(i = 0; i < 4; i++)
+    for (j=0; j < 4; j++)
+      EV_t[4 * j + i] = EV[4 * i + j];
+
+  for(i = 0; i < 8; i++)
+    EVV[i] = _mm_load_pd(&EV_t[i * 2]);
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:      
+      for (i = 0; i < n; i++)
+      {  
+        x1 = &(tipVector[4 * tipX1[i]]);
+        x2 = &(tipVector[4 * tipX2[i]]);
+
+        x3 = &x3_start[i * 4];
+
+        le =  &left[cptr[i] * 16];
+        ri =  &right[cptr[i] * 16];
+
+        __m128d x1_0 = _mm_load_pd( &x1[0] );
+        __m128d x1_2 = _mm_load_pd( &x1[2] );
+
+        __m128d left_k0_0 = _mm_load_pd( &le[0] );
+        __m128d left_k0_2 = _mm_load_pd( &le[2] );
+        __m128d left_k1_0 = _mm_load_pd( &le[4] );
+        __m128d left_k1_2 = _mm_load_pd( &le[6] );
+        __m128d left_k2_0 = _mm_load_pd( &le[8] );
+        __m128d left_k2_2 = _mm_load_pd( &le[10] );
+        __m128d left_k3_0 = _mm_load_pd( &le[12] );
+        __m128d left_k3_2 = _mm_load_pd( &le[14] );
+
+        left_k0_0 = _mm_mul_pd(x1_0, left_k0_0);
+        left_k0_2 = _mm_mul_pd(x1_2, left_k0_2);
+
+        left_k1_0 = _mm_mul_pd(x1_0, left_k1_0);
+        left_k1_2 = _mm_mul_pd(x1_2, left_k1_2);
+
+        left_k0_0 = _mm_hadd_pd( left_k0_0, left_k0_2 );
+        left_k1_0 = _mm_hadd_pd( left_k1_0, left_k1_2);
+        left_k0_0 = _mm_hadd_pd( left_k0_0, left_k1_0);
+
+        left_k2_0 = _mm_mul_pd(x1_0, left_k2_0);
+        left_k2_2 = _mm_mul_pd(x1_2, left_k2_2);
+
+        left_k3_0 = _mm_mul_pd(x1_0, left_k3_0);
+        left_k3_2 = _mm_mul_pd(x1_2, left_k3_2);
+
+        left_k2_0 = _mm_hadd_pd( left_k2_0, left_k2_2);
+        left_k3_0 = _mm_hadd_pd( left_k3_0, left_k3_2);
+        left_k2_0 = _mm_hadd_pd( left_k2_0, left_k3_0);
+
+        __m128d x2_0 = _mm_load_pd( &x2[0] );
+        __m128d x2_2 = _mm_load_pd( &x2[2] );
+
+        __m128d right_k0_0 = _mm_load_pd( &ri[0] );
+        __m128d right_k0_2 = _mm_load_pd( &ri[2] );
+        __m128d right_k1_0 = _mm_load_pd( &ri[4] );
+        __m128d right_k1_2 = _mm_load_pd( &ri[6] );
+        __m128d right_k2_0 = _mm_load_pd( &ri[8] );
+        __m128d right_k2_2 = _mm_load_pd( &ri[10] );
+        __m128d right_k3_0 = _mm_load_pd( &ri[12] );
+        __m128d right_k3_2 = _mm_load_pd( &ri[14] );
+
+        right_k0_0 = _mm_mul_pd( x2_0, right_k0_0);
+        right_k0_2 = _mm_mul_pd( x2_2, right_k0_2);
+
+        right_k1_0 = _mm_mul_pd( x2_0, right_k1_0);
+        right_k1_2 = _mm_mul_pd( x2_2, right_k1_2);
+
+        right_k0_0 = _mm_hadd_pd( right_k0_0, right_k0_2);
+        right_k1_0 = _mm_hadd_pd( right_k1_0, right_k1_2);
+        right_k0_0 = _mm_hadd_pd( right_k0_0, right_k1_0);
+
+        right_k2_0 = _mm_mul_pd( x2_0, right_k2_0);
+        right_k2_2 = _mm_mul_pd( x2_2, right_k2_2);
+
+        right_k3_0 = _mm_mul_pd( x2_0, right_k3_0);
+        right_k3_2 = _mm_mul_pd( x2_2, right_k3_2);
+
+        right_k2_0 = _mm_hadd_pd( right_k2_0, right_k2_2);
+        right_k3_0 = _mm_hadd_pd( right_k3_0, right_k3_2);
+        right_k2_0 = _mm_hadd_pd( right_k2_0, right_k3_0);         
+
+        __m128d x1px2_k0 = _mm_mul_pd( left_k0_0, right_k0_0 );
+        __m128d x1px2_k2 = _mm_mul_pd( left_k2_0, right_k2_0 );           
+
+        __m128d EV_t_l0_k0 = EVV[0];
+        __m128d EV_t_l0_k2 = EVV[1];
+        __m128d EV_t_l1_k0 = EVV[2];
+        __m128d EV_t_l1_k2 = EVV[3];
+        __m128d EV_t_l2_k0 = EVV[4];
+        __m128d EV_t_l2_k2 = EVV[5];
+        __m128d EV_t_l3_k0 = EVV[6];
+        __m128d EV_t_l3_k2 = EVV[7];
+
+        EV_t_l0_k0 = _mm_mul_pd( x1px2_k0, EV_t_l0_k0 );
+        EV_t_l0_k2 = _mm_mul_pd( x1px2_k2, EV_t_l0_k2 );
+        EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l0_k2 );
+
+        EV_t_l1_k0 = _mm_mul_pd( x1px2_k0, EV_t_l1_k0 );
+        EV_t_l1_k2 = _mm_mul_pd( x1px2_k2, EV_t_l1_k2 );
+
+        EV_t_l1_k0 = _mm_hadd_pd( EV_t_l1_k0, EV_t_l1_k2 );
+        EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l1_k0 );
+
+        EV_t_l2_k0 = _mm_mul_pd( x1px2_k0, EV_t_l2_k0 );
+        EV_t_l2_k2 = _mm_mul_pd( x1px2_k2, EV_t_l2_k2 );
+        EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l2_k2 );
+
+        EV_t_l3_k0 = _mm_mul_pd( x1px2_k0, EV_t_l3_k0 );
+        EV_t_l3_k2 = _mm_mul_pd( x1px2_k2, EV_t_l3_k2 );
+        EV_t_l3_k0 = _mm_hadd_pd( EV_t_l3_k0, EV_t_l3_k2 );
+
+        EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l3_k0 );      
+
+        _mm_store_pd(x3, EV_t_l0_k0);
+        _mm_store_pd(&x3[2], EV_t_l2_k0);                                   
+      }
+      break;
+    case PLL_TIP_INNER:      
+      for (i = 0; i < n; i++)
+      {
+        x1 = &(tipVector[4 * tipX1[i]]);
+        x2 = &x2_start[4 * i];
+        x3 = &x3_start[4 * i];
+
+        le =  &left[cptr[i] * 16];
+        ri =  &right[cptr[i] * 16];
+
+        __m128d x1_0 = _mm_load_pd( &x1[0] );
+        __m128d x1_2 = _mm_load_pd( &x1[2] );
+
+        __m128d left_k0_0 = _mm_load_pd( &le[0] );
+        __m128d left_k0_2 = _mm_load_pd( &le[2] );
+        __m128d left_k1_0 = _mm_load_pd( &le[4] );
+        __m128d left_k1_2 = _mm_load_pd( &le[6] );
+        __m128d left_k2_0 = _mm_load_pd( &le[8] );
+        __m128d left_k2_2 = _mm_load_pd( &le[10] );
+        __m128d left_k3_0 = _mm_load_pd( &le[12] );
+        __m128d left_k3_2 = _mm_load_pd( &le[14] );
+
+        left_k0_0 = _mm_mul_pd(x1_0, left_k0_0);
+        left_k0_2 = _mm_mul_pd(x1_2, left_k0_2);
+
+        left_k1_0 = _mm_mul_pd(x1_0, left_k1_0);
+        left_k1_2 = _mm_mul_pd(x1_2, left_k1_2);
+
+        left_k0_0 = _mm_hadd_pd( left_k0_0, left_k0_2 );
+        left_k1_0 = _mm_hadd_pd( left_k1_0, left_k1_2);
+        left_k0_0 = _mm_hadd_pd( left_k0_0, left_k1_0);
+
+        left_k2_0 = _mm_mul_pd(x1_0, left_k2_0);
+        left_k2_2 = _mm_mul_pd(x1_2, left_k2_2);
+
+        left_k3_0 = _mm_mul_pd(x1_0, left_k3_0);
+        left_k3_2 = _mm_mul_pd(x1_2, left_k3_2);
+
+        left_k2_0 = _mm_hadd_pd( left_k2_0, left_k2_2);
+        left_k3_0 = _mm_hadd_pd( left_k3_0, left_k3_2);
+        left_k2_0 = _mm_hadd_pd( left_k2_0, left_k3_0);
+
+        __m128d x2_0 = _mm_load_pd( &x2[0] );
+        __m128d x2_2 = _mm_load_pd( &x2[2] );
+
+        __m128d right_k0_0 = _mm_load_pd( &ri[0] );
+        __m128d right_k0_2 = _mm_load_pd( &ri[2] );
+        __m128d right_k1_0 = _mm_load_pd( &ri[4] );
+        __m128d right_k1_2 = _mm_load_pd( &ri[6] );
+        __m128d right_k2_0 = _mm_load_pd( &ri[8] );
+        __m128d right_k2_2 = _mm_load_pd( &ri[10] );
+        __m128d right_k3_0 = _mm_load_pd( &ri[12] );
+        __m128d right_k3_2 = _mm_load_pd( &ri[14] );
+
+        right_k0_0 = _mm_mul_pd( x2_0, right_k0_0);
+        right_k0_2 = _mm_mul_pd( x2_2, right_k0_2);
+
+        right_k1_0 = _mm_mul_pd( x2_0, right_k1_0);
+        right_k1_2 = _mm_mul_pd( x2_2, right_k1_2);
+
+        right_k0_0 = _mm_hadd_pd( right_k0_0, right_k0_2);
+        right_k1_0 = _mm_hadd_pd( right_k1_0, right_k1_2);
+        right_k0_0 = _mm_hadd_pd( right_k0_0, right_k1_0);
+
+        right_k2_0 = _mm_mul_pd( x2_0, right_k2_0);
+        right_k2_2 = _mm_mul_pd( x2_2, right_k2_2);
+
+        right_k3_0 = _mm_mul_pd( x2_0, right_k3_0);
+        right_k3_2 = _mm_mul_pd( x2_2, right_k3_2);
+
+        right_k2_0 = _mm_hadd_pd( right_k2_0, right_k2_2);
+        right_k3_0 = _mm_hadd_pd( right_k3_0, right_k3_2);
+        right_k2_0 = _mm_hadd_pd( right_k2_0, right_k3_0);         
+
+        __m128d x1px2_k0 = _mm_mul_pd( left_k0_0, right_k0_0 );
+        __m128d x1px2_k2 = _mm_mul_pd( left_k2_0, right_k2_0 );
+
+        __m128d EV_t_l0_k0 = EVV[0];
+        __m128d EV_t_l0_k2 = EVV[1];
+        __m128d EV_t_l1_k0 = EVV[2];
+        __m128d EV_t_l1_k2 = EVV[3];
+        __m128d EV_t_l2_k0 = EVV[4];
+        __m128d EV_t_l2_k2 = EVV[5];
+        __m128d EV_t_l3_k0 = EVV[6];
+        __m128d EV_t_l3_k2 = EVV[7];
+
+
+        EV_t_l0_k0 = _mm_mul_pd( x1px2_k0, EV_t_l0_k0 );
+        EV_t_l0_k2 = _mm_mul_pd( x1px2_k2, EV_t_l0_k2 );
+        EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l0_k2 );
+
+        EV_t_l1_k0 = _mm_mul_pd( x1px2_k0, EV_t_l1_k0 );
+        EV_t_l1_k2 = _mm_mul_pd( x1px2_k2, EV_t_l1_k2 );
+
+        EV_t_l1_k0 = _mm_hadd_pd( EV_t_l1_k0, EV_t_l1_k2 );
+        EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l1_k0 );
+
+        EV_t_l2_k0 = _mm_mul_pd( x1px2_k0, EV_t_l2_k0 );
+        EV_t_l2_k2 = _mm_mul_pd( x1px2_k2, EV_t_l2_k2 );
+        EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l2_k2 );
+
+        EV_t_l3_k0 = _mm_mul_pd( x1px2_k0, EV_t_l3_k0 );
+        EV_t_l3_k2 = _mm_mul_pd( x1px2_k2, EV_t_l3_k2 );
+        EV_t_l3_k0 = _mm_hadd_pd( EV_t_l3_k0, EV_t_l3_k2 );
+
+        EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l3_k0 );                                       
+
+        scale = 1;
+
+        __m128d v1 = _mm_and_pd(EV_t_l0_k0, absMask.m);
+        v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+        if(_mm_movemask_pd( v1 ) != 3)
+          scale = 0;
+        else
+        {
+          v1 = _mm_and_pd(EV_t_l2_k0, absMask.m);
+          v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+          if(_mm_movemask_pd( v1 ) != 3)
+            scale = 0;
+        }
+
+        if(scale)
+        {                     
+          _mm_store_pd(&x3[0], _mm_mul_pd(EV_t_l0_k0, sc));
+          _mm_store_pd(&x3[2], _mm_mul_pd(EV_t_l2_k0, sc));                   
+
+           if(!fastScaling)
+             ex3[i] += 1;
+           else
+             addScale += wgt[i];          
+        }       
+        else
+        {
+          _mm_store_pd(x3, EV_t_l0_k0);
+          _mm_store_pd(&x3[2], EV_t_l2_k0);
+        }
+
+
+      }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+      {
+        x1 = &x1_start[4 * i];
+        x2 = &x2_start[4 * i];
+        x3 = &x3_start[4 * i];
+
+        le =  &left[cptr[i] * 16];
+        ri =  &right[cptr[i] * 16];
+
+        __m128d x1_0 = _mm_load_pd( &x1[0] );
+        __m128d x1_2 = _mm_load_pd( &x1[2] );
+
+        __m128d left_k0_0 = _mm_load_pd( &le[0] );
+        __m128d left_k0_2 = _mm_load_pd( &le[2] );
+        __m128d left_k1_0 = _mm_load_pd( &le[4] );
+        __m128d left_k1_2 = _mm_load_pd( &le[6] );
+        __m128d left_k2_0 = _mm_load_pd( &le[8] );
+        __m128d left_k2_2 = _mm_load_pd( &le[10] );
+        __m128d left_k3_0 = _mm_load_pd( &le[12] );
+        __m128d left_k3_2 = _mm_load_pd( &le[14] );
+
+        left_k0_0 = _mm_mul_pd(x1_0, left_k0_0);
+        left_k0_2 = _mm_mul_pd(x1_2, left_k0_2);
+
+        left_k1_0 = _mm_mul_pd(x1_0, left_k1_0);
+        left_k1_2 = _mm_mul_pd(x1_2, left_k1_2);
+
+        left_k0_0 = _mm_hadd_pd( left_k0_0, left_k0_2 );
+        left_k1_0 = _mm_hadd_pd( left_k1_0, left_k1_2);
+        left_k0_0 = _mm_hadd_pd( left_k0_0, left_k1_0);
+
+        left_k2_0 = _mm_mul_pd(x1_0, left_k2_0);
+        left_k2_2 = _mm_mul_pd(x1_2, left_k2_2);
+
+        left_k3_0 = _mm_mul_pd(x1_0, left_k3_0);
+        left_k3_2 = _mm_mul_pd(x1_2, left_k3_2);
+
+        left_k2_0 = _mm_hadd_pd( left_k2_0, left_k2_2);
+        left_k3_0 = _mm_hadd_pd( left_k3_0, left_k3_2);
+        left_k2_0 = _mm_hadd_pd( left_k2_0, left_k3_0);
+
+        __m128d x2_0 = _mm_load_pd( &x2[0] );
+        __m128d x2_2 = _mm_load_pd( &x2[2] );
+
+        __m128d right_k0_0 = _mm_load_pd( &ri[0] );
+        __m128d right_k0_2 = _mm_load_pd( &ri[2] );
+        __m128d right_k1_0 = _mm_load_pd( &ri[4] );
+        __m128d right_k1_2 = _mm_load_pd( &ri[6] );
+        __m128d right_k2_0 = _mm_load_pd( &ri[8] );
+        __m128d right_k2_2 = _mm_load_pd( &ri[10] );
+        __m128d right_k3_0 = _mm_load_pd( &ri[12] );
+        __m128d right_k3_2 = _mm_load_pd( &ri[14] );
+
+        right_k0_0 = _mm_mul_pd( x2_0, right_k0_0);
+        right_k0_2 = _mm_mul_pd( x2_2, right_k0_2);
+
+        right_k1_0 = _mm_mul_pd( x2_0, right_k1_0);
+        right_k1_2 = _mm_mul_pd( x2_2, right_k1_2);
+
+        right_k0_0 = _mm_hadd_pd( right_k0_0, right_k0_2);
+        right_k1_0 = _mm_hadd_pd( right_k1_0, right_k1_2);
+        right_k0_0 = _mm_hadd_pd( right_k0_0, right_k1_0);
+
+        right_k2_0 = _mm_mul_pd( x2_0, right_k2_0);
+        right_k2_2 = _mm_mul_pd( x2_2, right_k2_2);
+
+        right_k3_0 = _mm_mul_pd( x2_0, right_k3_0);
+        right_k3_2 = _mm_mul_pd( x2_2, right_k3_2);
+
+        right_k2_0 = _mm_hadd_pd( right_k2_0, right_k2_2);
+        right_k3_0 = _mm_hadd_pd( right_k3_0, right_k3_2);
+        right_k2_0 = _mm_hadd_pd( right_k2_0, right_k3_0);         
+
+        __m128d x1px2_k0 = _mm_mul_pd( left_k0_0, right_k0_0 );
+        __m128d x1px2_k2 = _mm_mul_pd( left_k2_0, right_k2_0 );
+
+        __m128d EV_t_l0_k0 = EVV[0];
+        __m128d EV_t_l0_k2 = EVV[1];
+        __m128d EV_t_l1_k0 = EVV[2];
+        __m128d EV_t_l1_k2 = EVV[3];
+        __m128d EV_t_l2_k0 = EVV[4];
+        __m128d EV_t_l2_k2 = EVV[5];
+        __m128d EV_t_l3_k0 = EVV[6];
+        __m128d EV_t_l3_k2 = EVV[7];
+
+
+        EV_t_l0_k0 = _mm_mul_pd( x1px2_k0, EV_t_l0_k0 );
+        EV_t_l0_k2 = _mm_mul_pd( x1px2_k2, EV_t_l0_k2 );
+        EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l0_k2 );
+
+        EV_t_l1_k0 = _mm_mul_pd( x1px2_k0, EV_t_l1_k0 );
+        EV_t_l1_k2 = _mm_mul_pd( x1px2_k2, EV_t_l1_k2 );
+
+        EV_t_l1_k0 = _mm_hadd_pd( EV_t_l1_k0, EV_t_l1_k2 );
+        EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l1_k0 );
+
+        EV_t_l2_k0 = _mm_mul_pd( x1px2_k0, EV_t_l2_k0 );
+        EV_t_l2_k2 = _mm_mul_pd( x1px2_k2, EV_t_l2_k2 );
+        EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l2_k2 );
+
+        EV_t_l3_k0 = _mm_mul_pd( x1px2_k0, EV_t_l3_k0 );
+        EV_t_l3_k2 = _mm_mul_pd( x1px2_k2, EV_t_l3_k2 );
+        EV_t_l3_k0 = _mm_hadd_pd( EV_t_l3_k0, EV_t_l3_k2 );
+
+        EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l3_k0 );                                              
+
+        scale = 1;
+
+        __m128d v1 = _mm_and_pd(EV_t_l0_k0, absMask.m);
+        v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+        if(_mm_movemask_pd( v1 ) != 3)
+          scale = 0;
+        else
+        {
+          v1 = _mm_and_pd(EV_t_l2_k0, absMask.m);
+          v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+          if(_mm_movemask_pd( v1 ) != 3)
+            scale = 0;
+        }
+
+        if(scale)
+        {                     
+          _mm_store_pd(&x3[0], _mm_mul_pd(EV_t_l0_k0, sc));
+          _mm_store_pd(&x3[2], _mm_mul_pd(EV_t_l2_k0, sc));                   
+
+          if(!fastScaling)
+            ex3[i] += 1;
+          else
+            addScale += wgt[i];   
+        }       
+        else
+        {
+          _mm_store_pd(x3, EV_t_l0_k0);
+          _mm_store_pd(&x3[2], EV_t_l2_k0);
+        }
+
+      }
+      break;
+    default:
+      assert(0);
+  }
+
+  if(fastScaling)
+    *scalerIncrement = addScale;
+}
+#endif
+
+/** @brief Check whether the position \a pos in bitvector \a x is a gap
+    
+    @param x
+      A bitvector represented by unsigned integers
+
+    @param pos
+      Position to check in \a x if it is set (i.e. it is a gap) 
+
+    @return
+      Returns the value of the bit vector (\b 1 if set, \b 0 if not)
+*/
+#ifndef __clang__
+inline 
+#endif
+boolean isGap(unsigned int *x, int pos)
+{
+  return (x[pos / 32] & mask32[pos % 32]);
+}
+
+/** @brief Check whether the position \a pos in bitvector \a x is \b NOT a gap
+    
+    @param x
+      A bitvector represented by unsigned integers
+
+    @param pos
+      Position to check in \a x if it is \b NOT set (i.e. it is \b NOT a gap) 
+
+    @return
+      Returns the value of the bit vector (\b 1 if set, \b 0 if not)
+*/
+#ifndef __clang__
+inline 
+#endif
+boolean noGap(unsigned int *x, int pos)
+{
+  return (!(x[pos / 32] & mask32[pos % 32]));
+}
+
+#if (!defined(__AVX) && defined(__SSE3))
+/** @ingroup group1
+ *  @brief Computation of conditional likelihood arrray for GTR CAT with memory saving (Optimized SSE3 version for DNA data)
+
+    This is the SSE3 optimized version of ::newviewCAT_FLEX for computing the conditional
+    likelihood arrays at some node \a p, given child nodes \a q and \a r using the \b CAT
+    model of rate heterogeneity. The memory saving technique is incorporated.
+
+    @note
+    For more details and function argument description check the function ::newviewCAT_FLEX
+*/
+static void newviewGTRCAT_SAVE( int tipCase,  double *EV,  int *cptr,
+                                double *x1_start, double *x2_start,  double *x3_start, double *tipVector,
+                                int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                int n,  double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling,
+                                unsigned int *x1_gap, unsigned int *x2_gap, unsigned int *x3_gap,
+                                double *x1_gapColumn, double *x2_gapColumn, double *x3_gapColumn, const int maxCats)
+{
+  double
+    *le,
+    *ri,
+    *x1,
+    *x2,
+    *x3,
+    *x1_ptr = x1_start,
+    *x2_ptr = x2_start, 
+    *x3_ptr = x3_start, 
+    EV_t[16] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+  int 
+    i, 
+    j, 
+    scale, 
+    scaleGap = 0,
+    addScale = 0;
+
+  __m128d
+    minlikelihood_sse = _mm_set1_pd( PLL_MINLIKELIHOOD ),
+                      sc = _mm_set1_pd(PLL_TWOTOTHE256),
+                      EVV[8];  
+
+  for(i = 0; i < 4; i++)
+    for (j=0; j < 4; j++)
+      EV_t[4 * j + i] = EV[4 * i + j];
+
+  for(i = 0; i < 8; i++)
+    EVV[i] = _mm_load_pd(&EV_t[i * 2]);
+
+  {
+    x1 = x1_gapColumn;        
+    x2 = x2_gapColumn;
+    x3 = x3_gapColumn;
+
+    le =  &left[maxCats * 16];           
+    ri =  &right[maxCats * 16];                                                  
+
+    __m128d x1_0 = _mm_load_pd( &x1[0] );
+    __m128d x1_2 = _mm_load_pd( &x1[2] );
+
+    __m128d left_k0_0 = _mm_load_pd( &le[0] );
+    __m128d left_k0_2 = _mm_load_pd( &le[2] );
+    __m128d left_k1_0 = _mm_load_pd( &le[4] );
+    __m128d left_k1_2 = _mm_load_pd( &le[6] );
+    __m128d left_k2_0 = _mm_load_pd( &le[8] );
+    __m128d left_k2_2 = _mm_load_pd( &le[10] );
+    __m128d left_k3_0 = _mm_load_pd( &le[12] );
+    __m128d left_k3_2 = _mm_load_pd( &le[14] );
+
+    left_k0_0 = _mm_mul_pd(x1_0, left_k0_0);
+    left_k0_2 = _mm_mul_pd(x1_2, left_k0_2);
+
+    left_k1_0 = _mm_mul_pd(x1_0, left_k1_0);
+    left_k1_2 = _mm_mul_pd(x1_2, left_k1_2);
+
+    left_k0_0 = _mm_hadd_pd( left_k0_0, left_k0_2 );
+    left_k1_0 = _mm_hadd_pd( left_k1_0, left_k1_2);
+    left_k0_0 = _mm_hadd_pd( left_k0_0, left_k1_0);
+
+    left_k2_0 = _mm_mul_pd(x1_0, left_k2_0);
+    left_k2_2 = _mm_mul_pd(x1_2, left_k2_2);
+
+    left_k3_0 = _mm_mul_pd(x1_0, left_k3_0);
+    left_k3_2 = _mm_mul_pd(x1_2, left_k3_2);
+
+    left_k2_0 = _mm_hadd_pd( left_k2_0, left_k2_2);
+    left_k3_0 = _mm_hadd_pd( left_k3_0, left_k3_2);
+    left_k2_0 = _mm_hadd_pd( left_k2_0, left_k3_0);
+
+    __m128d x2_0 = _mm_load_pd( &x2[0] );
+    __m128d x2_2 = _mm_load_pd( &x2[2] );
+
+    __m128d right_k0_0 = _mm_load_pd( &ri[0] );
+    __m128d right_k0_2 = _mm_load_pd( &ri[2] );
+    __m128d right_k1_0 = _mm_load_pd( &ri[4] );
+    __m128d right_k1_2 = _mm_load_pd( &ri[6] );
+    __m128d right_k2_0 = _mm_load_pd( &ri[8] );
+    __m128d right_k2_2 = _mm_load_pd( &ri[10] );
+    __m128d right_k3_0 = _mm_load_pd( &ri[12] );
+    __m128d right_k3_2 = _mm_load_pd( &ri[14] );
+
+    right_k0_0 = _mm_mul_pd( x2_0, right_k0_0);
+    right_k0_2 = _mm_mul_pd( x2_2, right_k0_2);
+
+    right_k1_0 = _mm_mul_pd( x2_0, right_k1_0);
+    right_k1_2 = _mm_mul_pd( x2_2, right_k1_2);
+
+    right_k0_0 = _mm_hadd_pd( right_k0_0, right_k0_2);
+    right_k1_0 = _mm_hadd_pd( right_k1_0, right_k1_2);
+    right_k0_0 = _mm_hadd_pd( right_k0_0, right_k1_0);
+
+    right_k2_0 = _mm_mul_pd( x2_0, right_k2_0);
+    right_k2_2 = _mm_mul_pd( x2_2, right_k2_2);
+
+    right_k3_0 = _mm_mul_pd( x2_0, right_k3_0);
+    right_k3_2 = _mm_mul_pd( x2_2, right_k3_2);
+
+    right_k2_0 = _mm_hadd_pd( right_k2_0, right_k2_2);
+    right_k3_0 = _mm_hadd_pd( right_k3_0, right_k3_2);
+    right_k2_0 = _mm_hadd_pd( right_k2_0, right_k3_0);     
+
+    __m128d x1px2_k0 = _mm_mul_pd( left_k0_0, right_k0_0 );
+    __m128d x1px2_k2 = _mm_mul_pd( left_k2_0, right_k2_0 );
+
+    __m128d EV_t_l0_k0 = EVV[0];
+    __m128d EV_t_l0_k2 = EVV[1];
+    __m128d EV_t_l1_k0 = EVV[2];
+    __m128d EV_t_l1_k2 = EVV[3];
+    __m128d EV_t_l2_k0 = EVV[4];
+    __m128d EV_t_l2_k2 = EVV[5];
+    __m128d EV_t_l3_k0 = EVV[6];
+    __m128d EV_t_l3_k2 = EVV[7];
+
+    EV_t_l0_k0 = _mm_mul_pd( x1px2_k0, EV_t_l0_k0 );
+    EV_t_l0_k2 = _mm_mul_pd( x1px2_k2, EV_t_l0_k2 );
+    EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l0_k2 );
+
+    EV_t_l1_k0 = _mm_mul_pd( x1px2_k0, EV_t_l1_k0 );
+    EV_t_l1_k2 = _mm_mul_pd( x1px2_k2, EV_t_l1_k2 );
+
+    EV_t_l1_k0 = _mm_hadd_pd( EV_t_l1_k0, EV_t_l1_k2 );
+    EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l1_k0 );
+
+    EV_t_l2_k0 = _mm_mul_pd( x1px2_k0, EV_t_l2_k0 );
+    EV_t_l2_k2 = _mm_mul_pd( x1px2_k2, EV_t_l2_k2 );
+    EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l2_k2 );
+
+    EV_t_l3_k0 = _mm_mul_pd( x1px2_k0, EV_t_l3_k0 );
+    EV_t_l3_k2 = _mm_mul_pd( x1px2_k2, EV_t_l3_k2 );
+    EV_t_l3_k0 = _mm_hadd_pd( EV_t_l3_k0, EV_t_l3_k2 );
+
+    EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l3_k0 );                                   
+
+    if(tipCase != PLL_TIP_TIP)
+    {    
+      scale = 1;
+
+      __m128d v1 = _mm_and_pd(EV_t_l0_k0, absMask.m);
+      v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+      if(_mm_movemask_pd( v1 ) != 3)
+        scale = 0;
+      else
+      {
+        v1 = _mm_and_pd(EV_t_l2_k0, absMask.m);
+        v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+        if(_mm_movemask_pd( v1 ) != 3)
+          scale = 0;
+      }
+
+      if(scale)
+      {               
+        _mm_store_pd(&x3[0], _mm_mul_pd(EV_t_l0_k0, sc));
+        _mm_store_pd(&x3[2], _mm_mul_pd(EV_t_l2_k0, sc));                     
+
+        scaleGap = PLL_TRUE;       
+      } 
+      else
+      {
+        _mm_store_pd(x3, EV_t_l0_k0);
+        _mm_store_pd(&x3[2], EV_t_l2_k0);
+      }
+    }
+    else
+    {
+      _mm_store_pd(x3, EV_t_l0_k0);
+      _mm_store_pd(&x3[2], EV_t_l2_k0);
+    }
+  }
+
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:      
+      for (i = 0; i < n; i++)
+      {
+        if(noGap(x3_gap, i))
+        {
+          x1 = &(tipVector[4 * tipX1[i]]);
+          x2 = &(tipVector[4 * tipX2[i]]);
+
+          x3 = x3_ptr;
+
+          if(isGap(x1_gap, i))
+            le =  &left[maxCats * 16];
+          else            
+            le =  &left[cptr[i] * 16];    
+
+          if(isGap(x2_gap, i))
+            ri =  &right[maxCats * 16];
+          else            
+            ri =  &right[cptr[i] * 16];
+
+          __m128d x1_0 = _mm_load_pd( &x1[0] );
+          __m128d x1_2 = _mm_load_pd( &x1[2] );
+
+          __m128d left_k0_0 = _mm_load_pd( &le[0] );
+          __m128d left_k0_2 = _mm_load_pd( &le[2] );
+          __m128d left_k1_0 = _mm_load_pd( &le[4] );
+          __m128d left_k1_2 = _mm_load_pd( &le[6] );
+          __m128d left_k2_0 = _mm_load_pd( &le[8] );
+          __m128d left_k2_2 = _mm_load_pd( &le[10] );
+          __m128d left_k3_0 = _mm_load_pd( &le[12] );
+          __m128d left_k3_2 = _mm_load_pd( &le[14] );
+
+          left_k0_0 = _mm_mul_pd(x1_0, left_k0_0);
+          left_k0_2 = _mm_mul_pd(x1_2, left_k0_2);
+
+          left_k1_0 = _mm_mul_pd(x1_0, left_k1_0);
+          left_k1_2 = _mm_mul_pd(x1_2, left_k1_2);
+
+          left_k0_0 = _mm_hadd_pd( left_k0_0, left_k0_2 );
+          left_k1_0 = _mm_hadd_pd( left_k1_0, left_k1_2);
+          left_k0_0 = _mm_hadd_pd( left_k0_0, left_k1_0);
+
+          left_k2_0 = _mm_mul_pd(x1_0, left_k2_0);
+          left_k2_2 = _mm_mul_pd(x1_2, left_k2_2);
+
+          left_k3_0 = _mm_mul_pd(x1_0, left_k3_0);
+          left_k3_2 = _mm_mul_pd(x1_2, left_k3_2);
+
+          left_k2_0 = _mm_hadd_pd( left_k2_0, left_k2_2);
+          left_k3_0 = _mm_hadd_pd( left_k3_0, left_k3_2);
+          left_k2_0 = _mm_hadd_pd( left_k2_0, left_k3_0);
+
+          __m128d x2_0 = _mm_load_pd( &x2[0] );
+          __m128d x2_2 = _mm_load_pd( &x2[2] );
+
+          __m128d right_k0_0 = _mm_load_pd( &ri[0] );
+          __m128d right_k0_2 = _mm_load_pd( &ri[2] );
+          __m128d right_k1_0 = _mm_load_pd( &ri[4] );
+          __m128d right_k1_2 = _mm_load_pd( &ri[6] );
+          __m128d right_k2_0 = _mm_load_pd( &ri[8] );
+          __m128d right_k2_2 = _mm_load_pd( &ri[10] );
+          __m128d right_k3_0 = _mm_load_pd( &ri[12] );
+          __m128d right_k3_2 = _mm_load_pd( &ri[14] );
+
+          right_k0_0 = _mm_mul_pd( x2_0, right_k0_0);
+          right_k0_2 = _mm_mul_pd( x2_2, right_k0_2);
+
+          right_k1_0 = _mm_mul_pd( x2_0, right_k1_0);
+          right_k1_2 = _mm_mul_pd( x2_2, right_k1_2);
+
+          right_k0_0 = _mm_hadd_pd( right_k0_0, right_k0_2);
+          right_k1_0 = _mm_hadd_pd( right_k1_0, right_k1_2);
+          right_k0_0 = _mm_hadd_pd( right_k0_0, right_k1_0);
+
+          right_k2_0 = _mm_mul_pd( x2_0, right_k2_0);
+          right_k2_2 = _mm_mul_pd( x2_2, right_k2_2);
+
+          right_k3_0 = _mm_mul_pd( x2_0, right_k3_0);
+          right_k3_2 = _mm_mul_pd( x2_2, right_k3_2);
+
+          right_k2_0 = _mm_hadd_pd( right_k2_0, right_k2_2);
+          right_k3_0 = _mm_hadd_pd( right_k3_0, right_k3_2);
+          right_k2_0 = _mm_hadd_pd( right_k2_0, right_k3_0);       
+
+          __m128d x1px2_k0 = _mm_mul_pd( left_k0_0, right_k0_0 );
+          __m128d x1px2_k2 = _mm_mul_pd( left_k2_0, right_k2_0 );                 
+
+          __m128d EV_t_l0_k0 = EVV[0];
+          __m128d EV_t_l0_k2 = EVV[1];
+          __m128d EV_t_l1_k0 = EVV[2];
+          __m128d EV_t_l1_k2 = EVV[3];
+          __m128d EV_t_l2_k0 = EVV[4];
+          __m128d EV_t_l2_k2 = EVV[5];
+          __m128d EV_t_l3_k0 = EVV[6];
+          __m128d EV_t_l3_k2 = EVV[7];
+
+          EV_t_l0_k0 = _mm_mul_pd( x1px2_k0, EV_t_l0_k0 );
+          EV_t_l0_k2 = _mm_mul_pd( x1px2_k2, EV_t_l0_k2 );
+          EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l0_k2 );
+
+          EV_t_l1_k0 = _mm_mul_pd( x1px2_k0, EV_t_l1_k0 );
+          EV_t_l1_k2 = _mm_mul_pd( x1px2_k2, EV_t_l1_k2 );
+
+          EV_t_l1_k0 = _mm_hadd_pd( EV_t_l1_k0, EV_t_l1_k2 );
+          EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l1_k0 );
+
+          EV_t_l2_k0 = _mm_mul_pd( x1px2_k0, EV_t_l2_k0 );
+          EV_t_l2_k2 = _mm_mul_pd( x1px2_k2, EV_t_l2_k2 );
+          EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l2_k2 );
+
+          EV_t_l3_k0 = _mm_mul_pd( x1px2_k0, EV_t_l3_k0 );
+          EV_t_l3_k2 = _mm_mul_pd( x1px2_k2, EV_t_l3_k2 );
+          EV_t_l3_k0 = _mm_hadd_pd( EV_t_l3_k0, EV_t_l3_k2 );
+
+          EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l3_k0 );    
+
+          _mm_store_pd(x3, EV_t_l0_k0);
+          _mm_store_pd(&x3[2], EV_t_l2_k0);                                 
+
+          x3_ptr += 4;
+        }
+      }
+      break;
+    case PLL_TIP_INNER:      
+      for (i = 0; i < n; i++)
+      { 
+        if(isGap(x3_gap, i))
+        {
+          if(scaleGap)
+            {
+              if(!fastScaling)
+                ex3[i] += 1;
+              else
+                addScale += wgt[i];
+            }
+        }
+        else
+        {             
+          x1 = &(tipVector[4 * tipX1[i]]);
+
+          x2 = x2_ptr;
+          x3 = x3_ptr;
+
+          if(isGap(x1_gap, i))
+            le =  &left[maxCats * 16];
+          else
+            le =  &left[cptr[i] * 16];
+
+          if(isGap(x2_gap, i))
+          {              
+            ri =  &right[maxCats * 16];
+            x2 = x2_gapColumn;
+          }
+          else
+          {
+            ri =  &right[cptr[i] * 16];
+            x2 = x2_ptr;
+            x2_ptr += 4;
+          }                               
+
+          __m128d x1_0 = _mm_load_pd( &x1[0] );
+          __m128d x1_2 = _mm_load_pd( &x1[2] );
+
+          __m128d left_k0_0 = _mm_load_pd( &le[0] );
+          __m128d left_k0_2 = _mm_load_pd( &le[2] );
+          __m128d left_k1_0 = _mm_load_pd( &le[4] );
+          __m128d left_k1_2 = _mm_load_pd( &le[6] );
+          __m128d left_k2_0 = _mm_load_pd( &le[8] );
+          __m128d left_k2_2 = _mm_load_pd( &le[10] );
+          __m128d left_k3_0 = _mm_load_pd( &le[12] );
+          __m128d left_k3_2 = _mm_load_pd( &le[14] );
+
+          left_k0_0 = _mm_mul_pd(x1_0, left_k0_0);
+          left_k0_2 = _mm_mul_pd(x1_2, left_k0_2);
+
+          left_k1_0 = _mm_mul_pd(x1_0, left_k1_0);
+          left_k1_2 = _mm_mul_pd(x1_2, left_k1_2);
+
+          left_k0_0 = _mm_hadd_pd( left_k0_0, left_k0_2 );
+          left_k1_0 = _mm_hadd_pd( left_k1_0, left_k1_2);
+          left_k0_0 = _mm_hadd_pd( left_k0_0, left_k1_0);
+
+          left_k2_0 = _mm_mul_pd(x1_0, left_k2_0);
+          left_k2_2 = _mm_mul_pd(x1_2, left_k2_2);
+
+          left_k3_0 = _mm_mul_pd(x1_0, left_k3_0);
+          left_k3_2 = _mm_mul_pd(x1_2, left_k3_2);
+
+          left_k2_0 = _mm_hadd_pd( left_k2_0, left_k2_2);
+          left_k3_0 = _mm_hadd_pd( left_k3_0, left_k3_2);
+          left_k2_0 = _mm_hadd_pd( left_k2_0, left_k3_0);
+
+          __m128d x2_0 = _mm_load_pd( &x2[0] );
+          __m128d x2_2 = _mm_load_pd( &x2[2] );
+
+          __m128d right_k0_0 = _mm_load_pd( &ri[0] );
+          __m128d right_k0_2 = _mm_load_pd( &ri[2] );
+          __m128d right_k1_0 = _mm_load_pd( &ri[4] );
+          __m128d right_k1_2 = _mm_load_pd( &ri[6] );
+          __m128d right_k2_0 = _mm_load_pd( &ri[8] );
+          __m128d right_k2_2 = _mm_load_pd( &ri[10] );
+          __m128d right_k3_0 = _mm_load_pd( &ri[12] );
+          __m128d right_k3_2 = _mm_load_pd( &ri[14] );
+
+          right_k0_0 = _mm_mul_pd( x2_0, right_k0_0);
+          right_k0_2 = _mm_mul_pd( x2_2, right_k0_2);
+
+          right_k1_0 = _mm_mul_pd( x2_0, right_k1_0);
+          right_k1_2 = _mm_mul_pd( x2_2, right_k1_2);
+
+          right_k0_0 = _mm_hadd_pd( right_k0_0, right_k0_2);
+          right_k1_0 = _mm_hadd_pd( right_k1_0, right_k1_2);
+          right_k0_0 = _mm_hadd_pd( right_k0_0, right_k1_0);
+
+          right_k2_0 = _mm_mul_pd( x2_0, right_k2_0);
+          right_k2_2 = _mm_mul_pd( x2_2, right_k2_2);
+
+          right_k3_0 = _mm_mul_pd( x2_0, right_k3_0);
+          right_k3_2 = _mm_mul_pd( x2_2, right_k3_2);
+
+          right_k2_0 = _mm_hadd_pd( right_k2_0, right_k2_2);
+          right_k3_0 = _mm_hadd_pd( right_k3_0, right_k3_2);
+          right_k2_0 = _mm_hadd_pd( right_k2_0, right_k3_0);       
+
+          __m128d x1px2_k0 = _mm_mul_pd( left_k0_0, right_k0_0 );
+          __m128d x1px2_k2 = _mm_mul_pd( left_k2_0, right_k2_0 );
+
+          __m128d EV_t_l0_k0 = EVV[0];
+          __m128d EV_t_l0_k2 = EVV[1];
+          __m128d EV_t_l1_k0 = EVV[2];
+          __m128d EV_t_l1_k2 = EVV[3];
+          __m128d EV_t_l2_k0 = EVV[4];
+          __m128d EV_t_l2_k2 = EVV[5];
+          __m128d EV_t_l3_k0 = EVV[6];
+          __m128d EV_t_l3_k2 = EVV[7];
+
+
+          EV_t_l0_k0 = _mm_mul_pd( x1px2_k0, EV_t_l0_k0 );
+          EV_t_l0_k2 = _mm_mul_pd( x1px2_k2, EV_t_l0_k2 );
+          EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l0_k2 );
+
+          EV_t_l1_k0 = _mm_mul_pd( x1px2_k0, EV_t_l1_k0 );
+          EV_t_l1_k2 = _mm_mul_pd( x1px2_k2, EV_t_l1_k2 );
+
+          EV_t_l1_k0 = _mm_hadd_pd( EV_t_l1_k0, EV_t_l1_k2 );
+          EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l1_k0 );
+
+          EV_t_l2_k0 = _mm_mul_pd( x1px2_k0, EV_t_l2_k0 );
+          EV_t_l2_k2 = _mm_mul_pd( x1px2_k2, EV_t_l2_k2 );
+          EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l2_k2 );
+
+          EV_t_l3_k0 = _mm_mul_pd( x1px2_k0, EV_t_l3_k0 );
+          EV_t_l3_k2 = _mm_mul_pd( x1px2_k2, EV_t_l3_k2 );
+          EV_t_l3_k0 = _mm_hadd_pd( EV_t_l3_k0, EV_t_l3_k2 );
+
+          EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l3_k0 );                                     
+
+          scale = 1;
+
+          __m128d v1 = _mm_and_pd(EV_t_l0_k0, absMask.m);
+          v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+          if(_mm_movemask_pd( v1 ) != 3)
+            scale = 0;
+          else
+          {
+            v1 = _mm_and_pd(EV_t_l2_k0, absMask.m);
+            v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+            if(_mm_movemask_pd( v1 ) != 3)
+              scale = 0;
+          }
+
+          if(scale)
+          {                   
+            _mm_store_pd(&x3[0], _mm_mul_pd(EV_t_l0_k0, sc));
+            _mm_store_pd(&x3[2], _mm_mul_pd(EV_t_l2_k0, sc));                 
+            
+            if(!fastScaling)
+              ex3[i] += 1;
+            else
+              addScale += wgt[i];         
+          }     
+          else
+          {
+            _mm_store_pd(x3, EV_t_l0_k0);
+            _mm_store_pd(&x3[2], EV_t_l2_k0);
+          }
+
+          x3_ptr += 4;
+        }
+
+      }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+      { 
+        if(isGap(x3_gap, i))
+        {
+          if(scaleGap)
+            {
+              if(!fastScaling)
+                ex3[i] += 1;
+              else
+                addScale += wgt[i];
+            }
+        }
+        else
+        {            
+          x3 = x3_ptr;
+
+          if(isGap(x1_gap, i))
+          {
+            x1 = x1_gapColumn;
+            le =  &left[maxCats * 16];
+          }
+          else
+          {
+            le =  &left[cptr[i] * 16];
+            x1 = x1_ptr;
+            x1_ptr += 4;
+          }
+
+          if(isGap(x2_gap, i))  
+          {
+            x2 = x2_gapColumn;
+            ri =  &right[maxCats * 16];     
+          }
+          else
+          {
+            ri =  &right[cptr[i] * 16];
+            x2 = x2_ptr;
+            x2_ptr += 4;
+          }                               
+
+          __m128d x1_0 = _mm_load_pd( &x1[0] );
+          __m128d x1_2 = _mm_load_pd( &x1[2] );
+
+          __m128d left_k0_0 = _mm_load_pd( &le[0] );
+          __m128d left_k0_2 = _mm_load_pd( &le[2] );
+          __m128d left_k1_0 = _mm_load_pd( &le[4] );
+          __m128d left_k1_2 = _mm_load_pd( &le[6] );
+          __m128d left_k2_0 = _mm_load_pd( &le[8] );
+          __m128d left_k2_2 = _mm_load_pd( &le[10] );
+          __m128d left_k3_0 = _mm_load_pd( &le[12] );
+          __m128d left_k3_2 = _mm_load_pd( &le[14] );
+
+          left_k0_0 = _mm_mul_pd(x1_0, left_k0_0);
+          left_k0_2 = _mm_mul_pd(x1_2, left_k0_2);
+
+          left_k1_0 = _mm_mul_pd(x1_0, left_k1_0);
+          left_k1_2 = _mm_mul_pd(x1_2, left_k1_2);
+
+          left_k0_0 = _mm_hadd_pd( left_k0_0, left_k0_2 );
+          left_k1_0 = _mm_hadd_pd( left_k1_0, left_k1_2);
+          left_k0_0 = _mm_hadd_pd( left_k0_0, left_k1_0);
+
+          left_k2_0 = _mm_mul_pd(x1_0, left_k2_0);
+          left_k2_2 = _mm_mul_pd(x1_2, left_k2_2);
+
+          left_k3_0 = _mm_mul_pd(x1_0, left_k3_0);
+          left_k3_2 = _mm_mul_pd(x1_2, left_k3_2);
+
+          left_k2_0 = _mm_hadd_pd( left_k2_0, left_k2_2);
+          left_k3_0 = _mm_hadd_pd( left_k3_0, left_k3_2);
+          left_k2_0 = _mm_hadd_pd( left_k2_0, left_k3_0);
+
+          __m128d x2_0 = _mm_load_pd( &x2[0] );
+          __m128d x2_2 = _mm_load_pd( &x2[2] );
+
+          __m128d right_k0_0 = _mm_load_pd( &ri[0] );
+          __m128d right_k0_2 = _mm_load_pd( &ri[2] );
+          __m128d right_k1_0 = _mm_load_pd( &ri[4] );
+          __m128d right_k1_2 = _mm_load_pd( &ri[6] );
+          __m128d right_k2_0 = _mm_load_pd( &ri[8] );
+          __m128d right_k2_2 = _mm_load_pd( &ri[10] );
+          __m128d right_k3_0 = _mm_load_pd( &ri[12] );
+          __m128d right_k3_2 = _mm_load_pd( &ri[14] );
+
+          right_k0_0 = _mm_mul_pd( x2_0, right_k0_0);
+          right_k0_2 = _mm_mul_pd( x2_2, right_k0_2);
+
+          right_k1_0 = _mm_mul_pd( x2_0, right_k1_0);
+          right_k1_2 = _mm_mul_pd( x2_2, right_k1_2);
+
+          right_k0_0 = _mm_hadd_pd( right_k0_0, right_k0_2);
+          right_k1_0 = _mm_hadd_pd( right_k1_0, right_k1_2);
+          right_k0_0 = _mm_hadd_pd( right_k0_0, right_k1_0);
+
+          right_k2_0 = _mm_mul_pd( x2_0, right_k2_0);
+          right_k2_2 = _mm_mul_pd( x2_2, right_k2_2);
+
+          right_k3_0 = _mm_mul_pd( x2_0, right_k3_0);
+          right_k3_2 = _mm_mul_pd( x2_2, right_k3_2);
+
+          right_k2_0 = _mm_hadd_pd( right_k2_0, right_k2_2);
+          right_k3_0 = _mm_hadd_pd( right_k3_0, right_k3_2);
+          right_k2_0 = _mm_hadd_pd( right_k2_0, right_k3_0);       
+
+          __m128d x1px2_k0 = _mm_mul_pd( left_k0_0, right_k0_0 );
+          __m128d x1px2_k2 = _mm_mul_pd( left_k2_0, right_k2_0 );
+
+          __m128d EV_t_l0_k0 = EVV[0];
+          __m128d EV_t_l0_k2 = EVV[1];
+          __m128d EV_t_l1_k0 = EVV[2];
+          __m128d EV_t_l1_k2 = EVV[3];
+          __m128d EV_t_l2_k0 = EVV[4];
+          __m128d EV_t_l2_k2 = EVV[5];
+          __m128d EV_t_l3_k0 = EVV[6];
+          __m128d EV_t_l3_k2 = EVV[7];
+
+
+          EV_t_l0_k0 = _mm_mul_pd( x1px2_k0, EV_t_l0_k0 );
+          EV_t_l0_k2 = _mm_mul_pd( x1px2_k2, EV_t_l0_k2 );
+          EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l0_k2 );
+
+          EV_t_l1_k0 = _mm_mul_pd( x1px2_k0, EV_t_l1_k0 );
+          EV_t_l1_k2 = _mm_mul_pd( x1px2_k2, EV_t_l1_k2 );
+
+          EV_t_l1_k0 = _mm_hadd_pd( EV_t_l1_k0, EV_t_l1_k2 );
+          EV_t_l0_k0 = _mm_hadd_pd( EV_t_l0_k0, EV_t_l1_k0 );
+
+          EV_t_l2_k0 = _mm_mul_pd( x1px2_k0, EV_t_l2_k0 );
+          EV_t_l2_k2 = _mm_mul_pd( x1px2_k2, EV_t_l2_k2 );
+          EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l2_k2 );
+
+          EV_t_l3_k0 = _mm_mul_pd( x1px2_k0, EV_t_l3_k0 );
+          EV_t_l3_k2 = _mm_mul_pd( x1px2_k2, EV_t_l3_k2 );
+          EV_t_l3_k0 = _mm_hadd_pd( EV_t_l3_k0, EV_t_l3_k2 );
+
+          EV_t_l2_k0 = _mm_hadd_pd( EV_t_l2_k0, EV_t_l3_k0 );                                            
+
+          scale = 1;
+
+          __m128d v1 = _mm_and_pd(EV_t_l0_k0, absMask.m);
+          v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+          if(_mm_movemask_pd( v1 ) != 3)
+            scale = 0;
+          else
+          {
+            v1 = _mm_and_pd(EV_t_l2_k0, absMask.m);
+            v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+            if(_mm_movemask_pd( v1 ) != 3)
+              scale = 0;
+          }
+
+          if(scale)
+          {                   
+            _mm_store_pd(&x3[0], _mm_mul_pd(EV_t_l0_k0, sc));
+            _mm_store_pd(&x3[2], _mm_mul_pd(EV_t_l2_k0, sc));                 
+
+            if(!fastScaling)
+              ex3[i] += 1;
+            else
+              addScale += wgt[i];         
+          }     
+          else
+          {
+            _mm_store_pd(x3, EV_t_l0_k0);
+            _mm_store_pd(&x3[2], EV_t_l2_k0);
+          }
+
+          x3_ptr += 4;
+        }
+      }
+      break;
+    default:
+      assert(0);
+  }
+
+
+  if(fastScaling)
+    *scalerIncrement = addScale;
+}
+
+/** @ingroup group1
+ *  @brief Computation of conditional likelihood arrray for GTR GAMMA with memory saving (Optimized SSE3 version for AA data)
+
+    This is the SSE3 optimized version of ::newviewGAMMA_FLEX for computing the conditional
+    likelihood arrays at some node \a p, given child nodes \a q and \a r using the \b GAMMA
+    model of rate heterogeneity. The memory saving technique is incorporated.
+
+    @note
+    For more details and function argument description check the function ::newviewGAMMA_FLEX
+*/
+static void newviewGTRGAMMAPROT_GAPPED_SAVE(int tipCase,
+                                            double *x1, double *x2, double *x3, double *extEV, double *tipVector,
+                                            int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                            int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling,
+                                            unsigned int *x1_gap, unsigned int *x2_gap, unsigned int *x3_gap,  
+                                            double *x1_gapColumn, double *x2_gapColumn, double *x3_gapColumn
+                                            )
+{
+  double  *uX1, *uX2, *v;
+  double x1px2;
+  int  i, j, l, k, scale, addScale = 0,   
+       gapScaling = 0;
+  double 
+    *vl, *vr, *x1v, *x2v,
+    *x1_ptr = x1,
+    *x2_ptr = x2,
+    *x3_ptr = x3;
+
+
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      {
+        double umpX1[1840], umpX2[1840];
+
+        for(i = 0; i < 23; i++)
+        {
+          v = &(tipVector[20 * i]);
+
+          for(k = 0; k < 80; k++)
+          {
+            double *ll =  &left[k * 20];
+            double *rr =  &right[k * 20];
+
+            __m128d umpX1v = _mm_setzero_pd();
+            __m128d umpX2v = _mm_setzero_pd();
+
+            for(l = 0; l < 20; l+=2)
+            {
+              __m128d vv = _mm_load_pd(&v[l]);
+              umpX1v = _mm_add_pd(umpX1v, _mm_mul_pd(vv, _mm_load_pd(&ll[l])));
+              umpX2v = _mm_add_pd(umpX2v, _mm_mul_pd(vv, _mm_load_pd(&rr[l])));                                 
+            }
+
+            umpX1v = _mm_hadd_pd(umpX1v, umpX1v);
+            umpX2v = _mm_hadd_pd(umpX2v, umpX2v);
+
+            _mm_storel_pd(&umpX1[80 * i + k], umpX1v);
+            _mm_storel_pd(&umpX2[80 * i + k], umpX2v);
+          }
+        }
+
+        {
+          uX1 = &umpX1[1760];
+          uX2 = &umpX2[1760];
+
+          for(j = 0; j < 4; j++)
+          {
+            v = &x3_gapColumn[j * 20];
+
+            __m128d zero =  _mm_setzero_pd();
+            for(k = 0; k < 20; k+=2)                                
+              _mm_store_pd(&v[k], zero);
+
+            for(k = 0; k < 20; k++)
+            { 
+              double *eev = &extEV[k * 20];
+              x1px2 = uX1[j * 20 + k] * uX2[j * 20 + k];
+              __m128d x1px2v = _mm_set1_pd(x1px2);
+
+              for(l = 0; l < 20; l+=2)
+              {
+                __m128d vv = _mm_load_pd(&v[l]);
+                __m128d ee = _mm_load_pd(&eev[l]);
+
+                vv = _mm_add_pd(vv, _mm_mul_pd(x1px2v,ee));
+
+                _mm_store_pd(&v[l], vv);
+              }
+            }
+          }        
+        }       
+
+        for(i = 0; i < n; i++)
+        {
+          if(!(x3_gap[i / 32] & mask32[i % 32]))
+          {
+            uX1 = &umpX1[80 * tipX1[i]];
+            uX2 = &umpX2[80 * tipX2[i]];
+
+            for(j = 0; j < 4; j++)
+            {
+              v = &x3_ptr[j * 20];
+
+
+              __m128d zero =  _mm_setzero_pd();
+              for(k = 0; k < 20; k+=2)                              
+                _mm_store_pd(&v[k], zero);
+
+              for(k = 0; k < 20; k++)
+              { 
+                double *eev = &extEV[k * 20];
+                x1px2 = uX1[j * 20 + k] * uX2[j * 20 + k];
+                __m128d x1px2v = _mm_set1_pd(x1px2);
+
+                for(l = 0; l < 20; l+=2)
+                {
+                  __m128d vv = _mm_load_pd(&v[l]);
+                  __m128d ee = _mm_load_pd(&eev[l]);
+
+                  vv = _mm_add_pd(vv, _mm_mul_pd(x1px2v,ee));
+
+                  _mm_store_pd(&v[l], vv);
+                }
+              }
+            }      
+            x3_ptr += 80;
+          }
+        }
+      }
+      break;
+    case PLL_TIP_INNER:
+      {
+        double umpX1[1840], ump_x2[20];
+
+
+        for(i = 0; i < 23; i++)
+        {
+          v = &(tipVector[20 * i]);
+
+          for(k = 0; k < 80; k++)
+          {
+            double *ll =  &left[k * 20];
+
+            __m128d umpX1v = _mm_setzero_pd();
+
+            for(l = 0; l < 20; l+=2)
+            {
+              __m128d vv = _mm_load_pd(&v[l]);
+              umpX1v = _mm_add_pd(umpX1v, _mm_mul_pd(vv, _mm_load_pd(&ll[l])));                                                 
+            }
+
+            umpX1v = _mm_hadd_pd(umpX1v, umpX1v);                               
+            _mm_storel_pd(&umpX1[80 * i + k], umpX1v);          
+
+          }
+        }
+
+        {
+          uX1 = &umpX1[1760];
+
+          for(k = 0; k < 4; k++)
+          {
+            v = &(x2_gapColumn[k * 20]);
+
+            for(l = 0; l < 20; l++)
+            {              
+              double *r =  &right[k * 400 + l * 20];
+              __m128d ump_x2v = _mm_setzero_pd();           
+
+              for(j = 0; j < 20; j+= 2)
+              {
+                __m128d vv = _mm_load_pd(&v[j]);
+                __m128d rr = _mm_load_pd(&r[j]);
+                ump_x2v = _mm_add_pd(ump_x2v, _mm_mul_pd(vv, rr));
+              }
+
+              ump_x2v = _mm_hadd_pd(ump_x2v, ump_x2v);
+
+              _mm_storel_pd(&ump_x2[l], ump_x2v);                                    
+            }
+
+            v = &(x3_gapColumn[20 * k]);
+
+            __m128d zero =  _mm_setzero_pd();
+            for(l = 0; l < 20; l+=2)                                
+              _mm_store_pd(&v[l], zero);
+
+            for(l = 0; l < 20; l++)
+            {
+              double *eev = &extEV[l * 20];
+              x1px2 = uX1[k * 20 + l]  * ump_x2[l];
+              __m128d x1px2v = _mm_set1_pd(x1px2);
+
+              for(j = 0; j < 20; j+=2)
+              {
+                __m128d vv = _mm_load_pd(&v[j]);
+                __m128d ee = _mm_load_pd(&eev[j]);
+
+                vv = _mm_add_pd(vv, _mm_mul_pd(x1px2v,ee));
+
+                _mm_store_pd(&v[j], vv);
+              }                             
+            }                   
+
+          }
+
+          { 
+            v = x3_gapColumn;
+            __m128d minlikelihood_sse = _mm_set1_pd( PLL_MINLIKELIHOOD );
+
+            scale = 1;
+            for(l = 0; scale && (l < 80); l += 2)
+            {
+              __m128d vv = _mm_load_pd(&v[l]);
+              __m128d v1 = _mm_and_pd(vv, absMask.m);
+              v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+              if(_mm_movemask_pd( v1 ) != 3)
+                scale = 0;
+            }             
+          }
+
+
+          if (scale)
+          {
+            gapScaling = 1;
+            __m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+
+            for(l = 0; l < 80; l+=2)
+            {
+              __m128d ex3v = _mm_load_pd(&v[l]);                  
+              _mm_store_pd(&v[l], _mm_mul_pd(ex3v,twoto));      
+            }                                                          
+          }
+        }
+
+        for (i = 0; i < n; i++)
+        {           
+          if((x3_gap[i / 32] & mask32[i % 32]))
+          {            
+            if(gapScaling)
+            {   
+              if(!fastScaling)
+                ex3[i] += 1;
+              else
+                addScale += wgt[i];                  
+            }
+          }
+          else
+          {
+            uX1 = &umpX1[80 * tipX1[i]];
+
+            if(x2_gap[i / 32] & mask32[i % 32])
+              x2v = x2_gapColumn;
+            else
+            {
+              x2v = x2_ptr;
+              x2_ptr += 80;
+            }
+
+            for(k = 0; k < 4; k++)
+            {
+              v = &(x2v[k * 20]);
+
+              for(l = 0; l < 20; l++)
+              {            
+                double *r =  &right[k * 400 + l * 20];
+                __m128d ump_x2v = _mm_setzero_pd();         
+
+                for(j = 0; j < 20; j+= 2)
+                {
+                  __m128d vv = _mm_load_pd(&v[j]);
+                  __m128d rr = _mm_load_pd(&r[j]);
+                  ump_x2v = _mm_add_pd(ump_x2v, _mm_mul_pd(vv, rr));
+                }
+
+                ump_x2v = _mm_hadd_pd(ump_x2v, ump_x2v);
+
+                _mm_storel_pd(&ump_x2[l], ump_x2v);                                  
+              }
+
+              v = &x3_ptr[20 * k];
+
+              __m128d zero =  _mm_setzero_pd();
+              for(l = 0; l < 20; l+=2)                              
+                _mm_store_pd(&v[l], zero);
+
+              for(l = 0; l < 20; l++)
+              {
+                double *eev = &extEV[l * 20];
+                x1px2 = uX1[k * 20 + l]  * ump_x2[l];
+                __m128d x1px2v = _mm_set1_pd(x1px2);
+
+                for(j = 0; j < 20; j+=2)
+                {
+                  __m128d vv = _mm_load_pd(&v[j]);
+                  __m128d ee = _mm_load_pd(&eev[j]);
+
+                  vv = _mm_add_pd(vv, _mm_mul_pd(x1px2v,ee));
+
+                  _mm_store_pd(&v[j], vv);
+                }                                   
+              }                 
+
+            }
+
+
+            { 
+              v = x3_ptr;
+              __m128d minlikelihood_sse = _mm_set1_pd( PLL_MINLIKELIHOOD );
+
+              scale = 1;
+              for(l = 0; scale && (l < 80); l += 2)
+              {
+                __m128d vv = _mm_load_pd(&v[l]);
+                __m128d v1 = _mm_and_pd(vv, absMask.m);
+                v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+                if(_mm_movemask_pd( v1 ) != 3)
+                  scale = 0;
+              }           
+            }
+
+
+            if (scale)
+            {
+              __m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+
+              for(l = 0; l < 80; l+=2)
+              {
+                __m128d ex3v = _mm_load_pd(&v[l]);                
+                _mm_store_pd(&v[l], _mm_mul_pd(ex3v,twoto));    
+              }                           
+              
+              if(!fastScaling)
+                ex3[i] += 1;
+              else
+                addScale += wgt[i];                   
+            }
+
+            x3_ptr += 80;
+          }
+        }
+      }
+      break;
+    case PLL_INNER_INNER:
+      {
+        for(k = 0; k < 4; k++)
+        {
+          vl = &(x1_gapColumn[20 * k]);
+          vr = &(x2_gapColumn[20 * k]);
+          v =  &(x3_gapColumn[20 * k]);
+
+          __m128d zero =  _mm_setzero_pd();
+          for(l = 0; l < 20; l+=2)                                  
+            _mm_store_pd(&v[l], zero);
+
+          for(l = 0; l < 20; l++)
+          {              
+            {
+              __m128d al = _mm_setzero_pd();
+              __m128d ar = _mm_setzero_pd();
+
+              double *ll   = &left[k * 400 + l * 20];
+              double *rr   = &right[k * 400 + l * 20];
+              double *EVEV = &extEV[20 * l];
+
+              for(j = 0; j < 20; j+=2)
+              {
+                __m128d lv  = _mm_load_pd(&ll[j]);
+                __m128d rv  = _mm_load_pd(&rr[j]);
+                __m128d vll = _mm_load_pd(&vl[j]);
+                __m128d vrr = _mm_load_pd(&vr[j]);
+
+                al = _mm_add_pd(al, _mm_mul_pd(vll, lv));
+                ar = _mm_add_pd(ar, _mm_mul_pd(vrr, rv));
+              }                  
+
+              al = _mm_hadd_pd(al, al);
+              ar = _mm_hadd_pd(ar, ar);
+
+              al = _mm_mul_pd(al, ar);
+
+              for(j = 0; j < 20; j+=2)
+              {
+                __m128d vv  = _mm_load_pd(&v[j]);
+                __m128d EVV = _mm_load_pd(&EVEV[j]);
+
+                vv = _mm_add_pd(vv, _mm_mul_pd(al, EVV));
+
+                _mm_store_pd(&v[j], vv);
+              }                                           
+            }            
+
+          }
+        }
+
+
+        { 
+          v = x3_gapColumn;
+          __m128d minlikelihood_sse = _mm_set1_pd( PLL_MINLIKELIHOOD );
+
+          scale = 1;
+          for(l = 0; scale && (l < 80); l += 2)
+          {
+            __m128d vv = _mm_load_pd(&v[l]);
+            __m128d v1 = _mm_and_pd(vv, absMask.m);
+            v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+            if(_mm_movemask_pd( v1 ) != 3)
+              scale = 0;
+          }               
+        }
+
+        if (scale)
+        {
+          gapScaling = 1;
+          __m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+
+          for(l = 0; l < 80; l+=2)
+          {
+            __m128d ex3v = _mm_load_pd(&v[l]);            
+            _mm_store_pd(&v[l], _mm_mul_pd(ex3v,twoto));        
+          }                               
+
+
+        }
+      }
+
+      for (i = 0; i < n; i++)
+      {
+        if(x3_gap[i / 32] & mask32[i % 32])
+        {            
+          if(gapScaling)
+          {     
+            if(!fastScaling)
+              ex3[i] += 1;
+            else
+              addScale += wgt[i];                              
+          }
+        }
+        else
+        {
+          if(x1_gap[i / 32] & mask32[i % 32])
+            x1v = x1_gapColumn;
+          else
+          {
+            x1v = x1_ptr;
+            x1_ptr += 80;
+          }
+
+          if(x2_gap[i / 32] & mask32[i % 32])
+            x2v = x2_gapColumn;
+          else
+          {
+            x2v = x2_ptr;
+            x2_ptr += 80;
+          }
+
+          for(k = 0; k < 4; k++)
+          {
+            vl = &(x1v[20 * k]);
+            vr = &(x2v[20 * k]);
+            v =  &x3_ptr[20 * k];
+
+            __m128d zero =  _mm_setzero_pd();
+            for(l = 0; l < 20; l+=2)                                
+              _mm_store_pd(&v[l], zero);
+
+            for(l = 0; l < 20; l++)
+            {            
+              {
+                __m128d al = _mm_setzero_pd();
+                __m128d ar = _mm_setzero_pd();
+
+                double *ll   = &left[k * 400 + l * 20];
+                double *rr   = &right[k * 400 + l * 20];
+                double *EVEV = &extEV[20 * l];
+
+                for(j = 0; j < 20; j+=2)
+                {
+                  __m128d lv  = _mm_load_pd(&ll[j]);
+                  __m128d rv  = _mm_load_pd(&rr[j]);
+                  __m128d vll = _mm_load_pd(&vl[j]);
+                  __m128d vrr = _mm_load_pd(&vr[j]);
+
+                  al = _mm_add_pd(al, _mm_mul_pd(vll, lv));
+                  ar = _mm_add_pd(ar, _mm_mul_pd(vrr, rv));
+                }                
+
+                al = _mm_hadd_pd(al, al);
+                ar = _mm_hadd_pd(ar, ar);
+
+                al = _mm_mul_pd(al, ar);
+
+                for(j = 0; j < 20; j+=2)
+                {
+                  __m128d vv  = _mm_load_pd(&v[j]);
+                  __m128d EVV = _mm_load_pd(&EVEV[j]);
+
+                  vv = _mm_add_pd(vv, _mm_mul_pd(al, EVV));
+
+                  _mm_store_pd(&v[j], vv);
+                }                                                 
+              }          
+
+            }
+          }
+
+
+
+          { 
+            v = x3_ptr;
+            __m128d minlikelihood_sse = _mm_set1_pd( PLL_MINLIKELIHOOD );
+
+            scale = 1;
+            for(l = 0; scale && (l < 80); l += 2)
+            {
+              __m128d vv = _mm_load_pd(&v[l]);
+              __m128d v1 = _mm_and_pd(vv, absMask.m);
+              v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+              if(_mm_movemask_pd( v1 ) != 3)
+                scale = 0;
+            }             
+          }
+
+
+          if (scale)
+          {
+            __m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+
+            for(l = 0; l < 80; l+=2)
+            {
+              __m128d ex3v = _mm_load_pd(&v[l]);                  
+              _mm_store_pd(&v[l], _mm_mul_pd(ex3v,twoto));      
+            }                             
+
+            if(!fastScaling)
+              ex3[i] += 1;
+            else
+              addScale += wgt[i];                         
+          }
+          x3_ptr += 80;
+        }
+      }
+      break;
+    default:
+      assert(0);
+  }
+
+  if(fastScaling)
+    *scalerIncrement = addScale;  
+}
+
+
+
+/** @ingroup group1
+ *  @brief Computation of conditional likelihood arrray for GTR GAMMA (Optimized SSE3 version for AA data)
+
+    This is the SSE3 optimized version of ::newviewGAMMA_FLEX for computing the conditional
+    likelihood arrays at some node \a p, given child nodes \a q and \a r using the \b GAMMA
+    model of rate heterogeneity.
+
+    @note
+    For more details and function argument description check the function ::newviewGAMMA_FLEX
+*/
+static void newviewGTRGAMMAPROT(int tipCase,
+                                double *x1, double *x2, double *x3, double *extEV, double *tipVector,
+                                int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling)
+{
+  double  *uX1, *uX2, *v;
+  double x1px2;
+  int  i, j, l, k, scale, addScale = 0;
+  double *vl, *vr;
+
+
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      {
+        double umpX1[1840], umpX2[1840];
+
+        for(i = 0; i < 23; i++)
+        {
+          v = &(tipVector[20 * i]);
+
+          for(k = 0; k < 80; k++)
+          {
+            double *ll =  &left[k * 20];
+            double *rr =  &right[k * 20];
+
+            __m128d umpX1v = _mm_setzero_pd();
+            __m128d umpX2v = _mm_setzero_pd();
+
+            for(l = 0; l < 20; l+=2)
+            {
+              __m128d vv = _mm_load_pd(&v[l]);
+              umpX1v = _mm_add_pd(umpX1v, _mm_mul_pd(vv, _mm_load_pd(&ll[l])));
+              umpX2v = _mm_add_pd(umpX2v, _mm_mul_pd(vv, _mm_load_pd(&rr[l])));                                 
+            }
+
+            umpX1v = _mm_hadd_pd(umpX1v, umpX1v);
+            umpX2v = _mm_hadd_pd(umpX2v, umpX2v);
+
+            _mm_storel_pd(&umpX1[80 * i + k], umpX1v);
+            _mm_storel_pd(&umpX2[80 * i + k], umpX2v);
+
+          }
+        }
+
+        for(i = 0; i < n; i++)
+        {
+          uX1 = &umpX1[80 * tipX1[i]];
+          uX2 = &umpX2[80 * tipX2[i]];
+
+          for(j = 0; j < 4; j++)
+          {
+            v = &x3[i * 80 + j * 20];
+
+
+            __m128d zero =  _mm_setzero_pd();
+            for(k = 0; k < 20; k+=2)                                
+              _mm_store_pd(&v[k], zero);
+
+            for(k = 0; k < 20; k++)
+            { 
+              double *eev = &extEV[k * 20];
+              x1px2 = uX1[j * 20 + k] * uX2[j * 20 + k];
+              __m128d x1px2v = _mm_set1_pd(x1px2);
+
+              for(l = 0; l < 20; l+=2)
+              {
+                __m128d vv = _mm_load_pd(&v[l]);
+                __m128d ee = _mm_load_pd(&eev[l]);
+
+                vv = _mm_add_pd(vv, _mm_mul_pd(x1px2v,ee));
+
+                _mm_store_pd(&v[l], vv);
+              }
+            }
+
+
+          }        
+        }
+      }
+      break;
+    case PLL_TIP_INNER:
+      {
+        double umpX1[1840], ump_x2[20];
+
+
+        for(i = 0; i < 23; i++)
+        {
+          v = &(tipVector[20 * i]);
+
+          for(k = 0; k < 80; k++)
+          {
+            double *ll =  &left[k * 20];
+
+            __m128d umpX1v = _mm_setzero_pd();
+
+            for(l = 0; l < 20; l+=2)
+            {
+              __m128d vv = _mm_load_pd(&v[l]);
+              umpX1v = _mm_add_pd(umpX1v, _mm_mul_pd(vv, _mm_load_pd(&ll[l])));                                                 
+            }
+
+            umpX1v = _mm_hadd_pd(umpX1v, umpX1v);                               
+            _mm_storel_pd(&umpX1[80 * i + k], umpX1v);          
+
+
+          }
+        }
+
+        for (i = 0; i < n; i++)
+        {
+          uX1 = &umpX1[80 * tipX1[i]];
+
+          for(k = 0; k < 4; k++)
+          {
+            v = &(x2[80 * i + k * 20]);
+
+            for(l = 0; l < 20; l++)
+            {              
+              double *r =  &right[k * 400 + l * 20];
+              __m128d ump_x2v = _mm_setzero_pd();           
+
+              for(j = 0; j < 20; j+= 2)
+              {
+                __m128d vv = _mm_load_pd(&v[j]);
+                __m128d rr = _mm_load_pd(&r[j]);
+                ump_x2v = _mm_add_pd(ump_x2v, _mm_mul_pd(vv, rr));
+              }
+
+              ump_x2v = _mm_hadd_pd(ump_x2v, ump_x2v);
+
+              _mm_storel_pd(&ump_x2[l], ump_x2v);                                    
+            }
+
+            v = &(x3[80 * i + 20 * k]);
+
+            __m128d zero =  _mm_setzero_pd();
+            for(l = 0; l < 20; l+=2)                                
+              _mm_store_pd(&v[l], zero);
+
+            for(l = 0; l < 20; l++)
+            {
+              double *eev = &extEV[l * 20];
+              x1px2 = uX1[k * 20 + l]  * ump_x2[l];
+              __m128d x1px2v = _mm_set1_pd(x1px2);
+
+              for(j = 0; j < 20; j+=2)
+              {
+                __m128d vv = _mm_load_pd(&v[j]);
+                __m128d ee = _mm_load_pd(&eev[j]);
+
+                vv = _mm_add_pd(vv, _mm_mul_pd(x1px2v,ee));
+
+                _mm_store_pd(&v[j], vv);
+              }                             
+            }                   
+
+          }
+
+
+          { 
+            v = &(x3[80 * i]);
+            __m128d minlikelihood_sse = _mm_set1_pd( PLL_MINLIKELIHOOD );
+
+            scale = 1;
+            for(l = 0; scale && (l < 80); l += 2)
+            {
+              __m128d vv = _mm_load_pd(&v[l]);
+              __m128d v1 = _mm_and_pd(vv, absMask.m);
+              v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+              if(_mm_movemask_pd( v1 ) != 3)
+                scale = 0;
+            }             
+          }
+
+
+          if (scale)
+          {
+
+            __m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+
+            for(l = 0; l < 80; l+=2)
+            {
+              __m128d ex3v = _mm_load_pd(&v[l]);                  
+              _mm_store_pd(&v[l], _mm_mul_pd(ex3v,twoto));      
+            }                             
+
+
+            if(!fastScaling)
+              ex3[i] += 1;
+            else
+              addScale += wgt[i];
+
+          }
+        }
+      }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+      {
+        for(k = 0; k < 4; k++)
+        {
+          vl = &(x1[80 * i + 20 * k]);
+          vr = &(x2[80 * i + 20 * k]);
+          v =  &(x3[80 * i + 20 * k]);
+
+
+          __m128d zero =  _mm_setzero_pd();
+          for(l = 0; l < 20; l+=2)                                  
+            _mm_store_pd(&v[l], zero);
+
+
+          for(l = 0; l < 20; l++)
+          {              
+
+            {
+              __m128d al = _mm_setzero_pd();
+              __m128d ar = _mm_setzero_pd();
+
+              double *ll   = &left[k * 400 + l * 20];
+              double *rr   = &right[k * 400 + l * 20];
+              double *EVEV = &extEV[20 * l];
+
+              for(j = 0; j < 20; j+=2)
+              {
+                __m128d lv  = _mm_load_pd(&ll[j]);
+                __m128d rv  = _mm_load_pd(&rr[j]);
+                __m128d vll = _mm_load_pd(&vl[j]);
+                __m128d vrr = _mm_load_pd(&vr[j]);
+
+                al = _mm_add_pd(al, _mm_mul_pd(vll, lv));
+                ar = _mm_add_pd(ar, _mm_mul_pd(vrr, rv));
+              }                  
+
+              al = _mm_hadd_pd(al, al);
+              ar = _mm_hadd_pd(ar, ar);
+
+              al = _mm_mul_pd(al, ar);
+
+              for(j = 0; j < 20; j+=2)
+              {
+                __m128d vv  = _mm_load_pd(&v[j]);
+                __m128d EVV = _mm_load_pd(&EVEV[j]);
+
+                vv = _mm_add_pd(vv, _mm_mul_pd(al, EVV));
+
+                _mm_store_pd(&v[j], vv);
+              }                                           
+            }            
+
+          }
+        }
+
+
+
+        { 
+          v = &(x3[80 * i]);
+          __m128d minlikelihood_sse = _mm_set1_pd( PLL_MINLIKELIHOOD );
+
+          scale = 1;
+          for(l = 0; scale && (l < 80); l += 2)
+          {
+            __m128d vv = _mm_load_pd(&v[l]);
+            __m128d v1 = _mm_and_pd(vv, absMask.m);
+            v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+            if(_mm_movemask_pd( v1 ) != 3)
+              scale = 0;
+          }               
+        }
+
+
+        if (scale)
+        {
+
+          __m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+
+          for(l = 0; l < 80; l+=2)
+          {
+            __m128d ex3v = _mm_load_pd(&v[l]);            
+            _mm_store_pd(&v[l], _mm_mul_pd(ex3v,twoto));        
+          }                               
+
+
+          if(!fastScaling)
+            ex3[i] += 1;
+          else
+            addScale += wgt[i];
+        }
+      }
+      break;
+    default:
+      assert(0);
+  }
+
+  if(fastScaling)
+    *scalerIncrement = addScale;
+}
+
+
+
+/** @ingroup group1
+ *  @brief Computation of conditional likelihood arrray for GTR CAT (Optimized SSE3 version for AA data)
+
+    This is the SSE3 optimized version of ::newviewCAT_FLEX for computing the conditional
+    likelihood arrays at some node \a p, given child nodes \a q and \a r using the \b CAT
+    model of rate heterogeneity.
+
+    @note
+    For more details and function argument description check the function ::newviewCAT_FLEX
+*/
+static void newviewGTRCATPROT(int tipCase, double *extEV,
+                              int *cptr,
+                              double *x1, double *x2, double *x3, double *tipVector,
+                              int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                              int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling)
+{
+  double
+    *le, *ri, *v, *vl, *vr;
+
+  int i, l, j, scale, addScale = 0;
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      {
+        for (i = 0; i < n; i++)
+        {
+          le = &left[cptr[i] * 400];
+          ri = &right[cptr[i] * 400];
+
+          vl = &(tipVector[20 * tipX1[i]]);
+          vr = &(tipVector[20 * tipX2[i]]);
+          v  = &x3[20 * i];
+
+          for(l = 0; l < 20; l+=2)
+            _mm_store_pd(&v[l], _mm_setzero_pd());                      
+
+
+          for(l = 0; l < 20; l++)
+          {
+            __m128d x1v = _mm_setzero_pd();
+            __m128d x2v = _mm_setzero_pd();      
+            double 
+              *ev = &extEV[l * 20],
+              *lv = &le[l * 20],
+              *rv = &ri[l * 20];
+
+            for(j = 0; j < 20; j+=2)
+            {
+              x1v = _mm_add_pd(x1v, _mm_mul_pd(_mm_load_pd(&vl[j]), _mm_load_pd(&lv[j])));                  
+              x2v = _mm_add_pd(x2v, _mm_mul_pd(_mm_load_pd(&vr[j]), _mm_load_pd(&rv[j])));
+            }
+
+            x1v = _mm_hadd_pd(x1v, x1v);
+            x2v = _mm_hadd_pd(x2v, x2v);
+
+            x1v = _mm_mul_pd(x1v, x2v);
+
+            for(j = 0; j < 20; j+=2)
+            {
+              __m128d vv = _mm_load_pd(&v[j]);
+              vv = _mm_add_pd(vv, _mm_mul_pd(x1v, _mm_load_pd(&ev[j])));
+              _mm_store_pd(&v[j], vv);
+            }               
+
+          }        
+        }
+      }
+      break;
+    case PLL_TIP_INNER:
+      {
+        for (i = 0; i < n; i++)
+        {
+          le = &left[cptr[i] * 400];
+          ri = &right[cptr[i] * 400];
+
+          vl = &(tipVector[20 * tipX1[i]]);
+          vr = &x2[20 * i];
+          v  = &x3[20 * i];
+
+          for(l = 0; l < 20; l+=2)
+            _mm_store_pd(&v[l], _mm_setzero_pd());                      
+
+
+
+          for(l = 0; l < 20; l++)
+          {
+
+            __m128d x1v = _mm_setzero_pd();
+            __m128d x2v = _mm_setzero_pd();     
+            double 
+              *ev = &extEV[l * 20],
+              *lv = &le[l * 20],
+              *rv = &ri[l * 20];
+
+            for(j = 0; j < 20; j+=2)
+            {
+              x1v = _mm_add_pd(x1v, _mm_mul_pd(_mm_load_pd(&vl[j]), _mm_load_pd(&lv[j])));                  
+              x2v = _mm_add_pd(x2v, _mm_mul_pd(_mm_load_pd(&vr[j]), _mm_load_pd(&rv[j])));
+            }
+
+            x1v = _mm_hadd_pd(x1v, x1v);
+            x2v = _mm_hadd_pd(x2v, x2v);
+
+            x1v = _mm_mul_pd(x1v, x2v);
+
+            for(j = 0; j < 20; j+=2)
+            {
+              __m128d vv = _mm_load_pd(&v[j]);
+              vv = _mm_add_pd(vv, _mm_mul_pd(x1v, _mm_load_pd(&ev[j])));
+              _mm_store_pd(&v[j], vv);
+            }               
+
+          }
+
+          {         
+            __m128d minlikelihood_sse = _mm_set1_pd( PLL_MINLIKELIHOOD );
+
+            scale = 1;
+            for(l = 0; scale && (l < 20); l += 2)
+            {
+              __m128d vv = _mm_load_pd(&v[l]);
+              __m128d v1 = _mm_and_pd(vv, absMask.m);
+              v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+              if(_mm_movemask_pd( v1 ) != 3)
+                scale = 0;
+            }             
+          }
+
+
+          if(scale)
+          {
+
+            __m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+
+            for(l = 0; l < 20; l+=2)
+            {
+              __m128d ex3v = _mm_load_pd(&v[l]);
+              _mm_store_pd(&v[l], _mm_mul_pd(ex3v,twoto));                  
+            }
+
+            if(!fastScaling)
+              ex3[i] += 1;
+            else
+              addScale += wgt[i];         
+          }
+        }
+      }
+      break;
+    case PLL_INNER_INNER:
+      for(i = 0; i < n; i++)
+      {
+        le = &left[cptr[i] * 400];
+        ri = &right[cptr[i] * 400];
+
+        vl = &x1[20 * i];
+        vr = &x2[20 * i];
+        v = &x3[20 * i];
+
+
+        for(l = 0; l < 20; l+=2)
+          _mm_store_pd(&v[l], _mm_setzero_pd());                        
+
+
+        for(l = 0; l < 20; l++)
+        {
+
+          __m128d x1v = _mm_setzero_pd();
+          __m128d x2v = _mm_setzero_pd();
+          double 
+            *ev = &extEV[l * 20],
+            *lv = &le[l * 20],
+            *rv = &ri[l * 20];
+
+
+          for(j = 0; j < 20; j+=2)
+          {
+            x1v = _mm_add_pd(x1v, _mm_mul_pd(_mm_load_pd(&vl[j]), _mm_load_pd(&lv[j])));                    
+            x2v = _mm_add_pd(x2v, _mm_mul_pd(_mm_load_pd(&vr[j]), _mm_load_pd(&rv[j])));
+          }
+
+          x1v = _mm_hadd_pd(x1v, x1v);
+          x2v = _mm_hadd_pd(x2v, x2v);
+
+          x1v = _mm_mul_pd(x1v, x2v);
+
+          for(j = 0; j < 20; j+=2)
+          {
+            __m128d vv = _mm_load_pd(&v[j]);
+            vv = _mm_add_pd(vv, _mm_mul_pd(x1v, _mm_load_pd(&ev[j])));
+            _mm_store_pd(&v[j], vv);
+          }                 
+
+        }
+
+        {           
+          __m128d minlikelihood_sse = _mm_set1_pd( PLL_MINLIKELIHOOD );
+
+          scale = 1;
+          for(l = 0; scale && (l < 20); l += 2)
+          {
+            __m128d vv = _mm_load_pd(&v[l]);
+            __m128d v1 = _mm_and_pd(vv, absMask.m);
+            v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+            if(_mm_movemask_pd( v1 ) != 3)
+              scale = 0;
+          }               
+        }
+
+
+        if(scale)
+        {
+
+          __m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+
+          for(l = 0; l < 20; l+=2)
+          {
+            __m128d ex3v = _mm_load_pd(&v[l]);            
+            _mm_store_pd(&v[l], _mm_mul_pd(ex3v,twoto));        
+          }                               
+
+
+          if(!fastScaling)
+            ex3[i] += 1;
+          else
+            addScale += wgt[i];    
+        }
+      }
+      break;
+    default:
+      assert(0);
+  }
+
+  if(fastScaling)
+    *scalerIncrement = addScale;
+}
+
+/** @ingroup group1
+ *  @brief Computation of conditional likelihood arrray for GTR CAT with memory saving (Optimized SSE3 version for AA data)
+
+    This is the SSE3 optimized version of ::newviewCAT_FLEX for computing the conditional
+    likelihood arrays at some node \a p, given child nodes \a q and \a r using the \b CAT
+    model of rate heterogeneity.
+
+    @note
+    For more details and function argument description check the function ::newviewCAT_FLEX
+*/
+static void newviewGTRCATPROT_SAVE(int tipCase, double *extEV,
+                                   int *cptr,
+                                   double *x1, double *x2, double *x3, double *tipVector,
+                                   int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                   int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean fastScaling,
+                                   unsigned int *x1_gap, unsigned int *x2_gap, unsigned int *x3_gap,
+                                   double *x1_gapColumn, double *x2_gapColumn, double *x3_gapColumn, const int maxCats)
+{
+  double
+    *le, 
+    *ri, 
+    *v, 
+    *vl, 
+    *vr,
+    *x1_ptr = x1,
+    *x2_ptr = x2, 
+    *x3_ptr = x3;
+
+  int 
+    i, 
+    l, 
+    j, 
+    scale, 
+    scaleGap = 0,
+    addScale = 0;
+
+  {
+    vl = x1_gapColumn;        
+    vr = x2_gapColumn;
+    v = x3_gapColumn;
+
+    le = &left[maxCats * 400];
+    ri = &right[maxCats * 400];   
+
+    for(l = 0; l < 20; l+=2)
+      _mm_store_pd(&v[l], _mm_setzero_pd());                    
+
+    for(l = 0; l < 20; l++)
+    {
+      __m128d x1v = _mm_setzero_pd();
+      __m128d x2v = _mm_setzero_pd();
+      double 
+        *ev = &extEV[l * 20],
+        *lv = &le[l * 20],
+        *rv = &ri[l * 20];
+
+
+      for(j = 0; j < 20; j+=2)
+      {
+        x1v = _mm_add_pd(x1v, _mm_mul_pd(_mm_load_pd(&vl[j]), _mm_load_pd(&lv[j])));                
+        x2v = _mm_add_pd(x2v, _mm_mul_pd(_mm_load_pd(&vr[j]), _mm_load_pd(&rv[j])));
+      }
+
+      x1v = _mm_hadd_pd(x1v, x1v);
+      x2v = _mm_hadd_pd(x2v, x2v);
+
+      x1v = _mm_mul_pd(x1v, x2v);
+
+      for(j = 0; j < 20; j+=2)
+      {
+        __m128d vv = _mm_load_pd(&v[j]);
+        vv = _mm_add_pd(vv, _mm_mul_pd(x1v, _mm_load_pd(&ev[j])));
+        _mm_store_pd(&v[j], vv);
+      }                 
+    }
+
+    if(tipCase != PLL_TIP_TIP)
+    {       
+      __m128d minlikelihood_sse = _mm_set1_pd( PLL_MINLIKELIHOOD );
+
+      scale = 1;
+      for(l = 0; scale && (l < 20); l += 2)
+      {
+        __m128d vv = _mm_load_pd(&v[l]);
+        __m128d v1 = _mm_and_pd(vv, absMask.m);
+        v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+        if(_mm_movemask_pd( v1 ) != 3)
+          scale = 0;
+      }                 
+
+      if(scale)
+      {
+        __m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+
+        for(l = 0; l < 20; l+=2)
+        {
+          __m128d ex3v = _mm_load_pd(&v[l]);              
+          _mm_store_pd(&v[l], _mm_mul_pd(ex3v,twoto));  
+        }                                 
+
+        scaleGap = PLL_TRUE;       
+      }
+    }
+  }
+
+  switch(tipCase)
+  {
+    case PLL_TIP_TIP:
+      {
+        for (i = 0; i < n; i++)
+        {
+          if(noGap(x3_gap, i))
+          {             
+            vl = &(tipVector[20 * tipX1[i]]);
+            vr = &(tipVector[20 * tipX2[i]]);
+            v  = x3_ptr;
+
+            if(isGap(x1_gap, i))
+              le =  &left[maxCats * 400];
+            else                  
+              le =  &left[cptr[i] * 400];         
+
+            if(isGap(x2_gap, i))
+              ri =  &right[maxCats * 400];
+            else                  
+              ri =  &right[cptr[i] * 400];
+
+            for(l = 0; l < 20; l+=2)
+              _mm_store_pd(&v[l], _mm_setzero_pd());                    
+
+            for(l = 0; l < 20; l++)
+            {
+              __m128d x1v = _mm_setzero_pd();
+              __m128d x2v = _mm_setzero_pd();    
+              double 
+                *ev = &extEV[l * 20],
+                *lv = &le[l * 20],
+                *rv = &ri[l * 20];
+
+              for(j = 0; j < 20; j+=2)
+              {
+                x1v = _mm_add_pd(x1v, _mm_mul_pd(_mm_load_pd(&vl[j]), _mm_load_pd(&lv[j])));                
+                x2v = _mm_add_pd(x2v, _mm_mul_pd(_mm_load_pd(&vr[j]), _mm_load_pd(&rv[j])));
+              }
+
+              x1v = _mm_hadd_pd(x1v, x1v);
+              x2v = _mm_hadd_pd(x2v, x2v);
+
+              x1v = _mm_mul_pd(x1v, x2v);
+
+              for(j = 0; j < 20; j+=2)
+              {
+                __m128d vv = _mm_load_pd(&v[j]);
+                vv = _mm_add_pd(vv, _mm_mul_pd(x1v, _mm_load_pd(&ev[j])));
+                _mm_store_pd(&v[j], vv);
+              }            
+            }
+
+            x3_ptr += 20;
+
+          }   
+        }
+      }
+      break;
+    case PLL_TIP_INNER:
+      {
+        for (i = 0; i < n; i++)
+        {
+          if(isGap(x3_gap, i))
+          {
+            if(scaleGap)
+              {
+                if(!fastScaling)
+                  ex3[i] += 1;
+                else
+                  addScale += wgt[i];
+              }
+          }
+          else
+          {      
+            vl = &(tipVector[20 * tipX1[i]]);
+
+            vr = x2_ptr;
+            v = x3_ptr;
+
+            if(isGap(x1_gap, i))
+              le =  &left[maxCats * 400];
+            else
+              le =  &left[cptr[i] * 400];
+
+            if(isGap(x2_gap, i))
+            {            
+              ri =  &right[maxCats * 400];
+              vr = x2_gapColumn;
+            }
+            else
+            {
+              ri =  &right[cptr[i] * 400];
+              vr = x2_ptr;
+              x2_ptr += 20;
+            }                                             
+
+            for(l = 0; l < 20; l+=2)
+              _mm_store_pd(&v[l], _mm_setzero_pd());                               
+
+            for(l = 0; l < 20; l++)
+            {
+              __m128d x1v = _mm_setzero_pd();
+              __m128d x2v = _mm_setzero_pd();   
+              double 
+                *ev = &extEV[l * 20],
+                *lv = &le[l * 20],
+                *rv = &ri[l * 20];
+
+              for(j = 0; j < 20; j+=2)
+              {
+                x1v = _mm_add_pd(x1v, _mm_mul_pd(_mm_load_pd(&vl[j]), _mm_load_pd(&lv[j])));                
+                x2v = _mm_add_pd(x2v, _mm_mul_pd(_mm_load_pd(&vr[j]), _mm_load_pd(&rv[j])));
+              }
+
+              x1v = _mm_hadd_pd(x1v, x1v);
+              x2v = _mm_hadd_pd(x2v, x2v);
+
+              x1v = _mm_mul_pd(x1v, x2v);
+
+              for(j = 0; j < 20; j+=2)
+              {
+                __m128d vv = _mm_load_pd(&v[j]);
+                vv = _mm_add_pd(vv, _mm_mul_pd(x1v, _mm_load_pd(&ev[j])));
+                _mm_store_pd(&v[j], vv);
+              }             
+            }
+
+            {       
+              __m128d minlikelihood_sse = _mm_set1_pd( PLL_MINLIKELIHOOD );
+
+              scale = 1;
+              for(l = 0; scale && (l < 20); l += 2)
+              {
+                __m128d vv = _mm_load_pd(&v[l]);
+                __m128d v1 = _mm_and_pd(vv, absMask.m);
+                v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+                if(_mm_movemask_pd( v1 ) != 3)
+                  scale = 0;
+              }           
+            }
+
+
+            if(scale)
+            {
+              __m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+
+              for(l = 0; l < 20; l+=2)
+              {
+                __m128d ex3v = _mm_load_pd(&v[l]);
+                _mm_store_pd(&v[l], _mm_mul_pd(ex3v,twoto));                
+              }
+              
+              if(!fastScaling)
+                ex3[i] += 1;
+              else
+                addScale += wgt[i];       
+            }
+            x3_ptr += 20;
+          }
+        }
+      }
+      break;
+    case PLL_INNER_INNER:
+      for(i = 0; i < n; i++)
+      { 
+        if(isGap(x3_gap, i))
+        {
+          if(scaleGap)
+            {
+              if(!fastScaling)
+                ex3[i] += 1;
+              else
+                addScale += wgt[i];
+            }
+        }
+        else
+        {                    
+          v = x3_ptr;
+
+          if(isGap(x1_gap, i))
+          {
+            vl = x1_gapColumn;
+            le =  &left[maxCats * 400];
+          }
+          else
+          {
+            le =  &left[cptr[i] * 400];
+            vl = x1_ptr;
+            x1_ptr += 20;
+          }
+
+          if(isGap(x2_gap, i))  
+          {
+            vr = x2_gapColumn;
+            ri =  &right[maxCats * 400];            
+          }
+          else
+          {
+            ri =  &right[cptr[i] * 400];
+            vr = x2_ptr;
+            x2_ptr += 20;
+          }                               
+
+          for(l = 0; l < 20; l+=2)
+            _mm_store_pd(&v[l], _mm_setzero_pd());                      
+
+          for(l = 0; l < 20; l++)
+          {
+            __m128d x1v = _mm_setzero_pd();
+            __m128d x2v = _mm_setzero_pd();
+            double 
+              *ev = &extEV[l * 20],
+              *lv = &le[l * 20],
+              *rv = &ri[l * 20];
+
+            for(j = 0; j < 20; j+=2)
+            {
+              x1v = _mm_add_pd(x1v, _mm_mul_pd(_mm_load_pd(&vl[j]), _mm_load_pd(&lv[j])));                  
+              x2v = _mm_add_pd(x2v, _mm_mul_pd(_mm_load_pd(&vr[j]), _mm_load_pd(&rv[j])));
+            }
+
+            x1v = _mm_hadd_pd(x1v, x1v);
+            x2v = _mm_hadd_pd(x2v, x2v);
+
+            x1v = _mm_mul_pd(x1v, x2v);
+
+            for(j = 0; j < 20; j+=2)
+            {
+              __m128d vv = _mm_load_pd(&v[j]);
+              vv = _mm_add_pd(vv, _mm_mul_pd(x1v, _mm_load_pd(&ev[j])));
+              _mm_store_pd(&v[j], vv);
+            }               
+
+          }
+
+          {         
+            __m128d minlikelihood_sse = _mm_set1_pd( PLL_MINLIKELIHOOD );
+
+            scale = 1;
+            for(l = 0; scale && (l < 20); l += 2)
+            {
+              __m128d vv = _mm_load_pd(&v[l]);
+              __m128d v1 = _mm_and_pd(vv, absMask.m);
+              v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+              if(_mm_movemask_pd( v1 ) != 3)
+                scale = 0;
+            }             
+          }
+
+          if(scale)
+          {
+            __m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+
+            for(l = 0; l < 20; l+=2)
+            {
+              __m128d ex3v = _mm_load_pd(&v[l]);                  
+              _mm_store_pd(&v[l], _mm_mul_pd(ex3v,twoto));      
+            }                             
+
+            if(!fastScaling)
+              ex3[i] += 1;
+            else
+              addScale += wgt[i];          
+          }
+          x3_ptr += 20;
+        }
+      }
+      break;
+    default:
+      assert(0);
+  }
+
+  if(fastScaling)
+    *scalerIncrement = addScale;
+}
+
+
+/** @ingroup group1
+ *  @brief Computation of conditional likelihood arrray for the GTR GAMMA and for the LG4 model (Optimized SSE3 version for AA data)
+
+    This is the SSE3 optimized version of ::newviewGAMMA_FLEX for computing the conditional
+    likelihood arrays at some node \a p, given child nodes \a q and \a r using the \b GAMMA
+    model of rate heterogeneity and the LG4 model of evolution. Note that the original unoptimized
+    function does not incorporate the LG4 model.
+
+    @note
+    For more details and function argument description check the function ::newviewGAMMA_FLEX
+*/
+static void newviewGTRGAMMAPROT_LG4(int tipCase,
+                                    double *x1, double *x2, double *x3, double *extEV[4], double *tipVector[4],
+                                    int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                    int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling)
+{
+  double  *uX1, *uX2, *v;
+  double x1px2;
+  int  i, j, l, k, scale, addScale = 0;
+  double *vl, *vr;
+#ifndef __SSE3
+  double al, ar;
+#endif
+
+
+
+  switch(tipCase)
+    {
+    case PLL_TIP_TIP:
+      {
+        double umpX1[1840], umpX2[1840];
+
+        for(i = 0; i < 23; i++)
+          {
+           
+
+            for(k = 0; k < 80; k++)
+              {
+                
+                v = &(tipVector[k / 20][20 * i]);
+#ifdef __SSE3
+                double *ll =  &left[k * 20];
+                double *rr =  &right[k * 20];
+                
+                __m128d umpX1v = _mm_setzero_pd();
+                __m128d umpX2v = _mm_setzero_pd();
+
+                for(l = 0; l < 20; l+=2)
+                  {
+                    __m128d vv = _mm_load_pd(&v[l]);
+                    umpX1v = _mm_add_pd(umpX1v, _mm_mul_pd(vv, _mm_load_pd(&ll[l])));
+                    umpX2v = _mm_add_pd(umpX2v, _mm_mul_pd(vv, _mm_load_pd(&rr[l])));                                   
+                  }
+                
+                umpX1v = _mm_hadd_pd(umpX1v, umpX1v);
+                umpX2v = _mm_hadd_pd(umpX2v, umpX2v);
+                
+                _mm_storel_pd(&umpX1[80 * i + k], umpX1v);
+                _mm_storel_pd(&umpX2[80 * i + k], umpX2v);
+#else
+                umpX1[80 * i + k] = 0.0;
+                umpX2[80 * i + k] = 0.0;
+
+                for(l = 0; l < 20; l++)
+                  {
+                    umpX1[80 * i + k] +=  v[l] *  left[k * 20 + l];
+                    umpX2[80 * i + k] +=  v[l] * right[k * 20 + l];
+                  }
+#endif
+              }
+          }
+
+        for(i = 0; i < n; i++)
+          {
+            uX1 = &umpX1[80 * tipX1[i]];
+            uX2 = &umpX2[80 * tipX2[i]];
+
+            for(j = 0; j < 4; j++)
+              {
+                v = &x3[i * 80 + j * 20];
+
+#ifdef __SSE3
+                __m128d zero =  _mm_setzero_pd();
+                for(k = 0; k < 20; k+=2)                                    
+                  _mm_store_pd(&v[k], zero);
+
+                for(k = 0; k < 20; k++)
+                  { 
+                    double *eev = &extEV[j][k * 20];
+                    x1px2 = uX1[j * 20 + k] * uX2[j * 20 + k];
+                    __m128d x1px2v = _mm_set1_pd(x1px2);
+
+                    for(l = 0; l < 20; l+=2)
+                      {
+                        __m128d vv = _mm_load_pd(&v[l]);
+                        __m128d ee = _mm_load_pd(&eev[l]);
+
+                        vv = _mm_add_pd(vv, _mm_mul_pd(x1px2v,ee));
+                        
+                        _mm_store_pd(&v[l], vv);
+                      }
+                  }
+
+#else
+
+                for(k = 0; k < 20; k++)
+                  v[k] = 0.0;
+
+                for(k = 0; k < 20; k++)
+                  {                
+                    x1px2 = uX1[j * 20 + k] * uX2[j * 20 + k];
+                   
+                    for(l = 0; l < 20; l++)                                                     
+                      v[l] += x1px2 * extEV[j][20 * k + l];                  
+                  }
+#endif
+              }    
+          }
+      }
+      break;
+    case PLL_TIP_INNER:
+      {
+        double umpX1[1840], ump_x2[20];
+
+
+        for(i = 0; i < 23; i++)
+          {
+           
+
+            for(k = 0; k < 80; k++)
+              { 
+                v = &(tipVector[k / 20][20 * i]);
+#ifdef __SSE3
+                double *ll =  &left[k * 20];
+                                
+                __m128d umpX1v = _mm_setzero_pd();
+                
+                for(l = 0; l < 20; l+=2)
+                  {
+                    __m128d vv = _mm_load_pd(&v[l]);
+                    umpX1v = _mm_add_pd(umpX1v, _mm_mul_pd(vv, _mm_load_pd(&ll[l])));                                                   
+                  }
+                
+                umpX1v = _mm_hadd_pd(umpX1v, umpX1v);                           
+                _mm_storel_pd(&umpX1[80 * i + k], umpX1v);              
+#else       
+                umpX1[80 * i + k] = 0.0;
+
+                for(l = 0; l < 20; l++)
+                  umpX1[80 * i + k] +=  v[l] * left[k * 20 + l];
+#endif
+
+              }
+          }
+
+        for (i = 0; i < n; i++)
+          {
+            uX1 = &umpX1[80 * tipX1[i]];
+
+            for(k = 0; k < 4; k++)
+              {
+                v = &(x2[80 * i + k * 20]);
+#ifdef __SSE3              
+                for(l = 0; l < 20; l++)
+                  {                
+                    double *r =  &right[k * 400 + l * 20];
+                    __m128d ump_x2v = _mm_setzero_pd();     
+                    
+                    for(j = 0; j < 20; j+= 2)
+                      {
+                        __m128d vv = _mm_load_pd(&v[j]);
+                        __m128d rr = _mm_load_pd(&r[j]);
+                        ump_x2v = _mm_add_pd(ump_x2v, _mm_mul_pd(vv, rr));
+                      }
+                     
+                    ump_x2v = _mm_hadd_pd(ump_x2v, ump_x2v);
+                    
+                    _mm_storel_pd(&ump_x2[l], ump_x2v);                              
+                  }
+
+                v = &(x3[80 * i + 20 * k]);
+
+                __m128d zero =  _mm_setzero_pd();
+                for(l = 0; l < 20; l+=2)                                    
+                  _mm_store_pd(&v[l], zero);
+                  
+                for(l = 0; l < 20; l++)
+                  {
+                    double *eev = &extEV[k][l * 20];
+                    x1px2 = uX1[k * 20 + l]  * ump_x2[l];
+                    __m128d x1px2v = _mm_set1_pd(x1px2);
+                  
+                    for(j = 0; j < 20; j+=2)
+                      {
+                        __m128d vv = _mm_load_pd(&v[j]);
+                        __m128d ee = _mm_load_pd(&eev[j]);
+                        
+                        vv = _mm_add_pd(vv, _mm_mul_pd(x1px2v,ee));
+                        
+                        _mm_store_pd(&v[j], vv);
+                      }                             
+                  }                     
+#else
+                for(l = 0; l < 20; l++)
+                  {
+                    ump_x2[l] = 0.0;
+
+                    for(j = 0; j < 20; j++)
+                      ump_x2[l] += v[j] * right[k * 400 + l * 20 + j];
+                  }
+
+                v = &(x3[80 * i + 20 * k]);
+
+                for(l = 0; l < 20; l++)
+                  v[l] = 0;
+
+                for(l = 0; l < 20; l++)
+                  {
+                    x1px2 = uX1[k * 20 + l]  * ump_x2[l];
+                    for(j = 0; j < 20; j++)
+                      v[j] += x1px2 * extEV[k][l * 20  + j];
+                  }
+#endif
+              }
+           
+#ifdef __SSE3
+            { 
+              v = &(x3[80 * i]);
+              __m128d minlikelihood_sse = _mm_set1_pd( PLL_MINLIKELIHOOD );
+              
+              scale = 1;
+              for(l = 0; scale && (l < 80); l += 2)
+                {
+                  __m128d vv = _mm_load_pd(&v[l]);
+                  __m128d v1 = _mm_and_pd(vv, absMask.m);
+                  v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+                  if(_mm_movemask_pd( v1 ) != 3)
+                    scale = 0;
+                }                 
+            }
+#else
+            v = &x3[80 * i];
+            scale = 1;
+            for(l = 0; scale && (l < 80); l++)
+              scale = (PLL_ABS(v[l]) <  PLL_MINLIKELIHOOD );
+#endif
+
+            if (scale)
+              {
+#ifdef __SSE3
+               __m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+               
+               for(l = 0; l < 80; l+=2)
+                 {
+                   __m128d ex3v = _mm_load_pd(&v[l]);             
+                   _mm_store_pd(&v[l], _mm_mul_pd(ex3v,twoto)); 
+                 }                                
+#else
+                for(l = 0; l < 80; l++)
+                  v[l] *= PLL_TWOTOTHE256;
+#endif
+
+                if(useFastScaling)
+                  addScale += wgt[i];
+                else
+                  ex3[i]  += 1;        
+              }
+          }
+      }
+      break;
+    case PLL_INNER_INNER:
+      for (i = 0; i < n; i++)
+       {
+         for(k = 0; k < 4; k++)
+           {
+             vl = &(x1[80 * i + 20 * k]);
+             vr = &(x2[80 * i + 20 * k]);
+             v =  &(x3[80 * i + 20 * k]);
+
+#ifdef __SSE3
+             __m128d zero =  _mm_setzero_pd();
+             for(l = 0; l < 20; l+=2)                               
+               _mm_store_pd(&v[l], zero);
+#else
+             for(l = 0; l < 20; l++)
+               v[l] = 0;
+#endif
+
+             for(l = 0; l < 20; l++)
+               {                 
+#ifdef __SSE3
+                 {
+                   __m128d al = _mm_setzero_pd();
+                   __m128d ar = _mm_setzero_pd();
+
+                   double *ll   = &left[k * 400 + l * 20];
+                   double *rr   = &right[k * 400 + l * 20];
+                   double *EVEV = &extEV[k][20 * l];
+                   
+                   for(j = 0; j < 20; j+=2)
+                     {
+                       __m128d lv  = _mm_load_pd(&ll[j]);
+                       __m128d rv  = _mm_load_pd(&rr[j]);
+                       __m128d vll = _mm_load_pd(&vl[j]);
+                       __m128d vrr = _mm_load_pd(&vr[j]);
+                       
+                       al = _mm_add_pd(al, _mm_mul_pd(vll, lv));
+                       ar = _mm_add_pd(ar, _mm_mul_pd(vrr, rv));
+                     }                   
+                       
+                   al = _mm_hadd_pd(al, al);
+                   ar = _mm_hadd_pd(ar, ar);
+                   
+                   al = _mm_mul_pd(al, ar);
+
+                   for(j = 0; j < 20; j+=2)
+                     {
+                       __m128d vv  = _mm_load_pd(&v[j]);
+                       __m128d EVV = _mm_load_pd(&EVEV[j]);
+
+                       vv = _mm_add_pd(vv, _mm_mul_pd(al, EVV));
+
+                       _mm_store_pd(&v[j], vv);
+                     }                                            
+                 }               
+#else
+                 al = 0.0;
+                 ar = 0.0;
+
+                 for(j = 0; j < 20; j++)
+                   {
+                     al += vl[j] * left[k * 400 + l * 20 + j];
+                     ar += vr[j] * right[k * 400 + l * 20 + j];
+                   }
+
+                 x1px2 = al * ar;
+
+                 for(j = 0; j < 20; j++)
+                   v[j] += x1px2 * extEV[k][20 * l + j];
+#endif
+               }
+           }
+         
+
+#ifdef __SSE3
+         { 
+           v = &(x3[80 * i]);
+           __m128d minlikelihood_sse = _mm_set1_pd( PLL_MINLIKELIHOOD );
+           
+           scale = 1;
+           for(l = 0; scale && (l < 80); l += 2)
+             {
+               __m128d vv = _mm_load_pd(&v[l]);
+               __m128d v1 = _mm_and_pd(vv, absMask.m);
+               v1 = _mm_cmplt_pd(v1,  minlikelihood_sse);
+               if(_mm_movemask_pd( v1 ) != 3)
+                 scale = 0;
+             }            
+         }
+#else
+         v = &(x3[80 * i]);
+         scale = 1;
+         for(l = 0; scale && (l < 80); l++)
+           scale = ((PLL_ABS(v[l]) <  PLL_MINLIKELIHOOD ));
+#endif
+
+         if (scale)
+           {
+#ifdef __SSE3
+               __m128d twoto = _mm_set_pd(PLL_TWOTOTHE256, PLL_TWOTOTHE256);
+               
+               for(l = 0; l < 80; l+=2)
+                 {
+                   __m128d ex3v = _mm_load_pd(&v[l]);             
+                   _mm_store_pd(&v[l], _mm_mul_pd(ex3v,twoto)); 
+                 }                                
+#else        
+             for(l = 0; l < 80; l++)
+               v[l] *= PLL_TWOTOTHE256;
+#endif
+
+             if(useFastScaling)
+               addScale += wgt[i];
+             else
+               ex3[i]  += 1;      
+           }
+       }
+      break;
+    default:
+      assert(0);
+    }
+
+  if(useFastScaling)
+    *scalerIncrement = addScale;
+
+}
+#endif
+
+
diff --git a/lib/pll/optimizeModel.c b/lib/pll/optimizeModel.c
new file mode 100644
index 0000000..9b5514a
--- /dev/null
+++ b/lib/pll/optimizeModel.c
@@ -0,0 +1,2715 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file optimizeModel.c
+ *
+ * @brief Model optimization routines
+ */ 
+
+#include "mem_alloc.h"
+
+#ifndef WIN32
+#include <unistd.h>
+#endif
+
+#include <math.h>
+#include <time.h> 
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+
+#include "pll.h"
+#include "pllInternal.h"
+#include "globalVariables.h"
+
+static const double MNBRAK_GOLD =    1.618034;          /**< Golden ratio */
+static const double MNBRAK_TINY =      1.e-20;
+static const double MNBRAK_GLIMIT =     100.0;
+static const double BRENT_ZEPS  =       1.e-5;
+static const double BRENT_CGOLD =   0.3819660;
+
+extern int optimizeRatesInvocations;
+extern int optimizeAlphaInvocations;
+extern int optimizeInvarInvocations;
+extern char ratesFileName[1024];
+extern char lengthFileName[1024];
+extern char lengthFileNameModel[1024];
+/* extern char *protModels[PLL_NUM_PROT_MODELS]; */
+
+static void optParamGeneric(pllInstance *tr, partitionList * pr, double modelEpsilon, linkageList *ll, int numberOfModels, int rateNumber, double lim_inf, double lim_sup, int whichParameterType);
+// FLAG for easier debugging of model parameter optimization routines 
+
+//#define _DEBUG_MOD_OPT
+
+
+/*********************FUNCTIONS FOR EXACT MODEL OPTIMIZATION UNDER GTRGAMMA ***************************************/
+
+
+/* the following function is used to set rates in the Q matrix 
+   the data structure called symmetryVector is used to 
+   define the symmetries between rates as they are specified 
+   in some of the secondary structure substitution models that 
+   generally don't use GTR matrices but more restricted forms thereof */
+
+/** @brief Set a specific rate in the substitition matrix
+  *
+  * This function is used to set the \a position-th substitution rate of
+  * partition \a index to \a rate.
+  *
+  * @param pr
+  *   List of partitions
+  *
+  * @param model
+  *   Index of partition
+  *
+  * @param rate
+  *   The new value to which to set the specific substition rate
+  *
+  * @param posititon
+  *   The number of the substition rate
+  */
+static void setRateModel(partitionList *pr, int model, double rate, int position)
+{
+  int
+    states   = pr->partitionData[model]->states,
+    numRates = (states * states - states) / 2;
+
+  if(pr->partitionData[model]->dataType == PLL_DNA_DATA)
+    assert(position >= 0 && position < (numRates - 1));
+  else
+    assert(position >= 0 && position < numRates);
+
+  assert(pr->partitionData[model]->dataType != PLL_BINARY_DATA);
+
+  assert(rate >= PLL_RATE_MIN && rate <= PLL_RATE_MAX);
+
+  if(pr->partitionData[model]->nonGTR)
+    {    
+      int 
+        i, 
+        index    = pr->partitionData[model]->symmetryVector[position],
+        lastRate = pr->partitionData[model]->symmetryVector[numRates - 1];
+           
+      for(i = 0; i < numRates; i++)
+        {       
+          if(pr->partitionData[model]->symmetryVector[i] == index)
+            {
+              if(index == lastRate)
+                pr->partitionData[model]->substRates[i] = 1.0;
+              else
+                pr->partitionData[model]->substRates[i] = rate;      
+            }
+          
+          //printf("%f ", tr->partitionData[model].substRates[i]);
+        }
+      //printf("\n");
+    }
+  else
+    pr->partitionData[model]->substRates[position] = rate;
+}
+
+//LIBRARY: the only thing that we will need to do here is to 
+//replace linkList by a string and also add some error correction 
+//code
+
+/* 
+   the following three functions are used to link/unlink parameters 
+   between partitions. This should work in a generic way, however 
+   this is so far mainly used for linking unlinking GTR matrix parameter 
+   estimates across different protein data partitions.
+   Generally this mechanism can also be used for linking/inlinking alpha paremeters 
+   between partitions and the like.
+   However, all alpha parameter estimates for all partitions and GTR estimates for 
+   DNA partitions are unlinked by default. This is actually hard-coded 
+   in here. 
+*/
+
+/* initializwe a parameter linkage list for a certain parameter type (can be whatever).
+   the input is an integer vector that contaions NumberOfModels (numberOfPartitions) elements.
+
+   if we want to have all alpha parameters unlinked and have say 4 partitions the input 
+   vector would look like this: {0, 1, 2, 3}, if we want to link partitions 0 and 3 the vector 
+   should look like this: {0, 1, 2, 0} 
+*/
+
+
+
+
+
+
+/* dedicated helper function to initialize the linkage list, that is, essentiaylly compute 
+   the integer vector int *linkList used above for linking GTR models.
+   
+   Once again, this is hard-coded in RAxML, because users can not influence the linking.
+
+*/
+   
+
+/* free linkage list data structure */
+
+
+
+#define ALPHA_F 0
+#define RATE_F  1
+#define FREQ_F  2
+
+/** @brief Wrapper function for changing a specific model parameter to the specified value
+  *
+  * Change the \a rateNumber-th model parameter of the type specified by \a whichParameterType to
+  * the value \a value.
+  * This routine is usually called by model optimization routines to restore the original
+  * model parameter vlaue when optimization leads to worse likelihood than the original, or
+  * when optimizing routines and testing the new parameter.
+  * In case of changing a frequency or substitution rate the Q matrix is also decomposed (into
+  * eigenvalues and eigenvectors)
+  *
+  * @param index
+  *   Index of partition
+  *
+  * @param rateNumber
+  *   The index of the model parameter
+  *
+  * @param value
+  *   The value to which the parameter must be changed
+  *
+  * @param whichParameterType
+  *   Type of model parameter. Can be \b RATE_F, \b ALPHA_F or \b FREQ_F, that is substitution rates,
+  *   alpha rates, or base frequencies rates
+  */   
+static void changeModelParameters(int index, int rateNumber, double value, int whichParameterType, pllInstance *tr, partitionList * pr)
+{
+  switch(whichParameterType)
+    {
+    case RATE_F:
+      setRateModel(pr, index, value, rateNumber);  
+      pllInitReversibleGTR(tr, pr, index);          
+      break;
+    case ALPHA_F:
+      pr->partitionData[index]->alpha = value;
+      pllMakeGammaCats(pr->partitionData[index]->alpha, pr->partitionData[index]->gammaRates, 4, tr->useMedian);
+      break;
+    case FREQ_F:
+      {
+        int 
+          states = pr->partitionData[index]->states,
+          j;
+
+        double 
+          w = 0.0;
+
+        pr->partitionData[index]->freqExponents[rateNumber] = value;
+
+        for(j = 0; j < states; j++)
+          w += exp(pr->partitionData[index]->freqExponents[j]);
+
+        for(j = 0; j < states; j++)              
+          pr->partitionData[index]->frequencies[j] = exp(pr->partitionData[index]->freqExponents[j]) / w;
+        
+        pllInitReversibleGTR(tr, pr, index);
+      }
+      break;
+    default:
+      assert(0);
+    }
+}
+
+/* function that evaluates the change to a parameter */
+/** @brief Evaluate the change of a parameter
+ *
+ *  Evaluate the likelihood for each entry \a i in the linkage list when changing the
+ *  \a rateNumber-th parameter of type \a whichFunction (\b ALPHA_F, \b RATE_F 
+ *  or \b FREQ_F) to \a value[i]. The resulting likelihood for each entry list \a i in the
+ *  linkage list is then stored in \a result[i]
+ *
+ *  @param tr
+ *    PLL instance
+ *
+ *  @param pr
+ *    List of partitions
+ *
+ *  @param rateNumber
+ *    Index of the parameter to optimize 
+ *
+ *  @param value
+ *
+ *  @param result
+ *    An array where the total likelihood of each entry list \a i in the linkage list \a ll  is stored when evaluating the new \a i-th parameter of array \a value
+ *
+ *  @param converged
+ *
+ *  @param whichFunction
+ *    Type of the model parameter. Possible values are \b ALPHA_F, \b RATE_F and \b FREQ_F
+ *
+ *  @param numberOfModels
+ *    Number of partitions for which we are optimizing 
+ *
+ *  @param ll
+ *    Linkage list
+ *
+ *  @todo
+ *     Removed argument modelEpsilon as it is not used in this function. Maybe more things can be refactored.
+ */
+static void evaluateChange(pllInstance *tr, partitionList *pr, int rateNumber, double *value, double *result, boolean* converged, int whichFunction, int numberOfModels, linkageList *ll)
+//static void evaluateChange(pllInstance *tr, partitionList *pr, int rateNumber, double *value, double *result, boolean* converged, int whichFunction, int numberOfModels, linkageList *ll, double modelEpsilon)
+{ 
+  int 
+    i, 
+    k, 
+    pos;
+
+  for(i = 0, pos = 0; i < ll->entries; i++)
+    {
+      if(ll->ld[i].valid)
+        {
+          if(converged[pos])
+            {
+              for(k = 0; k < ll->ld[i].partitions; k++)
+                pr->partitionData[ll->ld[i].partitionList[k]]->executeModel = PLL_FALSE;
+            }
+          else
+            {
+              for(k = 0; k < ll->ld[i].partitions; k++)
+                {
+                  int 
+                    index = ll->ld[i].partitionList[k];
+
+
+                  changeModelParameters(index, rateNumber, value[pos], whichFunction, tr, pr);
+                }
+            }
+          pos++;
+        }
+      else
+        {
+          for(k = 0; k < ll->ld[i].partitions; k++)
+            pr->partitionData[ll->ld[i].partitionList[k]]->executeModel = PLL_FALSE;
+        }      
+    }
+
+  assert(pos == numberOfModels);
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))      
+   switch (whichFunction)
+    {
+      case RATE_F:
+        pllMasterBarrier(tr, pr, PLL_THREAD_OPT_RATE);
+        break;
+      case ALPHA_F:
+        pllMasterBarrier(tr, pr, PLL_THREAD_OPT_ALPHA);
+        break;
+      case FREQ_F:
+        pllMasterBarrier(tr, pr, PLL_THREAD_OPT_RATE);
+        break;
+      default:
+        break;
+    }
+#else
+      /* and compute the likelihood by doing a full tree traversal :-) */
+      pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+#endif     
+
+
+  for(i = 0, pos = 0; i < ll->entries; i++)     
+    {
+      if(ll->ld[i].valid)
+        {
+          result[pos] = 0.0;
+          
+          for(k = 0; k < ll->ld[i].partitions; k++)
+            {
+              int 
+                index = ll->ld[i].partitionList[k];
+
+              assert(pr->partitionData[index]->partitionLH <= 0.0);
+              
+              result[pos] -= pr->partitionData[index]->partitionLH;
+              
+            }
+          pos++;
+        }
+      for(k = 0; k < ll->ld[i].partitions; k++)
+        {
+          int index = ll->ld[i].partitionList[k];
+          pr->partitionData[index]->executeModel = PLL_TRUE;
+        }         
+    }
+  
+  assert(pos == numberOfModels);   
+}
+
+/* generic implementation of Brent's algorithm for one-dimensional parameter optimization */
+
+/** @brief Brent's algorithm
+ *
+ *  Generic implementation of Brent's algorithm for one-dimensional parameter optimization
+ *
+ *  @param ax
+ *
+ *  @param bx
+ *
+ *  @param cx
+ *
+ *  @param fb
+ *
+ *  @param tol
+ *
+ *  @param xmin
+ *
+ *  @param result
+ *
+ *  @param numberOfModels
+ *    Number of partitions for which we are optimizing 
+ *
+ *  @param whichFunction
+ *    Type of the model parameter. Possible values are \b ALPHA_F, \b RATE_F and \b FREQ_F
+ *
+ *  @param rateNumber
+ *     Index of the parameter to optimize 
+ *   
+ *  @param tr
+ *    PLL instance
+ *
+ *  @param pr
+ *    List of partitions
+ *
+ *  @param ll
+ *    Linkage list
+ *
+ *  @param lim_inf
+ *    Lower bound for the rate assignment
+ *
+ *  @param lim_sup
+ *    Upper bound for the rate assignment
+ *
+ *  @todo
+ *     Fill the rest of the entries. Also, why not preallocate all memory instead of allocating
+ *     at every call? We can save a lot of time which is lost due to function calls, finding free
+ *     memory blocks by allocation strategy, and also prevent mem fragmentation.
+ */
+static void brentGeneric(double *ax, double *bx, double *cx, double *fb, double tol, double *xmin, double *result, int numberOfModels, 
+                         int whichFunction, int rateNumber, pllInstance *tr, partitionList *pr, linkageList *ll, double lim_inf, double lim_sup)
+{
+  int iter, i;
+  double 
+    *a     = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *b     = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *d     = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *etemp = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *fu    = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *fv    = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *fw    = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *fx    = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *p     = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *q     = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *r     = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *tol1  = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *tol2  = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *u     = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *v     = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *w     = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *x     = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *xm    = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *e     = (double *)rax_malloc(sizeof(double) * numberOfModels);
+  boolean *converged = (boolean *)rax_malloc(sizeof(boolean) * numberOfModels);
+  boolean allConverged;
+  
+  for(i = 0; i < numberOfModels; i++)    
+    converged[i] = PLL_FALSE;
+
+  for(i = 0; i < numberOfModels; i++)
+    {
+      e[i] = 0.0;
+      d[i] = 0.0;
+    }
+
+  for(i = 0; i < numberOfModels; i++)
+    {
+      a[i]=((ax[i] < cx[i]) ? ax[i] : cx[i]);
+      b[i]=((ax[i] > cx[i]) ? ax[i] : cx[i]);
+      x[i] = w[i] = v[i] = bx[i];
+      fw[i] = fv[i] = fx[i] = fb[i];
+    }
+
+  for(i = 0; i < numberOfModels; i++)
+    {      
+      assert(a[i] >= lim_inf && a[i] <= lim_sup);
+      assert(b[i] >= lim_inf && b[i] <= lim_sup);
+      assert(x[i] >= lim_inf && x[i] <= lim_sup);
+      assert(v[i] >= lim_inf && v[i] <= lim_sup);
+      assert(w[i] >= lim_inf && w[i] <= lim_sup);
+    }
+  
+  
+
+  for(iter = 1; iter <= PLL_ITMAX; iter++)
+    {
+      allConverged = PLL_TRUE;
+
+      for(i = 0; i < numberOfModels && allConverged; i++)
+        allConverged = allConverged && converged[i];
+
+      if(allConverged)
+        {
+          rax_free(converged);
+          rax_free(a);
+          rax_free(b);
+          rax_free(d);
+          rax_free(etemp);
+          rax_free(fu);
+          rax_free(fv);
+          rax_free(fw);
+          rax_free(fx);
+          rax_free(p);
+          rax_free(q);
+          rax_free(r);
+          rax_free(tol1);
+          rax_free(tol2);
+          rax_free(u);
+          rax_free(v);
+          rax_free(w);
+          rax_free(x);
+          rax_free(xm);
+          rax_free(e);
+          return;
+        }     
+
+      for(i = 0; i < numberOfModels; i++)
+        {
+          if(!converged[i])
+            {                 
+              assert(a[i] >= lim_inf && a[i] <= lim_sup);
+              assert(b[i] >= lim_inf && b[i] <= lim_sup);
+              assert(x[i] >= lim_inf && x[i] <= lim_sup);
+              assert(v[i] >= lim_inf && v[i] <= lim_sup);
+              assert(w[i] >= lim_inf && w[i] <= lim_sup);
+  
+              xm[i] = 0.5 * (a[i] + b[i]);
+              tol2[i] = 2.0 * (tol1[i] = tol * fabs(x[i]) + BRENT_ZEPS);
+          
+              if(fabs(x[i] - xm[i]) <= (tol2[i] - 0.5 * (b[i] - a[i])))
+                {                
+                  result[i] =  -fx[i];
+                  xmin[i]   = x[i];
+                  converged[i] = PLL_TRUE;                
+                }
+              else
+                {
+                  if(fabs(e[i]) > tol1[i])
+                    {                
+                      r[i] = (x[i] - w[i]) * (fx[i] - fv[i]);
+                      q[i] = (x[i] - v[i]) * (fx[i] - fw[i]);
+                      p[i] = (x[i] - v[i]) * q[i] - (x[i] - w[i]) * r[i];
+                      q[i] = 2.0 * (q[i] - r[i]);
+                      if(q[i] > 0.0)
+                        p[i] = -p[i];
+                      q[i] = fabs(q[i]);
+                      etemp[i] = e[i];
+                      e[i] = d[i];
+                      if((fabs(p[i]) >= fabs(0.5 * q[i] * etemp[i])) || (p[i] <= q[i] * (a[i]-x[i])) || (p[i] >= q[i] * (b[i] - x[i])))
+                        d[i] = BRENT_CGOLD * (e[i] = (x[i] >= xm[i] ? a[i] - x[i] : b[i] - x[i]));
+                      else
+                        {
+                          d[i] = p[i] / q[i];
+                          u[i] = x[i] + d[i];
+                          if( u[i] - a[i] < tol2[i] || b[i] - u[i] < tol2[i])
+                            d[i] = PLL_SIGN(tol1[i], xm[i] - x[i]);
+                        }
+                    }
+                  else
+                    {                
+                      d[i] = BRENT_CGOLD * (e[i] = (x[i] >= xm[i] ? a[i] - x[i]: b[i] - x[i]));
+                    }
+                  u[i] = ((fabs(d[i]) >= tol1[i]) ? (x[i] + d[i]) : (x[i] + PLL_SIGN(tol1[i], d[i])));
+                }
+
+              if(!converged[i])
+                assert(u[i] >= lim_inf && u[i] <= lim_sup);
+            }
+        }
+                 
+      //evaluateChange(tr, pr, rateNumber, u, fu, converged, whichFunction, numberOfModels, ll, tol);
+      evaluateChange(tr, pr, rateNumber, u, fu, converged, whichFunction, numberOfModels, ll);
+
+      for(i = 0; i < numberOfModels; i++)
+        {
+          if(!converged[i])
+            {
+              if(fu[i] <= fx[i])
+                {
+                  if(u[i] >= x[i])
+                    a[i] = x[i];
+                  else
+                    b[i] = x[i];
+                  
+                  PLL_SHFT(v[i],w[i],x[i],u[i]);
+                  PLL_SHFT(fv[i],fw[i],fx[i],fu[i]);
+                }
+              else
+                {
+                  if(u[i] < x[i])
+                    a[i] = u[i];
+                  else
+                    b[i] = u[i];
+                  
+                  if(fu[i] <= fw[i] || w[i] == x[i])
+                    {
+                      v[i] = w[i];
+                      w[i] = u[i];
+                      fv[i] = fw[i];
+                      fw[i] = fu[i];
+                    }
+                  else
+                    {
+                      if(fu[i] <= fv[i] || v[i] == x[i] || v[i] == w[i])
+                        {
+                          v[i] = u[i];
+                          fv[i] = fu[i];
+                        }
+                    }       
+                }
+              
+              assert(a[i] >= lim_inf && a[i] <= lim_sup);
+              assert(b[i] >= lim_inf && b[i] <= lim_sup);
+              assert(x[i] >= lim_inf && x[i] <= lim_sup);
+              assert(v[i] >= lim_inf && v[i] <= lim_sup);
+              assert(w[i] >= lim_inf && w[i] <= lim_sup);
+              assert(u[i] >= lim_inf && u[i] <= lim_sup);
+            }
+        }
+    }
+
+  rax_free(converged);
+  rax_free(a);
+  rax_free(b);
+  rax_free(d);
+  rax_free(etemp);
+  rax_free(fu);
+  rax_free(fv);
+  rax_free(fw);
+  rax_free(fx);
+  rax_free(p);
+  rax_free(q);
+  rax_free(r);
+  rax_free(tol1);
+  rax_free(tol2);
+  rax_free(u);
+  rax_free(v);
+  rax_free(w);
+  rax_free(x);
+  rax_free(xm);
+  rax_free(e);
+
+  printf("\n. Too many iterations in BRENT !");
+  assert(0);
+}
+
+/* generic bracketing function required for Brent's algorithm. For details please see the corresponding chapter in the book Numerical Recipees in C */
+
+/** @brief Bracketing function
+ *
+ *  Generic bracketing function required for Brent's algorithm.
+ *  
+ *  @param param
+ *
+ *  @param ax
+ *
+ *  @param bx
+ *
+ *  @param cx
+ *
+ *  @param fa
+ *
+ *  @param fb
+ *
+ *  @param fc
+ *
+ *  @param lim_inf
+ *    Lower bound for the rate assignment
+ *
+ *  @param lim_sup
+ *    Upper bound for the rate assignment
+ *
+ *  @param numberOfModels
+ *    Number of partitions for which we are optimizing 
+ *
+ *  @param rateNumber
+ *     Index of the parameter to optimize 
+ *
+ *  @param whichFunction
+ *    Type of the model parameter. Possible values are \b ALPHA_F, \b RATE_F and \b FREQ_F
+ *
+ *  @param tr
+ *    PLL instance
+ *
+ *  @param pr
+ *    List of partitions
+ *
+ *  @param ll
+ *    Linkage list
+ *
+ *  @param modelEpsilon
+ *
+ *  @return
+ *    Fill this
+ *
+ *  @todo
+ *    Fill remaining details
+ */
+static int brakGeneric(double *param, double *ax, double *bx, double *cx, double *fa, double *fb, 
+                       double *fc, double lim_inf, double lim_sup, 
+                       int numberOfModels, int rateNumber, int whichFunction, pllInstance *tr, partitionList *pr, linkageList *ll)
+{
+  double 
+    *ulim = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *u    = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *r    = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *q    = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *fu   = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *dum  = (double *)rax_malloc(sizeof(double) * numberOfModels), 
+    *temp = (double *)rax_malloc(sizeof(double) * numberOfModels);
+  
+  int 
+    i,
+    *state    = (int *)rax_malloc(sizeof(int) * numberOfModels),
+    *endState = (int *)rax_malloc(sizeof(int) * numberOfModels);
+
+  boolean *converged = (boolean *)rax_malloc(sizeof(boolean) * numberOfModels);
+  boolean allConverged;
+
+  for(i = 0; i < numberOfModels; i++)
+    converged[i] = PLL_FALSE;
+
+  for(i = 0; i < numberOfModels; i++)
+    {
+      state[i] = 0;
+      endState[i] = 0;
+
+      u[i] = 0.0;
+
+      param[i] = ax[i];
+
+      if(param[i] > lim_sup)    
+        param[i] = ax[i] = lim_sup;
+      
+      if(param[i] < lim_inf) 
+        param[i] = ax[i] = lim_inf;
+
+      assert(param[i] >= lim_inf && param[i] <= lim_sup);
+    }
+   
+  
+  //evaluateChange(tr, pr, rateNumber, param, fa, converged, whichFunction, numberOfModels, ll, modelEpsilon);
+  evaluateChange(tr, pr, rateNumber, param, fa, converged, whichFunction, numberOfModels, ll);
+
+
+  for(i = 0; i < numberOfModels; i++)
+    {
+      param[i] = bx[i];
+      if(param[i] > lim_sup) 
+        param[i] = bx[i] = lim_sup;
+      if(param[i] < lim_inf) 
+        param[i] = bx[i] = lim_inf;
+
+      assert(param[i] >= lim_inf && param[i] <= lim_sup);
+    }
+  
+  //evaluateChange(tr, pr, rateNumber, param, fb, converged, whichFunction, numberOfModels, ll, modelEpsilon);
+  evaluateChange(tr, pr, rateNumber, param, fb, converged, whichFunction, numberOfModels, ll);
+
+  for(i = 0; i < numberOfModels; i++)  
+    {
+      if (fb[i] > fa[i]) 
+        {         
+          PLL_SHFT(dum[i],ax[i],bx[i],dum[i]);
+          PLL_SHFT(dum[i],fa[i],fb[i],dum[i]);
+        }
+      
+      cx[i] = bx[i] + MNBRAK_GOLD * (bx[i] - ax[i]);
+      
+      param[i] = cx[i];
+      
+      if(param[i] > lim_sup) 
+        param[i] = cx[i] = lim_sup;
+      if(param[i] < lim_inf) 
+        param[i] = cx[i] = lim_inf;
+
+      assert(param[i] >= lim_inf && param[i] <= lim_sup);
+    }
+  
+ 
+  //evaluateChange(tr, pr, rateNumber, param, fc, converged, whichFunction, numberOfModels,  ll, modelEpsilon);
+  evaluateChange(tr, pr, rateNumber, param, fc, converged, whichFunction, numberOfModels,  ll);
+
+   while(1) 
+     {       
+       allConverged = PLL_TRUE;
+
+       for(i = 0; i < numberOfModels && allConverged; i++)
+         allConverged = allConverged && converged[i];
+
+       if(allConverged)
+         {
+           for(i = 0; i < numberOfModels; i++)
+             {         
+               if(ax[i] > lim_sup) 
+                 ax[i] = lim_sup;
+               if(ax[i] < lim_inf) 
+                 ax[i] = lim_inf;
+
+               if(bx[i] > lim_sup) 
+                 bx[i] = lim_sup;
+               if(bx[i] < lim_inf) 
+                 bx[i] = lim_inf;
+               
+               if(cx[i] > lim_sup) 
+                 cx[i] = lim_sup;
+               if(cx[i] < lim_inf) 
+                 cx[i] = lim_inf;
+             }
+
+           rax_free(converged);
+           rax_free(ulim);
+           rax_free(u);
+           rax_free(r);
+           rax_free(q);
+           rax_free(fu);
+           rax_free(dum); 
+           rax_free(temp);
+           rax_free(state);   
+           rax_free(endState);
+           return 0;
+           
+         }
+
+       for(i = 0; i < numberOfModels; i++)
+         {
+           if(!converged[i])
+             {
+               switch(state[i])
+                 {
+                 case 0:
+                   endState[i] = 0;
+                   if(!(fb[i] > fc[i]))                  
+                     converged[i] = PLL_TRUE;                                
+                   else
+                     {
+                   
+                       if(ax[i] > lim_sup) 
+                         ax[i] = lim_sup;
+                       if(ax[i] < lim_inf) 
+                         ax[i] = lim_inf;
+                       if(bx[i] > lim_sup) 
+                         bx[i] = lim_sup;
+                       if(bx[i] < lim_inf) 
+                         bx[i] = lim_inf;
+                       if(cx[i] > lim_sup) 
+                         cx[i] = lim_sup;
+                       if(cx[i] < lim_inf) 
+                         cx[i] = lim_inf;
+                       
+                       r[i]=(bx[i]-ax[i])*(fb[i]-fc[i]);
+                       q[i]=(bx[i]-cx[i])*(fb[i]-fa[i]);
+                       u[i]=(bx[i])-((bx[i]-cx[i])*q[i]-(bx[i]-ax[i])*r[i])/
+                         (2.0 * PLL_SIGN(PLL_MAX(fabs(q[i]-r[i]),MNBRAK_TINY),q[i]-r[i]));
+                       
+                       ulim[i]=(bx[i])+MNBRAK_GLIMIT*(cx[i]-bx[i]);
+                       
+                       if(u[i] > lim_sup) 
+                         u[i] = lim_sup;
+                       if(u[i] < lim_inf) 
+                         u[i] = lim_inf;
+                       if(ulim[i] > lim_sup) 
+                         ulim[i] = lim_sup;
+                       if(ulim[i] < lim_inf) 
+                         ulim[i] = lim_inf;
+                       
+                       if ((bx[i]-u[i])*(u[i]-cx[i]) > 0.0)
+                         {
+                           param[i] = u[i];
+                           if(param[i] > lim_sup)                            
+                             param[i] = u[i] = lim_sup;
+                           if(param[i] < lim_inf)
+                             param[i] = u[i] = lim_inf;
+                           endState[i] = 1;
+                         }
+                       else 
+                         {
+                           if ((cx[i]-u[i])*(u[i]-ulim[i]) > 0.0) 
+                             {
+                               param[i] = u[i];
+                               if(param[i] > lim_sup) 
+                                 param[i] = u[i] = lim_sup;
+                               if(param[i] < lim_inf) 
+                                 param[i] = u[i] = lim_inf;
+                               endState[i] = 2;
+                             }                         
+                           else
+                             {
+                               if ((u[i]-ulim[i])*(ulim[i]-cx[i]) >= 0.0) 
+                                 {
+                                   u[i] = ulim[i];
+                                   param[i] = u[i];     
+                                   if(param[i] > lim_sup) 
+                                     param[i] = u[i] = ulim[i] = lim_sup;
+                                   if(param[i] < lim_inf) 
+                                     param[i] = u[i] = ulim[i] = lim_inf;
+                                   endState[i] = 0;
+                                 }                              
+                               else 
+                                 {                
+                                   u[i]=(cx[i])+MNBRAK_GOLD*(cx[i]-bx[i]);
+                                   param[i] = u[i];
+                                   endState[i] = 0;
+                                   if(param[i] > lim_sup) 
+                                     param[i] = u[i] = lim_sup;
+                                   if(param[i] < lim_inf) 
+                                     param[i] = u[i] = lim_inf;
+                                 }
+                             }    
+                         }
+                     }
+                   break;
+                 case 1:
+                   endState[i] = 0;
+                   break;
+                 case 2:
+                   endState[i] = 3;
+                   break;
+                 default:
+                   assert(0);
+                 }
+               assert(param[i] >= lim_inf && param[i] <= lim_sup);
+             }
+         }
+             
+       //evaluateChange(tr, pr, rateNumber, param, temp, converged, whichFunction, numberOfModels, ll, modelEpsilon);
+       evaluateChange(tr, pr, rateNumber, param, temp, converged, whichFunction, numberOfModels, ll);
+
+       for(i = 0; i < numberOfModels; i++)
+         {
+           if(!converged[i])
+             {         
+               switch(endState[i])
+                 {
+                 case 0:
+                   fu[i] = temp[i];
+                   PLL_SHFT(ax[i],bx[i],cx[i],u[i]);
+                   PLL_SHFT(fa[i],fb[i],fc[i],fu[i]);
+                   state[i] = 0;
+                   break;
+                 case 1:
+                   fu[i] = temp[i];
+                   if (fu[i] < fc[i]) 
+                     {
+                       ax[i]=(bx[i]);
+                       bx[i]=u[i];
+                       fa[i]=(fb[i]);
+                       fb[i]=fu[i]; 
+                       converged[i] = PLL_TRUE;               
+                     } 
+                   else 
+                     {
+                       if (fu[i] > fb[i]) 
+                         {
+                           assert(u[i] >= lim_inf && u[i] <= lim_sup);
+                           cx[i]=u[i];
+                           fc[i]=fu[i];
+                           converged[i] = PLL_TRUE;                       
+                         }
+                       else
+                         {                 
+                           u[i]=(cx[i])+MNBRAK_GOLD*(cx[i]-bx[i]);
+                           param[i] = u[i];
+                           if(param[i] > lim_sup) {param[i] = u[i] = lim_sup;}
+                           if(param[i] < lim_inf) {param[i] = u[i] = lim_inf;}    
+                           state[i] = 1;                 
+                         }                
+                     }
+                   break;
+                 case 2: 
+                   fu[i] = temp[i];
+                   if (fu[i] < fc[i]) 
+                     {               
+                       PLL_SHFT(bx[i],cx[i],u[i], cx[i]+MNBRAK_GOLD*(cx[i]-bx[i]));
+                       state[i] = 2;
+                     }     
+                   else
+                     {
+                       state[i] = 0;
+                       PLL_SHFT(ax[i],bx[i],cx[i],u[i]);
+                       PLL_SHFT(fa[i],fb[i],fc[i],fu[i]);
+                     }
+                   break;          
+                 case 3:                  
+                   PLL_SHFT(fb[i],fc[i],fu[i], temp[i]);
+                   PLL_SHFT(ax[i],bx[i],cx[i],u[i]);
+                   PLL_SHFT(fa[i],fb[i],fc[i],fu[i]);
+                   state[i] = 0;
+                   break;
+                 default:
+                   assert(0);
+                 }
+             }
+         }
+    }
+   
+
+   assert(0);
+   rax_free(converged);
+   rax_free(ulim);
+   rax_free(u);
+   rax_free(r);
+   rax_free(q);
+   rax_free(fu);
+   rax_free(dum); 
+   rax_free(temp);
+   rax_free(state);   
+   rax_free(endState);
+
+  
+
+   return(0);
+}
+
+
+/**********************************************************************************************************/
+/* ALPHA PARAM ********************************************************************************************/
+
+
+//this function is required for implementing the LG4X model later-on 
+
+/** @brief Optimize alpha rates
+  *
+  * Generic routine for alpha rates optimization
+  *
+  * @param tr
+  *   PLL instance
+  *
+  * @param pr
+  *   List of partitions
+  *
+  * @param modelEpsilon
+  *   Don't know yet
+  *
+  * @param ll
+  *   Linkage list
+  *
+  * @todo
+  *   Implement the LG4X model
+  */
+void pllOptAlphasGeneric(pllInstance *tr, partitionList * pr, double modelEpsilon, linkageList *ll)
+{
+  int 
+    i,
+    non_LG4X_Partitions = 0,
+    LG4X_Partitions  = 0;
+
+  /* assumes homogeneous super-partitions, that either contain DNA or AA partitions !*/
+  /* does not check whether AA are all linked */
+
+  /* first do non-LG4X partitions */
+
+  for(i = 0; ll && i < ll->entries; i++)
+    {
+      switch(pr->partitionData[ll->ld[i].partitionList[0]]->dataType)
+        {
+        case PLL_DNA_DATA:                          
+        case PLL_BINARY_DATA:
+        case PLL_SECONDARY_DATA:
+        case PLL_SECONDARY_DATA_6:
+        case PLL_SECONDARY_DATA_7:
+        case PLL_GENERIC_32:
+        case PLL_GENERIC_64:
+	  if(pr->partitionData[ll->ld[i].partitionList[0]]->optimizeAlphaParameter)
+	    {
+	      ll->ld[i].valid = PLL_TRUE;
+	      non_LG4X_Partitions++;
+	    }
+	  else
+	     ll->ld[i].valid = PLL_FALSE;
+          break;
+        case PLL_AA_DATA:     
+          //to be implemented later-on 
+          /*if(tr->partitionData[ll->ld[i].partitionList[0]].protModels == LG4X)
+            {
+              LG4X_Partitions++;              
+              ll->ld[i].valid = FALSE;
+            }
+            else*/ 
+	  if(pr->partitionData[ll->ld[i].partitionList[0]]->optimizeAlphaParameter)
+            {
+              ll->ld[i].valid = PLL_TRUE;
+              non_LG4X_Partitions++;
+            }
+	  else
+	    ll->ld[i].valid = PLL_FALSE;
+          break;
+        default:
+          assert(0);
+        }      
+    }   
+
+ 
+
+  if(non_LG4X_Partitions > 0)    
+    optParamGeneric(tr, pr, modelEpsilon, ll, non_LG4X_Partitions, -1, PLL_ALPHA_MIN, PLL_ALPHA_MAX, ALPHA_F);
+  
+  //right now this assertion shouldn't fail, undo when implementing LG4X  
+  assert(LG4X_Partitions == 0);
+ 
+
+  /* then LG4x partitions */
+
+  for(i = 0; ll && i < ll->entries; i++)
+    {
+      switch(pr->partitionData[ll->ld[i].partitionList[0]]->dataType)
+        {
+        case PLL_DNA_DATA:                          
+        case PLL_BINARY_DATA:
+        case PLL_SECONDARY_DATA:
+        case PLL_SECONDARY_DATA_6:
+        case PLL_SECONDARY_DATA_7:
+        case PLL_GENERIC_32:
+        case PLL_GENERIC_64:
+          ll->ld[i].valid = PLL_FALSE;    
+          break;
+        case PLL_AA_DATA:     
+          //deal with this later-on
+          /*if(tr->partitionData[ll->ld[i].partitionList[0]].protModels == LG4X)              
+            ll->ld[i].valid = TRUE;        
+            else*/
+            ll->ld[i].valid = PLL_FALSE;                    
+          break;
+        default:
+          assert(0);
+        }      
+    }   
+  
+  //if(LG4X_Partitions > 0)
+  //  optLG4X(tr, modelEpsilon, ll, LG4X_Partitions);
+
+  for(i = 0; ll && i < ll->entries; i++)
+    ll->ld[i].valid = PLL_TRUE;
+}
+
+/** @brief Optimize model parameters
+  *
+  * Function for optimizing the \a rateNumber-th model parameter of type \a whichParameterTYpe,
+  * i.e. alpha rate, substitution rate, or base frequency rate, in all partitions with the \a
+  * valid flag set to \b PLL_TRUE.
+  *
+  * @param tr
+  *   PLL instance
+  *
+  * @param pr
+  *   List of partitions
+  *   
+  * @param modelEpsilon
+  *    A parameter passed for Brent / Brak
+  *
+  * @param ll
+  *   Linkage list
+  * 
+  * @param numberOfModels
+  *   Number of partitions for which we are optimizing 
+  *
+  * @param rateNumber
+  *  Index of the parameter to optimize 
+  *
+  * @param lim_inf
+  *  Lower bound for the rate assignment
+  *
+  * @param lim_sup
+  *  Upper bound for the rate assignment
+  *
+  * @param whichParameterType
+  *  Type of the model parameter. Possible values are \b ALPHA_F, \b RATE_F and \b FREQ_F
+  *
+  * @todo
+  *    Describe the modelEpsilon parameter in detail
+  */
+static void optParamGeneric(pllInstance *tr, partitionList * pr, double modelEpsilon, linkageList *ll, int numberOfModels, int rateNumber, double lim_inf, double lim_sup, int whichParameterType)
+{
+  int
+    l,
+    k, 
+    j, 
+    pos;
+    
+  double 
+    *startValues = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *startLH     = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *endLH       = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *_a          = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *_b          = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *_c          = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *_fa         = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *_fb         = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *_fc         = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *_param      = (double *)rax_malloc(sizeof(double) * numberOfModels),
+    *_x          = (double *)rax_malloc(sizeof(double) * numberOfModels); 
+   
+  pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+  
+#ifdef  _DEBUG_MOD_OPT
+  double
+    initialLH = tr->likelihood;
+#endif
+
+  /* 
+     at this point here every worker has the traversal data it needs for the 
+     search 
+  */
+
+  /* store in startValues the values of the old parameters */
+  for(l = 0, pos = 0; ll && l < ll->entries; l++)
+    {
+      if(ll->ld[l].valid)
+        {
+          endLH[pos] = PLL_UNLIKELY;
+          startLH[pos] = 0.0;
+
+          for(j = 0; j < ll->ld[l].partitions; j++)
+            {
+              int 
+                index = ll->ld[l].partitionList[j];
+              
+              startLH[pos] += pr->partitionData[index]->partitionLH;
+              
+              switch(whichParameterType)
+                {
+                case ALPHA_F:
+                  startValues[pos] = pr->partitionData[index]->alpha;
+                  break;
+                case RATE_F:
+                  startValues[pos] = pr->partitionData[index]->substRates[rateNumber];      
+                  break;
+                case FREQ_F:
+                  startValues[pos] = pr->partitionData[index]->freqExponents[rateNumber];
+                  break;
+                default:
+                  assert(0);
+                }
+            }
+          pos++;
+        }
+    }  
+
+  assert(pos == numberOfModels);
+   
+  for(k = 0, pos = 0; ll && k < ll->entries; k++)
+    {
+      if(ll->ld[k].valid)
+        {
+          _a[pos] = startValues[pos] + 0.1;
+          _b[pos] = startValues[pos] - 0.1;
+
+          if(_a[pos] < lim_inf) 
+            _a[pos] = lim_inf;
+          
+          if(_a[pos] > lim_sup) 
+            _a[pos] = lim_sup;
+              
+          if(_b[pos] < lim_inf) 
+            _b[pos] = lim_inf;
+          
+          if(_b[pos] > lim_sup) 
+            _b[pos] = lim_sup;    
+
+          pos++;
+        }
+    }                                
+
+  assert(pos == numberOfModels);
+
+  brakGeneric(_param, _a, _b, _c, _fa, _fb, _fc, lim_inf, lim_sup, numberOfModels, rateNumber, whichParameterType, tr, pr, ll);
+      
+  for(k = 0; k < numberOfModels; k++)
+    {
+      assert(_a[k] >= lim_inf && _a[k] <= lim_sup);
+      assert(_b[k] >= lim_inf && _b[k] <= lim_sup);       
+      assert(_c[k] >= lim_inf && _c[k] <= lim_sup);         
+    }      
+
+  brentGeneric(_a, _b, _c, _fb, modelEpsilon, _x, endLH, numberOfModels, whichParameterType, rateNumber, tr,  pr, ll, lim_inf, lim_sup);
+        
+  for(k = 0, pos = 0; ll && k < ll->entries; k++)
+    {
+      if(ll->ld[k].valid)
+        { 
+          if(startLH[pos] > endLH[pos])
+            {
+              //if the initial likelihood was better than the likelihodo after optimization, we set the values back 
+              //to their original values 
+
+              for(j = 0; j < ll->ld[k].partitions; j++)
+                {
+                  int 
+                    index = ll->ld[k].partitionList[j];
+                  
+                    changeModelParameters(index, rateNumber, startValues[pos], whichParameterType, tr, pr); 
+                }
+            }
+          else
+            {
+              //otherwise we set the value to the optimized value 
+              //this used to be a bug in standard RAxML, before I fixed it 
+              //I was not using _x[pos] as value that needs to be set 
+
+              for(j = 0; j < ll->ld[k].partitions; j++)
+                {
+                  int 
+                    index = ll->ld[k].partitionList[j];
+                  
+                  changeModelParameters(index, rateNumber, _x[pos], whichParameterType, tr, pr); 
+                }
+            }
+          pos++;
+        }
+    }
+
+  #if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+    pllMasterBarrier(tr, pr, PLL_THREAD_COPY_RATES);
+  #endif    
+
+    
+  assert(pos == numberOfModels);
+
+  rax_free(startLH);
+  rax_free(endLH);
+  rax_free(_a);
+  rax_free(_b);
+  rax_free(_c);
+  rax_free(_fa);
+  rax_free(_fb);
+  rax_free(_fc);
+  rax_free(_param);
+  rax_free(_x);  
+  rax_free(startValues);
+
+#ifdef _DEBUG_MOD_OPT
+  pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+
+  if(tr->likelihood < initialLH)
+    printf("%f %f\n", tr->likelihood, initialLH);
+  assert(tr->likelihood >= initialLH);
+#endif
+}
+
+//******************** rate optimization functions ***************************************************/
+
+/** @brief Wrapper function for optimizing base frequency rates
+  *
+  * Wrapper function for optimizing base frequency rates of \a numberOfModels partitions. 
+  * The function iteratively calls the function \a optParamGeneric for optimizing each of the \a states
+  * parameters
+  *
+  * @param tr
+  *   PLL instance
+  *
+  * @param pr
+  *   List of partitions
+  *
+  * @param modelEpsilon
+  *   Dont know yet
+  *
+  * @param ll
+  *   Linkage list
+  *
+  * @param numberOfModels
+  *   Number of partitions that we are optimizing
+  *
+  * @param states
+  *   Number of states
+  */
+static void optFreqs(pllInstance *tr, partitionList * pr, double modelEpsilon, linkageList *ll, int numberOfModels, int states)
+{ 
+  int 
+    rateNumber;
+
+  double
+    freqMin = -1000000.0,
+    freqMax = 200.0;
+  
+  for(rateNumber = 0; rateNumber < states; rateNumber++)
+    optParamGeneric(tr, pr, modelEpsilon, ll, numberOfModels, rateNumber, freqMin, freqMax, FREQ_F);   
+}
+
+/** @brief Optimize base frequencies 
+ *  
+ *  Wrapper function for optimizing base frequencies
+ *
+ *  @param tr
+ *    PLL instance
+ *
+ *  @param pr
+ *    List of partitions
+ *
+ *  @param modelEpsilon
+ *    
+ *
+ *  @param ll
+ *    Linkage list
+ *
+ */
+void pllOptBaseFreqs(pllInstance *tr, partitionList * pr, double modelEpsilon, linkageList *ll)
+{
+  int 
+    i,
+    states,
+    dnaPartitions = 0,
+    aaPartitions  = 0,
+    binPartitions = 0;
+
+  /* first do DNA */
+
+  /* Set the valid flag in linkage list to PLL_TRUE for all DNA partitions */
+  for(i = 0; ll && i < ll->entries; i++)
+    {
+      switch(pr->partitionData[ll->ld[i].partitionList[0]]->dataType)
+        {
+        case PLL_DNA_DATA:  
+          states = pr->partitionData[ll->ld[i].partitionList[0]]->states; 
+          if(pr->partitionData[ll->ld[i].partitionList[0]]->optimizeBaseFrequencies)
+            {
+              ll->ld[i].valid = PLL_TRUE;
+              dnaPartitions++;              
+            }
+          else
+             ll->ld[i].valid = PLL_FALSE;
+          break;       
+        case PLL_BINARY_DATA:
+        case PLL_AA_DATA:
+          ll->ld[i].valid = PLL_FALSE;
+          break;
+        default:
+          assert(0);
+        }      
+    }   
+
+  /* Optimize the frequency rates of all DNA partitions */
+  if(dnaPartitions > 0)
+    optFreqs(tr, pr, modelEpsilon, ll, dnaPartitions, states);
+  
+  /* then AA */
+
+  /* find all partitions that have frequency optimization enabled */ 
+  for(i = 0; ll && i < ll->entries; i++)
+    {
+      switch(pr->partitionData[ll->ld[i].partitionList[0]]->dataType)
+        {
+        case PLL_AA_DATA:     
+          states = pr->partitionData[ll->ld[i].partitionList[0]]->states;             
+          if(pr->partitionData[ll->ld[i].partitionList[0]]->optimizeBaseFrequencies)
+            {
+              ll->ld[i].valid = PLL_TRUE;
+              aaPartitions++;           
+            }
+          else
+            ll->ld[i].valid = PLL_FALSE; 
+          break;
+        case PLL_DNA_DATA:      
+        case PLL_BINARY_DATA:
+          ll->ld[i].valid = PLL_FALSE;
+          break;
+        default:
+          assert(0);
+        }        
+    }
+  
+  if(aaPartitions > 0)      
+    optFreqs(tr, pr, modelEpsilon, ll, aaPartitions, states);
+
+  /* then binary */
+  for(i = 0; i < ll->entries; i++)
+    {
+      switch(pr->partitionData[ll->ld[i].partitionList[0]]->dataType)
+	{
+	case PLL_BINARY_DATA:	  
+	  states = pr->partitionData[ll->ld[i].partitionList[0]]->states; 	      
+	  if(pr->partitionData[ll->ld[i].partitionList[0]]->optimizeBaseFrequencies)
+	    {
+	      ll->ld[i].valid = PLL_TRUE;
+	      binPartitions++;		
+	    }
+	  else
+	    ll->ld[i].valid = PLL_FALSE; 
+	  break;
+	case PLL_DNA_DATA:	  
+	case PLL_AA_DATA:      
+	case PLL_SECONDARY_DATA:
+	case PLL_SECONDARY_DATA_6:
+	case PLL_SECONDARY_DATA_7:
+	case PLL_GENERIC_32:
+	case PLL_GENERIC_64:	    
+	  ll->ld[i].valid = PLL_FALSE;
+	  break;
+	default:
+	  assert(0);
+	}	 
+    }
+
+  if(binPartitions > 0)      
+    optFreqs(tr, pr, modelEpsilon, ll, binPartitions, states);
+
+  /* done */
+
+  for(i = 0; ll && i < ll->entries; i++)
+    ll->ld[i].valid = PLL_TRUE;
+}
+
+
+
+/* new version for optimizing rates, an external loop that iterates over the rates */
+/** @brief Wrapper function for optimizing substitution rates
+  *
+  * Wrapper function for optimizing substitution rates of \a numberOfModels partitions. 
+  * The function determines the  number of free parameters and iteratively calls the 
+  * function \a optParamGeneric for optimizing each parameter
+  *
+  * @param tr
+  *   PLL instance
+  *
+  * @param pr
+  *   List of partitions
+  *
+  * @param modelEpsilon
+  *   Dont know yet
+  *
+  * @param ll
+  *   Linkage list
+  *
+  * @param numberOfModels
+  *   Number of partitions that we are optimizing
+  *
+  * @param states
+  *   Number of states
+  */
+static void optRates(pllInstance *tr, partitionList * pr, double modelEpsilon, linkageList *ll, int numberOfModels, int states)
+{
+  int
+    rateNumber,
+    numberOfRates = ((states * states - states) / 2) - 1;
+
+  for(rateNumber = 0; rateNumber < numberOfRates; rateNumber++)
+    optParamGeneric(tr, pr, modelEpsilon, ll, numberOfModels, rateNumber, PLL_RATE_MIN, PLL_RATE_MAX, RATE_F);
+}
+
+
+/* figure out if all AA models have been assigned a joint GTR matrix */
+
+/** @brief Check whether all protein partitions have been assigned a joint GTR matrix
+  *
+  * Check whether there exists at least one protein partition and whether all
+  * protein partitions have been assigned a joint GTR matrix.
+  *
+  * @param pr
+  *   List of partitions
+  *
+  * @return
+  *   Return \b PLL_TRUE in case there exists at least one protein partition and all of
+  *   protein partitions are assigned a joint GTR matrix. Otherwise return \b PLL_FALSE
+  */
+static boolean AAisGTR(partitionList *pr)
+{
+  int i, count = 0;
+
+  for(i = 0; i < pr->numberOfPartitions; i++)
+    {
+      if(pr->partitionData[i]->dataType == PLL_AA_DATA)
+        {
+          count++;
+          if(pr->partitionData[i]->protModels != PLL_GTR)
+            return PLL_FALSE;
+        }
+    }
+
+  if(count == 0)
+    return PLL_FALSE;
+
+  return PLL_TRUE;
+}
+
+
+/* generic substitiution matrix (Q matrix) optimization */
+
+/** @brief Optimize substitution rates
+  *
+  * Generic routine for substitution matrix (Q matrix) optimization
+  *
+  * @param tr
+  *   PLL instance
+  *
+  * @param pr
+  *   List of partitions
+  *
+  * @param modelEpsilon
+  *   Don't know yet
+  *
+  * @param ll
+  *   Linkage list
+  */
+void pllOptRatesGeneric(pllInstance *tr, partitionList *pr, double modelEpsilon, linkageList *ll)
+{
+  int 
+    i,
+    dnaPartitions = 0,
+    aaPartitions  = 0,
+    states = -1;
+
+  /* assumes homogeneous super-partitions, that either contain DNA or AA partitions !*/
+  /* does not check whether AA are all linked */
+
+  /* 
+     first optimize all rates in DNA data partition matrices. That's where we use the valid field in the 
+     linkage list data structure. 
+   */
+
+  for(i = 0; ll && i < ll->entries; i++)
+    {
+      switch(pr->partitionData[ll->ld[i].partitionList[0]]->dataType)
+        {
+          case PLL_DNA_DATA:  
+            states = pr->partitionData[ll->ld[i].partitionList[0]]->states;
+	    if(pr->partitionData[ll->ld[i].partitionList[0]]->optimizeSubstitutionRates)
+	      {
+		ll->ld[i].valid = PLL_TRUE;
+		++ dnaPartitions;  
+	      }
+	    else	      
+	      ll->ld[i].valid = PLL_FALSE;	      
+            break;
+          case PLL_BINARY_DATA:
+          case PLL_AA_DATA:
+          case PLL_SECONDARY_DATA:
+          case PLL_SECONDARY_DATA_6:
+          case PLL_SECONDARY_DATA_7:
+          case PLL_GENERIC_32:
+          case PLL_GENERIC_64:
+            ll->ld[i].valid = PLL_FALSE;
+            break;
+          default:
+            assert(0);
+        }      
+    }   
+
+  /* if we have dna partitions in our dataset, let's optimize all 5 rates in their substitution matrices */
+
+  if(dnaPartitions > 0)
+    optRates(tr, pr, modelEpsilon, ll, dnaPartitions, states);
+  
+  /* AA partitions evolving under a GTR model do not need to be linked any more, this responsibility now remains 
+     with the library user !
+   */
+  
+  for(i = 0; ll && i < ll->entries; i++)
+    {
+      switch(pr->partitionData[ll->ld[i].partitionList[0]]->dataType)
+	{
+	case PLL_AA_DATA:
+	  states = pr->partitionData[ll->ld[i].partitionList[0]]->states;
+	  if(pr->partitionData[ll->ld[i].partitionList[0]]->optimizeSubstitutionRates)
+	    {
+	      ll->ld[i].valid = PLL_TRUE;
+	      aaPartitions++;
+	    }
+	  else
+	    ll->ld[i].valid = PLL_FALSE;
+	  break;
+	case PLL_DNA_DATA:          
+	case PLL_BINARY_DATA:
+	case PLL_SECONDARY_DATA:        
+	case PLL_SECONDARY_DATA_6:
+	case PLL_SECONDARY_DATA_7:
+	  ll->ld[i].valid = PLL_FALSE;
+	  break;
+	default:
+	  assert(0);
+	}    
+    }
+  
+  if(aaPartitions > 0)
+    optRates(tr, pr, modelEpsilon, ll, aaPartitions, states); 
+
+  /* done with all partitions, so we can set all entries in the linkage list to valid again :-) */
+
+  for(i = 0; ll && i < ll->entries; i++)
+    ll->ld[i].valid = PLL_TRUE;
+}
+
+
+
+
+
+/*********************FUNCTIONS FOR PSR/CAT model of rate heterogeneity ***************************************/
+
+
+
+
+
+
+static int catCompare(const void *p1, const void *p2)
+{
+ rateCategorize *rc1 = (rateCategorize *)p1;
+ rateCategorize *rc2 = (rateCategorize *)p2;
+
+  double i = rc1->accumulatedSiteLikelihood;
+  double j = rc2->accumulatedSiteLikelihood;
+  
+  if (i > j)
+    return (1);
+  if (i < j)
+    return (-1);
+  return (0);
+}
+
+
+static void categorizePartition(pllInstance *tr, partitionList *pr, rateCategorize *rc, int model, int lower, int upper)
+{
+  int
+    zeroCounter,
+    i, 
+    k;
+  
+  double 
+    diff, 
+    min;
+
+  for (i = lower, zeroCounter = 0; i < upper; i++, zeroCounter++) 
+      {
+        double
+          temp = tr->patrat[i];
+
+        int
+          found = 0;
+        
+        for(k = 0; k < pr->partitionData[model]->numberOfCategories; k++)
+          {
+            if(temp == rc[k].rate || (fabs(temp - rc[k].rate) < 0.001))
+              {
+                found = 1;
+                tr->rateCategory[i] = k; 
+                break;
+              }
+          }
+        
+        if(!found)
+          {
+            min = fabs(temp - rc[0].rate);
+            tr->rateCategory[i] = 0;
+
+            for(k = 1; k < pr->partitionData[model]->numberOfCategories; k++)
+              {
+                diff = fabs(temp - rc[k].rate);
+
+                if(diff < min)
+                  {
+                    min = diff;
+                    tr->rateCategory[i] = k;
+                  }
+              }
+          }
+      }
+
+  for(k = 0; k < pr->partitionData[model]->numberOfCategories; k++)
+    pr->partitionData[model]->perSiteRates[k] = rc[k].rate;
+}
+
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+
+void optRateCatPthreads(pllInstance *tr, partitionList *pr, double lower_spacing, double upper_spacing, double *lhs, int n, int tid)
+{
+  int 
+    model, 
+    i;
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+    {      
+      int 
+        localIndex = 0;
+
+      boolean 
+        execute = ((tr->manyPartitions && isThisMyPartition(pr, tid, model)) || (!tr->manyPartitions));
+
+      if(execute)
+        for(i = pr->partitionData[model]->lower;  i < pr->partitionData[model]->upper; i++)
+          {
+            if(tr->manyPartitions || (i % n == tid))
+              {
+              
+                double initialRate, initialLikelihood, 
+                  leftLH, rightLH, leftRate, rightRate, v;
+                const double epsilon = 0.00001;
+                int k;        
+                
+                tr->patrat[i] = tr->patratStored[i];     
+                initialRate = tr->patrat[i];
+                
+                initialLikelihood = evaluatePartialGeneric(tr, pr, localIndex, initialRate, model); /* i is real i ??? */
+                
+                
+                leftLH = rightLH = initialLikelihood;
+                leftRate = rightRate = initialRate;
+                
+                k = 1;
+                
+                while((initialRate - k * lower_spacing > 0.0001) && 
+                      ((v = evaluatePartialGeneric(tr, pr, localIndex, initialRate - k * lower_spacing, model))
+                       > leftLH) && 
+                      (fabs(leftLH - v) > epsilon))  
+                  {       
+#ifndef WIN32
+                    if(isnan(v))
+                      assert(0);
+#endif
+                    
+                    leftLH = v;
+                    leftRate = initialRate - k * lower_spacing;
+                    k++;          
+                  }      
+                
+                k = 1;
+                
+                while(((v = evaluatePartialGeneric(tr, pr, localIndex, initialRate + k * upper_spacing, model)) > rightLH) &&
+                      (fabs(rightLH - v) > epsilon))            
+                  {
+#ifndef WIN32
+                    if(isnan(v))
+                      assert(0);
+#endif     
+                    rightLH = v;
+                    rightRate = initialRate + k * upper_spacing;         
+                    k++;
+                  }           
+                
+                if(rightLH > initialLikelihood || leftLH > initialLikelihood)
+                  {
+                    if(rightLH > leftLH)            
+                      {      
+                        tr->patrat[i] = rightRate;
+                        lhs[i] = rightLH;
+                      }
+                    else
+                      {       
+                        tr->patrat[i] = leftRate;
+                        lhs[i] = leftLH;
+                      }
+                  }
+                else
+                  lhs[i] = initialLikelihood;
+                
+                tr->patratStored[i] = tr->patrat[i];
+                localIndex++;
+              }
+          }
+      assert(localIndex == pr->partitionData[model]->width);
+    }
+}
+
+
+
+#else
+
+/** @brief Optimize rates for CAT model
+ *
+ *  @param tr
+ *    PLL instance
+ *
+ *  @param pr
+ *    List of partitions
+ *
+ *  @param model
+ *    Partition index
+ *
+ *  @param lower_specing
+ *
+ *  @param upper_spacing
+ *
+ *  @param lhs
+ */
+static void optRateCatModel(pllInstance *tr, partitionList *pr, int model, double lower_spacing, double upper_spacing, double *lhs)
+{
+  int lower = pr->partitionData[model]->lower;
+  int upper = pr->partitionData[model]->upper;
+  int i;
+  for(i = lower; i < upper; i++)
+    {
+      double initialRate, initialLikelihood, 
+        leftLH, rightLH, leftRate, rightRate, v;
+      const double epsilon = 0.00001;
+      int k;
+      
+      tr->patrat[i] = tr->patratStored[i];     
+      initialRate = tr->patrat[i];
+      
+      initialLikelihood = evaluatePartialGeneric(tr, pr, i, initialRate, model);
+      
+      
+      leftLH = rightLH = initialLikelihood;
+      leftRate = rightRate = initialRate;
+      
+      k = 1;
+      
+      while((initialRate - k * lower_spacing > 0.0001) && 
+            ((v = evaluatePartialGeneric(tr, pr, i, initialRate - k * lower_spacing, model))
+             > leftLH) && 
+            (fabs(leftLH - v) > epsilon))  
+        {         
+#ifndef WIN32
+          if(isnan(v))
+            assert(0);
+#endif
+          
+          leftLH = v;
+          leftRate = initialRate - k * lower_spacing;
+          k++;    
+        }      
+      
+      k = 1;
+      
+      while(((v = evaluatePartialGeneric(tr, pr, i, initialRate + k * upper_spacing, model)) > rightLH) &&
+            (fabs(rightLH - v) > epsilon))      
+        {
+#ifndef WIN32
+          if(isnan(v))
+            assert(0);
+#endif     
+          rightLH = v;
+          rightRate = initialRate + k * upper_spacing;   
+          k++;
+        }           
+  
+      if(rightLH > initialLikelihood || leftLH > initialLikelihood)
+        {
+          if(rightLH > leftLH)      
+            {        
+              tr->patrat[i] = rightRate;
+              lhs[i] = rightLH;
+            }
+          else
+            {         
+              tr->patrat[i] = leftRate;
+              lhs[i] = leftLH;
+            }
+        }
+      else
+        lhs[i] = initialLikelihood;
+      
+      tr->patratStored[i] = tr->patrat[i];
+    }
+
+}
+
+
+#endif
+
+
+
+/* 
+   set scaleRates to PLL_FALSE everywhere such that 
+   per-site rates are not scaled to obtain an overall mean rate 
+   of 1.0
+*/
+
+void updatePerSiteRates(pllInstance *tr, partitionList *pr, boolean scaleRates)
+{
+  int 
+    i,
+    model;
+
+  if(pr->perGeneBranchLengths && pr->numberOfPartitions > 1)
+    {            
+      for(model = 0; model < pr->numberOfPartitions; model++)
+        {
+          int          
+            lower = pr->partitionData[model]->lower,
+            upper = pr->partitionData[model]->upper;
+          
+          if(scaleRates)
+            {
+              double 
+                scaler = 0.0,       
+                accRat = 0.0; 
+
+              int 
+                accWgt     = 0;
+              
+              for(i = lower; i < upper; i++)
+                {
+                  int 
+                    w = tr->aliaswgt[i];
+                  
+                  double
+                    rate = pr->partitionData[model]->perSiteRates[tr->rateCategory[i]];
+                  
+                  assert(0 <= tr->rateCategory[i] && tr->rateCategory[i] < tr->maxCategories);
+                  
+                  accWgt += w;
+                  
+                  accRat += (w * rate);
+                }          
+          
+              accRat /= ((double)accWgt);
+          
+              scaler = 1.0 / ((double)accRat);
+                  
+              for(i = 0; i < pr->partitionData[model]->numberOfCategories; i++)
+                pr->partitionData[model]->perSiteRates[i] *= scaler;
+
+              accRat = 0.0;      
+              
+              for(i = lower; i < upper; i++)
+                {
+                  int 
+                    w = tr->aliaswgt[i];
+                  
+                  double
+                    rate = pr->partitionData[model]->perSiteRates[tr->rateCategory[i]];
+                  
+                  assert(0 <= tr->rateCategory[i] && tr->rateCategory[i] < tr->maxCategories);        
+                  
+                  accRat += (w * rate);
+                }                
+
+              accRat /= ((double)accWgt);         
+
+              assert(PLL_ABS(1.0 - accRat) < 1.0E-5);
+            }
+          else
+            {
+              double               
+                accRat = 0.0; 
+
+              int 
+                accWgt     = 0;
+              
+              for(i = lower; i < upper; i++)
+                {
+                  int 
+                    w = tr->aliaswgt[i];
+                  
+                  double
+                    rate = pr->partitionData[model]->perSiteRates[tr->rateCategory[i]];
+                  
+                  assert(0 <= tr->rateCategory[i] && tr->rateCategory[i] < tr->maxCategories);
+                  
+                  accWgt += w;
+                  
+                  accRat += (w * rate);
+                }          
+          
+              accRat /= ((double)accWgt);
+              
+              assert(PLL_ABS(1.0 - accRat) < 1.0E-5);
+            }
+
+          
+#if NOT (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+          {
+            int 
+              localCount = 0;
+            
+            for(i = lower, localCount = 0; i < upper; i++, localCount++)
+              {               
+                pr->partitionData[model]->rateCategory[localCount] = tr->rateCategory[i];
+              }
+          }
+#endif
+        }
+    }
+  else
+    {
+      int
+        accWgt = 0;
+
+      double 
+        scaler = 0.0,       
+        accRat = 0.0; 
+
+      if(scaleRates)
+        {
+          for(model = 0, accRat = 0.0, accWgt = 0; model < pr->numberOfPartitions; model++)
+            {
+              int 
+                localCount = 0,
+                lower = pr->partitionData[model]->lower,
+                upper = pr->partitionData[model]->upper;
+              
+              for(i = lower, localCount = 0; i < upper; i++, localCount++)
+                {
+                  int 
+                    w = tr->aliaswgt[i];
+                  
+                  double
+                    rate = pr->partitionData[model]->perSiteRates[tr->rateCategory[i]];
+                  
+                  assert(0 <= tr->rateCategory[i] && tr->rateCategory[i] < tr->maxCategories);
+                  
+                  accWgt += w;
+                  
+                  accRat += (w * rate);
+                }
+            }
+          
+          accRat /= ((double)accWgt);
+          
+          scaler = 1.0 / ((double)accRat);
+          
+          for(model = 0; model < pr->numberOfPartitions; model++)
+            {
+              for(i = 0; i < pr->partitionData[model]->numberOfCategories; i++)
+                pr->partitionData[model]->perSiteRates[i] *= scaler;
+            }
+
+          for(model = 0, accRat = 0.0; model < pr->numberOfPartitions; model++)
+            {
+              int 
+                localCount = 0,
+                lower = pr->partitionData[model]->lower,
+                upper = pr->partitionData[model]->upper;
+              
+              for(i = lower, localCount = 0; i < upper; i++, localCount++)
+                {
+                  int 
+                    w = tr->aliaswgt[i];
+                  
+                  double
+                    rate = pr->partitionData[model]->perSiteRates[tr->rateCategory[i]];
+                  
+                  assert(0 <= tr->rateCategory[i] && tr->rateCategory[i] < tr->maxCategories);        
+                  
+                  accRat += (w * rate);
+                }
+            }           
+
+          accRat /= ((double)accWgt);     
+
+          assert(PLL_ABS(1.0 - accRat) < 1.0E-5);
+        }
+      else
+        {
+          for(model = 0, accRat = 0.0, accWgt = 0; model < pr->numberOfPartitions; model++)
+            {
+              int 
+                localCount = 0,
+                lower = pr->partitionData[model]->lower,
+                upper = pr->partitionData[model]->upper;
+              
+              for(i = lower, localCount = 0; i < upper; i++, localCount++)
+                {
+                  /* int  */
+                  /*   w = tr->aliaswgt[i]; */
+		  int w = pr->partitionData[model]->wgt[localCount]; 
+                  
+                  double
+                    rate = pr->partitionData[model]->perSiteRates[tr->rateCategory[i]];
+                  
+                  assert(0 <= tr->rateCategory[i] && tr->rateCategory[i] < tr->maxCategories);
+                  
+                  accWgt += w;
+                  
+                  accRat += (w * rate);
+                }
+            }
+          
+          accRat /=  (double)accWgt;
+
+          assert(PLL_ABS(1.0 - accRat) < 1.0E-5);
+        }
+         
+         /*
+       for(model = 0; model < pr->numberOfPartitions; model++)
+        {
+          int 
+            localCount = 0,
+            lower = pr->partitionData[model]->lower,
+            upper = pr->partitionData[model]->upper;
+
+        }  */       
+#if NOT (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+      for(model = 0; model < pr->numberOfPartitions; model++)
+        {                        
+          int 
+            localCount,
+            lower = pr->partitionData[model]->lower,
+            upper = pr->partitionData[model]->upper;
+          
+          for(i = lower, localCount = 0; i < upper; i++, localCount++)
+              pr->partitionData[model]->rateCategory[localCount] = tr->rateCategory[i];
+        }
+#endif
+    }
+  
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+  pllMasterBarrier(tr, pr, PLL_THREAD_COPY_RATE_CATS);
+#endif               
+}
+
+/** @brief Optimize rate categories for CAT model
+ *
+ *  Optimize rate categories for CAT model
+ *
+ *  @param tr
+ *    PLL instance
+ *
+ *  @param pr
+ *    List of partitions
+ *
+ *  @param _maxCategories
+ *    Number of categories
+ */
+static void optimizeRateCategories(pllInstance *tr, partitionList *pr, int _maxCategories)
+{
+  assert(_maxCategories > 0);
+
+  if(_maxCategories > 1)
+    {
+      double  
+        temp,  
+        lower_spacing, 
+        upper_spacing,
+        initialLH = tr->likelihood,     
+        *ratStored = (double *)rax_malloc(sizeof(double) * tr->originalCrunchedLength),
+        /**lhs =       (double *)malloc(sizeof(double) * tr->originalCrunchedLength),*/
+        **oldCategorizedRates = (double **)rax_malloc(sizeof(double *) * pr->numberOfPartitions);
+
+      int  
+        i,
+        k,
+        maxCategories = _maxCategories,
+        *oldCategory =  (int *)rax_malloc(sizeof(int) * tr->originalCrunchedLength),
+        model,
+        *oldNumbers = (int *)rax_malloc(sizeof(int) * pr->numberOfPartitions);
+  
+      assert(isTip(tr->start->number, tr->mxtips));         
+      
+      pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+
+      if(tr->optimizeRateCategoryInvocations == 1)
+        {
+          lower_spacing = 0.5 / ((double)(tr->optimizeRateCategoryInvocations));
+          upper_spacing = 1.0 / ((double)(tr->optimizeRateCategoryInvocations));
+        }
+      else
+        {
+          lower_spacing = 0.05 / ((double)(tr->optimizeRateCategoryInvocations));
+          upper_spacing = 0.1 / ((double)(tr->optimizeRateCategoryInvocations));
+        }
+      
+      if(lower_spacing < 0.001)
+        lower_spacing = 0.001;
+      
+      if(upper_spacing < 0.001)
+        upper_spacing = 0.001;
+      
+      tr->optimizeRateCategoryInvocations = tr->optimizeRateCategoryInvocations + 1;
+
+      memcpy(oldCategory, tr->rateCategory, sizeof(int) * tr->originalCrunchedLength);       
+      memcpy(ratStored,   tr->patratStored, sizeof(double) * tr->originalCrunchedLength);
+
+      for(model = 0; model < pr->numberOfPartitions; model++)
+        {
+          oldNumbers[model]          = pr->partitionData[model]->numberOfCategories;
+
+          oldCategorizedRates[model] = (double *)rax_malloc(sizeof(double) * tr->maxCategories);
+          
+          memcpy(oldCategorizedRates[model], pr->partitionData[model]->perSiteRates, tr->maxCategories * sizeof(double));
+        }      
+      
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+      /*tr->lhs = lhs;*/
+      tr->lower_spacing = lower_spacing;
+      tr->upper_spacing = upper_spacing;
+      pllMasterBarrier(tr, pr, PLL_THREAD_RATE_CATS);
+#else      
+      for(model = 0; model < pr->numberOfPartitions; model++)
+        optRateCatModel(tr, pr, model, lower_spacing, upper_spacing, tr->lhs);
+#endif     
+
+      for(model = 0; model < pr->numberOfPartitions; model++)
+        {     
+          int 
+            where = 1,
+            found = 0,
+            width = pr->partitionData[model]->upper -  pr->partitionData[model]->lower,
+            upper = pr->partitionData[model]->upper,
+            lower = pr->partitionData[model]->lower;
+            
+          rateCategorize 
+            *rc = (rateCategorize *)rax_malloc(sizeof(rateCategorize) * width);          
+        
+          for (i = 0; i < width; i++)
+            {
+              rc[i].accumulatedSiteLikelihood = 0.0;
+              rc[i].rate = 0.0;
+            }  
+        
+          rc[0].accumulatedSiteLikelihood = tr->lhs[lower];
+          rc[0].rate = tr->patrat[lower];
+        
+          tr->rateCategory[lower] = 0;
+        
+          for (i = lower + 1; i < upper; i++) 
+            {
+              temp = tr->patrat[i];
+              found = 0;
+            
+              for(k = 0; k < where; k++)
+                {
+                  if(temp == rc[k].rate || (fabs(temp - rc[k].rate) < 0.001))
+                    {
+                      found = 1;                                                
+                      rc[k].accumulatedSiteLikelihood += tr->lhs[i];    
+                      break;
+                    }
+                }
+            
+              if(!found)
+                {           
+                  rc[where].rate = temp;            
+                  rc[where].accumulatedSiteLikelihood += tr->lhs[i];        
+                  where++;
+                }
+            }
+        
+          qsort(rc, where, sizeof(rateCategorize), catCompare);
+        
+          if(where < maxCategories)
+            {
+              pr->partitionData[model]->numberOfCategories = where;
+              categorizePartition(tr, pr, rc, model, lower, upper);
+            }
+          else
+            {
+              pr->partitionData[model]->numberOfCategories = maxCategories;
+              categorizePartition(tr, pr, rc, model, lower, upper);
+            }
+        
+          rax_free(rc);
+        }
+                
+      updatePerSiteRates(tr, pr, PLL_TRUE);
+
+      pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+      
+      if(tr->likelihood < initialLH)
+        {                         
+          for(model = 0; model < pr->numberOfPartitions; model++)
+            {
+              pr->partitionData[model]->numberOfCategories = oldNumbers[model];
+              memcpy(pr->partitionData[model]->perSiteRates, oldCategorizedRates[model], tr->maxCategories * sizeof(double));
+            }         
+          
+          memcpy(tr->patratStored, ratStored, sizeof(double) * tr->originalCrunchedLength);
+          memcpy(tr->rateCategory, oldCategory, sizeof(int) * tr->originalCrunchedLength);           
+          
+          updatePerSiteRates(tr, pr, PLL_FALSE);
+          
+          pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+
+          /* printf("REVERT: %1.40f %1.40f\n", initialLH, tr->likelihood); */
+
+          assert(initialLH == tr->likelihood);
+        }
+          
+      for(model = 0; model < pr->numberOfPartitions; model++)
+        rax_free(oldCategorizedRates[model]);
+                   
+      rax_free(oldCategorizedRates);
+      rax_free(oldCategory);
+      rax_free(ratStored);       
+      /*     rax_free(lhs); */
+      rax_free(oldNumbers);
+    }
+}
+  
+
+/************************* end of functions for CAT model of rate heterogeneity */
+
+
+
+
+/*****************************************************************************************************/
+
+/* reset all branche lengths in tree to default values */
+
+/** @brief Reset all branch lengths to default values
+  
+    Reset all branch lengths in the tree instance to default values (\b PLL_DEFAULTZ)
+
+    @param tr
+      PLL instance
+  */
+void resetBranches(pllInstance *tr)
+{
+  nodeptr  p, q;
+  int  nodes, i;
+  
+  nodes = tr->mxtips  +  3 * (tr->mxtips - 2);
+  p = tr->nodep[1];
+  while (nodes-- > 0) 
+    {   
+      for(i = 0; i < PLL_NUM_BRANCHES; i++)
+        p->z[i] = PLL_DEFAULTZ;
+        
+      q = p->next;
+      while(q != p)
+        {       
+          for(i = 0; i < PLL_NUM_BRANCHES; i++)
+            q->z[i] = PLL_DEFAULTZ;         
+          q = q->next;
+        }
+      p++;
+    }
+}
+
+/* 
+   automatically compute the best protein substitution model for the dataset at hand.
+ */
+
+/** @brief Compute the best protein substitution model
+  *
+  * Automatically compute the best protein substitution model for the dataset
+  * at hand
+  *
+  * @param tr
+  *   The PLL instance
+  *
+  * @param pr
+  *   List of partitions
+  *
+  */
+static void autoProtein(pllInstance *tr, partitionList *pr)
+{
+  int 
+    countAutos = 0,
+    model;
+    
+  /* count the number of partitions with model set to PLL_AUTO */
+  for(model = 0; model < pr->numberOfPartitions; model++)
+    if(pr->partitionData[model]->protModels == PLL_AUTO)
+      countAutos++;
+  
+  /* if there are partitions with model set to PLL_AUTO compute the best model */
+  if(countAutos > 0)
+    {
+      int 
+        i,
+        numProteinModels = PLL_AUTO,
+        *bestIndex = (int*)rax_malloc(sizeof(int) * pr->numberOfPartitions),
+        *oldIndex  = (int*)rax_malloc(sizeof(int) * pr->numberOfPartitions);
+
+      double
+        startLH,
+        *bestScores = (double*)rax_malloc(sizeof(double) * pr->numberOfPartitions);
+
+      topolRELL_LIST 
+        *rl = (topolRELL_LIST *)rax_malloc(sizeof(topolRELL_LIST));
+
+      initTL(rl, tr, 1);
+      saveTL(rl, tr, 0);
+
+      pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE); 
+
+      /* store the initial likelihood of the tree with the currently assigned protein models */
+      startLH = tr->likelihood;
+      
+      /* save the currently assigned protein model for each PLL_AUTO partition */
+      for(model = 0; model < pr->numberOfPartitions; model++)
+        {
+          oldIndex[model] = pr->partitionData[model]->autoProtModels;
+          bestIndex[model] = -1;
+          bestScores[model] = PLL_UNLIKELY;
+        }
+
+      /* check what is the likelihood for every possible protein model */
+      for(i = 0; i < numProteinModels; i++)
+       {
+         for(model = 0; model < pr->numberOfPartitions; model++)
+           {       
+             if(pr->partitionData[model]->protModels == PLL_AUTO)
+              {
+                 pr->partitionData[model]->autoProtModels = i;
+                 pllInitReversibleGTR(tr, pr, model);
+              }
+           }
+          
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+           pllMasterBarrier (tr, pr, PLL_THREAD_COPY_RATES);
+#endif
+          
+           resetBranches(tr);
+           pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+           pllOptimizeBranchLengths(tr, pr, 16);// 0.5 * 32 = 16.0
+
+           for(model = 0; model < pr->numberOfPartitions; model++)
+            {
+              if(pr->partitionData[model]->protModels == PLL_AUTO)
+               {
+                 if(pr->partitionData[model]->partitionLH > bestScores[model])
+                  {
+                    bestScores[model] = pr->partitionData[model]->partitionLH;
+                    bestIndex[model] = i;                     
+                  }
+               }
+            }
+       }
+
+      /* set the protein model of PLL_AUTO partitions to the best computed and reset model parameters */
+      for(model = 0; model < pr->numberOfPartitions; model++)
+       {           
+         if(pr->partitionData[model]->protModels == PLL_AUTO)
+           {
+             pr->partitionData[model]->autoProtModels = bestIndex[model];
+             pllInitReversibleGTR(tr, pr, model);
+           }
+       }
+            
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+      pllMasterBarrier(tr, pr, PLL_THREAD_COPY_RATES);
+#endif
+
+      /* compute again the likelihood of the tree */
+      resetBranches(tr);
+      pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+      pllOptimizeBranchLengths(tr, pr, 64); // 0.5 * 32 = 16
+      
+      /* check if the likelihood of the tree with the new protein models assigned to PLL_AUTO partitions is better than the with the old protein models */
+      if(tr->likelihood < startLH)
+        {       
+          for(model = 0; model < pr->numberOfPartitions; model++)
+            {
+              if(pr->partitionData[model]->protModels == PLL_AUTO)
+                {
+                  pr->partitionData[model]->autoProtModels = oldIndex[model];
+                  pllInitReversibleGTR(tr, pr, model);
+                }
+            }
+          
+          //this barrier needs to be called in the library        
+          //#ifdef _USE_PTHREADS        
+          //pllMasterBarrier(tr, pr, PLL_THREAD_COPY_RATES);
+          //#endif 
+
+          /* Restore the topology. rl holds the topology before the optimization. However,
+             since the topology doesn't change - only the branch lengths do - maybe we
+             could write a new routine that will store only the branch lengths and restore them */
+          restoreTL(rl, tr, 0, pr->perGeneBranchLengths ? pr->numberOfPartitions : 1);  
+          pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);              
+        }
+      
+      assert(tr->likelihood >= startLH);
+      /*printf("Exit: %f\n", tr->likelihood);*/
+
+      freeTL(rl);   
+      rax_free(rl); 
+      
+      rax_free(oldIndex);
+      rax_free(bestIndex);
+      rax_free(bestScores);
+    }
+}
+
+
+/* iterative procedure for optimizing all model parameters */
+
+/* @brief Optimize all model parameters
+ *
+ * Iterative procedure for optimizing all model parameters
+ *
+ * @param tr
+ *   PLL instance
+ *
+ * @param pr
+ *   List of partitions
+ *
+ * @param likelihoodEpsilon
+ *   Optimize model parameters until we get a difference of \a likelihoodEpsilon
+ *
+ * @todo
+ *   Describe likelihoodEpsilon. Understand the TODO marked blocks.
+ */
+void modOpt(pllInstance *tr, partitionList *pr, double likelihoodEpsilon)
+{ 
+  int catOpt = 0; 
+  double 
+    inputLikelihood,
+    currentLikelihood,
+    modelEpsilon = 0.0001;
+
+  /* linkage lists for alpha, p-invar has actually been ommitted in this version of the code 
+     and the GTR subst matrices */
+
+  linkageList
+    *alphaList = pr->alphaList,
+    *rateList  = pr->rateList,
+    *freqList  = pr->freqList;
+
+  modelEpsilon = 0.0001;
+
+  // test code for library
+  if (0)
+   {
+     
+      //assuming that we have three partitions for testing here 
+
+      //alphaList = initLinkageListString("0,1,2", pr);
+      //rateList  = initLinkageListString("0,1,1", pr);
+    
+      //init_Q_MatrixSymmetries("0,1,2,3,4,5", pr, 0);
+      //init_Q_MatrixSymmetries("0,1,2,3,4,4", pr, 1);
+      //init_Q_MatrixSymmetries("0,1,1,2,3,4", pr, 2);
+      
+      //function that checks that partitions that have linked Q matrices as in our example above
+      //will not have different configurations of the Q matrix as set by the init_Q_MatrixSymmetries() function
+      //e.g., on would have HKY and one would have GTR, while the user claimes that they are linked
+      //in our example, the Q matrices of partitions 1 and 2 are linked 
+      //but we set different matrix symmetries via 
+      // init_Q_MatrixSymmetries("0,1,2,3,4,4", tr, 1);
+      // and
+      // init_Q_MatrixSymmetries("0,1,1,2,3,4", tr, 2);
+      //
+      //the function just let's assertions fail for the time being .....
+
+      //checkMatrixSymnmetriesAndLinkage(pr, rateList);
+
+  /* alpha parameters and p-invar parameters are unlinked.
+     this is the point where I actually hard-coded this in RAxML */
+
+  /* call the dedicated function for linking the GTR matrix across all AA data partitions 
+     If we have only DNA data all GTR matrix estimates will be unlinked.
+     */
+   }
+  else
+   {
+     //alphaList = initLinkageList(unlinked, pr);
+     //freqList  = initLinkageList(unlinked, pr);
+     //rateList  = initLinkageListGTR(pr);
+   }
+
+  tr->start = tr->nodep[1];
+
+  /* This check is here to make sure that the likelihood 
+     computed prior to entering modOpt() is consistent 
+     with the likelihood when entering modOpt().
+     This allows us to ensure that we didn't forget to update anything prior 
+     to entereing this function.
+   */
+  inputLikelihood = tr->likelihood;
+  pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+  assert (inputLikelihood == tr->likelihood);
+
+  do
+  {           
+    //printBothOpen("cur LH: %f\n", tr->likelihood);
+    currentLikelihood = tr->likelihood;     
+
+#ifdef _DEBUG_MOD_OPT
+      printf ("start: %f\n", currentLikelihood);
+#endif
+
+    pllOptRatesGeneric(tr, pr, modelEpsilon, rateList);
+
+    pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+
+#ifdef _DEBUG_MOD_OPT
+    printf ("after rates %f\n", tr->likelihood);
+#endif
+
+    autoProtein(tr, pr);
+
+    pllOptimizeBranchLengths(tr, pr, 2); // 0.0625 * 32 = 2.0
+
+#ifdef _DEBUG_MOD_OPT
+    pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+    printf("after br-len 1 %f\n", tr->likelihood); 
+#endif
+
+    pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+
+    pllOptBaseFreqs(tr, pr, modelEpsilon, freqList);
+    
+    pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+    
+    pllOptimizeBranchLengths(tr, pr, 2); // 0.0625 * 32 = 2.0
+
+#ifdef _DEBUG_MOD_OPT
+    pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE); 
+    printf("after pllOptBaseFreqs 1 %f\n", tr->likelihood);
+#endif 
+
+    switch(tr->rateHetModel)
+    {
+      case PLL_GAMMA:      
+        pllOptAlphasGeneric (tr, pr, modelEpsilon, alphaList);
+        pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+
+#ifdef _DEBUG_MOD_OPT
+          printf("after alphas %f\n", tr->likelihood); 
+#endif
+
+        pllOptimizeBranchLengths(tr, pr, 3); // 0.1 * 32 = 3.2
+
+#ifdef _DEBUG_MOD_OPT
+          pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);  
+          printf("after br-len 2 %f\n", tr->likelihood); 
+#endif
+        break;
+      case PLL_CAT:
+        if(catOpt < 3)
+        {                            
+          pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);  
+          optimizeRateCategories(tr, pr, tr->categories);
+#ifdef _DEBUG_MOD_OPT
+            pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);  
+            printf("after cat-opt %f\n", tr->likelihood); 
+#endif
+          catOpt++;
+        }
+        break;    
+      default:
+        assert(0);
+    }                   
+
+    if(tr->likelihood < currentLikelihood)
+     {
+      printf("%.20f %.20f\n", tr->likelihood, currentLikelihood);
+      printf("Difference: %.20f\n",tr->likelihood - currentLikelihood);
+    }
+    assert (tr->likelihood - currentLikelihood > 0.000000000000001);
+    //assert(tr->likelihood > currentLikelihood);
+
+  }
+  while(fabs(currentLikelihood - tr->likelihood) > likelihoodEpsilon);  
+  /* TODO: Why do we check the computed likelihood with the currentLikelihood which is the likelihood before THIS optimization loop? Why dont we
+     rather check it with the initial likelihood (the one before calling modOpt)? Isn't it possible to have a deadlock? */
+
+  
+}
+
diff --git a/lib/pll/parsePartition.c b/lib/pll/parsePartition.c
new file mode 100644
index 0000000..1eef444
--- /dev/null
+++ b/lib/pll/parsePartition.c
@@ -0,0 +1,394 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file parsePartition.c
+ * @brief Collection of routines for parsing and processing a partition (model) file
+ *
+ * @defgroup parsePartitionFileGroup Reading and parsing partition (model) files
+ * This set of functions handles the reading and parsing of partition files, i.e.
+ * files that contain alignment partition definitions and corresponding models.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <math.h>
+#include <ctype.h>
+
+#include "pll.h"
+#include "pllInternal.h"
+
+extern const char *protModels[PLL_NUM_PROT_MODELS];
+
+static void destroy_model_names(pllHashTable * hashTable)
+{
+  pllHashDestroy (&hashTable, rax_free);
+}
+
+static pllHashTable * init_model_names (void)
+{
+  int i;
+  int * item;
+
+  pllHashTable * hashTable;
+  hashTable = pllHashInit (PLL_NUM_PROT_MODELS);
+
+  for (i = 0; i < PLL_NUM_PROT_MODELS; ++ i)
+   {
+     item  = (int *) rax_malloc (sizeof (int));
+     *item = i;
+     pllHashAdd (hashTable, pllHashString(protModels[i], hashTable->size), protModels[i], (void *) item);
+   }
+  return hashTable;
+}
+
+/** @ingroup parsePartitionFileGroup
+    @brief Destroy queue structure that contains parsed information from a partition file
+
+    Destroys the structure, and therefore frees allocated memory, that holds parsed information
+    from a partition (model) file
+
+    @param partitions
+      Queue structure with parsed info
+*/
+void pllQueuePartitionsDestroy (pllQueue ** partitions)
+{
+  pllPartitionInfo * pi;
+  pllPartitionRegion * region;
+
+  while (pllQueueRemove (*partitions, (void **)&pi))
+   {
+     while (pllQueueRemove (pi->regionList, (void **) &region))
+      {
+        rax_free (region);
+      }
+     rax_free (pi->regionList);
+     rax_free (pi->partitionName);
+     rax_free (pi->partitionModel);
+     rax_free (pi);
+   }
+  rax_free (*partitions);
+}
+
+static pllQueue * parse_partition (int * inp, pllHashTable * proteinModelsHash)
+{
+  int input, i;
+  pllLexToken token;
+  int lines = 0;
+  pllQueue * partitions;
+  pllPartitionInfo * pi;
+  pllPartitionRegion * region;
+  int * protIndexPtr;
+  char * modelptr;
+
+  input  = *inp;
+
+  NEXT_TOKEN
+
+  pllQueueInit (&partitions);
+  while (token.tokenType != PLL_TOKEN_EOF)
+  {
+    ++ lines;
+    pi = (pllPartitionInfo *) rax_calloc (1, sizeof (pllPartitionInfo));
+    pllQueueInit (&(pi->regionList));
+    pllQueueAppend (partitions, (void *)pi);
+    CONSUME (PLL_TOKEN_WHITESPACE | PLL_TOKEN_NEWLINE)
+
+
+    /* read partition type */
+    if (token.tokenType != PLL_TOKEN_STRING) 
+     {
+       pllQueuePartitionsDestroy (&partitions);
+       return (0);
+     }
+    //pi->partitionModel = strndup (token.lexeme, token.len);
+    pi->partitionModel = (char *) rax_malloc ((token.len + 1) * sizeof (char));
+    strncpy (pi->partitionModel, token.lexeme, token.len);
+    pi->partitionModel[token.len] = 0;
+    for (i = 0; i < token.len; ++i) pi->partitionModel[i] = toupper(pi->partitionModel[i]);
+
+    // check partition model
+    pi->protModels = -1;
+    pi->protUseEmpiricalFreqs   = PLL_FALSE;
+    pi->ascBias                 = PLL_FALSE;
+    pi->optimizeBaseFrequencies = PLL_FALSE;
+
+    /* check if the model contains Asc bias */
+    if (!strncmp(pi->partitionModel, "ASC_", 4))
+     {
+        pi->ascBias = PLL_TRUE;
+        modelptr    = pi->partitionModel + 4;
+     }
+     else
+        modelptr    = pi->partitionModel;
+
+    /* check first for BINARY */
+    if (!strcmp(modelptr, "BIN") || !strcmp(modelptr, "BINX"))
+     {
+       pi->dataType = PLL_BINARY_DATA;
+
+       if (!strcmp(modelptr, "BINX"))
+         pi->optimizeBaseFrequencies = PLL_TRUE;
+     }  /* now for DNA */
+    else if (!strcmp(modelptr, "DNA") || !strcmp(modelptr, "DNAX"))
+     {
+       pi->dataType   = PLL_DNA_DATA;
+
+       if (!strcmp(modelptr, "DNAX")) 
+       pi->optimizeBaseFrequencies = PLL_TRUE; 
+     }
+    else
+     {                  /* and  protein data */
+       pi->dataType  = PLL_AA_DATA;
+
+       if (pllHashSearch (proteinModelsHash, modelptr, (void **) &protIndexPtr))
+        {
+          pi->protModels              = *protIndexPtr;
+          pi->protUseEmpiricalFreqs  = PLL_FALSE;
+          pi->optimizeBaseFrequencies = PLL_FALSE;
+        }
+       else
+        {
+          if (modelptr[token.len - 1] == 'X')
+           {
+             modelptr[token.len - 1] = '\0';
+             if (pllHashSearch (proteinModelsHash, modelptr, (void **) &protIndexPtr))
+              {
+                pi->protModels              = *protIndexPtr;
+                pi->optimizeBaseFrequencies = PLL_TRUE;
+              }
+             modelptr[token.len - 1] = 'X';
+           }
+          else if (modelptr[token.len - 1] == 'F')
+           {
+             modelptr[token.len - 1] = '\0';
+             if (pllHashSearch (proteinModelsHash, modelptr, (void **) &protIndexPtr))
+              {
+                pi->protModels              = *protIndexPtr;
+                pi->protUseEmpiricalFreqs   = PLL_TRUE;
+              }
+             modelptr[token.len - 1] = 'F';
+           }
+          else
+           {
+             pllQueuePartitionsDestroy (&partitions);
+             return (0);
+           }
+        }
+     }
+
+    NEXT_TOKEN
+    CONSUME(PLL_TOKEN_WHITESPACE)
+
+    if (token.tokenType != PLL_TOKEN_COMMA) 
+     {
+       pllQueuePartitionsDestroy (&partitions);
+       return (0);
+     }
+    NEXT_TOKEN
+    CONSUME(PLL_TOKEN_WHITESPACE)
+
+    /* read partition name */
+    if (token.tokenType != PLL_TOKEN_STRING) 
+     {
+       pllQueuePartitionsDestroy (&partitions);
+       return (0);
+     }
+    //pi->partitionName = strndup (token.lexeme, token.len);
+    pi->partitionName = (char *) rax_malloc ((token.len + 1) * sizeof (char));
+    strncpy (pi->partitionName, token.lexeme, token.len);
+    pi->partitionName[token.len] = 0;
+
+    NEXT_TOKEN
+    CONSUME(PLL_TOKEN_WHITESPACE)
+
+    /* read equal sign */
+    if (token.tokenType != PLL_TOKEN_EQUAL)
+     {
+       pllQueuePartitionsDestroy (&partitions);
+       return (0);
+     }
+    NEXT_TOKEN
+    CONSUME(PLL_TOKEN_WHITESPACE)
+
+    /* read rhs */
+    while (1)
+    {
+      region = (pllPartitionRegion *) rax_malloc (sizeof (pllPartitionRegion));
+      if (token.tokenType != PLL_TOKEN_NUMBER) 
+       {
+         pllQueuePartitionsDestroy (&partitions);
+         return (0);
+       }
+      region->start  = region->end = atoi (token.lexeme);  
+      region->stride = 1;
+      NEXT_TOKEN
+      CONSUME(PLL_TOKEN_WHITESPACE)
+      
+      if  (token.tokenType == PLL_TOKEN_DASH)
+       {
+         NEXT_TOKEN
+         CONSUME(PLL_TOKEN_WHITESPACE)
+         if (token.tokenType != PLL_TOKEN_NUMBER) 
+          {
+            pllQueuePartitionsDestroy (&partitions);
+            return (0);
+          }
+         region->end = atoi (token.lexeme);
+         if (region->end < region->start)
+          {
+            pllQueuePartitionsDestroy (&partitions);
+            return (0);
+          }
+         NEXT_TOKEN
+         CONSUME(PLL_TOKEN_WHITESPACE)
+         if (token.tokenType == PLL_TOKEN_SLASH)
+          {
+            NEXT_TOKEN
+            CONSUME(PLL_TOKEN_WHITESPACE)
+            if (token.tokenType != PLL_TOKEN_NUMBER) 
+             {
+               pllQueuePartitionsDestroy (&partitions);
+               return (0);
+             }
+            region->stride = atoi (token.lexeme);
+            NEXT_TOKEN
+          }
+         CONSUME(PLL_TOKEN_WHITESPACE)
+       }
+       pllQueueAppend (pi->regionList, (void *)region);
+      
+      if (token.tokenType != PLL_TOKEN_COMMA) break;
+      NEXT_TOKEN
+      CONSUME(PLL_TOKEN_WHITESPACE)
+    }
+   CONSUME(PLL_TOKEN_WHITESPACE | PLL_TOKEN_NEWLINE)
+  }
+ 
+ return (partitions);
+} 
+
+/** @ingroup parsePartitionFileGroup
+    @brief Dump a parsed partition file in the console
+
+    Prints the parsed contents of a partition file to the console
+
+    @param partitions Queue structure containing parsed information
+*/
+void pllPartitionDump (pllQueue * partitions)
+{
+   struct pllQueueItem * elm;
+   struct pllQueueItem * regionList;
+   pllPartitionInfo * pi;
+   pllPartitionRegion * region;
+
+   elm = partitions->head;
+
+   while (elm)
+    {
+      pi  = (pllPartitionInfo *) elm->item;
+      printf ("%s, %s = ", pi->partitionModel, pi->partitionName);
+      regionList = pi->regionList->head;
+      while (regionList)
+       {
+         region = (pllPartitionRegion *) regionList->item;
+         printf ("%d", region->start);
+         if (region->start != region->end)
+          {
+            printf ("-%d", region->end);
+            if (region->stride != 1) printf ("/%d", region->stride);
+          }
+         regionList = regionList->next;
+         if (regionList) printf (", ");
+       }
+      printf ("\n");
+
+      elm = elm->next;
+    }
+}
+
+/** @ingroup parsePartitionFileGroup
+    @brief Parse a partition (model) file
+
+    Parses the partition file \a filename and stores the information in a queue
+    structure ::pllQueue
+
+    @param filename Name of the partition file
+    @return Queue structure with parsed information
+*/
+pllQueue * pllPartitionParse (const char * filename)
+{
+  long n;
+  char * rawdata;
+  int input;
+  pllQueue * partitions;
+
+  rawdata = pllReadFile (filename, &n);
+  if (!rawdata)
+   {
+     fprintf (stderr, "Error while opening/reading file %s\n", filename);
+     return (0);
+   }
+
+  n = strlen (rawdata);
+
+  init_lexan (rawdata, n);
+  input = get_next_symbol();
+
+  pllHashTable * model_names = init_model_names();
+  partitions = parse_partition (&input, model_names);
+  destroy_model_names(model_names);
+  
+  rax_free (rawdata);
+  return (partitions);
+}
+
+/** @ingroup parsePartitionFileGroup
+    @brief Parse a partition (model) file
+
+    Parses the partition information stored in string \a p and stores the
+    information in a queue structure ::pllQueue
+
+    @param p Partition information string
+    @return  Queue structure with parsed information
+*/
+pllQueue * pllPartitionParseString (const char * p)
+{
+  long n;
+  int input;
+  pllQueue * partitions;
+
+  n = strlen(p);
+  init_lexan (p, n);
+  input = get_next_symbol();
+
+  pllHashTable * model_names;
+  model_names = init_model_names();
+  partitions = parse_partition (&input, model_names);
+  destroy_model_names(model_names);
+  
+  return (partitions);
+}
diff --git a/lib/pll/parsePartition.h b/lib/pll/parsePartition.h
new file mode 100644
index 0000000..47799d9
--- /dev/null
+++ b/lib/pll/parsePartition.h
@@ -0,0 +1,51 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file part.h
+ */
+#ifndef __pll_PART__
+#define __pll_PART__
+#include "queue.h"
+
+typedef struct
+{
+  int start;
+  int end;
+  int stride;
+} pllPartitionRegion;
+
+typedef struct 
+{
+  char * partitionName;
+  char * partitionModel;
+  int protModels;
+  int protUseEmpiricalFreqs;
+  int dataType;
+  int ascBias;
+  int optimizeBaseFrequencies;
+  pllQueue * regionList;
+} pllPartitionInfo;
+#endif
diff --git a/lib/pll/parsimony.c b/lib/pll/parsimony.c
new file mode 100644
index 0000000..c566728
--- /dev/null
+++ b/lib/pll/parsimony.c
@@ -0,0 +1,878 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file parsimony.c
+ */
+#include "mem_alloc.h"
+
+#ifndef WIN32
+#include <sys/times.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <unistd.h>  
+#endif
+
+#include <limits.h>
+#include <math.h>
+#include <time.h> 
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdint.h>
+#include <assert.h>
+
+#if defined(__MIC_NATIVE)
+
+#include <immintrin.h>
+
+#define INTS_PER_VECTOR 16
+#define LONG_INTS_PER_VECTOR 8
+#define INT_TYPE __m512i
+#define CAST double*
+#define SET_ALL_BITS_ONE _mm512_set1_epi32(0xFFFFFFFF)
+#define SET_ALL_BITS_ZERO _mm512_setzero_epi32()
+#define VECTOR_LOAD _mm512_load_epi32
+#define VECTOR_STORE  _mm512_store_epi32
+#define VECTOR_BIT_AND _mm512_and_epi32
+#define VECTOR_BIT_OR  _mm512_or_epi32
+#define VECTOR_AND_NOT _mm512_andnot_epi32
+
+#elif defined(__AVX)
+
+#include <xmmintrin.h>
+#include <immintrin.h>
+#include <pmmintrin.h>
+
+#define ULINT_SIZE 64
+#define INTS_PER_VECTOR 8
+#define LONG_INTS_PER_VECTOR 4
+#define INT_TYPE __m256d
+#define CAST double*
+#define SET_ALL_BITS_ONE (__m256d)_mm256_set_epi32(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)
+#define SET_ALL_BITS_ZERO (__m256d)_mm256_set_epi32(0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000)
+#define VECTOR_LOAD _mm256_load_pd
+#define VECTOR_BIT_AND _mm256_and_pd
+#define VECTOR_BIT_OR  _mm256_or_pd
+#define VECTOR_STORE  _mm256_store_pd
+#define VECTOR_AND_NOT _mm256_andnot_pd
+
+#elif (defined(__SSE3))
+
+#include <xmmintrin.h>
+#include <pmmintrin.h>
+  
+#define INTS_PER_VECTOR 4
+#ifdef __i386__
+#define ULINT_SIZE 32
+#define LONG_INTS_PER_VECTOR 4
+#else
+#define ULINT_SIZE 64
+#define LONG_INTS_PER_VECTOR 2
+#endif
+#define INT_TYPE __m128i
+#define CAST __m128i*
+#define SET_ALL_BITS_ONE _mm_set_epi32(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)
+#define SET_ALL_BITS_ZERO _mm_set_epi32(0x00000000, 0x00000000, 0x00000000, 0x00000000)
+#define VECTOR_LOAD _mm_load_si128
+#define VECTOR_BIT_AND _mm_and_si128
+#define VECTOR_BIT_OR  _mm_or_si128
+#define VECTOR_STORE  _mm_store_si128
+#define VECTOR_AND_NOT _mm_andnot_si128
+
+#endif
+
+#include "pll.h"
+#include "pllInternal.h"
+
+extern const unsigned int mask32[32]; 
+
+static inline unsigned int vectorPopcount(INT_TYPE v)
+{
+  unsigned long
+    counts[LONG_INTS_PER_VECTOR] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+
+  int    
+    i,
+    sum = 0;
+
+  VECTOR_STORE((CAST)counts, v);
+
+  for(i = 0; i < LONG_INTS_PER_VECTOR; i++)
+     sum += __builtin_popcount(counts[i]);
+
+  return ((unsigned int)sum);
+}
+
+static inline void storePerSiteScores (partitionList * pr, int model, INT_TYPE v, unsigned int offset)
+{
+  unsigned long
+    counts[LONG_INTS_PER_VECTOR] __attribute__ ((aligned (PLL_BYTE_ALIGNMENT)));
+  parsimonyNumber * buf;
+
+  int    
+    i,
+    j;
+  
+  VECTOR_STORE((CAST)counts, v);
+
+  for (i = 0; i < LONG_INTS_PER_VECTOR; ++i)
+   {
+     buf = &(pr->partitionData[model]->perSiteParsScores[offset * PLL_PCF + i * ULINT_SIZE]);
+     for (j = 0; j < ULINT_SIZE; ++ j)
+        buf[j] += ((counts[i] >> j) & 1);
+   }
+  
+}
+
+static void getxnodeLocal (nodeptr p)
+{
+  nodeptr  s;
+
+  if((s = p->next)->xPars || (s = s->next)->xPars)
+    {
+      p->xPars = s->xPars;
+      s->xPars = 0;
+    }
+
+  assert(p->next->xPars || p->next->next->xPars || p->xPars);
+
+}
+
+static void computeTraversalInfoParsimony(nodeptr p, int *ti, int *counter, int maxTips, boolean full)
+{        
+  nodeptr 
+    q = p->next->back,
+    r = p->next->next->back;
+  
+  if(! p->xPars)
+    getxnodeLocal(p);  
+  
+  if(full)
+    {
+       if(q->number > maxTips) 
+         computeTraversalInfoParsimony(q, ti, counter, maxTips, full);
+      
+      if(r->number > maxTips) 
+        computeTraversalInfoParsimony(r, ti, counter, maxTips, full);
+    }
+  else
+    {
+      if(q->number > maxTips && !q->xPars) 
+        computeTraversalInfoParsimony(q, ti, counter, maxTips, full);
+      
+      if(r->number > maxTips && !r->xPars) 
+        computeTraversalInfoParsimony(r, ti, counter, maxTips, full);
+    }
+  
+  
+  ti[*counter]     = p->number;
+  ti[*counter + 1] = q->number;
+  ti[*counter + 2] = r->number;
+  *counter = *counter + 4;
+}
+
+/* check whether site contains at least 2 different letters, i.e.
+   whether it will generate a score */
+static boolean isInformative(pllInstance *tr, int dataType, int site)
+{
+  int
+    informativeCounter = 0,
+    check[256],   
+    j,   
+    undetermined = getUndetermined(dataType);
+
+  const unsigned int
+    *bitVector = getBitVector(dataType);
+
+  unsigned char
+    nucleotide;
+  
+        
+  for(j = 0; j < 256; j++)
+    check[j] = 0;
+  
+  for(j = 1; j <= tr->mxtips; j++)
+    {      
+      nucleotide = tr->yVector[j][site];            
+      check[nucleotide] = 1;
+      assert(bitVector[nucleotide] > 0);                   
+    }
+  
+  for(j = 0; j < undetermined; j++)
+    {
+      if(check[j] > 0)
+        informativeCounter++;    
+    } 
+          
+  if(informativeCounter > 1)
+    return PLL_TRUE;    
+
+  return PLL_FALSE;          
+}
+
+static void compressDNA(pllInstance *tr, partitionList *pr, int *informative, int perSiteScores)
+{
+  size_t
+    totalNodes,
+    i,
+    model;
+   
+  totalNodes = 2 * (size_t)tr->mxtips;
+
+ 
+
+  for(model = 0; model < (size_t) pr->numberOfPartitions; model++)
+    {
+      size_t
+        k,
+        states = (size_t)pr->partitionData[model]->states,
+        compressedEntries,
+        compressedEntriesPadded,
+        entries = 0, 
+        lower = pr->partitionData[model]->lower,
+        upper = pr->partitionData[model]->upper;
+
+      parsimonyNumber 
+        **compressedTips = (parsimonyNumber **)rax_malloc(states * sizeof(parsimonyNumber*)),
+        *compressedValues = (parsimonyNumber *)rax_malloc(states * sizeof(parsimonyNumber));
+      
+      for(i = lower; i < upper; i++)    
+        if(informative[i])
+          entries += (size_t)tr->aliaswgt[i];     
+  
+      compressedEntries = entries / PLL_PCF;
+
+      if(entries % PLL_PCF != 0)
+        compressedEntries++;
+
+#if (defined(__SSE3) || defined(__AVX))
+      if(compressedEntries % INTS_PER_VECTOR != 0)
+        compressedEntriesPadded = compressedEntries + (INTS_PER_VECTOR - (compressedEntries % INTS_PER_VECTOR));
+      else
+        compressedEntriesPadded = compressedEntries;
+#else
+      compressedEntriesPadded = compressedEntries;
+#endif     
+
+      
+      rax_posix_memalign ((void **) &(pr->partitionData[model]->parsVect), PLL_BYTE_ALIGNMENT, (size_t)compressedEntriesPadded * states * totalNodes * sizeof(parsimonyNumber));
+      if (perSiteScores)
+       {
+         rax_posix_memalign ((void **) &(pr->partitionData[model]->perSiteParsScores), PLL_BYTE_ALIGNMENT, (size_t)pr->partitionData[model]->width* sizeof (parsimonyNumber));
+         for (i = 0; i < (size_t)pr->partitionData[model]->width; ++i) pr->partitionData[model]->perSiteParsScores[i] = 0;
+       }
+
+     
+      for(i = 0; i < compressedEntriesPadded * states * totalNodes; i++)      
+        pr->partitionData[model]->parsVect[i] = 0;
+
+      for(i = 0; i < (size_t)tr->mxtips; i++)
+        {
+          size_t
+            w = 0,
+            compressedIndex = 0,
+            compressedCounter = 0,
+            index = 0;
+
+          for(k = 0; k < states; k++)
+            {
+              compressedTips[k] = &(pr->partitionData[model]->parsVect[(compressedEntriesPadded * states * (i + 1)) + (compressedEntriesPadded * k)]);
+              compressedValues[k] = 0;
+            }                
+              
+          for(index = lower; index < (size_t)upper; index++)
+            {
+              if(informative[index])
+                {
+                  const unsigned int 
+                    *bitValue = getBitVector(pr->partitionData[model]->dataType);
+
+                  parsimonyNumber 
+                    value = bitValue[tr->yVector[i + 1][index]];          
+              
+                  for(w = 0; w < (size_t)tr->aliaswgt[index]; w++)
+                    {      
+                      for(k = 0; k < states; k++)
+                        {
+                          if(value & mask32[k])
+                            compressedValues[k] |= mask32[compressedCounter];
+                        }
+                     
+                      compressedCounter++;
+                  
+                      if(compressedCounter == PLL_PCF)
+                        {
+                          for(k = 0; k < states; k++)
+                            {
+                              compressedTips[k][compressedIndex] = compressedValues[k];
+                              compressedValues[k] = 0;
+                            }                    
+                          
+                          compressedCounter = 0;
+                          compressedIndex++;
+                        }
+                    }
+                }
+            }
+          
+          for(;compressedIndex < compressedEntriesPadded; compressedIndex++)
+            {   
+              for(;compressedCounter < PLL_PCF; compressedCounter++)              
+                for(k = 0; k < states; k++)
+                  compressedValues[k] |= mask32[compressedCounter];               
+          
+              for(k = 0; k < states; k++)
+                {
+                  compressedTips[k][compressedIndex] = compressedValues[k];
+                  compressedValues[k] = 0;
+                }                     
+              
+              compressedCounter = 0;
+            }           
+        }
+  
+      pr->partitionData[model]->parsimonyLength = compressedEntriesPadded;
+
+      rax_free(compressedTips);
+      rax_free(compressedValues);
+    }
+  
+  rax_posix_memalign ((void **) &(tr->parsimonyScore), PLL_BYTE_ALIGNMENT, sizeof(unsigned int) * totalNodes);  
+          
+  for(i = 0; i < totalNodes; i++) 
+    tr->parsimonyScore[i] = 0;
+}
+
+static void determineUninformativeSites(pllInstance *tr, partitionList *pr, int *informative)
+{
+  int 
+    model,
+    number = 0,
+    i;
+
+  /* 
+     Not all characters are useful in constructing a parsimony tree. 
+     Invariant characters, those that have the same state in all taxa, 
+     are obviously useless and are ignored by the method. Characters in 
+     which a state occurs in only one taxon are also ignored. 
+     All these characters are called parsimony uninformative.
+
+     Alternative definition: informative columns contain at least two types
+     of nucleotides, and each nucleotide must appear at least twice in each 
+     column. Kind of a pain if we intend to check for this when using, e.g.,
+     amibiguous DNA encoding.
+  */
+
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+    {
+      for(i = pr->partitionData[model]->lower; i < pr->partitionData[model]->upper; i++)
+        {
+           if(isInformative(tr, pr->partitionData[model]->dataType, i))
+             informative[i] = 1;
+           else
+             {
+               informative[i] = 0;
+               number++;
+             }  
+        }      
+    }
+
+  /* printf("Uninformative Patterns: %d\n", number); */
+}
+
+void pllInitParsimonyStructures(pllInstance *tr, partitionList *pr, boolean perSiteScores)
+{
+  int 
+    i,
+    *informative = (int *)rax_malloc(sizeof(int) * (size_t)tr->originalCrunchedLength);
+
+  for (i = 0; i < pr->numberOfPartitions; ++ i)
+     rax_free (pr->partitionData[i]->parsVect);
+
+  rax_free (tr->parsimonyScore);
+ 
+  determineUninformativeSites(tr, pr, informative);
+
+  compressDNA(tr, pr, informative, perSiteScores);
+
+  for(i = tr->mxtips + 1; i <= tr->mxtips + tr->mxtips - 1; i++)
+    {
+      nodeptr 
+        p = tr->nodep[i];
+
+      p->xPars             = 1;
+      p->next->xPars       = 0;
+      p->next->next->xPars = 0;
+    }
+
+  tr->ti = (int*)rax_malloc(sizeof(int) * 4 * (size_t)tr->mxtips);  
+
+  rax_free(informative); 
+}
+
+static void newviewParsimonyIterativeFast(pllInstance *tr, partitionList *pr, boolean perSiteScores)
+{    
+  INT_TYPE
+    allOne = SET_ALL_BITS_ONE;
+
+  int 
+    model,
+    *ti = tr->ti,
+    count = ti[0],
+    index; 
+
+  for(index = 4; index < count; index += 4)
+    {      
+      unsigned int
+        totalScore = 0;
+
+      size_t
+        pNumber = (size_t)ti[index],
+        qNumber = (size_t)ti[index + 1],
+        rNumber = (size_t)ti[index + 2];
+      
+      for(model = 0; model < pr->numberOfPartitions; model++)
+        {
+          size_t
+            k,
+            states = pr->partitionData[model]->states,
+            width = pr->partitionData[model]->parsimonyLength;
+            
+          unsigned int  
+            i;      
+                 
+          switch(states)
+            {
+            case 2:       
+              {
+                parsimonyNumber
+                  *left[2],
+                  *right[2],
+                  *this[2];
+
+                for(k = 0; k < 2; k++)
+                  {
+                    left[k]  = &(pr->partitionData[model]->parsVect[(width * 2 * qNumber) + width * k]);
+                    right[k] = &(pr->partitionData[model]->parsVect[(width * 2 * rNumber) + width * k]);
+                    this[k]  = &(pr->partitionData[model]->parsVect[(width * 2 * pNumber) + width * k]);
+                  }
+
+                for(i = 0; i < width; i += INTS_PER_VECTOR)
+                  {               
+                    INT_TYPE
+                      s_r, s_l, v_N,
+                      l_A, l_C,
+                      v_A, v_C;          
+                    
+                    s_l = VECTOR_LOAD((CAST)(&left[0][i]));
+                    s_r = VECTOR_LOAD((CAST)(&right[0][i]));
+                    l_A = VECTOR_BIT_AND(s_l, s_r);
+                    v_A = VECTOR_BIT_OR(s_l, s_r);
+                    
+                    s_l = VECTOR_LOAD((CAST)(&left[1][i]));
+                    s_r = VECTOR_LOAD((CAST)(&right[1][i]));
+                    l_C = VECTOR_BIT_AND(s_l, s_r);
+                    v_C = VECTOR_BIT_OR(s_l, s_r);                                                                
+                    
+                    v_N = VECTOR_BIT_OR(l_A, l_C);
+                    
+                    VECTOR_STORE((CAST)(&this[0][i]), VECTOR_BIT_OR(l_A, VECTOR_AND_NOT(v_N, v_A)));
+                    VECTOR_STORE((CAST)(&this[1][i]), VECTOR_BIT_OR(l_C, VECTOR_AND_NOT(v_N, v_C)));                                                                    
+                    
+                    v_N = VECTOR_AND_NOT(v_N, allOne);
+                    
+                    totalScore += vectorPopcount(v_N);            
+                    if (perSiteScores)
+                       storePerSiteScores (pr, model, v_N, i);
+                  }
+              }
+              break;
+            case 4:
+              {
+                parsimonyNumber
+                  *left[4],
+                  *right[4],
+                  *this[4];
+
+                for(k = 0; k < 4; k++)
+                  {
+                    left[k]  = &(pr->partitionData[model]->parsVect[(width * 4 * qNumber) + width * k]);
+                    right[k] = &(pr->partitionData[model]->parsVect[(width * 4 * rNumber) + width * k]);
+                    this[k]  = &(pr->partitionData[model]->parsVect[(width * 4 * pNumber) + width * k]);
+                  }
+                for(i = 0; i < width; i += INTS_PER_VECTOR)
+                  {               
+                    INT_TYPE
+                      s_r, s_l, v_N,
+                      l_A, l_C, l_G, l_T,
+                      v_A, v_C, v_G, v_T;                
+                    
+                    s_l = VECTOR_LOAD((CAST)(&left[0][i]));
+                    s_r = VECTOR_LOAD((CAST)(&right[0][i]));
+                    l_A = VECTOR_BIT_AND(s_l, s_r);
+                    v_A = VECTOR_BIT_OR(s_l, s_r);
+                    
+                    s_l = VECTOR_LOAD((CAST)(&left[1][i]));
+                    s_r = VECTOR_LOAD((CAST)(&right[1][i]));
+                    l_C = VECTOR_BIT_AND(s_l, s_r);
+                    v_C = VECTOR_BIT_OR(s_l, s_r);
+                    
+                    s_l = VECTOR_LOAD((CAST)(&left[2][i]));
+                    s_r = VECTOR_LOAD((CAST)(&right[2][i]));
+                    l_G = VECTOR_BIT_AND(s_l, s_r);
+                    v_G = VECTOR_BIT_OR(s_l, s_r);
+                    
+                    s_l = VECTOR_LOAD((CAST)(&left[3][i]));
+                    s_r = VECTOR_LOAD((CAST)(&right[3][i]));
+                    l_T = VECTOR_BIT_AND(s_l, s_r);
+                    v_T = VECTOR_BIT_OR(s_l, s_r);
+                    
+                    v_N = VECTOR_BIT_OR(VECTOR_BIT_OR(l_A, l_C), VECTOR_BIT_OR(l_G, l_T));                                
+                    
+                    VECTOR_STORE((CAST)(&this[0][i]), VECTOR_BIT_OR(l_A, VECTOR_AND_NOT(v_N, v_A)));
+                    VECTOR_STORE((CAST)(&this[1][i]), VECTOR_BIT_OR(l_C, VECTOR_AND_NOT(v_N, v_C)));
+                    VECTOR_STORE((CAST)(&this[2][i]), VECTOR_BIT_OR(l_G, VECTOR_AND_NOT(v_N, v_G)));
+                    VECTOR_STORE((CAST)(&this[3][i]), VECTOR_BIT_OR(l_T, VECTOR_AND_NOT(v_N, v_T)));                                                    
+                    
+                    v_N = VECTOR_AND_NOT(v_N, allOne);
+                    
+                    totalScore += vectorPopcount(v_N);  
+                    
+                    if (perSiteScores)
+                       storePerSiteScores (pr, model, v_N, i);
+                  }
+              }
+              break;
+            case 20:
+              {
+                parsimonyNumber
+                  *left[20],
+                  *right[20],
+                  *this[20];
+
+                for(k = 0; k < 20; k++)
+                  {
+                    left[k]  = &(pr->partitionData[model]->parsVect[(width * 20 * qNumber) + width * k]);
+                    right[k] = &(pr->partitionData[model]->parsVect[(width * 20 * rNumber) + width * k]);
+                    this[k]  = &(pr->partitionData[model]->parsVect[(width * 20 * pNumber) + width * k]);
+                  }
+
+                for(i = 0; i < width; i += INTS_PER_VECTOR)
+                  {               
+                    size_t j;
+                    
+                    INT_TYPE
+                      s_r, s_l, 
+                      v_N = SET_ALL_BITS_ZERO,
+                      l_A[20], 
+                      v_A[20];           
+                    
+                    for(j = 0; j < 20; j++)
+                      {
+                        s_l = VECTOR_LOAD((CAST)(&left[j][i]));
+                        s_r = VECTOR_LOAD((CAST)(&right[j][i]));
+                        l_A[j] = VECTOR_BIT_AND(s_l, s_r);
+                        v_A[j] = VECTOR_BIT_OR(s_l, s_r);
+                        
+                        v_N = VECTOR_BIT_OR(v_N, l_A[j]);
+                      }
+                    
+                    for(j = 0; j < 20; j++)                 
+                      VECTOR_STORE((CAST)(&this[j][i]), VECTOR_BIT_OR(l_A[j], VECTOR_AND_NOT(v_N, v_A[j])));                                                                    
+                    
+                    v_N = VECTOR_AND_NOT(v_N, allOne);
+                    
+                    totalScore += vectorPopcount(v_N);
+
+                    if (perSiteScores)
+                       storePerSiteScores (pr, model, v_N, i);
+                  }
+              }
+              break;
+            default:
+              {
+                parsimonyNumber
+                  *left[32], 
+                  *right[32],
+                  *this[32];
+
+                assert(states <= 32);
+                
+                for(k = 0; k < states; k++)
+                  {
+                    left[k]  = &(pr->partitionData[model]->parsVect[(width * states * qNumber) + width * k]);
+                    right[k] = &(pr->partitionData[model]->parsVect[(width * states * rNumber) + width * k]);
+                    this[k]  = &(pr->partitionData[model]->parsVect[(width * states * pNumber) + width * k]);
+                  }
+
+                for(i = 0; i < width; i += INTS_PER_VECTOR)
+                  {               
+                    size_t j;
+                    
+                    INT_TYPE
+                      s_r, s_l, 
+                      v_N = SET_ALL_BITS_ZERO,
+                      l_A[32], 
+                      v_A[32];           
+                    
+                    for(j = 0; j < states; j++)
+                      {
+                        s_l = VECTOR_LOAD((CAST)(&left[j][i]));
+                        s_r = VECTOR_LOAD((CAST)(&right[j][i]));
+                        l_A[j] = VECTOR_BIT_AND(s_l, s_r);
+                        v_A[j] = VECTOR_BIT_OR(s_l, s_r);
+                        
+                        v_N = VECTOR_BIT_OR(v_N, l_A[j]);
+                      }
+                    
+                    for(j = 0; j < states; j++)             
+                      VECTOR_STORE((CAST)(&this[j][i]), VECTOR_BIT_OR(l_A[j], VECTOR_AND_NOT(v_N, v_A[j])));                                                                    
+                    
+                    v_N = VECTOR_AND_NOT(v_N, allOne);
+                    
+                    totalScore += vectorPopcount(v_N);
+
+                    if (perSiteScores)
+                       storePerSiteScores (pr, model, v_N, i);
+                  }                             
+              }
+            }            
+        }
+
+      tr->parsimonyScore[pNumber] = totalScore + tr->parsimonyScore[rNumber] + tr->parsimonyScore[qNumber];      
+    }
+}
+
+static unsigned int evaluateParsimonyIterativeFast(pllInstance *tr, partitionList *pr, boolean perSiteScores)
+{
+  INT_TYPE 
+    allOne = SET_ALL_BITS_ONE;
+
+  size_t 
+    pNumber = (size_t)tr->ti[1],
+    qNumber = (size_t)tr->ti[2];
+
+  int
+    model;
+
+  unsigned int 
+    bestScore = tr->bestParsimony,    
+    sum;
+
+  if(tr->ti[0] > 4)
+    newviewParsimonyIterativeFast(tr, pr, perSiteScores);
+
+  sum = tr->parsimonyScore[pNumber] + tr->parsimonyScore[qNumber];
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+    {
+      size_t
+        k,
+        states = pr->partitionData[model]->states,
+        width  = pr->partitionData[model]->parsimonyLength,
+        i;
+
+       switch(states)
+         {
+         case 2:
+           {
+             parsimonyNumber
+               *left[2],
+               *right[2];
+             
+             for(k = 0; k < 2; k++)
+               {
+                 left[k]  = &(pr->partitionData[model]->parsVect[(width * 2 * qNumber) + width * k]);
+                 right[k] = &(pr->partitionData[model]->parsVect[(width * 2 * pNumber) + width * k]);
+               }     
+             
+             for(i = 0; i < width; i += INTS_PER_VECTOR)
+               {                                               
+                 INT_TYPE      
+                   l_A = VECTOR_BIT_AND(VECTOR_LOAD((CAST)(&left[0][i])), VECTOR_LOAD((CAST)(&right[0][i]))),
+                   l_C = VECTOR_BIT_AND(VECTOR_LOAD((CAST)(&left[1][i])), VECTOR_LOAD((CAST)(&right[1][i]))),            
+                   v_N = VECTOR_BIT_OR(l_A, l_C);
+                 
+                 v_N = VECTOR_AND_NOT(v_N, allOne);
+                 
+                 sum += vectorPopcount(v_N);
+                  if (perSiteScores)
+                    storePerSiteScores (pr, model, v_N, i);
+                 
+                 if(sum >= bestScore)
+                   return sum;                         
+               }
+           }
+           break;
+         case 4:
+           {
+             parsimonyNumber
+               *left[4],
+               *right[4];
+      
+             for(k = 0; k < 4; k++)
+               {
+                 left[k]  = &(pr->partitionData[model]->parsVect[(width * 4 * qNumber) + width * k]);
+                 right[k] = &(pr->partitionData[model]->parsVect[(width * 4 * pNumber) + width * k]);
+               }        
+
+             for(i = 0; i < width; i += INTS_PER_VECTOR)
+               {                                                
+                 INT_TYPE      
+                   l_A = VECTOR_BIT_AND(VECTOR_LOAD((CAST)(&left[0][i])), VECTOR_LOAD((CAST)(&right[0][i]))),
+                   l_C = VECTOR_BIT_AND(VECTOR_LOAD((CAST)(&left[1][i])), VECTOR_LOAD((CAST)(&right[1][i]))),
+                   l_G = VECTOR_BIT_AND(VECTOR_LOAD((CAST)(&left[2][i])), VECTOR_LOAD((CAST)(&right[2][i]))),
+                   l_T = VECTOR_BIT_AND(VECTOR_LOAD((CAST)(&left[3][i])), VECTOR_LOAD((CAST)(&right[3][i]))),
+                   v_N = VECTOR_BIT_OR(VECTOR_BIT_OR(l_A, l_C), VECTOR_BIT_OR(l_G, l_T));     
+                 
+                 v_N = VECTOR_AND_NOT(v_N, allOne);
+                 
+                 sum += vectorPopcount(v_N);
+                  if (perSiteScores)
+                    storePerSiteScores (pr, model, v_N, i);
+                 
+                 if(sum >= bestScore)            
+                   return sum;          
+               }                 
+           }
+           break;
+         case 20:
+           {
+             parsimonyNumber
+               *left[20],
+               *right[20];
+             
+              for(k = 0; k < 20; k++)
+                {
+                  left[k]  = &(pr->partitionData[model]->parsVect[(width * 20 * qNumber) + width * k]);
+                  right[k] = &(pr->partitionData[model]->parsVect[(width * 20 * pNumber) + width * k]);
+                }  
+           
+              for(i = 0; i < width; i += INTS_PER_VECTOR)
+                {                              
+                  int 
+                    j;
+                  
+                  INT_TYPE      
+                    l_A,
+                    v_N = SET_ALL_BITS_ZERO;     
+                  
+                  for(j = 0; j < 20; j++)
+                    {
+                      l_A = VECTOR_BIT_AND(VECTOR_LOAD((CAST)(&left[j][i])), VECTOR_LOAD((CAST)(&right[j][i])));
+                      v_N = VECTOR_BIT_OR(l_A, v_N);
+                    }
+                  
+                  v_N = VECTOR_AND_NOT(v_N, allOne);
+                  
+                  sum += vectorPopcount(v_N);          
+                  if (perSiteScores)
+                    storePerSiteScores (pr, model, v_N, i);
+                  
+                  if(sum >= bestScore)      
+                    return sum;                        
+                }
+           }
+           break;
+         default:
+           {
+             parsimonyNumber
+               *left[32],  
+               *right[32]; 
+
+             assert(states <= 32);
+
+             for(k = 0; k < states; k++)
+               {
+                 left[k]  = &(pr->partitionData[model]->parsVect[(width * states * qNumber) + width * k]);
+                 right[k] = &(pr->partitionData[model]->parsVect[(width * states * pNumber) + width * k]);
+               }  
+           
+             for(i = 0; i < width; i += INTS_PER_VECTOR)
+               {                               
+                 size_t
+                   j;
+                 
+                 INT_TYPE      
+                   l_A,
+                   v_N = SET_ALL_BITS_ZERO;     
+                 
+                 for(j = 0; j < states; j++)
+                   {
+                     l_A = VECTOR_BIT_AND(VECTOR_LOAD((CAST)(&left[j][i])), VECTOR_LOAD((CAST)(&right[j][i])));
+                     v_N = VECTOR_BIT_OR(l_A, v_N);
+                   }
+                 
+                 v_N = VECTOR_AND_NOT(v_N, allOne);
+                 
+                 sum += vectorPopcount(v_N);           
+                 if (perSiteScores)
+                   storePerSiteScores (pr, model, v_N, i);
+                 
+                 if(sum >= bestScore)         
+                   return sum;                 
+               }
+           }
+         }
+    }
+  
+  return sum;
+}
+
+unsigned int pllEvaluateParsimony(pllInstance *tr, partitionList *pr, nodeptr p, boolean full, boolean perSiteScores)
+{
+  volatile unsigned int result;
+  nodeptr q = p->back;
+  int
+    *ti = tr->ti,
+    counter = 4;
+  
+  ti[1] = p->number;
+  ti[2] = q->number;
+
+  if(full)
+    {
+      if(p->number > tr->mxtips)
+        computeTraversalInfoParsimony(p, ti, &counter, tr->mxtips, full);
+      if(q->number > tr->mxtips)
+        computeTraversalInfoParsimony(q, ti, &counter, tr->mxtips, full); 
+    }
+  else
+    {
+      if(p->number > tr->mxtips && !p->xPars)
+        computeTraversalInfoParsimony(p, ti, &counter, tr->mxtips, full);
+      if(q->number > tr->mxtips && !q->xPars)
+        computeTraversalInfoParsimony(q, ti, &counter, tr->mxtips, full); 
+    }
+
+  ti[0] = counter;
+
+  result = evaluateParsimonyIterativeFast(tr, pr, perSiteScores);
+
+  return result;
+}
diff --git a/lib/pll/pll-renamed.h b/lib/pll/pll-renamed.h
new file mode 100644
index 0000000..e969788
--- /dev/null
+++ b/lib/pll/pll-renamed.h
@@ -0,0 +1,1673 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ *
+ * ABSTRACT
+ * 
+ * PLL is a highly optimized, parallelized software library to ease the
+ * development of new software tools dealing with phylogenetic inference. Among
+ * the functions included in PLL are 
+ *
+ * DOCUMENTATION
+ *
+ * Extensive documentation for using PLL is available online at
+ * 
+ *                 http://www.libpll.org
+ *
+ *
+ * USAGE
+ *
+ * To use PLL, 
+ *
+ * @file pll.h
+ * @brief Data structures for tree and model 
+ *
+ * @author Tomas Flouri
+ * @author Fernando Izquierdo-Carrasco
+ * @author Andre Aberer
+ * @author Alexandros Stamatakis
+ */
+
+#ifndef __pll__
+#define __pll__
+
+extern int PLL_NUM_BRANCHES; 
+
+#include <stdint.h>
+#include <stdio.h>
+#include <errno.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __MIC_NATIVE
+#define PLL_BYTE_ALIGNMENT 64
+#define PLL_VECTOR_WIDTH 8
+#elif defined (__AVX)
+
+#include <xmmintrin.h>
+#include <immintrin.h>
+#include <pmmintrin.h>
+
+#define PLL_BYTE_ALIGNMENT 32
+#define PLL_VECTOR_WIDTH 4
+
+#elif defined (__SSE3)
+
+#include <xmmintrin.h>
+#include <pmmintrin.h>
+
+#define PLL_BYTE_ALIGNMENT 16
+#define PLL_VECTOR_WIDTH 2
+
+#else
+#define PLL_BYTE_ALIGNMENT 1
+#define PLL_VECTOR_WIDTH 1
+#endif
+
+#include "stack.h"
+#include "newick.h"
+#include "queue.h"
+
+#define PLL_MAX_TIP_EV                          0.999999999 /* max tip vector value, sum of EVs needs to be smaller than 1.0, otherwise the numerics break down */
+#define PLL_MAX_LOCAL_SMOOTHING_ITERATIONS      32          /** @brief maximum iterations of smoothings per insert in the */
+#define PLL_ITERATIONS                          10          /* maximum iterations of iterations per insert */
+#define PLL_NEWZPERCYCLE                        1           /* iterations of makenewz per tree traversal */
+#define PLL_NMLNGTH                             256         /* number of characters in species name */
+#define PLL_DELTAZ                              0.00001     /* test of net branch length change in update */
+#define PLL_DEFAULTZ                            0.9         /* value of z assigned as starting point */
+#define PLL_UNLIKELY                            -1.0E300    /* low likelihood for initialization */
+#define PLL_SUMMARIZE_LENGTH                    -3
+#define PLL_SUMMARIZE_LH                        -2
+#define PLL_NO_BRANCHES                         -1
+#define PLL_MASK_LENGTH                         32
+#define PLL_ZMIN                                1.0E-15  /* max branch prop. to -log(PLL_ZMIN) (= 34) */
+#define PLL_ZMAX                                (1.0 - 1.0E-6) /* min branch prop. to 1.0-zmax (= 1.0E-6) */
+#define PLL_TWOTOTHE256                         115792089237316195423570985008687907853269984665640564039457584007913129639936.0  /*  2**256 (exactly)  */
+#define PLL_MINLIKELIHOOD                       (1.0/PLL_TWOTOTHE256)
+#define PLL_MINUSMINLIKELIHOOD                  -PLL_MINLIKELIHOOD
+
+
+#define PLL_FORMAT_PHYLIP                       1 
+#define PLL_FORMAT_FASTA                        2
+#define PLL_FORMAT_NEWICK                       3
+
+#define PLL_NNI_P_NEXT                          1       /**< Use p->next for the NNI move */
+#define PLL_NNI_P_NEXTNEXT                      2       /**< Use p->next->next for the NNI move */
+
+#define PLL_BADREAR                             -1
+
+/* #define PLL_NUM_BRANCHES                        50 */
+
+#define PLL_TRUE                                1
+#define PLL_FALSE                               0
+
+#define PLL_REARRANGE_SPR                       0
+#define PLL_REARRANGE_TBR                       1
+#define PLL_REARRANGE_NNI                       2
+
+#define PLL_AA_SCALE                            10.0
+#define PLL_AA_SCALE_PLUS_EPSILON               10.001
+
+/* ALPHA_MIN is critical -> numerical instability, eg for 4 discrete rate cats                    */
+/* and alpha = 0.01 the lowest rate r_0 is                                                        */
+/* 0.00000000000000000000000000000000000000000000000000000000000034878079110511010487             */
+/* which leads to numerical problems Table for alpha settings below:                              */
+/*                                                                                                */
+/* 0.010000 0.00000000000000000000000000000000000000000000000000000000000034878079110511010487    */
+/* 0.010000 yielded nasty numerical bugs in at least one case !                                   */
+/* 0.020000 0.00000000000000000000000000000044136090435925743185910935350715027016962154188875    */
+/* 0.030000 0.00000000000000000000476844846859006690412039180149775802624789852441798419292220    */
+/* 0.040000 0.00000000000000049522423236954066431210260930029681736928018820007024736185030633    */
+/* 0.050000 0.00000000000050625351310359203371872643495343928538368616365517027588794007897377    */
+/* 0.060000 0.00000000005134625283884191118711474021861409372524676086868566926568746566772461    */
+/* 0.070000 0.00000000139080650074206434685544624965062437960128249869740102440118789672851562    */
+/* 0.080000 0.00000001650681201563587066858709818343436959153791576682124286890029907226562500    */
+/* 0.090000 0.00000011301977332931251259273962858978301859735893231118097901344299316406250000    */
+/* 0.100000 0.00000052651925834844387815526344648331402709118265192955732345581054687500000000    */
+
+#define PLL_ALPHA_MIN                           0.02
+#define PLL_ALPHA_MAX                           1000.0
+
+#define PLL_RATE_MIN                            0.0000001
+#define PLL_RATE_MAX                            1000000.0
+
+/* 
+   previous values between 0.001 and 0.000001
+
+   TO AVOID NUMERICAL PROBLEMS WHEN FREQ == 0 IN PARTITIONED MODELS, ESPECIALLY WITH AA 
+   previous value of FREQ_MIN was: 0.000001, but this seemed to cause problems with some 
+   of the 7-state secondary structure models with some rather exotic small toy test datasets,
+   on the other hand 0.001 caused problems with some of the 16-state secondary structure models
+
+   For some reason the frequency settings seem to be repeatedly causing numerical problems
+*/
+
+#define PLL_ITMAX                               100    /* max number of iterations in brent's algorithm */
+
+#define PLL_SHFT(a,b,c,d)                       (a)=(b);(b)=(c);(c)=(d);
+#define PLL_SIGN(a,b)                           ((b) > 0.0 ? fabs(a) : -fabs(a))
+#define PLL_ABS(x)                              (((x)<0)   ?  (-(x)) : (x))
+#define PLL_MIN(x,y)                            (((x)<(y)) ?    (x)  : (y))
+#define PLL_MAX(x,y)                            (((x)>(y)) ?    (x)  : (y))
+#define PLL_SWAP(x,y) do{ __typeof__ (x) _t = x; x = y; y = _t; } while(0)
+#define PLL_POINT_GAMMA(prob,alpha,beta)        PointChi2(prob,2.0*(alpha))/(2.0*(beta))
+
+#define PLL_LIB_NAME                            "PLL"
+#define PLL_LIB_VERSION                         "1.0.0"
+#define PLL_LIB_DATE                            "September 2013"
+
+/* aminoacid substitution models */
+#define PLL_DAYHOFF                             0
+#define PLL_DCMUT                               1
+#define PLL_JTT                                 2
+#define PLL_MTREV                               3
+#define PLL_WAG                                 4
+#define PLL_RTREV                               5
+#define PLL_CPREV                               6
+#define PLL_VT                                  7
+#define PLL_BLOSUM62                            8
+#define PLL_MTMAM                               9
+#define PLL_LG                                  10
+#define PLL_MTART                               11
+#define PLL_MTZOA                               12
+#define PLL_PMB                                 13
+#define PLL_HIVB                                14
+#define PLL_HIVW                                15
+#define PLL_JTTDCMUT                            16
+#define PLL_FLU                                 17 
+#define PLL_AUTO                                18
+#define PLL_LG4                                 19
+#define PLL_GTR                                 20  /* GTR always needs to be the last one */
+#define PLL_NUM_PROT_MODELS                     21
+
+/* bipartition stuff */
+#define PLL_BIPARTITIONS_RF                     4
+
+/* scenarios for likelihood computation */
+#define PLL_TIP_TIP                             0
+#define PLL_TIP_INNER                           1
+#define PLL_INNER_INNER                         2
+
+
+/* available data types in PLL */
+#define PLL_MIN_MODEL                          -1
+#define PLL_BINARY_DATA                         0
+#define PLL_DNA_DATA                            1
+#define PLL_AA_DATA                             2
+#define PLL_SECONDARY_DATA                      3
+#define PLL_SECONDARY_DATA_6                    4
+#define PLL_SECONDARY_DATA_7                    5
+#define PLL_GENERIC_32                          6
+#define PLL_GENERIC_64                          7
+#define PLL_MAX_MODEL                           8
+
+#define PLL_SEC_6_A                             0
+#define PLL_SEC_6_B                             1
+#define PLL_SEC_6_C                             2
+#define PLL_SEC_6_D                             3
+#define PLL_SEC_6_E                             4
+
+#define PLL_SEC_7_A                             5
+#define PLL_SEC_7_B                             6
+#define PLL_SEC_7_C                             7
+#define PLL_SEC_7_D                             8
+#define PLL_SEC_7_E                             9
+#define PLL_SEC_7_F                             10
+
+#define PLL_SEC_16                              11
+#define PLL_SEC_16_A                            12
+#define PLL_SEC_16_B                            13
+#define PLL_SEC_16_C                            14
+#define PLL_SEC_16_D                            15
+#define PLL_SEC_16_E                            16
+#define PLL_SEC_16_F                            17
+#define PLL_SEC_16_I                            18
+#define PLL_SEC_16_J                            19
+#define PLL_SEC_16_K                            20
+
+#define PLL_ORDERED_MULTI_STATE                 0
+#define PLL_MK_MULTI_STATE                      1
+#define PLL_GTR_MULTI_STATE                     2
+
+
+/* available models of rate heterogeneity in PLL */
+#define PLL_CAT                                 0
+#define PLL_GAMMA                               1
+
+/* recomp */
+#define PLL_SLOT_UNUSED                        -2  /* value to mark an available vector */
+#define PLL_NODE_UNPINNED                      -3  /* marks an inner node as not available in RAM */
+#define PLL_INNER_NODE_INIT_STLEN              -1  /* initialization */
+
+#define PLL_MIN_RECOM_FRACTION     0.1 /* at least this % of inner nodes will be allocated in RAM */
+#define PLL_MAX_RECOM_FRACTION     1.0 /* always 1, just there for boundary checks */
+
+
+typedef  int boolean;
+
+/* @brief PLL instance attribute structure */
+typedef struct
+{
+  int rateHetModel;
+  int fastScaling;
+  int saveMemory;
+  int useRecom;
+  long randomNumberSeed;
+  int numberOfThreads;
+} pllInstanceAttr;
+
+/** @brief Stores the recomputation-state of likelihood vectors  */
+typedef struct
+{
+  int numVectors;      /**< Number of inner vectors allocated in RAM*/
+  int *iVector;        /**< size: numVectors, stores node id || PLL_SLOT_UNUSED  */
+  int *iNode;          /**< size: inner nodes, stores slot id || PLL_NODE_UNPINNED */
+  int *stlen;          /**< Number of tips behind the current orientation of the indexed inner node (subtree size/cost) */ 
+  int *unpinnable;     /**< size:numVectors , TRUE if we dont need the vector */
+  int maxVectorsUsed;  
+  boolean allSlotsBusy; /**< on if all slots contain an ancesctral node (the usual case after first full traversal) */ 
+} recompVectors;
+/* E recomp */
+
+/** @brief ???
+ * @todo add explanation, is this ever used?  */
+
+typedef unsigned int hashNumberType;
+
+
+
+/*typedef uint_fast32_t parsimonyNumber;*/
+
+#define PLL_PCF 32
+
+/** @brief ???Hash tables 
+ * @todo add explanation of all hash tables  */
+typedef struct pllBipartitionEntry
+{
+  unsigned int *bitVector;
+  unsigned int *treeVector;
+  unsigned int amountTips;
+  int *supportVector;
+  unsigned int bipNumber;
+  unsigned int bipNumber2;
+  unsigned int supportFromTreeset[2]; 
+  struct pllBipartitionEntry *next;
+} pllBipartitionEntry;
+
+//typedef struct
+//{
+//  hashNumberType tableSize;
+//  entry **table;
+//  hashNumberType entryCount;
+//}
+//  hashtable;
+//struct stringEnt
+//{
+//  int nodeNumber;
+//  char *word;
+//  struct stringEnt *next;
+//};
+//
+//typedef struct stringEnt stringEntry;
+//typedef struct
+//{
+//  hashNumberType tableSize;
+//  stringEntry **table;
+//}
+//  stringHashtable;
+
+typedef struct pllHashItem
+{
+  void * data;
+  char * str;
+  struct pllHashItem * next;
+} pllHashItem;
+
+typedef struct pllHashTable
+{
+  unsigned int size;
+  struct pllHashItem ** Items;
+  unsigned int entries;
+} pllHashTable;
+
+
+
+/* struct pllHashItem */
+/* { */
+/*   void * data; */
+/*   char * str; */
+/*   struct pllHashItem * next; */
+/* }; */
+
+/* typedef struct pllHashTable */
+/* { */
+/*   unsigned int size; */
+/*   struct pllHashItem ** Items; */
+/* } pllHashTable; */
+
+
+
+
+/** @brief Per-site Rate category entry: likelihood per-site and CAT rate applied ???
+  *
+  */
+typedef struct ratec
+{
+  double accumulatedSiteLikelihood;
+  double rate;
+}rateCategorize;
+
+/** @brief Traversal descriptor entry.
+  * 
+  * Contains the information required to execute an operation in a step of the tree traversal.
+  * q   r
+  *  \ /
+  *   p
+  *
+  * The entry defines 2 input/parent nodes (q and r) and one output/child node (p)
+  * qz represents the branch length(s) of the branch connecting q and p
+  * rz represents the branch length(s) of the branch connecting r and p
+  * PLL_TIP_TIP     Both p and r are tips
+  * PLL_INNER_INNER Both p and r are inner nodes
+  * @note PLL_TIP_INNER   q is a tip and r is an inner node (by convention, flip q and r if required)
+  */
+typedef struct
+{
+  int tipCase;                  /**< Type of entry, must be PLL_TIP_TIP PLL_TIP_INNER or PLL_INNER_INNER */
+  int pNumber;                  /**< should exist in some nodeptr p->number */
+  int qNumber;                  /**< should exist in some nodeptr q->number */
+  int rNumber;                  /**< should exist in some nodeptr r->number */
+  double *qz;
+  double *rz;
+  /* recom */
+  int slot_p;                   /**< In recomputation mode, the RAM slot index for likelihood vector of node p, otherwise unused */
+  int slot_q;                   /**< In recomputation mode, the RAM slot index for likelihood vector of node q, otherwise unused */
+  int slot_r;                   /**< In recomputation mode, the RAM slot index for likelihood vector of node r, otherwise unused */
+  /* E recom */
+} traversalInfo;
+
+/** @brief Traversal descriptor.
+  * 
+  * Describes the state of a traversal descriptor
+  */
+typedef struct
+{
+  traversalInfo *ti;              /**< list of traversal steps */
+  int count;                      /**< number of traversal steps */
+  int functionType;
+  boolean traversalHasChanged;   
+  boolean *executeModel;           
+  double  *parameterValues;
+} traversalData;
+
+/** @brief Node record structure
+  * 
+  * Each inner node is a trifurcation in the tree represented as a circular list containing 3 node records. One node record uniquely identifies a subtree, and the orientation of the likelihood vector within a node
+  *
+  * p1 -------> p2 ----> to the next node
+  * ^           |
+  * |-----p3<---|          
+  * 
+  */
+struct noderec;
+
+/** @brief Branch length information.
+  * 
+  * @todo add relevant info on where this is used ???
+  */
+typedef struct
+{
+  unsigned int *vector; 
+  int support;   
+  struct noderec *oP;
+  struct noderec *oQ;
+} branchInfo;
+
+
+
+
+
+/** @brief Linkage of partitions.
+  * 
+  * @todo add relevant info on where this is used ???
+  */
+typedef struct
+{
+  boolean valid;
+  int partitions;  
+  int *partitionList;
+}
+  linkageData;
+typedef struct
+{
+  int entries;
+  linkageData* ld;
+}
+  linkageList;
+
+
+
+  /** 
+   *
+   * the data structure below is fundamental for representing trees 
+     in the library!
+
+     Inner nodes are represented by three instances of the nodeptr data structure that is linked 
+     via a cyclic list using the next pointer.
+
+     So for building an inner node of the tree we need to allocate three nodeptr 
+     data structures and link them together, e.g.:
+
+     assuming that we have allocated space for an inner node 
+     for nodeptr pointers p1, p2, p3, 
+
+     we would then link them like this:
+
+     p1->next = p2;
+     p2->next = p3;
+     p3->next = p1;
+
+     also note that the node number that identifies the inner node 
+     needs to be set to the same value.
+
+     for n taxa, tip nodes are enumarated/indexed from 1....n,
+     and inner node inbdices start at n+1. Assuming that we have 10 taxa 
+     and this is our first inner node, we'd initialize the number as follows:
+
+     p1->number = 11;
+     p2->number = 11;
+     p3->number = 11;
+
+     Note that the node number is important for indexing tip sequence data as well as inner likelihood vectors 
+     and that it is this number (the index) that actually gets stored in the traversal descriptor.
+
+     Tip nodes are non-cyclic nodes that simply consist of one instance/allocation of nodeptr.
+
+     if we have allocated a tip data structure nodeptr t1, 
+     we would initialize it as follows:
+
+     t1->number = 1;
+
+     t1->next = NULL;
+
+     now let's assume that we want to build a four taxon tree with tips t1, t2, t3, t4 
+     and inner nodes (p1,p2,p3) and (q1,q2,q3).
+
+     we first build the tips:
+
+     t1->number = 1;
+     t1->next = NULL;
+     
+     t2->number = 2;
+     t2->next = NULL;
+
+     t3->number = 3;
+     t3->next = NULL;
+
+     t4->number = 4;
+     t4->next = NULL;
+     
+     now the first inner node
+
+     p1->next = p2;
+     p2->next = p3;
+     p3->next = p1;    
+
+     p1->number = 5;
+     p2->number = 5;
+     p3->number = 5;
+
+     and the second inner node.
+
+     q1->next = q2;
+     q2->next = q3;
+     q3->next = q1;    
+
+     q1->number = 6;
+     q2->number = 6;
+     q3->number = 6;
+     
+     now we need to link the nodes together such that they form a tree, let's assume we want ((t1,t2), (t3, t4));
+
+     we will have to link the nodes via the so-called back pointer,
+     i.e.:
+
+     let's connect node p with t1 and t2
+
+     t1->back = p1;
+     t2->back = p2;
+
+     and vice versa:
+
+     p1->back = t1;
+     p2->back = t2;
+
+     let's connect node p with node q:
+
+     p3->back = q3;
+
+     and vice versa:
+
+     q3->back = p3;
+
+     and now let's connect node q with tips t3 and t4:
+
+     q1->back = t3;
+     q2->back = t4;
+
+     and vice versa:
+
+     t3->back = q1;
+     t4->back = q2;
+
+     What remains to be done is to set up the branch lengths.
+     Using the data structure below, we always have to store the 
+     branch length twice for each "topological branch" unfortunately.
+
+     Assuming that we are only estimating a single branch across all partitions 
+     we'd just set the first index of the branch length array z.
+
+     e.g., 
+
+     t3->z[0] = q1->z[0] = 0.9;
+
+     the above operation for connecting nodes is implemented in functions hookup() which will set 
+     the back pointers of two nodes that are to be connected as well as the branch lengths.
+
+     The branchInfo data field is a pointer to a data-structure that stores meta-data and requires 
+     the tree not to change while it is being used.
+     
+     Also, this pointer needs to be set by doing a full tree traversal on the tree.
+
+     Note that q1->bInf == t3->bInf in the above example.
+
+     The hash number is used for mapping bipartitions to a hash table as described in the following paper:
+
+     A. Aberer, N. Pattengale, A. Stamatakis: "Parallelized phylogenetic post-analysis on multi-core architectures". Journal of Computational Science 1, 107-114, 2010.
+     
+     The support data field stores the support value for the branch associated with each nodeptr structure.
+     Note that support always refers to branches. 
+
+     Thus for consistency, q3->support must be equal to p3->support;
+
+     Finally, the three char fields x, xPars and xBips are very very important!
+
+     They are used to denote the presence/absence or if you want, direction of the 
+     parsimony, bipartition, or likelihood vector at a node with respect to the virtual root.
+
+     Essentially, they are just used as single presence/absence bits and ONLY for inner nodes!
+
+     When setting up new inner nodes, one of the three pointers in the cyclic list must 
+     have x = 1 and the other two x = 0;
+
+     in the above example we could set:
+
+     p1->x = 0;
+     p2->x = 0;
+     p3->x = 1;
+
+     q1->x = 0;
+     q2->x = 0;
+     q3->x = 1;
+
+     This would mean that the virtual root is located at the inner branch of the four taxon tree ((t1,t2),(t3,t4));
+
+     When we re-root the tree at some other branch we need to update the location of the x pointer that is set to 1.
+
+     This means if we root the tree at the branch leading to t1 we would set 
+
+     p1->x = 1;
+     p2->x = 0;
+     p3->x = 0;
+
+     the values for q remaon unchanged since q3 is still pointing toward the root.
+
+     When we re-locate the root to branch p1 <-> t1 the fact that we have to "rotate" the x value that is set to 1
+     to another node of the cyclic list representing the abstract topological node p, also tells us that we 
+     need to re-compute the conditional likelihood array for p. 
+
+     Note that, only one likelihood or parsimony array is stored per inner node and the location of x essentially tells us which subtree 
+     it summarizes, if p1->x == 1, it summarizes subtree (t2, (t3, t4)), if p3->x = 1 the likelihood vector associated with 
+     node p summarizes subtree (t1, t2).
+
+     @todo I think we should rename the back pointer. It's not back, it can be forward depending on the orientation. We should renmae it to outer. Back is too confusing, I would assume it's the opposite of next, i.e. previous.
+
+     @struct noderec
+
+     @brief Tree node record
+
+     A node in a tree is a structure which contains a cyclic list of pointers to 3 nodes which we call a \e roundabout. The first node is the structure itself, and the other two nodes are accessed via \a noderec->next and \a noderec->next->next. To access the outer node with which each of the 3 nodes forms an edge one has to use the \a back pointer
+
+     @var noderec::next
+     @brief Next node in the roundabout
+
+     @var noderec::back
+     @brief Outer node
+
+     @var noderec::number
+     @brief Node identifier
+
+     In general, tips (i.e. leaves) are numbered from 1 to \e n where \e n is the number of taxa. Identifiers for internal nodes start from \e n + 1. Note
+     that for a given inner node, the identifier must be the same for all 3 nodes that compose it.
+
+     @var info::z
+     @brief The branch lengths per partition for the main node in the roundabout
+
+     @todo Append an image
+  */
+typedef  struct noderec
+{
+ 
+  branchInfo      *bInf;
+  double           *z;
+  struct noderec  *next;        
+  struct noderec  *back;       
+  hashNumberType   hash;
+  int              support;
+  int              number;    
+  char             x;
+  char             xPars;
+  char             xBips;
+}
+  node, *nodeptr;
+
+typedef unsigned int parsimonyNumber;
+
+/* @brief Alignment, transition model, model of rate heterogenety and likelihood vectors for one partition.
+  * 
+  * @todo De-couple into smaller data structures
+  *
+  * ALIGNMENT DATA 
+  * This depends only on the type of data in this partition of the alignment 
+  *
+  * MODEL OF RATE HETEROGENETY, We use either GAMMA or PSR 
+  * Rate heterogenety: Per Site Categories (PSR) model aka CAT, 
+  * Rate of site i is given by perSiteRates[rateCategory[i]]
+  *
+  * TRANSITION MODEL: We always assume General Time Reversibility 
+  * Transistion probability matrix: P(t) = exp(Qt)
+  * Branch length t is the expected number of substitutions per site 
+  * Pij(t) is the probability of going from state i to state j in a branch of length t 
+  * Relative substitution rates (Entries in the Q matrix) 
+  * In GTR we can write Q = S * D, where S is a symmetrical matrix and D a diagonal with the state frequencies 
+
+    @var protModels
+    @brief Protein models
+
+    @detail Detailed protein models descriptiopn
+
+    @var autoProtModels
+    @brief Auto prot models
+    @detail Detailed auto prot models
+  */
+ 
+
+
+/** @struct pInfo
+    
+    @brief Partition information structure
+
+    This data structure encapsulates all properties and auxiliary variables that together
+    consist a partition.
+
+    @var pInfo::dataType
+    @brief Type of data this partition contains
+
+    Can be DNA (\b PLL_DNA_DATA) or AminoAcid (\b PLL_AA_DATA) data
+
+    @var pInfo::states
+    @brief Number of states
+
+    Number of states this type of data can consist of
+
+    @var pInfo::maxTipStates
+    @brief Number of undetermined states (possible states at the tips)
+
+    This is the total number of possible states that can appear in the alignment. This includes degenerate (undetermined) bases
+
+    @var pInfo::partitionName
+    @brief Name of partition
+
+    A null-terminated string describing the name of partition
+
+    @var pInfo::lower
+    @brief Position of the first site in the alignment that is part of this partition [1, tr->originalCrunchedLength]
+
+    @var pInfo::upper
+    @brief Position of the last site that is part of this partition plus one (i.e. position of the first site that is not part of this partition) 
+
+    @var pInfo::width
+    @brief Number of sites in the partition (i.e. \a upper - \a lower)
+
+    @var pInfo::wgt
+    @brief Weight of site
+
+    Number of times this particular site appeared in the partition before the duplicates were removed and replaced by this weight
+
+    @var pInfo::empiricalFrequencies
+    @brief Empirical frequency of each state in the current partition
+
+    @var pInfo::perSiteRates
+    @brief Per Site Categories (PSR) or aka CAT values for each rate
+
+    @var pInfo::rateCategory
+    @brief CAT category index for each site
+
+    @var pInfo::numberOfCategories
+    @brief CAT size of the set of possible categories
+
+    @var pInfo::alpha
+    @brief Gamma parameter to be optimized
+    
+    @var pInfo::gammaRates
+    @brief Values of the 4 gamma categories (rates) computed given an alpha
+
+    @var pInfo::substRates
+    @brief Entries of substitution matrix, e.g. 6 free parameters in DNA
+
+    In GTR we can write \f$ Q = S * D \f$, where \f$ S \f$ is a symmetrical matrix and \f$ D \f$ a diagonal with the state frequencies,
+    which is represented by the array \a frequencies. The symmetrical matrix is the array \a substRates
+
+    @var pInfo::frequencies
+    @brief State frequencies, entries in D are initialized as empiricalFrequencies
+    
+    In GTR we can write \f$ Q = S * D \f$, where \f$ S \f$ is a symmetrical matrix and \f$ D \f$ a diagonal with the state frequencies,
+    which is represented by the array \a frequencies. The symmetrical matrix is the array \a substRates
+
+    @var pInfo::freqExponents
+
+    @var pInfo::EIGN
+    @brief Eigenvalues of Q matrix
+
+    @var pInfo::EV
+    @brief Eigenvectors of Q matrix
+
+    @var pInfo::EI
+    @brief Inverse eigenvectors of Q matrix
+
+    @var pInfo::left
+    @brief P matrix for the left term of the conditional likelihood equation
+
+    @var pInfo::right
+    @brief P matrix for the right term of the conditional likelihood equation
+
+    @var pInfo::tipVector
+    @brief Precomputed (based on current P matrix) conditional likelihood vectors for every possible base 
+
+    @var pInfo::EIGN_LG4
+    @brief Eigenvalues of Q matrix for the LG4 model
+
+    @var pInfo::EV_LG4
+    @brief Eigenvectors of Q matrix for the LG4 model
+
+    @var pInfo::EI_LG4
+    @brief Inverse eigenvectors of Q matrix for the LG4 model
+    
+    @var pInfo::frequencies_LG4
+    @brief State frequencies for the LG4 model
+
+    @var pInfo::tipVector_LG4
+    @brief Precomputed (based on current P matrix) conditional likelihood vectors for every possible base for the LG4 model
+
+    @var pInfo::substRates_LG4
+    @brief Entries of substitution matrix for the LG4 model
+
+    @var pInfo::protModels
+    @brief Protein model for current partition
+
+    In case \a pInfo::dataType is set to \a PLL_AA_DATA then \a protModels indicates the index in the global array \a protModels
+    of the protein model that the current partition uses.
+
+    @var pInfo::autoProtModels
+    @brief Best fitted protein model for the \b PLL_AUTO partitions
+
+    If \a protModels is set to \b PLL_AUTO then \a autoProtModels holds the currently detected best fitting protein model for the partition
+
+    @var pInfo::protUseEmpiricalFreqs
+
+    @var pInfo::nonGTR
+
+    @var pInfo::optimizeBaseFrequencies
+
+    @var pInfo::optimizeAlphaParameter
+
+    @var pInfo::optimizeSubstitutionRates
+
+    @var pInfo::symmetryVector
+
+    @var pInfo::frequencyGrouping
+
+
+    @todo
+      Document freqExponents
+
+*/
+
+
+
+typedef struct {
+  int     dataType;
+  int     states;
+  int     maxTipStates;
+  char   *partitionName;
+  int     lower;
+  int     upper;
+  int     width;
+  int    *wgt;
+  double *empiricalFrequencies; 
+
+
+  /* MODEL OF RATE HETEROGENETY, We use either GAMMA or PSR */
+  /* Rate heterogenety: Per Site Categories (PSR) model aka CAT, see updatePerSiteRates() */
+  /* Rate of site i is given by perSiteRates[rateCategory[i]] */
+  double *perSiteRates;
+  int    *rateCategory;
+  int     numberOfCategories;
+  /* Rate heterogenety: GAMMA model of rate heterogenety */
+  double alpha;
+  double *gammaRates;
+
+
+  /* TRANSITION MODEL: We always assume General Time Reversibility */
+  /* Transistion probability matrix: P(t) = exp(Qt)*/
+  /* Branch length t is the expected number of substitutions per site */
+  /* Pij(t) is the probability of going from state i to state j in a branch of length t */
+  /* Relative substitution rates (Entries in the Q matrix) */
+  /* In GTR we can write Q = S * D, where S is a symmetrical matrix and D a diagonal with the state frequencies */
+  double *substRates;       /**< TRANSITION MODEL Entries in S, e.g. 6 free parameters in DNA */   
+  double *frequencies;      /**< State frequencies, entries in D, are initialized as empiricalFrequencies */
+  double *freqExponents;
+  /* Matrix decomposition: @todo map this syntax to Explanation of the mathematical background */
+  double *EIGN;
+  double *EV;
+  double *EI;
+  double *left;
+  double *right;
+  double *tipVector;
+  
+
+  /* asc bias */
+  boolean       ascBias;
+  int           ascOffset;
+  int         * ascExpVector;
+  double      * ascSumBuffer;
+  double      * ascVector;
+  
+  /* LG4 */
+
+  double *EIGN_LG4[4];
+  double *EV_LG4[4];
+  double *EI_LG4[4];
+
+  double *frequencies_LG4[4];
+  double *tipVector_LG4[4];
+  double *substRates_LG4[4];
+  
+  /* LG4 */
+  
+  /* Protein specific */
+  int     protModels;			/**< Empirical model matrix */
+  int     autoProtModels;		/**< Model selected with "auto" protein model */
+  int     protUseEmpiricalFreqs;	/**< Whether to use empirical frequencies for protein model */
+
+  boolean nonGTR;
+  boolean optimizeBaseFrequencies;	/**< Whether to optimize base frequencies */
+  boolean optimizeAlphaParameter;	/**< Whether to optimize alpha parameters and gamma rates */
+  boolean optimizeSubstitutionRates;	/**< Whether to optimize substitution rates */
+  int    *symmetryVector;		/**< Specify linkage between substitution rate parameters */
+  int    *frequencyGrouping;
+
+  /* LIKELIHOOD VECTORS */
+
+  /* partial LH Inner vectors  ancestral vectors, we have 2*tips - 3 inner nodes */
+  double          **xVector;          /**< Conditional likelihood vectors for inner nodes */
+  unsigned char   **yVector;          /**< Tip entries (sequence) for tip nodes */
+  unsigned int     *globalScaler;     /**< Counters for scaling operations done at node i */
+
+  /* data structures for conducting per-site likelihood scaling.
+     this allows to compute the per-site log likelihood scores 
+     needed for RELL-based bootstrapping and all sorts of statistical 
+     tests for comparing trees ! */
+  int              **expVector;     /**< @brief An entry per inner node. Each element is an array of size the number of sites in the current partition and represents how many times the respective site has been scaled in the subtree rooted at the current node */
+  size_t           *expSpaceVector; /**< @brief Each entry represents an inner node and states the size of the corresponding element in \a expVector, which is the number of sites for the current partition */
+
+  /* These are for the saveMemory option (tracking gaps to skip computations and memory) */
+  size_t           *xSpaceVector;       /* Size of conditional likelihood vectors per inner node */
+  int               gapVectorLength;    /** Length of \a gapVector bitvector in unsigned integers assuming that \a unsigned \a int is 32bits. It is set to partition size / 32 */
+  unsigned int     *gapVector;          /** A bit vector of size \a gapVectorLength * 32 bits. A bit is set to 1 if the corresponding */
+  double           *gapColumn; 
+
+  /* Parsimony vectors at each node */
+  size_t parsimonyLength;
+  parsimonyNumber *parsVect; 
+  parsimonyNumber *perSiteParsScores;
+
+  /* This buffer of size width is used to store intermediate values for the branch length optimization under 
+     newton-raphson. The data in here can be re-used for all iterations irrespective of the branch length.
+   */
+  double *sumBuffer; 
+
+  /* Buffer to store the per-site log likelihoods */
+  double *perSiteLikelihoods;
+
+  /* This buffer of size width is used to store the ancestral state at a node of the tree. */
+  double *ancestralBuffer;
+
+  /* From tree */
+  boolean executeModel;
+  double fracchange;
+  double partitionContribution;
+  double partitionLH;
+
+// #if (defined(_USE_PTHREADS) || defined(_FINE_GRAIN_MPI))
+  int partitionAssignment;
+// #endif
+
+  unsigned int *parsimonyScore; 
+
+} pInfo;
+
+typedef struct
+{
+  pInfo **partitionData;
+   int numberOfPartitions;
+   boolean perGeneBranchLengths;
+   boolean dirty;
+   linkageList *alphaList;
+   linkageList *rateList;
+   linkageList *freqList;
+ }  partitionList;
+
+
+
+#define PLL_REARR_SETTING 1
+#define PLL_FAST_SPRS     2
+#define PLL_SLOW_SPRS     3
+
+
+/** @brief Checkpointing states. 
+ * 
+ * @todo Raxml specific 
+  */
+typedef struct {
+ 
+  int state;
+
+  /*unsigned int vLength;*/
+  double accumulatedTime;  
+  int rearrangementsMax;
+  int rearrangementsMin;
+  int thoroughIterations;
+  int fastIterations;
+  int mintrav;
+  int maxtrav;
+  int bestTrav;
+  double startLH; 
+  double lh;
+  double previousLh;
+  double difference;
+  double epsilon;  
+  boolean impr;
+  boolean cutoff;  
+       
+  double tr_startLH;
+  double tr_endLH;
+  double tr_likelihood;
+  double tr_bestOfNode;  
+  double tr_lhCutoff;
+  double tr_lhAVG;
+  double tr_lhDEC;
+  int    tr_NumberOfCategories;
+  int    tr_itCount;  
+  int    tr_doCutoff;
+  int    tr_thoroughInsertion;
+  int    tr_optimizeRateCategoryInvocations;
+ 
+  /* prevent users from doing stupid things */
+ 
+  int searchConvergenceCriterion;
+  int rateHetModel;
+  int maxCategories;
+  int NumberOfModels;
+  int numBranches;
+  int originalCrunchedLength;    
+  int mxtips;
+  char seq_file[1024];
+} checkPointState;
+
+
+
+/* recomp */
+#ifdef _DEBUG_RECOMPUTATION
+typedef struct {
+  unsigned long int numTraversals;
+  unsigned long int tt;
+  unsigned long int ti;
+  unsigned long int ii;
+  unsigned int *travlenFreq;
+} traversalCounter;
+#endif
+/* E recomp */
+
+
+/** @brief Tree topology.
+ * 
+ * @todo Apart from the topology this structure contains several fields that act like global variables in raxml
+  */
+typedef  struct  {
+
+  int *ti;
+
+  /* recomp */
+  recompVectors *rvec;            /**< this data structure tracks which vectors store which nodes */
+  float maxMegabytesMemory;       /**< User says how many MB in main memory should be used */
+  float vectorRecomFraction;      /**< vectorRecomFraction ~= 0.8 * maxMegabytesMemory  */
+  boolean useRecom;               /**< ON if we apply recomputation of ancestral vectors*/
+#ifdef _DEBUG_RECOMPUTATION 
+  traversalCounter *travCounter;
+  double stlenTime;
+#endif
+  /* E recomp */
+  
+  boolean fastScaling;
+  boolean saveMemory;
+  int              startingTree;
+  long             randomNumberSeed;
+
+  double          *lhs;         /**< Array to store per-site log likelihoods of \a originalCrunchedLength (compressed) sites */
+  double          *patrat;      /**< rates per pattern */
+  double          *patratStored; 
+  int             *rateCategory;
+  int             *aliaswgt;    /**< weight by pattern */ 
+  boolean    manyPartitions;
+
+  boolean grouped;              /**< No idea what this is, but is always set to PLL_FALSE */
+  boolean constrained;          /**< No idea what this is, but is always set to PLL_FALSE */
+  int threadID;
+  volatile int numberOfThreads;
+
+//#if (defined(_USE_PTHREADS) || defined(_FINE_GRAIN_MPI))
+ 
+  unsigned char *y_ptr; 
+  
+  double lower_spacing;
+  double upper_spacing; 
+
+  double *ancestralVector;
+
+//#endif
+  
+  pllHashTable     *nameHash;
+  char           ** tipNames;
+
+  char             *secondaryStructureInput;
+
+  traversalData    td[1];
+
+  int              maxCategories;
+  int              categories;
+
+  double           *coreLZ;
+  
+ 
+  branchInfo       *bInf;
+
+  int              multiStateModel;
+
+
+  /* for bayesian things, we cannot use the shortcut  */
+  boolean fastParsimony;
+
+  boolean *curvatOK;
+
+  /* the stuff below is shared among DNA and AA, span does
+     not change depending on datatype */
+
+  /* model stuff end */
+  unsigned char    **yVector;        /**< list of raw sequences (parsed from the alignment)*/
+
+  int              secondaryStructureModel;
+  int              originalCrunchedLength; /**< Length of alignment after removing duplicate sites in each partition */
+
+  int              *secondaryStructurePairs;
+
+  double            fracchange;      /**< Average substitution rate */
+  double            lhCutoff;
+  double            lhAVG;
+  unsigned long     lhDEC;
+  unsigned long     itCount;
+  int               numberOfInvariableColumns;
+  int               weightOfInvariableColumns;
+  int               rateHetModel;
+
+  double           startLH;
+  double           endLH;
+  double           likelihood;           /**< last likelihood value evaluated for the current topology */
+ 
+  node           **nodep;                /**< pointer to the list of nodes, which describe the current topology */
+  nodeptr          nodeBaseAddress;
+  node            *start;                /**< starting node by default for full traversals (must be a tip contained in the tree we are operating on) */
+  int              mxtips;  /**< Number of tips in the topology */
+
+  int              *constraintVector;   /**< @todo What is this? */
+  int              numberOfSecondaryColumns;
+  boolean          searchConvergenceCriterion;
+  int              ntips;
+  int              nextnode;  
+
+  boolean          bigCutoff;
+  boolean          *partitionSmoothed;
+  boolean          *partitionConverged;
+  boolean          rooted;
+  boolean          doCutoff;
+ 
+  double         gapyness;
+
+  char **nameList;     /**< list of tips names (read from the phylip file) */
+  char *tree_string;   /**< the newick representaion of the topology */
+  char *tree0;
+  char *tree1;
+  int treeStringLength;
+ 
+  unsigned int bestParsimony;
+  unsigned int *parsimonyScore;
+  
+  double bestOfNode;
+  nodeptr removeNode;   /**< the node that has been removed. Together with \a insertNode represents an SPR move */
+  nodeptr insertNode;   /**< the node where insertion should take place . Together with \a removeNode represents an SPR move*/
+
+  double *zqr;
+  double *currentZQR;
+
+  double *currentLZR;
+  double *currentLZQ;
+  double *currentLZS;
+  double *currentLZI;
+  double *lzs;
+  double *lzq;
+  double *lzr;
+  double *lzi;
+
+
+  unsigned int **bitVectors;
+
+  unsigned int vLength;
+
+  pllHashTable *h;                 /**< hashtable for ML convergence criterion */
+  //hashtable *h;
+ 
+  int optimizeRateCategoryInvocations;
+
+  checkPointState ckp;
+  boolean thoroughInsertion; /**< true if the neighbor branches should be optimized when a subtree is inserted (slower)*/
+  boolean useMedian;
+
+  pllStack * rearrangeHistory;
+  
+  /* analdef defines */
+  /* TODO: Do some initialization */
+  int              bestTrav;            /**< best rearrangement radius */
+  int              max_rearrange;       /**< max. rearrangemenent radius */
+  int              stepwidth;           /**< step in rearrangement radius */
+  int              initial;             /**< user defined rearrangement radius which also sets bestTrav if initialSet is set */
+  boolean          initialSet;          /**< set bestTrav according to initial */
+  int              mode;                /**< candidate for removal */
+  boolean        perGeneBranchLengths;
+  boolean        permuteTreeoptimize;   /**< randomly select subtrees for SPR moves */
+  boolean        compressPatterns;
+  double         likelihoodEpsilon;
+  boolean        useCheckpoint;
+
+  boolean getParsimonyPerPartition; 
+
+} pllInstance;
+
+/** @brief Stores data related to a NNI move  */
+typedef struct {
+        pllInstance * tr;
+        nodeptr p;
+        int nniType;
+        double *z; // optimize branch lengths
+        double *z0; // unoptimized branch lengths
+        double likelihood;
+        double deltaLH;
+} nniMove;
+
+/***************************************************************/
+
+typedef struct {
+  int partitionNumber;
+  int partitionLength;
+} partitionType;
+
+typedef struct
+{
+  double *z;
+  nodeptr p, q;
+  int cp, cq;
+}
+  connectRELL, *connptrRELL;
+
+typedef  struct
+{
+  connectRELL     *connect; 
+  int             start;
+  double          likelihood;
+}
+  topolRELL;
+
+
+typedef  struct
+{
+  int max;
+  topolRELL **t;
+}
+  topolRELL_LIST;
+
+/**************************************************************/
+
+/** @brief Connection within a topology.
+*   */
+typedef struct conntyp {
+    double           *z;           /**< branch length */
+    node            *p, *q;       /**< parent and child sectors */
+    void            *valptr;      /**< pointer to value of subtree */
+    int              descend;     /**< pointer to first connect of child */
+    int              sibling;     /**< next connect from same parent */
+    } connect, *connptr;
+
+/** @brief Single Topology
+*   */
+typedef  struct {
+    double           likelihood;
+    int              initialTreeNumber;
+    connect         *links;       /**< pointer to first connect (start) */
+    node            *start;
+    int              nextlink;    /**< index of next available connect */
+                                  /**< tr->start = tpl->links->p */
+    int              ntips;
+    int              nextnode;    /**< next available inner node for tree parsing */
+    int              scrNum;      /**< position in sorted list of scores */
+    int              tplNum;      /**< position in sorted list of trees */
+    } topol;
+
+/** @brief small helper data structure for printing out/downstream use of marginal ancestral probability vectors.
+*
+* it is allocated as an array that has the same length as the input alignment and can be used to 
+*   index the ancestral states for each position/site/pattern 
+*   */
+typedef struct {
+  double *probs; /**< marginal ancestral states */
+  char c; /**< most likely stated, i.e. max(probs[i]) above */
+  int states; /**< number of states for this position */
+} ancestralState;
+
+/** @brief List of topologies
+*
+*   */
+typedef struct {
+    double           best;        /**< highest score saved */
+    double           worst;       /**< lowest score saved */
+    topol           *start;       /**< starting tree for optimization */
+    topol          **byScore;
+    topol          **byTopol;
+    int              nkeep;       /**< maximum topologies to save */
+    int              nvalid;      /**< number of topologies saved */
+    int              ninit;       /**< number of topologies initialized */
+    int              numtrees;    /**< number of alternatives tested */
+    boolean          improved;
+    } bestlist;
+
+/** @brief  This is used to look up some hard-coded data for each data type 
+*   */
+typedef struct 
+{
+  int leftLength;         /**< s^2 */
+  int rightLength;/**< s^2 */
+  int eignLength;/**<  s */
+  int evLength;
+  int eiLength;
+  int substRatesLength;   /**< (s^2 - s)/2 free model parameters for matrix Q i.e. substitution rates */
+  int frequenciesLength;  /**< s frequency of each state */ 
+  int tipVectorLength;    /* ??? */
+  int symmetryVectorLength;
+  int frequencyGroupingLength;
+
+  boolean nonGTR;
+  boolean optimizeBaseFrequencies;
+
+  int undetermined;
+
+  const char *inverseMeaning;
+
+  int states;   /* s */
+
+  boolean smoothFrequencies;
+
+  const unsigned  int *bitVector;
+
+} partitionLengths;
+
+typedef struct
+{
+  int rearrangeType;
+  double  likelihood;
+
+  union {
+    struct {
+      double * zp;
+      double * zpn;
+      double * zpnn;
+      double * zqr;
+      nodeptr pn;
+      nodeptr pnn;
+      nodeptr r;
+      nodeptr p;
+      nodeptr q;
+    } SPR;
+    struct {
+      nodeptr origin;
+      int swapType;
+      double *z;
+    } NNI;
+  } Move;
+} pllRollbackInfo;
+
+
+/** @struct pllRearrangeAttr
+ 
+    @brief Structure holding attributes for searching possible tree rearrangements
+    
+    Holds the attributes for performing tree rearrangements.
+
+    @var pllRearrangeAttr
+      The origin node where the search should start
+
+    @var pllRearrangeAttr:mintrav
+      The minimum radius around the origin node \a p for which nodes should be tested
+
+    @var pllRearrangeAttr:maxtrav
+      The maximum radius around the origin node \a p for which nodes should be tested
+
+    @var pllRearrangeAttr:max
+      Maximum number of results to be returned
+*/
+typedef struct
+ {
+   nodeptr p;
+   int mintrav;
+   int maxtrav;
+ } pllRearrangeAttr;
+
+/** @typedef pllRearrangeInfo
+    
+    @brief Tree rearrangement information structure
+
+    Holds information for conducting tree arrangements. This structure
+    is the result of a tree arrangement search under given search
+    attributes.
+
+    @var pllRearrangeInfo::rearrangeType
+      Type of rearrangement. Can be \b PLL_REARRANGE_SPR, \b PLL_REARRANGE_NNI or
+      \b PLL_REARRANGE_TBR
+    
+    @var pllRearrangeInfo::likelihood
+      Holds the computed likelihood for the addressed rearrangement
+
+    @var pllRearrangeInfo::SPR::removeNode
+      Node where to perform subtree pruning
+
+    @var pllRearrangeInfo::SPR::insertNode
+      Node where to place the pruned subtree
+
+    @var pllRearrangeInfo::zqr
+      Holds the computed branch lengths after the SPR
+*/
+typedef struct
+ {
+   int rearrangeType;
+   double  likelihood;
+   union {
+     struct {
+       nodeptr removeNode;
+       nodeptr insertNode;
+       double  *zqr;
+     } SPR;
+     struct {
+       nodeptr originNode;
+       int     swapType;
+     } NNI;
+   } Move ;
+ } pllRearrangeInfo;
+
+
+typedef struct
+ {
+   int max_entries;
+   int entries;
+   pllRearrangeInfo * rearr;
+ } pllRearrangeList;
+
+/** @brief Generic structure for storing a multiple sequence alignment */
+typedef struct
+ {
+   int              sequenceCount;      /**< @brief Number of sequences */
+   int              sequenceLength;     /**< @brief Length of sequences */
+   char          ** sequenceLabels;     /**< @brief An array of where the \a i-th element is the name of the \a i-th sequence */
+   unsigned char ** sequenceData;       /**< @brief The actual sequence data */
+   int            * siteWeights;        /**< @brief An array where the \a i-th element indicates how many times site \a i appeared (prior to duplicates removal) in the alignment */
+ } pllAlignmentData;
+
+
+/******************** START OF API FUNCTION DESCRIPTIONS ********************/
+
+#if (defined(_USE_PTHREADS) || defined(_FINE_GRAIN_MPI))
+boolean isThisMyPartition(partitionList *pr, int tid, int model);
+void printParallelTimePerRegion(void); 
+#endif
+
+#ifdef _FINE_GRAIN_MPI
+extern void pllFinalizeMPI (void);
+#endif
+
+
+
+/**
+ * @brief Create the main instance of PLL
+ *   
+ * Create an instance of the phylogenetic likelihood library
+ *
+ * @param rateHetModel   Rate heterogeneity model
+ * @param fastScaling    TODO: explain fastScaling here
+ * @param saveMemory     TODO: explain saveMemory here
+ * @param useRecom       If set to \b PLL_TRUE, enables ancestral state recomputation
+ * 
+ * @todo                 Document fastScaling, rate heterogeneity and saveMemory and useRecom
+ *
+ * @note                 Do not set \a saveMemory to when using \a useRecom as memory saving 
+ *                       techniques are not yet implemented for ancestral state recomputation. 
+ * 
+ * @return               On success returns an instance to PLL, otherwise \b NULL
+ */
+extern pllInstance * pllCreateInstance (pllInstanceAttr * pInst);
+
+/** 
+ *  @ingroup instanceLinkingGroup
+ *  @brief Load alignment to the PLL instance
+ *   
+ *   Loads (copies) the parsed alignment \a alignmentData to the PLL instance
+ *   as a deep copy.
+ * 
+ *    @param tr              The library instance
+ *    @param alignmentData   The multiple sequence alignment
+ *    @param partitions      List of partitions
+ *
+ *    @return Returns 1 in case of success, 0 otherwise.
+ */
+extern int pllLoadAlignment (pllInstance * tr, 
+                         pllAlignmentData * alignmentData, 
+                             partitionList * pList);
+
+/**
+ * @brief Compute the empirical base frequencies for all partitions
+ *
+ * Compute the empirical base frequencies for all partitions in the list \a pl.
+ *
+ * @param pl                Partition list
+ * @param alignmentData     Multiple sequence alignment
+ *
+ * @return   A list of \a pl->numberOfPartitions arrays each of size
+             \a pl->partitionData[i]->states, where \a i is the \a i-th partition
+*/
+extern double ** pllBaseFrequenciesAlignment (pllAlignmentData * alignmentData, partitionList * pl);
+extern double ** pllBaseFrequenciesInstance (pllInstance * tr, partitionList * pl);
+
+/* pthreads and MPI */
+extern void pllStartPthreads (pllInstance *tr, partitionList *pr);
+extern void pllStopPthreads (pllInstance * tr);
+extern void pllLockMPI (pllInstance * tr);
+extern void pllInitMPI(int * argc, char **argv[]);
+
+
+/* handling branch lengths*/
+extern double pllGetBranchLength (pllInstance *tr, nodeptr p, int partition_id);
+extern void pllSetBranchLength (pllInstance *tr, nodeptr p, int partition_id, double bl);
+extern int pllNniSearch(pllInstance * tr, partitionList *pr, int estimateModel);
+extern void pllOptimizeBranchLengths ( pllInstance *tr, partitionList *pr, int maxSmoothIterations );
+
+
+extern void pllEvaluateLikelihood (pllInstance *tr, partitionList *pr, nodeptr p, boolean fullTraversal, boolean getPerSiteLikelihoods);
+extern void pllUpdatePartials (pllInstance *tr, partitionList *pr, nodeptr p, boolean masked);
+extern void pllUpdatePartialsAncestral(pllInstance *tr, partitionList *pr, nodeptr p);
+extern void pllNewviewIterative(pllInstance *tr, partitionList *pr, int startIndex);
+extern void pllEvaluateIterative(pllInstance *tr, partitionList *pr, boolean getPerSiteLikelihoods);
+
+/* newick parser declarations */
+extern pllNewickTree * pllNewickParseString (const char * newick);
+extern pllNewickTree * pllNewickParseFile (const char * filename);
+extern int pllValidateNewick (pllNewickTree *);
+extern void pllNewickParseDestroy (pllNewickTree **);
+extern int pllNewickUnroot (pllNewickTree * t);
+extern char * pllTreeToNewick ( char *treestr, pllInstance *tr, partitionList *pr, nodeptr p,
+      boolean printBranchLengths, boolean printNames, boolean printLikelihood,
+      boolean rellTree, boolean finalPrint, int perGene,
+      boolean branchLabelSupport, boolean printSHSupport);
+
+/* partition parser declarations */
+extern void  pllQueuePartitionsDestroy (pllQueue ** partitions);
+extern pllQueue * pllPartitionParse (const char * filename);
+extern pllQueue * pllPartitionParseString (const char * p);
+extern void pllPartitionDump (pllQueue * partitions);
+  void pllBaseSubstitute (pllInstance * tr, partitionList * partitions);
+/* void pllBaseSubstitute (pllAlignmentData * tr, partitionList * partitions); */
+partitionList * pllPartitionsCommit (pllQueue * parts, pllAlignmentData * alignmentData);
+int pllPartitionsValidate (pllQueue * parts, pllAlignmentData * alignmentData);
+extern void pllAlignmentRemoveDups (pllAlignmentData * alignmentData, partitionList * pl);
+void pllPartitionsDestroy (pllInstance *, partitionList **);
+
+/* alignment data declarations */
+extern void pllAlignmentDataDestroy (pllAlignmentData *);
+extern int pllAlignmentDataDumpFile (pllAlignmentData *, int, const char *);
+extern void pllAlignmentDataDumpConsole (pllAlignmentData * alignmentData);
+extern pllAlignmentData * pllInitAlignmentData (int, int);
+extern pllAlignmentData * pllParseAlignmentFile (int fileType, const char *);
+
+
+/* model management */
+int pllInitModel (pllInstance *, partitionList *);
+void pllInitReversibleGTR(pllInstance * tr, partitionList * pr, int model);
+void pllMakeGammaCats(double alpha, double *gammaRates, int K, boolean useMedian);
+int pllLinkAlphaParameters(char *string, partitionList *pr);
+int pllLinkFrequencies(char *string, partitionList *pr);
+int pllLinkRates(char *string, partitionList *pr);
+int pllSetSubstitutionRateMatrixSymmetries(char *string, partitionList * pr, int model);
+void pllSetFixedAlpha(double alpha, int model, partitionList * pr, pllInstance *tr);
+void pllSetFixedBaseFrequencies(double *f, int length, int model, partitionList * pr, pllInstance *tr);
+int  pllSetOptimizeBaseFrequencies(int model, partitionList * pr, pllInstance *tr);
+void pllSetSubstitutionMatrix(double *q, int length, int model, partitionList * pr,  pllInstance *tr);
+void pllSetFixedSubstitutionMatrix(double *q, int length, int model, partitionList * pr,  pllInstance *tr);
+int pllGetInstRateMatrix (partitionList * pr, int model, double * outBuffer);
+int pllOptimizeModelParameters(pllInstance *tr, partitionList *pr, double likelihoodEpsilon);
+double pllGetAlpha (partitionList * pr, int pid);
+void pllGetGammaRates (partitionList * pr, int pid, double * outBuffer);
+extern void pllGetBaseFrequencies(partitionList * pr, int model, double * outBuffer);
+extern void pllGetSubstitutionMatrix (partitionList * pr, int model, double * outBuffer);
+void pllEmpiricalFrequenciesDestroy (double *** empiricalFrequencies, int models);
+extern void pllOptRatesGeneric(pllInstance *tr, partitionList *pr, double modelEpsilon, linkageList *ll);
+extern void pllOptBaseFreqs(pllInstance *tr, partitionList * pr, double modelEpsilon, linkageList *ll);
+extern void pllOptAlphasGeneric(pllInstance *tr, partitionList * pr, double modelEpsilon, linkageList *ll);
+
+/* tree topology */
+void pllTreeInitTopologyNewick (pllInstance *, pllNewickTree *, int);
+void pllTreeInitTopologyRandom (pllInstance * tr, int tips, char ** nameList);
+void pllTreeInitTopologyForAlignment (pllInstance * tr, pllAlignmentData * alignmentData);
+extern void pllMakeRandomTree ( pllInstance *tr);
+void pllMakeParsimonyTree(pllInstance *tr);
+  extern void pllMakeParsimonyTreeFast(pllInstance *tr, partitionList *pr,boolean withSPRs);
+void pllComputeRandomizedStepwiseAdditionParsimonyTree(pllInstance * tr, partitionList * partitions);
+nodeptr pllGetRandomSubtree(pllInstance *);
+extern void pllFreeParsimonyDataStructures(pllInstance *tr, partitionList *pr);
+void pllDestroyInstance (pllInstance *);
+extern void pllGetAncestralState(pllInstance *tr, partitionList *pr, nodeptr p, double * outProbs, char * outSequence);
+unsigned int pllEvaluateParsimony(pllInstance *tr, partitionList *pr, nodeptr p, boolean full, boolean perSiteScores);
+void pllInitParsimonyStructures(pllInstance *tr, partitionList *pr, boolean perSiteScores);
+
+/* rearrange functions (NNI and SPR) */
+pllRearrangeList * pllCreateRearrangeList (int max);
+void pllDestroyRearrangeList (pllRearrangeList ** bestList);
+void pllRearrangeSearch (pllInstance * tr, partitionList * pr, int rearrangeType, nodeptr p, int mintrav, int maxtrav, pllRearrangeList * bestList);
+void pllRearrangeCommit (pllInstance * tr, partitionList * pr, pllRearrangeInfo * rearr, int saveRollbackInfo);
+int pllRearrangeRollback (pllInstance * tr, partitionList * pr);
+void pllClearRearrangeHistory (pllInstance * tr);
+int pllRaxmlSearchAlgorithm (pllInstance * tr, partitionList * pr, boolean estimateModel);
+int pllGetTransitionMatrix (pllInstance * tr, partitionList * pr, nodeptr p, int model, int rate, double * outBuffer);
+void pllGetTransitionMatrix2 (pllInstance * tr, partitionList * pr, int model, nodeptr p, double * outBuffer);
+int pllGetCLV (pllInstance * tr, partitionList * pr, nodeptr p, int partition, double * outProbs);
+extern int pllTopologyPerformNNI(pllInstance * tr, nodeptr p, int swap);
+
+/* hash functions */
+unsigned int pllHashString (const char * s, unsigned int size);
+int pllHashAdd  (pllHashTable * hTable, unsigned int hash, const char * s, void * item);
+pllHashTable * pllHashInit (unsigned int n);
+int pllHashSearch (struct pllHashTable * hTable, char * s, void ** item);
+void pllHashDestroy (struct pllHashTable ** hTable, void (*cbDealloc)(void *));
+
+/* node specific functions */
+nodeptr pllGetOrientedNodePointer (pllInstance * pInst, nodeptr p);
+
+/* other functions */
+extern char * pllReadFile (const char *, long *);
+extern int * pllssort1main (char ** x, int n);
+extern node ** pllGetInnerBranchEndPoints (pllInstance * tr);
+
+/* ---------------- */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif
diff --git a/lib/pll/pllInternal.h b/lib/pll/pllInternal.h
new file mode 100644
index 0000000..9fff0f3
--- /dev/null
+++ b/lib/pll/pllInternal.h
@@ -0,0 +1,263 @@
+/*
+ * pllInternal.h
+ *
+ *  Created on: Feb 17, 2014
+ *      Author: diego
+ */
+
+#ifndef PLLINTERNAL_H_
+#define PLLINTERNAL_H_
+
+#include "pll.h"
+#include "genericParallelization.h"
+#include "errcodes.h"
+#include "lexer.h"
+#include "parsePartition.h"
+#include "mem_alloc.h"
+
+//extern int lookupWord(char *s, stringHashtable *h);
+
+extern void getDataTypeString(pllInstance *tr, pInfo *partitionInfo, char typeOfData[1024]);
+extern int countTips(nodeptr p, int numsp);
+extern unsigned int precomputed16_bitcount(unsigned int n, char *bits_in_16bits);
+
+extern size_t discreteRateCategories(int rateHetModel);
+
+extern const partitionLengths * getPartitionLengths(pInfo *p);
+extern boolean getSmoothFreqs(int dataType);
+extern const unsigned int *getBitVector(int dataType);
+extern int getUndetermined(int dataType);
+extern int getStates(int dataType);
+extern char getInverseMeaning(int dataType, unsigned char state);
+extern double gettime ( void );
+extern int gettimeSrand ( void );
+extern double randum ( long *seed );
+
+extern void getxnode ( nodeptr p );
+extern void hookup ( nodeptr p, nodeptr q, double *z, int numBranches);
+extern void hookupFull ( nodeptr p, nodeptr q, double *z);
+extern void hookupDefault ( nodeptr p, nodeptr q);
+extern boolean whitechar ( int ch );
+extern void printLog ( pllInstance *tr);
+extern double LnGamma ( double alpha );
+extern double IncompleteGamma ( double x, double alpha, double ln_gamma_alpha );
+extern double PointNormal ( double prob );
+extern double PointChi2 ( double prob, double v );
+extern void initModel ( pllInstance *tr, double **empiricalFrequencies, partitionList * partitions);
+
+extern void resetBranches ( pllInstance *tr );
+extern void modOpt ( pllInstance *tr, partitionList *pr, double likelihoodEpsilon);
+
+extern void initializePartitionData(pllInstance *localTree, partitionList * localPartitions);
+extern void initMemorySavingAndRecom(pllInstance *tr, partitionList *pr);
+
+extern void nodeRectifier ( pllInstance *tr );
+extern void allocateParsimonyDataStructures(pllInstance *tr, partitionList *pr);
+
+extern FILE *myfopen(const char *path, const char *mode);
+
+extern boolean initrav ( pllInstance *tr, partitionList *pr, nodeptr p );
+extern void initravPartition ( pllInstance *tr, nodeptr p, int model );
+extern void update ( pllInstance *tr, partitionList *pr, nodeptr p );
+extern void smooth ( pllInstance *tr, partitionList *pr, nodeptr p );
+extern void smoothTree ( pllInstance *tr, partitionList *pr, int maxtimes );
+extern void localSmooth ( pllInstance *tr, partitionList *pr, nodeptr p, int maxtimes );
+extern boolean localSmoothMulti(pllInstance *tr, nodeptr p, int maxtimes, int model);
+
+extern void smoothRegion ( pllInstance *tr, partitionList *pr, nodeptr p, int region );
+extern void regionalSmooth ( pllInstance *tr, partitionList *pr, nodeptr p, int maxtimes, int region );
+extern nodeptr removeNodeBIG ( pllInstance *tr, partitionList *pr, nodeptr p, int numBranches);
+extern nodeptr removeNodeRestoreBIG ( pllInstance *tr, partitionList *pr, nodeptr p );
+extern boolean insertBIG ( pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q);
+extern boolean insertRestoreBIG ( pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q );
+extern boolean testInsertBIG ( pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q );
+extern int NNI(pllInstance * tr, nodeptr p, int swap);
+extern void addTraverseBIG ( pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q, int mintrav, int maxtrav );
+extern int rearrangeBIG ( pllInstance *tr, partitionList *pr, nodeptr p, int mintrav, int maxtrav );
+extern void traversalOrder ( nodeptr p, int *count, nodeptr *nodeArray );
+extern boolean testInsertRestoreBIG ( pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q );
+extern void restoreTreeFast ( pllInstance *tr, partitionList *pr );
+
+extern void initTL ( topolRELL_LIST *rl, pllInstance *tr, int n );
+extern void freeTL ( topolRELL_LIST *rl);
+extern void restoreTL ( topolRELL_LIST *rl, pllInstance *tr, int n, int numBranches );
+extern void resetTL ( topolRELL_LIST *rl );
+extern void saveTL ( topolRELL_LIST *rl, pllInstance *tr, int index );
+
+extern int  saveBestTree (bestlist *bt, pllInstance *tr, int numBranches);
+extern int  recallBestTree (bestlist *bt, int rank, pllInstance *tr, partitionList *pr);
+extern int initBestTree ( bestlist *bt, int newkeep, int numsp );
+extern void resetBestTree ( bestlist *bt );
+extern boolean freeBestTree ( bestlist *bt );
+
+
+/* extern int treeReadLen (FILE *fp, pllInstance *tr, boolean readBranches, boolean readNodeLabels, boolean topologyOnly);
+extern void getStartingTree (pllInstance *tr); 
+extern void treeReadTopologyString(char *treeString, pllInstance *tr);
+extern double treeLength (pllInstance *tr, int model);*/
+extern double evaluatePartialGeneric (pllInstance *, partitionList *pr, int i, double ki, int _model);
+extern void newviewAncestralIterative(pllInstance *tr, partitionList *pr);
+extern void printAncestralState(nodeptr p, boolean printStates, boolean printProbs, pllInstance *tr, partitionList *pr);
+extern void makenewzGeneric(pllInstance *tr, partitionList * pr, nodeptr p, nodeptr q, double *z0, int maxiter, double *result, boolean mask);
+extern void makenewzGenericDistance(pllInstance *tr, int maxiter, double *z0, double *result, int taxon1, int taxon2);
+extern double evaluatePartitionGeneric (pllInstance *tr, nodeptr p, int model);
+extern void newviewPartitionGeneric (pllInstance *tr, nodeptr p, int model);
+extern double evaluateGenericVector (pllInstance *tr, nodeptr p);
+extern void categorizeGeneric (pllInstance *tr, nodeptr p);
+extern double makenewzPartitionGeneric(pllInstance *tr, nodeptr p, nodeptr q, double z0, int maxiter, int model);
+extern boolean isTip(int number, int maxTips);
+
+/* recom functions */
+extern void computeTraversal(pllInstance *tr, nodeptr p, boolean partialTraversal, int numBranches);
+extern void allocRecompVectorsInfo(pllInstance *tr);
+extern void allocTraversalCounter(pllInstance *tr);
+extern boolean getxVector(recompVectors *rvec, int nodenum, int *slot, int mxtips);
+extern boolean needsRecomp(boolean recompute, recompVectors *rvec, nodeptr p, int mxtips);
+extern void unpinNode(recompVectors *v, int nodenum, int mxtips);
+extern void protectNode(recompVectors *rvec, int nodenum, int mxtips);
+
+/* Handling branch lengths*/
+extern void computeTraversalInfoStlen(nodeptr p, int maxTips, recompVectors *rvec, int *count);
+extern void computeFullTraversalInfoStlen(nodeptr p, int maxTips, recompVectors *rvec);
+extern void printTraversalInfo(pllInstance *tr);
+extern void countTraversal(pllInstance *tr);
+extern void storeExecuteMaskInTraversalDescriptor(pllInstance *tr, partitionList *pr);
+extern void storeValuesInTraversalDescriptor(pllInstance *tr, partitionList *pr, double *value);
+extern void makenewzIterative(pllInstance *, partitionList *pr);
+extern void execCore(pllInstance *, partitionList *pr, volatile double *dlnLdlz, volatile double *d2lnLdlz2);
+extern void makePermutation(int *perm, int n, pllInstance *tr);
+extern nodeptr findAnyTip(nodeptr p, int numsp);
+extern void putWAG(double *ext_initialRates);
+extern  unsigned int **initBitVector(int mxtips, unsigned int *vectorLength);
+//extern hashtable *initHashTable(unsigned int n);
+extern void cleanupHashTable(pllHashTable * h, int state);
+extern double convergenceCriterion(pllHashTable *h, int mxtips);
+extern void freeBitVectors(unsigned int **v, int n);
+//extern void freeHashTable(hashtable *h);
+//extern stringHashtable *initStringHashTable(hashNumberType n);
+//extern void addword(char *s, stringHashtable *h, int nodeNumber);
+extern void initRateMatrix(pllInstance *tr, partitionList *pr);
+extern void bitVectorInitravSpecial(unsigned int **bitVectors, nodeptr p, int numsp, unsigned int vectorLength, pllHashTable *h, int treeNumber, int function, branchInfo *bInf,
+                                    int *countBranches, int treeVectorLength, boolean traverseOnly, boolean computeWRF, int processID);
+extern  unsigned int bitcount_32_bit(unsigned int i);
+extern unsigned int bitcount_64_bit(unsigned long i);
+
+extern void perSiteLogLikelihoods(pllInstance *tr, partitionList *pr, double *logLikelihoods);
+extern void updatePerSiteRates(pllInstance *tr, partitionList *pr, boolean scaleRates);
+extern void restart(pllInstance *tr, partitionList *pr);
+boolean isGap(unsigned int *x, int pos);
+boolean noGap(unsigned int *x, int pos);
+
+/* from utils.h */
+linkageList* initLinkageList(int *linkList, partitionList *pr);
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS) )
+/* work tags for parallel regions */
+
+#define PLL_THREAD_NEWVIEW                  0
+#define PLL_THREAD_EVALUATE                 1
+#define PLL_THREAD_MAKENEWZ                 2
+#define PLL_THREAD_MAKENEWZ_FIRST           3
+#define PLL_THREAD_RATE_CATS                4
+#define PLL_THREAD_COPY_RATE_CATS           5
+#define PLL_THREAD_COPY_INIT_MODEL          6
+#define PLL_THREAD_INIT_PARTITION           7
+#define PLL_THREAD_OPT_ALPHA                8
+#define PLL_THREAD_OPT_RATE                 9
+#define PLL_THREAD_COPY_ALPHA               10
+#define PLL_THREAD_COPY_RATES               11
+#define PLL_THREAD_PER_SITE_LIKELIHOODS     12
+#define PLL_THREAD_NEWVIEW_ANCESTRAL        13
+#define PLL_THREAD_GATHER_ANCESTRAL         14
+#define PLL_THREAD_EXIT_GRACEFULLY          15
+#define PLL_THREAD_EVALUATE_PER_SITE_LIKES  16
+
+
+typedef struct
+{
+  pllInstance *tr;
+
+  partitionList *pr;
+  int threadNumber;
+}
+  threadData;
+extern void optRateCatPthreads(pllInstance *tr, partitionList *pr, double lower_spacing, double upper_spacing, double *lhs, int n, int tid);
+extern void pllMasterBarrier(pllInstance *, partitionList *, int);
+#endif
+
+
+#ifdef __AVX
+
+extern void newviewGTRGAMMAPROT_AVX_LG4(int tipCase,
+                                        double *x1, double *x2, double *x3, double *extEV[4], double *tipVector[4],
+                                        int *ex3, unsigned char *tipX1, unsigned char *tipX2, int n,
+                                        double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling);
+
+
+extern void newviewGTRCAT_AVX_GAPPED_SAVE(int tipCase,  double *EV,  int *cptr,
+                                   double *x1_start, double *x2_start,  double *x3_start, double *tipVector,
+                                   int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                   int n,  double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling,
+                                   unsigned int *x1_gap, unsigned int *x2_gap, unsigned int *x3_gap,
+                                   double *x1_gapColumn, double *x2_gapColumn, double *x3_gapColumn, const int maxCats);
+
+extern void newviewGTRCATPROT_AVX_GAPPED_SAVE(int tipCase, double *extEV,
+                                       int *cptr,
+                                       double *x1, double *x2, double *x3, double *tipVector,
+                                       int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                       int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling,
+                                       unsigned int *x1_gap, unsigned int *x2_gap, unsigned int *x3_gap,
+                                       double *x1_gapColumn, double *x2_gapColumn, double *x3_gapColumn, const int maxCats);
+
+extern void  newviewGTRGAMMA_AVX_GAPPED_SAVE(int tipCase,
+                                      double *x1_start, double *x2_start, double *x3_start,
+                                      double *extEV, double *tipVector,
+                                      int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                                      const int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling,
+                                      unsigned int *x1_gap, unsigned int *x2_gap, unsigned int *x3_gap,
+                                      double *x1_gapColumn, double *x2_gapColumn, double *x3_gapColumn
+                                      );
+
+extern void newviewGTRGAMMAPROT_AVX_GAPPED_SAVE(int tipCase,
+                                         double *x1_start, double *x2_start, double *x3_start, double *extEV, double *tipVector,
+                                         int *ex3, unsigned char *tipX1, unsigned char *tipX2, int n,
+                                         double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling,
+                                         unsigned int *x1_gap, unsigned int *x2_gap, unsigned int *x3_gap,
+                                         double *x1_gapColumn, double *x2_gapColumn, double *x3_gapColumn);
+
+extern void newviewGTRCAT_AVX(int tipCase,  double *EV,  int *cptr,
+    double *x1_start, double *x2_start,  double *x3_start, double *tipVector,
+    int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+    int n,  double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling);
+
+
+extern void newviewGenericCATPROT_AVX(int tipCase, double *extEV,
+    int *cptr,
+    double *x1, double *x2, double *x3, double *tipVector,
+    int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+    int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling);
+
+
+extern void newviewGTRGAMMA_AVX(int tipCase,
+    double *x1_start, double *x2_start, double *x3_start,
+    double *EV, double *tipVector,
+    int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+    const int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling);
+
+extern void newviewGTRGAMMAPROT_AVX(int tipCase,
+                             double *x1, double *x2, double *x3, double *extEV, double *tipVector,
+                             int *ex3, unsigned char *tipX1, unsigned char *tipX2, int n,
+                             double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling);
+
+extern void newviewGTRCATPROT_AVX(int tipCase, double *extEV,
+                           int *cptr,
+                           double *x1, double *x2, double *x3, double *tipVector,
+                           int *ex3, unsigned char *tipX1, unsigned char *tipX2,
+                           int n, double *left, double *right, int *wgt, int *scalerIncrement, const boolean useFastScaling);
+
+#endif
+
+extern int virtual_width( int n );
+extern void computeAllAncestralVectors(nodeptr p, pllInstance *tr, partitionList *pr);
+
+#endif /* PLLINTERNAL_H_ */
diff --git a/lib/pll/queue.c b/lib/pll/queue.c
new file mode 100644
index 0000000..eecf3fb
--- /dev/null
+++ b/lib/pll/queue.c
@@ -0,0 +1,96 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file queue.c
+ */
+#include <stdio.h>
+#include "queue.h"
+#include "mem_alloc.h"
+
+int
+pllQueueInit (pllQueue ** q)
+{  
+  *q = (pllQueue *) rax_malloc (sizeof (pllQueue));
+  if (!*q) return (0);
+   
+  (*q)->head = NULL;
+  (*q)->tail = NULL;
+   
+  return (1);
+}  
+
+int 
+pllQueueSize (pllQueue * q)
+{  
+  int n = 0;
+  struct pllQueueItem * elm;
+   
+  if (!q) return (0);
+   
+  for (elm = q->head; elm; elm = elm->next) ++n;
+   
+  return (n);
+}  
+
+int
+pllQueueRemove (pllQueue * q, void ** item)
+{  
+  struct pllQueueItem * elm;
+   
+  if (!q || !q->head) return (0);
+   
+  elm = q->head;
+   
+  *item = elm->item;
+   
+  q->head = q->head->next;
+  if (!q->head)  q->tail = NULL;
+  rax_free (elm);
+   
+  return (1);
+}  
+
+int 
+pllQueueAppend (pllQueue * q, void * item)
+{ 
+  struct pllQueueItem * qitem;
+  if (!q) return (0);
+  
+  qitem = (struct pllQueueItem *) rax_malloc (sizeof (struct pllQueueItem));
+  if (!qitem) return (0);
+  
+  qitem->item = item;
+  qitem->next = NULL;
+  
+  if (!q->head) 
+    q->head = qitem;
+  else
+    q->tail->next = qitem;
+  
+  q->tail = qitem;
+
+  return (1);
+} 
diff --git a/lib/pll/queue.h b/lib/pll/queue.h
new file mode 100644
index 0000000..b359c4a
--- /dev/null
+++ b/lib/pll/queue.h
@@ -0,0 +1,48 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file queue.h
+ */
+#ifndef __pll_QUEUE__
+#define __pll_QUEUE__
+
+struct pllQueueItem
+{  
+  void * item;
+  struct pllQueueItem * next;
+}; 
+   
+typedef struct
+{  
+  struct pllQueueItem * head;
+  struct pllQueueItem * tail;
+} pllQueue; 
+
+int pllQueueInit (pllQueue ** q);
+int pllQueueSize (pllQueue * q);
+int pllQueueRemove (pllQueue * q, void ** item);
+int pllQueueAppend (pllQueue * q, void * item);
+#endif
diff --git a/lib/pll/randomTree.c b/lib/pll/randomTree.c
new file mode 100644
index 0000000..c1d9af4
--- /dev/null
+++ b/lib/pll/randomTree.c
@@ -0,0 +1,177 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file randomTree.c
+ */
+#include "mem_alloc.h"
+#include <math.h>
+#include <time.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+
+#include "pll.h"
+#include "pllInternal.h"
+
+static void insertTaxon (nodeptr p, nodeptr q)
+{
+  nodeptr  r;
+  
+  r = q->back;
+  
+  hookupDefault(p->next,       q);
+  hookupDefault(p->next->next, r);
+} 
+
+static nodeptr buildNewTip (pllInstance *tr, nodeptr p)
+{ 
+  nodeptr  q;
+
+  q = tr->nodep[(tr->nextnode)++];
+  hookupDefault(p, q);
+  q->next->back = (nodeptr)NULL;
+  q->next->next->back = (nodeptr)NULL;
+ 
+  return  q;
+} 
+
+static void buildSimpleTreeRandom (pllInstance *tr, int ip, int iq, int ir)
+{    
+  nodeptr  
+    p, 
+    s;
+  
+  int  
+    i;
+  
+  i = PLL_MIN(ip, iq);
+  if (ir < i)  i = ir; 
+  tr->start = tr->nodep[i];
+  tr->ntips = 3;
+  p = tr->nodep[ip];
+  
+  hookupDefault(p, tr->nodep[iq]);
+  
+  s = buildNewTip(tr, tr->nodep[ir]);
+  
+  insertTaxon(s, p);
+}
+
+static int randomInt(int n, pllInstance *tr)
+{
+  int 
+    res = (int)((double)(n) * randum(&tr->randomNumberSeed));
+
+  assert(res >= 0 && res < n);
+  
+  return res;
+}
+
+void makePermutation(int *perm, int n, pllInstance *tr)
+{    
+  int  
+    i, 
+    j, 
+    k;    
+
+  for (i = 1; i <= n; i++)    
+    perm[i] = i;               
+
+  for (i = 1; i <= n; i++) 
+    {    
+      k =  randomInt(n + 1 - i, tr); /*(int)((double)(n + 1 - i) * randum(&tr->randomNumberSeed));*/
+
+      assert(i + k <= n);
+      
+      j        = perm[i];
+      perm[i]     = perm[i + k];
+      perm[i + k] = j; 
+    }
+}
+
+static int markBranches(nodeptr *branches, nodeptr p, int *counter, int numsp)
+{
+  if(isTip(p->number, numsp))
+    return 0;
+  else
+    {
+      branches[*counter] = p->next;
+      branches[*counter + 1] = p->next->next;
+      
+      *counter = *counter + 2;
+      
+      return ((2 + markBranches(branches, p->next->back, counter, numsp) + 
+	       markBranches(branches, p->next->next->back, counter, numsp)));
+    }
+}
+
+
+
+void pllMakeRandomTree(pllInstance *tr)
+{  
+  nodeptr 
+    p, 
+    f, 
+    randomBranch,
+    *branches = (nodeptr *)rax_malloc(sizeof(nodeptr) * (2 * tr->mxtips));    
+  
+  int 
+    nextsp, 
+    *perm = (int *)rax_malloc((tr->mxtips + 1) * sizeof(int)), 
+    branchCounter;                      
+  
+  makePermutation(perm, tr->mxtips, tr);              
+  
+  tr->ntips = 0;       	       
+  tr->nextnode = tr->mxtips + 1;    
+  
+  buildSimpleTreeRandom(tr, perm[1], perm[2], perm[3]);
+  
+  while(tr->ntips < tr->mxtips) 
+    {	             
+      nextsp = ++(tr->ntips);             
+      p = tr->nodep[perm[nextsp]];            
+      
+      buildNewTip(tr, p);  	
+      
+      f = findAnyTip(tr->start, tr->mxtips);
+      f = f->back;
+      
+      branchCounter = 1;
+      branches[0] = f;
+      markBranches(branches, f, &branchCounter, tr->mxtips);
+
+      assert(branchCounter == ((2 * (tr->ntips - 1)) - 3));
+      
+      randomBranch = branches[randomInt(branchCounter, tr)];
+      
+      insertTaxon(p->back, randomBranch);
+    }
+  
+  rax_free(perm);            
+  rax_free(branches);
+}
+
diff --git a/lib/pll/recom.c b/lib/pll/recom.c
new file mode 100644
index 0000000..b4acce6
--- /dev/null
+++ b/lib/pll/recom.c
@@ -0,0 +1,688 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file recom.c
+ * @brief Functions used for recomputation of vectors (only a fraction of LH vectors stored in RAM)   
+ */
+#include "mem_alloc.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <limits.h>
+#include <errno.h>
+#include <time.h>
+#include <math.h>
+#include <sys/time.h>
+
+#include "pll.h"
+#include "pllInternal.h"
+
+/** @brief Locks node \a nodenum to force it remains availably in memory
+ *
+ * @warning If a node is available we dont need to recompute it, but we neet to make sure it is not unpinned while buildding the rest of the traversal descriptor, i.e. unpinnable must be PLL_FALSE at this point, it will automatically be set to PLL_TRUE, after the counter post-order instructions have been executed 
+Omitting this call the traversal will likely still work as long as num_allocated_nodes >> log n, but wrong inner vectors will be used at the wrong moment of pllNewviewIterative, careful! 
+ *
+ *  @param rvec 
+ *    Recomputation info
+ *
+ *  @param nodenum
+ *    Node id that must remain available in memory 
+ *
+ *  @param mxtips
+ *    Number of tips in the tree
+ *
+ */
+void protectNode(recompVectors *rvec, int nodenum, int mxtips)
+{
+
+  int slot;
+  slot = rvec->iNode[nodenum - mxtips - 1];
+  assert(slot != PLL_NODE_UNPINNED);
+  assert(rvec->iVector[slot] == nodenum);
+
+  if(rvec->unpinnable[slot])
+    rvec->unpinnable[slot] = PLL_FALSE;
+}
+
+/** @brief Checks if \a nodenum  is currently pinned (available in RAM)
+ *
+ *  @note shall we document static functions? 
+ * 
+ *  @param rvec 
+ *    Recomputation info
+ *
+ *  @param nodenum
+ *    Node id to be checked
+ *
+ *  @param mxtips
+ *    Number of tips in the tree
+ *
+ */
+static boolean isNodePinned(recompVectors *rvec, int nodenum, int mxtips)
+{
+  assert(nodenum > mxtips);
+
+  if(rvec->iNode[nodenum - mxtips - 1] == PLL_NODE_UNPINNED)
+    return PLL_FALSE;
+  else
+    return PLL_TRUE;
+}
+
+/** @brief Checks if the likelihood entries at node \a p should be updated
+ *
+ * A node needs update if one of the following holds:
+ *    1. It is not oriented (p->x == 0) 
+ *    2. We are applying recomputations and node \a p is not currently available in RAM
+ *  
+ *  @param recompute 
+ *    PLL_TRUE if recomputation is currently applied 
+ *
+ *  @param p
+ *    Node to check whether it is associated with the likelihood vector
+ *
+ *  @param mxtips
+ *    Number of tips in the tree
+ *
+ */
+boolean needsRecomp(boolean recompute, recompVectors *rvec, nodeptr p, int mxtips)
+{ 
+  if((!p->x) || (recompute && !isNodePinned(rvec, p->number, mxtips)))
+    return PLL_TRUE;
+  else
+    return PLL_FALSE;
+}
+
+
+
+/** @brief Allocates memory for recomputation structure
+ *  
+ *  
+ *  @todo this should not depend on tr (\a vectorRecomFraction should be a parameter)
+ *    PLL_TRUE if recomputation is currently applied 
+ *
+ */
+void allocRecompVectorsInfo(pllInstance *tr)
+{
+  recompVectors 
+    *v = (recompVectors *) rax_malloc(sizeof(recompVectors));
+
+  int 
+    num_inner_nodes = tr->mxtips - 2,
+                    num_vectors, 
+                    i;
+
+  assert(tr->vectorRecomFraction > PLL_MIN_RECOM_FRACTION);
+  assert(tr->vectorRecomFraction < PLL_MAX_RECOM_FRACTION);
+
+  num_vectors = (int) (1 + tr->vectorRecomFraction * (float)num_inner_nodes); 
+
+  int theoretical_minimum_of_vectors = 3 + ((int)(log((double)tr->mxtips)/log(2.0)));
+  //printBothOpen("Try to use %d ancestral vectors, min required %d\n", num_vectors, theoretical_minimum_of_vectors);
+
+  assert(num_vectors >= theoretical_minimum_of_vectors);
+  assert(num_vectors < tr->mxtips);
+
+
+  v->numVectors = num_vectors; /* use minimum bound theoretical */
+
+  /* init vectors tracking */
+
+  v->iVector         = (int *) rax_malloc((size_t)num_vectors * sizeof(int));
+  v->unpinnable      = (boolean *) rax_malloc((size_t)num_vectors * sizeof(boolean));
+
+  for(i = 0; i < num_vectors; i++)
+  {
+    v->iVector[i]         = PLL_SLOT_UNUSED;
+    v->unpinnable[i]      = PLL_FALSE;
+  }
+
+  v->iNode      = (int *) rax_malloc((size_t)num_inner_nodes * sizeof(int));
+  v->stlen      = (int *) rax_malloc((size_t)num_inner_nodes * sizeof(int));
+
+  for(i = 0; i < num_inner_nodes; i++)
+  {
+    v->iNode[i] = PLL_NODE_UNPINNED;
+    v->stlen[i] = PLL_INNER_NODE_INIT_STLEN;
+  }
+
+  v->allSlotsBusy = PLL_FALSE;
+
+  /* init nodes tracking */
+
+  v->maxVectorsUsed = 0;
+  tr->rvec = v;
+}
+
+/** @brief Find the slot id with the minimum cost to be recomputed.
+ *  
+ *  The minum cost is defined as the minimum subtree size. In general, the closer a vector is to the tips, 
+ *  the less recomputations are required to re-establish its likelihood entries
+ *
+ *  @todo remove _DEBUG_RECOMPUTATION code
+ *  
+ *  @param v
+ *
+ *  @param mxtips
+ *    Number of tips in the tree
+ *
+ */
+static int findUnpinnableSlotByCost(recompVectors *v, int mxtips)
+{
+  int 
+    i, 
+    slot, 
+    cheapest_slot = -1, 
+    min_cost = mxtips * 2; /* more expensive than the most expensive*/
+#ifdef _DEBUG_RECOMPUTATION 
+  double straTime = gettime();
+#endif 
+
+
+  for(i = 0; i < mxtips - 2; i++)
+  {
+    slot = v->iNode[i];
+    if(slot != PLL_NODE_UNPINNED)
+    {
+      assert(slot >= 0 && slot < v->numVectors);
+
+      if(v->unpinnable[slot])
+      {
+        assert(v->stlen[i] > 0);
+
+        if(v->stlen[i] < min_cost)
+        {
+          min_cost = v->stlen[i];
+          cheapest_slot = slot;
+          /* if the slot costs 2 you can break cause there is nothing cheaper to recompute */
+          if(min_cost == 2)
+            break;
+        }
+      }
+    }
+  }
+  assert(min_cost < mxtips * 2 && min_cost >= 2);
+  assert(cheapest_slot >= 0);
+  return cheapest_slot;
+}
+
+static void unpinAtomicSlot(recompVectors *v, int slot, int mxtips)
+{
+  int 
+    nodenum = v->iVector[slot];
+
+  v->iVector[slot] = PLL_SLOT_UNUSED;
+
+  if(nodenum != PLL_SLOT_UNUSED)  
+    v->iNode[nodenum - mxtips - 1] = PLL_NODE_UNPINNED; 
+}
+
+/** @brief Finds the cheapest slot and unpins it
+ *
+ */
+static int findUnpinnableSlot(recompVectors *v, int mxtips)
+{
+  int     
+    slot_unpinned = findUnpinnableSlotByCost(v, mxtips);
+
+  assert(slot_unpinned >= 0);
+  assert(v->unpinnable[slot_unpinned]);
+
+  unpinAtomicSlot(v, slot_unpinned, mxtips);
+
+  return slot_unpinned;
+}
+
+/** @brief Finds a free slot 
+ * 
+ *  If all slots are occupied, it will find the cheapest slot and unpin it
+ *
+ */
+static int findFreeSlot(recompVectors *v, int mxtips)
+{
+  int 
+    slotno = -1, 
+           i;
+
+  assert(v->allSlotsBusy == PLL_FALSE);
+
+  for(i = 0; i < v->numVectors; i++)
+  {
+    if(v->iVector[i] == PLL_SLOT_UNUSED)
+    {
+      slotno = i;
+      break;
+    } 
+  }
+
+  if(slotno == -1)
+  {
+    v->allSlotsBusy = PLL_TRUE;
+    slotno = findUnpinnableSlot(v, mxtips);
+  }
+
+  return slotno;
+}
+
+
+/** @brief Pins node \a nodenum to slot \a slot
+ *  
+ *  The slot is initialized as non-unpinnable (ensures that the contents of the vector will not be overwritten)
+ *
+ *  @param nodenum
+ *    node id
+ *
+ *  @param slot
+ *    slot id 
+ *    
+ *  @param mxtips
+ *    Number of tips in the tree
+ *
+ */
+static void pinAtomicNode(recompVectors *v, int nodenum, int slot, int mxtips)
+{
+  v->iVector[slot] = nodenum;
+  v->iNode[nodenum - mxtips - 1] = slot;
+  v->unpinnable[slot] = PLL_FALSE;
+}
+
+static int pinNode(recompVectors *rvec, int nodenum, int mxtips)
+{
+  int 
+    slot;
+
+  assert(!isNodePinned(rvec, nodenum, mxtips));
+
+  if(rvec->allSlotsBusy)
+    slot = findUnpinnableSlot(rvec, mxtips);
+  else
+    slot = findFreeSlot(rvec, mxtips);
+
+  assert(slot >= 0);
+
+  pinAtomicNode(rvec, nodenum, slot, mxtips);
+
+  if(slot > rvec->maxVectorsUsed)
+    rvec->maxVectorsUsed = slot;
+
+  assert(slot == rvec->iNode[nodenum - mxtips - 1]);
+
+  return slot;
+}
+
+/** @brief Marks node \a nodenum as unpinnable
+ *  
+ *  The slot holding the node \a nodenum is added to the pool of slot candidates that can be overwritten.
+ *
+ *  @param v
+ *    Recomputation info
+ *    
+ *  @param nodenum
+ *    node id
+ *    
+ *  @param mxtips
+ *    Number of tips in the tree
+ *
+ */
+void unpinNode(recompVectors *v, int nodenum, int mxtips)
+{
+  if(nodenum <= mxtips)
+    return;
+  else
+  {
+    int 
+      slot = -1;
+
+    assert(nodenum > mxtips);
+    slot = v->iNode[nodenum-mxtips-1];
+    assert(slot >= 0 && slot < v->numVectors); 
+
+    if(slot >= 0 && slot < v->numVectors)
+      v->unpinnable[slot] = PLL_TRUE;
+  }
+}
+
+
+/** @brief Get a pinned slot \a slot that holds the likelihood vector for inner node \a nodenum
+ *  
+ *  If node \a node nodenum is not pinned to any slot yet, the minimum cost replacement strategy is used.
+ *
+ *  @param v
+ *    Recomputation info
+ *    
+ *  @param nodenum
+ *    node id
+ *    
+ *  @param slot
+ *    slot id
+ *
+ *  @param mxtips
+ *    Number of tips in the tree
+ *
+ */
+boolean getxVector(recompVectors *rvec, int nodenum, int *slot, int mxtips)
+{
+  boolean 
+    slotNeedsRecomp = PLL_FALSE;
+
+  *slot = rvec->iNode[nodenum - mxtips - 1];
+
+  if(*slot == PLL_NODE_UNPINNED)
+  {
+    *slot = pinNode(rvec, nodenum, mxtips); /* now we will run the replacement strategy */
+    slotNeedsRecomp = PLL_TRUE;
+  }
+
+  assert(*slot >= 0 && *slot < rvec->numVectors);
+
+  rvec->unpinnable[*slot] = PLL_FALSE;
+
+  return slotNeedsRecomp;
+}
+
+
+#ifdef _DEBUG_RECOMPUTATION
+
+static int subtreeSize(nodeptr p, int maxTips)
+{
+  if(isTip(p->number, maxTips))
+    return 1;
+  else   
+    return (subtreeSize(p->next->back, maxTips) + subtreeSize(p->next->next->back, maxTips));
+}
+
+#endif
+
+/** @brief Annotes unoriented tree nodes \a tr with their subtree size 
+ *  
+ *  This function recursively updates the subtree size of each inner node.
+ *  @note The subtree size of node \a p->number is the number of nodes included in the subtree where node record \a p is the virtual root. 
+ *
+ *  @param p
+ *    Pointer to node 
+ *    
+ *  @param maxTips
+ *    Number of tips in the tree
+ *
+ *  @param rvec 
+ *    Recomputation info
+ *    
+ *  @param count
+ *    Number of visited nodes 
+ */
+void computeTraversalInfoStlen(nodeptr p, int maxTips, recompVectors *rvec, int *count) 
+{
+  if(isTip(p->number, maxTips))
+    return;
+  else
+  {          
+    nodeptr 
+      q = p->next->back,
+        r = p->next->next->back;
+
+    *count += 1;
+    /* set xnode info at this point */     
+
+    if(isTip(r->number, maxTips) && isTip(q->number, maxTips))  
+    {
+      rvec->stlen[p->number - maxTips - 1] = 2;	
+
+#ifdef _DEBUG_RECOMPUTATION
+      assert(rvec->stlen[p->number - maxTips - 1] == subtreeSize(p, maxTips));
+#endif
+    }
+    else
+    {
+      if(isTip(r->number, maxTips) || isTip(q->number, maxTips))
+      {	     
+        nodeptr 
+          tmp;
+
+        if(isTip(r->number, maxTips))
+        {
+          tmp = r;
+          r = q;
+          q = tmp;
+        }
+
+        if(!r->x)
+          computeTraversalInfoStlen(r, maxTips, rvec, count);
+
+        rvec->stlen[p->number - maxTips - 1] = rvec->stlen[r->number - maxTips - 1] + 1;
+
+#ifdef _DEBUG_RECOMPUTATION	      
+        assert(rvec->stlen[p->number - maxTips - 1] == subtreeSize(p, maxTips));
+#endif
+      }
+      else
+      {		 
+        if(!r->x)
+          computeTraversalInfoStlen(r, maxTips, rvec, count);
+        if(!q->x)
+          computeTraversalInfoStlen(q, maxTips, rvec, count); 
+
+        rvec->stlen[p->number - maxTips - 1] = rvec->stlen[q->number - maxTips - 1] + rvec->stlen[r->number - maxTips - 1];	
+
+#ifdef _DEBUG_RECOMPUTATION
+        assert(rvec->stlen[p->number - maxTips - 1] == subtreeSize(p, maxTips));
+#endif
+      }
+    }
+  }
+}
+
+
+
+
+/* pre-compute the node stlens (this needs to be known prior to running the strategy) */
+/** @brief Annotes all tree nodes \a tr with their subtree size 
+ *  
+ *  Similar to \a computeTraversalInfoStlen, but does a full traversal ignoring orientation.
+ *  The minum cost is defined as the minimum subtree size. In general, the closer a vector is to the tips, 
+ *  the less recomputations are required to re-establish its likelihood entries
+ *
+ *  @param p
+ *    Pointer to node 
+ *    
+ *  @param maxTips
+ *    Number of tips in the tree
+ *
+ *  @param rvec 
+ *    Recomputation info
+ */
+void computeFullTraversalInfoStlen(nodeptr p, int maxTips, recompVectors *rvec) 
+{
+  if(isTip(p->number, maxTips))
+    return;
+  else
+  {    
+    nodeptr 
+      q = p->next->back,
+        r = p->next->next->back;     
+
+    if(isTip(r->number, maxTips) && isTip(q->number, maxTips))
+    {	  
+      rvec->stlen[p->number - maxTips - 1] = 2;
+
+#ifdef _DEBUG_RECOMPUTATION
+      assert(rvec->stlen[p->number - maxTips - 1] == subtreeSize(p, maxTips));
+#endif
+    }
+    else
+    {	    
+      if(isTip(r->number, maxTips) || isTip(q->number, maxTips))
+      {	  	      
+        nodeptr 
+          tmp;
+
+        if(isTip(r->number, maxTips))
+        {
+          tmp = r;
+          r = q;
+          q = tmp;
+        }
+
+        computeFullTraversalInfoStlen(r, maxTips, rvec);
+
+        rvec->stlen[p->number - maxTips - 1] = rvec->stlen[r->number - maxTips - 1] + 1;	   
+
+#ifdef _DEBUG_RECOMPUTATION
+        assert(rvec->stlen[p->number - maxTips - 1] == subtreeSize(p, maxTips));
+#endif
+      }
+      else
+      {	    	     	      
+        computeFullTraversalInfoStlen(r, maxTips, rvec);
+        computeFullTraversalInfoStlen(q, maxTips, rvec); 
+
+        rvec->stlen[p->number - maxTips - 1] = rvec->stlen[q->number - maxTips - 1] + rvec->stlen[r->number - maxTips - 1];
+#ifdef _DEBUG_RECOMPUTATION
+        assert(rvec->stlen[p->number - maxTips - 1] == subtreeSize(p, maxTips));
+#endif
+      }
+    }
+  }
+}
+
+
+#ifdef _DEBUG_RECOMPUTATION
+
+void allocTraversalCounter(pllInstance *tr)
+{
+  traversalCounter 
+    *tc;
+
+  int 
+    k;
+
+  tc = (traversalCounter *)rax_malloc(sizeof(traversalCounter));
+
+  tc->travlenFreq = (unsigned int *)rax_malloc(tr->mxtips * sizeof(int));
+
+  for(k = 0; k < tr->mxtips; k++)
+    tc->travlenFreq[k] = 0;
+
+  tc->tt = 0;
+  tc->ti = 0;
+  tc->ii = 0;
+  tc->numTraversals = 0;
+  tr->travCounter = tc;
+}
+
+/* recomp */
+/* code to track traversal descriptor stats */
+
+void countTraversal(pllInstance *tr)
+{
+  traversalInfo 
+    *ti   = tr->td[0].ti;
+  int i;
+  traversalCounter *tc = tr->travCounter; 
+  tc->numTraversals += 1;
+
+  /*
+  printBothOpen("trav #%d(%d):",tc->numTraversals, tr->td[0].count);
+  */
+
+  for(i = 1; i < tr->td[0].count; i++)
+  {
+    traversalInfo *tInfo = &ti[i];
+
+    /* 
+       printBothOpen(" %d q%d r%d |",  tInfo->pNumber, tInfo->qNumber, tInfo->rNumber);
+       printBothOpen("%d",  tInfo->pNumber);
+       */
+    switch(tInfo->tipCase)
+    {
+      case PLL_TIP_TIP: 
+        tc->tt++; 
+        /* printBothOpen("T"); */
+        break;		  
+      case PLL_TIP_INNER: 
+        tc->ti++; 
+        /* printBothOpen("M"); */
+        break;		  
+
+      case PLL_INNER_INNER: 
+        tc->ii++; 
+        /* printBothOpen("I"); */
+        break;		  
+      default: 
+        assert(0);
+    }
+    /* printBothOpen(" "); */
+  }
+  /* printBothOpen(" so far T %d, M %d, I %d \n", tc->tt, tc->ti,tc->ii); */
+  tc->travlenFreq[tr->td[0].count] += 1;
+}
+
+
+/*
+void printTraversalInfo(pllInstance *tr)
+{
+  int 
+    k, 
+    total_steps = 0;
+
+  printBothOpen("Traversals : %d \n", tr->travCounter->numTraversals);
+  printBothOpen("Traversals tt: %d \n", tr->travCounter->tt);
+  printBothOpen("Traversals ti: %d \n", tr->travCounter->ti);
+  printBothOpen("Traversals ii: %d \n", tr->travCounter->ii);
+  printBothOpen("all: %d \n", tr->travCounter->tt + tr->travCounter->ii + tr->travCounter->ti);
+  printBothOpen("Traversals len freq  : \n");
+  
+  for(k = 0; k < tr->mxtips; k++)
+  {
+    total_steps += tr->travCounter->travlenFreq[k] * (k - 1);
+    if(tr->travCounter->travlenFreq[k] > 0)
+      printBothOpen("len %d : %d\n", k, tr->travCounter->travlenFreq[k]);
+  }
+  printBothOpen("all steps: %d \n", total_steps);
+}
+*/
+/*end code to track traversal descriptor stats */
+/* E recomp */
+
+/*
+void printVector(double *vector, int len, char *name)
+{ 
+  int i;
+  printBothOpen("LHVECTOR %s :", name);
+  for(i=0; i < len; i++)
+  {
+    printBothOpen("%.2f ", vector[i]);
+    if(i>10)
+    {
+      printBothOpen("...");
+      break; 
+    }
+  } 
+  printBothOpen("\n");
+} 
+*/
+
+#endif
+
diff --git a/lib/pll/restartHashTable.c b/lib/pll/restartHashTable.c
new file mode 100644
index 0000000..9ed86a9
--- /dev/null
+++ b/lib/pll/restartHashTable.c
@@ -0,0 +1,357 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file bipartitionList.c
+ */
+#include "mem_alloc.h"
+
+#ifndef WIN32
+#include <sys/times.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <unistd.h> 
+#endif
+
+#include <math.h>
+#include <time.h> 
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+
+#include "pll.h"
+#include "pllInternal.h"
+
+/*
+static boolean treeNeedString(const char *fp, char c1, int *position)
+{
+  char 
+    c2 = fp[(*position)++];
+  
+  if(c2 == c1)  
+    return PLL_TRUE;
+  else  
+    {   
+      int 
+	lower = PLL_MAX(0, *position - 20),
+	upper = *position + 20;
+      
+      printf("Tree Parsing ERROR: Expecting '%c', found: '%c'\n", c1, c2); 
+      printf("Context: \n");
+      
+      while(lower < upper && fp[lower])
+	printf("%c", fp[lower++]);
+      
+      printf("\n");
+
+      return PLL_FALSE;
+  }
+} 
+
+
+static boolean treeLabelEndString (char ch)
+{
+  switch(ch) 
+    {   
+    case '\0':  
+    case '\t':  
+    case '\n':  
+    case '\r': 
+    case ' ':
+    case ':':  
+    case ',':   
+    case '(':   
+    case ')':  
+    case ';':
+      return PLL_TRUE;
+    default:
+      break;
+    }
+  
+  return PLL_FALSE;
+} 
+
+static boolean  treeGetLabelString (const char *fp, char *lblPtr, int maxlen, int *position)
+{
+  char 
+    ch;
+  
+  boolean  
+    done, 
+    lblfound;
+
+  if (--maxlen < 0) 
+    lblPtr = (char *)NULL; 
+  else 
+    if(lblPtr == NULL) 
+      maxlen = 0;
+
+  ch = fp[(*position)++];
+  
+  done = treeLabelEndString(ch);
+
+  lblfound = !done;  
+
+  while(!done) 
+    {      
+      if(treeLabelEndString(ch)) 
+	break;     
+
+      if(--maxlen >= 0) 
+	*lblPtr++ = ch;
+      
+      ch = fp[(*position)++];      
+    }
+  
+  (*position)--; 
+
+  if (lblPtr != NULL) 
+    *lblPtr = '\0';
+
+  return lblfound;
+}
+
+static boolean  treeFlushLabelString(const char *fp, int *position)
+{ 
+  return  treeGetLabelString(fp, (char *) NULL, (int) 0, position);
+} 
+
+static boolean treeProcessLengthString (const char *fp, double *dptr, int *position)
+{ 
+  (*position)++;
+  
+  if(sscanf(&fp[*position], "%lf", dptr) != 1) 
+    {
+      printf("ERROR: treeProcessLength: Problem reading branch length\n");     
+      assert(0);
+    }
+
+  while(fp[*position] != ',' && fp[*position] != ')' && fp[*position] != ';')
+    *position = *position + 1;
+  
+  return  PLL_TRUE;
+}
+
+static int treeFlushLenString (const char *fp, int *position)
+{
+  double  
+    dummy;  
+  
+  char     
+    ch;
+
+  ch = fp[(*position)++];
+ 
+  if(ch == ':') 
+    {     
+      if(!treeProcessLengthString(fp, &dummy, position)) 
+	return 0;
+      return 1;	  
+    }
+    
+  (*position)--;
+
+  return 1;
+} 
+
+static int treeFindTipByLabelString(char  *str, pllInstance *tr)                    
+{
+  int lookup = lookupWord(str, tr->nameHash);
+
+  if(lookup > 0)
+    {
+      assert(! tr->nodep[lookup]->back);
+      return lookup;
+    }
+  else
+    { 
+      printf("ERROR: Cannot find tree species: %s\n", str);
+      return  0;
+    }
+}
+
+static int treeFindTipNameString (const char *fp, pllInstance *tr, int *position)
+{
+  char    str[PLL_NMLNGTH + 2];
+  int      n;
+
+  if (treeGetLabelString (fp, str, PLL_NMLNGTH + 2, position))
+    n = treeFindTipByLabelString(str, tr);
+  else
+    n = 0;
+   
+  return  n;
+} 
+
+static boolean addElementLenString(const char *fp, pllInstance *tr, nodeptr p, int *position)
+{
+  nodeptr  
+    q;
+  
+  int      
+    n, 
+    fres;
+
+  char 
+    ch;
+  
+  if ((ch = fp[(*position)++]) == '(') 
+    { 
+      n = (tr->nextnode)++;
+      if (n > 2*(tr->mxtips) - 2) 
+	{
+	  if (tr->rooted || n > 2*(tr->mxtips) - 1) 
+	    {
+	      printf("ERROR: Too many internal nodes.  Is tree rooted?\n");
+	      printf("       Deepest splitting should be a trifurcation.\n");
+	      return PLL_FALSE;
+	    }
+	  else 
+	    {	   
+	      tr->rooted = PLL_TRUE;
+	    }
+	}
+      
+      q = tr->nodep[n];
+
+      if (!addElementLenString(fp, tr, q->next, position))        
+	return PLL_FALSE;
+      if (!treeNeedString(fp, ',', position))             
+	return PLL_FALSE;
+      if (!addElementLenString(fp, tr, q->next->next, position))  
+	return PLL_FALSE;
+      if (!treeNeedString(fp, ')', position))             
+	return PLL_FALSE;
+      
+     
+      treeFlushLabelString(fp, position);
+    }
+  else 
+    {   
+      (*position)--;
+     
+      if ((n = treeFindTipNameString(fp, tr, position)) <= 0)          
+	return PLL_FALSE;
+      q = tr->nodep[n];
+      
+      if (tr->start->number > n)  
+	tr->start = q;
+      (tr->ntips)++;
+    }
+  
+     
+  fres = treeFlushLenString(fp, position);
+  if(!fres) 
+    return PLL_FALSE;
+  
+  hookupDefault(p, q);
+
+  return PLL_TRUE;          
+}
+
+
+
+void treeReadTopologyString(char *treeString, pllInstance *tr)
+{ 
+  char 
+    *fp = treeString;
+
+  nodeptr  
+    p;
+  
+  int
+    position = 0, 
+    i;
+  
+  char 
+    ch;   
+    
+
+  for(i = 1; i <= tr->mxtips; i++)    
+    tr->nodep[i]->back = (node *)NULL;      
+  
+  for(i = tr->mxtips + 1; i < 2 * tr->mxtips; i++)
+    {
+      tr->nodep[i]->back = (nodeptr)NULL;
+      tr->nodep[i]->next->back = (nodeptr)NULL;
+      tr->nodep[i]->next->next->back = (nodeptr)NULL;
+      tr->nodep[i]->number = i;
+      tr->nodep[i]->next->number = i;
+      tr->nodep[i]->next->next->number = i;           
+    }
+      
+  tr->start       = tr->nodep[1];
+  tr->ntips       = 0;
+  tr->nextnode    = tr->mxtips + 1;    
+  tr->rooted      = PLL_FALSE;      
+  
+  p = tr->nodep[(tr->nextnode)++]; 
+   
+  assert(fp[position++] == '(');  
+    
+  if (! addElementLenString(fp, tr, p, &position))                 
+    assert(0);
+  
+  if (! treeNeedString(fp, ',', &position))                
+    assert(0);
+   
+  if (! addElementLenString(fp, tr, p->next, &position))           
+    assert(0);
+
+  if(!tr->rooted) 
+    {
+      if ((ch = fp[position++]) == ',') 
+	{ 
+	  if (! addElementLenString(fp, tr, p->next->next, &position)) 
+	    assert(0);	 
+	}
+      else 
+	assert(0);     
+    }
+  else
+    assert(0);
+        
+  if (! treeNeedString(fp, ')', &position))                
+    assert(0);
+
+  treeFlushLabelString(fp, &position);
+  
+  if (!treeFlushLenString(fp, &position))                         
+    assert(0);
+  
+  if (!treeNeedString(fp, ';', &position))       
+    assert(0);
+    
+  if(tr->rooted)     
+    assert(0);           
+  else           
+    tr->start = tr->nodep[1];   
+
+  printf("Tree parsed\n");
+
+} 
+*/
diff --git a/lib/pll/searchAlgo.c b/lib/pll/searchAlgo.c
new file mode 100644
index 0000000..c5df617
--- /dev/null
+++ b/lib/pll/searchAlgo.c
@@ -0,0 +1,3295 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file searchAlgo.c
+ * @brief Collection of routines for performing likelihood computation and branch optimization.
+ *
+ * Detailed description to appear soon.
+ */
+#include "mem_alloc.h"
+
+#ifndef WIN32
+#include <sys/times.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <unistd.h> 
+#endif
+
+#include <math.h>
+#include <time.h> 
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+#include "pll.h"
+#include "pllInternal.h"
+
+typedef struct bInf {
+  double likelihood;
+  nodeptr node;
+} bestInfo;
+
+typedef struct iL {
+  bestInfo *list;
+  int n;
+  int valid;
+} infoList;
+
+
+double treeOptimizeRapid(pllInstance *tr, partitionList *pr, int mintrav, int maxtrav, bestlist *bt, infoList *iList);
+nniMove getBestNNIForBran(pllInstance* tr, partitionList *pr, nodeptr p, double curLH);
+void evalNNIForSubtree(pllInstance* tr, partitionList *pr, nodeptr p, nniMove* nniList, int* cnt, int* cnt_nni, double curLH);
+
+
+static int cmp_nni(const void* nni1, const void* nni2);
+static void pllTraverseUpdate (pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q, int mintrav, int maxtrav, pllRearrangeList * bestList);
+static int pllStoreRearrangement (pllRearrangeList * bestList, pllRearrangeInfo * rearr);
+static int pllTestInsertBIG (pllInstance * tr, partitionList * pr, nodeptr p, nodeptr q, pllRearrangeList * bestList);
+static int pllTestSPR (pllInstance * tr, partitionList * pr, nodeptr p, int mintrav, int maxtrav, pllRearrangeList * bestList);
+static void pllCreateSprInfoRollback (pllInstance * tr, pllRearrangeInfo * rearr, int numBranches);
+static void pllCreateNniInfoRollback (pllInstance * tr, pllRearrangeInfo * rearr);
+static void pllCreateRollbackInfo (pllInstance * tr, pllRearrangeInfo * rearr, int numBranches);
+static void pllRollbackNNI (pllInstance * tr, partitionList * pr, pllRollbackInfo * ri);
+static void pllRollbackSPR (partitionList * pr, pllRollbackInfo * ri);
+
+extern partitionLengths pLengths[PLL_MAX_MODEL];
+
+
+boolean initrav (pllInstance *tr, partitionList *pr, nodeptr p)
+{ 
+  nodeptr  q;
+
+  if (!isTip(p->number, tr->mxtips)) 
+  {      
+    q = p->next;
+
+    do 
+    {	   
+      if (! initrav(tr, pr, q->back))  return PLL_FALSE;
+      q = q->next;	
+    } 
+    while (q != p);  
+
+    pllUpdatePartials(tr, pr, p, PLL_FALSE);
+  }
+
+  return PLL_TRUE;
+} 
+
+
+/** @brief Optimize the length of a specific branch
+
+    Optimize the length of the branch connecting \a p and \a p->back
+    for each partition (\a tr->numBranches) in library instance \a tr.
+ 
+    @param tr
+      The library instance
+
+    @param pr
+      Partition list
+ 
+    @param p
+      Endpoints of branch to be optimized 
+*/
+void update(pllInstance *tr, partitionList *pr, nodeptr p)
+{       
+  nodeptr  q; 
+  int i;
+  double   z[PLL_NUM_BRANCHES], z0[PLL_NUM_BRANCHES];
+  int numBranches = pr->perGeneBranchLengths ? pr->numberOfPartitions : 1;
+
+  #ifdef _DEBUG_UPDATE
+    double 
+      startLH;
+  
+    pllEvaluateLikelihood (tr, p);
+  
+    startLH = tr->likelihood;
+  #endif
+
+  q = p->back;   
+
+  for(i = 0; i < numBranches; i++)
+    z0[i] = q->z[i];    
+
+  if(numBranches > 1)
+    makenewzGeneric(tr, pr, p, q, z0, PLL_NEWZPERCYCLE, z, PLL_TRUE);
+  else
+    makenewzGeneric(tr, pr, p, q, z0, PLL_NEWZPERCYCLE, z, PLL_FALSE);
+
+  for(i = 0; i < numBranches; i++)
+  {         
+    if(!tr->partitionConverged[i])
+    {	  
+      if(PLL_ABS(z[i] - z0[i]) > PLL_DELTAZ)  
+      {	      
+        tr->partitionSmoothed[i] = PLL_FALSE;
+      }	 
+
+      p->z[i] = q->z[i] = z[i];	 
+    }
+  }
+ 
+  #ifdef _DEBUG_UPDATE
+    pllEvaluateLikelihood (tr, p);
+  
+    if(tr->likelihood <= startLH)
+      {
+        if(fabs(tr->likelihood - startLH) > 0.01)
+  	{
+  	  printf("%f %f\n", startLH, tr->likelihood);
+  	  assert(0);      
+  	}
+      }
+  #endif
+}
+
+/** @brief Branch length optimization of subtree
+
+    Optimize the length of branch connected by \a p and \a p->back, and the
+    lengths of all branches in the subtrees rooted at \a p->next and \a p->next->next
+
+    @param tr
+      The library instance
+
+    @param pr
+      Partition list
+
+    @param p
+      Endpoint of branches to be optimized
+*/
+void smooth (pllInstance *tr, partitionList *pr, nodeptr p)
+{
+  nodeptr  q;
+  int numBranches = pr->perGeneBranchLengths?pr->numberOfPartitions:1;
+
+  update(tr, pr, p);    /*  Adjust branch */
+
+  if (! isTip(p->number, tr->mxtips)) 
+  {                                  /*  Adjust descendants */
+    q = p->next;
+    while (q != p) 
+    {
+      smooth(tr, pr, q->back);
+      q = q->next;
+    }	
+
+    if(numBranches > 1 && !tr->useRecom)
+      pllUpdatePartials(tr, pr,p, PLL_TRUE);
+    else
+      pllUpdatePartials(tr, pr,p, PLL_FALSE);
+  }
+} 
+
+/**  @brief Check whether the branches in all partitions have been optimized
+ 
+     Check if all branches in all partitions have reached the threshold for
+     optimization. If at least one branch can be optimized further return \b PLL_FALSE.
+
+     @param tr
+       The library instance 
+
+     @return
+       If at least one branch can be further optimized return \b PLL_FALSE,
+       otherwise \b PLL_TRUE.
+             
+*/
+static boolean allSmoothed(pllInstance *tr, int numBranches)
+{
+  int i;
+  boolean result = PLL_TRUE;
+
+  for(i = 0; i < numBranches; i++)
+  {
+    if(tr->partitionSmoothed[i] == PLL_FALSE)
+      result = PLL_FALSE;
+    else
+      tr->partitionConverged[i] = PLL_TRUE;
+  }
+
+  return result;
+}
+
+
+/** @brief Optimize all branch lenghts of a tree
+  
+    Perform \a maxtimes rounds of branch length optimization by running smooth()
+    on all neighbour nodes of node \a tr->start.
+
+    @param tr
+      The library instance
+
+    @param maxtimes
+      Number of optimization rounds to perform
+*/
+/* do maxtimes rounds of branch length optimization */
+void smoothTree (pllInstance *tr, partitionList *pr, int maxtimes)
+{
+	nodeptr  p, q;
+	int i, count = 0;
+    int numBranches = pr->perGeneBranchLengths?pr->numberOfPartitions:1;
+
+	p = tr->start;
+	for(i = 0; i < numBranches; i++)
+		tr->partitionConverged[i] = PLL_FALSE;
+
+	while (--maxtimes >= 0)
+	{
+		for(i = 0; i < numBranches; i++)
+			tr->partitionSmoothed[i] = PLL_TRUE;
+
+		smooth(tr, pr, p->back);
+		if (!isTip(p->number, tr->mxtips))
+		{
+			q = p->next;
+			while (q != p)
+			{
+				smooth(tr, pr, q->back);
+				q = q->next;
+			}
+		}
+		count++;
+
+		if (allSmoothed(tr, numBranches)) break;
+	}
+
+	for(i = 0; i < numBranches; i++)
+		tr->partitionConverged[i] = PLL_FALSE;
+} 
+
+
+/** @brief Optimize the branch length of edges around a specific node
+    
+    Optimize \a maxtimes the branch length of all (3) edges around a given node 
+    \a p of the tree of library instance \a tr.
+
+    @param tr
+      The library instance
+
+    @param p
+      The node around which to optimize the edges
+
+    @param maxtimes
+      Number of optimization rounds to perform
+*/
+void localSmooth (pllInstance *tr, partitionList *pr, nodeptr p, int maxtimes)
+{ 
+  nodeptr  q;
+  int i;
+  int numBranches = pr->perGeneBranchLengths ? pr->numberOfPartitions : 1;
+  if (isTip(p->number, tr->mxtips)) return;
+
+  for(i = 0; i < PLL_NUM_BRANCHES; i++)
+    tr->partitionConverged[i] = PLL_FALSE;	
+
+  while (--maxtimes >= 0) 
+  {     
+    for(i = 0; i < PLL_NUM_BRANCHES; i++)
+      tr->partitionSmoothed[i] = PLL_TRUE;
+
+    q = p;
+    do 
+    {
+      update(tr, pr, q);
+      q = q->next;
+    } 
+    while (q != p);
+
+    if (allSmoothed(tr, numBranches))
+      break;
+  }
+
+  for(i = 0; i < PLL_NUM_BRANCHES; i++)
+  {
+    tr->partitionSmoothed[i] = PLL_FALSE; 
+    tr->partitionConverged[i] = PLL_FALSE;
+  }
+}
+
+
+
+
+/** @brief Reset an \a infoList
+
+    Resets an \a infoList by setting elements \a node and \a likelihood
+    of each element of the \a bestInfo list structure to \b NULL and
+    \a PLL_UNLIKELY, respectively.
+
+    @param iList
+      The given \a infoList.
+*/
+static void resetInfoList(infoList *iList)
+{
+  int 
+    i;
+
+  iList->valid = 0;
+
+  for(i = 0; i < iList->n; i++)    
+  {
+    iList->list[i].node = (nodeptr)NULL;
+    iList->list[i].likelihood = PLL_UNLIKELY;
+  }    
+}
+
+/** @brief Initialize an \a infoList
+
+    Initialize an \a infoList by creating a \a bestInfo list structure
+    of \a n elements and setting the attributes \a node and \a likelihood
+    of each element of the \a bestInfo list structure to \b NULL and
+    \a PLL_UNLIKELY, respectively.
+
+    @param iList
+      The given \a infoList.
+
+    @param n
+      Number of elements to be created in the \a bestInfo list.
+*/
+static void initInfoList(infoList *iList, int n)
+{
+  int 
+    i;
+
+  iList->n = n;
+  iList->valid = 0;
+  iList->list = (bestInfo *)rax_malloc(sizeof(bestInfo) * (size_t)n);
+
+  for(i = 0; i < n; i++)
+  {
+    iList->list[i].node = (nodeptr)NULL;
+    iList->list[i].likelihood = PLL_UNLIKELY;
+  }
+}
+
+/** @brief Deallocate the contents of an \a infoList
+    
+    Deallocate the contents of a given \a infoList by freeing
+    the memory used by its \a bestInfo list structure.
+
+    @param iList
+      The \a infoList to be used.
+*/
+static void freeInfoList(infoList *iList)
+{ 
+  rax_free(iList->list);   
+}
+
+
+/** @brief Insert a record in an \a infoList
+
+    Insert the pair \a likelihood and \node into list \a iList 
+    \b only if there already exists a pair in \a iList 
+    whose \a likelihood attribute is smaller than the given \a 
+    likelihood. The insertion is done by replacing the smallest
+    likelihood pair with the new pair.
+
+    @param node
+      The given node
+
+    @param likelihood
+      The given likelihood
+
+    @param iList
+      The given \a infoList where the record will possibly be appended.
+*/
+static void insertInfoList(nodeptr node, double likelihood, infoList *iList)
+{
+  int 
+    i,
+    min = 0;
+
+  double 
+    min_l =  iList->list[0].likelihood;
+
+  for(i = 1; i < iList->n; i++)
+  {
+    if(iList->list[i].likelihood < min_l)
+    {
+      min = i;
+      min_l = iList->list[i].likelihood;
+    }
+  }
+
+  if(likelihood > min_l)
+  {
+    iList->list[min].likelihood = likelihood;
+    iList->list[min].node = node;
+    if(iList->valid < iList->n)
+      iList->valid += 1;
+  }
+}
+
+
+/** @brief  Optimize branch lengths of region
+
+    Optimize the branch lenghts of only a specific region. The branch optimization starts
+    at a node \a p and is carried out in all nodes with distance upto \a region edges from 
+    \a p.
+
+    @param tr
+      The library instance.
+    
+    @param p
+      Node to start branch optimization from.
+
+    @param region
+      The allowed node distance from \p for which to still perform branch optimization.
+*/
+void smoothRegion (pllInstance *tr, partitionList *pr, nodeptr p, int region)
+{ 
+  nodeptr  q;
+
+  update(tr, pr, p);   /* Adjust branch */
+
+  if (region > 0)
+  {
+    if (!isTip(p->number, tr->mxtips)) 
+    {                                 
+      q = p->next;
+      while (q != p) 
+      {
+        smoothRegion(tr, pr, q->back, --region);
+        q = q->next;
+      }	
+
+      pllUpdatePartials(tr, pr,p, PLL_FALSE);
+    }
+  }
+}
+
+/** @brief Wrapper function for optimizing the branch length of a region \a maxtimes times
+
+    Optimize the branch lengths of a specific region \a maxtimes times. The branch optimization
+    starts at a given node \a p and is carried out in all nodes with distance upto \a region
+    from \a p.
+
+    @param tr
+      The library instance.
+
+    @param p
+      Node to start branch optimization from.
+
+    @param maxtimes
+      Number of times to perform branch optimization.
+
+    @param region
+      The allwed node distance from \p for which to still perform branch optimization.
+
+    @todo
+      In the previous version (before the model-sep merge) the loops were controlled by tr->numBranches,
+      and now they are controlled by a constant PLL_NUM_BRANCHES. What is right?
+*/
+void regionalSmooth (pllInstance *tr, partitionList *pr, nodeptr p, int maxtimes, int region)
+{
+  nodeptr  q;
+  int i;
+  int numBranches = pr->perGeneBranchLengths?pr->numberOfPartitions:1;
+
+  if (isTip(p->number, tr->mxtips)) return;            /* Should be an error */
+
+  for(i = 0; i < PLL_NUM_BRANCHES; i++)
+    tr->partitionConverged[i] = PLL_FALSE;
+
+  while (--maxtimes >= 0) 
+  {	
+    for(i = 0; i < PLL_NUM_BRANCHES; i++)
+      tr->partitionSmoothed[i] = PLL_TRUE;
+
+    q = p;
+    do 
+    {
+      smoothRegion(tr, pr, q, region);
+      q = q->next;
+    } 
+    while (q != p);
+
+    if (allSmoothed(tr, numBranches))
+      break;
+  }
+
+  for(i = 0; i < PLL_NUM_BRANCHES; i++) {
+    tr->partitionSmoothed[i] = PLL_FALSE;
+    tr->partitionConverged[i] = PLL_FALSE;
+  }
+} 
+
+
+
+
+/** @brief Split the tree into two components and optimize new branch length
+
+   Split the tree into two components. The disconnection point is node \a p.
+   First, a branch length is computed for the newly created branch between nodes
+   \a p->next->back and \a p->next->next->back and then the two nodes are
+   connected (hookup). Disconnection is done by setting \a p->next->next->back
+   and \a p->next->back to \b NULL.
+
+   @param tr
+     The library instance
+
+   @param p
+     The node at which the tree should be decomposed into two components.
+
+   @param numBranches
+     Number of branches per partition
+
+   @return
+     Node from the disconnected component
+
+   @todo
+     Why do we return this node?
+
+   @image html removeBIG.png "The diagram shows in blue color the new edge that is created and in red the edges that are removed"
+*/
+nodeptr  removeNodeBIG (pllInstance *tr, partitionList *pr, nodeptr p, int numBranches)
+{  
+  double   zqr[numBranches], result[numBranches];
+  nodeptr  q, r;
+  int i;
+
+  q = p->next->back;
+  r = p->next->next->back;
+
+  for(i = 0; i < numBranches; i++)
+    zqr[i] = q->z[i] * r->z[i];        
+
+  makenewzGeneric(tr, pr, q, r, zqr, PLL_ITERATIONS, result, PLL_FALSE);
+
+  for(i = 0; i < numBranches; i++)        
+    tr->zqr[i] = result[i];
+
+  hookup(q, r, result, numBranches); 
+
+  p->next->next->back = p->next->back = (node *) NULL;
+
+  return  q; 
+}
+
+/** @brief Split the tree into two components and recompute likelihood
+
+    Split the tree into two component. The disconnection point is node \a p.
+    Set the branch length of the new node between \a p->next->back and
+    \a p->next->next->back to \a tr->currentZQR and then decompose the tree
+    into two components by setting \a p->next->back and \a p->next->next->back
+    to \b NULL.
+
+    @param tr
+      The library instance
+
+    @param p
+      The node at which the tree should be decomposed into two components.
+
+    @return q
+      the node after \a p
+
+    @todo
+      Why do we return this node? Why do we set to tr->currentZQR and not compute
+      new optimized length? What is tr->currentZQR? 
+*/
+nodeptr  removeNodeRestoreBIG (pllInstance *tr, partitionList *pr, nodeptr p)
+{
+  nodeptr  q, r;
+
+  q = p->next->back;
+  r = p->next->next->back;  
+
+  pllUpdatePartials(tr, pr,q, PLL_FALSE);
+  pllUpdatePartials(tr, pr,r, PLL_FALSE);
+
+  hookup(q, r, tr->currentZQR, pr->perGeneBranchLengths?pr->numberOfPartitions:1);
+
+  p->next->next->back = p->next->back = (node *) NULL;
+
+  return  q;
+}
+
+/** @brief Connect two disconnected tree components
+   
+   Connect two disconnected components by specifying an internal edge from one
+   component and a leaf from the other component. The internal edge \a e is the
+   edge between \a q and \a q->back. The leaf is specified by \a p.
+   Edge \a e is removed and two new edges are created. The first one is an edge
+   between \a p->next and \a q, and the second one is between \a p->next->next
+   and \a q->back. The new likelihood vector for node \a p is computed.
+
+   @note The function makes use of the \a thoroughInsertion flag
+
+   @todo
+     What is tr->lzi ? What is thorough insertion? Why do we optimize branch lengths
+     that will be removed? Add explanation
+
+   @image html pll.png "The diagram shows in blue colors the new edges that are created and in red the edge that is removed" 
+*/
+boolean insertBIG (pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q)
+{
+  nodeptr  r, s;
+  int i;
+  int numBranches = pr->perGeneBranchLengths?pr->numberOfPartitions:1;
+
+  r = q->back;
+  s = p->back;
+
+  for(i = 0; i < numBranches; i++)
+    tr->lzi[i] = q->z[i];
+
+  if(tr->thoroughInsertion)
+  { 
+    double  zqr[numBranches], zqs[numBranches], zrs[numBranches], lzqr, lzqs, lzrs, lzsum, lzq, lzr, lzs, lzmax;
+    double defaultArray[numBranches];
+    double e1[numBranches], e2[numBranches], e3[numBranches];
+    double *qz;
+
+    qz = q->z;
+
+    for(i = 0; i < numBranches; i++)
+      defaultArray[i] = PLL_DEFAULTZ;
+
+    makenewzGeneric(tr, pr, q, r, qz, PLL_ITERATIONS, zqr, PLL_FALSE);
+    /* the branch lengths values will be estimated using q, r and s
+     * q-s are not connected, but both q and s have a valid LH vector , so we can call makenewzGeneric  to get a value for
+     * lzsum, which is then use to generate reasonable starting values e1, e2, e3 for the new branches we create after the       insertion
+     */
+
+    makenewzGeneric(tr, pr, q, s, defaultArray, PLL_ITERATIONS, zqs, PLL_FALSE);
+    makenewzGeneric(tr, pr, r, s, defaultArray, PLL_ITERATIONS, zrs, PLL_FALSE);
+
+
+    for(i = 0; i < numBranches; i++)
+    {
+      lzqr = (zqr[i] > PLL_ZMIN) ? log(zqr[i]) : log(PLL_ZMIN); 
+      lzqs = (zqs[i] > PLL_ZMIN) ? log(zqs[i]) : log(PLL_ZMIN);
+      lzrs = (zrs[i] > PLL_ZMIN) ? log(zrs[i]) : log(PLL_ZMIN);
+      lzsum = 0.5 * (lzqr + lzqs + lzrs);
+
+      lzq = lzsum - lzrs;
+      lzr = lzsum - lzqs;
+      lzs = lzsum - lzqr;
+      lzmax = log(PLL_ZMAX);
+
+      if      (lzq > lzmax) {lzq = lzmax; lzr = lzqr; lzs = lzqs;} 
+      else if (lzr > lzmax) {lzr = lzmax; lzq = lzqr; lzs = lzrs;}
+      else if (lzs > lzmax) {lzs = lzmax; lzq = lzqs; lzr = lzrs;}          
+
+      e1[i] = exp(lzq);
+      e2[i] = exp(lzr);
+      e3[i] = exp(lzs);
+    }
+    hookup(p->next,       q, e1, numBranches);
+    hookup(p->next->next, r, e2, numBranches);
+    hookup(p,             s, e3, numBranches);      		  
+  }
+  else
+  {       
+    double  z[numBranches];
+
+    for(i = 0; i < numBranches; i++)
+    {
+      z[i] = sqrt(q->z[i]);      
+
+      if(z[i] < PLL_ZMIN) 
+        z[i] = PLL_ZMIN;
+      if(z[i] > PLL_ZMAX)
+        z[i] = PLL_ZMAX;
+    }
+
+    hookup(p->next,       q, z, numBranches);
+    hookup(p->next->next, r, z, numBranches);
+  }
+
+  pllUpdatePartials(tr, pr,p, PLL_FALSE);
+
+  if(tr->thoroughInsertion)
+  {     
+    localSmooth(tr, pr, p, PLL_MAX_LOCAL_SMOOTHING_ITERATIONS);
+    for(i = 0; i < numBranches; i++)
+    {
+      tr->lzq[i] = p->next->z[i];
+      tr->lzr[i] = p->next->next->z[i];
+      tr->lzs[i] = p->z[i];            
+    }
+  }           
+
+  return  PLL_TRUE;
+}
+
+/** @brief Connect two disconnected tree components without optimizing branch lengths
+   
+   Connect two disconnected components by specifying an internal edge from one
+   component and a leaf from the other component. The internal edge \a e is the
+   edge between \a q and \a q->back. The leaf is specified by \a p.
+   Edge \a e is removed and two new edges are created. The first one is an edge
+   between \a p->next and \a q, and the second one is between \a p->next->next
+   and \a q->back. The new likelihood vector for node \a p is computed.
+
+   @note The function makes use of the \a thoroughInsertion flag
+
+   @todo
+     What is the difference between this and insertBIG? 
+*/
+boolean insertRestoreBIG (pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q)
+{
+  nodeptr  r, s;
+
+  r = q->back;
+  s = p->back;
+
+  int numBranches = pr->perGeneBranchLengths?pr->numberOfPartitions:1;
+
+  if(tr->thoroughInsertion)
+  {                        
+    hookup(p->next,       q, tr->currentLZQ, numBranches);
+    hookup(p->next->next, r, tr->currentLZR, numBranches);
+    hookup(p,             s, tr->currentLZS, numBranches);
+  }
+  else
+  {       
+    double  z[PLL_NUM_BRANCHES];
+    int i;
+
+    for(i = 0; i < numBranches; i++)
+    {
+      double zz;
+      zz = sqrt(q->z[i]);     
+      if(zz < PLL_ZMIN) 
+        zz = PLL_ZMIN;
+      if(zz > PLL_ZMAX)
+        zz = PLL_ZMAX;
+      z[i] = zz;
+    }
+
+    hookup(p->next,       q, z, numBranches);
+    hookup(p->next->next, r, z, numBranches);
+  }   
+
+  pllUpdatePartials(tr, pr,p, PLL_FALSE);
+
+  return  PLL_TRUE;
+}
+
+
+static void restoreTopologyOnly(pllInstance *tr, bestlist *bt, int numBranches)
+{ 
+  nodeptr p = tr->removeNode;
+  nodeptr q = tr->insertNode;
+  double qz[PLL_NUM_BRANCHES], pz[PLL_NUM_BRANCHES], p1z[PLL_NUM_BRANCHES], p2z[PLL_NUM_BRANCHES];
+  nodeptr p1, p2, r, s;
+  double currentLH = tr->likelihood;
+  int i;
+
+  p1 = p->next->back;
+  p2 = p->next->next->back;
+
+  //memcpy(p1z, p1->z, numBranches*sizeof(double));
+  //memcpy(p2z, p2->z, numBranches*sizeof(double));
+  //memcpy(qz, q->z, numBranches*sizeof(double));
+  //memcpy(pz, p->z, numBranches*sizeof(double));
+  for(i = 0; i < numBranches; i++)
+  {
+    p1z[i] = p1->z[i];
+    p2z[i] = p2->z[i];
+  }
+
+  hookup(p1, p2, tr->currentZQR, numBranches);
+
+  p->next->next->back = p->next->back = (node *) NULL;             
+  for(i = 0; i < numBranches; i++)
+  {
+    qz[i] = q->z[i];
+    pz[i] = p->z[i];
+  }
+
+  r = q->back;
+  s = p->back;
+
+  if(tr->thoroughInsertion)
+  {                        
+    hookup(p->next,       q, tr->currentLZQ, numBranches);
+    hookup(p->next->next, r, tr->currentLZR, numBranches);
+    hookup(p,             s, tr->currentLZS, numBranches);
+  }
+  else
+  { 	
+    double  z[PLL_NUM_BRANCHES];	
+    for(i = 0; i < numBranches; i++)
+    {
+      z[i] = sqrt(q->z[i]);      
+      if(z[i] < PLL_ZMIN)
+        z[i] = PLL_ZMIN;
+      if(z[i] > PLL_ZMAX)
+        z[i] = PLL_ZMAX;
+    }
+    hookup(p->next,       q, z, numBranches);
+    hookup(p->next->next, r, z, numBranches);
+  }     
+
+  tr->likelihood = tr->bestOfNode;
+
+  saveBestTree(bt, tr, numBranches);
+
+  tr->likelihood = currentLH;
+
+  hookup(q, r, qz, numBranches);
+
+  p->next->next->back = p->next->back = (nodeptr) NULL;
+
+  if(tr->thoroughInsertion)    
+    hookup(p, s, pz, numBranches);
+
+  hookup(p->next,       p1, p1z, numBranches);
+  hookup(p->next->next, p2, p2z, numBranches);
+}
+
+/** @brief Test the 
+*/
+boolean testInsertBIG (pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q)
+{
+
+  int numBranches = pr->perGeneBranchLengths?pr->numberOfPartitions:1;
+
+  double  qz[PLL_NUM_BRANCHES], pz[PLL_NUM_BRANCHES];
+  nodeptr  r;
+  double startLH = tr->endLH;
+  int i;
+
+  r = q->back; 
+  for(i = 0; i < numBranches; i++)
+  {
+    qz[i] = q->z[i];
+    pz[i] = p->z[i];
+  }
+
+  if (! insertBIG(tr, pr, p, q))       return PLL_FALSE;
+
+  pllEvaluateLikelihood (tr, pr, p->next->next, PLL_FALSE, PLL_FALSE);
+
+  if(tr->likelihood > tr->bestOfNode)
+  {
+    tr->bestOfNode = tr->likelihood;
+    tr->insertNode = q;
+    tr->removeNode = p;   
+    for(i = 0; i < numBranches; i++)
+    {
+      tr->currentZQR[i] = tr->zqr[i];           
+      tr->currentLZR[i] = tr->lzr[i];
+      tr->currentLZQ[i] = tr->lzq[i];
+      tr->currentLZS[i] = tr->lzs[i];      
+    }
+  }
+
+  if(tr->likelihood > tr->endLH)
+  {			  
+    tr->insertNode = q;
+    tr->removeNode = p;   
+    for(i = 0; i < numBranches; i++)
+      tr->currentZQR[i] = tr->zqr[i];      
+    tr->endLH = tr->likelihood;                      
+  }        
+
+  /* reset the topology so that it is the same as it was before calling insertBIG */
+  hookup(q, r, qz, numBranches);
+
+  p->next->next->back = p->next->back = (nodeptr) NULL;
+
+  if(tr->thoroughInsertion)
+  {
+    nodeptr s = p->back;
+    hookup(p, s, pz, numBranches);
+  } 
+
+  if((tr->doCutoff) && (tr->likelihood < startLH))
+  {
+    tr->lhAVG += (startLH - tr->likelihood);
+    tr->lhDEC++;
+    if((startLH - tr->likelihood) >= tr->lhCutoff)
+      return PLL_FALSE;	    
+    else
+      return PLL_TRUE;
+  }
+  else
+    return PLL_TRUE;
+}
+
+
+/** @brief Recursively traverse tree and test insertion
+
+    Recursively traverses the tree structure starting from node \a q and
+    tests the insertion of the component specified by leaf \a p at the edge
+    between \a q and \a q->back.
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+    @param p
+      Leaf node of one tree component
+
+    @param q
+      Endpoint node of the edge to test the insertion
+
+    @param mintrav
+      Minimum radius around \a q to test the insertion
+
+    @param maxtrav
+      Maximum radius around \a q to test the insertion\
+*/
+void addTraverseBIG(pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q, int mintrav, int maxtrav)
+{  
+  if (--mintrav <= 0) 
+  {              
+    if (! testInsertBIG(tr, pr, p, q))  return;
+
+  }
+
+  if ((!isTip(q->number, tr->mxtips)) && (--maxtrav > 0)) 
+  {    
+    addTraverseBIG(tr, pr, p, q->next->back, mintrav, maxtrav);
+    addTraverseBIG(tr, pr, p, q->next->next->back, mintrav, maxtrav);
+  }
+} 
+
+
+
+
+/** @brief  Compute the  best SPR movement
+
+    Compute all SPR moves starting from \a p in the space defined by \a mintrav and
+    \a maxtrav and store the best in the \a tr structure.
+
+    @param tr
+      PLL instancve
+
+    @param pr
+      List of partitions
+
+    @param p
+      Node from which to start the SPR moves testing
+
+    @param mintrav
+      Minimum distance from \a p where to start testing SPRs
+
+    @param maxtrav
+      Maximum distance from \a p where to test SPRs
+
+    @return
+       0,1 or \b PLL_BADREAR
+
+    @todo
+      fix the return value
+*/
+int rearrangeBIG(pllInstance *tr, partitionList *pr, nodeptr p, int mintrav, int maxtrav)
+{  
+  double   p1z[PLL_NUM_BRANCHES], p2z[PLL_NUM_BRANCHES], q1z[PLL_NUM_BRANCHES], q2z[PLL_NUM_BRANCHES];
+  nodeptr  p1, p2, q, q1, q2;
+  int      mintrav2, i;  
+  boolean doP = PLL_TRUE, doQ = PLL_TRUE;
+  int numBranches = pr->perGeneBranchLengths ? pr->numberOfPartitions : 1;
+
+  if (maxtrav < 1 || mintrav > maxtrav)  return (0);
+  q = p->back;
+
+
+
+
+  if (!isTip(p->number, tr->mxtips) && doP) 
+  {     
+    p1 = p->next->back;
+    p2 = p->next->next->back;
+
+
+    if(!isTip(p1->number, tr->mxtips) || !isTip(p2->number, tr->mxtips))
+    {
+      for(i = 0; i < numBranches; i++)
+      {
+        p1z[i] = p1->z[i];
+        p2z[i] = p2->z[i];	   	   
+      }
+
+      if (! removeNodeBIG(tr, pr, p,  numBranches)) return PLL_BADREAR;
+
+      if (!isTip(p1->number, tr->mxtips)) 
+      {
+        addTraverseBIG(tr, pr, p, p1->next->back,
+            mintrav, maxtrav);         
+
+        addTraverseBIG(tr, pr, p, p1->next->next->back,
+            mintrav, maxtrav);          
+      }
+
+      if (!isTip(p2->number, tr->mxtips)) 
+      {
+        addTraverseBIG(tr, pr, p, p2->next->back,
+            mintrav, maxtrav);
+        addTraverseBIG(tr, pr, p, p2->next->next->back,
+            mintrav, maxtrav);          
+      }
+
+      hookup(p->next,       p1, p1z, numBranches);
+      hookup(p->next->next, p2, p2z, numBranches);
+      pllUpdatePartials(tr, pr,p, PLL_FALSE);
+    }
+  }  
+
+  if (!isTip(q->number, tr->mxtips) && maxtrav > 0 && doQ) 
+  {
+    q1 = q->next->back;
+    q2 = q->next->next->back;
+
+    /*if (((!q1->tip) && (!q1->next->back->tip || !q1->next->next->back->tip)) ||
+      ((!q2->tip) && (!q2->next->back->tip || !q2->next->next->back->tip))) */
+    if (
+        (
+         ! isTip(q1->number, tr->mxtips) && 
+         (! isTip(q1->next->back->number, tr->mxtips) || ! isTip(q1->next->next->back->number, tr->mxtips))
+        )
+        ||
+        (
+         ! isTip(q2->number, tr->mxtips) && 
+         (! isTip(q2->next->back->number, tr->mxtips) || ! isTip(q2->next->next->back->number, tr->mxtips))
+        )
+       )
+    {
+
+      for(i = 0; i < numBranches; i++)
+      {
+        q1z[i] = q1->z[i];
+        q2z[i] = q2->z[i];
+      }
+
+      if (! removeNodeBIG(tr, pr, q, numBranches)) return PLL_BADREAR;
+
+      mintrav2 = mintrav > 2 ? mintrav : 2;
+
+      if (/*! q1->tip*/ !isTip(q1->number, tr->mxtips)) 
+      {
+        addTraverseBIG(tr, pr, q, q1->next->back,
+            mintrav2 , maxtrav);
+        addTraverseBIG(tr, pr, q, q1->next->next->back,
+            mintrav2 , maxtrav);         
+      }
+
+      if (/*! q2->tip*/ ! isTip(q2->number, tr->mxtips)) 
+      {
+        addTraverseBIG(tr, pr, q, q2->next->back,
+            mintrav2 , maxtrav);
+        addTraverseBIG(tr, pr, q, q2->next->next->back,
+            mintrav2 , maxtrav);          
+      }	   
+
+      hookup(q->next,       q1, q1z, numBranches);
+      hookup(q->next->next, q2, q2z, numBranches);
+
+      pllUpdatePartials(tr, pr,q, PLL_FALSE);
+    }
+  } 
+
+  return  1;
+} 
+
+
+
+
+/** @brief Perform an SPR move?
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param mintrav
+
+    @param maxtrav
+
+    @param adef
+
+    @param bt
+
+    @param iList
+
+*/
+double treeOptimizeRapid(pllInstance *tr, partitionList *pr, int mintrav, int maxtrav, bestlist *bt, infoList *iList)
+{
+  int i, index,
+      *perm = (int*)NULL;   
+
+  nodeRectifier(tr);
+
+
+
+  if (maxtrav > tr->mxtips - 3)  
+    maxtrav = tr->mxtips - 3;  
+
+
+
+  resetInfoList(iList);
+
+  resetBestTree(bt);
+
+  tr->startLH = tr->endLH = tr->likelihood;
+
+  if(tr->doCutoff)
+  {
+    if(tr->bigCutoff)
+    {	  
+      if(tr->itCount == 0)    
+        tr->lhCutoff = 0.5 * (tr->likelihood / -1000.0);    
+      else    		 
+        tr->lhCutoff = 0.5 * ((tr->lhAVG) / ((double)(tr->lhDEC))); 	  
+    }
+    else
+    {
+      if(tr->itCount == 0)    
+        tr->lhCutoff = tr->likelihood / -1000.0;    
+      else    		 
+        tr->lhCutoff = (tr->lhAVG) / ((double)(tr->lhDEC));   
+    }    
+
+    tr->itCount = tr->itCount + 1;
+    tr->lhAVG = 0;
+    tr->lhDEC = 0;
+  }
+
+  /*
+     printf("DoCutoff: %d\n", tr->doCutoff);
+     printf("%d %f %f %f\n", tr->itCount, tr->lhAVG, tr->lhDEC, tr->lhCutoff);
+
+     printf("%d %d\n", mintrav, maxtrav);
+     */
+
+  for(i = 1; i <= tr->mxtips + tr->mxtips - 2; i++)
+  {           
+    tr->bestOfNode = PLL_UNLIKELY;          
+
+    if(tr->permuteTreeoptimize)
+      index = perm[i];
+    else
+      index = i;     
+
+    if(rearrangeBIG(tr, pr, tr->nodep[index], mintrav, maxtrav))
+    {    
+      if(tr->thoroughInsertion)
+      {
+        if(tr->endLH > tr->startLH)                 	
+        {			   
+          /* commit the best SPR found by rearrangeBIG */
+          restoreTreeFast(tr, pr);    
+          tr->startLH = tr->endLH = tr->likelihood;	 
+          saveBestTree(bt, tr, pr->perGeneBranchLengths?pr->numberOfPartitions:1);
+        }
+        else
+        { 		  
+          if(tr->bestOfNode != PLL_UNLIKELY)
+            restoreTopologyOnly(tr, bt, pr->perGeneBranchLengths?pr->numberOfPartitions:1);
+        }	   
+      }
+      else
+      {
+        insertInfoList(tr->nodep[index], tr->bestOfNode, iList);	    
+        if(tr->endLH > tr->startLH)                 	
+        {		      
+          restoreTreeFast(tr, pr);
+          tr->startLH = tr->endLH = tr->likelihood;	  	 	  	  	  	  	  	  
+        }	    	  
+      }
+    }     
+  }     
+
+  if(!tr->thoroughInsertion)
+  {           
+    tr->thoroughInsertion = PLL_TRUE;  
+
+    for(i = 0; i < iList->valid; i++)
+    { 	  
+      tr->bestOfNode = PLL_UNLIKELY;
+
+      if(rearrangeBIG(tr, pr, iList->list[i].node, mintrav, maxtrav))
+      {	  
+        if(tr->endLH > tr->startLH)                 	
+        {	 	     
+          restoreTreeFast(tr, pr);
+          tr->startLH = tr->endLH = tr->likelihood;	 
+          saveBestTree(bt, tr, pr->perGeneBranchLengths?pr->numberOfPartitions:1);
+        }
+        else
+        { 
+
+          if(tr->bestOfNode != PLL_UNLIKELY)
+          {	     
+            restoreTopologyOnly(tr, bt, pr->perGeneBranchLengths?pr->numberOfPartitions:1);
+          }	
+        }      
+      }
+    }       
+
+    tr->thoroughInsertion = PLL_FALSE;
+  }
+
+  if(tr->permuteTreeoptimize)
+    rax_free(perm);
+
+  return tr->startLH;     
+}
+
+
+
+
+boolean testInsertRestoreBIG (pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q)
+{    
+  if(tr->thoroughInsertion)
+  {
+    if (! insertBIG(tr, pr, p, q))       return PLL_FALSE;
+
+    pllEvaluateLikelihood (tr, pr, p->next->next, PLL_FALSE, PLL_FALSE);
+  }
+  else
+  {
+    if (! insertRestoreBIG(tr, pr, p, q))       return PLL_FALSE;
+
+    {
+      nodeptr x, y;
+      x = p->next->next;
+      y = p->back;
+
+      if(! isTip(x->number, tr->mxtips) && isTip(y->number, tr->mxtips))
+      {
+        while ((! x->x)) 
+        {
+          if (! (x->x))
+            pllUpdatePartials(tr, pr,x, PLL_FALSE);
+        }
+      }
+
+      if(isTip(x->number, tr->mxtips) && !isTip(y->number, tr->mxtips))
+      {
+        while ((! y->x)) 
+        {		  
+          if (! (y->x))
+            pllUpdatePartials(tr, pr,y, PLL_FALSE);
+        }
+      }
+
+      if(!isTip(x->number, tr->mxtips) && !isTip(y->number, tr->mxtips))
+      {
+        while ((! x->x) || (! y->x)) 
+        {
+          if (! (x->x))
+            pllUpdatePartials(tr, pr,x, PLL_FALSE);
+          if (! (y->x))
+            pllUpdatePartials(tr, pr,y, PLL_FALSE);
+        }
+      }				      	
+
+    }
+
+    tr->likelihood = tr->endLH;
+  }
+
+  return PLL_TRUE;
+} 
+
+void restoreTreeFast(pllInstance *tr, partitionList *pr)
+{
+  removeNodeRestoreBIG(tr, pr, tr->removeNode);
+  testInsertRestoreBIG(tr, pr, tr->removeNode, tr->insertNode);
+}
+
+/*
+static void myfwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
+{
+  size_t  
+    bytes_written = fwrite(ptr, size, nmemb, stream);
+
+  assert(bytes_written == nmemb);
+}
+
+static void myfread(void *ptr, size_t size, size_t nmemb, FILE *stream)
+{
+  size_t
+    bytes_read;
+
+  bytes_read = fread(ptr, size, nmemb, stream);
+
+  assert(bytes_read == nmemb);
+}
+
+static void readTree(pllInstance *tr, partitionList *pr, FILE *f)
+{
+  int 
+    nodeNumber,   
+    x = tr->mxtips + 3 * (tr->mxtips - 1);
+
+  nodeptr
+    startAddress;
+
+  myfread(&nodeNumber, sizeof(int), 1, f);
+
+  tr->start = tr->nodep[nodeNumber];
+
+
+  myfread(&startAddress, sizeof(nodeptr), 1, f);
+
+  myfread(tr->nodeBaseAddress, sizeof(node), x, f);
+
+  {
+    int i;    
+
+    size_t         
+      offset;
+
+    boolean 
+      addIt;
+
+    if(startAddress > tr->nodeBaseAddress)
+    {
+      addIt = PLL_FALSE;
+      offset = (size_t)startAddress - (size_t)tr->nodeBaseAddress;
+    }
+    else
+    {
+      addIt = PLL_TRUE;
+      offset = (size_t)tr->nodeBaseAddress - (size_t)startAddress;
+    }       
+
+    for(i = 0; i < x; i++)
+    {      	
+      if(addIt)
+      {	    
+        tr->nodeBaseAddress[i].next = (nodeptr)((size_t)tr->nodeBaseAddress[i].next + offset);	
+        tr->nodeBaseAddress[i].back = (nodeptr)((size_t)tr->nodeBaseAddress[i].back + offset);
+      }
+      else
+      {
+
+        tr->nodeBaseAddress[i].next = (nodeptr)((size_t)tr->nodeBaseAddress[i].next - offset);	
+        tr->nodeBaseAddress[i].back = (nodeptr)((size_t)tr->nodeBaseAddress[i].back - offset);	   
+      } 
+    }
+
+  }
+
+  pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+
+  printBothOpen("RAxML Restart with likelihood: %1.50f\n", tr->likelihood);
+}
+
+static void readCheckpoint(pllInstance *tr, partitionList *pr)
+{
+  int  
+    restartErrors = 0,
+                  model; 
+
+  FILE 
+    *f = myfopen(binaryCheckpointInputName, "r");
+*/
+  /* cdta */   
+/*
+  myfread(&(tr->ckp), sizeof(checkPointState), 1, f);
+
+
+
+  if(tr->ckp.searchConvergenceCriterion != tr->searchConvergenceCriterion)
+  {
+    printf("restart error, you are trying to re-start a run where the ML search criterion was turned %s\n", (tr->ckp.searchConvergenceCriterion)?"ON":"OFF");
+    restartErrors++;
+  }  
+
+  if(tr->ckp.rateHetModel !=  tr->rateHetModel)
+  {
+    printf("restart error, you are trying to re-start a run with a different model of rate heterogeneity, the checkpoint was obtained under: %s\n", (tr->ckp.rateHetModel == PLL_GAMMA)?"GAMMA":"PSR");
+    restartErrors++;
+  }  
+
+  if(tr->ckp.maxCategories !=  tr->maxCategories)
+  {
+    printf("restart error, you are trying to re-start a run with %d per-site rate categories, the checkpoint was obtained with: %d\n", tr->maxCategories, tr->ckp.maxCategories);
+    restartErrors++;
+  }
+
+  if(tr->ckp.NumberOfModels != pr->numberOfPartitions)
+  {
+    printf("restart error, you are trying to re-start a run with %d partitions, the checkpoint was obtained with: %d partitions\n", (int)pr->numberOfPartitions, tr->ckp.NumberOfModels);
+    restartErrors++;      
+  }
+
+  if(tr->ckp.numBranches != pr->perGeneBranchLengths?pr->numberOfPartitions:1)
+  {
+    printf("restart error, you are trying to re-start a run where independent per-site branch length estimates were turned %s\n", (tr->ckp.numBranches > 1)?"ON":"OFF");
+    restartErrors++;
+  }
+
+  if(tr->ckp.originalCrunchedLength != tr->originalCrunchedLength)
+  {
+    printf("restart error, you are trying to re-start a run with %d site patterns, the checkpoint was obtained with: %d site patterns\n", tr->ckp.originalCrunchedLength, tr->originalCrunchedLength);
+    restartErrors++; 
+  }
+
+  if(tr->ckp.mxtips != tr->mxtips)
+  {
+    printf("restart error, you are trying to re-start a run with %d taxa, the checkpoint was obtained with: %d taxa\n", tr->mxtips, tr->ckp.mxtips);
+    restartErrors++; 
+  }
+
+  if(strcmp(tr->ckp.seq_file, seq_file) != 0)
+  {
+    printf("restart error, you are trying to re-start from alignemnt file %s, the checkpoint was obtained with file: %s\n", tr->ckp.seq_file, seq_file);
+    restartErrors++; 
+  }
+
+  printf("REstart errors: %d\n", restartErrors);
+
+  if(restartErrors > 0)
+  {
+    printf("User induced errors with the restart from checkpoint, exiting ...\n");
+
+    if(restartErrors > 4)
+      printf(" ... maybe you should do field work instead of trying to use a computer ...\n");
+    if(restartErrors > 6)
+      printf(" ... kala eisai telios ilithios;\n");
+
+    exit(-1);
+  }
+
+  tr->ntips = tr->mxtips;
+
+  tr->startLH    = tr->ckp.tr_startLH;
+  tr->endLH      = tr->ckp.tr_endLH;
+  tr->likelihood = tr->ckp.tr_likelihood;
+  tr->bestOfNode = tr->ckp.tr_bestOfNode;
+
+  tr->lhCutoff   = tr->ckp.tr_lhCutoff;
+  tr->lhAVG      = tr->ckp.tr_lhAVG;
+  tr->lhDEC      = tr->ckp.tr_lhDEC;
+  tr->itCount    = tr->ckp.tr_itCount;
+  tr->thoroughInsertion       = tr->ckp.tr_thoroughInsertion;
+
+
+
+  accumulatedTime = tr->ckp.accumulatedTime;
+*/
+  /* printf("Accumulated time so far: %f\n", accumulatedTime); */
+/*
+  tr->optimizeRateCategoryInvocations = tr->ckp.tr_optimizeRateCategoryInvocations;
+
+
+  myfread(tr->tree0, sizeof(char), tr->treeStringLength, f);
+  myfread(tr->tree1, sizeof(char), tr->treeStringLength, f);
+
+  if(tr->searchConvergenceCriterion)
+  {
+    int bCounter = 0;
+
+    if((tr->ckp.state == PLL_FAST_SPRS && tr->ckp.fastIterations > 0) ||
+        (tr->ckp.state == PLL_SLOW_SPRS && tr->ckp.thoroughIterations > 0))
+    { 
+
+#ifdef _DEBUG_CHECKPOINTING    
+      printf("parsing Tree 0\n");
+#endif
+
+      treeReadTopologyString(tr->tree0, tr);   
+
+      bitVectorInitravSpecial(tr->bitVectors, tr->nodep[1]->back, tr->mxtips, tr->vLength, tr->h, 0, PLL_BIPARTITIONS_RF, (branchInfo *)NULL,
+          &bCounter, 1, PLL_FALSE, PLL_FALSE, tr->threadID);
+
+      assert(bCounter == tr->mxtips - 3);
+    }
+
+    bCounter = 0;
+
+    if((tr->ckp.state == PLL_FAST_SPRS && tr->ckp.fastIterations > 1) ||
+        (tr->ckp.state == PLL_SLOW_SPRS && tr->ckp.thoroughIterations > 1))
+    {
+
+#ifdef _DEBUG_CHECKPOINTING
+      printf("parsing Tree 1\n");
+#endif
+
+      treeReadTopologyString(tr->tree1, tr); 
+
+      bitVectorInitravSpecial(tr->bitVectors, tr->nodep[1]->back, tr->mxtips, tr->vLength, tr->h, 1, PLL_BIPARTITIONS_RF, (branchInfo *)NULL,
+          &bCounter, 1, PLL_FALSE, PLL_FALSE, tr->threadID);
+
+      assert(bCounter == tr->mxtips - 3);
+    }
+  }
+
+  myfread(tr->rateCategory, sizeof(int), tr->originalCrunchedLength, f);
+  myfread(tr->patrat, sizeof(double), tr->originalCrunchedLength, f);
+  myfread(tr->patratStored, sizeof(double), tr->originalCrunchedLength, f);
+
+*/
+  /* need to read this as well in checkpoints, otherwise the branch lengths 
+     in the output tree files will be wrong, not the internal branch lengths though */
+/*
+  //TODO: Same problem as writing the checkpoint
+  //myfread(tr->fracchanges,  sizeof(double), pr->numberOfPartitions, f);
+  myfread(&(tr->fracchange),   sizeof(double), 1, f);
+*/
+  /* pInfo */
+/*
+  for(model = 0; model < pr->numberOfPartitions; model++)
+  {
+    int 
+      dataType = pr->partitionData[model]->dataType;
+
+    myfread(&(pr->partitionData[model]->numberOfCategories), sizeof(int), 1, f);
+    myfread(pr->partitionData[model]->perSiteRates, sizeof(double), tr->maxCategories, f);
+    myfread(pr->partitionData[model]->EIGN, sizeof(double), pLengths[dataType].eignLength, f);
+    myfread(pr->partitionData[model]->EV, sizeof(double),  pLengths[dataType].evLength, f);
+    myfread(pr->partitionData[model]->EI, sizeof(double),  pLengths[dataType].eiLength, f);
+
+    myfread(pr->partitionData[model]->frequencies, sizeof(double),  pLengths[dataType].frequenciesLength, f);
+    myfread(pr->partitionData[model]->tipVector, sizeof(double),  pLengths[dataType].tipVectorLength, f);
+    myfread(pr->partitionData[model]->substRates, sizeof(double),  pLengths[dataType].substRatesLength, f);
+    myfread(&(pr->partitionData[model]->alpha), sizeof(double), 1, f);
+    
+    if(pr->partitionData[model]->protModels == PLL_LG4)
+	{
+	  int 
+	    k;
+	  
+	  for(k = 0; k < 4; k++)
+	    {
+	      myfread(pr->partitionData[model]->EIGN_LG4[k], sizeof(double), pLengths[dataType].eignLength, f);
+	      myfread(pr->partitionData[model]->EV_LG4[k], sizeof(double),  pLengths[dataType].evLength, f);
+	      myfread(pr->partitionData[model]->EI_LG4[k], sizeof(double),  pLengths[dataType].eiLength, f);    
+	      myfread(pr->partitionData[model]->frequencies_LG4[k], sizeof(double),  pLengths[dataType].frequenciesLength, f);
+	      myfread(pr->partitionData[model]->tipVector_LG4[k], sizeof(double),  pLengths[dataType].tipVectorLength, f);  
+	      myfread(pr->partitionData[model]->substRates_LG4[k], sizeof(double),  pLengths[dataType].substRatesLength, f);    
+	    }
+	}
+
+    pllMakeGammaCats(pr->partitionData[model]->alpha, pr->partitionData[model]->gammaRates, 4, tr->useMedian);
+  }
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+  pllMasterBarrier (tr, pr, PLL_THREAD_COPY_INIT_MODEL);
+#endif
+
+  updatePerSiteRates(tr, pr, PLL_FALSE);
+
+  readTree(tr, pr, f);
+
+  fclose(f); 
+
+}
+
+void restart(pllInstance *tr, partitionList *pr)
+{  
+  readCheckpoint(tr, pr);
+
+  switch(tr->ckp.state)
+  {
+    case PLL_REARR_SETTING:      
+      break;
+    case PLL_FAST_SPRS:
+      break;
+    case PLL_SLOW_SPRS:
+      break;
+    default:
+      assert(0);
+  }
+}
+*/
+
+/* The number of maximum smoothing iterations is given explicitely */
+/** @brief Optimize branch lenghts and evaluate likelihood of topology
+    
+    Optimize the branch lengths \a maxSmoothIterations times and evaluate
+    the likelihood of tree. The resulting likelihood is placed in
+    \a tr->likelihood
+
+    @param tr
+      The PLL instance
+
+    @param pr
+      List of partitions
+
+    @param maxSmoothIterations
+      Number of times to optimize branch lengths
+*/
+void
+pllOptimizeBranchLengths (pllInstance *tr, partitionList *pr, int maxSmoothIterations)       /* Evaluate a user tree */
+{
+  smoothTree(tr, pr, maxSmoothIterations); /* former (32 * smoothFactor) */
+
+  pllEvaluateLikelihood (tr, pr, tr->start, PLL_FALSE, PLL_FALSE);
+}
+
+/** @brief Perform an NNI move
+
+    Modify the tree topology of instance \a tr by performing an NNI (Neighbour Neighbor
+    Interchange) move at node \a p. Let \a q be \a p->back. If \a swap is set to \b PLL_NNI_P_NEXT 
+    then the subtrees rooted at \a p->next->back and \a q->next->back will be swapped. Otherwise,
+    if \a swap is set to \b PLL_NNI_P_NEXTNEXT then the subtrees rooted at \a p->next->next->back and
+    \a q->next->back are swapped. For clarity, see the illustration.
+
+    @param tr
+      PLL instance
+
+    @param p
+      Node to use as origin for performing NNI
+
+    @param swap
+      Which node to use for the NNI move. \b PLL_NNI_P_NEXT uses node p->next while \b PLL_NNI_P_NEXTNEXT uses p->next->next
+
+    @return
+      In case of success \b PLL_TRUE, otherwise \b PLL_FALSE
+
+    @todo
+      Started error checking here. Instead of checking the errors in the specified way, implement a variadic
+      function where we pass the results of each check and the error code we want to assign if there is at
+      least one negative result
+
+    @image html nni.png "In case \a swap is set to \b PLL_NNI_P_NEXT then the dashed red edge between \a p and \a r is removed and the blue edges are created. If \a swap is set to \b PLL_INIT_P_NEXTNEXT then the dashed red edge between \a p and \a s is removed and the green edges are created. In both cases the black dashed edge is removed"
+*/
+int pllTopologyPerformNNI(pllInstance * tr, nodeptr p, int swap)
+{
+  nodeptr       q, r;
+
+  q = p->back;
+  if (isTip(q->number, tr->mxtips))
+   {
+     errno = PLL_NNI_Q_TIP;
+     return (PLL_FALSE);
+   }
+  if (isTip(p->number, tr->mxtips))
+   {
+     errno = PLL_NNI_P_TIP;
+     return (PLL_FALSE);
+   }
+  assert(!isTip(q->number, tr->mxtips));
+  assert(!isTip(p->number, tr->mxtips));
+
+
+  if(swap == PLL_NNI_P_NEXT)
+   {
+     r = p->next->back;
+     hookupFull(p->next, q->next->back, q->next->z);
+     hookupFull(q->next, r,             p->next->z);
+   }
+  else
+   {
+     r = p->next->next->back;
+     hookupFull(p->next->next, q->next->back, q->next->z);
+     hookupFull(q->next,       r,             p->next->next->z);
+   }
+
+  return PLL_TRUE;
+}
+
+/** @brief Compares 2 NNI moves */
+static int cmp_nni(const void* nni1, const void* nni2) {
+	nniMove* myNNI1 = (nniMove*) nni1;
+	nniMove* myNNI2 = (nniMove*) nni2;
+	return (int) (1000000.f * myNNI1->deltaLH - 1000000.f * myNNI2->deltaLH);
+}
+
+/** @brief Gets the best NNI move for a branch
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param p
+      Node to use as origin for performing NNI
+
+    @param curLH
+      The current likelihood
+
+    @return
+      The best NNI move
+
+*/
+nniMove getBestNNIForBran(pllInstance* tr, partitionList *pr, nodeptr p,
+		double curLH) {
+	nodeptr q = p->back;
+	assert( ! isTip(p->number, tr->mxtips));
+	assert( ! isTip(q->number, tr->mxtips));
+#ifdef _DEBUG_NNI
+	pllTreeToNewick(tr->tree_string, tr, tr->start->back, TRUE, FALSE, 0, 0, 0, SUMMARIZE_LH, 0,0);
+	fprintf(stderr, "%s\n", tr->tree_string);
+#endif
+
+	/* Backup the current branch length */
+	double z0[PLL_NUM_BRANCHES];
+	int i;
+	for (i = 0; i < pr->numberOfPartitions; i++) {
+		z0[i] = p->z[i];
+	}
+#ifdef _DEBUG_NNI
+	double lhOld = tr->likelihood;
+	printf("lhOld: %f \n", lhOld);
+#endif
+	double lh0 = curLH;
+
+
+#ifdef _DEBUG_NNI
+	printf("lh0: %f \n", lh0);
+#endif
+	nniMove nni0; // nni0 means no NNI move is done
+	nni0.p = p;
+	nni0.nniType = 0;
+	nni0.deltaLH = 0;
+	for (i = 0; i < pr->numberOfPartitions; i++) {
+		nni0.z[i] = p->z[i];
+	}
+
+	/* Save the scaling factor */
+	// Now try to do an NNI move of type 1
+	pllTopologyPerformNNI(tr, p, PLL_NNI_P_NEXT);
+	double lh1 = tr->likelihood;
+	/* Update branch lengths */
+	pllUpdatePartials(tr, pr, p, PLL_FALSE);
+	pllUpdatePartials(tr, pr, q, PLL_FALSE);
+	update(tr, pr, p);
+	pllEvaluateLikelihood (tr, pr, p, PLL_FALSE, PLL_FALSE);
+
+	nniMove nni1;
+	nni1.p = p;
+	nni1.nniType = 1;
+	// Store the optimized und unoptimized central branch length
+	for (i = 0; i < pr->numberOfPartitions; i++) {
+		nni1.z[i] = p->z[i];
+		nni1.z0[i] = z0[i];
+	}
+	nni1.likelihood = lh1;
+	nni1.deltaLH = lh1 - lh0;
+#ifdef _DEBUG_NNI
+	printf("Delta likelihood of the 1.NNI move: %f\n", nni1.deltaLH);
+#endif
+
+	/* Restore previous NNI move */
+	pllTopologyPerformNNI(tr, p, PLL_NNI_P_NEXT);
+	/* Restore the old branch length */
+	for (i = 0; i < pr->numberOfPartitions; i++) {
+		p->z[i] = z0[i];
+		p->back->z[i] = z0[i];
+	}
+
+#ifdef _DEBUG_NNI
+	printf("Restore topology\n");
+	pllTreeToNewick(tr->tree_string, tr, tr->start->back, TRUE, FALSE, 0, 0, 0, SUMMARIZE_LH, 0,0);
+	fprintf(stderr, "%s\n", tr->tree_string);
+	pllEvaluateLikelihood (tr, tr->start, TRUE);
+	printf("Likelihood after restoring from NNI 1: %f\n", tr->likelihood);
+#endif
+	/* Try to do an NNI move of type 2 */
+	pllTopologyPerformNNI(tr, p, 2);
+	double lh2 = tr->likelihood;
+	/* Update branch lengths */
+	pllUpdatePartials(tr, pr, p, PLL_FALSE);
+	pllUpdatePartials(tr, pr, q, PLL_FALSE);
+	update(tr, pr, p);
+	pllEvaluateLikelihood (tr, pr, p, PLL_FALSE, PLL_FALSE);
+
+	// Create the nniMove struct to store this move
+	nniMove nni2;
+	nni2.p = p;
+	nni2.nniType = 2;
+
+	// Store the optimized and unoptimized central branch length
+	for (i = 0; i < pr->numberOfPartitions; i++) {
+		nni2.z[i] = p->z[i];
+		nni2.z0[i] = z0[i];
+	}
+	nni2.likelihood = lh2;
+	nni2.deltaLH = lh2 - lh0;
+#ifdef _DEBUG_NNI
+	printf("Delta likelihood of the 2.NNI move: %f\n", nni2.deltaLH);
+#endif
+
+	/* Restore previous NNI move */
+	pllTopologyPerformNNI(tr, p, 2);
+	pllUpdatePartials(tr, pr, p, PLL_FALSE);
+	pllUpdatePartials(tr, pr, p->back, PLL_FALSE);
+	/* Restore the old branch length */
+	for (i = 0; i < pr->numberOfPartitions; i++) {
+		p->z[i] = z0[i];
+		p->back->z[i] = z0[i];
+	}
+	if (nni1.deltaLH > 0 && nni1.deltaLH >= nni2.deltaLH) {
+		return nni1;
+	} else if (nni1.deltaLH > 0 && nni1.deltaLH < nni2.deltaLH) {
+		return nni2;
+	} else if (nni1.deltaLH < 0 && nni2.deltaLH > 0) {
+		return nni2;
+	} else {
+		return nni0;
+	}
+}
+
+/** @brief ??? Not sure */
+void evalNNIForSubtree(pllInstance* tr, partitionList *pr, nodeptr p,
+		nniMove* nniList, int* cnt, int* cnt_nni, double curLH) {
+	if (!isTip(p->number, tr->mxtips)) {
+		nniList[*cnt] = getBestNNIForBran(tr, pr, p, curLH);
+		if (nniList[*cnt].deltaLH != 0.0) {
+			*cnt_nni = *cnt_nni + 1;
+		}
+		*cnt = *cnt + 1;
+		nodeptr q = p->next;
+		while (q != p) {
+			evalNNIForSubtree(tr, pr, q->back, nniList, cnt, cnt_nni, curLH);
+			q = q->next;
+		}
+	}
+}
+
+/** @brief Perform an NNI search
+
+    Modify the tree topology of instance and model parameters \a tr by performing a NNI (Neighbour Neighbor
+    Interchange) moves \a p.
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param estimateModel
+      Determine wheter the model parameters should be optimized
+
+    @return
+      In case of success \b PLL_TRUE, otherwise \b PLL_FALSE
+
+*/
+int pllNniSearch(pllInstance * tr, partitionList *pr, int estimateModel) {
+
+	double curScore = tr->likelihood;
+
+	/* Initialize the NNI list */
+	nniMove* nniList = (nniMove*) malloc((tr->mxtips - 3) * sizeof(nniMove));
+	int i;
+	/* fill up the NNI list */
+	nodeptr p = tr->start->back;
+	nodeptr q = p->next;
+	int cnt = 0; // number of visited internal branches during NNI evaluation
+	int cnt_nni = 0; // number of positive NNI found
+	while (q != p) {
+		evalNNIForSubtree(tr, pr, q->back, nniList, &cnt, &cnt_nni, curScore);
+		q = q->next;
+	}
+	if (cnt_nni == 0)
+		return 0.0;
+
+	nniMove* impNNIList = (nniMove*) malloc(cnt_nni * sizeof(nniMove));
+	int j = 0;
+	for (i = 0; i < tr->mxtips - 3; i++) {
+		if (nniList[i].deltaLH > 0.0) {
+			impNNIList[j] = nniList[i];
+			j++;
+		}
+	}
+	// sort impNNIList
+	qsort(impNNIList, cnt_nni, sizeof(nniMove), cmp_nni);
+
+	// creating a list of non-conflicting positive NNI
+	nniMove* nonConfNNIList = (nniMove*) calloc(cnt_nni, sizeof(nniMove));
+
+	// the best NNI will always be taken
+	nonConfNNIList[0] = impNNIList[cnt_nni - 1];
+
+	// Filter out conflicting NNI
+	int numNonConflictNNI = 1; // size of the non-conflicting NNI list;
+	int k;
+	for (k = cnt_nni - 2; k >= 0; k--) {
+		int conflict = PLL_FALSE;
+		int j;
+		for (j = 0; j < numNonConflictNNI; j++) {
+			if (impNNIList[k].p->number == nonConfNNIList[j].p->number
+					|| impNNIList[k].p->number
+							== nonConfNNIList[j].p->back->number) {
+				conflict = PLL_TRUE;
+				break;
+			}
+		}
+		if (conflict) {
+			continue;
+		} else {
+			nonConfNNIList[numNonConflictNNI] = impNNIList[k];
+			numNonConflictNNI++;
+		}
+	}
+
+	// Applying non-conflicting NNI moves
+	double delta = 1.0; // portion of NNI moves to apply
+	int notImproved;
+	do {
+		notImproved = PLL_FALSE;
+		int numNNI2Apply = ceil(numNonConflictNNI * delta);
+		for (i = 0; i < numNNI2Apply; i++) {
+			// Just do the topological change
+			pllTopologyPerformNNI(tr, nonConfNNIList[i].p, nonConfNNIList[i].nniType);
+			pllUpdatePartials(tr, pr, nonConfNNIList[i].p, PLL_FALSE);
+			pllUpdatePartials(tr, pr, nonConfNNIList[i].p->back, PLL_FALSE);
+			// Apply the store branch length
+			int j;
+			for (j = 0; j < pr->numberOfPartitions; j++) {
+				nonConfNNIList[i].p->z[j] = nonConfNNIList[i].z[j];
+				nonConfNNIList[i].p->back->z[j] = nonConfNNIList[i].z[j];
+			}
+		}
+		// Re-optimize all branches
+		smoothTree(tr, pr, 2);
+		pllEvaluateLikelihood (tr, pr, tr->start, PLL_FALSE, PLL_FALSE);
+		if (estimateModel) {
+			modOpt(tr, pr, 0.1);
+		}
+		pllEvaluateLikelihood (tr, pr, tr->start, PLL_FALSE, PLL_FALSE);
+		if (tr->likelihood < curScore) {
+#ifdef _DEBUG_NNI
+			printf("Tree likelihood gets worse after applying NNI\n");
+			printf("curScore = %30.20f\n", curScore);
+			printf("newScore = %30.20f\n", tr->likelihood);
+			printf("Rolling back the tree\n");
+#endif
+			for (i = 0; i < numNNI2Apply; i++) {
+				pllTopologyPerformNNI(tr, nonConfNNIList[i].p, nonConfNNIList[i].nniType);
+				// Restore the branch length
+				int j;
+				for (j = 0; j < pr->numberOfPartitions; j++) {
+					nonConfNNIList[i].p->z[j] = nonConfNNIList[i].z0[j];
+					nonConfNNIList[i].p->back->z[j] = nonConfNNIList[i].z0[j];
+				}
+			}
+			pllEvaluateLikelihood (tr, pr, tr->start, PLL_FALSE, PLL_FALSE);
+#ifdef _DEBUG_NNI
+			printf("Tree likelihood after rolling back = %f \n",
+					tr->likelihood);
+#endif
+			notImproved = PLL_TRUE & (numNNI2Apply > 1);
+			delta = delta * 0.5;
+		}
+	} while (notImproved);
+	free(nniList);
+	free(impNNIList);
+	free(nonConfNNIList);
+
+	return PLL_TRUE;
+}
+
+
+/** @defgroup rearrangementGroup Topological rearrangements
+    
+    This set of functions handles the rearrangement of the tree topology
+*/
+
+
+/** @ingroup rearrangementGroup
+    @brief Create a list for storing topology rearrangements
+ 
+    Allocates space and initializes a structure that will hold information
+    of \a max topological rearrangements
+
+    @param max
+      Maximum number of elements that the structure should hold
+    
+    @note This should be called for creating a storage space (list) for
+    routines such as ::pllRearrangeSearch which compute the best NNI/PR/TBR rearrangements.
+*/
+pllRearrangeList * pllCreateRearrangeList (int max)
+{
+  pllRearrangeList * bl;
+
+  bl = (pllRearrangeList *) malloc (sizeof (pllRearrangeList));
+
+  bl->max_entries = max;
+  bl->entries     = 0;
+  bl->rearr       = (pllRearrangeInfo *) malloc (max * sizeof (pllRearrangeInfo));
+
+  return bl;
+}
+
+/** @ingroup rearrangementGroup
+    @brief Deallocator for topology rearrangements list
+    
+    Call this to destroy (deallocate) the memory taken by the \a bestList which holds
+    topological rearrangements
+
+    @param bestList
+      Pointer to the list to be deallocated
+*/
+void pllDestroyRearrangeList (pllRearrangeList ** bestList)
+{
+  pllRearrangeList * bl;
+
+  bl = *bestList;
+
+  rax_free (bl->rearr);
+  rax_free (bl);
+
+  *bestList = NULL;
+}
+
+
+/** @ingroup rearrangementGroup
+    @brief Store a rearrangement move to the list of best rearrangement moves
+
+     Checks if the likelihood yielded by the rearrangement move described in \a rearr
+     is better than any in the sorted list \a bestList. If it is, or
+     if there is still space in \a bestList, the info about the
+     move is inserted in the list.
+
+     @param bestList
+       The list of information about the best rearrangement moves
+
+     @param rearr
+       Info about the current rearrangement move
+
+     @return
+       Returns \b PLL_FALSE if the rearrangement move doesn't make it in the list, otherwise \b PLL_TRUE
+*/
+static int pllStoreRearrangement (pllRearrangeList * bestList, pllRearrangeInfo * rearr)
+ {
+   /* naive implementation of saving rearrangement moves */
+   int i;
+
+   for (i = 0; i < bestList->entries; ++ i)
+    {
+      /* Does the new rearrangement yield a better likelihood that the current in the list */
+      if (rearr->likelihood > bestList->rearr[i].likelihood)
+       {
+         /* is there enough space in the array ? */
+         if (bestList->entries < bestList->max_entries)
+          {
+            /* slide the entries to the right and overwrite the i-th element with the new item */
+            memmove (&(bestList->rearr[i + 1]), &(bestList->rearr[i]), (bestList->entries - i ) * sizeof (pllRearrangeInfo));
+            ++ bestList->entries;
+          }
+         else
+          {
+            memmove (&(bestList->rearr[i + 1]), &(bestList->rearr[i]), (bestList->entries - i - 1 ) * sizeof (pllRearrangeInfo));
+          }
+         memcpy (&(bestList->rearr[i]), rearr, sizeof (pllRearrangeInfo));
+         return (PLL_TRUE);
+       }
+    }
+   if (bestList->entries < bestList->max_entries)
+    {
+      memcpy (&(bestList->rearr[bestList->entries]), rearr, sizeof (pllRearrangeInfo));
+      ++ bestList->entries;
+      return (PLL_TRUE);
+    }
+
+   return (PLL_FALSE);
+ }
+
+/** @ingroup rearrangementGroup
+    @brief Internal function for testing and saving an SPR move
+    
+    Checks the likelihood of the placement of the pruned subtree specified by \a p
+    to node \a q. If the likelihood is better than some in the sorted list 
+    \a bestList, or if there is still free space in \a bestList, then the SPR 
+    move is recorded (in \a bestList)
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param p
+      Root of the subtree that is to be pruned
+
+    @param q
+      Where to place the pruned subtree (between \a q and \a q->back
+
+    @param bestList
+      Where to store the SPR move
+
+    @note Internal function which is not part of the PLL API and therefore should not be
+    called by the user
+
+    @return
+*/
+static int
+pllTestInsertBIG (pllInstance * tr, partitionList * pr, nodeptr p, nodeptr q, pllRearrangeList * bestList)
+{
+  int numBranches = pr->perGeneBranchLengths?pr->numberOfPartitions:1;
+  pllRearrangeInfo rearr;
+
+  double  qz[PLL_NUM_BRANCHES], pz[PLL_NUM_BRANCHES];
+  nodeptr  r;
+  //double startLH = tr->endLH;
+  int i;
+
+  r = q->back; 
+  for(i = 0; i < numBranches; i++)
+  {
+    qz[i] = q->z[i];
+    pz[i] = p->z[i];
+  }
+
+  if (! insertBIG(tr, pr, p, q))       return PLL_FALSE;
+
+  pllEvaluateLikelihood (tr, pr, p->next->next, PLL_FALSE, PLL_FALSE);
+  
+  rearr.rearrangeType  = PLL_REARRANGE_SPR;
+  rearr.likelihood     = tr->likelihood;
+  rearr.Move.SPR.removeNode = p;
+  rearr.Move.SPR.insertNode = q;
+  for (i = 0; i < numBranches; ++ i)
+   {
+     rearr.Move.SPR.zqr[i] = tr->zqr[i];
+   }
+
+  pllStoreRearrangement (bestList, &rearr);
+
+/*
+  if(tr->likelihood > tr->bestOfNode)
+  {
+    pllStoreRearrangement (bestList, rearr)
+    tr->bestOfNode = tr->likelihood;
+    tr->insertNode = q;
+    tr->removeNode = p;   
+    for(i = 0; i < numBranches; i++)
+    {
+      tr->currentZQR[i] = tr->zqr[i];           
+      tr->currentLZR[i] = tr->lzr[i];
+      tr->currentLZQ[i] = tr->lzq[i];
+      tr->currentLZS[i] = tr->lzs[i];      
+    }
+  }
+
+  if(tr->likelihood > tr->endLH)
+  {			  
+    
+    tr->insertNode = q;
+    tr->removeNode = p;   
+    for(i = 0; i < numBranches; i++)
+      tr->currentZQR[i] = tr->zqr[i];      
+    tr->endLH = tr->likelihood;                      
+  }        
+*/
+  /* reset the topology so that it is the same as it was before calling insertBIG */
+  hookup(q, r, qz, numBranches);
+
+  p->next->next->back = p->next->back = (nodeptr) NULL;
+
+  if(tr->thoroughInsertion)
+  {
+    nodeptr s = p->back;
+    hookup(p, s, pz, numBranches);
+  } 
+
+/*
+  if((tr->doCutoff) && (tr->likelihood < startLH))
+  {
+    tr->lhAVG += (startLH - tr->likelihood);
+    tr->lhDEC++;
+    if((startLH - tr->likelihood) >= tr->lhCutoff)
+      return PLL_FALSE;	    
+    else
+      return PLL_TRUE;
+  }
+  else
+    return PLL_TRUE;
+  */
+  return (PLL_TRUE);
+}
+
+/** @ingroup rearrangementGroup
+    @brief Internal function for recursively traversing a tree and testing a possible subtree insertion
+
+    Recursively traverses the tree rooted at \a q in the direction of \a q->next->back and \a q->next->next->back
+    and at each node tests the placement of the pruned subtree rooted at \a p by calling the function
+    \a pllTestInsertBIG, which in turn saves the computed SPR in \a bestList if a) there is still space in
+    the \a bestList or b) if the likelihood of the SPR is better than any of the ones in \a bestList.
+
+    @note This function is not part of the API and should not be called by the user.
+*/
+static void pllTraverseUpdate (pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q, int mintrav, int maxtrav, pllRearrangeList * bestList)
+{  
+  if (--mintrav <= 0) 
+  {              
+    if (! pllTestInsertBIG(tr, pr, p, q, bestList))  return;
+
+  }
+
+  if ((!isTip(q->number, tr->mxtips)) && (--maxtrav > 0)) 
+  {    
+    pllTraverseUpdate(tr, pr, p, q->next->back, mintrav, maxtrav, bestList);
+    pllTraverseUpdate(tr, pr, p, q->next->next->back, mintrav, maxtrav, bestList);
+  }
+} 
+
+
+/** @ingroup rearrangementGroup
+    @brief Internal function for computing SPR moves
+
+    Compute a list of at most \a max SPR moves that can be performed by pruning
+    the subtree rooted at node \a p and testing all possible placements in a
+    radius of at least \a mintrav nodes and at most \a maxtrav nodes from \a p.
+    Note that \a tr->thoroughInsertion affects the behaviour of the function (see note).
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param p
+      Node specifying the root of the pruned subtree, i.e. where to prune.
+
+    @param mintrav
+      Minimum distance from \a p where to try inserting the pruned subtree
+
+    @param maxtrav
+      Maximum distance from \a p where to try inserting the pruned subtree
+
+    @param bestList
+      The list of best topological rearrangements
+
+    @note This function is not part of the API and should not be called by the user
+    as it is called internally by the API function \a pllComputeSPR. 
+    Also, setting \a tr->thoroughInsertion affects this function. For each tested SPR
+    the new branch lengths will also be optimized. This computes better likelihoods
+    but also slows down the method considerably.
+*/
+static int pllTestSPR (pllInstance * tr, partitionList * pr, nodeptr p, int mintrav, int maxtrav, pllRearrangeList * bestList)
+{
+  nodeptr 
+    p1, p2, q, q1, q2;
+  double 
+    p1z[PLL_NUM_BRANCHES], p2z[PLL_NUM_BRANCHES], q1z[PLL_NUM_BRANCHES], q2z[PLL_NUM_BRANCHES];
+  int
+    mintrav2, i;
+  int numBranches = pr->perGeneBranchLengths ? pr->numberOfPartitions : 1;
+
+  if (maxtrav < 1 || mintrav > maxtrav) return (PLL_FALSE);
+  q = p->back;
+
+  if (!isTip (p->number, tr->mxtips))
+   {
+     p1 = p->next->back;
+     p2 = p->next->next->back;
+
+     if (!isTip (p1->number, tr->mxtips) || !isTip (p2->number, tr->mxtips))
+      {
+        /* save branch lengths before splitting the tree in two components */
+        for (i = 0; i < numBranches; ++ i)
+         {
+           p1z[i] = p1->z[i];
+           p2z[i] = p2->z[i];
+         }
+
+        /* split the tree in two components */
+        if (! removeNodeBIG (tr, pr, p, numBranches)) return PLL_BADREAR;
+
+        /* recursively traverse and perform SPR on the subtree rooted at p1 */
+        if (!isTip (p1->number, tr->mxtips))
+         {
+           pllTraverseUpdate (tr, pr, p, p1->next->back,       mintrav, maxtrav, bestList);
+           pllTraverseUpdate (tr, pr, p, p1->next->next->back, mintrav, maxtrav, bestList);
+         }
+
+        /* recursively traverse and perform SPR on the subtree rooted at p2 */
+        if (!isTip (p2->number, tr->mxtips))
+         {
+           pllTraverseUpdate (tr, pr, p, p2->next->back,       mintrav, maxtrav, bestList);
+           pllTraverseUpdate (tr, pr, p, p2->next->next->back, mintrav, maxtrav, bestList);
+         }
+
+        /* restore the topology as it was before the split */
+        hookup (p->next,       p1, p1z, numBranches);
+        hookup (p->next->next, p2, p2z, numBranches);
+        pllUpdatePartials (tr, pr, p, PLL_FALSE);
+      }
+   }
+
+  if (!isTip (q->number, tr->mxtips) && maxtrav > 0)
+   {
+     q1 = q->next->back;
+     q2 = q->next->next->back;
+
+    /* why so many conditions? Why is it not analogous to the previous if for node p? */
+    if (
+        (
+         ! isTip(q1->number, tr->mxtips) && 
+         (! isTip(q1->next->back->number, tr->mxtips) || ! isTip(q1->next->next->back->number, tr->mxtips))
+        )
+        ||
+        (
+         ! isTip(q2->number, tr->mxtips) && 
+         (! isTip(q2->next->back->number, tr->mxtips) || ! isTip(q2->next->next->back->number, tr->mxtips))
+        )
+       )
+     {
+       for (i = 0; i < numBranches; ++ i)
+        {
+          q1z[i] = q1->z[i];
+          q2z[i] = q2->z[i];
+        }
+
+       if (! removeNodeBIG (tr, pr, q, numBranches)) return PLL_BADREAR;
+
+       mintrav2 = mintrav > 2 ? mintrav : 2;
+
+       if (!isTip (q1->number, tr->mxtips))
+        {
+          pllTraverseUpdate (tr, pr, q, q1->next->back,       mintrav2, maxtrav, bestList);
+          pllTraverseUpdate (tr, pr, q, q1->next->next->back, mintrav2, maxtrav, bestList);
+        }
+
+       if (!isTip (q2->number, tr->mxtips))
+        {
+          pllTraverseUpdate (tr, pr, q, q2->next->back,       mintrav2, maxtrav, bestList);
+          pllTraverseUpdate (tr, pr, q, q2->next->next->back, mintrav2, maxtrav, bestList);
+        }
+
+       hookup (q->next,       q1, q1z, numBranches);
+       hookup (q->next->next, q2, q2z, numBranches);
+       pllUpdatePartials (tr, pr, q, PLL_FALSE);
+     }
+   }
+  return (PLL_TRUE);
+}
+
+/** @ingroup rearrangementGroup
+    @brief Compute a list of possible SPR moves
+    
+    Iteratively tries all possible SPR moves that can be performed by
+    pruning the subtree rooted at \a p and testing all possible placements
+    in a radius of at least \a mintrav nodea and at most \a maxtrav nodes from
+    \a p. Note that \a tr->thoroughInsertion affects the behaviour of the function (see note).
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param p
+      Node specifying the root of the pruned subtree, i.e. where to prune.
+
+    @param mintrav
+      Minimum distance from \a p where to try inserting the pruned subtree
+
+    @param maxtrav
+      Maximum distance from \a p where to try inserting the pruned subtree
+
+    @note
+      Setting \a tr->thoroughInsertion affects this function. For each tested SPR
+      the new branch lengths will also be optimized. This computes better likelihoods
+      but also slows down the method considerably.
+*/
+static void 
+pllComputeSPR (pllInstance * tr, partitionList * pr, nodeptr p, int mintrav, int maxtrav, pllRearrangeList * bestList)
+{
+
+  tr->startLH = tr->endLH = tr->likelihood;
+
+  /* TODO: Add cutoff code */
+
+  tr->bestOfNode = PLL_UNLIKELY;
+
+  pllTestSPR (tr, pr, p, mintrav, maxtrav, bestList);
+}
+
+/** @ingroup rearrangementGroup
+    @brief Return the yielded likelihood of an NNI move, without altering the topology
+
+    This function performs the NNI move of type \a swapType at node \a p, optimizes
+    the branch with endpoints \a p  and \a p->back and evalutes the resulting likelihood.
+    It then restores the topology  to the origin and returns the likelihood that the NNI
+    move yielded.
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param p
+      Where to perform the NNI move
+
+    @param swapType
+      What type of NNI move to perform
+
+    @return
+      The likelihood yielded from the NNI
+*/
+static double 
+pllTestNNILikelihood (pllInstance * tr, partitionList * pr, nodeptr p, int swapType)
+{
+  double lh;
+  double z0[PLL_NUM_BRANCHES];
+  int i;
+
+  /* store the origin branch lengths and likelihood. The original branch lengths could
+  be passed as a parameter in order to avoid duplicate computations because of the two
+  NNI moves */
+  for (i = 0; i < pr->numberOfPartitions; ++ i)
+   {
+     z0[i] = p->z[i];
+   }
+
+  /* perform NNI */
+  pllTopologyPerformNNI(tr, p, swapType);
+  /* recompute the likelihood vectors of the two subtrees rooted at p and p->back,
+     optimize the branch lengths and evaluate the likelihood  */
+  pllUpdatePartials (tr, pr, p,       PLL_FALSE);
+  pllUpdatePartials (tr, pr, p->back, PLL_FALSE);
+  update (tr, pr, p);
+  pllEvaluateLikelihood (tr, pr, p, PLL_FALSE, PLL_FALSE);
+  lh = tr->likelihood;
+
+  /* restore topology */
+  pllTopologyPerformNNI(tr, p, swapType);
+  pllUpdatePartials (tr, pr, p,       PLL_FALSE);
+  pllUpdatePartials (tr, pr, p->back, PLL_FALSE);
+  //update (tr, pr, p);
+  pllEvaluateLikelihood (tr, pr, p, PLL_FALSE, PLL_FALSE);
+  for (i = 0; i < pr->numberOfPartitions; ++ i)
+   {
+     p->z[i] = p->back->z[i] = z0[i];
+   }
+
+  return lh;
+}
+/** @ingroup rearrangementGroup
+    @brief Compares NNI likelihoods at a node and store in the rearrangement list
+
+    Compares the two possible NNI moves that can be performed at node \a p, and
+    if the likelihood improves from the one of the original topology, then 
+    it picks the one that yields the highest likelihood and tries to insert it in
+    the list of best rearrangement moves
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param bestList
+      Rearrangement moves list
+*/
+static void pllTestNNI (pllInstance * tr, partitionList * pr, nodeptr p, pllRearrangeList * bestList)
+{
+  double lh0, lh1, lh2;
+  pllRearrangeInfo rearr;
+
+  /* store the original likelihood */
+  lh0 = tr->likelihood;
+
+  lh1 = pllTestNNILikelihood (tr, pr, p, PLL_NNI_P_NEXT);
+  lh2 = pllTestNNILikelihood (tr, pr, p, PLL_NNI_P_NEXTNEXT);
+
+  if (lh0 > lh1 && lh0 > lh2) return;
+
+  /* set the arrangement structure */
+  rearr.rearrangeType  = PLL_REARRANGE_NNI;
+  rearr.likelihood     = PLL_MAX (lh1, lh2);
+  rearr.Move.NNI.originNode = p;
+  rearr.Move.NNI.swapType   = (lh1 > lh2) ? PLL_NNI_P_NEXT : PLL_NNI_P_NEXTNEXT;
+
+  /* try to store it in the best list */
+  pllStoreRearrangement (bestList, &rearr);
+}
+
+/** @ingroup rearrangementGroup
+    @brief Recursive traversal of the tree structure for testing NNI moves
+ 
+    Recursively traverses the tree structure and tests all allowed NNI
+    moves in the area specified by \a mintrav and \a maxtrav. For more
+    information and details on the function arguments check ::pllSearchNNI
+*/
+static void 
+pllTraverseNNI (pllInstance *tr, partitionList *pr, nodeptr p, int mintrav, int maxtrav, pllRearrangeList * bestList)
+{
+  if (isTip (p->number, tr->mxtips)) return;
+
+  /* if we are at the right radius then compute the NNIs for nodes p->next and p->next->next */
+  if (!mintrav)
+   {
+     pllTestNNI (tr, pr, p->next, bestList);
+     pllTestNNI (tr, pr, p->next->next, bestList);
+   }
+  
+  /* and then avoid computing the NNIs for nodes p->next->back and p->next->next->back as they are
+  the same to the ones computed in the above two lines. This way we do not need to resolve conflicts
+  later on as in the old code */
+  if (maxtrav)
+   {
+     if (!isTip (p->next->back->number, tr->mxtips))       
+       pllTraverseNNI (tr, pr, p->next->back,       mintrav ? mintrav - 1 : 0, maxtrav - 1, bestList);
+     if (!isTip (p->next->next->back->number, tr->mxtips)) 
+       pllTraverseNNI (tr, pr, p->next->next->back, mintrav ? mintrav - 1 : 0, maxtrav - 1, bestList);
+   }
+}
+
+/** @ingroup rearrangementGroup
+    @brief Compute a list of possible NNI moves
+    
+    Iteratively tries all possible NNI moves at each node that is at
+    least \a mintrav and at most \a maxtrav nodes far from node \a p.
+    At each NNI move, the likelihood is tested and if it is higher than
+    the likelihood of an element in the sorted (by likelihood) list 
+    \a bestList, or if there is still empty space in \a bestList, it is
+    inserted at the corresponding position.
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param p
+      Node specifying the point where the NNI will be performed.
+
+    @param mintrav
+      Minimum distance from \a p where the NNI can be tested 
+
+    @param maxtrav
+      Maximum distance from \a p where to try NNIs
+*/
+static void
+pllSearchNNI (pllInstance * tr, partitionList * pr, nodeptr p, int mintrav, int maxtrav, pllRearrangeList * bestList)
+{
+  /* avoid conflicts by precomputing the NNI of the first node */
+
+  if (mintrav == 0) 
+  pllTestNNI (tr, pr, p, bestList);
+  
+  pllTraverseNNI (tr, pr, p, mintrav, maxtrav, bestList);
+  if (maxtrav)
+    pllTraverseNNI (tr, pr, p->back, mintrav, maxtrav - 1, bestList);
+
+}
+
+/** @ingroup rearrangementGroup
+    @brief Create rollback information for an SPR move
+    
+    Creates a structure of type ::pllRollbackInfo and fills it with rollback
+    information about the SPR move described in \a rearr. The rollback info
+    is stored in the PLL instance in a LIFO manner.
+
+    @param tr
+      PLL instance
+
+    @param rearr
+      Description of the SPR move
+
+    @param numBranches
+      Number of partitions
+*/
+static void 
+pllCreateSprInfoRollback (pllInstance * tr, pllRearrangeInfo * rearr, int numBranches)
+{
+  pllRollbackInfo * sprRb;
+  nodeptr p, q;
+  int i;
+
+  p = rearr->Move.SPR.removeNode;
+  q = rearr->Move.SPR.insertNode;
+
+  sprRb = (pllRollbackInfo *) rax_malloc (sizeof (pllRollbackInfo) + 4 * numBranches * sizeof (double));
+  sprRb->Move.SPR.zp   = (double *) ((void *)sprRb + sizeof (pllRollbackInfo));
+  sprRb->Move.SPR.zpn  = (double *) ((void *)sprRb + sizeof (pllRollbackInfo) + numBranches * sizeof (double));
+  sprRb->Move.SPR.zpnn = (double *) ((void *)sprRb + sizeof (pllRollbackInfo) + 2 * numBranches * sizeof (double));
+  sprRb->Move.SPR.zqr  = (double *) ((void *)sprRb + sizeof (pllRollbackInfo) + 3 * numBranches * sizeof (double));
+
+  for (i = 0; i < numBranches; ++ i)
+   {
+     sprRb->Move.SPR.zp[i]   = p->z[i];
+     sprRb->Move.SPR.zpn[i]  = p->next->z[i];
+     sprRb->Move.SPR.zpnn[i] = p->next->next->z[i];
+     sprRb->Move.SPR.zqr[i]  = q->z[i];
+   }
+
+  sprRb->Move.SPR.pn  = p->next->back;
+  sprRb->Move.SPR.pnn = p->next->next->back;
+  sprRb->Move.SPR.r   = q->back;
+  sprRb->Move.SPR.q   = q;
+  sprRb->Move.SPR.p   = p;
+
+  sprRb->rearrangeType = PLL_REARRANGE_SPR;
+
+  pllStackPush (&(tr->rearrangeHistory), (void *) sprRb);
+}
+
+/** @ingroup rearrangementGroup
+    @brief Create rollback information for an NNI move
+
+    Creates a structure of type ::pllRollbackInfo and fills it with rollback
+    information about the SPR move described in \a rearr. The rollback info
+    is stored in the PLL instance in a LIFO manner
+
+    @param tr
+      PLL instance
+
+    @param rearr
+      Description of the NNI move
+*/
+static void
+pllCreateNniInfoRollback (pllInstance * tr, pllRearrangeInfo * rearr)
+{
+  /*TODO: add the branches ? */
+  pllRollbackInfo * ri;
+
+  ri = (pllRollbackInfo *) rax_malloc (sizeof (pllRollbackInfo));
+
+  ri->rearrangeType = PLL_REARRANGE_NNI;
+
+  ri->Move.NNI.origin   = rearr->Move.NNI.originNode;
+  ri->Move.NNI.swapType = rearr->Move.NNI.swapType;
+
+  pllStackPush (&(tr->rearrangeHistory), (void *) ri);
+  
+}
+
+
+/** @ingroup rearrangementGroup
+    @brief Generic function for creating rollback information
+
+    Creates a structure of type ::pllRollbackInfo and fills it with rollback
+    information about the move described in \a rearr. The rollback info
+    is stored in the PLL instance in a LIFO manner
+
+    @param tr
+      PLL instance
+
+    @param rearr
+      Description of the NNI move
+
+    @param numBranches
+      Number of partitions
+*/
+static void
+pllCreateRollbackInfo (pllInstance * tr, pllRearrangeInfo * rearr, int numBranches)
+{
+  switch (rearr->rearrangeType)
+   {
+     case PLL_REARRANGE_NNI:
+       pllCreateNniInfoRollback (tr, rearr);
+       break;
+     case PLL_REARRANGE_SPR:
+       pllCreateSprInfoRollback (tr, rearr, numBranches);
+       break;
+     default:
+       break;
+   }
+
+}
+
+
+/** @ingroup rearrangementGroup
+    @brief Rollback an SPR move
+
+    Perform a rollback (undo) on the last SPR move.
+    
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param ri
+      Rollback information
+*/
+static void
+pllRollbackSPR (partitionList * pr, pllRollbackInfo * ri)
+{
+  int numBranches;
+
+  numBranches = pr->perGeneBranchLengths ? pr->numberOfPartitions : 1;
+
+  hookup (ri->Move.SPR.p->next,       ri->Move.SPR.pn,      ri->Move.SPR.zpn,  numBranches);
+  hookup (ri->Move.SPR.p->next->next, ri->Move.SPR.pnn,     ri->Move.SPR.zpnn, numBranches); 
+  hookup (ri->Move.SPR.p,             ri->Move.SPR.p->back, ri->Move.SPR.zp,   numBranches);
+  hookup (ri->Move.SPR.q,             ri->Move.SPR.r,       ri->Move.SPR.zqr,  numBranches);
+
+  rax_free (ri);
+}
+
+/** @ingroup rearrangementGroup
+    @brief Rollback an NNI move
+
+    Perform a rollback (undo) on the last NNI move.
+    
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param ri
+      Rollback information
+*/
+static void
+pllRollbackNNI (pllInstance * tr, partitionList * pr, pllRollbackInfo * ri)
+{
+  nodeptr p = ri->Move.NNI.origin;
+
+  pllTopologyPerformNNI (tr, p, ri->Move.NNI.swapType);
+  pllUpdatePartials (tr, pr, p,       PLL_FALSE);
+  pllUpdatePartials (tr, pr, p->back, PLL_FALSE);
+  update (tr, pr, p);
+  pllEvaluateLikelihood (tr, pr, p, PLL_FALSE, PLL_FALSE);
+  
+  rax_free (ri);
+}
+
+/** @ingroup rearrangementGroup
+    @brief Rollback the last committed rearrangement move
+    
+    Perform a rollback (undo) on the last committed rearrangement move.
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @return
+      Returns \b PLL_TRUE is the rollback was successful, otherwise \b PLL_FALSE
+      (if no rollback was done)
+*/
+int 
+pllRearrangeRollback (pllInstance * tr, partitionList * pr)
+{
+  pllRollbackInfo * ri;
+  
+  ri = (pllRollbackInfo *) pllStackPop (&(tr->rearrangeHistory));
+  if (!ri) return (PLL_FALSE);
+
+  switch (ri->rearrangeType)
+   {
+     case PLL_REARRANGE_NNI:
+       pllRollbackNNI (tr, pr, ri);
+       break;
+     case PLL_REARRANGE_SPR:
+       pllRollbackSPR (pr, ri);
+       break;
+     default:
+       rax_free (ri);
+       return (PLL_FALSE);
+   }
+
+  return (PLL_TRUE);
+  
+}
+
+
+/** @ingroup rearrangementGroup
+    @brief Commit a rearrangement move
+
+    Applies the rearrangement move specified in \a rearr to the tree topology in \a tr. 
+    In case of SPR moves, if
+    \a tr->thoroughInsertion is set to \b PLL_TRUE, the new branch lengths are also optimized. 
+    The function stores rollback information in pllInstance::rearrangeHistory if \a saveRollbackInfo
+    is set to \b PLL_TRUE. This way, the rearrangement move can be rolled back (undone) by calling
+    ::pllRearrangeRollback
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param rearr
+      An element of a \a pllRearrangeInfo structure that contains information about the rearrangement move
+
+    @param saveRollbackInfo
+      If set to \b PLL_TRUE, rollback info will be kept for undoing the rearrangement move
+*/
+void
+pllRearrangeCommit (pllInstance * tr, partitionList * pr, pllRearrangeInfo * rearr, int saveRollbackInfo)
+{
+  int numBranches;
+
+  numBranches = pr->perGeneBranchLengths ? pr->numberOfPartitions : 1;
+
+  if (saveRollbackInfo)
+    pllCreateRollbackInfo (tr, rearr, numBranches);
+
+  switch (rearr->rearrangeType)
+   {
+     case PLL_REARRANGE_NNI:
+       pllTopologyPerformNNI(tr, rearr->Move.NNI.originNode, rearr->Move.NNI.swapType);
+       pllUpdatePartials (tr, pr, rearr->Move.NNI.originNode, PLL_FALSE);
+       pllUpdatePartials (tr, pr, rearr->Move.NNI.originNode->back, PLL_FALSE);
+       update (tr, pr, rearr->Move.NNI.originNode);
+       pllEvaluateLikelihood (tr, pr, rearr->Move.NNI.originNode, PLL_FALSE, PLL_FALSE);
+       break;
+     case PLL_REARRANGE_SPR:
+       removeNodeBIG (tr, pr, rearr->Move.SPR.removeNode, numBranches);
+       insertBIG     (tr, pr, rearr->Move.SPR.removeNode, rearr->Move.SPR.insertNode);
+       break;
+     default:
+       break;
+   }
+}
+
+
+/******** new rearrangement functions ****************/
+
+/* change this to return the number of new elements in the list */
+/** @ingroup rearrangementGroup
+    @brief Search for rearrangement topologies
+    
+    Search for possible rearrangement moves of type \a rearrangeType in the
+    annular area defined by the minimal resp. maximal radii \a mintrav resp.
+    \a maxtrav. If the resulting likelihood is better than the current, try
+    to insert the move specification in \a bestList, which is a sorted list
+    that holds the rearrange info of the best moves sorted by likelihood
+    (desccending order).
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param rearrangeType
+      Type of rearrangement. Can be \b PLL_REARRANGE_SPR or \b PLL_REARRANGE_NNI
+
+    @param p
+      Point of origin, i.e. where to start searching from
+
+    @param mintrav
+      The minimal radius of the annulus
+
+    @param maxtrav
+      The maximal radius of the annulus
+
+    @param bestList
+      List that holds the details of the best rearrangement moves found
+
+    @note
+      If \a bestList is not empty, the existing entries will not be altered unless
+      better rearrangement moves (that means yielding better likelihood) are found
+      and the list is full, in which case the entries with the worst likelihood will be
+      thrown away.
+*/
+void
+pllRearrangeSearch (pllInstance * tr, partitionList * pr, int rearrangeType, nodeptr p, int mintrav, int maxtrav, pllRearrangeList * bestList)
+{
+  switch (rearrangeType)
+   {
+     case PLL_REARRANGE_SPR:
+       pllComputeSPR (tr, pr, p, mintrav, maxtrav, bestList);
+       break;
+
+     case PLL_REARRANGE_NNI:
+       pllSearchNNI (tr, pr, p, mintrav, maxtrav, bestList);
+       break;
+
+     case PLL_REARRANGE_TBR:
+       break;
+     default:
+       break;
+   }
+}
+
+
+static int
+determineRearrangementSetting(pllInstance *tr, partitionList *pr,
+    bestlist *bestT, bestlist *bt)
+{
+  int i, mintrav, maxtrav, bestTrav, impr, index, MaxFast, *perm = (int*) NULL;
+  double startLH;
+  boolean cutoff;
+
+  MaxFast = 26;
+
+  startLH = tr->likelihood;
+
+  cutoff = tr->doCutoff;
+  tr->doCutoff = PLL_FALSE;
+
+  mintrav = 1;
+  maxtrav = 5;
+
+  bestTrav = maxtrav = 5;
+
+  impr = 1;
+
+  resetBestTree(bt);
+
+  if (tr->permuteTreeoptimize)
+    {
+      int n = tr->mxtips + tr->mxtips - 2;
+      perm = (int *) rax_malloc(sizeof(int) * (n + 1));
+      makePermutation(perm, n, tr);
+    }
+
+  while (impr && maxtrav < MaxFast)
+    {
+      recallBestTree(bestT, 1, tr, pr);
+      nodeRectifier(tr);
+
+      if (maxtrav > tr->ntips - 3)
+        maxtrav = tr->ntips - 3;
+
+      tr->startLH = tr->endLH = tr->likelihood;
+
+      for (i = 1; i <= tr->mxtips + tr->mxtips - 2; i++)
+        {
+
+          if (tr->permuteTreeoptimize)
+            index = perm[i];
+          else
+            index = i;
+
+          tr->bestOfNode = PLL_UNLIKELY;
+          if (rearrangeBIG(tr, pr, tr->nodep[index], mintrav, maxtrav))
+            {
+              if (tr->endLH > tr->startLH)
+                {
+                  restoreTreeFast(tr, pr);
+                  tr->startLH = tr->endLH = tr->likelihood;
+                }
+            }
+        }
+
+      pllOptimizeBranchLengths(tr, pr, 8);
+      saveBestTree(bt, tr,
+          pr->perGeneBranchLengths ? pr->numberOfPartitions : 1);
+
+      if (tr->likelihood > startLH)
+        {
+          startLH = tr->likelihood;
+          bestTrav = maxtrav;
+          impr = 1;
+        }
+      else
+        {
+          impr = 0;
+        }
+      maxtrav += 5;
+
+      if (tr->doCutoff)
+        {
+          tr->lhCutoff = (tr->lhAVG) / ((double) (tr->lhDEC));
+
+          tr->itCount = tr->itCount + 1;
+          tr->lhAVG = 0;
+          tr->lhDEC = 0;
+        }
+    }
+
+  recallBestTree(bt, 1, tr, pr);
+  tr->doCutoff = cutoff;
+
+  if (tr->permuteTreeoptimize)
+    rax_free(perm);
+
+  return bestTrav;
+}
+
+
+static void hash_dealloc_bipentry (void * entry)
+{
+  pllBipartitionEntry * e = (pllBipartitionEntry *)entry;
+
+  if(e->bitVector)     rax_free(e->bitVector);
+  if(e->treeVector)    rax_free(e->treeVector);
+  if(e->supportVector) rax_free(e->supportVector);
+
+}
+
+/** @ingroup rearrangementGroup
+    @brief RAxML algorithm for ML search
+
+    RAxML algorithm for searching the Maximum Likelihood tree and model.
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @param estimateModel
+      If true, model parameters are optimized in a ML framework.
+
+    @note
+      For datasets with a large number of taxa, setting tr->searchConvergenceCriterion to
+    PLL_TRUE can improve the execution time in up to 50% looking for topology convergence.
+*/
+int
+pllRaxmlSearchAlgorithm(pllInstance * tr, partitionList * pr,
+    boolean estimateModel)
+{
+  pllEvaluateLikelihood(tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+  pllOptimizeBranchLengths(tr, pr, 32);
+
+  unsigned int vLength = 0;
+  int i, impr, bestTrav, rearrangementsMax = 0, rearrangementsMin = 0,
+      thoroughIterations = 0, fastIterations = 0;
+
+  double lh, previousLh, difference, epsilon;
+  bestlist *bestT, *bt;
+  infoList iList;
+  pllOptimizeBranchLengths(tr, pr, 32);
+
+  pllHashTable *h = NULL;
+  //hashtable *h = NULL;
+  unsigned int **bitVectors = (unsigned int**) NULL;
+
+  /* Security check... These variables might have not been initialized! */
+  if (tr->stepwidth == 0) tr->stepwidth = 5;
+  if (tr->max_rearrange == 0) tr->max_rearrange = 21;
+
+  if (tr->searchConvergenceCriterion)
+    {
+      bitVectors = initBitVector(tr->mxtips, &vLength);
+      //h = initHashTable(tr->mxtips * 4);
+      h = pllHashInit (tr->mxtips * 4);
+    }
+
+  bestT = (bestlist *) rax_malloc(sizeof(bestlist));
+  bestT->ninit = 0;
+  initBestTree(bestT, 1, tr->mxtips);
+
+  bt = (bestlist *) rax_malloc(sizeof(bestlist));
+  bt->ninit = 0;
+  initBestTree(bt, 20, tr->mxtips);
+
+  initInfoList(&iList, 50);
+
+  difference = 10.0;
+  epsilon = tr->likelihoodEpsilon;
+
+  tr->thoroughInsertion = 0;
+
+  if (estimateModel)
+    {
+      pllEvaluateLikelihood(tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+      pllOptimizeModelParameters(tr, pr, 10.0);
+    }
+  else
+    pllOptimizeBranchLengths(tr, pr, 64);
+
+  saveBestTree(bestT, tr,
+      pr->perGeneBranchLengths ? pr->numberOfPartitions : 1);
+
+  if (!tr->initialSet)
+    bestTrav = tr->bestTrav = determineRearrangementSetting(tr, pr, bestT, bt);
+  else
+    bestTrav = tr->bestTrav = tr->initial;
+
+  if (estimateModel)
+    {
+      pllEvaluateLikelihood(tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+      pllOptimizeModelParameters(tr, pr, 5.0);
+    }
+  else
+    pllOptimizeBranchLengths(tr, pr, 32);
+
+  saveBestTree(bestT, tr,
+      pr->perGeneBranchLengths ? pr->numberOfPartitions : 1);
+  impr = 1;
+  if (tr->doCutoff)
+    tr->itCount = 0;
+
+  while (impr)
+    {
+      recallBestTree(bestT, 1, tr, pr);
+
+      if (tr->searchConvergenceCriterion)
+        {
+          int bCounter = 0;
+
+          if (fastIterations > 1)
+            cleanupHashTable(h, (fastIterations % 2));
+
+          bitVectorInitravSpecial(bitVectors, tr->nodep[1]->back, tr->mxtips,
+              vLength, h, fastIterations % 2, PLL_BIPARTITIONS_RF,
+              (branchInfo *) NULL, &bCounter, 1, PLL_FALSE, PLL_FALSE, 0);
+
+          assert(bCounter == tr->mxtips - 3);
+
+          if (fastIterations > 0)
+            {
+              double rrf = convergenceCriterion(h, tr->mxtips);
+
+              if (rrf <= 0.01) /* 1% cutoff */
+                {
+                  cleanupHashTable(h, 0);
+                  cleanupHashTable(h, 1);
+                  goto cleanup_fast;
+                }
+            }
+        }
+
+      fastIterations++;
+
+      pllOptimizeBranchLengths(tr, pr, 32);
+
+      saveBestTree(bestT, tr,
+          pr->perGeneBranchLengths ? pr->numberOfPartitions : 1);
+
+      lh = previousLh = tr->likelihood;
+
+      treeOptimizeRapid(tr, pr, 1, bestTrav, bt, &iList);
+
+      impr = 0;
+
+      for (i = 1; i <= bt->nvalid; i++)
+        {
+          recallBestTree(bt, i, tr, pr);
+
+          pllOptimizeBranchLengths(tr, pr, 8);
+
+          difference = (
+              (tr->likelihood > previousLh) ?
+                  tr->likelihood - previousLh : previousLh - tr->likelihood);
+          if (tr->likelihood > lh && difference > epsilon)
+            {
+              impr = 1;
+              lh = tr->likelihood;
+              saveBestTree(bestT, tr,
+                  pr->perGeneBranchLengths ? pr->numberOfPartitions : 1);
+            }
+        }
+    }
+
+  if (tr->searchConvergenceCriterion)
+    {
+      cleanupHashTable(h, 0);
+      cleanupHashTable(h, 1);
+    }
+
+  cleanup_fast:
+
+  tr->thoroughInsertion = 1;
+  impr = 1;
+
+  recallBestTree(bestT, 1, tr, pr);
+  if (estimateModel)
+    {
+      pllEvaluateLikelihood(tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+      pllOptimizeModelParameters(tr, pr, 1.0);
+    }
+  else
+    pllOptimizeBranchLengths(tr, pr, 32);
+
+  while (1)
+    {
+      recallBestTree(bestT, 1, tr, pr);
+      if (impr)
+        {
+          rearrangementsMin = 1;
+          rearrangementsMax = tr->stepwidth;
+
+          if (tr->searchConvergenceCriterion)
+            {
+              int bCounter = 0;
+
+              if (thoroughIterations > 1)
+                cleanupHashTable(h, (thoroughIterations % 2));
+
+              bitVectorInitravSpecial(bitVectors, tr->nodep[1]->back,
+                  tr->mxtips, vLength, h, thoroughIterations % 2,
+                  PLL_BIPARTITIONS_RF, (branchInfo *) NULL, &bCounter, 1,
+                  PLL_FALSE, PLL_FALSE, 0);
+
+              assert(bCounter == tr->mxtips - 3);
+
+              if (thoroughIterations > 0)
+                {
+                  double rrf = convergenceCriterion(h, tr->mxtips);
+
+                  if (rrf <= 0.01) /* 1% cutoff */
+                    {
+                      goto cleanup;
+                    }
+                }
+            }
+
+          thoroughIterations++;
+        }
+      else
+        {
+          rearrangementsMax += tr->stepwidth;
+          rearrangementsMin += tr->stepwidth;
+          if (rearrangementsMax > tr->max_rearrange)
+            goto cleanup;
+        }
+      pllOptimizeBranchLengths(tr, pr, 32);
+
+      previousLh = lh = tr->likelihood;
+      saveBestTree(bestT, tr,
+          pr->perGeneBranchLengths ? pr->numberOfPartitions : 1);
+
+      treeOptimizeRapid(tr, pr, rearrangementsMin, rearrangementsMax, bt,
+          &iList);
+
+      impr = 0;
+
+      for (i = 1; i <= bt->nvalid; i++)
+        {
+          recallBestTree(bt, i, tr, pr);
+
+          pllOptimizeBranchLengths(tr, pr, 8);
+
+          difference = (
+              (tr->likelihood > previousLh) ?
+                  tr->likelihood - previousLh : previousLh - tr->likelihood);
+          if (tr->likelihood > lh && difference > epsilon)
+            {
+              impr = 1;
+              lh = tr->likelihood;
+              saveBestTree(bestT, tr,
+                  pr->perGeneBranchLengths ? pr->numberOfPartitions : 1);
+            }
+        }
+
+    }
+
+  cleanup:
+  if (tr->searchConvergenceCriterion)
+    {
+      freeBitVectors(bitVectors, 2 * tr->mxtips);
+      rax_free(bitVectors);
+      //freeHashTable(h);
+      //rax_free(h);
+      pllHashDestroy(&h, hash_dealloc_bipentry);
+    }
+
+  freeBestTree(bestT);
+  rax_free(bestT);
+  freeBestTree(bt);
+  rax_free(bt);
+
+  freeInfoList(&iList);
+
+  if (estimateModel) {
+      pllOptimizeModelParameters(tr, pr, epsilon);
+  }
+  pllOptimizeBranchLengths(tr, pr, 64);
+
+  return 0;
+}
+
diff --git a/lib/pll/ssort.c b/lib/pll/ssort.c
new file mode 100644
index 0000000..8ead4e6
--- /dev/null
+++ b/lib/pll/ssort.c
@@ -0,0 +1,121 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file ssort.c
+ * Detailed description to appear soon.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include "mem_alloc.h"
+
+/*  string sorting implementation from:
+ *  Bentley J. L., Sedgewick R.: Fast Algorithms for Sorting and Searching 
+ *  Strings. In Proceedings of ACM-SIAM Symposium on Discrete Algorithms 
+ *  (SODA) 1997.
+ */
+
+static void 
+vecswap (int i, int j, int n, char ** x, int * oi)
+{
+  while (n-- > 0)
+   {
+     PLL_SWAP (x[i], x[j]);
+     PLL_SWAP (oi[i], oi[j]);
+
+     ++ i; ++ j;
+   }
+}
+
+static void 
+ssort1 (char ** x, int n, int depth, int * oi)
+{
+  int           a, b, c, d, r, v;
+
+  if (n <= 1) return;
+
+  a = rand() % n;
+
+  PLL_SWAP (x[0], x[a]);
+  PLL_SWAP (oi[0], oi[a]);
+
+  v = x[0][depth];
+
+  a = b = 1;
+  c = d = n - 1;
+
+  for (;;)
+   {
+     while (b <= c && (r = x[b][depth] - v) <= 0)
+      {
+        if (r == 0)
+         {
+           PLL_SWAP (x[a], x[b]);
+           PLL_SWAP (oi[a], oi[b]);
+           ++ a;
+         }
+        ++ b;
+      }
+     while (b <= c && (r = x[c][depth] - v) >= 0)
+      {
+        if (r == 0)
+         {
+           PLL_SWAP (x[c], x[d]);
+           PLL_SWAP (oi[c], oi[d]);
+           -- d;
+         }
+        -- c;
+      }
+     if (b > c) break;
+     PLL_SWAP (x[b], x[c]);
+     PLL_SWAP (oi[b], oi[c]);
+     ++ b; -- c;
+   }
+  r = PLL_MIN (a,     b - a);      vecswap (0, b - r, r, x, oi);
+  r = PLL_MIN (d - c, n - d - 1);  vecswap (b, n - r, r, x, oi);
+  r = b - a; ssort1 (x, r, depth, oi);
+  if (x[r][depth] != 0)
+   {
+     ssort1 (x + r, a + n - d - 1, depth + 1, oi + r);
+   }
+  r = d - c; ssort1 (x + n - r, r, depth, oi + n - r);
+}
+
+int * 
+pllssort1main (char ** x, int n)
+{
+  int * oi;
+  int i;
+
+  oi = (int *) rax_malloc (n * sizeof (int));
+  for (i = 0; i < n; ++ i)
+   {
+     oi[i] = i;
+   }
+  ssort1 (x, n, 0, oi);
+  
+  return (oi);
+}
+
diff --git a/lib/pll/stack.c b/lib/pll/stack.c
new file mode 100644
index 0000000..062cf2e
--- /dev/null
+++ b/lib/pll/stack.c
@@ -0,0 +1,85 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file stack.c
+ * @brief Generic stack implementation
+ *
+ * Detailed description to appear soon.
+ */
+#include <stdio.h>
+#include "stack.h"
+#include "mem_alloc.h"
+
+int pllStackSize (pllStack ** stack)
+{
+  pllStack * top;
+  int size = 0;
+  top = *stack;
+ 
+  while (top)
+  {
+    ++ size;
+    top = top->next;
+  }
+  
+  return (size);
+}
+
+int 
+pllStackPush (pllStack ** head, void * item)
+{
+  pllStack * new;
+ 
+  new = (pllStack *) rax_malloc (sizeof (pllStack));
+  if (!new) return (0);
+ 
+  new->item = item;
+  new->next = *head;
+  *head     = new;
+ 
+  return (1);
+}
+
+void * pllStackPop (pllStack ** head)
+{
+  void * item;
+  pllStack * tmp;
+  if (!*head) return (NULL);
+ 
+  tmp     = (*head);
+  item    = (*head)->item;
+  (*head) = (*head)->next;
+  rax_free (tmp);
+ 
+  return (item);
+}
+ 
+void 
+pllStackClear (pllStack ** stack)
+{
+  while (*stack) pllStackPop (stack);
+}
+
diff --git a/lib/pll/stack.h b/lib/pll/stack.h
new file mode 100644
index 0000000..2ec64bd
--- /dev/null
+++ b/lib/pll/stack.h
@@ -0,0 +1,48 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file stack.h
+ * @brief Generic stack implementation
+ *
+ * Detailed description to appear soon.
+ */
+#ifndef __pll_STACK__
+#define __pll_STACK__
+
+struct pllStack
+{
+  void * item;
+  struct pllStack * next;
+};
+
+typedef struct pllStack pllStack;
+
+void  pllStackClear (pllStack ** stack);
+void * pllStackPop (pllStack ** head);
+int pllStackPush (pllStack ** head, void * item);
+int pllStackSize (pllStack ** stack);
+
+#endif
diff --git a/lib/pll/topologies.c b/lib/pll/topologies.c
new file mode 100644
index 0000000..cb90633
--- /dev/null
+++ b/lib/pll/topologies.c
@@ -0,0 +1,782 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file topologies.c
+ * @brief Miscellanous functions working with tree topology
+*/
+#include "mem_alloc.h"
+
+#ifndef WIN32
+#include <sys/times.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <unistd.h> 
+#endif
+
+#include <math.h>
+#include <time.h> 
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+
+#include "pll.h"
+#include "pllInternal.h"
+#include "globalVariables.h"
+
+
+extern int PLL_NUM_BRANCHES; 
+
+static void saveTopolRELLRec(pllInstance *tr, nodeptr p, topolRELL *tpl, int *i, int numsp)
+{
+  int k;
+  if(isTip(p->number, numsp))
+    return;
+  else
+    {
+      nodeptr q = p->next;      
+      while(q != p)
+	{	  
+	  tpl->connect[*i].p = q;
+	  tpl->connect[*i].q = q->back; 
+	  
+	  if(tr->grouped ||  tr->constrained)
+	    {
+	      tpl->connect[*i].cp = tr->constraintVector[q->number];
+	      tpl->connect[*i].cq = tr->constraintVector[q->back->number]; 
+	    }
+	  
+	  for(k = 0; k < PLL_NUM_BRANCHES; k++)
+	    tpl->connect[*i].z[k] = q->z[k];
+	  *i = *i + 1;
+
+	  saveTopolRELLRec(tr, q->back, tpl, i, numsp);
+	  q = q->next;
+	}
+    }
+}
+
+static void saveTopolRELL(pllInstance *tr, topolRELL *tpl)
+{
+  nodeptr p = tr->start;
+  int k, i = 0;
+      
+  tpl->likelihood = tr->likelihood;
+  tpl->start      = 1;
+      
+  tpl->connect[i].p = p;
+  tpl->connect[i].q = p->back;
+  
+  if(tr->grouped ||  tr->constrained)
+    {
+      tpl->connect[i].cp = tr->constraintVector[p->number];
+      tpl->connect[i].cq = tr->constraintVector[p->back->number]; 
+    }
+
+  for(k = 0; k < PLL_NUM_BRANCHES; k++)
+    tpl->connect[i].z[k] = p->z[k];
+  i++;
+      
+  saveTopolRELLRec(tr, p->back, tpl, &i, tr->mxtips);
+
+  assert(i == 2 * tr->mxtips - 3);
+}
+
+
+static void restoreTopolRELL(pllInstance *tr, topolRELL *tpl, int numBranches)
+{
+  int i;
+  
+  for (i = 0; i < 2 * tr->mxtips - 3; i++) 
+    {
+      hookup(tpl->connect[i].p, tpl->connect[i].q, tpl->connect[i].z,  numBranches);
+      tr->constraintVector[tpl->connect[i].p->number] = tpl->connect[i].cp;
+      tr->constraintVector[tpl->connect[i].q->number] = tpl->connect[i].cq;
+    }
+  
+
+  tr->likelihood = tpl->likelihood;
+  tr->start      = tr->nodep[tpl->start];
+  /* TODO */
+}
+
+
+
+/** @brief Initializes space as large as the tree
+  *
+  * @param rl
+  *   RELL 
+  *
+  * @param tr
+  *   PLL instance
+  *
+  * @param n
+  *   Number of
+  *
+  * @todo
+  *   Don't know what is this used for. Something with RELL?
+  *
+  */
+void initTL(topolRELL_LIST *rl, pllInstance *tr, int n)
+{
+  int i;
+
+  rl->max = n; 
+  rl->t = (topolRELL **)rax_malloc(sizeof(topolRELL *) * n);
+
+  for(i = 0; i < n; i++)
+    {
+      rl->t[i] = (topolRELL *)rax_malloc(sizeof(topolRELL));
+      rl->t[i]->connect = (connectRELL *)rax_malloc((2 * tr->mxtips - 3) * sizeof(connectRELL));
+      rl->t[i]->likelihood = PLL_UNLIKELY;     
+    }
+}
+
+/** @brief Deallocate the space associated with this structure
+  *
+  * @paral rl
+  *   This structure
+  *
+  * @todo
+  *   fill the description
+  */
+void freeTL(topolRELL_LIST *rl)
+{
+  int i;
+  for(i = 0; i < rl->max; i++)    
+    {
+      rax_free(rl->t[i]->connect);          
+      rax_free(rl->t[i]);
+    }
+  rax_free(rl->t);
+}
+
+
+void restoreTL(topolRELL_LIST *rl, pllInstance *tr, int n, int numBranches)
+{
+  assert(n >= 0 && n < rl->max);    
+
+  restoreTopolRELL(tr, rl->t[n], numBranches);
+}
+
+
+
+/** @brief Reset this structure
+  *
+  * Reset the likelihoods in this structure
+  *
+  * @param rl
+  *   This structure
+  *
+  * @todo
+  *   Complete this
+  */
+void resetTL(topolRELL_LIST *rl)
+{
+  int i;
+
+  for(i = 0; i < rl->max; i++)    
+    rl->t[i]->likelihood = PLL_UNLIKELY;          
+}
+
+
+
+/** @brief Save 
+  *
+  * Save this topology?
+  *
+  * @todo 
+  *  Complete this
+  */
+void saveTL(topolRELL_LIST *rl, pllInstance *tr, int index)
+{ 
+  assert(index >= 0 && index < rl->max);    
+    
+  if(tr->likelihood > rl->t[index]->likelihood)        
+    saveTopolRELL(tr, rl->t[index]); 
+}
+
+
+static void  *tipValPtr (nodeptr p)
+{ 
+  return  (void *) & p->number;
+}
+
+
+static int  cmpTipVal (void *v1, void *v2)
+{
+  int  i1, i2;
+  
+  i1 = *((int *) v1);
+  i2 = *((int *) v2);
+  return  (i1 < i2) ? -1 : ((i1 == i2) ? 0 : 1);
+}
+
+
+/*  These are the only routines that need to UNDERSTAND topologies */
+
+/** @brief Allocate and initialize space for a tree topology
+    
+    Allocate and initialize a \a topol structure for a tree topology of
+    \a maxtips tips
+
+    @param
+      Number of tips of topology
+
+    @return
+      Pointer to the allocated \a topol structure
+*/
+static topol  *setupTopol (int maxtips)
+{
+  topol   *tpl;
+
+  if (! (tpl = (topol *) rax_malloc(sizeof(topol))) || 
+      ! (tpl->links = (connptr) rax_malloc((2*maxtips-3) * sizeof(connect))))
+    {
+      printf("ERROR: Unable to get topology memory");
+      tpl = (topol *) NULL;
+    }
+  else 
+    {
+      tpl->likelihood  = PLL_UNLIKELY;
+      tpl->start       = (node *) NULL;
+      tpl->nextlink    = 0;
+      tpl->ntips       = 0;
+      tpl->nextnode    = 0;    
+      tpl->scrNum      = 0;     /* position in sorted list of scores */
+      tpl->tplNum      = 0;     /* position in sorted list of trees */	      
+    }
+  
+  return  tpl;
+} 
+
+
+/** @brief Deallocate the space occupied by a \a topol structure
+    
+    Deallocate the space occupied by a \a topol structure
+
+    @param tpl
+      The \a topol structure that is to be deallocated
+*/
+static void  freeTopol (topol *tpl)
+{
+  rax_free(tpl->links);
+  rax_free(tpl);
+} 
+
+
+static int saveSubtree (nodeptr p, topol *tpl, int numsp, int numBranches)  
+{
+  connptr  r, r0;
+  nodeptr  q, s;
+  int      t, t0, t1, k;
+
+  r0 = tpl->links;
+  r = r0 + (tpl->nextlink)++;
+  r->p = p;
+  r->q = q = p->back;
+
+  for(k = 0; k < numBranches; k++)
+    r->z[k] = p->z[k];
+
+  r->descend = 0;                     /* No children (yet) */
+
+  if (isTip(q->number, numsp)) 
+    {
+      r->valptr = tipValPtr(q);         /* Assign value */
+    }
+  else 
+    {                              /* Internal node, look at children */
+      s = q->next;                      /* First child */
+      do 
+	{
+	  t = saveSubtree(s, tpl, numsp, numBranches);        /* Generate child's subtree */
+
+	  t0 = 0;                         /* Merge child into list */
+	  t1 = r->descend;
+	  while (t1 && (cmpTipVal(r0[t1].valptr, r0[t].valptr) < 0)) {
+	    t0 = t1;
+	    t1 = r0[t1].sibling;
+          }
+	  if (t0) r0[t0].sibling = t;  else  r->descend = t;
+	  r0[t].sibling = t1;
+
+	  s = s->next;                    /* Next child */
+        } while (s != q);
+
+      r->valptr = r0[r->descend].valptr;   /* Inherit first child's value */
+      }                                 /* End of internal node processing */
+
+  return  (r - r0);
+}
+
+/** @brief Get the node with the smallest tip value
+    
+    Recursively finds and returns the tip with the smallest value around a node
+    \a p0, or returns \a p0 if it is a tip.
+
+    @param p0
+      Node around which to at which the recursion starts
+
+    @param numsp
+      Number of species (tips) in the tree
+
+    @todo
+      Why do we return p0 immediately if it is a tip? Perhaps one of the two other nodes,
+      i.e. p0->next and p0->next->next, is a tip as well with a smaller number than p0.
+*/
+static nodeptr minSubtreeTip (nodeptr  p0, int numsp)
+{ 
+  nodeptr  minTip, p, testTip;
+
+  if (isTip(p0->number, numsp)) 
+    return p0;
+
+  p = p0->next;
+
+  minTip = minSubtreeTip(p->back, numsp);
+
+  while ((p = p->next) != p0) 
+    {
+      testTip = minSubtreeTip(p->back, numsp);
+      if (cmpTipVal(tipValPtr(testTip), tipValPtr(minTip)) < 0)
+        minTip = testTip;
+    }
+  return minTip;
+} 
+
+
+/** @brief
+*/
+static nodeptr  minTreeTip (nodeptr  p, int numsp)
+{
+  nodeptr  minp, minpb;
+
+  minp  = minSubtreeTip(p, numsp);
+  minpb = minSubtreeTip(p->back, numsp);
+  return (cmpTipVal(tipValPtr(minp), tipValPtr(minpb)) < 0 ? minp : minpb);
+}
+
+/** @brief Save the tree topology in a \a topol structure
+    
+    Save the current tree topology in \a topol structure \a tpl.
+
+*/
+static void saveTree (pllInstance *tr, topol *tpl, int numBranches)
+/*  Save a tree topology in a standard order so that first branches
+ *  from a node contain lower value tips than do second branches from
+ *  the node.  The root tip should have the lowest value of all.
+ */
+{
+  connptr  r;  
+  
+  tpl->nextlink = 0;                             /* Reset link pointer */
+  r = tpl->links + saveSubtree(minTreeTip(tr->start, tr->mxtips), tpl, tr->mxtips, numBranches);  /* Save tree */
+  r->sibling = 0;
+  
+  tpl->likelihood = tr->likelihood;
+  tpl->start      = tr->start;
+  tpl->ntips      = tr->ntips;
+  tpl->nextnode   = tr->nextnode;    
+  
+} /* saveTree */
+
+
+/* @brief Transform tree to a given topology and evaluate likelihood
+
+   Transform our current tree topology to the one stored in \a tpl and
+   evaluates the likelihood
+
+   @param tr
+     PLL instance
+
+   @param pr
+     List of partitions
+
+   @return
+     \b PLL_TRUE
+
+   @todo
+     Remove the return value, unnecessary
+
+*/
+static boolean restoreTree (topol *tpl, pllInstance *tr, partitionList *pr)
+{ 
+  connptr  r;
+  nodeptr  p, p0;    
+  int  i;
+
+  /* first of all set all backs to NULL so that tips do not point anywhere */
+  for (i = 1; i <= 2*(tr->mxtips) - 2; i++) 
+    {  
+      /* Uses p = p->next at tip */
+      p0 = p = tr->nodep[i];
+      do 
+	{
+	  p->back = (nodeptr) NULL;
+	  p = p->next;
+	} 
+      while (p != p0);
+    }
+
+  /*  Copy connections from topology */
+
+  /* then connect the nodes together */
+  for (r = tpl->links, i = 0; i < tpl->nextlink; r++, i++)     
+    hookup(r->p, r->q, r->z, pr->perGeneBranchLengths?pr->numberOfPartitions:1);
+
+  tr->likelihood = tpl->likelihood;
+  tr->start      = tpl->start;
+  tr->ntips      = tpl->ntips;
+  
+  tr->nextnode   = tpl->nextnode;    
+
+  pllEvaluateLikelihood (tr, pr, tr->start, PLL_TRUE, PLL_FALSE);
+  return PLL_TRUE;
+}
+
+
+
+/** @brief Initialize a list of best trees
+    
+    Initialize a list that will contain the best \a newkeep tree topologies,
+    i.e. the ones that yield the best likelihood. Inside the list initialize
+    space for \a newkeep + 1 topologies of \a numsp tips. The additional
+    topology is the starting one
+
+    @param bt
+      Pointer to \a bestlist to be initialized
+
+    @param newkeep
+      Number of new topologies to keep
+
+    @param numsp
+      Number of species (tips)
+
+    @return
+      number of tree topology slots in the list (minus the starting one)
+
+    @todo
+      Is there a reason that this function is so complex? Many of the checks
+      are unnecessary as the function is called only at two places in the
+      code with newkeep=1 and newkeep=20
+*/
+int initBestTree (bestlist *bt, int newkeep, int numsp)
+{ /* initBestTree */
+  int  i;
+
+  bt->nkeep = 0;
+
+  if (bt->ninit <= 0) 
+    {
+      if (! (bt->start = setupTopol(numsp)))  return  0;
+      bt->ninit    = -1;
+      bt->nvalid   = 0;
+      bt->numtrees = 0;
+      bt->best     = PLL_UNLIKELY;
+      bt->improved = PLL_FALSE;
+      bt->byScore  = (topol **) rax_malloc((newkeep + 1) * sizeof(topol *));
+      bt->byTopol  = (topol **) rax_malloc((newkeep + 1) * sizeof(topol *));
+      if (! bt->byScore || ! bt->byTopol) {
+        printf( "initBestTree: malloc failure\n");
+        return 0;
+      }
+    }
+  else if (PLL_ABS(newkeep) > bt->ninit) {
+    if (newkeep <  0) newkeep = -(bt->ninit);
+    else newkeep = bt->ninit;
+  }
+
+  if (newkeep < 1) {    /*  Use negative newkeep to clear list  */
+    newkeep = -newkeep;
+    if (newkeep < 1) newkeep = 1;
+    bt->nvalid = 0;
+    bt->best = PLL_UNLIKELY;
+  }
+  
+  if (bt->nvalid >= newkeep) {
+    bt->nvalid = newkeep;
+    bt->worst = bt->byScore[newkeep]->likelihood;
+  }
+  else 
+    {
+      bt->worst = PLL_UNLIKELY;
+    }
+  
+  for (i = bt->ninit + 1; i <= newkeep; i++) 
+    {    
+      if (! (bt->byScore[i] = setupTopol(numsp)))  break;
+      bt->byTopol[i] = bt->byScore[i];
+      bt->ninit = i;
+    }
+  
+  return  (bt->nkeep = PLL_MIN(newkeep, bt->ninit));
+} /* initBestTree */
+
+
+
+void resetBestTree (bestlist *bt)
+{ /* resetBestTree */
+  bt->best     = PLL_UNLIKELY;
+  bt->worst    = PLL_UNLIKELY;
+  bt->nvalid   = 0;
+  bt->improved = PLL_FALSE;
+} /* resetBestTree */
+
+
+boolean  freeBestTree(bestlist *bt)
+{ /* freeBestTree */
+  while (bt->ninit >= 0)  freeTopol(bt->byScore[(bt->ninit)--]);
+    
+  /* VALGRIND */
+
+  rax_free(bt->byScore);
+  rax_free(bt->byTopol);
+
+  /* VALGRIND END */
+
+  freeTopol(bt->start);
+  return PLL_TRUE;
+} /* freeBestTree */
+
+
+/*  Compare two trees, assuming that each is in standard order.  Return
+ *  -1 if first preceeds second, 0 if they are identical, or +1 if first
+ *  follows second in standard order.  Lower number tips preceed higher
+ *  number tips.  A tip preceeds a corresponding internal node.  Internal
+ *  nodes are ranked by their lowest number tip.
+ */
+
+static int  cmpSubtopol (connptr p10, connptr p1, connptr p20, connptr p2)
+{
+  connptr  p1d, p2d;
+  int  cmp;
+  
+  if (! p1->descend && ! p2->descend)          /* Two tips */
+    return cmpTipVal(p1->valptr, p2->valptr);
+  
+  if (! p1->descend) return -1;                /* p1 = tip, p2 = node */
+  if (! p2->descend) return  1;                /* p2 = tip, p1 = node */
+  
+  p1d = p10 + p1->descend;
+  p2d = p20 + p2->descend;
+  while (1) {                                  /* Two nodes */
+    if ((cmp = cmpSubtopol(p10, p1d, p20, p2d)))  return cmp; /* Subtrees */
+    if (! p1d->sibling && ! p2d->sibling)  return  0; /* Lists done */
+    if (! p1d->sibling) return -1;             /* One done, other not */
+    if (! p2d->sibling) return  1;             /* One done, other not */
+    p1d = p10 + p1d->sibling;                  /* Neither done */
+    p2d = p20 + p2d->sibling;
+  }
+}
+
+
+
+static int  cmpTopol (void *tpl1, void *tpl2)
+{ 
+  connptr  r1, r2;
+  int      cmp;    
+  
+  r1 = ((topol *) tpl1)->links;
+  r2 = ((topol *) tpl2)->links;
+  cmp = cmpTipVal(tipValPtr(r1->p), tipValPtr(r2->p));
+  if (cmp)      	
+    return cmp;     
+  return  cmpSubtopol(r1, r1, r2, r2);
+} 
+
+
+
+static int  cmpTplScore (void *tpl1, void *tpl2)
+{ 
+  double  l1, l2;
+  
+  l1 = ((topol *) tpl1)->likelihood;
+  l2 = ((topol *) tpl2)->likelihood;
+  return  (l1 > l2) ? -1 : ((l1 == l2) ? 0 : 1);
+}
+
+
+
+/*  Find an item in a sorted list of n items.  If the item is in the list,
+ *  return its index.  If it is not in the list, return the negative of the
+ *  position into which it should be inserted.
+ */
+
+static int  findInList (void *item, void *list[], int n, int (* cmpFunc)(void *, void *))
+{
+  int  mid, hi, lo, cmp = 0;
+  
+  if (n < 1) return  -1;                    /*  No match; first index  */
+  
+  lo = 1;
+  mid = 0;
+  hi = n;
+  while (lo < hi) {
+    mid = (lo + hi) >> 1;
+    cmp = (* cmpFunc)(item, list[mid-1]);
+    if (cmp) {
+      if (cmp < 0) hi = mid;
+      else lo = mid + 1;
+    }
+    else  return  mid;                        /*  Exact match  */
+  }
+  
+  if (lo != mid) {
+    cmp = (* cmpFunc)(item, list[lo-1]);
+    if (cmp == 0) return lo;
+  }
+  if (cmp > 0) lo++;                         /*  Result of step = 0 test  */
+  return  -lo;
+} 
+
+
+
+static int  findTreeInList (bestlist *bt, pllInstance *tr, int numBranches)
+{
+  topol  *tpl;
+  
+  tpl = bt->byScore[0];
+  saveTree(tr, tpl, numBranches);
+  return  findInList((void *) tpl, (void **) (& (bt->byTopol[1])),
+		     bt->nvalid, cmpTopol);
+} 
+
+
+/** @brief Save the current tree in the \a bestlist structure
+    
+    Save the current tree topology in \a bestlist structure \a bt.
+
+    @param tr
+      The PLL instance
+    
+    @param bt
+      The \a bestlist structure
+    
+    @param numBranches
+      Number of branches u
+
+    @return
+      it is never used
+
+    @todo
+      What to do with the return value? Should we simplify the code?
+*/
+int  saveBestTree (bestlist *bt, pllInstance *tr, int numBranches)
+{    
+  topol  *tpl, *reuse;
+  int  tplNum, scrNum, reuseScrNum, reuseTplNum, i, oldValid, newValid;
+  
+  tplNum = findTreeInList(bt, tr, numBranches);
+  tpl = bt->byScore[0];
+  oldValid = newValid = bt->nvalid;
+  
+  if (tplNum > 0) {                      /* Topology is in list  */
+    reuse = bt->byTopol[tplNum];         /* Matching topol  */
+    reuseScrNum = reuse->scrNum;
+    reuseTplNum = reuse->tplNum;
+  }
+  /* Good enough to keep? */
+  else if (tr->likelihood < bt->worst)  return 0;
+  
+  else {                                 /* Topology is not in list */
+    tplNum = -tplNum;                    /* Add to list (not replace) */
+    if (newValid < bt->nkeep) bt->nvalid = ++newValid;
+    reuseScrNum = newValid;              /* Take worst tree */
+    reuse = bt->byScore[reuseScrNum];
+    reuseTplNum = (newValid > oldValid) ? newValid : reuse->tplNum;
+    if (tr->likelihood > bt->start->likelihood) bt->improved = PLL_TRUE;
+  }
+  
+  scrNum = findInList((void *) tpl, (void **) (& (bt->byScore[1])),
+		      oldValid, cmpTplScore);
+  scrNum = PLL_ABS(scrNum);
+  
+  if (scrNum < reuseScrNum)
+    for (i = reuseScrNum; i > scrNum; i--)
+      (bt->byScore[i] = bt->byScore[i-1])->scrNum = i;
+  
+  else if (scrNum > reuseScrNum) {
+    scrNum--;
+    for (i = reuseScrNum; i < scrNum; i++)
+      (bt->byScore[i] = bt->byScore[i+1])->scrNum = i;
+  }
+  
+  if (tplNum < reuseTplNum)
+    for (i = reuseTplNum; i > tplNum; i--)
+      (bt->byTopol[i] = bt->byTopol[i-1])->tplNum = i;
+  
+  else if (tplNum > reuseTplNum) {
+    tplNum--;
+    for (i = reuseTplNum; i < tplNum; i++)
+      (bt->byTopol[i] = bt->byTopol[i+1])->tplNum = i;
+  }
+  
+  
+  
+  tpl->scrNum = scrNum;
+  tpl->tplNum = tplNum;
+  bt->byTopol[tplNum] = bt->byScore[scrNum] = tpl;
+  bt->byScore[0] = reuse;
+  
+  if (scrNum == 1)  bt->best = tr->likelihood;
+  if (newValid == bt->nkeep) bt->worst = bt->byScore[newValid]->likelihood;
+  
+  return  scrNum;
+} 
+
+
+/** @brief Restore the best tree from \a bestlist structure
+    
+    Restore the \a rank-th best tree from the \a bestlist structure \a bt.
+
+    @param bt
+      The \a bestlist structure containing the stored best trees
+
+    @param rank
+      The rank (by score) of the tree we want to retrieve
+
+    @param tr
+      PLL instance
+
+    @param pr
+      List of partitions
+
+    @return
+      Index (rank) of restored topology in \a bestlist
+*/
+int  recallBestTree (bestlist *bt, int rank, pllInstance *tr, partitionList *pr)
+{ 
+  if (rank < 1)  rank = 1;
+  if (rank > bt->nvalid)  rank = bt->nvalid;
+  if (rank > 0)  if (! restoreTree(bt->byScore[rank], tr, pr)) return PLL_FALSE;
+  return  rank;
+}
+
+
+
+
diff --git a/lib/pll/trash.c b/lib/pll/trash.c
new file mode 100644
index 0000000..5247c25
--- /dev/null
+++ b/lib/pll/trash.c
@@ -0,0 +1,129 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file trash.c
+ */
+#include "mem_alloc.h"
+
+#ifndef WIN32
+#include <sys/times.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <unistd.h>  
+#endif
+
+#include <limits.h>
+#include <math.h>
+#include <time.h> 
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+
+#include "pll.h"
+#include "pllInternal.h"
+ 
+  
+/** @brief Reorder nodes in PLL tree
+
+    Re-order the internal nodes of the tree of PLL instance \a tr in a preorder
+    traversal such that they start from \a p
+    
+    @param tr
+      PLL instance
+
+    @param np
+      Array of node pointers
+
+    @param p
+      Node from where the preorder traversal should start
+
+    @param count
+
+    @todo
+      why not insert a break in the for loop when the node is found?
+
+*/
+static void reorderNodes(pllInstance *tr, nodeptr *np, nodeptr p, int *count)
+{
+  int i, found = 0;
+
+  if(isTip(p->number, tr->mxtips))    
+    return;
+  else
+    {              
+      for(i = tr->mxtips + 1; (i <= (tr->mxtips + tr->mxtips - 1)) && (found == 0); i++)
+	{
+	  if (p == np[i] || p == np[i]->next || p == np[i]->next->next)
+	    {
+	      if(p == np[i])			       
+		tr->nodep[*count + tr->mxtips + 1] = np[i];		 		
+	      else
+		{
+		  if(p == np[i]->next)		  
+		    tr->nodep[*count + tr->mxtips + 1] = np[i]->next;		     	   
+		  else		   
+		    tr->nodep[*count + tr->mxtips + 1] = np[i]->next->next;		    		    
+		}
+
+	      found = 1;	      	     
+	      *count = *count + 1;
+	    }
+	} 
+      
+      assert(found != 0);
+     
+      reorderNodes(tr, np, p->next->back, count);     
+      reorderNodes(tr, np, p->next->next->back, count);                
+    }
+}
+
+void nodeRectifier(pllInstance *tr)
+{
+  nodeptr *np = (nodeptr *)rax_malloc(2 * tr->mxtips * sizeof(nodeptr));
+  int i;
+  int count = 0;
+  
+  tr->start       = tr->nodep[1];
+  tr->rooted      = PLL_FALSE;
+
+  /* TODO why is tr->rooted set to PLL_FALSE here ?*/
+  
+  for(i = tr->mxtips + 1; i <= (tr->mxtips + tr->mxtips - 1); i++)
+    np[i] = tr->nodep[i];           
+  
+  reorderNodes(tr, np, tr->start->back, &count); 
+
+ 
+  rax_free(np);
+}
+
+nodeptr findAnyTip(nodeptr p, int numsp)
+{ 
+  return  isTip(p->number, numsp) ? p : findAnyTip(p->next->back, numsp);
+} 
+
diff --git a/lib/pll/treeIO.c b/lib/pll/treeIO.c
new file mode 100644
index 0000000..c057372
--- /dev/null
+++ b/lib/pll/treeIO.c
@@ -0,0 +1,238 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file treeIO.c
+ */
+#include "mem_alloc.h"
+
+#include "mem_alloc.h"
+
+#ifndef WIN32
+#include <sys/times.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <unistd.h> 
+#endif
+
+#include <math.h>
+#include <time.h> 
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+
+#include "pll.h"
+#include "pllInternal.h"
+#include "globalVariables.h"
+
+extern char *likelihood_key;
+extern char *ntaxa_key;
+extern char *smoothed_key;
+extern int partCount;
+
+
+int countTips(nodeptr p, int numsp)
+{
+  if(isTip(p->number, numsp))  
+    return 1;    
+  {
+    nodeptr q;
+    int tips = 0;
+
+    q = p->next;
+    while(q != p)
+      { 
+	tips += countTips(q->back, numsp);
+	q = q->next;
+      } 
+    
+    return tips;
+  }
+}
+
+
+static double getBranchLength(pllInstance *tr, partitionList *pr, int perGene, nodeptr p)
+{
+  double 
+    z = 0.0,
+    x = 0.0;
+  int numBranches = pr->perGeneBranchLengths?pr->numberOfPartitions:1;
+
+  assert(perGene != PLL_NO_BRANCHES);
+	      
+  if(numBranches == 1)
+    {
+      assert(tr->fracchange != -1.0);
+      z = p->z[0];
+      if (z < PLL_ZMIN) 
+	z = PLL_ZMIN;      	 
+      
+      x = -log(z) * tr->fracchange;           
+    }
+  else
+    {
+      if(perGene == PLL_SUMMARIZE_LH)
+	{
+	  int 
+	    i;
+	  
+	  double 
+	    avgX = 0.0;
+		      
+	  for(i = 0; i < numBranches; i++)
+	    {
+	      assert(pr->partitionData[i]->partitionContribution != -1.0);
+	      assert(pr->partitionData[i]->fracchange != -1.0);
+	      z = p->z[i];
+	      if(z < PLL_ZMIN) 
+		z = PLL_ZMIN;      	 
+	      x = -log(z) * pr->partitionData[i]->fracchange;
+	      avgX += x * pr->partitionData[i]->partitionContribution;
+	    }
+
+	  x = avgX;
+	}
+      else
+	{	
+	  assert(pr->partitionData[perGene]->fracchange != -1.0);
+	  assert(perGene >= 0 && perGene < numBranches);
+	  
+	  z = p->z[perGene];
+	  
+	  if(z < PLL_ZMIN) 
+	    z = PLL_ZMIN;      	 
+	  
+	  x = -log(z) * pr->partitionData[perGene]->fracchange;
+	}
+    }
+
+  return x;
+}
+
+
+static char *pllTreeToNewickREC(char *treestr, pllInstance *tr, partitionList *pr, nodeptr p, boolean printBranchLengths, boolean printNames,
+			    boolean printLikelihood, boolean rellTree, boolean finalPrint, int perGene, boolean branchLabelSupport, boolean printSHSupport)
+{
+  char  *nameptr;            
+      
+  if(isTip(p->number, tr->mxtips)) 
+    {	       	  
+      if(printNames)
+	{
+	  nameptr = tr->nameList[p->number];     
+	  sprintf(treestr, "%s", nameptr);
+	}
+      else
+	sprintf(treestr, "%d", p->number);    
+	
+      while (*treestr) treestr++;
+    }
+  else 
+    {                 	 
+      *treestr++ = '(';
+      treestr = pllTreeToNewickREC(treestr, tr, pr, p->next->back, printBranchLengths, printNames, printLikelihood, rellTree,
+			       finalPrint, perGene, branchLabelSupport, printSHSupport);
+      *treestr++ = ',';
+      treestr = pllTreeToNewickREC(treestr, tr, pr, p->next->next->back, printBranchLengths, printNames, printLikelihood, rellTree,
+			       finalPrint, perGene, branchLabelSupport, printSHSupport);
+      if(p == tr->start->back) 
+	{
+	  *treestr++ = ',';
+	  treestr = pllTreeToNewickREC(treestr, tr, pr, p->back, printBranchLengths, printNames, printLikelihood, rellTree,
+				   finalPrint, perGene, branchLabelSupport, printSHSupport);
+	}
+      *treestr++ = ')';                    
+    }
+
+  if(p == tr->start->back) 
+    {	      	 
+      if(printBranchLengths && !rellTree)
+	sprintf(treestr, ":0.0;\n");
+      else
+	sprintf(treestr, ";\n");	 	  	
+    }
+  else 
+    {                   
+      if(rellTree || branchLabelSupport || printSHSupport)
+	{	 	 
+	  if(( !isTip(p->number, tr->mxtips)) && 
+	     ( !isTip(p->back->number, tr->mxtips)))
+	    {			      
+	      assert(p->bInf != (branchInfo *)NULL);
+	      
+	      if(rellTree)
+		sprintf(treestr, "%d:%8.20f", p->bInf->support, p->z[0]);
+	      if(branchLabelSupport)
+		sprintf(treestr, ":%8.20f[%d]", p->z[0], p->bInf->support);
+	      if(printSHSupport)
+		sprintf(treestr, ":%8.20f[%d]", getBranchLength(tr, pr, perGene, p), p->bInf->support);
+	      
+	    }
+	  else		
+	    {
+	      if(rellTree || branchLabelSupport)
+		sprintf(treestr, ":%8.20f", p->z[0]);	
+	      if(printSHSupport)
+		sprintf(treestr, ":%8.20f", getBranchLength(tr, pr, perGene, p));
+	    }
+	}
+      else
+	{
+	  if(printBranchLengths)	    
+	    sprintf(treestr, ":%8.20f", getBranchLength(tr, pr, perGene, p));
+	  else	    
+	    sprintf(treestr, "%s", "\0");	    
+	}      
+    }
+  
+  while (*treestr) treestr++;
+  return  treestr;
+}
+
+
+char *pllTreeToNewick(char *treestr, pllInstance *tr, partitionList *pr, nodeptr p, boolean printBranchLengths, boolean printNames, boolean printLikelihood,
+		  boolean rellTree, boolean finalPrint, int perGene, boolean branchLabelSupport, boolean printSHSupport)
+{ 
+
+  if(rellTree)
+    assert(!branchLabelSupport && !printSHSupport);
+
+  if(branchLabelSupport)
+    assert(!rellTree && !printSHSupport);
+
+  if(printSHSupport)
+    assert(!branchLabelSupport && !rellTree);
+
+ 
+  pllTreeToNewickREC(treestr, tr, pr, p, printBranchLengths, printNames, printLikelihood, rellTree,
+		 finalPrint, perGene, branchLabelSupport, printSHSupport);  
+    
+  
+  while (*treestr) treestr++;
+  
+  return treestr;
+}
diff --git a/lib/pll/treeIO.h b/lib/pll/treeIO.h
new file mode 100644
index 0000000..87e3944
--- /dev/null
+++ b/lib/pll/treeIO.h
@@ -0,0 +1,23 @@
+/*
+ * treeIO.h
+ *
+ *  Created on: Nov 22, 2012
+ *      Author: tung
+ */
+
+/*
+I just put some declarations of the functions that I need here.
+Please extend this file. It's important to have a header file.
+It make things much easier for the integration with other software.
+*/
+
+#ifndef TREEIO_H_
+#define TREEIO_H_
+
+#include "pll.h"
+
+char *pllTreeToNewick(char *treestr, tree *tr, nodeptr p, boolean printBranchLengths, boolean printNames, boolean printLikelihood,
+		  boolean rellTree, boolean finalPrint, int perGene, boolean branchLabelSupport, boolean printSHSupport);
+double getBranchLength(pllInstance *tr, partitionList *pr, int perGene, nodeptr p);
+
+#endif /* TREEIO_H_ */
diff --git a/lib/pll/utils.c b/lib/pll/utils.c
new file mode 100644
index 0000000..bf1f985
--- /dev/null
+++ b/lib/pll/utils.c
@@ -0,0 +1,3720 @@
+/** 
+ * PLL (version 1.0.0) a software library for phylogenetic inference
+ * Copyright (C) 2013 Tomas Flouri and Alexandros Stamatakis
+ *
+ * Derived from 
+ * RAxML-HPC, a program for sequential and parallel estimation of phylogenetic
+ * trees by Alexandros Stamatakis
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For any other enquiries send an Email to Tomas Flouri
+ * Tomas.Flouri at h-its.org
+ *
+ * When publishing work that uses PLL please cite PLL
+ * 
+ * @file utils.c
+ *  
+ * @brief Miscellaneous general utility and helper functions
+ */
+#ifdef WIN32
+#include <direct.h>
+#endif
+
+#ifndef WIN32
+#include <sys/times.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <unistd.h>
+#endif
+
+#include <math.h>
+#include <time.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdarg.h>
+#include <limits.h>
+#include <assert.h>
+#include <errno.h>
+#include "cycle.h"
+
+
+#if ! (defined(__ppc) || defined(__powerpc__) || defined(PPC))
+#if (defined(__AVX) || defined(__SSE3))
+#include <xmmintrin.h>
+#endif
+/*
+   special bug fix, enforces denormalized numbers to be flushed to zero,
+   without this program is a tiny bit faster though.
+#include <emmintrin.h> 
+#define MM_DAZ_MASK    0x0040
+#define MM_DAZ_ON    0x0040
+#define MM_DAZ_OFF    0x0000
+*/
+#endif
+
+#include "pll.h"
+#include "pllInternal.h"
+
+#define GLOBAL_VARIABLES_DEFINITION
+
+#include "globalVariables.h"
+
+extern int PLL_NUM_BRANCHES; 
+
+/* mappings of BIN/DNA/AA alphabet to numbers */
+
+static const char PLL_MAP_BIN[256] =
+ {
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  3, -1, -1,
+    1,  2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  3,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+  };
+
+static const char PLL_MAP_NT[256] =
+ {
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15,
+   -1,  1, 14,  2, 13, -1, -1,  4, 11, -1, -1, 12, -1,  3, 15, 15,
+   -1, -1,  5,  6,  8,  8,  7,  9, 15, 10, -1, -1, -1, -1, -1, -1,
+   -1,  1, 14,  2, 13, -1, -1,  4, 11, -1, -1, 12, -1,  3, 15, 15,
+   -1, -1,  5,  6,  8,  8,  7,  9, 15, 10, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ };
+
+static const char PLL_MAP_AA[256] =
+ {
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, 22, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22,
+   -1,  0, 20,  4,  3,  6, 13,  7,  8,  9, -1, 11, 10, 12,  2, -1,
+   14,  5,  1, 15, 16, -1, 19, 17, 22, 18, 21, -1, -1, -1, -1, -1,
+   -1,  0, 20,  4,  3,  6, 13,  7,  8,  9, -1, 11, 10, 12,  2, -1,
+   14,  5,  1, 15, 16, -1, 19, 17, 22, 18, 21, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ };
+
+
+
+
+
+static void pllTreeInitDefaults (pllInstance * tr, int tips);
+static void getInnerBranchEndPointsRecursive (nodeptr p, int tips, int * i, node **nodes);
+#if (!defined(_FINE_GRAIN_MPI) && !defined(_USE_PTHREADS))
+static void initializePartitionsSequential(pllInstance *tr, partitionList *pr);
+#endif
+
+/** @defgroup instanceLinkingGroup Linking topology, partition scheme and alignment to the PLL instance
+    
+    This set of functions handles the linking of topology, partition scheme and multiple sequence alignment
+    with the PLL instance
+*/
+/***************** UTILITY FUNCTIONS **************************/
+
+#if (!defined(_SVID_SOURCE) && !defined(_BSD_SOURCE) && !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE) && !defined(_POSIX_SOURCE))
+static char *
+my_strtok_r (char * s, const char * delim, char **save_ptr)
+{  
+  char *token;
+   
+  /* Scan leading delimiters */
+  if (s == NULL)
+    s = *save_ptr;
+   
+  s += strspn (s, delim);
+  if (*s == '\0')
+   {
+     *save_ptr = s;
+     return NULL;
+   }
+   
+  /* Find the end of the token. */
+  token = s;
+  s = strpbrk (token, delim);
+  if (!s)
+    *save_ptr = strchr (token, '\0');
+  else
+   {
+     /* Terminate the token and make *SAVE_PTR point past it */
+     *s = '\0';
+     *save_ptr = s + 1;
+   }
+   
+  return token;
+}
+#endif
+
+#if (defined(_SVID_SOURCE) || defined(_BSD_SOURCE) || defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || defined(_POSIX_SOURCE))
+#define STRTOK_R strtok_r
+#else
+#define STRTOK_R my_strtok_r
+#endif
+
+
+
+
+void storeExecuteMaskInTraversalDescriptor(pllInstance *tr, partitionList *pr)
+{
+  int model;
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+    tr->td[0].executeModel[model] = pr->partitionData[model]->executeModel;
+
+}
+
+void storeValuesInTraversalDescriptor(pllInstance *tr, partitionList *pr, double *value)
+{
+  int model;
+
+  for(model = 0; model < pr->numberOfPartitions; model++)
+    tr->td[0].parameterValues[model] = value[model];
+}
+
+const unsigned int *getBitVector(int dataType)
+{
+  assert(PLL_MIN_MODEL < dataType && dataType < PLL_MAX_MODEL);
+
+  return pLengths[dataType].bitVector;
+}
+
+/*
+int getStates(int dataType)
+{
+  assert(PLL_MIN_MODEL < dataType && dataType < PLL_MAX_MODEL);
+
+  return pLengths[dataType].states;
+}
+*/
+
+int getUndetermined(int dataType)
+{
+  assert(PLL_MIN_MODEL < dataType && dataType < PLL_MAX_MODEL);
+
+  return pLengths[dataType].undetermined;
+}
+
+const partitionLengths *getPartitionLengths(pInfo *p)
+{
+  int 
+    dataType  = p->dataType,
+              states    = p->states,
+              tipLength = p->maxTipStates;
+
+  assert(states != -1 && tipLength != -1);
+
+  assert(PLL_MIN_MODEL < dataType && dataType < PLL_MAX_MODEL);
+
+  /*pLength.leftLength = pLength.rightLength = states * states;
+    pLength.eignLength = states;
+    pLength.evLength   = states * states;
+    pLength.eiLength   = states * states;
+    pLength.substRatesLength = (states * states - states) / 2;
+    pLength.frequenciesLength = states;
+    pLength.tipVectorLength   = tipLength * states;
+    pLength.symmetryVectorLength = (states * states - states) / 2;
+    pLength.frequencyGroupingLength = states;
+    pLength.nonGTR = PLL_FALSE;*/
+  return (&pLengths[dataType]); 
+}
+
+size_t discreteRateCategories(int rateHetModel)
+{
+  size_t 
+    result;
+
+  switch(rateHetModel)
+  {
+    case PLL_CAT:
+      result = 1;
+      break;
+    case PLL_GAMMA:
+      result = 4;
+      break;
+    default:
+      assert(0);
+  }
+
+  return result;
+}
+
+
+
+double gettime(void)
+{
+#ifdef WIN32
+  time_t tp;
+  struct tm localtm;
+  tp = time(NULL);
+  localtm = *localtime(&tp);
+  return 60.0*localtm.tm_min + localtm.tm_sec;
+#else
+  struct timeval ttime;
+  gettimeofday(&ttime , NULL);
+  return ttime.tv_sec + ttime.tv_usec * 0.000001;
+#endif
+}
+
+int gettimeSrand(void)
+{
+#ifdef WIN32
+  time_t tp;
+  struct tm localtm;
+  tp = time(NULL);
+  localtm = *localtime(&tp);
+  return 24*60*60*localtm.tm_yday + 60*60*localtm.tm_hour + 60*localtm.tm_min  + localtm.tm_sec;
+#else
+  struct timeval ttime;
+  gettimeofday(&ttime , NULL);
+  return ttime.tv_sec + ttime.tv_usec;
+#endif
+}
+
+double randum (long  *seed)
+{
+  long  sum, mult0, mult1, seed0, seed1, seed2, newseed0, newseed1, newseed2;
+  double res;
+
+  mult0 = 1549;
+  seed0 = *seed & 4095;
+  sum  = mult0 * seed0;
+  newseed0 = sum & 4095;
+  sum >>= 12;
+  seed1 = (*seed >> 12) & 4095;
+  mult1 =  406;
+  sum += mult0 * seed1 + mult1 * seed0;
+  newseed1 = sum & 4095;
+  sum >>= 12;
+  seed2 = (*seed >> 24) & 255;
+  sum += mult0 * seed2 + mult1 * seed1;
+  newseed2 = sum & 255;
+
+  *seed = newseed2 << 24 | newseed1 << 12 | newseed0;
+  res = 0.00390625 * (newseed2 + 0.000244140625 * (newseed1 + 0.000244140625 * newseed0));
+
+  return res;
+}
+
+
+/********************* END UTILITY FUNCTIONS ********************/
+
+
+/******************************some functions for the likelihood computation ****************************/
+
+
+/** @brief Check whether a node is a tip.
+    
+    Checks whether the node with number \a number is a tip.
+    
+    @param number
+     Node number to be checked
+   
+    @param maxTips
+     Number of tips in the tree
+   
+    @return
+      \b PLL_TRUE if tip, \b PLL_FALSE otherwise
+  */
+boolean isTip(int number, int maxTips)
+{
+  assert(number > 0);
+
+  if(number <= maxTips)
+    return PLL_TRUE;
+  else
+    return PLL_FALSE;
+}
+
+/** @brief Set the orientation of a node
+
+    Sets the orientation of node \a p. That means, it will reset the orientation
+    \a p->next->x and \a p->next->next->x to 0 and of \a p->x to 1, meaning that
+    the conditional likelihood vector for that node is oriented on \a p, i.e.
+    the conditional likelihood vector represents the subtree rooted at \a p and
+    not any other of the two nodes.
+
+    @param p
+      Node which we want to orient
+*/
+void getxnode (nodeptr p)
+{
+  nodeptr  s;
+
+  if ((s = p->next)->x || (s = s->next)->x)
+  {
+    p->x = s->x;
+    s->x = 0;
+  }
+
+  assert(p->x);
+}
+
+
+/** @brief Connect two nodes and assign branch lengths 
+  * 
+  * Connect the two nodes \a p and \a q in each partition \e i with a branch of
+  * length \a z[i]
+  *
+  * @param p
+  *   Node \a p
+  * 
+  * @param q
+  *   Node \a q
+  *
+  * @param numBranches
+  *   Number of partitions
+  */
+void hookup (nodeptr p, nodeptr q, double *z, int numBranches)
+{
+  int i;
+
+  p->back = q;
+  q->back = p;
+
+  for(i = 0; i < numBranches; i++)
+    p->z[i] = q->z[i] = z[i];
+}
+
+/* connects node p with q and assigns the branch lengths z for the whole vector*/
+void hookupFull (nodeptr p, nodeptr q, double *z)
+{
+  //int i;
+
+  p->back = q;
+  q->back = p;
+
+  memcpy(p->z, z, PLL_NUM_BRANCHES*sizeof(double) );
+  memcpy(q->z, z, PLL_NUM_BRANCHES*sizeof(double) );
+  //for(i = 0; i < numBranches; i++)
+  //  p->z[i] = q->z[i] = z[i];
+
+}
+
+/* connect node p with q and assign the default branch lengths */
+void hookupDefault (nodeptr p, nodeptr q)
+{
+  int i;
+
+  p->back = q;
+  q->back = p;
+
+  for(i = 0; i < PLL_NUM_BRANCHES; i++)
+    p->z[i] = q->z[i] = PLL_DEFAULTZ;
+
+}
+
+
+/***********************reading and initializing input ******************/
+
+
+
+boolean whitechar (int ch)
+{
+  return (ch == ' ' || ch == '\n' || ch == '\t' || ch == '\r');
+}
+/*
+static unsigned int KISS32(void)
+{
+  static unsigned int 
+    x = 123456789, 
+      y = 362436069,
+      z = 21288629,
+      w = 14921776,
+      c = 0;
+
+  unsigned int t;
+
+  x += 545925293;
+  y ^= (y<<13); 
+  y ^= (y>>17); 
+  y ^= (y<<5);
+  t = z + w + c; 
+  z = w; 
+  c = (t>>31); 
+  w = t & 2147483647;
+
+  return (x+y+w);
+}
+*/
+
+/** @brief Get a random subtree
+
+    Returns the root node of a randomly picked subtree of the tree in PLL
+    instance \a tr. The picked subtree is guaranteed to have height over
+    1, that is, the direct descendents of the returned (root) node are not tips.
+
+    @param tr
+      PLL instance
+
+    @return
+      The root node of the randomly picked subtree
+*/
+nodeptr pllGetRandomSubtree(pllInstance *tr)
+{
+  nodeptr p;
+  do
+  {
+    int exitDirection = rand() % 3; 
+    p = tr->nodep[(rand() % (tr->mxtips - 2)) + 1 + tr->mxtips];
+    switch(exitDirection)
+    {
+      case 0:
+        break;
+      case 1:
+        p = p->next;
+        break;
+      case 2:
+        p = p->next->next;
+        break;
+      default:
+        assert(0);
+    }
+  }
+  while(isTip(p->next->back->number, tr->mxtips) && isTip(p->next->next->back->number, tr->mxtips));
+  assert(!isTip(p->number, tr->mxtips));
+  return p;
+}
+/* small example program that executes ancestral state computations 
+   on the entire subtree rooted at p.
+
+   Note that this is a post-order traversal.
+*/
+
+  
+void computeAllAncestralVectors(nodeptr p, pllInstance *tr, partitionList *pr)
+{
+  /* if this is not a tip, for which evidently it does not make sense 
+     to compute the ancestral sequence because we have the real one ....
+  */
+
+  if(!isTip(p->number, tr->mxtips))
+    {
+      /* descend recursively to compute the ancestral states in the left and right subtrees */
+
+      computeAllAncestralVectors(p->next->back, tr, pr);
+      computeAllAncestralVectors(p->next->next->back, tr, pr);
+      
+      /* then compute the ancestral state at node p */
+
+      pllUpdatePartialsAncestral(tr, pr, p);
+
+      /* and print it to terminal, the two booleans that are set to PLL_TRUE here 
+	 tell the function to print the marginal probabilities as well as 
+	 a discrete inner sequence, that is, ACGT etc., always selecting and printing 
+	 the state that has the highest probability */
+
+      printAncestralState(p, PLL_TRUE, PLL_TRUE, tr, pr);
+    }
+}
+
+
+
+void initializePartitionData(pllInstance *localTree, partitionList * localPartitions)
+{
+  /* in ancestralVectorWidth we store the total length in bytes (!) of 
+     one conditional likelihood array !
+     we need to know this length such that in the pthreads version the master thread can actually 
+     gather the scattered ancestral probabilities from the threads such that they can be printed to screen!
+  */
+
+  size_t 
+    maxCategories = (size_t)localTree->maxCategories;
+
+  size_t 
+    ancestralVectorWidth = 0,
+    model; 
+
+  int 
+    tid  = localTree->threadID,
+    innerNodes = localTree->mxtips - 2;
+
+  if(tid > 0)
+      localTree->rateCategory    = (int *)    rax_calloc((size_t)localTree->originalCrunchedLength, sizeof(int));	    
+
+  for(model = 0; model < (size_t)localPartitions->numberOfPartitions; model++)
+    {
+      size_t 
+	width = localPartitions->partitionData[model]->width;
+
+      const partitionLengths 
+	*pl = getPartitionLengths(localPartitions->partitionData[model]);
+
+      /* 
+	 globalScaler needs to be 2 * localTree->mxtips such that scalers of inner AND tip nodes can be added without a case switch
+	 to this end, it must also be initialized with zeros -> calloc
+      */
+
+      localPartitions->partitionData[model]->globalScaler    = (unsigned int *)rax_calloc(2 *(size_t)localTree->mxtips, sizeof(unsigned int));
+
+      rax_posix_memalign ((void **)&(localPartitions->partitionData[model]->left),  PLL_BYTE_ALIGNMENT, (size_t)pl->leftLength * (maxCategories + 1) * sizeof(double));
+      rax_posix_memalign ((void **)&(localPartitions->partitionData[model]->right), PLL_BYTE_ALIGNMENT, (size_t)pl->rightLength * (maxCategories + 1) * sizeof(double));
+      localPartitions->partitionData[model]->EIGN              = (double*)rax_malloc((size_t)pl->eignLength * sizeof(double));
+      rax_posix_memalign ((void **)&(localPartitions->partitionData[model]->EV),    PLL_BYTE_ALIGNMENT, (size_t)pl->evLength * sizeof(double));
+      localPartitions->partitionData[model]->EI                = (double*)rax_malloc((size_t)pl->eiLength * sizeof(double));
+
+      localPartitions->partitionData[model]->substRates        = (double *)rax_malloc((size_t)pl->substRatesLength * sizeof(double));
+      localPartitions->partitionData[model]->frequencies       = (double*)rax_malloc((size_t)pl->frequenciesLength * sizeof(double));
+      localPartitions->partitionData[model]->freqExponents     = (double*)rax_malloc(pl->frequenciesLength * sizeof(double));
+      localPartitions->partitionData[model]->empiricalFrequencies       = (double*)rax_malloc((size_t)pl->frequenciesLength * sizeof(double));
+      rax_posix_memalign ((void **)&(localPartitions->partitionData[model]->tipVector), PLL_BYTE_ALIGNMENT, (size_t)pl->tipVectorLength * sizeof(double));
+      //localPartitions->partitionData[model]->partitionName      = NULL;   // very imporatant since it is deallocated in pllPartitionDestroy
+      
+       if(localPartitions->partitionData[model]->dataType == PLL_AA_DATA && localPartitions->partitionData[model]->protModels == PLL_LG4)      
+	{	  	  
+	  int 
+	    k;
+	  
+	  for(k = 0; k < 4; k++)
+	    {	    
+	      localPartitions->partitionData[model]->EIGN_LG4[k]              = (double*)rax_malloc(pl->eignLength * sizeof(double));
+	      rax_posix_memalign ((void **)&(localPartitions->partitionData[model]->EV_LG4[k]), PLL_BYTE_ALIGNMENT, pl->evLength * sizeof(double));
+	      localPartitions->partitionData[model]->EI_LG4[k]                = (double*)rax_malloc(pl->eiLength * sizeof(double));
+	      localPartitions->partitionData[model]->substRates_LG4[k]        = (double *)rax_malloc(pl->substRatesLength * sizeof(double));
+	      localPartitions->partitionData[model]->frequencies_LG4[k]       = (double*)rax_malloc(pl->frequenciesLength * sizeof(double));
+	      rax_posix_memalign ((void **)&(localPartitions->partitionData[model]->tipVector_LG4[k]), PLL_BYTE_ALIGNMENT, pl->tipVectorLength * sizeof(double));
+	    }
+	}
+
+      localPartitions->partitionData[model]->symmetryVector    = (int *)rax_malloc((size_t)pl->symmetryVectorLength  * sizeof(int));
+      localPartitions->partitionData[model]->frequencyGrouping = (int *)rax_malloc((size_t)pl->frequencyGroupingLength  * sizeof(int));
+
+      localPartitions->partitionData[model]->perSiteRates      = (double *)rax_malloc(sizeof(double) * maxCategories);
+
+      localPartitions->partitionData[model]->nonGTR = PLL_FALSE;
+
+      localPartitions->partitionData[model]->gammaRates = (double*)rax_malloc(sizeof(double) * 4);
+      localPartitions->partitionData[model]->yVector = (unsigned char **)rax_malloc(sizeof(unsigned char*) * ((size_t)localTree->mxtips + 1));
+
+
+      localPartitions->partitionData[model]->xVector = (double **)rax_calloc(sizeof(double*), (size_t)localTree->mxtips);
+
+      if (localPartitions->partitionData[model]->ascBias)
+       {
+         localPartitions->partitionData[model]->ascOffset    = 4 * localPartitions->partitionData[model]->states * localPartitions->partitionData[model]->states;
+         localPartitions->partitionData[model]->ascVector    = (double *)rax_malloc(innerNodes * 
+                                                                                    localPartitions->partitionData[model]->ascOffset * 
+                                                                                    sizeof(double));
+         localPartitions->partitionData[model]->ascExpVector = (int *)rax_calloc(innerNodes *
+                                                                                 localPartitions->partitionData[model]->states,
+                                                                                 sizeof(int));
+         localPartitions->partitionData[model]->ascSumBuffer = (double *)rax_malloc(localPartitions->partitionData[model]->ascOffset * sizeof(double)); 
+       }
+
+
+      /* 
+	 Initializing the xVector array like this is absolutely required !!!!
+	 I don't know which programming genious removed this, but it must absolutely stay in here!!!!
+      */
+      
+      {
+	int k;
+	
+	for(k = 0; k < localTree->mxtips; k++)
+	      localPartitions->partitionData[model]->xVector[k] = (double*)NULL;       
+      }
+
+
+      localPartitions->partitionData[model]->xSpaceVector = (size_t *)rax_calloc((size_t)localTree->mxtips, sizeof(size_t));
+
+      const size_t span = (size_t)(localPartitions->partitionData[model]->states) *
+              discreteRateCategories(localTree->rateHetModel);
+
+#ifdef __MIC_NATIVE
+
+      // Alexey: sum buffer buffer padding for Xeon PHI
+      const int aligned_width = width % PLL_VECTOR_WIDTH == 0 ? width : width + (PLL_VECTOR_WIDTH - (width % PLL_VECTOR_WIDTH));
+
+      rax_posix_memalign ((void **)&(localPartitions->partitionData[model]->sumBuffer), PLL_BYTE_ALIGNMENT, aligned_width *
+										      span *
+										      sizeof(double));
+
+      // Alexey: fill padding entries with 1. (will be corrected with site weights, s. below)
+      {
+          int k;
+          for (k = width*span; k < aligned_width*span; ++k)
+              localPartitions->partitionData[model]->sumBuffer[k] = 1.;
+      }
+
+#else
+
+      rax_posix_memalign ((void **)&(localPartitions->partitionData[model]->sumBuffer), PLL_BYTE_ALIGNMENT, width *
+                                              span *
+                                              sizeof(double));
+#endif
+
+      /* Initialize buffers to store per-site log likelihoods */
+
+      rax_posix_memalign ((void **)&(localPartitions->partitionData[model]->perSiteLikelihoods), PLL_BYTE_ALIGNMENT, width * sizeof(double));
+
+      /* initialize data structures for per-site likelihood scaling */
+
+      if(localTree->fastScaling)
+	{
+	   localPartitions->partitionData[model]->expVector      = (int **)NULL;
+	   localPartitions->partitionData[model]->expSpaceVector = (size_t *)NULL;
+	}
+      else
+	{	 
+	  localPartitions->partitionData[model]->expVector      = (int **)rax_malloc(sizeof(int*) * innerNodes);
+	   
+	  /* 
+	     Initializing the expVector array like this is absolutely required !!!!
+	     Not doing this can (and did) cause segmentation faults !!!!
+	  */
+	  
+	  {
+	    int k;
+
+	    for(k = 0; k < innerNodes; k++)
+	      localPartitions->partitionData[model]->expVector[k] = (int*)NULL; 
+	  }
+
+	  localPartitions->partitionData[model]->expSpaceVector = (size_t *)rax_calloc(innerNodes, sizeof(size_t));
+	}
+
+      /* data structure to store the marginal ancestral probabilities in the sequential version or for each thread */
+
+      rax_posix_memalign ((void **)&(localPartitions->partitionData[model]->ancestralBuffer), PLL_BYTE_ALIGNMENT, width *
+										 (size_t)(localPartitions->partitionData[model]->states) *
+										 sizeof(double));
+
+      /* count and accumulate how many bytes we will need for storing a full ancestral vector. for this we addf over the per-partition space requirements in bytes */
+      /* ancestralVectorWidth += ((size_t)(pr->partitionData[model]->upper - pr->partitionData[model]->lower) * (size_t)(localPartitions->partitionData[model]->states) * sizeof(double)); */
+      ancestralVectorWidth += ((size_t)(localPartitions->partitionData[model]->upper - localPartitions->partitionData[model]->lower) * (size_t)(localPartitions->partitionData[model]->states) * sizeof(double));
+      /* :TODO: do we have to use the original tree for that   */
+
+#ifdef __MIC_NATIVE
+
+      rax_posix_memalign ((void **)&(localPartitions->partitionData[model]->wgt), PLL_BYTE_ALIGNMENT, aligned_width * sizeof(int));
+
+      // Alexey: fill padding entries with 0.
+      {
+          int k;
+          for (k = width; k < aligned_width; ++k)
+              localPartitions->partitionData[model]->wgt[k] = 0;
+      }
+#else
+      rax_posix_memalign ((void **)&(localPartitions->partitionData[model]->wgt), PLL_BYTE_ALIGNMENT, width * sizeof(int));
+#endif
+
+      /* rateCategory must be assigned using rax_calloc() at start up there is only one rate category 0 for all sites */
+
+      localPartitions->partitionData[model]->rateCategory = (int *)rax_calloc(width, sizeof(int));
+
+      if(width > 0 && localTree->saveMemory)
+	{
+	  localPartitions->partitionData[model]->gapVectorLength = ((int)width / 32) + 1;
+	  assert(4 == sizeof(unsigned int));
+	  localPartitions->partitionData[model]->gapVector = (unsigned int*)rax_calloc((size_t)localPartitions->partitionData[model]->gapVectorLength * 2 * (size_t)localTree->mxtips, sizeof(unsigned int));
+	  rax_posix_memalign ((void **)&(localPartitions->partitionData[model]->gapColumn),PLL_BYTE_ALIGNMENT, ((size_t)localTree->mxtips) *
+									       ((size_t)(localPartitions->partitionData[model]->states)) *
+									       discreteRateCategories(localTree->rateHetModel) * sizeof(double));
+	}
+      else
+	{
+	  localPartitions->partitionData[model]->gapVectorLength = 0;
+	  localPartitions->partitionData[model]->gapVector = (unsigned int*)NULL;
+	  localPartitions->partitionData[model]->gapColumn = (double*)NULL;
+	}              
+    }
+}
+
+int virtual_width( int n ) {
+    const int global_vw = 2;
+    return (n+1) / global_vw * global_vw;
+}
+
+
+void initMemorySavingAndRecom(pllInstance *tr, partitionList *pr)
+{
+  pllInstance  
+    *localTree = tr; 
+  partitionList
+    *localPartitions = pr;
+  size_t model; 
+
+  /* initialize gap bit vectors at tips when memory saving option is enabled */
+
+  if(localTree->saveMemory)
+    {
+      for(model = 0; model < (size_t)localPartitions->numberOfPartitions; model++)
+	{
+	  int        
+	    undetermined = getUndetermined(localPartitions->partitionData[model]->dataType);
+
+	  size_t
+	    i,
+	    j,
+	    width =  localPartitions->partitionData[model]->width;
+
+	  if(width > 0)
+	    {	   	    	      	    	     
+	      for(j = 1; j <= (size_t)(localTree->mxtips); j++)
+		for(i = 0; i < width; i++)
+		  if(localPartitions->partitionData[model]->yVector[j][i] == undetermined)
+		    localPartitions->partitionData[model]->gapVector[localPartitions->partitionData[model]->gapVectorLength * j + i / 32] |= mask32[i % 32];
+	    }     
+	}
+    }
+  /* recom */
+  if(localTree->useRecom)
+    allocRecompVectorsInfo(localTree);
+  else
+    localTree->rvec = (recompVectors*)NULL;
+  /* E recom */
+}
+
+/** @brief Get the length of a specific branch
+
+    Get the length of the branch specified by node \a p and \a p->back
+    of partition \a partition_id.
+    The branch length is decoded from the PLL representation.
+
+    @param tr
+      PLL instance
+
+    @param p
+      Specifies one end-point of the branch. The other one is \a p->back
+
+    @param partition_id
+      Specifies the partition
+
+    @return
+      The branch length
+*/
+double pllGetBranchLength (pllInstance *tr, nodeptr p, int partition_id)
+{
+  //assert(partition_id < tr->numBranches);
+  assert(partition_id < PLL_NUM_BRANCHES);
+  assert(partition_id >= 0);
+  assert(tr->fracchange != -1.0);
+  double z = p->z[partition_id];
+  if(z < PLL_ZMIN) z = PLL_ZMIN;
+  if(z > PLL_ZMAX) z = PLL_ZMAX;
+  return (-log(z) * tr->fracchange);
+}
+
+/** @brief Set the length of a specific branch
+
+    Set the length of the branch specified by node \a p and \a p->back
+    of partition \a partition_id.
+    The function encodes the branch length to the PLL representation.
+
+    @param tr
+      PLL instance
+
+    @param p
+      Specifies one end-point of the branch. The other one is \a p->back
+
+    @param partition_id
+      Specifies the partition
+
+    @param bl
+      Branch length
+*/
+void pllSetBranchLength (pllInstance *tr, nodeptr p, int partition_id, double bl)
+{
+  //assert(partition_id < tr->numBranches);
+  assert(partition_id < PLL_NUM_BRANCHES);
+  assert(partition_id >= 0);
+  assert(tr->fracchange != -1.0);
+  double z;
+  z = exp((-1 * bl)/tr->fracchange);
+  if(z < PLL_ZMIN) z = PLL_ZMIN;
+  if(z > PLL_ZMAX) z = PLL_ZMAX;
+  p->z[partition_id] = z;
+}
+
+#if (!defined(_FINE_GRAIN_MPI) && !defined(_USE_PTHREADS))
+static void initializePartitionsSequential(pllInstance *tr, partitionList *pr)
+{ 
+  size_t
+    model;
+
+  for(model = 0; model < (size_t)pr->numberOfPartitions; model++)
+    assert(pr->partitionData[model]->width == pr->partitionData[model]->upper - pr->partitionData[model]->lower);
+
+  initializePartitionData(tr, pr);
+
+  /* figure in tip sequence data per-site pattern weights */ 
+  for(model = 0; model < (size_t)pr->numberOfPartitions; model++)
+  {
+    size_t
+      j;
+    size_t lower = pr->partitionData[model]->lower;
+    size_t width = pr->partitionData[model]->upper - lower;
+
+    for(j = 1; j <= (size_t)tr->mxtips; j++)
+    {
+      pr->partitionData[model]->yVector[j] = &(tr->yVector[j][pr->partitionData[model]->lower]);
+    }
+
+    memcpy((void*)(&(pr->partitionData[model]->wgt[0])),         (void*)(&(tr->aliaswgt[lower])),      sizeof(int) * width);
+  }  
+
+  initMemorySavingAndRecom(tr, pr);
+}
+#endif
+
+
+/* interface to outside  */
+//void initializePartitions(pllInstance *tr, pllInstance *localTree, partitionList *pr, partitionList *localPr, int tid, int n)
+//{
+//#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+//  initializePartitionsMaster(tr,localTree,pr,localPr,tid,n);
+//#else
+//  initializePartitionsSequential(tr, pr);
+//#endif
+//}
+
+void freeLinkageList( linkageList* ll)
+{
+  int i;    
+
+  for(i = 0; i < ll->entries; i++)    
+    rax_free(ll->ld[i].partitionList);         
+
+  rax_free(ll->ld);
+  rax_free(ll);   
+}
+
+/** @brief free all data structures associated to a partition
+    
+    frees all data structures allocated for this partition
+
+    @param partitions
+      the pointer to the partition list
+
+    @param tips  
+       number of tips in the tree      
+*/
+void 
+pllPartitionsDestroy (pllInstance * tr, partitionList ** partitions)
+{
+  int i, j, tips;
+  partitionList * pl = *partitions;
+
+#ifdef _USE_PTHREADS
+  int tid = tr->threadID;
+  if (MASTER_P) {
+     pllMasterBarrier (tr, pl, PLL_THREAD_EXIT_GRACEFULLY);
+     pllStopPthreads (tr);
+    }
+#endif
+
+  tips = tr->mxtips;
+
+#ifdef _USE_PTHREADS
+  if (MASTER_P) {
+#endif
+#ifdef _FINE_GRAIN_MPI
+if (MASTER_P) {
+     pllMasterBarrier (tr, pl, PLL_THREAD_EXIT_GRACEFULLY);
+#endif
+  freeLinkageList(pl->alphaList);
+  freeLinkageList(pl->freqList); 
+  freeLinkageList(pl->rateList);
+#ifdef _FINE_GRAIN_MPI
+}
+#endif
+
+#ifdef _USE_PTHREADS
+  }
+#endif
+  for (i = 0; i < pl->numberOfPartitions; ++ i)
+   {
+     rax_free (pl->partitionData[i]->gammaRates);
+     rax_free (pl->partitionData[i]->perSiteRates);
+     rax_free (pl->partitionData[i]->globalScaler);
+     rax_free (pl->partitionData[i]->left);
+     rax_free (pl->partitionData[i]->right);
+     rax_free (pl->partitionData[i]->EIGN);
+     rax_free (pl->partitionData[i]->EV);
+     rax_free (pl->partitionData[i]->EI);
+     rax_free (pl->partitionData[i]->substRates);
+     rax_free (pl->partitionData[i]->frequencies);
+     rax_free (pl->partitionData[i]->freqExponents);
+     rax_free (pl->partitionData[i]->empiricalFrequencies);
+     rax_free (pl->partitionData[i]->tipVector);
+     rax_free (pl->partitionData[i]->symmetryVector);
+     rax_free (pl->partitionData[i]->frequencyGrouping);
+     for (j = 0; j < tips; ++ j)
+       rax_free (pl->partitionData[i]->xVector[j]);
+     rax_free (pl->partitionData[i]->xVector);
+     rax_free (pl->partitionData[i]->yVector);
+     rax_free (pl->partitionData[i]->xSpaceVector);
+     rax_free (pl->partitionData[i]->sumBuffer);
+     rax_free (pl->partitionData[i]->ancestralBuffer);
+     rax_free (pl->partitionData[i]->wgt);
+     rax_free (pl->partitionData[i]->rateCategory);
+     rax_free (pl->partitionData[i]->gapVector);
+     rax_free (pl->partitionData[i]->gapColumn);
+     rax_free (pl->partitionData[i]->perSiteLikelihoods);
+     rax_free (pl->partitionData[i]->partitionName);
+     rax_free (pl->partitionData[i]->expSpaceVector);
+     /*TODO: Deallocate all entries of expVector */
+     if (pl->partitionData[i]->expVector)
+      {
+        for (j = 0; j < tips - 2; ++ j)
+          rax_free (pl->partitionData[i]->expVector[j]);
+      }
+     rax_free (pl->partitionData[i]->expVector);
+     rax_free (pl->partitionData[i]);
+   }
+  rax_free (pl->partitionData);
+  rax_free (pl);
+
+  *partitions = NULL;
+
+#if (defined(_USE_PTHREADS) || defined(_FINE_GRAIN_MPI))
+     rax_free (tr->y_ptr);
+#endif
+}
+
+/** @ingroup instanceLinkingGroup
+    @brief Correspondance check between partitions and alignment
+
+    This function checks whether the partitions to be created and the given
+    alignment correspond, that is, whether each site of the alignment is
+    assigned to exactly one partition.
+
+    @param parts
+      A list of partitions suggested by the caller
+
+    @param alignmentData
+      The multiple sequence alignment
+    
+    @return
+      Returns \a 1 in case of success, otherwise \a 0
+*/
+int
+pllPartitionsValidate (pllQueue * parts, pllAlignmentData * alignmentData)
+{
+  int nparts;
+  char * used;
+  struct pllQueueItem * elm;
+  struct pllQueueItem * regionItem;
+  pllPartitionRegion * region;
+  pllPartitionInfo * pi;
+  int i;
+
+  /* check if the list contains at least one partition */
+  nparts = pllQueueSize (parts);
+  if (!nparts)          
+    return (0);   
+
+  /* boolean array for marking that a site was assigned a partition */
+  used = (char *) rax_calloc (alignmentData->sequenceLength, sizeof (char));
+  /* printf ("Sequence length : %d\n", alignmentData->sequenceLength); */
+
+  /* traverse all partitions and their respective regions and mark sites */
+  for (elm = parts->head; elm; elm = elm->next)
+   {
+     pi = (pllPartitionInfo *) elm->item;
+     
+     for (regionItem = pi->regionList->head; regionItem; regionItem = regionItem->next)
+      {
+        region = (pllPartitionRegion *) regionItem->item;
+
+        if (region->start < 1 || region->end > alignmentData->sequenceLength) 
+         {
+           rax_free (used);
+           return (0);
+         }
+
+        for (i = region->start - 1; i < region->end; i += region->stride)
+         {
+           if (used[i])
+            {
+              rax_free (used);
+              return (0);
+            }
+           used[i] = 1; 
+         }
+      }
+   }
+
+  /* check whether all sites were assigned a partition */
+  for (i = 0; i < alignmentData->sequenceLength; ++ i)
+    if (used[i] != 1)
+     {
+       rax_free (used);
+       return (0);
+     }
+
+  rax_free (used);
+  return (1);
+}
+
+/** @brief Swap two sites in a buffer
+    
+    Swaps sites \a s1 and \a s2 in buffer \a buf which consists of \a nTaxa + 1
+    taxa (i.e. rows), and the first row contains no information, i.e. it is not
+    accessed.
+
+    @param buffer
+      Memory buffer
+
+    @param s1
+      First site
+
+    @param s2
+      Second site
+
+    @param nTaxa
+      Number of taxa, i.e. size of site
+*/
+static inline void
+swapSite (unsigned char ** buf, int s1, int s2, int nTaxa)
+{
+  int i;
+  int x;
+
+  for (i = 1; i <= nTaxa; ++ i)
+  {
+    x = buf[i][s1];
+    buf[i][s1] = buf[i][s2];
+    buf[i][s2] = x;
+  }
+}
+
+/** @brief Constructs the list of partitions according to the proposed partition scheme
+    
+    A static function that construcs the \a partitionList structure according to
+    the partition scheme \b AFTER the sites have been repositioned in contiguous
+    regions according to the partition scheme.
+
+    @param bounds  An array of the new starting and ending posititons of sites
+    in the alignment for each partition.  This array is of size 2 * \a nparts.
+    The elements are always couples (lower,upper). The upper bounds is a site
+    that is not included in the partition
+
+    @param nparts The number of partitions to be created
+      
+    @todo Fix the bug in PLL 
+*/
+static partitionList * createPartitions (pllQueue * parts, int * bounds)
+{
+  partitionList * pl;
+  pllPartitionInfo * pi;
+  struct pllQueueItem * elm;
+  int i, j;
+
+  pl = (partitionList *) rax_malloc (sizeof (partitionList));
+  
+  // TODO: fix this
+  pl->perGeneBranchLengths =      0;
+
+  // TODO: change PLL_NUM_BRANCHES to number of partitions I guess
+  pl->partitionData = (pInfo **) rax_calloc (PLL_NUM_BRANCHES, sizeof (pInfo *));
+  
+  for (i = 0, elm = parts->head; elm; elm = elm->next, ++ i)
+   {
+     pi = (pllPartitionInfo *) elm->item;
+
+     /* check whether the data type is valid, and in case it's not, deallocate
+        and return NULL */
+     if (pi->dataType <= PLL_MIN_MODEL || pi->dataType >= PLL_MAX_MODEL)
+      {
+        for (j = 0; j < i; ++ j)
+         {
+           rax_free (pl->partitionData[j]->partitionName);
+           rax_free (pl->partitionData[j]);
+         }
+        rax_free (pl->partitionData);
+        rax_free (pl);
+        return (NULL);
+      }
+
+     pl->partitionData[i] = (pInfo *) rax_malloc (sizeof (pInfo));
+
+     pl->partitionData[i]->lower = bounds[i << 1];
+     pl->partitionData[i]->upper = bounds[(i << 1) + 1];
+     pl->partitionData[i]->width = bounds[(i << 1) + 1] - bounds[i << 1];
+
+     //the two flags below are required to allow users to set 
+     //alpha parameters and substitution rates in the Q matrix 
+     //to fixed values. These parameters will then not be optimized 
+     //in the model parameter optimization functions
+     //by default we assume that all parameters are being optimized, i.e., 
+     //this has to be explicitly set by the user 
+     
+     pl->partitionData[i]->optimizeAlphaParameter    = PLL_TRUE;
+     pl->partitionData[i]->optimizeSubstitutionRates = PLL_TRUE;
+     pl->partitionData[i]->dataType                  = pi->dataType;
+        pl->partitionData[i]->protModels                = -1;
+        pl->partitionData[i]->protUseEmpiricalFreqs                 = -1;
+     pl->partitionData[i]->maxTipStates              = pLengths[pi->dataType].undetermined + 1;
+        pl->partitionData[i]->optimizeBaseFrequencies   = pi->optimizeBaseFrequencies;
+     pl->partitionData[i]->ascBias                   = pi->ascBias;
+     pl->partitionData[i]->parsVect                  = NULL;
+
+
+
+     if (pi->dataType == PLL_AA_DATA)
+      {
+	if(pl->partitionData[i]->protModels != PLL_GTR)
+	  pl->partitionData[i]->optimizeSubstitutionRates = PLL_FALSE;
+        pl->partitionData[i]->protUseEmpiricalFreqs                 = pi->protUseEmpiricalFreqs;
+        pl->partitionData[i]->protModels                = pi->protModels;
+      }
+     
+     pl->partitionData[i]->states                = pLengths[pl->partitionData[i]->dataType].states;
+     pl->partitionData[i]->numberOfCategories    =        1;
+     pl->partitionData[i]->autoProtModels        =        0;
+     pl->partitionData[i]->nonGTR                =        PLL_FALSE;
+     pl->partitionData[i]->partitionContribution =     -1.0;
+     pl->partitionData[i]->partitionLH           =      0.0;
+     pl->partitionData[i]->fracchange            =      1.0;
+     pl->partitionData[i]->executeModel          =     PLL_TRUE;
+
+
+     pl->partitionData[i]->partitionName         = (char *) rax_malloc ((strlen (pi->partitionName) + 1) * sizeof (char));
+     strcpy (pl->partitionData[i]->partitionName, pi->partitionName);
+   }
+
+  return (pl);
+}
+
+
+/** @ingroup instanceLinkingGroup
+    @brief Constructs the proposed partition scheme 
+
+    This function constructs the proposed partition scheme. It assumes
+    that the partition scheme is correct.
+
+    @note This function \b does \b not validate the partition scheme.
+    The user must manually call the ::pllPartitionsValidate function
+    for validation
+    
+    @param parts
+      A list of partitions suggested by the caller
+
+    @param alignmentData
+      The multiple sequence alignment
+
+    @return
+      Returns a pointer to \a partitionList structure of partitions in case of success, \b NULL otherwise
+*/
+partitionList * pllPartitionsCommit (pllQueue * parts, pllAlignmentData * alignmentData)
+{
+  int * oi;
+  int i, j, dst;
+  struct pllQueueItem * elm;
+  struct pllQueueItem * regionItem;
+  pllPartitionRegion * region;
+  pllPartitionInfo * pi;
+  partitionList * pl;
+  int * newBounds;
+  int k, nparts;
+  int tmpvar;
+ 
+
+  dst = k = 0;
+  oi  = (int *) rax_malloc (alignmentData->sequenceLength * sizeof (int));
+  for (i = 0; i < alignmentData->sequenceLength; ++ i) oi[i] = i;
+
+  nparts = pllQueueSize (parts);
+  newBounds = (int *) rax_malloc (2 * nparts * sizeof (int));
+
+  /* reposition the sites in the alignment */
+  for (elm = parts->head; elm; elm = elm->next, ++ k)
+   {
+     pi = (pllPartitionInfo *) elm->item;
+     
+     newBounds[k << 1] = dst;   /* set the lower column for this partition */
+     for (regionItem = pi->regionList->head; regionItem; regionItem = regionItem->next)
+      {
+        region = (pllPartitionRegion *) regionItem->item;
+
+        for (i = region->start - 1; i < region->end && i < alignmentData->sequenceLength; i += region->stride)
+         {
+           if (oi[i] == i)
+            {
+              swapSite (alignmentData->sequenceData, dst, i, alignmentData->sequenceCount);
+	      tmpvar = oi[i];
+	      oi[i] = oi[dst];
+              oi[dst++] = tmpvar;
+            }
+           else
+            {
+              j = i;
+              while (oi[j] != i) j = oi[j];
+
+              swapSite (alignmentData->sequenceData, dst, j, alignmentData->sequenceCount);
+              tmpvar = oi[j];
+	      oi[j] = oi[dst];
+              oi[dst++] = tmpvar;
+            }
+         }
+      }
+     newBounds[(k << 1) + 1] = dst;    /* set the uppwer limit for this partition */
+   }
+  if ((pl = createPartitions (parts, newBounds)))
+   { 
+  pl->numberOfPartitions = nparts;
+  pl->dirty = PLL_FALSE;
+   }
+  
+  rax_free (newBounds);
+  rax_free (oi);
+
+  return (pl);
+}
+
+/** @brief Copy a site to another buffer
+
+    Copies site \a from from buffer \a src to \a to in buffer \a dst. Both buffers
+    must consist of \a nTaxa + 1 taxa and the first row contains no information, i.e.
+    it is not accessed.
+
+    @param dst
+      Destination buffer
+
+    @param src
+      Source buffer
+
+    @param to
+      At which position in \a dst to copy the site to
+
+    @param from
+      Which site from \a src to copy
+
+    @param nTaxa
+      Number of taxa, i.e. size of site
+*/
+static inline void
+copySite (unsigned char ** dst, unsigned char ** src, int to, int from, int nTaxa)
+{
+  int i;
+
+  for (i = 1; i <= nTaxa; ++ i)
+   {
+     dst[i][to] = src[i][from];
+   }
+}
+
+/** @brief Remove duplicate sites from alignment and update weights vector
+
+    Removes duplicate sites from the alignment given the partitions list
+    and updates the weight vector of the alignment and the boundaries
+    (upper, lower, width) for each partition.
+
+    @param alignmentData
+      The multiple sequence alignment
+    
+    @param pl
+      List of partitions
+
+*/
+void 
+pllAlignmentRemoveDups (pllAlignmentData * alignmentData, partitionList * pl)
+{
+  int i, j, k, p;
+  char *** sites;
+  void ** memptr;
+  int ** oi;
+  int dups = 0;
+  int lower;
+
+  /* allocate space for the transposed alignments (sites) for every partition */
+  sites  = (char ***) rax_malloc (pl->numberOfPartitions * sizeof (char **));
+  memptr = (void **)  rax_malloc (pl->numberOfPartitions * sizeof (void *));
+  oi     = (int **)   rax_malloc (pl->numberOfPartitions * sizeof (int *));
+
+  /* transpose the sites by partition */
+  for (p = 0; p < pl->numberOfPartitions; ++ p)
+   {
+     sites[p]  = (char **) rax_malloc (pl->partitionData[p]->width * sizeof (char *));
+     memptr[p] = rax_malloc ((alignmentData->sequenceCount + 1) * pl->partitionData[p]->width * sizeof (char));
+
+     for (i = 0; i < pl->partitionData[p]->width; ++ i)
+      {
+        sites[p][i] = (char *) (memptr[p] + i * (alignmentData->sequenceCount + 1) * sizeof (char));
+      }
+
+     for (i = 0; i < pl->partitionData[p]->width; ++ i)
+      {
+        for (j = 0; j < alignmentData->sequenceCount; ++ j)
+         {
+           sites[p][i][j] = alignmentData->sequenceData[j + 1][pl->partitionData[p]->lower + i]; 
+         }
+        sites[p][i][j] = 0;
+      }
+
+     oi[p] = pllssort1main (sites[p], pl->partitionData[p]->width);
+
+     for (i = 0; i < pl->partitionData[p]->width; ++ i) oi[p][i] = 1;
+
+     for (i = 1; i < pl->partitionData[p]->width; ++ i)
+      {
+        if (! strcmp (sites[p][i], sites[p][i - 1]))
+         {
+           ++ dups;
+           oi[p][i] = 0;
+         }
+      }
+   }
+
+  /* allocate memory for the alignment without duplicates*/
+  rax_free (alignmentData->sequenceData[1]);
+  rax_free (alignmentData->siteWeights);
+
+  alignmentData->sequenceLength = alignmentData->sequenceLength - dups;
+  alignmentData->sequenceData[0] = (unsigned char *) rax_malloc ((alignmentData->sequenceLength + 1) * sizeof (unsigned char) * alignmentData->sequenceCount);
+  for (i = 0; i < alignmentData->sequenceCount; ++ i)
+   {
+     alignmentData->sequenceData[i + 1] = (unsigned char *) (alignmentData->sequenceData[0] + i * (alignmentData->sequenceLength + 1) * sizeof (unsigned char));
+     alignmentData->sequenceData[i + 1][alignmentData->sequenceLength] = 0;
+   }
+
+  alignmentData->siteWeights    = (int *) rax_malloc ((alignmentData->sequenceLength) * sizeof (int));
+  alignmentData->siteWeights[0] = 1;
+
+  /* transpose sites back to alignment */
+  for (p = 0, k = 0; p < pl->numberOfPartitions; ++ p)
+   {
+     lower = k;
+     for (i = 0; i < pl->partitionData[p]->width; ++ i)
+      {
+        if (!oi[p][i])
+         {
+           ++ alignmentData->siteWeights[k - 1];
+         }
+        else
+         {
+           alignmentData->siteWeights[k] = 1;
+           for (j = 0; j < alignmentData->sequenceCount; ++ j)
+            {
+              alignmentData->sequenceData[j + 1][k] = sites[p][i][j];
+            }
+           ++ k;
+         }
+      }
+     pl->partitionData[p]->lower = lower;
+     pl->partitionData[p]->upper = k;
+     pl->partitionData[p]->width = k - lower;
+   }
+
+  /* deallocate storage for transposed alignment (sites) */
+  for (p = 0; p < pl->numberOfPartitions; ++ p)
+   {
+     rax_free (oi[p]);
+     rax_free (memptr[p]);
+     rax_free (sites[p]);
+   }
+  rax_free (oi);
+  rax_free (sites);
+  rax_free (memptr);
+}
+
+
+/** @brief Compute the empirical frequencies of a partition
+  
+    Compute the empirical frequencies of partition \a partition and store them in
+    \a pfreqs.
+
+    @param partition
+      The partition for which to compute empirical frequencies
+
+    @param alignmentData
+      The multiple sequence alignment
+
+    @param smoothFrequencies
+      Not needed?
+
+    @param bitMask
+      The bitmask
+
+    @param pfreqs
+      Array of size \a partition->states where the empirical frequencies for this partition are stored
+*/
+static int genericBaseFrequenciesAlignment (pInfo * partition, 
+                                              pllAlignmentData * alignmentData, 
+                                              boolean smoothFrequencies, 
+                                              const unsigned int * bitMask, 
+                                              double * pfreqs)
+{
+  double 
+    wj, 
+    acc,
+    sumf[64],   
+    temp[64];
+ 
+  int     
+    i, 
+    j, 
+    k, 
+    l,
+    numFreqs,
+    lower,
+    upper;
+
+  unsigned char  *yptr;  
+  const char * map;
+  
+  switch (partition->dataType)
+   {
+     case PLL_BINARY_DATA:
+       map = PLL_MAP_BIN;
+     case PLL_DNA_DATA:
+       map = PLL_MAP_NT;
+       break;
+     case PLL_AA_DATA:
+       map = PLL_MAP_AA;
+       break;
+     default:
+       assert(0);
+   }
+
+  numFreqs = partition->states;
+  lower    = partition->lower;
+  upper    = partition->upper;
+
+  for(l = 0; l < numFreqs; l++)	    
+    pfreqs[l] = 1.0 / ((double)numFreqs);
+	  
+  for (k = 1; k <= 8; k++) 
+    {	     	   	    	      			
+      for(l = 0; l < numFreqs; l++)
+	sumf[l] = 0.0;
+	      
+      for (i = 1; i <= alignmentData->sequenceCount; i++) 
+	{		 
+          yptr = alignmentData->sequenceData[i];
+	  
+	  for(j = lower; j < upper; j++) 
+	    {
+              if (map[yptr[j]] < 0) return (0);
+              unsigned int code = bitMask[(unsigned char)map[yptr[j]]];
+	      assert(code >= 1);
+	      
+	      for(l = 0; l < numFreqs; l++)
+		{
+		  if((code >> l) & 1)
+		    temp[l] = pfreqs[l];
+		  else
+		    temp[l] = 0.0;
+		}		      	      
+	      
+	      for(l = 0, acc = 0.0; l < numFreqs; l++)
+		{
+		  if(temp[l] != 0.0)
+		    acc += temp[l];
+		}
+	      
+	      wj = alignmentData->siteWeights[j] / acc;
+	      
+	      for(l = 0; l < numFreqs; l++)
+		{
+		  if(temp[l] != 0.0)		    
+		    sumf[l] += wj * temp[l];			     				   			     		   
+		}
+	    }
+	}	    	      
+      
+      for(l = 0, acc = 0.0; l < numFreqs; l++)
+	{
+	  if(sumf[l] != 0.0)
+	    acc += sumf[l];
+	}
+	      
+      for(l = 0; l < numFreqs; l++)
+	pfreqs[l] = sumf[l] / acc;	     
+    }
+
+   /* TODO: What is that? */
+/*
+  if(smoothFrequencies)         
+   {;
+    smoothFreqs(numFreqs, pfreqs,  tr->partitionData[model].frequencies, &(tr->partitionData[model]));	   
+   }
+  else    
+    {
+      boolean 
+	zeroFreq = PLL_FALSE;
+
+      char 
+	typeOfData[1024];
+
+      getDataTypeString(tr, model, typeOfData);  
+
+      for(l = 0; l < numFreqs; l++)
+	{
+	  if(pfreqs[l] == 0.0)
+	    {
+	      printBothOpen("Empirical base frequency for state number %d is equal to zero in %s data partition %s\n", l, typeOfData, tr->partitionData[model].partitionName);
+	      printBothOpen("Since this is probably not what you want to do, RAxML will soon exit.\n\n");
+	      zeroFreq = PLL_TRUE;
+	    }
+	}
+
+      if(zeroFreq)
+	exit(-1);
+
+      for(l = 0; l < numFreqs; l++)
+	{
+	  assert(pfreqs[l] > 0.0);
+	  tr->partitionData[model].frequencies[l] = pfreqs[l];
+	}     
+    }  
+*/
+  return (1);
+  
+}
+
+static void  genericBaseFrequenciesInstance (pInfo * partition, 
+                                             pllInstance * tr, 
+                                             boolean smoothFrequencies, 
+                                             const unsigned int * bitMask, 
+                                             double * pfreqs)
+{
+  double 
+    wj, 
+    acc,
+    sumf[64],   
+    temp[64];
+ 
+  int     
+    i, 
+    j, 
+    k, 
+    l,
+    numFreqs,
+    lower,
+    upper;
+
+  unsigned char  *yptr;  
+
+  numFreqs = partition->states;
+  lower    = partition->lower;
+  upper    = partition->upper;
+
+  for(l = 0; l < numFreqs; l++)     
+    pfreqs[l] = 1.0 / ((double)numFreqs);
+          
+  for (k = 1; k <= 8; k++) 
+    {                                                   
+      for(l = 0; l < numFreqs; l++)
+        sumf[l] = 0.0;
+              
+      for (i = 1; i <= tr->mxtips; i++) 
+        {                
+          yptr = tr->yVector[i];
+          
+          for(j = lower; j < upper; j++) 
+            {
+              unsigned int code = bitMask[yptr[j]];
+              assert(code >= 1);
+              
+              for(l = 0; l < numFreqs; l++)
+                {
+                  if((code >> l) & 1)
+                    temp[l] = pfreqs[l];
+                  else
+                    temp[l] = 0.0;
+                }                             
+              
+              for(l = 0, acc = 0.0; l < numFreqs; l++)
+                {
+                  if(temp[l] != 0.0)
+                    acc += temp[l];
+                }
+              
+              wj = tr->aliaswgt[j] / acc;
+              
+              for(l = 0; l < numFreqs; l++)
+                {
+                  if(temp[l] != 0.0)                
+                    sumf[l] += wj * temp[l];                                                                                               
+                }
+            }
+        }                     
+      
+      for(l = 0, acc = 0.0; l < numFreqs; l++)
+        {
+          if(sumf[l] != 0.0)
+            acc += sumf[l];
+        }
+              
+      for(l = 0; l < numFreqs; l++)
+        pfreqs[l] = sumf[l] / acc;           
+    }
+
+   /* TODO: What is that? */
+/*
+  if(smoothFrequencies)         
+   {;
+    smoothFreqs(numFreqs, pfreqs,  tr->partitionData[model].frequencies, &(tr->partitionData[model]));     
+   }
+  else    
+    {
+      boolean 
+        zeroFreq = PLL_FALSE;
+
+      char 
+        typeOfData[1024];
+
+      getDataTypeString(tr, model, typeOfData);  
+
+      for(l = 0; l < numFreqs; l++)
+        {
+          if(pfreqs[l] == 0.0)
+            {
+              printBothOpen("Empirical base frequency for state number %d is equal to zero in %s data partition %s\n", l, typeOfData, tr->partitionData[model].partitionName);
+              printBothOpen("Since this is probably not what you want to do, RAxML will soon exit.\n\n");
+              zeroFreq = PLL_TRUE;
+            }
+        }
+
+      if(zeroFreq)
+        exit(-1);
+
+      for(l = 0; l < numFreqs; l++)
+        {
+          assert(pfreqs[l] > 0.0);
+          tr->partitionData[model].frequencies[l] = pfreqs[l];
+        }     
+    }  
+*/
+
+  
+}
+
+/**  Compute the empirical base frequencies of an alignment
+
+     Computes the empirical base frequencies per partition of an alignment \a alignmentData
+     given the partition structure \a pl.
+
+     @param alignmentData The alignment structure for which to compute the empirical base frequencies
+     @param pl            List of partitions
+     @return Returns a list of frequencies for each partition
+*/
+double ** pllBaseFrequenciesAlignment (pllAlignmentData * alignmentData, partitionList * pl)
+{
+  int
+    i,
+    model;
+
+  double 
+    **freqs = (double **) rax_malloc (pl->numberOfPartitions * sizeof (double *));
+
+  for (model = 0; model < pl->numberOfPartitions; ++ model)
+    {
+      freqs[model] = (double *) rax_malloc (pl->partitionData[model]->states * sizeof (double));
+      
+      switch  (pl->partitionData[model]->dataType)
+	{
+        case PLL_BINARY_DATA:
+        case PLL_AA_DATA:
+        case PLL_DNA_DATA:
+          if (!genericBaseFrequenciesAlignment (pl->partitionData[model], 
+                                  alignmentData, 
+                                  pLengths[pl->partitionData[model]->dataType].smoothFrequencies,
+                                  pLengths[pl->partitionData[model]->dataType].bitVector,
+                                  freqs[model]
+                                               ))
+            return (NULL);
+          break;
+        default:
+          {
+            errno = PLL_UNKNOWN_MOLECULAR_DATA_TYPE;
+            for (i = 0; i <= model; ++ i) rax_free (freqs[i]);
+            rax_free (freqs);
+            return (double **)NULL;
+          }
+        }
+    }
+  
+  return (freqs);
+}
+
+/**  Compute the empirical base frequencies of the alignment incorporated in the instance
+
+     Computes the empirical base frequencies per partition of the alignment
+     incorporated in the instance \a tr given the partition structure \a pl.
+
+     @param tr The instance for which to compute the empirical base frequencies
+     @param pl List of partitions
+     @return Returns a list of frequencies for each partition
+*/
+double ** pllBaseFrequenciesInstance (pllInstance * tr, partitionList * pl)
+{
+  int
+    i,
+    model;
+
+  double 
+    **freqs = (double **) rax_malloc (pl->numberOfPartitions * sizeof (double *));
+
+  for (model = 0; model < pl->numberOfPartitions; ++ model)
+    {
+      freqs[model] = (double *) rax_malloc (pl->partitionData[model]->states * sizeof (double));
+      
+      switch  (pl->partitionData[model]->dataType)
+        {
+        case PLL_AA_DATA:
+        case PLL_DNA_DATA:
+        case PLL_BINARY_DATA:
+          genericBaseFrequenciesInstance (pl->partitionData[model], 
+                                          tr, 
+                                          pLengths[pl->partitionData[model]->dataType].smoothFrequencies,
+                                          pLengths[pl->partitionData[model]->dataType].bitVector,
+                                          freqs[model]
+				  );
+          break;
+	default:
+	  {
+	    errno = PLL_UNKNOWN_MOLECULAR_DATA_TYPE;
+            for (i = 0; i <= model; ++ i) rax_free (freqs[i]);
+            rax_free (freqs);
+	    return (double **)NULL;
+	  }
+	}
+    }
+  
+  return (freqs);
+}
+
+void
+pllEmpiricalFrequenciesDestroy (double *** empiricalFrequencies, int models)
+{
+  int i;
+
+  for (i = 0; i < models; ++ i)
+   {
+     rax_free ((*empiricalFrequencies)[i]);
+   }
+  rax_free (*empiricalFrequencies);
+
+  *empiricalFrequencies = NULL;
+}
+
+int pllLoadAlignment (pllInstance * tr, pllAlignmentData * alignmentData, partitionList * partitions)
+{
+  int i;
+  nodeptr node;
+  pllHashItem * hItem;
+
+  if (tr->mxtips != alignmentData->sequenceCount) return (0);
+
+  tr->aliaswgt = (int *) rax_malloc (alignmentData->sequenceLength * sizeof (int));
+  memcpy (tr->aliaswgt, alignmentData->siteWeights, alignmentData->sequenceLength * sizeof (int));
+
+  tr->originalCrunchedLength = alignmentData->sequenceLength;
+  tr->rateCategory           = (int *)   rax_calloc (tr->originalCrunchedLength, sizeof (int));
+  tr->patrat                 = (double*) rax_malloc((size_t)tr->originalCrunchedLength * sizeof(double));
+  tr->patratStored           = (double*) rax_malloc((size_t)tr->originalCrunchedLength * sizeof(double));
+  tr->lhs                    = (double*) rax_malloc((size_t)tr->originalCrunchedLength * sizeof(double));
+
+  /* allocate memory for the alignment */
+  tr->yVector    = (unsigned char **) rax_malloc ((alignmentData->sequenceCount + 1) * sizeof (unsigned char *));                                                                                                                                                                      
+
+     tr->yVector[0] = (unsigned char *)  rax_malloc (sizeof (unsigned char) * (alignmentData->sequenceLength + 1) * alignmentData->sequenceCount);
+     for (i = 1; i <= alignmentData->sequenceCount; ++ i) 
+      {                     
+        tr->yVector[i] = (unsigned char *) (tr->yVector[0] + (i - 1) * (alignmentData->sequenceLength + 1) * sizeof (unsigned char));
+        tr->yVector[i][alignmentData->sequenceLength] = 0;
+      }                     
+                         
+  /* place sequences to tips */                              
+  for (i = 1; i <= alignmentData->sequenceCount; ++ i)                      
+   {                     
+     if (!pllHashSearch (tr->nameHash, alignmentData->sequenceLabels[i],(void **)&node)) 
+      {
+        //rax_free (tr->originalCrunchedLength);
+        rax_free (tr->rateCategory);
+        rax_free (tr->patrat);
+        rax_free (tr->patratStored);
+        rax_free (tr->lhs);
+        rax_free (tr->yVector[0]);
+        rax_free (tr->yVector);
+        return (0);
+      }
+     memcpy (tr->yVector[node->number], alignmentData->sequenceData[i], alignmentData->sequenceLength);
+   }
+
+  /* Do the base substitution (from A,C,G....  ->   0,1,2,3....)*/
+  pllBaseSubstitute (tr, partitions);
+
+  /* Populate tipNames */
+  tr->tipNames = (char **) rax_calloc(tr->mxtips + 1, sizeof (char *));
+  for (i = 0; (unsigned int)i < tr->nameHash->size; ++ i)
+   {
+     hItem = tr->nameHash->Items[i];
+
+     for (; hItem; hItem = hItem->next)
+      {
+        tr->tipNames[((nodeptr)hItem->data)->number] = hItem->str; 
+      }
+   }
+
+  /* Populate tipNames */
+
+  tr->tipNames = (char **) rax_calloc(tr->mxtips + 1, sizeof (char *));
+  for (i = 0; (unsigned int)i < tr->nameHash->size; ++ i)
+   {
+     hItem = tr->nameHash->Items[i];
+
+     for (; hItem; hItem = hItem->next)
+      {
+        tr->tipNames[((nodeptr)hItem->data)->number] = hItem->str; 
+      }
+   }
+
+  return (1);
+}
+
+pllInstance * pllCreateInstance (pllInstanceAttr * attr)
+{
+  pllInstance * tr;
+
+  if (attr->rateHetModel != PLL_GAMMA && attr->rateHetModel != PLL_CAT) return NULL;
+
+  tr = (pllInstance *) rax_calloc (1, sizeof (pllInstance));
+
+  tr->threadID          = 0;
+  tr->rateHetModel      = attr->rateHetModel;
+  tr->fastScaling       = attr->fastScaling;
+  tr->saveMemory        = attr->saveMemory;
+  tr->useRecom          = attr->useRecom;
+  tr->likelihoodEpsilon = 0.01;
+  
+  tr->randomNumberSeed = attr->randomNumberSeed;
+  tr->parsimonyScore   = NULL;
+
+  /* remove it from the library */
+  tr->useMedian         = PLL_FALSE;
+
+  tr->maxCategories     = (attr->rateHetModel == PLL_GAMMA) ? 4 : 25;
+
+  tr->numberOfThreads   = attr->numberOfThreads;
+  tr->rearrangeHistory  = NULL;
+
+  /* Lock the slave processors at this point */
+#ifdef _FINE_GRAIN_MPI
+  pllLockMPI (tr);
+#endif
+
+  return (tr);
+}
+
+/** @brief Initialize PLL tree structure with default values
+    
+    Initialize PLL tree structure with default values and allocate 
+    memory for its elements.
+
+    @todo
+      STILL NOT FINISHED
+*/
+static void pllTreeInitDefaults (pllInstance * tr, int tips)
+{
+  nodeptr p0, p, q;
+  int i, j;
+  int inner;
+
+  
+
+  /* TODO: make a proper static setupTree function */
+
+  inner = tips - 1;
+
+  //tr->mxtips = tips;
+
+  //tr->bigCutoff = PLL_FALSE;
+  //tr->treeStringLength = tr->mxtips * (PLL_NMLNGTH + 128) + 256 + tr->mxtips * 2;
+  //tr->tree_string = (char *) rax_calloc ( tr->treeStringLength, sizeof(char));
+  //tr->tree0 = (char*)rax_calloc((size_t)tr->treeStringLength, sizeof(char));
+  //tr->tree1 = (char*)rax_calloc((size_t)tr->treeStringLength, sizeof(char));
+  //tr->constraintVector = (int *)rax_malloc((2 * tr->mxtips) * sizeof(int));
+  
+  p0 = (nodeptr) rax_malloc ((tips + 3 * inner) * sizeof (node));
+  assert (p0);
+
+  tr->nodeBaseAddress  = p0;
+
+  tr->nameList         = (char **)   rax_malloc ((tips + 1) * sizeof (char *));
+  //tr->nodep            = (nodeptr *) rax_malloc ((2 * tips) * sizeof (nodeptr));
+  assert (tr->nameList && tr->nodep);
+
+  tr->nodep[0] = NULL;          
+
+  /* TODO: FIX THIS! */
+  //tr->fracchange = -1;
+
+//  for (i = 1; i <= tips; ++ i)
+//   {
+//     p = p0++;
+//
+//     //p->hash      = KISS32();
+//     p->x         = 0;
+//     p->xBips     = 0;
+//     p->number    = i;
+//     p->next      = p;
+//     p->back      = NULL;
+//     p->bInf      = NULL;
+//     tr->nodep[i]  = p;
+//   }
+//  for (i = tips + 1; i <= tips + inner; ++i)
+//   {
+//     q = NULL;
+//     for (j = 1; j <= 3; ++ j)
+//     {
+//       p = p0++;
+//       if (j == 1)
+//        {
+//          p->xBips = 1;
+//          p->x = 1; //p->x     = 1;
+//        }
+//       else
+//        {
+//          p->xBips = 0;
+//          p->x     = 0;
+//        }
+//       p->number = i;
+//       p->next   = q;
+//       p->bInf   = NULL;
+//       p->back   = NULL;
+//       p->hash   = 0;
+//       q         = p;
+//     }
+//    p->next->next->next = p;
+//    tr->nodep[i]         = p;
+//   }
+//  tr->likelihood  = PLL_UNLIKELY;
+//  tr->start       = NULL;
+//  tr->ntips       = 0;
+//  tr->nextnode    = 0;
+//
+//  tr->bitVectors = NULL;
+//  tr->vLength    = 0;
+//  tr->h          = NULL;
+
+  /* TODO: Fix hash type */
+  tr->nameHash   = pllHashInit (10 * tr->mxtips);
+  /* TODO: do these options really fit here or should they be put elsewhere? */
+  //tr->td[0].count            = 0;
+  //tr->td[0].ti               = (traversalInfo *) rax_malloc (sizeof(traversalInfo) * (size_t)tr->mxtips);
+  //tr->td[0].parameterValues  = (double *) rax_malloc(sizeof(double) * (size_t)PLL_NUM_BRANCHES);
+  //tr->td[0].executeModel     = (boolean *) rax_malloc (sizeof(boolean) * (size_t)PLL_NUM_BRANCHES);
+  //tr->td[0].executeModel[0]  = PLL_TRUE;
+}
+
+
+/* @brief Check a parsed tree for inclusion in the current tree
+   
+   Check whether the set of leaves (taxa) of the parsed tree \a nTree is a
+   subset of the leaves of the currently loaded tree.
+
+   @param pInst
+     PLL instance
+
+   @param nTree
+     Parsed newick tree structure
+
+   @return
+     Returns \b PLL_TRUE in case it is a subset, otherwise \b PLL_FALSE
+*/
+static int
+checkTreeInclusion (pllInstance * pInst, pllNewickTree * nTree)
+{
+  pllStack * sList;
+  pllNewickNodeInfo * sItem;
+  void * dummy;
+
+  if (!pInst->nameHash) return (PLL_FALSE);
+
+  for (sList = nTree->tree; sList; sList = sList->next)
+   {
+     sItem = (pllNewickNodeInfo *) sList->item;
+     if (!sItem->rank)   /* leaf */
+      {
+        if (!pllHashSearch (pInst->nameHash, sItem->name, &dummy)) return (PLL_FALSE);
+      }
+   }
+
+  return (PLL_TRUE);
+}
+
+static void
+updateBranchLength (nodeptr p, double old_fracchange, double new_fracchange)
+{
+  double z;
+  int j;
+
+  for (j = 0; j < PLL_NUM_BRANCHES; ++ j)
+   {
+     z = exp ((log (p->z[j]) * old_fracchange) / new_fracchange);
+     if (z < PLL_ZMIN) z = PLL_ZMIN;
+     if (z > PLL_ZMAX) z = PLL_ZMAX;
+     p->z[j] = p->back->z[j] = z;
+   }
+}
+
+static void
+updateAllBranchLengthsRecursive (nodeptr p, int tips, double old_fracchange, double new_fracchange)
+{
+  updateBranchLength (p, old_fracchange, new_fracchange);
+
+  if (!isTip (p->number, tips))
+   {
+     updateAllBranchLengthsRecursive (p->next->back,       tips, old_fracchange, new_fracchange);
+     updateAllBranchLengthsRecursive (p->next->next->back, tips, old_fracchange, new_fracchange);
+   }
+}
+
+static void
+updateAllBranchLengths (pllInstance * tr, double old_fracchange, double new_fracchange)
+{
+  nodeptr p;
+
+  p = tr->start;
+  assert (isTip(p->number, tr->mxtips));
+
+  updateAllBranchLengthsRecursive (p->back, tr->mxtips, old_fracchange, new_fracchange);
+
+}
+
+
+/** @brief Relink the taxa
+    
+    Relink the taxa by performing a preorder traversal of the unrooted binary tree.
+    We assume that the tree is rooted such that the root is the only node of
+    out-degree 3 and in-degree 0, while all the other inner nodes have in-degree
+    1 and out-degree 2. Finally, the leaves have in-degree 1 and out-degree 0.
+
+    @param pInst
+      PLL instance
+
+    @param nTree
+      Parsed newick tree structure
+
+    @param taxaExist
+      Is the set of taxa of \a nTree a subset of the taxa of the current tree
+
+    @return
+*/
+static int
+linkTaxa (pllInstance * pInst, pllNewickTree * nTree, int taxaExist)
+{
+  nodeptr 
+    parent,
+    child;
+  pllStack 
+    * nodeStack = NULL,
+    * current;
+  int
+    i,
+    j,
+    inner = nTree->tips + 1,
+    leaf  = 1;
+  double z;
+  pllNewickNodeInfo * nodeInfo;
+
+  if (!taxaExist) pllTreeInitDefaults (pInst, nTree->tips);
+
+  /* Place the ternary root node 3 times on the stack such that later on
+     three nodes use it as their parent */
+  current = nTree->tree;
+  for (parent = pInst->nodep[inner], i  = 0; i < 3; ++ i, parent = parent->next)
+    pllStackPush (&nodeStack, parent);
+  ++ inner;
+  /* now traverse the rest of the nodes */
+  for (current = current->next; current; current = current->next)
+   {
+     parent   = (nodeptr) pllStackPop (&nodeStack);
+     nodeInfo = (pllNewickNodeInfo *) current->item;
+
+     /* if inner node place it twice on the stack (out-degree 2) */
+     if (nodeInfo->rank)
+      {
+        child = pInst->nodep[inner ++];
+        pllStackPush (&nodeStack, child->next);
+        pllStackPush (&nodeStack, child->next->next);
+      }
+     else /* check if taxon already exists, i.e. we loaded another tree topology */
+      {
+        if (taxaExist)
+         {
+           assert (pllHashSearch (pInst->nameHash, nodeInfo->name, (void **) &child));
+         }
+        else
+         {
+           child = pInst->nodep[leaf];
+           pInst->nameList[leaf] = strdup (nodeInfo->name);
+           pllHashAdd (pInst->nameHash, pllHashString(pInst->nameList[leaf], pInst->nameHash->size), pInst->nameList[leaf], (void *) (pInst->nodep[leaf]));
+           ++ leaf;
+         }
+      }
+     assert (parent);
+     /* link parent and child */
+     parent->back = child;
+     child->back  = parent;
+
+     if (!taxaExist) pInst->fracchange = 1;
+
+     /* set the branch length */
+     z = exp ((-1 * atof (nodeInfo->branch)) / pInst->fracchange);
+     if (z < PLL_ZMIN) z = PLL_ZMIN;
+     if (z > PLL_ZMAX) z = PLL_ZMAX;
+     parent->z[0] = child->z[0] = z;
+   }
+  pllStackClear (&nodeStack);
+
+  return PLL_TRUE;
+}
+
+/** @brief Get the instantaneous rate matrix
+    
+    Obtain the instantaneous rate matrix (Q) for partitionm \a model
+    of the partition list \a pr, and store it in an array \a outBuffer.
+    
+    @param tr        PLL instance
+    @param pr        List of partitions
+    @param model     Index of partition to use
+    @param outBuffer Where to store the instantaneous rate matrix 
+
+    @todo Currently, the Q matrix can be only obtained for DNA GTR data.
+
+    @return Returns \b PLL_TRUE in case of success, otherwise \b PLL_FALSE
+*/
+int pllGetInstRateMatrix (partitionList * pr, int model, double * outBuffer)
+{
+  if (pr->partitionData[model]->dataType != PLL_DNA_DATA) return (PLL_FALSE);
+
+  int  i;
+  double mean = 0;
+  double * substRates = pr->partitionData[model]->substRates;
+  double * freqs = pr->partitionData[model]->frequencies;
+  
+  /* normalize substitution rates */
+  for (i = 0; i < 6; ++ i)  substRates[i] /= substRates[5];
+
+  outBuffer[0 * 4 + 1] = (substRates[0] * freqs[1]);
+  outBuffer[0 * 4 + 2] = (substRates[1] * freqs[2]);
+  outBuffer[0 * 4 + 3] = (substRates[2] * freqs[3]);
+
+  outBuffer[1 * 4 + 0] = (substRates[0] * freqs[0]);
+  outBuffer[1 * 4 + 2] = (substRates[3] * freqs[2]);
+  outBuffer[1 * 4 + 3] = (substRates[4] * freqs[3]);
+
+  outBuffer[2 * 4 + 0] = (substRates[1] * freqs[0]);
+  outBuffer[2 * 4 + 1] = (substRates[3] * freqs[1]);
+  outBuffer[2 * 4 + 3] = (substRates[5] * freqs[3]);
+
+  outBuffer[3 * 4 + 0] = (substRates[2] * freqs[0]);
+  outBuffer[3 * 4 + 1] = (substRates[4] * freqs[1]);
+  outBuffer[3 * 4 + 2] = (substRates[5] * freqs[2]);
+
+  outBuffer[0 * 4 + 0] = -(substRates[0] * freqs[1] + substRates[1] * freqs[2] + substRates[2] * freqs[3]);
+  outBuffer[1 * 4 + 1] = -(substRates[0] * freqs[0] + substRates[3] * freqs[2] + substRates[4] * freqs[3]);
+  outBuffer[2 * 4 + 2] = -(substRates[1] * freqs[0] + substRates[3] * freqs[1] + substRates[5] * freqs[3]);
+  outBuffer[3 * 4 + 3] = -(substRates[2] * freqs[0] + substRates[4] * freqs[1] + substRates[5] * freqs[2]);
+
+  for (i = 0; i <  4; ++ i) mean         += freqs[i] * (-outBuffer[i * 4 + i]);
+  for (i = 0; i < 16; ++ i) outBuffer[i] /= mean;
+
+  return (PLL_TRUE);
+}
+
+/** @ingroup instanceLinkingGroup
+    @brief Initializes the PLL tree topology according to a parsed newick tree
+
+    Set the tree topology based on a parsed and validated newick tree
+
+    @param tree
+      The PLL instance
+
+    @param nt
+      The \a pllNewickTree wrapper structure that contains the parsed newick tree
+
+    @param useDefaultz
+      If set to \b PLL_TRUE then the branch lengths will be reset to the default
+      value.
+*/
+void
+pllTreeInitTopologyNewick (pllInstance * tr, pllNewickTree * newick, int useDefaultz)
+{
+  linkTaxa (tr, newick, tr->nameHash && checkTreeInclusion (tr, newick));
+
+  tr->start = tr->nodep[1];
+
+  if (useDefaultz == PLL_TRUE)
+    resetBranches (tr);
+}
+
+/** @brief Get the node oriented pointer from a round-about node
+
+    Returns the pointer of the round-about node $p$ that has the orientation, i.e.
+    has the \a x flag set to 1. In case a tip is passed, then the returned pointer
+    is the same as the input.
+
+    @param pInst  PLL instance
+    @param p      One of the three pointers of a round-about node
+
+    @return  Returns the the pointer that has the orientation
+*/
+nodeptr pllGetOrientedNodePointer (pllInstance * pInst, nodeptr p)
+{
+  if (p->number <= pInst->mxtips || p->x) return p;
+
+  if (p->next->x) return p->next;
+
+  return p->next->next;
+}
+
+
+//void
+//pllTreeInitTopologyNewick (pllInstance * tr, pllNewickTree * nt, int useDefaultz)
+//{
+//  pllStack * nodeStack = NULL;
+//  pllStack * head;
+//  pllNewickNodeInfo * item;
+//  int i, j, k;
+//  
+///*
+//  for (i = 0; i < partitions->numberOfPartitions; ++ i)
+//   {
+//     partitions->partitionData[i] = (pInfo *) rax_malloc (sizeof (pInfo));
+//     partitions->partitionData[i]->partitionContribution = -1.0;
+//     partitions->partitionData[i]->partitionLH           =  0.0;
+//     partitions->partitionData[i]->fracchange            =  1.0;
+//   }
+//*/
+// 
+//
+// if (tr->nameHash)
+//  {
+//    if (checkTreeInclusion (tr, nt))
+//     {
+//       printf ("It is a subset\n");
+//     }
+//    else
+//     {
+//       printf ("It is not a subset\n");
+//     }
+//  }
+//  
+//  pllTreeInitDefaults (tr, nt->tips);
+//
+//  i = nt->tips + 1;
+//  j = 1;
+//  nodeptr v;
+//  
+//  
+//  for (head = nt->tree; head; head = head->next)
+//  {
+//    item = (pllNewickNodeInfo *) head->item;
+//    if (!nodeStack)
+//     {
+//       pllStackPush (&nodeStack, tr->nodep[i]);
+//       pllStackPush (&nodeStack, tr->nodep[i]->next);
+//       pllStackPush (&nodeStack, tr->nodep[i]->next->next);
+//       ++i;
+//     }
+//    else
+//     {
+//       v = (nodeptr) pllStackPop (&nodeStack);
+//       if (item->rank)  /* internal node */
+//        {
+//          v->back           = tr->nodep[i];
+//          tr->nodep[i]->back = v; //t->nodep[v->number]
+//          pllStackPush (&nodeStack, tr->nodep[i]->next);
+//          pllStackPush (&nodeStack, tr->nodep[i]->next->next);
+//          double z = exp((-1 * atof(item->branch))/tr->fracchange);
+//          if(z < PLL_ZMIN) z = PLL_ZMIN;
+//          if(z > PLL_ZMAX) z = PLL_ZMAX;
+//          for (k = 0; k < PLL_NUM_BRANCHES; ++ k)
+//             v->z[k] = tr->nodep[i]->z[k] = z;
+//
+//          ++ i;
+//        }
+//       else             /* leaf */
+//        {
+//          v->back           = tr->nodep[j];
+//          tr->nodep[j]->back = v; //t->nodep[v->number];
+//
+//          double z = exp((-1 * atof(item->branch))/tr->fracchange);
+//          if(z < PLL_ZMIN) z = PLL_ZMIN;
+//          if(z > PLL_ZMAX) z = PLL_ZMAX;
+//          for (k = 0; k < PLL_NUM_BRANCHES; ++ k)
+//            v->z[k] = tr->nodep[j]->z[k] = z;
+//            
+//          //t->nameList[j] = strdup (item->name);
+//          tr->nameList[j] = (char *) rax_malloc ((strlen (item->name) + 1) * sizeof (char));
+//          strcpy (tr->nameList[j], item->name);
+//          
+//          pllHashAdd (tr->nameHash, tr->nameList[j], (void *) (tr->nodep[j]));
+//          ++ j;
+//        }
+//     }
+//  }
+//  
+//  tr->start = tr->nodep[1];
+//  
+//  pllStackClear (&nodeStack);
+//
+//  if (useDefaultz == PLL_TRUE) 
+//    resetBranches (tr);
+//}
+
+/** @brief Initialize PLL tree with a random topology
+
+    Initializes the PLL tree with a randomly created topology
+
+    @todo
+      Perhaps pass a seed?
+
+    @param tr
+      The PLL instance
+
+    @param tips
+      Number of tips
+
+    @param nameList
+      A set of \a tips names representing the taxa labels
+*/
+void 
+pllTreeInitTopologyRandom (pllInstance * tr, int tips, char ** nameList)
+{
+  int i;
+  pllTreeInitDefaults (tr, tips);
+
+  for (i = 1; i <= tips; ++ i)
+   {
+     tr->nameList[i] = (char *) rax_malloc ((strlen (nameList[i]) + 1) * sizeof (char));
+     strcpy (tr->nameList[i], nameList[i]);
+     pllHashAdd (tr->nameHash, pllHashString(tr->nameList[i], tr->nameHash->size), tr->nameList[i], (void *) (tr->nodep[i]));
+   }
+  
+
+  pllMakeRandomTree (tr);
+}
+
+
+/** @brief Initialize a tree that corresponds to a given (already parsed) alignment 
+
+    Initializes the PLL tree such that it corresponds to the given alignment
+
+    @todo
+      nothing 
+
+    @param tr
+      The PLL instance
+
+    @param alignmentData
+      Parsed alignment
+*/
+void 
+pllTreeInitTopologyForAlignment (pllInstance * tr, pllAlignmentData * alignmentData)
+{
+  int
+    tips = alignmentData->sequenceCount,
+    i;
+
+  char 
+    **nameList = alignmentData->sequenceLabels;
+  
+  pllTreeInitDefaults (tr, tips);
+
+  for (i = 1; i <= tips; ++ i)
+   {
+     tr->nameList[i] = (char *) rax_malloc ((strlen (nameList[i]) + 1) * sizeof (char));
+     strcpy (tr->nameList[i], nameList[i]);
+     pllHashAdd (tr->nameHash, pllHashString(tr->nameList[i], tr->nameHash->size), tr->nameList[i], (void *) (tr->nodep[i]));
+   }
+}
+
+
+/** @brief Compute a randomized stepwise addition oder parsimony tree
+
+    Implements the RAxML randomized stepwise addition order algorithm 
+
+    @todo
+      check functions that are invoked for potential memory leaks!
+
+    @param tr
+      The PLL instance
+
+    @param partitions
+      The partitions
+*/
+void pllComputeRandomizedStepwiseAdditionParsimonyTree(pllInstance * tr, partitionList * partitions)
+{
+  allocateParsimonyDataStructures(tr, partitions);
+  pllMakeParsimonyTreeFast(tr, partitions, PLL_TRUE);
+  pllFreeParsimonyDataStructures(tr, partitions);
+}
+
+/** @brief Encode the alignment data to the PLL numerical representation
+    
+    Transforms the alignment to the PLL internal representation by substituting each base 
+    with a specific digit.
+
+    @param alignmentData  Multiple sequence alignment
+    @param partitions     List of partitions
+*/
+void pllBaseSubstitute (pllInstance * tr, partitionList * partitions)
+{
+  const char * d;
+  int i, j, k;
+
+  for (i = 0; i < partitions->numberOfPartitions; ++ i)
+   {
+     switch (partitions->partitionData[i]->dataType)
+      {
+        case PLL_DNA_DATA:
+          d = PLL_MAP_NT;
+          break;
+        case PLL_BINARY_DATA:
+          d = PLL_MAP_BIN;
+          break;
+        case PLL_AA_DATA:
+          d = PLL_MAP_AA;
+          break;
+        default:
+          assert(0);
+      }
+     
+     for (j = 1; j <= tr->mxtips; ++ j)
+      {
+        for (k = partitions->partitionData[i]->lower; k < partitions->partitionData[i]->upper; ++ k)
+         {
+           tr->yVector[j][k] = d[tr->yVector[j][k]];
+         }
+      }
+   }
+}
+
+/** Clears the rearrangements history from PLL instance
+    
+    Clears the rearrangements rollback information (history) from the PLL instance \a tr.
+
+    @param tr
+      PLL instance
+*/
+void pllClearRearrangeHistory (pllInstance * tr)
+{
+  pllRollbackInfo * ri;
+
+  while ((ri = (pllRollbackInfo *)pllStackPop (&(tr->rearrangeHistory))))
+   {
+     rax_free (ri);
+   }
+}
+
+/** @brief Deallocate the PLL instance
+
+    Deallocates the library instance and all its elements.
+
+    @param tr
+      The PLL instance
+*/
+void
+pllDestroyInstance (pllInstance * tr)
+{
+  int i;
+
+  for (i = 1; i <= tr->mxtips; ++ i)
+    rax_free (tr->nameList[i]);
+  
+  pllHashDestroy (&(tr->nameHash), NULL);
+  if (tr->yVector)
+   {
+        if (tr->yVector[0]) rax_free (tr->yVector[0]);
+     rax_free (tr->yVector);
+   }
+  rax_free (tr->aliaswgt);
+  rax_free (tr->rateCategory);
+  rax_free (tr->patrat);
+  rax_free (tr->patratStored);
+  rax_free (tr->lhs);
+  rax_free (tr->td[0].parameterValues);
+  rax_free (tr->td[0].executeModel);
+  rax_free (tr->td[0].ti);
+  rax_free (tr->nameList);
+  rax_free (tr->nodep);
+  rax_free (tr->nodeBaseAddress);
+  rax_free (tr->tree_string);
+  rax_free (tr->tree0);
+  rax_free (tr->tree1);
+  rax_free (tr->tipNames);
+  rax_free (tr->constraintVector);
+  pllClearRearrangeHistory (tr);
+
+  rax_free (tr);
+
+#ifdef _FINE_GRAIN_MPI
+  pllFinalizeMPI ();
+#endif
+
+}
+
+/* initializwe a parameter linkage list for a certain parameter type (can be whatever).
+   the input is an integer vector that contaions NumberOfModels (numberOfPartitions) elements.
+
+   if we want to have all alpha parameters unlinked and have say 4 partitions the input 
+   vector would look like this: {0, 1, 2, 3}, if we want to link partitions 0 and 3 the vector 
+   should look like this: {0, 1, 2, 0} 
+*/
+
+
+
+static int init_Q_MatrixSymmetries(char *linkageString, partitionList * pr, int model)
+{
+  int 
+    states = pr->partitionData[model]->states,
+    numberOfRates = ((states * states - states) / 2), 
+    *list = (int *)rax_malloc(sizeof(int) * numberOfRates),
+    j,
+    max = -1;
+
+  char
+    *str1,
+    *saveptr,
+    *ch,
+    *token;
+
+  ch = (char *) rax_malloc (strlen (linkageString) + 1);
+  strcpy (ch, linkageString);
+
+
+  for(j = 0, str1 = ch; ;j++, str1 = (char *)NULL) 
+    {
+      token = STRTOK_R(str1, ",", &saveptr);
+      if(token == (char *)NULL)
+	break;
+      if(!(j < numberOfRates))
+	{
+	  errno = PLL_SUBSTITUTION_RATE_OUT_OF_BOUNDS;
+	  return PLL_FALSE;
+	}
+      list[j] = atoi(token);     
+    }
+  
+  rax_free(ch);
+
+  for(j = 0; j < numberOfRates; j++)
+    {
+      if(!(list[j] <= j))
+	{
+	  errno = PLL_INVALID_Q_MATRIX_SYMMETRY;
+	  return PLL_FALSE;
+	}
+      
+      if(!(list[j] <= max + 1))
+	{
+	  errno = PLL_Q_MATRIX_SYMMETRY_OUT_OF_BOUNDS;
+	  return PLL_FALSE;
+	}
+      
+      if(list[j] > max)
+	max = list[j];
+    }  
+  
+  for(j = 0; j < numberOfRates; j++)  
+    pr->partitionData[model]->symmetryVector[j] = list[j];    
+
+  //less than the maximum possible number of rate parameters
+
+  if(max < numberOfRates - 1)    
+    pr->partitionData[model]->nonGTR = PLL_TRUE;
+
+  pr->partitionData[model]->optimizeSubstitutionRates = PLL_TRUE;
+
+  rax_free(list);
+
+  return PLL_TRUE;
+}
+
+/** @brief Check parameter linkage across partitions for consistency
+ *
+ * Checks that linked alpha, substitution rate and frequency model parameters 
+ * across several partitions are consistent. E.g., when two partitions are linked 
+ * via the alpha parameter, the alpha parameter should either be set to the same 
+ * fixed value or it should be estimated!
+ *
+ * @param pr
+ *   List of partitions
+ *
+ * @todo
+ *   Call this in more functions, right now it's only invoked in the wrapper 
+ *   for modOpt() 
+ */
+static int checkLinkageConsistency(partitionList *pr)
+{
+  if(pr->dirty)
+    {
+      int 
+	i;
+      
+      linkageList 
+	*ll;
+
+      /* first deal with rates */
+
+      ll = pr->rateList;
+	
+      for(i = 0; i < ll->entries; i++)
+	{
+	  int
+	    partitions = ll->ld[i].partitions,
+	    reference = ll->ld[i].partitionList[0];
+	  
+	  if(pr->partitionData[reference]->dataType == PLL_AA_DATA)
+	    {
+	      if(pr->partitionData[reference]->protModels == PLL_GTR || pr->partitionData[reference]->nonGTR)				  
+		{
+		  if(!(pr->partitionData[reference]->optimizeSubstitutionRates == PLL_TRUE))
+		    {
+		      errno = PLL_INCONSISTENT_SUBST_RATE_OPTIMIZATION_SETTING;
+		      return PLL_FALSE;
+		    }
+		}
+	      else		
+		{
+		  if(!(pr->partitionData[reference]->optimizeSubstitutionRates == PLL_FALSE))
+		    {
+		      errno = PLL_INCONSISTENT_SUBST_RATE_OPTIMIZATION_SETTING;
+		      return PLL_FALSE;
+		    }
+		}		  
+	    }
+
+	  if(partitions > 1)
+	    {
+	      int
+		j,
+		k;
+	      
+	      for(k = 1; k < partitions; k++)
+		{
+		  int 
+		    index = ll->ld[i].partitionList[k];
+		  
+		  int
+		    states = pr->partitionData[index]->states,
+		    rates = ((states * states - states) / 2);
+		  
+		  if(!(pr->partitionData[reference]->nonGTR == pr->partitionData[index]->nonGTR))
+		    {
+		      errno = PLL_INCONSISTENT_SUBST_RATE_OPTIMIZATION_SETTING;
+		      return PLL_FALSE;
+		    }
+		  if(!(pr->partitionData[reference]->optimizeSubstitutionRates == pr->partitionData[index]->optimizeSubstitutionRates))
+		    {
+		      errno = PLL_INCONSISTENT_SUBST_RATE_OPTIMIZATION_SETTING;
+		      return PLL_FALSE;
+		    }
+		
+		  
+		  if(pr->partitionData[reference]->nonGTR)
+		    {		   
+		      
+		      for(j = 0; j < rates; j++)			
+			{
+			  if(!(pr->partitionData[reference]->symmetryVector[j] == pr->partitionData[index]->symmetryVector[j]))
+			    {
+			      errno = PLL_INCONSISTENT_Q_MATRIX_SYMMETRIES_ACROSS_LINKED_PARTITIONS;
+			      return PLL_FALSE;
+			    }
+			}
+		    }
+		  
+		 
+		  for(j = 0; j < rates; j++)
+		    {
+		      if(!(pr->partitionData[reference]->substRates[j] == pr->partitionData[index]->substRates[j]))
+			{
+			  errno = PLL_INCONSISTENT_Q_MATRIX_ENTRIES_ACROSS_LINKED_PARTITIONS;
+			  return PLL_FALSE;
+			}
+		    }
+		}	    
+	    }
+	}
+      
+      /* then deal with alpha parameters */
+
+      ll = pr->alphaList;
+
+      for(i = 0; i < ll->entries; i++)
+	{
+	  int
+	    partitions = ll->ld[i].partitions;
+	  
+	  if(partitions > 1)
+	    {
+	      int
+		k, 
+		reference = ll->ld[i].partitionList[0];
+	      
+	      for(k = 1; k < partitions; k++)
+		{
+		  int 
+		    index = ll->ld[i].partitionList[k];		  		 
+
+		  if(!(pr->partitionData[reference]->optimizeAlphaParameter == pr->partitionData[index]->optimizeAlphaParameter))
+		    {
+		      errno = PLL_INCONSISTENT_ALPHA_STATES_ACROSS_LINKED_PARTITIONS;
+		      return PLL_FALSE;
+		    }
+		  if(!(pr->partitionData[reference]->alpha == pr->partitionData[index]->alpha))
+		    {
+		      errno = PLL_INCONSISTENT_ALPHA_VALUES_ACROSS_LINKED_PARTITIONS;
+		      return PLL_FALSE;
+		    }
+		}	    
+	    }
+	}
+
+      /* and then deal with base frequencies */
+
+      ll = pr->freqList;
+
+      for(i = 0; i < ll->entries; i++)
+	{
+	  int	  
+	    partitions = ll->ld[i].partitions;
+	  
+	  if(partitions > 1)
+	    {
+	      int		
+		k, 
+		reference = ll->ld[i].partitionList[0];
+	      
+	      for(k = 1; k < partitions; k++)
+		{
+		  int
+		    j,
+		    index = ll->ld[i].partitionList[k],
+		    states = pr->partitionData[index]->states;		  		 
+
+		  if(!(pr->partitionData[reference]->optimizeBaseFrequencies == pr->partitionData[index]->optimizeBaseFrequencies))
+		    {
+		      errno = PLL_INCONSISTENT_FREQUENCY_STATES_ACROSS_LINKED_PARTITIONS;
+		      return PLL_FALSE;
+		    }
+
+		  for(j = 0; j < states; j++)
+		    {
+		      if(!(pr->partitionData[reference]->frequencies[j] == pr->partitionData[index]->frequencies[j]))
+			{
+			  errno = PLL_INCONSISTENT_FREQUENCY_VALUES_ACROSS_LINKED_PARTITIONS;
+			  return PLL_FALSE;
+			}
+		    }
+		}	    
+	    }
+	}
+      
+      pr->dirty = PLL_FALSE;
+    }
+
+  return PLL_TRUE;
+}
+/** @brief Set symmetries among parameters in the Q matrix
+    
+    Allows to link some or all rate parameters in the Q-matrix 
+    for obtaining simpler models than GTR
+
+    @param string
+      string describing the symmetry pattern among the rates in the Q matrix
+
+    @param pr
+      List of partitions
+      
+    @param model
+      Index of the partition for which we want to set the Q matrix symmetries
+
+    @todo
+      nothing
+*/
+int pllSetSubstitutionRateMatrixSymmetries(char *string, partitionList * pr, int model)
+{
+  int 
+    result = init_Q_MatrixSymmetries(string, pr, model);
+
+  pr->dirty = PLL_TRUE;
+
+  return result;
+}
+
+/** @defgroup modelParamsGroup Model parameters setup and retrieval
+    
+    This set of functions is responsible for setting, retrieving, and optimizing
+    model parameters. It also contains functions for linking model parameters
+    across partitions.
+*/
+
+/** @ingroup modelParamsGroups
+    @brief Set the alpha parameter of the Gamma model to a fixed value for a partition
+    
+    Sets the alpha parameter of the gamma model of rate heterogeneity to a fixed value
+    and disables the optimization of this parameter 
+
+    @param alpha
+      alpha value
+
+    @param model
+      Index of the partition for which we want to set the alpha value
+
+    @param pr
+      List of partitions
+      
+    @param tr
+      Library instance for which we want to fix alpha 
+
+    @todo
+      test if this works with the parallel versions
+*/
+void pllSetFixedAlpha(double alpha, int model, partitionList * pr, pllInstance *tr)
+{
+  //make sure that we are swetting alpha for a partition within the current range 
+  //of partitions
+  double old_fracchange = tr->fracchange;
+
+  assert(model >= 0 && model < pr->numberOfPartitions);
+
+  assert(alpha >= PLL_ALPHA_MIN && alpha <= PLL_ALPHA_MAX);
+
+  //set the alpha paremeter 
+  
+  pr->partitionData[model]->alpha = alpha;
+
+  //do the discretization of the gamma curve
+
+  pllMakeGammaCats(pr->partitionData[model]->alpha, pr->partitionData[model]->gammaRates, 4, tr->useMedian);
+
+  //broadcast the changed parameters to all threads/MPI processes 
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+  pllMasterBarrier(tr, pr, PLL_THREAD_COPY_ALPHA);
+#endif
+
+  pr->partitionData[model]->optimizeAlphaParameter = PLL_FALSE;
+
+  pr->dirty = PLL_FALSE;
+  updateAllBranchLengths (tr, old_fracchange, tr->fracchange);
+}
+
+/** @ingroup modelParamsGroups
+    @brief Get the rate categories of the Gamma model of a partition
+
+    Gets the gamma rate categories of the Gamma model of rate heterogeneity
+    of partition \a pid from partition list \a pr.
+
+    @param pr   List of partitions
+    @param pid  Index of partition to use
+    @param outBuffer  Output buffer where to store the rates
+*/
+void pllGetGammaRates (partitionList * pr, int pid, double * outBuffer)
+{
+  /* TODO: Change the hardcoded 4 and also add a check that this partition
+     really uses gamma. Currently, instance is also not required */
+  memcpy (outBuffer, pr->partitionData[pid]->gammaRates, 4 * sizeof (double));
+}
+
+/** @ingroup modelParamsGroups
+    @brief Get the alpha parameter of the Gamma model of a partition
+
+    Returns the alpha parameter of the gamma model of rate heterogeneity
+    of partition \a pid from partition list \a pr.
+
+    @param pr   List of partitions
+    @param pid  Index of partition to use
+
+    @return
+      Alpha parameter
+*/
+double pllGetAlpha (partitionList * pr, int pid)
+{
+  /* TODO: check if the partition uses gamma */
+  return (pr->partitionData[pid]->alpha);
+}
+
+
+/** @ingroup modelParamsGroups
+    @brief Get the base frequencies of a partition
+
+    Gets the base frequencies of partition \a model from partition list
+    \a partitionList and stores them in \a outBuffer. Note that \outBuffer
+    must be of size s, where s is the number of states.
+
+    @param  tr       PLL instance
+    @param pr        List of partitions
+    @param model     Index of the partition for which we want to get the base frequencies
+    @param outBuffer Buffer where to store the base frequencies
+*/
+void pllGetBaseFrequencies(partitionList * pr, int model, double * outBuffer)
+{
+  memcpy (outBuffer, pr->partitionData[model]->frequencies, pr->partitionData[model]->states * sizeof (double));
+}
+
+
+/** @ingroup modelParamsGroups
+    @brief Set all base frequencies to a fixed value for a partition
+    
+    Sets all base freuqencies of a partition to fixed values and disables 
+    ML optimization of these parameters 
+
+    @param f
+      array containing the base frequencies
+
+    @param  length
+      length of array f, this needs to be as long as the number of 
+      states in the model, otherwise an assertion will fail!
+
+    @param model
+      Index of the partition for which we want to set the frequencies 
+
+    @param pr
+      List of partitions
+      
+    @param tr
+      Library instance for which we want to fix the base frequencies
+
+    @todo
+      test if this works with the parallel versions
+*/
+void pllSetFixedBaseFrequencies(double *f, int length, int model, partitionList * pr, pllInstance *tr)
+{
+  int 
+    i;
+
+  double 
+    acc = 0.0,
+    old_fracchange;
+
+  old_fracchange = tr->fracchange;
+
+  //make sure that we are setting the base frequencies for a partition within the current range 
+  //of partitions
+  assert(model >= 0 && model < pr->numberOfPartitions);
+
+  //make sure that the length of the input array f containing the frequencies 
+  //is as long as the number of states in the model 
+  assert(length == pr->partitionData[model]->states);
+
+
+  //make sure that the base frequencies sum approximately to 1.0
+  
+  for(i = 0; i < length; i++)
+    acc += f[i];
+
+  if(fabs(acc - 1.0) > 0.000001)
+    assert(0);
+
+  //copy the base frequencies 
+  memcpy(pr->partitionData[model]->frequencies, f, sizeof(double) * length);
+
+  //re-calculate the Q matrix 
+  pllInitReversibleGTR(tr, pr, model);
+
+
+  //broadcast the new Q matrix to all threads/processes 
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+  pllMasterBarrier (tr, pr, PLL_THREAD_COPY_RATES);
+#endif
+  
+  pr->partitionData[model]->optimizeBaseFrequencies = PLL_FALSE;
+
+  pr->dirty = PLL_TRUE;
+  updateAllBranchLengths (tr, old_fracchange, tr->fracchange);
+}
+
+/** @ingroup modelParamsGroups
+    @brief Set that the base freuqencies are optimized under ML
+    
+    The base freuqencies for partition model will be optimized under ML    
+
+    @param model
+      Index of the partition for which we want to optimize base frequencies 
+
+    @param pr
+      List of partitions
+      
+    @param tr
+      Library instance for which we want to fix the base frequencies
+
+    @todo
+      test if this works with the parallel versions
+*/
+int pllSetOptimizeBaseFrequencies(int model, partitionList * pr, pllInstance *tr)
+{
+  int
+    states,
+    i;
+
+  double 
+    initialFrequency,
+    acc = 0.0;
+
+  //make sure that we are setting the base frequencies for a partition within the current range 
+  //of partitions
+  if(!(model >= 0 && model < pr->numberOfPartitions))
+    {
+      errno = PLL_PARTITION_OUT_OF_BOUNDS;
+      return PLL_FALSE;
+    }
+
+  //set the number of states/ferquencies in this partition 
+  states = pr->partitionData[model]->states;
+
+  //set all frequencies to 1/states
+  
+  initialFrequency = 1.0 / (double)states;
+
+  for(i = 0; i < states; i++)
+    pr->partitionData[model]->frequencies[i] = initialFrequency;
+
+  //make sure that the base frequencies sum approximately to 1.0
+  
+  for(i = 0; i < states; i++)
+    acc += pr->partitionData[model]->frequencies[i];
+
+  if(fabs(acc - 1.0) > 0.000001)
+    {
+      errno = PLL_BASE_FREQUENCIES_DO_NOT_SUM_TO_1;
+      return PLL_FALSE;
+    }
+
+  //re-calculate the Q matrix 
+  pllInitReversibleGTR(tr, pr, model);
+
+  //broadcast the new Q matrix to all threads/processes 
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+  pllMasterBarrier (tr, pr, PLL_THREAD_COPY_RATES);
+#endif
+  
+  pr->partitionData[model]->optimizeBaseFrequencies = PLL_TRUE;
+
+  pr->dirty = PLL_TRUE;
+
+  return PLL_TRUE;
+}
+
+
+
+
+/** @ingroup modelParamsGroups
+    @brief Get the substitution rates for a specific partition
+
+    Gets the substitution rates of partition \a model from partition list
+    \a partitionList and stores them in \a outBuffer. Note that \outBuffer
+    must be of size (2 * s - s) / 2, where s is the number of states, i.e.
+    the number of upper diagonal entries of the Q matrix.
+
+    @param tr        PLL instance
+    @param pr        List of partitions
+    @param model     Index of partition for which we want to get the substitution rates
+    @param outBuffer Buffer where to store the substitution rates.
+*/
+void pllGetSubstitutionMatrix (partitionList * pr, int model, double * outBuffer)
+{
+  int 
+    rates,
+    states;
+  
+  states = pr->partitionData[model]->states;
+  rates = (states * states - states) / 2;
+
+  memcpy (outBuffer, pr->partitionData[model]->substRates, rates * sizeof (double));
+}
+
+/** @ingroup modelParamsGroups
+     @brief Set all substitution rates for a specific partition and disable ML optimization for them
+    
+    Sets all substitution rates of a partition to fixed values and disables 
+    ML optimization of these parameters. It will automatically re-scale the relative rates  
+    such that the last rate is 1.0 
+
+    @param f
+      array containing the substitution rates
+
+    @param length
+      length of array f, this needs to be as long as: (s * s - s) / 2,
+      i.e., the number of upper diagonal entries of the Q matrix
+
+    @param model
+      Index of the partition for which we want to set/fix the substitution rates
+
+    @param pr
+      List of partitions
+      
+    @param tr
+      Library instance for which we want to fix the substitution rates 
+
+    @todo
+      test if this works with the parallel versions
+*/
+void pllSetFixedSubstitutionMatrix(double *q, int length, int model, partitionList * pr,  pllInstance *tr)
+{
+  pllSetSubstitutionMatrix(q, length, model, pr, tr);
+  pr->partitionData[model]->optimizeSubstitutionRates = PLL_FALSE;
+}
+
+/** @ingroup modelParamsGroups
+     @brief Set all substitution rates for a specific partition
+    
+    Sets all substitution rates of a partition to the given values.
+    It will automatically re-scale the relative rates such that the last rate is 1.0 
+
+    @param f
+      array containing the substitution rates
+
+    @param length
+      length of array f, this needs to be as long as: (s * s - s) / 2,
+      i.e., the number of upper diagonal entries of the Q matrix
+
+    @param model
+      Index of the partition for which we want to set/fix the substitution rates
+
+    @param pr
+      List of partitions
+      
+    @param tr
+      Library instance for which we want to fix the substitution rates 
+
+    @todo
+      test if this works with the parallel versions
+*/
+void pllSetSubstitutionMatrix(double *q, int length, int model, partitionList * pr,  pllInstance *tr)
+{
+  int 
+    i,
+    numberOfRates; 
+
+  double
+    scaler,
+    old_fracchange;
+
+  old_fracchange = tr->fracchange;
+
+  //make sure that we are setting the Q matrix for a partition within the current range 
+  //of partitions
+  assert(model >= 0 && model < pr->numberOfPartitions);
+
+  numberOfRates = (pr->partitionData[model]->states * pr->partitionData[model]->states - pr->partitionData[model]->states) / 2;
+
+  //  make sure that the length of the array containing the subsitution rates 
+  //  corresponds to the number of states in the model
+
+  assert(length == numberOfRates);
+
+  //automatically scale the last rate to 1.0 if this is not already the case
+
+  if(q[length - 1] != 1.0)    
+    scaler = 1.0 / q[length - 1]; 
+  else
+    scaler = 1.0;
+
+  //set the rates for the partition and make sure that they are within the allowed bounds 
+
+  for(i = 0; i < length; i++)
+    {
+      double
+	r = q[i] * scaler;
+      
+      assert(r >= PLL_RATE_MIN && r <= PLL_RATE_MAX);
+      
+      pr->partitionData[model]->substRates[i] = r;
+    }
+
+  //re-calculate the Q matrix 
+  pllInitReversibleGTR(tr, pr, model);
+
+  //broadcast the new Q matrix to all threads/processes 
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+  pllMasterBarrier (tr, pr, PLL_THREAD_COPY_RATES);
+#endif
+  
+
+  pr->dirty = PLL_TRUE;
+  updateAllBranchLengths (tr, old_fracchange, tr->fracchange);
+}
+
+
+
+
+/* initialize a parameter linkage list for a certain parameter type (can be whatever).
+   the input is an integer vector that contaions NumberOfModels (numberOfPartitions) elements.
+
+   if we want to have all alpha parameters unlinked and have say 4 partitions the input 
+   vector would look like this: {0, 1, 2, 3}, if we want to link partitions 0 and 3 the vector 
+   should look like this: {0, 1, 2, 0} 
+*/
+
+/** @ingroup modelParamsGroups
+*/
+linkageList* initLinkageList(int *linkList, partitionList *pr)
+{
+  int 
+    k,
+    partitions,
+    numberOfModels = 0,
+    i,
+    pos;
+  
+  linkageList 
+    *ll = (linkageList*)rax_malloc(sizeof(linkageList));
+    
+  /* figure out how many distinct parameters we need to estimate 
+     in total, if all parameters are linked the result will be 1 if all 
+     are unlinked the result will be pr->numberOfPartitions */
+  
+  for(i = 0; i < pr->numberOfPartitions; i++)
+    {
+      if(!(linkList[i] >= 0 && linkList[i] < pr->numberOfPartitions))
+	{
+	  errno = PLL_LINKAGE_LIST_OUT_OF_BOUNDS;
+	  return (linkageList*)NULL;
+	}
+
+      if(!(linkList[i] <= i && linkList[i] <= numberOfModels + 1))
+	{
+	  errno = PLL_LINKAGE_LIST_OUT_OF_BOUNDS;
+	  return (linkageList*)NULL;
+	}
+
+      if(linkList[i] > numberOfModels)
+	numberOfModels = linkList[i];
+
+    }
+
+  numberOfModels++;
+  
+  /* allocate the linkage list data structure that containes information which parameters of which partition are 
+     linked with each other.
+
+     Note that we need a separate invocation of initLinkageList() and a separate linkage list 
+     for each parameter type */
+
+  ll->entries = numberOfModels;
+  ll->ld      = (linkageData*)rax_malloc(sizeof(linkageData) * numberOfModels);
+
+  /* noe loop over the number of free parameters and assign the corresponding partitions to each parameter */
+
+  for(i = 0; i < numberOfModels; i++)
+    {
+      /* 
+	 the valid flag is used for distinguishing between DNA and protein data partitions.
+	 This can be used to enable/disable parameter optimization for the paremeter 
+	 associated to the corresponding partitions. This deature is used in optRatesGeneric 
+	 to first optimize all DNA GTR rate matrices and then all PROT GTR rate matrices */
+
+      ll->ld[i].valid = PLL_TRUE;
+      partitions = 0;
+
+      /* now figure out how many partitions share this joint parameter */
+
+      for(k = 0; k < pr->numberOfPartitions; k++)
+	if(linkList[k] == i)
+	  partitions++;	    
+
+      /* assign a list to store the partitions that share the parameter */
+
+      ll->ld[i].partitions = partitions;
+      ll->ld[i].partitionList = (int*)rax_malloc(sizeof(int) * partitions);
+      
+      /* now store the respective partition indices in this list */
+      
+      for(k = 0, pos = 0; k < pr->numberOfPartitions; k++)
+	if(linkList[k] == i)
+	  ll->ld[i].partitionList[pos++] = k;
+    }
+
+  /* return the linkage list for the parameter */
+
+  return ll;
+}
+
+
+
+static linkageList* initLinkageListString(char *linkageString, partitionList * pr)
+{
+  int 
+    *list = (int*)rax_malloc(sizeof(int) * pr->numberOfPartitions),
+    j;
+
+  linkageList 
+    *l;
+
+  char
+    *str1,
+    *saveptr,
+//    *ch = strdup(linkageString),
+    *ch,
+    *token;
+  
+  ch = (char *) rax_malloc (strlen (linkageString) + 1);
+  strcpy (ch, linkageString);
+
+  for(j = 0, str1 = ch; ;j++, str1 = (char *)NULL) 
+    {
+      token = STRTOK_R(str1, ",", &saveptr);
+      if(token == (char *)NULL)
+	break;
+      assert(j < pr->numberOfPartitions);
+      list[j] = atoi(token);
+    }
+  
+  rax_free(ch);
+
+  l = initLinkageList(list, pr);
+  
+  rax_free(list);
+
+  return l;
+}
+
+/** @ingroup modelParamsGroups
+    @brief Link alpha parameters across partitions
+    
+    Links alpha paremeters across partitions (GAMMA model of rate heterogeneity)
+
+    @param string
+      string describing the linkage pattern    
+
+    @param pr
+      List of partitions
+
+    @todo
+      test behavior/impact/mem-leaks of this when PSR model is used 
+      it shouldn't do any harm, but it would be better to check!
+*/
+int pllLinkAlphaParameters(char *string, partitionList *pr)
+{
+  //assumes that it has already been assigned once
+  freeLinkageList(pr->alphaList);
+  
+  pr->alphaList = initLinkageListString(string, pr); 
+
+  pr->dirty = PLL_TRUE;
+  
+  if(!pr->alphaList)
+    return PLL_FALSE;
+  else
+    return PLL_TRUE;
+}
+
+/** @ingroup modelParamsGroups
+    @brief Link base frequency parameters across partitions
+    
+    Links base frequency paremeters across partitions
+
+    @param string
+      string describing the linkage pattern    
+
+    @param pr
+      List of partitions
+
+    @todo
+      semantics of this function not clear yet: right now this only has an effect 
+      when we do a ML estimate of base frequencies 
+      when we use empirical or model-defined (protein data) base frequencies, one could 
+      maybe average over the per-partition frequencies, but the averages would need to be weighted 
+      accodring on the number of patterns per partition 
+*/
+int pllLinkFrequencies(char *string, partitionList *pr)
+{
+  //assumes that it has already been assigned once
+  freeLinkageList(pr->freqList);
+
+  pr->freqList = initLinkageListString(string, pr);
+
+  pr->dirty = PLL_TRUE;
+
+  if(!pr->freqList)
+    return PLL_FALSE;
+  else
+    return PLL_TRUE;
+}
+
+/** @ingroup modelParamsGroups
+    @brief Link Substitution matrices across partitions
+    
+    Links substitution matrices (Q matrices) across partitions
+
+    @param string
+      string describing the linkage pattern    
+
+    @param pr
+      List of partitions
+
+    @todo
+      re-think/re-design how this is done for protein
+      models
+*/
+int pllLinkRates(char *string, partitionList *pr)
+{
+  //assumes that it has already been assigned once
+  freeLinkageList(pr->rateList);
+  
+  pr->rateList = initLinkageListString(string, pr);
+  
+  pr->dirty = PLL_TRUE;  
+
+  if(!pr->dirty)
+    return PLL_FALSE;
+  else
+    return PLL_TRUE;
+}
+
+
+
+
+/** @ingroup modelParamsGroups
+    @brief Initialize partitions according to model parameters
+    
+    Initializes partitions according to model parameters.
+
+    @param tr              The PLL instance
+    @param partitions      List of partitions
+    @param alignmentData   The parsed alignment
+    @return                Returns \b PLL_TRUE in case of success, otherwise \b PLL_FALSE
+*/
+int pllInitModel (pllInstance * tr, partitionList * partitions) 
+{
+  double ** ef;
+  int
+    i,
+    *unlinked = (int *)rax_malloc(sizeof(int) * partitions->numberOfPartitions);
+  double old_fracchange = tr->fracchange;
+
+  ef = pllBaseFrequenciesInstance (tr, partitions);
+
+  if(!ef)
+    return PLL_FALSE;
+
+  
+#if ! (defined(__ppc) || defined(__powerpc__) || defined(PPC))
+#if (defined(__AVX) || defined(__SSE3))
+  _mm_setcsr( _mm_getcsr() | _MM_FLUSH_ZERO_ON);
+#endif
+#endif 
+
+#ifdef _USE_PTHREADS
+  tr->threadID = 0;
+#ifndef _PORTABLE_PTHREADS
+  /* not very portable thread to core pinning if PORTABLE_PTHREADS is not defined
+     by defualt the cod ebelow is deactivated */
+  pinToCore(0);
+#endif
+#endif
+
+#if (defined(_FINE_GRAIN_MPI) || defined(_USE_PTHREADS))
+  /* 
+     this main function is the master thread, so if we want to run RAxML with n threads,
+     we use pllStartPthreads to start the n-1 worker threads */
+  
+#ifdef _USE_PTHREADS
+  pllStartPthreads (tr, partitions);
+#endif
+
+  /* via pllMasterBarrier() we invoke parallel regions in which all Pthreads work on computing something, mostly likelihood 
+     computations. Have a look at execFunction() in axml.c where we siwtch of the different types of parallel regions.
+
+     Although not necessary, below we copy the info stored on tr->partitionData to corresponding copies in each thread.
+     While this is shared memory and we don't really need to copy stuff, it was implemented like this to allow for an easier 
+     transition to a distributed memory implementation (MPI).
+     */
+#ifdef _FINE_GRAIN_MPI
+  //MPI_Bcast (&(partitions->numberOfPartitions), 1, MPI_INT, MPI_ROOT, MPI_COMM_WORLD);
+  MPI_Bcast (&(partitions->numberOfPartitions), 1, MPI_INT, 0, MPI_COMM_WORLD);
+#endif
+  
+  /* mpi version now also uses the generic barrier */
+  pllMasterBarrier (tr, partitions, PLL_THREAD_INIT_PARTITION);
+#else  /* SEQUENTIAL */
+  /* 
+     allocate the required data structures for storing likelihood vectors etc 
+     */
+
+  //initializePartitions(tr, tr, partitions, partitions, 0, 0);
+  initializePartitionsSequential (tr, partitions);
+#endif
+  
+  //initializePartitions (tr, tr, partitions, partitions, 0, 0);
+  
+  initModel (tr, ef, partitions);
+  pllEmpiricalFrequenciesDestroy (&ef, partitions->numberOfPartitions);
+
+  for(i = 0; i < partitions->numberOfPartitions; i++)
+    unlinked[i] = i;
+
+  //by default everything is unlinked initially 
+  partitions->alphaList = initLinkageList(unlinked, partitions);
+  partitions->freqList  = initLinkageList(unlinked, partitions);
+  partitions->rateList  = initLinkageList(unlinked, partitions);
+
+  rax_free(unlinked);
+
+  updateAllBranchLengths (tr, old_fracchange ? old_fracchange : 1,  tr->fracchange);
+  pllEvaluateLikelihood (tr, partitions, tr->start, PLL_TRUE, PLL_FALSE);
+
+  return PLL_TRUE;
+}
+ 
+/** @ingroup modelParamsGroups
+    @brief Optimize all free model parameters of the likelihood model
+    
+    Initializes partitions according to model parameters.
+
+    @param tr
+      The PLL instance
+
+    @param pr
+      List of partitions
+
+    @param likelihoodEpsilon
+      Specifies up to which epsilon in likelihood values the iterative routine will 
+      be optimizing the parameters  
+*/
+int pllOptimizeModelParameters(pllInstance *tr, partitionList *pr, double likelihoodEpsilon)
+{
+  //force the consistency check
+
+  pr->dirty = PLL_TRUE;
+
+  if(!checkLinkageConsistency(pr))
+    return PLL_FALSE;
+
+  modOpt(tr, pr, likelihoodEpsilon);
+
+  return PLL_TRUE;
+}
+
+/** @brief Read the contents of a file
+    
+    Reads the ile \a filename and return its content. In addition
+    the size of the file is stored in the input variable \a filesize.
+    The content of the variable \a filesize can be anything and will
+    be overwritten.
+
+    @param filename
+      Name of the input file
+
+    @param filesize
+      Input parameter where the size of the file (in bytes) will be stored
+
+    @return
+      Contents of the file
+*/
+char * 
+pllReadFile (const char * filename, long * filesize)
+{
+  FILE * fp;
+  char * rawdata;
+
+  fp = fopen (filename, "r");
+  if (!fp) return (NULL);
+
+  /* obtain file size */
+  if (fseek (fp, 0, SEEK_END) == -1)
+   {
+     fclose (fp);
+     return (NULL);
+   }
+
+  *filesize = ftell (fp);
+
+  if (*filesize == -1) 
+   {
+     fclose (fp);
+     return (NULL);
+   }
+  rewind (fp);
+
+  /* allocate buffer and read file contents */
+  rawdata = (char *) rax_malloc (((*filesize) + 1) * sizeof (char));
+  if (rawdata) 
+   {
+     if (fread (rawdata, sizeof (char), *filesize, fp) != (size_t) *filesize) 
+      {
+        rax_free (rawdata);
+        rawdata = NULL;
+      }
+     else
+      {
+        rawdata[*filesize] = 0;
+      }
+   }
+
+  fclose (fp);
+
+  return (rawdata);
+}
+
+static void getInnerBranchEndPointsRecursive (nodeptr p, int tips, int * i, node **nodes)
+{
+  if (!isTip (p->next->back->number, tips))
+   {
+     nodes[(*i)++] = p->next;
+     getInnerBranchEndPointsRecursive(p->next->back, tips, i, nodes);
+   }
+  if (!isTip (p->next->next->back->number, tips))
+   {
+     nodes[(*i)++] = p->next->next;
+     getInnerBranchEndPointsRecursive(p->next->next->back, tips, i, nodes);
+   }
+}
+
+node ** pllGetInnerBranchEndPoints (pllInstance * tr)
+{
+  node ** nodes;
+  nodeptr p;
+  int i = 0;
+
+  nodes = (node **) rax_calloc(tr->mxtips - 3, sizeof(node *));
+
+  p = tr->start;
+  assert (isTip(p->number, tr->mxtips));
+
+  getInnerBranchEndPointsRecursive(p->back, tr->mxtips, &i, nodes);
+
+  return nodes;
+}
+
diff --git a/m4/ax_cxx_compile_stdcxx_11.m4 b/m4/ax_cxx_compile_stdcxx_11.m4
new file mode 100644
index 0000000..90e674b
--- /dev/null
+++ b/m4/ax_cxx_compile_stdcxx_11.m4
@@ -0,0 +1,136 @@
+# ============================================================================
+#  http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html
+# ============================================================================
+#
+# SYNOPSIS
+#
+#   AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional])
+#
+# DESCRIPTION
+#
+#   Check for baseline language coverage in the compiler for the C++11
+#   standard; if necessary, add switches to CXXFLAGS to enable support.
+#
+#   The first argument, if specified, indicates whether you insist on an
+#   extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
+#   -std=c++11).  If neither is specified, you get whatever works, with
+#   preference for an extended mode.
+#
+#   The second argument, if specified 'mandatory' or if left unspecified,
+#   indicates that baseline C++11 support is required and that the macro
+#   should error out if no mode with that support is found.  If specified
+#   'optional', then configuration proceeds regardless, after defining
+#   HAVE_CXX11 if and only if a supporting mode is found.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Benjamin Kosnik <bkoz at redhat.com>
+#   Copyright (c) 2012 Zack Weinberg <zackw at panix.com>
+#   Copyright (c) 2013 Roy Stogner <roystgnr at ices.utexas.edu>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved. This file is offered as-is, without any
+#   warranty.
+
+#serial 3
+
+m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [
+  template <typename T>
+    struct check
+    {
+      static_assert(sizeof(int) <= sizeof(T), "not big enough");
+    };
+
+    typedef check<check<bool>> right_angle_brackets;
+
+    int a;
+    decltype(a) b;
+
+    typedef check<int> check_type;
+    check_type c;
+    check_type&& cr = static_cast<check_type&&>(c);
+
+    auto d = a;
+    auto&& g = a; 
+        
+    void* tmp = nullptr; 
+])
+
+AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl
+  m4_if([$1], [], [],
+        [$1], [ext], [],
+        [$1], [noext], [],
+        [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl
+  m4_if([$2], [], [ax_cxx_compile_cxx11_required=true],
+        [$2], [mandatory], [ax_cxx_compile_cxx11_required=true],
+        [$2], [optional], [ax_cxx_compile_cxx11_required=false],
+        [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])])dnl
+  AC_LANG_PUSH([C++])dnl
+  ac_success=no
+  AC_CACHE_CHECK(whether $CXX supports C++11 features by default,
+  ax_cv_cxx_compile_cxx11,
+  [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
+    [ax_cv_cxx_compile_cxx11=yes],
+    [ax_cv_cxx_compile_cxx11=no])])
+  if test x$ax_cv_cxx_compile_cxx11 = xyes; then
+    ac_success=yes
+  fi
+
+  m4_if([$1], [noext], [], [dnl
+  if test x$ac_success = xno; then
+    for switch in -std=gnu++11 -std=gnu++0x; do
+      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
+      AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
+                     $cachevar,
+        [ac_save_CXXFLAGS="$CXXFLAGS"
+         CXXFLAGS="$CXXFLAGS $switch"
+         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
+          [eval $cachevar=yes],
+          [eval $cachevar=no])
+         CXXFLAGS="$ac_save_CXXFLAGS"])
+      if eval test x\$$cachevar = xyes; then
+        CXXFLAGS="$CXXFLAGS $switch"
+        ac_success=yes
+        break
+      fi
+    done
+  fi])
+
+  m4_if([$1], [ext], [], [dnl
+  if test x$ac_success = xno; then
+    for switch in -std=c++11 -std=c++0x; do
+      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
+      AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
+                     $cachevar,
+        [ac_save_CXXFLAGS="$CXXFLAGS"
+         CXXFLAGS="$CXXFLAGS $switch"
+         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
+          [eval $cachevar=yes],
+          [eval $cachevar=no])
+         CXXFLAGS="$ac_save_CXXFLAGS"])
+      if eval test x\$$cachevar = xyes; then
+        CXXFLAGS="$CXXFLAGS $switch"
+        ac_success=yes
+        break
+      fi
+    done
+  fi])
+  AC_LANG_POP([C++])
+  if test x$ax_cxx_compile_cxx11_required = xtrue; then
+    if test x$ac_success = xno; then
+      AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.])
+    fi
+  else
+    if test x$ac_success = xno; then
+      HAVE_CXX11=0
+      AC_MSG_ERROR([No compiler with C++11 support was found])
+    else
+      HAVE_CXX11=1
+      AC_DEFINE(HAVE_CXX11,1,
+                [define if the compiler supports basic C++11 syntax])
+    fi
+
+    AC_SUBST(HAVE_CXX11)
+  fi
+])
diff --git a/m4/ax_ext.m4 b/m4/ax_ext.m4
new file mode 100644
index 0000000..aa3ae01
--- /dev/null
+++ b/m4/ax_ext.m4
@@ -0,0 +1,213 @@
+# ===========================================================================
+#          http://www.gnu.org/software/autoconf-archive/ax_ext.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_EXT
+#
+# DESCRIPTION
+#
+#   Find supported SIMD extensions by requesting cpuid. When an SIMD
+#   extension is found, the -m"simdextensionname" is added to SIMD_FLAGS if
+#   compilator supports it. For example, if "sse2" is available, then
+#   "-msse2" is added to SIMD_FLAGS.
+#
+#   This macro calls:
+#
+#     AC_SUBST(SIMD_FLAGS)
+#
+#   And defines:
+#
+#     HAVE_MMX / HAVE_SSE / HAVE_SSE2 / HAVE_SSE3 / HAVE_SSSE3 / HAVE_SSE4.1 / HAVE_SSE4.2 / HAVE_AVX
+#
+# LICENSE
+#
+#   Copyright (c) 2007 Christophe Tournayre <turn3r at users.sourceforge.net>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved. This file is offered as-is, without any
+#   warranty.
+
+#serial 10
+
+AC_DEFUN([AX_EXT],
+[
+  AC_REQUIRE([AC_CANONICAL_HOST])
+
+  case $host_cpu in
+    powerpc*)
+      AC_CACHE_CHECK([whether altivec is supported], [ax_cv_have_altivec_ext],
+          [
+            if test `/usr/sbin/sysctl -a 2>/dev/null| grep -c hw.optional.altivec` != 0; then
+                if test `/usr/sbin/sysctl -n hw.optional.altivec` = 1; then
+                  ax_cv_have_altivec_ext=yes
+                fi
+            fi
+          ])
+
+          if test "$ax_cv_have_altivec_ext" = yes; then
+            AC_DEFINE(HAVE_ALTIVEC,,[Support Altivec instructions])
+            AX_CHECK_COMPILE_FLAG(-faltivec, SIMD_FLAGS="$SIMD_FLAGS -faltivec", [])
+          fi
+    ;;
+
+
+    i[[3456]]86*|x86_64*)
+
+      AC_REQUIRE([AX_GCC_X86_CPUID])
+
+      AX_GCC_X86_CPUID(0x00000001)
+      ecx=`echo $ax_cv_gcc_x86_cpuid_0x00000001 | cut -d ":" -f 3`
+      edx=`echo $ax_cv_gcc_x86_cpuid_0x00000001 | cut -d ":" -f 4`
+
+      AC_CACHE_CHECK([whether mmx is supported], [ax_cv_have_mmx_ext],
+      [
+        ax_cv_have_mmx_ext=no
+        if test "$((0x$edx>>23&0x01))" = 1; then
+          ax_cv_have_mmx_ext=yes
+        fi
+      ])
+
+      AC_CACHE_CHECK([whether sse is supported], [ax_cv_have_sse_ext],
+      [
+        ax_cv_have_sse_ext=no
+        if test "$((0x$edx>>25&0x01))" = 1; then
+          ax_cv_have_sse_ext=yes
+        fi
+      ])
+
+      AC_CACHE_CHECK([whether sse2 is supported], [ax_cv_have_sse2_ext],
+      [
+        ax_cv_have_sse2_ext=no
+        if test "$((0x$edx>>26&0x01))" = 1; then
+          ax_cv_have_sse2_ext=yes
+        fi
+      ])
+
+      AC_CACHE_CHECK([whether sse3 is supported], [ax_cv_have_sse3_ext],
+      [
+        ax_cv_have_sse3_ext=no
+        if test "$((0x$ecx&0x01))" = 1; then
+          ax_cv_have_sse3_ext=yes
+        fi
+      ])
+
+      AC_CACHE_CHECK([whether ssse3 is supported], [ax_cv_have_ssse3_ext],
+      [
+        ax_cv_have_ssse3_ext=no
+        if test "$((0x$ecx>>9&0x01))" = 1; then
+          ax_cv_have_ssse3_ext=yes
+        fi
+      ])
+
+      AC_CACHE_CHECK([whether sse4.1 is supported], [ax_cv_have_sse41_ext],
+      [
+        ax_cv_have_sse41_ext=no
+        if test "$((0x$ecx>>19&0x01))" = 1; then
+          ax_cv_have_sse41_ext=yes
+        fi
+      ])
+
+      AC_CACHE_CHECK([whether sse4.2 is supported], [ax_cv_have_sse42_ext],
+      [
+        ax_cv_have_sse42_ext=no
+        if test "$((0x$ecx>>20&0x01))" = 1; then
+          ax_cv_have_sse42_ext=yes
+        fi
+      ])
+
+      AC_CACHE_CHECK([whether avx is supported], [ax_cv_have_avx_ext],
+      [
+        ax_cv_have_avx_ext=no
+        if test "$((0x$ecx>>28&0x01))" = 1; then
+          ax_cv_have_avx_ext=yes
+        fi
+      ])
+
+      if test "$ax_cv_have_mmx_ext" = yes; then
+        AX_CHECK_COMPILE_FLAG(-mmmx, ax_cv_support_mmx_ext=yes, [])
+        if test x"$ax_cv_support_mmx_ext" = x"yes"; then
+          SIMD_FLAGS="$SIMD_FLAGS -mmmx"
+          AC_DEFINE(HAVE_MMX,,[Support mmx instructions])
+        else
+          AC_MSG_WARN([Your processor support mmx instructions but not your compilor, can you try another compilor ?])
+        fi
+      fi
+
+      if test "$ax_cv_have_sse_ext" = yes; then
+        AX_CHECK_COMPILE_FLAG(-msse, ax_cv_support_sse_ext=yes, [])
+        if test x"$ax_cv_support_sse_ext" = x"yes"; then
+          SIMD_FLAGS="$SIMD_FLAGS -msse"
+          AC_DEFINE(HAVE_SSE,,[Support SSE (Streaming SIMD Extensions) instructions])
+        else
+          AC_MSG_WARN([Your processor support sse instructions but not your compilor, can you try another compilor ?])
+        fi
+      fi
+
+      if test "$ax_cv_have_sse2_ext" = yes; then
+        AX_CHECK_COMPILE_FLAG(-msse2, ax_cv_support_sse2_ext=yes, [])
+        if test x"$ax_cv_support_sse2_ext" = x"yes"; then
+          SIMD_FLAGS="$SIMD_FLAGS -msse2"
+          AC_DEFINE(HAVE_SSE2,,[Support SSE2 (Streaming SIMD Extensions 2) instructions])
+        else
+          AC_MSG_WARN([Your processor support sse2 instructions but not your compilor, can you try another compilor ?])
+        fi
+      fi
+
+      if test "$ax_cv_have_sse3_ext" = yes; then
+        AX_CHECK_COMPILE_FLAG(-msse3, ax_cv_support_sse3_ext=yes, [])
+        if test x"$ax_cv_support_sse3_ext" = x"yes"; then
+          SIMD_FLAGS="$SIMD_FLAGS -msse3"
+          AC_DEFINE(HAVE_SSE3,,[Support SSE3 (Streaming SIMD Extensions 3) instructions])
+        else
+          AC_MSG_WARN([Your processor support sse3 instructions but not your compilor, can you try another compilor ?])
+        fi
+      fi
+
+      if test "$ax_cv_have_ssse3_ext" = yes; then
+        AX_CHECK_COMPILE_FLAG(-mssse3, ax_cv_support_ssse3_ext=yes, [])
+        if test x"$ax_cv_support_ssse3_ext" = x"yes"; then
+          SIMD_FLAGS="$SIMD_FLAGS -mssse3"
+          AC_DEFINE(HAVE_SSSE3,,[Support SSSE3 (Supplemental Streaming SIMD Extensions 3) instructions])
+        else
+          AC_MSG_WARN([Your processor support ssse3 instructions but not your compilor, can you try another compilor ?])
+        fi
+      fi
+
+      if test "$ax_cv_have_sse41_ext" = yes; then
+        AX_CHECK_COMPILE_FLAG(-msse4.1, ax_cv_support_sse41_ext=yes, [])
+        if test x"$ax_cv_support_sse41_ext" = x"yes"; then
+          SIMD_FLAGS="$SIMD_FLAGS -msse4.1"
+          AC_DEFINE(HAVE_SSE4_1,,[Support SSSE4.1 (Streaming SIMD Extensions 4.1) instructions])
+        else
+          AC_MSG_WARN([Your processor support sse4.1 instructions but not your compilor, can you try another compilor ?])
+        fi
+      fi
+
+      if test "$ax_cv_have_sse42_ext" = yes; then
+        AX_CHECK_COMPILE_FLAG(-msse4.2, ax_cv_support_sse42_ext=yes, [])
+        if test x"$ax_cv_support_sse42_ext" = x"yes"; then
+          SIMD_FLAGS="$SIMD_FLAGS -msse4.2"
+          AC_DEFINE(HAVE_SSE4_2,,[Support SSSE4.2 (Streaming SIMD Extensions 4.2) instructions])
+        else
+          AC_MSG_WARN([Your processor support sse4.2 instructions but not your compilor, can you try another compilor ?])
+        fi
+      fi
+
+      if test "$ax_cv_have_avx_ext" = yes; then
+        AX_CHECK_COMPILE_FLAG(-mavx, ax_cv_support_avx_ext=yes, [])
+        if test x"$ax_cv_support_avx_ext" = x"yes"; then
+          SIMD_FLAGS="$SIMD_FLAGS -mavx"
+          AC_DEFINE(HAVE_AVX,,[Support AVX (Advanced Vector Extensions) instructions])
+        else
+          AC_MSG_WARN([Your processor support avx instructions but not your compilor, can you try another compilor ?])
+        fi
+      fi
+
+  ;;
+  esac
+
+  AC_SUBST(SIMD_FLAGS)
+])
diff --git a/m4/lx_find_mpi.m4 b/m4/lx_find_mpi.m4
new file mode 100644
index 0000000..75eda80
--- /dev/null
+++ b/m4/lx_find_mpi.m4
@@ -0,0 +1,255 @@
+#################################################################################################
+# Copyright (c) 2010, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory
+# Written by Todd Gamblin, tgamblin at llnl.gov.
+# LLNL-CODE-417602
+# All rights reserved.
+#
+# This file is part of Libra. For details, see http://github.com/tgamblin/libra.
+# Please also read the LICENSE file for further information.
+#
+# Redistribution and use in source and binary forms, with or without modification, are
+# permitted provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright notice, this list of
+#    conditions and the disclaimer below.
+#  * Redistributions in binary form must reproduce the above copyright notice, this list of
+#    conditions and the disclaimer (as noted below) in the documentation and/or other materials
+#    provided with the distribution.
+#  * Neither the name of the LLNS/LLNL nor the names of its contributors may be used to endorse
+#    or promote products derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# LAWRENCE LIVERMORE NATIONAL SECURITY, LLC, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#################################################################################################
+
+#
+# LX_FIND_MPI()
+#  ------------------------------------------------------------------------
+# This macro finds an MPI compiler and extracts includes and libraries from
+# it for use in automake projects.  The script exports the following variables:
+#
+# AC_DEFINE variables:
+#     HAVE_MPI         AC_DEFINE'd to 1 if we found MPI
+#
+# AC_SUBST variables:
+#     MPICC            Name of MPI compiler
+#     MPI_CFLAGS       Includes and defines for MPI C compilation
+#     MPI_CLDFLAGS     Libraries and library paths for linking MPI C programs
+#
+#     MPICXX           Name of MPI C++ compiler
+#     MPI_CXXFLAGS     Includes and defines for MPI C++ compilation
+#     MPI_CXXLDFLAGS   Libraries and library paths for linking MPI C++ programs
+#
+#     MPIF77           Name of MPI Fortran 77 compiler
+#     MPI_F77FLAGS     Includes and defines for MPI Fortran 77 compilation
+#     MPI_F77LDFLAGS   Libraries and library paths for linking MPI Fortran 77 programs
+#
+#     MPIFC            Name of MPI Fortran compiler
+#     MPI_FFLAGS       Includes and defines for MPI Fortran compilation
+#     MPI_FLDFLAGS     Libraries and library paths for linking MPI Fortran programs
+#
+# Shell variables output by this macro:
+#     have_C_mpi       'yes' if we found MPI for C, 'no' otherwise
+#     have_CXX_mpi     'yes' if we found MPI for C++, 'no' otherwise
+#     have_F77_mpi     'yes' if we found MPI for F77, 'no' otherwise
+#     have_F_mpi       'yes' if we found MPI for Fortran, 'no' otherwise
+#
+AC_DEFUN([LX_FIND_MPI],
+[
+     AC_LANG_CASE(
+     [C], [
+         AC_REQUIRE([AC_PROG_CC])
+         if [[ ! -z "$MPICC" ]]; then
+             LX_QUERY_MPI_COMPILER(MPICC, [$MPICC], C)
+         else
+             LX_QUERY_MPI_COMPILER(MPICC, [mpicc mpiicc mpixlc mpipgcc], C)
+         fi
+     ],
+     [C++], [
+         AC_REQUIRE([AC_PROG_CXX])
+         if [[ ! -z "$MPICXX" ]]; then
+             LX_QUERY_MPI_COMPILER(MPICXX, [$MPICXX], CXX)
+         else
+             LX_QUERY_MPI_COMPILER(MPICXX, [mpicxx mpiCC mpic++ mpig++ mpiicpc mpipgCC mpixlC], CXX)
+         fi
+     ],
+     [F77], [
+         AC_REQUIRE([AC_PROG_F77])
+         if [[ ! -z "$MPIF77" ]]; then
+             LX_QUERY_MPI_COMPILER(MPIF77, [$MPIF77], F77)
+         else
+             LX_QUERY_MPI_COMPILER(MPIF77, [mpif77 mpiifort mpixlf77 mpixlf77_r], F77)
+         fi
+     ],
+     [Fortran], [
+         AC_REQUIRE([AC_PROG_FC])
+         if [[ ! -z "$MPIFC" ]]; then
+             LX_QUERY_MPI_COMPILER(MPIFC, [$MPIFC], F)
+         else
+             mpi_default_fc="mpif95 mpif90 mpigfortran mpif2003"
+             mpi_intel_fc="mpiifort"
+             mpi_xl_fc="mpixlf95 mpixlf95_r mpixlf90 mpixlf90_r mpixlf2003 mpixlf2003_r"
+             mpi_pg_fc="mpipgf95 mpipgf90"
+             LX_QUERY_MPI_COMPILER(MPIFC, [$mpi_default_fc $mpi_intel_fc $mpi_xl_fc $mpi_pg_fc], F)
+         fi
+     ])
+])
+
+
+#
+# LX_QUERY_MPI_COMPILER([compiler-var-name], [compiler-names], [output-var-prefix])
+#  ------------------------------------------------------------------------
+# AC_SUBST variables:
+#     MPI_<prefix>FLAGS       Includes and defines for MPI compilation
+#     MPI_<prefix>LDFLAGS     Libraries and library paths for linking MPI C programs
+#
+# Shell variables output by this macro:
+#     found_mpi_flags         'yes' if we were able to get flags, 'no' otherwise
+#
+AC_DEFUN([LX_QUERY_MPI_COMPILER],
+[
+     # Try to find a working MPI compiler from the supplied names
+     AC_PATH_PROGS($1, [$2], [not-found])
+
+     # Figure out what the compiler responds to to get it to show us the compile
+     # and link lines.  After this part of the macro, we'll have a valid
+     # lx_mpi_command_line
+
+     responded=0
+
+
+
+     # check -showme:compile
+     echo -n "Checking whether $$1 responds to '-showme:compile'... "
+     lx_mpi_compile_line=`$$1 -showme:compile 2>/dev/null`
+     if [[ "$?" -eq 0 ]]; then
+         echo yes
+         lx_mpi_link_line=`$$1 -showme:link 2>/dev/null`
+         responded=1
+     else
+         echo no
+     fi
+
+     # check -showme
+     if [[ "$responded" -eq 0 ]]; then
+        echo -n "Checking whether $$1 responds to '-showme'... "
+
+        testOutput=`$$1 -showme 2>/dev/null`
+        if [[ "$?" -eq 0 ]]; then
+           responded=1
+           lx_mpi_link_line=$testOutput
+           lx_mpi_compile_line=$testOutput
+           echo yes
+        else
+           echo no
+        fi
+     fi
+
+     # check -compile-info
+     if [[ "$responded" -eq 0 ]]; then
+        echo -n "Checking whether $$1 responds to '-compile-info'... "
+        lx_mpi_compile_line=`$$1 -compile-info 2>/dev/null`
+
+        if [[ "$?" -eq 0 ]]; then
+           lx_mpi_link_line=`$$1 -link-info 2>/dev/null`
+           responded=1
+           echo yes
+        else
+           echo no
+        fi
+     fi
+
+     # check -show
+     if [[ "$responded" -eq 0 ]]; then
+        echo -n "Checking whether $$1 responds to '-show'... "
+
+        testOutput=`$$1 -show 2>/dev/null`
+        if [[ "$?" -eq 0 ]]; then
+           lx_mpi_compile_line=$testOutput
+           lx_mpi_link_line=$testOutput
+           responded=1
+           echo yes
+        else
+           echo no
+        fi
+     fi
+
+     # check -craype-verbose
+     if [[ "$responded" -eq 0 ]]; then
+        echo -n "Checking whether $$1 is a Cray MPI wrapper and responds to '-craype-verbose'... "
+
+        testOutput=`$$1 -craype-verbose 2>/dev/null`
+        if [[ "$?" -eq 0 ]]; then
+           lx_mpi_compile_line=$testOutput
+           lx_mpi_link_line=$testOutput
+           responded=1
+           echo yes
+        else
+           echo no
+        fi
+     fi
+
+     # remove the compiler name
+     lx_mpi_link_line=`echo "$lx_mpi_link_line" | sed 's/^[[^-]][[^[:space:]]]\+//'`
+     lx_mpi_compile_line=`echo "$lx_mpi_compile_line" | sed 's/^[[^-]][[^[:space:]]]\+//'`
+
+     if [[ ! -z "$lx_mpi_compile_line"  -a ! -z "$lx_mpi_link_line" ]]; then
+
+         MPI_$3FLAGS=`echo $lx_mpi_compile_line`
+         MPI_$3LDFLAGS=`echo $lx_mpi_link_line`
+
+         OLD_LIBS=$LIBS
+	 OLD_$3FLAGS=$$3FLAGS
+
+         $3FLAGS=`echo $MPI_$3FLAGS `
+
+         LIBS=`echo $MPI_$3LDFLAGS `
+
+         AC_TRY_LINK([
+	 #include <mpi.h> 
+	 ],
+         [int rank, size;
+                      MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+                      MPI_Comm_size(MPI_COMM_WORLD, &size);],
+                     [# Add a define for testing at compile time.
+                      AC_DEFINE([HAVE_MPI], [1], [Define to 1 if you have MPI libs and headers.])
+                      have_$3_mpi='yes'],
+                     [# zero out mpi flags so we don't link against the faulty library.
+                      MPI_$3FLAGS=""
+                      MPI_$3LDFLAGS=""
+                      have_$3_mpi='no'])
+
+         echo ""
+         echo "RESULT:"
+	 echo MPI_CXXFLAGS=$MPI_CXXFLAGS
+	 echo MPI_CXXLDFLAGS=$MPI_CXXLDFLAGS
+	 echo ""
+	 
+	 if [[  "$have_$3_mpi" == 'no'  ]] ; then 
+               AC_MSG_ERROR([ "error: could not setup a working MPI environment. Please contact the exabayes user group with this output and details about your MPI installation. ])	
+         fi 
+
+         # AC_SUBST everything.
+         AC_SUBST($1)
+         AC_SUBST(MPI_$3FLAGS)
+         AC_SUBST(MPI_$3LDFLAGS)
+
+	 $3FLAGS=$OLD_$3FLAGS
+         LIBS=$OLD_LIBS
+     else
+         echo Unable to find suitable MPI Compiler. Try setting $1.
+         have_$3_mpi='no'
+         exit 1
+     fi
+
+     echo found CXXFLAGS: $MPI_$3FLAGS 
+     echo found CXXLDFLAGS: $MPI_$3LDFLAGS 
+])
diff --git a/manual/manual.org b/manual/manual.org
new file mode 100644
index 0000000..4706af9
--- /dev/null
+++ b/manual/manual.org
@@ -0,0 +1,1526 @@
+#+TITLE: ExaBayes User's Manual
+
+#+LaTeX_CLASS: article
+#+LaTeX_CLASS_OPTIONS: [KOMA, a4paper, 12pt, titlepage]
+
+#+OPTIONS: ^:nil
+#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="css/org.css" />
+#+OPTIONS: toc:2  
+
+# #+HTML: <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">
+
+#+AUTHOR: for support, please contact exabayes-at-googlegroups-dot-com
+
+#+BEGIN_LATEX
+\newpage
+#+END_LATEX
+
+#+HTML: <img src="./img/banner2.png" width="100%" alt="some_text">
+
+* Quick Start
+
+  Installation of ~ExaBayes~ requires basic proficiency with using a
+  terminal (for help, consider this [[https://help.ubuntu.com/community/UsingTheTerminal][tutorial]]).
+
+  For impatient users who want to give ~ExaBayes~ a quick try, we
+  recommend:
+
+  1. Download and unpack the software package. You find executables
+     (sequential: ~yggdrasil~, parallel: ~exabayes~) in the ~./bin~
+     folder. The ~-h~ flag provides you with an overview of
+     options. If you downloaded the source code please follow the
+     instructions in Sect. [[#comp-src]]. 
+  2. If you have convinced yourself, that the executables are in
+     place, consider running the examples in the ~./examples~
+     directory (call the ~./call.sh~ or ~./call-parallel.sh~ scripts
+     there).  If you want to run your own dataset, convert your
+     alignment file into phylip-format (e.g., using ~seaview~).
+  3. If you have prepared your dataset, run the sequential version of
+     ExaBayes, where alignmentFile.phy is the alignment file (use -m
+     PROT for protein data) and ~$RANDOM~ could be any random number
+     seed.
+     #+BEGIN_SRC bash
+     $ ./bin/bin/yggdrasil -f alignmentFile.phy -m DNA -s $RANDOM 
+     #+END_SRC
+  4. After some time, ExaBayes should finish or you may abort at any
+     time. You can now examine the two output files ExaBayes_topology*
+     and ExaBayes_parameters* using the post-processing tools
+     ~consense~, ~postProcParam~, ~credibleSet~ and ~extractBips~ (see
+     Sect. [[#prepost]]). Call the respective programs with ~-h~ for an
+     overview of functions.
+
+* Scope of ExaBayes: What is it? What is it not?
+  ExaBayes is a tool for Bayesian phylogenetic analyses.  It
+  implements a Markov chain Monte Carlo sampling approach that allows
+  to determine the posterior probability of a tree (resp., topology)
+  and various evolutionary model parameters, for instance, branch
+  lengths or substitution rates.  Similar approaches are implemented
+  in [[http://beast.bio.ed.ac.uk][BEAST]] \cite{Drummond2012} or [[http://mrbayes.sourceforge.net/][MrBayes]]
+  \cite{Ronquist2012}. ExaBayes has heavily drawn inspiration
+  specifically from the latter one.
+  
+  ExaBayes comes with the most commonly used evolutionary models, such
+  as the generalized time reversible model (GTR) of character
+  substitution, the discretized $\Gamma$ model of among site rate
+  heterogeneity and estimates trees with unconstrained branch
+  lengths. For clocked tree models or less parameter-rich substitution
+  models, we refer you to the established tools.
+
+  The distinguishing feature of ExaBayes is its capability to handle
+  enormous datasets efficiently. ExaBayes provides an implementation
+  of data parallelism using the /Message Passing Interface/
+  (MPI). This means, that if you conduct your analysis on a computing
+  cluster composed of several machines (a.k.a. nodes), the memory
+  needed to evaluate the likelihood of trees and parameters given a
+  large alignment can be spread out across multiple computing
+  nodes. In conclusion, the size of the concatenated alignment
+  ExaBayes can handle is only limited by the combined main memory of
+  your entire computing cluster.
+
+  Aside from that ExaBayes also implements 
+   + chain-level and run-level parallelism,
+   + techniques to trade runtime for reduced memory footprint,
+   + a subtree equality vector approach that reduces memory without
+     loss of runtime,
+   + a native AVX implementation for evaluating likelihood and
+     parsimony scores (i.e., ExaBayes makes full use of your
+     cutting-edge CPU),
+   + techniques to efficiently handle an arbitrary number of
+     partitions.
+
+
+  We use the highly efficient parsimony and likelihood implementation
+  of RAxML \cite{Stamatakis2006}. Many of the techniques described
+  above are adapted from or inspired by our experiences with
+  large-scale maximum likelihood inferences using RAxML-Light/ExaML
+  \cite{Stamatakis2012,Stamatakis2012a}.
+
+  The ExaBayes package contains all tools necessary for
+  post-processing your sampled chains. For visualization of parameter
+  distributions, we recommend [[http://tree.bio.ed.ac.uk/software/tracer/][Tracer]] and [[http://tree.bio.ed.ac.uk/software/figtree/][FigTree]] (for which ExaBayes
+  parameter files are compatible).
+
+* Installation
+   For ExaBayes, we provide pre-compiled binaries that run on a wide
+   range of systems (limited to Linux and MacOS though, we will not be
+   able to support Windows in the foreseeable future). For optimal
+   efficiency or if you want to use the parallel version, it is highly
+   recommendable to compile ExaBayes from source. This should be
+   straight-forward on a computer center, requires a bit of work on a
+   Linux system and unfortunately is not entirely trivial if you have
+   a MacOS system and no experience with the command line.
+
+** Executing downloaded executables
+   
+   After you have downloaded the appropriate package, you find all
+   executables in the ~./bin~ folder. Just execute these only using
+   the ~-h~ flag and you will be given a help page. If the executables
+   produce error messages (indicating that some library was not
+   found), you either downloaded the wrong package or you have to
+   compile from source.
+
+** Compiling ExaBayes from source
+:PROPERTIES:
+:CUSTOM_ID: comp-src
+:END:
+
+   Download and extract the source archive (sources are also included
+   in all binary distributions). 
+
+*** Prerequisites for Linux systems 
+   ExaBayes requires a relatively recent ~c/c++~ compiler that
+   supports ~c++11~ features. ExaBayes is confirmed to work with (only
+   one required):
+   1. GCC, version 4.6 or greater 
+   2. Clang, version 3.2 or greater
+      
+   For running ExaBayes in parallel using more than one computing
+   node, you need a working MPI installation. If you want to make most
+   of your local multi-core machine (e.g., laptop), simply install
+   OpenMPI or Mpich2. On Debian/Ubuntu, this should be as simple as
+   (choose one):
+#+BEGIN_SRC bash
+   $ sudo apt-get install mpich2 libmpich2-dev
+   $ sudo apt-get install openmpi-bin libopenmpi-dev
+#+END_SRC
+   
+   For checking, if MPI already is installed on your machine, try to
+   enter ~mpirun~ or ~mpiexec~ in a terminal. If it is not installed,
+   you will receive a message "command not found".
+   
+*** Prerequisites for Mac OS X
+   :PROPERTIES:
+   :CUSTOM_ID: apple
+   :END:
+
+   For installation on an Apple system, you ideally should have set up
+   an environment that allows you to compile (MPI-)applications in the
+   terminal.
+
+   First, you need to download and install [[https://developer.apple.com/technologies/tools/][Xcode]] (also available in
+   the AppStore) and [[http://www.macports.org/][MacPorts]]. You only need MacPorts, if you want to
+   build the parallel version. Open a terminal and use MacPorts to
+   install an MPI implementation (either openmpi or mpich2):
+#+BEGIN_SRC bash
+   $ sudo port install openmpi-default
+   $ sudo port install mpich-default
+#+END_SRC
+   
+   After the installation, a message will suggest that you set the MPI
+   installation as default. You now have MPI compiler wrappers
+   available (mpicc-mpich-mp, mpicxx-mpich-mp /or/ mpicc-mpich-mp,
+   mpicxx-mpich-mp /or/ mpicc, mpicxx).
+
+   For installing MPI, also consider [[http://brew.sh/][HomeBrew]] which is an alternative
+   to MacPorts that does not require ~sudo~. 
+
+
+*** Configuring and Compiling
+    ExaBayes uses the typical autotools setup. Typically, the MPI
+    environment (if available) or best vectorization scheme (SSE or
+    AVX) is determined automatically. The basic command for building
+    exabayes (with MPI support) is
+
+#+BEGIN_SRC bash
+  ./configure --enable-mpi && make
+#+END_SRC
+
+    Consider the following options:
+    
++ important: use the --bindir option with the absolute path to a
+  directory in conjunction with "make install" to dump all executables
+  into a folder /full/path/to/this/dir/bin
+   
+#+BEGIN_SRC bash
+    ./configure --bindir=/full/path/to/this/dir && make install
+#+END_SRC
+    
++ omit "--enable-mpi" to only build the multi-threaded version
+  (e.g., if you have no MPI support available)
+
++ for the build on Mac systems, it *may* be necessary to add
+    CXXFLAGS="-stdlib=libc++" at the configure step:
+#+BEGIN_SRC bash
+    ./configure CXXFLAGS="-stdlib=libc++" && make
+#+END_SRC
+
++ use the ./configure environment variables (see ./configure --help)
+  to specify non-default compilers, for instance
+  
+#+BEGIN_SRC bash
+  ./configure --enable-mpi CC=clang-3.3 CXX=clang++-3.3 MPICXX=mpicxx.openmpi
+#+END_SRC
+
+  will configure exabayes to be build with clang-3.3 and OpenMPI,
+  although default compilers of your system are -- for instance -- gcc
+  and MPICH.
+
+  Once everything has compiled, check, if all binaries are there as expected: 
+#+BEGIN_SRC bash
+   $ ls bin
+        consense	credibleSet	exabayes	extractBips	parser		postProcParam	sdsf		yggdrasil
+#+END_SRC
+  
+  Please notice: 
+  
+  1. Compilation takes a while: if you have multiple cores available,
+     then use "make -j x", where x is the number of cores you want to
+     use for compilation.
+
+  2. If for some reason you want to re-compile the code, do not forget
+     to run "make clean" first.
+  
+  3. If you compile on a cluster where your login-node has an
+     AVX-capable CPU, then you will get an AVX-optimized exabayes. If
+     you now try to execute this version of exabayes on a non-AVX
+     capable CPU, the program mostly will just crash with the message
+     "Illegal instruction.". In these cases, compile exabayes on one
+     of the nodes you intend to execute ExaBayes later *or* use the
+     configure flags "--disable-avx", etc.
+
+** Installation of ExaBayes Into File Systems
+
+   So far we have compiled the executables. The build system offers
+   the capability to install compiled binaries and documentation into
+   defined places (e.g., ~/usr, /usr/local, /opt).
+
+   In order to achieve this, you need to specify an absolute path as
+   "--prefix" and invoke "make --install" after the successful build:
+#+BEGIN_SRC bash
+$ ./configure --prefix=/home/user/usr && make && make --install
+#+END_SRC
+
+* Tutorial and Workflow
+  This is a basic tutorial for how to conduct Bayesian tree inference
+  with ~ExaBayes~ (specifically useful, if you do not have much
+  experience with Bayesian tree inference).
+  
+  Assume you want to analyze an alignment file that contains several
+  partitions. Create a folder and copy ~aln.phy~ and ~aln.part~ from
+  the folder ~examples/dna-partitioned~ into that folder. Copy
+  ~./examples/configFile-all-options.nex~ as well and rename it to
+  ~config.nex~. We will assume that all executables are in this
+  working folder (otherwise, modify the path to the executable
+  accordingly).
+
+** Basic Workflow
+
+    Let's at first simply run a single chain for some time: 
+    #+BEGIN_SRC bash
+    $ ./yggdrasil -f aln.phy -m DNA -n myRun -s $RANDOM  
+    #+END_SRC
+
+    ~ExaBayes~ will print output that is separated into various sections: 
+    1. after the header, you find a section (divided by '=') that
+       re-iterates the alignment (number of unique patterns and type
+       of partitions).
+    2. In the next section, ~ExaBayes~ lists the parameters to be
+       integrated. For instance, the tree topology is considered a
+       parameter. It also displays the (default) prior for parameters
+       and initial values.
+    3. The $3^{rd}$ section contains the proposals that are
+       instantiated for integrating over the aforementioned
+       parameters.
+
+    During the MCMC simulation, ExaBayes prints the log-likelihoods
+    (lnl) of the (sole) chain. You'll find that after some time the lnl
+    will reach a plateau.  Stop the run after something like 50,000
+    generations (using Control-c).
+    
+    Now examine the output files created by ExaBayes (we neglect the
+    binary alignment file and the checkpoint files):
+    + ExaBayes_info.myRun \\ 
+      Contains the same information also printed to the screen. 
+    + ExaBayes_topologies.myRun.0 \\
+      Contains all sampled topologies in nexus format.
+    + ExaBayes_parameters.myRun.0 \\
+      Contains values sampled for all non-topological, non-branch length
+      values.
+    + ExaBayes_diagnostics.myRun \\
+      Contains chain diagnostics (e.g., acceptance ratios for all
+      proposals or topological convergence in form of asdsf).
+
+    Now use the post-processing tools to examine the result. First, we
+    create a consensus tree:
+    #+BEGIN_SRC bash
+    $ ./consense -f ExaBayes_topologies.myRun.0 -n myCons 
+    #+END_SRC
+    
+    Now, open a tree viewer of your choice (e.g., FigTree, Archaeopteryx
+    or Dendroscope) and have a look at the consensus tree. If you ran
+    just 50,000 generations, you will probably find the confidence in
+    most branches is pretty low.
+
+    Let's inspect the $50\%$ credible set of trees: 
+    #+BEGIN_SRC bash
+    $ ./credibleSet -f ExaBayes_topologies.myRun.0 -n cred  
+    #+END_SRC
+    
+    The output file ~ExaBayes_credibleSet.tmp~ contains all sampled
+    trees ordered by the frequency of their occurrence. You probably
+    will find that no tree occurred more than once.
+
+    Finally, let's check, how well the parameters are sampled: 
+    #+BEGIN_SRC bash
+    $ ./postProcParam   -f ExaBayes_parameters.myRun.0  -n params
+    #+END_SRC
+
+    Alternatively, you could also open the parameter file with
+    ~Tracer~ and visualize the distributions. If you do not have
+    ~Tracer~ installed, have a look at
+    ~ExaBayes_parameterStatistics.params~ (spreadsheet tools like
+    Excel are helpful). You'll find summary statistics for each
+    parameter. Specifically, check out the effective sampling size
+    (ESS) value for each parameter. Since samples in a chain are
+    correlated, they are less informative, than if you had drawn the
+    values independently from the original distribution. The ESS of
+    samples indicates the number of samples your samples corresponds
+    to, if they were drawn independently.
+    
+    You will find that most ESS values are in the range between 30
+    and 80. This is not bad for the low number of generations, but to
+    assure that each parameter has been sampled adequately, values
+    should be $>100$ or even better $>200$. High ESS values indicate
+    that your chain has explored this parameter sufficiently.
+
+** Partitioned Alignment
+
+   Now remove the files from the initial run (otherwise ExaBayes will
+   complain). We will now conduct a proper analysis using several
+   chains on a partitioned alignment. 
+   
+   You have to modify ~config.nex~ (remove the square brackets to
+   uncomment). Uncomment ~numGens~ and set it to 100000 (or
+   1e5). Uncomment ~numRuns~ and set it to 4. This means that
+   ~ExaBayes~ will conduct 4 independent analysis (starting in 4
+   different random trees). If all runs yield the same split
+   frequencies (i.e., the same confidence in a split), we can be
+   relatively sure that we have sampled the topology parameter
+   sufficiently (while it is still possible that simply all 4 chains
+   got stuck in the same local optimum).
+
+   Check out the partitions file (~aln.part~): it contains 4
+   partitions. By default, ExaBayes assumes that partitions have
+   distinct branch lengths. Let's link all partitions into a single
+   branch length parameter. To do so, add "~brlens = (0-3)~" in the
+   ~params~ section.
+
+   Use this command line to start the analysis:   
+   #+BEGIN_SRC bash
+    $ ./yggdrasil -f aln.phy -q aln.part  -n myRun -s $RANDOM -c config.nex
+   #+END_SRC
+   
+   By default, ExaBayes will compute the average standard deviation of
+   split frequencies (asdsf) every 5,000 generations and stops the
+   analysis once it the asdsf is better than $5\%$ (and once we have at
+   least 100,000 generations for each chain).
+
+   The analysis may take a while. If you have a cluster (with for
+   instance 16 cores) at your disposal, consider running the parallel
+   version:
+   
+   #+LATEX: \begin{small}
+   #+BEGIN_SRC bash
+    $ mpirun -np 16  ./exabayes -f aln.phy -q aln.part  -n myRun -s $RANDOM -c config.nex -R 4 
+   #+END_SRC
+   #+LATEX: \end{small}
+
+   With ~-R 4~, ExaBayes runs all 4 chains in parallel. In an
+   additional section, ExaBayes will inform you which chains and how
+   many unique site patterns are assigned to each process.
+
+   You will notice after 100,000 generations, that the 4 chains
+   converge rather slowly. Thus, enable Metropolis-Coupling to speed
+   up the convergence. Set ~numCoupledChains~ to 2 and (for purely
+   computational reasons in this example), reduce the ~numRuns~
+   to 2. Also, set ~parsimonyStart~ to true, such that your chains
+   start from a parsimony tree instead of a random tree. Using
+   parsimony trees as initial topologies saves you some time, however
+   theoretically it also increases the probability that all your
+   independent chains become stuck in the same local optimum and you
+   obtain incorrect estimates for posterior probabilities.
+
+   If you have many cores, to run the two independent runs as well as
+   the coupled chains in parallel:
+   
+   #+LATEX: \begin{footnotesize}
+   #+BEGIN_SRC bash
+    $ mpirun -np 16 ./exabayes -f aln.phy -q aln.part -n myRun -s $RANDOM -c config.nex -R 2 -C 2
+   #+END_SRC
+   #+LATEX: \end{footnotesize}
+
+   After $\approx$ 150,000 generations, the ASDSF should have fallen
+   below $5\%$, which is acceptable. A look at the consensus tree
+   reveals that this dataset in fact contains several low confidence
+   branches. While in the first run the reason for low confidence
+   branches was due to the low number of generations, we can be more
+   certain now that that low confidence branches are a result of the
+   phylogenetic signal in the alignment. Since you ran 2 independent
+   analyses, you obtain 2 sets of output files (parameter and
+   topologies). You can feed both files into the consensus tree (for
+   both files the initial $25\%$ of samples will be discarded).
+
+#+BEGIN_SRC bash
+   $ ./consense -f ExaBayes_topologies.myRun.* -n myCons 
+#+END_SRC
+
+   Analyze both parameter files using
+   
+#+BEGIN_SRC bash
+   $ ./postProcParam -f ExaBayes_parameters.myRun.* -n params
+#+END_SRC
+
+   Since we carried out two partitioned analyses, we have a larger
+   number of parameters (where e.g., ~r{2}(C<->T)~ is the substitution
+   probability of C to T in the third partition). We find that nearly
+   all parameters have an ESS $> 100$. The final column now contains
+   the potential scale reduction factor (PSRF). It indicates, whether
+   within-chain variance (of a parameter) is similar to between-chain
+   variance. For this convergence statistic, values should be close to
+   1, but lower than 1.2 or 1.1 (probably the case after 150,000
+   generations).
+   
+   So far, we have neglected the branch length parameter. You may
+   already have noticed, that the consensus tree has been annotated
+   with branch lengths. To extract ESS and PSRF values for each branch
+   length, run: 
+
+#+BEGIN_SRC bash
+   $ ./extractBips -f ExaBayes_topologies.myRun.* -n bls 
+#+END_SRC
+
+   Thus, you obtain the following files: 
+   + ExaBayes_bipartitions.tmp \\ 
+     contains an identifier for each branch/split (that is explicitly printed)
+   + ExaBayes_fileNames.tmp \\ 
+     lists the file names used as input (and assigned an id to them)  
+   + ExaBayes_bipartitionBranchLengths.tmp \\
+     contains all raw branch lengths sampled and lists split id and
+     file ids
+   + ExaBayes_bipartitionStatistics.tmp \\
+     contains statistics for each branch (specifically the ESS and PSRF)
+
+   Notice that for low confidence branches you are likely to encounter
+   poor ESS/PSRF values. This means that you substantially have to
+   increase the number of generations in order to obtain accurate
+   estimates of branch lengths distributions.
+   
+* Command Line Options 
+  Command line options specify, *how* ExaBayes will carry out the
+  analyses. In contrast, the a config file specifies which kind of
+  analyses will be executed. 
+  
+** Mandatory Arguments 
+
+   + *-f alignmentFile* 
+
+     provides an alignment file. If this file is the binary output
+     produced by ~parser~ (see Section [[#parser]]), then no further
+     arguments are required.  If you provide a plain (un-processed)
+     [[http://evolution.genetics.washington.edu/phylip/doc/sequence.html][Phylip file]], then either ~-m~ (single partition model) or ~-q~
+     (model file) are mandatory.
+
+   + *-m DNA | PROT* 
+
+     specifies the data type used, when a
+     Phylip-formatted alignment has been passed via ~-f~. This way, the
+     alignment is parsed as a single partition with either DNA or amino
+     acid (~PROT~) data.
+
+   + *-q modelFile* 
+
+     specifies a raxml-style partitioning/model scheme
+     for the alignment. For this option, a Phylip-formatted alignment
+     must be passed via ~-f~. See Section [[#partitionfile]] for a description of
+     the file format. 
+     
+   + *-s seed* 
+
+     provides a random seed. This number makes the run
+     reproducible. The same seed, data set configuration file will
+     result in the exact same result (apart from limitations given in
+     Section [[#reproducibility]]).  If you restart from a checkpoint
+     file, this option will be ignored.
+     
+   + *-n id* 
+
+     provides a run id used for naming output files 
+
+   + *-r runid* 
+     
+     restarts your run from a previous run id. If your previous
+     ExaBayes-run did not finish (because of a manual abort or
+     walltime restrictions), this option can be used for continuing
+     the run. It is essential, that you pass the same configuration
+     and alignment file. Some adaptions to the configuration file are
+     possible (e.g., larger number of generations to be run, lower
+     topological convergence threshold). Furthermore, all files that
+     carry the previous runid in their name must be located in the
+     current folder.
+
+     Example:
+     #+LATEX: \begin{footnotesize}
+     #+BEGIN_SRC bash
+     $ mpirun -np 8 ./exabayes -s $RANDOM -n myId -c myConfig -f myBinaryAlnFile.bin 
+     $ [runnig....] -> aborted!
+     $ mpirun -np 2  ./exabayes -r myId -n myIdContinued -c myConfig -f myBinaryAlnFile.bin -S 
+     #+END_SRC
+     #+LATEX: \end{footnotesize}
+     
+** Optional Arguments 
+   + *-d* 
+     
+     carries out a dry-run. Only checks your config and alignment file
+     and does not compute anything. Very recommendable, before
+     submitting a large run to a cluster.
+
+   + *-T n*
+     
+     Executes Yggdrasil with $n$ threads. We recommend to use the
+     multi-threaded version of yggdrasil only on systems, where no MPI
+     installation is available.
+
+   + *-c configFile* 
+
+     passes a configuration file that specifies how the MCMC will be
+     carried out (see ./examples/configFile-all-options.nex and
+     Section [[#config]] for details)
+     
+   + *-w workDir* 
+
+     specifies a location for output files
+
+   + *-R num* 
+
+     (~exabayes~-only) specifies the number of runs (i.e., independent
+     chains) to be executed in parallel. Large runs should be carried
+     out as separate runs, see Section [[#cluster]] for further details.
+
+   + *-C num* 
+
+     (~exabayes~-only) specifies the number of chains (i.e.,
+     coupled chains per independent run) to be executed in
+     parallel. Employing this option may be less efficient in terms of
+     runtime and memory than data-level parallelism, see Section [[#cluster]] for
+     further details.
+
+   + *-S* 
+
+     try to save memory using the SEV-technique for gap columns on
+     large gappy alignments Please refer to this [[http://www.biomedcentral.com/1471-2105/12/470][paper]]. On very gappy
+     alignments this option yields considerable runtime improvements.
+     
+   + *-M mode* 
+
+     specifies the memory versus runtime trade-off.  <mode>
+     is a value between 0 (fastest, highest memory consumption) and 3
+     (slowest, least memory consumption). See Section [[#memory]] for details.
+     
+* Configuration File
+  :PROPERTIES:
+  :CUSTOM_ID: config
+  :END:
+  In this Section, we describe all available options of the
+  configuration file in detail. The configuration file is a file in
+  nexus-format that is divided into sections. See
+  examples/all-options-documented.nex for a complete version (and
+  maybe copy and customize this file).  None of the following blocks
+  in mandatory. The parameter file itself is not mandatory and the
+  default values mentioned below are used instead. The nexus-syntax
+  for declaring a block is (here declaring a ~run~ block).
+
+   #+BEGIN_SRC TEXT
+ begin run; 
+    option value
+ end; 
+   #+END_SRC
+
+** Declaring and Linking Parameters 
+  :PROPERTIES:
+  :CUSTOM_ID: param-block
+  :END:
+
+   keyword: ~params~ 
+
+   This section allows to declare and link parameters (e.g., branch
+   lengths) across partitions. You should have declared partitions in
+   the partition file (passed via ~-q~). If you provided a partition
+   file to the ~parser~ tool, then the binary output file already
+   contains information about partitions. Partition ids start with 0
+   and refer to the order provided in the partition file.
+
+   Currently the following keywords can be used to specify a parameter
+   linking scheme (keywords are case-insensitive):
+
+|-------------+------------------------------------------------------------------------------------------|
+| param       | explanation                                                                              |
+|-------------+------------------------------------------------------------------------------------------|
+| ~stateFreq~ | link the equilibrium state frequencies (4 for DNA, 20 for AA) for partitions             |
+| ~rateHet~   | link the alpha parameter of the $\Gamma$  distribution of rate heterogeneity among sites |
+| ~revMat~    | link the substitution rates in the GTR matrix (DNA:6, AA:190) across partitions |
+| ~brlens~    | link branch lengths across partitions                                                    |
+| ~aaModel~   | link the fixed rate substitution matrix across partitions (if applicable)                |
+|-------------+------------------------------------------------------------------------------------------|
+
+   Note that, by default all parameters are unlinked for all
+   partitions. Specifically regarding branch lengths, most people only
+   want one global branch length parameter. If a partition id is
+   omitted from the scheme, the default behaviour of ExaBayes is to
+   instantiate a new parameter for this partition (i.e., it is
+   unlinked).
+   
+   You have the following options for specifying linkage (here
+   demonstrated for the branch length parameter):
+   
+   + use /comma/ to declare partitions as separate parameters \\
+     example: ~brlens = (0,1,2,3)~ \\
+     result: v{0}, v{1}, v{2}, v{3} \\
+
+   + use /plus/ to link two partitions into one parameter \\ 
+     example: ~brlens = (0 + 1 , 2 , 3)~ \\ 
+     result:  v{0,1}, v{2}, v{3} \\ 
+
+   + use /colon/ to declare a range of unlinked partitions (each one parameter) \\ 
+     example: ~brlens = (0:3)~ \\ 
+     result:  v{0}, v{1}, v{2}, v{3}  \\ 
+
+   + use /dash/ to declare a range partitions linked into one
+     parameter \\
+     example: ~brlens = (0-3)~\\
+     result: v{0,1,2,3} \\
+
+  For most use cases, you probably will only want to link all branch
+  lengths. However, in case you work with protein partitions, please
+  consider:
+
+  + By default ExaBayes creates one ~aaModel~ parameter for each of
+    your amino acid partitions. As state frequencies, ExaBayes uses
+    the empirical frequencies provided by the respective amino acid
+    substitution matrix.
+  + Instead of using the empirical frequencies, you may want to let
+    ExaBayes integrate over these state frequencies. For doing so, you
+    simply have to declare one of the respective partitions when
+    specifying the ~stateFreq~ parameter scheme. If you have two AA
+    partitions, then ~stateFreq = (0)~ instructs ExaBayes to integrate
+    over the state frequencies of the first amino acid model
+    parameter.
+  + As an alternative to proposing fixed-rate AA substitution matrices
+    for AA partitions, you can use ExaBayes to integrate over amino
+    acid GTR matrices (189 free parameters).  For doing so, declare
+    (and link) the respective AA partitions in the ~revMat~ linking
+    scheme (e.g., ~revMat = (0+1)~ for 1 shared GTR matrix across 2 AA
+    partitions).
+** Declaring Priors for Parameters
+   keyword: ~priors~
+   
+   The prior block let's you declare your prior belief regarding the
+   values of parameters ExaBayes integrates over. This affects
+   parameters implicitly instantiated by ExaBayes or explicitly
+   defined in a ~params~ block (see Section [[#param-block]]).
+   
+   By default priors specifications are applied to all matching
+   parameters. You can overwrite these /general/ priors by specifying
+   parameter-specific priors. For doing so, list all at least one
+   partition that is assigned to your target parameter in curly
+   brackets after the prior keyword. For instance:
+   #+BEGIN_SRC TEXT
+   brlenPr exponential(10)
+   brlenPr{0,2,10} uniform(1e-6,10)
+   #+END_SRC
+   applies a uniform prior with $[1e-6,10]$ to all branch length
+   parameters that contain the partitions 0,2 or 10 and applies an
+   exponential prior with $\lambda = 10$ to all remaining branch
+   length parameters.
+
+*** Topology Prior
+     keyword: ~topoPr~, \\ 
+     default: ~topoPr uniform()~ \\ 
+     valid values: 
+     - ~fixed()~ \\ 
+       topology is kept fixed
+     - ~uniform()~ \\ 
+       all topologies have the same prior probability 
+*** Branch Lengths Prior
+     keyword: ~brlenPr~ , \\ 
+     default: ~brlenpr exponential(10)~\\ 
+     valid values:
+     - ~exponential(~ $\lambda$ ~)~ \\ 
+       exponential prior with parameter $\lambda$, 
+     - ~uniform(start,end)~ \\ 
+       uniform probability in the range $[start,end]$ \\ 
+     - ~fixed(~ $val$ ~)~ \\
+       all branch lengths will be assigned the value $val$ that is
+       kept fixed during the analysis
+     - ~fixed()~ \\
+       all branch lengths keep original branch length provided via a
+       starting tree. If no starting tree is available, a default
+       value (currently 0.1) is assigned and kept fix during MCMC
+       sampling. 
+*** Reversible Matrix Prior
+    keyword: ~revMatPr~  \\
+    default: ~revMatPr dirichlet(1,...,1)~\\ 
+     valid values: 
+     - ~dirichlet(~ $x_1,x_2,\ldots, x_n$ ~)~\\
+       where for a dirichlet prior $x_i$ are the substitution rates in
+       a GTR matrix and thus $n = 6$ for DNA GTR matrices and $n =
+       190$ (use with care) for AA GTR matrices.\\
+     - ~fixed(~ $x_1,x_2, \ldots, x_n$ ~)~\\
+       fixed rates are assigned to the matrix and kept fix during MCMC
+       sampling. The values $x_i$ may be expressed as relative rates
+       (i.e, ExaBayes will normalize the rates, s.t. they sum up to
+       1.0)
+*** Rate Heterogeneity Prior
+     keyword: ~shapePr~, \\ 
+     default: ~shapePr uniform(0,200)~  \\ 
+     valid values: \\ 
+     - ~exponential(~ $\lambda$ ~)~ \\
+       prior probability of $\alpha$ values have an exponential
+       distribution with parameter $\lambda$
+     - ~uniform( start, end )~ \\
+       $\alpha$ values have uniform prior probability in the range
+       $[ start, end ]$ 
+*** State Frequencies Prior
+    keyword: ~stateFreqPr~ , \\ 
+    default: dirichlet(1,1,$\ldots$,1)\\ 
+    valid values: \\ 
+     - ~dirichlet(~ $x_1,x_2, \ldots, x_n$ ~)~ \\
+       where for a dirichlet prior $x_i$ are the state frequencies in
+       a GTR matrix and thus $n =4$ for DNA and $n = 20$ in a protein
+       GTR matrix.
+     - ~fixed(~ $x_1,x_2, \ldots, x_n$ ~)~ \\
+       fixed values are assigned to the state frequencies and not
+       changed during MCMC sampling. $x_i$ can be expressed as
+       relative rates (i.e., if the sum is $\geq 1$, ExaBayes does the
+       normalizing for you)
+
+*** Amino Acid Model Prior
+    keyword: ~aaPr~, \\ 
+    default: ~aaPr disc(remainder=1.0)~ \\ 
+    valid values: \\ 
+     - ~disc(~ $m_1$ = $w_1$, $m_2$ = $w_2$, $\ldots$, $m_n$ = $w_n$ ~)~  \\
+       a discrete probability distribution assigning weights $w_i$ to
+       protein substitution matrices $m_i$. If only one model is
+       specified, this is equivalent to a fixed prior.
+       
+       $m$ may be one of the following models: DAYHOFF, DCMUT, JTT,
+       MTREV, WAG, RTREV, CPREV, VT, BLOSUM62, MTMAM, LG, MTART,
+       MTZOA, PMB, HIVB, HIVW, JTTDCMUT, FLU.
+       
+       By default, if a model is not mentioned in the list, then its
+       prior probability is 0 and thus is not considered during MCMC
+       sampling.
+       
+       Additionally, you can include remainder value (i.e.,
+       ~remainder=~ $w_i$). This means that all matrices not mentioned
+       have a prior probability of $w_i$.
+     - ~fixed(~ $m$ ~)~\\ 
+       fix the value of the parameter to one of the models listed above 
+** Configuring the Run
+   All of the following options need to be enclosed within a block
+   featuring the keyword ~run~. 
+
+*** General Options 
+    The following options allow you to exactly configure what kind of
+    Bayesian sampling is performed. Keywords and default values are
+    mentioned along the description of the options.  
+    
+    The most important settings are, how many independent runs
+    (*numRuns*, default: 1) you want to run for how many generations
+    (*numGen*, default: 1,000,000). If you execute exactly 1 run, then
+    ExaBayes will terminate after ~numGen~ generations. For more than 1
+    run, ExaBayes will terminate once ~numGen~ generations have passed
+    and one of the following topological convergence diagnostics are
+    below a specified threshold.
+
+    By default, ExaBayes draws a sample from every cold chain (i.e.,
+    for each independent run) every 500 generations (can be changed
+    via *samplingFreq*). To change the print frequency (informing you
+    about the likelihood state of each chain), modify *printFreq*. 
+    
+    ExaBayes updates a checkpoint file at regular intervals (1,000
+    generations by default), the respective variable for changing the
+    frequency is *checkPointInterval*. 
+    
+    By default, ExaBayes starts from a random-order addition parsimony
+    tree. If you want to start from a purely random topology, set
+    *parsimonyStart* to ~false~.
+
+    Some proposals (e.g., the branch length multiplier) can be tuned
+    for achieving good acceptance ratios. ExaBayes tunes proposal
+    parameters, once a proposal has been drawn 100 times (use
+    *tuneFreq* to change this, set it to 0 to disable tuning).
+
+    If you are running a dataset in parallel that comprises many
+    partitions, it is advisable to group the proposals per partition
+    into proposal sets (i.e., set *proposalSets* to ~true~, this is
+    the default). If proposal sets are enabled and you have for
+    instance multiple substitution matrix parameters, then ExaBayes
+    will propose new substitution parameters for each substitution
+    matrix parameter one after another (instead of only drawing one of
+    the parameters at random).
+    
+*** Options regarding convergence 
+    ExaBayes implements the same diagnostics for topological
+    convergence as MrBayes and BEAST. These are either the maximum or
+    the average deviation of split (i.e., bipartition) frequencies
+    (MSDSF/ASDSF). By default, ExaBayes employs the ASDSF. You can
+    change to MSDSF by setting *convergenceCriterion* to ~max~. For
+    disabling the convergence detection, set it to ~none~. 
+
+    The convergence threshold for either of these statistics can be
+    specified via *sdsfConvergence* (default: 0.05, i.e., the
+    respective statistic must be $\leq 5\%$). Usually, splits that
+    exhibit a low posterior probability are excluded from this
+    statistic, since it is hard to determine their probability
+    accurately. You can specify the exclusion threshold for the
+    ASDSF/MSDSF via *sdsfIgnoreFreq* (default: 0.1, i.e., splits that
+    do not occur in at least $10\%$ of the trees of a run are ignored).
+    
+    Also relevant for the convergence statistic is how many samples
+    are discarded by ExaBayes as burn-in. By default, the initial $25\%$
+    of all sampled trees are discarded (change this via
+    *burninProportion*). If you want to use an absolute burn-in,
+    specify *burninGen* (e.g., "~burninGen 1e4~") instead. In this case,
+    all trees sampled prior to generation 10,000 are discarded.
+
+    ExaBayes checks for topological convergence once every run has
+    proceeded by $5,000$ generations (set the *diagFreq* variable to
+    change this value). 
+    
+*** MC3 options 
+    If you sample a rough likelihood landscape, you may want to employ
+    Metropolis-coupled MCMC (MC3, turned off by default). In very
+    brief terms, this means that a number of heated chains are coupled
+    to the cold chain (from which samples are drawn).  All coupled
+    chains attempt to swap their states at regular intervals. Thus,
+    the cold chain can be enabled to reach regions of the parameter
+    space (potentially separated by values with low posterior
+    probability) that are otherwise very unlikely to be sampled.
+
+    The total number of coupled chains can be specified via
+    *numCoupledChains*.  This number includes the cold chain, so if
+    you want to add three heated chains, "~numCoupledChains 4~" is the
+    correct statement.
+
+    The chains are heated incrementally, so the more chains you added,
+    the hotter the hottest chain will get. The heat $\beta$ for the
+    $i$-th heated chain (where $i = 0$ for the cold chain) is defined
+    as
+
+    \begin{equation}
+    \beta = \frac{1}{ 1 + i \cdot \delta}. 
+    \end{equation}
+
+    When deciding upon acceptance of a new state, the likelihood and
+    prior ratio are exponentiated with $\beta$ (thus increasing the
+    acceptance probability for heated chains). By default, the heat
+    constant $\delta$ is set to 0.1. The value changed by setting the
+    variable *heatFactor*. 
+
+    The expected number of swap attempts between chains per generation
+    (i.e., after each chain has proceeded this many generations) can
+    be specified via *numSwapPerGen* (default: 1). This is a very
+    important variable that affects both the performance of the MC3
+    mechanism as well as the your parallel runtime performance (if
+    applicable).
+
+    The reason for this is, that an increase of number of coupled
+    chains will not directly translate into more efficient
+    sampling. If the number of swap attempts is kept constant, then it
+    becomes increasingly unlikely that any change is propagated to the
+    cold chain as you increase the number of heated chains. On the
+    other side, if you run coupled chains in parallel (-R argument),
+    then more swapping attempts will lead to increased waiting
+    times. This is, because processes computing the chain will have to
+    wait for processes that compute the likelihood of the other chain
+    involved in a swap attempt.
+
+    If you want heated chains to start from the same topology
+    as the cold chain, set *heatedChainsUseSame* to ~true~.
+
+** Configuring Proposals
+  :PROPERTIES:
+  :CUSTOM_ID: proposal-config
+  :END:
+
+   ExaBayes allows you to configure proposals that are used to move
+   your chains through the parameter space. For each proposal, a
+   relative weight governs, how often a specific proposal is
+   drawn. You can customize your proposal mixture by modifying these
+   weights. A proposal provides values for a single parameter only, so
+   a change of the relative weight affects all related proposals.
+   Specifically the topological proposals are described in detail in
+   \cite{Lakner2008a}. 
+
+   Using proposal sets does not change how often a proposal is drawn
+   relative to runtime (so no modifications are necessary).
+
+#+ATTR_LATEX: :align l||p{5cm}|l|r
+| keyword              | full name                                                                                      | affected parameters  | default weight |
+|----------------------+------------------------------------------------------------------------------------------------+----------------------+----------------|
+| *nodeSlider*         | node slider                                                                                    | branch lengths       |              0 |
+| *treeLengthMult*     | tree length multiplier                                                                         | branch lengths       |              1 |
+| *branchMulti*        | multiplier on branch lengths                                                                   | branch lengths       |              7 |
+| *eTBR*               | extending tree bisection and reconnection (eTBR)                                               | topology             |              0 |
+| *eSPR*               | extending subtree pruning and regrafting (eSPR)                                                | topology             |              6 |
+| *parsimonySPR*       | parsimony-biased subtree pruning and regrafting                                                | topology             |              6 |
+| *stNNI*              | stochastic nearest neighbor interchange                                                        | topology             |              6 |
+| *likeSPR*            | a posterior-guided SPR                                                                         | topology             |              2 |
+| *rateHetMulti*       | multiplier on $\alpha$                                                                         | rate heterogeneity   |              1 |
+| *revMatSlider*       | sliding window                                                                                 | rev. matrix (DNA,AA) |              1 |
+| *revMatDirichlet*    | dirichlet proposal                                                                             | rev. matrix (DNA,AA) |              1 |
+| *RevmatRateDirich*   | partial dirichlet proposal                                                                     | rev. matrix (AA)     |              1 |
+| *frequencySlider*    | sliding window                                                                                 | state frequencies    |            0.5 |
+| *frequencyDirichlet* | dirichlet proposal                                                                             | state frequencies    |            0.5 |
+| *aaModelJump*        | fixed AA matrix                                                                                | amino acid model     |              1 |
+| *blDistGamma*        | Newton-Raphson-based branch length proposal employing a Gamma distribution                     | branch lengths       |              7 |
+| *blDistWeibull*      | Newton-Raphson-based branch length proposal employing a Weibull distribution (not recommended) | branch lengths       |              0 |
+|----------------------+------------------------------------------------------------------------------------------------+----------------------+----------------|
+
+  Moreover, the behaviour of the topological proposals can be
+  customized. The eSPR prunes a subtree, follows down a random path
+  (starting with the original pruning position) and chooses the
+  current branch as re-grafting position with a certain stopping
+  probability (keyword: ~eSprStopProb~). In case of the eTBR, the tree
+  is bisected at a branch and the bisected branch traverses the tree
+  on both ends as described for the eSPR (keyword for the stopping
+  probability is ~eTbrStopProb~).
+
+  The parsimony-biased SPR (parsSPR) move prunes a subtree and
+  proposes a regraft position proportionally to the parsimony score of
+  the resulting tree. The parsSPR evaluates the parsimony score for
+  regrafting positions that are no more than $n$ steps (keyword:
+  ~parsSPRRadius~) apart (i.e., it considers branches within a
+  specified radius for re-insertion). Computing the parsimony score is
+  extremely fast and parallelized in ExaBayes. If you are dealing with
+  large trees, consider increasing the radius. It may not increase
+  mixing, but definitely will reduce the burn-in time and the increase
+  in runtime should not be problematic. The default value depends on
+  the logarithm of the number of taxa (a reasonable assumption, if we
+  do not expect comb-like trees).
+
+  Similar to MrBayes, parsimony scores are /heated/ (i.e.,
+  exponentiated) using the value of ~parsimonyWarp~. If this value is
+  decreased, the probability that trees with low parsimony score are
+  proposed will get higher.  
+
+  The posterior-guided SPR move is particularly expensive, since after
+  pruning, it evaluates all reattachment locations in a radius
+  (specified by ~likeSprMaxRadius~) and uses a score based on the
+  posterior to propose a SPR move. How heavily ExaBayes relies on this
+  score can be quantified with ~likeSprWrap~ (e.g., choose a
+  likeSprWrap = 0.1 or 0.01 to give topological changes that decrease
+  the posterior by -10 resp. -100 log-units a reasonable chance of
+  being proposed).
+
+  ~moveOptMode~ allows you to enhance topological proposals by
+  simultaneously proposing branch lengths along with topology (turned
+  off by default). Value 1 means that one branch that is remapped by
+  any NNI/SPR will be proposed. For moveOptMode = 2, all branches that
+  are traversed by a moving subtree will be proposed. For moveOptMode
+  = 3, we additionally propose two branches adjacent and for
+  moveOptMode = 4, adjacent subtrees (e.g., also the root branch of
+  the moving subtree) will be proposed. By default, the NR-based Gamma
+  distribution proposal is used, if useMultiplier is ~true~, then a
+  multiplier is used instead (not recommended).
+
+
+| keyword            |                    default value |
+|--------------------+----------------------------------|
+| *eSprStopProb*     |                              0.5 |
+| *eTbrStopProb*     |                              0.5 |
+| *parsimonyWarp*    |                             0.10 |
+| *parsSprRadius*    | $\lfloor 2 \cdot \log(n) \rfloor$ |
+| *useMultilier*     |                            false |
+| *moveOptMode*      |                                0 |
+| *likeSprMaxRadius* |      $\lceil \log_2(n) \rceil$   |
+| *likeSprWrap*      |                              1.0 |
+
+* Pre-/post-processing utilities
+:PROPERTIES:
+:CUSTOM_ID: prepost
+:END:
+  For all utilities, please use the -h option, the documentation is
+  mostly sufficient to execute the programs. In this section, we
+  provide additional hints and caveats about employment of these
+  tools.
+** parser
+:PROPERTIES:
+:CUSTOM_ID: parser
+:END:
+   This utility parses an phylip-formatted alignment and creates a
+   binary representation of this alignment. You either have to
+   indicate the data type of a single partition alignment (via ~-m~)
+   or provide a model file via ~-q~ (see Section [[#partitionfile]]).
+
+   Parsing large alignment can take a considerable amount of time that
+   is lost manifold when ExaBayes is executed in parallel.
+   
+** postProcParam
+:PROPERTIES:
+:CUSTOM_ID: parser
+:END:
+   This utility can be used to summarize (similar to sump in MrBayes
+   or the summary statistics in Tracer) all sampled parameters. 
+   
+   This is straight-forward for continuous parameters (such as
+   substitution rates). If you integrate over fixed protein model
+   matrices (e.g, WAG, LG,...), you are integrating over a discrete
+   parameter. The output in the ExaBayes_parameters* will list the
+   respective matrices. In this case, postProcParam will create an
+   extra column that contains the discrete distribution. 
+
+   You should check, if all ESS values are greater than 100 and (if
+   available) PSRF values are close to 1 (< 1.1 is considered good
+   convergence).
+
+
+** sdsf
+   This utility computes deviations of split frequencies (either
+   maximum or average, abbrev. as ASDSF/MSDSF). If you are integrating
+   over topologies (you usually are), ASDSF/MSDSF are an essential
+   convergence criterion. Usually an ASDSF of $0.5-1\%$ is considered
+   "excellent convergence" and values between $1-5\%$ are considered to
+   be acceptable.
+
+   You will encounter strongest deviations for branches with low
+   posterior probability.
+
+   The stand-alone ~sdsf~ computes the same result that is also
+   calculated, if you run multiple independent analysis with
+   convergence criterion. If you run an exceptionally large analysis
+   with multiple independent runs and plan on sampling a very large
+   number of trees, it is recommendable to launch each independent run
+   as a distinct ExaBayes session. You could have a master-script that
+   launches the independent runs (to be run for e.g., 2 h), then
+   checks for convergence and restarts the runs from the respective
+   checkpoints, if not converged yet. If an immense number of
+   processes is involved and your cpu-h budget is tight, this saves
+   you sequential overhead.
+   
+** credibleSet
+   This utility computes the credible set of topologies (up to a
+   specified percentile) in one or many tree sets. Use it for
+   post-analyses of your tree samples. 
+   
+** extractBips
+   This utility extracts bipartitions (AKA splits or edges) from tree
+   sets and the branch lengths associated with these
+   bipartitions. Note that, this utility also examines trivial
+   bipartitions (these correspond to outer branches in a tree).
+   
+   extractBips produces the following files: 
+   + *ExaBayes_bipartitions.** lists the smaller partition of a
+     bipartition (i.e., all taxa omitted are in the complementary
+     partition) and assigns a unique identifier to the bipartition.
+     
+   + *ExaBayes_fileNames.** lists the file names of the input topology
+     files and assigns a for reference in the remaining two files.
+
+   + *ExaBayes_bipartitionBranchLengths.** contains all unique branch
+     lengths samples associated with a specific bipartition in a
+     specific file. The file id and bipartition id from the previous
+     two files are used for that.
+
+   + *ExaBayes_bipartitionStatistics.** contains summary statistics
+     for the branch lengths associated with bipartitions (similar to
+     the output of postProcParam). The ESS value indicates, whether
+     you have sufficiently sampled the branch length associated with a
+     branch and the PSRF value can be used to judge, if the samples
+     from different chains converged against the same
+     distribution. You have sufficiently sampled a parameter, if the
+     ESS is > 100 and a PRSF < 1.1 is an indicator of good
+     convergence.
+
+   If a bipartition occurs only in one chain, extractBips will produce
+   ~-nan~-values.
+     
+** consense
+   This utility allows to build consensus trees from one or more tree
+   sets. If computing the consensus tree (specifically the extended MR
+   consensus) becomes computationally challenging, you may want to
+   give the parallelized consensus tree algorithm in [[https://github.com/stamatak/standard-RAxML][RAxML]] a try (use
+   ~-J MRE~).
+
+   ~consense~ will produces two output files (one in Newick format,
+   one in Nexus format). Nodes are annotated with marginal probability
+   (i.e., confidence), median, mean and $5\%/95\%$ quantile values.
+
+   If you ran analyses with unlinked branch lengths (i.e., you had
+   multiple partitions with a branch length parameter each), then you
+   should create one consensus tree for each branch length parameter.
+   ExaBayes writes one topology file per parameter and per
+   analysis. So you can consense all files that have a "tree-x" (where
+   x is the id of the parameter) in their name.
+   
+* ExaBayes on Clusters/Supercomputers
+:PROPERTIES:
+:CUSTOM_ID: cluster
+:END:
+
+   The striking feature of ExaBayes is its capability to execute
+   standard analyses on clusters and super-computers efficiently.
+   This section goes through various aspects worth considering.
+   
+   On clusters you often have to load a MPI module first. If you
+   downloaded binaries, try to execute ExaBayes using ~n~ processes
+   and using either ~mpirun~ or ~mpiexec~ as follows:
+
+   #+BEGIN_SRC bash
+   $ mpirun -np n ./exabayes <further args>
+   #+END_SRC
+   
+   The exact invocation may vary depending on the MPI installation. If
+   this does not work, make sure you downloaded the corrected package
+   or consider compiling ExaBayes from source. On clusters, you
+   usually have to provide a batch script that is committed to the
+   scheduler.
+
+   In ExaBayes, you may have several computing nodes working on a
+   chain in parallel. We refer to the entirety of nodes computing a
+   chain as /parallel unit/.
+   
+** TL;DR summary
+   In most cases, if you have $x$ processes available (e.g., 4
+   machines with each 12 cores $\Rightarrow$ 48 processes):
+   
+   + if you run $n$ independent analyses, use ~-R n~.
+   + if you want to run $m$ coupled chains, check, if ExaBayes becomes
+     faster, if you increase from ~-C 1~ (default) over ~-C 2~ to ~-C 4~
+     up to ~-C m~ (often the optimum is 2 or 4). For each increment
+     (default: 500 generations), ExaBayes prints the time required for
+     the last increment (use this for benchmarking).
+   + check the load balance output. For good parallel efficiency, each
+     process should at least have \approx 100 patterns. Otherwise,
+     less processes may be sufficient, but more do not hurt, if you
+     are not under a budget constraint.
+
+** Choosing the right kind of parallelism 
+   :PROPERTIES:
+   :CUSTOM_ID: right-parallelism
+   :END:
+   
+   ExaBayes implements three levels of parallelism (in descending
+   order of granularity):
+   + runs-level parallelism,
+   + chain-level parallelism,
+   + data parallelism.
+
+   For optimal performance, please consider the following
+   example. Assume, you run $m$ coupled chains and $n$ independent
+   runs, while you specify that $m_p$ coupled chains and $n_p$
+   independent runs are run in parallel (via ~-R~ and ~-C~). For
+   reasons of load balance, $m$ should be a multiple of $m_p$ (analog
+   for $n$). Assume each of your computing nodes has $k$ cores and you
+   want to use $l$ computing nodes for each parallel working unit
+   (working on one coupled chain in an independent run that is
+   executed in parallel). Thus, you will obtain optimal performance,
+   if you execute ExeBayes with a total number of processes of 
+   
+   \begin{equation}
+   processes = m_p \cdot n_p \cdot l \cdot k .
+   \end{equation}
+   
+   If the number of cores $k$ is divisible by 2, $l = 2^i$ (where $i <
+   0$) works as well. This way several parallel working units fit on a
+   node.
+   
+*** On Run-level Parallelism
+   Obviously, run-level parallelism is the most efficient kind of
+   parallelism. Processes working on different runs rarely have to
+   communicate with each other (except for writing a checkpoint, so
+   make sure your checkpointing frequency is not too low).  If you
+   instruct ExaBayes to execute 2 runs parallel, then using twice as
+   many processes should result in an optimal speedup of two.
+
+   Alternatively, you can commit each independent run separately to
+   the cluster and naturally get the same parallel speedup this
+   way. You will save computational time, if you regularly check for
+   topological convergence (using the ~sdsf~ tool). So one possibility
+   is to commit several runs for which you specify a large number of
+   generations in the config file and a relatively short walltime
+   (maybe 2h). After the scripts have finished, another script checks
+   the ASDSF and recommits the runs (using the checkpointing
+   functionality ~-r~). Or you could commit several jobs for each of
+   your run and each job has to wait for the previous job to finish
+   (e.g., using ~-hold_jid~ with Grid Engine).
+   
+   The optimal strategy depends on the configuration of your
+   cluster/supercomputer. In some instances a single large run
+   parallelized via ~-R~ allows your job a higher priority in the
+   queue, in other instances smaller jobs that run for a short period
+   will allow you to get the results as quickly as possible.
+
+   If you sample an immense number of trees using an immense number of
+   processes, we recommend to choose a non-monolithic (e.g., the
+   second) strategy. The ~sdsf~ requires a bit of runtime on its own
+   that increases with the number of trees and that is lost manifold,
+   if many processes have to wait before they continue.
+
+*** On Chain-level Parallelism
+:PROPERTIES:
+:CUSTOM_ID: chain-level
+:END:
+    Employing chain-level parallelism in Bayesian analyses comes with
+    some caveats. The speedup you can achieve with coupled chains
+    strongly depends on how often an individual coupled chain is
+    involved in a swapping attempt. Each time two chains $a$ and $b$
+    swap, all processes working on $a$ have to wait for chain $b$ to
+    reach the respective generation and vice versa. Reducing the
+    number of swap attempts (via ~numSwapPerGen~) will improve your
+    parallel efficiency, but probably reduces your mixing between
+    coupled chains (e.g., it is less likely that the cold chain
+    benefits from the hotter ones).
+
+    So while runtime efficiency probably is the weakest argument for
+    employing chain-level parallelism, memory is a point to consider
+    (also see section [[#memory]]). Likelihood computation is the single
+    dominating factor of memory consumption. The formula for computing
+    memory requirements (in Byte) of a single chain in one run is
+
+    \begin{equation}
+    mem = 4 \cdot 8 \cdot r \cdot p \cdot (n-2),
+    \end{equation}
+    where $r$ is 4 for DNA and 20 for AA data, $p$ is the number of
+    unique site patterns in your alignment and $n$ is the number of
+    taxa.
+
+    For executing $m$ coupled chains (efficiently), you require $m+1$
+    sets of likelihood arrays, thus $mem \cdot (m+1)$ byte. Even if
+    data parallelism is favorable for your dataset, memory
+    requirements may become prohibitive.  If you employ more
+    processes, you will also increase the amount of memory that is at
+    your disposal. However, depending on the size of your dataset,
+    parallel efficiency of data parallelism will decrease at some
+    point. This is where chain-level parallelism should be considered.
+
+    Using chain-level will allow you to increase the number of
+    processes, while still enough work load is assigned to each
+    process. 
+
+    As described above you need an additional set of likelihood
+    arrays. Unfortunately, this rule still holds, when chain-level
+    parallelism is employed. Assuming, you run $m_p$ coupled chains in
+    parallel, you will need $mem \cdot (m+m_p)$ byte. For a discussion
+    on how to reduce $m_p$, please see Section [[#memory]].    
+
+*** On Data Parallelism
+:PROPERTIES:
+:CUSTOM_ID: data-para
+:END:
+    
+    Data parallelism means that the unique site patterns of your
+    alignment are spread out across processes. As discussed at the
+    beginning of this section you should choose the number of
+    processes such that the processes involved in computing the
+    likelihood of a single tree are distributed across as few
+    computing nodes as possible.
+
+    Since it takes longer to compute the likelihood of a larger
+    pattern (i.e., your alignment contains more taxa), it is hard to
+    say until which point data parallelism can be employed
+    efficiently. As a rule of thumb each process should at least be
+    responsible for at least 100 sites. If a parallel run of ExaBayes
+    is started, ExaBayes prints the load distribution (i.e., how many
+    pattern are assigned to each process) before starting the
+    computation.
+
+** Saving Memory
+:PROPERTIES:
+:CUSTOM_ID: memory
+:END:
+
+   As mentioned earlier, with ExaBayes you can do Bayesian MCMC on
+   alignments of which the size is only limited by the total memory
+   you have available in your computing center.
+
+   In addition to that, ExaBayes implements techniques to reduce the
+   overall memory footprint. 
+
+   The ~-M x~ option allows you to trade runtime for reduced memory
+   consumption. The higher ~x~, the slower but less memory-intensive
+   are the likelihood computations. Remember, that for any ~-M x~
+   ExaBayes will yield the exact same results with the limitations
+   described in section [[#reproducibility]].
+
+   
+   This is particularly relevant, if you use chain-level parallelism,
+   since increased parallelism also increases the memory-overhead as
+   explained in section [[#chain-level]]. Recall that for ~x=0~, you need
+   the $(m+m_p)$ sets of likelihood arrays (where ~m~ is the number of
+   coupled chains and $m_p$ the number of coupled chains executed in
+   parallel). This is, because ExaBayes uses an additional set of
+   likelihood arrays to evaluate the likelihood of a new proposal and
+   saves the previous likelihood arrays for the case of rejection of
+   the proposal.
+
+   With ~-M 1~, you can instruct ExaBayes to not save likelihood
+   arrays for arrays for inner nodes that are (recursively) computed
+   from two leave (resp. tip) nodes. These nodes are particularly fast
+   to compute, so you will not loose too much runtime. For a balanced
+   binary tree (best case), the memory consumption of the saved
+   likelihood arrays (adding the $m_p$ to the equation of memory
+   consumption) is reduced by more than $50\%$. In the worst case (a
+   comb-/caterpillar-like tree), the memory consumption is merely
+   reduced by 1 array.
+
+   When run with ~-M 2~, ExaBayes will only save likelihood arrays for
+   the most expensive kind of nodes. These are nodes that have two
+   inner nodes as their descendants. In terms of memory consumption, a
+   balanced binary tree is the worst case (saving only $> 50\%$ of the
+   additional likelihood arrays). In the best case (here the comb-like
+   tree), ExaBayes will not save any addition likelihood arrays.
+
+   For ~-M 3~, ExaBayes by default does not save any likelihood
+   arrays. The run will be executed substantially slower (but still
+   less than a factor of 2), but specifically if you run a lot of
+   chains in parallel, the factor $(m + m_p)$ in the memory
+   consumption formula is reduced to ~m~.
+
+   Aside from that, ExaBayes implements a subtree equality
+   vector-technique, that allows you to save memory for dataset that
+   contain many gaps or undetermined characters (see
+   \cite{Izquierdo-Carrasco2011}). The amount of memory you save is
+   proportional to the amount of missing data and the runtime penalty
+   should be negligible (resp., there are instances where this
+   actually increases runtime performance).
+
+** Highly Partitioned Runs    
+
+   In a parallel setting, it is less straight-forward to efficiently
+   execute an analysis, if the alignment is highly partitioned. The
+   issue of load distribution in case of data parallelism is discussed
+   in section [[#data-para]]. The upshot is that you should, whether all
+   processes of a parallel unit have about the same portion of the
+   overall data. In parallel runs, ExaBayes initially lists, how many
+   characters, partitions, (coupled) chains and runs are assigned to
+   each processor.  For efficiency it is important that the option
+   ~proposalSets~ is by default set to ~true~ (default).
+
+   For assigning data (possibly a huge number of partitions) to
+   processors, ExaBayes employs the same algorithm as
+   ExaML \cite{kobert2014divisible}.
+
+** Note on Reproducibility
+:PROPERTIES:
+:CUSTOM_ID: reproducibility
+:END:
+  ExaBayes comes with a strong guarantee of reproducibility.
+
+  Ideally, the same seed, configuration file and alignment file have
+  to result in the exact same outcome (e.g., topology/parameter
+  samples) regardless whether ~yggdrasil~ or ~exabayes~ were
+  employed. This should hold for any kind of command line parameter
+  governing the specifics of how calculations are to be
+  performed. Furthermore, repeated continuations from a checkpoint
+  file should not influence the output either.
+
+  Any change in the configuration file potentially interferes with
+  perfect reproducibility (e.g., increasing the checkpoint frequency).
+  
+  When parallelism is involved, this guarantee does not hold
+  necessarily. The reason for this is indeterminism in the calculation
+  of the likelihood, when conducted on multiple
+  processors. Compensating for this problem comes at the cost of
+  runtime performance, thus this has not been implement in ExaBayes. 
+  
+  In other words: running ExaBayes with a different number of
+  processes theoretically may yield different results (however, we
+  have not observed this for any MPI implementations yet).
+
+  All of the above does not influence the correctness of the results,
+  however it limits the guarantee that the chain is in the exact same
+  state.
+  
+* File Format: Model/Partitioning file
+:PROPERTIES:
+:CUSTOM_ID: partitionfile
+:END:
+  If you want to partition your data, you have to provide a model file
+  either to the ~parser~ utility or to ~yggdrasil/exabayes~ (via
+  ~-q~). In brief, this format is identical to the raxml model-file
+  format, except that instead of specifying specific protein
+  substitution matrices, you must identify a protein partition with
+  *PROT* instead of a matrix name such as *LG*. 
+
+  The example file below demonstrates the syntax of this file format: 
+
+  #+BEGIN_SRC TEXT
+DNA, gene1=1-300
+DNA, gene2-codonPos1=301-500/3
+DNA, gene2-codonPos2=302-500/3
+DNA, gene2-codonPos3=303-500/3
+PROT, protId=501-800
+DNA, composit=801-1000,1101-1200
+DNA, gene3=1000-1100
+  #+END_SRC
+
+  The bottom line is: 
+  + data type identifier: *DNA* or *PROT* (followed by comma)
+  + partitionName (followed by equal sign)
+  + alignment positions:
+    + range component, see "gene1"
+    + strided range (useful for codon positions), see
+      "gene2-codonPos1", "gene2-codonPos2" and "gene2-codonPos3". Notice
+      that the starting position of the range is incremented for the
+      second and third codon position. 
+    + combining elements, see "composit". You can combine any
+      element using a comma.  
+
+ For concatenating a large number of alignments efficiently, we
+ distribute this [[https://github.com/aberer/concat-aln][tool]] separately from ExaBayes. It automatically
+ creates the appropriate model file, although you will have to
+ manually set the data type for amino acid partitions. Please use
+ with caution.
+
+ A side note on efficiency: partitioning your data makes likelihood
+ calculation less efficient. If for instance you partition your data
+ and link all parameters across all partitions, then you could have
+ provided an unpartitioned alignment and the MCMC sampling would
+ require less computational resources. 
+
+* Trading mixing efficiency versus runtime
+  
+  As of version 1.4, ExaBayes comes with more advanced guided
+  proposals that have considerable runtime requirements. If you have
+  trouble achieving convergence on your dataset, you may want to
+  increase the usage of these expensive proposals. On the other hand,
+  if you find your dataset to be easily resolvable and you want as
+  many samples from your runtime as possible, you may want to switch
+  to cheaper proposals. Here, we explain your options for both cases
+  (see Section [[#proposal-config]] for information on how to configure
+  proposals).
+
+  In certain cases, we have observed that the NR-based Gamma proposal
+  (~blDistGamma~) increases the probability that chains get stuck
+  (specifically, if started from a random tree). Here, it may be
+  useful to run ExaBayes with the default branch length proposal
+  configuration of version 1.3 (branch length multiplier with weight
+  15, node slider with weight 5, ~blDistGamma~ with weight 0).
+
+  Currently, the posterior-guided SPR (~likeSPR~) has a rather low
+  weight, because of its excessive runtime costs. If runtime is not a
+  problem, we recommend to increase the weight of this proposal on
+  hard datasets. For instance, you may want to go for a configuration
+  that only uses the parsimony-guided SPR and the posterior-guided
+  SPR, both with weight 10 (list remainder topology proposals and set
+  its weight to 0). This setting allowed us to resolve hard datasets
+  with up to 500 taxa which could not be resolved with the previously
+  implemented proposals. The radius of the posterior-guided SPR is an
+  important factor concerning runtime/mixing efficiency. In principle
+  it suffices to set it as large as the largest SPR move that you
+  expect (e.g., assume you know that an unstable subtree usually has
+  regrafting locations in a radius of 3 around the pruning
+  location). Radii should be chosen based upon the dual logarithm of
+  the number of taxa in your tree (start out with this value and
+  modify).
+
+  You may want to turn the posterior-guided SPR off and switch back to
+  default config from ExaBayes 1.3. For doing so, enable the ~eTBR~,
+  ~eSPR~, ~stNNI~ and ~parsSPR~ and assign a weight of 5 to them (0
+  for ~likeSPR~). We specifically do not recommend the ~eTBR~, since
+  true TBR moves (that are not actually SPR or NNI moves) are rarely
+  accepted.
+
+  Proposing branch lengths simultaneously with topology (~moveOptode~
+  > 0 ) may in some cases increase convergence behavior and may allow
+  extremely accurate estimates of split posterior
+  probabilities. However, specifically in the presence of a
+  posterior-guided SPR move, this option becomes very expensive (and
+  thus the radius for the ~likeSPR~ should be chosen conservatively).
+  
+  A cheap option to decrease burn-in time and potentially to increase
+  mixing efficiency is to increase the radius of the parsimony guided
+  SPR. Since, computing the parsimony score is very cheap, you do not
+  have to expect considerable runtime penalties for using arbitrarily
+  high values here (generally recommended).
+
+* Citation
+  ExaBayes has been published in [[http://mbe.oxfordjournals.org/content/early/2014/08/16/molbev.msu236.abstract][Molecular Biology and Evolution]].
+
+  The respective BibTex entry for citing the advance online
+  publication is:
+
+#+BEGIN_SRC TEXT
+ at article{aberer2014exabayes,
+  title={ExaBayes: Massively Parallel Bayesian Tree Inference for 
+  the Whole-Genome Era},
+  author={Aberer, Andre J and Kobert, Kassian and Stamatakis, Alexandros},
+  journal={Molecular Biology and Evolution},
+  pages={msu236},
+  year={2014},
+  publisher={Oxford University Press}
+}
+#+END_SRC
+
+* References
+# make the bibliography work does not work
+#+BIBLIOGRAPHY: library
+
+# plain
+#+LATEX: \bibliographystyle{plain}
+#+LATEX: \bibliography{library2}
+
+#+HTML: <iframe width="100%" src="library2.html"></iframe>
+
+---------------------------------
diff --git a/manual/process.sh b/manual/process.sh
new file mode 100755
index 0000000..229a9ea
--- /dev/null
+++ b/manual/process.sh
@@ -0,0 +1,45 @@
+#! /bin/bash
+
+cd $(dirname $0 )
+
+emacs --batch --kill --eval "(progn \
+    (find-file \"manual.org\")\
+    (org-html-export-to-html))\
+    (org-latex-export-to-pdf) "
+
+bibtex2html --no-abstract --no-keywords library2.bib
+
+pdflatex manual && bibtex manual && pdflatex manual 
+
+# finally correct the citations in html format 
+
+
+
+htmlFile=manual.html
+
+for elem in $( egrep -o  "\\\cite\{[^\}]*\}" $htmlFile ) 
+do 
+    singleEntries=$(echo "$elem" | sed 's/\\cite{\([^}]*\)}/\1/g'  | tr "," " ")
+
+    replacement="["
+    isFirst=0
+    for entry in $singleEntries
+    do 
+    	num=$(grep "name=\"$entry\"" library2.html  | sed "s/.*>\([0-9]\)*<\/a.*/\1/")
+
+	if [ "$isFirst" == 1  ]; then
+	    replacement=${replacement}","
+	fi
+	replacement=$replacement$num
+	isFirst=1
+    done 
+
+    replacement=${replacement}"]"
+
+    escElem=$(echo $elem | sed 's/\\/\\\\\\/g')
+
+    cmd="cat $htmlFile  | sed \"s/$escElem/<a href='manual.html\\#sec-9'>$replacement<\/a>/g\"  > tmp "
+    eval $cmd
+    
+    \mv tmp $htmlFile
+done 
diff --git a/runtests.sh b/runtests.sh
new file mode 100755
index 0000000..b22cabd
--- /dev/null
+++ b/runtests.sh
@@ -0,0 +1,7 @@
+#! /bin/sh
+
+./configure --enable-tests CC="ccache clang" CXX="ccache clang++" && make -j4 && make test 
+
+./configure --enable-tests --enable-mpi CC="ccache mpicc" CXX="ccache clang++"  && make -j4 && make test 
+
+
diff --git a/src.am b/src.am
new file mode 100644
index 0000000..73167e7
--- /dev/null
+++ b/src.am
@@ -0,0 +1,4 @@
+libbayes_a_SOURCES= ./src/common.h ./src/pll.h ./src/TreePrinter.cpp ./src/TreeRandomizer.hpp ./src/TreeRandomizer.cpp ./src/TreePrinter.hpp ./src/releaseDate.hpp ./src/branches/BranchLengthOptimizer.cpp ./src/branches/TreeTraverser.hpp ./src/branches/ComplexTuner.cpp ./src/branches/BranchSetProposer.cpp ./src/branches/TreeTraverser.tpp ./src/branches/WeibullProposer.hpp ./src/branches/WeibullProposer.cpp ./src/branches/ComplexTuner.hpp ./src/branches/BranchBackup.cpp ./src/branches/Bran [...]
+libcommdummy_a_SOURCES= ./src/comm/dummy/CommMethods.hpp ./src/comm/dummy/PendingSwapImpl.cpp ./src/comm/dummy/RemoteCommImpl.hpp ./src/comm/dummy/RemoteCommImpl.tpp ./src/comm/dummy/CommRequestImpl.cpp ./src/comm/dummy/RemoteCommImpl.cpp ./src/comm/dummy/PendingSwapImpl.hpp ./src/comm/dummy/CommRequestImpl.hpp ./src/comm/RemoteComm.cpp ./src/comm/AbstractPendingSwap.hpp ./src/comm/CommFlag.hpp ./src/comm/LocalComm.hpp ./src/comm/SwapElem.hpp ./src/comm/ParallelSetup.hpp ./src/comm/Local [...]
+libcommmpi_a_SOURCES= ./src/comm/mpi/PendingSwapImpl.cpp ./src/comm/mpi/RemoteCommImpl.hpp ./src/comm/mpi/RemoteCommImpl.tpp ./src/comm/mpi/CommRequestImpl.cpp ./src/comm/mpi/RemoteCommImpl.cpp ./src/comm/mpi/MpiType.hpp ./src/comm/mpi/MpiType.cpp ./src/comm/mpi/PendingSwapImpl.hpp ./src/comm/mpi/CommRequestImpl.hpp ./src/comm/RemoteComm.cpp ./src/comm/AbstractPendingSwap.hpp ./src/comm/CommFlag.hpp ./src/comm/LocalComm.hpp ./src/comm/SwapElem.hpp ./src/comm/ParallelSetup.hpp ./src/comm/ [...]
+libncl_a_SOURCES= ./lib/ncl-2.1.18/ncl/nxsmultiformat.h ./lib/ncl-2.1.18/ncl/nxsdiscretedatum.h ./lib/ncl-2.1.18/ncl/nxstaxaassociationblock.h ./lib/ncl-2.1.18/ncl/nxsutilcopy.h ./lib/ncl-2.1.18/ncl/nxsallocatematrix.h ./lib/ncl-2.1.18/ncl/nxscdiscretematrix.h ./lib/ncl-2.1.18/ncl/nxspublicblocks.h ./lib/ncl-2.1.18/ncl/nxsdistancedatum.h ./lib/ncl-2.1.18/ncl/nxsexception.h ./lib/ncl-2.1.18/ncl/nxsdistancesblock.h ./lib/ncl-2.1.18/ncl/nxsunalignedblock.h ./lib/ncl-2.1.18/ncl/nxstoken.h ./ [...]
diff --git a/src/README.dox b/src/README.dox
new file mode 100644
index 0000000..e3b659b
--- /dev/null
+++ b/src/README.dox
@@ -0,0 +1,45 @@
+/**
+   @mainpage 
+   
+   @section intro Introduction 
+
+   ExaBayes is a tool that does this and that ... 
+
+   @section install Installation 
+   
+   ExaBayes can be compiled with two flavors: 
+
+   1. a high-performance MPI version that uses the ExaML (see
+    https://github.com/stamatak) code base. This is particularly
+    useful, if you want to do Bayesian inference on a particularly
+    large alignment and you have access to a computing cluster that
+    has a high-bandwith connect (e.g., InfiniBand or Myrinet) 
+   2. a sequential version (no MPI libraries needed) that employs the
+    phylogenetic likelihood library (PLL) code base.  While currently
+    both versions come with the same feature set, the PLL version will
+    incorporate more advanced inference features and the option for
+    multi-core execution of ExaBayes-PLL runs will be added.  For a
+    large number of CPUs, the ExaML version should always be
+    preferred.
+
+   @subsection examl-install ExaML installation
+   Simply run ./configure && make 
+
+
+   @subsection pll-installation  PLL installation 
+   Run ./configure \-\-enable-pll && make 
+
+
+
+   @section ack Acknowledgments
+
+   Beside the PLL and ExaML, ExaBayes makes use of a strong
+   counter-based random number generator (see
+   http://www.deshawresearch.com/resources_random123.html). 
+
+   Furthermore, we make use of a slimmed-down version of the Nexus Class
+   Library (v.2.1) by Paul O. Lewis and Mark Holder (see
+   http://ncl.sourceforge.net/).
+
+ */
+
diff --git a/src/TreePrinter.cpp b/src/TreePrinter.cpp
new file mode 100644
index 0000000..c81a33d
--- /dev/null
+++ b/src/TreePrinter.cpp
@@ -0,0 +1,110 @@
+#include <cassert>
+
+#include "AbstractParameter.hpp"
+
+// #include "Branch.hpp"
+#include "TreePrinter.hpp"
+
+#include "BranchLength.hpp"
+
+
+TreePrinter::TreePrinter(bool withBranchLengths_I , bool withInternalNodes_I , bool withRealNames_I) 
+  : withBranchLengths(withBranchLengths_I)
+  , withInternalNodes(withInternalNodes_I)
+  , withRealNames(withRealNames_I)
+{
+}
+
+
+std::string TreePrinter::printTree(const TreeAln& traln, AbstractParameter* param)
+{
+  auto vect = std::vector<AbstractParameter*>{};
+  vect.push_back(param); 
+  return printTree(traln, vect);   
+}
+
+
+std::string TreePrinter::printTree(const TreeAln& traln, const std::vector<AbstractParameter*> &params)
+{
+  auto &&ss = std::stringstream{}; 
+  ss << SOME_FIXED_PRECISION; 
+
+  ss << "("; 
+  helper(traln, ss, traln.getNode(1)->back, true, params );   
+  ss << ")" ; 
+  if(withBranchLengths)
+    ss << ":0.0"; 
+  ss << ";"; 
+  return ss.str();
+} 
+
+
+
+void TreePrinter::printBranchLength(const TreeAln& traln, std::stringstream &ss, nodeptr p , const std::vector<AbstractParameter*> &params)
+{
+  ss << MAX_SCI_PRECISION; 
+
+  if(params.size() == 1 )
+    {
+      auto param = params[0]; 
+      // ss << ":" << traln.getBranch(p,param).getInterpretedLength( param); 
+      ss << ":" << traln.getBranch(p,param).toMeanSubstitutions(param->getMeanSubstitutionRate()); 
+    }
+  else 
+    {
+      ss << ":["; 
+      bool isFirst = true ; 
+      for(auto param : params)
+	{
+	  // ss << (isFirst ? "" : ",")  << traln.getBranch(p,param).getInterpretedLength( param); 
+	  ss << (isFirst ? "" : ",") << traln.getBranch(p,param).toMeanSubstitutions(param->getMeanSubstitutionRate()); 
+	  isFirst = false; 
+	}
+      ss << "]"; 
+    }
+}
+
+
+void TreePrinter::helper(const TreeAln &traln, std::stringstream &ss, 
+			 nodeptr p, bool isFirst, const std::vector<AbstractParameter*> &params)
+{  
+  if(traln.isTipNode(p))
+    {
+      if(withRealNames)
+	{
+	  auto &taxa = traln.getTaxa(); 
+	  ss << taxa.at(p->number-1) ; 
+	// ss << traln.getTrHandle().nameList[p->number]; 
+	}
+      else 
+	ss << p->number; 
+    }
+  else 
+    {
+      if (not isFirst )
+	ss << "("; 
+      helper(traln, ss, p->next->back, false, params); 
+      ss << "," ; 
+      helper(traln, ss, p->next->next->back, false, params ); 
+      if(not isFirst)
+	ss << ")"; 
+    }
+
+  if(not isFirst && withInternalNodes && not traln.isTipNode(p))
+    ss << p->number ; 
+
+  if(not isFirst && withBranchLengths && params.size() != 0 )
+    printBranchLength(traln, ss, p, params);
+
+  if(isFirst)
+    {
+      ss << "," << p->back->number; 
+      if(withBranchLengths && params.size() !=  0)
+	printBranchLength(traln, ss, p, params);
+    }
+}
+
+std::string TreePrinter::printTree(const TreeAln& traln)
+{
+  return printTree(traln, {});
+} 
diff --git a/src/TreePrinter.hpp b/src/TreePrinter.hpp
new file mode 100644
index 0000000..97738cb
--- /dev/null
+++ b/src/TreePrinter.hpp
@@ -0,0 +1,30 @@
+#ifndef _TREE_PRINTER_HPP
+#define _TREE_PRINTER_HPP
+
+#include "TreeAln.hpp"
+#include <sstream>
+
+class AbstractParameter; 
+
+
+class TreePrinter
+{
+public: 
+  TreePrinter(bool withBranchLengths , bool withInternalNodes , bool withRealNames) ; 
+  /** 
+      @brief prints the tree belonging to model
+   */ 
+  std::string printTree(const TreeAln& traln, const std::vector<AbstractParameter*> &params); 
+  std::string printTree(const TreeAln& traln,  AbstractParameter* params); 
+  std::string printTree(const TreeAln& traln); 
+  
+private: 			// METHODS
+  void helper(const TreeAln &traln, std::stringstream &ss, nodeptr p, bool isFirst, const std::vector<AbstractParameter*> &params); 
+  void printBranchLength(const TreeAln& traln, std::stringstream &ss, nodeptr p , const std::vector<AbstractParameter*> &params);
+
+private: 			// ATTRIBUTES
+  bool withBranchLengths; 
+  bool withInternalNodes; 
+  bool withRealNames; 
+}; 
+#endif
diff --git a/src/TreeRandomizer.cpp b/src/TreeRandomizer.cpp
new file mode 100644
index 0000000..0f9d45d
--- /dev/null
+++ b/src/TreeRandomizer.cpp
@@ -0,0 +1,312 @@
+#include "TreeRandomizer.hpp"
+
+#include <vector>
+// #include "Branch.hpp"
+#include "ParallelSetup.hpp"
+
+#include "BranchPlain.hpp"
+
+
+extern "C"
+{				// 
+  void newviewParsimonyIterativeFast(pllInstance *tr, partitionList * pr); 
+  unsigned int evaluateParsimonyIterativeFast(pllInstance *tr, partitionList *pr); 
+  void buildSimpleTree (pllInstance *tr, partitionList *pr, int ip, int iq, int ir); 
+  void makePermutationFast(int *perm, int n, pllInstance *tr); 
+  void computeTraversalInfoParsimony(nodeptr p, int *ti, int *counter, int maxTips, boolean full); 
+}
+
+
+// // // this is a quick-and-dirty adaptation for building a random stepwise
+// // addition parsimony tree
+
+
+void TreeRandomizer::stepwiseAddition(pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q, ParallelSetup& pl)
+{            
+  nodeptr 
+    r = q->back;
+
+  unsigned int 
+    mp;
+  
+  int 
+    counter = 4;
+  
+  p->next->back = q;
+  q->back = p->next;
+
+  p->next->next->back = r;
+  r->back = p->next->next;
+   
+  computeTraversalInfoParsimony(p, tr->ti, &counter, tr->mxtips, PLL_FALSE);              
+  tr->ti[0] = counter;
+  tr->ti[1] = p->number;
+  tr->ti[2] = p->back->number;
+    
+  mp = evaluateParsimonyIterativeFast(tr, pr);
+
+  auto result = std::vector<nat>{mp}; 
+  // std::cout <<  "my score was " << mp << std::endl; 
+  result = pl.getChainComm().allReduce(result);
+  mp = result.at(0); 
+  // std::cout << "after allreduce "<< mp << std::endl; 
+  
+  
+  if(mp < tr->bestParsimony)
+    {    
+      tr->bestParsimony = mp;
+      tr->insertNode = q;     
+    }
+ 
+  q->back = r;
+  r->back = q;
+   
+  if(q->number > tr->mxtips
+#if 0 
+     && tr->parsimonyScore[q->number] > 0
+#endif
+     )
+    {         
+      stepwiseAddition(tr, pr, p, q->next->back, pl);
+      stepwiseAddition(tr, pr, p, q->next->next->back, pl);
+    }
+}
+
+
+
+void TreeRandomizer::createStepwiseAdditionParsimonyTree(TreeAln &traln, ParallelSetup& pl )
+{   
+  auto *tr = &(traln.getTrHandle()); 
+  auto *pr = &(traln.getPartitionsHandle()); 
+
+  assert(tr->fastParsimony == PLL_FALSE); 
+    
+  nodeptr  
+    p, 
+    f;    
+
+  int 
+    nextsp; 
+  auto perm = std::vector<int>(tr->mxtips+1,  0); 
+       
+  assert(!tr->constrained);
+
+  makePermutationFast(perm.data(), tr->mxtips, tr);
+  
+  tr->ntips = 0;    
+  
+  tr->nextnode = tr->mxtips + 1;       
+  
+  buildSimpleTree(tr, pr, perm[1], perm[2], perm[3]);
+  
+  f = tr->start;       
+  
+  while(tr->ntips < tr->mxtips) 
+    {   
+      nodeptr q;
+      
+      tr->bestParsimony = std::numeric_limits<nat>::max();
+      nextsp = ++(tr->ntips);             
+      p = tr->nodep[perm[nextsp]];                 
+      q = tr->nodep[(tr->nextnode)++];
+      p->back = q;
+      q->back = p;
+        
+      if(tr->grouped)
+        {
+          int 
+            number = p->back->number;            
+
+          tr->constraintVector[number] = -9;
+        }
+          
+      stepwiseAddition(tr, pr, q, f->back, pl);
+      
+      // std::cout <<  SyncOut() << "bestPars: "<< tr->bestParsimony << std::endl; 
+      
+      {
+        nodeptr   
+          r = tr->insertNode->back;
+        
+        int counter = 4;
+        
+        hookupDefault(q->next,       tr->insertNode);
+        hookupDefault(q->next->next, r);
+        
+        computeTraversalInfoParsimony(q, tr->ti, &counter, tr->mxtips, PLL_FALSE);              
+        tr->ti[0] = counter;
+        
+        newviewParsimonyIterativeFast(tr, pr);
+      }
+    }    
+}
+
+
+void TreeRandomizer::createParsimonyTree(TreeAln &traln, Randomness& rand, ParallelSetup& pl)
+{
+  nat r = rand();  
+
+  traln.unlinkTree();
+  traln.getTrHandle().randomNumberSeed = r; 
+
+  createStepwiseAdditionParsimonyTree(traln, pl);
+}
+
+
+void TreeRandomizer::randomizeTree(TreeAln &traln, Randomness& rand )
+{
+  traln.unlinkTree();
+
+  // start with the simple tree 
+  auto a = traln.getNode(1 ),
+    b = traln.getNode(2 ), 
+    c = traln.getNode( 3 ), 
+    inner = traln.getNode(traln.getNumberOfTaxa() + 1); 
+  
+  traln.clipNodeDefault(inner,a); 
+  traln.clipNodeDefault(inner->next, b); 
+  traln.clipNodeDefault(inner->next->next,c); 
+
+  for(nat i = 4; i < traln.getNumberOfTaxa() +1 ;  ++i)
+    {
+      inner = traln.getNode(traln.getNumberOfTaxa() + i-2 );       
+      auto taxonP = traln.getNode(i); 
+      traln.clipNodeDefault(taxonP, inner); 
+
+      auto p1 = traln.findNodePtr(drawBranchUniform_helper(traln, rand, i-1)),
+	p2 = p1->back; 
+      
+      traln.clipNodeDefault(p1, inner->next); 
+      traln.clipNodeDefault(p2, inner->next->next); 
+    }
+}
+
+
+BranchPlain TreeRandomizer::drawInnerBranchUniform( const TreeAln& traln, Randomness &rand)  
+{
+  bool acc = false;   
+  int aNode = 0; 
+  nodeptr p = nullptr; 
+  while(not acc)
+    {      
+      aNode = drawInnerNode(traln, rand); 
+      p = traln.getNode(aNode); 
+      
+      nat numTips = 0; 
+      if(  traln.isTipNode(p->back) ) 
+	numTips++; 
+      if(traln.isTipNode(p->next->back))
+	numTips++;
+      if(traln.isTipNode(p->next->next->back))
+	numTips++; 
+      
+      assert(numTips != 3); 
+      
+      acc = numTips == 0 || rand.drawRandDouble01() <  (3. - double(numTips)) / 3.;       
+    }
+  assert(aNode != 0); 
+  
+  std::vector<nat> options; 
+  if(not traln.isTipNode(p->back))
+    options.push_back(p->back->number); 
+  if(not traln.isTipNode(p->next->back))
+    options.push_back(p->next->back->number); 
+  if(not traln.isTipNode(p->next->next->back))
+    options.push_back(p->next->next->back->number); 
+
+  nat other = 0;
+  if(options.size() == 1 )
+    other = options[0]; 
+  else 
+    other = options.at(rand.drawIntegerOpen(int(options.size())));   
+  return BranchPlain(aNode, other); 
+}
+
+
+nat TreeRandomizer::drawInnerNode(const TreeAln& traln, Randomness &rand )  
+{    
+  nat curNumTax = traln.getNumberOfTaxa(); 
+  nat res =  1 + curNumTax + rand.drawIntegerClosed(curNumTax - 3 );   
+  return res; 
+}
+
+
+/** 
+    @brief draw a branch that has an inner node as primary node   
+    
+    => equals draw subtree uniformly
+ */ 
+BranchPlain TreeRandomizer::drawBranchWithInnerNode(const TreeAln& traln,Randomness &rand)  
+{
+  nat idA = drawInnerNode(traln, rand); 
+  nat r = rand.drawIntegerClosed(2);  
+  nodeptr p = traln.getNode(idA); 
+  assert(not traln.isTipNode(p)) ; 
+
+  BranchPlain b; 
+  switch(r)
+    {
+    case 0: 
+      b = BranchPlain(idA, p->back->number); 
+      break; 
+    case 1: 
+      b = BranchPlain(idA, p->next->back->number); 
+      break; 
+    case 2: 
+      b = BranchPlain(idA, p->next->next->back->number); 
+      break; 
+    default: assert(0); 
+    }
+ 
+  return b; 
+}
+
+
+
+BranchPlain TreeRandomizer::drawBranchUniform(const TreeAln & traln, Randomness &rand )  
+{
+  return drawBranchUniform_helper(traln, rand, traln.getNumberOfTaxa()); 
+}
+
+BranchPlain TreeRandomizer::drawBranchUniform_helper(const TreeAln &traln, Randomness &rand , nat curNumTax)  
+{ 
+  int randId = 0; 
+  double r = rand.drawRandDouble01(); 
+
+  // for the randomization part, i assume that when a tree is built
+  // successively, I assume that the inner nodes start with an offset
+  // in the nodeptr array that is the number of trees in the final
+  // tree
+  if( r <= 0.75) 		// draw an inner node 
+    randId = 1 + traln.getTrHandle().mxtips + rand.drawIntegerClosed(curNumTax -3 )  ; 
+  else 				// draw a tip 
+    randId = rand.drawIntegerOpen(curNumTax) + 1 ;           
+
+  auto p = traln.getNode(randId); 
+  nat thisNode = randId,
+    thatNode = 0;   
+  if(traln.isTipNode(p))
+    {
+      thatNode = p->back->number; 
+    }
+  else 
+    {
+      switch(rand.drawIntegerOpen(3))
+  	{
+  	case 0 : 
+  	  thatNode = p->back->number; 
+  	  break; 
+  	case 1 : 
+  	  thatNode = p->next->back->number; 
+  	  break; 
+  	case 2: 
+  	  thatNode = p->next->next->back->number; 
+  	  break; 
+  	default: assert(0); 
+  	}
+    }
+
+  return BranchPlain(thisNode, thatNode); 
+}
+
+
diff --git a/src/TreeRandomizer.hpp b/src/TreeRandomizer.hpp
new file mode 100644
index 0000000..a54c492
--- /dev/null
+++ b/src/TreeRandomizer.hpp
@@ -0,0 +1,55 @@
+#ifndef _TREE_RANDOMIZER_H
+#define _TREE_RANDOMIZER_H
+
+class Randomness; 
+class ParallelSetup; 
+// class TreeAln; 
+
+#include "TreeAln.hpp"
+
+class TreeRandomizer
+{
+public: 
+
+  /**
+     @brief creates a random tree 
+   */   
+  static void randomizeTree( TreeAln &traln, Randomness &rand);
+
+  /**
+     @brief draws a branch with uniform probability.
+     
+     We have to treat inner and outer branches separatedly.
+  */
+  static BranchPlain drawBranchUniform(const TreeAln & traln, Randomness &rand )  ; 
+  /** 
+      @brief samples an inner branch (including orientation), such that
+      each oriented inner branch is equally likely.
+  */ 
+  static BranchPlain drawInnerBranchUniform( const TreeAln& traln, Randomness &rand)  ; 
+  static BranchPlain drawBranchWithInnerNode(const TreeAln& traln, Randomness &rand)  ; 
+  static nat drawInnerNode(const TreeAln& traln, Randomness &rand )  ; 
+
+  /**
+     @brief creates a parsimony tree and applies it to the specfilied tree.      
+     the routine does not enforce treatment of branch lengths.  
+   */ 
+  static void createParsimonyTree(TreeAln &traln, Randomness& rand, ParallelSetup& pl); 
+
+private: 
+  /**
+     @brief currently just exists for the tree randomizer 
+     
+     Notice that an inner branch has 3 nodes associated with it, thus
+     the probability of drawing a tip should be accordingly lower.
+  */ 
+  static BranchPlain drawBranchUniform_helper(const TreeAln &traln, Randomness &rand , nat curNumTax)  ; 
+
+  static void createStepwiseAdditionParsimonyTree(TreeAln &traln, ParallelSetup& pl ); 
+  static void stepwiseAddition(pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q, ParallelSetup& pl); 
+
+}; 
+
+
+#endif
+
diff --git a/src/apps/README.txt b/src/apps/README.txt
new file mode 100644
index 0000000..a6e132b
--- /dev/null
+++ b/src/apps/README.txt
@@ -0,0 +1,2 @@
+This package contains all files that result in an executable files
+(i.e., files that contain a main function).
diff --git a/src/apps/consense.cpp b/src/apps/consense.cpp
new file mode 100644
index 0000000..0c96cc3
--- /dev/null
+++ b/src/apps/consense.cpp
@@ -0,0 +1,198 @@
+#include <sstream>
+#include <cstring>
+#include <unistd.h>
+#include <iosfwd>
+
+int NUM_BRANCHES; 	
+
+#include "ConsensusTree.hpp"
+#include "GlobalVariables.hpp"
+
+
+static void printUsage(std::ostream &out)
+{
+  out << "\nconsense computes various flavours of consensus trees from sets of trees.\n\n"; 
+  out << "Usage: ./consense -n id  -f file[..] [-t threshold] [-b burnin] \n\n" ; 
+  out << "        -n runid         an id for the output file\n" ; 
+  out << "        -t thresh        a threshold for the consenus tree. Valid values:\n"
+      << "                         values between 50 (majority rule) and 100 (strict) or MRE\n" 
+      << "                         (the greedily refined MR consensus).  Default: MRE\n" ; 
+  out << "        -b relBurnin     proportion of trees to discard as burn-in (from start). Default: 0.25\n"; 
+  out << "        -f file[..]      one or more exabayes topology files\n\n" ;
+}
+
+
+static std::tuple<std::string,std::vector<std::string>,double, nat,bool>
+processCommandLine(int argc, char **argv)
+{
+  auto id = std::string{}; 
+  auto thresh = double(50); 
+  bool isRefined = true; 
+  auto files = std::vector<std::string>{}; 
+  double burnin = 0.25; 
+
+  int c = 0; 
+  while( ( c = getopt(argc, argv, "n:t:f:b:h") ) != EOF )
+    {
+      switch(c)
+	{
+	case 'h': 
+	  printUsage(std::cout);
+	  exitFunction(0, false);
+	  break; 
+	case 'n': 
+	  {
+	    id = std::string{optarg, strlen(optarg)}; 
+	  }
+	  break; 
+	case 't' : 
+	  {
+	    if(std::string{"MRE"}.compare(optarg) == 0 
+	       || std::string{"mre"}.compare(optarg) == 0)
+	      {
+		thresh = 50; 
+		isRefined = true; 
+	      }
+	    else 
+	      {
+		auto &&iss = std::istringstream{optarg}; 
+		iss >> thresh	; 
+		isRefined = false; 
+	      }
+	  }
+	  break; 
+	case 'f': 
+	  {
+	    int index = optind -1; 
+	    while(index < argc)
+	      {
+		auto next = std::string{argv[index]}; 
+		++index; 
+		if(next[0] != '-') 
+		  files.push_back(next);
+		else 
+		  {
+		    optind =  index -1 ; 
+		    break; 
+		  }
+	      }
+	  }
+	  break; 
+	case 'b': 
+	  {
+	    auto &&iss = std::istringstream {optarg}; 
+	    iss >> burnin; 
+	  }
+	  break; 
+	default: 
+	  {
+	    std::cerr << "Unrecognized option >" <<  optarg << "<"  << std::endl; 
+	    exitFunction(-1, false); 
+	  }
+	}
+    }
+
+  if(thresh < 50 || thresh > 100 )
+    {
+      std::cerr << "error: correct values for -t in [50,100] or MRE." << std::endl; 
+      exitFunction(-1, false); 
+    }
+
+  if(files.size() == 0 )
+    {
+      std::cerr << "Please specfiy tree input files via -f" << std::endl; 
+      exitFunction(-1, false); 
+    }
+  if(id.compare("") == 0)
+    {
+      std::cerr << "Please specify a runid for the output via -n. " << std::endl; 
+      exitFunction(-1, false); 
+    }
+ 
+  if(not (  0 <= burnin   &&  burnin < 1. ))
+    {
+      std::cerr << "The relative burn-in range is [0,1)." << std::endl;
+      exitFunction(-1, false); 
+    }
+
+
+  return std::make_tuple(id, files, burnin, thresh, isRefined);
+}
+
+
+
+
+static void myExit(int code, bool waitForAll)
+{
+  exit(code); 
+}
+
+
+
+
+int main(int argc, char **argv)
+{
+  exitFunction = myExit; 
+
+  NUM_BRANCHES = 1;   // BAD
+
+  if(argc < 2 ) 
+    {
+      printUsage(std::cout);
+      exitFunction(-1, false); 
+    }
+
+  bool isMre = false;   
+  auto threshold = double{0.}; 
+ 
+  std::string id= {}; 
+  double burnin = 0; 
+  auto files = std::vector<std::string>{}; 
+
+  std::tie(id, files, burnin, threshold, isMre) = processCommandLine(argc, argv);
+
+  for(auto &file : files)
+    {
+      if(not std::ifstream(file))
+	{
+	  std::cerr << "Error: could not open file >" << file << "<" << std::endl; 
+	  exitFunction(-1, false); 
+	}    
+    }
+
+  assert(threshold > 1); 
+  threshold /= 100.; 
+
+  auto&& ct = ConsensusTree(files, burnin, threshold,isMre); 
+  auto header = ct.getTreeHeader(); 
+  auto result = ct.getConsensusTreeString(false);
+  auto type = ct.getType();
+
+  auto&& ss = std::stringstream{}; 
+  ss << PROGRAM_NAME << "_" << type << "Nexus." << id; 
+
+  auto &&ss2 = std::ostringstream{}; 
+  ss2 << PROGRAM_NAME << "_" << type << "Newick." << id ; 
+
+  if(std::ifstream(ss.str()))
+    {
+      std::cerr << std::endl << "File " << ss.str() << " already exists (probably \n"
+		<< "left over from a previous run). Please choose a new run-id or remove\n"
+		<< "previous output files." << std::endl; 
+      exitFunction(-1, false); 
+    }
+
+  auto &&outfile = std::ofstream(ss.str()); 
+  outfile << header  << result << std::endl; 
+  outfile << "end;" << std::endl; 
+
+
+  auto &&outfile2 = std::ofstream{ss2.str()}; 
+  outfile2 << ct.getConsensusTreeString(true) << std::endl; 
+
+
+  std::cout << "Printed consensus tree in nexus format to " << ss.str() << std::endl; 
+  std::cout << "Printed consensus tree in newick format to " << ss2.str() << std::endl; 
+
+  return 0; 
+}
diff --git a/src/apps/credibleSet.cpp b/src/apps/credibleSet.cpp
new file mode 100644
index 0000000..1b20cf7
--- /dev/null
+++ b/src/apps/credibleSet.cpp
@@ -0,0 +1,136 @@
+#include "CredibleSet.hpp"
+#include <cstring>
+#include <unistd.h>
+#include <cassert>
+#include <sstream>
+#include <iosfwd>
+
+int NUM_BRANCHES; 
+
+static void printUsage(std::ostream &out )
+{
+  out << "\ncredibleSet is a utility to extract a credible set of trees from a tree set.\n\n" ; 
+  out << "USAGE: ./credibleSet -n id -f treeFile[..] [ -c credibleInterval]\n\n"; 
+  out << "           -n id         a run id for the output file\n"; 
+  out << "           -c int        credible set percentile (in (0,100], default:50)\n"; 
+  out << "           -f file[..]   one or many topology input file(s)\n"; 
+  out << std::endl; 
+}
+
+
+static auto  processCommandLine(int argc, char **argv)
+  -> std::tuple<std::string,std::vector<std::string>,nat>
+{
+  int c = 0; 
+  auto id = std::string{}; 
+  nat credSet = 50; 
+  auto files = std::vector<std::string>{}; 
+
+  while (( c = getopt(argc, argv, "n:c:f:h"))   != EOF) 
+    {
+      switch(c)
+	{
+	case 'h': 
+	  {
+	    printUsage(std::cerr); 
+	    exitFunction(-1, false); 
+	  }
+	  break; 
+	case 'n':
+	  {
+	    id = std::string{optarg, optarg + strlen(optarg)};
+	  }
+	  break; 
+	case 'c' : 
+	  {
+	    auto &&iss = std::istringstream{optarg}; 
+	    iss >> credSet ; 
+	  }
+	  break; 
+	case 'f': 
+	  {
+	    int index  = optind -1; 
+	    while(index < argc)
+	      {
+		auto next = std::string{argv[index]}; 
+		++index; 
+		if(next[0] != '-') 
+		  files.push_back(next);
+		else 
+		  {
+		    optind =  index -1 ; 
+		    break; 
+		  }
+	      }
+	  }
+	  break; 
+	default: 
+	  {
+	    std::cerr << "Error: unknown option >" << char (c) << "<" << std::endl; 
+	    exitFunction(-1, false); 
+	  }
+	}
+    }
+
+  
+  if( id.compare("") == 0)
+    {
+      std::cerr << "Error: please specify an id for output files via -n" << std::endl;
+      exitFunction(-1, false); 
+    }
+  
+  if(not ( 0 < credSet && credSet <= 100 ))
+    {
+      std::cerr << "Error: the percentile (passed via -c) must be between 0 (excluded) and 100 (included)." << std::endl; 
+      exitFunction(-1, false); 
+    }
+  
+  return std::make_tuple(id,files,credSet);
+}
+
+
+static void myExit(int code, bool waitForAll)
+{
+  exit(code); 
+}
+
+
+
+
+int main(int argc, char **argv)
+{
+  exitFunction = myExit; 
+
+  NUM_BRANCHES = 1;   // BAD
+
+  if(argc < 2 )
+    {
+      printUsage(std::cerr);
+      exitFunction(-1, false); 
+    }
+
+  auto id = std::string(argv[1]); 
+  auto ciNumber =  0; 
+  auto files = std::vector<std::string>{}; 
+
+  std::tie(id,files,ciNumber) = processCommandLine(argc, argv);
+
+  double ci = ciNumber; 
+  ci /= 100.; 
+
+  auto&& cs = CredibleSet(files); 
+
+  auto &&ss = std::stringstream{}; 
+  ss << PROGRAM_NAME << "_credibleSet." << id  ; 
+
+  if(std::ifstream(ss.str()))
+    {
+      std::cerr << "The file " << ss.str() << " already exists (possibly left over from a previous run). Please\n"
+		<< "choose a different run-id." << std::endl; 
+      exitFunction(-1, false); 
+    }
+
+  cs.printCredibleSet(ss.str(), ci); 
+
+  return 0; 
+}
diff --git a/src/apps/exabayes.cpp b/src/apps/exabayes.cpp
new file mode 100644
index 0000000..7c34613
--- /dev/null
+++ b/src/apps/exabayes.cpp
@@ -0,0 +1,282 @@
+/** 
+    @file exabayes.cpp
+    
+    @brief This file sets the flavour of exabayes that has been
+    compiled (i.e., sequential, pll, examl, ...)
+    
+*/ 
+
+
+
+// TODO re-activate all that initial bla bla when starting up
+// exa-bayes (model / program info )
+
+
+// dirty...
+// #include  <google/heap-profiler.h>
+
+#ifdef HAVE_AVX
+#define __AVX
+#endif
+
+#include <iostream>
+#include <sstream>
+#include <chrono>
+
+#include "releaseDate.hpp" 
+
+#include "CommandLine.hpp"
+#include "SampleMaster.hpp"
+#include "ParallelSetup.hpp"
+
+#include "TeeStream.hpp"
+
+#include <sstream>
+
+using std::stringstream; 
+using std::cout; 
+using std::endl; 
+
+void exa_main ( CommandLine &cl, ParallelSetup* pl  ); 
+
+/* 
+   tell the CPU to ignore exceptions generated by denormalized floating point values.
+   If this is not done, depending on the input data, the likelihood functions can exhibit 
+   substantial run-time differences for vectors of equal length.
+*/
+
+static void ignoreExceptionsDenormFloat()
+{
+#if ! (defined(__ppc) || defined(__powerpc__) || defined(PPC))
+  _mm_setcsr( _mm_getcsr() | _MM_FLUSH_ZERO_ON);
+#endif   
+}
+
+
+static bool fileExists(const std::string &name)
+{
+  auto &&ifh = std::ifstream{name};
+  bool result = ifh.is_open(); 
+  ifh.close();
+  return result; 
+}
+
+
+
+static void initLogFile(const ParallelSetup &pl, std::string logFile )
+{
+  if( pl.isGlobalMaster())
+    logStream =  make_unique<std::ofstream>(logFile); 
+  else 
+    logStream = make_unique<std::ofstream>(std::string{"/dev/null"}); 
+    
+  teeOut =  make_unique<TeeStream>(std::cout, *logStream, MY_TID);
+
+  if(not pl.isGlobalMaster())
+    teeOut->disable();
+
+}
+
+
+
+
+
+static void initializeProfiler( ParallelSetup& pl)
+{
+  // see this page for info 
+  // http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html  
+  // that option is important
+  // CPUPROFILE_FREQUENCY=x
+#ifdef _USE_GOOGLE_PROFILER
+  auto&& ss = std::stringstream {}; 
+  ss << "profile.out." << pl.getGlobalComm().getRank() ; 
+  auto myProfileFile = ss.str(); 
+  remove(myProfileFile.c_str()); 
+  ProfilerStart(myProfileFile.c_str()); 
+#endif
+
+  // HeapProfilerStart("heap.profile"); 
+}
+
+ 
+static void finalizeProfiler()
+{
+#ifdef _USE_GOOGLE_PROFILER
+  ProfilerStop();
+#endif
+  // HeapProfilerStop(); 
+}
+
+
+
+static void printInfoHeader(CommandLine& cl)
+{  
+  auto &&ss = std::stringstream{}; 
+
+  ss << "\n"; 
+
+  ss << "This is "; 
+  if(isYggdrasil)
+    ss << "Yggdrasil, the multi-threaded variant of "; 
+  else 
+    ss << "the multi-threaded MPI hybrid variant of " ; 
+
+  ss << PROGRAM_NAME << " (version " << VERSION << "),\n"; 
+  ss << "a tool for Bayesian MCMC sampling of phylogenetic trees, build with "
+    "the" ; 
+
+  ss << "\nPhylogenetic Likelihood Library (version "
+     << PLL_LIB_VERSION << ", " << PLL_LIB_DATE << ")." ; 
+
+  ss <<  "\n\nThis software has been released on " << RELEASE_DATE <<
+    "\n(git commit id:" << GIT_COMMIT_ID << ")"
+    "\n\n\tby Andre J. Aberer, Kassian Kobert and Alexandros "
+    "Stamatakis\n" 
+       << "\nPlease send any bug reports, feature requests and inquiries to "
+     << PACKAGE_BUGREPORT << "\n\n"; 
+
+  ss << "The program was called as follows: \n" ; 
+  ss << cl.getCommandLineString() << "\n" ; 
+  ss << "\n================================================================\n" ; 
+
+  tout  << ss.str() ; 
+}
+
+
+
+// also the entry point for the threads
+
+/**
+   @brief the main ExaBayes function.
+
+   @param tr -- a tree structure that has been initialize in one of the adapter mains. 
+   @param adef -- the legacy adef
+ */
+void exa_main ( CommandLine &cl, ParallelSetup* pl  )
+{   
+  if(cl.hasThreadPinning())
+    pl->pinThreads();
+  
+  // auto && ss = std::stringstream();
+  // ss << *pl << "\n\n"; 
+  
+  // ss <<  *pl << "\n\n"; 
+  // std::cout << SyncOut() << ss.str(); 
+
+  ignoreExceptionsDenormFloat(); 
+  
+  printInfoHeader(cl); 
+
+  // timeIncrement = CLOCK::system_clock::now(); 
+
+  auto&& master = SampleMaster(pl->getGlobalComm().size());
+  
+  master.setParallelSetup(pl); 
+  master.setCommandLine(cl); 
+
+  master.initializeRuns(Randomness(cl.getSeed())); 
+  if( cl.isDryRun())
+    {
+      std::cout << "Command line, input data and config file is okay. Exiting gracefully." << std::endl; 
+      exitFunction(0, true);
+    }
+
+  master.simulate();
+  master.finalizeRuns();
+}
+
+
+static void makeInfoFile(const CommandLine &cl, const ParallelSetup &pl )
+{
+  auto &&ss = stringstream{}; 
+
+  if(cl.isDryRun())
+    ss << "/dev/null" ; 
+  else 
+    ss << OutputFile::getFileBaseName(cl.getWorkdir()) << "_info."  << cl.getRunid() ;
+
+  if( not cl.isDryRun() && pl.isGlobalMaster() )
+    {
+      if(fileExists(ss.str()))
+	{
+	  std::cerr << std::endl <<  "File " << ss.str() << " already exists (probably \n"
+		    << "from previous run). Please choose a new run-id or remove previous output files. " << std::endl; 
+	  exitFunction(-1, true); 
+	}
+    }
+
+  initLogFile(pl, ss.str());
+}
+
+
+// just having this, because of mpi_finalize
+static int innerMain(int argc, char **argv)
+{ 
+  _masterThread = std::this_thread::get_id();
+  _threadsDie = false; 
+
+  auto cl = CommandLine(); 
+  cl.initialize(argc, argv); 
+  
+  auto plPtr = make_unique<ParallelSetup>(cl); 
+  plPtr->initialize();
+
+  if(cl.onlyPrintHelp())
+    {
+      auto &&ss = stringstream {}; 
+      if(plPtr->isGlobalMaster())
+	cl.printHelp(ss);
+      cout << SyncOut()  << ss.str() << endl; 
+      exitFunction(0, true);
+    }
+  else if(cl.onlyPrintVersion())
+    {
+      auto &&ss = stringstream{}; 
+      if(plPtr->isGlobalMaster())
+	cl.printVersion(ss);
+      cout << SyncOut() << ss.str() << endl; 
+      exitFunction(0, true);
+    }
+  
+
+  makeInfoFile(cl, *plPtr);
+
+  plPtr->releaseThreads();
+
+  // notice: per-thread profiling does not work...
+  initializeProfiler(*plPtr);
+  exa_main(cl, plPtr.get()); 
+  finalizeProfiler();
+  
+  return 0;
+}
+
+
+static void myExit(int code, bool waitForAll)
+{
+  ParallelSetup::abort(code, waitForAll); 
+}
+
+
+
+
+int main(int argc, char **argv)
+{ 
+#ifdef _IS_YGG
+  isYggdrasil = true; 
+  exitFunction = myExit; 
+#else 
+  isYggdrasil = false; 
+  exitFunction = myExit; 
+#endif  
+  ParallelSetup::initializeRemoteComm(argc, argv);
+
+#ifndef HAVE_LONG_LONG
+  std::cout << "Danger: could not find 64-bit integers. " << PROGRAM_NAME << " will probably not work correctly." << std::endl; 
+#endif
+
+
+  innerMain(argc, argv); 
+  ParallelSetup::finalize(); 
+  return 0 ; 
+}
diff --git a/src/apps/extractBips.cpp b/src/apps/extractBips.cpp
new file mode 100644
index 0000000..340c5b7
--- /dev/null
+++ b/src/apps/extractBips.cpp
@@ -0,0 +1,152 @@
+#include <iosfwd>
+#include <cstring>
+#include <unistd.h>
+
+int NUM_BRANCHES ; 
+
+#include "BipartitionExtractor.hpp" 
+
+// #define _INCLUDE_DEFINITIONS
+// #include "GlobalVariables.hpp"
+// #undef _INCLUDE_DEFINITIONS
+
+
+static void printUsage(std::ostream &out)
+{
+  out << "extractBips is a utility for extracting bipartitions, branch lengths\n"
+      << "associated with bipartitions and statistics about these branch lengths\n"
+      << "from tree sets.\n\n"; 
+  out << "USAGE: ./extractBips -n  id -f file[..] [-b burnin]\n\n" ; 
+  out << "Options:\n"; 
+  out << "         -n id            an id for the output file\n"  ; 
+  out << "         -f file[..]      one or more topology files\n"; 
+  out << "         -b relBurnin     proportion of trees to discard as burn-in (beginning at\n"
+      << "                          the start of the file). Default: 0.25\n\n"; 
+}
+
+static std::tuple<std::string, std::vector<std::string>,double> processCommandLine(int argc, char **argv)
+{
+  double burnin = 0.25; 
+  auto files = std::vector<std::string> {}; 
+  auto id = std::string{}; 
+
+  int c = 0; 
+  while(   (c = getopt(argc, argv, "n:f:b:h") ) != EOF )
+    {
+      switch(c)
+	{
+	case 'h': 
+	  {
+	    printUsage(std::cout); 
+	    exitFunction(-1, false); 
+	  }
+	  break; 
+	case 'n': 
+	  {
+	    id = std::string{optarg, optarg + strlen(optarg)}; 
+	  }
+	  break; 
+	case 'f': 
+	  {
+	    int index  = optind -1; 
+	    while(index < argc)
+	      {
+		auto next = std::string{strdup(argv[index])}; 
+		++index; 
+		if(next[0] != '-') 
+		  files.push_back(next);
+		else 
+		  {
+		    optind =  index -1 ; 
+		    break; 
+		  }
+	      }
+	  }
+	  break; 
+	case 'b': 
+	  {
+	    auto &&iss = std::istringstream{optarg}; 
+	    iss >> burnin; 
+	  }
+	  break; 
+	default : 
+	  {
+	    std::cerr << "Error: unknown option >" << char(c) << "<. " << std::endl; 
+	    exitFunction(-1, false); 
+	  }
+	}
+    }
+
+  if(not ( 0<= burnin && burnin < 1.  ) )
+    {
+      std::cerr << "The relative burn-in to be discarded must be in the range [0,1)." << std::endl; 
+      exitFunction(-1, false); 
+    }
+ 
+  if(id.compare("") == 0)
+    {
+      std::cerr << "Please provide a run-id via -n " << std::endl; 
+      exitFunction(-1, false); 
+    }    
+  
+  return std::make_tuple(id, files, burnin);
+}
+
+
+static void myExit(int code, bool waitForAll)
+{
+  exit(code); 
+}
+
+
+
+
+
+int main(int argc, char** argv)
+{
+  exitFunction = myExit; 
+
+  NUM_BRANCHES = 1; // BAD 
+
+  if(argc < 2) 
+    {
+      printUsage(std::cout);
+      exitFunction(-1, false); 
+    }
+
+  auto files = std::vector<std::string>{};
+  double burnin = 0; 
+  auto id = std::string{};
+
+  std::tie(id,files,burnin) = processCommandLine(argc, argv); 
+
+  for(auto f : files)
+    std::cout  << "file: " << f << std::endl; 
+
+  for(auto file : files)
+    {
+      if(not std::ifstream(file))
+	{
+	  std::cerr << "Error: could not open file >" <<  file  << "<" << std::endl; 
+	  exitFunction(-1, false); 
+	}    
+    }
+
+  assert(files.size() >  0); 
+
+  auto&& bipEx = BipartitionExtractor(files, false, true);
+
+  nat numTree = bipEx.getNumTreesInFile( files.at(0) );
+  
+  // std::cout <<  "have "<< numTree << std::endl; 
+  
+  nat absBurnin = nat(double(numTree) * burnin); 
+
+  bipEx.extractBips<true>(absBurnin);
+  bipEx.printBipartitions(id);
+  bipEx.printBipartitionStatistics(id); 
+  bipEx.printFileNames(id);
+  bipEx.printBranchLengths(id);
+
+  return 0; 
+}
diff --git a/src/apps/parser.cpp b/src/apps/parser.cpp
new file mode 100644
index 0000000..f8d609f
--- /dev/null
+++ b/src/apps/parser.cpp
@@ -0,0 +1,138 @@
+#include <fstream>
+#include <stdexcept>
+#include <iostream>
+#include <unistd.h>
+#include <cstring>
+
+#include "AlignmentPLL.hpp"
+
+#include "GlobalVariables.hpp"
+
+static void helpMessage()
+{
+  std::cout << "\nparser produces a binary output file, that can be fed into\n"
+	    << "ExaBayes/Yggdrasil. This is recommendable for large runs with hundreds\n"
+	    << "of processes.\n\n" ; 
+
+  std::cout << "./parser -s alnFile -q modelFile -n outputFile\n"
+	    << "./parser -s alnFile -m {DNA|PROT} -n outputFile\n\n\n" 
+	    << "     -s alnFile             a phylip-style alignment file\n\n"
+	    << "     -q modelFile           a RAxML-style model file\n\n"
+	    << "     -m dataType            specifies a datatype (either DNA or PROT) for a\n"
+	    << "                              single partition. Not needed, when a\n"
+	    << "                              model file is given.\n\n"
+	    << "     -n outputfile          name of the output file\n\n"
+	    << std::endl; 
+}
+
+static void myExit(int code, bool waitForAll)
+{
+  exit(code); 
+}
+
+
+int main(int argc, char **argv)
+{
+  exitFunction = myExit; 
+
+  if(argc < 2)
+    {
+      helpMessage(); 
+      exitFunction(-1, false); 
+    }
+  
+  auto alignmentFile = std::string(""); 
+  auto modelFile = std::string(""); 
+  auto singlePartitionModel = std::string(""); 
+  auto outputFileName = std::string(""); 
+  
+  int c = 0 ; 
+  while(  ( c  = getopt( argc, argv, "s:q:m:n:h") )  != EOF ) 
+    {
+      try
+	{
+	  switch(c)
+	    {
+	    case 's': 
+	      alignmentFile = std::string(optarg); 
+	      break; 
+	    case 'q': 
+	      modelFile = std::string(optarg); 
+	      break; 
+	    case 'm':
+	      singlePartitionModel = std::string(optarg); 
+	      break; 
+            case 'h': 
+              helpMessage(); 
+              exitFunction(0, false); 
+              break; 
+	    case 'n': 
+	      outputFileName = std::string(optarg); 
+	      break; 
+	    default:
+	      {
+		std::cerr << "Encountered unknown command line option " <<  c 
+			  << "\n\nFor an overview of program options, please use -h" << std::endl ; 
+		exitFunction(-1, false); 
+	      }
+	    }
+	}
+      catch(const std::invalid_argument& ia )
+	{
+	  std::cerr << "Invalid argument >" << optarg << "< to option >" << reinterpret_cast<char*>(&c) << "<" << std::endl; 
+	  exitFunction(-1, false); 
+	}
+    }
+
+  // some validation
+  if(outputFileName.compare("") == 0 )
+    {
+      std::cout << "Please specify an output file name via -n." << std::endl; 
+      exitFunction(-1, false); 
+    }
+
+  if(outputFileName.compare("") != 0 && std::ifstream(outputFileName + ".binary"))
+    {
+      std::cout << "Error: output file "  <<  outputFileName  << ".binary already exists." << std::endl; 
+      exitFunction(-1, false); 
+    }
+
+  if(modelFile.compare("") == 0 && singlePartitionModel.compare("") == 0)
+    {
+      std::cout << "Please specify either a model file via -q or a data type for a single\n"
+		<< "partition (either DNA or PROT) via -m." << std::endl; 
+      exitFunction(-1, false); 
+    }
+
+  if(modelFile.compare("") != 0 && not std::ifstream{modelFile})
+    {
+      std::cout << "Error: model file provided, but could not open model file >"  << modelFile << "<" << std::endl; 
+      exitFunction(-1, false); 
+    }
+
+  
+  if(not std::ifstream{alignmentFile})
+    {
+      std::cout << "Error: could not open alignment file >" << alignmentFile << "<" << std::endl; 
+      exitFunction(-1, false); 
+    }
+
+  
+  bool useSinglePartition =  modelFile.compare("") == 0; 
+
+  auto format = AlignmentPLL::guessFormat(alignmentFile);
+  auto &&phyAln = AlignmentPLL{} ; 
+  phyAln.initAln(alignmentFile, format);
+
+  if(useSinglePartition)
+    phyAln.createDummyPartition(getTypeFromString(singlePartitionModel)); 
+  else 
+    phyAln.initPartitions(modelFile); 
+
+  phyAln.writeToFile(outputFileName + ".binary"); 
+
+  std::cout << "wrote binary alignment file to " << outputFileName << ".binary" << std::endl; 
+  
+  return 0 ;
+}
+
diff --git a/src/apps/postProcParam.cpp b/src/apps/postProcParam.cpp
new file mode 100644
index 0000000..9b5b47e
--- /dev/null
+++ b/src/apps/postProcParam.cpp
@@ -0,0 +1,369 @@
+#include <iostream> 
+#include <algorithm>
+#include <cassert>
+#include <cstring>
+#include <vector>
+#include <string>
+#include <unistd.h>
+#include <unordered_map> 
+#include <fstream>
+#include <algorithm>
+#include <sstream>
+#include <iomanip>
+#include <cmath>
+#include <tuple>
+
+#define _INCLUDE_DEFINITIONS
+#include "GlobalVariables.hpp"
+#undef _INCLUDE_DEFINITIONS
+
+#include "Arithmetics.hpp"
+#include "common.h"
+
+
+static bool isAAMod(const std::string& input )
+{
+  auto substr = input.substr(0,7) ; 
+  return substr.compare("aaModel")  == 0 ; 
+}
+
+
+class Values
+{
+public: 
+  Values()
+    : _values{}
+    , _models{}
+  {} 
+  size_t size() const {return std::max(_values.size(), _models.size()); }
+
+  std::vector<double> _values; 
+  std::vector<std::string> _models; 
+}; 
+
+
+static std::unordered_map<std::string, Values> readFile(std::string file, double burnin)
+{
+  auto result = std::unordered_map<std::string, Values>{}; 
+  auto&& fh = std::ifstream(file); 
+
+  auto line = std::string{}; 
+  getline(fh, line);
+
+  auto headers = std::vector<std::string>{} ; 
+  getline(fh,line); 
+
+  {
+    auto&& istr = std::istringstream(line); 
+    auto elem = std::string{}; 
+    while(getline(istr, elem, '\t'))
+      headers.push_back(elem); 
+  }
+
+  auto values = std::vector<Values>(); 
+
+  for(nat i = 0; i < headers.size(); ++i)
+    values.push_back(Values{}); 
+
+  while(getline(fh, line))
+    {
+      nat ctr = 0; 
+      auto &&istr2 = std::istringstream(line); 
+      auto elem2 = std::string{}; 
+      while(getline(istr2, elem2, '\t'))
+	{
+	  if(isAAMod(headers[ctr]))
+	    {
+	      values.at(ctr)._models.push_back(elem2); 
+	    }
+	  else 
+	    {
+	      auto &&elemHelper = std::istringstream(elem2); 
+	      double value = 0; 
+	      elemHelper >> value; 
+	      values.at(ctr)._values.push_back(value);
+	    }
+	  ++ctr; 
+
+	}
+    }
+
+  for(nat i = 0; i < headers.size() ; ++i)
+    result[headers[i]] = values[i]; 
+
+  nat ctr = 0; 
+  for(auto &elem : result)
+    {
+      auto& vals = std::get<1>(elem); 
+
+      // std::cout << "querying " << headers[ctr] << std::endl; 
+      if(isAAMod(headers[ctr]))
+	{
+	      
+	  vals._models.erase(begin(vals._models), begin(vals._models) + nat(burnin * double(vals._models.size())));
+	}
+      else 
+	vals._values.erase(begin(vals._values), begin(vals._values) + nat(burnin * double(vals._values.size()) ));
+
+      ++ctr ; 
+    } 
+
+  return result; 
+}
+
+
+static void printUsage(std::ostream &out)
+{
+  out << "\npostProcParams is a utility that provides various statistics for sampled parameters.\n\n"; 
+  out << "Usage: ./postProcParams -n id -f file[..] [-b burnin]\n\n"; 
+  out << "    -n id             an id for the output file.\n"  ; 
+  out << "    -b relBurnin      proportion of samples to discard as burn-in (beginning from start of the file). Default: 0.25\n"  ; 
+  out << "    -f file[..]       one or many ExaBayes_parameters* files\n\n" ; 
+}
+
+
+static std::tuple<std::string, std::vector<std::string>, double> processCmdLine(int argc, char **argv)
+{
+  
+  int c = 0; 
+  auto id = std::string {}; 
+  auto files = std::vector<std::string> {}; 
+  auto burnin  = 0.25f; 
+  
+  while( (c  = getopt(argc, argv, "hn:f:b:")) != EOF) 
+    {
+      switch(c)
+	{
+	case 'h': 
+	  {
+	    printUsage(std::cout); 
+	    exitFunction(-1,false); 
+	  }
+	  break; 
+	case 'n': 
+	  {
+	    id = std::string{optarg, optarg + strlen(optarg)}; 
+	  }
+	  break; 
+	case 'f' : 
+	  {
+	    int index  = optind -1; 
+	    while(index < argc)
+	      {
+		auto next = std::string{argv[index]}; 
+		++index; 
+		if(next[0] != '-') 
+		  files.push_back(next);
+		else 
+		  {
+		    optind =  index -1 ; 
+		    break; 
+		  }
+	      }
+	  }
+	  break; 
+	case 'b': 
+	  {
+	    auto &&ss = std::stringstream{optarg}; 
+	    ss >> burnin; 
+	  }
+	  break; 
+	default : 
+	  {
+	    std::cerr << "error: unknown argument "  << optarg << std::endl; 
+	    exitFunction(-1,false); 
+	  }
+	}
+    }
+
+  if(files.size()  == 0)
+    {
+      std::cerr << "Error: please specify one or many files via -f." << std::endl; 
+      exitFunction(-1,false); 
+    }
+  if(id.compare("") == 0)
+    {
+      std::cerr << "Error: please specify a run id via -n. " << std::endl; 
+      exitFunction(-1, false); 
+    }
+
+  if(not ( 0. <= burnin && burnin < 1.)  )
+    {
+      std::cerr << "Error: the relative burn-in parameter must be in the range [0,1)." << std::endl; 
+      exitFunction(-1,false); 
+    }
+
+  return std::make_tuple(id, files, burnin); 
+}
+
+
+static void myExit(int code, bool waitForAll)
+{
+  exit(code); 
+}
+
+
+int main(int argc, char **argv)
+{
+  exitFunction = myExit; 
+
+  if(argc < 2 )
+    {
+      printUsage(std::cout);
+      exitFunction(-1, false); 
+    }  
+
+  auto files = std::vector<std::string>{}; 
+  double burnin = 0; 
+  auto id = std::string{}; 
+  std::tie(id, files, burnin) = processCmdLine(argc, argv);
+
+  // open output file 
+  auto && ss = std::stringstream{};
+  ss <<  PROGRAM_NAME << "_parameterStatistics."  << id  ; 
+  auto outputFileName = ss.str(); 
+  if(std::ifstream(outputFileName))
+    {
+      std::cerr << "Error: output file >" << outputFileName << "< already exists. Please or move." << std::endl; 
+      exitFunction(-1, false); 
+    }
+  
+  auto && out = std::ofstream(outputFileName); 
+  auto headerToValues = std::vector<std::unordered_map<std::string,Values>>{};
+  for(auto &file : files )
+    {
+      std::cout << "reading file " << file  << std::endl; 
+      headerToValues.push_back(readFile(file, burnin));
+    }
+
+  auto headers = std::vector<std::string>{}; 
+  bool haveAA = false;
+  for (auto elem :  headerToValues[0]) 
+    {
+      haveAA |= isAAMod(elem.first); 
+      headers.push_back(elem.first); 
+    }
+
+  auto elemsToIgnore = std::vector<std::string>
+    {
+      "Gen", 
+      // "LnPr",
+      // "LnL"
+    }; 
+  
+
+  nat numCols = 0; 
+  out << "paramName\tmean\tsd\tperc5\tperc25\tmedian\tperc75\tper95\tESS" ;
+  numCols += 9; 
+
+  if(files.size() > 1)
+    {
+      out << "\tpsrf"; 
+      ++numCols; 
+    }
+
+  if(haveAA)
+    {
+      out << "\tdiscreteDistribution"; 
+      ++numCols; 
+    }
+
+  out << std::endl; 
+  
+  
+  for(auto header : headers)
+    {
+      bool isAA = isAAMod(header); 
+
+      bool isGood = true; 
+      for(auto elem : elemsToIgnore)
+	isGood &= elem.compare(header) != 0 ; 
+      if(not isGood)
+	continue;  
+      
+      auto valuesConcat = Values{}; 
+      auto relevant = std::vector<Values>{}; 
+      for(auto headerToSomeValues : headerToValues)
+	{
+	  relevant.push_back(headerToSomeValues[header]); 
+	  auto someVals = headerToSomeValues[header]; 
+
+	  if(isAA)
+	    {
+	      valuesConcat._models.reserve(valuesConcat.size() + someVals.size()); 
+	      valuesConcat._models.insert(end(valuesConcat._models), begin(someVals._models),end(someVals._models));
+	    }
+	  else 
+	    {
+	      valuesConcat._values.reserve(valuesConcat.size() + someVals.size()); 
+	      valuesConcat._values.insert(end(valuesConcat._values), begin(someVals._values),end(someVals._values));
+	    }
+	}
+
+      out << MAX_SCI_PRECISION ; 
+
+      if(isAA)
+	{
+	  out << header; 
+	  for(nat i = 0; i < numCols-1; ++i)
+	    out << "\tNA" ;
+	  
+	  auto frequencyHash = std::unordered_map<std::string, double>{}; 
+	  auto total = double{0}; 
+	  for(auto &v : valuesConcat._models )
+	    {
+	      ++frequencyHash[v]; 
+	      ++total; 
+	    }
+	  
+	  for(auto &elem : frequencyHash)
+	    elem.second /= total; 
+
+	  bool isFirst = true; 
+	  for(auto &elem : frequencyHash)
+	    {
+	      out << MAX_SCI_PRECISION << ( isFirst ? "" : ","  ) << elem.first << ":" << elem.second; 
+	      isFirst = false; 
+	    }
+
+	  out << std::endl; 
+	}
+      else 			// print values 
+	{
+	  auto relVals = std::vector<std::vector<double>>{};
+	  for(auto r : relevant)
+	    relVals.push_back(r._values); 
+      
+	  auto prsf = Arithmetics::PRSF(relVals); 
+          auto sd = std::sqrt(Arithmetics::getVariance(valuesConcat._values));
+	  auto perc95  = Arithmetics::getPercentile(.95, valuesConcat._values);
+	  auto perc5 = Arithmetics::getPercentile(.5, valuesConcat._values); 
+	  auto perc50 = Arithmetics::getPercentile(.50, valuesConcat._values); 
+	  auto perc25 = Arithmetics::getPercentile(.25, valuesConcat._values); 
+	  auto perc75 = Arithmetics::getPercentile(.75, valuesConcat._values); 
+	  auto ess = Arithmetics::getEffectiveSamplingSize(valuesConcat._values); 
+	  auto mean = Arithmetics::getMean(valuesConcat._values); 
+	  out << header
+	      << "\t" << mean
+	      << "\t" << sd
+	      << "\t" << perc5
+	      << "\t" << perc25
+	      << "\t" << perc50
+	      << "\t" << perc75
+	      << "\t" << perc95
+	      << "\t" << ess ; 
+      
+	  if(relevant.size()  > 1)
+	    out << "\t" << prsf; 
+
+	  if(haveAA)
+	    out << "\tNA" ; 
+
+	  out << std::endl; 
+	} 
+    }
+
+  std::cout << "successfully printed statistics to file >" <<  outputFileName << "<" << std::endl; 
+  
+  return 0; 
+}
diff --git a/src/apps/sdsf.cpp b/src/apps/sdsf.cpp
new file mode 100644
index 0000000..42da47e
--- /dev/null
+++ b/src/apps/sdsf.cpp
@@ -0,0 +1,203 @@
+#include <cassert>
+#include <algorithm>
+#include <unistd.h>
+#include <unordered_map>
+#include <limits>
+#include <sstream>
+#include <string>
+#include <vector>
+
+int NUM_BRANCHES; 
+
+#define _INCLUDE_DEFINITIONS
+#include "GlobalVariables.hpp"
+#undef _INCLUDE_DEFINITIONS
+
+#include "common.h"
+#include "extensions.hpp"
+
+#include "SplitFreqAssessor.hpp"
+
+
+static void printUsage()
+{
+  std::cout
+	    << "\nComputes the avgerage and maximum deviation of split frequencies\n"
+	    << "of sets of trees.\n\n"
+	    << "USAGE: ./asdsf [-m] [-b relBurnin | -r start ] [ -i ignoreFreq ]  -f file[..]\n\n"
+	    << "      -i ignoreFreq    ignore splits with frequencies lower than ignoreFreq\n"
+	    << "                       [Range: 0.0 <= ignoreFreq < 1.0; default: 0.1]\n\n"
+	    << "      -f file[..]      two or more topology files\n\n"
+	    << "      -r relBurnin     discard first relBurnin percent of tree samples \n"
+	    << "                       [ 0.0 <= relBurnin < 1.0; default 0.25]\n\n"
+	    << "      -b num           constant burn-in: discard the first <num> samples\n\n"
+	    << "      -q               quiet run: only prints asdsf / msdsf\n"
+	    << "\n\n"
+    ; 
+
+  exit(0); 
+}
+
+
+static void myExit(int code, bool waitForAll)
+{
+  exit(code); 
+}
+
+
+
+int main(int argc, char** argv)
+{
+  exitFunction = myExit; 
+
+// #ifdef _USE_GOOGLE_PROFILER
+//   auto myProfileFile = "profile.out"; 
+//   remove(myProfileFile);
+//   ProfilerStart(myProfileFile);
+// #endif
+
+
+  NUM_BRANCHES = 1; 
+
+  bool constBurninWasSet = false; 
+  bool relBurninWasSet = false; 
+  auto quiet = false;  
+
+  nat constBurnin = 0; 
+  double relBurnin = 0.25; 
+  auto files = std::vector<std::string>{}; 
+  double ignoreFreq = 0.1; 
+
+  int c = 0;   
+  while( ( c = getopt(argc, argv,"r:b:f:i:hq") ) != EOF )
+    {
+      switch(c)
+	{
+	case 'h': 
+	  {
+	    printUsage();
+	  }
+	  break; 
+	case 'i': 
+	  {
+	    auto &&iss = std::stringstream{optarg}; 
+	    iss >> ignoreFreq ; 
+	    assert(ignoreFreq < 1. && 0. <= ignoreFreq); 
+	  }
+	  break; 
+	case 'b':
+	  {
+	    constBurninWasSet  = true; 
+	    auto &&iss = std::stringstream{optarg}; 
+	    iss >> constBurnin ; 
+	  }
+	  break; 
+	case 'f':
+	  {
+	    int index  = optind -1; 
+	    while(index < argc)
+	      {
+		auto next = std::string{argv[index]}; 
+		++index; 
+		if(next[0] != '-') 
+		  files.push_back(next);
+		else 
+		  {
+		    optind =  index -1 ; 
+		    break; 
+		  }
+	      }
+	  }
+	  break; 
+	case 'r': 
+	  {
+	    relBurninWasSet = true ; 
+	    auto &&iss = std::istringstream {optarg}; 
+	    iss >> relBurnin; 
+	  }
+	  break; 
+	case 'q': 
+	  {
+	    quiet = true; 
+	    break; 
+	  }
+	default : 
+	  {
+	    std::cerr << "unknown argument >" << c << "<" << std::endl; 
+	    exitFunction(-1, false); 
+	    }
+	} 
+    }
+  
+  if(argc == 0 || files.size() == 0 )
+    printUsage(); 
+
+  for(auto file : files)
+    {
+      if(not std::ifstream(file)) 
+	{
+	  std::cout << "error: could not open file >" << file << "<" << std::endl; 
+	  exit(-1); 
+	}
+    }
+
+  if(constBurninWasSet && relBurninWasSet)
+    {
+      std::cout << "Error: you cannot set the relative burn-in AND a range of trees to\n"
+		<< "use.\n";
+      exit(-1); 
+    }
+
+  if(relBurninWasSet && not (0. <= relBurnin && relBurnin < 1.) )
+    {
+      std::cout << "Error: please specifify a value (percentage) between (0,1) for the relative burn-in. Your value was "<< relBurnin << std::endl; 
+      exit(-1 ); 
+    }    
+
+  auto sdsf = SplitFreqAssessor(files, true); 
+
+  auto numTrees = std::vector<nat>(files.size(),0);
+  std::transform(begin(files), files.end(), begin(numTrees), [&](const std::string &file)  { return sdsf.getNumTreeAvailable(file); } ); 
+  
+  // determine the range 
+  auto start =  std::vector<nat>(files.size(),0);
+  for(auto i = 0u; i < files.size(); ++i)
+    {
+      if(constBurninWasSet)
+	{
+	  if( numTrees[i] < constBurnin)
+	    {
+	      std::cout << "you are trying to discard " << constBurnin << " trees, but the minimum trees available in one of the files is just " << numTrees[i] << std::endl; 
+	      exit(-1); 
+	    }
+	  
+	  // std::cout << SHOW(constBurnin) << std::endl; 
+
+	  start[i] = constBurnin; 
+	}
+      else 
+	start[i] = nat(double(numTrees[i]) * relBurnin); 
+
+      if(not quiet)
+	std::cout << "using trees number " << start[i] <<  " to "<< numTrees[i] << " for file " << files[i] << std::endl; 
+    }
+
+  sdsf.extractBips( start  , numTrees ); 
+
+  auto sdsfResult = sdsf.computeAsdsfNew(ignoreFreq); 
+
+  if(not quiet)
+    {
+      std::cout << "average deviation of split frequencies: " <<  sdsfResult.first * 100  << "%" << std::endl; 
+      std::cout  << "maximum deviation of split frequencies: " << sdsfResult.second * 100 << "%" << std::endl; 
+      std::cout << "ignored splits that occurred in less than "  << ignoreFreq * 100 << "% of the trees for any of the specified files." << std::endl; 
+    }
+  else 
+    {
+      std::cout << sdsfResult.first * 100  << "\t" << sdsfResult.second * 100 << std::endl; 
+    }
+
+  return 0; 
+}
+
+
diff --git a/src/avxConditional.c b/src/avxConditional.c
new file mode 100644
index 0000000..553ce37
--- /dev/null
+++ b/src/avxConditional.c
@@ -0,0 +1,17 @@
+#include "common.h"
+
+#if USE_AVX
+
+#define  __AVX
+
+#include "lib/pll/avxLikelihood.c"
+
+#else 
+
+
+int avx_prototypeDummy()
+{
+  return 0; 
+}
+
+#endif
diff --git a/src/branches/BranchBackup.cpp b/src/branches/BranchBackup.cpp
new file mode 100644
index 0000000..d3602da
--- /dev/null
+++ b/src/branches/BranchBackup.cpp
@@ -0,0 +1,75 @@
+#include "BranchBackup.hpp"
+
+#include "BranchPlain.hpp"
+#include "BranchLength.hpp"
+
+#include "TreeAln.hpp"
+
+#include <algorithm>
+
+using std::get;
+
+
+
+BranchBackup::BranchBackup(TreeAln &traln, std::vector<BranchPlain> bs, std::vector<AbstractParameter*> params)
+  : _backup{}
+{
+  for(auto &b :bs )
+    {
+      for(auto &p : params)
+	{
+	  extend(traln, p,b); 
+	}
+    }
+} 
+
+
+void BranchBackup::extend(TreeAln &traln, AbstractParameter* param, const BranchLength &length)
+{
+  auto bl = traln.getBranch(length, param); 
+  _backup.push_back(std::make_pair(param, bl));
+  traln.setBranch(length, param);
+}
+
+void BranchBackup::extend(TreeAln &traln, AbstractParameter* param, const BranchPlain &length)
+{
+  auto bl = traln.getBranch(length, param); 
+  _backup.push_back(std::make_pair(param, bl));
+}
+
+void BranchBackup::resetFromBackup(TreeAln& traln) const 
+{
+  for(auto & b: _backup)
+    traln.setBranch(get<1>(b), get<0>(b)); 
+}
+
+// meh 
+std::tuple<bool, BranchLength> BranchBackup::find(const BranchPlain &branch, AbstractParameter *param) const 
+{
+  auto foundIter = std::find_if(begin(_backup), end(_backup), [&](const std::pair<AbstractParameter*, BranchLength> &elem)
+				{
+				  return get<0>(elem) == param && 
+				  (get<1>(elem) == branch || branch.getInverted() == get<1>(elem)); 
+				  // branch.equalsUndirected(get<1>(elem).toPlain()); 
+				}
+				); 
+    
+  if( foundIter == end(_backup ))
+    return std::make_pair(false, BranchLength());
+  else 
+    return std::make_tuple(true, get<1>(*foundIter)); 
+}
+
+
+  
+  
+std::ostream& operator<<(std::ostream& out, const BranchBackup& rhs)
+{
+  for(auto &elem : rhs._backup)
+    {
+      out << "[" << get<0>(elem) << "," << get<1>(elem)  << "],"; 
+    }
+  return out; 
+}
+
+
diff --git a/src/branches/BranchBackup.hpp b/src/branches/BranchBackup.hpp
new file mode 100644
index 0000000..0aee8be
--- /dev/null
+++ b/src/branches/BranchBackup.hpp
@@ -0,0 +1,32 @@
+#ifndef BRANCH_BACKUP_HPP
+#define  BRANCH_BACKUP_HPP
+
+#include "BranchPlain.hpp"
+#include "BranchLength.hpp"
+
+#include <vector>
+
+class AbstractParameter;
+class TreeAln;
+
+class BranchBackup 
+{
+public: 
+  BranchBackup(): _backup{}
+  {}
+  BranchBackup(TreeAln &traln, std::vector<BranchPlain> bs, std::vector<AbstractParameter*> params); 
+
+  void extend(TreeAln &traln, AbstractParameter* param, const BranchLength &length); 
+  void extend(TreeAln &traln, AbstractParameter* param, const BranchPlain &length); 
+  void resetFromBackup(TreeAln& traln) const ; 
+  
+  // meh 
+  std::tuple<bool, BranchLength> find(const BranchPlain &branch, AbstractParameter *param) const ; 
+  friend std::ostream& operator<<(std::ostream& out, const BranchBackup& rhs); 
+
+private: 
+  std::vector<std::pair<AbstractParameter*,BranchLength>> _backup; 
+}; 
+
+
+#endif
diff --git a/src/branches/BranchLengthOptimizer.cpp b/src/branches/BranchLengthOptimizer.cpp
new file mode 100644
index 0000000..66d448f
--- /dev/null
+++ b/src/branches/BranchLengthOptimizer.cpp
@@ -0,0 +1,128 @@
+#include "BranchLengthOptimizer.hpp"
+
+#include "OptimizedParameter.hpp" 
+
+// #include "Branch.hpp" 
+#include "Communicator.hpp"
+
+using std::vector; 
+
+
+BranchLengthOptimizer::BranchLengthOptimizer(TreeAln& traln, const BranchPlain& branch, int maxIter, Communicator &comm, const std::vector<AbstractParameter*> &blParams )
+  :  _comm(comm)
+  , _blParams{}
+  , _optParams{}
+  , _branch(branch)
+  , _origBranches{}
+{
+  for(auto i = 0u; i < blParams.size(); ++i)
+    _optParams.emplace_back(traln, branch, blParams[i], maxIter);
+
+  for(auto &param : blParams)
+    _origBranches.push_back(traln.getBranch(branch,param));
+}
+
+
+bool BranchLengthOptimizer::hasConvergedAll()  const 
+{
+  auto result = true; 
+  for(auto &v : _optParams )
+    result &= v.hasFinished(); 
+  return result; 
+}
+
+
+void BranchLengthOptimizer::applyToTraversalDescriptor(std::vector<bool> &execModel, TreeAln& traln) const 
+{
+  auto &tr = traln.getTrHandle(); 
+  for(auto i = 0u ; i < execModel.size(); ++i )
+    {
+      auto& p = traln.getPartition(i); 
+      tr.td[0].executeModel[i] = (execModel[i] && p.getWidth() > 0 )  ? PLL_TRUE : PLL_FALSE; 
+    }
+
+  for(auto &v : _optParams)
+    v.applyValues(traln.getTrHandle().td[0].parameterValues);
+}
+
+
+void BranchLengthOptimizer::optimizeBranches(TreeAln &traln)  
+{
+  auto tr = &(traln.getTrHandle());
+  auto pr = &(traln.getPartitionsHandle()); 
+
+  bool firstIteration = true;
+
+  auto dlnLdlz = std::vector<double>(traln.getNumberOfPartitions(),0 ); 
+  auto d2lnLdlz2 = std::vector<double>(traln.getNumberOfPartitions(),0 ); 
+
+  bool outerConverged = false; 
+  while(not outerConverged)
+    {
+      auto execModel = std::vector<bool>(traln.getNumberOfPartitions(), false); 
+      for(auto &v : _optParams)
+	{
+	  if(not v.hasFinished() )
+	    {
+	      if(v.isCurvatureOk())
+		v.resetStep();
+	      if(not v.isCurvatureOk())
+		v.changeSide();
+	    }
+	}
+
+      for(auto &v : _optParams)
+	v.applyToMask(execModel);
+
+#ifdef VERBOSE 
+      tout << "executing: "; 
+      for(auto v : execModel)
+      	tout << (v ? 1 : 0) << ","; 
+      tout << std::endl; 
+#endif
+
+      traln.setExecModel(execModel);
+      applyToTraversalDescriptor(execModel, traln); 
+
+      if(firstIteration)
+	{
+	  makenewzIterative(tr, pr);
+	  firstIteration = false;
+	}
+
+      execCore(tr, pr, dlnLdlz.data(), d2lnLdlz2.data());
+
+      dlnLdlz = _comm.get().allReduce(dlnLdlz);
+      d2lnLdlz2 = _comm.get().allReduce(d2lnLdlz2); 
+
+      for(auto &v : _optParams)
+	{
+	  if(not v.hasFinished())
+	    {
+	      v.extractDerivatives(traln, dlnLdlz, d2lnLdlz2);
+	      if( not v.isCurvatureOk() )
+		v.shortenBadBranch();
+	    }
+	}
+
+      for(auto &oParam : _optParams)
+	{
+	  if(not oParam.hasFinished() && oParam.isCurvatureOk()  )
+	    {
+	      oParam.nrStep();
+	      oParam.decrIter(); 
+	      oParam.checkConvergence();
+	    }
+	}
+      
+      outerConverged = hasConvergedAll() ; 
+    }
+
+  // reset stuff 
+  traln.setExecModel( std::vector<bool>(traln.getNumberOfPartitions(), true ) ); 
+  for(auto j = 0u; j < _blParams.size() ; ++j) 
+    traln.setBranch(_origBranches[j], _blParams[j]); 
+}
+
+
+
diff --git a/src/branches/BranchLengthOptimizer.hpp b/src/branches/BranchLengthOptimizer.hpp
new file mode 100644
index 0000000..fa8b321
--- /dev/null
+++ b/src/branches/BranchLengthOptimizer.hpp
@@ -0,0 +1,35 @@
+#ifndef _BRANCH_LENGTH_OPT_HPP 
+#define  _BRANCH_LENGTH_OPT_HPP 
+
+#include <vector> 
+#include <functional>
+
+#include "AbstractParameter.hpp"
+#include "Communicator.hpp"
+
+class TreeAln; 
+
+#include "OptimizedParameter.hpp"
+
+
+class BranchLengthOptimizer
+{
+public: 
+  BranchLengthOptimizer(TreeAln& traln, const BranchPlain& branch, int maxIter, Communicator &comm, const std::vector<AbstractParameter*> &blParams ); 
+  void applyToTraversalDescriptor(std::vector<bool> &execModel, TreeAln& traln) const ; 
+  bool hasConvergedAll()  const ; 
+  /** 
+      @brief this function is essentially makenewzGeneric
+  */ 
+  void  optimizeBranches(TreeAln& traln)  ; 
+  std::vector<OptimizedParameter> getOptimizedParameters() const { return _optParams; } 
+
+private: 
+  std::reference_wrapper<Communicator> _comm; 
+  const std::vector<AbstractParameter*> _blParams; 
+  std::vector<OptimizedParameter> _optParams; 
+  BranchPlain _branch; 
+  std::vector<BranchLength> _origBranches; 
+};  
+
+#endif
diff --git a/src/branches/BranchSetProposer.cpp b/src/branches/BranchSetProposer.cpp
new file mode 100644
index 0000000..c68e804
--- /dev/null
+++ b/src/branches/BranchSetProposer.cpp
@@ -0,0 +1,174 @@
+#include "BranchSetProposer.hpp"
+#include "BranchLengthOptimizer.hpp"
+#include "ParallelSetup.hpp"
+#include "BoundsChecker.hpp"
+#include "LikelihoodEvaluator.hpp"
+#include "BranchBackup.hpp"
+
+#include <map>
+
+#define THRESH 1.e-2
+#define B_MAX_IT 8 
+
+/*
+  branches : order is important! 
+ */ 
+BranchSetProposer::BranchSetProposer(TreeAln &traln, std::vector<BranchPlain> branches, std::vector<AbstractParameter*> params)
+  : _traln{traln}
+  , _branches{branches}
+  , _params{params}
+  , _result{}
+  , _likelihood{log_double::fromAbs(1.)}
+  {
+    reorderToConnectedComponent();
+  }
+
+
+void BranchSetProposer::findJointOptimum(LikelihoodEvaluator& eval, int maxIter, bool computeLikelihood)
+{
+  assert(_branches.size() > 0 ); 
+  
+  // create backup 
+  auto backup = BranchBackup(_traln, _branches, _params); 
+
+  auto &comm = eval.getParallelSetup().getChainComm();
+
+  auto conv = false; 
+  auto ctr = 1; 
+  auto prevBranch = BranchPlain(0,0);
+  while(not conv)
+    {
+      auto branchesConverged = true ;
+
+      for(auto b : _branches)
+ 	{
+	  eval.evaluate(_traln, b, false);
+
+	  auto blo = BranchLengthOptimizer(_traln, b, B_MAX_IT, comm, _params ); 
+	  blo.optimizeBranches(_traln);
+
+	  auto optParams = blo.getOptimizedParameters(); 
+	  for(auto optParam : optParams)
+	    {
+	      auto optBranch = optParam.getOptimizedBranch(); 
+	      auto p = optParam.getParam(); 
+	      auto lenNow = optBranch.toMeanSubstitutions( p->getMeanSubstitutionRate());
+	      auto lenOld = _traln.get().getBranch(b,p).toMeanSubstitutions( p->getMeanSubstitutionRate()); 
+	      // tout << ctr << "\t" << b << "\t" << MAX_SCI_PRECISION << SHOW(lenNow) << SHOW(lenOld) << std::endl; 
+	      
+	      if(not BoundsChecker::checkBranch(optBranch))
+		BoundsChecker::correctBranch(optBranch); 
+
+	      _traln.get().setBranch(optBranch, p); 
+	      
+	      branchesConverged &=   std::fabs( log(lenNow) - log(lenOld) ) < THRESH; 
+	    }
+
+	  _result[b] = optParams;
+	  
+	  prevBranch = b; 
+	}
+
+      conv = _branches.size() == 1 ||  ( ctr == maxIter ) ||  branchesConverged; 
+      ++ctr ; 
+    }
+
+  if(computeLikelihood)
+    {
+      eval.evaluate(_traln, _branches.back(), false);
+      _likelihood = _traln.get().getLikelihood(); 
+    }
+
+  backup.resetFromBackup(_traln);
+} 
+
+
+using std::get; 
+
+/** 
+    @brief reorders the branches, s.t. they form a connected
+    component.
+ */ 
+void BranchSetProposer::reorderToConnectedComponent()
+{
+  auto node2branch = std::multimap<nat, BranchPlain>{}; 
+  for(auto b : _branches)
+    {
+      node2branch.insert(std::make_pair(b.getPrimNode(), b)); 
+      node2branch.insert(std::make_pair(b.getSecNode(),  b)); 
+    }
+  
+  auto isOuter = [&](const BranchPlain &b)
+    {
+      return node2branch.count(b.getPrimNode() )==  1
+      || node2branch.count(b.getSecNode() )==  1; 
+    }; 
+
+  auto getNeighbors = [&](const BranchPlain&b ) ->std::vector<BranchPlain>
+    {
+      auto result = std::vector<BranchPlain>{}; 
+      
+      auto res1 = node2branch.equal_range(b.getPrimNode()); 
+      auto res2 = node2branch.equal_range(b.getSecNode()); 
+      
+      for(auto iter = res1.first ; iter != res1.second; ++iter)
+	{
+
+   // ->second.equalsUndirected(b)
+	  if(not (iter->second == b || b.getInverted() == iter->second) )
+	    result.push_back( iter->second);
+	}
+      
+      for(auto iter = res2.first; iter != res2.second; ++iter)
+	{
+	  // if(not (iter->second.equalsUndirected(b))
+	  if(not (iter->second == b || iter->second == b.getInverted()))
+	    result.push_back(iter->second); 
+	}
+
+      return result; 
+    }; 
+
+  auto cur = std::find_if(begin(_branches), end(_branches), 
+			    [&](const BranchPlain &b)  -> bool 
+			    {
+			      if(isOuter(b))
+				{
+				  auto neighbors = getNeighbors(b); 
+				  auto numNeighborOuter = std::count_if(begin(neighbors),end(neighbors), [&](const BranchPlain& bb){ return isOuter(bb) ;  }) ; 
+				  assert(0 <= numNeighborOuter ); 
+				  
+				  return neighbors.size() <= 1 || numNeighborOuter == 1 ; 
+				}
+			      else 
+				return false; 
+			    } ) ; 
+
+
+  assert(cur != end(_branches) || _branches.size() == 0 ); 
+
+  auto neigh =std::unordered_set<BranchPlain>{  }; 
+  if(_branches.size ()  != 0 )
+    neigh.insert( *cur); 
+  auto result = std::vector<BranchPlain>{}; 
+  
+  auto seen = std::unordered_set<BranchPlain>();
+  while(result.size() < _branches.size() )
+    {
+      auto newNeigh = std::unordered_set<BranchPlain>{}; 
+      for(auto n : neigh)
+	{
+	  if(seen.find(n) == end(seen))
+	    {
+	      result.push_back(n);
+	      seen.insert(n); 
+	      
+	      auto moreNeigh = getNeighbors(n);
+	      newNeigh.insert(begin(moreNeigh), end(moreNeigh)); 
+	    }
+	}
+      neigh = newNeigh; 
+    }
+  
+  _branches = result; 
+}
diff --git a/src/branches/BranchSetProposer.hpp b/src/branches/BranchSetProposer.hpp
new file mode 100644
index 0000000..7beed7c
--- /dev/null
+++ b/src/branches/BranchSetProposer.hpp
@@ -0,0 +1,32 @@
+#ifndef BRANCH_SET_PROPOSER_HPP
+#define BRANCH_SET_PROPOSER_HPP
+
+#include <unordered_map>
+
+#include "OptimizedParameter.hpp" 
+
+class LikelihoodEvaluator; 
+
+
+class BranchSetProposer
+{
+public: 
+  ~BranchSetProposer(){}
+  BranchSetProposer(TreeAln &traln, std::vector<BranchPlain> branches, std::vector<AbstractParameter*> params); 
+  void findJointOptimum(LikelihoodEvaluator& eval, int maxIter, bool computeLikelihood); 
+  std::unordered_map<BranchPlain, std::vector<OptimizedParameter> > getResult() const {return _result; }
+  log_double getOptimalLikelihood() const {return _likelihood; }
+
+private: 
+  void reorderToConnectedComponent(); 
+
+private: 
+
+  std::reference_wrapper<TreeAln> _traln; 
+  std::vector<BranchPlain> _branches; 
+  const std::vector<AbstractParameter*> _params; 
+  std::unordered_map<BranchPlain, std::vector<OptimizedParameter> > _result; 
+  log_double _likelihood; 
+}; 
+
+#endif
diff --git a/src/branches/ComplexTuner.cpp b/src/branches/ComplexTuner.cpp
new file mode 100644
index 0000000..e383a69
--- /dev/null
+++ b/src/branches/ComplexTuner.cpp
@@ -0,0 +1,65 @@
+#include "ComplexTuner.hpp"
+#include <cmath>
+#include "GlobalVariables.hpp"
+
+
+double ComplexTuner::tuneParameter(int batch, double parameter, bool increase ) const 
+{
+  auto delta = 1. / (sqrt(   (batch + 1))); 
+
+  if(delta > _maxDelta )
+    delta = _maxDelta; 
+
+  double val = _logScale ? log(parameter) : parameter; 
+  if(increase)
+    val += delta;
+  else 
+    val -= delta; 
+  
+  if(_logScale)
+    val = exp(val); 
+
+  val = fmax(_minBound, val); 
+  val = fmin(_maxBound, val); 
+
+  return val; 
+} 
+
+void ComplexTuner::tune() 
+{
+  auto curRatio = _sctr.getRatioInLastInterval();
+  auto batch = _sctr.getBatch();
+
+  if( curRatio < _prevSuccess )	
+    _tuneUp = not _tuneUp; 
+  _prevSuccess = curRatio; 
+
+  auto newParam = tuneParameter(batch, _parameter, _tuneUp);
+
+  _parameter = newParam; 
+  _sctr.nextBatch();
+}  
+
+
+void ComplexTuner::deserialize( std::istream &in )   
+{
+  _parameter = cRead<decltype(_parameter)>(in); 
+  _sctr.deserialize(in); 
+  
+  int tmp = cRead<int>(in); 
+  _tuneUp = tmp != 0 ; 
+
+  _prevSuccess = cRead<decltype(_prevSuccess)>(in); 
+}
+
+ 
+void ComplexTuner::serialize( std::ostream &out) const
+{
+  cWrite(out, _parameter); 
+  _sctr.serialize(out);
+  
+  int tmp = _tuneUp ? 1 : 0 ; 
+  cWrite(out, tmp); 
+
+  cWrite(out, _prevSuccess); 
+}  
diff --git a/src/branches/ComplexTuner.hpp b/src/branches/ComplexTuner.hpp
new file mode 100644
index 0000000..a9a0d20
--- /dev/null
+++ b/src/branches/ComplexTuner.hpp
@@ -0,0 +1,64 @@
+#ifndef _COMPLEX_TUNER_HPP
+#define _COMPLEX_TUNER_HPP
+
+
+#include "SuccessCounter.hpp"
+#include "Serializable.hpp"
+
+
+/**
+   This is a style of tuning that is necessary for tuning the branch
+   length distribution proposal.
+   
+ */ 
+
+
+
+class ComplexTuner   : public Serializable
+{
+
+public: 			// INHERITED 
+  virtual void deserialize( std::istream &in )   ; 
+  virtual void serialize( std::ostream &out) const;   
+
+public: 
+  ComplexTuner(double parameter, double minBound, double maxBound, double maxDelta, bool logScale )
+    : _parameter{parameter}
+    , _sctr{}
+    , _tuneUp{true}
+    , _prevSuccess{0.}
+    , _minBound{minBound}
+    , _maxBound{maxBound}
+    , _maxDelta{maxDelta}
+    , _logScale{logScale}
+  {
+  } 
+  
+  void accept(){ _sctr.accept(); }
+  void reject(){ _sctr.reject(); }
+  double getRecentlySeen() const { return _sctr.getRecentlySeen(); }
+
+  double tuneParameter(int batch, double parameter, bool increase ) const ; 
+
+  void tune()  ; 
+
+  void setParameter(double p)  { _parameter = p; }
+  double getParameter() const { return _parameter; }
+  double getRatio() const { return _sctr.getRatioInLastInterval(); }
+
+private: 
+  double _parameter; 
+  SuccessCounter _sctr; 
+  bool _tuneUp; 
+  double _prevSuccess; 
+
+  double _minBound; 
+  double _maxBound; 
+  
+  double _maxDelta; 		// upper bound by how much we tune in one step   
+  
+  bool  _logScale; 
+}; 
+
+
+#endif
diff --git a/src/branches/DistributionProposer.hpp b/src/branches/DistributionProposer.hpp
new file mode 100644
index 0000000..9651cbf
--- /dev/null
+++ b/src/branches/DistributionProposer.hpp
@@ -0,0 +1,62 @@
+#ifndef _DISTRIBUTION_PROPOSER_HPP
+#define _DISTRIBUTION_PROPOSER_HPP
+
+/** 
+    @brief a CRTP wrapper for proposal distributions (template only)
+*/ 
+    
+
+#include <string>
+
+#include "extensions.hpp"
+
+#include "Randomness.hpp"
+#include "BoundsChecker.hpp"
+
+template<class T>
+class DistributionProposer
+{
+public: 
+  DistributionProposer(double nrOpt = 0, double nrD1 = 0 , double nrD2 = 0, double convParameter = 0 , double nonConvParameter = 0 )  
+    : _dist{nrOpt, nrD1, nrD2, convParameter, nonConvParameter} 
+  {
+  }
+
+
+  static std::string getName()
+  {
+    return T::getName();
+  }
+
+  bool isConverged() const 
+  {
+    return _dist.isConverged();
+  }
+
+
+  BranchLength proposeBranch(BranchPlain b, TreeAln& traln, AbstractParameter* param, Randomness& rand) const  
+  {
+    auto branch = _dist.proposeBranch(b,traln, param, rand ); 
+    if(not BoundsChecker::checkBranch(branch))
+      BoundsChecker::correctBranch(branch); 
+    return branch; 
+  }
+ 
+  log_double getLogProbability(double val) const 
+  {
+    return _dist.getLogProbability(val);
+  } 
+
+  friend auto operator<<(std::ostream& out, const DistributionProposer &rhs)
+    -> std::ostream&
+  {
+    out << rhs._dist; 
+    return out; 
+  }
+
+private: 
+  T _dist; 
+};
+
+
+#endif
diff --git a/src/branches/GammaProposer.cpp b/src/branches/GammaProposer.cpp
new file mode 100644
index 0000000..c42f384
--- /dev/null
+++ b/src/branches/GammaProposer.cpp
@@ -0,0 +1,73 @@
+#include "GammaProposer.hpp"
+
+#include "BoundsChecker.hpp"
+#include <cmath>
+#include <cassert>
+
+#include "TreeAln.hpp"
+#include "AbstractParameter.hpp"
+#include "Randomness.hpp"
+
+GammaProposer::GammaProposer(double nrOpt, double nrd1, double nrd2, double convParameter, double nonConvParameter)
+  : _nrOpt{ nrOpt }
+  , _nrD1{ nrd1 }
+  , _nrD2{ nrd2 }
+  , _alpha{0}
+  , _beta{0}
+  , _convParameter{convParameter}
+  , _nonConvParameter{nonConvParameter}
+{
+  bool hasConverged = (_nrD2 < 0) ; 
+  
+  if(not hasConverged)
+    {
+      _alpha = 1; 
+      _beta = _nonConvParameter *  _nrD1; 
+    }
+  else 
+    {
+      auto estB = getEnvironmentVariable("EST_B"); 
+      auto estC = getEnvironmentVariable("EST_C"); 
+
+      assert(   (estB.compare("") == 0  ) ==  (estC.compare("") == 0 )   ); 
+
+      double fit_b; 
+      double fit_c; 
+
+      if( estB.compare("") != 0 )
+	{
+	  fit_b = strtod(estB.c_str(), NULL); 
+	  fit_c = strtod(estC.c_str(), NULL); 
+	}
+      else 
+	{
+	  fit_b = _convParameter; 
+	  fit_c = -0.473 ; 
+	}
+    
+      double c = fit_b *  pow( fabs(_nrD2),   2 * fit_c); 
+      _beta = ( _nrOpt + sqrt( _nrOpt * _nrOpt + 4. * c)) / (2 * c); 
+      _alpha = _nrOpt  * _beta + 1 ; 
+    }
+}
+
+
+BranchLength GammaProposer::proposeBranch(BranchPlain b, TreeAln& traln, AbstractParameter* param, Randomness& rand) const 
+{
+  auto proposedVal = rand.drawRandGamma(_alpha, _beta); 
+
+  auto bl = BranchLength(b, InternalBranchLength::fromAbsolute(proposedVal, param->getMeanSubstitutionRate())); 
+  
+  // we will not propose a branch outside the bounds 
+  if(not BoundsChecker::checkBranch(bl) )
+    BoundsChecker::correctBranch(bl); 
+    
+  return bl; 
+}
+
+
+
+log_double GammaProposer::getLogProbability(double absVal) const
+{
+  return Density::lnGamma(absVal, _alpha, _beta);
+} 
diff --git a/src/branches/GammaProposer.hpp b/src/branches/GammaProposer.hpp
new file mode 100644
index 0000000..44713ab
--- /dev/null
+++ b/src/branches/GammaProposer.hpp
@@ -0,0 +1,46 @@
+#ifndef _GAMMA_PROPOSER_HPP
+#define _GAMMA_PROPOSER_HPP
+
+// #include "Branch.hpp"
+#include "BranchLength.hpp"
+#include "extensions.hpp"
+
+class AbstractParameter; 
+class Randomness; 
+class TreeAln; 
+
+class GammaProposer
+{
+public: 
+  GammaProposer(double nrOpt, double nrd1, double nrd2, double convParameter, double nonConvParameter); 
+  GammaProposer(const GammaProposer &rhs) = default; 
+  BranchLength proposeBranch(BranchPlain b, TreeAln& traln, AbstractParameter* param, Randomness& rand) const ; 
+  log_double getLogProbability(double val) const;
+
+  bool isConverged() const {return _nrD2 < 0  && _nrD1 < 1 ; }
+
+  static std::string getName()
+  {
+    return std::string( "Gamma") ; 
+  }
+
+  friend std::ostream& operator<<(std::ostream& out, const GammaProposer &rhs)
+  {
+    out << SHOW(rhs._nrOpt) << SHOW(rhs._nrD1) << SHOW(rhs._nrD2) << SHOW(rhs._alpha) << SHOW(rhs._beta); 
+    return out; 
+  }
+
+private: 			// ATTRIBUTES
+  double _nrOpt; 		// branch length optimum 
+  double _nrD1; 		// first derivative 
+  double _nrD2; 		// second derivative
+  
+  double _alpha; 		
+  double _beta; 
+
+  double _convParameter; 
+  double _nonConvParameter; 
+}; 
+
+
+#endif
diff --git a/src/branches/OptimizedParameter.cpp b/src/branches/OptimizedParameter.cpp
new file mode 100644
index 0000000..3b12ba1
--- /dev/null
+++ b/src/branches/OptimizedParameter.cpp
@@ -0,0 +1,187 @@
+#include "OptimizedParameter.hpp"
+#include "AbstractParameter.hpp"
+
+#include "TreeAln.hpp"
+
+const double OptimizedParameter::zMin = PLL_ZMIN; 
+const double OptimizedParameter::zMax = PLL_ZMAX; 
+
+
+OptimizedParameter::OptimizedParameter( TreeAln& traln, const BranchPlain& branch, AbstractParameter* param, int maxIter)
+  : _zPrev{ std::numeric_limits<double>::max() }  
+  , _zCur{traln.getBranch(branch,param).getLength().getValue()}
+  , _zStep{(1.0 - zMax) * _zCur + zMin }   
+  , _coreLZ{0}			// okay???
+  , _nrD1{0}
+  , _nrD2{0}
+  , _iters{maxIter}
+  , _curvatOK{true}
+  , _param{param}
+  , _hasConverged(false)
+  , _branch{branch}
+{
+}
+
+
+void OptimizedParameter::applyToMask (std::vector<bool> &mask)  const
+{
+  if(not _curvatOK)
+    {
+      for(auto &partition : _param->getPartitions())
+	mask[partition] = true; 
+    }
+} 
+
+
+void OptimizedParameter::extractDerivatives( TreeAln &traln, std::vector<double> &dlnLdlz, std::vector<double> &d2lnLdlz2)
+{
+  _nrD1 = 0; 
+  _nrD2 = 0; 
+
+  for(auto p : _param->getPartitions())
+    {
+      _nrD1 += dlnLdlz[p]; 
+      _nrD2 += d2lnLdlz2[p]; 
+    }
+
+  _nrD1 += _param->getPrior()->getFirstDerivative( *_param ); 
+}
+
+
+void OptimizedParameter::shortenBadBranch()
+{
+  if ((_nrD2 >= 0.0) && (_zCur < zMax))
+    {
+      _zPrev = _zCur = 0.37 * _zCur + 0.63;  /*  Bad curvature, shorten branch */
+#ifdef VERBOSE
+      tout << this << " shortening branch" << std::endl; 
+#endif
+    }
+  else
+    {
+#ifdef VERBOSE
+      tout << this  << " curv okay now" << std::endl; 
+#endif
+      _curvatOK = true;
+    }
+}
+
+
+bool OptimizedParameter::hasConvergedNew() const 
+{
+  return _hasConverged; 
+}
+
+
+bool OptimizedParameter::hasFinished() const 
+{
+  return hasConvergedNew() || (_iters <= 0) ; 
+}
+
+
+void OptimizedParameter::nrStep()
+{
+  if (_nrD2 < 0.0)
+    {
+      double tantmp = - _nrD1 /  _nrD2;
+      if (tantmp < 100)
+	{
+	  _zCur *= std::exp(tantmp);
+	  if (_zCur < zMin)
+	    _zCur = zMin;
+
+	  if (_zCur > 0.25 * _zPrev + 0.75)
+	    _zCur = 0.25 * _zPrev + 0.75;
+	}
+      else
+	_zCur = 0.25 * _zPrev + 0.75;
+
+#ifdef VERBOSE
+      tout << this << " step: " << _zCur << std::endl; 
+#endif
+    }
+
+  if (_zCur > zMax) 
+    {
+      _zCur = zMax;
+#ifdef VERBOSE
+      tout  << this << "setting to max" << std::endl; 
+#endif
+    }
+} 
+
+
+void OptimizedParameter::resetStep()
+{
+  _curvatOK = false; 
+  _zPrev = _zCur;
+  _zStep = (1.0 - zMax) * _zCur + zMin;
+#ifdef VERBOSE
+  tout << this << "set step to "<< _zStep << std::endl; 
+#endif
+}
+
+
+void OptimizedParameter::changeSide()
+{
+  if (_zCur < zMin) 
+    _zCur = zMin; 
+  else if (_zCur > zMax) 
+    _zCur = zMax;
+  _coreLZ = log(_zCur); 
+#ifdef VERBOSE
+  tout << this << " changed side" <<  SHOW(_zCur) <<  std::endl; 
+#endif
+}
+
+
+void OptimizedParameter::applyValues(double *values) const 
+{
+  for( auto &partition : _param->getPartitions() )
+    values[partition] = _coreLZ; 
+} 
+
+
+void OptimizedParameter::checkConvergence()  
+{
+  _hasConverged = (fabs(_zCur - _zPrev)  <= _zStep) || ( _iters <= 0 ); 
+#ifdef VERBOSE
+  if(_hasConverged)
+    tout << this << " has converged" << std::endl; 
+#endif
+}
+
+
+
+void OptimizedParameter::setToTypicalBranch(double typicalAbsLen, TreeAln& traln ) 
+{
+#if 0   
+  auto b = BranchLength(0,0);
+  b.setConvertedInternalLength(traln, _param, typicalAbsLen);
+
+  if(BoundsChecker::checkBranch(b))
+    BoundsChecker::correctBranch(b); 
+
+  _zCur = b.getLength();
+#else 
+  _zCur = 0.9; 
+#endif
+}
+
+
+BranchLength OptimizedParameter::getOptimizedBranch() const 
+{
+  // auto result = _branch.toBlDummy();
+  // result.setLength(_zCur);
+
+  auto result = BranchLength(_branch, InternalBranchLength(_zCur)); 
+
+  if(not BoundsChecker::checkBranch(result))
+    BoundsChecker::correctBranch(result); 
+
+  // tout << "optimized branch: " << _zCur << std::endl; 
+  return result; 
+}  
+
+
+
diff --git a/src/branches/OptimizedParameter.hpp b/src/branches/OptimizedParameter.hpp
new file mode 100644
index 0000000..e1942e7
--- /dev/null
+++ b/src/branches/OptimizedParameter.hpp
@@ -0,0 +1,109 @@
+#ifndef _OPTIMIZED_PARAMETER_HPP
+#define _OPTIMIZED_PARAMETER_HPP
+
+
+class TreeAln; 
+
+#include "AbstractParameter.hpp"
+
+// #include "Branch.hpp"
+#include "BranchPlain.hpp"
+#include "DistributionProposer.hpp"
+
+
+
+class OptimizedParameter
+{
+public: 
+  OptimizedParameter( TreeAln& traln, const BranchPlain& branch, AbstractParameter* param, int maxIter ); 
+  OptimizedParameter(const OptimizedParameter& rhs) = default; 
+  OptimizedParameter& operator=(const OptimizedParameter &rhs) = default; 
+
+  template<class T> 
+  auto getProposerDistribution(TreeAln &traln, double convParameter, double nonConvParameter) const 
+    -> DistributionProposer<T> ; 
+
+  void applyToMask (std::vector<bool> &mask)  const; 
+  void applyValues(double *values) const ; 
+
+  BranchLength getOptimizedBranch() const ;  
+
+  AbstractParameter* getParam() const {return _param; }
+
+  bool isCurvatureOk() const {return _curvatOK; }
+
+  bool hasConvergedNew() const ; 
+  bool hasFinished() const ; 
+
+  void resetStep(); 
+  void changeSide(); 
+
+  void decrIter() {--_iters; }
+
+  void shortenBadBranch(); 
+  void nrStep(); 
+
+  void setToTypicalBranch(double typicalAbsLen, TreeAln& traln ); 
+
+  void extractDerivatives( TreeAln &traln, std::vector<double> &dlnLdlz, std::vector<double> &d2lnLdlz2); 
+
+  /** @brief check if we ar done for partition i or if we need to
+      adapt the branch length again */
+  void doInitStep(); 
+
+  static const double zMin ; 
+  static const double zMax; 
+
+  double getFirstDerivative() const {return _nrD1; }
+  double getSecondDerivative() const {return _nrD2; }
+  double getOptimum() const {return _zCur;  }
+
+  void checkConvergence() ; 
+
+  BranchPlain getBranch() const 
+  {
+    return _branch; 
+  }
+
+  
+  friend std::ostream& operator<<(std::ostream& out, const OptimizedParameter& rhs)
+  {
+    out << rhs.getOptimum() << "," << rhs.getFirstDerivative() << ","  << rhs.getSecondDerivative() ; 
+    return out ; 
+  }
+
+private: 
+  double _zPrev; 
+  double _zCur; 
+  double _zStep; 
+  double _coreLZ; 
+
+  double _nrD1; 
+  double _nrD2; 
+  
+  int _iters; 
+  
+  bool _curvatOK; 
+  AbstractParameter* _param; 
+
+  bool _hasConverged; 
+  BranchPlain _branch; 
+}; 
+
+
+template<class T> 
+DistributionProposer<T> 
+OptimizedParameter::getProposerDistribution(TreeAln &traln, double convParameter, double nonConvParameter) const   
+{
+  // tout << "init with factor "  << factor << std::endl; 
+  auto bl =  BranchLength(BranchPlain(1,2));
+  bl.setLength(_zCur); 
+  auto realLen = bl.toMeanSubstitutions( _param->getMeanSubstitutionRate());
+  return DistributionProposer<T>(realLen, _nrD1, _nrD2, convParameter, nonConvParameter ); 
+}
+
+
+
+#endif
+
+
diff --git a/src/branches/README.txt b/src/branches/README.txt
new file mode 100644
index 0000000..875bd54
--- /dev/null
+++ b/src/branches/README.txt
@@ -0,0 +1,2 @@
+various source files that relate to the development of the gamma
+distribution proposal
diff --git a/src/branches/TreeTraverser.cpp b/src/branches/TreeTraverser.cpp
new file mode 100644
index 0000000..b58482c
--- /dev/null
+++ b/src/branches/TreeTraverser.cpp
@@ -0,0 +1,130 @@
+#include "TreeTraverser.hpp"
+
+#define MAX_OPT_ITER 8 
+
+#include "BranchBackup.hpp"
+
+
+InsertionResult EvalPlain::getResult (LikelihoodEvaluator &eval, TreeAln &traln, const BranchPlain& insertBranch, const BranchPlain& prunedSubtree, const BranchPlain & draggedBranch, const std::vector<AbstractParameter*> &params) const 
+{
+  eval.evaluate(traln, prunedSubtree, false);
+  auto result = InsertionResult (insertBranch, traln.getLikelihood()  , {}  ); 
+  return result; 
+}
+
+
+InsertionResult EvalOptDragged::getResult (LikelihoodEvaluator &eval, TreeAln &traln, const BranchPlain& insertBranch, const BranchPlain& prunedSubtree, const BranchPlain & draggedBranch, const std::vector<AbstractParameter*> &params) const 
+{
+#ifdef PRINT_LIKESPR_INFO 
+  eval.evaluate(traln, draggedBranch, false);
+  // tout << "init-lnl="  << traln.getLikelihood() << std::endl; 
+  auto initLnl = traln.getLikelihood() ; 
+#else 
+  eval.evaluate(traln, draggedBranch, false);
+  // eval.evaluateSubtrees(traln, draggedBranch, false);
+#endif
+
+  auto blo = BranchLengthOptimizer(traln, draggedBranch, MAX_OPT_ITER, eval.getParallelSetup().getChainComm(), params);
+  blo.optimizeBranches(traln);
+  auto optParams = blo.getOptimizedParameters();
+
+  auto backup = BranchBackup{};
+  for(auto &optParam : optParams)
+    {
+      auto b = optParam.getOptimizedBranch(); 
+      auto p = optParam.getParam();
+      // tout << "optimized: " << b.toPlain() << " => " <<  MAX_SCI_PRECISION << b.getInterpretedLength(traln, p) <<  std::endl; 
+      backup.extend(traln, p,b); 
+    }
+
+  eval.evaluate(traln, draggedBranch, false);
+  auto lnl = traln.getLikelihood(); 
+
+  backup.resetFromBackup(traln); 
+
+#ifdef PRINT_LIKESPR_INFO
+  tout << SOME_FIXED_PRECISION << "INSERT " << insertBranch << "\t" << SHOW(initLnl) << "\tnow=" << traln.getLikelihood()<< "\tdiff=" << traln.getLikelihood() / initLnl << MAX_SCI_PRECISION  << " with " << optParams[0].getOptimizedBranch().getInterpretedLength(traln,optParams[0].getParam()) <<" " << optParams[0].getOptimizedBranch().getLength() << std::endl ; 
+#endif
+
+  return InsertionResult{insertBranch, lnl , optParams} ; 
+}
+
+
+InsertionResult EvalOptThree::getResult (LikelihoodEvaluator &eval, TreeAln &traln, const BranchPlain& insertBranch, const BranchPlain& prunedSubtree, const BranchPlain & draggedBranch, const std::vector<AbstractParameter*> &params) const 
+{
+  // tout << SHOW(prunedSubtree) << SHOW(insertBranch) << std::endl; 
+  auto branches = std::vector<BranchPlain>{ prunedSubtree, draggedBranch, traln.getThirdBranch(prunedSubtree, draggedBranch ) }; 
+  
+  bool converged = false; 
+  nat ctr = 0; 
+  
+  auto allOparams = std::vector<OptimizedParameter>{}; 
+
+  // backup 
+  auto backup = BranchBackup{}; 
+  for(auto &v :branches)
+    for(auto param : params)
+      backup.extend(traln, param,v);
+
+
+
+#ifdef PRINT_LIKESPR_INFO 
+  eval.evaluate(traln, draggedBranch, false);
+  // tout << "init-lnl="  << traln.getLikelihood() << std::endl; 
+  auto initLnl = traln.getLikelihood() ; 
+#else 
+  eval.evaluateSubtrees(traln, draggedBranch, false);
+#endif
+
+// #if 0 
+//   eval.evaluate(traln, prunedSubtree, false);
+//   tout << "init-lnl=" << traln.getLikelihood() << std::endl; 
+// #endif
+
+  // optimize all branches
+  while( not converged &&  ctr < 10)
+    {
+      allOparams.clear(); 
+      converged = true; 
+
+      for(auto branch : branches)
+	{ 
+	  eval.evaluateSubtrees(traln, branch, false);
+
+	  auto blo = BranchLengthOptimizer(traln, branch, MAX_OPT_ITER, eval.getParallelSetup().getChainComm(), params); 
+	  blo.optimizeBranches(traln);
+
+	  auto oparams = blo.getOptimizedParameters();
+
+	  for(auto& oParam : oparams)
+	    {
+	      auto b = oParam.getOptimizedBranch(); 
+	      auto p = oParam.getParam();
+
+	      // tout << "OPT: " << b << "\t" << b.getInterpretedLength(traln, p ) << std::endl; 
+
+	      auto oldLen = traln.getBranch(b, p).toMeanSubstitutions( p->getMeanSubstitutionRate()); 
+	      auto newLen = b.toMeanSubstitutions(p->getMeanSubstitutionRate()); 
+	      
+	      converged &=  ( std::fabs((oldLen / newLen )  -1. ) < 1.e-1) ; 
+
+	      traln.setBranch(b,p); 
+	    }
+
+	  allOparams.insert(end(allOparams), begin(oparams), end(oparams)); 
+	}
+      // tout << "---"<< std::endl; 
+
+      ++ctr; 
+    }
+
+  eval.evaluate(traln, prunedSubtree, false);
+  auto lnl = traln.getLikelihood(); 
+
+#ifdef PRINT_LIKESPR_INFO
+  tout << SOME_FIXED_PRECISION << "INSERT " << insertBranch << "\t" << SHOW(initLnl) << "\tnow=" << traln.getLikelihood()<< "\tdiff=" << traln.getLikelihood() / initLnl << MAX_SCI_PRECISION  << std::endl ; 
+#endif
+
+  backup.resetFromBackup(traln); 
+  return InsertionResult(insertBranch, lnl,  allOparams);
+}
diff --git a/src/branches/TreeTraverser.hpp b/src/branches/TreeTraverser.hpp
new file mode 100644
index 0000000..3db3ce6
--- /dev/null
+++ b/src/branches/TreeTraverser.hpp
@@ -0,0 +1,66 @@
+#ifndef _TREE_TRAVERSER_HPP
+#define _TREE_TRAVERSER_HPP
+
+#include <unordered_map>
+
+#include "LikelihoodEvaluator.hpp"
+#include "TreeAln.hpp"
+#include <functional>
+#include "InsertionResult.hpp"
+#include "ParallelSetup.hpp"
+#include "BranchLengthOptimizer.hpp"
+
+
+class EvalPlain
+{
+public: 
+  InsertionResult getResult (LikelihoodEvaluator &eval, TreeAln &traln, const BranchPlain& insertBranch, const BranchPlain& prunedSubtree, const BranchPlain & draggedBranch, const std::vector<AbstractParameter*> &params) const ; 
+}; 
+
+
+class EvalOptDragged
+{
+public: 
+  InsertionResult getResult (LikelihoodEvaluator &eval, TreeAln &traln, const BranchPlain& insertBranch, const BranchPlain& prunedSubtree, const BranchPlain & draggedBranch, const std::vector<AbstractParameter*> &params) const ; 
+}; 
+
+class EvalOptThree
+{
+public: 
+  InsertionResult getResult (LikelihoodEvaluator &eval, TreeAln &traln, const BranchPlain& insertBranch, const BranchPlain& prunedSubtree, const BranchPlain & draggedBranch, const std::vector<AbstractParameter*> &params) const ; 
+}; 
+
+
+template<class InsertEval>
+class TreeTraverser
+{
+public: 
+  TreeTraverser(  int depth, TreeAln &traln, LikelihoodEvaluator& eval, std::vector<AbstractParameter*>  params, const BranchPlain &rootOfTraversed, const BranchPlain &prunedSubtree); 
+
+  std::vector<InsertionResult> getResult() const { return _result; }
+  void traverse() ; 
+
+private : 			// METHODS
+  void testInsert( const BranchPlain &insertBranch, BranchLengths floatingBranch,bool isFirst, int curDepth); 
+  
+
+private: 			// ATTRIBUTES
+  bool _doFirst; 
+  int _depth; 
+  std::reference_wrapper<TreeAln> _traln; 
+  std::reference_wrapper<LikelihoodEvaluator> _eval; 
+  std::vector<AbstractParameter*> _params; 
+  BranchPlain _rootOfTraversed; 
+  BranchPlain _prunedSubtree; 
+  std::vector<InsertionResult> _result; 
+
+  static const int _maxIter; 
+  
+  InsertEval _insertEval; 
+}; 
+
+
+#include  "TreeTraverser.tpp"
+
+#endif
+
diff --git a/src/branches/TreeTraverser.tpp b/src/branches/TreeTraverser.tpp
new file mode 100644
index 0000000..25ebeeb
--- /dev/null
+++ b/src/branches/TreeTraverser.tpp
@@ -0,0 +1,103 @@
+#include "TreeTraverser.hpp"
+
+#include "BranchLengthOptimizer.hpp"
+#include "ParallelSetup.hpp"
+
+
+template<class T> 
+const int TreeTraverser<T>::_maxIter = 8; 
+
+
+
+template<class T>
+TreeTraverser<T>::TreeTraverser( int depth, TreeAln &traln, LikelihoodEvaluator& eval, std::vector<AbstractParameter*>  params, const BranchPlain &rootOfTraversed, const BranchPlain &prunedSubtree)
+  : _doFirst{false}
+  , _depth(depth)
+  , _traln(traln)
+  , _eval(eval)
+  , _params{params}
+  , _rootOfTraversed{rootOfTraversed}
+  , _prunedSubtree{prunedSubtree}
+{
+#ifdef PRINT_LIKESPR_INFO
+  tout << "created tree traverser for " << SHOW(prunedSubtree) << SHOW(rootOfTraversed) << std::endl; 
+#endif
+}
+
+
+template<class T>
+void TreeTraverser<T>::traverse()
+{
+  auto floatingBranch = BranchLengths{}; 
+  auto branchAfterPrune = BranchPlain{};
+
+  std::tie(floatingBranch, branchAfterPrune) = _traln.get().pruneSubtree(_prunedSubtree, _rootOfTraversed, _params); 
+
+  testInsert(branchAfterPrune, floatingBranch, true, 0 ); 
+
+  _traln.get().insertSubtree( _prunedSubtree, branchAfterPrune, floatingBranch, _params );
+}
+
+
+/** 
+    insert, do stuff and remove again 
+ */ 
+template<class T>
+void TreeTraverser<T>::testInsert( const BranchPlain &insertBranch, BranchLengths floatingBranch, bool isFirst, int curDepth)
+{
+  assert( isFirst || not _traln.get().isTipNode(insertBranch.getPrimNode())); 
+
+
+  if(_depth < curDepth )
+    return; 
+
+  if(not isFirst || _doFirst )
+    {
+      // modify the floating branch, s.t it tells where to insert.  We
+      // assume that primNode of insertBranch is the direction we are
+      // coming from (while descending), so this is the point, where
+      // we have to insert the branch length
+
+      // floatingBranch.setPrimNode(_prunedSubtree.getPrimNode()); 
+      // floatingBranch.setSecNode( insertBranch.getPrimNode() ); 
+      
+      floatingBranch = BranchLengths(BranchPlain(_prunedSubtree.getPrimNode(),insertBranch.getPrimNode() ), floatingBranch.getLengths()); 
+      
+      _traln.get().insertSubtree( _prunedSubtree,  insertBranch, floatingBranch, _params); 
+
+      auto dirtyNodes = std::vector<nat>{ _prunedSubtree.getPrimNode() 
+					  ,  insertBranch.getPrimNode()
+      }; 
+
+      for(auto v : dirtyNodes)
+      	_eval.get().invalidateArray(_traln, v); 
+
+      auto insert = _insertEval.getResult(_eval, _traln, insertBranch, _prunedSubtree, floatingBranch, _params);
+      _result.push_back(insert);	
+
+      auto floatAfterPrune = BranchLengths{}; 
+      auto branchAfterPrune = BranchPlain{};
+
+      std::tie( floatAfterPrune, branchAfterPrune) = _traln.get().pruneSubtree(_prunedSubtree, floatingBranch, _params); 
+      
+      // assure correct pruning 
+      // not good anyway
+      // auto lenA = floatAfterPrune.getLengths(); 
+      // auto lenB = floatingBranch.getLengths(); 
+      // for(auto i = 0u; i < lenA.size() ; ++i)
+      // 	assert(lenA.at(i) == lenB.at(i)); 
+    }
+
+ if(not  _traln.get().isTipNode(insertBranch.getSecNode()) )
+    {
+      auto desc = _traln.get().getDescendents(insertBranch.getInverted()); 
+
+      testInsert(desc.first, floatingBranch, false, curDepth+1 ); 
+      testInsert(desc.second, floatingBranch, false, curDepth+1 ); 
+    }
+ 
+ if( not _traln.get().isTipNode(insertBranch.getPrimNode())  ) // isFirst
+   {
+     _eval.get().invalidateArray(_traln.get(), insertBranch.getPrimNode()); 
+   }
+}
diff --git a/src/branches/WeibullProposer.cpp b/src/branches/WeibullProposer.cpp
new file mode 100644
index 0000000..a2c7925
--- /dev/null
+++ b/src/branches/WeibullProposer.cpp
@@ -0,0 +1,82 @@
+#include "WeibullProposer.hpp"
+#include "brent.hpp"
+#include "Density.hpp"
+#include <functional>
+#include "AbstractParameter.hpp"
+
+#include "Randomness.hpp"
+#include <cmath>
+
+
+class OptFunc : public brent::func_base
+{
+public:   
+  OptFunc(std::function< double(double)> fun)
+    : _fun(fun)
+  {
+  }
+
+  virtual double operator() (double val)
+  {
+    return _fun(val); 
+  }
+
+private: 
+  std::function< double(double) > _fun; 
+
+}; 
+
+
+
+
+
+WeibullProposer::WeibullProposer(double nrOpt, double nrd1, double nrd2, double convParameter, double nonConvParameter)
+  : _nrOpt{nrOpt}
+  , _nrD1{nrd1}
+  , _nrD2{nrd2}
+  , _lambda{0}
+  , _k{0}  
+  , _convParameter{convParameter}
+  , _nonConvParameter{nonConvParameter}
+{
+  bool hasConverged = _nrD2 < 0 ; 
+
+  if(not hasConverged)
+    {
+      _lambda = _nonConvParameter / _nrD1; 
+      _k = 1; 
+    }
+  else 
+    {
+      double fit_c = -0.473; 
+
+      double estVar = _convParameter  * pow ( fabs(_nrD2) , 2 * fit_c); 
+      
+      auto lam = [=](double v) -> double 
+	{
+	  return pow(_nrOpt,2) 
+	  * pow( (v-1) / v,  - 2 / v ) 
+	  * ( Density::gammaFunction(1+(2/v)) - pow(Density::gammaFunction (1+(1/v)),2) )
+	  - estVar ;
+	}; 
+      
+      auto myFun = OptFunc(lam); 
+
+      _k  = brent::zero(1,1000000, 1e-12, myFun);
+      _lambda = _nrOpt / pow( (_k-1) / _k  , 1/ _k); 
+    }
+}
+
+
+BranchLength WeibullProposer::proposeBranch(BranchPlain b, TreeAln& traln, AbstractParameter* param, Randomness& rand) const 
+{
+  auto proposedVal = rand.drawRandWeibull(_lambda, _k); 
+  return BranchLength(b, InternalBranchLength::fromAbsolute(proposedVal, param->getMeanSubstitutionRate()));
+} 
+
+log_double WeibullProposer::getLogProbability(double val) const 
+{
+  auto res = Density::lnWeibull(val, _lambda, _k); 
+  return res; 
+} 
+
diff --git a/src/branches/WeibullProposer.hpp b/src/branches/WeibullProposer.hpp
new file mode 100644
index 0000000..fa7ea15
--- /dev/null
+++ b/src/branches/WeibullProposer.hpp
@@ -0,0 +1,48 @@
+#ifndef WEIBULL_PROPOSER_HPP
+#define WEIBULL_PROPOSER_HPP
+
+#include "TreeAln.hpp"
+#include "BranchLength.hpp"
+#include "extensions.hpp"
+
+class Randomness; 
+
+
+class WeibullProposer
+{
+public: 
+  WeibullProposer(double nrOpt = 0 , double nrd1 = 0, double nrd2 = 0 , double convParameter = 0, double nonConvParameter = 0); 
+  WeibullProposer(const WeibullProposer &rhs) = default; 
+  BranchLength proposeBranch(BranchPlain b, TreeAln& traln, AbstractParameter* param, Randomness& rand) const ; 
+  log_double getLogProbability(double val) const ; 
+
+  bool isConverged() const
+  {
+    return _nrD2 < 0 && _nrD1 < 1;  
+  }
+
+  friend std::ostream& operator<<(std::ostream& out, const WeibullProposer &rhs)
+  {
+    out << SHOW(rhs._nrOpt) << SHOW(rhs._nrD1) << SHOW(rhs._nrD2) << SHOW(rhs._lambda) << SHOW(rhs._k); 
+    return out; 
+  }
+
+  static std::string getName()
+  {
+    return std::string( "Weibull") ; 
+  }
+
+private: 
+  double _nrOpt; 		// branch length optimum 
+  double _nrD1; 		// first derivative 
+  double _nrD2; 		// second derivative
+  
+  double _lambda ; 		// shape parameter
+  double _k; 			// scale parameter
+
+  double _convParameter; 
+  double _nonConvParameter; 
+};  
+
+
+#endif
diff --git a/src/comm/AbstractPendingSwap.hpp b/src/comm/AbstractPendingSwap.hpp
new file mode 100644
index 0000000..6c2f9b7
--- /dev/null
+++ b/src/comm/AbstractPendingSwap.hpp
@@ -0,0 +1,43 @@
+#ifndef _ABSTRACT_PENDING_SWAP_HPP
+#define _ABSTRACT_PENDING_SWAP_HPP
+
+#include <cstdint>
+
+#include "SwapElem.hpp"
+#include "CommRequest.hpp"
+#include "PendingSwap.hpp"
+
+class AbstractPendingSwap
+{
+public: 
+  AbstractPendingSwap(SwapElem swap )
+    : _swap(swap)
+  {
+  } 
+
+  virtual ~AbstractPendingSwap()  
+  {
+  }
+
+  
+  SwapElem getSwap () const {return _swap; } 
+
+  virtual std::vector<char> getRemoteData() const = 0    ; 
+  virtual bool isFinished() = 0 ;   
+  virtual bool allHaveReceived(ParallelSetup& pl)  = 0 ; 
+  virtual void initialize(ParallelSetup& pl, std::vector<char> myChainSer, nat runid)  = 0; 
+
+
+  static uint64_t cantorPair(uint64_t a, uint64_t b )  
+  {
+    return (a + b ) * (a + b + 1 ) / 2 + b ; 
+  }
+
+protected: 
+
+  SwapElem _swap; 
+  
+
+}; 
+
+#endif
diff --git a/src/comm/CommCommon.hpp b/src/comm/CommCommon.hpp
new file mode 100644
index 0000000..2aaa540
--- /dev/null
+++ b/src/comm/CommCommon.hpp
@@ -0,0 +1,58 @@
+#ifndef _COMM_COMMON_HPP
+#define _COMM_COMMON_HPP
+
+
+
+// failed attempt to replace this massive amount of signatures in the
+// communicators with a macro... would obfuscate the code quite a lot
+// and still requires manual labor =(
+
+// keeping it around for a second attempt though 
+
+
+
+
+// begin foreach 
+// from
+// http://stackoverflow.com/questions/1872220/is-it-possible-to-iterate-over-arguments-in-variadic-macros
+// Make a FOREACH macro
+#define FE_1(WHAT, A,B, X) WHAT(A,B,X) 
+#define FE_2(WHAT, A,B,X, ...) WHAT(A,B,X)FE_1(WHAT,A,B, __VA_ARGS__)
+#define FE_3(WHAT, A,B,X, ...) WHAT(A,B,X)FE_2(WHAT,A,B, __VA_ARGS__)
+#define FE_4(WHAT, A,B,X, ...) WHAT(A,B,X)FE_3(WHAT,A,B, __VA_ARGS__)
+#define FE_5(WHAT, A,B,X, ...) WHAT(A,B,X)FE_4(WHAT,A,B, __VA_ARGS__)
+//... repeat as needed
+
+#define GET_MACRO(_1,_2,_3,_4,_5,NAME,...) NAME 
+#define FOR_EACH(action, TOK,CLASS,...)					\
+  GET_MACRO(__VA_ARGS__,FE_5,FE_4,FE_3,FE_2,FE_1)(action, TOK, CLASS,__VA_ARGS__)
+
+// end 
+
+
+
+
+// #define INSTANTIATE(TOKEN, CLASS, TYPE)  template TOKEN##_SIG(CLASS,TYPE);
+#define INSTANTIATE(TOKEN, CLASS, TYPE) template auto CLASS::##TOKEN(TYPE);
+
+
+#define ALLREDUCE(T) \
+  allreduce(std::vector<T> myValues) -> std::vector<T>
+
+
+// #define ALLREDUCE_SIG(CLASS, T)					\
+//   CLASS::allReduce(std::vector<T> myValues) -> std::vector<T>
+
+#define SCATTER_VARIABLE_KNOWN_LENGTH(TYPE) \
+  scatterVariableKnownLength( std::vector<TYPE>   &myData,  std::vector<int> &countsPerProc,  std::vector<int> &displPerProc,  int root) const -> std::vector<TYPE>
+
+#define CLASS_DECL(TOKEN,TYPE)			\
+  template<typename T> auto TOKEN(TYPE)
+
+#define IMPLEMENT(TOKEN, CLASS, CODE, ...)     \
+  template<typename T> auto CLASS::##TOKEN(T)				\
+  CODE									\
+  FOR_EACH(INSTANTIATE, TOKEN, CLASS, __VA_ARGS__)			\
+  
+#endif
+
diff --git a/src/comm/CommCore.hpp b/src/comm/CommCore.hpp
new file mode 100644
index 0000000..f380ee4
--- /dev/null
+++ b/src/comm/CommCore.hpp
@@ -0,0 +1,67 @@
+/*
+  all communicators (impls or wrapper classes) have to implement these declarations
+ */ 
+
+
+
+template<typename T> 
+auto gather(std::vector<T> myData, nat root = 0 )  
+  -> std::vector<T>; 
+
+template<typename T> 
+auto gatherVariableLength(std::vector<T> myData, int root = 0)  
+  -> std::vector<T>; 
+
+template<typename T>
+auto gatherVariableKnownLength(std::vector<T> myData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc , int root = 0)   
+  -> std::vector<T>; 
+
+
+template<typename T> 
+auto  scatterVariableKnownLength( std::vector<T> allData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc, int root)    
+  -> std::vector<T>; 
+
+template<typename T> 		// done
+auto broadcast(std::vector<T> array, int root = 0 )   
+  -> std::vector<T>; 
+
+template<typename T>		// ok
+auto broadcastVar(T var, int root = 0 )    
+  -> T   ; 
+
+template<typename T> 
+auto allReduce( std::vector<T> myValues)  
+  -> std::vector<T>; 
+
+
+template<typename T>
+std::vector<T> reduce(std::vector<T> data, int root )  ; 
+
+  
+template<typename T> 
+auto  receive( int source, int tag )  
+  -> T ; 
+
+template<typename T>  
+auto  send( T elem, int dest, int tag ) 
+  -> void ; 
+
+int getRank() const;
+size_t size() const; 
+bool isValid() const ;
+
+bool haveThreadSupport() const ; 
+
+static void finalize();  
+static void initComm(int argc, char **argv);
+static void abort(int code, bool waitForAll );
+
+
+SELF split(const std::vector<int> &color, const std::vector<int> &rank) const; 
+
+
+void waitAtBarrier() ; 
+
+
+
+
diff --git a/src/comm/CommCoreNew.hpp b/src/comm/CommCoreNew.hpp
new file mode 100644
index 0000000..9ede799
--- /dev/null
+++ b/src/comm/CommCoreNew.hpp
@@ -0,0 +1,138 @@
+#ifndef COMMCORENEW_H
+#define COMMCORENEW_H
+
+#include <cassert>
+
+// this class *could* be used for implementing CRTP with communicators. However, the overhead is enormous. Instead use the more clumsy CommCore.hpp       
+
+
+template<class DERIVED>
+class CommCoreNew
+{
+public: 
+
+  template<typename T> 
+  std::vector<T>
+  gather(std::vector<T> myData, nat root = 0 ) 
+  {
+    return static_cast<DERIVED*>(this)->gather_impl(myData,root); 
+  } 
+
+  template<typename T> 
+  std::vector<T>
+  gather_impl(std::vector<T> myData, nat root = 0 ) {assert(0); return {}; } 
+
+
+  template<typename T> 
+  std::vector<T>
+  gatherVariableLength(std::vector<T> myData, int root = 0)  
+  {
+    return static_cast<DERIVED*>(this)->gatherVariableLength_impl(myData,root); 
+  } 
+
+  template<typename T>
+  std::vector<T> gatherVariableKnownLength(std::vector<T> myData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc , int root = 0)   
+  {
+    return static_cast<DERIVED*>(this)->gatherVariableKnownLength_impl(myData, countsPerProc, displPerProc, root);
+  }
+
+  template<typename T> 
+  std::vector<T>
+  scatterVariableKnownLength( std::vector<T> allData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc, int root) // 
+  {
+    return static_cast<DERIVED*>(this)->scatterVariableKnownLength_impl(allData, countsPerProc, displPerProc, root);
+  }
+
+  template<typename T> 		// done
+  std::vector<T>
+  broadcast(std::vector<T> array, int root = 0 )   
+  {
+    return static_cast<DERIVED*>(this)->broadcast_impl(array,root);
+  }
+
+  template<typename T>		// ok
+  T  broadcastVar(T var, int root = 0 )    
+  {
+    return static_cast<DERIVED*>(this)->broadcastVar_impl(var, root);
+  }
+
+  template<typename T> 
+  std::vector<T> 
+  allReduce( std::vector<T> myValues) // 
+  {
+    return  static_cast<DERIVED*>(this)->allReduce_impl(myValues);
+  }
+
+
+
+  template<typename T>
+  std::vector<T>
+  reduce(std::vector<T> data, int root )  
+  {
+    return static_cast<DERIVED*>(this)->reduce_impl(data, root);
+  } 
+
+  
+  template<typename T> 
+  T  receive( int source, int tag )  
+  {
+    return static_cast<DERIVED*>(this)->receive_impl(source,tag);
+  }
+ 
+  template<typename T>  
+  void send( T elem, int dest, int tag ) 
+  {
+    static_cast<DERIVED*>(this)->send_impl(elem,dest,tag); 
+  }
+
+
+  int getRank() const
+  {
+    return static_cast<DERIVED*>(this)->getRank_impl(); 
+  }
+
+  size_t size() const
+  {
+    return static_cast<DERIVED*>(this)->size_impl(); 
+  } 
+
+  bool isValid() const 
+  {
+    return static_cast<DERIVED*>(this)->isValid_impl();
+  }
+
+
+  bool haveThreadSupport() const 
+  {
+    return static_cast<DERIVED*>(this)->haveThreadSupport_impl();
+  } 
+
+  DERIVED split(const std::vector<int> &color, const std::vector<int> &rank) const
+  {
+    return static_cast<DERIVED*>(this)->split_impl(color, rank);
+  } 
+
+  void waitAtBarrier()
+  {
+    static_cast<DERIVED*>(this)->waitAtBarrier_impl();
+  }
+
+  static void finalize()
+  {
+    DERIVED::finalize_impl();
+  }
+  
+  static void initComm(int argc, char **argv)
+  {
+    DERIVED::initComm_impl(argc,argv);
+  }
+
+  static void abort(int code, bool waitForAll )
+  {
+    DERIVED::abort_impl(code,waitForAll); 
+  }
+ 
+} ; 
+
+
+#endif /* COMMCORENEW_H */
diff --git a/src/comm/CommFlag.hpp b/src/comm/CommFlag.hpp
new file mode 100644
index 0000000..39a72d6
--- /dev/null
+++ b/src/comm/CommFlag.hpp
@@ -0,0 +1,17 @@
+#ifndef COMM_FLAG_HPP
+#define COMM_FLAG_HPP
+
+/** 
+    @brief indicates how much communication is necessary     
+ */ 
+enum class CommFlag : int
+{
+  NOTHING = 0, 
+    PRINT_STAT    =  1 , 		// stats for printing  
+    PROPOSALS     =  1 << 1  , 		// all proposal data  
+    TREE          =  1 << 2  ,		// the tree state 
+    SWAP          =  1 << 3 ,     		// swap matrix 
+    RAND          = 1 << 4  
+}; 
+
+#endif
diff --git a/src/comm/CommRequest.cpp b/src/comm/CommRequest.cpp
new file mode 100644
index 0000000..2530d58
--- /dev/null
+++ b/src/comm/CommRequest.cpp
@@ -0,0 +1,53 @@
+#include "CommRequest.hpp"
+
+#include <cassert>
+#include <iostream>
+
+#include "RemoteComm.hpp"
+#include "extensions.hpp"
+#include "CommRequestImpl.hpp"
+
+using namespace std;
+
+CommRequest::CommRequest( std::vector<char> array  )
+  : _impl( make_unique<CommRequest::Impl>(array) )
+{
+  
+}
+
+
+CommRequest::CommRequest(CommRequest &&rhs)   
+  : _impl{std::move(rhs._impl)}
+{
+  
+}
+
+
+CommRequest::~CommRequest()
+{
+} 
+
+
+bool CommRequest::isServed() const 
+{
+  return _impl->isServed(); 
+}
+
+
+std::vector<char> CommRequest::getArray() const 
+{
+  return _impl->getArray();
+}
+
+
+void  swap(CommRequest& lhs, CommRequest& rhs)
+{
+  std::swap(lhs._impl, rhs._impl);
+} 
+
+
+CommRequest& CommRequest::operator=(CommRequest rhs)
+{
+  swap(rhs, *this); 
+  return *this; 
+} 
diff --git a/src/comm/CommRequest.hpp b/src/comm/CommRequest.hpp
new file mode 100644
index 0000000..3174569
--- /dev/null
+++ b/src/comm/CommRequest.hpp
@@ -0,0 +1,36 @@
+#ifndef _COMM_REQUEST_HPP
+#define _COMM_REQUEST_HPP
+
+#include "common.h"
+
+#include <vector>
+#include <memory>
+
+#include <cassert>
+
+class RemoteComm; 
+
+class CommRequest
+{
+public: 
+  class Impl; 
+  friend class RemoteComm; 
+
+  CommRequest(std::vector<char> array = std::vector<char>{}); 
+  CommRequest(CommRequest &&rhs)   ; 
+  CommRequest(const CommRequest& rhs) = delete; 
+  CommRequest& operator=(CommRequest rhs); 
+  ~CommRequest(); 
+
+  friend void  swap(CommRequest& lhs, CommRequest& rhs); 
+
+  std::vector<char> getArray() const; 
+  bool isServed() const; 
+
+private: 
+  std::unique_ptr<CommRequest::Impl> _impl; 
+}; 
+
+
+
+#endif
diff --git a/src/comm/Communicator.cpp b/src/comm/Communicator.cpp
new file mode 100644
index 0000000..f721354
--- /dev/null
+++ b/src/comm/Communicator.cpp
@@ -0,0 +1,159 @@
+#include "Communicator.hpp"	 
+#include "GlobalVariables.hpp"
+#include "ThreadResource.hpp"
+#include "AbstractPendingSwap.hpp"
+
+Communicator::Communicator(std::unordered_map<tid_t,int> tid2rank)
+  : _remoteComm()
+  , _localComm(tid2rank)
+{
+  auto tRanks =  std::vector<int> {}; 
+  for(nat i =0; i < tid2rank.size() ;++i)
+    tRanks.push_back(i); 
+  _localComm.setRanks(tRanks); 
+}
+
+
+Communicator& Communicator::operator=(Communicator rhs) 
+{
+  swap(*this, rhs); 
+  return *this; 
+}
+
+
+void swap(Communicator& lhs, Communicator &rhs)
+{
+  using std::swap; 
+  swap(lhs._remoteComm, rhs._remoteComm); 
+  swap(lhs._localComm, rhs._localComm); 
+}
+
+
+void Communicator::waitAtBarrier() 
+{
+  if(_localComm.getRank() == 0)
+    _remoteComm.waitAtBarrier();
+
+  _localComm.waitAtBarrier();
+}
+
+
+bool Communicator::haveThreadSupport() const 
+{
+  return _localComm.haveThreadSupport() && _remoteComm.haveThreadSupport(); 
+}
+
+void Communicator::createSendRequest(std::vector<char> array, int dest, int tag, CommRequest& req)
+{
+  _remoteComm.createSendRequest(array, dest,tag, req); 
+}
+
+void Communicator::createRecvRequest(int src, int tag, nat length, CommRequest& req)
+{
+  _remoteComm.createRecvRequest(src,tag, length, req); 
+}
+
+
+int Communicator::getRank( ) const 
+{
+  return _remoteComm.getRank()  * int(_localComm.size()) + _localComm.getRank() ; 
+}
+
+size_t Communicator::size() const 
+{
+  return _remoteComm.size() * _localComm.size(); 
+}
+
+bool Communicator::isValid() const
+{
+  return _remoteComm.isValid() && _localComm.isValid();
+}
+
+Communicator Communicator::split(const std::vector<int> &color, const std::vector<int> &rank) const 
+{
+  // std::cout << "called split with " << color << " and "  << rank << std::endl; 
+
+  auto &&result = Communicator(_localComm.getTid2Ranking()) ; 
+
+  result._remoteComm = _remoteComm.split(color, rank);
+  result._localComm = std::move(_localComm.split(color, rank)); 
+
+  return std::move(result); 
+}
+
+
+void Communicator::finalize()
+{
+  RemoteComm::finalize(); 
+}
+
+void Communicator::initComm(int argc, char **argv)
+{
+  RemoteComm::initComm(argc, argv); 
+}
+
+
+#include <unistd.h>
+
+void Communicator::abort(int code, bool waitForAll)
+{
+  LocalComm::abort(code,waitForAll); 
+  RemoteComm::abort(code, waitForAll); 
+
+  exit(code); 
+  // exit(code); 
+}
+
+
+std::ostream& operator<<(std::ostream & out, const Communicator& rhs)
+{
+  out << rhs._remoteComm << "\t" ; 
+  out << rhs._localComm ; 
+  return out; 
+}
+
+
+int Communicator::mapToLocalRank( int rank) const   
+{
+  auto res =  rank % int(_localComm.size()); 
+  assert(res >= 0 && "local rank was negative" ); 
+  return  res; 
+}
+
+
+int Communicator::mapToRemoteRank(int rank) const  
+{
+  return rank /int( _localComm.size()); 
+}
+
+
+/** 
+    how many sets of threads offset does this set of threads need for
+    pinning?
+ */ 
+int Communicator::getProcsPerNode() 
+{
+  auto numNodes = _remoteComm.getNumberOfPhysicalNodes(); 
+  auto siz = _remoteComm.size(); 
+  auto procsPerNode = (siz / numNodes) + (siz % numNodes == 0 ? 0 : 1 ) ; 
+  return int(procsPerNode); 
+}
+
+
+LocalComm&  Communicator::getLocalComm ()
+{
+  return _localComm;
+} 
+
+
+RemoteComm& Communicator::getRemoteComm() 
+{
+  return _remoteComm; 
+}
+
+
+void Communicator::initWithMaxChains(size_t numChains, size_t numThreadsChecking)
+{
+  if(_localComm.getColor() == 0 && _localComm.getRank() == 0)
+    _localComm.initializeAsyncQueue(nat(numThreadsChecking), size_t(AbstractPendingSwap::cantorPair(numChains, numChains) * 2) );
+} 
diff --git a/src/comm/Communicator.hpp b/src/comm/Communicator.hpp
new file mode 100644
index 0000000..7b181d2
--- /dev/null
+++ b/src/comm/Communicator.hpp
@@ -0,0 +1,56 @@
+#ifndef _NEW_COMMUNICATOR_HPP
+#define _NEW_COMMUNICATOR_HPP
+
+#include "RemoteComm.hpp"      
+#include "LocalComm.hpp"
+#include "threadDefs.hpp" 
+
+#include <vector>
+#include <cassert>
+
+#include <unordered_map>
+
+class ThreadResource; 
+
+class Communicator
+{
+  typedef Communicator SELF ; 
+public: 
+  /** 
+      @param tid2rank absolute ranks in the communicator ; contains only ranks of local threads   
+  */ 
+  Communicator(std::unordered_map<tid_t,int> tid2rank); 
+  Communicator(const Communicator& rhs) = delete; 
+  Communicator(Communicator &&rhs) = default; 
+  ~Communicator(){}
+  Communicator& operator=(Communicator rhs) ; 
+  friend void swap(Communicator& lhs, Communicator &rhs); 
+
+  void createSendRequest(std::vector<char> array, int dest, int tag, CommRequest& req);
+  void createRecvRequest(int src, int tag, nat length, CommRequest& req); 
+
+#include "CommCore.hpp"
+
+  friend std::ostream& operator<<(std::ostream & out, const Communicator& rhs); 
+  
+  int mapToLocalRank( int rank) const  ; 
+  int mapToRemoteRank(int rank) const ; 
+
+  int getProcsPerNode() ; 
+  
+  LocalComm&  getLocalComm() ; 
+  RemoteComm& getRemoteComm(); 
+
+  void initWithMaxChains(size_t numChains, size_t numThreadsChecking); 
+  
+private:
+  RemoteComm _remoteComm; 
+  LocalComm _localComm; 
+};  
+
+
+#include "Communicator.tpp"
+
+#endif
+
+
diff --git a/src/comm/Communicator.tpp b/src/comm/Communicator.tpp
new file mode 100644
index 0000000..572222f
--- /dev/null
+++ b/src/comm/Communicator.tpp
@@ -0,0 +1,158 @@
+#include "GlobalVariables.hpp"
+
+
+
+template<typename T> 
+std::vector<T>
+Communicator::broadcast(std::vector<T> array, int root) 
+{
+  auto result = std::vector<T>(array.size()); 
+  auto localRoot = mapToLocalRank(root); 
+  auto remoteRoot = mapToRemoteRank(root); 
+
+  if(_localComm.getRank() == localRoot)
+    result = _remoteComm.broadcast(array, remoteRoot ); 
+
+  assert(remoteRoot >= 0 ); 
+  result =_localComm.broadcast(result, remoteRoot); 
+
+  return result; 
+}
+
+
+
+template<typename T> 
+T Communicator::broadcastVar(T elem  , int root) 
+{
+  auto arr = std::vector<T>  {elem}; 
+  arr = broadcast(arr,root); 
+  assert(arr.size() == 1); 
+  return arr[0]; 
+} 
+
+
+template<typename T> 
+std::vector<T> Communicator::gather(std::vector<T> myData, nat root ) 
+{
+  assert(0); 
+  return _remoteComm.gather(myData, root); 
+} 
+
+
+template<typename T> 
+std::vector<T>  Communicator::gatherVariableLength(std::vector<T> myData, int root )  
+{
+  auto localRoot = mapToLocalRank(root); 
+  auto remoteRoot = mapToRemoteRank(root); 
+
+  myData = _localComm.gatherVariableLength(myData, localRoot); 
+
+  if(_localComm.getRank() == localRoot)
+    myData = _remoteComm.gatherVariableLength(myData, remoteRoot ); 
+  
+  return myData; 
+}
+
+ 
+template<typename T> 
+T Communicator::receive( int source, int tag ) 
+{ 
+  assert(0); 
+  return _remoteComm.receive<T>(source,tag); 
+}
+
+
+template<typename T> 
+void Communicator::send( T elem, int dest, int tag ) 
+{
+  assert(0); 
+  _remoteComm.send(elem, dest, tag); 
+} 
+
+
+
+
+template<typename T> 
+std::vector<T>
+Communicator::allReduce(std::vector<T> myValues)
+{
+  // std::cout << SyncOut()<< _localComm.getColor() << "," << _localComm.getRank()  << "before: " << myValues << std::endl; 
+
+  myValues = _localComm.reduce<T>(myValues, 0);
+
+  if(_localComm.getRank() == 0)
+    myValues = _remoteComm.allReduce(myValues); 
+  
+  myValues = _localComm.broadcast(myValues,0); 
+
+  // std::cout << SyncOut()<< _localComm.getColor() << "," << _localComm.getRank()  << "after: " << myValues << std::endl; 
+
+  return myValues; 
+} 
+
+
+template<typename T>
+std::vector<T>
+Communicator::gatherVariableKnownLength(std::vector<T> myData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc , int root) 
+{
+  auto localRoot = mapToLocalRank(root) ; 
+  auto remoteRoot = mapToRemoteRank(root); 
+  
+  auto countsLocal = std::vector<int>(); 
+  auto displLocal = std::vector<int>();
+  for(auto i = _localComm.size() * _remoteComm.getRank() ; i < _localComm.size() * (_remoteComm.getRank()+1); ++i )
+    countsLocal.push_back(countsPerProc[i]);
+  displLocal.push_back(0);
+  for(nat i  =1; i < countsLocal.size(); ++i)
+    displLocal.push_back(displLocal.back() + countsPerProc[i-1]); 
+  
+  myData = _localComm.gatherVariableKnownLength(myData, countsLocal, displLocal, localRoot); 
+
+  auto countsRemote  = std::vector<int>( _remoteComm.size(), 0 ); 
+  for(auto i = 0u; i < size() ;++i)
+    countsRemote[i / _localComm.getNumThreads() ] += countsPerProc[i]; 
+  auto displRemote = std::vector<int>();
+  displRemote.push_back(0); 
+  for(nat i = 1 ; i < countsRemote.size() ;++i)
+    displRemote.push_back( displRemote[i-1] + countsRemote[i-1]); 
+
+  if(localRoot  == _localComm.getRank() )
+    myData = _remoteComm.gatherVariableKnownLength(myData, countsRemote, displRemote, remoteRoot); 
+
+  return myData; 
+}
+
+
+
+template<typename T> 
+std::vector<T> 
+Communicator::scatterVariableKnownLength( std::vector<T> myData,  std::vector<int> &countsPerProc,  std::vector<int> &displPerProc, int root )  
+{
+  auto localRoot = mapToLocalRank(root)	; 
+  auto remoteRoot = mapToRemoteRank(root); 
+
+  auto countsRemote  = std::vector<int>( _remoteComm.size(), 0 ); 
+  for(auto i = 0u; i < size() ;++i)
+    countsRemote[i / _localComm.getNumThreads() ] += countsPerProc[i]; 
+  auto displRemote = std::vector<int>();
+  displRemote.push_back(0); 
+  for(nat i = 1 ; i < countsRemote.size() ;++i)
+    displRemote.push_back(displRemote[i-1] + countsRemote[i-1]); 
+
+  // that's the data for our mpi process
+  if(localRoot == _localComm.getRank())
+    myData = _remoteComm.scatterVariableKnownLength(myData, countsRemote, displRemote, remoteRoot); 
+  
+  auto countsLocal = std::vector<int>(); 
+  auto displLocal = std::vector<int>();
+  for(auto i = _localComm.size() * _remoteComm.getRank() ; i < _localComm.size() * (_remoteComm.getRank()+1); ++i )
+    countsLocal.push_back(countsPerProc[i]);
+  displLocal.push_back(0);
+  for(nat i  =1; i < countsLocal.size(); ++i)
+    displLocal.push_back(displLocal.back() + countsPerProc[i-1]); 
+
+  myData = _localComm.scatterVariableKnownLength(myData, countsLocal, displLocal, localRoot); 
+
+  return myData ; 
+} 
+
diff --git a/src/comm/IncompleteMesh.cpp b/src/comm/IncompleteMesh.cpp
new file mode 100644
index 0000000..bb1b4fb
--- /dev/null
+++ b/src/comm/IncompleteMesh.cpp
@@ -0,0 +1,169 @@
+#include "IncompleteMesh.hpp"
+#include <cassert>
+#include <algorithm>
+#include <tuple>
+
+IncompleteMesh::IncompleteMesh(size_t size, size_t runDimSize, size_t chainDimSize)
+  : _runDimSize (runDimSize)
+  , _chainDimSize ( chainDimSize)
+  , _globalSize( size) 
+{
+}
+
+
+std::tuple<size_t,size_t> IncompleteMesh::getElementsPerDimension(size_t total, size_t dimSize) const 
+{
+  auto cartProcs = total  / dimSize; 
+  auto remainderProcs = total % dimSize ; 
+  auto numMoreProc = remainderProcs; 
+
+  assert(numMoreProc * (cartProcs + 1 )  +  (  dimSize - numMoreProc ) * cartProcs == total); 
+  return std::make_tuple(  cartProcs, dimSize - numMoreProc ); 
+}
+
+
+size_t IncompleteMesh::getProcsInMyDim(nat rank, size_t total, size_t dimSize ) const 
+{
+  auto elemPerDim = getElementsPerDimension(total, dimSize); 
+  auto procs = std::get<0>(elemPerDim); 
+  auto numWithFewProcs = std::get<1>(elemPerDim); 
+  return  ( rank < ( dimSize - numWithFewProcs ) * (procs+1)  )? procs + 1  : procs ; 
+}
+
+
+nat IncompleteMesh::getMyCoord(nat rank, size_t total, size_t dimSize ) const 
+{
+  auto elemPerDim = getElementsPerDimension(total, dimSize); 
+  auto procs = std::get<0>(elemPerDim); 
+  auto numWithFew  = std::get<1>(elemPerDim); 
+  auto numWithMany = dimSize - numWithFew; 
+
+  if( rank <  numWithMany  * ( procs + 1) )
+    return nat(rank / (procs + 1 )); 
+  else 
+    {
+      rank -=  nat(numWithMany * (procs + 1)); 
+      return  nat(numWithMany  + rank /  procs); 
+    }
+}
+
+
+nat IncompleteMesh::getRankInMyDim(nat rank, size_t total, size_t dimSize) const 
+{
+  nat procs = 0, numWithFew = 0; 
+  std::tie(procs, numWithFew) = getElementsPerDimension(total, dimSize); 
+  auto numWithMany = dimSize - numWithFew;  
+    
+  if(rank < numWithMany * (procs + 1 ))
+    return rank % (procs+1); 
+  else 
+    {
+      rank -=  nat(numWithMany * (procs + 1)); 
+      return rank % procs; 
+    }
+}
+
+
+std::array<nat,3> IncompleteMesh::getCoordinates(nat rank) const
+{
+  auto result = std::array<nat,3>{{0,0,0}}; 
+
+  result[0] = getMyCoord(rank, _globalSize, _runDimSize); 
+    
+  auto numProcMyRun = getProcsInMyDim(rank, _globalSize, _runDimSize); 
+  auto rankInRun = getRankInMyDim(rank, _globalSize, _runDimSize); 
+  result[1] = getMyCoord(rankInRun, numProcMyRun, _chainDimSize); 
+
+  auto numProcMyChain = getProcsInMyDim( rankInRun, numProcMyRun, _chainDimSize ); 
+  auto rankInChain = getRankInMyDim(rankInRun, numProcMyRun, _chainDimSize ); 
+
+  result[2] = getMyCoord(rankInChain, numProcMyChain, numProcMyChain); 
+    
+  return result; 
+}
+
+
+std::ostream& operator<<(std::ostream& out, const IncompleteMesh& rhs)
+{
+  for(nat i = 0; i < rhs._globalSize; ++i)
+    {
+      auto coord = rhs.getCoordinates(i); 
+      out << "rank:\t" << i << "\t|\t"<< std::get<0>(coord) << "\t" << 
+      	std::get<1>(coord) << "\t" << 
+      	std::get<2>(coord) <<  std::endl; 
+    }
+  return out; 
+}
+
+
+nat IncompleteMesh::getRankFromCoordinates( std::array<nat,3> coords) const 
+{
+  auto result = 0; 
+  auto resultRun = 0u; 
+  auto resultChain = 0; 
+
+  assert(coords[0] < _runDimSize && coords[1] < _chainDimSize); 
+  auto elemPerDim = getElementsPerDimension(_globalSize, _runDimSize); 
+
+  // add ranks for run 
+  auto procs = std::get<0>(elemPerDim); 
+  auto numWithFew = std::get<1>(elemPerDim);
+  auto numWithMany = _runDimSize - numWithFew; 
+  if(coords[0] < numWithMany)
+    resultRun += nat(coords[0] * (procs + 1 )); 
+  else 
+    {
+      resultRun += nat(numWithMany * (procs + 1)); 
+      coords[0] -= nat(numWithMany); 
+      resultRun += nat(coords[0] * procs); 
+    }
+
+  // add ranks
+  auto numProcMyRun = getProcsInMyDim(resultRun, _globalSize, _runDimSize); 
+  auto rankInRun = getRankInMyDim(resultRun, _globalSize, _runDimSize); 
+  assert(rankInRun == 0); 
+  elemPerDim = getElementsPerDimension(numProcMyRun, _chainDimSize); 
+  procs = std::get<0>(elemPerDim); 
+  numWithFew = std::get<1>(elemPerDim);
+  numWithMany = _chainDimSize - numWithFew; 
+    
+  if(coords[1] < numWithMany)
+    resultChain += nat(coords[1] * (procs+1)); 
+  else 
+    {
+      resultChain += nat(numWithMany * (procs+1)); 
+      coords[1] -= nat(numWithMany); 
+      resultChain += nat(coords[1] *  procs); 
+    }
+    
+  result += resultRun + resultChain + coords[2]; 
+
+  return result; 
+}
+
+
+nat IncompleteMesh::getNumRanksInDim(nat runBatchId, nat chainBatchId) const 
+{
+  assert(runBatchId < _runDimSize); 
+  assert(chainBatchId < _chainDimSize); 
+  
+  auto baseRank = getRankFromCoordinates( {{ runBatchId, chainBatchId, 0 }}); 
+  nat otherRank = 0;  
+  
+  if(chainBatchId + 1 < _chainDimSize)
+    {
+      otherRank = getRankFromCoordinates( {{ runBatchId, chainBatchId + 1 , 0 }}); 
+    }
+  else if(runBatchId + 1 < _runDimSize)
+    {
+      otherRank = getRankFromCoordinates( {{ runBatchId + 1 , 0 , 0}} ); 
+    }
+  else 				
+    {
+      otherRank = nat(_globalSize); 
+    }
+
+  assert(baseRank  < otherRank); 
+
+  return otherRank - baseRank; 
+}   
diff --git a/src/comm/IncompleteMesh.hpp b/src/comm/IncompleteMesh.hpp
new file mode 100644
index 0000000..cae330e
--- /dev/null
+++ b/src/comm/IncompleteMesh.hpp
@@ -0,0 +1,54 @@
+#ifndef _INCOMPLETE_MESH_HPP
+#define _INCOMPLETE_MESH_HPP
+
+#include "common.h"
+#include <iostream>
+#include <array>
+
+
+class IncompleteMesh
+{
+public: 
+  IncompleteMesh(size_t size, size_t runDimSize, size_t chainDimSize); 
+  /** 
+      @brief gets the rank from coordinates in this mesh 
+   */ 
+  nat getRankFromCoordinates( std::array<nat,3> coords) const ; 
+  /** 
+      @brief gets the coordinates of a process in this mesh from the rank 
+   */ 
+  std::array<nat,3> getCoordinates(nat rank) const; 
+  /** 
+      @brief gets the effective size of a dimension 
+      
+      in other words the total number of ranks assigned to something 
+   */ 
+  nat getNumRanksInDim(nat runBatchId, nat chainBatchId) const ;   
+
+  size_t getRunDimSize() const {return _runDimSize; }
+  size_t getChainDimSize() const {return _chainDimSize; }
+  
+
+private: 			// METHODS 
+  /** 
+      @brief gets number of elements per dimension and number of
+      batches for which this is applicable
+
+      Notice that dimSize - result[1] will have result[0] + 1 elements
+      
+      @param total -- total  number of elements 
+      @paarm dimSize -- size of the dimension
+   */ 
+  std::tuple<size_t,size_t> getElementsPerDimension(size_t total, size_t dimSize) const ; 
+  size_t getProcsInMyDim(nat rank, size_t total, size_t dimSize ) const ; 
+  nat getMyCoord(nat rank, size_t total, size_t dimSize ) const ; 
+  nat getRankInMyDim(nat rank, size_t total, size_t dimSize) const ; 
+  friend std::ostream& operator<<(std::ostream& out, const IncompleteMesh& rhs); 
+
+private: 			// ATTRIBUTES
+  size_t _runDimSize; 
+  size_t _chainDimSize; 
+  size_t _globalSize;
+};  
+
+#endif
diff --git a/src/comm/LocalComm.cpp b/src/comm/LocalComm.cpp
new file mode 100644
index 0000000..2165b68
--- /dev/null
+++ b/src/comm/LocalComm.cpp
@@ -0,0 +1,247 @@
+#include "LocalComm.hpp"
+
+#include <cassert>
+#include <thread>
+
+
+LocalComm::LocalComm(std::unordered_map<tid_t,int> tid2rank)
+  : _tid2LocCommIdx(tid2rank)
+  , _colors(_tid2LocCommIdx.size(),0u)
+  , _ranks(_tid2LocCommIdx.size(), 0u)
+  , _size(_tid2LocCommIdx.size())
+  , _mgsPerTag{}
+  , _newMessages(tid2rank.size(), std::vector<MessageQueueSingle>(size_t(_size)))
+{
+  nat ctr = 0; 
+  for(auto &r : _ranks)
+    r = ctr++; 
+}
+
+LocalComm::LocalComm(const LocalComm& rhs) 
+  : _tid2LocCommIdx(rhs._tid2LocCommIdx)
+  , _colors(rhs._colors)
+  , _ranks(rhs._ranks)
+  , _size(rhs._size)
+  , _mgsPerTag(rhs._mgsPerTag)
+  , _newMessages(rhs._newMessages)
+{
+}
+  
+
+
+LocalComm::LocalComm(LocalComm &&rhs) 
+  : _tid2LocCommIdx(std::move(rhs._tid2LocCommIdx))
+  , _colors(std::move(rhs._colors))
+  , _ranks(std::move(rhs._ranks))
+  , _size(std::move(rhs._size))
+  , _mgsPerTag(std::move(rhs._mgsPerTag))
+  , _newMessages(std::move(rhs._newMessages))
+{
+}
+
+LocalComm& LocalComm::operator=(LocalComm rhs )
+{
+  swap(*this, rhs);
+  return *this;
+}
+
+
+std::ostream& operator<<(std::ostream& out, const LocalComm& rhs)
+{
+  out << "{" << rhs.getColor() << "," << rhs.getRank() << "}"; 
+  return out; 
+}
+
+
+size_t LocalComm::getNumThreads() const 
+{
+  return _ranks.size();
+}
+
+size_t LocalComm::size() const 
+{
+  return _size; 
+}
+
+
+int LocalComm::getRank() const
+{ 
+  return _ranks.at(_tid2LocCommIdx.at(MY_TID));  
+} 
+
+
+bool LocalComm::isValid() const  
+{
+  // TODO evil, but reasonable 
+  bool result = true; 
+  for(nat i = 0; i < _colors.size() ; ++i)
+    for(nat j = i + 1 ; j < _colors.size() ; ++j)
+      result &= (_ranks[i] != _ranks[j] ||  _colors[i] != _colors[j] ) ; 
+  
+  auto color2num =  std::unordered_map<int,int>{};
+  for(nat i =0; i < _colors.size() ; ++i)
+    ++color2num[_colors[i]] ; 
+  int aNum = begin(color2num)->second; 
+  for(auto &elem : color2num)
+    assert(aNum == elem.second); 
+  assert(int(_size) == aNum); 
+
+  return result; 
+}
+
+
+LocalComm LocalComm::split(const std::vector<int> &color, const std::vector<int> &rank)  const
+{
+  auto result = *this; 
+  
+  auto uniqCols = std::unordered_set<int>{}; 
+  uniqCols.insert(begin(color), end(color)); 
+  // auto minCol = *(std::min_element(begin(uniqCols), end(uniqCols))); 
+  auto tColors = color; 
+
+  if(rank[0] > 0 )
+    {
+      auto tRanks = rank; 
+      for(auto &r : tRanks)
+	r -= rank[0]; 
+      result.setRanks(tRanks); 
+      result.setColors(tColors); 
+    }
+  else 
+    {
+      result.setRanks(rank);
+      result.setColors(tColors); 
+    }
+  
+  auto col2occ = std::unordered_map<int,int>{}; 
+  for(auto c : result._colors)
+    ++col2occ[c]; 
+  result._size = begin(col2occ)->second; 
+ 
+  result.isValid(); 
+ 
+  return result; 
+}
+
+
+void swap(LocalComm& lhs, LocalComm& rhs )
+{
+  using std::swap; 
+  swap(lhs._tid2LocCommIdx, rhs._tid2LocCommIdx); 
+  swap(lhs._colors, rhs._colors); 
+  swap(lhs._ranks, rhs._ranks); 
+  swap(lhs._size, rhs._size); 
+  swap(lhs._mgsPerTag, rhs._mgsPerTag); 
+  swap(lhs._newMessages, rhs._newMessages); 
+} 
+
+
+int LocalComm::getIdx(int col, int rank) const 
+{
+  int result = -1; 
+  for(auto i = 0u ; i < getNumThreads(); ++i)
+    {
+      if(_colors[i] == col && _ranks[i] == rank)
+	return int(i); 
+    }
+  assert(0); 
+  return result; 
+}
+
+
+
+void LocalComm::waitAtBarrier()
+{
+  // TODO efficiency. But it is not used currently anyway...
+  auto arr = std::vector<uint8_t>{1};
+  arr = allReduce<uint8_t>(arr);
+  assert(arr.size() == 1 && arr[0] == size()); 
+}
+
+
+
+static void dummyFun()
+{
+  
+}
+
+bool LocalComm::haveThreadSupport() const 
+{
+  bool isAvailable = true; 
+  try
+    { 
+      auto&& t = std::thread(dummyFun); 
+      t.join();
+    }
+  catch(std::system_error &anExcept)
+    {
+      isAvailable = false; 
+    }
+  
+  return isAvailable; 
+}
+
+
+
+void LocalComm::initializeAsyncQueue(size_t siz, size_t numSlots)
+{
+  auto maxCol = *(std::max_element(begin(_colors), end(_colors))); 
+  _mgsPerTag.resize(maxCol+1);
+  for(int j = 0; j < maxCol+1; ++j)
+    {
+      for(nat i = 0; i < numSlots; ++i)
+	_mgsPerTag.at(j).emplace_back(siz);
+    }
+}
+
+
+int LocalComm::mapRealRank2Corrected(int rank, int root) 
+{
+  // auto result = rank - root ; 
+  // if( result < 0  )
+  //   return size() - result; 
+  // else 
+  //   return result; 
+
+  assert(root == 0); 
+  return rank; 
+}
+
+int LocalComm::mapCorrectedRank2Real(int rank, int root)
+{
+
+  // TODO this and the other function could be used to map the ranks
+  // in case we use a root != 0.
+
+  // since this is currently not needed and I do not have more time to
+  // fiddle around, these functions simply return the original rank.
+  
+  assert(root == 0); 
+  return rank; 
+
+  // auto result = rank + root; 
+  // if(result >= size())
+  //   return result - size(); 
+  // else 
+  //   return result; 
+}
+
+
+
+
+void LocalComm::abort(int code, bool waitForAll)
+{
+  if(_masterThread != std::this_thread::get_id())
+    {
+       while (not _threadsDie)
+	; 
+
+       pthread_exit(NULL);
+
+    }
+  else  
+    {
+      _threadsDie = true; 
+    }
+}
+
diff --git a/src/comm/LocalComm.hpp b/src/comm/LocalComm.hpp
new file mode 100644
index 0000000..9fa1ca6
--- /dev/null
+++ b/src/comm/LocalComm.hpp
@@ -0,0 +1,92 @@
+#ifndef _LOCAL_COMM_HPP
+#define _LOCAL_COMM_HPP
+
+#include <unordered_map>
+#include "threadDefs.hpp"
+#include <iostream>
+#include <numeric>
+
+#include "MessageQueue.hpp"
+#include "MessageQueueSingle.hpp"
+
+#define DATA_COMBINE_FUN std::function<void(std::vector<T>& acc,  typename std::vector<T>::const_iterator,  typename std::vector<T>::const_iterator)> 
+// 1st argument: accumulator
+// 2nd argument: start of donator
+// 3rd argument: end of donator 
+
+
+class LocalComm
+{
+  typedef LocalComm SELF; 
+
+public: 
+  /** 
+      @param tid2rank contains absolute ranks of all threads 
+   */ 
+  LocalComm(std::unordered_map<tid_t,int> tid2rank); 
+  LocalComm(const LocalComm& rhs); 
+  LocalComm(LocalComm &&rhs) ; 
+  LocalComm& operator=(LocalComm rhs ); 
+
+  friend void swap(LocalComm& lhs, LocalComm& rhs ); 
+
+  friend std::ostream& operator<<(std::ostream& out, const LocalComm& rhs); 
+
+  std::unordered_map<tid_t,int> getTid2Ranking  () const {return _tid2LocCommIdx; }
+  void setColors(std::vector<int> colors) { _colors = colors; }
+  void setRanks(std::vector<int> ranks) {_ranks = ranks; }
+  
+  #include "CommCore.hpp"
+
+  int getIdx() const {return _tid2LocCommIdx.at(MY_TID); }
+  size_t getNumThreads() const ; 
+
+  int getIdx(int col, int rank) const ; 
+  int getColor() const {return _colors.at(_tid2LocCommIdx.at(MY_TID)); }
+
+  template<typename T>
+  void postAsyncMessage(const std::vector<T> &message, int tag, int runBatch); 
+  template<typename T>
+  std::tuple<bool,std::vector<T> > readAsyncMessage(int tag, int runBatch); 
+  
+  void initializeAsyncQueue(size_t size, size_t numSlots);
+
+private: 
+  template<typename T>
+  void produceWrapper(std::vector<T> msg, int idx, const std::vector<int> &who) ; 
+
+  int mapRealRank2Corrected(int rank, int root) ; 
+  int mapCorrectedRank2Real(int rank, int root); 
+  /** 
+      @brief communicates data from tips to root in a deterministic way 
+   */ 
+  template<typename T>
+  std::vector<T> commTreeUp(std::vector<T> data, int root, DATA_COMBINE_FUN fun); 
+  /** 
+      @brief communicates data from tips to root in an asynchronous way 
+   */ 
+  template<typename T>
+  std::vector<T> commTreeUpAsync(std::vector<T> data, int root, DATA_COMBINE_FUN fun); 
+  /** 
+      @brief communicates data from root to tips in an asynchronous way  
+   */ 
+  template<typename T>
+  std::vector<T> commTreeDownAsync(std::vector<T> data, int root); 
+
+private: 			// ATTRIBUTES
+  std::unordered_map<tid_t,int> _tid2LocCommIdx;
+
+  std::vector<int> _colors; 
+  std::vector<int> _ranks; 
+  size_t _size; 
+
+  // for each color (here runid), we have an array that is indexed by
+  // a tag that is composed of two chain ids (cantor pair)
+  std::vector< std::vector<MessageQueue> > _mgsPerTag; 
+  std::vector<std::vector<MessageQueueSingle>> _newMessages;
+}; 
+
+
+#include "LocalComm.tpp"
+
+#endif
diff --git a/src/comm/LocalComm.tpp b/src/comm/LocalComm.tpp
new file mode 100644
index 0000000..e145609
--- /dev/null
+++ b/src/comm/LocalComm.tpp
@@ -0,0 +1,324 @@
+#include <cassert>
+
+#include "GlobalVariables.hpp"
+
+
+template<typename T> 
+std::vector<T>
+LocalComm::scatterVariableKnownLength( std::vector<T> allData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc, int root)   
+{
+  // does not need to be terrible efficient...(binary tree of course would be better) 
+
+  assert(root == 0); 
+
+  int myRank = getRank(); 
+  int myCol = getColor();
+  int myIdx = getIdx();
+  int rootIdx = getIdx(myCol, root); 
+  auto result = std::vector<T>();
+
+  if(myRank == root)
+    {
+      for(auto i = 0; i < int(size()) ;++i)
+	{
+	  if(i == root)
+	    continue; 
+	  
+	  auto toSend = std::vector<T>(begin(allData) + displPerProc[i], begin(allData) + displPerProc[i] + countsPerProc[i]);
+	  _newMessages[myIdx][i].produce(toSend); 
+	}
+      
+      result.insert(end(result), begin(allData) + displPerProc[myRank] , begin(allData) + displPerProc[myRank] + countsPerProc[myRank]); 
+    }
+  else 
+    {
+      bool found = false; 
+      while(not found)
+	std::tie(found, result) =   _newMessages[rootIdx][myRank].consume<T>(myRank);
+    }
+
+  return result; 
+}
+ 
+
+
+template<typename T>
+std::vector<T>
+LocalComm::gatherVariableKnownLength(std::vector<T> myData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc , int root)   
+{
+  assert(root == 0); 
+
+  DATA_COMBINE_FUN gatherer = [](std::vector<T>& acc, typename std::vector<T>::const_iterator  beginDon, typename std::vector<T>::const_iterator endDon)
+    {
+      acc.insert(end(acc), beginDon, endDon);
+    }; 
+
+  return commTreeUp(myData,root, gatherer) ; 
+} 
+
+
+
+
+template<typename T> 
+std::vector<T>
+LocalComm::broadcast(std::vector<T> array, int root ) 
+{
+  if(size() == 1 )
+    return array; 
+  else 
+    return commTreeDownAsync(array, root);
+}
+
+
+template<typename T>
+std::vector<T> LocalComm::reduce(std::vector<T> data, int root )
+{
+  // sorry this rank translation is too much effort now..
+  assert(root == 0); 
+
+  if(size() == 1 )
+    return data; 
+  else 
+    {
+
+      DATA_COMBINE_FUN reducer = [](  std::vector<T> &acc,  typename std::vector<T>::const_iterator beginDonator, typename std::vector<T>::const_iterator endDonator)
+	{
+	  std::transform( 
+			 begin(acc), end(acc),
+			 beginDonator, begin(acc),
+			 std::plus<double>() 	     
+			  ); 
+	}; 
+
+      return commTreeUpAsync(data,root, reducer); 
+    } 
+}
+
+template<typename T> 
+std::vector<T> 
+LocalComm::gatherVariableLength(std::vector<T> myData, int root )  
+{
+  assert(root == 0); 
+  DATA_COMBINE_FUN gatherer = []( std::vector<T> &acc, typename std::vector<T>::const_iterator beginDonator,  typename std::vector<T>::const_iterator endDonator)
+    {
+      acc.insert(end(acc), beginDonator, endDonator); 
+    }; 
+
+  return commTreeUp(myData,root, gatherer) ; 
+}
+
+
+
+
+template<typename T>
+std::vector<T> LocalComm::allReduce(std::vector<T> myData)
+{
+  int root = 0 ; 
+  if(size() > 1)
+    {
+      myData = reduce(myData, root);
+      myData = broadcast(myData,root); 
+    }
+  return myData; 
+}
+
+
+template<typename T>
+void LocalComm::postAsyncMessage(const std::vector<T> &message, int tag, int runBatch)
+{
+  // TODO multiple queues could be better here ... 
+  auto readers = std::vector<int>(size(),1); 
+  _mgsPerTag.at(runBatch).at(tag).produce(message, readers); 
+}
+
+
+template<typename T>
+std::tuple<bool,std::vector<T> > LocalComm::readAsyncMessage(int tag, int runBatch)
+{
+  return _mgsPerTag.at(runBatch).at(tag).consume<T>(getRank());
+}
+
+
+
+// not using a combine function right now, since we only need this for
+// the bcast, where it must be as efficient as possible
+template<typename T>
+std::vector<T> LocalComm::commTreeDownAsync(std::vector<T> data, int root)
+{
+  assert(root == 0); 
+  
+  int myIdx = getIdx();
+  // int myCol = getColor();
+  int myRank = getRank(); 
+  assert(nat(root) < size());
+
+  // auto &myMsg = _newMessages.at(myIdx); 
+
+  auto recvFrom = 0; 
+  auto sendTo = std::vector<int>( );
+
+  for( int offset = 1 ;
+       ( myRank % offset) == 0 && size_t(offset) < size()  ;
+       offset *= 2 )
+    {
+      if( (myRank % ( offset * 2 ) ) == 0 )
+	{
+	  // receive downwards 
+	  auto hisRank = myRank+offset; 
+	  
+	  if( size() <= size_t(hisRank) )
+	    continue;
+	  
+	  if(hisRank != myRank)
+	    sendTo.push_back(hisRank)  ; 
+	}
+      else 
+	{
+	  recvFrom = myRank - offset; 
+	}
+    }
+
+  // first receive 
+  auto msg = std::vector<T>{}; 
+  if(myRank != root)
+    {
+      bool gotMsg  = false; 
+      auto hisIdx = getIdx(getColor(), recvFrom); 
+      auto &hisMsg =  _newMessages.at(hisIdx);
+      while(not gotMsg) 
+	std::tie(gotMsg, msg) = hisMsg[myRank].consume<T>(myRank); // must be the real rank to avoid confusion 
+    }
+  else 
+    msg = data; 
+
+  for(auto v : sendTo)
+    _newMessages[myIdx][v].produce(msg); 
+
+  // then send everything 
+  return msg; 
+}
+
+
+
+template<typename T>
+std::vector<T> LocalComm::commTreeUpAsync(std::vector<T> data, int root, DATA_COMBINE_FUN fun)
+{
+  // opmitized for the case that the root is rank 0; TODO implement
+  // that more generally
+  assert(root == 0); 
+
+  int myIdx = getIdx();
+  // int myCol = getColor();
+  int myRank = getRank(); 
+  assert(nat(root) < size());
+
+  // auto &myMsg = _newMessages.at(myIdx); 
+
+  auto sendTo = 0; 
+  auto receiveFrom = std::vector<int>();
+
+  for( auto offset = 1u ;
+       ( myRank % offset) == 0u && offset < size()  ;
+       offset *= 2 )
+    {
+      if( (myRank % ( offset * 2 ) ) == 0 )
+	{
+	  // receive downwards 
+	  auto hisRank = myRank+offset; 
+	  
+	  if( size() <= hisRank )
+	    continue;
+
+	  receiveFrom.push_back(hisRank); 
+
+	}
+      else 
+	{
+	  // send upwards 
+	  sendTo = myRank - offset; 
+	}
+    }
+
+  
+  // first receive everything 
+  while(not receiveFrom.empty())
+    {
+      // auto iter = receiveFrom
+      auto iter = begin(receiveFrom); 
+      while( iter != end(receiveFrom) )
+	{
+	  auto hisRank = *iter; 
+	  auto hisIdx = getIdx(getColor(), hisRank);
+	  auto &hisMsg = _newMessages.at(hisIdx);
+
+	  bool gotMsg  = false; 
+	  auto msg = std::vector<T>{}; 
+	  std::tie(gotMsg, msg) = hisMsg[myRank].consume<T>(myRank); // must be the real rank to avoid confusion 
+	  
+	  if(gotMsg)
+	    {
+	      fun(data, begin(msg), end(msg)); 
+	      iter = receiveFrom.erase(iter); 
+	    }
+	  else 
+	    ++iter; 
+	}
+    }
+
+  // then send 
+  _newMessages[myIdx][sendTo].produce(data);
+
+  return data; 
+}
+
+
+
+template<typename T>
+std::vector<T> LocalComm::commTreeUp(std::vector<T> data, int root, DATA_COMBINE_FUN fun)
+{
+  // opmitized for the case that the root is rank 0; TODO implement
+  // that more generally
+  assert(root == 0); 
+
+  int myIdx = getIdx();
+  // int myCol = getColor();
+  int myRank = getRank(); 
+  assert(root < int(size()));
+
+  auto &myMsg = _newMessages.at(myIdx); 
+
+  for( int offset = 1 ;
+       ( myRank % offset) == 0 && offset < int(size())  ;
+       offset *= 2 )
+    {
+      if( (myRank % ( offset * 2 ) ) == 0 )
+	{
+	  // receive downwards 
+	  auto hisRank = myRank+offset; 
+	  
+	  if( int(size()) <= hisRank )
+	    continue;
+
+	  auto hisIdx = getIdx(getColor(), hisRank);
+	  auto &hisMsg = _newMessages.at(hisIdx);
+
+	  bool gotMsg  = false; 
+	  auto msg = std::vector<T>{}; 
+	  while(not gotMsg)
+	    std::tie(gotMsg, msg) = hisMsg[myRank].consume<T>(myRank); // must be the real rank to avoid confusion 
+
+	  fun(data, begin(msg), end(msg)); 
+	}
+      else 
+	{
+	  // send upwards 
+	  auto hisRank = myRank - offset; 
+	  auto readers = std::vector<int>(size(),0); 
+	  readers[hisRank] = 1 ; 
+
+	  myMsg[hisRank].produce(data); 
+	}
+    }
+
+  return data; 
+}
diff --git a/src/comm/LocalSwap.cpp b/src/comm/LocalSwap.cpp
new file mode 100644
index 0000000..78895a3
--- /dev/null
+++ b/src/comm/LocalSwap.cpp
@@ -0,0 +1,63 @@
+#include "LocalSwap.hpp"
+#include "ParallelSetup.hpp"
+
+
+std::vector<char> LocalSwap::getRemoteData() const 
+{
+  assert(_haveReceived); 
+  return _dataReceived; 
+}
+
+ 
+bool LocalSwap:: isFinished()  
+{
+  // a normal pending swap has to wait here, until the remote
+  // processes have consumed his array. this does not apply here
+  return true; 
+}
+  
+bool LocalSwap::allHaveReceived(ParallelSetup& pl) 
+{
+  // auto runid = pl.getRunComm().getLocalComm().getColor();
+  auto myId = _swap.getMyId(pl,_runid); 
+  auto remoteId = _swap.getRemoteId(pl,_runid);
+
+  auto tag = cantorPair(remoteId, myId); // NOTE: inverse of initialize 
+  assert(tag < pl.getMaxTag()); 
+
+  auto &localComm = pl.getChainComm().getLocalComm(); 
+  auto runBatch = pl.getRunComm().getLocalComm().getColor();  
+  
+  if(not _haveReceived)
+    {
+      auto wasThere = false; 
+      std::tie(wasThere, _dataReceived) = localComm.readAsyncMessage<char>( int(tag), runBatch ); 
+      if(wasThere)
+	_haveReceived = true; 
+    }
+  
+  auto tmp = std::vector<int>{  _haveReceived ? 1 : 0   };
+  tmp = localComm.allReduce(tmp); 
+  
+  return tmp[0] == int(localComm.size()); 
+}
+
+ 
+void LocalSwap::initialize(ParallelSetup& pl, std::vector<char> myChainSer, nat runid)  
+{
+  _plPtr = &pl; 
+  _runid = runid; 
+  // post a message, that should be read by all threads belonging to
+  // the other chain
+  
+  auto runBatch = pl.getRunComm().getLocalComm().getColor();  
+
+  auto myId = _swap.getMyId(pl,runid); 
+  auto remoteId = _swap.getRemoteId(pl, runid); 
+  auto tag = cantorPair(myId, remoteId); 
+  assert(tag < pl.getMaxTag()); 
+
+  if(pl.isChainLeader())
+    pl.getChainComm().getLocalComm().postAsyncMessage( myChainSer,  int(tag), runBatch );
+
+} 
diff --git a/src/comm/LocalSwap.hpp b/src/comm/LocalSwap.hpp
new file mode 100644
index 0000000..0974122
--- /dev/null
+++ b/src/comm/LocalSwap.hpp
@@ -0,0 +1,38 @@
+#ifndef _LOCAL_SWAP_HPP
+#define _LOCAL_SWAP_HPP
+
+#include "AbstractPendingSwap.hpp" 
+
+#include <iostream>
+
+
+class LocalSwap :  public AbstractPendingSwap
+{
+public: 
+  LocalSwap( SwapElem elem )
+    : AbstractPendingSwap(elem)
+    , _plPtr{nullptr}
+    , _haveReceived(false)
+    , _dataReceived{}
+    , _runid{0}
+  { }
+
+  LocalSwap(const LocalSwap& rhs) = default ; 
+  LocalSwap& operator=(const LocalSwap &rhs) ; 
+    
+
+  virtual std::vector<char> getRemoteData()  const ; 
+  virtual bool isFinished()  ;   
+  virtual bool allHaveReceived(ParallelSetup& pl)   ; 
+  virtual void initialize(ParallelSetup& pl, std::vector<char> myChainSer, nat runid)  ; 
+
+private: 
+  // slight hack, because i was too lazy to change the signatures...  
+  ParallelSetup* _plPtr; 
+  
+  bool _haveReceived; 
+  std::vector<char> _dataReceived; 
+  nat _runid; 
+}; 
+
+#endif
diff --git a/src/comm/ParallelSetup.cpp b/src/comm/ParallelSetup.cpp
new file mode 100644
index 0000000..4dad2cb
--- /dev/null
+++ b/src/comm/ParallelSetup.cpp
@@ -0,0 +1,601 @@
+#include <iostream> 
+#include <sstream>
+
+#include "GlobalVariables.hpp"
+#include "SwapMatrix.hpp"
+#include "SampleMaster.hpp"
+#include "IncompleteMesh.hpp"
+#include "ParallelSetup.hpp"
+#include "common.h"
+
+ParallelSetup::ParallelSetup(CommandLine& cl)
+  : _threadResource(cl, this)
+  , _globalComm(_threadResource.getTid2Ranking())
+  , _runComm(_threadResource.getTid2Ranking())
+  , _chainComm(_threadResource.getTid2Ranking())
+  , _mesh(_globalComm.size(), cl.getNumRunParallel(), cl.getNumChainsParallel())
+{  
+}
+
+
+ParallelSetup& ParallelSetup::operator=(ParallelSetup rhs)
+{
+  // std::cout << "assigning ParallelSetup " << std::endl; 
+  swap(*this, rhs); 
+  return *this; 
+}
+
+
+void swap(ParallelSetup &lhs, ParallelSetup &rhs)
+{
+  using std::swap; 
+  swap(lhs._runComm, rhs._runComm); 
+  swap(lhs._chainComm, rhs._chainComm);; 
+  swap(lhs._mesh, rhs._mesh); 
+  swap(lhs._globalComm, rhs._globalComm); 
+  swap(lhs._threadResource, rhs._threadResource); 
+}
+
+
+void ParallelSetup::initializeRemoteComm(int argc, char **argv)
+{
+  RemoteComm::initComm(argc, argv);
+}
+
+
+
+void ParallelSetup::warn()  
+{
+  auto numWorkers = _globalComm.size() ;
+
+  if(  numWorkers <  _mesh.getRunDimSize() * _mesh.getChainDimSize()    )
+    {
+      if( _globalComm.getRank() == 0)
+	std::cout << "\nError: You attempted to run " << _mesh.getRunDimSize() << " runs in parallel for which " <<  _mesh.getChainDimSize() <<  " coupled chains should be run in parallel. This requires at least " << (_mesh.getRunDimSize() * _mesh.getChainDimSize() ) << " processes (in the best case a multiple of this number). " << PROGRAM_NAME << " was started with " << _globalComm.size() << " processes though.\n" <<  std::endl; 
+      exitFunction(-1, true);
+    }
+
+  if(  numWorkers % ( _mesh.getRunDimSize() * _mesh.getChainDimSize()) != 0 ) 
+    {
+      if(_globalComm.getRank() == 0 )
+	std::cout << "\tWARNING! The number of processes and number chains run in parallel\n"
+		  << "\tare not a multiple of the overall nmuber of processes. Parts of the\n"
+		  << "\tcode may be executed less efficiently.\n" ; 
+    }
+  
+}
+
+
+
+void ParallelSetup::initialize( )
+{
+  warn();
+  assert(_globalComm.isValid()); 
+
+  auto coords = _mesh.getCoordinates(_globalComm.getRank());
+
+  // sanity check 
+  auto rank = _mesh.getRankFromCoordinates(coords);
+  assert(int(rank) == _globalComm.getRank()); 
+
+  // create runComm 
+  auto ranks = std::vector<int>{}; 
+  auto colors = std::vector<int>{}; 
+  for(int i = 0; i < _threadResource.getNumThreads(); ++i)
+    {
+      auto c = _mesh.getCoordinates(_globalComm.getRank() + i ); 
+      ranks.push_back(getRankInRun(c)); 
+      colors.push_back(c[0]) ; 
+    }
+  _runComm = _globalComm.split(colors, ranks); 
+  assert(_runComm.isValid()); 
+  
+
+  // create chainComm 
+  ranks = std::vector<int>{}; 
+  colors = std::vector<int>{};
+  for(int i = 0; i < _threadResource.getNumThreads(); ++i)
+    {
+      auto c = _mesh.getCoordinates(_globalComm.getRank() + i); 
+      colors.push_back(getColorInChain(c)); 
+      ranks.push_back(c[2]); 
+    }
+  _chainComm = _runComm.split(colors, ranks); 
+  assert(_chainComm.isValid());
+
+
+  if(_threadResource.getNumThreads() > 1 && not _globalComm.haveThreadSupport())
+    {
+      if(isYggdrasil)
+	{
+	  if(isGlobalMaster())
+	    std::cout << "You instructed " << PROGRAM_NAME << " to use threads. However, " << PROGRAM_NAME << " has not been compiled with thread support. Most likely, you do not have pthreads installed. Most likely, you still can use this executable without threads (i.e., without -T x). "  << std::endl; 
+	  exitFunction(1, true);
+	}
+      else 
+	{
+	  if(isGlobalMaster() )
+	    std::cout << "You instructed " << PROGRAM_NAME << " to use threads. However either " << PROGRAM_NAME << " has not been compiled with thread support (e.g., because the pthreads is not installed) or your MPI implementation does not support multi-threading." << std::endl; 
+	  exitFunction(1, true); 
+	}
+    }
+}
+
+
+void ParallelSetup::releaseThreads()
+{
+  _threadResource.releaseThreads();
+}
+
+
+std::string ParallelSetup::printLoadBalance(const TreeAln& traln, nat numRun, nat numCoupled )  
+{
+  auto &&ss = std::stringstream{};
+  ss << SOME_FIXED_PRECISION; 
+  if(isGlobalMaster())
+    ss <<  "load distribution (rank,coords,#numParts,#numPatterns,chainsPerRun):"  << std::endl;
+  
+  nat sumA = 0;   
+  nat sumB = 0; 
+  for(nat i = 0; i < traln.getNumberOfPartitions(); ++i)
+    {
+      auto& partition = traln.getPartition(i); 
+      if(partition.getWidth() > 0)
+	++sumA; 
+      sumB += partition.getWidth(); 
+    }
+
+  auto coords = _mesh.getCoordinates(_globalComm.getRank());
+
+  ss << "[ " << _globalComm.getRank() << " ] " ; 
+  ss  <<  "\t["   <<  coords[0] << "," << coords[1] << "," << coords[2] << "]\t" << sumA << "\t" << sumB << "\t"; 
+
+  bool isFirst = true; 
+  for(nat i = 0; i < numRun; ++i )
+    {
+      if(not isMyRun(i))
+	continue; 
+      for(nat j = 0; j < numCoupled; ++j)
+	{
+	  if(not isMyChain(i,j))
+	    continue; 
+	  ss << (not isFirst ? "," : "") << "("<< i << "," << j << ")" ; 
+	  isFirst = false; 
+	}
+    }
+  ss << std::endl; 
+  
+  if(sumA == 0)
+    {
+      ss << std::endl << "WARNING: there is a process that does not evaluate any portion of the\n"
+	 << "data. You could decrease the number of processes."  << std::endl; 
+    }
+  
+
+  auto str = ss.str();
+  auto myData =  std::vector<char>(begin(str), end(str));
+  auto allData = _globalComm.gatherVariableLength(myData); 
+  
+  auto result = std::string(begin(allData), end(allData)); 
+  result += "\n" ; 
+  
+  return result; 
+}
+
+
+
+
+std::tuple<nat,std::vector<char> > 
+ParallelSetup::serializeAllChains(std::vector<CoupledChains> &runs, CommFlag commFlags) const
+{
+  auto serialized = std::vector<char>{}; 
+  // serializing all chains that are assigned to me  
+  int lengthOfChainStream = 0; 
+  bool isFirst = true ; 
+  for(auto &run : runs)
+    {
+      for(nat i = 0; i < run.getChains().size() ;++i)
+	{
+	  const Chain& chain = run.getChains()[i]; 
+	  if(isMyChain(run.getRunid(), i))
+	    {
+	      auto &&ss = std::ostringstream{}; 
+	      chain.serializeConditionally( ss, commFlags ); 
+	      auto chainSer =  ss.str();
+
+	      if(isFirst)
+		lengthOfChainStream = int(chainSer.size()); 
+	      isFirst = false; 
+	      assert(nat(lengthOfChainStream) == chainSer.size()); 
+
+	      serialized.insert(end(serialized), begin(chainSer), end(chainSer)); 
+	    }
+	}
+    }
+
+  // TODO 
+  assert(not isFirst); 
+
+  return std::make_tuple(lengthOfChainStream,serialized); 
+}
+
+
+std::tuple<nat, std::vector<char> > 
+ParallelSetup::serializeSwapMatrices(std::vector<CoupledChains>& runs, CommFlag &commFlags ) const 
+{
+  auto serialized = std::vector<char>{};
+  int lengthOfSwap = 0;   
+  if( ( commFlags & CommFlag::SWAP ) != CommFlag::NOTHING )
+    {
+      bool isFirst = true; 
+      for(auto &run : runs)
+	{
+	  if(isMyRun(run.getRunid()))
+	    {
+	      auto && part = std::stringstream{}; 
+	      run.getSwapInfo().serialize(part); 
+
+	      auto asString = part.str();
+	      
+	      if(isFirst)
+		lengthOfSwap = int(asString.size());
+	      
+	      isFirst = false; 
+	      assert(lengthOfSwap == int(asString.size())); 
+	      serialized.insert(end(serialized), begin(asString), end(asString)); 
+	    }
+	}
+      assert(not isFirst); 
+    }
+
+  return std::make_tuple(lengthOfSwap, serialized);
+}
+
+
+// TODO i guess we communicate the swap matrix mutliple times, this could be saved
+void ParallelSetup::synchronizeChainsAtMaster( std::vector<CoupledChains>& runs, CommFlag commFlags) 
+{
+#if 0   
+  ss << "Communicating " ; 
+  if( ( commFlags & CommFlag::Swap ) != CommFlag::NOTHING)
+    ss << " SWAP, " ; 
+  if( ( commFlags & CommFlag::PrintStat )  != CommFlag::NOTHING)
+    ss << " PRINTSTAT, "; 
+  if( ( commFlags & CommFlag::Tree ) != CommFlag::NOTHING)
+    ss << " TREE, "; 
+  if( ( commFlags & CommFlag::Proposals ) != CommFlag::NOTHING)
+    ss << " PROPOSALS, "; 
+  ss << std::endl; 
+  blockingPrint(chainLeaderComm, ss.str()); 
+  ss.str(""); 
+#endif
+
+  // everybody serializes their data 
+  auto myData = std::vector<char>{}; 
+  auto lengthOfChainStream = 0; 
+  std::tie(lengthOfChainStream, myData) = serializeAllChains(runs, commFlags); 
+  
+  nat lengthOfSwap = 0; 
+  auto swapSer = std::vector<char>{}; 
+  std::tie(lengthOfSwap, swapSer) = serializeSwapMatrices(runs, commFlags); 
+  myData.insert(end(myData), begin(swapSer), end(swapSer)); 
+
+  // only leaders communicate 
+  auto countsPerProc = std::vector<int>(_globalComm.size() , 0 );
+  auto displPerProc = std::vector<int>(_globalComm.size() , 0 ); 
+  for(auto i = 0u; i< _globalComm.size() ; ++i)
+    {
+      auto coords = _mesh.getCoordinates(i); 
+      if(coords[2] == 0 )
+	countsPerProc[i] = int(myData.size()); 
+
+      if(i != 0 )
+	displPerProc[i] = displPerProc[i-1] + countsPerProc[i]; 
+    }
+
+  auto allData = _globalComm.gatherVariableKnownLength( countsPerProc[_globalComm.getRank()] == 0 ? std::vector<char>{} : myData , countsPerProc, displPerProc );
+  auto streamIter = begin(allData); 
+
+  // everybody deserializes 
+  if(isGlobalMaster())
+    {
+      auto ranksofLeaders = std::vector<nat> {}; 
+      for(int i = 0; i < int( _globalComm.size()); ++i)
+	{
+	  auto coords =  _mesh.getCoordinates(i);
+	  if(coords[2] == 0) 
+	    ranksofLeaders.push_back(i); 
+	}
+
+      // accumulate swap matrices 
+      auto sws = std::vector<SwapMatrix>{}; 
+      for(nat i = 0; i < runs.size() ;++i)
+	sws.emplace_back(runs[0].getChains().size());
+
+      for(auto rankOfChainLeader : ranksofLeaders)
+	{
+	  for(auto &run : runs)
+	    {
+	      for(nat i = 0; i < run.getChains().size(); ++i)
+		{		  
+		  if(isMyChain(rankOfChainLeader, run.getRunid(), i))
+		    {		      
+		      auto &chain = run.getChains().at(i);
+		      auto &&iss =  std::istringstream{std::string(streamIter, streamIter + lengthOfChainStream )}; 
+		      streamIter += lengthOfChainStream; 
+		      chain.deserializeConditionally(iss, commFlags); 
+		    }
+		}
+	    }
+	  
+	  if( ( commFlags & CommFlag::SWAP ) != CommFlag::NOTHING )
+	    {
+	      for(auto &run : runs)
+		{
+		  if(isMyRun(rankOfChainLeader, run.getRunid()))
+		    { 
+		      auto&& iss = std::istringstream{std::string{streamIter, streamIter + lengthOfSwap}};
+		      streamIter += lengthOfSwap; 
+		      auto sw = SwapMatrix(run.getChains().size()); 
+		      sw.deserialize(iss); 
+
+		      // HACK: with more efficient communication, we
+		      // would need to do this only once
+
+		      if(isRunLeader(rankOfChainLeader))
+			sws[run.getRunid()] += sw ; 
+		    }
+		}
+	    }
+	}
+      
+      if( ( commFlags & CommFlag::SWAP )  != CommFlag::NOTHING)
+	{
+	  // set the accumulated swap matrices 
+	  for(auto &run : runs)
+	    run.setSwapInfo(sws.at(run.getRunid()));
+	}
+    }
+  else 
+    {
+      // for reproducibility. Otherwise runs are not reproducible any
+      // more with chain-level parallelism
+      if(  ( commFlags & CommFlag::TREE ) != CommFlag::NOTHING )
+      	{
+      	  for(auto &run : runs)
+      	    {
+      	      nat ctr = 0; 
+      	      for(auto &chain : run.getChains())
+      		{
+      		  if(isMyChain(run.getRunid(), ctr))
+      		    {
+      		      auto &&oss = std::ostringstream{};
+      		      chain.serializeConditionally(oss, commFlags );
+      		      auto &&iss = std::istringstream{oss.str()}; 
+      		      chain.deserializeConditionally(iss,  commFlags);
+      		    }
+      		  ++ctr;
+      		}
+      	    }
+      	}
+    }
+
+}
+
+
+void ParallelSetup::finalize()
+{
+  RemoteComm::finalize();
+}
+
+
+bool 
+ParallelSetup::isMyChain(nat gRank, nat runid, nat chainIndex) const 
+{
+  auto hisCoords= _mesh.getCoordinates(gRank);
+  return isMyRun(gRank, runid ) &&  ( chainIndex % getChainsParallel()) == hisCoords[1]; 
+}
+
+
+bool 
+ParallelSetup::isMyChain(nat runid, nat chainIndex) const 
+{
+  return isMyChain(_globalComm.getRank(), runid, chainIndex); 
+}
+
+
+bool 
+ParallelSetup::isMyRun(nat runid) const 
+{
+  return isMyRun(_globalComm.getRank(), runid);
+}
+
+bool 
+ParallelSetup::isMyRun(nat gRank, nat runid) const 
+{
+  auto hisCoords = _mesh.getCoordinates(gRank);
+  return (runid % getRunsParallel() )  == hisCoords[0]; 
+}
+
+
+std::string
+ParallelSetup::sendRecvChain(const CoupledChains& run, nat myIndex, nat otherChainIndex, std::string myChainSer, CommFlag flags )  
+{
+  assert(0); 
+}
+
+
+void ParallelSetup::blockingPrint( Communicator &comm,std::string ss )
+{
+  int myRank = comm.getRank();
+  auto size = comm.size(); 
+
+  // MEH 
+  if(size == 1 )
+    {
+      std::cout << "[ " << myRank << " ] " << ss << std::endl; 
+      std::cout.flush();
+      return; 
+    }
+
+  if(myRank != 0)
+    {
+      int res = comm.receive<int>(myRank-1,0);
+      assert(res == 1 ); 
+    }
+
+  std::cout << "[ " << myRank << " ] " << ss << std::endl; 
+  std::cout.flush();
+  
+  if(myRank != int(size - 1)) 
+    comm.send<int>(1, myRank + 1 , 0 ); 
+  else 
+    comm.send<int>(1,0,0 ); 
+    
+  if( myRank == 0  )
+    {
+      auto res =  comm.receive<int>(int(size-1),0);
+      assert(res == 1); 
+    }
+}
+
+
+bool ParallelSetup::isRunLeader(nat gRank) const 
+{  
+  auto coords = _mesh.getCoordinates(_globalComm.getRank());
+  return coords[1] == 0 && coords[2] == 0; 
+}  
+
+
+bool ParallelSetup::isChainLeader() const
+{
+  auto coords = _mesh.getCoordinates(_globalComm.getRank()); 
+  return coords[2] == 0; 
+}
+
+
+bool ParallelSetup::isGlobalMaster() const 
+{
+  auto coords = _mesh.getCoordinates(_globalComm.getRank()); 
+  return coords[0] == 0 
+    && coords[1] == 0
+    && coords[2] == 0; 
+}
+
+
+bool ParallelSetup::swapIsLocal(nat chainIdA, nat chainIdB, nat runId ) const 
+{
+  assert(chainIdA != chainIdB); 
+
+  auto rankA = chainIdToLeaderRank(runId, chainIdA);  
+  auto rankB = chainIdToLeaderRank(runId, chainIdB); 
+
+  auto remoteRankA =  _globalComm.mapToRemoteRank(rankA); 
+  auto remoteRankB =_globalComm.mapToRemoteRank(rankB);  
+
+  return remoteRankA ==  remoteRankB; 
+}
+
+
+nat ParallelSetup::chainIdToLeaderRank(nat runId, nat chainId) const  
+{
+  auto pBatch = nat(runId % _mesh.getRunDimSize()); 
+  auto cBatch = nat(chainId % _mesh.getChainDimSize ()); 
+  
+  auto coords = std::array<nat,3> {{ pBatch, cBatch, 0 }}; 
+  return _mesh.getRankFromCoordinates(coords);
+}
+
+
+int ParallelSetup::getRankInRun( std::array<nat,3> coords) const 
+{
+  auto localRootCoords = std::array<nat,3> { { coords[0], 0, 0  }}; 
+  return _mesh.getRankFromCoordinates(coords)  - _mesh.getRankFromCoordinates(localRootCoords); 
+} 
+
+
+int ParallelSetup::getColorInChain(std::array<nat,3> coords) const 
+{
+  return  int(coords[0] * _mesh.getChainDimSize() + coords[1]); 
+}
+
+std::array<nat,3> ParallelSetup::getMyCoordinates() const
+{
+  return _mesh.getCoordinates(_globalComm.getRank()); 
+}
+
+
+Communicator& ParallelSetup::getChainComm() 
+{ 
+  return _chainComm; 
+}
+
+
+Communicator& ParallelSetup::getGlobalComm() 
+{
+  return _globalComm; 
+}
+
+
+Communicator& ParallelSetup::getRunComm() 
+{
+  return _runComm; 
+}
+
+
+
+IncompleteMesh ParallelSetup::getMesh() const 
+{
+  return _mesh;
+}
+
+
+bool ParallelSetup::isRunLeader() const
+{
+  return isRunLeader( _globalComm.getRank() ) ; 
+}  
+
+
+size_t ParallelSetup::getChainsParallel() const 
+{
+  return _mesh.getChainDimSize(); 
+}
+
+
+size_t ParallelSetup::getRunsParallel() const
+{
+  return _mesh.getRunDimSize(); 
+}
+
+
+
+void ParallelSetup::abort(int code, bool waitForAll)
+{
+  Communicator::abort(code, waitForAll); 
+}
+
+
+
+std::ostream& operator<<(std::ostream& out, const ParallelSetup& rhs)
+{
+  out <<  "GLOB: " << rhs._globalComm
+      << "\nRUN: " << rhs._runComm
+      << "\nCHAIN: " << rhs._chainComm; 
+  return out; 
+}
+
+uint64_t ParallelSetup::getMaxTag()
+{
+  return RemoteComm::getMaxTag();
+}
+
+
+void ParallelSetup::pinThreads()
+{
+  // should also work for numThreads == 1, but let's not take the risk 
+  if(_threadResource.getNumThreads() > 1 )
+    {
+      auto procsPerNode = _globalComm.getProcsPerNode(); 
+      _threadResource.pinThreads(procsPerNode,_globalComm.getRemoteComm().getRank() ); 
+    }
+}
diff --git a/src/comm/ParallelSetup.hpp b/src/comm/ParallelSetup.hpp
new file mode 100644
index 0000000..a2a94a3
--- /dev/null
+++ b/src/comm/ParallelSetup.hpp
@@ -0,0 +1,144 @@
+#ifndef _PARALLEL_SETUP_PARA_HPP
+#define _PARALLEL_SETUP_PARA_HPP
+
+#include <unordered_map>
+#include "CommandLine.hpp"
+#include "IncompleteMesh.hpp"
+#include "FlagType.hpp" 
+#include "Communicator.hpp"
+
+#include "ThreadResource.hpp"
+
+#include "CommFlag.hpp"
+
+class CoupledChains; 
+
+// remember: the implementation of this class depends on whether we
+// have MPI. Do NOT implement anything here inline.
+
+class ParallelSetup
+{
+public: 
+  ParallelSetup(CommandLine& cl); 
+  ParallelSetup(ParallelSetup &&rhs) =default ; 
+  ParallelSetup(const ParallelSetup& rhs) = delete ; 
+  ParallelSetup& operator=( ParallelSetup rhs) ; 
+  friend void swap(ParallelSetup &lhs, ParallelSetup &rhs); 
+
+  void warn()  ; 
+
+  /** 
+      @brief initializes the examl environment  
+   */ 
+  void initialize(  ); 
+
+
+  static void initializeRemoteComm(int argc, char **argv); 
+  
+  /** 
+      @brief finalize the parallel environment 
+   */ 
+  static void finalize(); 
+  /** 
+      @brief gets the number of runs executed in parallel  
+   */ 
+  size_t getRunsParallel() const ; 
+  /** 
+      @brief gets the number of (coupled) chains executed in paralel (in addition to run-level parallelism)
+   */ 
+  size_t getChainsParallel() const ; 
+  /** 
+     @brief indicates whether the process should conduct output operatons (for his run) 
+   */ 
+  bool isRunLeader() const; 
+  bool isRunLeader(nat gRank) const ; 
+  /**
+     @brief indicates whether a process is the leader in a batch of chains 
+   */ 
+  bool isChainLeader() const; 
+  /** 
+      @brief indicates whether the process is the process to conduct global logging output
+   */ 
+  bool isGlobalMaster() const ; 
+  /** 
+      @brief sends a serialized chain representation to the other involved process  
+      @param run relevant run  
+      @param otherChainIndex the index of the chain that is involved in the swapping attempt   
+      @return serialized representation  of the chain we swap with 
+   */ 
+  std::string
+  sendRecvChain(const CoupledChains& run, nat myIndex, nat otherChainIndex  , std::string myChainSer, CommFlag flags )  ; 
+
+  nat chainIdToLeaderRank(nat runId, nat chainId) const ; 
+
+  /** 
+      @brief synchronize all core chain information at the master node // 
+      @notice this only concerns the global masterprocess in a
+      parallel environtment.  
+  */ 
+  void synchronizeChainsAtMaster( std::vector<CoupledChains>& runs, CommFlag commFlags) ;  
+
+  /** 
+      @brief a printing function that allows to print properly 
+   */ 
+  static void blockingPrint( Communicator &comm,std::string ss );  
+
+  std::string printLoadBalance(const TreeAln& traln, nat numRun, nat numCoupled )  ; 
+
+  /** 
+      @brief indicates whether the chain belongs to a process
+   */ 
+  bool isMyChain(nat runid, nat chainIndex) const ; 
+  bool isMyChain(nat gRank, nat runid, nat chainIndex )const;
+  /** 
+      @brief indicates whether the run belongs to a process
+   */   
+  bool isMyRun(nat runid) const ; 
+  bool isMyRun(nat gRank, nat runid) const; 
+
+  Communicator& getGlobalComm();
+  Communicator& getRunComm() ; 
+  Communicator& getChainComm(); 
+
+  friend std::ostream& operator<<(std::ostream& out, const ParallelSetup& rhs); 
+
+  IncompleteMesh getMesh() const; 
+  
+  int getRankInRun( std::array<nat,3> coords) const ; 
+
+  std::array<nat,3> getMyCoordinates() const; 
+
+  static void abort(int code, bool waitForAll);
+
+  void releaseThreads(); 
+
+  /** 
+   * @brief determines, whether the swap can be executed within a
+   * local communicator only
+   */ 
+  bool swapIsLocal(nat chainIdA, nat chainIdB, nat runId ) const ; 
+  
+  uint64_t getMaxTag(); 
+
+  void pinThreads(); 
+
+private: 			// METHODS
+  auto serializeAllChains(std::vector<CoupledChains> &runs, CommFlag commFlags) const
+    -> std::tuple<nat,std::vector<char>> ; 
+  auto serializeSwapMatrices(std::vector<CoupledChains>& runs, CommFlag &commFlags ) const 
+    -> std::tuple<nat, std::vector<char>> ; 
+  
+  int getColorInChain(std::array<nat,3> coords) const ; 
+
+private:   			// ATTRIBUTES
+  ThreadResource _threadResource; 
+
+  Communicator _globalComm; 
+  Communicator _runComm; 
+  Communicator _chainComm; 
+
+  IncompleteMesh _mesh; 
+}; 
+
+
+#endif
diff --git a/src/comm/PendingSwap.cpp b/src/comm/PendingSwap.cpp
new file mode 100644
index 0000000..0b135ee
--- /dev/null
+++ b/src/comm/PendingSwap.cpp
@@ -0,0 +1,70 @@
+#include <memory>
+
+#include "PendingSwap.hpp"
+
+#include "ParallelSetup.hpp"
+#include "SwapElem.hpp"
+
+#include "PendingSwapImpl.hpp"
+
+#include "extensions.hpp"
+
+#include "LocalSwap.hpp"
+
+using namespace std;
+
+PendingSwap::PendingSwap( SwapElem swap, bool isLocal )
+  : _impl{nullptr}
+{
+  if(isLocal)
+    _impl = make_unique<LocalSwap>(swap) ;
+  else 
+    _impl = make_unique<PendingSwap::Impl>(swap); 
+}
+
+PendingSwap::~PendingSwap()
+{
+}
+
+
+PendingSwap::PendingSwap(PendingSwap&& rhs)
+  : _impl(std::move(rhs._impl))
+{
+  rhs._impl = nullptr; 
+}
+
+
+std::vector<char> PendingSwap::getRemoteData() const  
+{
+  return _impl->getRemoteData(); 
+} 
+
+
+void PendingSwap::initialize(ParallelSetup& pl, std::vector<char> myChainSer, nat runid) 
+{
+  _impl->initialize(pl, myChainSer, runid);
+}
+
+
+bool PendingSwap::allHaveReceived(ParallelSetup& pl)  
+{
+  return _impl->allHaveReceived(pl); 
+}
+
+
+bool PendingSwap::isFinished()  
+{
+  return _impl->isFinished();
+}
+
+
+SwapElem PendingSwap::getSwap() const 
+{
+  return _impl->getSwap();
+}
+
+
+void swap(PendingSwap& lhs, PendingSwap& rhs)
+{
+  std::swap(lhs._impl, rhs._impl);
+}
diff --git a/src/comm/PendingSwap.hpp b/src/comm/PendingSwap.hpp
new file mode 100644
index 0000000..b1c1392
--- /dev/null
+++ b/src/comm/PendingSwap.hpp
@@ -0,0 +1,54 @@
+#ifndef _UNFINISHED_SWAP
+#define _UNFINISHED_SWAP
+
+#include <cassert>
+#include <vector>
+#include <memory>
+
+/** 
+    @file PendingSwap.hpp
+
+    @brief represents a swap for which in the parallel case have not received the other chain yet
+
+    This class has no meaning in non-MPI-versions. 
+*/ 
+
+
+#include "common.h"
+
+class ParallelSetup; 
+class SwapElem; 
+
+class AbstractPendingSwap; 
+
+class PendingSwap
+{
+public: 
+  class Impl; 			// since we have an abstract variant, this does not really fit anymore 
+
+  PendingSwap( SwapElem swap, bool isLocal); 
+  PendingSwap(PendingSwap&& rhs)     ;
+  PendingSwap& operator=( const PendingSwap& elem)   = delete; 
+  PendingSwap( const PendingSwap& rhs) = delete; 
+  ~PendingSwap();
+  
+  friend void swap(PendingSwap& lhs, PendingSwap& rhs); 
+  
+  bool isFinished();
+
+  void initialize(ParallelSetup& pl, std::vector<char> myChainSer, nat runid); 
+  SwapElem getSwap() const ; 
+
+  bool allHaveReceived(ParallelSetup& pl) ;
+
+  std::vector<char> getRemoteData()  const; 
+  
+private: 			// METHODS 
+  int createTag( nat numChains ) const ; 
+
+private: 			// ATTRIBUTES
+  std::unique_ptr<AbstractPendingSwap> _impl; 
+}; 
+
+#endif
+
diff --git a/src/comm/RemoteComm.cpp b/src/comm/RemoteComm.cpp
new file mode 100644
index 0000000..fb8e303
--- /dev/null
+++ b/src/comm/RemoteComm.cpp
@@ -0,0 +1,207 @@
+#include "RemoteComm.hpp"
+#include "extensions.hpp"
+
+#include "RemoteCommImpl.hpp"
+#include "CommRequest.hpp"
+
+using namespace std;
+
+RemoteComm::RemoteComm()
+  : _impl{make_unique<RemoteComm::Impl>()}
+{
+}
+
+RemoteComm::RemoteComm(const RemoteComm &rhs)   
+  : _impl(new RemoteComm::Impl(* rhs._impl))
+{
+} 
+
+
+
+RemoteComm::RemoteComm( RemoteComm &&rhs) 
+  :_impl(std::move(rhs._impl))
+{
+}
+
+RemoteComm& RemoteComm::operator=( RemoteComm rhs)
+{
+  swap(rhs,*this); 
+  return *this; 
+} 
+
+
+void swap(RemoteComm &lhs, RemoteComm& rhs)
+{
+  std::swap(rhs._impl, lhs._impl); 
+} 
+
+RemoteComm::~RemoteComm()
+{
+}
+
+
+void RemoteComm::waitAtBarrier() const
+{
+  _impl->waitAtBarrier();
+} 
+
+int RemoteComm::getRank() const 
+{
+  return _impl->getRank();
+}
+ 
+size_t RemoteComm::size() const  
+{
+  return _impl->size(); 
+}
+
+
+bool RemoteComm::isValid() const
+{
+  return _impl->isValid(); 
+} 
+
+
+
+template<typename T> 
+std::vector<T> RemoteComm::broadcast(std::vector<T> array, int root) 
+{
+  return _impl->broadcast(array, root);
+} 
+template auto RemoteComm::broadcast(std::vector<int> array, int root)  -> std::vector<int>; 
+template auto RemoteComm::broadcast(std::vector<unsigned int> array, int root)  -> std::vector<unsigned int>; 
+// template auto RemoteComm::broadcast(std::vector<unsigned long> array, int root)  -> std::vector<unsigned long>; 
+
+
+template<typename T> 
+T RemoteComm::broadcastVar(T elem  , int root) 
+{
+  return _impl->broadcastVar(elem, root); 
+} 
+template uint64_t RemoteComm::broadcastVar(uint64_t var, int root) ; 
+template uint32_t RemoteComm::broadcastVar(uint32_t var, int root) ; 
+// template bool RemoteComm::broadcastVar(bool var, int root) ; 
+
+template<typename T> 
+std::vector<T> RemoteComm::gather(std::vector<T> myData, nat root) 
+{
+  return _impl->gather(myData, root);
+}
+template std::vector<char> RemoteComm::gather(std::vector<char> myData, nat root) ; 
+template std::vector<int> RemoteComm::gather(std::vector<int> myData, nat root) ; 
+
+
+template<typename T> 
+std::vector<T> RemoteComm::gatherVariableLength(std::vector<T> myData, int root)  
+{
+  return _impl->gatherVariableLength(myData,root); 
+} 
+template std::vector<char> RemoteComm::gatherVariableLength(std::vector<char> myData, int root)  ; 
+  
+template<typename T> 
+T RemoteComm::receive( int source, int tag )
+{
+  return _impl->receive<T>(source, tag) ; 
+}
+template int RemoteComm::receive(int source , int tag); 
+ 
+template<typename T> 
+void RemoteComm::send( T elem, int dest, int tag ) 
+{
+  return _impl->send(elem, dest, tag); 
+} 
+template void RemoteComm::send( int elem, int dest, int tag ) ; 
+
+
+
+template<typename T> std::vector<T> RemoteComm::allReduce( std::vector<T> myValues)
+{
+  return _impl->allReduce(myValues); 
+} 
+template std::vector<double> RemoteComm::allReduce( std::vector<double> myValues); 
+template std::vector<uint32_t> RemoteComm::allReduce( std::vector<uint32_t> myValues); 
+template std::vector<uint8_t> RemoteComm::allReduce( std::vector<uint8_t> myValues); 
+
+
+
+
+
+template<typename T> 
+auto RemoteComm::scatterVariableKnownLength( std::vector<T> allData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc, int root)  
+  -> std::vector<T>
+{
+  return _impl->scatterVariableKnownLength(allData, countsPerProc, displPerProc, root);
+} 
+template auto RemoteComm::scatterVariableKnownLength( std::vector<int> allData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc, int root)  -> std::vector<int>; 
+template auto RemoteComm::scatterVariableKnownLength( std::vector<uint32_t> allData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc, int root)  -> std::vector<uint32_t>; 
+template auto RemoteComm::scatterVariableKnownLength( std::vector<uint16_t> allData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc, int root)  -> std::vector<uint16_t >; 
+template auto RemoteComm::scatterVariableKnownLength( std::vector<uint8_t> allData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc, int root)  -> std::vector<uint8_t >; 
+
+
+RemoteComm RemoteComm::split(const std::vector<int> &color, const std::vector<int> &rank) const 
+{
+  auto result = RemoteComm();
+  *result._impl = _impl->split(color, rank); 
+  return result; 
+} 
+
+
+void RemoteComm::createSendRequest(std::vector<char> array, int dest, int tag, CommRequest& req)
+{
+  _impl->createSendRequest(array, dest, tag, req); 
+}
+
+void RemoteComm::createRecvRequest(int src, int tag, nat length, CommRequest& req)
+{
+  _impl->createRecvRequest(src,tag, length, req); 
+}
+
+nat RemoteComm::getNumberOfPhysicalNodes()   
+{
+  return _impl->getNumberOfPhysicalNodes();
+} 
+
+
+void RemoteComm::finalize()
+{
+  RemoteComm::Impl::finalize();
+}
+  
+void RemoteComm::initComm(int argc, char **argv)
+{
+  RemoteComm::Impl::initComm(argc, argv);
+}
+
+
+uint64_t RemoteComm::getMaxTag() 
+{
+  return  RemoteComm::Impl::_maxTagValue;
+}
+
+void RemoteComm::abort(int code, bool waitForAll)
+{
+  RemoteComm::Impl::abort(code, waitForAll); 
+} 
+
+
+template<typename T>
+auto RemoteComm::gatherVariableKnownLength(std::vector<T> myData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc , int root) 
+  -> std::vector<T>
+{
+  return _impl->gatherVariableKnownLength(myData, countsPerProc, displPerProc, root);
+}
+
+
+template auto RemoteComm::gatherVariableKnownLength(std::vector<char> myData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc , int root) -> std::vector<char>; 
+
+
+void RemoteComm::waitAtBarrier()
+{
+  _impl->waitAtBarrier();
+}
+
+
+bool RemoteComm::haveThreadSupport() const 
+{
+  return _impl->haveThreadSupport();
+}
diff --git a/src/comm/RemoteComm.hpp b/src/comm/RemoteComm.hpp
new file mode 100644
index 0000000..edb7e7d
--- /dev/null
+++ b/src/comm/RemoteComm.hpp
@@ -0,0 +1,48 @@
+#ifndef _REMOTE_COMM_HPP
+#define _REMOTE_COMM_HPP
+
+#include <vector>
+#include <memory>
+
+#include <iostream>
+
+#include "common.h"
+
+class CommRequest; 
+
+class RemoteComm
+{
+public: 
+  class Impl; 			// CLASS declaration!
+  typedef RemoteComm SELF ; 
+
+  RemoteComm() ; 
+  RemoteComm(const RemoteComm &rhs)   ; 
+  RemoteComm( RemoteComm &&rhs)  ; 
+  ~RemoteComm();
+  RemoteComm& operator=( RemoteComm rhs); 
+  friend void swap(RemoteComm &lhs, RemoteComm& rhs); 
+
+  #include "CommCore.hpp"
+
+  void waitAtBarrier() const; 
+
+  void createSendRequest(std::vector<char> array, int dest, int tag, CommRequest& req); 
+  void createRecvRequest(int src, int tag, nat length, CommRequest& req); 
+
+  friend std::ostream& operator<<(std::ostream& out, const RemoteComm& rhs)
+  {
+    return out << "R-" << rhs.getRank()  << "/" << rhs.size() ; 
+  }
+  
+  nat getNumberOfPhysicalNodes() ; 
+  int getOffsetForThreadPin() ; 
+
+  static uint64_t getMaxTag() ; 
+  
+private:
+  std::unique_ptr<RemoteComm::Impl> _impl; 
+}; 
+
+
+#endif
diff --git a/src/comm/SwapElem.cpp b/src/comm/SwapElem.cpp
new file mode 100644
index 0000000..fcdea26
--- /dev/null
+++ b/src/comm/SwapElem.cpp
@@ -0,0 +1,75 @@
+#include "SwapElem.hpp"
+
+#include "ParallelSetup.hpp"
+
+SwapElem::SwapElem(nat gen, nat idA, nat idB, double r)
+    : _gen(gen)
+    , _idA(idA)
+    , _idB(idB)
+    , _r(r)
+{
+}
+
+
+bool SwapElem::affectsChain(nat id ) const
+{
+  return _idA == id || _idB == id; 
+}
+
+nat SwapElem::getGen() const {return _gen; }
+nat SwapElem::getOne() const {return _idA; }
+nat SwapElem::getOther() const {return _idB; }
+double SwapElem::getR()const {return _r; }
+
+
+nat SwapElem::getMyId(ParallelSetup& pl, nat runid) const 
+{
+  assert(not pl.isMyChain(runid, _idA) != not pl.isMyChain(runid, _idB)); 
+  if(pl.isMyChain(runid, _idA))
+    return _idA; 
+  else 
+    return _idB; 
+}
+
+nat SwapElem::getRemoteId(ParallelSetup& pl, nat runid) const 
+{
+  nat mine = getMyId(pl,runid); 
+  if(mine == _idA)
+    return _idB; 
+  else 
+    return _idA; 
+}
+
+bool operator==(const SwapElem &elemA, const SwapElem &elemB ) 
+{
+  // really?
+#pragma GCC diagnostic ignored "-Wfloat-equal"
+
+  bool isEqual = true; 
+  isEqual &=    (elemA._idA ==  elemB._idA && elemA._idB ==  elemB._idB)
+    || (elemA._idA ==  elemB._idB && elemA._idA ==  elemB._idB); 
+  isEqual &= elemA._gen == elemB._gen; 
+  isEqual &= elemA._r == elemB._r; 
+  return isEqual; 
+}
+  
+std::ostream& operator<<(std::ostream& out, const SwapElem &elem)
+{
+  out << "gen=" << elem._gen << " " <<  elem._idA << "<->"  <<  elem._idB  <<  " " << elem._r; 
+  return out; 
+}
+
+
+
+bool SwapElem::onlyOneIsMine(ParallelSetup& pl, nat runid) const 
+{
+  auto oneIsMine = ( not pl.isMyChain(runid, _idA) ) != ( not  pl.isMyChain(runid,_idB)) ; 
+  return oneIsMine; 
+}
+ 
+
+
+bool SwapElem::bothAreMine(ParallelSetup& pl, nat runid) const 
+{
+  return  pl.isMyChain(runid, _idA) && pl.isMyChain(runid,_idB); 
+}
diff --git a/src/comm/SwapElem.hpp b/src/comm/SwapElem.hpp
new file mode 100644
index 0000000..fe45173
--- /dev/null
+++ b/src/comm/SwapElem.hpp
@@ -0,0 +1,38 @@
+#ifndef _SWAP_ELEM
+#define _SWAP_ELEM
+
+#include <iosfwd>
+#include "common.h" 
+
+
+class ParallelSetup; 
+
+
+class SwapElem
+{
+public: 
+  SwapElem(nat gen, nat idA, nat idB, double r); 
+
+  nat getGen() const;
+  bool affectsChain(nat id ) const; 
+  nat getOne() const ;
+  nat getOther() const ; 
+  double getR()const ;
+
+  nat getMyId(ParallelSetup& pl, nat runid) const ; 
+  nat getRemoteId(ParallelSetup& pl, nat runid) const ; 
+  
+  bool onlyOneIsMine(ParallelSetup& pl, nat runid) const ; 
+  bool bothAreMine(ParallelSetup& pl, nat runid) const ; 
+
+  friend bool operator==(const SwapElem &elemA, const SwapElem &elemB ) ; 
+  friend std::ostream& operator<<(std::ostream& out, const SwapElem &elem); 
+  
+private:
+  nat _gen; 
+  nat _idA; 
+  nat _idB; 
+  double _r; 
+}; 
+
+#endif
diff --git a/src/comm/dummy/CommMethods.hpp b/src/comm/dummy/CommMethods.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/src/comm/dummy/CommRequestImpl.cpp b/src/comm/dummy/CommRequestImpl.cpp
new file mode 100644
index 0000000..e0718f3
--- /dev/null
+++ b/src/comm/dummy/CommRequestImpl.cpp
@@ -0,0 +1,25 @@
+#include "CommRequestImpl.hpp"
+
+#include "extensions.hpp"
+
+CommRequest::Impl::Impl(std::vector<char> array)
+  : _array{}
+{
+}
+
+
+CommRequest::Impl::~Impl()
+{
+} 
+
+
+bool CommRequest::Impl::isServed()
+{
+  return true; 
+} 
+
+
+std::vector<char> CommRequest::Impl::getArray() const
+{
+  return _array; 
+} 
diff --git a/src/comm/dummy/CommRequestImpl.hpp b/src/comm/dummy/CommRequestImpl.hpp
new file mode 100644
index 0000000..cd052fa
--- /dev/null
+++ b/src/comm/dummy/CommRequestImpl.hpp
@@ -0,0 +1,21 @@
+#ifndef _COMM_REQUEST_IMPL_SEQ_HPP
+#define _COMM_REQUEST_IMPL_SEQ_HPP
+
+#include <vector>
+
+#include "CommRequest.hpp"
+
+class CommRequest::Impl
+{
+public: 
+  Impl(std::vector<char> array); 
+  ~Impl(); 
+  std::vector<char> getArray() const; 
+  bool isServed(); 
+
+private: 
+  std::vector<char> _array; 
+} ; 
+
+
+#endif
diff --git a/src/comm/dummy/PendingSwapImpl.cpp b/src/comm/dummy/PendingSwapImpl.cpp
new file mode 100644
index 0000000..3a89e9b
--- /dev/null
+++ b/src/comm/dummy/PendingSwapImpl.cpp
@@ -0,0 +1,30 @@
+#include "PendingSwapImpl.hpp"
+
+#include <string>
+#include "SwapElem.hpp"
+#include "ParallelSetup.hpp"
+
+PendingSwap::Impl::Impl(SwapElem elem)
+  : AbstractPendingSwap(elem)
+{
+}
+
+std::vector<char> PendingSwap::Impl::getRemoteData() const 
+{
+  assert(0) ;
+  return std::vector<char>{}; 
+}
+  
+void PendingSwap::Impl::initialize(ParallelSetup& pl, std::vector<char> myChainSer, nat runid)
+{
+}
+
+bool PendingSwap::Impl::allHaveReceived(ParallelSetup& pl)  
+{
+  return true; 
+} 
+
+bool PendingSwap::Impl::isFinished()  
+{
+  return true; 
+}   
diff --git a/src/comm/dummy/PendingSwapImpl.hpp b/src/comm/dummy/PendingSwapImpl.hpp
new file mode 100644
index 0000000..e9db95f
--- /dev/null
+++ b/src/comm/dummy/PendingSwapImpl.hpp
@@ -0,0 +1,23 @@
+#ifndef _PENDING_SWAP_IMPL_HPP
+#define _PENDING_SWAP_IMPL_HPP
+
+class ParallelSetup; 
+
+#include <string>
+#include <vector>
+
+#include "AbstractPendingSwap.hpp"
+
+class PendingSwap::Impl : public AbstractPendingSwap
+{
+public: 
+  Impl(SwapElem elem); 
+  virtual ~Impl(){}
+  std::vector<char> getRemoteData() const ; 
+  void initialize(ParallelSetup& pl, std::vector<char> myChainSer, nat runid); 
+  bool allHaveReceived(ParallelSetup& pl)  ; 
+  bool isFinished()  ; 
+}; 
+
+
+#endif
diff --git a/src/comm/dummy/RemoteCommImpl.cpp b/src/comm/dummy/RemoteCommImpl.cpp
new file mode 100644
index 0000000..66e1302
--- /dev/null
+++ b/src/comm/dummy/RemoteCommImpl.cpp
@@ -0,0 +1,81 @@
+#include "RemoteCommImpl.hpp"
+
+
+#include "CommRequest.hpp"
+#include <cstdint>
+#include <limits>
+#include <cassert>
+
+RemoteComm::Impl& RemoteComm::Impl::operator=( Impl rhs)
+{
+  swap(*this, rhs); 
+  return *this;
+} 
+
+uint64_t RemoteComm::Impl::_maxTagValue = std::numeric_limits<int>::max();
+
+
+RemoteComm::Impl RemoteComm::Impl::split(const std::vector<int> &color, const std::vector<int> &rank)  const
+{
+  auto result = RemoteComm::Impl() ; 
+  return result; 
+} 
+
+
+void  RemoteComm::Impl::createSendRequest(std::vector<char> array, int dest, int tag, CommRequest& req)
+{
+}
+ 
+
+void RemoteComm::Impl::createRecvRequest(int src, int tag, nat length, CommRequest& req)
+{
+}  
+
+
+nat RemoteComm::Impl::getNumberOfPhysicalNodes() 
+{
+  return 1; 
+} 
+
+
+void RemoteComm::Impl::initComm(int argc, char **argv)
+{
+  
+} 
+
+
+void RemoteComm::Impl::finalize()
+{
+  
+} 
+
+
+void RemoteComm::Impl::abort(int code, bool waitForAll)
+{
+  exit(code); 
+} 
+
+
+
+template<> bool RemoteComm::Impl::broadcastVar(bool var, int root)  
+{
+  char elem = var ? 1 : 0; 
+  auto res = broadcastVar(elem, root); 
+  return res == 1 ; 
+}
+
+
+int RemoteComm::Impl::getRank() const   {return 0 ; } 
+size_t RemoteComm::Impl::size() const {return 1u; }  
+bool RemoteComm::Impl::isValid() const  {return true; }   
+
+
+void RemoteComm::Impl::waitAtBarrier()
+{
+}
+
+
+bool RemoteComm::Impl::haveThreadSupport() const 
+{
+  return true; 
+}
diff --git a/src/comm/dummy/RemoteCommImpl.hpp b/src/comm/dummy/RemoteCommImpl.hpp
new file mode 100644
index 0000000..26b9c1f
--- /dev/null
+++ b/src/comm/dummy/RemoteCommImpl.hpp
@@ -0,0 +1,50 @@
+#ifndef _REMOTE_COMM_IMPL_SEQ_HPP
+#define _REMOTE_COMM_IMPL_SEQ_HPP
+
+#include <vector>
+
+#include "common.h"
+
+class CommRequest; 
+
+#include "RemoteComm.hpp"
+#include "CommCoreNew.hpp"
+
+class RemoteComm::Impl
+{
+  typedef Impl SELF; 
+
+public: 
+  Impl()
+    : dummy{0}
+  {}  
+  Impl(const Impl& rhs)
+    : dummy{rhs.dummy}
+  {}
+
+  Impl& operator=( Impl rhs); 
+  friend void swap(Impl &lhs, Impl& rhs)
+  {
+    std::swap(lhs.dummy, rhs.dummy); 
+  }; 
+
+  ~Impl(){}; 
+
+  void createSendRequest(std::vector<char> array, int dest, int tag, CommRequest& req);
+  void createRecvRequest(int src, int tag, nat length, CommRequest& req);  
+
+  void waitAtBarrier() const {} 
+
+#include "CommCore.hpp"
+
+  nat getNumberOfPhysicalNodes();
+  static uint64_t _maxTagValue; 
+
+private: 
+  nat dummy; 
+}; 
+
+#include "comm/dummy/RemoteCommImpl.tpp"
+
+
+#endif
diff --git a/src/comm/dummy/RemoteCommImpl.tpp b/src/comm/dummy/RemoteCommImpl.tpp
new file mode 100644
index 0000000..9ecaca0
--- /dev/null
+++ b/src/comm/dummy/RemoteCommImpl.tpp
@@ -0,0 +1,58 @@
+#include <cassert>
+
+template<typename T>
+T RemoteComm::Impl::receive( int source, int tag ) 
+{
+  assert(0); 
+  return 0; 
+} 
+
+
+template<typename T> 
+void RemoteComm::Impl::send( T elem, int dest, int tag ) 
+{
+  assert(0);    
+}
+
+
+template<typename T>
+std::vector<T> RemoteComm::Impl::gather(std::vector<T> myData, nat root) 
+{
+  return myData; 
+} 
+
+template<typename T> std::vector<T> RemoteComm::Impl::gatherVariableLength(std::vector<T> myData, int root)  
+{
+  return myData; 
+} 
+
+
+template<typename T> std::vector<T>  RemoteComm::Impl::scatterVariableKnownLength( std::vector<T> allData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc, int root) 
+{
+  return allData; 
+} 
+
+template<typename T> T RemoteComm::Impl::broadcastVar(T var, int root)  
+{
+  return var; 
+} 
+
+
+template<typename T> std::vector<T> RemoteComm::Impl::allReduce( std::vector<T> myValues)
+{
+  return myValues; 
+}
+
+template<typename T> 
+auto RemoteComm::Impl::broadcast(std::vector<T> array, int root) 
+  -> std::vector<T> 
+{
+  return array; 
+} 
+
+template<typename T>
+auto RemoteComm::Impl::gatherVariableKnownLength(std::vector<T> myData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc , int root) 
+  -> std::vector<T>
+{
+  return myData; 
+}
diff --git a/src/comm/mpi/CommRequestImpl.cpp b/src/comm/mpi/CommRequestImpl.cpp
new file mode 100644
index 0000000..7d02cbc
--- /dev/null
+++ b/src/comm/mpi/CommRequestImpl.cpp
@@ -0,0 +1,31 @@
+#include "CommRequestImpl.hpp"
+
+#include  <cassert>
+
+#include "extensions.hpp"
+
+CommRequest::Impl::Impl( std::vector<char> array)
+  : _req{MPI_Request{}}
+  ,  _array(array)
+{
+}
+
+
+CommRequest::Impl::~Impl()
+{
+  // MPI_Request_free(&_req); 
+} 
+
+
+std::vector<char> CommRequest::Impl::getArray() const 
+{
+  return _array; 
+}
+
+
+bool CommRequest::Impl::isServed() const 
+{
+  int flag = 0; 
+  MPI_Test(&_req, &flag, MPI_STATUS_IGNORE);
+  return flag != 0 ; 
+}
diff --git a/src/comm/mpi/CommRequestImpl.hpp b/src/comm/mpi/CommRequestImpl.hpp
new file mode 100644
index 0000000..847cbd7
--- /dev/null
+++ b/src/comm/mpi/CommRequestImpl.hpp
@@ -0,0 +1,33 @@
+#ifndef _COMM_REQUEST_IMPL_SEQ_HPP
+#define _COMM_REQUEST_IMPL_SEQ_HPP
+
+#include <vector>
+#include <memory>
+
+#include "MpiType.hpp"
+
+#include "RemoteComm.hpp"
+
+#include "CommRequest.hpp"
+
+class CommRequest::Impl
+{
+  friend class RemoteComm; 
+  friend class RemoteComm::Impl; 
+
+public: 
+  Impl(std::vector<char> array );
+  Impl(Impl&& rhs) = delete; 
+  Impl(const Impl& rhs) = delete; 
+  Impl& operator=(const Impl& rhs) = delete; 
+  ~Impl(); 
+  std::vector<char> getArray() const; 
+  bool isServed() const ; 
+
+private: 
+  mutable MPI_Request _req; 
+  std::vector<char> _array; 
+} ; 
+
+
+#endif
diff --git a/src/comm/mpi/MpiType.cpp b/src/comm/mpi/MpiType.cpp
new file mode 100644
index 0000000..db8ae0a
--- /dev/null
+++ b/src/comm/mpi/MpiType.cpp
@@ -0,0 +1,50 @@
+#include "common.h"
+
+#include "MpiType.hpp"
+#include <cstdint>
+
+
+#ifndef MPI_UINT8_T 
+#define MPI_UINT8_T MPI_UNSIGNED_CHAR
+#endif
+#ifndef MPI_UINT16_T
+#define MPI_UINT16_T MPI_UNSIGNED_SHORT
+#endif
+#ifndef MPI_UINT32_T
+#define MPI_UINT32_T MPI_UNSIGNED
+#endif
+#ifndef MPI_UINT64_T
+#define MPI_UINT64_T MPI_UNSIGNED_LONG
+#endif
+
+#ifndef MPI_INT8_T 
+#define MPI_INT8_T MPI_CHAR
+#endif
+#ifndef MPI_INT16_T
+#define MPI_INT16_T MPI_SHORT
+#endif
+#ifndef MPI_INT32_T
+#define MPI_INT32_T MPI_INTEGER
+#endif
+#ifndef MPI_INT64_T
+#define MPI_INT64_T MPI_LONG
+#endif
+
+
+template<> MPI_Datatype mpiType<double>::value = MPI_DOUBLE; 
+// template<> MPI_Datatype mpiType<unsigned long long>::value = MPI_UNSIGNED_LONG; 
+template<> MPI_Datatype mpiType<char>::value = MPI_CHAR; 
+
+template<> MPI_Datatype mpiType<uint8_t>::value = MPI_UINT8_T; 
+template<> MPI_Datatype mpiType<uint16_t>::value = MPI_UINT16_T; 
+template<> MPI_Datatype mpiType<uint32_t>::value = MPI_UINT32_T; 
+template<> MPI_Datatype mpiType<uint64_t>::value = MPI_UINT64_T; 
+
+template<> MPI_Datatype mpiType<int8_t>::value = MPI_INT8_T; 
+template<> MPI_Datatype mpiType<int16_t>::value = MPI_INT16_T; 
+template<> MPI_Datatype mpiType<int32_t>::value = MPI_INT32_T; 
+template<> MPI_Datatype mpiType<int64_t>::value = MPI_INT64_T; 
+
+// unused 
+template<> MPI_Op mpiOp<MPI_OP_TYPE::SUM>::value = MPI_SUM; 
+template<>MPI_Op mpiOp<MPI_OP_TYPE::LAND>::value = MPI_LAND; 
diff --git a/src/comm/mpi/MpiType.hpp b/src/comm/mpi/MpiType.hpp
new file mode 100644
index 0000000..10d46d7
--- /dev/null
+++ b/src/comm/mpi/MpiType.hpp
@@ -0,0 +1,33 @@
+#ifndef _MY_123_MPI_TYPE_HPP
+#define _MY_123_MPI_TYPE_HPP
+
+#pragma GCC system_header
+#include <mpi.h>
+
+template<typename T>  
+struct mpiType 
+{
+  static MPI_Datatype value ;
+}; 
+
+
+enum class MPI_OP_TYPE : int 
+{
+  SUM = 1 , 
+    LAND = 2 
+} ; 
+
+
+template<MPI_OP_TYPE op>
+struct mpiOp
+{
+  static MPI_Op value; 
+}; 
+
+#endif
+
+
+
+
+
+
diff --git a/src/comm/mpi/PendingSwapImpl.cpp b/src/comm/mpi/PendingSwapImpl.cpp
new file mode 100644
index 0000000..f0fe277
--- /dev/null
+++ b/src/comm/mpi/PendingSwapImpl.cpp
@@ -0,0 +1,100 @@
+#include "PendingSwapImpl.hpp" 
+
+#include "ParallelSetup.hpp"
+
+PendingSwap::Impl::Impl(SwapElem elem)
+  : AbstractPendingSwap(elem)
+  , _sentReqs{}
+  , _recvReq{ CommRequest{} }
+  {
+  }
+
+
+std::vector<char> PendingSwap::Impl::getRemoteData()  const 
+{
+  assert(_recvReq.isServed()); 
+  return _recvReq.getArray(); 
+}
+
+
+uint64_t PendingSwap::Impl::createTag( int rank ) const 
+{
+  auto chainA = uint64_t(_swap.getOne()); 
+  auto chainB = uint64_t(_swap.getOther()); 
+  auto result = cantorPair(uint64_t(rank), cantorPair(chainA,chainB)); 
+  return result; 
+}
+
+
+void PendingSwap::Impl::initialize(ParallelSetup& pl, std::vector<char> myChainSer, nat runid) 
+{
+  auto tag = createTag( pl.getChainComm().getRank() ); 
+  // std::cout << SyncOut() << SHOW(tag) << std::endl; 
+  assert(tag < pl.getMaxTag()); 
+
+  auto myId = _swap.getMyId(pl,runid); 
+  auto remoteId = _swap.getRemoteId(pl,runid);
+
+  auto ourRunBatch = runid % pl.getRunsParallel();
+  auto myBatch = myId % pl.getChainsParallel();
+  auto  remoteBatch = remoteId % pl.getChainsParallel(); 
+  
+  auto numInMyBatch = pl.getMesh().getNumRanksInDim(nat(ourRunBatch), nat(myBatch)); 
+  auto numInRemoteBatch = pl.getMesh().getNumRanksInDim(nat(ourRunBatch), nat(remoteBatch)); 
+
+  auto myCoords = pl.getMyCoordinates(); 
+
+  // determine from who i receive 
+  // auto srcRankInRun =  ; 
+  auto remRank =  pl.getRunComm().mapToRemoteRank( pl.getRankInRun( { {nat(ourRunBatch), nat(remoteBatch), nat(myCoords[2] % numInRemoteBatch) }  } )); 
+
+  nat myRankInRun =  pl.getRankInRun( myCoords ); 
+
+  assert( int(myRankInRun) == pl.getRunComm().getRank() ); 
+
+  pl.getRunComm().createRecvRequest(int(remRank), int(tag), nat(myChainSer.size()), _recvReq);
+
+  // send stuff 
+  for(nat i = 0 ; i < numInRemoteBatch; ++i)
+    {
+      if( i % numInMyBatch == myCoords[2])
+	{
+	  auto hisRemoteRank = pl.getRunComm().mapToRemoteRank( pl.getRankInRun( {{ nat(ourRunBatch), nat(remoteBatch), nat(i) } })); 
+	  
+	  _sentReqs.push_back(  CommRequest()  );
+	  auto &&elem = _sentReqs.back();
+	  pl.getRunComm().createSendRequest(myChainSer, hisRemoteRank, nat(tag) , elem); 
+	}
+    }
+}
+
+
+bool PendingSwap::Impl::allHaveReceived(ParallelSetup& pl)  
+{
+  bool hasReceived = _recvReq.isServed();   
+
+  //  boolean operators would be nicer, but not every mpi
+  // implementation offers these
+
+  nat toReduce = hasReceived ? 1 : 0 ; 
+  auto arr = std::vector<nat>{toReduce};
+  arr = pl.getChainComm().allReduce(arr); 
+
+  toReduce = arr.at(0); 
+    
+  // std::cout << SyncOut()  << pl.getGlobalComm().getRank() << " received by "<< toReduce << std::endl; 
+
+  return toReduce == nat(pl.getChainComm().size()); 
+}
+
+
+
+bool PendingSwap::Impl::isFinished()  
+{
+  auto result = _recvReq.isServed ();
+  for(auto &elem : _sentReqs)
+    result &= elem.isServed();
+  return result; 
+}
+
+
diff --git a/src/comm/mpi/PendingSwapImpl.hpp b/src/comm/mpi/PendingSwapImpl.hpp
new file mode 100644
index 0000000..1065b94
--- /dev/null
+++ b/src/comm/mpi/PendingSwapImpl.hpp
@@ -0,0 +1,27 @@
+#ifndef _PENDING_SWAP_IMPL_HPP
+#define _PENDING_SWAP_IMPL_HPP
+
+#include <vector>
+
+#include "AbstractPendingSwap.hpp"
+
+class PendingSwap::Impl : public AbstractPendingSwap
+{
+public: 
+  Impl(SwapElem elem); 
+
+  std::vector<char> getRemoteData() const ; 
+  bool isFinished()  ;   
+  bool allHaveReceived(ParallelSetup& pl)  ; 
+  void initialize(ParallelSetup& pl, std::vector<char> myChainSer, nat runid) ; 
+
+private: 
+  uint64_t createTag( int rank ) const ; 
+
+private: 
+  std::vector<CommRequest> _sentReqs; 
+  CommRequest _recvReq; 
+}; 
+
+
+#endif
diff --git a/src/comm/mpi/RemoteCommImpl.cpp b/src/comm/mpi/RemoteCommImpl.cpp
new file mode 100644
index 0000000..5b61ddb
--- /dev/null
+++ b/src/comm/mpi/RemoteCommImpl.cpp
@@ -0,0 +1,216 @@
+#include "RemoteCommImpl.hpp"
+
+#include <set>
+
+#include "CommRequest.hpp"
+#include "CommRequestImpl.hpp"
+#include "GlobalVariables.hpp"
+#include "RemoteComm.hpp"
+
+uint64_t RemoteComm::Impl::_maxTagValue = 0 ; 
+
+RemoteComm::Impl::Impl(const RemoteComm::Impl& rhs)
+  : _comm{MPI_COMM_WORLD}
+{
+  MPI_Comm_dup(rhs._comm, &_comm); 
+}
+
+RemoteComm::Impl& RemoteComm::Impl::operator=( RemoteComm::Impl rhs)
+{
+  swap(*this, rhs);
+  return *this; 
+}
+  
+void swap(RemoteComm::Impl &lhs, RemoteComm::Impl& rhs)
+{
+  std::swap(lhs._comm, rhs._comm);
+}
+
+
+RemoteComm::Impl::~Impl()
+{
+  MPI_Comm_free(&_comm);
+}
+
+
+int RemoteComm::Impl::getRank() const 
+{
+  int result = 0; 
+  MPI_Comm_rank(_comm, &result);
+  return result; 
+}
+
+
+size_t RemoteComm::Impl::size() const 
+{
+  int result = 0; 
+  MPI_Comm_size(_comm, &result); 
+  return size_t(result); 
+}
+
+  
+bool RemoteComm::Impl::isValid() const
+{
+  return _comm != MPI_COMM_NULL; 
+}
+
+
+void RemoteComm::Impl::waitAtBarrier() const
+{
+  MPI_Barrier(_comm);
+} 
+
+
+RemoteComm::Impl RemoteComm::Impl::split(const std::vector<int> &color, const std::vector<int> &rank) const
+{
+  auto result = RemoteComm::Impl{}; 
+  MPI_Comm_split(_comm, color[0], rank[0], &result._comm);
+  return result; 
+}
+
+
+template<> bool RemoteComm::Impl::broadcastVar(bool var, int root)  
+{
+  char elem = var ? 1 : 0; 
+  auto res = broadcastVar(elem, root); 
+  return res == 1 ; 
+}
+
+
+template<typename T>
+T RemoteComm::Impl::broadcastVar(T var, int root)  
+{
+  MPI_Bcast(&var, 1, mpiType<T>::value, root, _comm); 
+  return var;  
+}
+template uint64_t RemoteComm::Impl::broadcastVar(uint64_t var, int root) ; 
+template uint32_t RemoteComm::Impl::broadcastVar(uint32_t var, int root) ; 
+
+
+void RemoteComm::Impl::createSendRequest(std::vector<char> array, int dest, int tag, CommRequest& req)
+{
+  // using friendship here. I have barely an idea, how to do this properly...  
+  auto &impl = *(req._impl);
+  impl._array = array; 
+  assert(impl._array.size() != 0 ) ;
+  MPI_Isend(  (void*)impl._array.data(), int(impl._array.size()), MPI_CHAR, dest, tag, _comm, &(impl._req)); 
+}
+
+ 
+void RemoteComm::Impl::createRecvRequest(int src, int tag, nat length, CommRequest &req )
+{
+  auto &impl = *(req._impl);
+  impl._array = std::vector<char>(length); 
+  assert(impl._array.size() != 0 ) ;
+  MPI_Irecv( impl._array.data(), int(impl._array.size()), MPI_CHAR, src, tag, _comm, &impl._req); 
+}  
+
+
+nat RemoteComm::Impl::getNumberOfPhysicalNodes()   
+{
+  auto result = 0u;  
+  auto name = std::vector<char>(MPI_MAX_PROCESSOR_NAME, '\0'); 
+  auto len = 0; 
+  auto root = 0; 
+
+  MPI_Get_processor_name(name.data(), &len);
+  
+  // std::cout << SHOW(name) << std::endl; 
+  
+  auto everything = gather(name, root); 
+  
+  // std::cout << SHOW(everything) << std::endl; 
+  
+  if( getRank() == 0 )
+    {
+      auto uniqStr = std::unordered_set<std::string>{}; 
+      for(auto i = 0; i < int(size()) ; ++i)
+	uniqStr.insert(std::string(begin(everything) + (i * MPI_MAX_PROCESSOR_NAME), begin(everything) + ((i+1) * MPI_MAX_PROCESSOR_NAME) )); 
+      result = nat(uniqStr.size()); 
+    }
+  
+  result = broadcastVar(result, root); 
+
+  return result; 
+}
+
+
+void RemoteComm::Impl::initComm(int argc, char **argv )
+{
+  int provided = 0; 
+  int numThreads= -1; 
+  for(int i = 0 ; i < argc ; ++i)
+    {
+      if(std::string(argv[i]).compare("-T") == 0 && i + 1 < argc  )
+	numThreads = std::stoi(std::string{argv[i+1]}); 
+    }
+
+  if(numThreads > 1)
+    {
+      MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided); 
+      int rank = 0; 
+      MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
+      if( provided != MPI_THREAD_MULTIPLE && rank == 0 )
+	{
+	  std::cout << "You called the mpi version of " << PROGRAM_NAME << " with threads (-T x).  However, the MPI implementation you installed\n" 
+		    << "does not support threads (MPI_THEAD_MULTIPLE to be exact). Please\n"
+		    << "choose a different MPI installation OR do not use threads in"
+		    << "combination with MPI OR configure and compile a MPI implementation\n"
+		    << "yourself." << std::endl ;
+	}
+      else if ( provided == MPI_THREAD_MULTIPLE && rank == 0)
+	{
+	  std::cout << "Initialized multi-threaded MPI environment" << std::endl; 
+	}
+    }
+  else 
+    {
+      MPI_Init(&argc, &argv); 
+    }
+
+  int flag = 0; 
+  MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_TAG_UB, &_maxTagValue, &flag);
+  assert(flag != 0 ); 
+}
+
+
+
+bool RemoteComm::Impl::haveThreadSupport()  const 
+{
+  int provided  = 0; 
+  MPI_Query_thread(&provided); 
+  return provided == MPI_THREAD_MULTIPLE ; 
+}
+
+
+
+
+void RemoteComm::Impl::finalize()
+{
+  MPI_Finalize();
+}
+
+
+void RemoteComm::Impl::abort(int code, bool waitForAll)
+{
+  if(_masterThread == std::this_thread::get_id())
+    {
+      if(waitForAll)
+	{
+	  MPI_Barrier(MPI_COMM_WORLD); 
+	  MPI_Finalize();
+	}
+      else 
+	{
+	  MPI_Abort(MPI_COMM_WORLD, code); 
+	}
+    }
+}
+
+
+void RemoteComm::Impl::waitAtBarrier()
+{
+  MPI_Barrier(_comm);
+}
+
+
diff --git a/src/comm/mpi/RemoteCommImpl.hpp b/src/comm/mpi/RemoteCommImpl.hpp
new file mode 100644
index 0000000..c949b5a
--- /dev/null
+++ b/src/comm/mpi/RemoteCommImpl.hpp
@@ -0,0 +1,48 @@
+#ifndef _REMTE_COMM_IMPL_PARA_HPP
+#define _REMTE_COMM_IMPL_PARA_HPP
+
+#include "MpiType.hpp"
+#include <vector>
+
+#include "common.h"
+
+class CommRequest; 
+
+#include "RemoteComm.hpp"
+
+class RemoteComm::Impl
+{
+public: 
+  typedef Impl SELF; 
+ 
+  Impl() 
+    : _comm{MPI_COMM_WORLD}
+  {
+    MPI_Comm_dup(MPI_COMM_WORLD, &_comm);
+  }
+ 
+  Impl(const Impl& rhs); 
+  Impl& operator=( Impl rhs); 
+  friend void swap(Impl &lhs, Impl& rhs); 
+  ~Impl(); 
+
+  void waitAtBarrier() const; 
+
+  #include "CommCore.hpp"
+
+  void createSendRequest(std::vector<char> array, int dest, int tag, CommRequest &req); 
+  void createRecvRequest(int src, int tag, nat length, CommRequest& req ); 
+
+  nat getNumberOfPhysicalNodes()  ; 
+
+  static uint64_t _maxTagValue; 
+private: 
+  MPI_Comm _comm; 
+  
+}; 
+
+
+#include "comm/mpi/RemoteCommImpl.tpp"
+
+
+#endif
diff --git a/src/comm/mpi/RemoteCommImpl.tpp b/src/comm/mpi/RemoteCommImpl.tpp
new file mode 100644
index 0000000..66443f3
--- /dev/null
+++ b/src/comm/mpi/RemoteCommImpl.tpp
@@ -0,0 +1,108 @@
+#include <algorithm>
+#include <numeric>
+#include <vector>
+
+#include "comm/mpi/MpiType.hpp"
+
+template<typename T>
+std::vector<T> RemoteComm::Impl::gather(std::vector<T> myData, nat root) 
+{
+  auto result = std::vector<T>{};  
+  nat totalLength = nat(size() * myData.size()); 
+  result.resize(totalLength); 
+
+  MPI_Gather( myData.data(), int(myData.size()), mpiType<T>::value, result.data(), int(myData.size()), mpiType<T>::value, root, _comm);
+
+  return result; 
+}
+
+
+// could also return vector<vector<T>>...however, functionality not needed right now 
+template<typename T> 
+std::vector<T> RemoteComm::Impl::gatherVariableLength(std::vector<T> myData, int root)  
+{
+  // determine lengths 
+  auto lengths = std::vector<nat>{}; 
+  auto myLen = std::vector<int>();	
+  myLen.push_back(int(myData.size()));
+  auto allLengths = gather<int>( myLen, root );
+  
+  // calculate the displacements 
+  auto displ = std::vector<int>{}; 
+  displ.push_back(0);
+  for(nat i = 1; i < allLengths.size(); ++i)
+    displ.push_back(displ.back() + allLengths.at(i-1));
+
+  auto result = std::vector<T>{}; 
+  result.resize(std::accumulate(begin(allLengths), end(allLengths), 0));
+
+  MPI_Gatherv(myData.data(), int(myData.size()), mpiType<T>::value, result.data(), allLengths.data(), displ.data(), mpiType<T>::value, root, _comm);
+  
+  return result; 
+} 
+
+
+template<typename T>
+std::vector<T>
+RemoteComm::Impl::gatherVariableKnownLength(std::vector<T> myData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc , int root) 
+{
+  auto myRank = getRank(); 
+  auto result = std::vector<T>();
+
+  if( myRank == root )
+    result.resize(std::accumulate(begin(countsPerProc), end(countsPerProc), 0),0);
+  
+  MPI_Gatherv(myData.data(), int(myData.size()),  mpiType<T>::value, result.data(), countsPerProc.data(), displPerProc.data(),mpiType<T>::value,
+	      root, _comm); 
+
+  return result; 
+}
+
+
+
+template<typename T> 
+std::vector<T>  
+RemoteComm::Impl::scatterVariableKnownLength( std::vector<T> allData, std::vector<int> &countsPerProc, std::vector<int> &displPerProc, int root) 
+{
+  auto result = std::vector<T>{}; 
+  auto myRank = getRank() ; 
+
+  result.resize(countsPerProc.at(myRank)); 
+
+  MPI_Scatterv(myRank == root ? allData.data() : NULL, 
+	       countsPerProc.data(), displPerProc.data(), mpiType<T>::value, 
+	       result.data(), countsPerProc.at(myRank), mpiType<T>::value, 
+	       root, _comm);
+  return result; 
+} 
+
+template<typename T>
+std::vector<T> RemoteComm::Impl::broadcast(std::vector<T> array, int root)  
+{
+  MPI_Bcast(array.data(), int(array.size()), mpiType<T>::value, root, _comm); 
+  return array; 
+}
+
+template<typename T>
+std::vector<T> RemoteComm::Impl::allReduce( std::vector<T> myValues)
+{
+  MPI_Allreduce(MPI_IN_PLACE, myValues.data(), int(myValues.size()), mpiType<T>::value, MPI_SUM, _comm); 
+  return myValues; 
+}
+
+template<typename T> 
+T RemoteComm::Impl::receive( int source, int tag ) 
+{
+  auto result = T{}; 
+  MPI_Recv(&result,1, mpiType<T>::value, source, tag, _comm, MPI_STATUS_IGNORE);
+  return result; 
+}
+
+template<typename T> 
+void RemoteComm::Impl::send( T elem, int dest, int tag ) 
+{
+  MPI_Send(&elem,1, mpiType<T>::value, dest, tag, _comm);
+}
+
+
+
diff --git a/src/comm/threads/MessageQueue.cpp b/src/comm/threads/MessageQueue.cpp
new file mode 100644
index 0000000..5192717
--- /dev/null
+++ b/src/comm/threads/MessageQueue.cpp
@@ -0,0 +1,94 @@
+#include "MessageQueue.hpp"
+#include "GlobalVariables.hpp" 
+#include <algorithm>
+#include <numeric>
+
+using std::move; 
+
+
+MessageQueue::MessageQueue(int numThreads)
+  : _first( new Node(std::vector<uint8_t>(), std::vector<int>() ))
+  , _divider(_first)
+  , _last{_first}
+  , _consumerLock(false)
+  , _numThreads(numThreads)
+{
+}
+
+
+
+MessageQueue& MessageQueue::operator=(MessageQueue rhs) 
+{
+  swap(rhs, *this); 
+  return *this; 
+}
+
+
+void swap(MessageQueue& lhs, MessageQueue& rhs)
+{
+  using std::swap; 
+
+  swap(lhs._first, rhs._first); 
+  swap(lhs._numThreads, rhs._numThreads); 
+
+  rhs._divider = lhs._divider.exchange(rhs._divider); 
+  rhs._last = lhs._last.exchange(rhs._last) ; 
+  rhs._consumerLock = lhs._consumerLock.exchange(rhs._consumerLock); 
+} 
+
+
+
+MessageQueue::MessageQueue( MessageQueue&& rhs)  
+  : _first(std::move(rhs._first))
+  , _divider(rhs._divider.load())
+  , _last(rhs._last.load())
+  , _consumerLock(false)
+  , _numThreads(std::move(rhs._numThreads))
+{
+  rhs._divider = nullptr; 
+  rhs._last = nullptr; 
+  rhs._first = nullptr;
+}
+
+
+MessageQueue::MessageQueue(const MessageQueue& rhs)  
+  : _first(new Node(std::vector<uint8_t>(), std::vector<int>()))
+  , _divider(_first)
+  , _last(_first)
+  , _consumerLock(false)
+  , _numThreads(rhs._numThreads)
+{
+} 
+
+
+MessageQueue::~MessageQueue()
+{
+  while(_first != nullptr)
+    {
+      auto tmp = _first; 
+      _first = tmp->_next; 
+      delete tmp; 
+    }
+}
+
+ 
+MessageQueue::Node::Node(std::vector<byte> msg, std::vector<int> whoReads )
+  : _message(msg)
+  , _numConsume(std::accumulate(begin(whoReads), end(whoReads),0))
+  , _next(nullptr)
+  , _whoReads(whoReads)
+{
+}
+
+
+auto  MessageQueue::Node::getConsumed(int threadId)
+  -> std::tuple<int, std::vector<byte> >
+{
+  // assert(_hasRead.at(threadId) == 0);
+  assert(_whoReads.at(threadId) > 0 ); 
+  --_whoReads[threadId]; 
+    // _hasRead.at(threadId) = 1;
+  auto result = --_numConsume;
+  assert(result >= 0 ); 
+  return std::make_tuple(result, _message);
+}
diff --git a/src/comm/threads/MessageQueue.hpp b/src/comm/threads/MessageQueue.hpp
new file mode 100644
index 0000000..06e3c46
--- /dev/null
+++ b/src/comm/threads/MessageQueue.hpp
@@ -0,0 +1,74 @@
+#ifndef _LOCK_FREE_QUEUE_HPP
+#define _LOCK_FREE_QUEUE_HPP
+
+
+/** 
+    Notice: this data structure is not truely lock-free...
+
+    because of false-sharing, this structure may even be faster, if
+    multiple messages are produced (one per consumer)
+
+    it is a modified version of 
+    http://www.drdobbs.com/parallel/writing-a-generalized-concurrent-queue/211601363?pgno=4
+    that mostly avoids some copies 
+ */ 
+
+
+
+
+#include <vector>
+#include <limits>
+#include <atomic>
+
+
+typedef uint8_t byte;  
+
+class  MessageQueue 
+{
+  class Node; 
+
+public: 
+  explicit MessageQueue(int numThreads); 
+  MessageQueue(const MessageQueue& rhs)  ; 
+  MessageQueue( MessageQueue&& rhs)   ; 
+  MessageQueue& operator=(MessageQueue rhs); 
+  friend void swap(MessageQueue& lhs, MessageQueue& rhs); 
+  ~MessageQueue(); 
+  
+  template<typename T>
+  void produce(std::vector<T> msg, const std::vector<int> &forWhom); 
+  template<typename T>
+  std::tuple<bool,std::vector<T> >  consume(int myId); 
+
+  
+private: 
+  Node* _first;			// producer only 
+  std::atomic<Node*> _divider; 	// shared 
+  std::atomic<Node*> _last; 	// shared 
+  std::atomic<bool> _consumerLock; 
+  int _numThreads; 
+}; 
+
+class MessageQueue::Node 
+{
+public: 
+  // METHODS
+  Node(std::vector<byte> msg, std::vector<int> whoReads ); 
+  
+  Node(const Node &node) = default; 
+  Node& operator=(const Node &rhs) = default; 
+
+  std::tuple<int, std::vector<byte> > getConsumed(int threadId); 
+
+  // ATTRIBUTES
+  std::vector<byte> _message; 
+  std::atomic<int> _numConsume; 
+  Node *_next; 
+  std::vector<int>  _whoReads; 
+}; 
+
+
+#include "MessageQueue.tpp"
+
+
+#endif
diff --git a/src/comm/threads/MessageQueue.tpp b/src/comm/threads/MessageQueue.tpp
new file mode 100644
index 0000000..1b0991b
--- /dev/null
+++ b/src/comm/threads/MessageQueue.tpp
@@ -0,0 +1,71 @@
+#include "GlobalVariables.hpp"
+
+#include <algorithm>
+
+#include <cstring>
+#include <iostream>
+#include <cassert>
+
+using std::move;
+
+
+template<typename T>
+void MessageQueue::produce(std::vector<T> msg, const std::vector<int> &forWhom)
+{
+  auto tmpMsg = std::vector<byte>(reinterpret_cast<byte*>(msg.data()), reinterpret_cast<byte*>(msg.data() + msg.size())); 
+  
+  (*_last)._next = new Node(tmpMsg, forWhom); 
+  _last = (*_last)._next; 
+
+  while( _first != _divider )
+    {
+      Node *tmp = _first; 
+      _first = _first->_next; 
+      delete tmp; 
+    }
+}
+
+
+template<typename T>
+std::tuple<bool,std::vector<T> >  MessageQueue::consume(int threadId) 
+{
+  while(_consumerLock.exchange(true)) // LOCK
+    ; 
+  
+  Node* dIter = _divider; 
+  
+  auto result = std::vector<T>(); 
+
+  bool found = false; 
+  bool inFirst = true; 
+  while(dIter != _last)
+    {
+      if( dIter->_next->_whoReads.at(threadId) > 0 ) 
+	{
+	  auto num = 0; 
+	  auto msg =  std::vector<byte>();
+	  std::tie(num, msg) = dIter->_next->getConsumed(threadId); 
+
+	  if(inFirst && num == 0 )
+	    _divider = (*_divider)._next; 
+
+	  assert(msg.size() % sizeof(T) == 0); 
+	  result.resize(msg.size() / sizeof(T)); 
+	  memcpy(result.data(), msg.data(),  msg.size()); 
+	  found = true; 
+	  break; 
+	}
+
+      dIter = dIter->_next;
+      inFirst = false; 
+
+      // much faster with this break here ... (would induce more code
+      // changes) but with break, it can consume multiple elements 
+
+      // break; 
+    }
+
+  _consumerLock.exchange(false); // UNLOCK
+  return std::make_pair(found, result);
+}
+
diff --git a/src/comm/threads/MessageQueueSingle.cpp b/src/comm/threads/MessageQueueSingle.cpp
new file mode 100644
index 0000000..66320bb
--- /dev/null
+++ b/src/comm/threads/MessageQueueSingle.cpp
@@ -0,0 +1,72 @@
+#include "MessageQueueSingle.hpp"
+#include "GlobalVariables.hpp" 
+#include <algorithm>
+
+
+using std::move; 
+
+
+MessageQueueSingle::MessageQueueSingle( )
+  : _first( new Node(std::vector<uint8_t>() ))
+  , _divider(_first)
+  , _last{_first}
+  {
+  }
+
+
+
+MessageQueueSingle& MessageQueueSingle::operator=(MessageQueueSingle rhs) 
+{
+  swap(rhs, *this); 
+  return *this; 
+}
+
+
+void swap(MessageQueueSingle& lhs, MessageQueueSingle& rhs)
+{
+  using std::swap; 
+
+  swap(lhs._first, rhs._first); 
+
+  rhs._divider = lhs._divider.exchange(rhs._divider); 
+  rhs._last = lhs._last.exchange(rhs._last) ; 
+} 
+
+
+
+MessageQueueSingle::MessageQueueSingle( MessageQueueSingle&& rhs)  
+  : _first(std::move(rhs._first))
+  , _divider(rhs._divider.load())
+  , _last(rhs._last.load())
+{
+  rhs._divider = nullptr; 
+  rhs._last = nullptr; 
+  rhs._first = nullptr; 
+}
+
+
+MessageQueueSingle::MessageQueueSingle(const MessageQueueSingle& rhs)  
+  : _first(new Node(std::vector<uint8_t>()))
+  , _divider(_first)
+  , _last(_first)
+{
+} 
+
+
+MessageQueueSingle::~MessageQueueSingle()
+{
+  while(_first != nullptr)
+    {
+      auto tmp = _first; 
+      _first = tmp->_next; 
+      delete tmp; 
+    }
+}
+
+ 
+MessageQueueSingle::Node::Node(std::vector<byte> msg )
+  : _message(msg)
+  , _next(nullptr)
+{
+}
+
diff --git a/src/comm/threads/MessageQueueSingle.hpp b/src/comm/threads/MessageQueueSingle.hpp
new file mode 100644
index 0000000..a71b969
--- /dev/null
+++ b/src/comm/threads/MessageQueueSingle.hpp
@@ -0,0 +1,58 @@
+#ifndef _MESSAGE_QUEUE_SINGLE_HPP
+#define _MESSAGE_QUEUE_SINGLE_HPP 
+
+/** 
+    @brief 
+    this is a true lockless single producer, single consumer message queue. 
+    
+    see sutters article in drdobbs
+ */ 
+
+#include <vector>
+#include <limits>
+#include <atomic>
+
+
+typedef uint8_t byte;  
+
+class  MessageQueueSingle 
+{
+  struct Node; 
+
+public: 
+  MessageQueueSingle(); 
+  MessageQueueSingle(const MessageQueueSingle& rhs) ; 
+  MessageQueueSingle( MessageQueueSingle&& rhs) ; 
+  MessageQueueSingle& operator=(MessageQueueSingle rhs); 
+  friend void swap(MessageQueueSingle& lhs, MessageQueueSingle& rhs); 
+  ~MessageQueueSingle(); 
+  
+  template<typename T>
+  void produce(std::vector<T> msg); 
+  template<typename T>
+  std::tuple<bool,std::vector<T> >  consume(int myId); 
+
+  
+private: 
+  Node* _first;			// producer only 
+  // char pad[CACHE_LINE_SIZE - sizeof(Node*)]; 
+  std::atomic<Node*> _divider; 	// shared 
+  // char pad2[CACHE_LINE_SIZE - sizeof(std::atomic<Node*>)]; 
+  std::atomic<Node*> _last; 	// shared 
+}; 
+
+struct MessageQueueSingle::Node 
+{
+  Node(std::vector<byte> msg ); 
+  Node(const Node& rhs ) = default; 
+  Node& operator=(const Node &rhs)  = default; 
+
+  std::vector<byte> _message; 
+  Node *_next; 
+}; 
+
+
+#include "MessageQueueSingle.tpp"
+
+
+#endif
diff --git a/src/comm/threads/MessageQueueSingle.tpp b/src/comm/threads/MessageQueueSingle.tpp
new file mode 100644
index 0000000..9cf9314
--- /dev/null
+++ b/src/comm/threads/MessageQueueSingle.tpp
@@ -0,0 +1,50 @@
+#include "GlobalVariables.hpp"
+
+#include <algorithm>
+
+#include <cstring>
+#include <iostream>
+#include <cassert>
+
+using std::move;
+
+
+template<typename T>
+void MessageQueueSingle::produce(std::vector<T> msg)
+{
+  auto tmpMsg = std::vector<byte>(reinterpret_cast<byte*>(msg.data()), reinterpret_cast<byte*>(msg.data() + msg.size())); 
+  
+  (*_last)._next = new Node(tmpMsg); 
+  _last = (*_last)._next; 
+
+  while( _first != _divider )
+    {
+      Node *tmp = _first; 
+      _first = _first->_next; 
+      delete tmp; 
+    }
+}
+
+
+template<typename T>
+std::tuple<bool,std::vector<T> >  MessageQueueSingle::consume(int threadId) 
+{
+  auto result = std::vector<T>(); 
+  bool found = false; 
+
+  if(_divider != _last)
+    {
+      auto msg =  std::vector<byte>();
+      msg = (*_divider)._next->_message; 
+
+      _divider = (*_divider)._next; 
+
+      assert(msg.size() % sizeof(T) == 0); 
+      result.resize(msg.size() / sizeof(T)); 
+      memcpy(result.data(), msg.data(),  msg.size()); 
+      found = true; 
+    }
+
+  return std::make_tuple(found, result); 
+}
+
diff --git a/src/comm/threads/ThreadResource.cpp b/src/comm/threads/ThreadResource.cpp
new file mode 100644
index 0000000..bcc99f6
--- /dev/null
+++ b/src/comm/threads/ThreadResource.cpp
@@ -0,0 +1,107 @@
+#include "ThreadResource.hpp"
+
+#include "ParallelSetup.hpp"
+#include "CommandLine.hpp"
+#include <cstring>
+
+extern void exa_main ( CommandLine &cl,  ParallelSetup* pl ); 
+
+volatile bool ThreadResource::_threadsAreReleased = false; 
+
+ThreadResource::ThreadResource(CommandLine& cl, ParallelSetup* pl)
+  : _threads{}
+  , _tid2rank{}
+{
+  auto haveThreadSupport = pl->getGlobalComm().haveThreadSupport(); 
+  if(haveThreadSupport)
+    {
+      // this starts the threads and makes them wait in the function threadStart
+      int highestRank = 0; 
+      _tid2rank[MY_TID] = highestRank++; 
+      for(int i = 1 ; i < cl.getNumThreads()  ; ++i)
+	{
+	  _threads.emplace_back(&threadStart, std::ref(cl), pl);
+	  _tid2rank[_threads.back().get_id()] = highestRank++; 
+	}
+    }
+  else if( not haveThreadSupport)
+    {
+      if(cl.getNumThreads() > 1 )
+	std::cout << "You wanted to start threads using -T. However, "
+                  << PROGRAM_NAME << " could not detect thread support. "
+          " Will attempt to continue without threads."  << std::endl;
+      
+      auto highestRank = 0; 
+      _tid2rank[MY_TID] = highestRank++; 
+    }
+}
+
+
+
+void swap(ThreadResource &lhs, ThreadResource& rhs)
+{
+  using std::swap; 
+  swap(lhs._threads, rhs._threads); 
+  swap(lhs._tid2rank, rhs._tid2rank); 
+  swap(lhs._threadsAreReleased, rhs._threadsAreReleased); 
+} 
+
+
+ThreadResource& ThreadResource::operator=(ThreadResource rhs) 
+{
+  swap(*this, rhs); 
+  return *this; 
+} 
+
+
+void ThreadResource::pinThreads(int numProcPerNode, int remoteRank)
+{
+#ifndef __APPLE__
+  cpu_set_t  mask;
+  CPU_ZERO(&mask);
+
+  auto pinTo =(remoteRank * numProcPerNode)   +   _tid2rank[MY_TID]; 
+  // std::cout << SyncOut() << "pinnig thread  " << _tid2rank[MY_TID ]
+  // << " of process "  << remoteRank << " to core "  << pinTo << std::endl; 
+
+  CPU_SET(pinTo, &mask);
+  int result = sched_setaffinity(0, sizeof(mask), &mask); 
+
+  if(result != 0)
+    {
+      std::cout << SyncOut() << "Problem with pinning! Probably the number "
+        "of processes and threads\n"
+        "started on this machine exceeds the number of available cores. "
+        "Thread\n"
+        "pinning is disabled. In the worst case," << PROGRAM_NAME <<
+        " will run substantially slower (use a tool like htop to monitor,\n"
+        "whether all cores are loaded)." << std::endl; 
+    }
+#else 
+  
+#endif
+}
+
+
+void ThreadResource::threadStart(CommandLine& cl, ParallelSetup* pl)
+{
+  while(not _threadsAreReleased)
+    ; 
+
+  exa_main(cl, pl); 
+}
+
+
+void ThreadResource::releaseThreads()
+{
+  _threadsAreReleased = true; 
+}
+
+
+ThreadResource::~ThreadResource()
+{
+  // nat ctr = 0; 
+  for(auto &t : _threads)
+    t.join();
+}
+
diff --git a/src/comm/threads/ThreadResource.hpp b/src/comm/threads/ThreadResource.hpp
new file mode 100644
index 0000000..f7f742d
--- /dev/null
+++ b/src/comm/threads/ThreadResource.hpp
@@ -0,0 +1,64 @@
+#ifndef _THREAD_RESOURCE_HPP
+#define _THREAD_RESOURCE_HPP
+
+#include "threadDefs.hpp"
+
+#include <memory>
+#include <vector>
+#include <unordered_map>
+
+#include "common.h"
+
+class CommandLine; 
+class ParallelSetup; 
+
+////////////////////////////////////////////////////////////////////////////////
+//                              THREAD RESOURCE                               //
+////////////////////////////////////////////////////////////////////////////////
+class ThreadResource
+{
+  //////////////////////////////////////////////////////////////////////////////
+  //                               PUBLIC TYPES                               //
+  //////////////////////////////////////////////////////////////////////////////
+public:
+  typedef std::unordered_map<std::thread::id,int> threadToTid; 
+
+  //////////////////////////////////////////////////////////////////////////////
+  //                             PUBLIC INTERFACE                             //
+  //////////////////////////////////////////////////////////////////////////////
+public: 
+  ThreadResource(CommandLine &cl, ParallelSetup* pl);
+  // ___________________________________________________________________________
+  ThreadResource(ThreadResource&& rhs) = default;
+  // ___________________________________________________________________________
+  virtual ~ThreadResource(); 
+  // ___________________________________________________________________________
+  ThreadResource&                       operator=(ThreadResource rhs) ; 
+  // ___________________________________________________________________________
+  friend void                           swap(ThreadResource &lhs,
+                                             ThreadResource& rhs); 
+
+  int                                   getNumThreads() const
+  { return int(_threads.size()) + 1; }
+  // ___________________________________________________________________________
+  static void                           threadStart(CommandLine& cl,
+                                                    ParallelSetup* pl);
+  // ___________________________________________________________________________
+  static void                           releaseThreads();
+  // ___________________________________________________________________________
+  threadToTid                           getTid2Ranking() const
+  {return _tid2rank; }
+  // ___________________________________________________________________________
+  void                                  pinThreads(int numProcPerNode,
+                                                   int remoteRank); 
+
+  //////////////////////////////////////////////////////////////////////////////
+  //                               PRIVATE DATA                               //
+  //////////////////////////////////////////////////////////////////////////////
+private: 
+  std::vector<std::thread>              _threads; 
+  threadToTid                           _tid2rank; // thread rank 
+  static volatile bool                  _threadsAreReleased; 
+}; 
+
+#endif
diff --git a/src/comm/threads/threadDefs.hpp b/src/comm/threads/threadDefs.hpp
new file mode 100644
index 0000000..57ffd25
--- /dev/null
+++ b/src/comm/threads/threadDefs.hpp
@@ -0,0 +1,8 @@
+#ifndef _THREAD_DEFS_HPP
+#define _THREAD_DEFS_HPP
+
+#include <thread>
+#define MY_TID std::this_thread::get_id()
+typedef std::thread::id tid_t;  
+
+#endif
diff --git a/src/common.h b/src/common.h
new file mode 100644
index 0000000..207b0a4
--- /dev/null
+++ b/src/common.h
@@ -0,0 +1,76 @@
+/**
+   @file common.h
+   @brief Defines, typdes and developmental switches needed by almost every file.  
+*/ 
+
+#ifndef _COMMON_H
+#define _COMMON_H
+
+#include "config.h"
+
+/* only to be disabled for benchmarking! */
+#define USE_NONBLOCKING_COMM
+
+#define FLOAT_IS_INITIALIZED(x) ( std::fabs(x) > std::numeric_limits<double>::epsilon()  )
+
+
+#define USE_SSE ( defined(HAVE_SSE3) &&  ! defined(MANUAL_SSE_OVERRIDE) ) 
+#define USE_AVX ( defined(HAVE_AVX) && ! defined(MANUAL_AVX_OVERRIDE) && ! defined(MANUAL_SSE_OVERRIDE) )
+
+#if USE_AVX
+#define EXA_ALIGN VectAlign::AVX 
+#elif USE_SSE
+#define EXA_ALIGN VectAlign::SSE
+#else 
+#define EXA_ALIGN VectAlign::Normal
+#endif
+
+#define SOME_SCI_PRECISION std::scientific << std::setprecision(2)   
+#define MAX_SCI_PRECISION  std::scientific << std::setprecision(std::numeric_limits<double>::digits10)   
+#define SOME_FIXED_PRECISION std::fixed << std::setprecision(2)   
+#define MORE_FIXED_PRECISION std::fixed << std::setprecision(4)   
+#define PERC_PRECISION std::fixed << std::setprecision(2) 
+
+#define NO_SEC_BL_MULTI
+#define NOT_IMPLEMENTED  0
+#define TODO 0
+
+typedef unsigned int nat; 
+
+#define TARGET_RATIO 0.25    ///  the golden acceptance ratio, we want to achieve
+#define ACCEPTED_LIKELIHOOD_EPS 1e-6
+#define ACCEPTED_LNPR_EPS 1e-6
+#define ACCEPTED_FREQ_EPS 1e-6
+
+/* some global switches */ 
+
+/* #define _EXPERIMENTAL_INTEGRATION_MODE */
+/* #define _GO_TO_TREE_MOVE_INTEGARTION */
+/* #define _GO_TO_INTEGRATION_MODE */
+
+
+#define _DISABLE_INIT_LNL_CHECK
+
+#define SHOW(sym) #sym << "=" << sym << "\t"
+
+/* #define EFFICIENT  */
+
+/* #define PRINT_EVAL_CHOICE */
+
+/* debugging */
+
+/* verification */
+/* #define DEBUG_LNL_VERIFY */
+// #define DEBUG_VERIFY_LNPR
+
+/* many print statements  */
+
+// #define DEBUG_SHOW_EACH_PROPOSAL
+/* #define PRINT_LIKESPR_INFO */
+/* #define LNL_PRINT_DEBUG */
+
+
+/* TODO !!!  */
+/* #define DANGEROUS_LNL_SHORTCUT_OFF */
+
+#endif
diff --git a/src/config/BlockParams.cpp b/src/config/BlockParams.cpp
new file mode 100644
index 0000000..d59abad
--- /dev/null
+++ b/src/config/BlockParams.cpp
@@ -0,0 +1,138 @@
+#include "BlockParams.hpp"
+#include "GlobalVariables.hpp"
+
+#include <algorithm>
+
+extern void genericExit(int code); 
+
+
+void BlockParams::partitionError(nat partition, size_t totalPart) const
+{
+  std::cerr << "In the parameter block of the configuration file you specified partition " << partition << ". However, there are only " << totalPart << " partitions in total in your alignment." << std::endl; 
+  std::cerr << "NOTICE that the first partition has id 0 and the last of n partitions has the id (n-1) . " << std::endl; 
+  exitFunction(-1, true); 
+}
+
+
+void BlockParams::parseScheme(NxsToken& token, Category cat, nat &idCtr)
+{
+  auto numPart = tralnPtr->getNumberOfPartitions();
+  auto partAppeared = std::vector<bool>(numPart, false); 
+
+  token.GetNextToken();
+  assert(token.GetToken().EqualsCaseInsensitive("=")); 
+  token.GetNextToken();
+  assert(token.GetToken().EqualsCaseInsensitive("(")); 
+
+  auto scheme = std::vector<std::vector<nat>>{}; 
+  while(not token.GetToken().EqualsCaseInsensitive(")") )
+    {
+      auto schemePart = std::vector<nat>{}; 
+      bool startingNext = true; 
+      
+      // parse one partition part 
+      while( not token.GetToken().EqualsCaseInsensitive(")") 	     
+	     && (startingNext || not token.GetToken().EqualsCaseInsensitive(",")) )
+	{
+	  startingNext = false; 
+	  // check if the separation item is an expasion item (-)
+	  auto isLinkedRange =  token.GetToken().EqualsCaseInsensitive("-") ; 
+	  auto isUnlinkedRange = token.GetToken().EqualsCaseInsensitive(":") ; 
+
+	  token.GetNextToken();
+	  nat part = token.GetToken().ConvertToInt();
+	  nat start = ( isLinkedRange || isUnlinkedRange )  ? schemePart.back() +1  : part; 
+	  nat end = part + 1 ;  
+
+	  for(nat i = start ;  i < end ; ++i )
+	    {
+	      if(not (i < numPart))
+		partitionError(i, numPart); 
+	      if(partAppeared.at(i))
+		{
+		  tout << "error: partition " << i << " occurring twice in the same scheme. Check your parameter-block!" << std::endl; 
+		  exitFunction(-1, true); 
+		}
+	      partAppeared.at(i) = true; 
+
+	      if(isUnlinkedRange)
+		{
+		  scheme.push_back(schemePart);
+		  schemePart = {i}; 
+		}
+	      else 
+		schemePart.push_back(i); 
+	    }
+
+	  token.GetNextToken(); 
+	}
+
+      scheme.push_back(schemePart); 
+    }
+
+  // instantiate the parameters 
+  for(auto schemePart : scheme )
+    {
+      assert(schemePart.size()  > 0 ); 
+      parameters.push_back(CategoryFuns::getParameterFromCategory(cat,idCtr,getNumSeen(cat), schemePart, tralnPtr->getNumberOfTaxa()));
+      ++idCtr; 
+    }
+}
+
+
+void BlockParams::Read(NxsToken &token)
+{
+  DemandEndSemicolon(token, "PARAMS");
+  nat idCtr = 0; 
+
+  auto catsFound = std::unordered_set<Category>{}; 
+
+  while(true)
+    {
+      token.GetNextToken();
+      NxsBlock::NxsCommandResult res = HandleBasicBlockCommands(token); 
+
+      if (res == NxsBlock::NxsCommandResult(STOP_PARSING_BLOCK))
+	return;
+
+      if (res != NxsBlock::NxsCommandResult(HANDLED_COMMAND))
+	{	  
+	  auto str = token.GetToken(false); 
+
+	  auto cat = CategoryFuns::getCategoryFromLinkLabel(str); 	  
+	  parseScheme(token, cat, idCtr); 
+
+	  if(catsFound.find(cat) != catsFound.end())
+	    {
+	      cerr << "parsing error: found a linking scheme for category  " <<  CategoryFuns::getShortName(cat) << " twice. Aborting." ; 
+	      exitFunction(-1, true); 
+	    }
+
+	  if( cat == Category::TOPOLOGY)
+	    {
+	      cerr <<  "not implemented"; 
+	      assert(0); 
+	    }	    
+	}
+    }
+}
+
+
+std::vector<std::unique_ptr<AbstractParameter> > BlockParams::getParameters() const
+{
+  std::vector<std::unique_ptr<AbstractParameter> > result; 
+  for(auto &p : parameters )
+    result.push_back(std::unique_ptr<AbstractParameter>(p->clone() )); 
+  return result; 
+}
+
+
+
+nat BlockParams::getNumSeen(Category cat) 
+{
+  nat result = 0; 
+  for(auto &p : parameters)
+    if(p->getCategory() == cat )
+      ++result;
+  return result; 
+} 
diff --git a/src/config/BlockParams.hpp b/src/config/BlockParams.hpp
new file mode 100644
index 0000000..3bd66b9
--- /dev/null
+++ b/src/config/BlockParams.hpp
@@ -0,0 +1,39 @@
+#ifndef _BLOCK_PARTITION_H
+#define _BLOCK_PARTITION_H
+
+#include "ExaBlock.hpp"
+
+#include "GlobalVariables.hpp"
+#include "AbstractParameter.hpp" 
+#include "TreeAln.hpp"
+#include "Category.hpp"
+
+class BlockParams : public ExaBlock
+{
+public: 
+  BlockParams()
+    : parameters{}
+    , tralnPtr{nullptr}
+  {
+    NCL_BLOCKTYPE_ATTR_NAME = "PARAMS";    
+  }
+  
+  BlockParams(const BlockParams &rhs) = default; 
+  BlockParams& operator=(const BlockParams &rhs)  = default; 
+
+  void setTree(const TreeAln* _traln){ tralnPtr = _traln; }
+  vector<unique_ptr<AbstractParameter> > getParameters() const; 
+  virtual void Read(NxsToken &token); 
+
+private:   			// METHODS
+  void partitionError(nat partition, size_t totalPart) const ; 
+  void parseScheme(NxsToken& token, Category cat, nat &idCtr); 
+  nat getNumSeen(Category cat) ; 
+  
+private: 			// ATTRIBUTES
+  vector<unique_ptr<AbstractParameter> > parameters; 
+  const TreeAln* tralnPtr;  	// NON-owning
+}; 
+
+
+#endif
diff --git a/src/config/BlockPrior.cpp b/src/config/BlockPrior.cpp
new file mode 100644
index 0000000..84dbf46
--- /dev/null
+++ b/src/config/BlockPrior.cpp
@@ -0,0 +1,265 @@
+#include "BlockPrior.hpp"
+
+#include <sstream>
+#include <cmath>
+#include <limits>
+
+
+#include "extensions.hpp"
+
+#include "DiscreteModelPrior.hpp"
+#include "UniformPrior.hpp"
+#include "ExponentialPrior.hpp"
+#include "DirichletPrior.hpp"
+#include "FixedPrior.hpp"
+
+static void expectString( std::string expectation, NxsToken& token)
+{
+  bool okay = token.GetToken().EqualsCaseInsensitive(expectation.c_str()); 
+  if(not okay)
+    {
+      std::cerr << "error while parsing the config file: expected " << expectation << " but got " << token.GetToken() << std::endl; 
+      exitFunction(-1, false); 
+    }
+}
+
+
+static std::vector<double> parseValues(NxsToken &token)
+{
+  auto result = std::vector<double>{}; 
+
+  // assumption: we have already seen the ')'
+
+  while(token.GetToken().compare(")") != 0)
+    {
+      auto &&iss = std::istringstream{token.GetToken()}; 
+      auto value = double{0.};
+      iss >> value; 
+      result.push_back(value);
+      token.GetNextToken();
+      if(token.GetToken().compare(",") == 0)
+	token.GetNextToken();
+    }
+  
+  return result; 
+}
+
+
+std::unique_ptr<AbstractPrior> BlockPrior::parsePrior(NxsToken &token)  
+{
+  auto value = token.GetToken(false); 
+  token.GetNextToken();
+
+  assert(token.GetToken(false).compare("(") == 0); 
+
+  if(value.EqualsCaseInsensitive("uniform"))
+    {
+      token.GetNextToken();
+
+      // for non-continuous variables (e.g., topology)
+      if(token.GetToken().compare(")") == 0) 
+	return make_unique<UniformPrior>(0,0); 
+
+      double n1 = parseScientificDouble(token); 
+
+      assert(token.GetToken().compare(",") == 0);
+      token.GetNextToken();
+
+      double n2 = parseScientificDouble(token); 
+
+      assert(token.GetToken().compare(")") == 0);
+      return make_unique<UniformPrior>(n1,n2);  
+    }
+  else if(value.EqualsCaseInsensitive("disc"))
+    {
+      expectString("(", token);
+      
+      auto modelsProbs = std::unordered_map<ProtModel, double>{};
+
+      auto remainder = std::numeric_limits<double>::infinity();
+
+      while(token.GetToken().compare(")") != 0)
+	{
+	  token.GetNextToken();
+
+	  auto foundRemainder = token.GetToken().EqualsCaseInsensitive("remainder"); 
+	  if(foundRemainder)	// keep track of the weight 
+	    {
+	      if( not ( std::isinf( remainder) && remainder > 0 )  )
+		{
+		  std::cerr << "Encountered 'remainder' twice while defining aaPr" << std::endl; 
+		  exitFunction(-1, true); 
+		}
+
+	      token.GetNextToken();
+	      expectString("=", token); 
+	      token.GetNextToken();
+
+	      auto &&iss = std::istringstream{token.GetToken()};
+	      iss >> remainder ; 
+	      token.GetNextToken();
+	    } 
+	  else 			// simply parse that model 
+	    {
+	      auto modelRes = ProtModelFun::getModelFromStringIfPossible(token.GetToken()); 
+	      if(not std::get<0>(modelRes) )
+		{
+		  std::cerr << "Error: expected " << token.GetToken() << " to be a valid protein model name" << std::endl; 
+		  exitFunction(-1, true); 
+		}
+	      auto model = std::get<1>(modelRes);
+
+	      token.GetNextToken();
+	      expectString("=", token); 
+
+	      token.GetNextToken(); 
+	      auto &&iss = std::istringstream{token.GetToken()}; 
+	      auto weight = double{0.}; 
+	      iss >> weight; 
+
+	      if(modelsProbs.find(model) != modelsProbs.end())
+		{
+		  std::cerr << "Error: model " <<  model << "occurred more than once in your specification of a discrete amino acid model prior."  << std::endl; 
+		  exitFunction(-1, true); 
+		}
+
+	      modelsProbs[model] = weight; 
+
+	      token.GetNextToken();
+	    }
+	}
+
+      if(   not std::isinf(remainder) )
+	{
+	  for(auto model : ProtModelFun::getAllModels())
+	    {
+	      if( modelsProbs.find(model) == modelsProbs.end()  )
+		modelsProbs[model] = remainder; 
+	    }
+	}
+
+      return make_unique<DiscreteModelPrior>(modelsProbs);
+    }
+  else if(value.EqualsCaseInsensitive("dirichlet"))
+    {
+      expectString("(",token);
+      token.GetNextToken();
+      
+      auto alphas = parseValues(token); 
+      auto pr = new DirichletPrior(alphas);
+
+      return std::unique_ptr<AbstractPrior>(pr); 
+    }
+  else if(value.EqualsCaseInsensitive("fixed"))
+    { 
+      token.GetNextToken();
+
+      auto res = ProtModelFun::getModelFromStringIfPossible(token.GetToken()); 
+      auto foundProt = std::get<0>(res); 
+
+      if( foundProt )
+	{
+	  auto model = std::get<1>(res);
+
+	  token.GetNextToken();
+	  assert(token.GetToken().compare(")" ) == 0 ); 
+
+	  std::unordered_map<ProtModel,double> tmp = {{model,1.}}; 
+	  return make_unique<DiscreteModelPrior>( tmp  );
+	}
+      else 
+	{
+	  auto fixedValues = parseValues(token);
+	  auto &&result = make_unique<FixedPrior>(fixedValues); 
+	  return std::move(result);
+	}
+    }
+  else if(value.EqualsCaseInsensitive("exponential"))
+    {
+      token.GetNextToken();
+
+      double n1 = parseScientificDouble(token);
+
+      assert(token.GetToken().compare(")") == 0);
+      return make_unique<ExponentialPrior>(n1);
+    }
+  else 
+    {
+      cerr << "attempted to parse prior. Did not recognize keyword " <<  value << endl; 
+      exitFunction(-1, true); 
+      return make_unique<ExponentialPrior>(0);
+    }
+}
+
+
+void BlockPrior::Read(NxsToken &token) 
+{
+  DemandEndSemicolon(token, "PRIOR");
+
+  while(true)
+    {
+      token.GetNextToken();
+      auto  res = HandleBasicBlockCommands(token); 
+
+      if (res == NxsBlock::NxsCommandResult(STOP_PARSING_BLOCK))
+	return;
+      if (res != NxsBlock::NxsCommandResult(HANDLED_COMMAND))
+	{
+	  auto cat = CategoryFuns::getCategoryByPriorName(token.GetToken()); 
+	  token.GetNextToken();
+
+	  auto partitions  = std::unordered_set<nat> {}; 
+	  if(token.GetToken().compare("{") == 0)
+	    {
+	      while(not token.GetToken().EqualsCaseInsensitive("}"))
+		{
+		  token.GetNextToken();
+		  auto val = token.GetToken().ConvertToInt(); 
+	      
+		  if( _numPart <= nat(val)  )
+		    {
+		      tout << "Error while parsing priors: you specified partition id " << val << " while ExaBayes assumes, that you only have " << _numPart << " partitions" << std::endl; 
+		      exitFunction(-1, true); 
+		    }
+	      
+		  partitions.insert(val);
+		  token.GetNextToken();
+		}
+
+	      assert(token.GetToken().compare("}") == 0) ;
+	      token.GetNextToken();
+	    }
+
+	  auto prior = parsePrior(token);
+	  // tout << "parsed prior " << prior.get() << " for category " << cat  << std::endl; 
+
+	  // account for fixed bl prior that may not have any value at all 
+
+	  if(cat == Category::BRANCH_LENGTHS && prior->getInitialValue().values.size() == 0)
+	    prior->setKeepInitData(); 
+
+	  _parsedPriors.insert(std::make_pair( cat, std::make_tuple(partitions,std::move(prior))  ));
+	}
+    }  
+} 
+
+
+void BlockPrior::verify() const
+{
+  // TODO actually it seems the things below are not really necessary... 
+  auto range =  _parsedPriors.equal_range(Category::BRANCH_LENGTHS); 
+  for(auto iter = std::get<0>(range) ; iter != std::get<1>(range) ; ++iter )
+    {
+      auto &elem = std::get<1>(*iter); 
+      auto &setOfParts = std::get<0>(elem); 
+      auto priorPtr = std::get<1>(elem).get(); 
+      if( setOfParts.size() > 0 && dynamic_cast<FixedPrior*>(priorPtr)  != nullptr) 
+	  {
+	    tout << "You attempted to set a fixed branch lengths prior to one or more\n"
+		 << "partitions (but not all of them). Currently, this option is not\n"
+		 << "supported. If you urgently need this feature, please contact us." << std::endl; 
+	    exitFunction(-1, true);
+	  }
+    }
+} 
+
diff --git a/src/config/BlockPrior.hpp b/src/config/BlockPrior.hpp
new file mode 100644
index 0000000..e566932
--- /dev/null
+++ b/src/config/BlockPrior.hpp
@@ -0,0 +1,48 @@
+#ifndef _BLOCK_PRIOR_H
+#define _BLOCK_PRIOR_H
+
+#include <memory>
+#include <unordered_map>
+#include <unordered_set>
+
+#include "GlobalVariables.hpp"
+
+#include "ExaBlock.hpp"
+
+#include "AbstractPrior.hpp"
+
+#include "Category.hpp"
+
+// if the set is empty, then we have a general "fall-back" prior
+typedef std::unordered_multimap<Category, 
+				std::tuple<std::unordered_set<nat>,
+					   std::unique_ptr<AbstractPrior> > >  
+multiMapCategory2TuplePartitionsPrior ; 
+
+
+class BlockPrior : public ExaBlock
+{
+public: 
+  explicit BlockPrior(size_t numPart) 
+    : _parsedPriors{}
+    , _numPart(numPart)
+  {
+    NCL_BLOCKTYPE_ATTR_NAME = "PRIORS"; 
+  }
+  
+  void verify() const; 
+
+  
+  virtual void Read(NxsToken &token); 
+  const multiMapCategory2TuplePartitionsPrior& getPriors()const  {return _parsedPriors; } 
+
+private: 			// METHODS
+  std::unique_ptr<AbstractPrior> parsePrior(NxsToken &token)  ; 
+  
+private: 			// ATTRIBUTES
+  multiMapCategory2TuplePartitionsPrior _parsedPriors; 
+  size_t _numPart;
+}; 
+
+
+#endif
diff --git a/src/config/BlockProposalConfig.cpp b/src/config/BlockProposalConfig.cpp
new file mode 100644
index 0000000..16451c2
--- /dev/null
+++ b/src/config/BlockProposalConfig.cpp
@@ -0,0 +1,117 @@
+#include <cassert>
+
+#include "BlockProposalConfig.hpp"
+
+extern void genericExit(int code); 
+
+
+
+
+BlockProposalConfig::BlockProposalConfig()
+  : userValue{}
+  , etbrStopProb(0.5)
+  , esprStopProp(0.5)    
+  , parsimonyWarp(0.1)
+  , _likeSprMaxRadius{-1}
+  , parsSPRRadius(-1)
+  , _likeSprWarp(1.) 
+  , _moveOptMode{MoveOptMode::NONE}
+  , _useMultiplier{false}
+{
+  NCL_BLOCKTYPE_ATTR_NAME = "PROPOSALS"; 
+}
+
+
+void BlockProposalConfig::Read(NxsToken &token)
+{   
+  DemandEndSemicolon(token, "PROPOSALS");
+  
+  auto ps = ProposalTypeFunc::getAllProposals(); 
+
+  while(true)
+    {
+      token.GetNextToken();
+      NxsBlock::NxsCommandResult res = HandleBasicBlockCommands(token); 
+   
+      if (res == NxsBlock::NxsCommandResult(STOP_PARSING_BLOCK))
+	return;
+      if (res != NxsBlock::NxsCommandResult(HANDLED_COMMAND))
+	{
+	  NxsString key = token.GetToken(false);
+	  token.GetNextToken(); 
+	  NxsString value = token.GetToken(false); 	    
+
+	  if(ProposalTypeFunc::isValidName(key))
+	    {
+	      double val = value.ConvertToDouble(); 
+	      auto t = ProposalTypeFunc::getTypeFromConfigString(key); 
+	      if(userValue.find(t) != userValue.end())
+		{
+		  std::cerr << "encountered the value " << key << "twice in the config file" << std::endl; 
+		  exitFunction(-1, true); 
+		}
+	      else 
+		userValue[t] = val; 
+	    }
+	  else if(key.EqualsCaseInsensitive("esprstopprob"))	    
+	    esprStopProp = value.ConvertToDouble();	  
+	  else if(key.EqualsCaseInsensitive("moveoptmode"))
+	    {
+	      auto val =  value.ConvertToInt(); 
+	      assert(0 <= val && val < 5 ); // no better way to check =/ 
+	      _moveOptMode = MoveOptMode(val); 
+	    }
+	  else if(key.EqualsCaseInsensitive("etbrstopprob"))
+	    etbrStopProb = value.ConvertToDouble(); 	  
+	  else if(key.EqualsCaseInsensitive("likesprmaxradius"))
+	    _likeSprMaxRadius  = value.ConvertToInt();
+	  else if(key.EqualsCaseInsensitive("likesprwarp"))
+	    _likeSprWarp = value.ConvertToDouble();
+	  else if(key.EqualsCaseInsensitive("parsimonyWarp"))	    
+	    parsimonyWarp = value.ConvertToDouble();
+	  else if(key.EqualsCaseInsensitive("usemultiplier"))
+	    _useMultiplier = convertToBool(value); 
+	  else if(key.EqualsCaseInsensitive("parssprradius"))
+	    {
+	      parsSPRRadius = value.ConvertToInt();
+	      // tout << "\n\nfound spr radius " << parsSPRRadius << "\n\n" << std::endl ;
+	    }
+	  else 	      
+	    {
+	      cerr << "WARNING: ignoring unknown value >"  << key << "< and >" << value <<  "<" << endl; 
+	      assert(0);
+	    }
+	}
+    }
+}
+
+
+void BlockProposalConfig::verify()
+{
+  if(not (0.01 < esprStopProp && esprStopProp <= 1 ))
+    {
+      tout << "Error: >esprStopProp< must be in the range (0.01,1]" << std::endl; 
+      exitFunction(-1, true); 
+    }
+
+  if(not (0.01 < esprStopProp && esprStopProp <= 1 ))
+    {
+      tout << "Error: >etbrStopProb< must be in the range (0.01,1]" << std::endl; 
+      exitFunction(-1,true); 
+    }
+  
+  if(not (0.001 < parsimonyWarp && parsimonyWarp < 10))
+    {
+      tout << "Error: >parsimonyWarp< must be in the range (0.001,10)" << std::endl; 
+      exitFunction(-1, true); 
+    }
+  
+  if(parsSPRRadius != -1 &&  (parsSPRRadius <= 1 ))
+    {
+      tout << "Error: >parsSPRRadius< must be in the range (1,inf)" << std::endl; 
+      exitFunction(-1, true); 
+    }
+}
+
+// NOTICE 
+
diff --git a/src/config/BlockProposalConfig.hpp b/src/config/BlockProposalConfig.hpp
new file mode 100644
index 0000000..577cf9d
--- /dev/null
+++ b/src/config/BlockProposalConfig.hpp
@@ -0,0 +1,53 @@
+#ifndef _BLOCK_PROPOSALCONFIG_H
+#define _BLOCK_PROPOSALCONFIG_H
+
+#include <cassert>
+#include <map>
+
+#include "ExaBlock.hpp"
+#include "ProposalType.hpp"
+#include "GlobalVariables.hpp"
+#include "TopoMove.hpp"
+
+
+// TODO allow for scientific doubles  
+
+class BlockProposalConfig : public ExaBlock
+{
+public: 
+  BlockProposalConfig();
+  virtual void Read(NxsToken &token); 
+
+  bool wasSetByUser(ProposalType type ) const {  return userValue.find(type) != userValue.end() ; }
+  double getProposalWeight(ProposalType type) const
+  { 
+    assert(userValue.find(type) != userValue.end()) ; return userValue.at(type); 
+  }
+
+  double getEsprStopProp() const {return esprStopProp; } 
+  double getEtbrStopProb() const {return etbrStopProb; }
+  double getParsimonyWarp() const {return parsimonyWarp; }
+  void verify(); 
+  int getParsSPRRadius() const { return parsSPRRadius; }
+  int getLikeSprMaxRadius() const { return _likeSprMaxRadius; }
+  double getLikeSprWarp() const { return _likeSprWarp;  }
+  
+  MoveOptMode getMoveOptMode()  const { return _moveOptMode; }
+  
+  bool hasUseMultiplier() const  {return _useMultiplier; }
+
+private: 
+  std::unordered_map<ProposalType, double, ProposalTypeHash> userValue; 
+
+  double etbrStopProb; 
+  double esprStopProp; 
+  double parsimonyWarp;   
+  int _likeSprMaxRadius;
+  int parsSPRRadius; 
+  double _likeSprWarp; 
+  MoveOptMode  _moveOptMode;  
+  bool _useMultiplier; 
+}; 
+
+
+#endif
diff --git a/src/config/BlockRunParameters.cpp b/src/config/BlockRunParameters.cpp
new file mode 100644
index 0000000..51a029b
--- /dev/null
+++ b/src/config/BlockRunParameters.cpp
@@ -0,0 +1,186 @@
+#include "BlockRunParameters.hpp" 
+
+#include "GlobalVariables.hpp"
+
+
+BlockRunParameters::BlockRunParameters()  
+  : diagFreq(5000) 
+  , asdsfIgnoreFreq(0.1)
+  , asdsfConvergence(0.05)
+  , useStopCriterion{true}
+  , burninGen(0)
+  , burninProportion(0.25)
+  , samplingFreq (500)
+  , numRunConv(1)
+  , numGen(1e6)
+  , numCoupledChains(1)
+  , printFreq(500)
+  , heatFactor(0.1)
+  , tuneHeat(false)
+  , tuneFreq(100)
+  , useParsimonyStarting(true)
+  , heatedChainsUseSame(false)
+  , chkpntFreq(1000)
+  , componentWiseMH(true)
+  , useAsdsfMax(false)
+  , numSwapsPerGen(1.)
+{
+  NCL_BLOCKTYPE_ATTR_NAME = "run"; 
+}
+
+
+static int myConvertToInt(NxsString &elem)
+{
+  return int(elem.ConvertToDouble());
+}
+
+static uint64_t myConvertToLongInt(NxsString& elem)
+{
+  return uint64_t(elem.ConvertToDouble());
+}
+
+
+void BlockRunParameters::Read(NxsToken &token)
+{ 
+  DemandEndSemicolon(token, "runconfig");
+
+  while(true)
+    {
+      token.GetNextToken();
+      NxsBlock::NxsCommandResult res = HandleBasicBlockCommands(token); 
+
+      if (res == NxsBlock::NxsCommandResult(STOP_PARSING_BLOCK))
+	return;
+      if (res != NxsBlock::NxsCommandResult(HANDLED_COMMAND))
+	{
+	  auto key = token.GetToken(false);
+	  token.GetNextToken(); 
+	  auto value = token.GetToken(false); 	    
+
+	  if(key.EqualsCaseInsensitive("numGen"))
+	    numGen = myConvertToLongInt(value);
+	  else if (key.EqualsCaseInsensitive("parsimonystart"))
+	    useParsimonyStarting = convertToBool(value); 
+	  else if (key.EqualsCaseInsensitive("checkpointinterval"))
+	    chkpntFreq = myConvertToInt(value); 
+	  else if(key.EqualsCaseInsensitive("samplingfreq"))
+	    samplingFreq = myConvertToInt(value); 
+	  else if(key.EqualsCaseInsensitive("proposalsets"))
+	    componentWiseMH = convertToBool(value); 
+	  else if(key.EqualsCaseInsensitive("numRuns"))	    
+	    numRunConv = myConvertToInt(value); 
+	  else if(key.EqualsCaseInsensitive("diagFreq"))
+	    diagFreq = myConvertToInt(value); 
+	  else if(key.EqualsCaseInsensitive("heatedChainsUseSame"))
+	    heatedChainsUseSame = convertToBool(value); 
+	  else if(key.EqualsCaseInsensitive("numcoupledChains"))
+	    numCoupledChains = myConvertToInt(value); 
+	  else if(key.EqualsCaseInsensitive("printFreq") )	   
+	    printFreq = myConvertToInt(value);
+	  else if (key.EqualsCaseInsensitive("sdsfIgnoreFreq"))
+	    asdsfIgnoreFreq = value.ConvertToDouble(); 
+	  else if (key.EqualsCaseInsensitive("sdsfConvergence"))
+	    asdsfConvergence = value.ConvertToDouble();
+	  else if (key.EqualsCaseInsensitive("heatFactor"))
+	    heatFactor = value.ConvertToDouble();
+	  else if(key.EqualsCaseInsensitive("numSwapsPerGen"))
+	    numSwapsPerGen = value.ConvertToDouble();
+	  else if(key.EqualsCaseInsensitive("tuneHeat"))
+	    tuneHeat = convertToBool(value);
+	  else if(key.EqualsCaseInsensitive("tuneFreq"))
+	    tuneFreq = myConvertToInt(value);
+	  else if(key.EqualsCaseInsensitive("burninGen"))
+	    burninGen = myConvertToInt(value);
+	  else if(key.EqualsCaseInsensitive("burninProportion"))
+	    burninProportion = value.ConvertToDouble();
+	  else if(key.EqualsCaseInsensitive("convergencecriterion"))
+	    {
+	      if(value.EqualsCaseInsensitive("mean"))
+		{
+		  useStopCriterion = true; 
+		  useAsdsfMax = false; 
+		}
+	      else if(value.EqualsCaseInsensitive("max"))
+		{
+		  useStopCriterion = true; 
+		  useAsdsfMax = true ; 
+		}
+	      else if( value.EqualsCaseInsensitive("none"))
+		{
+		  useStopCriterion = false; 
+		}
+	      else 
+		{
+		  std::cerr << "Error: valid values for config entry >convergenceCriterion< are 'mean', 'max' or 'none'."  << std::endl; 
+		  exitFunction(-1, true);
+		}
+	    }
+	  else 	      
+	    cerr << "WARNING: ignoring unknown value >"  << key << "< and >" << value <<  "<" << endl; 
+	}
+    }
+}
+
+
+#pragma GCC diagnostic ignored "-Wfloat-equal"
+
+static void verifyProbability(double value, bool lowerIncluded, bool upperIncluded, std::string name)
+{
+  auto lowOkay = 0 < value || ( lowerIncluded &&  0 ==  value) ; 
+  auto upperOkay = value < 1. || (upperIncluded && value == 1); 
+
+  char lowBracket = lowerIncluded ? '[': '('; 
+  char upperBracket = upperIncluded ? ']' : ')' ; 
+
+  if( not ( lowOkay && upperOkay ) )
+    {
+      std::cerr << "Error: >" << name << "< must be in the interval " << lowBracket  << "0,1" << upperBracket << std::endl; 
+      exitFunction(-1, true); 
+    }
+
+}
+
+
+template<typename T>
+static void verifyGreaterZero(T value, std::string name )
+{
+  if( not ( value > 0 )   )
+    {
+      std::cout << "Error: >name< must be > 0 "  << std::endl; 
+      exitFunction(-1, true); 
+    }  
+}
+
+
+
+
+void BlockRunParameters::verify()   const 
+{
+  verifyGreaterZero(diagFreq, "diagFreq"); 
+  
+  verifyProbability(asdsfIgnoreFreq, true, true , "asdsfIgnoreFreq" ); 
+  verifyProbability(asdsfConvergence, false, false, "asdsfConvergence"); 
+  verifyProbability(burninProportion, false, false, "burninProportion"); 
+  verifyProbability(heatFactor, false, false, "heatFactor"); 
+  
+  if(numSwapsPerGen < 0.)
+    {
+      std::cerr << "Error: >numSwapsPerGen< must be in > 0."  << std::endl; 
+      exitFunction(-1, true); 
+    }
+
+  // verifyGreaterZero(numSwaps, "numSwaps"); 
+  verifyGreaterZero(samplingFreq,"samplingFreq" ); 
+  verifyGreaterZero(numRunConv, "numRunConv"); 
+  verifyGreaterZero(numGen, "numGen"); 
+  verifyGreaterZero(numCoupledChains, "numCoupledChains"); 
+  verifyGreaterZero(printFreq, "printFreq"); 
+  // verifyGreaterZero(swapInterval, "swapInterval"); 
+  // verifyGreaterZero(tuneFreq, "tuneFreq");  
+
+  if( diagFreq <= nat(samplingFreq)  ) 
+    {
+      std::cerr << "diagFreq < samplingFreq. Please choose the sampling frequency smaller than the diagnosis frequency.  " << std::endl; 
+      exitFunction(-1, true); 
+    }
+}
diff --git a/src/config/BlockRunParameters.hpp b/src/config/BlockRunParameters.hpp
new file mode 100644
index 0000000..1b4fbfc
--- /dev/null
+++ b/src/config/BlockRunParameters.hpp
@@ -0,0 +1,69 @@
+#ifndef _BLOCK_RUNPARAMETERS_H
+#define _BLOCK_RUNPARAMETERS_H
+
+
+#include <cassert>
+#include "ExaBlock.hpp"
+#include "common.h"
+
+
+class BlockRunParameters : public ExaBlock
+{
+public: 
+  BlockRunParameters(); 
+  BlockRunParameters(const BlockRunParameters& rhs) = default ;
+  BlockRunParameters(BlockRunParameters&& rhs) = default; 
+  BlockRunParameters& operator=(const BlockRunParameters &rhs) = default; 
+  BlockRunParameters& operator=(BlockRunParameters &&rhs) = default; 
+
+  virtual void Read(NxsToken &token); 
+
+  // getters 
+  nat getTuneFreq() const { return tuneFreq;  }
+  bool getTuneHeat() const { return tuneHeat; }
+  double getNumSwapsPerGen() const {return numSwapsPerGen; }
+  double getHeatFactor() const { return heatFactor ; }
+  nat getPrintFreq() const { return printFreq; }
+  nat getNumCoupledChains() const { return numCoupledChains; }
+  bool isUseAsdsfMax() const { return useAsdsfMax; }
+  uint64_t getNumGen() const { return numGen; }
+  nat getNumRunConv() const { return numRunConv; }
+  nat getSamplingFreq() const { return samplingFreq; }
+  double getBurninProportion() const { return burninProportion; }
+  nat getBurninGen() const { return burninGen; }
+  double getAsdsfIgnoreFreq() const { return asdsfIgnoreFreq; 	}
+  nat getDiagFreq() const { return diagFreq ; }
+  double getAsdsfConvergence() const {return asdsfConvergence; }
+  bool isUseParsimonyStarting() const {return useParsimonyStarting; } 
+  bool isHeatedChainsUseSame() const {return heatedChainsUseSame;}
+  nat getChkpntFreq() const {return chkpntFreq; }
+  bool isComponentWiseMH() const {return componentWiseMH; }
+  bool isUseStopCriterion() const {return useStopCriterion; }
+
+  void verify() const ; 
+
+private: 
+  nat diagFreq ; 
+  double asdsfIgnoreFreq; 	
+  double asdsfConvergence; 
+  bool useStopCriterion; 
+  nat burninGen; 
+  double burninProportion; 
+  int samplingFreq; 
+  int numRunConv; 
+  uint64_t numGen; 
+  int numCoupledChains; 
+  int printFreq; 
+  double heatFactor ; 
+  bool tuneHeat; 
+  nat tuneFreq;  
+  bool useParsimonyStarting; 
+  bool heatedChainsUseSame; 
+  nat chkpntFreq; 
+  bool componentWiseMH; 
+  bool useAsdsfMax; 
+  double numSwapsPerGen;   
+}; 
+
+
+#endif
diff --git a/src/config/CommandLine.cpp b/src/config/CommandLine.cpp
new file mode 100644
index 0000000..9d1fcc8
--- /dev/null
+++ b/src/config/CommandLine.cpp
@@ -0,0 +1,324 @@
+#include <unistd.h>
+#include <iostream>
+#include <cstring>
+#include <iostream>
+
+#include "CommandLine.hpp"	
+#include "GlobalVariables.hpp"
+#include "OutputFile.hpp"
+#include "MemoryMode.hpp"
+#include "FlagType.hpp"
+
+
+CommandLine::CommandLine()
+  : seed({{0,0}})
+  , configFileName("")
+  , alnFileName("")
+  , runid("")
+  , treeFile("")
+  , workDir("")
+  , runNumParallel(1)
+  , chainNumParallel(1)
+  , checkpointId("")
+  , memoryMode(MemoryMode::RESTORE_ALL)
+  , saveMemorySEV(false)
+  , dryRun (false)
+  , modelFile("")
+  , singleModel("")
+  , quiet{false}
+  , readerStride(-1)
+  , _cmdString("")
+  , _totalThreads(-1)
+  , _hasThreadPinning{true}
+  , _onlyPrintHelp(false)
+  , _onlyPrintVersion(false)
+  {
+  
+    seed.v[0] = 0; 
+    seed.v[1] = 0; 
+  }
+
+
+std::string CommandLine::getCommandLineString() const 
+{
+  return _cmdString; 
+}
+
+void CommandLine::initialize(  int argc, char **argv)
+{
+  // first copy the command line string 
+  for(int i = 0; i < argc; ++i)
+    {
+      _cmdString += std::string(argv[i], argv[i] + strlen(argv[i])); 
+      _cmdString += " "; 
+    }
+
+  int c ; 
+
+  // TODO threads/ processes? 
+  
+  while( (c = getopt(argc,argv, "c:df:vhn:w:s:t:R:r:M:C:m:Sq:zxT:")) != EOF)
+    {
+      try
+	{	  
+	  switch(c)
+	    {
+	    case 'z': 
+	      {
+		quiet = true; 
+	      }
+	      break; 
+	    case 'c': 		// config file 	  
+	      {
+		configFileName = std::string(optarg); 
+		assertFileExists(configFileName);
+	      }
+	      break; 
+	    case 'f': 		// aln file 
+	      alnFileName = std::string(optarg); 
+	      assertFileExists(alnFileName); 
+	      break; 
+	    case 'v':  		// version 
+	      _onlyPrintVersion = true; 
+	      break; 
+	    case 'd': 
+	      dryRun = true; 
+	      break; 
+	    case 'h': 		// help 
+	      _onlyPrintHelp = true; 
+	      break; 
+	    case 'n': 		// runid 
+	      runid = std::string(optarg); 	  
+	      break; 
+	    case 't': 		// trees -- have that in the config file? 
+	      treeFile = std::string(optarg); 
+	      break; 
+	    case 'w':		// working dir  
+	      workDir = std::string(optarg); 
+	      break; 
+	    case 's': 		// seed 
+	      seed.v[0] = std::stoi(optarg);
+	      break; 
+	    case 'r': 
+	      checkpointId = std::string{optarg};   
+	      break; 
+	    case 'q':
+	      modelFile = std::string{optarg}; 
+	      break; 
+	    case 'm': 
+	      singleModel = std::string{optarg}; 
+	      break; 
+	    case 'S': 
+	      saveMemorySEV = true; 
+	      break; 
+	    case 'M': 
+	      memoryMode = MemoryMode(std::stoi(optarg)); 
+	      break; 
+	    case 'C': 
+	      chainNumParallel = std::stoi(optarg); 
+	      break; 
+	    case 'R': 
+	      runNumParallel = std::stoi(optarg);
+	      break; 
+	    case 'T': 
+	      _totalThreads = std::stoi(optarg); 
+	      break; 
+	      // case 'x': 
+	      //   readerStride = std::stoi(optarg); 
+	      //   break; 
+	    case 'x': 
+	      _hasThreadPinning = false; 
+	      break;
+	    default: 
+	      {
+		std::cerr << "Encountered unknown command line option -" <<  char(c) 
+			  << "\n\nFor an overview of program options, please use -h" << std::endl ; 
+		// TODO mpi-finalize stuff 
+		exitFunction(-1, true); 
+	      }
+	    }
+	}
+      catch(const std::invalid_argument& ia)
+	{
+	  std::cerr << "Invalid argument >" << optarg << "< to option >" << reinterpret_cast<char*>(&c) << "<" << std::endl; 
+	  exitFunction(-1, true);
+	}
+    }  
+  
+  if(_onlyPrintHelp || _onlyPrintVersion)
+    return; 
+
+
+  if(isYggdrasil
+     && (_totalThreads % (runNumParallel * chainNumParallel)) != 0 )
+    {
+      std::cerr << "Error: for the threaded version it is currently necessary that the number of threads is a multiple of the product of the number of chains and runs that is executed in parallel." << std::endl; 
+      exitFunction(-1, true); 
+    }
+
+
+  if(runid.compare("") == 0 )
+    {
+      std::cerr << "please specify a runid with -n runid" << std::endl; 
+      exitFunction(-1, true); 
+    }
+  
+  if(seed.v[0] != 0 && checkpointId.compare("") != 0 )
+    {
+      std::cout << std::endl << "You provided a seed and run-id for a restart from a checkpoint.\n"
+		<< "Please be aware that the seed will be ignored." << std::endl; 
+    }
+
+  if(checkpointId.compare("") == 0 && seed.v[0] == 0 )
+    {
+      std::cerr << "please specify a seed via -s seed (must NOT be 0)"   << std::endl; 
+      exitFunction(-1, true); 
+    }
+
+  if(workDir.compare("") != 0 && not OutputFile::directoryExists(workDir))
+    {
+      std::cout << std::endl << "Could not find the provided working directory >" << workDir << "<" << std::endl; 
+      exitFunction(-1, true);
+    }
+
+  if(alnFileName.compare("") == 0 )
+    {
+      std::cerr << "please specify an alignment file via -f file" <<  std::endl 
+		<< "You have to transform your NEWICK-style alignment into a binary file using the appropriate parser (see manual)." << std::endl; 
+
+      exitFunction(-1, true); 
+    }
+
+  if(alnFileIsBinary())
+    {
+      if(singleModel.compare("") != 0 || modelFile.compare("") != 0 )
+	{
+	  std::cout << "Found binary alignment file. Additionally, you provided a model file\n"
+	    "(-q) or specified a data type for a single partiton. This information\n"
+	    "will be ignored.\n"; 
+	  modelFile = ""; 
+	  singleModel = ""; 
+	}
+    }
+  else 
+    {
+      if(singleModel.compare("") == 0 && ( modelFile.compare("") == 0 || not std::ifstream(modelFile) )  )
+	{
+	  std::cout << "Found a phylip-style alignment file. However, you did not provide a\n"
+                    << "model file (see -q, resp. it could not be found) or a data type specification for a single\n"
+		    << "partition (-m). Cannot proceed.\n" ; 
+	  exitFunction(-1, true); 
+	}
+    }
+
+  if( treeFile.compare("") != 0 && not std::ifstream(treeFile))
+    {
+      std::cout << "Could not find tree file passed via -t >"  << treeFile << "<"<< std::endl; 
+      exitFunction(-1, true); 
+    }
+}
+
+
+
+
+void CommandLine::printVersion(std::ostream& out )
+{   
+  out  << "This is " << PROGRAM_NAME << ", version " << PACKAGE_VERSION << std::endl
+       << "================================================================\n\n" 
+       << "For bugs reports and feature inquiries, please send an email to " << PACKAGE_BUGREPORT << std::endl; 
+}
+
+
+void CommandLine::printHelp(std::ostream& out)
+{
+  printVersion(out); 
+
+  out << std::endl << "Usage: " << (isYggdrasil ? "./yggdrasil" : "./exabayes"  ) <<  " -f alnFile [ -q modelFile ] [ -m model ] [ -s seed | -r id ]  -n id [options..] "
+      << std::endl; 
+
+  
+  out << "\n\n"
+      << "================================================================\n"
+      << "Mandatory Arguments: \n"
+      << "================================================================\n\n"
+      << "    -f alnFile       a alignment file (either binary and created by parser or plain-text phylip)\n\n"
+      << "    -s seed          a master seed for the MCMC\n\n"
+      << "    -n ruid          a run id\n\n" 
+      << "    -r id            restart from checkpoint. Just specify the id of the previous run (-n) here. \n"
+      << "                       Make sure, that all files created by the previous run are in the working directory.\n"
+      << "                       This option is not mandatory for the start-up, seed (via -s) will be ignored.\n\n"
+      << "    -q modelfile     a RAxML-style model file (see manual) for multi-partition alignments. Not needed \n"
+      << "                       with binary files.\n\n"
+      << "    -t treeFile      a file containing starting trees (in Newick format) for chains. If the file provides less\n"
+      << "                       starting trees than chains to be initialized, parsimony/random trees will be used for\n"
+      << "                       remaining chains. If a tree contains branch lengths, these branch lengths will be used\n"
+      << "                       as initial values.\n\n"
+      << "    -m model         indicates the type of data for a single partition non-binary alignment file\n" 
+      << "                       (valid values: BIN, DNA or PROT)\n\n"
+      << std::endl;     
+
+  out <<      "\n" 
+      << "================================================================\n"
+      <<  "Options:\n" 
+      << "================================================================\n\n"
+      << "    -v               print version and quit\n\n"
+      << "    -h               print this help\n\n" 
+      << "    -z               quiet mode. Substantially reduces the information printed by " << PROGRAM_NAME << ".\n"
+      << "                      This option will save you some idle time, when you run " << PROGRAM_NAME << " with a\n"
+      << "                      lot of processes.\n\n" 
+      << "    -d               execute a dry-run. Procesess the input, but does not execute any sampling.\n\n"
+      << "    -c confFile      a file configuring your " << PROGRAM_NAME << " run. For a template see the 'examples' folder.\n\n"
+      << "    -w dir           specify a working directory for output files\n\n"; 
+
+  out << "    -R num           the number of runs (i.e., independent chains) to be executed in parallel\n\n"
+      << "    -C num           number of chains (i.e., coupled chains) to be executed in parallel\n\n" 
+      << "    -x               disables thread pinning (which schedules a thread to a cpu core\n"
+      << "                       in a fixed way). You should try this function, if you notice load imbalances with the\n"
+      << "                       threaded version of the code (i.e., using -T x).\n\n" ;  
+  
+  out << "    -S               try to save memory using the SEV-technique for gap columns on large gappy alignments\n" 
+      << "                       Please refer to  http://www.biomedcentral.com/1471-2105/12/470\n" 
+      << "                       On very gappy alignments this option yields considerable runtime improvements. \n\n"
+      << "    -T x             start x threads per MPI process. If you do not use MPI, simply start x threads. \n\n" 
+      << "    -M mode          specifies the memory versus runtime trade-off (see manual for detailed discussion).\n"
+      << "                       <mode> is a value between 0 (fastest, highest memory consumption) and 3 (slowest,\n"
+      << "                       least memory consumption)\n\n"
+      << std::endl; 
+}
+
+
+void CommandLine::assertFileExists(std::string filename)
+{
+  auto &&in = std::ifstream{filename}; 
+  if( not in  )
+    {
+      std::cerr << "could not file file " << filename << ". Aborting." << std::endl; 
+      exitFunction(-1, true); 
+    }
+}
+
+
+randCtr_t CommandLine::getSeed() const
+{
+  return seed ; 
+} 
+
+
+bool CommandLine::alnFileIsBinary() const
+{
+  auto&& in =std::ifstream (alnFileName, std::ios::binary); 
+
+  assert(in) ; 
+
+  auto fileId = std::string{"BINARY"} ; 
+  char firstBytes[7]; 
+  memset(firstBytes, '\0', 7 * sizeof(char)); 
+  in.read(firstBytes, 6 * sizeof(char));
+  auto readString = std::string(firstBytes); 
+
+  bool result = readString.compare(fileId) == 0 ;
+
+  return result; 
+}  
+
+
diff --git a/src/config/CommandLine.hpp b/src/config/CommandLine.hpp
new file mode 100644
index 0000000..70876a9
--- /dev/null
+++ b/src/config/CommandLine.hpp
@@ -0,0 +1,81 @@
+#ifndef _COMMANDLINE_H
+#define _COMMANDLINE_H
+
+#include <memory>
+#include <iosfwd>
+#include <string>
+
+#include "Randomness.hpp"
+#include "MemoryMode.hpp"
+
+class CommandLine
+{
+public: 
+  CommandLine(); 
+  void initialize(  int argc, char **argv); 
+
+  randCtr_t getSeed() const; 
+  std::string getConfigFileName() const {return configFileName; }
+  std::string getAlnFileName() const{return alnFileName; }
+  std::string getRunid() const {return runid; }
+  std::string getTreeFile() const {return treeFile; }
+  int getNumRunParallel() const {return runNumParallel; }
+  std::string getWorkdir() const {return workDir; }
+  void printVersion(std::ostream &out);
+  nat getNumChainsParallel() const {return chainNumParallel; }
+  std::string getCheckpointId()const {return checkpointId; }
+  void parseAlternative(int argc, char *argv[]); 
+  bool isSaveMemorySEV() const {return saveMemorySEV; }
+
+  std::string getCommandLineString() const ; 
+  MemoryMode getMemoryMode()const {return memoryMode ;  }
+  bool isDryRun() const {return dryRun; }
+
+  bool onlyPrintHelp() const {return _onlyPrintHelp; }
+  bool onlyPrintVersion() const {return _onlyPrintVersion; }
+
+  bool alnFileIsBinary() const; 
+
+  bool hasThreadPinning() const {return _hasThreadPinning; }
+
+  int getNumThreads() const {return _totalThreads; }
+
+  std::string getSingleModel() const {return singleModel; }
+  std::string getModelFile() const {return modelFile; }
+
+  bool isQuiet() const {return quiet; }
+
+  int getReaderStride() const {return readerStride; }
+
+  void printHelp(std::ostream& out);
+
+private: 			// METHODS
+  void assertFileExists(std::string filename); 
+
+
+private: 			// ATTRIBUTES
+  randCtr_t seed; 
+  std::string configFileName; 
+  std::string alnFileName; 
+  std::string runid; 
+  std::string treeFile; 
+  std::string workDir;
+  int runNumParallel;   
+  int chainNumParallel; 
+  std::string checkpointId; 
+  MemoryMode memoryMode; 
+  bool saveMemorySEV; 
+  bool dryRun; 
+  std::string modelFile; 
+  std::string singleModel; 
+  bool quiet; 
+  int readerStride; 
+  std::string _cmdString;
+  int _totalThreads; 
+  bool _hasThreadPinning; 
+  bool _onlyPrintHelp; 
+  bool _onlyPrintVersion; 
+}; 
+
+
+#endif
diff --git a/src/config/ConfigReader.hpp b/src/config/ConfigReader.hpp
new file mode 100644
index 0000000..76e7b17
--- /dev/null
+++ b/src/config/ConfigReader.hpp
@@ -0,0 +1,30 @@
+
+/**
+   @file ConfigReader.hpp
+
+   @brief specializes a nxsreader for parsing of an exabayes block.
+*/
+
+#ifndef _NCL_CONFIG_READER
+#define _NCL_CONFIG_READER
+
+#include <ncl/ncl.h>
+#include <vector>
+
+#include "PriorBelief.hpp"
+#include "AbstractProposal.hpp"
+
+#include "BlockParams.hpp" 
+#include "BlockPrior.hpp"
+
+class ConfigReader : public NxsReader
+{
+public: 
+  ConfigReader() : NxsReader(){SetWarningOutputLevel(SUPPRESS_WARNINGS_LEVEL); }
+  virtual void ExitingBlock(NxsString blockName){}
+  virtual void ExecuteStopping(){}
+  virtual void ExecuteStarting(){}
+
+}; 
+
+#endif
diff --git a/src/config/ExaBlock.cpp b/src/config/ExaBlock.cpp
new file mode 100644
index 0000000..26e60d2
--- /dev/null
+++ b/src/config/ExaBlock.cpp
@@ -0,0 +1,59 @@
+#include "ExaBlock.hpp"
+
+#include <cassert>
+
+
+bool ExaBlock::convertToBool(NxsString &string) const 
+{
+  if(string.EqualsCaseInsensitive("true"))
+    return true ; 
+  else if (string.EqualsCaseInsensitive("false"))
+    return false; 
+  else 
+    {
+      cerr << "ERROR while parsing boolean value: expected either \"true\" or \"false\"" << endl; 
+      assert(0); 
+      return false; 
+    }  
+}
+
+
+
+double ExaBlock::parseScientificDouble(NxsToken& token)  const 
+{
+  double result =  0.0 ;
+  auto str = token.GetToken(); 
+  token.GetNextToken();
+  
+  bool sawE =  ( str.back()  == 'e' || str.back() == 'E') ; 
+  
+  if(token.GetToken().EqualsCaseInsensitive("e"))
+    {
+      sawE = true; 
+      str += token.GetToken(); 
+      token.GetNextToken();
+    }
+  
+  if(sawE &&  ( token.GetToken().EqualsCaseInsensitive("+") || token.GetToken().EqualsCaseInsensitive("-") ))
+    {
+      str += token.GetToken(); 
+      token.GetNextToken();
+    }
+  
+  if(sawE)
+    {
+      str += token.GetToken(); 
+      token.GetNextToken(); 
+    }
+
+  auto &&iss = std::istringstream{str}; 
+  iss >> result ; 
+  return result; 
+} 
+
+
+
+
+
+
+
diff --git a/src/config/ExaBlock.hpp b/src/config/ExaBlock.hpp
new file mode 100644
index 0000000..4ddfd3e
--- /dev/null
+++ b/src/config/ExaBlock.hpp
@@ -0,0 +1,16 @@
+#ifndef __EXA_BLOCK_HPP 
+#define __EXA_BLOCK_HPP
+
+#include <ncl/ncl.h>
+
+class ExaBlock  : public NxsBlock
+{
+
+protected:
+  double parseScientificDouble(NxsToken& token) const  ; 
+  bool convertToBool(NxsString &string) const ; 
+
+
+}; 
+
+#endif
diff --git a/src/config/MemoryMode.cpp b/src/config/MemoryMode.cpp
new file mode 100644
index 0000000..007d6b9
--- /dev/null
+++ b/src/config/MemoryMode.cpp
@@ -0,0 +1,26 @@
+#include "MemoryMode.hpp"
+#include <cassert>
+
+
+std::string toString(MemoryMode mem)
+{
+  auto result = std::string{};
+  switch(mem)
+    {
+    case MemoryMode::RESTORE_ALL: 
+      result = "restores all"; 
+      break; 
+    case MemoryMode::RESTORE_INNER_TIP : 
+      result = "restores inner-tip"; 
+      break; 
+    case MemoryMode::RESTORE_INNER_INNER: 
+      result = "restores inner-inner"; 
+      break; 
+    case MemoryMode::RESTORE_NONE: 
+      result = "restores nothing"; 
+      break; 
+    default : 
+      assert(0); 
+    }
+  return result ; 
+}
diff --git a/src/config/MemoryMode.hpp b/src/config/MemoryMode.hpp
new file mode 100644
index 0000000..07e52ab
--- /dev/null
+++ b/src/config/MemoryMode.hpp
@@ -0,0 +1,16 @@
+#ifndef _MEMORY_MODE_H
+#define _MEMORY_MODE_H
+
+#include <string>
+
+enum class MemoryMode
+{
+  RESTORE_ALL = 0,
+    RESTORE_INNER_TIP = 1 , 	// inner-inner + inner-tip  
+    RESTORE_INNER_INNER = 2 , 	// only inner-inner 
+    RESTORE_NONE = 3 
+}; 
+
+std::string toString(MemoryMode mem); 
+
+#endif
diff --git a/src/config/README.txt b/src/config/README.txt
new file mode 100644
index 0000000..c527a6b
--- /dev/null
+++ b/src/config/README.txt
@@ -0,0 +1,2 @@
+This module contains class implementing the user interface of Exabayes
+(i.e., command line and configuration file).
diff --git a/src/contrib/AlignmentPLL.cpp b/src/contrib/AlignmentPLL.cpp
new file mode 100644
index 0000000..78c43c5
--- /dev/null
+++ b/src/contrib/AlignmentPLL.cpp
@@ -0,0 +1,461 @@
+#include "AlignmentPLL.hpp"
+#include "GlobalVariables.hpp"
+
+#include <time.h> 
+
+#include <cwctype>
+
+#include <cstdio>
+#include <cassert>
+#include <cstring>
+#include <algorithm> 
+
+extern "C"
+{
+  void freeLinkageList( linkageList* ll); 
+}
+
+// NASTY, needed to copy that 
+
+static const char PLL_MAP_BIN[256] =
+ {
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  3, -1, -1,
+    1,  2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  3,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+  };
+
+static const char PLL_MAP_NT[256] =
+ {
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15,
+   -1,  1, 14,  2, 13, -1, -1,  4, 11, -1, -1, 12, -1,  3, 15, 15,
+   -1, -1,  5,  6,  8,  8,  7,  9, 15, 10, -1, -1, -1, -1, -1, -1,
+   -1,  1, 14,  2, 13, -1, -1,  4, 11, -1, -1, 12, -1,  3, 15, 15,
+   -1, -1,  5,  6,  8,  8,  7,  9, 15, 10, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ };
+
+static const char PLL_MAP_AA[256] =
+ {
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, 22, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22,
+   -1,  0, 20,  4,  3,  6, 13,  7,  8,  9, -1, 11, 10, 12,  2, -1,
+   14,  5,  1, 15, 16, -1, 19, 17, 22, 18, 21, -1, -1, -1, -1, -1,
+   -1,  0, 20,  4,  3,  6, 13,  7,  8,  9, -1, 11, 10, 12,  2, -1,
+   14,  5,  1, 15, 16, -1, 19, 17, 22, 18, 21, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ };
+
+
+
+AlignmentPLL::AlignmentPLL()
+  : _pllAlignmentData{nullptr}
+  , _partitions{nullptr}
+{
+} 
+
+
+AlignmentPLL::AlignmentPLL(AlignmentPLL&& rhs)
+  : _pllAlignmentData{rhs._pllAlignmentData}
+  , _partitions{rhs._partitions}
+{
+  rhs._partitions = nullptr; 
+  rhs._pllAlignmentData = nullptr; 
+}
+
+
+AlignmentPLL& AlignmentPLL::operator=( AlignmentPLL &&rhs) 
+{
+  if(this == &rhs)
+    return *this; 
+  else 
+    {
+      _partitions = rhs._partitions; 
+      rhs._partitions = nullptr; 
+  
+      _pllAlignmentData = rhs._pllAlignmentData; 
+      rhs._pllAlignmentData = nullptr; 
+  
+      return *this; 
+    }
+}
+
+
+void AlignmentPLL::initAln(std::string alnFile, int fileType) 
+{
+  // properly initialize 
+  errno = 0; 
+
+  _pllAlignmentData = pllParseAlignmentFile(fileType, alnFile.c_str()); 
+
+  switch(errno)
+    {
+    case PLL_ERROR_FILE_OPEN: 
+      std::cout << "could not open file" << std::endl;
+      break; 
+    case PLL_ERROR_INVALID_FILETYPE: 
+      std::cout << "invalid file type" << std::endl;
+      break; 
+    case  PLL_ERROR_PHYLIP_HEADER_SYNTAX: 
+      std::cout << "phylip header error" << std::endl;
+      break; 
+    case PLL_ERROR_PHYLIP_BODY_SYNTAX: 
+      std::cout << "phylip body syntax incorrect" << std::endl;
+      break; 
+    case  PLL_ERROR_FASTA_SYNTAX: 
+      std::cout << "fasta syntax error" << std::endl;
+      break; 
+    default: 
+      ; 
+    }
+
+  assert(errno == 0); 
+}
+
+
+void AlignmentPLL::substituteBases () 
+{
+  auto numSeq = _pllAlignmentData->sequenceCount; 
+
+  const char * d;
+  int i, j, k;
+
+  for (i = 0; i < _partitions->numberOfPartitions; ++ i)
+   {
+     switch (_partitions->partitionData[i]->dataType)
+      {
+        case PLL_DNA_DATA:
+          d = PLL_MAP_NT;
+          break;
+        case PLL_BINARY_DATA:
+          d = PLL_MAP_BIN;
+          break;
+        case PLL_AA_DATA:
+          d = PLL_MAP_AA;
+          break;
+        default:
+          assert(0);
+      }
+     
+     for (j = 1u; j <= numSeq; ++ j)
+      {
+        for (k = _partitions->partitionData[i]->lower; k < _partitions->partitionData[i]->upper; ++ k)
+         {
+	   auto vect = _pllAlignmentData->sequenceData; 
+	   vect[j][k] = d[vect[j][k]];
+         }
+      }
+   }
+}
+
+
+void AlignmentPLL::initPartitions(std::string partitionFile)
+{
+  // guess number of partitions 
+
+  auto &&in = std::ifstream(partitionFile); 
+  auto str = std::string{""}; 
+  nat ctr = 0 ; 
+  while(in)
+    {
+      getline(in, str); 
+      ++ctr ; 
+    }
+  PLL_NUM_BRANCHES = ctr;
+  
+  assert(_pllAlignmentData != nullptr);
+  auto queue = pllPartitionParse(partitionFile.c_str()); 
+
+  auto result = pllPartitionsValidate(queue, _pllAlignmentData);
+  
+  if (result != 1)
+    {
+      std::cout << "\n\nError: parsing file "  << partitionFile << " failed. \n\n"
+        "Please double-check, whether each site is assigned a partition. \n"
+        "Side note: the notation for choosing every n-th (e.g., triplet) \n"
+        "character has changed from '\\3' to '/3'.";
+      assert(0);
+    }
+
+  _partitions = pllPartitionsCommit(queue, _pllAlignmentData);
+  pllQueuePartitionsDestroy(&queue); 
+
+  pllAlignmentRemoveDups(_pllAlignmentData, _partitions);
+
+  substituteBases();
+}
+
+
+AlignmentPLL::~AlignmentPLL()
+{
+  if(_pllAlignmentData != nullptr)
+    {
+      pllAlignmentDataDestroy(_pllAlignmentData); 
+      _pllAlignmentData = nullptr; 
+    }
+
+  if(_partitions != nullptr )
+    {
+      if(_partitions->partitionData != nullptr )
+	{
+	  for(auto i = 0; i < _partitions->numberOfPartitions; ++i)
+	    {
+	      free(_partitions->partitionData[i]->partitionName); 
+	      free(_partitions->partitionData[i]); 
+	    }
+	  free(_partitions->partitionData); 
+	}
+ 
+      free(_partitions); 
+      _partitions = nullptr; 
+    }
+} 
+
+
+
+void AlignmentPLL::print() const 
+{
+  pllAlignmentDataDumpConsole(_pllAlignmentData) ;
+}
+
+
+void AlignmentPLL::writeHeader(std::ofstream &out) const 
+{
+  auto fileId = std::string{ "BINARY"} ; 
+  myWrite(out, fileId.c_str(), fileId.size() ); 
+
+  myWrite(out, &_pllAlignmentData->sequenceCount, 1); 
+  myWrite(out, &( _partitions->numberOfPartitions), 1); 
+  myWrite(out,&_pllAlignmentData->sequenceLength, 1) ; 
+}
+
+
+void AlignmentPLL::writeToFile( std::string fileName) const 
+{
+  auto numPart = _partitions->numberOfPartitions; 
+  auto numTax = _pllAlignmentData->sequenceCount; 
+
+  auto &&out = std::ofstream(fileName, std::ios::binary); 
+  
+  writeHeader(out); 
+
+  writeWeights(out); 
+
+  for(auto i = 1u; i <= (size_t) numTax; i++)
+    {
+      auto str = _pllAlignmentData->sequenceLabels[i]; 
+      int len = int(strlen(str) + 1u);
+      myWrite(out, &len, 1); 
+      myWrite(out, str, len); 
+    } 
+
+  // create the partition contributions 
+  auto partConts = std::vector<double>(numPart, 0. ); 
+  auto sum = 0.; 
+  for(auto model = 0; model < numPart; ++model)
+    {
+      auto p = _partitions->partitionData[model]; 
+      for(auto i = p->lower; i < p->upper; ++i)
+	{
+	  partConts[model] += _pllAlignmentData->siteWeights[i]; 
+	  sum +=  _pllAlignmentData->siteWeights[i]; 
+	}
+    }
+
+  for(auto &p : partConts)
+    p /= sum; 
+
+  myWrite(out, partConts.data(), numPart); 
+
+  for(auto model = 0u; model < (size_t)numPart; model++)
+    {
+      auto len = 0;
+      auto p = _partitions->partitionData[model];
+
+      myWrite(out, &(p->states),1); 
+      myWrite(out, &(p->maxTipStates),1); 
+      myWrite(out, &(p->lower),1); 
+      myWrite(out, &(p->upper),1); 
+      myWrite(out, &(p->dataType),1); 
+      myWrite(out, &(p->protModels),1); 
+      myWrite(out, &(p->protUseEmpiricalFreqs),1); // ???
+      myWrite(out, &(p->nonGTR),1); 
+
+      len = int(strlen(p->partitionName) + 1);
+
+      myWrite(out, &len,1); 
+      myWrite(out, p->partitionName, len);
+    } 
+
+  
+  for(auto i = 1; i <= _pllAlignmentData->sequenceCount; ++i)
+    {
+      myWrite(out, _pllAlignmentData->sequenceData[i], _pllAlignmentData->sequenceLength); 
+    }
+
+#if 0 
+
+  // TODO 
+
+  // also write infoness 
+  auto handle = _infoness.getRawBip(); 
+  
+  // std::cout << "INFO: again: "; 
+  // for(nat i = 0 ;i < tr->originalCrunchedLength; ++i)
+  //   {
+  //     if(_infoness.isSet(i))
+  // 	std::cout << 1; 
+  //     else 
+  // 	std::cout << 0 ; 
+  //   }
+  // std::cout << std::endl; 
+  
+  myWrite(out, handle.data(), handle.size()); 
+  
+  // for(model = 0; model < (size_t) tr->NumberOfModels; ++model)
+  //   {
+  //     myWrite(out, &(tr->partitionData[model].parsimonyLength),1); 
+  //     size_t numBytes =tr->partitionData[model].parsimonyLength * tr->partitionData[model].states * 2 * tr->mxtips ; 
+  //     myWrite(out, tr->partitionData[model].parsVect, numBytes); 
+  //   }
+#endif
+}
+
+
+
+void AlignmentPLL::writeWeights(std::ofstream &out) const 
+{
+  auto weights = _pllAlignmentData->siteWeights; 
+  auto seqLen = _pllAlignmentData->sequenceLength; 
+  auto elem =  *(std::max_element(weights, weights + seqLen)); 
+
+  // sorry, hard coding here 
+
+  if(elem < std::numeric_limits<uint8_t>::max())
+    {
+      int len = sizeof(uint8_t); 
+      myWrite(out, &len,1); 
+      for(auto i = 0; i < seqLen; ++i)
+	{
+	  auto val = uint8_t(weights[i]); 
+	  myWrite(out, &val, 1); 
+	}
+    }
+  else if(elem < std::numeric_limits<uint16_t>::max())
+    {
+      int len = sizeof(uint16_t); 
+      myWrite(out, &len,1); 
+      for(auto i = 0; i < seqLen; ++i)
+	{
+	  auto val = uint16_t(weights[i]); 
+	  myWrite(out, &val, 1); 
+	}
+    }
+  else if(elem < std::numeric_limits<int32_t>::max())
+    {
+      int len = sizeof(uint32_t); 
+      myWrite(out, &len,1); 
+      for(auto i = 0; i < seqLen; ++i)
+	{
+	  auto val = uint32_t(weights[i]); 
+	  myWrite(out, &val, 1); 
+	}
+    }
+  else 
+    {
+      assert(0); 
+      // cannot do that 
+      int len = sizeof(int64_t); 
+      myWrite(out, &len,1); 
+      for(auto  i = 0; i < seqLen; ++i)
+	{
+	  auto val = int64_t(weights[i]); 
+	  myWrite(out, &val, 1); 
+	}
+    }
+}
+
+
+void AlignmentPLL::createDummyPartition(Alphabet alphabet) 
+{
+  // get a unique file name 
+  srand((unsigned int)(time(NULL))) ; 		// MEH 
+  auto fn = std::string("") ;
+  auto fExists = true; 
+  while(fExists)
+    {
+      auto r = rand(); 
+
+      auto&& ss = std::stringstream{}; 
+      ss << "tmp." << r ; 
+      fn = ss.str(); 
+
+      fExists = static_cast<bool>(std::ifstream(fn)) ;
+    }
+
+  auto str = getStringFromType(alphabet); 
+  auto&& out = std::ofstream{fn}; 
+
+  out << str << ", unnamedPartition = 1 - " <<  _pllAlignmentData->sequenceLength << std::endl; 
+
+  out.close();
+
+  initPartitions(fn);
+
+  remove(fn.c_str()); 
+} 
+
+
+int AlignmentPLL::guessFormat(std::string file)
+{
+  auto &&in = std::ifstream(file); 
+  auto line = std::string{""};
+  getline(in, line); 
+  
+  auto iter = begin(line); 
+  auto lineEnd = end(line); 
+
+  while(iter != lineEnd && iswspace(*iter))
+    ++iter ; 
+
+  // first non-whitespace character must be > for fasta
+  if(*iter == '>')
+    return PLL_FORMAT_FASTA; 
+  else
+    return PLL_FORMAT_PHYLIP; 
+
+  // TODO much more could be done ...
+}
+
+
diff --git a/src/contrib/AlignmentPLL.hpp b/src/contrib/AlignmentPLL.hpp
new file mode 100644
index 0000000..eee7744
--- /dev/null
+++ b/src/contrib/AlignmentPLL.hpp
@@ -0,0 +1,51 @@
+#ifndef PHYLIPALIGNMENT_H
+#define PHYLIPALIGNMENT_H
+
+#include <iostream>
+#include <memory>
+
+#include "pll.h"
+#include "AbstractAlphabet.hpp"
+
+
+class AlignmentPLL
+{
+public:
+  AlignmentPLL(); 
+  AlignmentPLL(const AlignmentPLL& rhs) = delete; 
+  AlignmentPLL& operator=(const AlignmentPLL &rhs) = delete; 
+  AlignmentPLL(AlignmentPLL&& rhs); 
+  AlignmentPLL& operator=( AlignmentPLL &&rhs) ; 
+  
+  
+  void substituteBases () ;
+
+  void initAln(std::string alnFile, int fileType);
+  void initPartitions(std::string partitionFile); 
+  void print() const ;
+  virtual ~AlignmentPLL(); 
+  void writeToFile( std::string fileName) const ; 
+  void writeHeader(std::ofstream &out) const ; 
+
+  template<typename T>
+  void myWrite(std::ostream& out, const T* ptr, size_t length) const 
+  {
+    out.write((const char*) ptr, sizeof(T) * length) ; 
+  }
+
+  void writeWeights(std::ofstream &out) const;  
+
+  void createDummyPartition(Alphabet alphabet) ; 
+
+
+  static int guessFormat(std::string file); 
+
+private: 			// ATTRIBUTES 
+  pllAlignmentData* _pllAlignmentData; 
+  partitionList* _partitions; 
+};
+ 
+
+
+
+#endif /* PHYLIPALIGNMENT_H */
diff --git a/src/contrib/BipartitionExtractor.cpp b/src/contrib/BipartitionExtractor.cpp
new file mode 100644
index 0000000..891b7f2
--- /dev/null
+++ b/src/contrib/BipartitionExtractor.cpp
@@ -0,0 +1,409 @@
+#include "BipartitionExtractor.hpp"
+
+#include <iostream>
+#include <unordered_set>
+#include <cassert>
+#include <fstream>
+
+#include "Arithmetics.hpp" 
+#include "BipartitionHash.hpp"
+
+#include "TreePrinter.hpp"
+#include "BranchLengthsParameter.hpp"
+
+
+static void rejectIfExists(std::string filename)
+{
+  if( std::ifstream(filename) ) 
+    {
+      std::cerr << std::endl <<  "File " << filename << " already exists (probably \n"
+		<< "from previous run). Please choose a new run-id or remove previous output files. " << std::endl; 
+      exitFunction(-1, false); 
+    }
+}
+
+
+// does not include length of tips currently   
+BipartitionExtractor::BipartitionExtractor(std::vector<std::string> files, bool extractToOneHash, bool expensiveCheck)
+  : TreeProcessor(files, expensiveCheck)
+  , _bipHashes{}
+  , _uniqueBips{}
+  , _extractToOneHash(extractToOneHash)
+{
+  assert(_taxa.size( ) != 0); 
+}
+
+
+nat BipartitionExtractor::getNumTreesInFile(std::string file) const 
+{
+  nat result = 0; 
+  
+  auto && fh = std::ifstream(file); 
+  auto line = std::string();
+  while(getline(fh, line))
+    {
+      if(line.compare("end;") == 0 )
+	break;
+
+      if(line.find(";") != std::string::npos) 
+	++result; 
+    }
+
+  if(result < 1)
+    {
+      std::cout << "Header of file " << file << " possibly broken. Expected list of taxa terminated by semi-colon." << std::endl; 
+      exitFunction(-1, false); 
+    }
+
+  result -= 2;
+  return result; 
+}
+
+
+template<bool readBl>
+void BipartitionExtractor::extractBips(nat burnin)
+{
+  int ctr = 0; 
+  for (auto filename : _fns)
+    {
+      auto &&ifh = std::ifstream(filename); 
+      
+      nat end = getNumTreesInFile(filename); 
+
+      if( not _extractToOneHash || _bipHashes.size() == 0)
+	_bipHashes.emplace_back(_tralnPtr->getNumberOfTaxa());
+      auto &bipHash = _bipHashes.back(); 
+
+      // skip the burnin 
+      nat i = 0; 
+      for( ; i < burnin; ++i)
+	skipTree(ifh); 
+
+      for( ; i < end; ++i)
+	{
+	  nextTree<readBl>(ifh);
+	  bipHash.addTree(*_tralnPtr,true, true);
+	}
+      
+      ++ctr; 
+    }
+
+  extractUniqueBipartitions();
+}
+
+
+void BipartitionExtractor::extractUniqueBipartitions()
+{
+  auto set = std::unordered_set<Bipartition>{};
+
+  for(auto &bipHash : _bipHashes)
+    for(auto &bip : bipHash)
+      set.insert(std::get<0>(bip)); 
+
+  assert(_uniqueBips.size() == 0); 
+  
+  nat ctr = 0; 
+  for(auto &bip :set)
+    {
+      _uniqueBips[bip] = ctr; 
+      ++ctr; 
+    }
+}
+
+
+void BipartitionExtractor::printBipartitionStatistics(std::string id) const 
+{
+  assert(_uniqueBips.size() != 0); 
+
+  auto && ss = std::stringstream{}; 
+  ss << PROGRAM_NAME << "_bipartitionStatistics." << id ; 
+  rejectIfExists(ss.str()); 
+
+  auto && freqFile = std::ofstream (ss.str()); 
+  freqFile << "id\t";
+
+  freqFile
+    << "freq"
+    << "\tbl.mean"
+    << "\tbl.sd"
+    << "\tbl.cv"
+    << "\tbl.skew"
+    << "\tbl.ESS"
+    << "\tbl.perc5"
+    << "\tbl.perc25"
+    << "\tbl.perc50"
+    << "\tbl.perc75"
+    << "\tbl.perc95"
+    ; 
+
+  if(_fns.size() > 1)
+    freqFile << "\tbl.prsf" ; 
+  freqFile << std::endl; 
+
+  for(auto &bipElem: _uniqueBips)
+    {
+      auto allBls = std::vector<std::vector<double>>{};      
+      for(auto &bipHash : _bipHashes )
+	allBls.push_back(bipHash.getBranchLengths(bipElem.first)); 
+
+      auto allBlsConcat = std::vector<double>{}; 
+      for(auto &allBl : allBls)
+	allBlsConcat.insert(end(allBlsConcat), begin(allBl), end(allBl));
+      
+      assert(allBls.size() >  0); 
+
+      auto num = allBlsConcat.size() ; 
+      auto mean = Arithmetics::getMean(allBlsConcat) ; 
+      auto sd = sqrt(Arithmetics::getVariance(allBlsConcat) ); 
+      auto cv = Arithmetics::getCoefficientOfVariation(allBlsConcat); 
+      auto skew = Arithmetics::getSkewness(allBlsConcat);
+      auto ess = Arithmetics::getEffectiveSamplingSize(allBlsConcat) ; 
+      auto perc5= Arithmetics::getPercentile(0.05,allBlsConcat) ; 
+      auto perc25 = Arithmetics::getPercentile(0.25,allBlsConcat)  ; 
+      auto perc50 = Arithmetics::getPercentile(0.50,allBlsConcat) ; 
+      auto perc75 = Arithmetics::getPercentile(0.75,allBlsConcat) ; 
+      auto perc95 = Arithmetics::getPercentile(0.95,allBlsConcat) ; 
+
+      freqFile << bipElem.second // the id 
+	       << "\t" << num 
+	       << "\t" << mean
+	       << "\t" << sd 
+	       << "\t" << cv
+	       << "\t" << skew
+	       << "\t" << ess 
+	       << "\t" << perc5 
+	       << "\t" << perc25
+	       << "\t" << perc50 
+	       << "\t" << perc75
+	       << "\t" << perc95
+	; 
+	
+      if(_fns.size() > 1)
+	freqFile << "\t" << Arithmetics::PRSF(allBls); 
+
+      freqFile << std::endl; 
+    }
+  
+  std::cout << "printed bipartition statistics to file " << ss.str() << std::endl; 
+}
+
+
+void BipartitionExtractor::printBranchLengths(std::string id) const 
+{
+  assert(_uniqueBips.size() != 0); 
+  
+  auto &&ss = std::stringstream {}; 
+  ss << PROGRAM_NAME << "_bipartitionBranchLengths."  << id; 
+  rejectIfExists(ss.str()); 
+
+  auto&& blFile = std::ofstream(ss.str());
+
+  blFile << MAX_SCI_PRECISION; 
+  blFile  << "bipId\tfileId\tlength"  << std::endl;
+  nat ctr = 0; 
+  for(auto &bipHash : _bipHashes)
+    {
+      for(auto &bip : bipHash)
+	{
+	  for(auto length : bipHash.getBranchLengths(bip.first) )
+	    {
+	      blFile << _uniqueBips.at(bip.first) << "\t"  << ctr  << "\t" << length << std::endl; 
+	    }
+	}
+      ++ctr ; 
+    }
+
+  std::cout << "printed branch lengths associated with bipartitions to " << ss.str() << std::endl; 
+}
+
+void BipartitionExtractor::printFileNames(std::string id) const 
+{
+  assert(_uniqueBips.size() != 0); 
+
+  auto &&ss = std::stringstream{}; 
+  ss << PROGRAM_NAME << "_fileNames." << id; 
+  rejectIfExists(ss.str()); 
+
+  auto  &&ff = std::ofstream(ss.str());
+  ff << "id\tfileName" << std::endl; 
+  nat ctr = 0; 
+  for(auto &fn : _fns)
+    {
+      ff << ctr << "\t" << fn << std::endl; 
+      ++ctr; 
+    }
+
+  std::cout << "printed file name identifiers (for future reference) to "<< ss.str() << std::endl; 
+}
+
+
+void BipartitionExtractor::printBipartitions(std::string id) const 
+{
+  assert(_uniqueBips.size() != 0); 
+
+  auto &&ss = std::stringstream{}; 
+  ss << PROGRAM_NAME << "_bipartitions." << id; 
+  rejectIfExists(ss.str()); 
+
+  auto &&out = std::ofstream(ss.str());
+
+  for(auto &bipElem :  _uniqueBips)
+    {
+      auto &bip = std::get<0>(bipElem); 
+      auto myId = std::get<1>(bipElem); 
+
+      assert(bip.count() != 0 ); 
+      
+      out << myId << "\t" ; 
+      bip.printVerbose(out, _taxa);
+
+      out << std::endl;       
+    }
+
+  std::cout << "printed bipartitions and identifiers to file " << ss.str() << std::endl; 
+}
+
+
+std::string BipartitionExtractor::bipartitionsToTreeString(std::vector<Bipartition> bips, bool printSupportLocal, bool printBranchLengthsLocal, bool phylipStyle) const 
+{
+  // contains ids of direct children 
+  auto directSubBips  = std::vector<std::vector<nat> >(bips.size()); 
+
+  std::sort(bips.begin(), bips.end(),
+	    [](const Bipartition& bipA, const Bipartition& bipB)
+	    {
+	      return bipA.count() < bipB.count() ; 
+	    } ); 
+
+  auto toplevelBip = Bipartition();
+  const auto& taxa = getTaxa();	
+  toplevelBip.reserve(taxa.size()); 
+
+  for(nat i = 0; i < taxa.size(); ++i)
+    toplevelBip.set(i); 
+  auto belowTop = std::vector<nat>{}; 
+
+  // search the parent bipartition for each bipartition 
+  for(nat i = 0; i < bips.size(); ++i)
+    {
+      bool parentFound = false; 
+      const auto &bipA = bips[i]; // a <=> i
+      for(nat j = i+1 ; j < bips.size() ;++j)
+	{
+	  const auto &bipB = bips[j];  // b <=> j 
+	  if(bipA.isSubset(bipB))
+	    {
+
+	      directSubBips[j].push_back(i);
+	      parentFound = true ; 
+	      break; 
+	    }
+	}
+      
+      if( not parentFound )
+	belowTop.push_back(i);
+    }
+
+  bips.push_back(toplevelBip); 
+  directSubBips.push_back(belowTop); 
+
+  auto&& ss = std::stringstream{}; 
+  buildTreeRecursive( nat (bips.size()-1), directSubBips, bips, ss, printSupportLocal, printBranchLengthsLocal, phylipStyle); 
+
+  return ss.str(); 
+} 
+
+
+
+void BipartitionExtractor::buildTreeRecursive(nat currentId, const std::vector<std::vector<nat> >& directSubBips, 
+					      const std::vector<Bipartition> &bips, std::stringstream &result, 
+					      bool printSupportLocal, bool printBranchLengthsLocal, bool phylipStyle) const
+{
+  assert(_bipHashes.size() ==  1); 
+  nat totalTrees = _bipHashes[0].getTreesAdded();
+  auto taxa = getTaxa(); 
+  
+  const auto& curBip = bips.at(currentId); 
+  auto children = directSubBips.at(currentId); 
+
+  double mySupport = 0 ; 
+
+  if(currentId != bips.size() -1 )
+    {
+      auto lengths = _bipHashes[0].getBranchLengths(curBip);
+      mySupport = double(_bipHashes[0].getPresence(curBip).count()) / totalTrees; 
+      assert(mySupport > 0. && mySupport <= 1.); 
+    }
+
+  // can only be one taxon, print it 
+  bool isTaxon = children.size() == 0; 
+  if(isTaxon )
+    {
+      //  TODO an efficient implementation (relevant for credibleset)
+      // would do that only once ...
+      auto ind = curBip.findIndex(); 
+      
+      if(phylipStyle)
+	result << taxa.at(ind); 
+      else 
+	{
+	  // ids are 1-based
+	  result << ind + 1 ; 
+	}
+      assert(curBip.count() == 1 ); 
+    }
+  else 
+    {
+      result << "("; 
+      bool isFirst = true; 
+
+      for(auto childId : children)
+	{
+	  result << ( isFirst ? "" : ",") ; 
+	  buildTreeRecursive(childId,directSubBips, bips, result, printSupportLocal, printBranchLengthsLocal, phylipStyle); 
+	  isFirst = false;  
+	}
+
+      result << ")"; 
+    }
+
+
+ if(currentId != bips.size()  -1 )
+   {
+     if(printSupportLocal)
+       {
+	 if(phylipStyle)
+	   {
+	     if(not isTaxon)
+	       {
+		 result << "" << SOME_FIXED_PRECISION << mySupport << ""; 
+	       }
+	   }
+	 else 
+	   {
+	     result << "[&prob=" << MAX_SCI_PRECISION   << mySupport
+		    << ",prob(percent)=\"" << std::fixed << std::setprecision(0) << mySupport * 100  << "\"" 
+		    << "]"; 
+	   }
+       }
+
+     if(printBranchLengthsLocal)
+       {
+	 assert(_bipHashes.size() == 1); 
+	 auto lengths = _bipHashes[0].getBranchLengths(curBip);
+	 auto median = Arithmetics::getPercentile(.5, lengths);
+	 auto mean = Arithmetics::getMean(lengths); 
+	 auto p95 = Arithmetics::getPercentile(.95, lengths); 
+	 auto p5 = Arithmetics::getPercentile(.05, lengths); 
+	 if(phylipStyle	)
+	   result << MAX_SCI_PRECISION << ":" << median ; 
+	 else 
+	   result << MAX_SCI_PRECISION << ":" << median << "[&length_mean="<< mean << ",length_median=" << median << ",length_95%HDP={" << p5 << "," << p95 << "}]" ; 
+       }
+   }
+ else 
+   result << ";";
+}
+
+template void BipartitionExtractor::extractBips<true>(nat burnin); 
+template void BipartitionExtractor::extractBips<false>(nat burnin); 
diff --git a/src/contrib/BipartitionExtractor.hpp b/src/contrib/BipartitionExtractor.hpp
new file mode 100644
index 0000000..dc78d89
--- /dev/null
+++ b/src/contrib/BipartitionExtractor.hpp
@@ -0,0 +1,42 @@
+#ifndef BIPARTITION_EXTRACTOR_HPP
+#define BIPARTITION_EXTRACTOR_HPP
+
+#include <unordered_map>
+
+#include "TreeProcessor.hpp"	
+#include "BipartitionHash.hpp"
+
+class BipartitionExtractor : public TreeProcessor
+{
+public: 
+  BipartitionExtractor(std::vector<std::string> files,bool extractToOneHash, bool expensiveCheck);
+  BipartitionExtractor( BipartitionExtractor&& rhs) = delete ; 
+  BipartitionExtractor& operator=(BipartitionExtractor rhs) = delete ; 
+  virtual ~BipartitionExtractor(){}
+
+  template<bool readBL>
+  void extractBips(nat burnin ); 
+  void printBipartitions(std::string id) const ;
+  void printBipartitionStatistics(std::string id) const ; 
+  void printFileNames(std::string id) const ; 
+  void printBranchLengths(std::string id) const ; 
+
+  const std::vector<BipartitionHash>& getBipartitionHashes() const {return _bipHashes; } 
+
+  std::string bipartitionsToTreeString( std::vector<Bipartition> bips, bool printSupport, bool printBranchLengths, bool phylipStyle) const ; 
+
+  nat getNumTreesInFile(std::string file) const ; 
+
+private: 
+  void extractUniqueBipartitions() ;
+  void buildTreeRecursive(nat currentId, const std::vector<std::vector<nat> >& directSubBips, const std::vector<Bipartition> &bips, std::stringstream &result, bool printSupport, bool printBranchLengths, bool phylipStyle) const; 
+
+
+private: 			// ATTRIBUTES
+  std::vector<BipartitionHash> _bipHashes; 
+  std::unordered_map<Bipartition,nat> _uniqueBips; 
+  bool _extractToOneHash; 
+}; 
+
+
+#endif
diff --git a/src/contrib/ConsensusTree.cpp b/src/contrib/ConsensusTree.cpp
new file mode 100644
index 0000000..56f6545
--- /dev/null
+++ b/src/contrib/ConsensusTree.cpp
@@ -0,0 +1,182 @@
+#include "ConsensusTree.hpp"
+#include <limits>
+#include <iomanip>
+#include <map> 
+#include <cassert> 
+#include <algorithm>
+
+
+ConsensusTree::ConsensusTree(std::vector<std::string> files, double burnin, double threshold, bool isMRE  )
+  : bipEx(files, true, true)
+  , _threshold{threshold}
+  , _isMRE{isMRE}
+{
+  auto nums = std::vector<nat>{};
+
+  for( auto &file : files)
+    nums.push_back( bipEx.getNumTreesInFile(file)); 
+
+  nat minTrees = *(std::min_element(begin(nums), end(nums)));
+  nat absBurnin = int(double(minTrees) * burnin); 
+  bipEx.extractBips<true>(absBurnin); 
+}
+
+
+std::vector<Bipartition> ConsensusTree::getRefinedConsensusTree(const std::vector<Bipartition> &consensusBips, const std::vector<Bipartition> &minorityBips) const 
+{
+  auto result = consensusBips; 
+  auto maxBipsNeeded =  2 * nat(bipEx.getTaxa().size())  - 3 ; 
+  auto maxElem = bipEx.getTaxa().size(); 
+  
+  for(auto minBip : minorityBips)
+    {
+      if(result.size() >= maxBipsNeeded)
+	break; 
+
+      auto isCompat = true; 
+      for(auto &bip : result)
+	{
+	  isCompat &= bip.isCompatible(minBip, int(maxElem));
+	  if(not isCompat)
+	    break; 
+	}
+      
+      if(isCompat)
+	result.push_back(minBip); 
+    }
+
+  return result; 
+}
+
+
+std::string ConsensusTree::getConsensusTreeString( bool printNames) const 
+{
+  auto result = std::string{}; 
+  const auto& bipHashes = bipEx.getBipartitionHashes();
+
+  auto bip2Occ = std::unordered_map<Bipartition,nat>{}; 
+  auto maxBip = 2 * bipEx.getTaxa().size() - 3; 
+
+  nat totalTreesAdded = 0; 
+  for(auto &bipHash : bipHashes)
+    totalTreesAdded += bipHash.getTreesAdded(); 
+
+  nat absThreshold = 0; 
+  if(_isMRE)
+    absThreshold = nat(ceil(totalTreesAdded * .5));
+  else 
+    absThreshold = nat(ceil(totalTreesAdded * _threshold)); 
+
+  assert(absThreshold > 0. ); 
+
+  // determine unique bipartitions  
+  for(auto &bipHash : bipHashes)
+    {
+      for(auto &bipOccPair : bipHash)
+	{
+	  auto &bip = std::get<0>(bipOccPair); 
+	  if( bip2Occ.find(bip) == bip2Occ.end())
+	    bip2Occ[bip] = 0; 
+	}
+    }
+  
+  for(auto &bipOccPair : bip2Occ)
+    {
+      auto &bip = std::get<0>(bipOccPair); 
+      auto &occ = std::get<1>(bipOccPair); 
+      for(auto bipHash : bipHashes)
+	occ += bipHash.getPresence(bip).count(); 
+    }
+
+  // sort the bipartitions 
+  auto sortBySecond = [](const std::pair<Bipartition,nat> &elemA, const std::pair<Bipartition,nat> &elemB)
+    { 
+      return elemA.second < elemB.second; 
+    }; 
+
+  auto bip2occVect = std::vector<std::pair<Bipartition,nat> >{bip2Occ.begin(), bip2Occ.end()}; 
+  std::sort(bip2occVect.begin(), bip2occVect.end(), sortBySecond); 
+
+  auto consensus = std::vector<Bipartition>{}; 
+  auto minorityBips = std::vector<Bipartition>{}; 
+
+  for(auto &bipPair : bip2occVect)
+    {
+      if(absThreshold <= bipPair.second )
+	consensus.push_back(bipPair.first); 
+      else 
+	minorityBips.push_back(bipPair.first); 
+    }
+
+  assert(consensus.size() <= maxBip ); 
+
+  if(_isMRE)
+    consensus = getRefinedConsensusTree(consensus, minorityBips); 
+
+  assert(consensus.size() <= maxBip ); 
+
+  result = bipEx.bipartitionsToTreeString(consensus, true, true, printNames); 
+
+  return result; 
+}
+
+
+
+
+std::string ConsensusTree::getTreeHeader() const
+{
+  auto taxa = bipEx.getTaxa();
+
+  auto&& oss = std::ostringstream{}; 
+  oss << "#NEXUS\n" ; 
+  oss << "begin taxa;\n"; 
+  oss << "\tdimensions ntax="  << taxa.size() ; 
+  oss << ";\n"; 
+  oss << "\ttaxlabels\n"; 
+  for(auto t : taxa)
+    {
+      oss << "\t\t" << t << "\n"; 
+    }
+  oss << "\t;\n"; 
+  oss << "end;\n" ; 
+  oss << "begin trees;\n"; 
+  oss << "\ttranslate\n"; 
+  nat ctr = 1; 
+  for(auto t : taxa)
+    {
+      oss << "\t\t" << ctr << "\t" << t << ( ctr == taxa.size() ? ";"  : "," ) << "\n"; 
+      ++ctr;
+    }
+
+
+  auto type = getType();
+
+  oss << "\ttree " << type << " = [&U] "; 
+  return oss.str(); 
+} 
+
+
+
+std::string ConsensusTree::getType() const 
+{
+  auto type = std::string{};
+  if(_isMRE)
+    {
+      type = "ConsensusExtendedMajorityRule" ; 
+    }
+  else 
+    {
+      if( std::fabs(_threshold -1. )  < std::numeric_limits<double>::epsilon() ) 
+	type = "ConsensusStrict" ; 
+      else if( std::fabs( _threshold - 0.5 ) <  std::numeric_limits<double>::epsilon())
+	type = "ConsensusMajorityRule" ; 
+      else 
+	{
+	  auto &&ss = std::ostringstream{}; 
+	  ss << "ConsensusThreshold" << std::setprecision(0) << std::fixed << nat(_threshold * 100.); 
+	  type = ss.str();
+	}
+    }
+  return type; 
+}
+
diff --git a/src/contrib/ConsensusTree.hpp b/src/contrib/ConsensusTree.hpp
new file mode 100644
index 0000000..51be49d
--- /dev/null
+++ b/src/contrib/ConsensusTree.hpp
@@ -0,0 +1,24 @@
+#ifndef CONSENSUSTREE_HPP
+#define CONSENSUSTREE_HPP
+
+#include "BipartitionExtractor.hpp"
+#include <vector>
+#include <string>
+
+class ConsensusTree 
+{
+public: 
+  ConsensusTree(std::vector<std::string> files, double burnin, double threshold, bool isMRE  ); 
+  std::string getConsensusTreeString(bool printNames) const ;  
+  std::vector<Bipartition>  getRefinedConsensusTree(const std::vector<Bipartition> &consensusBips, const std::vector<Bipartition> &minorityBips) const ; 
+  std::string getTreeHeader() const; 
+  std::string getType() const ; 
+
+private:   
+  BipartitionExtractor bipEx; 
+  double _threshold; 
+  bool _isMRE; 
+}; 
+
+
+#endif
diff --git a/src/contrib/CredibleSet.cpp b/src/contrib/CredibleSet.cpp
new file mode 100644
index 0000000..110ad4e
--- /dev/null
+++ b/src/contrib/CredibleSet.cpp
@@ -0,0 +1,125 @@
+#include "CredibleSet.hpp"
+
+
+#include <algorithm>
+#include <map>
+
+CredibleSet::CredibleSet(std::vector<std::string> files)
+  : _bipEx(files, true, true)
+{
+  _bipEx.extractBips<true>(0);
+  // const auto &hash = _bipEx.getBipartitionHashes()[0]; 
+  // _totalTrees = hash.getTreesAdded(); 
+} 
+
+
+void CredibleSet::printCredibleSet(std::string filename, double thresh)
+{
+  assert(_bipEx.getBipartitionHashes().size() == 1 ); 
+  const auto& bipHash = _bipEx.getBipartitionHashes()[0]; 
+  auto numTax = _bipEx.getTaxa().size();
+  auto numBip =  2 * numTax - 3; 
+
+  // sort the elems in the hash by number of occurrences of the bipartition 
+  auto sortedBipOcc = std::vector<std::pair<Bipartition,Bipartition>>{}; 
+  for(auto elem : bipHash)    
+    {
+      // if(elem.first.count() > 1 )
+      sortedBipOcc.push_back(std::make_pair(elem.first, elem.second)); 
+    }
+
+  auto sortFun = [](const std::pair<Bipartition, Bipartition> &elemA, 
+  		    const std::pair<Bipartition, Bipartition> &elemB)
+    {
+      return elemA.second.count() > elemB.second.count() ; 
+    }; 
+  std::sort(sortedBipOcc.begin(), sortedBipOcc.end(), sortFun ); 
+
+  auto hashFun = [](const std::vector<nat> &tree) -> size_t 
+    {
+      size_t result = 0u; 
+      for(nat i = 0; i < tree.size() ;++i)
+	result ^= std::hash<nat>()( tree.at(i)); 
+      return result; 
+    }; 
+
+  auto equalFun = [] (const std::vector<nat> &treeA,  const std::vector<nat> &treeB)  -> bool 
+    {
+      bool equal = true;  
+      for(nat i = 0; equal && i < treeA.size() ; ++i)
+	equal &= treeA.at(i) ==  treeB.at(i); 
+      return equal; 
+    }; 
+
+  auto trees =  std::unordered_map<std::vector<nat>,nat, decltype(hashFun), decltype(equalFun)> {0,hashFun, equalFun}; 
+  
+  nat totalTrees = _bipEx.getBipartitionHashes().at(0).getTreesAdded(); 
+
+  for(nat i = 0; i < totalTrees; ++i )
+    {
+      auto oneTree = std::vector<nat>{}; 
+      nat ctr = 0; 
+      for(auto &elem : sortedBipOcc)
+	{
+	  if(elem.second.isSet(i))
+	    oneTree.push_back(ctr); 
+	  ++ctr; 
+	  if(oneTree.size() == numBip)
+	    break; 
+	}
+
+      // std::cout << "expected " << oneTree.size() << " , got " << numBip << std::endl;
+      assert(oneTree.size()  == numBip ); 
+
+      auto& iter = trees[oneTree]; 
+      ++iter; 
+    }
+
+  nat sum = 0; 
+  for(auto &elem : trees)
+    sum += elem.second; 
+  assert(sum == totalTrees); 
+
+  auto treeAndOcc = std::vector<std::pair<std::vector<nat>,nat> >{}; 
+  for(auto elem : trees )
+    treeAndOcc.push_back(elem); 
+  std::sort(treeAndOcc.begin(), treeAndOcc.end(), [](const std::pair<std::vector<nat>,nat> &elemA,
+						     const std::pair<std::vector<nat>,nat> &elemB )
+	    {
+	      return elemA.second > elemB.second; 
+	    }); 
+
+  auto treeStrings = std::vector<std::pair<std::string, nat> >{}; 
+  for(auto &elem : treeAndOcc)
+    {
+      auto& tree = elem.first;  
+
+      auto bips = std::vector<Bipartition>{}; 
+      for(auto &id : tree)
+	bips.push_back(sortedBipOcc[id].first); 
+
+      auto result = _bipEx.bipartitionsToTreeString(bips, false , false, true); 
+      treeStrings.push_back(std::make_pair(result, elem.second)); 
+    }
+
+  nat absThreshold = nat( totalTrees * thresh); 
+  std::sort(begin(treeStrings), end(treeStrings),
+	    [](const std::pair<std::string,nat> &elemA, const std::pair<std::string, nat> &elemB)
+	    {
+	      return elemA.second > elemB.second; 
+	    }); 
+  
+  auto &&outfile = std::ofstream (filename); 
+  outfile << "freq\ttree" << std::endl; 
+  
+  nat accProb = 0; 
+  for(auto t : treeStrings)
+    {
+      outfile << t.second << "\t" << t.first << std::endl; 
+      accProb += t.second; 
+      if(accProb > absThreshold)
+	break; 
+    }
+
+  std::cout << "printed the " << thresh *  100  <<  "% credible set to " << filename << std::endl; 
+} 
diff --git a/src/contrib/CredibleSet.hpp b/src/contrib/CredibleSet.hpp
new file mode 100644
index 0000000..01ad5af
--- /dev/null
+++ b/src/contrib/CredibleSet.hpp
@@ -0,0 +1,19 @@
+#ifndef  _CREDIBLE_SET_H
+#define  _CREDIBLE_SET_H
+
+#include "BipartitionExtractor.hpp" 
+
+
+class CredibleSet
+{
+public: 
+  CredibleSet(std::vector<std::string> file); 
+  void printCredibleSet(std::string filename, double thresh)  ; 
+
+private: 
+  BipartitionExtractor _bipEx ; 
+  // nat _totalTrees;   
+}; 
+
+
+#endif
diff --git a/src/contrib/README.txt b/src/contrib/README.txt
new file mode 100644
index 0000000..df2589e
--- /dev/null
+++ b/src/contrib/README.txt
@@ -0,0 +1,3 @@
+This module contains files that are not part of the core of
+Yggdrasil/ExaBayes, but used by the satellite programs of ExaBayes
+(e.g., consensus tree).
diff --git a/src/contrib/SplitFreqAssessor.cpp b/src/contrib/SplitFreqAssessor.cpp
new file mode 100644
index 0000000..953c10b
--- /dev/null
+++ b/src/contrib/SplitFreqAssessor.cpp
@@ -0,0 +1,167 @@
+#include <fstream>
+#include <algorithm>
+#include <sstream> 
+#include <cassert>
+
+#include <ncl/ncl.h>
+
+#include "TreeAln.hpp"
+#include "Arithmetics.hpp"
+#include "SplitFreqAssessor.hpp"
+#include "BipartitionHash.hpp"
+
+
+SplitFreqAssessor::SplitFreqAssessor(std::vector<string> fileNames, bool expensiveCheck)
+  : TreeProcessor(fileNames, expensiveCheck)
+  , newBipHashes{}
+  , file2numTree{}
+{
+  for(auto file : fileNames)
+    {
+      file2numTree[file] = getNumTreeAvailable(file);
+      newBipHashes.emplace_back(_taxa.size());
+    }
+}
+
+
+// void SplitFreqAssessor::extractBipsNew(nat start, nat end, bool takeAll)
+void SplitFreqAssessor::extractBips( const std::vector<nat> &start, const std::vector<nat> &end) 
+{
+  int ctr = 0; 
+  
+  for (auto filename : _fns)
+    {
+      nat endhere = end[ctr]; 
+      // nat endhere = end; 
+      // if(takeAll)
+      // 	endhere = file2numTree[filename]; 
+
+      auto&& ifh = std::ifstream{filename}; 
+
+      for(nat i = 0; i < start[ctr]; ++i)
+	skipTree(ifh);
+
+      auto &bipHash  = newBipHashes.at(ctr);
+      for(nat i = start[ctr] ; i < endhere; ++i)
+	{
+	  nextTree<false>(ifh);
+	  bipHash.addTree(*_tralnPtr,false, false);
+	}
+      ++ctr; 
+    }
+}
+
+
+auto SplitFreqAssessor::computeAsdsfNew(double ignoreFreq)
+ -> std::pair<double,double> 
+{
+  auto allBips = std::unordered_set<Bipartition>{}; 
+
+  for(auto &h : newBipHashes)
+    for(auto &elem : h)
+      allBips.insert(elem.first);
+
+  auto numTrees = std::vector<double>{}; 
+  for(auto &elem : newBipHashes)
+    {
+      nat tn = elem.getTreesAdded() ; 
+      numTrees.push_back(tn);
+    }
+
+  auto numOccs = std::unordered_map<Bipartition,std::vector<double> >{}; 
+  for(auto elem : allBips)
+    {
+      auto tmp = std::vector<double>{};
+      for(auto &h : newBipHashes)
+	tmp.push_back( double(h.getPresence(elem).count()) );
+      numOccs.insert(std::make_pair(elem, tmp)); 
+    }
+
+  auto asdsfPart = std::vector<double>{};
+  for(auto &elem : allBips)
+    {
+      nat ctr = 0; 
+      bool isRelevant = false;  
+      for(auto &v : numOccs[elem])
+	{
+	  v /= numTrees.at(ctr) ; 
+	  isRelevant |= ( ignoreFreq < v); 
+	  ++ctr; 
+	}
+      
+      auto sd = sqrt ( Arithmetics::getVariance(numOccs[elem]) ) ; 
+
+      if(isRelevant)
+	asdsfPart.push_back( sd );
+    }
+
+  auto asdsfMax = std::max_element(begin(asdsfPart), end(asdsfPart)); 
+  auto mean = Arithmetics::getMean(asdsfPart); 
+
+  return std::make_pair(mean, *asdsfMax); 
+}
+
+nat SplitFreqAssessor::getNumTreeAvailable(string fileName)
+{  
+  string whitespace = " \t"; 
+  ifstream infile(fileName); 
+  string line ; 
+  bool foundTaxaStart = false,
+    foundTreeStart = false; 
+  int numTrees = 0; 
+
+  while(getline(infile, line))
+    {
+      auto cleanline = trim(line); 
+
+      if(cleanline.compare("end;") == 0 )
+	{
+	  break; 
+	}
+      else if(foundTreeStart)	// check number of trees 
+	{
+	  if(cleanline[cleanline.size()-1] == ';') 
+	    ++numTrees; 
+	  else 
+	    break; 		// DONE  
+	}
+      else if(foundTaxaStart) 	// check if all taxa are there and have the appropriate number 
+	{
+	  if(cleanline[cleanline.size()-1] == ';')
+	    foundTreeStart = true ; 
+
+	  string cleanerString =  trim(cleanline,  ",;"); 
+	  auto pos = cleanerString.find_first_of(whitespace, 0); 
+	  string num = cleanerString.substr(0, pos),
+	    name = cleanerString.substr(pos+1, cleanerString.size()); 
+
+	  int index; 
+	  istringstream(num) >> index ; 
+	  index--; 
+
+	  if(name.compare(_taxa.at(index)) != 0)
+	    {
+	      std::cout << "expected " << name << " but got " << _taxa.at(index) << std::endl; 
+	      assert(0); // assert same taxa names 
+	    }
+	} 
+      else if(cleanline.compare("translate") == 0)
+	foundTaxaStart = true; 
+    }
+
+  assert(foundTaxaStart && foundTreeStart); 
+  return numTrees; 
+}
+
+
+int SplitFreqAssessor::getMinNumTrees()
+{
+  nat minimum = std::numeric_limits<nat>::max(); 
+  for(auto elem : file2numTree)
+    {
+      nat avHere = std::get<1>(elem); 
+      if(avHere < minimum)
+	minimum = avHere;       
+    }
+  return minimum; 
+} 
diff --git a/src/contrib/SplitFreqAssessor.hpp b/src/contrib/SplitFreqAssessor.hpp
new file mode 100644
index 0000000..45fd24d
--- /dev/null
+++ b/src/contrib/SplitFreqAssessor.hpp
@@ -0,0 +1,44 @@
+/** 
+    @file SplitFreqAssessor.hpp
+
+    @brief Calculates the asdsf. 
+
+    @notice This file is full of hacks, to get this somehow going. 
+ */ 
+
+#ifndef _AVGSPLITFREQASSESSOR_H
+#define _AVGSPLITFREQASSESSOR_H
+
+#include "TreeProcessor.hpp"
+#include "BipartitionHash.hpp"
+
+class SplitFreqAssessor : public TreeProcessor 
+{
+public: 
+  SplitFreqAssessor(std::vector<std::string>fileNames, bool expensiveCheck);
+  SplitFreqAssessor(const SplitFreqAssessor &rhs) = default; 
+  SplitFreqAssessor( SplitFreqAssessor &&rhs) = default; 
+  SplitFreqAssessor& operator=(const SplitFreqAssessor &rhs)  = default; 
+  SplitFreqAssessor& operator=(SplitFreqAssessor &&rhs) = default ; 
+
+  virtual ~SplitFreqAssessor(){}
+  /** 
+      @brief use the new bipartition hash for extracting bipartitions 
+   */ 
+  void extractBips( const std::vector<nat> &start, const std::vector<nat> &end); 
+  /** 
+      @brief gets the minimum number of trees present in all of the files 
+  */ 
+  int getMinNumTrees(); 
+  
+  std::pair<double,double> computeAsdsfNew(double ignoreFreq);
+
+  nat getNumTreeAvailable(std::string filename); 
+
+private: 			// ATTRIBUTES
+
+  std::vector<BipartitionHash> newBipHashes;   
+  std::unordered_map<std::string, nat> file2numTree; 
+}; 
+
+#endif
diff --git a/src/data-struct/Bipartition.cpp b/src/data-struct/Bipartition.cpp
new file mode 100644
index 0000000..4da8a2c
--- /dev/null
+++ b/src/data-struct/Bipartition.cpp
@@ -0,0 +1,327 @@
+#include "Bipartition.hpp"
+
+#include <iostream>
+#include <limits>
+
+
+// TODO at some point improve this  
+size_t Bipartition::numBits = sizeof(nat) * 8; 
+size_t Bipartition::numBitsMinusOne = numBits - 1 ; // not esthetic, but efficient 
+size_t Bipartition::bitShift = 5; 
+nat Bipartition::allOne = std::numeric_limits<nat>::max();
+std::vector<nat> Bipartition::perBitMask = {
+  1u, 
+  1u <<  1, 
+  1u <<  2,
+  1u <<  3,
+  1u <<  4,
+  1u <<  5,
+  1u <<  6,
+  1u <<  7,
+  1u <<  8,
+  1u <<  9,
+  1u <<  10,
+  1u <<  11,
+  1u <<  12,
+  1u <<  13,
+  1u <<  14,
+  1u <<  15,
+  1u <<  16,
+  1u <<  17,
+  1u <<  18,
+  1u <<  19,
+  1u <<  20,
+  1u <<  21,
+  1u <<  22,
+  1u <<  23,
+  1u <<  24,
+  1u <<  25,
+  1u <<  26,
+  1u <<  27,
+  1u <<  28,
+  1u <<  29,
+  1u <<  30,
+  1u <<  31
+}; 
+
+
+
+
+static const char LogTable256[256] = 
+{
+#define LT(n) n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n
+  -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+  LT(4), LT(5), LT(5), LT(6), LT(6), LT(6), LT(6),
+  LT(7), LT(7), LT(7), LT(7), LT(7), LT(7), LT(7), LT(7)
+};
+
+
+
+Bipartition::Bipartition()
+  : bip(0)
+  , hash(0)
+{
+  
+}
+
+
+bool Bipartition::operator==(const Bipartition &rhs) const
+{
+  // TODO ui ui ui that's inefficient...
+  // size cannot be used at all here. And hash woudl be nice, but definitely makes trouble with operator& 
+  
+
+  // if( not ( getHash() == rhs.getHash() && bip.size() == rhs.bip.size()) )
+  //   return false; 
+  // else 
+  //   {
+
+  // auto longestLength = std::max(bip.size(), rhs.bip.size()); 
+  auto shortestLength = std::min(bip.size(), rhs.bip.size()); 
+
+  auto result = true; 
+  for(nat i = 0; result && i < shortestLength; ++i)
+    result &= ( bip.at(i) == rhs.bip.at(i)) ;  
+  
+  for(auto i = shortestLength; result && i < bip.size(); ++i)
+    result &= ( bip.at(i) == 0 ) ; 
+  
+  for(auto i = shortestLength; result && i < rhs.bip.size() ;++i)
+    result &= (rhs.bip.at(i) == 0); 
+  
+  return result; 
+}
+
+
+Bipartition Bipartition::operator| (const Bipartition &rhs) const
+{
+  auto result = Bipartition{}; 
+
+  auto longestLength = std::max(bip.size() , rhs.bip.size()); 
+  auto shorterLength = std::min(bip.size(), rhs.bip.size()); 
+  
+  result.bip.resize(longestLength, 0u); 
+  // std::cout << "resizing to " << longestLength << std::endl; 
+  // std::cout << "now: " << result << std::endl; 
+
+  for(nat i = 0; i < shorterLength; ++i)
+    result.bip[i] = bip[i] | rhs.bip[i]; 
+
+  if( bip.size() < rhs.bip.size() )
+    {
+      for(auto i = shorterLength; i < longestLength; ++i)
+	result.bip[i] = rhs.bip[i]; 
+    }
+  else if(rhs.bip.size() < bip.size())
+    {
+      for(auto i = shorterLength; i < longestLength; ++i)
+	result.bip[i] = bip[i]; 
+    }
+  
+  result.hash = hash ^ rhs.hash; 
+
+  return result; 
+}
+
+
+
+void Bipartition::initializeWithTaxon(nat pos, nat ranNum)
+{
+  reserve(pos + 1); 
+  set(pos); 
+  hash = ranNum; 
+} 
+
+
+
+void Bipartition::reserve(size_t num)
+{
+  ++num ;
+  auto elemsNeeded = num / numBits + ( num % numBits > 0 ? 1 : 0  ) ; 
+
+  // auto initSize = bip.size(); 
+  // bool didResize = false; 
+  if( bip.size()  < elemsNeeded )
+    {
+      // didResize = true; 
+      bip.resize(elemsNeeded , 0); // meh
+    }
+  // std::cout  << "have " << initSize << " needing " << elemsNeeded << (didResize ? " => RESIZE " : "")<< std::endl; 
+}
+
+void Bipartition::set(nat pos)
+{
+  bip[ pos >> bitShift ] |= perBitMask[ pos &  numBitsMinusOne ]; 
+}
+
+
+bool Bipartition::isSet(nat pos) const
+{
+  if(getElemsReserved() <= pos )
+    return false; 
+  else 
+    return (bip[ pos >> bitShift ] & perBitMask[ pos & numBitsMinusOne ] ) != 0; 
+}
+
+// void Bipartition::unset(nat pos)
+// {
+//   bip[ pos  >> bitShift ] &= ( allOne & perBitMask[ pos & numBitsMinusOne ]) ; 
+// } 
+
+
+std::ostream& operator<<(std::ostream& out, const Bipartition& rhs)
+{
+  nat total = rhs.count(); 
+  nat seen = 0;
+
+  for(auto &elem : rhs.bip)
+    {
+      for(nat i = 0; i < Bipartition::numBits; ++i)
+	{
+	  if( elem & Bipartition::perBitMask[i] )
+	    {
+	      ++seen;
+	      out << "1"; 
+	      if(seen == total)
+		break; 
+	    }
+	  else 
+	    out << "0"; 
+	}
+
+      if(seen == total)
+	break; 
+    }
+  
+  return out;   
+}
+
+
+nat Bipartition::count() const 
+{
+  nat result = 0; 
+  for(auto &elem : bip )
+    result += __builtin_popcount(elem);
+
+  return result; 
+}
+
+
+void Bipartition::printVerbose(std::ostream &out, const std::vector<std::string> nameMap) const
+{
+  auto numTax = nameMap.size() ; 
+  bool printInverse = count() > numTax / 2;
+  
+  bool isFirst = true; 
+  
+  for(nat i = 0; i < numTax  ; ++i)
+    {
+      bool isOne =  isSet(i); 
+      if( not printInverse != not isOne )
+	{
+	  out << (isFirst ? "" : "," ) << nameMap.at(i); 
+	  isFirst = false; 
+	}
+    }
+  
+  assert(not isFirst);  
+} 
+
+
+bool Bipartition::isSubset(const Bipartition& rhs) const 
+{			
+  // TODO expensive 
+  return ( *this & rhs ) == *this   ; 
+}
+
+
+Bipartition Bipartition::operator& (const Bipartition &rhs) const
+{
+  auto result = Bipartition{}; 
+  auto shorterLength = std::min(bip.size(), rhs.bip.size()); 
+  result.bip.resize(shorterLength, 0u); 
+
+  for(nat i = 0; i < shorterLength; ++i)
+    result.bip[i] = bip[i] & rhs.bip[i]; 
+
+  // TODO reduce the hash accordingly 
+  result.hash = 0; 
+
+  return result;   
+}
+
+
+nat Bipartition::getHash() const
+{
+  if(hash == 0)
+    {
+      std::cout  << "hash of " << *this  << " was " << hash; 
+      assert(hash != 0); 
+    }
+  return hash; 
+}
+
+
+Bipartition Bipartition::getComplement( nat maxElem) const 
+{
+  auto result = Bipartition{}; 
+  result.reserve(maxElem); 
+
+  for(nat i = 0; i < maxElem; ++i)
+    {
+      if(not  isSet(i))
+	{
+	  result.set(i); 
+	}
+    }
+
+  return result; 
+}
+
+
+bool Bipartition::isCompatible(const Bipartition& rhs, nat maxElem) const
+{
+  auto intersect = *this & rhs; 
+  if(intersect.count() == 0)
+    return true; 
+  
+  intersect = this->getComplement(maxElem) & rhs; 
+  if(intersect.count ()  == 0)
+    return true; 
+  
+  intersect = *this & rhs.getComplement(maxElem); 
+  if(intersect.count() == 0)
+    return true;  
+  
+  return false; 
+} 
+
+
+
+nat Bipartition::findIndex() const 
+{
+  auto result = 0; 
+  auto iter = begin(bip); 
+  auto theEnd = end(bip); 
+  while( iter != theEnd && *iter == 0  )
+    {
+      ++iter; 
+      result += 32; 
+    }
+
+  assert(*iter != 0); 
+
+  // this actually compute the logarithm, i.e., the most significant
+  // bit
+  
+  unsigned int v = *iter; // 32-bit word to find the log of
+  unsigned r;     // r will be lg(v)
+  unsigned int t, tt; // temporaries
+  
+  if (  ( tt =  v >> 16    )  )
+    r = (t = tt >> 8) ? 24 + LogTable256[t] : 16 + LogTable256[tt];
+  else 
+    r = (t = v >> 8) ? 8 + LogTable256[t] : LogTable256[v];
+
+  return result + r; 
+} 
diff --git a/src/data-struct/Bipartition.hpp b/src/data-struct/Bipartition.hpp
new file mode 100644
index 0000000..e77d905
--- /dev/null
+++ b/src/data-struct/Bipartition.hpp
@@ -0,0 +1,122 @@
+#ifndef BIPARTITION_H
+#define BIPARTITION_H
+
+#include <vector>  
+#include <cassert>
+#include <ostream>
+#include <string>
+#include <unordered_map>
+
+#include "common.h"
+
+class Bipartition
+{
+public: 
+  explicit Bipartition();
+
+  /** 
+      @brief gets the number of elements that currently can be
+      represented via this bipartition.
+   */ 
+  size_t getElemsReserved() const { return bip.size() * 32 ; } 
+  
+  void setHash(nat h) {assert(h != 0 ) ; hash = h; }
+  nat getHash() const ; 
+  /** 
+      @brief indicates whether two bipartitions are compatible (i.e.,
+      they can occur in a tree together)
+   */ 
+  bool isCompatible(const Bipartition& rhs, nat maxElem) const; 
+  /** 
+      @brief finds the index of the first bit set 
+   */ 
+  nat findIndex() const ; 
+  /** 
+      @brief gets the complement of a bipartition
+   */ 
+  Bipartition getComplement( nat maxElem) const; 
+  /**
+     @brief checks equality of two bipartitions
+   */
+  bool operator==(const Bipartition &rhs) const; 
+  /** 
+      @brief indicates whether this bipartition equals rhs.  
+   */
+  bool operator!=(const Bipartition &rhs) const {return not (  *this == rhs ) ; }
+  /** 
+      @brief performs an or-operation on two bipartitions and returns
+      the result
+      
+      @notice the hash may loose its validity, if the bipartitions are
+      or-ed that have an intersection.
+   */ 
+  Bipartition operator| (const Bipartition &rhs) const;
+  /** 
+      @brief performs an and-operaton on two bipartitions and results
+      the result
+   */ 
+  Bipartition operator& (const Bipartition &rhs)const ; 
+  
+  void setRawBip(std::vector<nat> tmp){bip=tmp;}
+
+  std::vector<nat> getRawBip() { return bip; }
+  const std::vector<nat>& getRawBip() const {return bip; }
+  /** 
+      @brief indicates whether this bipartition is a subset of bipartition rhs. 
+      @notice this method takes bipartitions as is and does not perform conversions (i.e., complement)      
+  */ 
+  bool isSubset(const Bipartition& rhs) const ; 
+  /** 
+      @brief sets the bit at position pos 
+   */ 
+  void set(nat pos) ; 
+  /** 
+      @brief unsets the bit at position pos 
+   */ 
+  // void unset(nat pos); 
+  bool isSet(nat pos) const;
+  void initializeWithTaxon(nat pos, nat ranNum); 
+  /**
+     @brief makes the bit vector sufficiently long, s.t. num can be
+     set
+
+     @notice do not overuse, this is somewhat expensive
+   */ 
+  void reserve(size_t num);
+  /**
+     @brief gets the number of bits set
+   */ 
+  nat count() const ;
+  /** 
+      @brief prints the bipartition in a readable manner
+   */ 
+  void printVerbose(std::ostream &outt, const std::vector<std::string> nameMap) const; 
+
+  static std::vector<nat> perBitMask;
+  static size_t numBits;
+  static size_t numBitsMinusOne; 
+  static size_t bitShift; 
+  static nat allOne; 
+
+  friend std::ostream& operator<<(std::ostream& out, const Bipartition& rhs); 
+
+private: 
+  std::vector<nat> bip; 
+  nat hash; 
+
+}; 
+
+
+namespace std
+{
+  template<> struct hash<Bipartition>
+  {
+    size_t operator()(const Bipartition& b) const 
+    {
+      return b.getHash(); 
+    }
+  }; 
+}
+
+
+#endif
diff --git a/src/data-struct/BipartitionHash.cpp b/src/data-struct/BipartitionHash.cpp
new file mode 100644
index 0000000..de5099c
--- /dev/null
+++ b/src/data-struct/BipartitionHash.cpp
@@ -0,0 +1,136 @@
+#include "BipartitionHash.hpp"
+// #include "Branch.hpp"
+
+#include "BranchPlain.hpp"
+
+#include <algorithm>
+#include <iostream>
+
+#include "Randomness.hpp"
+
+BipartitionHash::BipartitionHash(nat numTax)   
+  :_bipPresence{}
+  , _bipBranchLengths{}
+  , _bipMeaning(numTax)
+  , _treesAdded(0)
+{
+  // must be deterministic!
+  auto seed = randCtr_t{{0xdeadbeef,0xbadcafee}}; 
+  Randomness rand(seed);
+
+  // we do nat allow a zero 
+  for(auto &r : _bipMeaning)
+    while(r == 0)
+      r = rand();
+}
+
+
+void BipartitionHash::addTree(const TreeAln &traln, bool withBranch, bool withTrivial)
+{
+  auto pStart = traln.getTrHandle().nodep[1]->back; 
+  auto desc = traln.getDescendents(BranchPlain(pStart->number, pStart->back->number)); 
+
+  nat bipsAdded = 0; 
+
+  // explicitly add the first trivial bipartition 
+  if(withTrivial)
+    {
+      auto result = Bipartition{}; 
+
+      auto p = traln.getTrHandle().nodep[1] ; 
+
+      nat num = p->number-1; 
+
+      result.initializeWithTaxon(num, _bipMeaning.at(num));     
+      
+      addBipOccurrence(withBranch, result, _treesAdded, pStart); 
+      ++bipsAdded; 
+    }
+
+  // recursive descent
+  addElement(traln, traln.findNodePtr(desc.first.getInverted()), withBranch, withTrivial, bipsAdded); 
+  addElement(traln, traln.findNodePtr(desc.second.getInverted()), withBranch, withTrivial, bipsAdded); 
+
+  // check 
+  auto numTax = traln.getNumberOfTaxa(); 
+  if(withTrivial)
+    assert(bipsAdded == 2 * numTax - 3 );
+  else 
+    assert(bipsAdded == numTax -3 ); 
+
+  ++_treesAdded;
+}
+
+
+void BipartitionHash::addBipOccurrence(bool withBranch, Bipartition& result, nat treesAdded, nodeptr p )
+{
+  if(withBranch)
+    {
+      auto bl = p->z[0]; 
+      _bipBranchLengths[result].push_back(bl); 
+    }
+
+  auto &precBip = _bipPresence[result]; 
+  precBip.reserve(treesAdded); 
+  assert(not precBip.isSet(treesAdded)); 
+  precBip.set(treesAdded); 
+}
+
+
+Bipartition BipartitionHash::addElement(const TreeAln &traln, nodeptr p, bool withBranch, bool withTrivial, nat &addedSoFar)
+{
+  auto curBranch = BranchPlain(p->number, p->back->number);
+
+  if(traln.isTipBranch(curBranch))
+    {
+      auto result = Bipartition{}; 
+      // TODO maybe insert trivial bipartitions as well 
+
+      result.initializeWithTaxon(p->number-1, _bipMeaning.at(p->number-1)); 
+
+      if(withTrivial)
+	{
+	  addBipOccurrence(withBranch, result, _treesAdded, p);
+	  ++addedSoFar;
+	}
+
+      return result;  
+    }
+  else 
+    {
+      auto desc = traln.getDescendents(curBranch);
+
+      auto&& bipA = addElement(traln, traln.findNodePtr(desc.first.getInverted()), withBranch, withTrivial, addedSoFar); 
+      auto&& bipB = addElement(traln, traln.findNodePtr(desc.second.getInverted()), withBranch, withTrivial, addedSoFar) ; 
+
+      auto result = bipA | bipB; 
+
+      addBipOccurrence(withBranch, result, _treesAdded,p ); 
+      ++addedSoFar; 
+
+      return result; 
+    }
+} 
+
+
+std::vector<double>
+BipartitionHash::getBranchLengths(const Bipartition& bip) const
+{
+  auto result = std::vector<double>{}; 
+  auto iter = _bipBranchLengths.find(bip); 
+  if(iter != _bipBranchLengths.end())
+    result = iter->second; 
+  return result;
+}
+
+
+Bipartition
+BipartitionHash::getPresence(const Bipartition &bip) const 
+{
+  auto result = Bipartition{}; 
+  auto iter = _bipPresence.find(bip); 
+  if(iter != _bipPresence.end())
+    result = iter->second; 
+  return result;   
+}
+
diff --git a/src/data-struct/BipartitionHash.hpp b/src/data-struct/BipartitionHash.hpp
new file mode 100644
index 0000000..6840b79
--- /dev/null
+++ b/src/data-struct/BipartitionHash.hpp
@@ -0,0 +1,37 @@
+#ifndef BIPARTITIONHASHNEW_H
+#define BIPARTITIONHASHNEW_H
+
+#include <unordered_map>
+
+#include "TreeAln.hpp"
+#include "Bipartition.hpp"
+
+
+class BipartitionHash
+{
+public: 
+  BipartitionHash(nat numTax); 
+  ~BipartitionHash(){}
+  void addTree(const TreeAln &traln, bool withBranch, bool withTrivial); 
+
+  std::unordered_map<Bipartition, Bipartition>::const_iterator begin() const{return _bipPresence.begin(); }
+  std::unordered_map<Bipartition, Bipartition>::const_iterator end() const{return _bipPresence.end(); }
+
+  std::vector<double> getBranchLengths(const Bipartition& bip) const;
+  Bipartition getPresence(const Bipartition &bip) const; 
+
+  nat getTreesAdded() const {return _treesAdded; }
+
+private: 			// METHODS
+  Bipartition addElement(const TreeAln &traln, nodeptr p, bool withBranch, bool withTrivial, nat &addedSoFar); 
+  void addBipOccurrence(bool withBranch, Bipartition& result, nat treesAdded, nodeptr p); 
+
+private: 			// ATTRIBUTES
+  std::unordered_map<Bipartition, Bipartition> _bipPresence; 
+  std::unordered_map<Bipartition, std::vector<double> > _bipBranchLengths; 
+  std::vector<nat> _bipMeaning; 
+  nat _treesAdded; 
+}; 
+
+
+#endif
diff --git a/src/data-struct/Path.cpp b/src/data-struct/Path.cpp
new file mode 100644
index 0000000..ee30beb
--- /dev/null
+++ b/src/data-struct/Path.cpp
@@ -0,0 +1,195 @@
+#include <iostream>
+#include <fstream>
+
+#include "Path.hpp"
+#include "Chain.hpp"
+#include "AbstractProposal.hpp"
+
+
+void Path::clear()
+{
+  stack.clear(); 
+}
+
+void Path::append(BranchPlain value)
+{
+  stack.push_back(value);
+}
+
+
+
+void Path::pop()
+{
+  stack.pop_back();
+}
+
+void Path::popFront()
+{
+  stack.erase(stack.begin()); 
+}
+
+
+void Path::pushToStackIfNovel(BranchPlain b, const TreeAln &traln)
+{  
+  assert(stack.size() >= 2 ); 
+
+  auto bPrev = at(size()-1); 
+  if(stack.size() == 2)
+    {
+      // if(not b.equalsUndirected(bPrev))
+      if(bPrev != b && bPrev.getInverted() != b)
+	append(b); 
+    }
+  else 
+    {      
+      // if(b.equalsUndirected(bPrev))
+      if(b == bPrev || b.getInverted() == bPrev)
+	stack.pop_back();
+      else if(traln.isTipBranch(bPrev))
+	{
+	  stack.pop_back();
+	  append(b); 
+	}
+      else 
+	append(b ); 
+    }
+}
+
+
+
+
+void Path::debug_assertPathExists(TreeAln& traln)
+{
+#ifdef DEBUG_CHECK_TREE_CONSISTENCY
+  tree *tr = traln.getTr();
+  for(auto b : stack)
+    assert(branchExists(tr, b)); 
+#endif
+}
+
+
+bool Path::nodeIsOnPath(int aNode) const
+{
+  for(auto b : stack)
+    if(b.hasNode(aNode))
+      return true;       
+
+  return false; 
+}
+
+
+std::ostream& operator<<(std::ostream &out, const Path &rhs)  
+{
+  for(auto b : rhs.stack)
+    out << "(" << b.getPrimNode() << "," << b.getSecNode() << "),";       
+  return out; 
+}
+
+
+nat Path::getNthNodeInPath(size_t num)   const
+{ 
+  int result; 
+  
+  assert(num <= stack.size( )+  1 ); 
+  // TODO stronger warrenty when constructing 
+  // assert(stack.size() != 1 ); 
+  
+  if(num == 0)
+    {
+      auto  b = stack[0]; 
+      if(stack[1].hasNode(b.getPrimNode()))
+	result= b.getSecNode(); 
+      else 
+	{
+	  assert(stack[1].hasNode(b.getSecNode())); 
+	  result= b.getPrimNode() ; 
+	}
+    }
+  else if(num == stack.size() )
+    {
+      auto b = stack[num-1]; 
+      
+      if(stack[num-2].hasNode(b.getPrimNode() ))
+	result=  b.getSecNode(); 
+      else 
+	{
+	  assert(stack[num-2].hasNode(b.getSecNode() )); 
+	  result= b.getPrimNode(); 
+	}
+    }
+  else 
+    {      
+      auto b = stack[num]; 
+      if(stack[num-1].hasNode(b.getPrimNode() ))
+	result= b.getPrimNode(); 
+      else 
+	{
+	  assert(stack[num-1].hasNode(b.getSecNode() )); 
+	  result= b.getSecNode(); 
+	}	
+    }
+
+  return result; 
+}
+
+
+void Path::reverse()
+{
+  std::reverse(stack.begin(), stack.end());
+}
+
+
+
+
+bool Path::findPathHelper(const TreeAln &traln, nodeptr p, const BranchPlain &target)
+{
+  auto  curBranch = BranchPlain(p->number, p->back->number); 
+  // if( curBranch.equalsUndirected( target) ) 
+  if( curBranch == target || curBranch.getInverted() == target)
+    return true; 
+  
+  bool found = false; 
+  for(auto q = p->next ; p != q && not found ; q = q->next)
+    {
+      found = findPathHelper(traln, q->back, target); 
+      if(found)	
+	{
+	  append(BranchPlain(q->number, q->back->number));
+	  return found; 
+	}
+    }
+  return false; 
+}
+
+
+
+ void Path::findPath(const TreeAln& traln, nodeptr p, nodeptr q)
+{  
+  // cout << "trying to find path between " << p->number << "/" << p->back->number << " and "  << q->number << "/" << q->back->number  << endl; 
+  
+  stack.clear();   
+
+  auto targetBranch = BranchPlain(q->number, q->back->number ); 
+
+  bool found = findPathHelper(traln, p->back, targetBranch); 
+  if(found)  
+    {      
+      append(BranchPlain(p->number, p->back->number)); 
+      return ; 
+    }
+
+  assert(stack.size() == 0); 
+  
+  found = findPathHelper(traln, p->next->back, targetBranch); 
+  if(found  )
+    {
+      append(BranchPlain(p->next->number, p->next->back->number)); 
+      return; 
+    }
+
+  assert(stack.size() == 0);   
+  found = findPathHelper(traln, p->next->next->back, targetBranch); 
+  if(found)
+    append(BranchPlain(p->next->next->number, p->next->next->back->number)); 
+  assert(found);
+}
diff --git a/src/data-struct/Path.hpp b/src/data-struct/Path.hpp
new file mode 100644
index 0000000..2727f74
--- /dev/null
+++ b/src/data-struct/Path.hpp
@@ -0,0 +1,74 @@
+/** 
+    @file Path.hpp represents a  path in a tree
+    
+    Currently we are assuming, the path always is connected. 
+
+    This is an ancient class; not entirely happy with it.
+
+ */ 
+
+
+#ifndef _PATH_H
+#define _PATH_H
+
+#include <vector>
+
+#include "TreeAln.hpp"
+#include "Randomness.hpp"
+#include "PriorBelief.hpp"
+// #include "Branch.hpp"
+
+
+class Path
+{
+public:   
+  Path()
+    : stack(std::vector<BranchPlain>{} ) {} 
+  virtual ~Path(){}
+
+/** @brief returns true, if the node with a given id is part of this branch */ 
+  bool nodeIsOnPath(int node) const;  
+
+  /** @brief asserts that this path exists in a given tree */ 
+  void debug_assertPathExists(TreeAln& traln); 
+
+  /** @brief only add a branch to the path, if it is novel. If the new
+      branch cancels out an existing branch, the path is shortened again */ 
+  void pushToStackIfNovel(BranchPlain b, const TreeAln &traln ); 
+
+  // straight-forward container methods 
+  void append(BranchPlain value); 
+  void clear(); 
+  /** @brief number of branches in the path */ 
+  size_t size() const {return stack.size(); }
+
+  /** @brief yields the branch */  
+  BranchPlain& at(size_t num){return stack[num]; }
+  BranchPlain at(size_t num) const{return stack[num];}
+
+  /** @brief reverse the path */ 
+  void reverse(); 
+
+  /** @brief removes the last element */ 
+  void pop(); 
+  /** @brief removes the first element */ 
+  void popFront(); 
+
+  /** @brief returns the id of the nth node in the path. nodes 0 and n+1 are the outer nodes in this path that do not have a neighbor. */ 
+  nat getNthNodeInPath(size_t num) const ; 
+  
+  /** @brief gets the number of nodes represented by the path (assuming it is connected)  */
+  size_t getNumberOfNodes() const {return stack.size()  + 1 ;   }
+
+  void findPath(const TreeAln& traln, nodeptr p, nodeptr q);
+  friend std::ostream& operator<<(std::ostream &out, const Path &rhs)  ;
+
+private: 			// METHODS 
+  bool findPathHelper(const TreeAln &traln, nodeptr p, const BranchPlain &target);
+
+private: 			// ATTRIBUTES 
+  std::vector<BranchPlain> stack; 
+
+}; 
+
+#endif
diff --git a/src/eval/ArrayOrientation.cpp b/src/eval/ArrayOrientation.cpp
new file mode 100644
index 0000000..f02d9ab
--- /dev/null
+++ b/src/eval/ArrayOrientation.cpp
@@ -0,0 +1,171 @@
+#include "ArrayOrientation.hpp"
+#include <cassert>
+
+#include "common.h"
+
+
+const nat ArrayOrientation::maxSprSearch = 4; 
+
+
+ArrayOrientation::ArrayOrientation(const TreeAln &traln)
+  : orientation(traln.getNumberOfPartitions())
+{
+  for(nat i = 0 ; i < traln.getNumberOfPartitions(); ++i)
+    orientation[i] = std::vector<nat>(traln.getNumberOfInnerNodes(false),  INVALID); 
+}
+
+
+nat ArrayOrientation::nodeNum2ArrayNum(nat nodeNum, nat numTax)
+{
+  auto res = int(nodeNum) - int(numTax) -1; 
+  assert(res >= 0 ); 
+  return  res;  
+}
+
+
+
+bool ArrayOrientation::searchNodeInSubtree(const TreeAln &traln, nodeptr p, nat nodeId, nat depth ) const 
+{
+  if( maxSprSearch < depth   )
+    return false; 
+
+  if(nat(p->number) ==  nodeId)
+    return true; 
+
+  if(traln.isTipNode(p))
+    return false; 
+
+  if(searchNodeInSubtree(traln, p->next->back, nodeId, depth + 1 ))
+    return true; 
+
+  if(searchNodeInSubtree(traln, p->next->next->back ,nodeId, depth + 1 ))
+    return true; 
+
+  return false; 
+}
+
+
+
+/** 
+    checks whether the array associated with a node is still correctly
+    oriented.
+
+    the fact that this function is that complex was not intentional,
+    but oversight. However, this should limit the damage effectively.
+ */ 
+bool ArrayOrientation::isCorrectNew( const TreeAln& traln, nat part, nodeptr p) const
+{
+  assert(not traln.isTipNode(p));
+
+  auto numTax = traln.getNumberOfTaxa();
+  auto id = nodeNum2ArrayNum(p->number, numTax); 
+  auto theOrient = orientation.at(part).at(id); 
+
+  // tout << "node=" << p->number << " is oriented " << SHOW(theOrient) << std::endl; 
+
+  if(theOrient == INVALID)
+    return false; 
+
+  // maybe everything is as expected 
+  auto correct = (theOrient == nat(p->back->number)); 
+
+  // check, if a subtree was inserted (by an spr move) just between
+  // this node and the correct array that this array is oriented
+  // towards
+  if(
+#ifdef DANGEROUS_LNL_SHORTCUT_OFF
+     false && 
+#endif
+     not correct && not traln.isTipNode(p->back->number))
+    {
+      auto numA = (nat) p->back->next->back->number; 
+      auto numB = (nat) p->back->next->next->back->number; 
+
+      correct |= ( theOrient == numA) ; 
+      correct |= ( theOrient == numB) ; 
+
+// #ifdef PR      
+//       if(correct ) 
+// 	tout << "CORRECT!\t" << SHOW(p->back->number) << std::endl; 
+    }
+  
+  if( 
+#ifdef DANGEROUS_LNL_SHORTCUT_OFF
+     false && 
+#endif
+      not correct 
+     )
+    {
+      // check, for topological rearrangement 
+
+      // dont need to check p->back
+      auto topoRearrangement = ( nat(p->next->back->number) != theOrient)  && ( nat(p->next->next->back->number) != theOrient ); 
+      
+      // if this is the case, we have to search the entire subtree to
+      // check, whether after insertion, we are still oriented towards
+      // it.
+
+      // this should not have to be done more than 2 per generation
+      if(topoRearrangement)
+	{
+	  correct |= searchNodeInSubtree(traln, p->back, theOrient, 0);
+#ifdef LNL_PRINT_DEBUG
+	  tout << "\n\nSEARCHING!!!\t" << (correct ? "FOUND" : "not found")  << "\n\n"; 
+#endif
+	}
+    }
+
+  return correct ; 
+}
+
+
+void ArrayOrientation::setOrientationForAllPartitions(nat id ,nat value)  
+{
+  for(nat i= 0; i < orientation.size() ; ++i)
+    orientation[i][id] = value; 
+}
+
+
+
+void ArrayOrientation::setPartitionInvalid(nat part)  
+{
+  for(auto &elem  : orientation[part])
+    elem = INVALID; 
+} 
+
+
+std::ostream& operator<<(std::ostream& out, const ArrayOrientation &rhs)
+{
+  nat ctr = 0; 
+  for(auto &elem : rhs.orientation)
+    {
+      out << "[" << ctr << "] " ; 
+      
+      auto ctr2 = rhs.orientation[0].size() + 3 ;
+      for(auto &subelem : elem ) 
+	{
+	  if(subelem == 0)
+	    out << ctr2 <<  "->INVALID, " ; 
+	  else 
+	    out << ctr2 << "->" << subelem << ", " ;
+	  ++ctr2; 
+	}
+      ++ctr ; 
+      out << std::endl; 
+    }
+  return out; 
+}
+
+
+void ArrayOrientation::setInvalid(nat part, nat id)
+{
+  orientation[part][id] = INVALID; 
+} 
+
+
+nat ArrayOrientation::getOrientation(nat part, nat id ) const 
+{
+  auto value = orientation.at(part).at(id); 
+  return value; 
+}
+
diff --git a/src/eval/ArrayOrientation.hpp b/src/eval/ArrayOrientation.hpp
new file mode 100644
index 0000000..5470fca
--- /dev/null
+++ b/src/eval/ArrayOrientation.hpp
@@ -0,0 +1,47 @@
+#ifndef _ARRAY_ORIENTATION_HPP
+#define _ARRAY_ORIENTATION_HPP
+
+#include <vector>
+#include <iostream>
+
+#include "TreeAln.hpp"
+
+#define INVALID 0 
+
+class ArrayOrientation
+{
+public: 
+  ArrayOrientation(const TreeAln &traln); 
+
+  bool isCorrect(nat part, nat id, nat value) const  
+  { 
+    return orientation.at(part).at(id) ==  value; 
+  }
+
+  bool searchNodeInSubtree(const TreeAln &traln, nodeptr p, nat nodeId, nat depth ) const ; 
+  
+  // NEW 
+  bool isCorrectNew( const TreeAln& traln, nat part, nodeptr p) const; 
+
+  nat getOrientation(nat part, nat id ) const ; 
+  
+  void setOrientation(nat part, nat id, nat value)  { orientation[part][id] = value; }
+  void setOrientationForAllPartitions(nat id ,nat value)  ; 
+
+  void setPartitionInvalid(nat part)  ; 
+  void setInvalid(nat part, nat id); 
+
+  friend std::ostream& operator<<(std::ostream& out, const ArrayOrientation &rhs); 
+
+  // decides how far down the tree we search to determine the
+  // correctness of the array that belongs to a moved subtree
+  // (this is a hack)
+  const static nat maxSprSearch; 
+  
+  static nat nodeNum2ArrayNum(nat nodeNum, nat numTax); 
+
+private: 
+  std::vector<std::vector<nat> > orientation ; 
+}; 
+
+#endif
diff --git a/src/eval/ArrayPolicy.hpp b/src/eval/ArrayPolicy.hpp
new file mode 100644
index 0000000..3ef55f0
--- /dev/null
+++ b/src/eval/ArrayPolicy.hpp
@@ -0,0 +1,66 @@
+#ifndef _ARRAYPOLICY_HPP
+#define _ARRAYPOLICY_HPP
+
+#include <vector>
+#include <memory>
+
+// #include "Branch.hpp"
+#include "ArrayOrientation.hpp"
+
+class TreeAln; 
+
+class ArrayPolicy
+{
+public: 
+  ArrayPolicy()
+    : partitionLnls{}
+  {}
+  
+  virtual ~ArrayPolicy(){}
+
+  virtual void imprintPolicy(const TreeAln &traln, ArrayOrientation &arrayOrient)  = 0; 
+
+  void imprint(const TreeAln &traln, ArrayOrientation &arrayOrient) 
+  {
+    // prevLnl = traln.getTrHandle().likelihood; 
+    partitionLnls = traln.getPartitionLnls(); 
+    imprintPolicy(traln, arrayOrient); 
+  }
+
+  virtual void freeMemory(ArrayReservoir& res) = 0;  
+
+
+  /**
+     @brief deal with rejection
+   */ 
+  void accountForRejection(TreeAln &traln, const std::vector<bool> &partitions, const std::vector<nat>& invalidNodes, ArrayOrientation &arrayOrient, ArrayReservoir &res ) 
+  {
+    accountForRejectionPolicy(traln, partitions, invalidNodes, arrayOrient, res); 
+   
+    auto lnls = traln.getPartitionLnls(); 
+    auto sum = log_double::fromAbs(1.); 
+    for(nat i = 0; i < traln.getNumberOfPartitions() ; ++i)
+      {
+	if(partitions[i])
+	  lnls[i] =  partitionLnls[i] ; 
+	sum *= lnls[i]; 
+      }
+    traln.setPartitionLnls(lnls); 
+    
+    traln.getTrHandle().likelihood = sum.getRawLog();  
+  }
+
+  virtual void accountForRejectionPolicy(TreeAln &traln, const std::vector<bool> &partitions, const std::vector<nat>& invalidNodes, ArrayOrientation &arrayOrient , ArrayReservoir &res)  = 0; 
+
+
+  virtual std::unique_ptr<ArrayPolicy> clone() const = 0; 
+  virtual void prepareForEvaluation(TreeAln &traln, BranchPlain virtualRoot, nat models, ArrayOrientation& arrayOrientation , ArrayReservoir& res ) = 0; 
+
+  virtual void enableRestoreGapVector(){}
+
+protected: 
+  // double prevLnl; 
+  std::vector<log_double> partitionLnls;
+}; 
+
+#endif
diff --git a/src/eval/ArrayReservoir.cpp b/src/eval/ArrayReservoir.cpp
new file mode 100644
index 0000000..d0e5e32
--- /dev/null
+++ b/src/eval/ArrayReservoir.cpp
@@ -0,0 +1,107 @@
+#include "ArrayReservoir.hpp" 
+#include "GlobalVariables.hpp" 
+#include <algorithm>
+#include <cassert>
+#include "extensions.hpp"
+
+const double ArrayReservoir::thresholdForNewSEVArray = 1.05 ; 
+
+ArrayReservoir::ArrayReservoir(bool freeOlds)  
+  : _usedArrays{}
+  , _unusedArrays{}
+  , _freeOlds(freeOlds)
+{
+}
+
+
+ArrayReservoir::~ArrayReservoir()
+{
+  for(auto elem : _unusedArrays)
+    {
+      for(auto elem2 : std::get<1>(elem))
+	free(elem2);
+    }
+  for(auto elem : _usedArrays)
+    free(std::get<0>(elem)); 
+} 
+
+
+double* ArrayReservoir::allocate(size_t requiredLength)
+{
+  double *result = nullptr; 
+
+  auto found = _unusedArrays.lower_bound(requiredLength); 
+  
+  auto lengthOfFound = std::get<0>(*found);
+  
+  // we free anyway such that we do not acccumulate a lot of large
+  // arrays when the SEV technique is used
+  bool freeOldArrayDespiteAvailable =  _freeOlds &&   ( size_t(double(requiredLength) * thresholdForNewSEVArray)  < lengthOfFound )  ; 
+
+  if( found != end(_unusedArrays)
+      && not freeOldArrayDespiteAvailable )
+    {
+      auto id = std::get<0>(*found); 
+      auto theList = std::get<1>(*found); 
+      assert(theList.size() > 0); 
+      result = theList.front(); 
+      std::get<1>(*found).pop_front();
+      if(std::get<1>(*found).size() == 0)
+	_unusedArrays.erase(found);
+      _usedArrays[result] = id; 
+    }
+  else 
+    {				
+      if(_freeOlds &&   _unusedArrays.size() > 0  )
+	{
+	  auto maxElemIter = std::max_element(begin(_unusedArrays), end(_unusedArrays));
+	  auto &maxElem = *maxElemIter; 
+	  free(std::get<1>(maxElem).front()); 
+	  std::get<1>(maxElem).pop_front(); 
+	  if(std::get<1>(maxElem).size() == 0)
+	    _unusedArrays.erase(maxElemIter); 
+	}
+
+      // tout << "allocating elem of length " <<  requiredLength<<  "\t" << SHOW(lengthOfFound)  << std::endl; 
+      
+      result = aligned_malloc<double,size_t(EXA_ALIGN)>(requiredLength); 
+      _usedArrays.insert(std::make_pair(result, requiredLength));
+    }
+
+  assert(result != nullptr) ; 
+  // tout << "POP " << result << std::endl; 
+  return result; 
+}
+
+
+void ArrayReservoir::deallocate(double* array)
+{
+  // tout << "push " << array <<  std::endl; 
+
+  assert(array != nullptr); 
+
+  auto iter = _usedArrays.find(array); 
+
+  assert(iter != _usedArrays.end()); 
+  auto elem = *iter; 
+
+  _unusedArrays[std::get<1>(elem)].push_front(std::get<0>(elem)); 
+
+  _usedArrays.erase(iter);
+
+  assert(_usedArrays.find(array) == _usedArrays.end() ); 
+  
+  array = nullptr; 
+} 
+
+
+#ifdef _DEVEL
+std::tuple<uint64_t,uint64_t> ArrayReservoir::getUsedAndUnusedBytes() const 
+{
+  uint64_t usedBytes =  std::accumulate(begin(_usedArrays), end(_usedArrays), 0, 
+				     [](nat elem, const std::pair<double*,nat> &elemB) { return elem + std::get<1>(elemB); } );
+  uint64_t unusedBytes = std::accumulate(begin(_unusedArrays), end(_unusedArrays), 0, 
+				       [](nat elem , const std::pair<nat,double*> &elemB) { return elem  + std::get<0>(elemB); });
+ return std::make_tuple(usedBytes, unusedBytes);
+} 
+#endif
diff --git a/src/eval/ArrayReservoir.hpp b/src/eval/ArrayReservoir.hpp
new file mode 100644
index 0000000..6d7c4f0
--- /dev/null
+++ b/src/eval/ArrayReservoir.hpp
@@ -0,0 +1,35 @@
+#ifndef REVERVE_ARRAYS_HPP
+#define REVERVE_ARRAYS_HPP
+
+#include <list>
+#include <memory>
+#include <map>
+#include <unordered_map>
+#include <vector>
+#include "common.h"
+
+
+class ArrayReservoir
+{
+public: 
+  ArrayReservoir(bool freeOlds) ; 
+  ~ArrayReservoir(); 
+  ArrayReservoir(const ArrayReservoir& rhs) = delete; 
+  ArrayReservoir& operator=(const ArrayReservoir& rhs) = delete; 
+
+  double* allocate(size_t requiredLength ); 
+  void deallocate(double* array); 
+
+#ifdef _DEVEL
+  std::tuple<uint64_t,uint64_t> getUsedAndUnusedBytes() const ; 
+#endif
+
+private: 
+  std::unordered_map<double*,size_t> _usedArrays; 
+  std::map<size_t,std::list<double*> > _unusedArrays; 
+  
+  static const double numGammaCats; 
+  static const double thresholdForNewSEVArray; 
+  bool _freeOlds; 
+}; 
+#endif
diff --git a/src/eval/ArrayRestorer.cpp b/src/eval/ArrayRestorer.cpp
new file mode 100644
index 0000000..eb76cac
--- /dev/null
+++ b/src/eval/ArrayRestorer.cpp
@@ -0,0 +1,280 @@
+#include <cstring>
+#include <algorithm>
+#include <cassert>
+
+#include "ArrayRestorer.hpp" 
+#include "GlobalVariables.hpp"
+
+#include "ArrayReservoir.hpp"
+#include "FlagType.hpp"
+
+
+ArrayRestorer::ArrayRestorer(const TreeAln& traln, bool _cacheTipTip, bool _cacheTipInner)
+  : partitionLikelihoods{}
+  , restoresGapVector(false)
+  , arrayOrientation(traln)
+  , cacheTipTip(_cacheTipTip)
+  , cacheTipInner(_cacheTipInner)
+{
+  bool useSEV = traln.isSaveMemorySEV();
+
+  for(nat i = 0; i < traln.getNumberOfPartitions(); ++i)
+    partitionLikelihoods.emplace_back(traln,i, useSEV); 
+}
+
+
+void ArrayRestorer::restoreSomePartitions(TreeAln &traln, const std::vector<bool> &partitions, ArrayOrientation &evalOrientation, ArrayReservoir& res)
+{
+  for(nat model = 0; model <  traln.getNumberOfPartitions() ;++model)
+    {
+      nat partitionIndex = model; 
+      // tout << "restoring partition "  << model << std::endl; 
+
+      // restore the partition scaler 
+      auto& partition = traln.getPartition( partitionIndex).getHandle(); // TODO lazy 
+
+      if(not partitions[model] || partition.width == 0 )
+	continue; 
+
+      
+      nat ctr = 0; 
+      nat lastNode = traln.getNumberOfNodes() + 1; 
+      for(nat i = traln.getNumberOfTaxa() + 1  ; i < lastNode ; ++i)
+	{
+	  if(partitionLikelihoods[partitionIndex].isCached.at(ctr))
+	    uncache(traln, i, partitionIndex, evalOrientation, res); 
+	  ++ctr; 
+	}
+
+      if(restoresGapVector && partition.width > 0 )
+	{
+	  std::copy(partitionLikelihoods.at(partitionIndex).gapColumn.begin(), 
+		    partitionLikelihoods.at(partitionIndex).gapColumn.end(), 
+		    partition.gapColumn ); 
+	}
+    }
+}
+
+
+void ArrayRestorer::cache( TreeAln &traln, nat nodeNumber, nat partitionId, const ArrayOrientation &curOrient )
+{
+  // tout << "caching node=" << nodeNumber << ", partition=" << partitionId << std::endl; 
+
+  auto id = nodeNumber - ( traln.getNumberOfTaxa() + 1 ) ; 
+
+  if(partitionLikelihoods[partitionId].cachedArrays.at(id) != nullptr)
+    {
+      assert(0);
+      free(partitionLikelihoods[partitionId].cachedArrays.at(id)); 
+
+    }
+
+  auto arrayAndLength = removeArray(traln, nodeNumber, partitionId); 
+
+  partitionLikelihoods[partitionId].cachedArrays[id] = arrayAndLength.first; 
+  partitionLikelihoods[partitionId].lengths[id] = arrayAndLength.second; 
+  
+  auto& partition = traln.getPartition(partitionId).getHandle(); // TODO lazy 
+  partitionLikelihoods[partitionId].scaler[nodeNumber] = partition.globalScaler[nodeNumber]; 
+
+  if(restoresGapVector)
+    {
+      auto vec = partition.gapVector + nodeNumber * partition.gapVectorLength; 
+      auto iter = partitionLikelihoods[partitionId].gapVector.begin() + id * partition.gapVectorLength ; 
+      std::copy(vec , vec + partition.gapVectorLength, iter ); 
+    }
+}
+
+
+
+void ArrayRestorer::recycleArray(TreeAln& traln, nat nodeNumber, nat partitionId, ArrayReservoir& res)
+{
+  auto id = nodeNumber - (traln.getNumberOfTaxa() + 1); 
+  auto &partition = traln.getPartition(partitionId).getHandle(); 
+
+  if(partition.xSpaceVector[id] != 0 )
+    {
+      res.deallocate(partition.xVector[ id ]); 
+      partition.xVector[id] = nullptr;
+      partition.xSpaceVector[id] = 0; 
+    }
+
+  auto &elem  = partitionLikelihoods[partitionId]; 
+  
+  elem.cachedArrays[id] = nullptr; 
+  elem.lengths[id] = 0; 
+
+  arrayOrientation.setInvalid(partitionId, id); 
+}
+
+
+void ArrayRestorer::destroyAndForget(TreeAln &traln, nat nodeNumber, nat partitionId )
+{
+  // TODO let's recycle instead!
+  assert(0); 
+  
+  auto id = nodeNumber - (traln.getNumberOfTaxa() + 1); 
+  auto arrayAndLength = removeArray(traln, nodeNumber, partitionId);
+  free(arrayAndLength.first); 
+  
+  auto &elem  = partitionLikelihoods[partitionId];
+  
+  elem.cachedArrays[id] = nullptr; 
+  elem.lengths[id] = 0; 
+
+  arrayOrientation.setInvalid(partitionId, id);
+}
+
+
+void ArrayRestorer::uncache(TreeAln &traln, nat nodeNumber, nat partitionId, ArrayOrientation &curOrient, ArrayReservoir &res  )
+{
+  // tout << "uncaching node=" << nodeNumber << ", partition=" << partitionId << std::endl; 
+
+  auto& partition = traln.getPartition(partitionId).getHandle(); 
+  auto id = nodeNumber - ( traln.getNumberOfTaxa() + 1) ; 
+
+  auto &backup = partitionLikelihoods[partitionId]; 
+  auto arrayAndLength = std::make_pair(backup.cachedArrays.at(id) , 
+				       backup.lengths.at(id)); 
+
+  if(partition.xVector[id] != NULL)
+    {
+      res.deallocate(partition.xVector[id]);
+      partition.xVector[id] = nullptr; 
+      partition.xSpaceVector[id] = 0; 
+    }
+
+  insertArray(traln, nodeNumber, partitionId, arrayAndLength); 
+  
+  backup.cachedArrays.at(id) = nullptr; 
+  backup.lengths.at(id) = 0; 
+  
+  // backup orientation 
+  auto tmp = arrayOrientation.getOrientation(partitionId, id);
+  curOrient.setOrientation(partitionId, id, tmp);
+
+  partition.globalScaler[nodeNumber] = backup.scaler[nodeNumber]  ; 
+  
+  if(restoresGapVector)
+    {
+      auto vec = partition.gapVector + nodeNumber * partition.gapVectorLength; 
+      auto iter = backup.gapVector.begin() + id * partition.gapVectorLength; 
+      std::copy(iter, iter + partition.gapVectorLength, vec); 
+    }
+}
+
+
+void ArrayRestorer::traverseAndCache(TreeAln &traln, nodeptr virtualRoot, nat model, ArrayOrientation& curOrient, ArrayReservoir& reservoir )
+{  
+  if(traln.isTipNode(virtualRoot))
+    return; 
+
+  nat index = virtualRoot->number - 1 - traln.getNumberOfTaxa(); 
+
+// #if 1
+  bool incorrect = not curOrient.isCorrectNew(traln, model, virtualRoot);
+// #else 
+//   bool incorrect = not curOrient.isCorrect(model, index, virtualRoot->back->number);
+// #endif
+
+  auto pnb = virtualRoot->next->back, 
+    pnnb = virtualRoot->next->next->back;
+
+  if( incorrect && not partitionLikelihoods[model].isCached[index] ) 
+    {
+      bool tiptip = traln.isTipNode(pnb) &&  traln.isTipNode(pnnb); 
+      bool tipinner = ( not traln.isTipNode(pnb) )   !=  (   not traln.isTipNode(pnnb) ) ; 
+      
+      bool innerinner = not tiptip && not tipinner;   
+
+      partitionLikelihoods.at(model).isCached[index] = true; 
+	  
+      if( ( tiptip && cacheTipTip ) 
+	  || ( tipinner && cacheTipInner ) 
+	  || innerinner )
+	{
+	  cache(traln, virtualRoot->number , model, curOrient); 
+	}
+      else 
+	{
+#if 1 
+	  recycleArray( traln, virtualRoot->number, model, reservoir);
+#else 
+	  destroyAndForget(traln,virtualRoot->number, model);
+#endif
+	}
+    }
+
+  if(incorrect)
+    {
+      traverseAndCache(traln, pnb, model, curOrient, reservoir); 
+      traverseAndCache(traln, pnnb, model, curOrient, reservoir); 
+    }
+}
+
+
+void ArrayRestorer::resetRestorer(const TreeAln &traln, ArrayOrientation &curOrient)
+{
+  for(auto &p : partitionLikelihoods)
+    p.isCached = std::vector<bool>(traln.getNumberOfInnerNodes(false), false); 
+  
+  arrayOrientation = curOrient; 
+
+  for(nat i = 0; i < traln.getNumberOfPartitions(); ++i)
+    {
+      auto& partition = traln.getPartition( i).getHandle(); 
+
+      if( restoresGapVector && partition.width > 0  )
+	{
+	  // problematic? 
+	  std::copy(partition.gapColumn ,
+		    partition.gapColumn + traln.getNumberOfTaxa() * partition.states * 4, 
+		    partitionLikelihoods.at(i).gapColumn.begin() ); 
+	}
+    }
+}
+
+
+void ArrayRestorer::clearMemory(ArrayReservoir &res)
+{
+  for(auto &partitionLikelihood : partitionLikelihoods)
+    {
+      for (nat i = 0; i < partitionLikelihood.cachedArrays.size();  ++i)
+	{
+	  if(partitionLikelihood.cachedArrays.at(i) != nullptr)
+	    {
+	      res.deallocate(partitionLikelihood.cachedArrays.at(i)); 
+	      partitionLikelihood.cachedArrays.at(i) = nullptr; 
+	      partitionLikelihood.lengths.at(i) = 0; 
+	    }
+	}
+    }
+}
+
+
+std::pair<double*,nat> ArrayRestorer::removeArray(TreeAln &traln, nat num, nat pid)
+{
+  auto& partition = traln.getPartition(pid).getHandle();
+
+  nat id = num - traln.getNumberOfTaxa() - 1; 
+
+  double *array = partition.xVector[id];
+  auto length = partition.xSpaceVector[id]; 
+  
+  partition.xVector[id] = NULL; 
+  partition.xSpaceVector[id] = 0; 
+
+  return std::make_pair(array, length); 
+}
+
+
+void ArrayRestorer::insertArray(TreeAln &traln, nat num, nat pid, std::pair<double*,nat> toInsert)
+{
+  auto& partition = traln.getPartition(pid).getHandle();
+  nat id = num - traln.getNumberOfTaxa() - 1 ; 
+
+  assert(partition.xVector[id] == NULL); 
+  
+  partition.xVector[id] = toInsert.first; 
+  partition.xSpaceVector[id] = toInsert.second; 
+}
diff --git a/src/eval/ArrayRestorer.hpp b/src/eval/ArrayRestorer.hpp
new file mode 100644
index 0000000..dd7ba47
--- /dev/null
+++ b/src/eval/ArrayRestorer.hpp
@@ -0,0 +1,61 @@
+/**
+   @file ArrayRestorer.hpp 
+
+   @brief allows to restore the lnl array state before evaluating a proposal 
+   
+   Note that this doubles the overall memory consumption
+*/
+
+#ifndef _LNL_RESTORER_H
+#define   _LNL_RESTORER_H
+
+#include "pll.h"
+#include "TreeAln.hpp"
+#include "PartitionLikelihood.hpp"
+#include "ArrayOrientation.hpp"
+// #include "Branch.hpp"
+
+
+class ArrayRestorer
+{
+public: 
+  ArrayRestorer(const TreeAln& traln, bool cacheTipTip, bool cacheTipInner); 
+  /** 
+      @brief resets all information about switched arrays
+  */ 
+  void resetRestorer(const TreeAln &traln, ArrayOrientation &curOrient); 
+  /** 
+      @brief restore arrays for the given list of partitions  
+  */ 
+  void restoreSomePartitions(TreeAln &traln, const std::vector<bool> &partitions, ArrayOrientation &evalOrientation, ArrayReservoir &res); 
+  /** 
+      @brief traverses a subtree and switches arrays, where necessary 
+      @param virtualRoot the root of the subtree 
+  */ 
+  void traverseAndCache(TreeAln &traln, nodeptr virtualRoot, nat model, ArrayOrientation& arrayOrientation, ArrayReservoir& reservoir); 
+
+  void cache( TreeAln &traln, nat nodeNumber, nat partitionId, const ArrayOrientation &curOrient ); 
+  void destroyAndForget(TreeAln &traln, nat nodeNumber, nat partitionId ); 
+  void uncache(TreeAln &traln, nat nodeNumber, nat partitionId, ArrayOrientation &curOrient, ArrayReservoir &res  ); 
+
+  void clearMemory(ArrayReservoir &res);
+  /** 
+      @brief for the sev-memory saving technique, we also need to remember   
+   */ 
+  void enableRestoreGapVector() { restoresGapVector = true; }  
+
+  void recycleArray(TreeAln& traln, nat nodeNumber, nat partitionId, ArrayReservoir& res); 
+  
+private: 			// METHODS
+  std::pair<double*,nat> removeArray(TreeAln &traln, nat num, nat partition); 
+  void insertArray(TreeAln &traln, nat num, nat partition, std::pair<double*,nat> toInsert); 
+
+private: 			// ATTRIBUTES
+  std::vector<PartitionLikelihood> partitionLikelihoods; 
+  bool restoresGapVector; 
+  ArrayOrientation arrayOrientation; 
+  bool cacheTipTip; 
+  bool cacheTipInner; 
+}; 
+
+#endif
diff --git a/src/eval/FullCachePolicy.cpp b/src/eval/FullCachePolicy.cpp
new file mode 100644
index 0000000..fde1216
--- /dev/null
+++ b/src/eval/FullCachePolicy.cpp
@@ -0,0 +1,39 @@
+#include "FullCachePolicy.hpp"
+#include "BranchPlain.hpp"
+
+
+FullCachePolicy::FullCachePolicy(const TreeAln& traln, bool cacheTipTip, bool cacheTipInner  )
+  : restorer(traln, cacheTipTip, cacheTipInner)
+{
+}
+
+
+void FullCachePolicy::imprintPolicy(const TreeAln &traln, ArrayOrientation &arrayOrient)  
+{
+  restorer.resetRestorer(traln, arrayOrient);   
+}
+
+
+void FullCachePolicy::freeMemory(ArrayReservoir& res) 
+{
+  restorer.clearMemory(res);
+}
+
+void FullCachePolicy::accountForRejectionPolicy(TreeAln &traln, const std::vector<bool> &partitions, const std::vector<nat>& invalidNodes, ArrayOrientation &arrayOrient, ArrayReservoir &res)
+{
+  restorer.restoreSomePartitions(traln, partitions, arrayOrient, res); 
+}
+
+
+std::unique_ptr<ArrayPolicy> FullCachePolicy::clone() const  
+{
+  return std::unique_ptr<ArrayPolicy>(new FullCachePolicy(*this) ); 
+}
+
+void FullCachePolicy::prepareForEvaluation(TreeAln &traln, BranchPlain virtualRoot, nat model, ArrayOrientation& arrayOrientation, ArrayReservoir& res )
+{
+  // fullTraversal parameter only there to indicate whether we have to
+  // search when determining whether arrays are oriented correctly
+
+  restorer.traverseAndCache(traln, traln.findNodePtr(virtualRoot), model,  arrayOrientation,res);
+} 
diff --git a/src/eval/FullCachePolicy.hpp b/src/eval/FullCachePolicy.hpp
new file mode 100644
index 0000000..fff31f7
--- /dev/null
+++ b/src/eval/FullCachePolicy.hpp
@@ -0,0 +1,29 @@
+#ifndef FULL_CACHE_POLICY_HPP
+#define FULL_CACHE_POLICY_HPP
+
+#include "ArrayPolicy.hpp" 
+#include "ArrayOrientation.hpp"
+#include "ArrayRestorer.hpp"
+
+class FullCachePolicy : public ArrayPolicy
+{
+public: 
+  FullCachePolicy(const TreeAln& traln, bool cacheTipTip, bool cacheTipInner  ); 
+  virtual ~FullCachePolicy(){}
+
+  virtual void imprintPolicy(const TreeAln &traln, ArrayOrientation &arrayOrient) ; 
+  virtual void freeMemory(ArrayReservoir &res) ;  
+  virtual void accountForRejectionPolicy(TreeAln &traln, const std::vector<bool> &partitions, const std::vector<nat>& invalidNodes, ArrayOrientation &arrayOrient, ArrayReservoir &res); 
+  virtual void prepareForEvaluation(TreeAln &traln, BranchPlain virtualRoot, nat model  , ArrayOrientation& arrayOrientation, ArrayReservoir& res ); 
+
+  virtual std::unique_ptr<ArrayPolicy> clone() const ; 
+  
+  void enableRestoreGapVector() {restorer.enableRestoreGapVector(); } 
+
+private: 
+  ArrayRestorer restorer; 
+  
+
+}; 
+
+#endif
diff --git a/src/eval/LikelihoodEvaluator.cpp b/src/eval/LikelihoodEvaluator.cpp
new file mode 100644
index 0000000..b0f502d
--- /dev/null
+++ b/src/eval/LikelihoodEvaluator.cpp
@@ -0,0 +1,684 @@
+#include <algorithm>
+#include <numeric>
+
+#include "BranchPlain.hpp"
+#include "LikelihoodEvaluator.hpp"
+#include "GlobalVariables.hpp"
+#include "ArrayRestorer.hpp"
+// #include "Branch.hpp"
+#include "ParallelSetup.hpp"
+
+#include "common.h"
+
+using std::endl; 
+using std::cout; 
+
+
+LikelihoodEvaluator::LikelihoodEvaluator(const TreeAln &traln, ArrayPolicy* plcy ,  std::shared_ptr<ArrayReservoir> arrayReservoir, ParallelSetup* pl)
+  : _debugTralnPtr{nullptr}
+  , _verifyLnl{false}
+  , _arrayPolicy (plcy->clone()) 
+  , _arrayOrientation(traln)
+  , _arrayReservoir(arrayReservoir)
+  , _plPtr(pl)
+{
+}
+
+
+LikelihoodEvaluator::LikelihoodEvaluator( const LikelihoodEvaluator &rhs )
+  : _debugTralnPtr(std::move(rhs._debugTralnPtr))
+  , _verifyLnl(rhs._verifyLnl)
+  , _arrayPolicy(std::move(rhs._arrayPolicy->clone()))
+  , _arrayOrientation(rhs._arrayOrientation)
+  , _arrayReservoir(rhs._arrayReservoir)
+  , _plPtr(rhs._plPtr)
+{
+}
+
+
+void swap(LikelihoodEvaluator &lhs, LikelihoodEvaluator  &rhs)
+{
+  using std::swap; 
+  swap(lhs._debugTralnPtr, rhs._debugTralnPtr); 
+  swap(lhs._arrayPolicy, rhs._arrayPolicy); 
+  swap(lhs._arrayOrientation, rhs._arrayOrientation); 
+  swap(lhs._arrayReservoir, rhs._arrayReservoir); // for consistency 
+  swap(lhs._plPtr, rhs._plPtr); 
+}
+
+
+LikelihoodEvaluator& LikelihoodEvaluator::operator=(LikelihoodEvaluator rhs) 
+{
+  swap(*this, rhs); 
+  return *this; 
+}
+
+
+void LikelihoodEvaluator::updatePartials (TreeAln &traln, nodeptr p)
+{  
+  pllInstance *tr = &traln.getTrHandle(); 
+  partitionList *pr = &traln.getPartitionsHandle(); 
+
+  if(isTip(p->number, tr->mxtips))
+    return;
+
+  /* the first entry of the traversal descriptor is always reserved for evaluate or branch length optimization calls,
+     hence we start filling the array at the second entry with index one. This is not very nice and should be fixed 
+     at some point */
+
+  tr->td[0].count = 0;
+
+  /* compute the traversal descriptor, which will include nodes-that-need-update descending the subtree  p */
+  computeTraversal(tr, p, PLL_TRUE, pr->perGeneBranchLengths?pr->numberOfPartitions : 1);
+
+  /* the traversal descriptor has been recomputed -> not sure if it really always changes, something to 
+     optimize in the future */
+  tr->td[0].traversalHasChanged = PLL_TRUE;
+
+  /* if there is something to re-compute */
+
+  if(tr->td[0].count > 0)
+    {
+      /* store execute mask in traversal descriptor */
+
+      storeExecuteMaskInTraversalDescriptor(tr, pr);
+
+      for(int i = 0; i < tr->td[0].count ; ++i)
+	{
+	  auto& tInfo = tr->td[0].ti[i];
+
+	  for(nat model = 0 ; model < traln.getNumberOfPartitions(); ++model)
+	    {
+	      auto &partition = traln.getPartition(model).getHandle();
+
+	      size_t            
+		width  = partition.width;
+
+	      if(tr->td[0].executeModel[model] && width > 0)
+		{
+		  auto requiredLength = size_t(0u); 
+
+		  // assert(not tr->saveMemory ) ; 
+
+		  // determine how much memory we need 
+		  if(tr->saveMemory)
+		    {
+		      size_t
+			j,
+			setBits = 0;                
+
+		      auto x1_gap = &(partition.gapVector[tInfo.qNumber * partition.gapVectorLength]);
+		      auto x2_gap = &(partition.gapVector[tInfo.rNumber * partition.gapVectorLength]);
+		      auto x3_gap = &(partition.gapVector[tInfo.pNumber * partition.gapVectorLength]);
+            
+		      for(j = 0; j < (size_t)pr->partitionData[model]->gapVectorLength; j++)
+			{              
+			  x3_gap[j] = x1_gap[j] & x2_gap[j];
+			  setBits += 
+			    // bitcount_32_bit(x3_gap[j])
+			    __builtin_popcount(x3_gap[j])
+			    ; 
+			
+			  // std::cout << SyncOut() << "set bits is " << setBits << std::endl; 
+			}
+
+		      requiredLength = (width - setBits)  * Partition::maxCategories * partition.states * sizeof(double);            
+		    }
+		  else 
+		    {
+		      // wtf is virtual width?  
+		      requiredLength  = size_t(Partition::maxCategories)  *  virtual_width( int(width) )   * partition.states * sizeof(double);
+		    }
+
+		  auto x3_start = partition.xVector[tInfo.pNumber - tr->mxtips - 1]; 
+		  auto availableLength = partition.xSpaceVector[(tInfo.pNumber - tr->mxtips - 1)]; 
+
+		  /* new exabayes behaviour  */
+		  if(requiredLength != availableLength)
+		    {
+		      int p_slot =  tInfo.pNumber - tr->mxtips - 1; 
+		      
+		      // tout << "required = " << requiredLength << "\tavailableLength=" << availableLength << std::endl; 
+
+		      if( x3_start)
+			_arrayReservoir->deallocate(x3_start);
+
+		      x3_start = _arrayReservoir->allocate( requiredLength);
+		  
+		      partition.xVector[p_slot] = x3_start; 
+		      partition.xSpaceVector[p_slot] = requiredLength; 
+		    }
+
+		}
+	    }
+	}
+      
+      pllNewviewIterative(tr, pr, 0);
+      
+    }
+
+  tr->td[0].traversalHasChanged = PLL_FALSE;
+}
+
+
+void LikelihoodEvaluator::evaluateLikelihood (TreeAln &traln , BranchPlain branch, bool fullTraversal, bool isDebugEval)
+{
+  pllInstance* tr = &(traln.getTrHandle()); 
+  partitionList *pr = &(traln.getPartitionsHandle());
+  nodeptr p = traln.findNodePtr(branch) ; 
+
+  auto result = log_double::fromAbs(1.);
+  
+  nodeptr 
+    q = p->back; 
+
+  int
+    numBranches = pr->numberOfPartitions;
+
+  tr->td[0].ti[0].pNumber = p->number;
+  tr->td[0].ti[0].qNumber = q->number;          
+
+  for(int i = 0; i < numBranches; i++)
+    tr->td[0].ti[0].qz[i] =  q->z[i];
+
+  tr->td[0].count = 1;
+
+  if(fullTraversal)
+    {
+      assert(isTip(q->back->number, tr->mxtips));
+      computeTraversal(tr, q, PLL_FALSE, numBranches);
+    }
+  else
+    {
+      if( needsRecomp(tr->useRecom, tr->rvec, p, tr->mxtips) )
+	computeTraversal(tr, p, PLL_TRUE, numBranches);
+
+      if(  needsRecomp(tr->useRecom, tr->rvec, q, tr->mxtips) )
+	computeTraversal(tr, q, PLL_TRUE, numBranches);
+    }
+
+  // this function mostly exists for debug purposes. If it is not
+  // called in debug mode, then this function really should only take
+  // care of the evaluate part. All nodes up until the virtual root
+  // should have been computed by some other function (preferably
+  // evaluateSubtrees) already.
+  
+  // when proposal sets are turned off, this warning may be triggered  
+#if 0 
+  if(not isDebugEval)
+    {
+      if(tr->td[0].count != 1)
+	tout << "danger " << SHOW(tr->td[0].count) << " but expected 1" << std::endl; 
+    }
+#endif
+  // assert( tr->td[0].count == 1 ); 
+
+  storeExecuteMaskInTraversalDescriptor(tr, pr);
+
+  tr->td[0].traversalHasChanged = PLL_TRUE;
+
+  pllEvaluateIterative(tr, pr, PLL_FALSE); //PLL_TRUE
+  
+  auto lnls = traln.getPartitionLnls(); 
+
+  // meh 
+  {
+    auto lnlRaw = std::vector<double>(lnls.size());
+    for(auto i = 0u; i < lnls.size(); ++i)
+      lnlRaw[i] = lnls[i].getRawLog();
+  
+    lnlRaw = _plPtr->getChainComm().allReduce(lnlRaw); 
+  
+    for(auto i = 0u; i < lnlRaw.size(); ++i)
+      lnls[i] = log_double::fromLog(lnlRaw[i]);
+  }
+
+  traln.setPartitionLnls(lnls); 
+
+  for(nat i = 0; i < traln.getNumberOfPartitions(); ++i)
+    result *= lnls[i]; 
+
+  tr->likelihood = result.getRawLog();    
+  tr->td[0].traversalHasChanged = PLL_FALSE;
+}
+
+
+bool LikelihoodEvaluator::applyDirtynessToSubtree(TreeAln &traln, nat partId, const BranchPlain &branch) 
+{
+  if(traln.isTipNode(branch.getPrimNode()))
+    return true; 
+
+  nat id =  ArrayOrientation::nodeNum2ArrayNum( branch.getPrimNode() , traln.getNumberOfTaxa( ) ); 
+  auto p = traln.findNodePtr(branch); 
+
+  auto& partition = traln.getPartition(partId).getHandle();
+
+// #if 1 
+  bool isClean = partition.xSpaceVector[id] != 0  && _arrayOrientation.isCorrectNew(traln, partId, p ); 
+// #else 
+//   bool isClean = partition.xSpaceVector[id] != 0  && _arrayOrientation.isCorrect(partId, id, p->back->number); 
+// #endif
+
+  if( isClean)
+    {
+      p->x = 1; 
+      p->next->x = 0 ; 
+      p->next->next->x = 0; 
+    }
+  else 
+    { 
+      _arrayOrientation.setOrientation(partId, id, p->back->number); 
+
+      assert(not traln.isTipNode(p->number)); 
+      p->x = 0; 
+      p->next->x = 1 ; 
+      p->next->next->x = 0; 
+
+      auto descs = traln.getDescendents(branch); 
+      applyDirtynessToSubtree(traln, partId, descs.first.getInverted()); 
+      applyDirtynessToSubtree(traln, partId, descs.second.getInverted());     
+    }
+
+  return isClean; 
+}
+
+
+void LikelihoodEvaluator::evaluate( TreeAln &traln, const BranchPlain &root, bool fullTraversal)    
+{
+  // tout << "evaluate with root " << root << " and " << ( fullTraversal ? "full" : "partial" ) << std::endl; 
+  auto partitions = std::vector<nat>{}; 
+  auto numPart = traln.getNumberOfPartitions(); 
+  partitions.reserve(numPart);
+  for(nat i = 0 ; i < numPart; ++i)
+    partitions.push_back(i); 
+  evaluatePartitionsWithRoot(traln, root, partitions, fullTraversal); 
+}
+
+
+
+
+
+void LikelihoodEvaluator::evaluateSubtrees(TreeAln& traln, const BranchPlain &root , const std::vector<nat> & partitions, bool fullTraversal)
+{
+  auto toExecute = std::vector<bool>(traln.getNumberOfPartitions(), false);   
+  for(auto m : partitions)
+    {
+      auto &partition = traln.getPartition(m);
+      toExecute[m] = partition.getWidth() > 0 ; 
+    }
+  traln.setExecModel(toExecute); 
+
+  if(fullTraversal)
+    {
+      for(auto &elem : partitions)
+	{
+	  auto &partition = traln.getPartition(elem);
+	  if(partition.getWidth() > 0 )
+	    markPartitionDirty(traln, elem);
+	}
+    }
+
+  for(auto elem : partitions )
+    {
+      auto &partition = traln.getPartition(elem);
+      if(partition.getWidth() > 0 )
+	{
+	  evalSubtree(traln, elem, root, fullTraversal); 
+	  evalSubtree(traln, elem, root.getInverted(), fullTraversal); 
+	}
+    }
+}
+
+
+
+
+void LikelihoodEvaluator::evaluatePartitionsDry(TreeAln &traln, const BranchPlain &root , const std::vector<nat>& partitions)
+{
+  // horrible hack!  
+
+  auto widthBackup = std::vector<nat>{}; 
+  for(auto &p : partitions)
+    {
+      auto &ph = traln.getPartition(p).getHandle();
+      widthBackup.push_back(ph.width);
+      ph.width = 0; 
+    }
+
+  evaluatePartitionsWithRoot(traln, root, partitions, false);
+  
+  for(nat i = 0; i < widthBackup.size(); ++i)
+    {
+      auto p = partitions[i]; 
+      auto &ph = traln.getPartition(p).getHandle();
+      ph.width = widthBackup[i]; 
+    }
+}
+
+
+
+
+void LikelihoodEvaluator::evaluatePartitionsWithRoot( TreeAln &traln, const BranchPlain &root , const std::vector<nat>& partitions, bool fullTraversal)    
+{
+  // tout << "evaluatePartitions with root " << root << " and " << ( fullTraversal ? "full" : "partial" )  << " and partitons " << partitions << std::endl; 
+  auto numPart = traln.getNumberOfPartitions();
+  auto perPartitionLH = traln.getPartitionLnls();
+
+  evaluateSubtrees(traln, root, partitions, fullTraversal);
+
+  auto execute = std::vector<bool>(traln.getNumberOfPartitions(), false); 
+  for (auto elem : partitions)
+    {
+      auto &partition = traln.getPartition(elem); 
+      execute[elem] = partition.getWidth() > 0; 
+    }
+  traln.setExecModel(execute); 
+
+  bool changedOrientation  = std::any_of(begin(execute), end(execute), [](bool elem){return elem ; });
+
+  auto start = traln.findNodePtr(root);
+  if( changedOrientation && not ( ( start->x == 1 || traln.isTipNode(start)   )
+	   && ( start->back->x == 1 || traln.isTipNode(start->back) )  ) )
+    {
+      tout << "at evaluation at " << root << ": " ; 
+
+      if( not ( start->x == 1 || traln.isTipNode(start)  ))
+	{
+	  tout << " problem with " << start->number << std::endl; 
+	  assert(0); 
+	}
+    }
+  evaluateLikelihood(traln, root, false, false); 
+
+  auto pLnl = traln.getPartitionLnls();
+  for(auto m : partitions )
+    perPartitionLH[m] = pLnl[m]; 
+  traln.setPartitionLnls(perPartitionLH); 
+
+  traln.setLikelihood ( std::accumulate(begin(perPartitionLH), end(perPartitionLH), log_double::fromAbs(1.0), std::multiplies<log_double>()) ) ; 
+  traln.setExecModel(std::vector<bool>(numPart, true));
+
+#ifdef DEBUG_LNL_VERIFY
+  expensiveVerify(traln, root ,traln.getLikelihood());   
+#endif
+}
+
+
+/** 
+    NOTE: the fullTraversal parameter is only there because of the searching (HACK)
+ */ 
+void LikelihoodEvaluator::evalSubtree(TreeAln  &traln, nat partId, const BranchPlain &evalBranch, bool fullTraversal)   
+{
+  // TODO do we have a cleaner partition for this break? It is
+  // necessary, s.t. in the -Q case, we do not do all that traverals
+  // (prepareForEvaluation) for partitions that do not have data anyway
+  auto &partition = traln.getPartition(partId);
+  if(partition.getWidth() == 0 )
+    return; 
+  
+  // tout << "eval subtree for " << partId << std::endl; 
+
+  if(traln.isTipNode(evalBranch.getPrimNode()))
+    {
+      // tout << evalBranch << " is a tip node " << std::endl; 
+      return; 
+    }
+
+  _arrayPolicy->prepareForEvaluation(traln, evalBranch, partId, _arrayOrientation, *_arrayReservoir); 
+  applyDirtynessToSubtree(traln, partId, evalBranch);
+  
+  
+  bool showDebug =  
+#ifdef LNL_PRINT_DEBUG
+    true ; 
+#else 
+  false ; 
+#endif
+
+
+  if( showDebug )
+    {
+      if(traln.findNodePtr(evalBranch)->x != 1)
+	{
+	  tout << "computing "; 
+	  debugPrintToComputeHelper(traln, evalBranch); 
+	  tout << std::endl; 
+	}
+      else 
+	{
+	  tout << "nothing to compute" << std::endl; 
+	}      
+    }
+  
+  // abort, if everything is okay 
+  if(traln.findNodePtr(evalBranch)->x == 1)
+    return; 
+
+  auto execute = std::vector<bool>(traln.getNumberOfPartitions(), false); 
+  execute[partId] = true; 
+  traln.setExecModel(execute); 
+
+  updatePartials(traln, traln.findNodePtr(evalBranch) ); 
+
+  // assert stuff 
+  auto desc = traln.getDescendents(evalBranch); 
+  auto p = traln.findNodePtr(desc.first.getInverted()); 
+  assert(p->x || traln.isTipNode(p->number)); 
+  p = traln.findNodePtr(desc.second.getInverted()); 
+  assert(p->x || traln.isTipNode(p->number)); 
+
+  p =  traln.findNodePtr(evalBranch); 
+
+  p->x = 1; 
+  p->next->x  = 0; 
+  p->next->next->x = 0; 
+}
+
+
+void LikelihoodEvaluator::disorientDebugHelper(TreeAln &traln, const BranchPlain& root  )
+{
+  auto p = traln.findNodePtr(root); 
+
+  if( traln.isTipNode(p))
+    return ; 
+
+  p->x = 0; 
+  p->next->x = 1; 
+  p->next->next->x = 0; 
+
+  auto descs = traln.getDescendents(root); 
+  disorientDebugHelper(traln, descs.first.getInverted()); 
+  disorientDebugHelper(traln, descs.second.getInverted()); 
+}
+
+
+void LikelihoodEvaluator::disorientDebug(TreeAln &traln, const BranchPlain& root  )
+{
+  disorientDebugHelper(traln,root); 
+  disorientDebugHelper(traln, root.getInverted()); 
+}
+
+
+void LikelihoodEvaluator::expensiveVerify(TreeAln &traln, BranchPlain root, log_double toVerify )
+{
+  // std::cout << "orig-lnl=" << traln.getTrHandle().likelihood << std::endl;  
+  debugPrint = 0 ; 
+  
+  _debugTralnPtr->clearMemory();
+  *_debugTralnPtr = traln; 
+
+  disorientDebug(*_debugTralnPtr, root); 
+  evaluateLikelihood(*_debugTralnPtr, root, false, true);   
+
+  auto verifiedLnl =  _debugTralnPtr->getLikelihood(); 
+
+  if( fabs(log_double(verifiedLnl / toVerify ).toAbs())  - 1.0  > ACCEPTED_LIKELIHOOD_EPS)
+    {
+      for(nat j = 0; j < traln.getNumberOfPartitions() ; ++j )
+	{
+	  auto& partition = _debugTralnPtr->getPartition(j).getHandle(); 
+	  auto sc = partition.globalScaler; 
+	  tout << "scCorr=" ; 
+	  nat ctr = 0; 
+	  for(nat i = 0; i < 2 * traln.getNumberOfTaxa(); ++i)
+	    {
+	      if(sc[i] != 0 )
+		tout << ctr <<  "=" << sc[i] << ","; 
+	      ++ctr; 
+	    }
+	  tout << std::endl; 
+
+	  auto& partition2 = traln.getPartition(j).getHandle(); 
+	  sc = partition2.globalScaler; 
+	  tout << "scReal=" ; 
+	  ctr = 0; 
+	  for(nat i = 0; i < 2 * traln.getNumberOfTaxa(); ++i)
+	    {
+	      if(sc[i] != 0)
+		{
+		  tout << ctr << "=" << sc[i] << " "; 
+		}
+	      ++ctr; 
+	    }
+	  tout << std::endl; 
+	} 
+
+      tout << "WARNING: found in expensive evaluation: likelihood difference is " 
+	   << " TODO "
+	   // <<  std::setprecision(8) <<   fabs (verifiedLnl - toVerify )
+	   << " (with toVerify= " << toVerify << ", verified=" << verifiedLnl << ")\n"
+	   << "partitionLnls= " << traln.getPartitionLnls() << "\n"
+	   << "verifiedPartLnls="  << _debugTralnPtr->getPartitionLnls() << "\n"; 
+
+      evaluateLikelihood(traln, traln.getAnyBranch(), true, true); 
+      tout  << "after full traversal on orig=" << traln.getTrHandle().likelihood << std::endl; 
+      assert(0); 
+    }  
+  // assert(fabs (verifiedLnl - toVerify ) < ACCEPTED_LIKELIHOOD_EPS); 
+  
+  debugPrint = 1;  
+
+  // std::cout << SyncOut() << "VERIFIED " << MAX_SCI_PRECISION << verifiedLnl << SOME_FIXED_PRECISION << std::endl; 
+
+  _debugTralnPtr->clearMemory();
+}
+
+
+#ifdef DEBUG_LNL_VERIFY
+void LikelihoodEvaluator::setDebugTraln(std::shared_ptr<TreeAln> debugTraln)
+{
+  _verifyLnl = true; 
+  _debugTralnPtr = debugTraln; 
+}
+#endif
+
+
+void LikelihoodEvaluator::invalidateArray(const TreeAln &traln, nat nodeId)
+{
+  // tout << "INVAL "<< nodeId << std::endl; 
+  for(nat i = 0; i < traln.getNumberOfPartitions() ;++i)
+    _arrayOrientation.setOrientation(i, ArrayOrientation::nodeNum2ArrayNum(nodeId,traln.getNumberOfTaxa()), INVALID); 
+} 
+
+
+void LikelihoodEvaluator::debugPrintToComputeHelper(const TreeAln &traln, const BranchPlain &root )
+{
+  if(traln.isTipNode(root.getPrimNode()))
+    return; 
+
+  auto desc = traln.getDescendents(root); 
+  
+  if( traln.findNodePtr(root)->x == 0)
+    {
+      tout << root.getPrimNode() <<  "=(" << desc.first.getSecNode( )<<  "+"  << desc.second.getSecNode()  << "),"  ; 
+      debugPrintToComputeHelper(traln, desc.first.getInverted()); 
+      debugPrintToComputeHelper(traln, desc.second.getInverted()); 
+    }
+}
+
+
+// prints what will be computed 
+void LikelihoodEvaluator::debugPrintToCompute(const TreeAln &traln, const BranchPlain &root)
+{
+  tout << "to compute: 0=(" <<   root.getPrimNode() << "+" << root.getSecNode() << ")," ; 
+  debugPrintToComputeHelper(traln, root); 
+  debugPrintToComputeHelper(traln, root.getInverted()); 
+}
+
+
+void LikelihoodEvaluator::invalidateArray(const TreeAln &traln, nat partitionId, nat nodeId) 
+{
+  nat id = nodeId - traln.getNumberOfTaxa()  - 1; 
+  _arrayOrientation.setOrientation(partitionId,id, INVALID); 
+} 
+
+void LikelihoodEvaluator::markPartitionDirty(const TreeAln &traln, nat partition )
+{
+  _arrayOrientation.setPartitionInvalid(partition);
+}
+
+void LikelihoodEvaluator::accountForRejection(TreeAln &traln, const std::vector<bool> &partitions, const std::vector<nat> &invalidNodes)
+{
+  _arrayPolicy->accountForRejection(traln,partitions, invalidNodes, _arrayOrientation,*_arrayReservoir); 
+}
+
+void LikelihoodEvaluator::freeMemory()
+{ 
+  _arrayPolicy->freeMemory(*_arrayReservoir) ; 
+}  
+
+void LikelihoodEvaluator::imprint(const TreeAln &traln) 
+{ 
+  _arrayPolicy->imprint(traln, _arrayOrientation);  
+}
+
+
+
+void  LikelihoodEvaluator::evaluateSubtrees(TreeAln& traln, const BranchPlain &root, bool fullTraversal)
+{
+  auto parts = std::vector<nat>();
+  for(nat i = 0; i < traln.getNumberOfPartitions(); ++i)
+    parts.push_back(i);
+  evaluateSubtrees(traln, root, parts, fullTraversal); 
+} 
+
+
+
+
+bool LikelihoodEvaluator::subtreeValid(const TreeAln& traln, const BranchPlain &root,  const std::unordered_set<BranchPlain> &invalidBranches) 
+{
+  if( not traln.isTipNode(root.getSecNode()) )
+    {
+      auto desc = traln.getDescendents(root.getInverted()); 
+
+      auto sideA = subtreeValid(traln, desc.first, invalidBranches); 
+      auto sideB = subtreeValid(traln, desc.second, invalidBranches); 
+      
+      auto isValid = invalidBranches.find(root) == invalidBranches.end()
+	&& sideA 
+	&& sideB; 
+      
+      if(not isValid)
+	{
+	  invalidateArray(traln, root.getSecNode());
+	  tout << "marked " << root.getSecNode() << " as dirty" << std::endl; 
+	}
+      return isValid; 
+    }
+  else 
+    return true; 
+}
+
+/* 
+   in case, we have proposed new branches, this invalidates all
+   likelihood arrays that are affected by this 
+ */ 
+void LikelihoodEvaluator::invalidateWithBranches(const TreeAln& traln, const BranchPlain &root,  const std::unordered_set<BranchPlain> &invalidBranches)
+{
+  if(not traln.isTipNode(root.getSecNode()))
+    subtreeValid(traln, root, invalidBranches);
+  if(not traln.isTipNode(root.getPrimNode()))
+    subtreeValid(traln,root.getInverted(), invalidBranches); 
+}
+
+
+
diff --git a/src/eval/LikelihoodEvaluator.hpp b/src/eval/LikelihoodEvaluator.hpp
new file mode 100644
index 0000000..9d91c64
--- /dev/null
+++ b/src/eval/LikelihoodEvaluator.hpp
@@ -0,0 +1,123 @@
+#ifndef _TREE_EVALUATOR_HPP
+#define _TREE_EVALUATOR_HPP
+
+#include <vector>
+
+#include "ArrayPolicy.hpp"
+#include "TreeAln.hpp"
+#include "ArrayOrientation.hpp"
+
+class ParallelSetup; 
+
+#include "extensions.hpp"
+
+class LikelihoodEvaluator
+{
+public: 
+  LikelihoodEvaluator(const TreeAln &traln, ArrayPolicy *plcy,  std::shared_ptr<ArrayReservoir> arrayReservoir, ParallelSetup* pl); 
+  ~LikelihoodEvaluator(){}
+  LikelihoodEvaluator( LikelihoodEvaluator &&rhs) = default; 
+  LikelihoodEvaluator( const LikelihoodEvaluator &rhs ); 
+  LikelihoodEvaluator& operator=(LikelihoodEvaluator rhs) ; 
+  friend void swap(LikelihoodEvaluator &lhs, LikelihoodEvaluator  &rhs); 
+  /**
+     @brief: evaluate a list of partitions. This is always a full traversal 
+   */
+  void evaluatePartitionsWithRoot( TreeAln &traln, const BranchPlain& root,  const std::vector<nat>& partitions, bool fullTraversal)  ; 
+  
+  /** 
+      @brief a horrible hack: since I do not get what arcane
+      invocations are necessary to make branch length optimization
+      work without an evaluate, we execute an evaluate here, but with
+      partition.width set to 0. Computationally this is okay, but
+      otherwise it is horrible. If you have a few days to spent,
+      please correct this.
+  */
+  void evaluatePartitionsDry(TreeAln &traln, const BranchPlain &root , const std::vector<nat>& partitions); 
+  
+  void invalidateWithBranches(const TreeAln& traln, const BranchPlain &root,  const std::unordered_set<BranchPlain> &invalidBranches); 
+
+  /** 
+      @brief evaluate a subtree. This used to be the
+      newview-command. The this-node is the important part, the
+      that-node of the branch only specifies the orientation.
+   */ 
+  void evalSubtree(TreeAln  &traln, nat partition, const BranchPlain &evalBranch, bool fullTraversal) ; 
+  /** 
+      @brief evaluation at a given branch  
+   */ 
+  void evaluate( TreeAln &traln, const BranchPlain &root, bool fullTraversal)    ;
+  /** 
+      @brief mark a node as dirty  
+   */ 
+  void invalidateArray(const TreeAln &traln, nat nodeId); 
+  void invalidateArray(const TreeAln &traln, nat partitionId, nat nodeId) ; 
+  
+  void debugPrintToCompute(const TreeAln &traln, const BranchPlain &root); 
+  void debugPrintToComputeHelper(const TreeAln &traln, const BranchPlain &root ); 
+  /** 
+      @brief marks the entire tree dirty 
+   */ 
+  void markPartitionDirty(const TreeAln &traln, nat partition ); 
+  /** 
+      @brief indicates whether a likelihood array for a given node and
+      partition is invalid
+  */ 
+  bool isDirty(nat partition,nat nodeId)  const ; 
+  /** 
+      @brief make the current state in the tree resettable (only needed for chain.cpp)
+   */ 
+  void imprint(const TreeAln &traln); 
+  /** 
+      @brief the main point of this is to free remaining memory  
+   */ 
+  void freeMemory() ; 
+  /** 
+      @brief use backup likelihood
+   */ 
+  void accountForRejection(TreeAln &traln, const std::vector<bool> &partitions, const std::vector<nat> &invalidNodes); 
+
+  ArrayOrientation getOrientation() const {return _arrayOrientation;   }
+
+  void expensiveVerify(TreeAln &traln,  BranchPlain root, log_double toVerify);
+  void setDebugTraln(std::shared_ptr<TreeAln> _debugTraln); 
+
+  ArrayReservoir& getArrayReservoir() {return *(_arrayReservoir) ; }
+
+  ParallelSetup& getParallelSetup() { return *_plPtr; }
+
+  void evaluateSubtrees(TreeAln& traln, const BranchPlain &root , const std::vector<nat> & partitions, bool fullTraversal); 
+  
+  void  evaluateSubtrees(TreeAln& traln, const BranchPlain &root, bool fullTraversal); 
+
+private: 			// METHODS 
+  /** 
+      @brief traverses the tree and reorients nodes to enforce
+      re-computation
+      
+      @param the new virtual root
+      
+      @notice an important assumption is that the new virtual root is
+      adjacent to invalidated likelihood arrays. Everything else would
+      be extremely inefficient.
+   */ 
+  bool applyDirtynessToSubtree(TreeAln &traln, nat partition, const BranchPlain &branch); 
+
+  void disorientDebug(TreeAln &traln, const BranchPlain& root); 
+  void disorientDebugHelper(TreeAln &traln, const BranchPlain& root); 
+
+  bool subtreeValid(const TreeAln& traln, const BranchPlain &root,  const std::unordered_set<BranchPlain> &invalidBranches) ; 
+
+  void evaluateLikelihood (TreeAln &traln , BranchPlain branch, bool fullTraversal, bool isDebugEval); 
+  void updatePartials (TreeAln& traln, nodeptr p); 
+
+private: 			// ATTRIBUTES 
+  std::shared_ptr<TreeAln> _debugTralnPtr;  
+  bool _verifyLnl; 
+  std::unique_ptr<ArrayPolicy> _arrayPolicy; 
+  ArrayOrientation _arrayOrientation; 
+  std::shared_ptr<ArrayReservoir> _arrayReservoir; 
+  ParallelSetup* _plPtr;
+}; 
+#endif
+
diff --git a/src/eval/NoCachePolicy.cpp b/src/eval/NoCachePolicy.cpp
new file mode 100644
index 0000000..55eaa82
--- /dev/null
+++ b/src/eval/NoCachePolicy.cpp
@@ -0,0 +1,28 @@
+#include "NoCachePolicy.hpp"
+#include <cassert>
+
+NoCachePolicy::NoCachePolicy(const TreeAln &traln )
+{
+}
+
+
+std::unique_ptr<ArrayPolicy> NoCachePolicy::clone() const  
+{
+  return std::unique_ptr<ArrayPolicy>(new NoCachePolicy(*this) ); 
+}
+
+
+void NoCachePolicy::accountForRejectionPolicy(TreeAln &traln, const std::vector<bool> &partitions, const std::vector<nat>& invalidNodes, ArrayOrientation &arrayOrient , ArrayReservoir &res)
+{
+  for(nat i = 0; i < partitions.size( ); ++i)
+    {
+      if(not partitions[i])
+	continue; 
+      
+      for(auto &elem : invalidNodes)
+	{
+	  nat id = elem - traln.getNumberOfTaxa()  -1 ; 
+	  arrayOrient.setInvalid(i,id); 
+	}
+    }
+}  
diff --git a/src/eval/NoCachePolicy.hpp b/src/eval/NoCachePolicy.hpp
new file mode 100644
index 0000000..e877a4e
--- /dev/null
+++ b/src/eval/NoCachePolicy.hpp
@@ -0,0 +1,23 @@
+#ifndef NO_CACHE_POLICY_HPP
+#define NO_CACHE_POLICY_HPP
+
+#include "ArrayPolicy.hpp"
+#include "BranchPlain.hpp"
+
+class NoCachePolicy : public ArrayPolicy
+{
+public: 
+  NoCachePolicy(const TreeAln &traln ); 
+  virtual ~NoCachePolicy(){}
+
+  virtual void imprintPolicy(const TreeAln &traln, ArrayOrientation &arrayOrient) {} 
+  virtual void freeMemory(ArrayReservoir & res)  {} 
+  virtual void prepareForEvaluation(TreeAln &traln, BranchPlain virtualRoot, nat models, ArrayOrientation& arrayOrientation, ArrayReservoir& res ) {} 
+  virtual void accountForRejectionPolicy(TreeAln &traln, const std::vector<bool> &partitions, const std::vector<nat>& invalidNodes, ArrayOrientation &arrayOrient , ArrayReservoir &res); 
+  virtual std::unique_ptr<ArrayPolicy> clone() const ; 
+
+}; 
+
+
+
+#endif
diff --git a/src/eval/ParsimonyEvaluator.cpp b/src/eval/ParsimonyEvaluator.cpp
new file mode 100644
index 0000000..d5c93d0
--- /dev/null
+++ b/src/eval/ParsimonyEvaluator.cpp
@@ -0,0 +1,62 @@
+#include "ParsimonyEvaluator.hpp"
+
+
+
+// not messing around with pll.h any more, let's declare it right here: 
+extern "C"
+{
+  void newviewParsimony(pllInstance *tr, partitionList *pr, nodeptr  p); 
+  unsigned int evaluateParsimony(pllInstance *tr, partitionList *pr, nodeptr p, boolean full); 
+}
+
+
+void ParsimonyEvaluator::disorientNode(nodeptr p)
+{
+  if(p->xPars == 1 )
+    {
+      p->xPars = 0; 
+      p->next->xPars = 1 ; 
+      p->next->next->xPars = 0 ; 
+    }
+}
+
+
+void ParsimonyEvaluator::evaluateSubtree(TreeAln &traln, nodeptr p)
+{
+  newviewParsimony(&(traln.getTrHandle()), &(traln.getPartitionsHandle()), p); 
+}
+
+
+std::array<nat,3> ParsimonyEvaluator::evaluate(TreeAln &traln, nodeptr p, bool fullTraversal ) 
+{
+  auto result = std::array<parsimonyNumber,3>{{0,0,0}}; 
+
+  auto &pHandle = traln.getPartitionsHandle();
+  auto &tHandle = traln.getTrHandle();
+  
+  assert(not tHandle.fastParsimony ); 
+
+  evaluateParsimony(&tHandle, &pHandle, p, fullTraversal ? PLL_TRUE : PLL_FALSE);
+
+  for(nat i = 0; i < traln.getNumberOfPartitions(); ++i)
+    {
+      auto &partition = traln.getPartition(i); 
+      // HACK 
+      switch(partition.getDataType())
+	{
+	case PLL_BINARY_DATA: 
+	  result[0] += partition.getPartitionParsimony();
+	  break; 
+	case PLL_DNA_DATA: 
+	  result[1] += partition.getPartitionParsimony(); 
+	  break; 
+	case PLL_AA_DATA: 
+	  result[2] += partition.getPartitionParsimony(); 
+	  break; 
+	default : 
+	  assert(0); 
+	}
+    }
+
+  return result; 
+}
diff --git a/src/eval/ParsimonyEvaluator.hpp b/src/eval/ParsimonyEvaluator.hpp
new file mode 100644
index 0000000..61549e2
--- /dev/null
+++ b/src/eval/ParsimonyEvaluator.hpp
@@ -0,0 +1,63 @@
+#ifndef PARSIMONY_EVALUATOR
+#define PARSIMONY_EVALUATOR
+
+#include "RemoteComm.hpp"
+#include <cassert>
+#include "TreeAln.hpp"
+
+class ParsimonyEvaluator
+{
+public:
+  ParsimonyEvaluator()
+  {}
+  
+  ParsimonyEvaluator(const ParsimonyEvaluator& rhs )  = default; 
+  ParsimonyEvaluator( ParsimonyEvaluator&& rhs ) = default; 
+  ParsimonyEvaluator& operator=(const ParsimonyEvaluator &rhs)= default ; 
+  ParsimonyEvaluator& operator=( ParsimonyEvaluator &&rhs)= default ; 
+
+
+  void evaluateSubtree(TreeAln &traln, nodeptr p);
+
+  /** 
+      @brief evaluates the parsimony score of the tree
+
+      @param parsimonyLength the per partition parsimony score for the
+      transition between the descendent nodes
+   */ 
+  std::array<parsimonyNumber,3> evaluate(TreeAln &traln, nodeptr p, bool fullTraversal ) ; 
+    
+  static nat numState2pos(int dataType) 
+  { 
+    switch(dataType)
+      {
+      case PLL_BINARY_DATA: 
+	return 0 ; 
+      case PLL_DNA_DATA: 
+	return 1 ; 
+      case PLL_AA_DATA: 
+	return 2; 
+      default: 
+	assert(0); 
+      }
+  }
+
+  static nat pos2numstate(nat pos)
+  {
+    switch(pos)
+      {
+      case 0: 
+	return PLL_BINARY_DATA; 
+      case 1: 
+	return PLL_DNA_DATA; 
+      case 2: 
+	return PLL_AA_DATA; 
+      default : 
+	assert(0); 
+      }
+  }
+
+  static void disorientNode(nodeptr p); 
+}; 
+
+#endif
diff --git a/src/eval/PartitionLikelihood.hpp b/src/eval/PartitionLikelihood.hpp
new file mode 100644
index 0000000..0327459
--- /dev/null
+++ b/src/eval/PartitionLikelihood.hpp
@@ -0,0 +1,44 @@
+#ifndef _PARTITION_LIKELIHOOD 
+#define _PARTITION_LIKELIHOOD 
+
+#include <vector>
+#include "TreeAln.hpp"
+
+class PartitionLikelihood
+{
+public: 
+  PartitionLikelihood(const TreeAln& traln, nat modelArg, bool useSEV)
+    : model(modelArg)
+    , cachedArrays(traln.getNumberOfInnerNodes(false)) // we are talking about the unrooted pll tree  
+    , lengths(traln.getNumberOfInnerNodes(false), 0) 
+    , scaler( 2 * traln.getNumberOfTaxa() , 0)
+    , isCached(traln.getNumberOfInnerNodes(false),false)
+    , gapVector{}
+    , gapColumn{}
+  {
+    if(useSEV)
+      {
+// #if 0
+	auto& partition = traln.getPartition(model); 
+	gapVector = std::vector<nat>(partition.getGapVectorLength() * 2 * traln.getNumberOfTaxa() , 0);
+	gapColumn = std::vector<double>(traln.getNumberOfTaxa( ) * partition.getStates() * Partition::maxCategories ,0);
+	// very MEH 
+
+// #else 
+// 	// TODO gap stuff 
+// 	assert(0); 
+// #endif
+      }
+  }
+
+
+public: 
+  nat model; 
+  std::vector< double* > cachedArrays; 
+  std::vector<size_t> lengths;
+  std::vector<nat> scaler; 
+  std::vector<bool> isCached; 
+  std::vector<nat> gapVector;
+  std::vector<double> gapColumn; 
+}; 
+#endif
diff --git a/src/eval/README.txt b/src/eval/README.txt
new file mode 100644
index 0000000..9bb1d44
--- /dev/null
+++ b/src/eval/README.txt
@@ -0,0 +1,2 @@
+This module contains classes that govern the evaluation of the
+likelihood function.
diff --git a/src/file/DiagnosticsFile.cpp b/src/file/DiagnosticsFile.cpp
new file mode 100644
index 0000000..f8e2340
--- /dev/null
+++ b/src/file/DiagnosticsFile.cpp
@@ -0,0 +1,228 @@
+#include "DiagnosticsFile.hpp"
+
+#include <sstream>
+#include <unordered_map>
+
+
+std::string DiagnosticsFile::createName(std::string runname, std::string workdir)
+{
+  std::stringstream ss; 
+  ss << workdir << (workdir.compare("") == 0 ? "" : "/") 
+     << PROGRAM_NAME << "_diagnostics." << runname ; 
+  
+  return ss.str();
+}
+
+
+void DiagnosticsFile::initialize(std::string workdir, std::string name, const std::vector<CoupledChains> &runs) 
+{
+  assert(not _initialized); 
+  _initialized = true; 
+
+  fullFileName = createName(name, workdir);     
+  rejectIfExists(fullFileName); 
+
+  auto&& fh = std::ofstream(fullFileName); 
+
+  fh << "GEN" ;
+
+  if(runs.size() > 1)
+    fh << "\tasdsf"; 
+  
+  for(auto& run : runs)
+    {
+      auto numElem = run.getChains().size(); 
+      auto myInfo = run.getSwapInfo(); 
+      for(nat i = 0; i < numElem; ++i)
+	{
+	  for(nat j = i+1; j < numElem; ++j )
+	    {
+	      fh << "\tsw("  << i << "," << j << ")$run" << run.getRunid(); 
+	    }
+	}
+    }
+  
+  for(auto& run : runs)
+    {
+      auto &coldChain = run.getChains()[0]; 
+
+      auto ps = coldChain.getProposalView(); 
+      auto &&ss = std::stringstream{} ; 
+      for(auto &p : ps)
+	{
+	  ss.str(""); 
+	  p->printShort(ss); 
+	  ss << "$run" << run.getRunid();  
+	  _names.push_back(ss.str()); 
+	  fh << "\t" << ss.str(); 
+	}        
+
+      for(auto &propset : coldChain.getProposalSets())
+	{
+	  for(auto &p : propset.getProposalView())
+	    {
+	      ss.str(""); 
+	      p->printShort(ss);
+	      ss << "$run" << run.getRunid();
+	      _names.push_back(ss.str()); 
+	      fh << "\t" << ss.str();
+	    }
+	}
+    }
+
+  fh << std::endl; 
+  fh.close(); 
+}
+
+
+void DiagnosticsFile::printDiagnostics(uint64_t gen, double asdsf, const std::vector<CoupledChains> &runs ) 
+{
+  auto &&fh = std::ofstream(fullFileName, std::fstream::app); 
+
+  fh << gen ; 
+  
+  if(runs.size() > 1)
+    fh << "\t" << asdsf;   
+
+  // print swapping info (if applicable)
+  for(auto &run : runs)
+    {
+      auto m = run.getSwapInfo().getMatrix();
+      for(auto &elem  : m)
+	{
+	  fh << "\t"
+	     << elem.getRatioOverall() 
+	     << "," << elem.getTotalSeen();
+	}
+    }
+
+  // print acceptance rates  
+  auto name2proposal = std::unordered_map<std::string,AbstractProposal*>{}; 
+  for(auto &run : runs)
+    {
+      for(auto &chain: run.getChains())
+	{
+	  if(chain.getCouplingId() != 0 ) // no hot chains
+	    continue; 
+
+	  for(auto &p : chain.getProposalView())
+	    {
+	      auto &&ss = std::stringstream{} ; 
+	      p->printShort(ss);
+	      ss << "$run"  << run.getRunid(); 
+
+	      assert(name2proposal.find(ss.str()) == name2proposal.end()); 
+	      name2proposal[ss.str()] = p; 
+	    }
+	  
+	  for(auto &ps  :chain.getProposalSets())
+	    {
+	      for(auto &p : ps.getProposalView())
+		{
+		  auto &&oss = std::ostringstream{}; 
+		  p->printShort(oss); 
+		  oss << "$run" << run.getRunid();
+
+		  assert(name2proposal.find(oss.str()) == name2proposal.end()); 
+		  name2proposal[oss.str()] = p; 
+		}
+	    }
+	}
+    }
+  
+  for(auto &name : _names) 
+    {
+      if(name2proposal.find(name) == end(name2proposal))
+	{
+	  tout << "could not find proposal >" << name << "<" << std::endl; 
+	  assert(0); 
+	}
+      auto& p = name2proposal[name]; 
+      auto &sctr = p->getSCtr();
+      fh << "\t" << sctr.getRatioOverall() << "," << sctr.getTotalSeen() ; 
+    }	  
+
+  fh << std::endl; 
+}
+
+
+
+static bool isProposal(std::string token)
+{
+  auto result = true;  
+
+  result &= token.compare("GEN") != 0 ;  
+  result &= token.compare("asdsf") != 0 ; 
+
+  result &= not (token[0] == 's'  && token[1] == 'w' && token[2] == '(') ; 
+
+  return result; 
+}
+
+
+static std::vector<std::string> getProposalNames(std::string line)  
+{
+  auto result = std::vector<std::string> {}; 
+  auto&& iss = std::istringstream {line}; 
+
+  while(iss)
+    {
+      auto token = std::string {}; 
+      
+      getline(iss, token, '\t');
+
+      if(iss && isProposal(token))
+	result.push_back(token);
+    }
+
+  return result; 
+}
+
+
+void DiagnosticsFile::regenerate(std::string workdir, std::string nowId, std::string prevId, uint64_t gen)
+{    
+  assert(not _initialized); 
+  _initialized = true; 
+
+  fullFileName = createName (nowId, workdir); 
+  rejectIfExists(fullFileName); 
+  auto &&fh = std::ofstream(fullFileName);   
+  auto prevFileName = createName(prevId, workdir); 
+  rejectIfNonExistant(prevFileName); 
+  auto&& ifh = std::ifstream (prevFileName); 
+
+  nat genFound = 0; 
+  nat lineCtr = 0; 
+  bool firstLine = true;  
+
+  while(genFound < gen && not ifh.eof())
+    {
+      auto line = std::string{}  ; 
+      getline(ifh, line); 
+
+      // special treatment
+      if(firstLine)
+	{
+	  firstLine = false; 
+	  
+	  _names = getProposalNames(line);
+	}
+
+      // TODO: all this comparing against empty lines only is needed,
+      // because we could not have any data lines (and only the
+      // header). Come up with a better solution. 
+      if( ( lineCtr > 0 )  &&  (  line.compare("") != 0 )  )
+      	{
+	  auto &&ss = std::stringstream{} ; 
+	  ss.str(line); 
+	  auto part = std::string{} ; 
+	  getline(ss, part, '\t'); 
+	  genFound = std::stoi(part); 
+	}
+
+      if(( genFound < gen )  && ( line.compare("") != 0 ) )
+	fh << line << std::endl; 
+      ++lineCtr;
+    }
+} 
+
diff --git a/src/file/DiagnosticsFile.hpp b/src/file/DiagnosticsFile.hpp
new file mode 100644
index 0000000..15c5afb
--- /dev/null
+++ b/src/file/DiagnosticsFile.hpp
@@ -0,0 +1,32 @@
+#ifndef _DIAGNOSTICS_FILE_H
+#define _DIAGNOSTICS_FILE_H
+
+#include <vector>
+
+#include "CoupledChains.hpp"
+#include "OutputFile.hpp"
+#include "GlobalVariables.hpp"
+
+class DiagnosticsFile : public  OutputFile
+{
+public:   
+  DiagnosticsFile() 
+    : _names{}
+    , _initialized(false) 
+  {}
+
+  void initialize(std::string workdir, std::string name, const std::vector<CoupledChains> &runs) ; 
+  void regenerate(std::string workdir, std::string nowId, std::string prevId, uint64_t gen); 
+  void printDiagnostics(uint64_t gen, double asdsf, const std::vector<CoupledChains> &runs );  
+
+  bool isInitialized() const {return _initialized; }
+
+private:   			// METHODS
+  std::string createName(std::string runname, std::string workdir); 
+
+private: 			// ATTRIBUTES 
+  std::vector<std::string> _names;   
+  bool _initialized; 
+}; 
+
+#endif
diff --git a/src/file/OutputFile.cpp b/src/file/OutputFile.cpp
new file mode 100644
index 0000000..39feedd
--- /dev/null
+++ b/src/file/OutputFile.cpp
@@ -0,0 +1,49 @@
+#include "OutputFile.hpp"
+#include "GlobalVariables.hpp"
+
+#include <fstream>
+#include <iostream>
+
+
+void OutputFile::rejectIfExists(std::string fileName)
+{
+  if( std::ifstream(fileName) ) 
+    {
+      std::cerr << std::endl <<  "File " << fileName << " already exists (probably \n"
+		<< "from previous run). Please choose a new run-id or remove previous output files. " << std::endl; 
+      exitFunction(-1, false);
+    }
+}
+
+void OutputFile::rejectIfNonExistant(std::string fileName)
+{
+  if( not std::ifstream(fileName) )      
+    {
+      std::cerr << "Error: could not find file from previous run. \n"
+		<< "The assumed name of this file was >" <<  fileName << "<. Aborting." << std::endl; 
+      exitFunction(0, true); 
+    }
+}
+
+std::string OutputFile::getFileBaseName(std::string workdir )
+{
+  auto &&ss = std::stringstream{}; 
+  ss << workdir << ( workdir.compare("") == 0  ? "" : "/") << PROGRAM_NAME; 
+  return ss.str(); 
+}
+
+bool OutputFile::directoryExists(std::string name)
+{
+  struct stat st;
+  if(stat(name.c_str(),&st) == 0)
+    if((st.st_mode & S_IFDIR) != 0)
+      return true; 
+  return false; 
+}
+
+
+void OutputFile::removeMe() const 
+{
+  if(fullFileName.compare("") != 0 )
+    remove(fullFileName.c_str() ); 
+}
diff --git a/src/file/OutputFile.hpp b/src/file/OutputFile.hpp
new file mode 100644
index 0000000..14838c9
--- /dev/null
+++ b/src/file/OutputFile.hpp
@@ -0,0 +1,30 @@
+#ifndef OUTPUT_FILE_H 
+#define OUTPUT_FILE_H 
+
+#include <sys/stat.h>
+#include <sstream>
+
+class OutputFile
+{
+public: 
+  OutputFile()
+    : fullFileName{""}
+  {
+  }
+
+  virtual ~OutputFile(){}
+
+  static void rejectIfExists(std::string fileName); 
+  void rejectIfNonExistant(std::string fileName); 
+  // TODO portability 
+  static std::string getFileBaseName(std::string workdir ); 
+  std::string getFileName() const  {return fullFileName; }
+  
+  static bool directoryExists(std::string name); 
+  void removeMe() const ; 
+
+protected:   
+  std::string fullFileName;   
+}; 
+
+#endif
diff --git a/src/file/ParameterFile.cpp b/src/file/ParameterFile.cpp
new file mode 100644
index 0000000..ed048e6
--- /dev/null
+++ b/src/file/ParameterFile.cpp
@@ -0,0 +1,140 @@
+#include "ParameterFile.hpp"
+#include "GlobalVariables.hpp"
+#include "Category.hpp"
+#include "extensions.hpp"
+
+#include <cassert>
+
+
+ParameterFile::ParameterFile(std::string workdir, std::string runname, nat ru )
+  : runid(ru)
+{
+  auto&& ss = std::stringstream{}; 
+
+  ss << OutputFile::getFileBaseName(workdir) << "_parameters.run-"<< runid << "." << runname   ; 
+  fullFileName = ss.str();
+}
+
+
+void ParameterFile::initialize(const TreeAln& traln, const ParameterList& parameters,  nat someId, bool isDryRun )  
+{        
+  rejectIfExists(fullFileName); 
+
+  if(isDryRun)
+    return; 
+
+  auto&& fh =  std::ofstream{fullFileName,std::fstream::out}; 
+
+  fh << "[ID: " << someId << "]\n"; 
+
+  fh << "Gen";
+  fh << "\tLnPr"; 
+  fh << "\tLnL" ; 
+
+  auto blParams = std::vector<AbstractParameter*> {}; 
+  for(auto &param : parameters)
+    if(param->getCategory() == Category::BRANCH_LENGTHS
+       && param->getPrior()->needsIntegration() )
+      blParams.push_back(param); 
+
+  for(auto &param : blParams)    
+    {
+      fh << "\tTL{" ; 
+      formatRange(fh, param->getPartitions()); 
+      fh << "}"; 
+    }
+
+  for(auto &p : parameters)
+    {
+      if(p->isPrintToParamFile())
+	{
+	  fh << "\t" ; 
+	  p->printAllComponentNames(fh, traln); 
+	}
+    }
+
+  fh << std::endl; 
+
+  fh.close(); 
+}
+
+
+void ParameterFile::sample(const TreeAln &traln, const ParameterList& parameters, uint64_t gen, log_double lnPr)  
+{
+  auto&& fh = std::ofstream(fullFileName, std::fstream::app);  
+    
+  fh << gen << "\t"; 
+  fh << MAX_SCI_PRECISION; 
+  fh << lnPr << "\t"; 
+  fh << traln.getTrHandle().likelihood << "\t" ; 
+
+  std::vector<AbstractParameter*> blParams ; 
+  for(auto &p : parameters)
+    {
+      if(p->getCategory() == Category::BRANCH_LENGTHS)
+	blParams.push_back(p);
+    }
+
+  // print tree lengths 
+  for(auto &param :  blParams)
+    {
+      double tl = 0; 
+      for(auto &b : traln.extractBranches(param))
+	{
+	  // tl += b.getInterpretedLength( param);
+	  tl += b.toMeanSubstitutions(param->getMeanSubstitutionRate()); 
+	}
+      fh << tl << "\t"; 
+    }
+
+  bool isFirst = true; 
+  for(auto &p : parameters)
+    {
+      if(p->isPrintToParamFile())
+	{
+	  if(isFirst)
+	    isFirst = false; 
+	  else 
+	    fh << "\t"; 
+	  p->printSample(fh,traln);
+	}
+    }
+  fh << std::endl; 
+}
+
+
+void ParameterFile::regenerate(std::string workdir, std::string prevId, uint64_t gen) 
+{
+  std::ofstream fh(fullFileName, std::fstream::out); 
+
+  std::stringstream ss; 
+  ss << OutputFile::getFileBaseName(workdir) << "_parameters.run-"<< runid  << "." << prevId; 
+  std::ifstream prevFile(ss.str()); 
+  rejectIfNonExistant(ss.str()); 
+
+  nat genFound = 0; 
+  nat lineCtr = 0; 
+  while(genFound < gen && not prevFile.eof())
+    {
+      std::string line; 
+      getline(prevFile, line); 
+      
+      // hack =/ 
+      bool lineIsEmpty = line.compare("") == 0 ; 
+      
+      if(lineCtr > 1 && not lineIsEmpty)
+	{
+	  std::stringstream ss1; 
+	  ss1.str(line); 
+	  std::string part; 
+	  getline( ss1 ,part, '\t'  );       
+	  genFound = std::stoi(part); 
+	}
+
+      if(genFound < gen && not lineIsEmpty)
+	fh << line << std::endl; 
+      ++lineCtr; 
+    }
+
+  fh.close();
+} 
diff --git a/src/file/ParameterFile.hpp b/src/file/ParameterFile.hpp
new file mode 100644
index 0000000..748c848
--- /dev/null
+++ b/src/file/ParameterFile.hpp
@@ -0,0 +1,35 @@
+#ifndef _PARAMETER_FILE
+#define _PARAMETER_FILE
+
+#include <sstream>
+#include <string>
+#include <iostream> 
+#include <limits>
+#include <vector>
+
+#include "ParameterList.hpp"	
+#include "AbstractParameter.hpp"
+// #include "Branch.hpp"
+#include "OutputFile.hpp"
+
+/**
+   @notice opening and closing the stream all the time may appear
+   weird. Since properly the copy/move constructor for streams is not
+   implemented properly in g++, it appears as a good choice to do it
+   as implemented below.
+ */
+
+class  ParameterFile  : public OutputFile
+{
+public: 
+  ParameterFile(std::string workdir, std::string runname, nat runid ); 
+  void initialize(const TreeAln& traln, const ParameterList& parameters,  nat someId, bool isDryRun )  ; 
+  void sample(const TreeAln &traln, const ParameterList& parameters, uint64_t gen, log_double lnPr)  ; 
+  void regenerate(std::string workdir, std::string prevId, uint64_t gen) ; 
+  
+private: 
+  nat runid; 
+}; 
+
+
+#endif
diff --git a/src/file/README.txt b/src/file/README.txt
new file mode 100644
index 0000000..0d1ce09
--- /dev/null
+++ b/src/file/README.txt
@@ -0,0 +1 @@
+This module contains classes used in file I/O.
diff --git a/src/file/TopologyFile.cpp b/src/file/TopologyFile.cpp
new file mode 100644
index 0000000..f263d3a
--- /dev/null
+++ b/src/file/TopologyFile.cpp
@@ -0,0 +1,158 @@
+#include "TopologyFile.hpp"
+#include "GlobalVariables.hpp"
+#include "extensions.hpp"
+#include "AbstractParameter.hpp"
+#include "TreePrinter.hpp"
+#include "BranchLengthsParameter.hpp"
+
+#include <cassert>
+
+void genericExit(int code); 
+
+TopologyFile::TopologyFile(std::string workdir, std::string runname, nat runidArg, nat couplingIdArg, nat _paramNum, bool _hasManyTopoloFiles) 
+  : runid(runidArg)
+  , couplingId(couplingIdArg)
+  , paramNum(_paramNum)
+  , hasManyTopoloFiles(_hasManyTopoloFiles)
+{ 
+  auto&& ss = std::stringstream{}; 
+  
+  ss <<  OutputFile::getFileBaseName(workdir) << "_topologies.run-"<< runid <<  "." << runname ; 
+  if(hasManyTopoloFiles)
+    ss << ".tree." << paramNum; 
+  
+  if(couplingId != 0 )
+    ss << ".hot-"<<  couplingId; 
+  fullFileName = ss.str();
+}
+
+
+void TopologyFile::initialize(const TreeAln& traln, nat someId, bool isDryRun)  
+{    
+  rejectIfExists(fullFileName);   
+
+  if(isDryRun)
+    return; 
+
+  std::ofstream fh(fullFileName,std::fstream::out );  // std::fstream::app    
+    
+  fh << "#NEXUS" << std::endl
+     << "[ID: " << someId <<  "]" << std::endl
+     << "[Param: tree]" << std::endl 
+     <<  "begin trees;" << std::endl
+     << "\ttranslate" <<  std::endl; 
+
+  auto taxa =  traln.getTaxa(); 
+  nat ctr = 1; 
+  for(auto taxon : taxa)
+    {
+      auto isLast = taxon.compare( taxa.back() )  == 0 ; 
+      fh << "\t" <<  ctr << "\t"
+  	 << taxon  << (isLast ? ";" : ",")<< std::endl; 
+      ++ctr; 
+    }
+
+  fh.close(); 
+}
+
+
+std::streamoff TopologyFile::getPosBeforeEnd() const 
+{
+  auto &&in = std::ifstream{fullFileName};
+  // in.sync();
+  
+  int c = 0; 
+  int pos = 0; 
+  nat newLinesEncountered = 0; 
+  
+  while(newLinesEncountered < 2 && c != EOF)
+    {
+      --pos; 
+      in.seekg(pos, std::ios::end); 
+      c = in.peek();
+      if(c == '\n')
+	++newLinesEncountered; 
+    }
+  
+  ++pos; 
+  in.seekg(pos, std::ios::end); 
+  auto str = std::string(); 
+  getline(in, str); 
+
+  if(str.compare("end;") == 0)
+    return std::streamoff{pos}; 
+  else 
+    return 0; 
+}
+
+
+void TopologyFile::sample(const TreeAln &traln, uint64_t gen,  AbstractParameter* param)  
+{    
+  auto pos = getPosBeforeEnd(); 
+
+  auto&& fh = std::fstream(fullFileName, std::ios::in | std::ios::out);
+  fh.seekp(pos, std::ios::end); 
+
+  auto tp = TreePrinter( param->getCategory() == Category::BRANCH_LENGTHS , false, false);
+
+  auto treeString = tp.printTree(traln, param);
+  fh << "\ttree gen."<< gen
+     << ".{"; 
+
+  formatRange(fh, param->getPartitions()); 
+
+  fh << "}"
+     << " = [&U] " << treeString << std::endl; 
+
+  fh << "end;" << std::endl; 
+
+}
+
+
+void TopologyFile::regenerate(std::string workdir, std::string prevId, uint64_t gen ) 
+{
+  auto&& fh = std::ofstream(fullFileName, std::fstream::out); 
+
+  auto&& ss = std::stringstream {}; 
+  
+  ss << OutputFile::getFileBaseName(workdir) << "_topologies.run-"  << runid  << "."  << prevId; 
+  if(hasManyTopoloFiles)
+    ss << ".tree." << paramNum; 
+
+  auto&& prevFile = std::ifstream(ss.str()); 
+  rejectIfNonExistant(ss.str()); 
+
+  nat genFound = 0; 
+  while(genFound < gen &&  prevFile)
+    {
+      auto line = std::string{}; 
+      getline(prevFile, line ); 
+      
+      // HACK 
+      bool lineIsEmpty = line.compare("") == 0; 
+
+      if(not lineIsEmpty)
+	{
+	  // find start
+	  nat cnt = 0; 
+	  while(line[cnt] == ' '  && cnt < line.size())
+	    ++cnt;
+
+	  auto&& ss1 = std::stringstream{} ; 
+	  ss1.str(line.substr(cnt+1)); 
+	  // tout << "no white:>" << ss.str() << "<" << std::endl; 
+	  auto found = std::string{} ;       
+	  getline(ss1, found, ' '); 
+
+	  if(found.compare("tree") == 0)
+	    {	  
+	      getline(ss1, found, ' ');       
+	      genFound = std::stoi(found.substr(4)); 
+	      // tout << "restoring file: at " << genFound << std::endl ; 
+	    }
+
+	  if(genFound <= gen)
+	    fh << line << std::endl ;       
+	}
+    }
+} 
diff --git a/src/file/TopologyFile.hpp b/src/file/TopologyFile.hpp
new file mode 100644
index 0000000..af72e16
--- /dev/null
+++ b/src/file/TopologyFile.hpp
@@ -0,0 +1,31 @@
+#ifndef TOPOLOGY_FILE
+#define TOPOLOGY_FILE
+
+#include <sstream>
+#include <string>
+#include <iostream> 
+
+#include "common.h"
+#include "TreeAln.hpp"
+#include "OutputFile.hpp"
+
+class TopologyFile : public OutputFile
+{
+public: 
+  TopologyFile(std::string workdir, std::string runname, nat runid, nat couplingId, nat paramNum, bool hasManyTopoloFiles); 
+  void initialize(const TreeAln& traln, nat someId, bool isDryRun)  ;     
+  void sample(const TreeAln &traln, uint64_t gen, AbstractParameter* blParams)  ; 
+  void regenerate(std::string workdir, std::string prevId, uint64_t gen) ; 
+  void verifyNonExistance();
+
+private: 			// METHODS
+  std::streamoff getPosBeforeEnd() const ; 
+
+private: 			// ATTRIBUTES
+  nat runid; 
+  nat couplingId; 
+  nat paramNum; 
+  bool hasManyTopoloFiles; 
+}; 
+
+#endif
diff --git a/src/math/Arithmetics.cpp b/src/math/Arithmetics.cpp
new file mode 100644
index 0000000..23a2c30
--- /dev/null
+++ b/src/math/Arithmetics.cpp
@@ -0,0 +1,252 @@
+#include "Arithmetics.hpp"
+#include "common.h"
+
+#include <iostream>
+#include <cmath>
+#include <algorithm>
+#include <functional>
+#include <cassert>
+
+
+namespace Arithmetics
+{
+  double getCoefficientOfVariation(const std::vector<double> &data) 
+  {
+    return sqrt(getVariance(data)) / getMean(data); 
+  } 
+
+
+  double getSkewness(const std::vector<double> &data)
+  {
+    auto result = 0.; 
+
+    auto mean = getMean(data); 
+    
+    auto toThe3 = 0.; 
+    auto toThe2 = 0.; 
+    
+    for(auto &v : data)
+      {
+	toThe2 += pow(v - mean,2); 
+	toThe3 += pow(v - mean,3); 
+      }
+    
+    toThe3 /= double(data.size()); 
+    toThe2 /= double(data.size()) - 1.; 
+    
+    result = toThe3 / sqrt(pow(toThe2, 3)); 
+    return result; 
+  }
+
+  double getPercentile(double percentile, std::vector<double> data)
+  {
+    assert(percentile < 1.);
+    assert(data.size() > 0 ); 
+
+    if(data.size() == 1)
+      return data.at(0); 
+
+    sort(begin(data), end(data), std::less<double>()); 
+
+    auto idx = size_t(double(data.size()) * percentile); 
+
+    if( std::fabs(double(idx) / percentile - double(data.size())) > 0.   ) // dirty
+      ++idx;
+
+    if(data.size() < idx + 1 )	// meh 
+      idx = data.size() -1 ; 
+    
+    auto result = data.at(idx); 
+    // return ; 
+    assert(not std::isinf(result) );
+    return result; 
+  }
+
+  double getMean(const std::vector<double> &data)
+  {
+    double result = 0; 
+    for(auto &v : data)
+      result += v; 
+
+    result /= double(data.size()); 
+    
+    return result; 
+  }
+
+  double getVariance(const std::vector<double> &data)
+  {
+    if(data.size() == 1)
+      return 0 ; 
+
+    double result = 0; 
+    auto mean = Arithmetics::getMean(data);
+    
+    for(auto &v : data)
+      result += pow(mean - v,2 ); 
+    result /= double(data.size() -1);  
+    
+    return result; 
+  }
+  
+  // this implementation is inspired by:
+  // https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CDAQFjAA&url=http%3A%2F%2Fwww.people.fas.harvard.edu%2F~plam%2Fteaching%2Fmethods%2Fconvergence%2Fconvergence_print.pdf&ei=J_0iUrWWE8STtQb8uoHoDg&usg=AFQjCNE6hl7PsS1PX6vU3nQjWQNNaEBIiQ&sig2=yq_0iw4pw7svqMS054dDbQ&cad=rja
+  double PRSF(const std::vector<std::vector<double> > data)
+  {
+    if(data.size() == 1)
+      return 1; 
+
+    double withinChainVariance = 0;   
+    for(auto &chainData : data)
+      withinChainVariance += getVariance(chainData); 
+    withinChainVariance /= double(data.size()); 
+
+    auto means = std::vector<double>{}; 
+    for(auto &chainData: data ) 
+      means.push_back(Arithmetics::getMean(chainData)); 
+    double meanOfMeans = Arithmetics::getMean(means); 
+    double betweenChainVariance = 0; 
+
+    // slight deviation: the chains may not have the same number of
+    // draws (i.e., branch lengths). So for the between chain variance
+    // (bcv), we do not multiply the overall bcv with n (as in the
+    // formula), but each component gets multiplied with the number of
+    // draws in the chain.
+    // if we have the same number of draws, this is correct anyway 
+    // TODO sounds reasonable, but must be verified
+
+    auto numberOfDraws = std::vector<double>{}; 
+    for(auto &chainData : data)
+      numberOfDraws.push_back(double(chainData.size())); 
+    auto meanNumberOfDraws = Arithmetics::getMean(numberOfDraws);
+    // the above sounds less good   
+
+    for(nat i = 0; i < means.size() ;++i )
+      betweenChainVariance += double(data[i].size()) * pow(means[i] - meanOfMeans, 2); 
+    betweenChainVariance /= double(data.size()-1) ; 
+
+    double estimatedVariance = 0; // of the stationary chain
+    estimatedVariance = (1. - 1. / meanNumberOfDraws) * withinChainVariance + betweenChainVariance / double(meanNumberOfDraws) ;  
+    
+    return sqrt(estimatedVariance / withinChainVariance); 
+  }
+  
+  
+  double getPearsonCorrelationCoefficient(const std::vector<double> &sampleA, const std::vector<double> &sampleB)
+  {
+    assert(sampleA.size() == sampleB.size()); 
+    
+    auto meanA = getMean(sampleA) ; 
+    auto meanB = getMean(sampleB); 
+    
+    auto varA = getVariance(sampleA); 
+    auto varB = getVariance(sampleB); 
+
+    double result = 0; 
+    for(nat i = 0; i < sampleA.size() ;++i)
+      result += (sampleA[i] - meanA) * (sampleB[i] - meanB) ; 
+    result /= (sqrt(varA) * sqrt(varB)); 
+    
+    return result; 
+  }
+
+  
+  // implementation according to   
+
+  // makes some sense 
+  // http://support.sas.com/documentation/cdl/en/statug/63033/HTML/default/viewer.htm#statug_introbayes_sect008.htm
+
+  double getAutoCorrelation(const std::vector<double> &data, nat lag)
+  {
+    auto mean = getMean(data); 
+
+    double denominator = 0.; 
+    for(auto v : data )
+      denominator += (v - mean) * (v - mean); 
+
+    double result = 0.f; 
+    for(int i = 0; i < int(data.size() - lag); ++i)
+      result += ( data[i] - mean ) * (data[i+lag] - mean) ; 
+    
+    result /= denominator; 
+    return result; 
+  }
+
+
+  double getEffectiveSamplingSize(const std::vector<double> &data)
+  {
+    if(data.size() == 0)
+      return 0; 
+    if(data.size() == 1)
+      return 1; 
+
+    double gammaStat[2000];
+    double mean = getMean(data) ; 
+    auto maxLag = data.size()-1; 
+
+    if(data.size()  - 1 > 2000)
+      maxLag = 2000; 
+    double varStat = 0; 
+    
+    for (nat lag = 0; lag < maxLag; lag++)
+      {
+	gammaStat[lag]=0;
+	for (nat j = 0; j < data.size() - lag; j++) 
+	  {
+	    double del1 = data[j] - mean;
+	    double del2 = data[j + lag] - mean;
+	    gammaStat[lag] += (del1 * del2);
+	  }
+
+	gammaStat[lag] /= ((double) (data.size() - lag));
+
+	if (lag == 0) 
+	  varStat = gammaStat[0];
+	else if (lag % 2 == 0) 
+	  {
+	    if (gammaStat[lag - 1] + gammaStat[lag] > 0) 
+	      varStat += 2.0 * (gammaStat[lag - 1] + gammaStat[lag]);
+	    else
+	      maxLag = lag;
+	  }
+      }
+    return (gammaStat[0] * double(data.size())) / varStat;
+  }
+}
+
+
+
+// second order kahan algorithm
+double Arithmetics::getKahansSum2(const std::vector<double> &x)
+{
+  double s = 0, cs  = 0, ccs = 0; 
+  for(nat i = 0; i < x.size() ; ++i)
+    {
+      double t = s + x[i]; 
+
+      double c = (std::fabs(s) >= std::fabs(x[i])) ?  (s - t ) + x[i]  : (x[i] - t ) + s ; 
+      s = t; 
+      t = cs + c; 
+      double cc  = (std::fabs(cs) >= std::fabs(c)) ?  (cs - t ) + c : (c - t ) + cs; 
+      cs = t ; 
+      ccs += cc; 
+    }
+  
+  return s + cs + ccs; 
+}
+
+
+
+double Arithmetics::getKahanSum(const std::vector<double> &x)
+{
+  auto sum = 0.; 
+  auto c = 0.; 
+
+  for(auto &v : x)
+    {
+      auto y = v - c; 
+      auto t = sum + y; 
+      c = (t - sum ) - y ; 
+      sum = t; 
+    }
+  return sum;  
+}
diff --git a/src/math/Arithmetics.hpp b/src/math/Arithmetics.hpp
new file mode 100644
index 0000000..14ea5b9
--- /dev/null
+++ b/src/math/Arithmetics.hpp
@@ -0,0 +1,46 @@
+#ifndef ARITHMETICS_HPP
+#define ARITHMETICS_HPP
+
+#include <vector>
+#include "common.h"
+
+namespace Arithmetics
+{
+  /**
+     @brief gets the mean of the data 
+   */
+  double getMean(const std::vector<double> &data); 
+  /** 
+      @brief gets the variance of the data 
+   */ 
+  double getVariance(const std::vector<double> &data); 
+  /** 
+      @brief gets the potential scale reduction factor of data (data per chain)
+   */ 
+  double PRSF(const std::vector<std::vector<double> > data); 
+  /**
+     @brief gets the n-th percentile of the data  
+   */ 
+  double getPercentile(double percentile,  std::vector<double> data); 
+  /** 
+      @brief gets the effective sampling size of the data 
+   */ 
+  double getEffectiveSamplingSize(const std::vector<double> & data);
+  /** 
+      @brief gets the pearson correlation coefficient between two samples 
+   */ 
+  double getPearsonCorrelationCoefficient(const std::vector<double> &sampleA, const std::vector<double> &sampleB); 
+
+  double getAutoCorrelation(const std::vector<double> &data, nat lag); 
+
+  double getCoefficientOfVariation(const std::vector<double> &data) ; 
+
+  /** 
+      @brief calculates the sample skewness of data 
+   */ 
+  double getSkewness(const std::vector<double> &data); 
+
+  double getKahansSum2(const std::vector<double> &x); 
+  double getKahanSum(const std::vector<double> &x); 
+}
+#endif
diff --git a/src/math/Density.cpp b/src/math/Density.cpp
new file mode 100644
index 0000000..1f6b075
--- /dev/null
+++ b/src/math/Density.cpp
@@ -0,0 +1,118 @@
+#include <cmath>
+#include <cassert>
+#include <iostream>
+#include <algorithm>
+#include <numeric>
+#include "Density.hpp"
+
+#include "common.h"
+#include "extensions.hpp"
+
+// bracen copy from mrb
+static log_double logGamma (double alp)
+{
+  double 
+    x = alp, f = 0.0, z;
+	
+  if (x < 7) 
+    {
+      f = 1.0;
+      z = x-1.0;
+      while (++z < 7.0)  
+	f *= z;
+      x = z;   
+      f = -log(f);
+    }
+  z = 1.0 / (x*x);
+  return  log_double::fromLog(f + (x-0.5)*log(x) - x + 0.918938533204673 + 
+	   (((-0.000595238095238*z+0.000793650793651)*z-0.002777777777778)*z +
+	    0.083333333333333)/x);  
+
+}
+
+
+static log_double betaFunctionLog(const std::vector<double> &alphas)
+{
+  log_double beta = log_double::fromAbs(1.);
+  double sum=0;
+  for(auto v : alphas)
+    {
+      beta *= log_double::fromLog(lgamma(v)); 
+      sum+=v ;    
+    }
+  beta /= log_double::fromLog(lgamma(sum));
+
+  return beta;
+}
+
+
+
+namespace Density
+{
+  log_double lnDirichlet(std::vector<double> values, const std::vector<double> &alphas)
+  {
+    log_double density= log_double::fromAbs(1.);
+    density /= betaFunctionLog(alphas);
+    
+    double sum = std::accumulate(begin(values), end(values), 0. ); 
+    if( fabs( sum - 1. )  > 1e-6)
+      {
+	std::cout << "error: expected sum of 1, got " << sum << std::endl; 
+	assert(0); 
+      }      
+
+    for(nat i=0; i<values.size(); i++)
+      density *= log_double::fromLog((alphas[i] - 1 ) * log(values[i])); 
+
+    return density; 
+  }
+
+  // double dirichlet(std::vector<double> values, const std::vector<double> &alphas)
+  // {
+  //   assert(0); 			// deprecated 
+  //   double density=1;  
+  //   density /= betaFunction(alphas);  
+  //   assert(fabs(std::accumulate(values.begin(), values.end(), 0.) -  1.0 )  < 1e-6); 
+
+  //   for(nat i=0; i< values.size(); i++)
+  //     density *= pow( values[i],alphas[i]-1);
+  
+  //   return density; 
+  // }
+
+  
+  log_double lnExponential(double value, double lambda)
+  {
+    return log_double::fromLog(log(lambda) - lambda * value); 
+  }
+
+  // double exponential(double value, double lambda)
+  // {
+  //   assert(0); 			// deprecated 
+  //   return lambda * exp(- lambda * value); 
+  // }
+  
+
+  log_double lnGamma (double x, double alpha, double beta )
+  {    
+    auto result =  (alpha-1.0) * log(x) + alpha * log(beta) - x * beta - logGamma(alpha).getRawLog();  
+    return log_double::fromLog(result); 
+  }
+
+
+  log_double lnWeibull(double x, double lambda, double k) 
+  {
+    if(x < 0 )
+      return log_double::lowest();
+    else 
+      return log_double::fromLog( log(k / lambda)  + (k-1) * log( x / lambda)  - pow( x / lambda, k)); 
+  } 
+
+  double gammaFunction(double alpha)
+  {
+  
+    double lgam = lgamma(alpha);
+    return signgam*exp(lgam); 
+  }
+
+}  
diff --git a/src/math/Density.hpp b/src/math/Density.hpp
new file mode 100644
index 0000000..0922c8f
--- /dev/null
+++ b/src/math/Density.hpp
@@ -0,0 +1,32 @@
+/**
+   @file densities.h
+   
+   @brief contains densities and distributions
+*/ 
+
+
+#ifndef _DENSITIES_H
+#define _DENSITIES_H
+
+#include <vector>
+#include "extensions.hpp"
+
+double exponentialDensity(double value, double lambda); 
+
+
+/** @brief density for dirichlet distribution with parameters "alphas" at point "values" */ 
+/* double densityDirichlet(double *values, double *alphas, int length);  */
+
+
+/** @brief the gamma function */ 
+// double gammaFunction(double alpha); 
+
+namespace Density
+{
+  log_double lnDirichlet(std::vector<double> values, const std::vector<double> &alphas); 
+  log_double lnExponential(double value, double lambda); 
+  log_double lnGamma(double x, double alpha, double beta ); 
+  log_double lnWeibull(double x, double lambda, double k) ; 
+  double gammaFunction(double alpha); 
+} 
+#endif
diff --git a/src/math/Randomness.cpp b/src/math/Randomness.cpp
new file mode 100644
index 0000000..0c572ec
--- /dev/null
+++ b/src/math/Randomness.cpp
@@ -0,0 +1,264 @@
+#include <limits>
+#include <random>
+#include <cstring>
+
+#include "Randomness.hpp" 
+#include "Density.hpp"
+
+
+Randomness::Randomness(randCtr_t seed) 
+  : ctr{{0}}
+  , key{{0}}
+{
+  ctr[0] = 0u; 
+  ctr[1] = 0u; 
+    
+  key[0] = seed[0];
+  key[1] = seed[1]; 
+}
+
+
+randCtr_t Randomness::generateSeed()
+{
+  randCtr_t r =  exa_rand(ctr, key);   
+  incrementNoLimit();
+  return r; 
+}
+
+
+void Randomness::incrementNoLimit()
+{
+  ++ctr.v[0]; 
+  if(ctr.v[0] == std::numeric_limits<unsigned int>::max())
+    {
+      ++ctr.v[1]; 
+      ctr.v[0] = 0;     
+    }
+}
+
+
+nat Randomness::operator()() 
+{
+  auto seed = generateSeed(); 
+  return seed.v[0]; 
+}
+
+
+double Randomness::drawRandDouble01()
+{
+  randCtr_t r = exa_rand(key, ctr); 
+  ++ctr.v[0]; 
+
+  return r123::u01<double>(r.v[1]);
+}
+
+
+double Randomness::drawRandExp(double lambda)
+{  
+  double r = drawRandDouble01();   
+  return -log(r )/ lambda; 
+}
+
+
+
+double Randomness::drawRandBiUnif(double x)
+{
+  double r = drawRandDouble01() *  (2*x-x/2) + x / (3/2) ; 
+  return r; 
+}
+
+
+double Randomness::drawMultiplier(double multiplier) // 
+{
+
+  double tmp =  exp(multiplier * (drawRandDouble01()  - 0.5)); 
+  assert(tmp > 0.); 
+  return tmp ;   
+}
+
+
+double Randomness::drawFromSlidingWindow(double value, double window)
+{
+  return value + window * (drawRandDouble01() - 0.5); 
+}
+
+
+void Randomness::drawPermutation( int* perm, int n)
+{
+  int i;
+  int randomNumber;
+  perm[0] = 0;
+  
+  for(i=1 ; i<n ; i++){
+  
+    randomNumber = drawIntegerOpen(i+1);
+    // randomNumber=rand() % (i+1);
+    // randomNumber=rand();
+
+    if(randomNumber==i){
+      perm[i]=i;
+    }else{
+      perm[i]=perm[randomNumber];
+      perm[randomNumber]=i;
+    }
+  }
+
+}
+
+
+// int Randomness::drawSampleProportionally( double *weights, int numWeight )
+// {
+//   double r = drawRandDouble01();
+ 
+//   double sum=0.0;
+//   double lower_bound = 0.0;
+//   // int i = 0; 
+  
+//   assert( numWeight > 0 );
+  
+//   for(  auto i = 0; i < numWeight ; ++i ) 
+//     {
+//       sum+=weights[i]; 
+//     }
+//   assert(sum>0);
+//   r=r*sum;
+    
+//   for( auto i = 0; i < numWeight ; ++i ) 
+//     {
+//       double upper_bound = lower_bound + weights[i];
+    
+//       if( r >= lower_bound && r < upper_bound ) 
+// 	return i ;
+    
+//       lower_bound = upper_bound; 
+//     }
+  
+//   return i-1;
+// }
+
+
+//This function should be called if the alphas for the dirichlet distribution are given
+std::vector<double> Randomness::drawRandDirichlet( const std::vector<double> &alphas)
+{
+  // we have to set some lower bound. If the gamma distribution
+  // proposes 0 (and it will), everythings falls apart if the
+  // normalization rate (the last one) becomes too small.
+  // 
+  // The boundary is a rather small value anyway.
+  static double lowerBound = 1e-32; 
+  
+  auto sum= double{0.};
+  auto result = std::vector<double>{}; 
+
+  for(auto alpha : alphas)
+    {
+      double val = drawRandGamma(alpha, 1.0); 
+      if(val <= lowerBound)
+	val = lowerBound; 
+
+      result.push_back(val); 
+      sum += val;
+    }
+
+  for_each(begin(result), end(result), [&](double &v) {  v /= sum; }); 
+
+  return result; 
+}
+
+
+double Randomness::drawRandGamma(double alpha, double beta)
+{
+  // a hack, until we have our own gamma 
+  auto generator = std::default_random_engine{} ;
+  generator.seed((*this)());   
+  auto dist = std::gamma_distribution<double>(alpha,1./beta); // 1/beta necessary?
+  return dist(generator); 
+}
+
+
+nat Randomness::drawGeometric(double prop)  
+{
+  auto gen = std::default_random_engine{} ; 
+  gen.seed((*this)());
+  auto dist = std::geometric_distribution<nat>(prop);
+  return dist(gen); 
+}
+
+
+nat Randomness::drawBinomial(double prop, nat trials )
+{
+  auto gen = std::default_random_engine{} ; 
+  auto seed = (*this)(); 
+  gen.seed(seed);
+  
+  // BUG at mac: binomial_distribution should work with a nat as well
+  // here. However, on mac we got an overflow this way
+  auto dist = std::binomial_distribution<int>(trials,prop);
+  
+  auto result = nat(dist(gen)); 
+  assert(result <= trials); 
+  
+  return result;
+}
+
+
+std::ostream& operator<<(std::ostream& out, const Randomness &rhs)
+{
+  out << "key={" << rhs.key.v[0] << "," << rhs.key.v[1] << "},ctr={" << rhs.ctr.v[0] << ","<< rhs.ctr.v[1] << "}"; 
+  return out; 
+} 
+
+
+
+void Randomness::deserialize( std::istream &in )  
+{ 
+  key.v[0] = cRead<nat>(in); 
+  key.v[1] = cRead<nat>(in) ; 
+  ctr.v[0] = cRead<nat>(in); 
+  ctr.v[1] = cRead<nat>(in); 
+}
+ 
+void Randomness::serialize( std::ostream &out)  const
+{
+  cWrite<nat>(out, key.v[0]); 
+  cWrite<nat>(out, key.v[1]); 
+  cWrite<nat>(out, ctr.v[0]); 
+  cWrite<nat>(out, ctr.v[1]); 
+} 
+
+
+void Randomness::rebaseForGeneration(uint64_t generation)
+{
+  // TODO 
+  assert(generation < std::numeric_limits<nat>::max()); 
+  
+  ctr.v[1] = uint32_t(generation); 
+  ctr.v[0] = 0; 
+}
+
+
+
+uint64_t Randomness::getGeneration() const 
+{
+  return ctr.v[1]; 
+}
+
+
+void Randomness::setKey(randKey_t _key) 
+{
+  key = _key; 
+}
+
+
+
+double Randomness::drawRandWeibull(double lambda, double k )
+{
+  auto dist = std::weibull_distribution<double>(k, lambda); 
+  auto gen = std::default_random_engine{} ; 
+  auto seed = (*this)(); 
+  gen.seed(seed);
+  auto result = dist(gen); 
+  return result; 
+} 
+
+
diff --git a/src/math/Randomness.hpp b/src/math/Randomness.hpp
new file mode 100644
index 0000000..19e6ef4
--- /dev/null
+++ b/src/math/Randomness.hpp
@@ -0,0 +1,163 @@
+#ifndef ___RANDOMNESS_H
+#define ___RANDOMNESS_H
+
+#include <iostream>
+#include <vector>
+
+#include "GlobalVariables.hpp"
+#include "Serializable.hpp" 
+
+class TreeAln; 
+
+/* TODO is this correct? */
+#ifndef UINT64_C
+#define UINT64_C
+#endif
+
+/* 
+   we could mess around here a lot with 64-bit or the even cooler
+   alternative to threefry (aesni). For the time being that's hardly
+   worth it, threefry is already much better than the default RNG.
+ */
+
+#include "threefry.h"
+#include "uniform.hpp"
+#define exa_rand(c,k) threefry2x32(c,k)
+
+typedef threefry2x32_key_t randKey_t; 
+typedef threefry2x32_ctr_t randCtr_t; 
+
+
+class Randomness : public Serializable
+{
+public: 
+  Randomness(randCtr_t seed) ; 
+
+  void setKey(randKey_t key) ; 
+
+  randCtr_t generateSeed();     
+  /** 
+      @brief sets the generation for the RNG.
+   */ 
+  void rebaseForGeneration(uint64_t generation); 
+  uint64_t getGeneration() const ; 
+  /** 
+      @brief draw a floating point random  number in [0,1)
+   */ 
+  double drawRandDouble01(); 
+  nat operator()() ; 
+  double drawRandBiUnif(double x); 
+  /** 
+      @brief draw from a exponential distribution with parameter
+      lambda
+   */ 
+  double drawRandExp(double lambda); 
+  /**
+     @brief draw a random number that is distributed uniformly on the
+     exponential scale
+   */ 
+  double drawMultiplier(double multiplier); 
+  /** 
+      @brief draw a random number around param for a given window
+   */ 
+  double drawFromSlidingWindow(double param, double window); 
+  
+  randCtr_t getKey() const {return key; }
+  /** 
+      @brief draws a permutation 
+   */ 
+  void drawPermutation( int* perm, int n); 
+  /**
+     @brief draw r according to distribution given by weights. 
+     
+     NOTE sum of weights is not required to be 1.0
+  */
+  // int drawSampleProportionally( double *weights, int numWeight ); 
+  /** 
+      @brief draws a random number form a dirichlet distribution
+   */ 
+  std::vector<double> drawRandDirichlet( const std::vector<double> &alphas); 
+  /** 
+      @brief draw a random number from a gamma distribution with shape
+      parameter alpha and scale parameter beta
+   */ 
+  double drawRandGamma(double alpha, double beta); 
+  /** 
+      @brief This function should be called if the alphas for the dirichlet distribution are given
+  */ 
+  void drawRandDirichlet( std::vector<double> &results, const std::vector<double> &alphas); 
+  /** 
+      @brief This function should be called if the expected values for the dirichlet distribution are given      
+  */
+  void drawDirichletExpected(std::vector<double> &results, const std::vector<double> &mean,double scale); 
+  /** 
+      @brief draws integer uniformly from [0,n)
+  */  
+  template<typename T>
+  T drawIntegerOpen(T upperBound); 
+
+  double drawRandWeibull(double lambda, double k ); 
+  /** 
+      @brief draw integer uniformly from [0,n]
+  */ 
+  template<typename T>
+  T drawIntegerClosed(T upperBound); 
+
+  nat drawGeometric(double prop)  ; 
+
+  nat drawBinomial(double prop, nat trials );
+
+  virtual void deserialize( std::istream &in )  ; 
+  virtual void serialize( std::ostream &out) const; 
+
+  friend std::ostream& operator<<( std::ostream& out, const Randomness &rhs ); 
+
+  nat max()
+  {
+    return std::numeric_limits<nat>::max();
+  }
+
+  nat min()
+  {
+    return std::numeric_limits<nat>::min();
+  }
+
+private:  		// METHODS
+  void incrementNoLimit();
+
+private:   			// ATTRIBUTES
+  randCtr_t ctr; 
+  randKey_t key; 
+}; 
+
+
+
+
+#pragma GCC diagnostic ignored "-Wtype-limits"
+#pragma GCC diagnostic ignored "-Wsign-compare"
+#pragma GCC diagnostic ignored "-Wpragmas"
+#pragma GCC diagnostic ignored "-Wtautological-compare"
+
+
+template<typename T>
+T Randomness::drawIntegerOpen(T upperBound)
+{
+  assert(int64_t(upperBound) > 0 && upperBound <= std::numeric_limits<nat>::max() ); 
+  return drawIntegerClosed(upperBound-1);   
+} 
+
+template<typename T>
+T Randomness::drawIntegerClosed(T upperBound) 
+{
+  assert(upperBound >= 0 && upperBound <= std::numeric_limits<nat>::max() ); 
+  if(upperBound == 0)
+    return 0 ; 
+  else 
+    {
+      randCtr_t r = exa_rand(key, ctr); 
+      ++ctr.v[0]; 
+      return r.v[0] % (upperBound + 1 ) ; 
+    }
+}
+
+#endif
diff --git a/src/math/brent.cpp b/src/math/brent.cpp
new file mode 100644
index 0000000..6ef9d6a
--- /dev/null
+++ b/src/math/brent.cpp
@@ -0,0 +1,1532 @@
+#pragma GCC diagnostic ignored "-Wfloat-equal"
+#pragma warning (disable : 1572 )
+
+# include <cstdlib>
+# include <iostream>
+# include <cmath>
+# include <ctime>
+
+using namespace std;
+
+# include "brent.hpp"
+
+namespace brent{
+
+  //****************************************************************************80
+
+  double glomin ( double a, double b, double c, double m, double e, double t,
+		  func_base& f, double &x )
+
+  //****************************************************************************80
+  //
+  //  Purpose:
+  //
+  //    GLOMIN seeks a global minimum of a function F(X) in an interval [A,B].
+  //
+  //  Discussion:
+  //
+  //    This function assumes that F(X) is twice continuously differentiable
+  //    over [A,B] and that F''(X) <= M for all X in [A,B].
+  //
+  //  Licensing:
+  //
+  //    This code is distributed under the GNU LGPL license.
+  //
+  //  Modified:
+  //
+  //    17 July 2011
+  //
+  //  Author:
+  //
+  //    Original FORTRAN77 version by Richard Brent.
+  //    C++ version by John Burkardt.
+  //
+  //  Reference:
+  //
+  //    Richard Brent,
+  //    Algorithms for Minimization Without Derivatives,
+  //    Dover, 2002,
+  //    ISBN: 0-486-41998-3,
+  //    LC: QA402.5.B74.
+  //
+  //  Parameters:
+  //
+  //    Input, double A, B, the endpoints of the interval.
+  //    It must be the case that A < B.
+  //
+  //    Input, double C, an initial guess for the global
+  //    minimizer.  If no good guess is known, C = A or B is acceptable.
+  //
+  //    Input, double M, the bound on the second derivative.
+  //
+  //    Input, double E, a positive tolerance, a bound for the
+  //    absolute error in the evaluation of F(X) for any X in [A,B].
+  //
+  //    Input, double T, a positive error tolerance.
+  //
+  //    Input, func_base& F, a user-supplied c++ functor whose
+  //    global minimum is being sought.  The input and output
+  //    of F() are of type double.
+  //
+  //    Output, double &X, the estimated value of the abscissa
+  //    for which F attains its global minimum value in [A,B].
+  //
+  //    Output, double GLOMIN, the value F(X).
+  //
+  {
+    double a0;
+    double a2;
+    double a3;
+    double d0;
+    double d1;
+    double d2;
+    double h;
+    int k;
+    double m2;
+    double macheps;
+    double p;
+    double q;
+    double qs;
+    double r;
+    double s;
+    double sc;
+    double y;
+    double y0;
+    double y1;
+    double y2;
+    double y3;
+    double yb;
+    double z0;
+    double z1;
+    double z2;
+
+    a0 = b;
+    x = a0;
+    a2 = a;
+    y0 = f ( b );
+    yb = y0;
+    y2 = f ( a );
+    y = y2;
+
+    if ( y0 < y )
+      {
+	y = y0;
+      }
+    else
+      {
+	x = a;
+      }
+
+    if ( m <= 0.0 || b <= a )
+      {
+	return y;
+      }
+
+    macheps = r8_epsilon ( );
+
+    m2 = 0.5 * ( 1.0 + 16.0 * macheps ) * m;
+
+    if ( c <= a || b <= c )
+      {
+	sc = 0.5 * ( a + b );
+      }
+    else
+      {
+	sc = c;
+      }
+
+    y1 = f ( sc );
+    k = 3;
+    d0 = a2 - sc;
+    h = 9.0 / 11.0;
+
+    if ( y1 < y )
+      {
+	x = sc;
+	y = y1;
+      }
+    //
+    //  Loop.
+    //
+    for ( ; ; )
+      {
+	d1 = a2 - a0;
+	d2 = sc - a0;
+	z2 = b - a2;
+	z0 = y2 - y1;
+	z1 = y2 - y0;
+	r = d1 * d1 * z0 - d0 * d0 * z1;
+	p = r;
+	qs = 2.0 * ( d0 * z1 - d1 * z0 );
+	q = qs;
+
+	if ( k < 1000000 || y2 <= y )
+	  {
+	    for ( ; ; )
+	      {
+		if ( q * ( r * ( yb - y2 ) + z2 * q * ( ( y2 - y ) + t ) ) <
+		     z2 * m2 * r * ( z2 * q - r ) )
+		  {
+		    a3 = a2 + r / q;
+		    y3 = f ( a3 );
+
+		    if ( y3 < y )
+		      {
+			x = a3;
+			y = y3;
+		      }
+		  }
+		k = ( ( 1611 * k ) % 1048576 );
+		q = 1.0;
+		r = ( b - a ) * 0.00001 * ( double ) ( k );
+
+		if ( z2 <= r )
+		  {
+		    break;
+		  }
+	      }
+	  }
+	else
+	  {
+	    k = ( ( 1611 * k ) % 1048576 );
+	    q = 1.0;
+	    r = ( b - a ) * 0.00001 * ( double ) ( k );
+
+	    while ( r < z2 )
+	      {
+		if ( q * ( r * ( yb - y2 ) + z2 * q * ( ( y2 - y ) + t ) ) <
+		     z2 * m2 * r * ( z2 * q - r ) )
+		  {
+		    a3 = a2 + r / q;
+		    y3 = f ( a3 );
+
+		    if ( y3 < y )
+		      {
+			x = a3;
+			y = y3;
+		      }
+		  }
+		k = ( ( 1611 * k ) % 1048576 );
+		q = 1.0;
+		r = ( b - a ) * 0.00001 * ( double ) ( k );
+	      }
+	  }
+
+	r = m2 * d0 * d1 * d2;
+	s = sqrt ( ( ( y2 - y ) + t ) / m2 );
+	h = 0.5 * ( 1.0 + h );
+	p = h * ( p + 2.0 * r * s );
+	q = q + 0.5 * qs;
+	r = - 0.5 * ( d0 + ( z0 + 2.01 * e ) / ( d0 * m2 ) );
+
+	if ( r < s || d0 < 0.0 )
+	  {
+	    r = a2 + s;
+	  }
+	else
+	  {
+	    r = a2 + r;
+	  }
+
+	if ( 0.0 < p * q )
+	  {
+	    a3 = a2 + p / q;
+	  }
+	else
+	  {
+	    a3 = r;
+	  }
+
+	for ( ; ; )
+	  {
+	    a3 = r8_max ( a3, r );
+
+	    if ( b <= a3 )
+	      {
+		a3 = b;
+		y3 = yb;
+	      }
+	    else
+	      {
+		y3 = f ( a3 );
+	      }
+
+	    if ( y3 < y )
+	      {
+		x = a3;
+		y = y3;
+	      }
+
+	    d0 = a3 - a2;
+
+	    if ( a3 <= r )
+	      {
+		break;
+	      }
+
+	    p = 2.0 * ( y2 - y3 ) / ( m * d0 );
+
+	    if ( ( 1.0 + 9.0 * macheps ) * d0 <= r8_abs ( p ) )
+	      {
+		break;
+	      }
+
+	    if ( 0.5 * m2 * ( d0 * d0 + p * p ) <= ( y2 - y ) + ( y3 - y ) + 2.0 * t )
+	      {
+		break;
+	      }
+	    a3 = 0.5 * ( a2 + a3 );
+	    h = 0.9 * h;
+	  }
+
+	if ( b <= a3 )
+	  {
+	    break;
+	  }
+
+	a0 = sc;
+	sc = a2;
+	a2 = a3;
+	y0 = y1;
+	y1 = y2;
+	y2 = y3;
+      }
+
+    return y;
+  }
+  //****************************************************************************80
+
+  double local_min ( double a, double b, double t, func_base& f,
+		     double &x )
+
+  //****************************************************************************80
+  //
+  //  Purpose:
+  //
+  //    LOCAL_MIN seeks a local minimum of a function F(X) in an interval [A,B].
+  //
+  //  Discussion:
+  //
+  //    The method used is a combination of golden section search and
+  //    successive parabolic interpolation.  Convergence is never much slower
+  //    than that for a Fibonacci search.  If F has a continuous second
+  //    derivative which is positive at the minimum (which is not at A or
+  //    B), then convergence is superlinear, and usually of the order of
+  //    about 1.324....
+  //
+  //    The values EPS and T define a tolerance TOL = EPS * abs ( X ) + T.
+  //    F is never evaluated at two points closer than TOL.
+  //
+  //    If F is a unimodal function and the computed values of F are always
+  //    unimodal when separated by at least SQEPS * abs ( X ) + (T/3), then
+  //    LOCAL_MIN approximates the abscissa of the global minimum of F on the
+  //    interval [A,B] with an error less than 3*SQEPS*abs(LOCAL_MIN)+T.
+  //
+  //    If F is not unimodal, then LOCAL_MIN may approximate a local, but
+  //    perhaps non-global, minimum to the same accuracy.
+  //
+  //  Licensing:
+  //
+  //    This code is distributed under the GNU LGPL license.
+  //
+  //  Modified:
+  //
+  //    17 July 2011
+  //
+  //  Author:
+  //
+  //    Original FORTRAN77 version by Richard Brent.
+  //    C++ version by John Burkardt.
+  //
+  //  Reference:
+  //
+  //    Richard Brent,
+  //    Algorithms for Minimization Without Derivatives,
+  //    Dover, 2002,
+  //    ISBN: 0-486-41998-3,
+  //    LC: QA402.5.B74.
+  //
+  //  Parameters:
+  //
+  //    Input, double A, B, the endpoints of the interval.
+  //
+  //    Input, double T, a positive absolute error tolerance.
+  //
+  //    Input, func_base& F, a user-supplied c++ functor whose
+  //    local minimum is being sought.  The input and output
+  //    of F() are of type double.
+  //
+  //    Output, double &X, the estimated value of an abscissa
+  //    for which F attains a local minimum value in [A,B].
+  //
+  //    Output, double LOCAL_MIN, the value F(X).
+  //
+  {
+    double c;
+    double d = 0;
+    double e;
+    double eps;
+    double fu;
+    double fv;
+    double fw;
+    double fx;
+    double m;
+    double p;
+    double q;
+    double r;
+    double sa;
+    double sb;
+    double t2;
+    double tol;
+    double u;
+    double v;
+    double w;
+    //
+    //  C is the square of the inverse of the golden ratio.
+    //
+    c = 0.5 * ( 3.0 - sqrt ( 5.0 ) );
+
+    eps = sqrt ( r8_epsilon ( ) );
+
+    sa = a;
+    sb = b;
+    x = sa + c * ( b - a );
+    w = x;
+    v = w;
+    e = 0.0;
+    fx = f ( x );
+    fw = fx;
+    fv = fw;
+
+    for ( ; ; )
+      {
+	m = 0.5 * ( sa + sb ) ;
+	tol = eps * r8_abs ( x ) + t;
+	t2 = 2.0 * tol;
+	//
+	//  Check the stopping criterion.
+	//
+	if ( r8_abs ( x - m ) <= t2 - 0.5 * ( sb - sa ) )
+	  {
+	    break;
+	  }
+	//
+	//  Fit a parabola.
+	//
+	r = 0.0;
+	q = r;
+	p = q;
+
+	if ( tol < r8_abs ( e ) )
+	  {
+	    r = ( x - w ) * ( fx - fv );
+	    q = ( x - v ) * ( fx - fw );
+	    p = ( x - v ) * q - ( x - w ) * r;
+	    q = 2.0 * ( q - r );
+	    if ( 0.0 < q )
+	      {
+		p = - p;
+	      }
+	    q = r8_abs ( q );
+	    r = e;
+	    e = d;
+	  }
+
+	if ( r8_abs ( p ) < r8_abs ( 0.5 * q * r ) &&
+	     q * ( sa - x ) < p &&
+	     p < q * ( sb - x ) )
+	  {
+	    //
+	    //  Take the parabolic interpolation step.
+	    //
+	    d = p / q;
+	    u = x + d;
+	    //
+	    //  F must not be evaluated too close to A or B.
+	    //
+	    if ( ( u - sa ) < t2 || ( sb - u ) < t2 )
+	      {
+		if ( x < m )
+		  {
+		    d = tol;
+		  }
+		else
+		  {
+		    d = - tol;
+		  }
+	      }
+	  }
+	//
+	//  A golden-section step.
+	//
+	else
+	  {
+	    if ( x < m )
+	      {
+		e = sb - x;
+	      }
+	    else
+	      {
+		e = sa - x;
+	      }
+	    d = c * e;
+	  }
+	//
+	//  F must not be evaluated too close to X.
+	//
+	if ( tol <= r8_abs ( d ) )
+	  {
+	    u = x + d;
+	  }
+	else if ( 0.0 < d )
+	  {
+	    u = x + tol;
+	  }
+	else
+	  {
+	    u = x - tol;
+	  }
+
+	fu = f ( u );
+	//
+	//  Update A, B, V, W, and X.
+	//
+	if ( fu <= fx )
+	  {
+	    if ( u < x )
+	      {
+		sb = x;
+	      }
+	    else
+	      {
+		sa = x;
+	      }
+	    v = w;
+	    fv = fw;
+	    w = x;
+	    fw = fx;
+	    x = u;
+	    fx = fu;
+	  }
+	else
+	  {
+	    if ( u < x )
+	      {
+		sa = u;
+	      }
+	    else
+	      {
+		sb = u;
+	      }
+
+	    if ( fu <= fw || w == x )
+	      {
+		v = w;
+		fv = fw;
+		w = u;
+		fw = fu;
+	      }
+	    else if ( fu <= fv || v == x || v == w )
+	      {
+		v = u;
+		fv = fu;
+	      }
+	  }
+      }
+    return fx;
+  }
+  //****************************************************************************80
+
+  double local_min_rc ( double &a, double &b, int &status, double value )
+
+  //****************************************************************************80
+  //
+  //  Purpose:
+  //
+  //    LOCAL_MIN_RC seeks a minimizer of a scalar function of a scalar variable.
+  //
+  //  Discussion:
+  //
+  //    This routine seeks an approximation to the point where a function
+  //    F attains a minimum on the interval (A,B).
+  //
+  //    The method used is a combination of golden section search and
+  //    successive parabolic interpolation.  Convergence is never much
+  //    slower than that for a Fibonacci search.  If F has a continuous
+  //    second derivative which is positive at the minimum (which is not
+  //    at A or B), then convergence is superlinear, and usually of the
+  //    order of about 1.324...
+  //
+  //    The routine is a revised version of the Brent local minimization
+  //    algorithm, using reverse communication.
+  //
+  //    It is worth stating explicitly that this routine will NOT be
+  //    able to detect a minimizer that occurs at either initial endpoint
+  //    A or B.  If this is a concern to the user, then the user must
+  //    either ensure that the initial interval is larger, or to check
+  //    the function value at the returned minimizer against the values
+  //    at either endpoint.
+  //
+  //  Licensing:
+  //
+  //    This code is distributed under the GNU LGPL license.
+  //
+  //  Modified:
+  //
+  //    17 July 2011
+  //
+  //  Author:
+  //
+  //    John Burkardt
+  //
+  //  Reference:
+  //
+  //    Richard Brent,
+  //    Algorithms for Minimization Without Derivatives,
+  //    Dover, 2002,
+  //    ISBN: 0-486-41998-3,
+  //    LC: QA402.5.B74.
+  //
+  //    David Kahaner, Cleve Moler, Steven Nash,
+  //    Numerical Methods and Software,
+  //    Prentice Hall, 1989,
+  //    ISBN: 0-13-627258-4,
+  //    LC: TA345.K34.
+  //
+  //  Parameters
+  //
+  //    Input/output, double &A, &B.  On input, the left and right
+  //    endpoints of the initial interval.  On output, the lower and upper
+  //    bounds for an interval containing the minimizer.  It is required
+  //    that A < B.
+  //
+  //    Input/output, int &STATUS, used to communicate between
+  //    the user and the routine.  The user only sets STATUS to zero on the first
+  //    call, to indicate that this is a startup call.  The routine returns STATUS
+  //    positive to request that the function be evaluated at ARG, or returns
+  //    STATUS as 0, to indicate that the iteration is complete and that
+  //    ARG is the estimated minimizer.
+  //
+  //    Input, double VALUE, the function value at ARG, as requested
+  //    by the routine on the previous call.
+  //
+  //    Output, double LOCAL_MIN_RC, the currently considered point.
+  //    On return with STATUS positive, the user is requested to evaluate the
+  //    function at this point, and return the value in VALUE.  On return with
+  //    STATUS zero, this is the routine's estimate for the function minimizer.
+  //
+  //  Local parameters:
+  //
+  //    C is the squared inverse of the golden ratio.
+  //
+  //    EPS is the square root of the relative machine precision.
+  //
+  {
+    static double arg;
+    static double c;
+    static double d;
+    static double e;
+    static double eps;
+    static double fu;
+    static double fv;
+    static double fw;
+    static double fx;
+    static double midpoint;
+    static double p;
+    static double q;
+    static double r;
+    static double tol;
+    static double tol1;
+    static double tol2;
+    static double u;
+    static double v;
+    static double w;
+    static double x;
+    //
+    //  STATUS (INPUT) = 0, startup.
+    //
+    if ( status == 0 )
+      {
+	if ( b <= a )
+	  {
+	    cout << "\n";
+	    cout << "LOCAL_MIN_RC - Fatal error!\n";
+	    cout << "  A < B is required, but\n";
+	    cout << "  A = " << a << "\n";
+	    cout << "  B = " << b << "\n";
+	    status = -1;
+	    exit ( 1 );
+	  }
+	c = 0.5 * ( 3.0 - sqrt ( 5.0 ) );
+
+	eps = sqrt ( r8_epsilon ( ) );
+	tol = r8_epsilon ( );
+
+	v = a + c * ( b - a );
+	w = v;
+	x = v;
+	e = 0.0;
+
+	status = 1;
+	arg = x;
+
+	return arg;
+      }
+    //
+    //  STATUS (INPUT) = 1, return with initial function value of FX.
+    //
+    else if ( status == 1 )
+      {
+	fx = value;
+	fv = fx;
+	fw = fx;
+      }
+    //
+    //  STATUS (INPUT) = 2 or more, update the data.
+    //
+    else if ( 2 <= status )
+      {
+	fu = value;
+
+	if ( fu <= fx )
+	  {
+	    if ( x <= u )
+	      {
+		a = x;
+	      }
+	    else
+	      {
+		b = x;
+	      }
+	    v = w;
+	    fv = fw;
+	    w = x;
+	    fw = fx;
+	    x = u;
+	    fx = fu;
+	  }
+	else
+	  {
+	    if ( u < x )
+	      {
+		a = u;
+	      }
+	    else
+	      {
+		b = u;
+	      }
+
+	    if ( fu <= fw || w == x )
+	      {
+		v = w;
+		fv = fw;
+		w = u;
+		fw = fu;
+	      }
+	    else if ( fu <= fv || v == x || v == w )
+	      {
+		v = u;
+		fv = fu;
+	      }
+	  }
+      }
+    //
+    //  Take the next step.
+    //
+    midpoint = 0.5 * ( a + b );
+    tol1 = eps * r8_abs ( x ) + tol / 3.0;
+    tol2 = 2.0 * tol1;
+    //
+    //  If the stopping criterion is satisfied, we can exit.
+    //
+    if ( r8_abs ( x - midpoint ) <= ( tol2 - 0.5 * ( b - a ) ) )
+      {
+	status = 0;
+	return arg;
+      }
+    //
+    //  Is golden-section necessary?
+    //
+    if ( r8_abs ( e ) <= tol1 )
+      {
+	if ( midpoint <= x )
+	  {
+	    e = a - x;
+	  }
+	else
+	  {
+	    e = b - x;
+	  }
+	d = c * e;
+      }
+    //
+    //  Consider fitting a parabola.
+    //
+    else
+      {
+	r = ( x - w ) * ( fx - fv );
+	q = ( x - v ) * ( fx - fw );
+	p = ( x - v ) * q - ( x - w ) * r;
+	q = 2.0 * ( q - r );
+	if ( 0.0 < q )
+	  {
+	    p = - p;
+	  }
+	q = r8_abs ( q );
+	r = e;
+	e = d;
+	//
+	//  Choose a golden-section step if the parabola is not advised.
+	//
+	if (
+	    ( r8_abs ( 0.5 * q * r ) <= r8_abs ( p ) ) ||
+	    ( p <= q * ( a - x ) ) ||
+	    ( q * ( b - x ) <= p ) )
+	  {
+	    if ( midpoint <= x )
+	      {
+		e = a - x;
+	      }
+	    else
+	      {
+		e = b - x;
+	      }
+	    d = c * e;
+	  }
+	//
+	//  Choose a parabolic interpolation step.
+	//
+	else
+	  {
+	    d = p / q;
+	    u = x + d;
+
+	    if ( ( u - a ) < tol2 )
+	      {
+		d = tol1 * r8_sign ( midpoint - x );
+	      }
+
+	    if ( ( b - u ) < tol2 )
+	      {
+		d = tol1 * r8_sign ( midpoint - x );
+	      }
+	  }
+      }
+    //
+    //  F must not be evaluated too close to X.
+    //
+    if ( tol1 <= r8_abs ( d ) )
+      {
+	u = x + d;
+      }
+    if ( r8_abs ( d ) < tol1 )
+      {
+	u = x + tol1 * r8_sign ( d );
+      }
+    //
+    //  Request value of F(U).
+    //
+    arg = u;
+    status = status + 1;
+
+    return arg;
+  }
+  //****************************************************************************80
+
+  double r8_abs ( double x )
+
+  //****************************************************************************80
+  //
+  //  Purpose:
+  //
+  //    R8_ABS returns the absolute value of an R8.
+  //
+  //  Licensing:
+  //
+  //    This code is distributed under the GNU LGPL license.
+  //
+  //  Modified:
+  //
+  //    07 May 2006
+  //
+  //  Author:
+  //
+  //    John Burkardt
+  //
+  //  Parameters:
+  //
+  //    Input, double X, the quantity whose absolute value is desired.
+  //
+  //    Output, double R8_ABS, the absolute value of X.
+  //
+  {
+    double value;
+
+    if ( 0.0 <= x )
+      {
+	value = x;
+      }
+    else
+      {
+	value = - x;
+      }
+    return value;
+  }
+  //****************************************************************************80
+
+  double r8_epsilon ( )
+
+  //****************************************************************************80
+  //
+  //  Purpose:
+  //
+  //    R8_EPSILON returns the R8 round off unit.
+  //
+  //  Discussion:
+  //
+  //    R8_EPSILON is a number R which is a power of 2 with the property that,
+  //    to the precision of the computer's arithmetic,
+  //      1 < 1 + R
+  //    but
+  //      1 = ( 1 + R / 2 )
+  //
+  //  Licensing:
+  //
+  //    This code is distributed under the GNU LGPL license.
+  //
+  //  Modified:
+  //
+  //    08 May 2006
+  //
+  //  Author:
+  //
+  //    John Burkardt
+  //
+  //  Parameters:
+  //
+  //    Output, double R8_EPSILON, the double precision round-off unit.
+  //
+  {
+    double r;
+
+    r = 1.0;
+
+    while ( 1.0 < ( double ) ( 1.0 + r )  )
+      {
+	r = r / 2.0;
+      }
+
+    return ( 2.0 * r );
+  }
+  //****************************************************************************80
+
+  double r8_max ( double x, double y )
+
+  //****************************************************************************80
+  //
+  //  Purpose:
+  //
+  //    R8_MAX returns the maximum of two R8's.
+  //
+  //  Licensing:
+  //
+  //    This code is distributed under the GNU LGPL license.
+  //
+  //  Modified:
+  //
+  //    18 August 2004
+  //
+  //  Author:
+  //
+  //    John Burkardt
+  //
+  //  Parameters:
+  //
+  //    Input, double X, Y, the quantities to compare.
+  //
+  //    Output, double R8_MAX, the maximum of X and Y.
+  //
+  {
+    double value;
+
+    if ( y < x )
+      {
+	value = x;
+      }
+    else
+      {
+	value = y;
+      }
+    return value;
+  }
+  //****************************************************************************80
+
+  double r8_sign ( double x )
+
+  //****************************************************************************80
+  //
+  //  Purpose:
+  //
+  //    R8_SIGN returns the sign of an R8.
+  //
+  //  Licensing:
+  //
+  //    This code is distributed under the GNU LGPL license.
+  //
+  //  Modified:
+  //
+  //    18 October 2004
+  //
+  //  Author:
+  //
+  //    John Burkardt
+  //
+  //  Parameters:
+  //
+  //    Input, double X, the number whose sign is desired.
+  //
+  //    Output, double R8_SIGN, the sign of X.
+  //
+  {
+    double value;
+
+    if ( x < 0.0 )
+      {
+	value = -1.0;
+      }
+    else
+      {
+	value = 1.0;
+      }
+    return value;
+  }
+  //****************************************************************************80
+
+  void timestamp ( )
+
+  //****************************************************************************80
+  //
+  //  Purpose:
+  //
+  //    TIMESTAMP prints the current YMDHMS date as a time stamp.
+  //
+  //  Example:
+  //
+  //    31 May 2001 09:45:54 AM
+  //
+  //  Licensing:
+  //
+  //    This code is distributed under the GNU LGPL license.
+  //
+  //  Modified:
+  //
+  //    24 September 2003
+  //
+  //  Author:
+  //
+  //    John Burkardt
+  //
+  //  Parameters:
+  //
+  //    None
+  //
+  {
+    const int TIME_SIZE(40);
+
+    static char time_buffer[TIME_SIZE];
+    const struct tm *tm;
+    time_t now;
+
+    now = time ( NULL );
+    tm = localtime ( &now );
+
+    strftime ( time_buffer, TIME_SIZE, "%d %B %Y %I:%M:%S %p", tm );
+
+    cout << time_buffer << "\n";
+
+    return;
+  }
+  //****************************************************************************80
+
+  double zero ( double a, double b, double t, func_base& f )
+
+  //****************************************************************************80
+  //
+  //  Purpose:
+  //
+  //    ZERO seeks the root of a function F(X) in an interval [A,B].
+  //
+  //  Discussion:
+  //
+  //    The interval [A,B] must be a change of sign interval for F.
+  //    That is, F(A) and F(B) must be of opposite signs.  Then
+  //    assuming that F is continuous implies the existence of at least
+  //    one value C between A and B for which F(C) = 0.
+  //
+  //    The location of the zero is determined to within an accuracy
+  //    of 6 * MACHEPS * r8_abs ( C ) + 2 * T.
+  //
+  //    Thanks to Thomas Secretin for pointing out a transcription error in the
+  //    setting of the value of P, 11 February 2013.
+  //
+  //  Licensing:
+  //
+  //    This code is distributed under the GNU LGPL license.
+  //
+  //  Modified:
+  //
+  //    11 February 2013
+  //
+  //  Author:
+  //
+  //    Original FORTRAN77 version by Richard Brent.
+  //    C++ version by John Burkardt.
+  //
+  //  Reference:
+  //
+  //    Richard Brent,
+  //    Algorithms for Minimization Without Derivatives,
+  //    Dover, 2002,
+  //    ISBN: 0-486-41998-3,
+  //    LC: QA402.5.B74.
+  //
+  //  Parameters:
+  //
+  //    Input, double A, B, the endpoints of the change of sign interval.
+  //
+  //    Input, double T, a positive error tolerance.
+  //
+  //    Input, func_base& F, the name of a user-supplied c++ functor
+  //    whose zero is being sought.  The input and output
+  //    of F() are of type double.
+  //
+  //    Output, double ZERO, the estimated value of a zero of
+  //    the function F.
+  //
+  {
+    double c;
+    double d;
+    double e;
+    double fa;
+    double fb;
+    double fc;
+    double m;
+    double macheps;
+    double p;
+    double q;
+    double r;
+    double s;
+    double sa;
+    double sb;
+    double tol;
+    //
+    //  Make local copies of A and B.
+    //
+    sa = a;
+    sb = b;
+    fa = f ( sa );
+    fb = f ( sb );
+
+    c = sa;
+    fc = fa;
+    e = sb - sa;
+    d = e;
+
+    macheps = r8_epsilon ( );
+
+    for ( ; ; )
+      {
+	if ( r8_abs ( fc ) < r8_abs ( fb ) )
+	  {
+	    sa = sb;
+	    sb = c;
+	    c = sa;
+	    fa = fb;
+	    fb = fc;
+	    fc = fa;
+	  }
+
+	tol = 2.0 * macheps * r8_abs ( sb ) + t;
+	m = 0.5 * ( c - sb );
+
+	if ( r8_abs ( m ) <= tol || fb == 0.0 )
+	  {
+	    break;
+	  }
+
+	if ( r8_abs ( e ) < tol || r8_abs ( fa ) <= r8_abs ( fb ) )
+	  {
+	    e = m;
+	    d = e;
+	  }
+	else
+	  {
+	    s = fb / fa;
+
+	    if ( sa == c )
+	      {
+		p = 2.0 * m * s;
+		q = 1.0 - s;
+	      }
+	    else
+	      {
+		q = fa / fc;
+		r = fb / fc;
+		p = s * ( 2.0 * m * q * ( q - r ) - ( sb - sa ) * ( r - 1.0 ) );
+		q = ( q - 1.0 ) * ( r - 1.0 ) * ( s - 1.0 );
+	      }
+
+	    if ( 0.0 < p )
+	      {
+		q = - q;
+	      }
+	    else
+	      {
+		p = - p;
+	      }
+
+	    s = e;
+	    e = d;
+
+	    if ( 2.0 * p < 3.0 * m * q - r8_abs ( tol * q ) &&
+		 p < r8_abs ( 0.5 * s * q ) )
+	      {
+		d = p / q;
+	      }
+	    else
+	      {
+		e = m;
+		d = e;
+	      }
+	  }
+	sa = sb;
+	fa = fb;
+
+	if ( tol < r8_abs ( d ) )
+	  {
+	    sb = sb + d;
+	  }
+	else if ( 0.0 < m )
+	  {
+	    sb = sb + tol;
+	  }
+	else
+	  {
+	    sb = sb - tol;
+	  }
+
+	fb = f ( sb );
+
+	if ( ( 0.0 < fb && 0.0 < fc ) || ( fb <= 0.0 && fc <= 0.0 ) )
+	  {
+	    c = sa;
+	    fc = fa;
+	    e = sb - sa;
+	    d = e;
+	  }
+      }
+    return sb;
+  }
+  //****************************************************************************80
+
+  void zero_rc ( double a, double b, double t, double &arg, int &status,
+		 double value )
+
+  //****************************************************************************80
+  //
+  //  Purpose:
+  //
+  //    ZERO_RC seeks the root of a function F(X) using reverse communication.
+  //
+  //  Discussion:
+  //
+  //    The interval [A,B] must be a change of sign interval for F.
+  //    That is, F(A) and F(B) must be of opposite signs.  Then
+  //    assuming that F is continuous implies the existence of at least
+  //    one value C between A and B for which F(C) = 0.
+  //
+  //    The location of the zero is determined to within an accuracy
+  //    of 6 * MACHEPS * r8_abs ( C ) + 2 * T.
+  //
+  //    The routine is a revised version of the Brent zero finder
+  //    algorithm, using reverse communication.
+  //
+  //    Thanks to Thomas Secretin for pointing out a transcription error in the
+  //    setting of the value of P, 11 February 2013.
+  //
+  //  Licensing:
+  //
+  //    This code is distributed under the GNU LGPL license.
+  //
+  //  Modified:
+  //
+  //    11 February 2013
+  //
+  //  Author:
+  //
+  //    John Burkardt
+  //
+  //  Reference:
+  //
+  //    Richard Brent,
+  //    Algorithms for Minimization Without Derivatives,
+  //    Dover, 2002,
+  //    ISBN: 0-486-41998-3,
+  //    LC: QA402.5.B74.
+  //
+  //  Parameters:
+  //
+  //    Input, double A, B, the endpoints of the change of sign interval.
+  //
+  //    Input, double T, a positive error tolerance.
+  //
+  //    Output, double &ARG, the currently considered point.  The user
+  //    does not need to initialize this value.  On return with STATUS positive,
+  //    the user is requested to evaluate the function at ARG, and return
+  //    the value in VALUE.  On return with STATUS zero, ARG is the routine's
+  //    estimate for the function's zero.
+  //
+  //    Input/output, int &STATUS, used to communicate between
+  //    the user and the routine.  The user only sets STATUS to zero on the first
+  //    call, to indicate that this is a startup call.  The routine returns STATUS
+  //    positive to request that the function be evaluated at ARG, or returns
+  //    STATUS as 0, to indicate that the iteration is complete and that
+  //    ARG is the estimated zero
+  //
+  //    Input, double VALUE, the function value at ARG, as requested
+  //    by the routine on the previous call.
+  //
+  {
+    static double c;
+    static double d;
+    static double e;
+    static double fa;
+    static double fb;
+    static double fc;
+    double m;
+    static double macheps;
+    double p;
+    double q;
+    double r;
+    double s;
+    static double sa;
+    static double sb;
+    double tol;
+    //
+    //  Input STATUS = 0.
+    //  Initialize, request F(A).
+    //
+    if ( status == 0 )
+      {
+	macheps = r8_epsilon ( );
+
+	sa = a;
+	sb = b;
+	e = sb - sa;
+	d = e;
+
+	status = 1;
+	arg = a;
+	return;
+      }
+    //
+    //  Input STATUS = 1.
+    //  Receive F(A), request F(B).
+    //
+    else if ( status == 1 )
+      {
+	fa = value;
+	status = 2;
+	arg = sb;
+	return;
+      }
+    //
+    //  Input STATUS = 2
+    //  Receive F(B).
+    //
+    else if ( status == 2 )
+      {
+	fb = value;
+
+	if ( 0.0 < fa * fb )
+	  {
+	    status = -1;
+	    return;
+	  }
+	c = sa;
+	fc = fa;
+      }
+    else
+      {
+	fb = value;
+
+	if ( ( 0.0 < fb && 0.0 < fc ) || ( fb <= 0.0 && fc <= 0.0 ) )
+	  {
+	    c = sa;
+	    fc = fa;
+	    e = sb - sa;
+	    d = e;
+	  }
+      }
+    //
+    //  Compute the next point at which a function value is requested.
+    //
+    if ( r8_abs ( fc ) < r8_abs ( fb ) )
+      {
+	sa = sb;
+	sb = c;
+	c = sa;
+	fa = fb;
+	fb = fc;
+	fc = fa;
+      }
+
+    tol = 2.0 * macheps * r8_abs ( sb ) + t;
+    m = 0.5 * ( c - sb );
+
+    if ( r8_abs ( m ) <= tol || fb == 0.0 )
+      {
+	status = 0;
+	arg = sb;
+	return;
+      }
+
+    if ( r8_abs ( e ) < tol || r8_abs ( fa ) <= r8_abs ( fb ) )
+      {
+	e = m;
+	d = e;
+      }
+    else
+      {
+	s = fb / fa;
+
+	if ( sa == c )
+	  {
+	    p = 2.0 * m * s;
+	    q = 1.0 - s;
+	  }
+	else
+	  {
+	    q = fa / fc;
+	    r = fb / fc;
+	    p = s * ( 2.0 * m * q * ( q - r ) - ( sb - sa ) * ( r - 1.0 ) );
+	    q = ( q - 1.0 ) * ( r - 1.0 ) * ( s - 1.0 );
+	  }
+
+	if ( 0.0 < p )
+	  {
+	    q = - q;
+	  }
+	else
+	  {
+	    p = - p;
+	  }
+	s = e;
+	e = d;
+
+	if ( 2.0 * p < 3.0 * m * q - r8_abs ( tol * q ) &&
+	     p < r8_abs ( 0.5 * s * q ) )
+	  {
+	    d = p / q;
+	  }
+	else
+	  {
+	    e = m;
+	    d = e;
+	  }
+      }
+
+    sa = sb;
+    fa = fb;
+
+    if ( tol < r8_abs ( d ) )
+      {
+	sb = sb + d;
+      }
+    else if ( 0.0 < m )
+      {
+	sb = sb + tol;
+      }
+    else
+      {
+	sb = sb - tol;
+      }
+
+    arg = sb;
+    status = status + 1;
+
+    return;
+  }
+
+  // ======================================================================
+  // === Simple wrapper functions
+  // === for convenience and/or compatibility.
+  //
+  // === The three functions are the same as above,
+  // === except that they take a plain function F
+  // === instead of a c++ functor.  In all cases, the
+  // === input and output of F() are of type double.
+
+  typedef double DoubleOfDouble (double);
+
+  class func_wrapper : public func_base {
+    DoubleOfDouble* func;
+  public:
+    func_wrapper(DoubleOfDouble* f) 
+      : func{f}
+    {
+    }
+    virtual double operator() (double x){
+      return func(x);
+    }
+  };
+
+  //****************************************************************************80
+
+  double glomin ( double a, double b, double c, double m, double e,
+		  double t, double f ( double x ), double &x ){
+    func_wrapper foo(f);
+    return glomin(a, b, c, m, e, t, foo, x);
+  }
+
+  //****************************************************************************80
+
+  double local_min ( double a, double b, double t, double f ( double x ),
+		     double &x ){
+    func_wrapper foo(f);
+    return local_min(a, b, t, foo, x);
+  }
+
+  //****************************************************************************80
+
+  double zero ( double a, double b, double t, double f ( double x ) ){
+    func_wrapper foo(f);
+    return zero(a, b, t, foo);
+  }
+
+  // ======================================================================
+  // Generally useful functor to evaluate a monic polynomial.
+  // For details, see class definition in brent.hpp
+
+  double monicPoly::operator()(double x)
+  {
+    double rslt = 1 ; 
+    for (int ii = int(coeff.size())-1; ii >= 0; ii--){
+      rslt *= x;
+      rslt += coeff[ii];
+    }
+    return rslt;
+  }
+
+  // Similarly, evaluate a general polynomial (not necessarily monic):
+  double Poly::operator()(double x){
+    double rslt(0);
+    for (int ii = int(coeff.size())-1; ii >= 0; ii--){
+      rslt *= x;
+      rslt += coeff[ii];
+    }
+    return rslt;
+  }
+
+} // end namespace brent
+
diff --git a/src/math/brent.hpp b/src/math/brent.hpp
new file mode 100644
index 0000000..a9dcc71
--- /dev/null
+++ b/src/math/brent.hpp
@@ -0,0 +1,60 @@
+#include <vector>
+namespace brent 
+{
+
+  class func_base{
+  public:
+    virtual ~func_base(){}
+    virtual double operator() (double) = 0;
+  };
+
+  class monicPoly : public func_base {
+  public:
+    std::vector<double> coeff;
+    virtual ~monicPoly(){}
+    virtual double operator() (double x);
+    // constructors:
+    monicPoly(const size_t degree)
+      : coeff(degree) {}
+    monicPoly(const std::vector<double>& v)
+      : coeff(v) {}
+    monicPoly(const double* c, size_t degree)
+      : coeff(std::vector<double>(c, c+degree)) {}
+  };
+
+  class Poly : public func_base {
+  public:
+    virtual ~Poly(){}
+    std::vector<double> coeff;    // a vector of size nterms i.e. 1+degree
+    virtual double operator() (double x);
+    // constructors:
+    Poly(const size_t degree)
+      : coeff(1+degree) {}
+    Poly(const std::vector<double>& v)
+      : coeff(v) {}
+    Poly(const double* c, size_t degree)
+      : coeff(std::vector<double>(c, 1+c+degree)) {}
+  };
+
+  double glomin ( double a, double b, double c, double m, double e, double t,
+		  func_base& f, double &x );
+  double local_min ( double a, double b, double t, func_base& f,
+		     double &x );
+  double local_min_rc ( double &a, double &b, int &status, double value );
+  double r8_abs ( double x );
+  double r8_epsilon ( );
+  double r8_max ( double x, double y );
+  double r8_sign ( double x );
+  void timestamp ( );
+  double zero ( double a, double b, double t, func_base& f );
+  void zero_rc ( double a, double b, double t, double &arg, int &status,
+		 double value );
+
+  // === simple wrapper functions
+  // === for convenience and/or compatibility
+  double glomin ( double a, double b, double c, double m, double e, double t,
+		  double f ( double x ), double &x );
+  double local_min ( double a, double b, double t, double f ( double x ),
+		     double &x );
+  double zero ( double a, double b, double t, double f ( double x ) );
+}
diff --git a/src/mcmc/Chain.cpp b/src/mcmc/Chain.cpp
new file mode 100644
index 0000000..aecd897
--- /dev/null
+++ b/src/mcmc/Chain.cpp
@@ -0,0 +1,801 @@
+#include <sstream>		
+#include <map> 
+#include <unordered_map>
+#include <algorithm>
+
+#include "TopologyParameter.hpp"
+
+#include "NodeSlider.hpp"
+#include "Chain.hpp"		
+#include "TreeAln.hpp"
+#include "Randomness.hpp"
+#include "GlobalVariables.hpp"
+
+#include "BranchLengthOptimizer.hpp"
+
+#include "LikelihoodEvaluator.hpp" 
+#include "ParallelSetup.hpp"
+#include "Category.hpp"
+#include "TreePrinter.hpp"
+
+// // TODO not too much thought went into this  
+
+// actually, i do not think this is a good idea, but too afaid of
+// removing it at this point in the release cycle
+namespace std 
+{
+  template<> struct hash<AbstractParameter*>
+  {
+  // public: 
+    size_t operator()(const AbstractParameter* rhs) const 
+    {
+       return rhs->getId(); 
+    }
+  } ;
+
+  template<>
+  struct equal_to<AbstractParameter*>
+  {
+    bool operator()(const AbstractParameter* a, const AbstractParameter* b ) const 
+    {
+      return a->getId() == b->getId(); 
+    }
+  }; 
+}
+
+
+Chain:: Chain(randKey_t seed, const TreeAln& traln,  ParameterList params, const std::vector<std::unique_ptr<AbstractProposal> > &proposals, 
+	      std::vector<ProposalSet> proposalSets, LikelihoodEvaluator eval, bool isDryRun) 
+  : Serializable()
+  ,  _traln(traln)
+  , _deltaT(0)
+  , _runid(0)
+  , _tuneFrequency(100)
+  , _hastings(log_double::fromAbs(1))
+  , _currentGeneration(0)
+  , _couplingId(0)
+  , _proposals{}
+  , _proposalSets(proposalSets)
+  , _chainRand(seed)
+  , _relWeightSumSingle(0)
+  , _relWeightSumSets(0)
+  , _prior{}
+  , _bestState(log_double::lowest())
+  , _evaluator(eval)
+  , _lnPr{log_double::fromAbs(1.)}
+  , _params{params}
+{
+  for(auto &p : proposals)
+    {
+      _proposals.emplace_back(p->clone()); 
+      _proposals.back()->setParams(&_params); 
+    }
+
+  for(auto &p : _proposalSets)
+    p.setParameterListPtr(&_params);
+
+
+  // experimental: initilize with random starting values 
+  // for(auto &p : _params)
+  //   {
+  //     if(dynamic_cast<BranchLengthsParameter*>(p) != nullptr)
+  // 	{
+  // 	  for(auto bl : _traln.extractBranches(p))
+  // 	    {
+  // 	      auto newVal = p->getPrior()->drawFromPrior(_chainRand);
+  // 	      tout << "init with " << newVal << std::endl; 
+  // 	      bl.setConvertedInternalLength(p,newVal.values[0]); 
+  // 	      if(BoundsChecker::checkBranch(bl))
+  // 		BoundsChecker::correctBranch(bl); 
+  // 	      _traln.setBranch(bl,p);
+  // 	    }
+  // 	}
+  //   }
+
+  _prior.initialize(_traln, _params);
+  suspend(); 
+  updateProposalWeights();
+
+}
+
+
+
+Chain::Chain(  const Chain& rhs)   
+  : Serializable(rhs)
+  ,  _traln(rhs._traln)
+  , _deltaT(rhs._deltaT)
+  , _runid(rhs._runid)
+  , _tuneFrequency(rhs._tuneFrequency)
+  , _hastings(rhs._hastings)
+  , _currentGeneration(rhs._currentGeneration)
+  , _couplingId(rhs._couplingId) 
+  , _proposals{}
+  , _proposalSets(std::move(rhs._proposalSets))
+  , _chainRand(std::move(rhs._chainRand)) 
+  , _relWeightSumSingle(rhs._relWeightSumSingle)
+  , _relWeightSumSets(rhs._relWeightSumSets) 
+  , _prior(std::move(rhs._prior))
+  , _bestState(rhs._bestState)
+  , _evaluator(std::move(rhs._evaluator))
+  , _lnPr(rhs._lnPr)
+  , _params{rhs._params}
+{
+  for(auto &p : rhs._proposals)
+    {
+      _proposals.emplace_back(p->clone());
+      _proposals.back()->setParams(&_params);
+    }
+
+  for(auto &p : _proposalSets)
+    p.setParameterListPtr(&_params);
+}
+
+ 
+Chain& Chain::operator=(Chain rhs)
+{
+  swap(*this, rhs); 
+  return *this; 
+}
+
+
+void swap(Chain &lhs, Chain &rhs)
+{
+  using std::swap; 
+
+  swap(lhs._traln,rhs._traln); 
+  swap(lhs._deltaT,rhs._deltaT);
+  swap(lhs._runid,rhs._runid);
+  swap(lhs._tuneFrequency,rhs._tuneFrequency);
+  swap(lhs._hastings,rhs._hastings);
+  swap(lhs._currentGeneration,rhs._currentGeneration);
+  swap(lhs._couplingId,rhs._couplingId); 
+  swap(lhs._proposals,rhs._proposals);
+  swap(lhs._proposalSets,rhs._proposalSets);
+  swap(lhs._chainRand,rhs._chainRand);
+  swap(lhs._relWeightSumSingle,rhs._relWeightSumSingle);
+  swap(lhs._relWeightSumSets,rhs._relWeightSumSets); 
+  swap(lhs._prior,rhs._prior);
+  swap(lhs._bestState,rhs._bestState);
+  swap(lhs._evaluator,rhs._evaluator);
+  swap(lhs._lnPr,rhs._lnPr);
+  swap(lhs._params, rhs._params); 
+}
+
+
+void swapHeatAndProposals(Chain &lhs, Chain& rhs)
+{
+  std::swap(lhs._bestState,    rhs._bestState); 
+  std::swap(lhs._couplingId,   rhs._couplingId    ); 
+  std::swap(lhs._proposals,    rhs._proposals     ); 
+  std::swap(lhs._proposalSets, rhs._proposalSets  ); 
+}
+
+
+std::ostream& Chain::addChainInfo(std::ostream &out) const 
+{
+  return out << "[run=" << _runid << ",heat=" << _couplingId << ",gen=" << getGeneration() << "]" ; 
+}
+
+ 
+double Chain::getChainHeat() const 
+{
+  double tmp = 1. + ( _deltaT * _couplingId ) ; 
+  double inverseHeat = 1.f / tmp; 
+  assert(_couplingId == 0 || inverseHeat < 1.); 
+  return inverseHeat; 
+}
+
+
+void Chain::updateProposalWeights()
+{
+  // prepare proposals 
+  _relWeightSumSingle = 0; 
+  for(auto& elem : _proposals)
+    _relWeightSumSingle +=  elem->getRelativeWeight();
+  
+  _relWeightSumSets = 0; 
+  for(auto &set : _proposalSets)
+    _relWeightSumSets += set.getRelativeWeight();
+}
+
+
+void Chain::suspend()  
+{
+  _traln.clearMemory(_evaluator.getArrayReservoir()); 
+  _lnPr = _prior.getLnPrior();
+  // tout << "SUSPEND " <<  MAX_SCI_PRECISION << _lnPr << std::endl; 
+
+#if 0 
+  // auto params =  getBranchLengthsParameterView(); 
+  AbstractParameter* param = (nullptr); 
+  for(auto p : _params)
+    if(dynamic_cast<BranchLengthsParameter*>(p) != nullptr)
+      param = p; 
+  auto bs = _traln.extractBranches(param);
+  tout << MAX_SCI_PRECISION << "SUSPEND " << bs << std::endl; 
+#endif
+
+  _evaluator.freeMemory(); 
+}
+
+
+void Chain::resume() 
+{    
+
+#if 0 
+  AbstractParameter* param = (nullptr); 
+  for(auto p : _params)
+    if(dynamic_cast<BranchLengthsParameter*>(p) != nullptr)
+      param = p; 
+  auto bs = _traln.extractBranches(param);
+  tout  << MAX_SCI_PRECISION << "RESUME " << bs << std::endl; 
+#endif
+
+  // auto vs = getParamView(); 
+  _prior.initialize(_traln, _params);
+  auto prNow = _prior.getLnPrior(); 
+  
+  // tout << "RESUME " <<  prNow  << std::endl; 
+
+  if(   std::fabs(log_double(  _lnPr / prNow ).toAbs()) - 1. >= ACCEPTED_LNPR_EPS)
+    {
+      std::cerr << MAX_SCI_PRECISION ; 
+      std::cerr << "While trying to resume chain: previous log prior could not be\n"
+  		<< "reproduced. This is a programming error." << std::endl; 
+      std::cerr << "Prior was " << _lnPr << "\t now we have " << prNow << 
+	"\tdiff=" << std::fabs(_lnPr.getRawLog() - prNow.getRawLog()) << 
+	std::endl; 
+      assert(0); 
+    }
+
+  updateProposalWeights();
+}
+
+
+ProposalSet& Chain::drawProposalSet(Randomness &rand)
+{
+  double r = _relWeightSumSets * rand.drawRandDouble01(); 
+
+  for(auto &c : _proposalSets )
+    {
+      double w = c.getRelativeWeight(); 
+      if(r < w )
+	return c; 
+      else 
+	r -= w ; 
+    }
+
+  assert(0); 
+  return _proposalSets[0]; 
+}
+
+
+AbstractProposal& Chain::drawProposalFunction(Randomness &rand)
+{ 
+  double r = _relWeightSumSingle * rand.drawRandDouble01();   
+
+  for(auto& c : _proposals)
+    {
+      double w = c->getRelativeWeight(); 
+      if(r < w )
+	{
+	  // std::cout << "drawn " << c.get() << std::endl; 
+	  return *c;
+	}
+      else 
+	r -= w; 
+    }
+
+  assert(0); 
+  return *(_proposals[0]); 
+}
+
+
+void Chain::serializeConditionally( std::ostream &out, CommFlag commFlags)  const 
+{
+  if( ( commFlags & CommFlag::PRINT_STAT )  != CommFlag::NOTHING)
+    {
+      cWrite<decltype(_couplingId)>(out, _couplingId);
+      cWrite<decltype(_bestState)>(out, _bestState);
+      
+      auto lnl = getLikelihood(); 
+      cWrite<decltype(lnl)>(out, lnl); 
+
+      cWrite<decltype(_lnPr)>(out, _lnPr); 
+      cWrite<decltype(_currentGeneration)>(out,_currentGeneration);
+    }
+
+  if( (commFlags & CommFlag::RAND) != CommFlag::NOTHING)
+    _chainRand.serialize(out);
+
+  if( ( commFlags & CommFlag::PROPOSALS ) != CommFlag::NOTHING )
+    {
+      for(auto& p : _proposals)
+	p->serialize(out); 
+
+      for(auto& p: _proposalSets)
+	p.serialize(out);
+
+      for(auto &p : _params)
+	p->serialize(out); 
+    }
+
+  if( ( commFlags & CommFlag::TREE ) != CommFlag::NOTHING )
+    {
+       for(auto &var: _params)
+	 {
+           auto compo = var->extractParameter(_traln);
+	  auto&&  tmp = std::stringstream{}; 
+	  var->printShort(tmp); 	  	  
+	  writeString(out,tmp.str()); 
+	  compo.serialize(out);
+	}
+    }
+}
+
+
+void Chain::deserializeConditionally(std::istream& in, CommFlag commFlags)
+{    
+  if( ( commFlags & CommFlag::PRINT_STAT ) != CommFlag::NOTHING )
+    {
+      _couplingId = cRead<decltype(_couplingId)>(in); 
+      _bestState = cRead<log_double>(in); 
+      setLikelihood(cRead<log_double>(in) ); 
+
+      _lnPr = cRead<log_double>(in); 
+      _currentGeneration = cRead<decltype(_currentGeneration)>(in);
+    }
+
+  if( (commFlags & CommFlag::RAND) != CommFlag::NOTHING)
+    _chainRand.deserialize(in);
+
+  if( ( commFlags & CommFlag::PROPOSALS ) != CommFlag::NOTHING )
+    {
+      for(auto &p : _proposals)
+	p->deserialize(in);
+
+      for(auto &p : _proposalSets)
+	p.deserialize(in);
+
+      for(auto &p : _params)
+	p->deserialize(in); 	// dubios decision: serialized version of a parameter could also be the content...
+    }
+
+  if( ( commFlags & CommFlag::TREE ) != CommFlag::NOTHING )
+    {
+      auto param2content = std::unordered_map<AbstractParameter*,ParameterContent>{}; 
+      
+      for(auto &param : _params)
+	{
+	  auto name = readString(in);
+	  {
+	    auto&& tmp = std::stringstream{}; 
+	    param->printShort(tmp);
+	    assert( tmp.str().compare(name) == 0 ); 
+	  }
+	  auto content = param->extractParameter(_traln); // initializes the object correctly. the object must "know" how many values are to be extracted 
+	  content.deserialize(in);
+
+	  param2content.insert(std::make_pair(param, content)); 
+	}
+      
+      applyParameterContents(param2content);
+    }
+}
+
+
+
+
+BranchPlain Chain::peekNextVirtualRoot(TreeAln &traln, Randomness rand)  
+{
+  // TODO go beyond next step  
+
+  auto curGen = rand.getGeneration();
+
+  rand.rebaseForGeneration(curGen + 1 ); 
+
+  double sum = _relWeightSumSingle + _relWeightSumSets; 
+  
+  auto branch = BranchPlain(); 
+
+  if( rand.drawRandDouble01() * sum < _relWeightSumSingle) 
+    {
+      auto &pfun = drawProposalFunction(rand); 
+      branch = pfun.determinePrimeBranch(traln, rand); 
+    }
+  else 
+    {
+      auto pset = drawProposalSet(rand); 
+      branch = pset.getProposalView()[0]->determinePrimeBranch(traln, rand); 
+    }
+
+  if(branch.getPrimNode() == 0 || branch.getSecNode() == 0)
+    {
+      // TODO better draw  
+      branch = TreeRandomizer::drawInnerBranchUniform(traln, rand); 
+#ifdef PRINT_EVAL_CHOICE
+      tout << "RANDOM " << branch<< std::endl; 
+#endif
+      // tout << "no prediction, just returning a somewhat inner branch " << branch  << std::endl; 
+    }
+  else 
+    {
+#ifdef PRINT_EVAL_CHOICE
+      tout << "PREDICT " << branch << std::endl; 
+#endif
+    }
+  
+
+  return branch; 
+}
+
+
+
+void Chain::stepSingleProposal()
+{
+  auto &traln = _traln; 
+  auto prevLnl = getLikelihood(); 
+  auto& pfun = drawProposalFunction(_chainRand);
+
+  /* reset proposal ratio  */
+  _hastings = log_double::fromAbs(1.); 
+
+  pfun.applyToState(_traln, _prior, _hastings, _chainRand, _evaluator);
+  
+  assert(not _hastings.isNaN()) ; 
+
+  // can be ignored
+  auto suggestion = peekNextVirtualRoot(traln,_chainRand); 
+
+  pfun.evaluateProposal(_evaluator, _traln, suggestion);
+
+  auto priorRatio = _prior.getLnPriorRatio();
+  auto lnlRatio = traln.getLikelihood() / prevLnl; 
+
+  double testr = _chainRand.drawRandDouble01();
+  double acceptance = fmin(    log_double( exponentiate( priorRatio * lnlRatio, getChainHeat() ) * _hastings).toAbs()  ,1.) ; 
+
+  bool wasAccepted  = testr < acceptance; 
+
+#ifdef DEBUG_SHOW_EACH_PROPOSAL 
+  auto& output = tout  ; 
+  // auto& output = std::cout  ; 
+  addChainInfo(output); 
+  output << "\t" << (wasAccepted ? "ACC" : "rej" )  << "\t"<< pfun.getName() << "\t" 
+	 << MORE_FIXED_PRECISION << SHOW(prevLnl) << SHOW(lnlRatio) << SHOW(priorRatio) << SHOW( _hastings) << SHOW(acceptance)  << SHOW(testr)<< std::endl; 
+#endif
+
+  if(wasAccepted)
+    {
+      pfun.accept();      
+      _prior.accept();
+      if(_bestState < traln.getLikelihood()  )
+	_bestState = traln.getLikelihood(); 
+      _lnPr = _prior.getLnPrior();
+    }
+  else
+    {
+      pfun.resetState(traln);
+      pfun.reject();
+      _prior.reject();
+      
+      auto myRejected = std::vector<bool>(traln.getNumberOfPartitions(), false); 
+      for(auto &elem : pfun.getAffectedPartitions())
+	myRejected[elem] = true; 
+
+      auto nodes = pfun.getInvalidatedNodes(traln); 
+      _evaluator.accountForRejection(traln, myRejected, nodes); 
+
+    }
+
+  _evaluator.freeMemory();
+
+
+  if( _tuneFrequency > 0 && _tuneFrequency <  pfun.getNumCallSinceTuning()   ) 
+    pfun.autotune();
+}
+
+
+
+
+/** 
+    whenever we apply a bunch of stored parameters, we MUST apply the
+    topology parameter BEFORE the branch length parameter (otherwise,
+    we may not correctly reproduce the state)
+    
+    the state of a chain (wrt parameter values) could be
+    encapsulated...
+
+    TODO: use this specific function also in all other occasions...
+ */ 
+void Chain::applyParameterContents(std::unordered_map<AbstractParameter*,ParameterContent> param2content)  
+{
+  auto topoParams =  std::unordered_map<AbstractParameter*,ParameterContent>{}; 
+  auto otherParams = std::unordered_map<AbstractParameter*,ParameterContent>{}; 
+  
+  for(auto elem : param2content)
+    if(dynamic_cast<TopologyParameter*>(elem.first) != nullptr) 
+      topoParams.insert(elem); 
+
+  for(auto elem : param2content)
+    if(dynamic_cast<TopologyParameter*>(elem.first) == nullptr) 
+      otherParams.insert(elem); 
+
+  for(auto &elem : topoParams)
+    elem.first->applyParameter(_traln, elem.second);
+  
+  for(auto &elem : otherParams)
+    elem.first->applyParameter(_traln, elem.second); 
+}
+
+
+
+void Chain::stepSetProposal()
+{
+  auto &pSet = drawProposalSet(_chainRand); 
+
+  auto oldPartitionLnls = _traln.getPartitionLnls(); 
+  
+  auto p2Hastings =  std::unordered_map<AbstractProposal*, log_double>{} ; 
+  auto p2LnPriorRatio = std::unordered_map<AbstractProposal*, log_double>{}; 
+  auto p2OldLnl = std::unordered_map<AbstractProposal*, log_double>{} ; 
+
+  auto affectedPartitions = std::vector<nat>{}; 
+  auto proposals = pSet.getProposalView(); 
+  auto branches = proposals.at(_chainRand.drawIntegerOpen(proposals.size()))->prepareForSetExecution(_traln, _chainRand);
+
+  // branch length proposals are all executed on the same branch. In
+  // case of the node slider, we need two adjacent branches. One of
+  // the proposals in the set determines which branch we are dealing
+  // with
+  for(auto &proposal: proposals)
+    {
+      proposal->setPreparedBranch(branches.first);
+      proposal->setOtherPreparedBranch(branches.second);
+    }
+  
+  // get all parameters and affected partitions for which we actually
+  // do something in this proposal set (e.g., if this is a AA
+  // proposal, we would not do anything to DNA partitions)
+  auto affectedParameters = std::vector<AbstractParameter*>();  
+  for(auto &proposal: proposals)
+    {
+      auto param = proposal->getPrimaryParameterView()[0]; 
+      affectedParameters.push_back(param);
+      
+      auto partitions = param->getPartitions();
+      affectedPartitions.insert(end(affectedPartitions), begin(partitions), end(partitions));
+    }
+  
+  // stuff that is specific to the newton-raphson optimizing proposal
+  // sets (i.e., blDistGamma)
+  if( proposals[0]->isUsingOptimizedBranches() )
+    {
+
+      auto relevantBranch = branches.first;  
+      _evaluator.evaluateSubtrees(_traln, relevantBranch,affectedPartitions , false);
+
+      _evaluator.evaluatePartitionsDry(_traln, relevantBranch, affectedPartitions ); 
+
+      auto blo = BranchLengthOptimizer(_traln, relevantBranch, 30, _evaluator.getParallelSetup().getChainComm(), affectedParameters);
+      blo.optimizeBranches(_traln);
+      auto optParams = blo.getOptimizedParameters();
+
+      assert(optParams.size() == affectedParameters.size()); 
+      for(nat i = 0; i < optParams.size() ; ++i)
+	proposals[i]->extractProposer(_traln, optParams[i]);
+    }
+
+  // apply each proposal, reset priors and hastings after each proposal  
+  for(auto &proposal : proposals)
+    {
+      auto  lHast = log_double::fromAbs(1.); 
+      _prior.reject();
+      proposal->applyToState(_traln, _prior, lHast, _chainRand, _evaluator); 
+      p2LnPriorRatio[proposal] = _prior.getLnPriorRatio(); 
+      p2Hastings[proposal] = lHast; 
+
+      for(auto &p : proposal->getPrimaryParameterView())
+	{
+	  auto partitions = p->getPartitions(); 
+	  auto lnl = log_double::fromAbs(1.0); 
+	  for(auto &partition : partitions)
+	    lnl *= oldPartitionLnls[partition]; 
+	  p2OldLnl[proposal] = lnl; 
+	}
+    }
+
+  bool fullTraversalNecessary = pSet.needsFullTraversal();
+  
+  // all proposals are applied, now only evaluate once 
+  if( 
+     // branches.first.equalsUndirected(BranchPlain(0,0))
+     branches.first == BranchPlain(0,0) 
+      ) // TODO another HACK
+    {
+      // this should be a reasonable suggestion 
+      auto nextRoot = peekNextVirtualRoot(_traln, _chainRand); 
+      _evaluator.evaluatePartitionsWithRoot(_traln, nextRoot, affectedPartitions, fullTraversalNecessary); 
+    }
+  else 
+    {
+      pSet.getProposalView()[0]->prepareForSetEvaluation(_traln, _evaluator);
+      _evaluator.evaluatePartitionsWithRoot(_traln, branches.first , affectedPartitions, fullTraversalNecessary );
+    }
+
+  auto newPLnls = _traln.getPartitionLnls();
+
+  _prior.reject();		// slight abuse 
+  
+  // decide upon acceptance, rejection of single proposals and account for it 
+  auto partitionsToReset = std::vector<bool>(_traln.getNumberOfPartitions() , false); 
+  nat accCtr = 0; 
+  nat total = 0; 
+  auto p2WasAccepted = std::unordered_map<AbstractProposal*, bool>{} ; 
+  for(auto &proposal : pSet.getProposalView())
+    {
+      ++total; 
+      auto newLnl = log_double::fromAbs(1.0) ;  
+      for(auto var : proposal->getPrimaryParameterView())
+	for(auto p : var->getPartitions()) 
+	  newLnl *= newPLnls[p]; 
+ 
+      auto accRatio = log_double(exponentiate(   p2LnPriorRatio[proposal] * ( newLnl / p2OldLnl[proposal]) ,  getChainHeat()) * p2Hastings[proposal]).toAbs();
+
+      if(_chainRand.drawRandDouble01() < accRatio)
+	{
+	  ++accCtr;
+	  proposal->accept();
+	  p2WasAccepted[proposal] = true; 
+	}
+      else 
+	{
+	  // TODO prior more efficient 
+	  proposal->resetState(_traln);
+	  proposal->reject();	  
+
+	  for(auto& param: proposal->getPrimaryParameterView())
+	    {
+	      for(auto p : param->getPartitions())
+		partitionsToReset[p] = true; 
+	    }
+	  p2WasAccepted[proposal] = false; 
+	}      
+    }
+
+  auto nodes = pSet.getProposalView()[0]->getInvalidatedNodes(_traln); 
+  _evaluator.accountForRejection(_traln, partitionsToReset, nodes); 
+
+  auto lnl = _traln.getLikelihood(); 
+  _lnPr = _prior.getLnPrior();
+  
+  if(_bestState < lnl)
+    _bestState = lnl; 
+
+#ifdef DEBUG_SHOW_EACH_PROPOSAL
+  auto &output = tout ; 
+
+  addChainInfo(output);
+  output << "\t" << accCtr << "/"  << total << "\t" << pSet << "\t" << lnl << std::endl; 
+#endif
+
+  // tune proposals, if it time 
+  for(auto &proposal : pSet.getProposalView())
+    if( this->_tuneFrequency > 0  && this->_tuneFrequency < proposal->getNumCallSinceTuning()) // meh
+      proposal->autotune(); 
+
+  _prior.reject();
+  tout << MAX_SCI_PRECISION; 
+  for(auto &proposal : pSet.getProposalView())
+    {
+      if(p2WasAccepted[proposal])
+	{
+	  auto tmp = p2LnPriorRatio.at(proposal); 
+	  _prior.addToRatio(tmp); 
+	}
+    }
+
+  _evaluator.freeMemory();
+  _prior.accept();
+}
+
+
+void Chain::step()
+{
+  ++_currentGeneration; 
+
+#ifdef DEBUG_VERIFY_LNPR
+  _prior.verifyPrior(_traln, _params);
+#endif
+
+  _evaluator.imprint(_traln);
+  // inform the rng that we produce random numbers for generation x  
+  _chainRand.rebaseForGeneration(_currentGeneration);
+
+  double sum = _relWeightSumSingle + _relWeightSumSets; 
+  if(_chainRand.drawRandDouble01() * sum < _relWeightSumSingle)
+    stepSingleProposal();
+  else 
+    stepSetProposal();
+
+#ifdef DEBUG_LNL_VERIFY
+  _evaluator.expensiveVerify(_traln, _traln.getAnyBranch() , getLikelihood()); 
+#endif
+
+#ifdef DEBUG_VERIFY_LNPR
+  _prior.verifyPrior(_traln, _params );
+#endif
+}
+
+
+const std::vector<AbstractProposal*> Chain::getProposalView() const 
+{
+  auto result = std::vector<AbstractProposal*>{};  
+  for(auto &elem: _proposals)
+    result.push_back(elem.get()); 
+  return result; 
+}
+
+
+std::ostream& operator<<(std::ostream& out, const Chain &rhs)
+{
+  rhs.addChainInfo(out); 
+  // out  << "\tLnl: " << rhs.tralnPtr->getTr()->likelihood << "\tLnPr: " << rhs.prior.getLnPrior();
+  out  << "\tLnl: " << rhs.getLikelihood() << "\tLnPr: " << rhs._lnPr; 
+  return out;  
+}
+
+
+void Chain::sample(  std::unordered_map<nat,TopologyFile> &paramId2TopFile ,  ParameterFile &pFile ) const
+{
+  auto blParamsUnfixed=  std::vector<AbstractParameter*>{} ; 
+  AbstractParameter *topoParamUnfixed = nullptr; 
+  
+  for(auto &param : _params  ) 
+    {
+      if(param->getCategory() == Category::BRANCH_LENGTHS && param->getPrior()->needsIntegration() )
+	blParamsUnfixed.push_back(param); 
+      else if(param->getCategory() == Category::TOPOLOGY && param->getPrior()->needsIntegration() )
+	topoParamUnfixed = param  ; 
+    }
+
+  if(blParamsUnfixed.size() > 0)
+    {
+      for(auto &param : blParamsUnfixed)
+	{
+	  nat myId = param->getId(); 
+	  auto &f = paramId2TopFile.at(myId); 
+	  f.sample(_traln, getGeneration(), param); 
+	}
+    }
+  else if(topoParamUnfixed != nullptr)
+    {
+      auto &f = paramId2TopFile.at(topoParamUnfixed->getId()); 
+      f.sample(_traln, getGeneration(), topoParamUnfixed); 
+    }
+
+  pFile.sample( _traln, _params, getGeneration(), _prior.getLnPrior()); 
+}
+
+     
+void Chain::serialize( std::ostream &out) const
+{
+  serializeConditionally(out, CommFlag::PRINT_STAT | CommFlag::PROPOSALS | CommFlag::TREE | CommFlag::RAND ) ;
+}  
+
+
+void Chain::deserialize( std::istream &in ) 
+{
+  deserializeConditionally(in, CommFlag::PRINT_STAT | CommFlag::PROPOSALS | CommFlag::TREE | CommFlag::RAND ) ;
+}
+
+
+void Chain::resetParamPtr()
+{
+  for(auto &p : _proposals)
+    p->setParams(&_params); 
+
+  for(auto &p : _proposalSets)
+    p.setParameterListPtr(&_params); 
+} 
+// c++<3
diff --git a/src/mcmc/Chain.hpp b/src/mcmc/Chain.hpp
new file mode 100644
index 0000000..10e75ab
--- /dev/null
+++ b/src/mcmc/Chain.hpp
@@ -0,0 +1,155 @@
+#ifndef _CHAIN_H
+#define  _CHAIN_H
+
+#include <vector>
+#include <unordered_set>
+#include <unordered_map>
+#include <memory>
+
+#include "ProposalSet.hpp"
+#include "PriorBelief.hpp"
+#include "LikelihoodEvaluator.hpp"
+#include "AbstractProposal.hpp"
+
+#include "TopologyFile.hpp"
+#include "ParameterFile.hpp"
+#include "Serializable.hpp"
+
+#include "CommFlag.hpp"
+
+class TreeAln; 
+class AbstractProposal; 
+
+
+class Chain : public Serializable
+{
+public: 
+  Chain(randKey_t seed, const TreeAln &_traln, ParameterList params, const std::vector<std::unique_ptr<AbstractProposal> > &_proposals, std::vector<ProposalSet> proposalSets, LikelihoodEvaluator eval, bool isDryRun);   
+  Chain( const Chain& rhs)   ; 
+  Chain( Chain&& rhs)  = default ; 
+  Chain& operator=( Chain rhs) ; 
+
+  // void setParamsAndProposals( ,); 
+
+  /** 
+      @brief apply saved parameter contents to the tree structure
+      @param eval indicates whether an evaluation should be performed after resuming
+      @param checkLnl a hack: disable check for the exact same likelihood. Reason for this is resuming a run from a checkpoint with ExaML. It is just extremely hard to get the exact same likelihood 
+   */   
+  void resume()  ; 
+  /**
+     @brief saves the all parameters that are integrated over,
+     s.t. the tree can be used by another chain     
+     @param paramsOnly indicates whether the likelihood and prior density should be saved as well   
+   */ 
+  void suspend()  ; 
+  /** 
+      @brief proceed by one generation 
+   */ 
+  void step();
+  /** 
+      @brief gets the proposals of this chain
+   */ 
+  const std::vector<AbstractProposal*> getProposalView() const  ; 
+  /** 
+      @brief add a representation of the chain to the stream    
+   */ 
+  std::ostream& addChainInfo(std::ostream &out) const; 
+  /** 
+      @brief extracts the variables of a chain into a sorted array      
+   */ 
+  const ParameterList& getParameterList() const {return _params; }
+  /** 
+      @brief take a sample from the chain 
+   */ 
+  void sample( std::unordered_map<nat,TopologyFile> &tFile, ParameterFile &pFile  ) const ; 
+  /** 
+      @brief deserialize the input string based on the flags 
+   */ 
+  void deserializeConditionally(std::istream& in, CommFlag commFlags); 
+  /** 
+      @brief serializes the chain into a string based on the flags
+   */ 
+  void serializeConditionally( std::ostream& out, CommFlag commFlags) const ; 
+
+  void reinitPrior(){_prior.initialize(_traln, _params );}
+
+  // getters and setters 
+  log_double getBestState() const {return _bestState; }
+  LikelihoodEvaluator& getEvaluator() {return _evaluator; }
+  const TreeAln& getTralnHandle() const { return _traln; }
+  TreeAln& getTralnHandle()  { return _traln; }
+  Randomness& getChainRand(){return _chainRand;}
+  double getChainHeat() const; 
+  void setDeltaT(double dt){_deltaT = dt; }
+  int getCouplingId() const {return _couplingId; }
+  void setCouplingId(int id) {_couplingId = id; }
+  void setTuneFreuqency(nat _tuneFreq ) {_tuneFrequency = _tuneFreq; }
+  void setHeatIncrement(nat cplId) {_couplingId = cplId  ;}
+  void setRunId(nat id) {_runid = id; }
+  double getDeltaT() {return _deltaT; }
+  uint64_t getGeneration() const {return _currentGeneration; }
+  log_double getLikelihood() const {return _traln.getLikelihood(); }
+  void setLikelihood(log_double lnl) { _traln.setLikelihood(lnl); } 
+  void setLnPr(log_double lnPr) { _lnPr = lnPr;  }
+  log_double getLnPr() const {return _lnPr; }
+  const PriorBelief& getPrior() const  {return _prior; } 
+  void updateProposalWeights(); 
+  
+  const std::vector<ProposalSet>& getProposalSets() const {return _proposalSets; } 
+
+  /**
+     @brief the chains determines the virtual root needed by the next
+     generation
+   */
+  BranchPlain peekNextVirtualRoot(TreeAln &traln, Randomness rand) ; 
+
+  friend void swap(Chain &lhs, Chain &rhs); 
+  friend void swapHeatAndProposals(Chain &chainA, Chain& chainB) ; 
+
+  // STUBS
+  // currently only here to implement the interface. maybe remove at
+  // some point alltogether
+  virtual void deserialize( std::istream &in ); 
+  virtual void serialize( std::ostream &out) const ; 
+
+  friend std::ostream& operator<<(std::ostream& out, const Chain &rhs); 
+  
+  void applyParameterContents( std::unordered_map<AbstractParameter*,ParameterContent> param2content)  ; 
+
+  // HACK 
+  void resetParamPtr(); 
+
+private : 			// METHODS 
+  AbstractProposal& drawProposalFunction(Randomness &rand);
+  ProposalSet& drawProposalSet( Randomness &rand); 
+  void printArrayStart(); 
+
+  void stepSingleProposal(); 
+  void stepSetProposal();
+
+private: 			// ATTRIBUTES
+  TreeAln _traln; 
+  double _deltaT; 		// this is the global heat parameter that defines the heat increments  
+  int _runid; 
+  int _tuneFrequency; 		// TODO should be have per-proposal tuning?   
+  log_double _hastings;  		// logged!
+  uint64_t _currentGeneration; 
+  /// indicates how hot the chain is (i = 0 => cold chain), may change!
+  nat _couplingId;					     // CHECKPOINTED 
+  std::vector< std::unique_ptr<AbstractProposal> > _proposals; 
+  std::vector<ProposalSet> _proposalSets; 
+  Randomness _chainRand;
+  double _relWeightSumSingle;
+  double _relWeightSumSets;   
+  PriorBelief _prior; 
+  log_double _bestState; 
+  LikelihoodEvaluator _evaluator;   
+  
+  // suspending and resuming the chain   
+  log_double _lnPr; 	
+
+  ParameterList _params; 
+}; 
+
+#endif
diff --git a/src/mcmc/CoupledChains.cpp b/src/mcmc/CoupledChains.cpp
new file mode 100644
index 0000000..ce2ba83
--- /dev/null
+++ b/src/mcmc/CoupledChains.cpp
@@ -0,0 +1,550 @@
+#include <sstream>
+
+#include "PendingSwap.hpp"
+#include "CoupledChains.hpp"   
+#include "Chain.hpp"
+#include "GlobalVariables.hpp"
+#include "AbstractProposal.hpp"
+#include "PriorBelief.hpp"
+// #include "time.hpp"
+#include "ParallelSetup.hpp"
+
+#include "common.h"
+
+// #define VERBOSE 
+
+#ifdef VERBOSE
+#include <unistd.h>
+#endif
+
+
+CoupledChains::CoupledChains(Randomness randI, int runNum, string workingdir, std::string runname, int numCoupled,  std::vector<Chain> chains   )
+  : _chains(chains)
+  , _swapInfo(nat(_chains.size()))
+  , _heatIncrement(0.1) 
+  , _rand(randI)
+  , _runid(runNum) 
+  , _samplingFreq(100)
+  , _runname(runname) 
+  , _workdir(workingdir)
+  , _paramId2TopFile{}
+  , _pFile{}
+  , _numSwapsPerGen(1.0)
+{  
+  auto &params = _chains[0].getParameterList(); 
+
+  AbstractParameter* topoParamUnfixed = nullptr; 
+  auto blParamsUnfixed = std::vector<AbstractParameter*>{}; 
+  for( auto &param : params)
+    {
+      if(param->getCategory() == Category::BRANCH_LENGTHS && param->getPrior()->needsIntegration()  )
+	blParamsUnfixed.push_back(param); 
+      else if(param->getCategory() == Category::TOPOLOGY && param->getPrior()->needsIntegration() ) 
+	topoParamUnfixed = param;
+    }
+
+  if(blParamsUnfixed.size() > 0)
+    {
+      nat ctr = 0; 
+      for(auto &param : blParamsUnfixed)
+	{
+	  _paramId2TopFile.insert(std::make_pair(param->getId(), TopologyFile(workingdir, _runname, _runid,0, ctr, blParamsUnfixed.size() > 1))); 
+	  ++ctr; 
+	}
+    }
+  else if(topoParamUnfixed != nullptr)
+    _paramId2TopFile.insert(std::make_pair(topoParamUnfixed->getId(), TopologyFile(workingdir, _runname, _runid,0, 0, false))); 
+
+  _pFile.emplace_back(_workdir, _runname,_runid); 
+}
+
+
+void CoupledChains::initializeOutputFiles(bool isDryRun)  
+{  
+  // TODO sampling file for every chain possibly 
+  auto &traln = _chains[0].getTralnHandle(); 
+  auto &params = _chains[0].getParameterList();
+
+  auto tag =  _rand.getKey();
+
+  for(auto &elem : _paramId2TopFile)
+    elem.second.initialize(traln, tag.v[0], isDryRun); 
+  
+  _pFile[0].initialize(traln, params, tag.v[0] ,isDryRun); 
+  
+}
+
+
+PendingSwap CoupledChains::prepareSwap(ParallelSetup &pl, const SwapElem& theSwap)
+{
+  auto flags = CommFlag::PRINT_STAT | CommFlag::PROPOSALS; 
+
+  auto myId = theSwap.getMyId(pl,_runid); 
+
+  auto &&oss = std::ostringstream{};
+  _chains[myId].serializeConditionally(oss,flags);
+
+  auto mySer = std::vector<char>{}; 
+  auto str = oss.str();
+  mySer.insert(end(mySer), begin(str), end(str));
+
+  auto isLocal =   pl.swapIsLocal( theSwap.getOne(), theSwap.getOther(), _runid); 
+
+  auto&& result = PendingSwap(theSwap, isLocal); 
+  result.initialize(pl, mySer, _runid);
+  return std::move(result); 
+}
+
+
+bool CoupledChains::doSwap(ParallelSetup &pl, const SwapElem &theSwap )
+{  
+  int numChain = int(_chains.size()); 
+  assert(numChain > 1 ); 
+
+  auto flags = CommFlag::PRINT_STAT | CommFlag::PROPOSALS; 
+
+  int cAIndex = theSwap.getOne() ; 
+  int cBIndex = theSwap.getOther()  ; 
+
+  assert(  pl.isMyChain(_runid, cAIndex) ||    pl.isMyChain(_runid,cBIndex)) ; 
+
+  if( not pl.isMyChain(_runid, cAIndex) )
+    std::swap(cAIndex, cBIndex); 
+
+  auto& a = _chains[cAIndex];
+  auto& b = _chains[cBIndex];
+
+  bool mineHasSmallerId = a.getCouplingId() < b.getCouplingId();
+  bool bothAreMine = pl.isMyChain(_runid, cAIndex) && pl.isMyChain(_runid, cBIndex);
+
+  auto aSer = std::string{}; 
+  auto bSer = std::string{}; 
+
+  if(not bothAreMine)
+    {
+      auto &&ass = std::ostringstream{}; 
+      a.serializeConditionally( ass, flags ); 
+      bSer = pl.sendRecvChain(*this, cAIndex, cBIndex, ass.str(), flags);
+      auto &&iss = std::istringstream{bSer};
+      b.deserializeConditionally(iss, flags); 
+    }
+
+  assert(a.getGeneration() == b.getGeneration()); 
+  assert(b.getChainHeat() <= 1. && a.getChainHeat() <= 1.); 
+
+  auto 
+    aB = exponentiate( (  a.getLikelihood() * a.getLnPr()) , b.getChainHeat()),
+    bA = exponentiate(b.getLikelihood() * b.getLnPr() , a.getChainHeat()),
+    aA = exponentiate(a.getLikelihood() * a.getLnPr() , a.getChainHeat()),
+    bB = exponentiate(b.getLikelihood() * b.getLnPr() , b.getChainHeat());
+
+  double accRatio = min(   log_double(( aB * bA )  / (aA * bB )).toAbs(),   1.0); 
+
+  nat coupIdA = a.getCouplingId(), 
+    coupIdB = b.getCouplingId(); 
+
+  /* do the swap */
+  double r = theSwap.getR();
+  bool didAccept = r < accRatio;   
+  if( didAccept )
+    {
+      // tout << "SWAP" << std::endl; 
+
+      swapHeatAndProposals(a,b);
+
+      // this is necessary because of the chains owning the parameters
+      // (and e.g., tuning params for bldistgamma), but the proposals
+      // having only pointers to them. (nicer design required)
+      a.resetParamPtr();
+      b.resetParamPtr();
+    }
+
+  // update swap matrix: if the other chain did not belong to us and
+  // our id was greater, do not store the info
+  if(bothAreMine || mineHasSmallerId)
+    _swapInfo.update(coupIdA,coupIdB,didAccept); 
+
+  return didAccept; 
+}
+
+
+bool CoupledChains::doLocalSwap(ParallelSetup &pl, const SwapElem &theSwap )
+{  
+  int numChain = int(_chains.size()); 
+  assert(numChain > 1 ); 
+
+  int cAIndex = theSwap.getOne() ; 
+  int cBIndex = theSwap.getOther()  ; 
+
+  assert(  pl.isMyChain(_runid, cAIndex) ||    pl.isMyChain(_runid,cBIndex)) ; 
+
+  if( not pl.isMyChain(_runid, cAIndex) )
+    std::swap(cAIndex, cBIndex); 
+
+  auto& a = _chains[cAIndex];
+  auto& b = _chains[cBIndex];
+
+  bool mineHasSmallerId = a.getCouplingId() < b.getCouplingId();
+  bool bothAreMine = pl.isMyChain(_runid, cAIndex) && pl.isMyChain(_runid, cBIndex);
+
+  assert(a.getGeneration() == b.getGeneration()); 
+  assert(b.getChainHeat() <= 1. && a.getChainHeat() <= 1.); 
+
+  auto aB = exponentiate((a.getLikelihood() * a.getLnPr()) , b.getChainHeat()),
+    bA = exponentiate((b.getLikelihood() * b.getLnPr()) , a.getChainHeat()),
+    aA = exponentiate((a.getLikelihood() * a.getLnPr()) , a.getChainHeat()),
+    bB = exponentiate((b.getLikelihood() * b.getLnPr()) , b.getChainHeat());
+
+  double accRatio = min(   log_double(( aB * bA )  / (aA * bB )).toAbs(),1.0); 
+
+  nat coupIdA = a.getCouplingId(), 
+    coupIdB = b.getCouplingId(); 
+
+  /* do the swap */
+  double r = theSwap.getR();
+  bool didAccept = r < accRatio;   
+  if( didAccept )
+    {
+      // tout << "SWAP" << std::endl; 
+      swapHeatAndProposals(a,b);
+      a.resetParamPtr();
+      b.resetParamPtr();
+    }
+
+  // update swap matrix: if the other chain did not belong to us and
+  // our id was greater, do not store the info
+  if(bothAreMine || mineHasSmallerId)
+    _swapInfo.update(coupIdA,coupIdB,didAccept); 
+
+  return didAccept; 
+}
+
+
+std::list<SwapElem>
+CoupledChains::generateSwapsForBatch(uint64_t startGen, uint64_t numGen) 
+{
+  auto allSwaps = std::list<SwapElem>{}; 
+  if( _chains.size() > 1  )
+    {
+      for(auto i  = startGen; i < startGen + numGen; ++i)
+	{
+	  auto gen = i + 1; 
+	  _rand.rebaseForGeneration(gen); 
+
+	  double n = 2. * double(_chains.size()) * _numSwapsPerGen; 
+	  if(nat(n) == 0)	// CORRECT???
+	    n = double(_chains.size()); 
+	  double p = _numSwapsPerGen / n; 
+
+	  auto numSwaps = nat(_rand.drawBinomial(p,nat(n))); 
+
+	  for(nat j = 0; j < numSwaps; ++j)
+	    {
+	      auto cAIndex = _rand.drawIntegerOpen(_chains.size()) ; 
+	      auto cBIndex = _rand.drawIntegerOpen(_chains.size()-1); 
+	      if(cAIndex == cBIndex)
+		cBIndex = _chains.size()-1; 
+
+	      if(cAIndex > cBIndex)
+		std::swap(cAIndex, cBIndex); 
+
+	      double r = _rand.drawRandDouble01();
+	      allSwaps.emplace_back(gen,cAIndex, cBIndex,r); 
+	    }
+	}
+    }
+  return allSwaps; 
+}
+
+
+void CoupledChains::doStep(nat id, ParallelSetup &pl)
+{
+  auto &chain = _chains[id]; 
+  chain.step();
+#ifdef VERBOSE
+  std::cout << "STEP " << id << "\t" << chain.getGeneration() << std::endl; 
+#endif
+  if(   std::fabs(chain.getChainHeat() - 1.) < std::numeric_limits<double>::epsilon()
+     && chain.getGeneration() % _samplingFreq == 0 
+     && pl.isChainLeader())
+    chain.sample(_paramId2TopFile, _pFile[0]);
+}
+
+
+
+bool CoupledChains::allMyChainsAreBlocked( const std::vector<bool> &isBlocked, const ParallelSetup& pl ) const 
+{
+  auto result = true;  
+  for(nat i = 0; i < isBlocked.size();  ++i)
+    {
+      if(pl.isMyChain(_runid,i))
+	result &= isBlocked.at(i); 
+    }
+  return result; 
+}
+
+
+static void block(std::vector<bool> &isBlocked, nat num)
+{
+  isBlocked[num] = true; 
+}
+
+static void unblock(std::vector<bool> &isBlocked, nat num)
+{
+  isBlocked[num] = false; 
+}
+
+
+void CoupledChains::executePart(uint64_t startGen, uint64_t numGen, ParallelSetup& pl)
+{
+  assert(pl.isMyRun(getRunid())); 
+
+  for(nat i = 0; i < _chains.size(); ++i)
+    {
+      if(pl.isMyChain(_runid, i))
+	_chains[i].resume();
+    }
+
+  // additional sampling, if we are in the very first generation 
+  if(startGen == 0)
+    {
+      nat ctr = 0;  
+      for(auto &c : _chains)
+	if( std::fabs(c.getChainHeat() -  1.  ) < std::numeric_limits<double>::epsilon()
+	    && pl.isChainLeader() && pl.isMyChain(_runid, ctr) )
+	  {
+	    c.sample(_paramId2TopFile, _pFile[0]); 
+	    ++ctr; 
+	  }
+    }
+
+  auto allSwaps = generateSwapsForBatch(startGen, numGen);
+
+  for(nat i = 0; i < _chains.size() ; ++i)
+    {
+      if(pl.isMyChain(_runid, i))
+	{
+	  if(_chains[i].getGeneration() != startGen)
+	    {
+	      tout << "problem at START was="<< _chains[i].getGeneration() << ", should be=" << startGen << std::endl; 
+	      assert(0 ); 
+	    }
+	}
+    }
+
+  auto pendingSwaps = std::list<PendingSwap>{}; 
+  auto swapsToBeDeleted = std::list<PendingSwap>{}; 
+
+  auto flags = CommFlag::PRINT_STAT | CommFlag::PROPOSALS; 
+  while(not allSwaps.empty() ||  not pendingSwaps.empty())
+    {
+      auto isBlocked = std::vector<bool>( _chains.size(),false ); 
+
+      for(auto &elem : pendingSwaps)
+	{
+	  block(isBlocked, elem.getSwap().getOne()) ;
+	  block(isBlocked, elem.getSwap().getOther()); 
+	}
+
+
+#ifdef VERBOSE
+      std::cout << "PENDING:\t" ; 
+      for(auto &elem : pendingSwaps)
+	std::cout << "{" << elem.getSwap() << "}\t" ; 
+      std::cout << std::endl; 
+
+      std::cout << "BLOCKED:\t"; 
+      for(auto elem : isBlocked)
+	std::cout << ( elem ? "true" : "false")  << ","; 
+      std::cout << std::endl; 
+#endif
+
+      // check, if a request completed 
+      {
+	auto psIter = begin(pendingSwaps); 
+	while(psIter != end(pendingSwaps))
+	  {
+	    if(psIter->allHaveReceived(pl))
+	      {
+		auto serializedRemote = psIter->getRemoteData();
+
+		auto swap = psIter->getSwap(); 
+		auto remoteId = swap.getRemoteId(pl,_runid);
+		auto myId = swap.getMyId(pl,_runid);
+
+#ifdef VERBOSE
+		std::cout << "swap finished: " << swap << std::endl;
+#endif
+
+		// MEH 
+		auto &&iss = std::istringstream(std::string(begin(serializedRemote), end(serializedRemote))); 
+		_chains[remoteId].deserializeConditionally(iss, flags);
+
+		assert(_chains[remoteId].getGeneration() == swap.getGen() ); 
+		assert(_chains[myId].getGeneration() == swap.getGen()); 
+
+		doLocalSwap(pl, swap);
+
+		unblock(isBlocked, myId);
+
+		auto &&elem = std::move(*psIter); 
+		swapsToBeDeleted.insert(end(swapsToBeDeleted), std::move(elem));
+
+		psIter = pendingSwaps.erase(psIter);
+	      }
+	    else 
+	      ++psIter; 
+	  }
+      }
+
+      // check, what can be deleted
+      {
+	auto psIter = begin(swapsToBeDeleted); 
+	while(psIter != end(swapsToBeDeleted))
+	  {
+	    if(psIter->isFinished())
+	      psIter = swapsToBeDeleted.erase(psIter); 
+	    else 
+	      ++psIter; 
+	  }
+      }
+
+      auto swapIter = begin(allSwaps); 
+      while(swapIter != end(allSwaps) && not allMyChainsAreBlocked(isBlocked,pl))
+	{
+	  auto swap = *swapIter; 
+
+	  auto one = swap.getOne(); 
+	  auto other = swap.getOther();
+	  auto gen = swap.getGen();
+
+	  auto bothAreMine = swap.bothAreMine(pl,_runid); 
+	  auto oneIsMine = swap.onlyOneIsMine(pl, _runid);
+	  
+	  if(not bothAreMine && not oneIsMine )
+	    {
+	      swapIter = allSwaps.erase(swapIter); 
+	      continue; 
+	    }
+	  else if(oneIsMine)
+	    {
+	      nat myId = swap.getMyId(pl, _runid);
+	      while(  not isBlocked[myId] &&  _chains[myId].getGeneration() < gen)
+		doStep(myId, pl); 
+
+	      if(not isBlocked[myId] && gen == _chains[myId].getGeneration())
+		{
+		  pendingSwaps.insert(end(pendingSwaps), std::move(prepareSwap(pl, swap))); 
+#ifdef VERBOSE
+		  std::cout << "QUEUED " << swap << std::endl; 
+#endif
+		  swapIter = allSwaps.erase(swapIter);
+		}
+	      else 
+		{
+		  ++swapIter; 
+		}
+	      
+	      block(isBlocked, myId); 
+	    }
+	  else 
+	    {
+	      while( not isBlocked[one] && _chains[one].getGeneration() < gen)
+		doStep(one,pl); 
+	      while( not isBlocked[other] && _chains[other].getGeneration() < gen) 
+		doStep(other,pl); 
+
+	      if(not isBlocked[one] && not isBlocked[other]  
+		 && gen == _chains[one].getGeneration() && gen == _chains[other].getGeneration())
+		{
+		  doSwap(pl, swap);
+		  swapIter = allSwaps.erase(swapIter);
+#ifdef VERBOSE
+		  std::cout << "LOCAL " << swap << std::endl; 
+#endif
+		}
+	      else 
+		{
+		  block(isBlocked, one); 
+		  block(isBlocked, other); 
+
+		  ++swapIter; 
+		}
+	    }
+	}
+
+#ifdef VERBOSE      
+      std::cout << std::endl; 
+      sleep(1); 
+#endif
+    }
+
+  // execute remaining steps
+  for(nat i = 0; i < _chains.size() ; ++i)
+    {
+      if(pl.isMyChain(_runid, i))
+	{
+	  while(_chains[i].getGeneration() < startGen + numGen)
+	    doStep(i,pl);
+	}
+    }
+  
+  for(nat i = 0; i < _chains.size(); ++i)
+    {
+      auto &chain = _chains[i]; 
+      
+      if(pl.isMyChain(_runid,i))
+  	{
+
+	  if(_chains[i].getGeneration() != startGen + numGen)
+	    {
+	      tout << "problem at END was="<< _chains[i].getGeneration() << ", should be=" << startGen << std::endl; 
+	      assert(0 ); 
+	    }
+
+  	  // assert(chain.getGeneration() == startGen + numGen); 
+  	  chain.suspend();
+  	}
+    }
+}
+
+
+void CoupledChains::deserialize( std::istream &in ) 
+{
+  _rand.deserialize(in); 
+  _swapInfo.deserialize(in);
+  for(auto &chain : _chains)
+    chain.deserialize(in);
+} 
+
+
+void CoupledChains::serialize( std::ostream &out)   const
+{
+  _rand.serialize(out);
+  _swapInfo.serialize(out);
+  for(auto &chain : _chains)
+    chain.serialize(out); 
+}   
+
+
+void CoupledChains::regenerateOutputFiles(std::string workdir, std::string prevId) 
+{
+  auto gen = _chains[0].getGeneration();
+  for(auto &pF : _pFile)
+    pF.regenerate(workdir, prevId, gen); 
+  for(auto &elem : _paramId2TopFile)
+    elem.second.regenerate(workdir, prevId, gen); 
+} 
+
+
+std::vector<std::string> CoupledChains::getAllFileNames() const 
+{
+  auto result = std::vector<std::string>{}; 
+  for(auto &elem : _paramId2TopFile)
+    result.push_back(elem.second.getFileName());
+  for(auto &elem : _pFile)
+    result.push_back(elem.getFileName()); 
+  
+  return result; 
+} 
+
diff --git a/src/mcmc/CoupledChains.hpp b/src/mcmc/CoupledChains.hpp
new file mode 100644
index 0000000..fa97142
--- /dev/null
+++ b/src/mcmc/CoupledChains.hpp
@@ -0,0 +1,109 @@
+/**
+   @file CoupledChains.hpp 
+
+   represents a run (consisting of a number of coupled chains) 
+   
+ */
+
+
+#ifndef _COUPLED_CHAINS_H
+#define _COUPLED_CHAINS_H
+
+#include <queue>
+
+#include "TreeAln.hpp"
+#include "Randomness.hpp"
+#include "BlockRunParameters.hpp"
+#include "Chain.hpp"
+#include "SuccessCounter.hpp"
+#include "TopologyFile.hpp"
+#include "ParameterFile.hpp"
+#include "SwapMatrix.hpp"
+#include "SwapElem.hpp"
+
+class PendingSwap; 
+class ParallelSetup;
+
+/**
+   @brief represents some coupled chains, one of them cold, many of
+   them hot
+ */ 
+
+class CoupledChains : public Serializable
+{
+public: 
+  ////////////////
+  // LIFE CYCLE //
+  ////////////////
+  CoupledChains(Randomness rand, int runNum, string workingdir, std::string runname, int numCoupled,  vector<Chain> chains ); 
+  CoupledChains(CoupledChains&& rhs) = default; 
+  CoupledChains(const CoupledChains& rhs) = default; 
+  CoupledChains& operator=(const CoupledChains& rhs) = default; 
+  CoupledChains& operator=(CoupledChains&& rhs) = default; 
+
+  // friend void swap(CoupledChains &lhs, CoupledChains& rhs ); 
+
+  // void deleteMyFiles() const ; 
+
+  /**
+     @brief run for a given number of generations
+  */
+  void run(uint64_t numGen); 
+
+  /** 
+      @brief Execute a portion of one run. 
+  */
+  void executePart(uint64_t startGen, uint64_t numGen, ParallelSetup& pl); 
+  void doStep(nat id, ParallelSetup &pl); 
+  void setSamplingFreq(nat i) {_samplingFreq = i; }
+  void setHeatIncrement(double temp ) { _heatIncrement = temp ; } 
+  void setTemperature(double temp ){_heatIncrement = temp;  } 
+  std::vector<Chain>& getChains() {return _chains; } 
+  nat getRunid()  const {return _runid; }
+  const vector<Chain>& getChains() const {return _chains; }
+  size_t getNumberOfChains(){return _chains.size();}
+  void setNumSwapsPerGen(double s){_numSwapsPerGen = s; }
+  void setRunName(string a) {_runname = a;  }
+  void initializeOutputFiles(bool isDryRun)  ; 
+  SwapMatrix getSwapInfo() const {return _swapInfo; }
+  void setSwapInfo(SwapMatrix swap){ _swapInfo = swap; }
+  void addToSwapMatrix(const SwapMatrix &toAdd){ _swapInfo = _swapInfo + toAdd;  }
+  const Randomness& getRandomness() const {return _rand; }
+  std::vector<std::string> getAllFileNames() const ; 
+
+  virtual void deserialize( std::istream &in ) ; 
+  virtual void serialize( std::ostream &out) const ;   
+
+  void regenerateOutputFiles(std::string _workdir, std::string prevId) ; 
+  std::list<SwapElem> generateSwapsForBatch(uint64_t startGen, uint64_t numGen) ; 
+  
+private: 			// METHODS
+  /**
+     @brief attempt to swap two _chains
+  */ 
+  bool allMyChainsAreBlocked( const std::vector<bool> &isBlocked, const ParallelSetup& pl ) const ; 
+  bool doLocalSwap(ParallelSetup &pl, const SwapElem &theSwap ); 
+  bool doSwap( ParallelSetup &pl, const SwapElem& elem ); 
+
+  PendingSwap prepareSwap(ParallelSetup &pl, const SwapElem& theSwap); 
+
+private: 			// ATTRIBUTES
+  std::vector<Chain> _chains; 
+  SwapMatrix _swapInfo; 
+  double _heatIncrement; 	
+  Randomness _rand; 
+  int _runid; 
+  int _samplingFreq; 
+  string _runname; 
+  string _workdir; 
+
+  // order is coupled to the heat id  
+  std::unordered_map<nat,TopologyFile> _paramId2TopFile; 
+  std::vector<ParameterFile> _pFile; 
+
+  double _numSwapsPerGen; 
+}; 
+
+#endif
+
+
diff --git a/src/mcmc/ParameterList.cpp b/src/mcmc/ParameterList.cpp
new file mode 100644
index 0000000..df49223
--- /dev/null
+++ b/src/mcmc/ParameterList.cpp
@@ -0,0 +1,66 @@
+#include "ParameterList.hpp"
+
+
+ParameterList::ParameterList(std::vector< std::unique_ptr<AbstractParameter> > params) 
+  : _params{std::move(params)}
+  , _paramView{}
+  {
+    for(auto &p : _params)
+      _paramView.push_back(p.get()); 
+  }
+
+
+ParameterList::ParameterList(const ParameterList& rhs)  
+  : _params{}
+  , _paramView{}
+  {
+    for(auto &p : rhs._params)
+      _params.emplace_back(p->clone());
+    for(auto &p : _params)
+      _paramView.push_back(p.get());
+    
+  } 
+  
+ParameterList& ParameterList::operator=(ParameterList rhs)
+{
+  swap(*this, rhs); 
+  return *this; 
+}
+
+void swap(ParameterList& lhs, ParameterList& rhs)
+{
+  std::swap(lhs._params, rhs._params);
+  std::swap(lhs._paramView, rhs._paramView); 
+}
+
+
+
+std::ostream& operator<<(std::ostream& s, const ParameterList& c) 
+{
+  for(auto &p : c._paramView)
+    {
+      if(dynamic_cast<BranchLengthsParameter*>(p) != nullptr)
+	{
+	  auto pc = dynamic_cast<BranchLengthsParameter*>(p); 
+	  auto cont = pc->getAttributes(); 
+	  s << SOME_FIXED_PRECISION << cont._convTuner.getParameter() ;
+	  s  << "," << cont._nonConvTuner.getParameter();
+	}
+    }
+  return s;
+}
+
+
+
+std::vector<AbstractParameter*> ParameterList::getViewByCategory(Category cat) const 
+{
+  auto result = std::vector<AbstractParameter*>{}; 
+
+  for(auto &p : _paramView)
+    {
+      if(p->getCategory() == cat)
+	result.push_back(p);
+    }
+
+  return result; 
+} 
diff --git a/src/mcmc/ParameterList.hpp b/src/mcmc/ParameterList.hpp
new file mode 100644
index 0000000..21c6038
--- /dev/null
+++ b/src/mcmc/ParameterList.hpp
@@ -0,0 +1,46 @@
+#ifndef _PARAMETER_SET_HPP 
+#define _PARAMETER_SET_HPP 
+
+#include "AbstractParameter.hpp"
+#include "BranchLengthsParameter.hpp"
+
+/** 
+    @brief represents a set of parameters, that we integrate over 
+    
+    this object owns the respective parameters   
+ */ 
+class ParameterList
+{
+public: 
+  ParameterList(std::vector< std::unique_ptr<AbstractParameter> > params  = std::vector< std::unique_ptr<AbstractParameter> >{}) ; 
+  ~ParameterList(){}
+  ParameterList(ParameterList&& rhs) = default; 
+  ParameterList(const ParameterList& rhs)  ; 
+
+  ParameterList& operator=(ParameterList rhs); 
+
+  friend void swap(ParameterList& lhs, ParameterList& rhs); 
+
+  // boring stuff to make it behave like a container 
+  const AbstractParameter* at(int num) const { return _paramView.at(num); }
+  AbstractParameter* at(int num) {return _paramView.at(num); }
+  std::vector<AbstractParameter*>::const_iterator begin() const { return _paramView.cbegin(); }
+  std::vector<AbstractParameter*>::const_iterator end() const { return _paramView.cend(); }
+  std::vector<AbstractParameter*>::iterator begin() { return _paramView.begin(); }
+  std::vector<AbstractParameter*>::iterator end() { return _paramView.end(); }
+  AbstractParameter* operator[] (int num) { return _paramView.at(num); }
+  const AbstractParameter* operator[] (int num) const { return _paramView.at(num); }
+  
+  friend std::ostream& operator<<(std::ostream& s, const ParameterList& c) ; 
+
+  
+  std::vector<AbstractParameter*> getViewByCategory(Category cat) const ; 
+
+private: 
+  std::vector< std::unique_ptr<AbstractParameter> > _params; 
+  std::vector<AbstractParameter*> _paramView; 
+};  
+
+
+
+#endif
diff --git a/src/mcmc/SampleMaster.cpp b/src/mcmc/SampleMaster.cpp
new file mode 100644
index 0000000..494dba6
--- /dev/null
+++ b/src/mcmc/SampleMaster.cpp
@@ -0,0 +1,1333 @@
+#include <sstream>
+#include <fstream>
+#include <memory>
+#include <algorithm>
+
+#include "ByteFile.hpp"
+#include "TreePrinter.hpp"
+#include "BasicTreeReader.hpp"
+#include "BlockProposalConfig.hpp"
+#include "BlockRunParameters.hpp"
+#include "ConfigReader.hpp"
+
+#include "TopologyParameter.hpp"
+#include "RevMatParameter.hpp"	
+#include "FrequencyParameter.hpp"
+
+#include "MemoryMode.hpp"
+#include "SampleMaster.hpp"
+#include "TreeRandomizer.hpp"
+#include "RunFactory.hpp"	
+
+#include "GlobalVariables.hpp"
+
+#include "BoundsChecker.hpp"
+#include "ArrayRestorer.hpp"
+#include "SplitFreqAssessor.hpp"
+
+#include "FullCachePolicy.hpp"
+#include "NoCachePolicy.hpp"
+
+
+#include "AlignmentPLL.hpp"
+
+#include "NodeAge.hpp"
+
+#include "DivergenceTimes.hpp"
+#include "DivergenceRates.hpp"
+
+using std::endl; 
+using std::vector;
+using std::unique_ptr; 
+using std::move; 
+using std::get; 
+
+
+SampleMaster::SampleMaster( size_t numCpu) 
+  : _runs{}
+  , _plPtr{nullptr}
+  , _runParams{}
+  , _cl{}
+  , _diagFile{}
+  , _timeTracker{numCpu}
+  , _printTime{numCpu}
+{
+}
+
+
+bool SampleMaster::initializeTree(TreeAln &traln, std::string startingTree, Randomness &treeRandomness, const vector<AbstractParameter*> &params)
+{  
+  bool hasBranchLength = false; 
+  if(startingTree.compare("") != 0 )
+    {
+      pllInstance * instance = &(traln.getTrHandle());
+      pllNewickTree * newickTree = pllNewickParseString(startingTree.c_str());
+      pllTreeInitTopologyNewick(instance, newickTree, PLL_TRUE);
+    }
+  else
+    {	      
+      if(_runParams.isUseParsimonyStarting())
+	TreeRandomizer::createParsimonyTree(traln, treeRandomness, *_plPtr); 
+      else
+	TreeRandomizer::randomizeTree(traln, treeRandomness); 
+    }
+
+  return hasBranchLength; 
+}
+
+
+
+std::vector<bool> 
+SampleMaster::initTrees(vector<TreeAln> &trees, randCtr_t seed, vector<std::string> startingTreeStrings, const vector<AbstractParameter*> &params)
+{  
+  auto hasBl = vector<bool>{}; 
+
+  nat treesConsumed = 0; 
+  auto treeRandomness = Randomness(seed); 
+
+  auto treesToInitialize = vector<TreeAln*>{}; 
+  treesToInitialize.push_back(&(trees[0])); 
+  if(not _runParams.isHeatedChainsUseSame())
+    {
+      for(auto iter =  trees.begin() + 1  ; iter < trees.end(); ++iter)
+	treesToInitialize.push_back(&(*iter)); 
+    }
+
+  // choose how to initialize the topology
+  for(auto &tralnPtr : treesToInitialize)
+    {
+      auto stTr = treesConsumed < startingTreeStrings.size() ? startingTreeStrings.at(treesConsumed) : std::string{""}; 
+      ++treesConsumed;
+      
+      auto hadBl = initializeTree(*tralnPtr, stTr, treeRandomness, params); 
+      hasBl.push_back(hadBl); 
+    }
+
+  // propagate the tree to the coupled chains, if necessary
+  if(_runParams.isHeatedChainsUseSame())
+    {
+      auto &ref =  trees[0]; 
+      bool isFirst = true; 
+      for(auto& treePtr : trees)
+	{
+	  if(isFirst )
+	    isFirst = false; 
+	  else 
+	    treePtr  = ref;
+	}
+    }
+  
+  return hasBl; 
+}
+
+
+void SampleMaster::printAlignmentInfo(const TreeAln &traln)
+{
+  tout << endl << "The (binary) alignment file you provided, consists of the following\n" 
+       << "partitions:" 
+       << endl;
+  
+  for(nat i = 0 ;i < traln.getNumberOfPartitions() ;++i)
+    {
+      auto& partition = traln.getPartition(i);       
+      nat length = partition.getUpper() - partition.getLower(); 
+      
+      tout << endl; 
+
+      tout << "number:\t\t" << i << endl;     
+      tout << "name:\t\t" << partition.getName() << endl; 
+      tout << "#patterns:\t" << length << endl;       
+
+      switch(partition.getDataType())
+	{
+	case PLL_BINARY_DATA : 
+	  tout << "type:\t\tBINARY" << std::endl; 
+	  break; 
+	case PLL_DNA_DATA: 
+	  tout << "type:\t\tDNA" << endl; 
+	  break; 
+	case PLL_AA_DATA: 
+	  tout << "type:\t\tAA" << endl; 
+	  break; 
+	default : 
+	  assert(0); 
+	}      
+    }
+  tout << "\nParameter names will reference the above partition numbers."
+       << endl
+       << "================================================================"
+       << endl  ; 
+}
+
+
+void SampleMaster::informPrint()
+{
+  if(not isYggdrasil && _plPtr->getRunsParallel()  > 1)
+    {
+      tout << "Will execute "<< _plPtr->getRunsParallel() << " runs in parallel." << endl;       
+      if(nat (_runParams.getNumRunConv()) < _plPtr->getRunsParallel())
+	{
+	  tout 
+	    << "Error: in the configuration file you specified to run " <<  _runParams.getNumRunConv() << " independent\n" 
+	    << "runs. Your command line indicates, that you want to run " << _plPtr->getRunsParallel() << " of them\n"
+	    << "in parallel. To shield you from surprises, " << PROGRAM_NAME << " will conservatively abort."<< endl; 
+	  exitFunction(-1, true); 
+	}
+    }
+
+  if(not isYggdrasil && _plPtr->getChainsParallel() > 1)
+    {
+      tout << "Will execute " << _plPtr->getChainsParallel() << " chains in parallel."<< endl; 
+      if(nat(_runParams.getNumCoupledChains()) < _plPtr->getChainsParallel())	
+	{
+	  tout
+	    << "Error: in the configuration file you specified to run " <<  _runParams.getNumCoupledChains() << " coupled\n" 
+	    << "chains per run. Your command line indicates, that you want to run " << _plPtr->getChainsParallel() << " of them\n"
+	    << "in parallel. To shield you from surprises, " << PROGRAM_NAME << " will conservatively abort."<< endl; 
+	  exitFunction(-1, true); 
+	}
+    }
+
+  tout << endl; 
+}
+
+
+void SampleMaster::initializeFromCheckpoint()
+{
+  // continue from checkpoint  
+
+  auto prevId = _cl.getCheckpointId(); 
+      
+  auto &&ss = std::stringstream{} ;       
+  ss << _cl.getWorkdir() << ( _cl.getWorkdir().compare("") == 0  ? "" : "/") 
+     << PROGRAM_NAME << "_checkpoint." << _cl.getCheckpointId();       
+  auto checkPointFile = ss.str(); 
+  auto &&chkpnt = std::ifstream{} ; 
+  Serializable::getIfstream(checkPointFile, chkpnt); 
+  if( not chkpnt )
+    {
+      tout  << "Warning! Could not open / find file " << checkPointFile << endl; 
+      tout << "Although extremely unlikely, the previous run may have been killed\n"
+	   << "during the writing process of the checkpoint. Will try to recover from backup..." << endl; 
+	  
+      ss.str(""); 
+      ss << PROGRAM_NAME << "_prevCheckpointBackup." << _cl.getCheckpointId();
+      checkPointFile = ss.str();	  
+      Serializable::getIfstream(checkPointFile, chkpnt); 
+	  
+      if( not chkpnt)
+	{
+	  tout << "Could not recover checkpoint file backup either. Probably there is no backup, since not enough generations have completed. Giving up. Please start a new run." << endl; 
+	  exitFunction(-1, false); 
+	}
+      else 
+	tout << "Success! You lost one checkpoint, but we can continue from the backup. " << endl; 	  
+    }
+
+  deserialize(chkpnt); 
+
+  if(_plPtr->isGlobalMaster())
+    {
+      for(auto &thisRun : _runs)
+	thisRun.regenerateOutputFiles(_cl.getWorkdir(), _cl.getCheckpointId());
+      auto curGen = _runs[0].getChains()[0].getGeneration();
+      _diagFile.regenerate(  _cl.getWorkdir(), _cl.getRunid(),  _cl.getCheckpointId(), 
+			     curGen);
+    }
+
+}
+
+
+// TODO could move this method somewhere else  
+LikelihoodEvaluator SampleMaster::createEvaluatorPrototype(const TreeAln &initTree, bool useSEV)
+{
+  auto &&plcy =  unique_ptr<ArrayPolicy>();
+  auto res = std::make_shared<ArrayReservoir>(useSEV); 
+  
+  switch(_cl.getMemoryMode())
+    {
+    case MemoryMode::RESTORE_ALL: 
+      {
+	plcy = unique_ptr<ArrayPolicy>(new FullCachePolicy(initTree, true, true));
+	if(useSEV)
+	  plcy->enableRestoreGapVector();
+      }
+      break; 
+    case MemoryMode::RESTORE_INNER_TIP: 
+      {
+	plcy = unique_ptr<ArrayPolicy>(new FullCachePolicy(initTree, false, true));
+	if(useSEV)
+	  plcy->enableRestoreGapVector();
+      }
+      break; 
+    case MemoryMode::RESTORE_INNER_INNER: 
+      {
+	plcy = unique_ptr<ArrayPolicy>(new FullCachePolicy(initTree, false, false));
+	if (useSEV)
+	  plcy->enableRestoreGapVector();
+      }
+      break; 
+    case MemoryMode::RESTORE_NONE: 
+      {
+	plcy = unique_ptr<ArrayPolicy>(new NoCachePolicy(initTree)); 
+      }
+      break; 
+    default: 
+      assert(0); 
+    }
+
+  auto eval = LikelihoodEvaluator(initTree, plcy.get(),res, _plPtr); 
+
+#ifdef DEBUG_LNL_VERIFY
+  auto dT = make_shared<TreeAln>(initTree.getNumberOfTaxa(), false);
+  eval.setDebugTraln(dT);
+#endif
+
+  return eval; 
+}
+
+
+void SampleMaster::initializeWithParamInitValues(TreeAln &traln , const ParameterList &params, bool hasBl) const 
+{
+  // we cannot have more than one set of branch lentghs. So if we had
+  // initial branch lengths, extract them first before changing the
+  // mean substition rate
+  auto branches = vector<std::tuple<BranchPlain,double>>{};
+
+  if( hasBl )
+    {
+      AbstractParameter* blParam = nullptr;
+      for(auto param : params)
+	{
+	  if(param->getCategory() == Category::BRANCH_LENGTHS)
+	    {
+	      blParam = param; 
+	      break; 
+	    }
+	}
+
+      for(auto b : traln.extractBranches())
+	{
+	  auto len = traln.getBranch(b, blParam).toMeanSubstitutions(blParam->getMeanSubstitutionRate()); 
+	  // tout << b << "\t" << len << endl; 
+	  branches.emplace_back( b, len ); 
+	}
+    }
+  else 
+    {
+      for(auto b : traln.extractBranches())
+	branches.emplace_back(b, 0.);
+    }
+
+  //  do normal parameters first 
+  for(auto &param : params)
+    {
+      auto cat = param->getCategory( ); 
+      auto datatype =  traln.getPartition(param->getPartitions()[0] ).getDataType(); 
+      
+      if( not ( cat == Category::TOPOLOGY || cat == Category::BRANCH_LENGTHS ) )
+	{
+	  // :NOTICE: treat prot frequencies differently!
+	  if(cat == Category::FREQUENCIES && datatype == PLL_AA_DATA ) 
+	    {
+	      for(auto p : param->getPartitions())
+		{
+		  auto& partition = traln.getPartition(p);
+		  partition.setProtFreqs(PLL_TRUE); 
+		}
+	    }
+	  
+	  // :NOTICE: rev mat parameters for aa-partitions must be prepared here! 
+	  if(cat == Category::SUBSTITUTION_RATES && datatype == PLL_AA_DATA)
+	    {
+	      for(auto p : param->getPartitions())
+		{
+		  auto &partition = traln.getPartition(p);
+		  partition.setProtModel(PLL_GTR); 
+		}
+	    }
+
+		if (cat != Category::DIVERGENCE_RATES)
+		{
+	  auto&& prior = param->getPrior(); 
+	  auto content = prior->getInitialValue();
+
+	  // TODO specific function for setting initially 
+	  param->verifyContent(traln, content); 
+	  // tout << "APPL " << content << endl; 
+
+	  param->applyParameter(traln, content); 
+	}
+    }
+    }
+
+
+  // initialize branches or convert to internal representation if
+  // necessary
+  for(auto &param : params)
+    {
+      auto cat = param->getCategory(); 
+      if(cat == Category::BRANCH_LENGTHS)
+	{
+	  param->updateMeanSubstRate(traln);
+
+	  auto &&prior = param->getPrior();
+	  auto content = prior->getInitialValue();
+	  auto initVal = content.values.at(0); 
+	  
+	  for(auto belem : branches)
+	    {
+	      auto absLen =  ( hasBl  && param->getPrior()->isKeepInitData() )  
+		? std::get<1>(belem) : initVal ;
+	      auto b = BranchLength(std::get<0>(belem),  InternalBranchLength::fromAbsolute(absLen, param->getMeanSubstitutionRate())); 
+
+	      if( not BoundsChecker::checkBranch(b))
+		{
+		  BoundsChecker::correctBranch(b); 
+		  auto newLen = b.toMeanSubstitutions(param->getMeanSubstitutionRate()); 
+		  tout << "Warning: had to modify branch length " << absLen << " to " << newLen << " because it violated the maximum range of branch lengths allowed." << endl; 
+		}
+
+	      traln.setBranch(b,param); 
+	    }
+	}
+    }
+
+  auto divRates = std::vector<AbstractParameter*>{}; 
+  auto divTimes = std::vector<AbstractParameter*>{}; 
+
+  for(auto & p : params)
+    {
+      if(p->getCategory() == Category::DIVERGENCE_RATES)
+	divRates.push_back(p); 
+      if(p->getCategory() == Category::DIVERGENCE_TIMES)
+	divTimes.push_back(p); 
+    }
+
+  if(divRates.size() > 0 )
+    {
+      // assert(divTimes.size() == 1 ); // not more than one time parameter !
+      makeTreeUltrametric(traln, divTimes, divRates);
+    }
+}
+
+static double traverseDepthFromRoot(TreeAln &traln, const BranchPlain &branch, std::vector<NodeAge *> & nodeAges) {
+
+	double currentHeight = nodeAges[branch.getPrimNode()-1]->getHeight();
+	nodeAges[branch.getPrimNode()-1]->setPrimNode(branch.getPrimNode());
+	nodeAges[branch.getPrimNode()-1]->setSecNode(branch.getSecNode());
+	if (!traln.isTipNode(branch.getPrimNode())) {
+
+		auto plainDescendants = traln.getDescendents(branch);
+
+		nodeAges[plainDescendants.first.getSecNode()-1]->setHeight(currentHeight+1.0);
+		nodeAges[plainDescendants.second.getSecNode()-1]->setHeight(currentHeight+1.0);
+
+		return std::max(
+				traverseDepthFromRoot(traln, plainDescendants.first.getInverted(), nodeAges),
+				traverseDepthFromRoot(traln, plainDescendants.second.getInverted(), nodeAges)
+				);
+	} else {
+		return currentHeight;
+	}
+}
+
+void SampleMaster::makeTreeUltrametric( TreeAln &traln, std::vector<AbstractParameter*> divTimes, std::vector<AbstractParameter*> &divRates) const 
+{
+
+	assert(divRates.size() == 1 );
+	/* initialize the rates */
+  
+  vector<NodeAge *> nodeAges(traln.getNumberOfNodes());
+  for (nat i = 0; i < traln.getNumberOfNodes(); i++)
+  {
+	  nodeAges[i] = new NodeAge();
+  }
+
+  /* set root at random */
+  traln.setRootBranch(traln.getAnyBranch());
+ 
+  nodeAges[traln.getRootBranch().getPrimNode()-1]->setHeight(1.0);
+  nodeAges[traln.getRootBranch().getSecNode()-1]->setHeight(1.0);
+
+  double maxHeight = std::max(
+		  traverseDepthFromRoot(traln, traln.getRootBranch(), nodeAges),
+		  traverseDepthFromRoot(traln, traln.getRootBranch().getInverted(), nodeAges));
+
+	/* correct the node heights from the tips to the root and initialize branches */
+	for (auto b : nodeAges)
+	{
+		b->setHeight(
+				traln.isTipNode(b->getPrimNode()) ?
+						0 : (maxHeight - b->getHeight()));
+	}
+
+	auto rootNodeAge = NodeAge();
+	rootNodeAge.setHeight(maxHeight);
+	auto rootContent = ParameterContent();
+
+	for (auto b : nodeAges)
+    {
+		if (b->getPrimNode() > traln.getNumberOfTaxa())
+		{
+			auto divtime =
+					static_cast<DivergenceTimes *>(divTimes[b->getPrimNode()
+							- traln.getNumberOfTaxa() - 1]);
+			auto content = ParameterContent();
+
+			/* adding both current and parental branches */
+			content.nodeAges.push_back(*b);
+			if (traln.isRootChild(b->getPrimNode()))
+			{
+				content.nodeAges.push_back(rootNodeAge);
+				rootContent.nodeAges.push_back(*b);
+			}
+			else
+			{
+				content.nodeAges.push_back(*nodeAges[b->getSecNode() - 1]);
+			}
+			divtime->initializeParameter(traln, content);
+		}
+	}
+      
+	auto divtime = static_cast<DivergenceTimes *>(divTimes[divTimes.size()-1]);
+	rootContent.nodeAges.push_back(rootNodeAge);
+	divtime->initializeParameter(traln, rootContent, true);
+
+	auto ratesContent = ParameterContent();
+	for (nat i = 0; i < traln.getNumberOfNodes(); i++)
+	{
+		ratesContent.branchLengths.push_back(BranchLength(*nodeAges[i],InternalBranchLength(0.0)));
+		delete nodeAges[i];
+    }
+
+	auto divrate = static_cast<DivergenceRates *>(divRates[0]);
+	divrate->initializeParameter(traln, ratesContent);
+}
+
+
+vector<std::string> SampleMaster::getStartingTreeStrings()
+{
+  auto result =  vector<std::string>{};
+
+  auto&& ifh = std::ifstream{_cl.getTreeFile()}; 
+  if(ifh)
+    {
+      auto aString = std::string{}; 
+      while(std::getline(ifh, aString))
+	result.push_back(aString); 
+    }
+
+  return result; 
+}
+
+
+
+void SampleMaster::printProposals( std::vector<std::unique_ptr<AbstractProposal> > &proposals,  std::vector<ProposalSet> &proposalSets, ParameterList &params  ) const 
+{
+  // something is rotten in the state of denmark: it should not be
+  // necessary to reset the parameters here again, yet if we dont, we
+  // get an error.
+  for(auto &p : proposals)
+    p->setParams(&params); 
+
+  for(auto &p : proposalSets)
+    p.setParameterListPtr(&params); 
+
+  double sum = 0; 
+  for(auto &p : proposals)
+    sum += p->getRelativeWeight(); 
+  for(auto &p : proposalSets)
+    sum += p.getRelativeWeight();
+  
+  tout << "Will employ the following proposal mixture (frequency,id,type,affected variables): " << endl; 
+  for(auto &p : proposals )
+    {
+      tout << PERC_PRECISION << p->getRelativeWeight() / sum * 100 <<   "%\t" ; 
+      tout << p->getId() << "\t" ; 
+      p->printShort(tout ) ; 
+      tout << endl; 
+    }
+  if(proposals.size() == 0)
+    tout << "None." << endl; 
+
+  tout << endl; 
+
+  if(_runParams.isComponentWiseMH() && proposalSets.size() > 0 )
+    {
+      tout << "In addition to that, the following sets below will be executed \n"
+	   << "in a sequential manner (for efficiency, see manual for how to\n"
+	   << "disable)." << endl; 
+	for(auto &p : proposalSets )
+	  {
+	    p.printVerboseAbbreviated(tout, sum);
+	    tout << endl;       
+	  }
+    }
+}
+
+
+void SampleMaster::printParameters(const TreeAln &traln, const ParameterList &params) const 
+{
+  // merely some printing and we are done  
+  tout << endl << "Parameters to be integrated (initial values derived from prior): " << endl; 
+  tout << SOME_FIXED_PRECISION; 
+  for(auto &v : params)
+    {
+      tout << v->getId() << "\t" << v  << endl; 
+      tout << "\tsub-id:\t" << v->getIdOfMyKind() << endl; 
+      tout << "\tprior:\t" << v->getPrior() << endl; 
+
+      tout << "\tinit value:\t" ; 
+
+      if(dynamic_cast<TopologyParameter*>(v)  != nullptr )
+	{
+	  auto p = v->getPrior(); 
+
+	  if(not p->needsIntegration())
+	    tout << "fixed" ; 
+	  else if(_runParams.isUseParsimonyStarting())
+	    tout << "parsimony" ; 
+	  else 
+	    tout << "random" ; 
+	  
+	  if(_cl.getTreeFile().compare("") != 0)
+	    tout << " or given (tree file)" ; 
+	  tout << endl; 
+	}
+      else if ( dynamic_cast<RevMatParameter*>(v)  || dynamic_cast<FrequencyParameter*>(v) )
+	{
+	  auto content = v->getPrior()->getInitialValue(); 
+	  RateHelper().convertToSum1(content.values);
+	  tout << content << endl; 
+	}
+      else 
+	{
+	  if(v->getPrior() ->isKeepInitData())
+	    tout << "original value (if available) / " ; 
+	  tout << v->getPrior()->getInitialValue()  << endl; 
+	}
+    }
+  tout << "================================================================" << endl;
+  tout << endl; 
+}
+
+
+std::string SampleMaster::getOrCreateBinaryFile() const 
+{
+  auto binaryAlnFile =std::string{}; 
+  if( not _cl.alnFileIsBinary())
+    {
+      tout << "You provided an alignment file in phylip format. Trying to parse it..." << endl; 
+      
+      bool haveModelFile = _cl.getModelFile().compare("") != 0; 
+      auto modelInfo = haveModelFile ? _cl.getModelFile( ): _cl.getSingleModel(); 
+
+      binaryAlnFile = std::string(_cl.getWorkdir() 
+				  +  ( _cl.getWorkdir().compare("") == 0 ? "" : "/"   ) 
+				  +   "ExaBayes_binaryAlignment" + "." + _cl.getRunid()) ;
+
+      if( _plPtr->isGlobalMaster() )
+	{
+
+	  auto &&phyAln = AlignmentPLL{} ; 
+
+	  if(std::ifstream(binaryAlnFile))
+	    {
+	      tout << "removing previous binary alignment representation " << binaryAlnFile << endl; 
+	      remove(std::string(binaryAlnFile).c_str()); 
+	    }
+
+          auto format = AlignmentPLL::guessFormat(_cl.getAlnFileName());
+	  phyAln.initAln(_cl.getAlnFileName(), format);
+
+	  if(not haveModelFile)
+	    {
+	      auto type = getTypeFromString(modelInfo); 
+	      phyAln.createDummyPartition(type); 
+	    }
+	  else 
+	    {
+	      phyAln.initPartitions(modelInfo); 
+	    }
+
+	  phyAln.writeToFile(binaryAlnFile); 
+	}
+
+      _plPtr->getGlobalComm().waitAtBarrier();
+
+      if(not std::ifstream(binaryAlnFile))
+      	{
+      	  std::cout << "Error: tried to create intermediate file "<< binaryAlnFile << ", but did not succeed!"  << endl; 
+      	  exitFunction(-1, false); 
+      	}
+    }
+  else 
+    {
+      binaryAlnFile = _cl.getAlnFileName();   
+    }
+  
+  return binaryAlnFile; 
+}
+
+
+void SampleMaster::catchRunErrors() const 
+{
+  if( int(_runParams.getNumRunConv()) <_cl.getNumRunParallel() )
+    {
+      tout << "\n\tERROR: you want to run  "<< _cl.getNumRunParallel() << " independent runs in parallel, while there are only " << _runParams.getNumRunConv() << " to be run in total.\n\n" << endl; 
+      exitFunction(-1, true); 
+    }
+
+  if ( _runParams.getNumCoupledChains() < _cl.getNumChainsParallel() )
+    {
+      tout << "\n\tERROR: you want to run " << _cl.getNumChainsParallel() << " coupled chains in parallel, while there are only "<< _runParams.getNumCoupledChains() << " to be run in total.\n\n" << endl; 
+      exitFunction(-1,true); 
+    }
+
+  if( (  _runParams.getNumRunConv() % _cl.getNumRunParallel() )  != 0 )
+    {
+      tout << "\n\tERROR: you specified to run " << _runParams.getNumRunConv() << " independent runs and " << _cl.getNumRunParallel() << " of them in parallel. Currently, the total number of runs must be a multiple of the number of parallel runs." << endl; 
+      exitFunction(-1,true); 
+    }
+
+  if( (  _runParams.getNumCoupledChains() % _cl.getNumChainsParallel() ) != 0  )
+    {
+      tout << "\n\tERROR: you specified to run " << _runParams.getNumCoupledChains() << " coupled chains for each independent run and "<< _cl.getNumChainsParallel() << " of them in parallel. Currently, the total number of coupled chains must be a multiple of the number of parallel coupled chains." << endl; 
+      exitFunction(-1, true); 
+    }
+}
+
+
+void SampleMaster::initializeRuns(Randomness rand)
+{  
+  auto startingTrees = getStartingTreeStrings(); 
+
+  if(_cl.getCheckpointId().compare(_cl.getRunid()) == 0)
+    {
+      std::cerr << "You specified >" << _cl.getRunid() << "< as runid and intended\n"
+		<< "to restart from a previous run with id >" << _cl.getCheckpointId() << "<."
+		<< "Please specify a new runid for the restart. " << endl; 
+      exitFunction(-1, true); 
+    }
+
+  // correctly initialize the first tree / alignment
+  auto binaryAlnFile = getOrCreateBinaryFile(); 
+
+  auto &&bFile = ByteFile(binaryAlnFile, _cl.isSaveMemorySEV()); 
+
+  bFile.parse(*_plPtr); 
+  auto partitions = bFile.getPartitions();
+
+  auto taxa = bFile.getTaxa(); 
+  auto numPart = partitions.size(); 
+
+  // tout << "\nNUM" << PLL_NUM_BRANCHES << endl; 
+  PLL_NUM_BRANCHES = int(numPart); 
+
+  auto&& initTree = TreeAln(taxa.size(), _cl.isSaveMemorySEV() );
+  initTree.setPartitions(partitions, true); 
+  initTree.setTaxa(taxa);
+
+  auto bls = BranchLengthResource{}; 
+  bls.initialize(taxa.size(), numPart);
+  initTree.setBranchLengthResource(bls); 
+
+  auto evalUptr = createEvaluatorPrototype(initTree,  _cl.isSaveMemorySEV()); 
+  
+  auto aRes = processConfigFile(_cl.getConfigFileName(), initTree);
+
+  auto&& params = get<0>(aRes); 
+  auto&& proposals = get<1>(aRes);
+  auto&& proposalSets = get<2>(aRes); 
+  
+  catchRunErrors();
+
+  auto runSeeds = vector<randCtr_t>{};
+  auto treeSeeds = vector<randCtr_t>{}; 
+  for(nat i = 0; i <  _runParams.getNumRunConv();++i)
+    {
+      runSeeds.push_back(rand.generateSeed()); 
+      treeSeeds.push_back(rand.generateSeed()); 
+    }
+
+  // determine if topology is fixed 
+  auto topoIsFixed = false; 
+  for(auto &v :params)
+    {
+      if( dynamic_cast<TopologyParameter*>(v) != nullptr && not v->getPrior()->needsIntegration() )
+	topoIsFixed = true; 
+    }
+
+  // gather branch length parameters
+  auto blParams = vector<AbstractParameter*>{} ;
+  for(auto &v : params)
+    {
+      if(v->getCategory() == Category::BRANCH_LENGTHS)
+	blParams.push_back(v);
+    }
+
+  if(startingTrees.size() > 1 )
+    {
+      tout << "You provided " << startingTrees.size() << " starting trees" << endl;       
+
+      if(topoIsFixed)
+	tout << "Since the topology is fixed, only the first one will be used." << endl; 
+    }
+
+  auto hadBl = false; 
+  if(topoIsFixed)
+    {
+      auto treeRandomness = Randomness(treeSeeds[0]); 
+      hadBl = initializeTree(initTree, 
+				  startingTrees.size() > 0  ? startingTrees.at(0): std::string(""), // meh 
+				  treeRandomness, blParams); 
+    }
+
+  for(nat i = 0; i < _runParams.getNumRunConv() ; ++i)
+    {    
+      auto trees = vector<TreeAln>{}; 
+      for(nat j = 0; j < _runParams.getNumCoupledChains() ; ++j ) 
+	trees.emplace_back(initTree);
+
+      auto hadBls = vector<bool>(trees.size() , topoIsFixed  && hadBl ? true : false);
+      if(not topoIsFixed)
+	hadBls = initTrees(trees, treeSeeds[i],  startingTrees, blParams); 
+
+      // TODO method could be moved to treealn 
+      for(nat j = 0; j < trees.size() ;++j)
+	initializeWithParamInitValues(trees[j], params, hadBls[j] );
+      
+      auto runRand =  Randomness(runSeeds[i]); 
+      
+      auto chains = vector<Chain>{};       
+      for(nat j = 0; j < _runParams.getNumCoupledChains(); ++j)
+	{
+	  auto &t = trees.at(j);
+	  chains.emplace_back( runRand.generateSeed(), t, params, proposals, proposalSets, evalUptr, _cl.isDryRun() ); 
+	  auto &chain = chains[j]; 		
+	  chain.setRunId(i); 
+	  chain.setTuneFreuqency(_runParams.getTuneFreq()); 
+	  chain.setHeatIncrement(j); 
+	  chain.setDeltaT(_runParams.getHeatFactor()); 
+	}
+
+      _runs.emplace_back(runRand, i, _cl.getWorkdir(), _cl.getRunid(), _runParams.getNumCoupledChains(), chains); 
+      auto &run = _runs.back(); 
+      run.setTemperature(_runParams.getHeatFactor());
+      run.setSamplingFreq(_runParams.getSamplingFreq()); 
+      run.setNumSwapsPerGen(_runParams.getNumSwapsPerGen());
+
+      if(_plPtr->isRunLeader() && _plPtr->isMyRun(run.getRunid()))
+	run.initializeOutputFiles(_cl.isDryRun());
+    }
+
+  // important: initialize asynchronous tag based system 
+  _plPtr->getChainComm().initWithMaxChains( _runParams.getNumCoupledChains() , _plPtr->getChainComm().size()); 
+
+  if(_cl.getCheckpointId().compare("") != 0)
+    initializeFromCheckpoint(); 
+  
+  if(_plPtr->isGlobalMaster() && not _diagFile.isInitialized() && not _cl.isDryRun() )
+    _diagFile.initialize(_cl.getWorkdir(), _cl.getRunid(), _runs);
+  
+  // post-pone all printing to the end  
+  if(not _cl.isQuiet())
+    {
+      printAlignmentInfo(initTree);   
+      printParameters(initTree, params);
+      printProposals(proposals, proposalSets, params ); 
+      informPrint();
+      teeOut->flush();
+      printInitializedFiles(); 
+    }
+
+  printInitialState(); 
+  if(not _cl.isQuiet() && _plPtr->getGlobalComm().size() > 1)
+    {
+      auto res = _plPtr->printLoadBalance(initTree, _runParams.getNumRunConv(), _runParams.getNumCoupledChains());
+      tout << res; 
+    }
+
+  // BEGIN DEBUG 
+  auto printTheAlignment = false;  
+  if(printTheAlignment)
+    {
+      auto &p = initTree.getPartition(0); 
+      auto &&ss = std::stringstream{}; 
+      p.printAlignment(ss); 
+      std::cout << ss.str() << endl; 
+    }
+  // END 
+
+}
+
+
+void SampleMaster::printInitializedFiles() const 
+{
+  auto &&stream = tout;
+
+  bool isRestart = _cl.getCheckpointId().compare("") != 0;
+  auto initString = isRestart ? "regenerated" : "initialized" ; 
+
+  stream << initString  << " diagnostics file " << _diagFile.getFileName()  << endl; 
+
+  for(auto &run : _runs)
+    {
+      for(auto &elem : run.getAllFileNames())
+	{
+	  stream << initString << " file " << elem << endl; 
+	}
+    }
+} 
+
+
+void SampleMaster::printInitialState()  
+{    
+  auto& res = _runs.at(0).getChains().at(0).getEvaluator().getArrayReservoir(); 
+
+  // compute the initial state 
+  for(auto &run: _runs)
+    {    
+      for(nat i = 0; i < run.getChains().size(); ++i)	
+	{
+	  auto &chain = run.getChains()[i]; 
+	  auto &eval = chain.getEvaluator(); 
+	  auto &traln  = chain.getTralnHandle();
+	  chain.setLikelihood(traln.getLikelihood());
+	  eval.evaluate(traln, traln.getAnyBranch(), true);
+
+	  // NOTICE was not here before 
+	  chain.setLikelihood(traln.getLikelihood()) ; 
+	  
+	  eval.freeMemory(); 
+	  traln.clearMemory(res); 
+
+	  if(_plPtr->isMyChain(run.getRunid(), i))
+	    {
+	      chain.resume(); 
+	      chain.suspend();
+	    }
+	}
+    }
+
+  // if we are parallel, we must inform the master about what we
+  // computed
+  _plPtr->synchronizeChainsAtMaster(_runs, CommFlag::PRINT_STAT);
+
+  tout << endl << "initial state: " << endl; 
+  tout << "================================================================" << endl; 
+  for(auto &run: _runs)
+    {
+      for(auto &chain: run.getChains())
+	{
+	  tout << chain ; 
+	  tout << "\tRNG(" << chain.getChainRand() << ")" << endl; 
+	}
+      tout << "================================================================" << endl; 
+    }
+  tout << endl; 
+}  
+
+
+std::pair<double,double> SampleMaster::convergenceDiagnostic(nat &start, nat &end)
+{
+  if(_runParams.getNumRunConv() == 1)
+    return std::pair<double,double>(std::numeric_limits<double>::min(),std::numeric_limits<double>::min());
+
+  auto fns = vector<string>{}; 
+  for(nat i = 0; i < _runParams.getNumRunConv(); ++i)
+    {
+      auto &&ss = stringstream{};
+
+      ss << OutputFile::getFileBaseName(_cl.getWorkdir())  << "_topologies.run-" << i  << "." << _cl.getRunid();
+
+      // if we do not find the file, let's assume we have multiple branch lengths 
+      if (not std::ifstream(ss.str()) ) 
+        ss << ".tree.0";
+
+      fns.push_back(ss.str());
+    }
+
+  auto&& asdsf = SplitFreqAssessor(fns, false);
+  end = asdsf.getMinNumTrees() ; 
+
+
+  // :HACK: possibly the number of trees is parsed incorrectly. This
+  // is not problematic, but could lead to a hang, if we have too few
+  // trees. 
+  if(end < 4  )
+    return std::make_pair(nan(""), nan(""));   
+
+  if( _runParams.getBurninGen() > 0 )
+    {
+      int treesToDiscard =  _runParams.getBurninGen() / _runParams.getSamplingFreq(); 
+
+      if(int(end) < treesToDiscard + 2 )
+	return make_pair(nan(""), nan("")); 
+      else 
+	start = treesToDiscard; 
+    }
+  else 
+    {
+      assert(_runParams.getBurninGen() == 0); 
+      start = (int)((double)end * _runParams.getBurninProportion()  ); 
+    } 
+
+  // dont forget that we also sampled gen0, therefore: 
+  ++end; 
+  
+  asdsf.extractBips(std::vector<nat>( _runParams.getNumRunConv(), start), std::vector<nat>(_runParams.getNumRunConv(), end) );
+  auto asdsfVals = asdsf.computeAsdsfNew(_runParams.getAsdsfIgnoreFreq());
+
+  return asdsfVals;
+}
+
+
+
+std::tuple<ParameterList , std::vector<std::unique_ptr<AbstractProposal> > , std::vector<ProposalSet> >   
+SampleMaster::processConfigFile(string configFileName, const TreeAln &traln )  
+{
+  auto reader = ConfigReader{}; 
+  auto && fh = ifstream(configFileName); 
+  auto token = NxsToken(fh); 
+  auto&& paramBlock = BlockParams{}; 
+  paramBlock.setTree(&traln); 
+  auto&& priorBlock = BlockPrior(traln.getNumberOfPartitions());
+  auto proposalConfig = BlockProposalConfig{}; 
+  
+  reader.Add(&paramBlock); 
+  reader.Add(&priorBlock);
+  reader.Add(&_runParams);
+  reader.Add(&proposalConfig);   
+  reader.Execute(token);
+  
+  _runParams.verify();
+  proposalConfig.verify(); 
+
+  proposalConfig.verify(); 
+
+  auto r = RunFactory{}; 
+  auto paramResult = paramBlock.getParameters();
+  r.addStandardParameters(paramResult, traln);
+  auto paramList = ParameterList(move(paramResult)); 
+
+  auto proposalSetResult = vector<ProposalSet>{};
+  auto&& proposalResult = vector<unique_ptr<AbstractProposal>>{}; 
+  std::tie(proposalResult, proposalSetResult) = r.produceProposals(proposalConfig, priorBlock , paramList, traln, _runParams.isComponentWiseMH() && traln.getNumberOfPartitions() > 1, *_plPtr);
+
+  // sanity check 
+  for(auto &p : paramList)
+    p->checkSanityPartitionsAndPrior(traln);
+
+  // now enumerate the proposals 
+  nat ctr = 0; 
+  for(auto &p : proposalResult)
+    {
+      p->setId(ctr); 
+      ++ctr; 
+    }
+  for(auto &p : proposalSetResult)
+    ctr = p.numerateProposals(ctr);
+
+  return std::make_tuple(paramList, move(proposalResult), proposalSetResult);
+}
+
+
+void SampleMaster::printDuringRun(uint64_t gen)   
+{
+  _plPtr->synchronizeChainsAtMaster(_runs, CommFlag::PRINT_STAT); 
+
+  auto time = _printTime.getRecentElapsed(); 
+  _printTime.updateTime();
+  
+  auto && ss = std::stringstream{} ; 
+  ss << SOME_FIXED_PRECISION; 
+  ss << "[" << gen << "," <<  time << "s]\t"; 
+
+  bool isFirst = true; 
+  for(auto &run : _runs)
+    {
+      if(isFirst)
+	isFirst = false; 
+      else 
+	ss << " ==="; 
+      
+      auto sortedLnls = vector<std::pair<nat,log_double>>{}; 
+      for(auto &c : run.getChains() ) 
+	sortedLnls.emplace_back(c.getCouplingId(), c.getLikelihood()); 
+      std::sort(begin(sortedLnls), end(sortedLnls), [] (const std::pair<nat,log_double> &elem1, const std::pair<nat,log_double> &elem2 ) { return elem1.first < elem2.first;  }); 
+
+      for(auto elem : sortedLnls)
+	{
+	  ss.imbue(locale(ss.getloc(), new ThousandsSeparator<char>(',') )); 
+	  
+	  ss << " " << elem.second; 
+	}
+    }
+
+  // print it 
+  tout << ss.str() << endl; 
+}
+
+
+void SampleMaster::simulate()
+{
+  if(not _cl.isQuiet())
+    {
+      tout << "Starting MCMC sampling " ; 
+
+#if USE_AVX
+      auto impl=std::string{"AVX"};
+#elif USE_SSE
+      auto impl=std::string{"SSE"};
+#else 
+      auto impl=std::string{"standard"};
+#endif 
+
+      tout << "using the " << impl << " implementation" <<    (  _cl.isSaveMemorySEV() ?  " with SEVs" : "" ) << " for likelihood computations." << endl; 
+      
+      if(_runParams.getNumRunConv() > 1 &&  _runParams.isUseStopCriterion() )
+	tout << PROGRAM_NAME << " will run until topological convergence is achieved\n"
+	     << "(" << ( _runParams.isUseAsdsfMax() ? "MSDSF < " : "ASDSF < " ) 
+	     << _runParams.getAsdsfConvergence() * 100 <<  "%, at least " 
+	     << _runParams.getNumGen() << " generations).\n" ; 
+      else 
+	tout  << PROGRAM_NAME << " will run for "<< _runParams.getNumGen() << " generations.\n" ;
+      tout << PROGRAM_NAME << " will print log-likelihoods of all chains, grouped by\n"
+	   << "run id (separated by '=') and sorted by heat (starting with the\n"
+	   << "cold chain). First column indicates generation number (completed\n"
+	   << "by all chains) and the time elapsed for this increment.\n\n"; 
+    } 
+
+  auto hasConverged = false;   
+  auto curGen = _runs[0].getChains()[0].getGeneration(); // dangerous 
+  for(auto & run: _runs)
+    for(auto &c : run.getChains())
+      assert( nat(c.getGeneration()) == curGen );       
+
+  auto lastPrint = (curGen / _runParams.getPrintFreq() )  * _runParams.getPrintFreq() ; 
+  auto lastDiag =  (curGen / _runParams.getDiagFreq() ) * _runParams.getDiagFreq(); 
+  auto lastChkpnt = ( curGen / _runParams.getChkpntFreq() )* _runParams.getChkpntFreq() ; 
+  
+  printDuringRun(curGen); 
+
+  while(curGen < nat(_runParams.getNumGen()) || not hasConverged)   
+    { 
+      auto nextPrint =  uint64_t(lastPrint + _runParams.getPrintFreq()); 
+      auto nextDiag = uint64_t(lastDiag + _runParams.getDiagFreq()); 
+      auto nextChkpnt = uint64_t(lastChkpnt + _runParams.getChkpntFreq()); 
+
+      auto stopPoints =std::vector<uint64_t> { nextChkpnt , nextPrint, nextDiag } ; 
+      
+      if(not _runParams.isUseStopCriterion())
+	stopPoints.push_back(uint64_t(_runParams.getNumGen()));
+
+      if(curGen < _runParams.getNumGen())
+	stopPoints.push_back(uint64_t(_runParams.getNumGen()));
+
+      auto  nextStop = *(std::min_element(stopPoints.begin(), stopPoints.end())); 
+      auto toExecute = nextStop - curGen; 
+
+      for(auto &run : _runs)
+	{
+	  // std::cout <<   "running a part" << endl; 
+	  // tout <<   "running a part" << endl; 
+	  if(_plPtr->isMyRun(run.getRunid()))
+	    run.executePart(curGen, toExecute, *_plPtr );
+	}
+
+      curGen += toExecute; 
+
+      hasConverged = not _runParams.isUseStopCriterion()  || (( _runs.size() == 1) && (curGen >= _runParams.getNumGen())); 
+
+      if( (curGen % _runParams.getDiagFreq()) == 0 )
+	{
+	  auto asdsf = std::make_pair(nan(""), nan("")); 
+
+	  if(_runs.size() > 1 && _runParams.isUseStopCriterion() )
+	    // if(not hasConverged)
+	    {
+	      if( _plPtr->isGlobalMaster())
+		{
+		  nat start = 0, 
+		    end = 0; 
+		  asdsf = convergenceDiagnostic(start, end); 
+
+		  double convCrit = _runParams.getAsdsfConvergence();  
+		  if(_runParams.isUseAsdsfMax())
+		    hasConverged = asdsf.second < convCrit;  
+		  else 
+		    hasConverged = asdsf.first < convCrit;  
+	      
+		  tout << endl  << "standard deviation of split frequencies for trees " << start << "-" << end  << " (avg/max):\t"
+		       << PERC_PRECISION << asdsf.first * 100 << "%\t" << asdsf.second * 100 << "%"   << endl << endl; 
+		}
+	    }
+	  else 
+	    hasConverged = true ; 
+
+	  auto swapBackup = std::vector<SwapMatrix> {};
+	  if(_plPtr->isGlobalMaster())
+	    {
+	      for(auto &run : _runs)
+		{
+		  if(_plPtr->isMyRun(run.getRunid()))
+		    swapBackup.push_back(run.getSwapInfo());
+		}
+	    } 
+
+	  _plPtr->synchronizeChainsAtMaster(_runs, CommFlag::PRINT_STAT | CommFlag::SWAP | CommFlag::PROPOSALS);
+
+	  // hack 
+	  int bla = hasConverged ? 1 : 0 ; 
+	  bla = _plPtr->getGlobalComm().broadcastVar(bla); 
+	  hasConverged = bla == 1 ? true : false; 
+	  // end
+
+	  if(_plPtr->isGlobalMaster()) 
+	    _diagFile.printDiagnostics(curGen, asdsf.first, _runs);
+
+	  if(_plPtr->isGlobalMaster())
+	    {
+	      auto iter = begin(swapBackup);
+	      for(auto &run : _runs)
+		{
+		  if(_plPtr->isMyRun(run.getRunid()))
+		    {
+		      run.setSwapInfo(*iter);	
+		      ++iter;
+		    }
+		}
+	    }
+	  
+	  lastDiag = curGen; 
+	}
+      
+      if(curGen % _runParams.getPrintFreq() == 0 )
+	{
+	  printDuringRun(curGen);
+	  lastPrint = curGen; 
+	}
+
+      if(curGen % _runParams.getChkpntFreq() == 0)
+	{
+	  writeCheckpointMaster();
+	  lastChkpnt = curGen; 
+	} 
+    }
+
+
+}
+
+ 
+void SampleMaster::finalizeRuns()
+{
+  for(auto &run : _runs)
+    {
+      for(auto &chain : run.getChains())
+	{
+	  if(  std::fabs(chain.getChainHeat() - 1. ) < std::numeric_limits<double>::epsilon())
+	    {
+	      tout << SOME_FIXED_PRECISION << "best state for run " << run.getRunid() << " was: "  << chain.getBestState( )<< endl;       
+	    }
+	}
+    }
+
+  _timeTracker.updateTime();
+
+  auto wallTimeElapsed = _timeTracker.getAccWallTime();
+  auto altFormat = TimeTracker::formatForWatch(wallTimeElapsed); 
+  tout << endl << "Converged/stopped after " <<  _runs[0].getChains()[0].getGeneration() << " generations" << endl;   
+  tout << endl << "Total walltime elapsed:\t" 
+       <<  SOME_FIXED_PRECISION << wallTimeElapsed << " seconds "
+       << "\tor " <<  std::setfill('0') << std::setw(2) <<  int(altFormat[0]) << ":" << std::setfill('0') << std::setw(2) << int(altFormat[1]) << ":" << altFormat[2] << " (hh:mm:ss)." << endl; 
+
+  auto cpuTime =  _timeTracker.getAccCpuTime();
+  altFormat = TimeTracker::formatForWatch(cpuTime) ; 
+  
+  tout << "Total CPU time elapsed:\t"  ; 
+  tout <<  SOME_FIXED_PRECISION << cpuTime << " seconds "
+       << "\tor " <<  std::setfill('0') << std::setw(2) <<  int(altFormat[0]) << ":" << std::setfill('0') << std::setw(2) << int(altFormat[1]) << ":" << altFormat[2] << " (hh:mm:ss)." << endl; 
+}
+
+
+void SampleMaster::deserialize( std::istream &in ) 
+{
+  for(auto &run : _runs)
+    run.deserialize(in); 
+
+  _timeTracker.deserialize(in);
+  _timeTracker.updateTime();
+}
+
+ 
+void SampleMaster::serialize( std::ostream &out) const
+{  
+  for(auto & run : _runs)    
+    run.serialize(out);
+
+  _timeTracker.serialize(out);
+}
+
+
+void SampleMaster::writeCheckpointMaster() 
+{
+  // whenever we synchronize swap, we have to backup our own swap
+  // matrices
+  auto swb=  std::vector<SwapMatrix> {}; 
+  if( _plPtr->isGlobalMaster())
+    {
+      for(auto &run : _runs)
+	swb.push_back(run.getSwapInfo());
+    }
+
+  _plPtr->synchronizeChainsAtMaster(_runs, CommFlag::PRINT_STAT | CommFlag::PROPOSALS | CommFlag::TREE | CommFlag::SWAP ); 
+
+  if( _plPtr->isGlobalMaster())
+    {
+      auto iter = begin(swb); 
+      for(auto &run : _runs)
+	{
+	  run.setSwapInfo(*iter); 
+	  ++iter; 
+	}
+    }
+
+  if( _plPtr->isGlobalMaster() )
+    {
+      auto &&ss = std::stringstream{}; 
+      ss <<  OutputFile::getFileBaseName(_cl.getWorkdir()) << "_newCheckpoint." << _cl.getRunid()  ; 
+      auto newName = ss.str();
+      auto&& chkpnt = std::ofstream{}; 
+      Serializable::getOfstream(newName, chkpnt); 
+      _timeTracker.updateTime();
+      serialize(chkpnt);
+
+      ss.str("");
+      ss << OutputFile::getFileBaseName(_cl.getWorkdir()) << "_checkpoint." << _cl.getRunid(); 
+      auto curName = ss.str();
+      if( std::ifstream(curName) )
+	{
+	  ss.str("");
+	  ss << OutputFile::getFileBaseName(_cl.getWorkdir())  << "_prevCheckpointBackup." << _cl.getRunid(); 
+	  auto prevName =  ss.str();
+	  if( std::ifstream(prevName) )
+	    {
+	      int ret = remove(prevName.c_str()); 
+	      assert(ret == 0); 
+	    }
+	      
+	  int ret = rename(curName.c_str(), prevName.c_str()); 
+	  assert(ret == 0); 
+	}
+	  
+      int ret = rename(newName.c_str(), curName.c_str()); 
+      assert(ret == 0); 
+    }
+  else 
+    {
+      auto &&nullstream = std::ofstream("/dev/null"); 
+      serialize(nullstream); 
+    }
+} 
diff --git a/src/mcmc/SampleMaster.hpp b/src/mcmc/SampleMaster.hpp
new file mode 100644
index 0000000..5990673
--- /dev/null
+++ b/src/mcmc/SampleMaster.hpp
@@ -0,0 +1,102 @@
+/** 
+    @file SampleMaster.hpp
+    
+    @brief represents various chains sampling the posterior probability space
+    
+    Despite of its modest name, this is in fact the master class.  
+ */ 
+
+#ifndef _SAMPLING_H
+#define _SAMPLING_H
+
+#include <vector>
+
+#include "ProposalSet.hpp"
+#include "BlockRunParameters.hpp"
+#include "BlockProposalConfig.hpp"
+#include "CommandLine.hpp"
+#include "CoupledChains.hpp"
+#include "ConfigReader.hpp"
+#include "ParallelSetup.hpp"
+#include "TimeTracker.hpp"
+#include "Serializable.hpp"
+#include "DiagnosticsFile.hpp"
+
+class SampleMaster : public Serializable
+{
+public:   
+  SampleMaster(size_t numCpu) ; 
+  SampleMaster(const SampleMaster& rhs) = default; 
+  SampleMaster& operator=(const SampleMaster &rhs)  = default; 
+
+  /** 
+      @brief initializes the runs  
+      @notice this is the top-level function 
+   */ 
+  void initializeRuns(Randomness rand); 
+  // nat peekNumTax(std::string filePath); 
+  /** 
+      @brief cleanup, once finished
+   */ 
+  void finalizeRuns();  
+  /** 
+      @brief starts the MCMC sampling   
+   */ 
+  void simulate(); 
+  /** 
+      @brief initializes the config file 
+   */ 
+  std::tuple<ParameterList , std::vector<std::unique_ptr<AbstractProposal> > , std::vector<ProposalSet> >  
+  processConfigFile(string configFileName, const TreeAln &tralnPtr ) ; 
+  void initializeWithParamInitValues(TreeAln &tree , const ParameterList &params , bool hasBl ) const ; 
+
+  void makeTreeUltrametric( TreeAln &traln, std::vector<AbstractParameter*> divTimes, std::vector<AbstractParameter*> &divRates) const; 
+  /** 
+      @brief EXPERIMENTAL 
+   */ 
+  void branchLengthsIntegration(Randomness &rand)  ;  
+  /** 
+      @brief print information about the alignment  
+   */ 
+  void printAlignmentInfo(const TreeAln &traln);   
+  /** 
+      @brief gets the runs 
+   */ 
+  const std::vector<CoupledChains>& getRuns() const {return _runs; }
+  
+  virtual void deserialize( std::istream &in ) ; 
+  virtual void serialize( std::ostream &out) const ;
+
+  void setCommandLine(CommandLine cl) { _cl = cl; }
+
+  void setParallelSetup(ParallelSetup* pl ) { _plPtr = pl; }
+
+private: 
+  void printParameters(const TreeAln &traln, const ParameterList &params) const; 
+  void printProposals( std::vector<unique_ptr<AbstractProposal> > &proposals,  std::vector<ProposalSet> &proposalSets, ParameterList &params  ) const ; 
+  void printInitializedFiles() const; 
+  std::vector<std::string> getStartingTreeStrings(); 
+  void informPrint(); 
+  void printInitialState(); 
+  LikelihoodEvaluator createEvaluatorPrototype(const TreeAln &initTree, bool useSEV); 
+  void writeCheckpointMaster(); 
+  void initializeFromCheckpoint(); 
+  std::pair<double,double> convergenceDiagnostic(nat &begin, nat &end); 
+  std::vector<bool> initTrees(std::vector<TreeAln> &trees, randCtr_t seed, std::vector<std::string> startingTreeStrings, const std::vector<AbstractParameter*> &params); 
+  bool initializeTree(TreeAln &traln, std::string startingTree, Randomness &treeRandomness, const std::vector<AbstractParameter*> &params); 
+  void printDuringRun(uint64_t gen) ; 
+  std::string getOrCreateBinaryFile() const ; 
+  void catchRunErrors() const ; 
+
+private:			// ATTRIBUTES 
+  std::vector<CoupledChains> _runs; 
+  ParallelSetup* _plPtr;  	// non-owning!
+  BlockRunParameters _runParams;  
+  CommandLine _cl; 
+  DiagnosticsFile _diagFile; 
+
+  TimeTracker _timeTracker; 
+  TimeTracker _printTime; 
+};  
+
+#endif
diff --git a/src/mcmc/SuccessCounter.cpp b/src/mcmc/SuccessCounter.cpp
new file mode 100644
index 0000000..f24c619
--- /dev/null
+++ b/src/mcmc/SuccessCounter.cpp
@@ -0,0 +1,110 @@
+#include <iostream>
+#include <cassert>
+#include "SuccessCounter.hpp"
+
+#include "common.h"
+
+SuccessCounter::SuccessCounter() 
+  : globalAcc(0)
+  , globalRej(0)
+  , localAcc(0)
+  , localRej(0)
+  , batch(0)
+{
+}
+
+
+// SuccessCounter::SuccessCounter(const SuccessCounter& rhs)
+//   : globalAcc(rhs.globalAcc)
+//   , globalRej(rhs.globalRej)
+//   , localAcc(rhs.localAcc)
+//   , localRej(rhs.localRej)
+//   , batch(rhs.batch)
+// {  
+// }
+
+
+void SuccessCounter::accept() 
+{
+  ++globalAcc;
+  ++localAcc; 
+}
+
+
+void SuccessCounter::reject()
+{
+  ++globalRej;
+  ++localRej; 
+}
+
+
+double SuccessCounter::getRatioInLastInterval() const 
+{ 
+  double ratio =   ((double)localAcc) / ((double)(localAcc + localRej) ); 
+  // cout << "ratio is " <<  ratio << endl; 
+  return  ratio ; 
+}
+
+
+double SuccessCounter::getRatioOverall() const 
+{
+  return (double) globalAcc / ((double)(globalAcc + globalRej)); 
+}
+
+void SuccessCounter::nextBatch()
+{
+  batch++;
+  reset();
+}
+
+
+
+void SuccessCounter::reset()
+{
+  localRej = 0;
+  localAcc = 0;
+}
+
+
+void SuccessCounter::deserialize( std::istream &in )   
+{
+  globalAcc = cRead<decltype(globalAcc)>(in); 
+  globalRej = cRead<decltype(globalRej)>(in); 
+  localAcc = cRead<decltype(localAcc)>(in); 
+  localRej = cRead<decltype(localRej)>(in); 
+  batch = cRead<decltype(batch)>(in); 
+}
+ 
+void SuccessCounter::serialize( std::ostream &out)  const
+{
+  // local stuff needed for the proposals!!!
+
+  cWrite<decltype(globalAcc)>(out, globalAcc); 
+  cWrite<decltype(globalRej)>(out, globalRej); 
+  cWrite<decltype(localAcc)>(out, localAcc); 
+  cWrite<decltype(localRej)>(out, localRej); 
+  cWrite<decltype(batch)>(out, batch); 
+} 
+
+
+
+SuccessCounter SuccessCounter::operator+(const SuccessCounter &rhs) const 
+{
+  auto result =  SuccessCounter{}; 
+  result.globalAcc = rhs.globalAcc + globalAcc; 
+  result.globalRej = rhs.globalRej + globalRej; 
+  result.localAcc = rhs.localAcc + localAcc; 
+  result.localRej = rhs.localRej + localRej; 
+  result.batch = rhs.batch + batch; 
+  
+  return result; 
+} 
+
+
+std::ostream& operator<<( std::ostream &out, const SuccessCounter &rhs)
+{
+  out << rhs.globalAcc << "/" <<  rhs.globalRej; 
+  return out; 
+}
+
+
diff --git a/src/mcmc/SuccessCounter.hpp b/src/mcmc/SuccessCounter.hpp
new file mode 100644
index 0000000..5e4fe26
--- /dev/null
+++ b/src/mcmc/SuccessCounter.hpp
@@ -0,0 +1,51 @@
+#ifndef _SUCCESSCTR_H
+#define _SUCCESSCTR_H
+
+#include <iostream>
+#include <list>
+
+#include "Serializable.hpp"
+
+#define SIZE_OF_LAST 100 
+
+// TODO  an success interval would be nice 
+
+
+class SuccessCounter : public Serializable
+{
+public: 
+  SuccessCounter();  
+  SuccessCounter(const SuccessCounter& rhs) = default ; 
+  SuccessCounter( SuccessCounter&& rhs) = default ; 
+  SuccessCounter& operator=(  const SuccessCounter& rhs)  = default ; 
+  SuccessCounter& operator=(   SuccessCounter&& rhs)  = default ; 
+
+  void accept(); 
+  void reject();
+  int getRecentlySeen() const {return localAcc + localRej; }
+  double getRatioInLastInterval() const ; 
+  double getRatioOverall() const ; 
+  void nextBatch(); 
+  int getBatch() const {return batch; }
+  nat getTotalSeen()const  {return globalAcc + globalRej; }
+  
+  virtual void deserialize( std::istream &in )   ; 
+  virtual void serialize( std::ostream &out) const ;   
+
+  SuccessCounter operator+(const SuccessCounter &rhs) const ; 
+  friend void swap(SuccessCounter &elemA, SuccessCounter &elemB); 
+  
+private: 			// METHODS
+  void reset();  
+
+private:		  // ATTRIBUTES
+  nat globalAcc; 
+  nat globalRej;   
+  nat localAcc; 
+  nat localRej; 
+  nat batch; 			
+
+  friend std::ostream& operator<<(std::ostream& rhs, const SuccessCounter &b ); 
+}; 
+
+#endif
diff --git a/src/mcmc/SwapMatrix.cpp b/src/mcmc/SwapMatrix.cpp
new file mode 100644
index 0000000..453559f
--- /dev/null
+++ b/src/mcmc/SwapMatrix.cpp
@@ -0,0 +1,109 @@
+#include "SwapMatrix.hpp"
+#include "GlobalVariables.hpp"
+
+#include <iostream>
+#include <cassert>
+
+SwapMatrix::SwapMatrix(size_t numChains)
+  : matrix{}
+  , numEntries(numChains)
+{
+  for(nat i = 0; i < numEntries; ++i)
+    for(nat j = i  + 1 ; j < numEntries; ++j)
+      matrix.push_back(SuccessCounter()); 
+}
+
+
+void SwapMatrix::update(nat a, nat b, bool acc)
+{
+  auto &elem = matrix.at(mapToIndex(a,b));
+  if(acc)
+    elem.accept();
+  else 
+    elem.reject();
+}
+
+
+const SuccessCounter& SwapMatrix::getCounter(nat a, nat b ) const
+{
+  return matrix.at(mapToIndex(a,b)); 
+} 
+
+
+size_t SwapMatrix::mapToIndex(nat a, nat b) const 
+{
+  assert(a != b);
+  if(b < a )
+    std::swap(a,b); 
+
+  size_t result = 0; 
+  for(nat i = 0; i < a && a != 0; ++i)
+    result += numEntries -i  -1 ; 
+  result += b - a - 1  ; 
+
+  if(not (result < matrix.size()))
+    {
+      tout << "for " << a << "," << b << " the index was "
+      	   << result << ", but matrix has only " << matrix.size() << std::endl; 
+      
+      assert(result < matrix.size()); 
+    }
+
+  return result; 
+} 
+
+
+std::ostream&  operator<<(std::ostream &out, const SwapMatrix& rhs ) 
+{
+  for(nat i = 0; i < rhs.numEntries-1; ++i)
+    {
+      tout << "(" ;
+      bool isFirst = true;
+      for(nat j = i+1; j < rhs.numEntries; ++j)
+	{
+	  auto &elem = rhs.matrix[rhs.mapToIndex(i,j)]; 
+	  // out << (isFirst ? "" : ",") << std::setprecision(1) << 100 * elem.getRatioOverall() << "%"; 
+	  out << ( isFirst ? "" : "," ) << "(" << elem << ")" ; 
+	  isFirst = false; 
+	}
+      tout << ")"; 
+    }
+  return out ; 
+}
+
+
+void SwapMatrix::deserialize( std::istream &in )   
+{  
+  for(auto &s : matrix)
+    s.deserialize(in);
+} 
+
+void SwapMatrix::serialize( std::ostream &out)  const
+{
+  for(auto &s : matrix)
+    s.serialize(out); 
+}
+
+
+SwapMatrix SwapMatrix::operator+(const SwapMatrix& rhs) const
+{
+  // tout << "rhs was: " << rhs << std::endl;     
+
+  auto result = SwapMatrix(numEntries); 
+
+  for(nat i = 0; i < rhs.matrix.size(); ++i)
+    result.matrix[i] = matrix[i] + rhs.matrix[i]; 
+
+  // tout << "result is" << result << std::endl; 
+
+  return result; 
+}
+
+
+SwapMatrix& SwapMatrix::operator+=(const SwapMatrix& rhs) 
+{
+  *this = *this + rhs; 
+  return *this;
+}
+
+
diff --git a/src/mcmc/SwapMatrix.hpp b/src/mcmc/SwapMatrix.hpp
new file mode 100644
index 0000000..509cf52
--- /dev/null
+++ b/src/mcmc/SwapMatrix.hpp
@@ -0,0 +1,45 @@
+#ifndef _SWAP_MATRIX_H 
+#define _SWAP_MATRIX_H 
+
+#include <vector>
+#include <iostream>
+
+#include "common.h"
+#include "SuccessCounter.hpp"
+
+#include "Serializable.hpp"
+
+class SwapMatrix : public Serializable
+{
+public: 
+  explicit SwapMatrix(size_t numChains ); 
+  SwapMatrix(SwapMatrix&& rhs) = default;  
+  SwapMatrix& operator=(const SwapMatrix &rhs)  = default; 
+  SwapMatrix& operator=( SwapMatrix &&rhs)  = default; 
+  SwapMatrix(const SwapMatrix & rhs)  = default; 
+
+  void update(nat a, nat b, bool acc); 
+  const SuccessCounter& getCounter(nat a, nat b ) const; 
+
+  virtual void deserialize( std::istream &in )   ; 
+  virtual void serialize( std::ostream &out) const;   
+
+  std::vector<SuccessCounter> getMatrix() const {return matrix; }
+
+  SwapMatrix operator+(const SwapMatrix& rhs) const; 
+  SwapMatrix& operator+=(const SwapMatrix& rhs) ; 
+
+  friend void swap(SwapMatrix& a, SwapMatrix &b); 
+
+private: 
+  size_t mapToIndex(nat a, nat b) const ;
+  
+private:  
+  std::vector<SuccessCounter> matrix; 
+  size_t numEntries; 
+
+  friend  std::ostream& operator<<(std::ostream &out, const SwapMatrix& rhs ) ; 
+}; 
+
+
+#endif
diff --git a/src/model/AbstractAlphabet.cpp b/src/model/AbstractAlphabet.cpp
new file mode 100644
index 0000000..3e4d607
--- /dev/null
+++ b/src/model/AbstractAlphabet.cpp
@@ -0,0 +1,42 @@
+#include "AbstractAlphabet.hpp"
+
+#include <iostream>
+#include <cassert>
+
+
+Alphabet getTypeFromString(std::string str)
+{
+  auto type = Alphabet::DNA; 
+  if( str.compare("DNA") == 0  )
+    type = Alphabet::DNA; 
+  else if(str.compare("PROT") == 0 )
+    type = Alphabet::PROTEIN; 
+  else if(str.compare("BIN") == 0 )
+    type = Alphabet::BINARY; 
+  else 
+    {
+      std::cout << "unknown model >" << str << "<" << std::endl;
+      assert(0); 
+    }
+      
+  return type; 
+}
+ 
+std::string getStringFromType(Alphabet type)
+{
+  switch(type)
+    {
+    case Alphabet::DNA: 
+      return "DNA"; 
+    case Alphabet::PROTEIN: 
+      return "PROT" ; 
+    case Alphabet::BINARY:
+      return "BIN"; 
+    default: 
+      assert(0); 
+    }
+
+  return "BIN"; 
+}
+
+
diff --git a/src/model/AbstractAlphabet.hpp b/src/model/AbstractAlphabet.hpp
new file mode 100644
index 0000000..30a08fd
--- /dev/null
+++ b/src/model/AbstractAlphabet.hpp
@@ -0,0 +1,43 @@
+#ifndef ABSTRACT_ALPHABET
+#define ABSTRACT_ALPHABET 
+
+#include <vector> 
+#include <string>
+
+typedef unsigned int nat; 
+
+
+enum class Alphabet  : int 
+  {
+    BINARY = 1 , 
+      DNA = 2 , 
+      PROTEIN  = 3 
+  }; 
+
+
+Alphabet getTypeFromString(std::string str); 
+std::string getStringFromType(Alphabet type); 
+
+
+
+
+class AbstractAlphabet
+{
+public: 
+  virtual ~AbstractAlphabet(){}
+  virtual std::vector<std::string> getStates() = 0 ; 
+  std::vector<std::string> getCombinations() 
+  {
+    auto result = std::vector<std::string>{}; 
+    auto names = getStates();
+
+    for(nat i = 0; i < names.size() ; ++i)
+      for(nat j = i+1 ; j < names.size()  ; ++j)
+	result.push_back(names[i] + "<->"  + names[j]);
+  
+    return result; 
+  } 
+
+}; 
+
+#endif
diff --git a/src/model/AminoAcidAlphabet.hpp b/src/model/AminoAcidAlphabet.hpp
new file mode 100644
index 0000000..fc2ebe7
--- /dev/null
+++ b/src/model/AminoAcidAlphabet.hpp
@@ -0,0 +1,19 @@
+#ifndef AMINO_ACID_ALPHABET
+#define AMINO_ACID_ALPHABET
+
+#include "AbstractAlphabet.hpp"
+
+class AminoAcidAlphabet : public AbstractAlphabet
+{
+public : 
+  virtual std::vector<std::string> getStates()  
+  {
+    return {
+      "A","R","N","D","C","Q","E","G","H",
+	"I","L","K","M","F","P","S","T","W","Y","V"
+	}; 
+  }
+
+}; 
+
+#endif
diff --git a/src/model/BinaryAlphabet.hpp b/src/model/BinaryAlphabet.hpp
new file mode 100644
index 0000000..8b9fa13
--- /dev/null
+++ b/src/model/BinaryAlphabet.hpp
@@ -0,0 +1,23 @@
+#ifndef BINARYALPHABET_H
+#define BINARYALPHABET_H
+
+
+#include "AbstractAlphabet.hpp"
+
+
+// this should be simplified...not everything needs to be class 
+
+
+class BinaryAlphabet
+{
+public:
+  std::vector<std::string> getStates()
+  {
+    return { "0", "1" };
+  }
+};
+
+
+
+
+#endif /* BINARYALPHABET_H */
diff --git a/src/model/BranchLength.cpp b/src/model/BranchLength.cpp
new file mode 100644
index 0000000..bbf3f33
--- /dev/null
+++ b/src/model/BranchLength.cpp
@@ -0,0 +1,14 @@
+#include "BranchLength.hpp"
+
+void BranchLength::deserialize( std::istream &in )  
+{
+  BranchPlain::deserialize(in);
+  _length.deserialize(in); 
+}
+
+ 
+void BranchLength::serialize( std::ostream &out) const
+{
+  BranchPlain::serialize(out); 
+  _length.serialize(out); 
+}  
diff --git a/src/model/BranchLength.hpp b/src/model/BranchLength.hpp
new file mode 100644
index 0000000..557476d
--- /dev/null
+++ b/src/model/BranchLength.hpp
@@ -0,0 +1,53 @@
+#ifndef BRANCHLENGTH_H
+#define BRANCHLENGTH_H
+
+#include "BranchPlain.hpp"
+#include "InternalBranchLength.hpp"
+#include "Serializable.hpp"
+
+
+class BranchLength :  public BranchPlain 
+{
+public : 			// INHERITED 
+  virtual void deserialize( std::istream &in )  ; 
+  virtual void serialize( std::ostream &out) const;   
+
+public:
+  explicit BranchLength(const BranchPlain &b = BranchPlain(), InternalBranchLength len = 0 )
+    : BranchPlain(b)
+    , _length(len)
+  {
+  }
+  
+    virtual ~BranchLength(){}
+
+  double toMeanSubstitutions(double meanSubstRate) const 
+  {
+    return _length.toMeanSubstitutions(meanSubstRate); 
+  }
+
+  InternalBranchLength getLength() const 
+  {
+    return _length; 
+  }
+
+  void setLength(InternalBranchLength length)  
+  {
+    _length = length; 
+  }
+
+
+  BranchLength getInverted() const 
+  {
+    return BranchLength(BranchPlain::getInverted(), _length); 
+  }
+
+  
+private: 
+  InternalBranchLength _length; 
+};
+
+
+
+
+#endif /* BRANCHLENGTH_H */
diff --git a/src/model/BranchLengthResource.cpp b/src/model/BranchLengthResource.cpp
new file mode 100644
index 0000000..b84a49b
--- /dev/null
+++ b/src/model/BranchLengthResource.cpp
@@ -0,0 +1,64 @@
+#include "BranchLengthResource.hpp"
+#include "TreeAln.hpp"
+
+void BranchLengthResource::initialize(size_t numTax, size_t numPart )
+{
+  _numTax = numTax; 
+  _numPart = numPart; 
+
+  _zqr.resize(_numPart); 
+  _currentZQR.resize(_numPart); 
+  _currentLZR.resize(_numPart); 
+  _currentLZQ.resize(_numPart); 
+  _currentLZS.resize(_numPart); 
+  _currentLZI.resize(_numPart); 
+  _lzs.resize(_numPart); 
+  _lzq.resize(_numPart); 
+  _lzr.resize(_numPart); 
+  _lzi.resize(_numPart); 
+
+  for(nat i = 0; i < _numTax; ++i)
+    {
+      _qz.push_back(std::vector<double>(_numPart,0));
+      _rz.push_back(std::vector<double>(_numPart,0));
+    }
+  
+  for(nat i = 0; i < _numTax + 3 * (_numTax-1); ++i)
+    _z.push_back(std::vector<double>(_numPart,0));
+
+  _parameterValues.resize(numPart);
+} 
+
+
+void BranchLengthResource::assign(TreeAln &traln) 
+{
+  auto &tr = traln.getTrHandle();
+
+  tr.zqr = _zqr.data();
+  tr.currentZQR = _currentZQR.data(); 
+  tr.currentLZR = _currentLZR.data(); 
+  tr.currentLZQ = _currentLZQ.data(); 
+  tr.currentLZS = _currentLZS.data(); 
+  tr.currentLZI = _currentLZI.data(); 
+  tr.lzs = _lzs.data(); 
+  tr.lzq = _lzq.data(); 
+  tr.lzr = _lzr.data(); 
+  tr.lzi = _lzi.data(); 
+
+  for(nat i = 0; i < _numTax ; ++i)
+    {
+      tr.td[0].ti[i].qz = _qz.at(i).data(); 
+      tr.td[0].ti[i].rz = _rz.at(i).data(); 
+    }
+  
+  tr.td[0].parameterValues = _parameterValues.data();
+
+  nat ctr = 0; 
+  for(auto &n : traln._nodes)
+    {
+      n.z = _z.at(ctr).data(); 
+      ++ctr; 
+    }
+  assert(ctr == traln._nodes.size()); 
+}  
+
diff --git a/src/model/BranchLengthResource.hpp b/src/model/BranchLengthResource.hpp
new file mode 100644
index 0000000..d1ef5da
--- /dev/null
+++ b/src/model/BranchLengthResource.hpp
@@ -0,0 +1,67 @@
+#ifndef _BRANCH_LENGTH_RESOURCE
+#define _BRANCH_LENGTH_RESOURCE
+
+#include "pll.h"
+
+#include <vector>
+
+class TreeAln; 
+
+class BranchLengthResource
+{
+  friend class TreeAln;  	// this is a resouce class only; friendship is okay 
+
+public: 
+  
+  BranchLengthResource()
+    : _numTax{0}
+    , _numPart{0}
+    , _zqr{}
+    , _currentZQR{}
+    , _currentLZR{}
+    ,_currentLZQ{}
+    , _currentLZS{}
+    , _currentLZI{}
+    , _lzs{}
+    , _lzq{}
+    , _lzr{}
+    , _lzi{}
+    , _qz{}
+    , _rz{}
+    , _z{}
+    , _parameterValues{}
+  {}
+
+
+  ~BranchLengthResource(){}
+  BranchLengthResource(const BranchLengthResource& rhs) = default ; 
+  BranchLengthResource(BranchLengthResource&& rhs) = default; 
+  BranchLengthResource& operator=(const BranchLengthResource &rhs)  = default; 
+  BranchLengthResource& operator=( BranchLengthResource &&rhs) =default; 
+    
+  
+  void initialize(size_t numTax, size_t numPart ); 
+  void assign(TreeAln &traln) ;  
+
+private: 
+  size_t _numTax; 
+  size_t _numPart; 
+  
+  std::vector<double> _zqr  ;
+  std::vector<double> _currentZQR  ;
+  std::vector<double> _currentLZR  ;
+  std::vector<double> _currentLZQ  ;
+  std::vector<double> _currentLZS  ;
+  std::vector<double> _currentLZI  ;
+  std::vector<double> _lzs  ;
+  std::vector<double> _lzq  ;
+  std::vector<double> _lzr  ;
+  std::vector<double> _lzi  ;
+  std::vector< std::vector<double> > _qz; 
+  std::vector< std::vector<double> > _rz; 
+  std::vector< std::vector<double> > _z; 
+  
+  std::vector<double> _parameterValues; 
+}; 
+
+#endif
diff --git a/src/model/BranchLengths.cpp b/src/model/BranchLengths.cpp
new file mode 100644
index 0000000..b0c11e0
--- /dev/null
+++ b/src/model/BranchLengths.cpp
@@ -0,0 +1,16 @@
+#include "BranchLengths.hpp"
+
+void BranchLengths::deserialize( std::istream &in )
+{
+  BranchPlain::deserialize(in); 
+  for(auto &v : _lengths)
+    v.deserialize(in); 
+}
+
+ 
+void BranchLengths::serialize( std::ostream &out) const
+{
+  BranchPlain::serialize( out); 
+  for(auto &v : _lengths)
+    v.serialize(out); 
+} 
diff --git a/src/model/BranchLengths.hpp b/src/model/BranchLengths.hpp
new file mode 100644
index 0000000..6648b68
--- /dev/null
+++ b/src/model/BranchLengths.hpp
@@ -0,0 +1,46 @@
+#ifndef BRANCHLENGTHS_H
+#define BRANCHLENGTHS_H
+
+#include <vector>
+
+#include "BranchPlain.hpp"
+#include "InternalBranchLength.hpp"
+#include "Serializable.hpp"
+
+class BranchLengths : public BranchPlain
+{
+public: 
+  explicit BranchLengths(const BranchPlain &b = BranchPlain(),
+                         std::vector<InternalBranchLength> lengths = {{}})
+    : BranchPlain(b)
+    , _lengths(lengths)
+  {
+  }
+
+  virtual ~BranchLengths(){}
+
+  BranchLengths getInverted() const 
+  {
+    return BranchLengths(BranchPlain::getInverted(), _lengths); 
+  }
+
+  void setLengths(std::vector<InternalBranchLength> lengths)
+  {
+    _lengths = lengths; 
+  }
+
+  std::vector<InternalBranchLength> getLengths() const 
+  {
+    return _lengths; 
+  }
+
+  virtual void deserialize( std::istream &in ); 
+  virtual void serialize( std::ostream &out) const; 
+
+private: 
+  std::vector<InternalBranchLength> _lengths; 
+};
+
+
+
+#endif /* BRANCHLENGTHS_H */
diff --git a/src/model/BranchPlain.cpp b/src/model/BranchPlain.cpp
new file mode 100644
index 0000000..7106725
--- /dev/null
+++ b/src/model/BranchPlain.cpp
@@ -0,0 +1,50 @@
+#include "BranchPlain.hpp"
+
+
+
+nat getCommonNode(const BranchPlain &oneBranch, const BranchPlain &otherBranch) 
+{
+  // assert(isAdjacent(oneBranch, otherBranch)); 
+  if(not isAdjacent(oneBranch, otherBranch))
+    {
+      std::cout <<  SHOW(oneBranch) << SHOW(otherBranch) << std::endl; 
+      assert(0); 
+    }
+  
+
+  if(oneBranch.getPrimNode() == otherBranch.getPrimNode()
+     || oneBranch.getPrimNode() == otherBranch.getSecNode()) 
+    return oneBranch.getPrimNode(); 
+  else if(oneBranch.getSecNode() == otherBranch.getPrimNode()
+     || oneBranch.getSecNode() == otherBranch.getSecNode())
+    return oneBranch.getSecNode();
+  else 
+    // return oneBranch.getSecNode(); 
+    {
+      assert(0); 
+      return oneBranch.getPrimNode();
+    }
+} 
+
+bool isAdjacent(const BranchPlain &oneBranch, const BranchPlain& otherBranch)
+{
+  return oneBranch.getPrimNode() == otherBranch.getPrimNode()
+    || oneBranch.getPrimNode() == otherBranch.getSecNode()
+    || oneBranch.getSecNode() == otherBranch.getPrimNode() 
+    || oneBranch.getSecNode() == otherBranch.getSecNode(); 
+} 
+
+
+
+void BranchPlain::deserialize( std::istream &in )   
+{
+  _primNode = cRead<decltype(_primNode)>(in); 
+  _secNode = cRead<decltype(_secNode)>(in); 
+}
+
+ 
+void BranchPlain::serialize( std::ostream &out) const
+{
+  cWrite(out, _primNode);
+  cWrite(out, _secNode);
+}
diff --git a/src/model/BranchPlain.hpp b/src/model/BranchPlain.hpp
new file mode 100644
index 0000000..60d5fa9
--- /dev/null
+++ b/src/model/BranchPlain.hpp
@@ -0,0 +1,118 @@
+#ifndef BRANCHBASE_H
+#define BRANCHBASE_H
+
+#include <cassert>
+
+#include <fstream>
+
+#include "common.h"
+
+
+#include "Serializable.hpp"
+
+class BranchPlain   : public Serializable 
+{
+public: 			// INHERITED
+  virtual void deserialize( std::istream &in )   ; 
+  virtual void serialize( std::ostream &out) const;   
+  
+public:
+  explicit BranchPlain(nat a = 0, nat b = 0)
+    : _primNode{a}
+    , _secNode{b}
+  {}
+
+  virtual ~BranchPlain(){}
+
+  BranchPlain getInverted() const 
+  {
+    return BranchPlain(_secNode, _primNode); 
+  } 
+
+  bool operator==(const BranchPlain  &other) const 
+  {
+    return other._primNode == _primNode && other._secNode == _secNode; 
+  }
+
+
+  bool operator!=(const BranchPlain &other) const 
+  {
+    return not (*this == other); 
+  }
+
+  bool hasNode(nat aNode) const
+  {
+    return _primNode == aNode  || _secNode == aNode; 
+  }
+
+
+  nat getPrimNode() const 
+  {
+    return _primNode; 
+  }
+  
+  nat getSecNode() const 
+  {
+    return _secNode;
+  }
+
+  void setPrimNode(nat p)
+  {
+    _primNode = p; 
+  }
+
+  void setSecNode(nat p)
+  {
+    _secNode = p; 
+  }
+
+
+  nat getOtherNode(nat aNode) const
+  {
+    assert(hasNode(aNode)); 
+    return aNode == _primNode ? _secNode : _primNode; 
+  }
+
+  friend std::ostream& operator<<(std::ostream& s, const BranchPlain& c)
+  {
+    s << c._primNode << "," << c._secNode; 
+    return s;
+  }  
+
+
+private: 
+  nat _primNode; 
+  nat _secNode; 
+};
+
+
+
+
+namespace std
+{
+  template<> 
+  struct hash<BranchPlain>
+  {
+    size_t operator()(const BranchPlain & x) const
+    {
+      return std::hash<size_t>()(x.getSecNode()) ^ std::hash<size_t>()(x.getPrimNode()); 
+    }
+  }; 
+
+  template<> 
+  struct equal_to<BranchPlain>
+  {
+    bool operator()(const BranchPlain &a, const BranchPlain &b)  const
+    {
+      return a == b || a.getInverted() == b  ; 
+    }
+  }; 
+}
+
+nat getCommonNode(const BranchPlain &oneBranch, const BranchPlain &otherBranch) ; 
+bool isAdjacent(const BranchPlain &oneBranch, const BranchPlain& otherBranch); 
+
+#endif /* BRANCHBASE_H */
+
+
+
diff --git a/src/model/Category.cpp b/src/model/Category.cpp
new file mode 100644
index 0000000..88b820c
--- /dev/null
+++ b/src/model/Category.cpp
@@ -0,0 +1,223 @@
+#include "Category.hpp"
+#include <cassert>
+#include <memory>
+#include <algorithm>
+
+#include "ProtModelParameter.hpp"
+#include "AbstractParameter.hpp"
+#include "BranchLengthsParameter.hpp"
+#include "FrequencyParameter.hpp" 
+#include "ParameterContent.hpp"
+#include "RateHetParameter.hpp"
+#include "RevMatParameter.hpp"
+#include "TopologyParameter.hpp"
+
+#include "DivergenceTimes.hpp"
+#include "DivergenceRates.hpp"
+
+
+using namespace std;
+
+namespace CategoryFuns
+{
+  
+  std::string getShortName(Category cat)
+  {
+    switch(cat)
+      {
+      case Category::TOPOLOGY: 
+	return "topo"; 
+      case Category::BRANCH_LENGTHS: 
+	return "brlens"; 
+      case Category::FREQUENCIES: 
+	return "statefreq"; 
+      case Category::SUBSTITUTION_RATES : 
+	return "revmat"; 
+      case Category::RATE_HETEROGENEITY : 
+	return "ratehet"; 
+      case Category::AA_MODEL : 
+	return "aamdel"; 
+      case Category::DIVERGENCE_RATES : 
+	return "divrates"; 
+      case Category::DIVERGENCE_TIMES : 
+	return "divtimes"; 
+      default: 
+	{
+	  assert(0); 
+	  return "divtimes"; 
+	}
+      }
+  }
+
+
+  std::string getComponentName(Category cat)
+  {
+    switch(cat)
+      {
+      case Category::DIVERGENCE_RATES: 
+	return "dR"; 
+      case Category::DIVERGENCE_TIMES: 
+	return "time"; 
+      case Category::TOPOLOGY:
+	return "topo" ;
+      case Category::BRANCH_LENGTHS:
+	return "v" ;
+      case Category::FREQUENCIES :
+	return "pi" ;
+      case Category::SUBSTITUTION_RATES:
+	return "r";
+      case Category::RATE_HETEROGENEITY :
+	return "shape" ;
+      case Category::AA_MODEL:
+	return "aaModel" ;
+      default: 
+	assert(0); 
+	return "NOTHING"; 
+      }
+  }
+ 
+  std::string getPriorName(Category cat)
+  {
+    switch(cat)
+      {
+      case Category::DIVERGENCE_TIMES: 
+	return "TIMEPR"; 
+      case Category::DIVERGENCE_RATES:
+	return "DIVRATEPR"; 
+      case Category::TOPOLOGY: 
+	return "TOPOPR"; 
+      case Category::BRANCH_LENGTHS: 
+	return "BRLENPR";
+      case Category::FREQUENCIES: 
+	return "STATEFREQPR";
+      case Category::SUBSTITUTION_RATES: 
+	return "REVMATPR";
+      case Category::AA_MODEL:
+	return "AAPR"; 
+      case Category::RATE_HETEROGENEITY: 
+	return "SHAPEPR"; 
+      default: 
+	assert(0); 
+      }
+  } 
+
+
+  std::vector<Category> getAllCategories()
+  {
+    return {  
+      Category::TOPOLOGY, 
+	Category::DIVERGENCE_TIMES, 
+	Category::DIVERGENCE_RATES, 
+	Category::BRANCH_LENGTHS, 
+	Category::FREQUENCIES, 
+	Category::AA_MODEL,
+	Category::SUBSTITUTION_RATES, 
+	Category::RATE_HETEROGENEITY 
+	} ; 
+  }
+
+
+  Category getCategoryByPriorName(std::string name)
+  {
+    // bad but this is a bit exhausting... 
+    auto cats = getAllCategories();
+    
+    std::transform(begin(name), end(name), begin(name), ::toupper);
+
+    for(auto c : cats)
+      {
+	if(getPriorName(c).compare(name) == 0)
+	  return c; 
+      }
+
+    tout << "Error in config file: did not find >" << name << "<" << std::endl; 
+
+    assert(0); 
+    return cats[0]; 
+  }
+
+
+  Category getCategoryFromLinkLabel(std::string name)
+  {
+    std::transform(name.begin(), name.end(), name.begin(), ::tolower);
+
+    auto cats = getAllCategories(); 
+
+    auto result = Category::TOPOLOGY; 
+    for(auto cat : cats)
+      {
+	if( getShortName(cat).compare(name) == 0 )
+	  result = cat; 
+      }
+    return result; 
+  }
+
+
+
+  
+  
+
+
+  std::unique_ptr<AbstractParameter> getParameterFromCategory(Category cat, nat id, nat idOfMyKind, std::vector<nat> partitions, nat numTaxa)
+  {
+    switch(cat)
+      {
+      case Category::DIVERGENCE_RATES: 
+	return make_unique<DivergenceRates>(id, idOfMyKind, partitions,numTaxa);
+      case Category::DIVERGENCE_TIMES: 
+	// dummy initialize, let's set the proper node-age object
+	// later, as soon as we know the topology 
+	return make_unique<DivergenceTimes>(id, idOfMyKind, partitions, NodeAge{BranchPlain(0,0),0.}); 
+      case Category::TOPOLOGY :
+	return  make_unique<TopologyParameter>( id, idOfMyKind,partitions );
+      case Category::BRANCH_LENGTHS:
+	return  make_unique<BranchLengthsParameter>( id, idOfMyKind, partitions);
+      case Category::FREQUENCIES :
+	return  make_unique<FrequencyParameter>( id, idOfMyKind,partitions);
+      case Category::SUBSTITUTION_RATES :
+	return  make_unique<RevMatParameter>( id, idOfMyKind,partitions);
+      case Category::RATE_HETEROGENEITY:
+	return  make_unique<RateHetParameter>( id, idOfMyKind,partitions);
+      case Category::AA_MODEL :
+	return make_unique<ProtModelParameter>( id, idOfMyKind,partitions);
+      default : 
+	{
+	  assert(0); 
+	  return make_unique<RateHetParameter>(id, idOfMyKind, partitions);
+	}
+      }    
+  }  
+  
+  // should the catogry by default be linked into a continuous block     
+  bool inUniqueByDefault(Category cat)
+  {
+    return
+      cat == Category::TOPOLOGY
+      || cat == Category::BRANCH_LENGTHS
+      || cat == Category::DIVERGENCE_TIMES ; 
+  }
+
+  
+  std::vector<Category> getConflictingCategories(Category cat) 
+  {
+    switch(cat)
+      {
+      case Category::TOPOLOGY:
+      case Category::BRANCH_LENGTHS: 
+	return {Category::DIVERGENCE_TIMES, Category::DIVERGENCE_RATES}; 
+      case Category::DIVERGENCE_RATES:
+      case Category::DIVERGENCE_TIMES: 
+	return {Category::BRANCH_LENGTHS, Category::TOPOLOGY}; 
+      case Category::SUBSTITUTION_RATES:
+	return {Category::AA_MODEL}; 
+      case Category::AA_MODEL:
+	return {Category::SUBSTITUTION_RATES}; 
+      case Category::FREQUENCIES:
+      case Category::RATE_HETEROGENEITY: 
+      default : 
+	return {}; 
+      }
+  } 
+}
+
+
diff --git a/src/model/Category.hpp b/src/model/Category.hpp
new file mode 100644
index 0000000..50b80eb
--- /dev/null
+++ b/src/model/Category.hpp
@@ -0,0 +1,77 @@
+#ifndef _CATEGORIES_H
+#define _CATEGORIES_H
+
+#include <vector>
+#include <string>
+#include <memory>
+#include "AbstractParameter.hpp"
+
+enum class Category :  int  
+{  
+  TOPOLOGY = 0, 
+    BRANCH_LENGTHS = 1, 
+    FREQUENCIES = 2,
+    SUBSTITUTION_RATES = 3,
+    RATE_HETEROGENEITY = 4,	
+    AA_MODEL= 5, 
+    DIVERGENCE_RATES = 6 ,
+    DIVERGENCE_TIMES = 7, 
+} ; 
+
+
+namespace std
+{
+  template<> struct less<Category>
+  {
+    bool operator()(const Category& a, const Category& b) const 
+    {
+      return  int(a) < int(b); 
+    }
+  };
+    
+  template<> struct hash<Category>
+  {
+    size_t operator()(const Category& a) const 
+    {
+      return std::hash<size_t>()(size_t(a)); 
+    }
+  }; 
+}
+
+namespace CategoryFuns 
+{
+  bool inUniqueByDefault(Category cat); 
+
+  std::vector<Category> getConflictingCategories(Category cat) ; 
+
+  /** 
+      @brief gets a list of all categories 
+   */ 
+  std::vector<Category> getAllCategories(); 
+  /** 
+      @brief gets the short name of a category 
+   */ 
+  std::string getShortName(Category cat); 
+  /** 
+      @brief gets the name of the prior that is associated with a category 
+   */ 
+  std::string getPriorName(Category cat); 
+  /** 
+      @brief gets the category by name  
+   */ 
+  Category getCategoryByPriorName(std::string name); 
+  /** 
+      @brief gets the category by name of the linking parameter in the config file 
+   */   
+  Category getCategoryFromLinkLabel(std::string name); 
+
+  std::string getComponentName(Category cat); 
+  
+  std::unique_ptr<AbstractParameter> getParameterFromCategory(Category cat, nat id, nat idOfMyKind, std::vector<nat> partitions, nat numTaxa); 
+  
+} 
+
+#endif
+ 
+
+
diff --git a/src/model/DnaAlphabet.hpp b/src/model/DnaAlphabet.hpp
new file mode 100644
index 0000000..753fb0d
--- /dev/null
+++ b/src/model/DnaAlphabet.hpp
@@ -0,0 +1,17 @@
+#ifndef DNA_ALPHABET
+#define DNA_ALPHABET
+
+#include "AbstractAlphabet.hpp"
+
+class DnaAlphabet : public AbstractAlphabet
+{
+public : 
+  std::vector<std::string> getStates()  
+  {
+    return { "A" , "C", "G", "T"} ; 
+  } 
+}; 
+
+
+
+#endif
diff --git a/src/model/InternalBranchLength.cpp b/src/model/InternalBranchLength.cpp
new file mode 100644
index 0000000..529e47c
--- /dev/null
+++ b/src/model/InternalBranchLength.cpp
@@ -0,0 +1,30 @@
+#include "InternalBranchLength.hpp"
+
+#include <cmath>
+
+InternalBranchLength InternalBranchLength::fromAbsolute(double absLen, double meanSubstRate)
+{
+  auto result = InternalBranchLength{}; 
+  auto internal = exp( - (absLen  /  meanSubstRate) ) ;
+  result._internalBranchLength = internal;
+  return result;
+}
+
+
+double InternalBranchLength::toMeanSubstitutions(double meanSubstRate) const 
+{
+  return -log(_internalBranchLength) * meanSubstRate; 
+}
+
+
+
+void InternalBranchLength::deserialize( std::istream &in )
+{
+  _internalBranchLength = cRead<double>(in); 
+}
+
+
+void InternalBranchLength::serialize( std::ostream &out) const
+{
+  cWrite(out, _internalBranchLength); 
+}   
diff --git a/src/model/InternalBranchLength.hpp b/src/model/InternalBranchLength.hpp
new file mode 100644
index 0000000..887b721
--- /dev/null
+++ b/src/model/InternalBranchLength.hpp
@@ -0,0 +1,50 @@
+#ifndef INTERNALBRANCHLENGTH_H
+#define INTERNALBRANCHLENGTH_H
+
+
+#include "Serializable.hpp"
+
+class InternalBranchLength : public Serializable
+{
+public: 			// INHERITED
+  
+  virtual void deserialize( std::istream &in )   ; 
+  virtual void serialize( std::ostream &out) const;   
+
+
+public:
+  InternalBranchLength(double z = 0)
+    : _internalBranchLength {z }
+  {
+  }
+  
+  virtual ~InternalBranchLength() { }
+  
+
+  /** 
+      Creates an internal branch length (i.e., z-value) for a tree 
+   */ 
+  static InternalBranchLength fromAbsolute(double absLen, double meanSubstRate);
+
+  double getValue() const 
+  {
+    return _internalBranchLength; 
+  }
+
+
+  void setValue(double val)
+  {
+    _internalBranchLength = val;
+  }
+
+  
+  double toMeanSubstitutions(double meanSubstRate) const ;
+
+private: 
+  double _internalBranchLength; 
+};
+ 
+
+
+
+#endif /* INTERNALBRANCHLENGTH_H */
diff --git a/src/model/NodeAge.cpp b/src/model/NodeAge.cpp
new file mode 100644
index 0000000..5e9b30d
--- /dev/null
+++ b/src/model/NodeAge.cpp
@@ -0,0 +1,16 @@
+#include "NodeAge.hpp"
+
+
+void NodeAge::deserialize( std::istream &in )  
+{
+  BranchPlain::deserialize(in); 
+  _height = cRead<double>(in); 
+}
+
+
+void NodeAge::serialize( std::ostream &out) const
+{
+  BranchPlain::serialize(out); 
+  cWrite(out, _height); 
+}   
+
diff --git a/src/model/NodeAge.hpp b/src/model/NodeAge.hpp
new file mode 100644
index 0000000..5dc7c36
--- /dev/null
+++ b/src/model/NodeAge.hpp
@@ -0,0 +1,33 @@
+#ifndef NODEAGE_H
+#define NODEAGE_H
+
+#include "BranchPlain.hpp"
+
+// for this class, _primNode is the node, we identify the age for 
+
+// _secNode points upwards (with the NOT having any upward node)
+
+
+class NodeAge : public BranchPlain
+{
+public:
+  NodeAge(const BranchPlain &b = BranchPlain(), double h = 0)
+    : BranchPlain(b)
+    , _height{h}
+  {}
+  virtual ~NodeAge(){}
+
+  virtual void deserialize( std::istream &in )  ; 
+  virtual void serialize( std::ostream &out) const;   
+
+  void setHeight(double height) { _height = height; }
+  double getHeight(void) const { return _height; }
+
+private: 
+  double _height;  
+};
+
+
+
+
+#endif /* NODEAGE_H */
diff --git a/src/model/Partition.cpp b/src/model/Partition.cpp
new file mode 100644
index 0000000..ea39055
--- /dev/null
+++ b/src/model/Partition.cpp
@@ -0,0 +1,485 @@
+#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
+
+#include <algorithm>
+#include <cstring>
+#include <cassert>
+
+#include <iostream>
+
+#include "Partition.hpp"
+#include "GlobalVariables.hpp" 
+
+#include "BitMask.hpp"
+
+extern const char inverseMeaningDNA[16]; // TODO remove 
+
+int Partition::maxCategories = 4; 	// TODO!!!
+
+Partition::Partition(nat numTax, std::string name, int dataType, int states , int maxTipStates, bool saveMemory)
+  : _saveMemory{saveMemory}
+  , _numTax{numTax}
+  , _partition{}
+  , _name{name}
+  , _wgtPtr{nullptr}
+  , _y{nullptr}
+  , _left{}
+  , _right{}
+  , _EV{}
+  , _tipVector{}
+  , _EIGN{}
+  , _EI{}
+  , _substRates{}
+  , _frequencies{}
+  , _empiricalFrequencies{}
+  , _gammaRates{}
+  , _globalScaler{}
+  , _yPtrs{}
+  , _xVector{}
+  , _xSpaceVector{}
+  , _parsVect(nullptr)
+  , _parsimonyScore{}
+  , _parsimonyInformative(0) 
+  , _gapVector(0)
+  , _gapColumn(0)
+  , _sumBuffer{}
+{
+  // allocate more space for aa matrices, since we maybe use lg4    
+  auto duplicity = dataType == PLL_AA_DATA ? 4 : 1 ; 
+
+  // std::cout << SyncOut() << "init partition" << std::endl; x
+  memset(&_partition, 0, sizeof(pInfo)); 
+  defaultInit();
+
+  _partition.dataType = dataType; 
+  _partition.maxTipStates = maxTipStates; 
+  _partition.states = states; 
+
+  const partitionLengths 
+    *pl = getPartitionLengths(&_partition); 
+  
+  // allocate the memory 
+  _left.resize( pl->leftLength * (maxCategories + 1));  
+  _right.resize( pl->rightLength * (maxCategories + 1)); 
+  _EV.resize(pl->evLength * duplicity);
+  _tipVector.resize(pl->tipVectorLength * duplicity);
+  _EIGN.resize( pl->eignLength * duplicity ); 
+  _EI.resize(pl->eiLength * duplicity);
+  _substRates.resize(pl->substRatesLength * duplicity); 
+  _frequencies.resize(pl->frequenciesLength * duplicity); 
+  _empiricalFrequencies.resize(pl->frequenciesLength); 
+  _globalScaler.resize(2 * _numTax); 
+  _yPtrs.resize(_numTax + 1);
+
+  _parsimonyScore.resize( 2 * numTax); 
+
+  _gammaRates.resize(Partition::maxCategories); // =(
+
+  _xVector.resize(_numTax, nullptr);
+  _xSpaceVector.resize(_numTax); 
+  
+  setPtrs();
+}
+
+
+Partition::Partition(const Partition &rhs)
+  : _saveMemory (rhs._saveMemory )
+  , _numTax(rhs._numTax)
+  , _partition(rhs._partition)
+  , _name (rhs._name )
+  , _wgtPtr (rhs._wgtPtr )
+  , _y (rhs._y )
+  , _left (rhs._left )
+  , _right (rhs._right )
+  , _EV (rhs._EV )
+  , _tipVector (rhs._tipVector )
+  , _EIGN (rhs._EIGN )
+  , _EI (rhs._EI )
+  , _substRates (rhs._substRates )
+  , _frequencies (rhs._frequencies )
+  , _empiricalFrequencies(rhs._empiricalFrequencies) 
+  , _gammaRates  (rhs._gammaRates  )
+  , _globalScaler (rhs._globalScaler )
+  , _yPtrs (rhs._yPtrs )
+  , _xVector (rhs._xVector.size(), nullptr  )
+  , _xSpaceVector (rhs._xSpaceVector.size() , 0  )
+  , _parsVect (rhs._parsVect )
+  , _parsimonyScore (rhs._parsimonyScore )
+  , _parsimonyInformative(rhs._parsimonyInformative)
+  , _gapVector(rhs._gapVector)
+  , _gapColumn(rhs._gapColumn)
+  , _sumBuffer(rhs._sumBuffer)
+{
+  defaultInit();
+  setPtrs();
+}
+
+
+void Partition::defaultInit()
+{
+  _partition.optimizeBaseFrequencies = PLL_FALSE; 
+  _partition.partitionLH = 1; 
+  _partition.executeModel = PLL_TRUE; 
+}
+
+
+void Partition::setPtrs()
+{
+  _partition.left = _left.data(); 
+  _partition.right = _right.data();
+
+  _partition.EV = _EV.data();
+  _partition.tipVector = _tipVector.data(); // ***TODO*** actually needed? 
+  _partition.EIGN = _EIGN.data();
+  _partition.EI = _EI.data();
+  _partition.substRates = _substRates.data();
+  _partition.frequencies = _frequencies.data();
+  _partition.empiricalFrequencies = _empiricalFrequencies.data();
+  _partition.gammaRates = _gammaRates.data();
+  _partition.globalScaler = _globalScaler.data(); 
+  _partition.yVector = _yPtrs.data();
+
+  _partition.xVector = _xVector.data(); 
+  _partition.xSpaceVector = _xSpaceVector.data();
+
+  _partition.parsVect = _parsVect.get();
+  _partition.parsimonyScore = _parsimonyScore.data();		
+
+  _partition.gapVector = _gapVector.data();
+  _partition.gapColumn = _gapColumn.data(); 
+  
+  _partition.sumBuffer = _sumBuffer.data();
+
+  // set lg4 ptrs 
+  if(getDataType() == PLL_AA_DATA)
+    {
+      const partitionLengths 
+	*pl = getPartitionLengths(&_partition); 
+
+      for(int i = 0 ; i < 4 ; ++i)
+	{
+	  _partition.EIGN_LG4[i] = _EIGN.data() + (pl->eignLength * i ); 
+	  _partition.EI_LG4[i] = _EI.data() + (pl->eiLength * i); 
+	  _partition.EV_LG4[i] = _EV.data() + (pl->evLength * i); 
+	  _partition.tipVector_LG4[i] =  _tipVector.data() + (pl->tipVectorLength * i); 
+	  _partition.substRates_LG4[i] = _substRates.data() + (pl->substRatesLength * i); 
+	  _partition.frequencies_LG4[i] = _frequencies.data() +  (pl->frequenciesLength * i) ; 
+	}
+    }
+}
+
+
+// TODO should be movable, non-copyable 
+
+
+Partition& Partition::operator=( Partition rhs)
+{
+  // std::cout << SyncOut() << "assign partition" << std::endl; 
+  swap(rhs,*this); 
+  return *this; 
+} 
+
+
+void swap(Partition& lhs, Partition& rhs)
+{
+  using std::swap; 
+
+  swap(lhs._saveMemory, rhs._saveMemory); 
+  swap(lhs._numTax, rhs._numTax); 
+  swap(lhs._partition, rhs._partition); 
+  swap(lhs._name, rhs._name); 
+
+  swap(lhs._wgtPtr, rhs._wgtPtr); 
+  swap(lhs._y, rhs._y); 
+
+  swap(lhs._left, rhs._left);
+  swap(lhs._right,rhs._right);
+  swap(lhs._EV,rhs._EV);
+  swap(lhs._tipVector, rhs._tipVector); 
+  swap(lhs._EIGN,rhs._EIGN);  
+  swap(lhs._EI,rhs._EI);
+  swap(lhs._substRates,rhs._substRates);
+  swap(lhs._frequencies,rhs._frequencies);
+  swap(lhs._empiricalFrequencies, rhs._empiricalFrequencies); 
+  swap(lhs._gammaRates,rhs._gammaRates);  
+  swap(lhs._globalScaler, rhs._globalScaler); 
+  swap(lhs._yPtrs, rhs._yPtrs); 
+
+  swap(lhs._xVector, rhs._xVector); 
+  swap(lhs._xSpaceVector, rhs._xSpaceVector); 
+
+  swap(lhs._parsVect, rhs._parsVect); 
+  swap(lhs._parsimonyScore, rhs._parsimonyScore); 
+
+  swap(lhs._parsimonyInformative, rhs._parsimonyInformative); 
+  swap(lhs._gapVector, rhs._gapVector); 
+  swap(lhs._gapColumn, rhs._gapColumn); 
+  
+  swap(lhs._sumBuffer, rhs._sumBuffer); 
+} 
+
+
+void Partition::initGapVectorStruct()  
+{
+  assert(_saveMemory); 
+  setGapVectorLength(  getWidth() / 32 + 1 ); 
+  assert(sizeof(unsigned int) == 4); 
+  _gapVector.resize(getGapVectorLength() * 2 * _numTax , 0 );
+  _gapColumn.resize(_numTax * getStates() * maxCategories,0); 
+}
+
+
+
+void Partition::setAlignment( shared_pod_ptr<unsigned char> aln, int width)
+{
+  _y = aln; 
+  _partition.width = width; 
+
+  _yPtrs.at(0) = nullptr; 
+  nat pos = 0; 
+  for(nat i = 1 ; i < _numTax+1; ++i)
+    {
+      _yPtrs.at(i) = _y.get() + (pos * width) ; 
+      ++pos; 
+    }
+
+  _sumBuffer.resize(_partition.width * _partition.states * maxCategories,0);
+  _partition.sumBuffer = _sumBuffer.data();
+
+  _partition.yVector = _yPtrs.data(); 
+  
+  if(_saveMemory)
+    initGapVectorStruct(); 
+
+  prepareParsimony();
+}
+ 
+
+void Partition::setWeights(shared_pod_ptr<int> wgts, int width)
+{
+  _wgtPtr = wgts; 
+  _partition.width = width; 
+  _partition.wgt = _wgtPtr.get();
+} 
+
+
+void Partition::compressDNA(const std::vector<bool> &informative)
+{
+  auto totalNodes = 2 * _numTax;
+
+  auto states = getStates(); 
+  auto width = getWidth(); 
+
+  auto entries = 0; 
+  for(int i = 0; i < width; i++)    
+    if(informative[i])
+      entries += _partition.wgt[i];  
+
+  nat compressedEntries = entries / PLL_PCF;
+
+  if(entries % PLL_PCF != 0)
+    compressedEntries++;
+
+  nat compressedEntriesPadded = compressedEntries; 
+#if (defined(__SSE3) || defined(__AVX))
+  if(compressedEntries % INTS_PER_VECTOR != 0)
+    compressedEntriesPadded = compressedEntries + (INTS_PER_VECTOR - (compressedEntries % INTS_PER_VECTOR));
+  else
+    compressedEntriesPadded = compressedEntries;
+#else
+  compressedEntriesPadded = compressedEntries;
+#endif     
+
+  auto mask32 = BitMask<nat>();
+
+  _partition.parsimonyLength = compressedEntriesPadded; 
+
+  auto ptr = aligned_malloc<nat, size_t(EXA_ALIGN)>(compressedEntriesPadded * states * totalNodes); 
+  std::fill(ptr, ptr  + compressedEntriesPadded * states * totalNodes, 0 );
+  _parsVect = shared_pod_ptr<nat>(ptr);
+  _partition.parsVect = _parsVect.get(); 
+
+  const nat 
+    *bitValue = getBitVector(_partition.dataType);
+
+  for(nat taxIter = 1; taxIter <= _numTax; taxIter++)
+    {			
+      size_t
+	compressedIndex = 0,
+	compressedCounter = 0; 
+
+      auto alnLine = _partition.yVector[taxIter]; 
+
+      auto compressedValues = std::vector<nat>(states , 0 );
+      auto compressedTips = std::vector<nat*>(states, nullptr);
+      for(int k = 0 ; k < states; k++)
+	compressedTips[k] = _partition.parsVect + ( (compressedEntriesPadded * states * taxIter) + (compressedEntriesPadded * k) ) ; 
+
+      for(int index = 0; index < width; index++)
+	{
+	  if(informative[index])
+	    {
+	      auto 
+		value = bitValue[alnLine[index]]; 
+              
+	      for(int w = 0; w < _partition.wgt[index]; w++)
+		{      
+		  for(int k = 0; k < states; k++)
+		    {
+		      if(value & mask32[k])
+			compressedValues[k] |= mask32[int(compressedCounter)];
+		    }
+                     
+		  compressedCounter++;
+                  
+		  if(compressedCounter == PLL_PCF)
+		    {
+		      for(int k = 0; k < states; k++)
+			{
+			  compressedTips[k][compressedIndex] = compressedValues[k];
+			  compressedValues[k] = 0;
+			}                    
+                          
+		      compressedCounter = 0;
+		      compressedIndex++;
+		    }
+		}
+	    }
+	}
+                           
+      for(;compressedIndex < compressedEntriesPadded; compressedIndex++)
+	{   
+	  for(;compressedCounter < PLL_PCF; compressedCounter++)              
+	    for(int k = 0; k < states; k++)
+	      compressedValues[k] |= mask32[int(compressedCounter)];               
+          
+	  for(int k = 0; k < states; k++)
+	    {
+	      compressedTips[k][compressedIndex] = compressedValues[k];
+	      compressedValues[k] = 0;
+	    }                     
+              
+	  compressedCounter = 0;
+	}           
+    }               
+}
+
+
+
+
+bool Partition::isInformative(int site) const 
+{
+  auto dataType = getDataType();
+
+  int
+    check[256],   
+    undetermined = getUndetermined(dataType);
+  memset(check, 0, sizeof(int) * 256); 
+
+  const nat
+    *bitVector = getBitVector(dataType);
+  
+  for(nat i = 1 ; i <= _numTax; ++i)
+    {      
+      auto nucleotide = _partition.yVector[i][site];            
+      ++check[nucleotide];
+      assert(bitVector[nucleotide] > 0);                   
+    }
+  
+  nat infoCtr = 0; 
+  for( int i = 0; i < undetermined; ++i)
+    if(check[i] > 0)
+      ++infoCtr ; 
+
+  if(infoCtr <= 1 )
+    return false;    
+  else
+    {        
+      for(int i = 0; i < undetermined; i++)
+        {
+          if(check[i] > 1)
+            return true;
+        } 
+    }
+     
+  return false; 
+}
+
+
+std::vector<bool> Partition::determineUninformativeSites() const 
+{
+  auto result = std::vector<bool>(getWidth(), false);
+  for(int i = 0; i <  getWidth() ; ++i)
+    if(isInformative(i))
+      result[i]= true; 
+  return result; 
+}
+
+
+void Partition::prepareParsimony()
+{
+  if( not _parsimonyInformative.empty() )
+    {
+      // auto tp = getTimePoint(); 
+      compressDNA(_parsimonyInformative);
+      // out << "compress: "<< getDuration(tp) << " sec"  << std::endl; 
+    }
+  else 
+    {
+      // auto tp = getTimePoint(); 
+      auto informative = determineUninformativeSites();
+      // tout << "determine uninfo: "<< getDuration(tp)  << " sec"<< std::endl; 
+
+      // tp = getTimePoint(); 
+      compressDNA(informative);
+      // tout << "compress: "<< getDuration(tp) << " sec"  << std::endl; 
+    }
+}
+
+
+std::ostream& Partition::printAlignment(std::ostream &out)
+{
+  for(nat i = 1; i < _numTax+1; ++i)
+    {
+      for(int j = 0; j < getWidth(); ++j)
+	out << inverseMeaningDNA[_partition.yVector[i][j]] ; 
+      out << "\n"; 
+    }
+
+  return out; 
+}
+
+
+
+
+
+std::ostream& operator<<(std::ostream& out, const Partition& rhs )
+{
+  out << SHOW(  rhs._saveMemory)
+      << SHOW(rhs._numTax )
+      << SHOW( &(rhs._partition) ) 
+      << SHOW(rhs._name )
+      // << SHOW(rhs._wgtPtr.get() )
+      // << SHOW(rhs._y.get() )
+      << SHOW(  std::vector<double>(begin(rhs._left), end(rhs._left)) )
+      << SHOW(std::vector<double>(begin(rhs._right),end(rhs._right) ))
+      << SHOW(std::vector<double>(begin(rhs._EV),end(rhs._EV) ))
+      << SHOW(std::vector<double>(begin(rhs._tipVector),end(rhs._tipVector) ))
+      << SHOW(rhs._EIGN )
+      << SHOW(rhs._EI )
+      << SHOW(rhs._substRates )
+      << SHOW(rhs._frequencies )
+      << SHOW(rhs._empiricalFrequencies )
+      << SHOW(rhs._gammaRates  )
+      << SHOW(rhs._globalScaler )
+      << SHOW(rhs._yPtrs )
+      << SHOW(rhs._xVector )
+      << SHOW(rhs._xSpaceVector )
+    
+    // TODO 
+      // << SHOW(rhs._parsVect.get() )
+      // << SHOW(rhs._parsimonyScore)
+      // << SHOW(rhs._parsimonyInformative )
+      << SHOW(rhs._gapVector)
+      << SHOW(std::vector<double>(begin(rhs._gapColumn),end(rhs._gapColumn)  )); 
+  return out; 
+}
diff --git a/src/model/Partition.hpp b/src/model/Partition.hpp
new file mode 100644
index 0000000..4b41958
--- /dev/null
+++ b/src/model/Partition.hpp
@@ -0,0 +1,133 @@
+#ifndef _PARTITION_HPP
+#define _PARTITION_HPP
+
+#include "pll.h"
+#include <memory>
+#include "extensions.hpp"
+#include <iosfwd>
+
+
+class Partition
+{
+  static constexpr int INTS_PER_VECTOR = size_t(EXA_ALIGN) / sizeof(nat); 
+
+public:
+
+  static int maxCategories; 	// TODO 
+
+  Partition(nat numTax, std::string name, int dataType, int states , int maxTipStates, bool saveMemory); 
+  ~Partition(){}
+  Partition(const Partition &rhs); 
+  Partition( Partition &&rhs) = default ; 
+  Partition& operator=( Partition rhs); 
+  friend void swap(Partition& lhs, Partition& rhs) ; 
+
+  void defaultInit(); 
+
+  pInfo& getHandle() {return _partition;} 
+  const pInfo& getHandle() const {return _partition;} 
+  std::string getName() const {return _name; }
+
+  int getStates() const {return _partition.states; }
+  void setStates(int states) {_partition.states = states; }
+  
+  int getMaxTipStates() const {return _partition.maxTipStates; }
+  void setMaxTipStates(int s) {_partition.maxTipStates= s ; }
+  
+  int getLower() const {return _partition.lower; }
+  void setLower(int lower) { _partition.lower = lower; } 
+  
+  int getUpper() const {return _partition.upper; }
+  void setUpper( int upper) {_partition.upper = upper; }
+  
+  int getWidth() const {return _partition.width; }
+  void setWidth(int width) {_partition.width = width; }
+  
+  int getDataType() const {return _partition.dataType; }
+  void setDataType(int dataType) {_partition.dataType = dataType; }
+  
+  int getProtModels() const {return _partition.protModels; } 
+  void setProtModel(int protModel)  { _partition.protModels = protModel; }
+  
+  int getProtFreqs() const { return _partition.protUseEmpiricalFreqs ; }
+  void setProtFreqs(int protFreqs ) {_partition.protUseEmpiricalFreqs = protFreqs; }
+
+  void setNonGTR(int nonGTR){_partition.nonGTR = nonGTR; } 
+  int getNonGTR() const {return _partition.nonGTR; }
+
+  double getPartitionContribution() const {return _partition.partitionContribution; }
+  void setPartitionContribution(double tmp) {_partition.partitionContribution = tmp; }
+
+  void setAlignment(shared_pod_ptr<unsigned char> aln, int width ); 
+  void setWeights(shared_pod_ptr<int> wgts, int width); 
+
+  double getAlpha()const {return _partition.alpha; }
+  void setAlpha(double a){_partition.alpha = a; }
+
+  std::vector<double> getSubstRates() const { return _substRates; }
+  void setSubstRates(  std::vector<double> r)  { _substRates = r; }
+
+  std::vector<double> getFrequencies() const {return _frequencies; }
+  void setFrequencies(std::vector<double> f) {_frequencies = f;} 
+
+  void prepareParsimony(); 
+
+  double getFracChange() const {return _partition.fracchange; }
+  void setFracChange(double f) { _partition.fracchange = f; }
+
+  nat getPartitionParsimony(){return _parsimonyScore.at(0); }
+
+  std::ostream& printAlignment(std::ostream &out);
+
+  int getGapVectorLength() const { return _partition.gapVectorLength; }
+  void setGapVectorLength( int len) { _partition.gapVectorLength = len; }
+
+  void setParsimonyInformative(std::vector<bool> theInfo){_parsimonyInformative = theInfo; }
+
+  friend std::ostream& operator<<(std::ostream& out, const Partition& rhs ); 
+
+
+private: 			// METHODS
+  void setPtrs();
+  bool isInformative(int site) const; 
+  std::vector<bool> determineUninformativeSites() const ; 
+  void compressDNA(const std::vector<bool> &informative); 
+  void initGapVectorStruct()  ; 
+
+private: 			// ATTRIBUTES
+  bool _saveMemory; 
+  nat _numTax; 
+  pInfo _partition; 
+  std::string _name ;
+
+  shared_pod_ptr<int> _wgtPtr; 
+  shared_pod_ptr<unsigned char> _y; 
+  
+  typename aligned_vector<double>::type _left; 
+  typename aligned_vector<double>::type _right; 
+  typename aligned_vector<double>::type _EV; 
+  typename aligned_vector<double>::type _tipVector; 
+  std::vector<double> _EIGN; 
+  std::vector<double> _EI; 
+  std::vector<double> _substRates; 
+  std::vector<double> _frequencies; 
+  std::vector<double> _empiricalFrequencies; 
+  std::vector<double> _gammaRates ; 
+  std::vector<nat> _globalScaler; 
+  std::vector<unsigned char*> _yPtrs; 
+
+  std::vector<double*> _xVector; 
+  std::vector<size_t> _xSpaceVector; 
+
+  shared_pod_ptr<nat> _parsVect; 
+  std::vector<nat> _parsimonyScore;
+
+  std::vector<bool> _parsimonyInformative; 
+  std::vector<nat> _gapVector;
+  typename aligned_vector<double>::type _gapColumn ; 
+  typename aligned_vector<double>::type _sumBuffer; 
+
+};
+
+
+#endif
diff --git a/src/model/ProtModel.cpp b/src/model/ProtModel.cpp
new file mode 100644
index 0000000..e821368
--- /dev/null
+++ b/src/model/ProtModel.cpp
@@ -0,0 +1,112 @@
+#include "ProtModel.hpp"	
+#include <algorithm>
+#include <cctype>
+
+#include <tuple>
+#include <iostream>
+
+std::ostream& operator<<(std::ostream &out, const ProtModel &rhs)
+{
+  out << ProtModelFun::getName(rhs); 
+  return out; 
+}
+
+
+
+
+namespace ProtModelFun
+{
+  std::tuple<bool,ProtModel> getModelFromStringIfPossible(const std::string & modelString)
+  {
+    auto lower = [](const char c){ return tolower(c)  ; }; 
+    auto lowInputModel = std::string{};
+    std::transform(modelString.begin(), modelString.end(), std::back_inserter(lowInputModel),  lower);  
+    
+    for(auto model : getAllModels())
+      {
+	auto modelStringHere = getName(model);
+	auto lowModel = std::string{}; 
+	std::transform(modelStringHere.begin(), modelStringHere.end(), std::back_inserter(lowModel), lower);
+	
+	if( lowModel.compare(lowInputModel) == 0 )
+	  return std::make_tuple(true, model); 
+      }
+
+    return std::make_tuple(false, ProtModel::FLU_T); 
+  }
+  
+
+  std::vector<ProtModel> getAllModels()
+  {
+    return {ProtModel::DAYHOFF_T,
+	ProtModel::DCMUT_T,
+	ProtModel::JTT_T,
+	ProtModel::MTREV_T,
+	ProtModel::WAG_T,
+	ProtModel::RTREV_T,
+// 	ProtModel::LG4_T,
+	ProtModel::CPREV_T,
+	ProtModel::VT_T,
+	ProtModel::BLOSUM62_T,
+	ProtModel::MTMAM_T,
+	ProtModel::LG_T,
+	ProtModel::MTART_T,
+	ProtModel::MTZOA_T,
+	ProtModel::PMB_T,
+	ProtModel::HIVB_T,
+	ProtModel::HIVW_T,
+	ProtModel::JTTDCMUT_T,
+	ProtModel::FLU_T } ; 
+  }
+
+
+  std::string getName(ProtModel mod)
+  {
+    switch(mod)
+      {
+      case ProtModel::DAYHOFF_T:
+	return "DAYHOFF";
+      case ProtModel::DCMUT_T:
+	return "DCMUT";
+      case ProtModel::JTT_T:
+	return "JTT";
+      case ProtModel::MTREV_T:
+	return "MTREV";
+      case ProtModel::WAG_T:
+	return "WAG";
+      case ProtModel::RTREV_T:
+	return "RTREV";
+      case ProtModel::CPREV_T:
+	return "CPREV";
+      case ProtModel::VT_T:
+	return "VT";
+      case ProtModel::BLOSUM62_T:
+	return "BLOSUM62";
+      case ProtModel::MTMAM_T:
+	return "MTMAM";
+      case ProtModel::LG_T:
+	return "LG";
+      case ProtModel::LG4_T: 
+	return "LG4"; 
+      case ProtModel::MTART_T:
+	return "MTART";
+      case ProtModel::MTZOA_T:
+	return "MTZOA";
+      case ProtModel::PMB_T:
+	return "PMB";
+      case ProtModel::HIVB_T:
+	return "HIVB";
+      case ProtModel::HIVW_T:
+	return "HIVW";
+      case ProtModel::JTTDCMUT_T:
+	return "JTTDCMUT";
+      case ProtModel::FLU_T:
+	return "FLU";
+      default: 
+      	{
+      	  std::cerr << "error: encountered unknown protein model with internal value "<< int(mod) << std::endl; 
+      	  assert(0); 
+      	}
+      }
+  }
+}
diff --git a/src/model/ProtModel.hpp b/src/model/ProtModel.hpp
new file mode 100644
index 0000000..4cfa628
--- /dev/null
+++ b/src/model/ProtModel.hpp
@@ -0,0 +1,64 @@
+#ifndef PROT_MODEL_HPP_
+#define PROT_MODEL_HPP_
+
+#include <vector>
+#include <iostream>
+#include <string>
+#include <cassert>
+
+#include "pll.h"
+
+enum class ProtModel : int 
+{
+  DAYHOFF_T =    PLL_DAYHOFF,
+    DCMUT_T =      PLL_DCMUT,
+    JTT_T =        PLL_JTT,
+    MTREV_T =      PLL_MTREV,
+    WAG_T =        PLL_WAG,
+    RTREV_T =      PLL_RTREV,
+    CPREV_T =      PLL_CPREV,
+    VT_T =         PLL_VT,
+    BLOSUM62_T =   PLL_BLOSUM62,
+    MTMAM_T =      PLL_MTMAM,
+    LG_T =         PLL_LG,
+    MTART_T =      PLL_MTART,
+    MTZOA_T =      PLL_MTZOA,
+    PMB_T =        PLL_PMB,
+    HIVB_T =       PLL_HIVB,
+    HIVW_T =       PLL_HIVW,
+    JTTDCMUT_T =   PLL_JTTDCMUT,
+    FLU_T =        PLL_FLU, 
+    LG4_T =        PLL_LG4
+}; 
+
+
+namespace ProtModelFun
+{
+  std::string getName(ProtModel mod); 
+  std::vector<ProtModel> getAllModels();
+  std::tuple<bool,ProtModel> getModelFromStringIfPossible(const std::string & modelString); 
+}
+
+std::ostream& operator<<(std::ostream &out, const ProtModel &rhs); 
+
+namespace std
+{
+  template<> struct less<ProtModel> {
+    bool operator()(const ProtModel& a, const ProtModel& b)  const 
+    {
+      return int(a) < int(b);
+    } 
+  }; 
+
+
+  template<> struct hash<ProtModel>
+  {
+    size_t operator() (const ProtModel& rhs) const 
+    {
+      return std::hash<size_t>()(size_t(rhs));
+    }
+  }; 
+}
+
+
+#endif
diff --git a/src/model/RateHelper.cpp b/src/model/RateHelper.cpp
new file mode 100644
index 0000000..f587a56
--- /dev/null
+++ b/src/model/RateHelper.cpp
@@ -0,0 +1,109 @@
+#include "RateHelper.hpp"
+
+#include "Arithmetics.hpp"
+
+
+#include <cmath>
+#include <iostream>
+
+
+
+
+nat RateHelper::numStateToNumInTriangleMatrix(int numStates)  
+{  
+  return (  numStates * numStates - numStates) / 2 ; 
+}
+
+
+std::vector<nat> RateHelper::extractIndices(nat num, nat numRates, const std::vector<double>  &rates) 
+{
+  // 1 2 3 4 5 X
+  //   6 7 8 9 Y
+  //     A B C Z
+  //       D E F
+  //         F F
+  //           Y
+
+  auto indices = std::vector<nat> {}; 
+  if(num == 0)
+    {
+      for(nat i = 0; i < numRates-1; ++i)
+	indices.push_back(i);
+    }
+  else 
+    {
+      --num;
+      nat prevRows = 0; 
+      for(nat i = 0; i < num+1 ; ++i)
+	{
+	  nat index = prevRows + num - i; 
+	  indices.push_back(index);
+	  prevRows += numRates - i - 1 ; 
+	}
+
+      for(nat i = 0 ; i < numRates - num - 2   ; ++i)
+	indices.push_back(prevRows + i );
+    }
+
+  return indices; 
+}
+
+
+std::vector<double> RateHelper::extractSomeRates(nat num, nat numRates, std::vector<double> &rates)
+{
+  auto partRates = std::vector<double>{}; 
+  auto indices = extractIndices(num, numRates, rates);
+
+  for(auto index : indices)
+    partRates.push_back(rates.at(index));  
+  
+  return partRates; 
+}
+
+
+void RateHelper::insertRates(nat num, nat numRates, std::vector<double> &rates, std::vector<double> &partRates)   
+{
+  auto indices = extractIndices(num, numRates, rates);
+
+  nat ctr = 0; 
+  for(auto index : indices)
+    rates[index] = partRates.at(ctr++);
+}
+
+
+void RateHelper::convertRelativeToLast(std::vector<double> &values) 
+{
+  auto last = values.back();
+  std::for_each(begin(values), end(values), [=](double &v ){v /= last; });
+}
+
+
+double RateHelper::convertToSum1(std::vector<double> &values) 
+{
+  // sorting reduces the error
+  auto cpy = values; 
+  std::sort(begin(cpy), end(cpy)); 
+
+  double sum = Arithmetics::getKahansSum2(cpy) ; 
+
+  //  we do not loose precision here 
+  for (auto &v : values) 
+    v /= sum; 
+  
+  return sum; 
+}
+
+
+void RateHelper::convertToGivenSum(std::vector<double> &values, double givenSum) 
+{
+  std::for_each(begin(values), end(values), [=](double &v){ v *= givenSum ;});
+}
+
+
+std::vector<double> RateHelper::getScaledValues(std::vector<double> values, double scParameter) 
+{
+  double scaler = scParameter * double(values.size()) ;  
+  std::for_each(begin(values), end(values), [=](double &v){ v *= scaler; });
+  return values; 
+}
+
diff --git a/src/model/RateHelper.hpp b/src/model/RateHelper.hpp
new file mode 100644
index 0000000..4e99a24
--- /dev/null
+++ b/src/model/RateHelper.hpp
@@ -0,0 +1,38 @@
+/** 
+    @file RateHelper.hpp
+
+    @brief various functions helping to deal with rates and substition matrices
+
+    @notice using a class for this may appear over-engineered. But
+    conversion between rate formats is not unproblematic, probably a
+    Kahan summation may come in handy at some point.
+    
+ */ 
+
+
+#ifndef ABSTRACT_RATE_PROPOSER
+#define ABSTRACT_RATE_PROPOSER
+
+#include <vector>
+#include <algorithm>
+#include "common.h"
+
+class RateHelper
+{
+public: 
+  RateHelper(){} 
+
+  static void convertRelativeToLast(std::vector<double> &values) ; 
+  static double convertToSum1(std::vector<double> &values); 
+  static void convertToGivenSum(std::vector<double> &values, double givenSum); 
+  static std::vector<double> getScaledValues(std::vector<double> values, double scParameter); 
+  static std::vector<nat> extractIndices(nat num, nat numRates, const std::vector<double>  &rates) ; 
+  static void insertRates(nat num, nat numRates, std::vector<double> &rates, std::vector<double> &partRates); 
+  static std::vector<double> extractSomeRates(nat num, nat numRates, std::vector<double> &rates); 
+  static nat numStateToNumInTriangleMatrix(int numStates)  ; 
+}; 
+
+
+
+#endif
+
diff --git a/src/model/TreeAln.cpp b/src/model/TreeAln.cpp
new file mode 100644
index 0000000..62d1df1
--- /dev/null
+++ b/src/model/TreeAln.cpp
@@ -0,0 +1,1089 @@
+#pragma GCC diagnostic ignored "-Werror"
+#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
+
+#include "ByteFile.hpp"
+
+#include "BranchLength.hpp"
+#include "BranchPlain.hpp"
+#include "BranchLengths.hpp"
+
+#include "RateHelper.hpp"
+#include "BranchLengthsParameter.hpp"
+#include "AbstractParameter.hpp"
+#include "TreeRandomizer.hpp"
+#include "TreeAln.hpp"
+#include "GlobalVariables.hpp"
+#include "BoundsChecker.hpp"
+#include "TreePrinter.hpp"
+#include "Partition.hpp"
+
+#include <sstream>
+#include <cassert>
+#include <cstring>
+#include <unordered_set>
+#include <numeric>
+
+// #define PRINT_LIKESPR_INFO
+
+using std::cout;
+using std::endl; 
+
+
+TreeAln::TreeAln(size_t numTax, bool useSEV)
+  :  _partitions{}
+  , _partitionListResource{}
+  , _partitionPtrs{}
+  , _tr{}
+  , _taxa{}
+  , _bls{}
+  , _traversalInfo{}
+  , _nodes{}
+  , _nodeptrs{}
+  , _ti{}
+  , _execModel{}
+  , _parsimonyScore{}
+  , _isSaveMemorySEV(useSEV)
+  , _root(0,0)
+{
+  initialize(numTax); 		// must be first 
+}
+
+
+TreeAln::TreeAln( const TreeAln& rhs)
+  :  _partitions{}
+  , _partitionListResource{}
+  , _partitionPtrs{}
+  , _tr{}
+  , _taxa{rhs._taxa}
+  , _bls{}
+  , _traversalInfo{}
+  , _nodes{}
+  , _nodeptrs{}
+  , _ti{}
+  , _execModel{}
+  , _parsimonyScore{}
+  , _isSaveMemorySEV(rhs._isSaveMemorySEV)
+  , _root(rhs._root)
+{
+  initialize(rhs.getNumberOfTaxa()); // must be first 
+  
+  auto partCopy = rhs._partitions; 
+  setPartitions(partCopy, false); 
+  auto blsCpy = rhs._bls; 
+  setBranchLengthResource(blsCpy); 
+
+  copyTopologyAndBl(rhs);
+}
+
+
+TreeAln& TreeAln::operator=(TreeAln rhs)
+{
+  assert(rhs._isSaveMemorySEV == _isSaveMemorySEV); 
+  swap(*this, rhs);
+  return *this; 
+}
+
+
+void swap(TreeAln& lhs, TreeAln& rhs )
+{
+  using std::swap; 
+
+  swap(lhs._partitions, rhs._partitions); 
+  swap(lhs._partitionListResource, rhs._partitionListResource);
+  swap(lhs._partitionPtrs , rhs._partitionPtrs );
+
+  swap(lhs._tr, rhs._tr); 
+  swap(lhs._taxa, rhs._taxa); 
+  swap(lhs._bls, rhs._bls); 
+
+  swap(lhs._traversalInfo, rhs._traversalInfo); 
+  swap(lhs._nodes, rhs._nodes); 
+  swap(lhs._nodeptrs, rhs._nodeptrs); 
+
+  swap(lhs._ti, rhs._ti); 
+  swap(lhs._execModel, rhs._execModel); 
+  swap(lhs._parsimonyScore, rhs._parsimonyScore	);
+
+  swap(lhs._isSaveMemorySEV, rhs._isSaveMemorySEV) ; 
+  swap(lhs._root, rhs._root) ;
+}
+
+
+void TreeAln::initialize(size_t numTax)
+{
+  memset(&_tr,0,sizeof(pllInstance)); 
+
+  _tr.maxCategories = Partition::maxCategories; 
+
+  _tr.useRecom = PLL_FALSE; 
+  _tr.bigCutoff = PLL_FALSE;
+  _tr.likelihood =  0 ; 
+  _tr.doCutoff = PLL_TRUE;
+  _tr.secondaryStructureModel = PLL_SEC_16; /* default setting */ 
+  _tr.searchConvergenceCriterion = PLL_FALSE;
+  _tr.rateHetModel = PLL_GAMMA; 
+  _tr.multiStateModel  = PLL_GTR_MULTI_STATE;
+
+  _tr.manyPartitions = PLL_FALSE;
+
+  _tr.saveMemory = _isSaveMemorySEV ?  PLL_TRUE : PLL_FALSE; 
+  _tr.categories = 25;
+  _tr.grouped = PLL_FALSE;
+  _tr.constrained = PLL_FALSE;
+  _tr.gapyness = 0.0; 
+  _tr.useMedian = PLL_FALSE;
+  _tr.mxtips = nat(numTax); 
+
+  _tr.fastParsimony = PLL_FALSE; 
+  _tr.fastScaling = PLL_TRUE; 
+
+  _tr.getParsimonyPerPartition = PLL_TRUE; 
+
+  int tips  = _tr.mxtips;
+  int inter = tips -1 ; 
+  
+  // initialize the traversal info 
+  _traversalInfo.resize(tips);
+  _tr.td[0].ti = _traversalInfo.data();
+  _tr.td[0].count = 0;
+
+  // initialize nodes 
+  _nodes.resize(tips + 3 * inter); 
+
+  _nodeptrs.resize(2 * tips, nullptr);
+  
+  // prepare tip nodes
+  auto p0 = begin(_nodes); 
+  for (int i = 1; i <= tips; i++)
+    {
+      auto p = &(*p0); 
+      ++p0; 
+      p->hash = static_cast<hashNumberType>(std::hash<int>()(i)); // necessary?
+      p->x      =  0;
+      p->xBips  = 0;
+      p->number =  i;
+      p->next   =  p;
+      p->back   = (node *)NULL;
+      _nodeptrs.at(i) = p; 
+    }
+
+  
+  // prepare inner nodes 
+  for (int i = tips + 1; i <= tips + inter; i++)
+    {
+      auto p = (node*)nullptr; 
+      auto q = (node *)nullptr;
+      for (int j = 1; j <= 3; j++)
+	{	 
+	  p = &(*p0); 
+	  ++p0;
+	  if(j == 1)
+	    {
+	      p->xBips = 1;
+	      p->x = 1;
+	      p->xPars = 1; 
+	    }
+	  else
+	    {
+	      p->xBips = 0;
+	      p->x =  0;
+	      p->xPars = 0; 
+	    }
+	  p->number = i;
+	  p->next   = q;
+	  p->back   = (node *) NULL;
+	  p->hash   = 0;       
+	  q = p;
+	}
+      p->next->next->next = p;
+      _nodeptrs.at(i) = p; 
+    }
+
+  _tr.nodep = _nodeptrs.data();
+
+  _tr.likelihood  = PLL_UNLIKELY;
+  _tr.ntips       = 0;
+  _tr.nextnode    = 0;
+
+  _ti.resize( 4 * getNumberOfTaxa() );
+  _tr.ti = _ti.data();
+  
+  createCaterpillar();
+
+  _tr.start = _tr.nodep[1];
+  
+  _parsimonyScore.resize( 2 * numTax);
+  _tr.parsimonyScore = _parsimonyScore.data();
+}
+
+
+void TreeAln::createCaterpillar()
+{
+  nat outerCtr = getNumberOfTaxa() +1 ; 
+  clipNode(getUnhookedNode(1), getUnhookedNode(outerCtr)); 
+  clipNode(getUnhookedNode(2), getUnhookedNode(outerCtr)); 
+  nat root = outerCtr; 
+  ++outerCtr; 
+  for(nat i = 3; i < getNumberOfTaxa() +1; ++i)
+    {
+      root = addNodeToPartialTree(i,root, outerCtr); 
+      // tout << std::endl; 
+      ++outerCtr; 
+    }
+}
+
+
+void TreeAln::copyTopologyAndBl(const TreeAln &rhs) 
+{
+  assert(&rhs != this); 
+  unlinkTree();
+
+  for(auto &bl : rhs.extractBranches())
+    {
+      auto a = getUnhookedNode(bl.getPrimNode());
+      auto b = getUnhookedNode(bl.getSecNode()); 
+      auto z = rhs.findNodePtr(bl)->z; 
+      clipNode(a,b, z); 
+    }
+}
+
+
+nat TreeAln::addNodeToPartialTree(nat id, nat curRoot, nat outerCtr)
+{
+  auto tip = getUnhookedNode(id); 
+  auto oldRoot = getUnhookedNode(curRoot); 
+
+  if( outerCtr < getNumberOfNodes() +1 )
+    {
+      clipNode(tip, getUnhookedNode(outerCtr)); 
+      clipNode(oldRoot, getUnhookedNode(outerCtr)); 
+      return outerCtr; 
+    }
+  else 
+    {
+      clipNode(tip, oldRoot); 
+      return curRoot; 
+    }
+
+}
+
+
+void TreeAln::clearMemory(ArrayReservoir &arrayReservoir)
+{
+  for(nat i = 0; i < getNumberOfPartitions() ; ++i)
+    {
+      auto& partition = getPartition(i).getHandle() ; // TODO: no partition handle  
+      for(nat j = 0; j < getNumberOfTaxa() ; ++j)
+	{
+	  if(partition.xSpaceVector[j] != 0 )
+	    {
+	      if(partition.xVector[j])
+		{
+		  arrayReservoir.deallocate(partition.xVector[j]); 
+		  partition.xVector[j] = nullptr; 
+		  partition.xSpaceVector[j] = 0; 
+		}
+	    }
+	}
+    }
+}
+
+
+
+BranchPlain TreeAln::getThirdBranch(const BranchPlain& oneBranch, const BranchPlain& otherBranch) const 
+{
+  auto commonNode =  getCommonNode(oneBranch, otherBranch); 
+  auto branches = getBranchesFromNode(commonNode); 
+
+  for(auto branch: branches )
+    {
+      if(branch != oneBranch
+	 && branch.getInverted() != oneBranch
+	 && branch != otherBranch
+	 && branch.getInverted() != otherBranch)
+	return branch; 
+    }
+
+  assert(0); 
+  return branches[0]; 
+}
+
+
+std::vector<BranchPlain> TreeAln::getBranchesFromNode(nat aNode) const
+{
+  // tout << "TODO: make this method work for outer nodes as well"<< std::endl; 
+
+  if(aNode <= getNumberOfTaxa())
+    {
+      auto p = getNode(aNode); 
+      assert(p->back->number == p->next->back->number); 
+      return {  BranchPlain(aNode, p->back->number)  }; 
+    }
+  else 
+    {
+      // must be an inner node 
+      // assert(aNode > getNumberOfTaxa());
+ 
+      auto theNode = getNode(aNode); 
+      auto a = nat(theNode->back->number); 
+      auto b = nat(theNode->next->back->number); 
+      auto c = nat(theNode->next->next->back->number); 
+  
+      return {   BranchPlain{aNode, a }, BranchPlain{aNode, b}, BranchPlain{aNode, c}  }; 
+    }
+}
+
+
+
+/** 
+ * prunes subtree (primNode is the very root)
+ * 
+ * returns the original branch of prunedBranch and the branch that we
+ * obtain after pruning. This branch after pruning is oriented,
+ * s.t. the associated subtree can be traversed correctly.
+ */ 
+auto  TreeAln::pruneSubtree(const BranchPlain &subtree, const BranchPlain &prunedBranch, const std::vector<AbstractParameter*> &params)
+  -> std::tuple<BranchLengths, BranchPlain>
+{
+  auto result = getBranch(prunedBranch, params);
+
+  auto third = getThirdBranch(prunedBranch, subtree); 
+// prunedBranch.getThirdBranch(*this,subtree); 
+  auto thirdBL =  getBranch(third, params); 
+
+  auto desc = getDescendents(subtree);
+  clipNode(findNodePtr(desc.first.getInverted()), findNodePtr(desc.second.getInverted())); 
+
+  auto aNode = desc.first.getSecNode(); 
+  auto bNode = desc.second.getSecNode(); 
+    
+  auto newBranch = BranchLengths(BranchPlain(aNode, bNode));
+
+  // orientation os the new branch is important. Since we take away
+  // prunedBranch, the other node that is not in prunedBranch must be
+  // at the very root
+  if( prunedBranch.hasNode(aNode) )
+    newBranch = newBranch.getInverted();
+
+  newBranch.setLengths(thirdBL.getLengths()); 
+  setBranch(newBranch, params); 
+
+  // cut the subtree  
+  detachNode(findNodePtr(subtree)); 
+
+#ifdef PRINT_LIKESPR_INFO
+  tout << "PRUNE: " << SHOW(subtree) << SHOW(result) << SHOW(newBranch.toPlain()) << std::endl; 
+#endif
+
+  return std::make_tuple(result, newBranch); 
+} 
+
+
+/** 
+    inserts a previously pruned subtree, correctly adding the novel branch  
+    
+    assumes that subtree is in a pruned state  
+  
+    note that prunedBranch must be a branch that will exist after insertion
+ */ 
+void TreeAln::insertSubtree(const BranchPlain &subtree, const BranchPlain& insertBranch, const BranchLengths &branchToCreate, const std::vector<AbstractParameter*> &params)
+{
+  // need to dance around the sensitive findNodePtr
+  auto pBack = findNodePtr(subtree.getInverted()); 
+  auto p = pBack->back; 
+  assert(p->next->back == NULL  &&   p->next->next->back == NULL); 
+
+  auto oB = BranchPlain(subtree.getPrimNode(), insertBranch.getOtherNode(branchToCreate.getOtherNode(subtree.getPrimNode()))); 
+  auto otherBranchToCreate =  BranchLengths(oB,getBranch(insertBranch, params).getLengths());
+  // auto otherBranchToCreate = ; 
+  // otherBranchToCreate.setPrimNode(); 
+  // otherBranchToCreate.setSecNode(    );
+  
+  // cut the insert branch 
+  auto q = findNodePtr(insertBranch); 
+  q->back = NULL; 
+  auto r = findNodePtr(insertBranch.getInverted()); 
+  r->back = NULL; 
+
+  clipNode(p->next , q); 
+  clipNode(p->next->next, r ); 
+  
+  setBranch(branchToCreate, params); 
+  setBranch(otherBranchToCreate, params); 
+
+#ifdef PRINT_LIKESPR_INFO
+  tout << "INSERT: " << SHOW(subtree) << SHOW(insertBranch) << SHOW(branchToCreate) << std::endl; 
+#endif
+}
+
+
+
+void TreeAln::clipNodeDefault(nodeptr p, nodeptr q )
+{
+  clipNode(p,q);  
+  // use a problematic branch length to ensure, that it was overridden
+  for(nat i = 0; i < getNumberOfPartitions(); ++i)
+    p->z[i] = p->back->z[i] = 0.9; 
+}
+
+
+void TreeAln::clipNode(nodeptr p, nodeptr q, double *z )
+{
+  p->back = q; 
+  q->back = p; 
+
+  if(z != nullptr)
+    {
+      for(nat i = 0; i < getNumberOfPartitions(); ++i)
+	p->z[i] = q->z[i] = z[i]; 
+    }
+}
+
+
+
+void TreeAln::detachNode(nodeptr p)
+{
+  p->next->back = NULL; 
+  p->next->next->back = NULL; 
+}
+
+void TreeAln::unlinkNode(nodeptr p )
+{
+  p->back = NULL; 
+  detachNode(p); 
+}
+
+
+void TreeAln::unlinkTree()
+{
+#ifdef DEBUG_LINK_INFO
+  cout << "unlinking everything" << endl; 
+#endif
+
+  // unlink tips 
+  for(int i = 1; i < _tr.mxtips+1; ++i)
+    {
+      nodeptr p = _tr.nodep[i]; 
+      p->back = NULL; 
+    }
+
+  for(int i = _tr.mxtips + 1; i < 2 * _tr.mxtips; ++i)
+    unlinkNode(_tr.nodep[i]); 
+}
+
+
+nodeptr TreeAln::getUnhookedNode(int number)
+{  
+  nodeptr p = _tr.nodep[number]; 
+  if(isTipNode(number) )
+    {
+      assert(p->back == NULL); 
+      return p; 
+    }
+
+  nodeptr q = p ; 
+  do 
+    {
+      if(q->back == NULL)
+	return q ; 
+      q = q->next; 
+    } while(p != q); 
+
+  
+  std::cerr << "Error: did not find unlinked node for " << number << std::endl; 
+  assert(0);
+  return NULL;
+}
+
+
+size_t TreeAln::getNumberOfPartitions() const
+{
+  return _partitions.size(); 
+}
+
+
+const Partition& TreeAln::getPartition(nat model)  const 
+{
+  return _partitions.at(model);
+}
+
+Partition& TreeAln::getPartition(nat model)   
+{
+  return _partitions.at(model);
+}
+
+
+std::vector<bool> TreeAln::getExecModel() const 
+{ 
+  auto result = std::vector<bool>{}; 
+
+  for(auto &p : _partitions)
+    result.push_back(p.getHandle().executeModel);
+
+  return result; 
+}
+ 
+void TreeAln::setExecModel(const std::vector<bool>  &modelInfo)
+{
+  nat ctr = 0; 
+  for(auto &p : _partitions)
+    {
+      p.getHandle().executeModel =  modelInfo[ctr] ?  true : false; 
+      ++ctr;
+    }
+}
+
+std::vector<log_double> TreeAln::getPartitionLnls() const
+{
+  auto result = std::vector<log_double>{}; 
+
+  for(auto &p : _partitions)
+    result.push_back(   log_double::fromLog(p.getHandle().partitionLH)  ); 
+
+  return result; 
+}
+
+
+
+void TreeAln::setPartitionLnls(const std::vector<log_double> partitionLnls)  
+{
+  nat ctr = 0; 
+  for(auto &p : _partitions )
+    {
+      p.getHandle().partitionLH = partitionLnls[ctr].getRawLog(); 
+      ++ctr; 
+    }
+} 
+
+
+void TreeAln::initRevMat(nat model)
+{
+  pllInitReversibleGTR(&getTrHandle(), &(getPartitionsHandle()) , model); 
+}
+
+
+void TreeAln::setRevMat(const std::vector<double> &values, nat model, bool isRaw )
+{
+  bool valuesOkay = BoundsChecker::checkRevmat(values); 
+  if(not valuesOkay)
+    {
+      tout << "Problem with substitution parameter: "  << MAX_SCI_PRECISION << values << std::endl;  
+      assert( valuesOkay ); 
+    }
+
+  auto& partition = getPartition(model) ; 
+
+  assert(partition.getDataType() != PLL_AA_DATA || partition.getProtModels() == PLL_GTR); 
+
+  nat num = RateHelper::numStateToNumInTriangleMatrix(  partition.getStates()); 
+  assert(num == values.size()); 
+
+  partition.setSubstRates(values); 
+
+  initRevMat(model); 
+}
+
+
+void TreeAln::setBranch(const BranchLength& branch, const AbstractParameter* param)
+{
+  // tout << "setting " << branch << std::endl; 
+
+  assert(BoundsChecker::checkBranch(branch)); 
+  assert(exists(branch)); 
+
+  auto p = findNodePtr(branch);
+  for(auto &partition : param->getPartitions() )
+    {
+      auto length = branch.getLength().getValue(); 
+      p->z[partition] = p->back->z[partition] = length; 
+    }
+}
+
+
+void TreeAln::setBranch(const BranchLengths& branch, const std::vector<AbstractParameter*>params)
+{
+  // tout << "setting2 " << branch << std::endl; 
+
+  assert(BoundsChecker::checkBranch(branch)); 
+  assert(exists(branch)); 
+
+  auto p = findNodePtr(branch); 
+  
+  for(auto &param : params)
+    {
+      auto length = branch.getLengths().at(param->getIdOfMyKind()).getValue();
+      for(auto &partition : param->getPartitions()) 
+        {
+          p->z[partition] = p->back->z[partition] = length; 
+        }
+    }
+}
+
+
+void TreeAln::setAlpha(double alpha,  nat model)
+{
+  assert(BoundsChecker::checkAlpha(alpha)); 
+  auto& p = getPartition(model); 
+  p.setAlpha(alpha); 
+  discretizeGamma(model); 
+}
+
+
+/**
+   @brief makes the discrete categories for the gamma
+   distribution. Has to be called, if alpha was updated.   
+
+*/ 
+void TreeAln::discretizeGamma(nat model)
+{
+  auto& partition =  getPartition(model).getHandle(); 
+  pllMakeGammaCats(partition.alpha, partition.gammaRates, Partition::maxCategories, _tr.useMedian);
+}
+
+
+std::ostream& operator<< (std::ostream& out,  const TreeAln&  traln)
+{
+  auto tp = TreePrinter(true, false, false); 
+  return out << tp.printTree(traln); 
+}
+
+
+std::vector<double> TreeAln::getRevMat(nat model, bool isRaw) const 
+{
+  auto& partition = getPartition(model); 
+  assert(partition.getDataType() != PLL_AA_DATA || partition.getProtModels() == PLL_GTR); 
+
+  auto result = partition.getSubstRates();
+
+  if(not isRaw)
+    RateHelper::convertToSum1(result);
+
+  return result; 
+}
+
+
+void TreeAln::setFrequencies(const std::vector<double> &values, nat model)
+{
+  assert( BoundsChecker::checkFrequencies(values) ) ;    
+  auto& partition = getPartition(model); 
+  assert( partition.getDataType() != PLL_AA_DATA || partition.getProtFreqs() == PLL_TRUE ); 
+
+  partition.setFrequencies(values); 
+  initRevMat(model);   
+}
+
+
+std::vector<double> TreeAln::getFrequencies(nat model) const
+{
+  auto& partition = getPartition(model) ; 
+  assert( partition.getDataType() != PLL_AA_DATA || partition.getProtFreqs() == PLL_TRUE ); 
+  return partition.getFrequencies();
+}
+
+
+nodeptr TreeAln::getNode(nat elem) const  
+{
+  if( not (elem != 0 && elem < getNumberOfNodes() + 2 ))
+    { 
+      std::cout << "bug: attempted to get node " << elem << std::endl; assert(elem != 0 && elem <= getNumberOfNodes() + 1 ) ;
+    } 
+
+  return  getTrHandle().nodep[elem] ; 
+}
+
+
+std::pair<BranchPlain,BranchPlain> TreeAln::getDescendents(const BranchPlain &b) const
+{
+  auto p = findNodePtr(b); 
+  
+  assert(not isTipNode(p)); 
+
+  auto pn = p->next,
+    pnn = p->next->next; 
+  return 
+    std::make_pair ( BranchPlain(pn->number, pn->back->number), 
+		     BranchPlain(pnn->number, pnn->back->number) ); 
+} 
+
+
+nat TreeAln::getDepth(const BranchPlain &b) const 
+{
+  if(isTipBranch(b))
+    return 1; 
+  else 
+    {
+      auto desc = getDescendents(b.getInverted());
+      return std::max(getDepth(desc.first), getDepth(desc.second)) + 1; 
+    }
+}
+
+
+std::vector<nat> TreeAln::getLongestPathBelowBranch(const BranchPlain &b) const 
+{
+  if(isTipBranch(b))
+    return std::vector<nat>{b.getSecNode()}; 
+  else 
+    {
+      auto desc = getDescendents(b.getInverted());
+      auto resA = getLongestPathBelowBranch(desc.first);
+      auto resB = getLongestPathBelowBranch(desc.second);
+      if(resA.size() > resB.size())
+	{
+	  resA.push_back(b.getSecNode()); 
+	  return resA; 
+	}
+      else 
+	{
+	  resB.push_back(b.getSecNode()); 
+	  return resB; 
+	}
+    }
+}
+
+
+std::vector<nat> TreeAln::getNeighborsOfNode( nat aNode ) const 
+{
+  auto result = std::vector<nat>{};
+  auto nodePtr = getNode(aNode); 
+  if(isTipNode(nodePtr))
+    result.push_back(nodePtr->back->number);
+  else 
+    {
+      result = 
+	{
+	  nat(nodePtr->back->number), 
+	  nat(nodePtr->next->back->number), 
+	  nat(nodePtr->next->next->back->number)
+	} ; 
+    }
+  
+  return result; 
+} 
+
+
+BranchPlain TreeAln::getAnyBranch() const 
+{
+  // assert(0); 
+  return BranchPlain(_tr.nodep[1]->number, _tr.nodep[1]->back->number); 
+} 
+
+BranchLength TreeAln::getBranch(const nodeptr &p,  const AbstractParameter *param) const
+{
+  return getBranch(BranchPlain(p->number,p->back->number), param); 
+}
+
+
+BranchLengths TreeAln::getBranch(const nodeptr& p, const std::vector<AbstractParameter*> &params) const 
+{
+  return getBranch(BranchPlain(p->number, p->back->number), params); 
+}
+
+
+BranchLength TreeAln::getBranch(const BranchPlain &branch,  const AbstractParameter *param) const
+{
+  auto p = findNodePtr(branch); 
+  auto res = p->z[param->getPartitions()[0]]; 
+  return BranchLength(branch, InternalBranchLength(res)); 
+}
+
+
+BranchLengths TreeAln::getBranch(const BranchPlain& branch, const std::vector<AbstractParameter*> &params) const 
+{
+  // auto result = branch.toBlsDummy();
+  // result.extractLength(*this, branch, params);
+  // return result; 
+
+  auto intLens = std::vector<InternalBranchLength>{}; 
+  auto p = findNodePtr(branch); 
+  for(auto &param : params)
+    {
+      auto res = p->z[param->getPartitions()[0]];
+      intLens.emplace_back(res); 
+    }
+  
+  return BranchLengths(branch, intLens); 
+}
+
+
+nat TreeAln::getNumberOfAssignedSites(nat model) const 
+{
+  auto partition =  getPartition (model); 
+  nat length = partition.getWidth(); 
+  return length; 
+}
+
+
+std::vector<BranchPlain> TreeAln::extractBranches() const
+{
+  auto result = std::vector<BranchPlain>(); 
+  nat numBranch = getNumberOfBranches(); 
+  result.reserve(numBranch); 
+
+  int last = int(getNumberOfNodes() + 1); 
+
+  for(int i = getNumberOfTaxa() + 1 ; i < last ; ++i)
+    {
+      auto aNode = getNode(i); 
+      
+      if( aNode->back->number < i )
+	result.emplace_back(i,aNode->back->number); 
+      if(aNode->next->back->number < i)
+	result.emplace_back(i,aNode->next->back->number); 
+      if(aNode->next->next->back->number < i)
+	result.emplace_back(i,aNode->next->next->back->number); 
+    }
+
+  assert(result.size() == getNumberOfBranches());
+
+  return result;
+}
+
+
+std::vector<BranchLength> TreeAln::extractBranches( const AbstractParameter* param ) const 
+{
+  auto result = std::vector<BranchLength>(); 
+  result.reserve(getNumberOfBranches());
+
+  for(int i = getNumberOfTaxa() + 1 ; i < int(getNumberOfNodes() + 1 )   ; ++i)
+    {
+      auto aNode = getNode(i); 
+      
+      if( aNode->back->number < i )
+	result.emplace_back( getBranch(BranchPlain(   i,aNode->back->number ),param) ); 
+      if(aNode->next->back->number < i)
+	result.emplace_back( getBranch(BranchPlain(i,aNode->next->back->number), param) ); 
+      if(aNode->next->next->back->number < i)
+	result.emplace_back( getBranch(BranchPlain( i,aNode->next->next->back->number ),param) );  
+   }
+
+  assert(result.size() == getNumberOfBranches());
+  return result;
+}
+
+std::vector<BranchLengths> TreeAln::extractBranches( const std::vector<AbstractParameter*> &param ) const 
+{
+  auto result = std::vector<BranchLengths>(); 
+  result.reserve(getNumberOfBranches()); 
+
+  for(int i = getNumberOfTaxa() + 1 ; i < int(getNumberOfNodes() + 1 )  ; ++i)
+    {
+      auto aNode = getNode(i); 
+      
+      if( aNode->back->number < i )
+	result.emplace_back(  getBranch(BranchPlain(   i,aNode->back->number ),param) ); 
+      if(aNode->next->back->number < i)
+	result.emplace_back(  getBranch(BranchPlain(i,aNode->next->back->number), param)); 
+      if(aNode->next->next->back->number < i)
+	result.emplace_back( getBranch(BranchPlain( i,aNode->next->next->back->number ),param) ); 
+    }
+
+  assert(result.size() == getNumberOfBranches());
+  return result;
+}
+
+
+std::vector<BranchPlain> TreeAln::getBranchesByDistance(const BranchPlain& branch, nat distance, bool bothSides ) const 
+{
+  if(distance == 0)
+    return { branch };
+
+  auto toCheck = std::vector<BranchPlain>{}; 
+  
+  if(not isTipNode(findNodePtr(branch))) 
+    {
+      auto desc = getDescendents(branch); 
+      toCheck.push_back(desc.first.getInverted()); 
+      toCheck.push_back(desc.second.getInverted()); 
+    }
+
+  if(bothSides
+     && not isTipNode(findNodePtr(branch.getInverted())))
+    {
+      auto desc2 = getDescendents(branch.getInverted()); 
+      toCheck.push_back(desc2.first.getInverted()); 
+      toCheck.push_back(desc2.second.getInverted()); 
+    }
+
+  auto myResult = std::vector<BranchPlain>{}; 
+  for(auto b : toCheck)
+    {
+      auto result = getBranchesByDistance(b, distance-1, false); 
+      myResult.insert(end(myResult), begin(result), end(result)); 
+    }
+
+  return myResult; 
+}
+
+
+void TreeAln::setProteinModel(int part, ProtModel model) 
+{
+  auto& partition = getPartition(part) ; 
+  partition.setProtModel(int(model)); 
+  initRevMat(part);
+
+  const auto& freqs =  partition.getFrequencies();
+
+  auto sum = std::accumulate(freqs.begin(), freqs.end(), 0.,
+                                [](double a, double b){
+                                    return a + b;
+                             });
+
+  assert(std::abs(1.0 - sum)  < ACCEPTED_LNPR_EPS);
+}
+
+
+ProtModel TreeAln::getProteinModel(int part) const
+{
+  auto& pData = getPartition(part) ; 
+  return ProtModel(pData.getProtModels()); 
+}
+
+
+// HACK, don't use 
+void TreeAln::setBranchUnchecked(const BranchLength &bl)
+{
+  auto p =  findNodePtr(bl);
+  p->z[0] = bl.getLength().getValue();
+  p->back->z[0] = bl.getLength().getValue();
+}
+
+
+void TreeAln::clearMemory()
+{
+  // TODO redundant with allocator function!
+
+  for(nat i = 0; i < getNumberOfPartitions() ; ++i )
+    {
+      auto &partition = getPartition(i).getHandle();
+      for(nat j = 0; j < getNumberOfTaxa(); ++j)
+	if(partition.xSpaceVector[j] != 0 )
+	  {
+	    free(partition.xVector[j] );
+	    partition.xSpaceVector[j] = 0; 
+	  }
+    }
+} 
+
+
+void TreeAln::setBranchLengthResource(BranchLengthResource bls)
+{
+  _bls = bls; 
+  _bls.assign(*this);
+}
+
+
+partitionList& TreeAln::getPartitionsHandle() 
+{ 
+  return _partitionListResource; 
+}
+   
+const partitionList& TreeAln::getPartitionsHandle() const
+{ 
+  return _partitionListResource; 
+}
+
+
+// TODO not entirely happy with the initial part 
+void TreeAln::setPartitions(const std::vector<Partition> &p, bool initial)
+{
+  _partitions = p;
+  _partitionPtrs.resize(0);
+  for(auto & part : _partitions)
+    _partitionPtrs.push_back(&(part.getHandle())); 
+  _partitionListResource.partitionData = _partitionPtrs.data(); 
+  _partitionListResource.perGeneBranchLengths = PLL_TRUE; 
+  _partitionListResource.numberOfPartitions = static_cast<int>(_partitions.size()); 
+  _partitionListResource.dirty = PLL_FALSE; 
+
+  if(initial)
+    {
+      auto empFreqs = std::vector<double*>(getNumberOfPartitions()); 
+      for(nat i = 0; i < getNumberOfPartitions() ; ++i)
+  	{
+  	  auto& partition = getPartition(i); 
+  	  empFreqs[i] = new double[partition.getStates()]; 
+  	  for(int j = 0; j < partition.getStates() ; ++j)
+  	    empFreqs[i][j] = 1. / partition.getStates(); 
+  	}
+      initModel(&(getTrHandle()), empFreqs.data(), &(getPartitionsHandle()));
+
+      for(nat i = 0; i < getNumberOfPartitions(); ++i)
+  	delete [] empFreqs[i];
+    }
+
+  _execModel.resize(p.size(), PLL_TRUE);
+  _tr.td[0].executeModel = _execModel.data();
+}
+
+
+nodeptr TreeAln::findNodePtr(const BranchPlain &branch ) const 
+{
+  auto& tr = getTrHandle(); 
+  auto thisNode = branch.getPrimNode(); 
+  auto thatNode = branch.getSecNode(); 
+  
+  nodeptr p = tr.nodep[thisNode]; 
+  if(p->back->number == (int)thatNode)
+    return p ; 
+  else if(p->next->back->number == (int)thatNode) 
+    return p->next; 
+  else 
+    {
+      assert(p->next->next->back->number == (int)thatNode); 
+      return p->next->next; 
+    }  
+} 
+
+
+
+bool TreeAln::isTipBranch(const BranchPlain &branch ) const
+{
+  return branch.getPrimNode() <= getNumberOfTaxa() || branch.getSecNode() <= getNumberOfTaxa() ; 
+}
+
+
+
+
+bool TreeAln::exists(const BranchPlain &branch )const 
+{
+  auto branches = getBranchesFromNode(branch.getPrimNode()); 
+  // auto result = false; 
+  return std::any_of(begin(branches), end(branches), 
+		     [&](const BranchPlain &b ){ return b.getSecNode() == branch.getSecNode(); }); 
+} 
+
+/////////////////////
+// rooted topology //
+/////////////////////
+
+nat TreeAln::getNumberOfInnerNodes(bool rooted) const 
+{
+	return getNumberOfNodes() - getNumberOfTaxa() + (rooted ? 1 : 0);
+}
+
+bool TreeAln::isRooted(void) const
+{
+	return (_root.getPrimNode() + _root.getSecNode() > 0);
+}
+
+BranchPlain TreeAln::getRootBranch() const
+{
+	return BranchPlain(_root);
+}
+
+void TreeAln::setRootBranch(const BranchPlain &rb)
+{
+	_root.setPrimNode(rb.getPrimNode());
+	_root.setSecNode(rb.getSecNode());
+}
+
+bool TreeAln::isRootChild(const nat nodeId) const
+{
+	return (isRooted()
+			&& (nodeId == _root.getPrimNode() || nodeId == _root.getSecNode()));
+}
+
+bool TreeAln::isRootBranch(const BranchPlain &rb) const
+{
+	return (rb == _root || rb == _root.getInverted());
+}
diff --git a/src/model/TreeAln.hpp b/src/model/TreeAln.hpp
new file mode 100644
index 0000000..bb48e98
--- /dev/null
+++ b/src/model/TreeAln.hpp
@@ -0,0 +1,309 @@
+/**
+   @brief represents a tree and the associated alignment 
+
+ */
+
+#ifndef _TREEALN_H
+#define _TREEALN_H
+
+#include "extensions.hpp"
+#include "ArrayReservoir.hpp"
+#include "GlobalVariables.hpp"
+
+#include "ProtModel.hpp"
+#include "BranchPlain.hpp"
+#include "FlagType.hpp"
+
+#include "BranchLengthResource.hpp"
+#include "Partition.hpp"
+
+#include <vector>
+#include <iostream>
+#include <array>
+#include <memory>
+
+class BranchLength; 
+class BranchLengths; 
+class AbstractPrior; 
+class Randomness; 
+class TreePrinter; 
+class AbstractParameter; 
+class ByteFile; 
+
+class TreeAln
+{
+  friend class BranchLengthResource;  
+
+public: 
+   /////////////////
+   // life cycle  //
+   /////////////////
+  TreeAln(size_t numTax, bool isSaveMemorySEV);
+  TreeAln(const TreeAln& rhs);
+  TreeAln(TreeAln&& rhs) = default; 
+  ~TreeAln(){}
+  TreeAln& operator=(TreeAln rhs);
+
+  friend void swap(TreeAln& lhs, TreeAln& rhs ); 
+
+  friend std::ostream& operator<< (std::ostream& out,  const TreeAln&  traln);
+
+  /////////////////////////////////////
+  //           OBSERVERS             //
+  /////////////////////////////////////
+  Partition& getPartition(nat model) ;
+  const Partition& getPartition(nat model)  const ; 
+  /** 
+      @brief get the internal raxml tree representation 
+   */ 
+  pllInstance& getTrHandle() {return _tr;}
+  const pllInstance& getTrHandle() const {return _tr; }
+  /** 
+      @brief frees all likelihood arrays 
+   */   
+  void clearMemory(ArrayReservoir &arrayReservoir);
+  void clearMemory(); 
+  /** 
+      @brief get the number of branches in the tree (not counting per-partition branch lengths)
+   */ 
+  nat getNumberOfBranches() const {return getNumberOfNodes() - 1 ; }
+  /** 
+      @brief get the number of partitions in the alignment
+   */ 
+  size_t getNumberOfPartitions() const;   
+  /** 
+      @brief get the number of taxa in the tree 
+   */ 
+  nat getNumberOfTaxa() const {return getTrHandle().mxtips; }
+  /** 
+      @brief get the number of nodes in the unrooted tree 
+   */ 
+
+  nat getNumberOfNodes() const { nat numTax = getNumberOfTaxa() ;  return 2 * numTax - 2 ;  } // excluding the virtual root 
+  /** 
+      @brief get the substitution matrix for partition "model"
+   */ 
+  std::vector<double> getRevMat(nat model, bool isRaw) const ;   
+  /** 
+      @brief gets the state frequencies for partition "model" 
+   */ 
+  std::vector<double> getFrequencies(nat model) const; 
+  /**
+     @brief gets the alpha parameter of the gamma distribution  
+   */ 
+  double getAlpha(nat model) const 
+  {  
+    auto &p = getPartition(model);
+    return p.getAlpha();
+  } 
+
+  BranchPlain getThirdBranch(const BranchPlain& oneBranch, const BranchPlain& otherBranch) const ; 
+
+  // not so happy with that...
+  log_double getLikelihood() const 
+  {
+    return log_double::fromLog(getTrHandle().likelihood); 
+  }
+
+  void setLikelihood(log_double val)
+  {
+    getTrHandle().likelihood = val.getRawLog();
+  }
+
+
+  /** 
+      @brief indicates whether a nodepointer is a tip 
+   */ 
+  bool isTipNode(nodeptr p) const {return p->number <=  getTrHandle().mxtips ;}
+  bool isTipNode(nat aNode) const { return int(aNode) <=  getTrHandle().mxtips; }
+  /** 
+      @brief gets the branch from a node pointer (including branch length)
+      
+      @notice if only one parameter is provided, the resulting branch
+      will ONLY contain the branch length for this one parameter
+      (bogus parameters for other branch lengths, if you have
+      per-partition branch lengths). For setting this branch, the same
+      parameter must be used (and only this one).
+      
+      If you call this function with an existing Branch b, this
+      function is usefull to get the actual branch length.
+   */ 
+  BranchLength getBranch(const BranchPlain &branch,  const AbstractParameter *param) const; 
+  BranchLengths getBranch(const BranchPlain& branch, const std::vector<AbstractParameter*> &params) const ; 
+
+  BranchLength getBranch(const nodeptr &branch,  const AbstractParameter *param) const; 
+  BranchLengths getBranch(const nodeptr &branch, const std::vector<AbstractParameter*> &params) const ; 
+
+  // improved interface for topological moves  
+  void insertSubtree(const BranchPlain &subtree, const BranchPlain& insertBranch, const BranchLengths &branchToCreate, const std::vector<AbstractParameter*> &params); 
+  auto  pruneSubtree(const BranchPlain &subtree, const BranchPlain &prunedBranch, const std::vector<AbstractParameter*> &params)
+    -> std::tuple<BranchLengths, BranchPlain>; 
+
+  /** 
+      @brief gets a nodepointer with specified id 
+   */ 
+  nodeptr getNode(nat elem) const ; 
+  
+  std::vector<BranchPlain> getBranchesFromNode(nat aNode) const; 
+  /** 
+      @brief extract all branches from the tree (including branch lengths)
+   */ 
+  // template<typename RESULT>
+  std::vector<BranchLength> extractBranches( const AbstractParameter* param ) const; 
+  std::vector<BranchLengths> extractBranches( const std::vector<AbstractParameter*> &param ) const;  
+  std::vector<BranchPlain> extractBranches() const; 
+  /** 
+      @brief gets the number of inner nodes in the tree 
+   */ 
+  nat getNumberOfInnerNodes(bool rooted) const; 
+
+  /** 
+      @brief gets the mean substitution rate overall specified partitions
+   */ 
+  // double getMeanSubstitutionRate(const std::vector<nat> &partitions) const ;
+  /** 
+      @brief unlinks a node 
+   */ 
+  void unlinkNode(nodeptr p); 
+  /** 
+      @brief gets the three nodes adjacent to the given node  
+   */ 
+  std::vector<nat> getNeighborsOfNode( nat node ) const ; 
+  /** 
+      @brief prunes the node from the tree 
+   */ 
+  void detachNode(nodeptr p); 
+  ///////////////
+  // MODIFIERS //
+  ///////////////
+  partitionList& getPartitionsHandle() ; 
+  const partitionList& getPartitionsHandle() const ;
+
+  void setPartitions(const std::vector<Partition> &p, bool initial);
+
+  BranchPlain getAnyBranch() const ;
+  
+  /**
+     @brief sets the frequencies. Format is important, frequencies must add up to 1.0 
+  */ 
+  void setFrequencies(const std::vector<double> &values, nat model);
+  /** 
+      @brief sets the parameters. Format is important, last rate must be 1.0  
+  */ 
+  void setRevMat(const std::vector<double> &values, nat model, bool isRaw);
+  /** 
+      @brief sets the alpha for partition "model"
+   */ 
+  void setAlpha(double alpha,  nat model);   
+  /** 
+      @brief sets a branch. Topology is NOT modified! 
+   */ 
+  void setBranch(const BranchLengths& b, const std::vector<AbstractParameter*> params);   
+  void setBranch(const BranchLength& branch, const AbstractParameter* param); 
+  /** 
+      @brief hooks up two nodes. Branch lengths must be set
+      separately.
+   */ 
+  void clipNode(nodeptr p, nodeptr q, double *z = nullptr);   
+
+  bool exists(const BranchPlain &branch )const ; 
+  
+  /** 
+      @brief hooks up two nodes with default branch length
+   */ 
+  void clipNodeDefault(nodeptr p, nodeptr q); 
+  /**
+     @brief resets/destroys the topology in the tree 
+   */ 
+  void unlinkTree();
+  /** 
+      @brief gets the maximum length of paths below this branch 
+   */ 
+  nat getDepth(const BranchPlain  &b) const ; 
+  /** 
+      @brief gets the longest path 
+   */ 
+  std::vector<nat> getLongestPathBelowBranch(const BranchPlain &b) const ; 
+
+
+  bool isTipBranch(const BranchPlain &branch ) const ; 
+
+  nodeptr findNodePtr(const BranchPlain &branch ) const ; 
+
+  /**
+     @brief gets a node with given id that is not connected to the tree right now 
+   */ 
+  nodeptr getUnhookedNode(int number);
+  ///////////////
+  // observers //
+  ///////////////
+  /** 
+      @brief gets the branches that are below one branch 
+
+      This function is handy for traversing the tree and relying less
+      on raw pointers. For traversing, it is often necessary to invert
+      the resulting branch.      
+   */
+  std::pair<BranchPlain,BranchPlain> getDescendents(const BranchPlain &b) const; 
+
+  std::vector<bool> getExecModel() const ; 
+  std::vector<log_double> getPartitionLnls() const; 
+  void setPartitionLnls(const std::vector<log_double> partitionLnls) ; 
+  void setExecModel(const std::vector<bool>  &modelInfo); 
+
+  nat getNumberOfAssignedSites(nat model) const ; 
+
+  const std::vector<std::string>& getTaxa() const {return _taxa; }
+  void setTaxa(std::vector<std::string> taxa){_taxa = taxa; }
+
+  std::vector<BranchPlain> getBranchesByDistance(const BranchPlain& branch, nat distance, bool bothSides ) const;   
+
+  void setProteinModel(int part, ProtModel model) ; 
+  ProtModel getProteinModel(int part) const; 
+  void setBranchUnchecked(const BranchLength &bl); 
+  void copyTopologyAndBl(const TreeAln &rhs); 
+  void setBranchLengthResource(BranchLengthResource bls); 
+  
+  bool isSaveMemorySEV() const { return _isSaveMemorySEV; } 
+
+  void createCaterpillar(); 
+
+  void initRevMat(nat model); 	// these functions are not needed any more: directly use the respective setter function     
+  void discretizeGamma(nat model); 
+  void initialize(size_t numTax);
+  nat addNodeToPartialTree(nat id, nat curRoot, nat outerCtr); 
+
+    /////////////////////
+   // rooted topology //
+  /////////////////////
+  bool isRooted(void) const;
+  void setRootBranch(const BranchPlain &rb);
+  BranchPlain getRootBranch() const;
+  bool isRootChild(const nat nodeId) const;
+  bool isRootBranch(const BranchPlain &rb) const;
+
+private: 			// ATTRIBUTES 
+  std::vector<Partition> _partitions;
+  partitionList _partitionListResource; 
+  std::vector<pInfo*> _partitionPtrs;	
+
+  pllInstance _tr;
+  std::vector<std::string> _taxa; 
+  BranchLengthResource _bls; 
+
+  // tree resources 
+  std::vector<traversalInfo>  _traversalInfo; 
+  std::vector<node> _nodes; 
+  std::vector<nodeptr> _nodeptrs;
+
+  std::vector<int> _ti; 
+  std::vector<boolean> _execModel; // for the traveral descriptor 
+  std::vector<nat> _parsimonyScore; 
+
+  bool _isSaveMemorySEV;
+  // in case we are working with a rooted tree
+  BranchPlain _root;
+
+};  
+
+#endif
diff --git a/src/parameters/AbstractParameter.cpp b/src/parameters/AbstractParameter.cpp
new file mode 100644
index 0000000..a8fb215
--- /dev/null
+++ b/src/parameters/AbstractParameter.cpp
@@ -0,0 +1,81 @@
+#include "AbstractParameter.hpp" 
+#include "extensions.hpp" 
+#include "Category.hpp"
+
+
+AbstractParameter::AbstractParameter(Category cat, nat id, nat idOfMyKind, std::vector<nat> partitions, nat paramPrio)
+  : Serializable()
+  ,  _id(id)
+  , _idOfMyKind(idOfMyKind)
+  , _cat(cat) 
+  , _prior{nullptr}
+  , _printToParamFile(true)
+  , _partitions(partitions)
+  , _paramPriority(paramPrio)
+{
+  assert(_partitions.size() > 0); 
+}
+
+AbstractParameter::AbstractParameter(const AbstractParameter& rhs)
+  : Serializable(rhs)
+  , _id(rhs._id)
+  , _idOfMyKind(rhs._idOfMyKind)
+  , _cat(rhs._cat)
+  , _prior{  rhs._prior.get() != nullptr ? std::unique_ptr<AbstractPrior>(rhs._prior->clone()) : nullptr}	
+  , _printToParamFile(rhs._printToParamFile)
+  , _partitions(rhs._partitions)
+  , _paramPriority(rhs._paramPriority)
+{
+  assert(_partitions.size() > 0); 
+}
+
+std::ostream& operator<<(std::ostream &out, const AbstractParameter* rhs)
+{
+  return rhs->printShort(out);
+}
+
+
+std::ostream&  AbstractParameter::printShort(std::ostream& out) const
+{
+  out << CategoryFuns::getShortName(_cat) << "{" ; 
+
+  formatRange(out, _partitions); 
+
+  out << "}";     
+  return out; 
+}
+
+
+void AbstractParameter::checkSanityPartitionsAndPrior(const TreeAln &traln) const 
+{
+}
+
+
+void AbstractParameter::checkSanityPartitionsAndPrior_FreqRevMat(const TreeAln &traln) const 
+{
+  auto numStates = traln.getPartition(_partitions.at(0)).getStates();
+  auto okay = bool{true}; 
+  auto wrong = nat{0}; 
+  for(auto p : _partitions)
+    {
+      if(numStates)
+	okay &= traln.getPartition(p).getStates() == numStates; 
+      if(not okay)
+	{
+	  wrong = p; 
+	  break; 
+	}
+    }
+
+  if(not okay)
+    {
+      std::cerr << "Error while processing parsed parameters: you tried to link " << _partitions[0] << " and " <<  wrong  << ". These partitions have a different number of states (probably DNA and PROT). Aborting." << std::endl; 
+      exitFunction(-1, true); 
+    }
+}
+
+
+bool AbstractParameter::priorIsFitting(const AbstractPrior &prior, const TreeAln &traln) const
+{
+  return true;   
+}
diff --git a/src/parameters/AbstractParameter.hpp b/src/parameters/AbstractParameter.hpp
new file mode 100644
index 0000000..05b511e
--- /dev/null
+++ b/src/parameters/AbstractParameter.hpp
@@ -0,0 +1,105 @@
+#ifndef _ABSTRACT_PARAMETER
+#define _ABSTRACT_PARAMETER
+
+#include "TreeAln.hpp"
+#include "ParameterContent.hpp"
+#include "AbstractPrior.hpp"
+#include "ParamAttribute.hpp"
+
+#include "Serializable.hpp"
+
+enum class Category; 
+
+class AbstractParameter : public Serializable
+{
+public: 			// INHERITED METHDOS 
+  virtual void deserialize( std::istream &in ) {} // generally, there is nothing to do ... 
+  virtual void serialize( std::ostream &out) const {}
+
+public:   
+  AbstractParameter(Category cat, nat id, nat idOfMyKind, std::vector<nat> partitions, nat paramPrio); 
+  AbstractParameter(const AbstractParameter& rhs); 
+
+  virtual log_double getPriorValue(const TreeAln& traln) const = 0; 
+
+  // TODO we should just cast to BranchLengthParameter and make this specific to branch length parameter ... 
+  virtual double getMeanSubstitutionRate()  const {assert(0) ; return 0 ; }
+  virtual void updateMeanSubstRate(const TreeAln& traln) {assert(0); }
+
+  /** 
+      @brief applies the parameter content to the tree 
+   */ 
+  virtual void applyParameter(TreeAln& traln,  const ParameterContent &content) = 0;
+  virtual void applyParameterRaw(TreeAln &traln, const ParameterContent & content) const {}
+  /** 
+      @brief extracts the parameter 
+   */ 
+  virtual ParameterContent extractParameter(const TreeAln &traln)  const  = 0;   
+  virtual ParameterContent extractParameterRaw(const TreeAln& traln) const {return ParameterContent{}; }
+  /** 
+      @brief print a sample for this parameter 
+   */ 
+  virtual void printSample(std::ostream& fileHandle, const TreeAln &traln ) const = 0; 
+  /** 
+      @brief print the names of all components of this parameter (e.g., the meaning of the various rates ) 
+   */ 
+  virtual void printAllComponentNames(std::ostream &fileHandle, const TreeAln &traln) const  = 0; 
+  /** 
+      @brief adds a partition to the parameter (during setup)
+   */ 
+  void addPartition(nat id){ _partitions.push_back(id); }
+  /** 
+      @brief sets the prior for this parameter 
+   */ 
+  virtual void setPrior(const std::unique_ptr<AbstractPrior> &prior){_prior = std::unique_ptr<AbstractPrior>(prior->clone()); }
+  nat getIdOfMyKind() const {return _idOfMyKind; }
+  /** 
+      @brief veriffies that content is compatible to this parameter (e.g., not too many rates). 
+
+      This is a crude method merely for initialization (user input validation)
+   */ 
+  virtual void verifyContent(const TreeAln &traln, const ParameterContent &content) const  =  0; 
+
+  ///////////////
+  // OBSERVERS //
+  ///////////////
+  Category getCategory() const {return _cat; } 
+  nat getId() const {return _id; }
+  std::vector<nat> getPartitions() const {return _partitions; }
+  AbstractPrior* getPrior() const { return _prior.get(); }
+  bool isPrintToParamFile() const {return _printToParamFile; }
+
+  virtual std::ostream&  printShort(std::ostream& out) const;
+  friend std::ostream& operator<<(std::ostream &out, const AbstractParameter* rhs); 
+  virtual AbstractParameter* clone() const = 0 ; 
+
+
+  virtual bool priorIsFitting(const AbstractPrior &prior, const TreeAln &traln) const; 
+
+  virtual bool fitsToPartition(Partition& p) const 
+  {
+    return true; 
+  }
+
+
+  virtual void checkSanityPartitionsAndPrior(const TreeAln &traln) const ; 
+
+  nat getParamPriority() const {return _paramPriority; } 
+
+  virtual ParamAttribute   getAttributes() const {assert(0) ; return ParamAttribute(); } // currently only used for tuning of branch length parameter 
+  virtual void setAttributes(  ParamAttribute attr) {assert(0) ; } // same here 
+
+protected: 			// METHODS
+  void checkSanityPartitionsAndPrior_FreqRevMat(const TreeAln &traln) const ; 
+
+protected: 			// ATTRIBUTES
+  nat _id; 
+  nat _idOfMyKind;
+  Category _cat; 
+  std::unique_ptr<AbstractPrior> _prior; 
+  bool _printToParamFile; 
+  std::vector<nat> _partitions; 
+  nat _paramPriority; 
+}; 
+
+#endif
diff --git a/src/parameters/BranchLengthsParameter.cpp b/src/parameters/BranchLengthsParameter.cpp
new file mode 100644
index 0000000..c99ffa8
--- /dev/null
+++ b/src/parameters/BranchLengthsParameter.cpp
@@ -0,0 +1,114 @@
+#include "BranchLengthsParameter.hpp"
+#include "BoundsChecker.hpp"
+#include "Arithmetics.hpp"
+
+BranchLengthsParameter::BranchLengthsParameter(
+    nat             id,
+    nat             idOfMyKind,
+    std::vector<nat>partitions)
+    : AbstractParameter(
+        Category::BRANCH_LENGTHS,
+        id,
+        idOfMyKind,
+        partitions,
+        0)
+    , _convTuner{1.61, 0.01, 10, 0.1, false}
+    , _nonConvTuner{2., 0.1, 10, 0.1, false}
+    , _fracChange{1}
+{
+    _printToParamFile = false;
+}
+
+
+void                    BranchLengthsParameter::applyParameter(
+    TreeAln&                traln,
+    const ParameterContent& content)
+{
+    for (auto&b : content.branchLengths)
+        traln.setBranch(b, this);
+}
+
+auto                    BranchLengthsParameter::extractParameter(
+    const TreeAln&traln)  const
+    ->ParameterContent
+{
+    auto result = ParameterContent{};
+    result.branchLengths = traln.extractBranches(this);
+    return result;
+}
+
+
+void                    BranchLengthsParameter::verifyContent(
+    const TreeAln&         traln,
+    const ParameterContent&content) const
+{
+    for (auto&bl : content.branchLengths)
+    {
+        if (not BoundsChecker::checkBranch(bl))
+        {
+            tout << "observed invalid branch " << bl
+                 << " that must not be there." << std::endl;
+            assert(0);
+        }
+    }
+}
+
+
+bool                    BranchLengthsParameter::priorIsFitting(
+    const AbstractPrior&prior,
+    const TreeAln&      traln) const
+{
+    auto content = prior.getInitialValue();
+    return content.values.size() < 2;
+}
+
+
+void                    BranchLengthsParameter::deserialize(
+    std::istream&in)
+{
+    _nonConvTuner.deserialize(in);
+    _convTuner.deserialize(in);
+    _fracChange = cRead<double>(in);
+}
+
+void                    BranchLengthsParameter::serialize(
+    std::ostream&out) const
+{
+    _nonConvTuner.serialize(out);
+    _convTuner.serialize(out);
+    cWrite<double>(out, _fracChange);
+}
+
+
+auto                    BranchLengthsParameter::getMeanSubstitutionRate() const
+    ->double
+{
+    // tout << MAX_SCI_PRECISION << SHOW(_fracChange) << std::endl;
+    return _fracChange;
+}
+
+
+void                    BranchLengthsParameter::updateMeanSubstRate(
+    const TreeAln& traln)
+{
+    // for proposal sets, it may be worth it, to only the value... with
+    // the fracchange for the respective partitions
+
+    // summing in ascending order in order to keep
+    auto fcs = std::vector<double>{};
+
+    for (auto&p :_partitions)
+    {
+        const auto& partition =  traln.getPartition(p);
+        fcs.push_back(partition.getFracChange()
+                      * partition.getPartitionContribution());
+        assert(partition.getPartitionContribution() > 0);
+        assert(partition.getFracChange() > 0);
+    }
+
+    std::sort(begin(fcs), end(fcs));
+
+    auto result = Arithmetics::getKahanSum(fcs);
+
+    _fracChange = result;
+}
diff --git a/src/parameters/BranchLengthsParameter.hpp b/src/parameters/BranchLengthsParameter.hpp
new file mode 100644
index 0000000..f71d1f0
--- /dev/null
+++ b/src/parameters/BranchLengthsParameter.hpp
@@ -0,0 +1,94 @@
+#ifndef _BRANCH_LENGTHS_PARAMETER
+#define _BRANCH_LENGTHS_PARAMETER
+
+#include "AbstractParameter.hpp"
+#include "ComplexTuner.hpp"
+
+#include "Category.hpp"
+
+class BranchLengthsParameter : public AbstractParameter
+{
+public:
+    // inherited from SERIALIZABLE
+    // _________________________________________________________________________
+    virtual void                                 deserialize(
+        std::istream&in);
+    // _________________________________________________________________________
+    virtual void                                 serialize(
+        std::ostream&out) const;
+public:
+    // INHERITED METHODS
+    // _________________________________________________________________________
+    virtual void                                 applyParameter(
+        TreeAln&               traln,
+        const ParameterContent&content);
+    // _________________________________________________________________________
+    virtual ParameterContent                     extractParameter(
+        const TreeAln&traln)  const;
+    // _________________________________________________________________________
+    virtual AbstractParameter*                   clone() const
+    {
+        return new BranchLengthsParameter(*this);
+    }
+    // _________________________________________________________________________
+    virtual void                                 printSample(
+        std::ostream& fileHandle,
+        const TreeAln&traln) const {}
+    // _________________________________________________________________________
+    virtual void                                 printAllComponentNames(
+        std::ostream& fileHandle,
+        const TreeAln&traln) const {}
+    // _________________________________________________________________________
+    virtual void                                 verifyContent(
+        const TreeAln&         traln,
+        const ParameterContent&content) const;
+    // _________________________________________________________________________
+    virtual bool                                 priorIsFitting(
+        const AbstractPrior&prior,
+        const TreeAln&      traln) const;
+    // _________________________________________________________________________
+    virtual ParamAttribute                       getAttributes() const
+    {
+        return {_convTuner, _nonConvTuner};
+    }
+    // _________________________________________________________________________
+    virtual void                                 setAttributes(
+        ParamAttribute attr)
+    {
+        _convTuner = attr._convTuner;
+        _nonConvTuner = attr._nonConvTuner;
+    }
+    // _________________________________________________________________________
+    virtual double                               getMeanSubstitutionRate()
+    const;
+    // _________________________________________________________________________
+    virtual void                                 updateMeanSubstRate(
+        const TreeAln& traln);
+    // _________________________________________________________________________
+    virtual void                                 setMeanSubstitutionRate(
+        double fac){_fracChange = fac; }
+    // _________________________________________________________________________
+    virtual log_double                           getPriorValue(
+        const TreeAln& traln) const
+    {
+        assert(0);
+        return log_double::fromAbs(1);
+    }
+public:
+    // METHODS
+    // _________________________________________________________________________
+    BranchLengthsParameter(
+        nat             id,
+        nat             idOfMyKind,
+        std::vector<nat>partitions);
+private:
+    // ATTRIBUTES
+    ComplexTuner _convTuner; // convergence parameter for distribution
+                             // proposals
+    ComplexTuner _nonConvTuner; // non-convergence parameter for the
+                                // distribution proposals
+    double       _fracChange;
+};
+
+
+#endif
diff --git a/src/parameters/DivergenceRates.cpp b/src/parameters/DivergenceRates.cpp
new file mode 100644
index 0000000..d962bdc
--- /dev/null
+++ b/src/parameters/DivergenceRates.cpp
@@ -0,0 +1,171 @@
+#include "DivergenceRates.hpp"
+
+#include "Category.hpp"
+
+DivergenceRates::DivergenceRates(nat id, nat idOfMyKind,
+                                 std::vector<nat> partitions, nat numberOfTaxa) :
+  AbstractParameter(Category::DIVERGENCE_RATES, id, idOfMyKind,
+                    partitions, 0), _rateAssignments(2 * numberOfTaxa - 2, 0), _rates(
+                                                                                      2 * numberOfTaxa - 2, 1.), _directedBranches(
+                                                                                                                                   2 * numberOfTaxa - 2)
+{
+  /*
+   * we initialize as many different rate categories as branches in the tree, all to 1.0
+   */
+  for (int i = 0; i < _rateAssignments.size(); i++)
+    {
+      _rateAssignments[i] = i;
+      _rates[i] = 1;
+    }
+}
+
+
+
+DivergenceRates::DivergenceRates(const DivergenceRates& rhs)
+  : AbstractParameter(rhs)
+  , _rateAssignments{rhs._rateAssignments}
+  , _rates{rhs._rates}    
+  , _directedBranches{rhs._directedBranches}
+{
+} 
+
+
+
+void DivergenceRates::initializeParameter(TreeAln& traln,
+                                          const ParameterContent &content)
+{
+  assert(content.branchLengths.size() == traln.getNumberOfNodes());
+  for (int i = 0; i < traln.getNumberOfNodes(); i++)
+    {
+      _directedBranches[i] = content.branchLengths[i];
+    }
+
+}
+
+AbstractParameter* DivergenceRates::clone() const
+{
+  return new DivergenceRates(*this);; 
+}
+
+
+
+void DivergenceRates::applyParameter(TreeAln& traln,
+                                     const ParameterContent &content)
+{
+  verifyContent(traln, content);
+
+  if (content.rateAssignments != _rateAssignments)
+    {
+      /* modification in the assignments */
+      assert(0);
+      /* update assignments */
+      _rateAssignments = content.rateAssignments;
+      //_rates.resize(_ra)
+    }
+  else
+    {
+      /* modification in the rates */
+      for (int i = 0; i < _rates.size(); i++)
+        {
+          if (content.values[i] != _rates[i])
+            {
+              _rates[i] = content.values[i];
+              for (int j = 0; j < _rateAssignments.size(); j++)
+                {
+                  if (_rateAssignments[j] == i)
+                    {
+                      traln.setBranch(content.branchLengths[j], this);
+                    }
+                }
+            }
+        }
+    }
+}
+
+ParameterContent DivergenceRates::extractParameter(const TreeAln &traln) const
+{
+  auto content = ParameterContent();
+  content.values = _rates;
+  content.rateAssignments = _rateAssignments;
+  for (int i = 0; i < _rates.size(); i++)
+    {
+      content.branchLengths.push_back(
+                                      traln.getBranch(_directedBranches[i], this));
+    }
+  verifyContent(traln, content);
+  return content;
+}
+
+void DivergenceRates::printSample(std::ostream& fileHandle,
+                                  const TreeAln &traln) const
+{
+  bool isFirst = true;
+  for (auto v : _rates)
+    {
+      fileHandle << (isFirst ? "" : "\t") << v;
+      isFirst = false;
+    }
+}
+
+void DivergenceRates::printAllComponentNames(std::ostream &fileHandle,
+                                             const TreeAln &traln) const
+{
+  bool isFirstG = true;
+  for (nat i = 0; i < _rates.size(); ++i)
+    {
+      fileHandle << (isFirstG ? "" : "\t") << "r{";
+      isFirstG = false;
+
+      bool isFirst = true;
+      for (auto &p : _partitions)
+        {
+          fileHandle << (isFirst ? "" : ",") << p;
+          isFirst = false;
+        }
+      fileHandle << "}(" << i << ")";
+    }
+}
+
+void DivergenceRates::verifyContent(const TreeAln &traln,
+                                    const ParameterContent &content) const
+{
+  /*
+   * content must have
+   * 1) rateAssignments (nat) for every node
+   * 2) branch lengths (BranchLength) for every node
+   * 3) rateValues (double) for every rateAssignment
+   */
+  assert(content.values.size() > 0);
+  assert(content.rateAssignments.size() == traln.getNumberOfNodes());
+  assert(content.branchLengths.size() == _directedBranches.size());
+  for (int i = 0; i < _directedBranches.size(); i++)
+    {
+      assert(content.branchLengths[i] == _directedBranches[i]);
+    }
+
+  /* root branch has the same value for both nodes */
+  //	auto rb = traln.getRootBranch();
+  //	assert(
+  //			content.branchLengths[rb.getPrimNode() - 1]
+  //					== content.branchLengths[rb.getSecNode() - 1]);
+}
+
+log_double DivergenceRates::getPriorValue(const TreeAln& traln) const
+{
+
+  /* TODO-divtimes check this */
+  auto result = log_double::fromAbs(1);
+
+  // that only partly makes sense ...
+  // result *= _prior->getLogProb( _rates);
+
+  return result;
+}
+
+void DivergenceRates::setPrior(const std::unique_ptr<AbstractPrior> &prior)
+{
+  // meh meh meh
+
+  AbstractParameter::setPrior(prior);
+  //_rates.resize(prior->getInitialValue().values.size());
+}
diff --git a/src/parameters/DivergenceRates.hpp b/src/parameters/DivergenceRates.hpp
new file mode 100644
index 0000000..98a0f5d
--- /dev/null
+++ b/src/parameters/DivergenceRates.hpp
@@ -0,0 +1,46 @@
+#ifndef DIVERGENCERATE_H
+#define DIVERGENCERATE_H
+
+#include "AbstractParameter.hpp"
+
+class DivergenceRates: public AbstractParameter
+{
+public:
+	DivergenceRates(nat id, nat idOfMyKind, std::vector<nat> partitions,
+			nat numberOfTaxa);
+
+        DivergenceRates(const DivergenceRates& rhs);  
+  
+	virtual ~DivergenceRates()
+	{
+	}
+
+	void initializeParameter(TreeAln& traln, const ParameterContent &content);
+	virtual void applyParameter(TreeAln& traln,
+			const ParameterContent &content);
+	virtual ParameterContent extractParameter(const TreeAln &traln) const;
+	virtual void printSample(std::ostream& fileHandle,
+			const TreeAln &traln) const;
+	virtual void printAllComponentNames(std::ostream &fileHandle,
+			const TreeAln &traln) const;
+	virtual void verifyContent(const TreeAln &traln,
+			const ParameterContent &content) const;
+
+	virtual void setPrior(const std::unique_ptr<AbstractPrior> &prior);
+
+	void setRates(std::vector<double> rates)
+	{
+		_rates = rates;
+	}
+
+	virtual AbstractParameter* clone() const;
+
+	virtual log_double getPriorValue(const TreeAln& traln) const;
+
+protected:
+	std::vector<nat> _rateAssignments;
+	std::vector<double> _rates;
+	std::vector<BranchPlain> _directedBranches;
+};
+
+#endif /* DIVERGENCERATE_H */
diff --git a/src/parameters/DivergenceTimes.cpp b/src/parameters/DivergenceTimes.cpp
new file mode 100644
index 0000000..df92cad
--- /dev/null
+++ b/src/parameters/DivergenceTimes.cpp
@@ -0,0 +1,209 @@
+#include "DivergenceTimes.hpp"
+#include "Category.hpp"
+
+DivergenceTimes::DivergenceTimes(nat id, nat idOfMyKind,
+		std::vector<nat> partitions, NodeAge age) :
+		AbstractParameter(Category::DIVERGENCE_TIMES, id, idOfMyKind,
+				partitions, 0), 
+                _rootNode(false), _nodeAge { age }
+{
+}
+
+void DivergenceTimes::initializeParameter(TreeAln& traln,
+		const ParameterContent &content, bool root)
+{
+
+	if (root)
+	{
+		/* root case */
+		/*
+		 * in this case the nodeAges vector contains the set of "root children" ages and
+		 * one additional age for the root itself.
+		 */
+		_nodeAge.setHeight(
+				content.nodeAges[content.nodeAges.size() - 1].getHeight());
+		/* update the root branch */
+		double time = 2 * _nodeAge.getHeight() - content.nodeAges[0].getHeight()
+				- content.nodeAges[1].getHeight();
+		if (content.nodeAges.size() == 2)
+		{
+			/* in case one of the root children is a tip, its height is zero */
+			time += _nodeAge.getHeight();
+		}
+		/* we assume that the current rate at initialization is 1.0 */
+		double newLength = exp(-time / traln.getTrHandle().fracchange);
+		auto newBranch = BranchLength(traln.getRootBranch(), newLength);
+		traln.setBranch(newBranch, this);
+	}
+	else
+	{
+		_nodeAge.setHeight(content.nodeAges[0].getHeight());
+		_nodeAge.setPrimNode(content.nodeAges[0].getPrimNode());
+		_nodeAge.setSecNode(content.nodeAges[0].getSecNode());
+
+		/* initialize parental branch length */
+		if (!traln.isRootBranch(_nodeAge))
+		{
+			auto bl = traln.getBranch(_nodeAge, this);
+			auto length = bl.getLength();
+
+			double time = content.nodeAges[1].getHeight()
+					- _nodeAge.getHeight();
+
+			/* we assume that the current rate at initialization is 1.0 */
+			double newLength = exp(-time / traln.getTrHandle().fracchange);
+
+			auto newBranch = BranchLength(_nodeAge, newLength);
+			traln.setBranch(newBranch, this);
+		}
+
+		/* initialize descendant branch length */
+		auto descendants = traln.getDescendents(_nodeAge);
+		if (traln.isTipBranch(descendants.first))
+		{
+			double time = _nodeAge.getHeight();
+			double newLength = exp(-time / traln.getTrHandle().fracchange);
+			BranchLength newBranch = BranchLength(descendants.first, newLength);
+			traln.setBranch(newBranch, this);
+		}
+		if (traln.isTipBranch(descendants.second))
+		{
+			double time = _nodeAge.getHeight();
+			double newLength = exp(-time / traln.getTrHandle().fracchange);
+			BranchLength newBranch = BranchLength(descendants.second,
+					newLength);
+			traln.setBranch(newBranch, this);
+		}
+	}
+
+	_rootNode = !(_nodeAge.getPrimNode() + _nodeAge.getSecNode());
+}
+
+
+void DivergenceTimes::applyParameter(TreeAln& traln,
+		const ParameterContent &content)
+{
+	BranchLength newBranch;
+
+	verifyContent(traln, content);
+	if (!content.nodeAges.size())
+		return;
+
+#ifdef DIVTIME_DEBUG
+	std::cout << "DIV-TIMES-DBG: - - Time shift from " << _nodeAge.getHeight() << " to "
+	<< content.nodeAges[0].getHeight() << " - delta " << content.nodeAges[0].getHeight() - _nodeAge.getHeight() << std::endl;
+#endif
+
+	_nodeAge.setHeight(content.nodeAges[0].getHeight());
+	if (_rootNode)
+	{
+		newBranch = BranchLength(traln.getRootBranch(), content.values[1]);
+#ifdef DIVTIME_DEBUG
+		std::cout << "DIV-TIMES-DBG: - - Set branch (r) " << content.values[1] << std::endl;
+#endif
+		traln.setBranch(newBranch, this);
+	}
+	else
+	{
+		newBranch = BranchLength(_nodeAge, content.values[0]);
+#ifdef DIVTIME_DEBUG
+		std::cout << "DIV-TIMES-DBG: - - Set branch (p) " << content.values[0] << std::endl;
+#endif
+		traln.setBranch(newBranch, this);
+		auto descendants = traln.getDescendents(_nodeAge);
+		if (content.values[1] > 0.0)
+		{ // traln.isTipBranch(descendants.first)) {
+			newBranch = BranchLength(descendants.first, content.values[1]);
+#ifdef DIVTIME_DEBUG
+			std::cout << "DIV-TIMES-DBG: - - Set branch (c1) " << content.values[1] << std::endl;
+#endif
+			traln.setBranch(newBranch, this);
+		}
+		if (content.values[2] > 0.0)
+		{ // traln.isTipBranch(descendants.second)) {
+			newBranch = BranchLength(descendants.second, content.values[2]);
+#ifdef DIVTIME_DEBUG
+			std::cout << "DIV-TIMES-DBG: - - Set branch (c2) " << content.values[1] << std::endl;
+#endif
+			traln.setBranch(newBranch, this);
+		}
+	}
+}
+
+ParameterContent DivergenceTimes::extractParameter(const TreeAln &traln) const
+{
+	auto content = ParameterContent();
+	content.nodeAges.push_back(_nodeAge);
+
+	if (_rootNode)
+	{
+		content.values.push_back(0.0); // no parental branch
+		content.values.push_back(
+				traln.getBranch(traln.getRootBranch(), this).getLength().getValue());
+		content.values.push_back(
+				traln.getBranch(traln.getRootBranch(), this).getLength().getValue());
+	}
+	else
+	{
+		content.values.push_back(
+				traln.getBranch(_nodeAge, this).getLength().getValue());
+		auto descendants = traln.getDescendents(_nodeAge);
+		content.values.push_back(
+				traln.getBranch(descendants.first, this).getLength().getValue());
+		content.values.push_back(
+				traln.getBranch(descendants.second, this).getLength().getValue());
+	}
+	verifyContent(traln, content);
+	return content;
+}
+
+void DivergenceTimes::printSample(std::ostream& fileHandle,
+		const TreeAln &traln) const
+{
+	fileHandle << _nodeAge.getHeight();
+}
+
+void DivergenceTimes::printAllComponentNames(std::ostream &fileHandle,
+		const TreeAln &traln) const
+{
+	fileHandle << "t{";
+
+	bool isFirst = true;
+	for (auto &p : _partitions)
+	{
+		fileHandle << (isFirst ? "" : ",") << p;
+		isFirst = false;
+	}
+	fileHandle << "}(" << _nodeAge << ")";
+}
+
+void DivergenceTimes::verifyContent(const TreeAln &traln,
+		const ParameterContent &content) const
+{
+	if (!content.nodeAges.size())
+		return;
+
+	/*
+	 * content must have
+	 * 1) new nodeAge
+	 * 2) z_p, z_c1 and z_c2
+	 */
+	assert(content.nodeAges.size() == 1);
+	assert(content.values.size() == 3);
+}
+
+log_double DivergenceTimes::getPriorValue(const TreeAln& traln) const
+{
+	// TODO should extract all branches and evaluate the prior ... not doing this here. ..
+	return log_double::fromAbs(1.);
+}
+
+std::ostream& DivergenceTimes::printShort(std::ostream& out) const
+{
+	out << CategoryFuns::getShortName(_cat) << _idOfMyKind << "{";
+
+	formatRange(out, _partitions);
+
+	out << "}";
+	return out;
+}
diff --git a/src/parameters/DivergenceTimes.hpp b/src/parameters/DivergenceTimes.hpp
new file mode 100644
index 0000000..9523f57
--- /dev/null
+++ b/src/parameters/DivergenceTimes.hpp
@@ -0,0 +1,38 @@
+#ifndef DIVERGENCETIME_H
+#define DIVERGENCETIME_H
+
+
+#include "AbstractParameter.hpp"
+
+#include "NodeAge.hpp"
+
+class DivergenceTimes : public AbstractParameter
+{
+public:
+  DivergenceTimes(nat id, nat idOfMyKind, std::vector<nat> partitions, NodeAge age);
+  virtual ~DivergenceTimes(){}
+
+  virtual void applyParameter(TreeAln& traln,  const ParameterContent &content);
+  virtual ParameterContent extractParameter(const TreeAln &traln)  const  ;   
+  virtual void printSample(std::ostream& fileHandle, const TreeAln &traln ) const ; 
+  virtual void printAllComponentNames(std::ostream &fileHandle, const TreeAln &traln) const  ; 
+  virtual void verifyContent(const TreeAln &traln, const ParameterContent &content) const; 
+  void initializeParameter(TreeAln& traln,  const ParameterContent &content, bool root = false);
+  
+  virtual std::ostream& printShort(std::ostream& out) const;
+
+  virtual AbstractParameter* clone() const  
+  {
+    return new DivergenceTimes(*this); 
+  } 
+
+  virtual log_double getPriorValue(const TreeAln& traln) const; // {assert(0); return log_double::fromAbs(1); } 
+  
+private:
+  bool _rootNode;
+  NodeAge _nodeAge;
+};
+
+
+
+#endif /* DIVERGENCETIME_H */
diff --git a/src/parameters/FrequencyParameter.cpp b/src/parameters/FrequencyParameter.cpp
new file mode 100644
index 0000000..f6cc28f
--- /dev/null
+++ b/src/parameters/FrequencyParameter.cpp
@@ -0,0 +1,120 @@
+#include "FrequencyParameter.hpp"
+#include "BoundsChecker.hpp"
+#include "DnaAlphabet.hpp"
+#include "BinaryAlphabet.hpp"
+#include "AminoAcidAlphabet.hpp"
+#include "RateHelper.hpp"
+
+
+void FrequencyParameter::applyParameter(TreeAln& traln, const ParameterContent &content)
+{ 
+  auto tmp = content.values; 
+  
+  RateHelper::convertToSum1(tmp); 
+    
+  // tout << MAX_SCI_PRECISION << "setting " << content.values << std::endl; 
+
+  for(auto &m : _partitions)    
+    traln.setFrequencies(tmp, m); 
+}
+
+
+ParameterContent FrequencyParameter::extractParameter(const TreeAln &traln )  const
+{
+  auto result = ParameterContent{}; 
+  result.values = traln.getFrequencies(_partitions[0]); 
+
+  // tout << MAX_SCI_PRECISION << "extracting "<< result.values << std::endl; 
+
+  // RateHelper::convertToSum1(result.values); 
+
+  return result; 
+}   
+
+
+void FrequencyParameter::printSample(std::ostream& fileHandle, const TreeAln &traln) const 
+{
+  auto content =  extractParameter(traln); 
+  bool isFirst = true; 
+  for(auto &v : content.values)
+    {
+      fileHandle << (isFirst ? "" : "\t") << v ; 
+      isFirst = false; 
+    }
+} 
+
+ 
+void FrequencyParameter::printAllComponentNames(std::ostream &fileHandle, const TreeAln &traln)  const   
+{
+  auto content = extractParameter(traln); 
+
+  std::vector<std::string> names; 
+  switch(content.values.size())
+    {
+    case 2: 
+      names = BinaryAlphabet().getStates(); 
+      break; 
+    case 4:       
+      names = DnaAlphabet().getStates() ; 
+      break; 
+    case 20: 
+      names = AminoAcidAlphabet().getStates(); 
+      break; 
+    default: 
+      assert(0); 
+    }
+
+  bool isFirstG = true; 
+  for(nat i = 0; i < content.values.size() ; ++i)
+    {
+      fileHandle << (isFirstG ? "" : "\t" ) << "pi{" ;
+      isFirstG = false; 
+	
+      bool isFirst = true; 
+      for(auto &p : _partitions)
+	{
+	  fileHandle  << (isFirst ? "": "," ) << p ; 
+	  isFirst = false; 
+	}	    
+      fileHandle  << "}("  << names.at(i) << ")"; 
+    }  
+} 
+
+
+void FrequencyParameter::verifyContent(const TreeAln &traln, const ParameterContent &content) const 
+{
+  auto& partition = traln.getPartition(_partitions[0]);
+  bool ok = true; 
+  // ok &= BoundsChecker::checkFrequencies(content.values); 
+  ok &= (content.values.size() ==  nat(partition.getStates())); 
+  
+  auto newValues = content.values; 
+  RateHelper::convertToSum1(newValues);
+  
+  if(ok)
+    ok &= BoundsChecker::checkFrequencies(newValues);
+
+  if(not ok)
+    {
+      tout << "ERROR: we had " << content << " for parameter " << this << ". Did you mis-specify a fixed prior?"  << std::endl; 
+      assert(0); 
+    }  
+}
+
+
+
+void FrequencyParameter::checkSanityPartitionsAndPrior(const TreeAln &traln) const 
+{
+  auto numStates = traln.getPartition(_partitions.at(0)).getStates();
+  checkSanityPartitionsAndPrior_FreqRevMat(traln);
+  auto initVal = _prior->getInitialValue(); 
+
+  if( int(initVal.values.size()) != numStates && 
+      initVal.protModel.size() == 0 )
+    {
+      tout << "Error while processing parsed priors: you specified prior " << _prior.get() << " for parameter "; 
+      printShort(tout) << " that is not applicable." << std::endl; 
+      exitFunction(-1, true); 
+    }
+}
+
diff --git a/src/parameters/FrequencyParameter.hpp b/src/parameters/FrequencyParameter.hpp
new file mode 100644
index 0000000..26a751c
--- /dev/null
+++ b/src/parameters/FrequencyParameter.hpp
@@ -0,0 +1,43 @@
+#ifndef FREQ_PARAMETER
+#define FREQ_PARAMETER
+
+#include "TreeAln.hpp"
+#include "AbstractParameter.hpp"
+#include "Category.hpp"
+  
+class FrequencyParameter : public AbstractParameter
+{
+public: 
+  FrequencyParameter(nat id, nat idOfMyKind, std::vector<nat> partitions )
+    : AbstractParameter(Category::FREQUENCIES, id , idOfMyKind, partitions, 1 )
+  { 
+  }
+
+  FrequencyParameter(const FrequencyParameter &rhs )
+    : AbstractParameter(rhs)
+  {    
+  }
+
+  virtual void applyParameter(TreeAln& traln, const ParameterContent &content);
+  virtual ParameterContent extractParameter(const TreeAln &traln)  const;   
+  virtual AbstractParameter* clone () const {return new FrequencyParameter(*this); } 
+
+  virtual void printSample(std::ostream& fileHandle, const TreeAln &traln) const ; 
+  virtual void printAllComponentNames(std::ostream &fileHandle, const TreeAln &traln) const  ; 
+
+  virtual void verifyContent(const TreeAln &traln, const ParameterContent &content) const;
+
+  virtual void checkSanityPartitionsAndPrior(const TreeAln& traln) const ; 
+  
+  virtual bool priorIsFitting(const AbstractPrior &prior, const TreeAln &traln) const
+  {
+    auto content = prior.getInitialValue();
+    auto& partition = traln.getPartition(_partitions.at(0));
+    return content.values.size() == nat(partition.getStates()); 
+  } 
+
+  virtual log_double getPriorValue(const TreeAln& traln) const{assert(0); return log_double::fromAbs(1); } 
+}; 
+
+
+#endif
diff --git a/src/parameters/ParamAttribute.hpp b/src/parameters/ParamAttribute.hpp
new file mode 100644
index 0000000..488d716
--- /dev/null
+++ b/src/parameters/ParamAttribute.hpp
@@ -0,0 +1,30 @@
+#ifndef _PARAM_ATTRIBUTE
+#define _PARAM_ATTRIBUTE
+
+#include "ComplexTuner.hpp"
+
+// another one of these generic container classes 
+
+// not very much happy with it...  
+
+class ParamAttribute
+{
+public: 
+  ParamAttribute()
+    :  _convTuner{0., 0.01,10, 0.1, false }
+    , _nonConvTuner{   0. , 0.1, 10, 0.1 , false }	
+  {
+  }
+
+  ParamAttribute(ComplexTuner c, ComplexTuner n) 
+    : _convTuner{c}
+    , _nonConvTuner{n}
+  {
+  }
+
+  ComplexTuner _convTuner; 
+  ComplexTuner _nonConvTuner; 
+}; 
+
+
+#endif
diff --git a/src/parameters/ParameterContent.cpp b/src/parameters/ParameterContent.cpp
new file mode 100644
index 0000000..5860916
--- /dev/null
+++ b/src/parameters/ParameterContent.cpp
@@ -0,0 +1,115 @@
+#include "ParameterContent.hpp"
+#include "GlobalVariables.hpp"
+
+#include <limits>
+#include <algorithm> 
+
+
+
+ParameterContent::ParameterContent(std::vector<double> valuesI, std::vector<BranchPlain> topoI,
+				   std::vector<BranchLength> blI, std::vector<ProtModel>  pmI,
+				   std::vector<NodeAge> nI, std::vector<nat> rA
+				   ) 
+  : values{valuesI}
+  , topology{topoI}
+  , branchLengths{blI}
+  , protModel{pmI}
+  , nodeAges{nI}
+  , rateAssignments{rA}
+  {
+  }  
+
+
+
+void ParameterContent::deserialize( std::istream &in )  
+{
+  for(auto &v : values)
+    v = cRead<double>(in); 
+
+  for(auto &b : branchLengths)
+    b.deserialize(in);
+ 
+  for(auto &b : topology)
+    b.deserialize(in); 
+  
+  for(auto &v :  protModel)
+    v = ProtModel(cRead<int>(in));
+
+  for(auto &b : nodeAges)
+    b.deserialize(in);
+  
+  for(auto &r : rateAssignments)
+      r = cRead<nat>(in);
+} 
+
+
+void ParameterContent::serialize( std::ostream &out) const 
+{
+  for(auto &v : values)
+    cWrite(out, v); 
+
+  for(auto &b : branchLengths)    
+    {
+      b.serialize(out);
+      // tout << "SER "<< b << std::endl; 
+    }
+
+  for(auto &b : topology)
+    b.serialize(out); 
+
+  for(auto &v : protModel)
+    {
+      auto tmp = int(v);
+      cWrite<int>(out,tmp); 
+    }
+
+  for(auto &b : nodeAges)
+    {
+      b.serialize(out);
+    }
+
+  for(auto &r : rateAssignments)
+    cWrite(out, r);
+}   
+
+
+
+std::ostream& operator<<(std::ostream& out, const ParameterContent &rhs)
+{
+  auto isFirst = bool{true}; 
+ 
+
+  if (rhs.values.size() > 0)
+    {
+		for (auto &v : rhs.values)
+	{
+			out << (isFirst ? "" : ",") << v;
+	  isFirst = false; 
+	}
+    }
+	else if (rhs.branchLengths.size() > 0)
+    {
+		for (auto &b : rhs.branchLengths)
+	{
+			out << (isFirst ? "" : ",") << b;
+	  isFirst = false; 
+	}
+    }
+	else if (rhs.topology.size() > 0)
+    {
+		for (auto &b : rhs.topology)
+	{
+	  out << (isFirst ? "" : ",") << b; 
+	  isFirst = false; 
+	}
+    }
+	else if (rhs.protModel.size() > 0)
+    {
+		for (auto &p : rhs.protModel)
+			out << p;
+    }
+  else     
+    assert(0); 
+
+  return out; 
+} 
diff --git a/src/parameters/ParameterContent.hpp b/src/parameters/ParameterContent.hpp
new file mode 100644
index 0000000..ecafc07
--- /dev/null
+++ b/src/parameters/ParameterContent.hpp
@@ -0,0 +1,43 @@
+#ifndef _PARAMETER_CONTENT
+#define _PARAMETER_CONTENT
+
+#include <iostream>
+#include <vector>
+
+#include "NodeAge.hpp"
+#include "BranchPlain.hpp"
+#include "BranchLength.hpp"
+#include "ProtModel.hpp"
+#include "Serializable.hpp"
+
+// for really properly implementing this, we'd finally need a type for
+// internal and absolute branch lengths (different types of branches). 
+// Until then: I know, it's suboptimal 
+
+class  ParameterContent : public Serializable
+{
+public: 
+  ParameterContent(std::vector<double> valuesI = std::vector<double>{}, 
+		   std::vector<BranchPlain> topoI = std::vector<BranchPlain>{}, 
+		   std::vector<BranchLength> blI = std::vector<BranchLength>{}, 
+		   std::vector<ProtModel>  pmI = std::vector<ProtModel>{}, 
+		   std::vector<NodeAge> nI = std::vector<NodeAge>{},
+		   std::vector<nat> rA = std::vector<nat>{}
+		   ) ; 
+  virtual ~ParameterContent(){}
+
+public:   			// public stuff that should be private 
+  std::vector<double> values; 
+  std::vector<BranchPlain> topology;
+  std::vector<BranchLength> branchLengths; 
+  std::vector<ProtModel> protModel; 
+  std::vector<NodeAge> nodeAges; 
+  std::vector<nat> rateAssignments;
+  
+  virtual void deserialize( std::istream &in )  ; 
+  virtual void serialize( std::ostream &out)  const;   
+
+  friend std::ostream& operator<<(std::ostream& out,  const ParameterContent &rhs); 
+}; 
+
+#endif
diff --git a/src/parameters/ProtModelParameter.cpp b/src/parameters/ProtModelParameter.cpp
new file mode 100644
index 0000000..9b0491b
--- /dev/null
+++ b/src/parameters/ProtModelParameter.cpp
@@ -0,0 +1,86 @@
+#include "ProtModelParameter.hpp" 
+#include "ProtModel.hpp"
+
+#include <sstream>
+
+using std::stringstream; 
+
+void ProtModelParameter::applyParameter(TreeAln& traln,  const ParameterContent &content)
+{
+  for(auto &m : _partitions)
+    {
+      assert(content.protModel.size() == 1); 
+      // tout << "aa model " << content.protModel[0] << std::endl;
+      traln.setProteinModel(m, content.protModel[0]);
+    }
+}
+ 
+ParameterContent ProtModelParameter::extractParameter(const TreeAln &traln)  const  
+{
+
+  auto& partition = traln.getPartition(_partitions.at(0)); 
+  auto model = ProtModel(partition.getProtModels()); 
+  auto result =   ParameterContent{} ; 
+  result.protModel = {model}; 
+  return result; 
+}
+   
+void ProtModelParameter::printSample(std::ostream& fileHandle, const TreeAln &traln ) const 
+{
+  auto& partition = traln.getPartition(_partitions.at(0)); 
+  auto name = ProtModelFun::getName(ProtModel(partition.getProtModels() )); 
+  fileHandle << name; 
+}
+ 
+void ProtModelParameter::printAllComponentNames(std::ostream &fileHandle, const TreeAln &traln) const  
+{
+  fileHandle << "aaModel{" ; 
+  bool isFirst = true; 
+  for(auto &p : _partitions)
+    {
+      fileHandle << (isFirst ? "" : ",") << p ; 
+      isFirst = false; 
+    }
+  fileHandle << "}"; 
+}
+
+ 
+void ProtModelParameter::verifyContent(const TreeAln &traln, const ParameterContent &content) const  
+{
+  if(content.protModel.size() != 1)
+    {
+      stringstream ss;
+      bool first = true; 
+      for (auto& partition : _partitions)
+        ss << (first ?  "" : ",") << partition; 
+
+      tout << "Incorrect number of models in parameter content. "
+        "If you specified a prior for partition " <<  ss.str() <<  ", "
+        "you most probably misspelled the name. If you are sure, that this is"
+        " not the case, please report this as a programming error."
+           << std::endl; 
+      assert(0); 
+    }
+} 
+
+
+void ProtModelParameter::checkSanityPartitionsAndPrior(const TreeAln &traln) const 
+{
+  checkSanityPartitionsAndPrior_FreqRevMat(traln);
+  
+  if(traln.getPartition(_partitions.at(0)).getStates() != 20)
+    {
+      std::cerr << "Error: in the config file you specified partition " << _partitions.at(0) << " to have an amino acid model. However, previously this partition was declared to have a different data type." << std::endl; 
+      exitFunction(-1, true); 
+    }
+}
+
+
+
+bool ProtModelParameter::fitsToPartition(Partition& p) const 
+{
+  return p.getDataType() == PLL_AA_DATA; 
+} 
+
+
+
diff --git a/src/parameters/ProtModelParameter.hpp b/src/parameters/ProtModelParameter.hpp
new file mode 100644
index 0000000..8784a1e
--- /dev/null
+++ b/src/parameters/ProtModelParameter.hpp
@@ -0,0 +1,34 @@
+#ifndef PROT_MODEL_PARAMETER
+#define PROT_MODEL_PARAMETER
+
+#include "Category.hpp"
+#include "AbstractParameter.hpp"
+
+class ProtModelParameter : public AbstractParameter
+{
+public: 
+  ProtModelParameter(nat id, nat idOfMyKind, std::vector<nat> partitions)
+    : AbstractParameter(Category::AA_MODEL, id, idOfMyKind, partitions,1)
+  {
+  }
+  
+  virtual void applyParameter(TreeAln& traln,  const ParameterContent &content);
+  virtual ParameterContent extractParameter(const TreeAln &traln)  const  ;   
+  virtual void printSample(std::ostream& fileHandle, const TreeAln &traln ) const ; 
+  virtual void printAllComponentNames(std::ostream &fileHandle, const TreeAln &traln) const  ; 
+  virtual void verifyContent(const TreeAln &traln, const ParameterContent &content) const  ; 
+  virtual AbstractParameter* clone() const { return new ProtModelParameter(*this); } 
+
+  virtual void checkSanityPartitionsAndPrior(const TreeAln &traln) const  ;
+  
+  
+  virtual bool fitsToPartition(Partition& p) const ; 
+  virtual log_double getPriorValue(const TreeAln& traln) const{assert(0); return log_double::fromAbs(1); } 
+
+private: 
+  
+  
+}; 
+
+
+#endif
diff --git a/src/parameters/README.txt b/src/parameters/README.txt
new file mode 100644
index 0000000..3d25f0b
--- /dev/null
+++ b/src/parameters/README.txt
@@ -0,0 +1,2 @@
+This module contains all classes used to model parameters to be
+integrated over.
diff --git a/src/parameters/RateHetParameter.cpp b/src/parameters/RateHetParameter.cpp
new file mode 100644
index 0000000..56905b5
--- /dev/null
+++ b/src/parameters/RateHetParameter.cpp
@@ -0,0 +1,53 @@
+#include "RateHetParameter.hpp"
+#include "BoundsChecker.hpp"
+
+
+void RateHetParameter::applyParameter(TreeAln& traln, const ParameterContent &content)
+{
+  for(auto &m : _partitions)
+    {
+      traln.setAlpha(content.values[0], m); 
+    }
+}
+ 
+
+ParameterContent RateHetParameter::extractParameter(const TreeAln &traln )  const
+{
+  ParameterContent result; 
+  result.values = {traln.getAlpha(_partitions[0])} ;
+  return result;  
+}   
+
+
+void RateHetParameter::printSample(std::ostream& fileHandle, const TreeAln &traln) const 
+{
+  auto content = extractParameter(traln); 
+  // TODO numeric limits
+  fileHandle << content.values[0] ; 
+}
+
+ 
+void RateHetParameter::printAllComponentNames(std::ostream &fileHandle, const TreeAln &traln) const 
+{
+  fileHandle << "alpha{"  ;
+  bool isFirst = true; 
+  for(auto &p : _partitions) 
+    {
+      fileHandle << (isFirst ? "" : "," ) << p ; 
+      isFirst = false; 
+    }
+  fileHandle<< "}" ; 
+} 
+
+
+
+
+void RateHetParameter::verifyContent(const TreeAln&traln, const ParameterContent &content) const  
+{
+  if(content.values.size() > 1  || not BoundsChecker::checkAlpha(content.values[0]) ) 
+    {
+      tout << "Wrong content " << content << " for parameter "  << this << ". Did you mis-specify a fixed prior or are your input values to extreme?" << std::endl; 
+      assert(0); 
+    }
+  
+}
diff --git a/src/parameters/RateHetParameter.hpp b/src/parameters/RateHetParameter.hpp
new file mode 100644
index 0000000..7313000
--- /dev/null
+++ b/src/parameters/RateHetParameter.hpp
@@ -0,0 +1,28 @@
+#ifndef RATE_HET_PARAMETER
+#define RATE_HET_PARAMETER
+
+#include "AbstractParameter.hpp"
+#include "Category.hpp"
+  
+class RateHetParameter : public AbstractParameter
+{
+public: 
+
+  RateHetParameter(nat id, nat idOfMyKind, std::vector<nat> partitions )
+    : AbstractParameter(Category::RATE_HETEROGENEITY, id, idOfMyKind, partitions,1 )
+  {
+  }
+  
+  virtual void applyParameter(TreeAln& traln, const ParameterContent &content);
+  virtual ParameterContent extractParameter(const TreeAln &traln )  const;   
+  virtual AbstractParameter* clone () const {return new RateHetParameter(*this); } 
+
+  virtual void printSample(std::ostream& fileHandle, const TreeAln &traln) const ; 
+  virtual void printAllComponentNames(std::ostream &fileHandle, const TreeAln &traln) const ; 
+
+  virtual void verifyContent(const TreeAln&traln, const ParameterContent &content) const; 
+
+    virtual log_double getPriorValue(const TreeAln& traln) const{assert(0); return log_double::fromAbs(1); } 
+}; 
+
+#endif
diff --git a/src/parameters/RevMatParameter.cpp b/src/parameters/RevMatParameter.cpp
new file mode 100644
index 0000000..a88c1de
--- /dev/null
+++ b/src/parameters/RevMatParameter.cpp
@@ -0,0 +1,162 @@
+#include <algorithm>
+#include <functional>
+
+#include "RateHelper.hpp"
+#include "DnaAlphabet.hpp"
+#include "AminoAcidAlphabet.hpp"
+
+#include "BoundsChecker.hpp"
+#include "GlobalVariables.hpp"
+
+#include "RevMatParameter.hpp"
+
+
+
+void RevMatParameter::applyParameter(TreeAln& traln, const ParameterContent &content)
+{
+  auto tmp = content.values; 
+
+  RateHelper::convertRelativeToLast(tmp); 
+  
+  // tout << "SET " << tmp << std::endl; 
+  
+  for(auto &m : _partitions)
+    traln.setRevMat(tmp, m, false);
+} 
+
+
+ParameterContent RevMatParameter::extractParameter(const TreeAln &traln )  const
+{
+  ParameterContent result; 
+
+  result.values = traln.getRevMat(_partitions.at(0), false); 
+  
+  // DO ***NOT*** REMOVE 
+  // this is necessary to avoid rounding errors
+  // with AA GTR matrices; but essentially it is just a hack to reduce
+  // the probability of the gtr aa matrix to mess up
+  RateHelper::convertRelativeToLast(result.values); 
+  RateHelper::convertToSum1(result.values);
+
+  // tout << "GET " << result.values << std::endl; 
+
+  return result; 
+}   
+
+
+ParameterContent RevMatParameter::extractParameterRaw(const TreeAln& traln) const 
+{
+  auto result = ParameterContent{}; 
+  result.values = traln.getRevMat(_partitions.at(0), true); 
+  return result; 
+}
+ 
+
+void RevMatParameter::applyParameterRaw(TreeAln &traln, const ParameterContent & content) const 
+{
+  for(auto &m : _partitions)
+    traln.setRevMat(content.values, m, true); 
+} 
+
+void RevMatParameter::printSample(std::ostream& fileHandle, const TreeAln &traln) const 
+{
+  auto content = extractParameter(traln);
+
+  bool isFirst = true; 
+  for(auto &v : content.values)
+    {
+      fileHandle << (isFirst ?  "" : "\t" ) << v ; 
+      isFirst = false; 
+    }
+}
+ 
+void RevMatParameter::printAllComponentNames(std::ostream &fileHandle, const TreeAln &traln) const 
+{
+  auto content = extractParameter(traln); 
+  std::vector<std::string> names; 
+  
+  auto size = content.values.size(); 
+  switch(size)
+    {
+    case 6 : 
+      names = DnaAlphabet().getCombinations();
+      break; 
+    case 190: 			// really? 
+      names = AminoAcidAlphabet().getCombinations(); 
+      break; 
+    default : 
+      {
+	std::cerr << "error in revMatParameter: encountered case >" <<  size << std::endl; 
+	assert(0); 
+      }
+    }
+
+  bool isFirstG = true; 
+  for(nat i = 0; i < content.values.size() ; ++i)
+    {
+      fileHandle << (isFirstG ? "" : "\t" ) << "r{" ;
+      isFirstG = false; 
+	
+      bool isFirst = true; 
+      for(auto &p : _partitions)
+	{
+	  fileHandle  << (isFirst ? "": "," ) << p ; 
+	  isFirst = false; 
+	}	    
+      fileHandle  << "}("  << names.at(i) << ")"; 
+    }  
+}
+
+
+void RevMatParameter::verifyContent(const TreeAln&traln,  const ParameterContent &content) const 
+{
+  auto& partition = traln.getPartition(_partitions[0]);
+
+  if (partition.getDataType() == PLL_BINARY_DATA)
+  {
+      tout << "\n\nError: you specfied a reversible rates parameter for"
+           << " partition " << _partitions[0] << ", which consists of binary data."
+           << std::endl;
+      assert(0);
+  }
+
+
+  auto num = RateHelper::numStateToNumInTriangleMatrix(partition.getStates());
+
+  bool ok = true;
+
+  ok &= content.values.size( )== num ; 
+  
+  auto newValues = content.values; 
+  RateHelper::convertRelativeToLast(newValues); 
+
+  // for(auto &v : newValues)
+  //   v /= *(newValues.rbegin()); 
+  
+  if(ok)
+    ok &= BoundsChecker::checkRevmat(newValues); 
+
+  if(not ok )
+    {
+      tout << "Wrong content " << content << " for parameter "
+      << this << ". Did you mis-specify a fixed prior or are your input values to extreme?" << std::endl; 
+      assert(0); 
+    }
+} 
+
+
+void RevMatParameter::checkSanityPartitionsAndPrior(const TreeAln &traln) const 
+{
+  checkSanityPartitionsAndPrior_FreqRevMat(traln);
+  nat numStates = traln.getPartition(_partitions[0]).getStates(); 
+  
+  auto initVal = _prior->getInitialValue(); 
+  
+  if( initVal.values.size() != RateHelper::numStateToNumInTriangleMatrix(numStates) && 
+      initVal.protModel.size() == 0 )
+    {
+      tout << "Error while processing parsed priors: you specified prior " << _prior.get() << " for parameter "; 
+      printShort(tout) << " that is not applicable." << std::endl; 
+      exitFunction(-1, true); 
+    }
+}
diff --git a/src/parameters/RevMatParameter.hpp b/src/parameters/RevMatParameter.hpp
new file mode 100644
index 0000000..60671c9
--- /dev/null
+++ b/src/parameters/RevMatParameter.hpp
@@ -0,0 +1,46 @@
+#ifndef REV_MAT_PARAMETER
+#define REV_MAT_PARAMETER
+
+
+#include "RateHelper.hpp"
+#include "Category.hpp"
+#include "AbstractParameter.hpp"
+  
+class RevMatParameter : public AbstractParameter
+{
+public: 
+  RevMatParameter(nat id, nat idOfMyKind, std::vector<nat> partitions ) 
+    : AbstractParameter(Category::SUBSTITUTION_RATES, id, idOfMyKind, partitions, 1  )
+  {
+  }
+
+  RevMatParameter(const RevMatParameter &rhs )
+    : AbstractParameter(rhs)
+  {    
+  }
+
+  virtual void applyParameter(TreeAln& traln, const ParameterContent &content);
+  virtual void applyParameterRaw(TreeAln &traln, const ParameterContent & content) const ; 
+  virtual ParameterContent extractParameter(const TreeAln &traln )  const;   
+  virtual ParameterContent extractParameterRaw(const TreeAln& traln) const ; 
+
+  virtual AbstractParameter* clone () const {return new RevMatParameter(*this); }
+
+  virtual void printSample(std::ostream& fileHandle, const TreeAln &traln) const ; 
+  virtual void printAllComponentNames(std::ostream &fileHandle, const TreeAln &traln) const ; 
+
+  virtual void verifyContent(const TreeAln&traln, const ParameterContent &content) const ; 
+  
+  virtual void checkSanityPartitionsAndPrior(const TreeAln &traln) const ; 
+
+  virtual bool priorIsFitting(const AbstractPrior &prior, const TreeAln &traln) const
+  {
+    auto content = prior.getInitialValue();
+    auto& partition = traln.getPartition(_partitions.at(0));
+    return content.values.size()  ==  RateHelper::numStateToNumInTriangleMatrix(partition.getStates()); 
+  }
+  
+    virtual log_double getPriorValue(const TreeAln& traln) const{assert(0); return log_double::fromAbs(1); } 
+}; 
+
+#endif
diff --git a/src/parameters/TopologyParameter.cpp b/src/parameters/TopologyParameter.cpp
new file mode 100644
index 0000000..618b187
--- /dev/null
+++ b/src/parameters/TopologyParameter.cpp
@@ -0,0 +1,22 @@
+#include "TopologyParameter.hpp"
+
+
+void TopologyParameter::applyParameter(TreeAln& traln , const ParameterContent &content)
+{
+  traln.unlinkTree();
+  for(auto &b : content.topology)
+    {
+      // tout << "clipping " << b << std::endl; 
+      traln.clipNode(traln.getUnhookedNode(b.getPrimNode()), traln.getUnhookedNode(b.getSecNode())); 
+    }
+}
+
+
+ParameterContent TopologyParameter::extractParameter(const TreeAln &traln )  const
+{
+  auto result = ParameterContent{}; 
+  auto params = std::vector<AbstractParameter*>{};
+  result.topology = traln.extractBranches(  ); 
+  return result; 
+}   
+
diff --git a/src/parameters/TopologyParameter.hpp b/src/parameters/TopologyParameter.hpp
new file mode 100644
index 0000000..03c38c5
--- /dev/null
+++ b/src/parameters/TopologyParameter.hpp
@@ -0,0 +1,28 @@
+#ifndef _TOPOLOGY_PARAMETER
+#define _TOPOLOGY_PARAMETER
+
+#include "AbstractParameter.hpp"
+#include "Category.hpp"
+
+class TopologyParameter : public AbstractParameter
+{
+public: 
+  TopologyParameter(nat id, nat idOfMyKind, std::vector<nat> partitions )
+    : AbstractParameter(Category::TOPOLOGY, id, idOfMyKind, partitions, 1)
+  {
+    _printToParamFile = false; 
+  }
+
+  virtual void applyParameter(TreeAln& traln , const ParameterContent &content);
+  virtual ParameterContent extractParameter(const TreeAln &traln )  const;   
+  virtual AbstractParameter* clone () const {return new TopologyParameter(*this); } 
+
+  virtual void printSample(std::ostream& fileHandle, const TreeAln &traln) const {}
+  virtual void printAllComponentNames(std::ostream &fileHandle, const TreeAln &traln) const  {} 
+
+  virtual void verifyContent(const TreeAln&traln, const ParameterContent &content)  const { } // nothing to do 
+
+  virtual log_double getPriorValue(const TreeAln& traln) const{assert(0); return log_double::fromAbs(1); } 
+}; 
+
+#endif
diff --git a/src/pll.h b/src/pll.h
new file mode 100644
index 0000000..2d3b928
--- /dev/null
+++ b/src/pll.h
@@ -0,0 +1,50 @@
+/**
+   @file axml.h
+   @brief A wrapper to include all files from pll/examl.   
+*/ 
+
+
+#ifndef _AXML_H_
+#define _AXML_H_
+
+#pragma warning  disable 
+
+
+#include "common.h"
+
+
+#ifdef _USE_GOOGLE_PROFILER
+#include <gperftools/profiler.h>
+#endif
+
+
+
+/* translate the defines for correct vectorization  */
+#if USE_SSE
+#define __SSE3
+#endif
+
+#if USE_AVX
+#define __AVX 
+#endif
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#include "lib/pll/pll-renamed.h"
+#include "lib/pll/pllInternal.h"
+
+
+#ifdef __MIC_NATIVE
+#include "lib/pll/mic_native.h"
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+/* #pragma warning restore   */
+
+
+#endif
diff --git a/src/priors/AbstractPrior.hpp b/src/priors/AbstractPrior.hpp
new file mode 100644
index 0000000..0f8be2b
--- /dev/null
+++ b/src/priors/AbstractPrior.hpp
@@ -0,0 +1,62 @@
+#ifndef _PRIORS_H
+#define _PRIORS_H
+
+#include <vector>
+#include <limits>
+#include <cassert>
+#include <cmath>
+#include <iostream>
+
+#include "Density.hpp"
+
+#include "Randomness.hpp"
+#include "TreeAln.hpp"
+
+#include "ParameterContent.hpp"
+
+
+class AbstractPrior
+{
+public: 
+  AbstractPrior()
+    : _keepInitData{false}
+  { }
+  
+  virtual ~AbstractPrior() {}
+
+  /** 
+      @brief obtains a pre-defined initial value, depending on the
+      prior.
+  */
+  virtual ParameterContent getInitialValue() const = 0; 
+  virtual log_double accountForMeanSubstChange( TreeAln &traln, const AbstractParameter* param , double myOld, double myNew ) const = 0; 
+  virtual ParameterContent drawFromPrior(Randomness &rand)  const = 0 ; 
+  virtual log_double getLogProb( const ParameterContent &content ) const = 0; 
+  virtual void print(std::ostream &out) const = 0;
+
+  virtual bool needsIntegration() const = 0; 
+
+  virtual AbstractPrior* clone() const = 0;
+
+  virtual double getFirstDerivative( const AbstractParameter& param) const = 0; 
+  
+  // only for internal branch lengths; this is very ugly, however we need this for maintaining numerical stability with > 300 partitions
+  virtual log_double getUpdatedValue(double oldRawVal, double newRawVal, const AbstractParameter* param) const = 0;
+
+  friend std::ostream& operator<<(std::ostream &out,  AbstractPrior* rhs)
+  {
+
+    rhs->print(out);
+    return out; 
+  }
+  
+  bool isKeepInitData() const {return _keepInitData; }
+  void setKeepInitData()  { _keepInitData = true; }
+
+protected: 
+  bool _keepInitData;
+
+}; 
+
+ 
+#endif
diff --git a/src/priors/DirichletPrior.cpp b/src/priors/DirichletPrior.cpp
new file mode 100644
index 0000000..24aa6ef
--- /dev/null
+++ b/src/priors/DirichletPrior.cpp
@@ -0,0 +1,40 @@
+#include "DirichletPrior.hpp"
+#include "RateHelper.hpp"
+#include <numeric>
+
+
+log_double DirichletPrior::getLogProb(const ParameterContent& content) const 
+{
+  auto &values = content.values; 
+  assert(values.size() == alphas.size() ); 
+  double sum = 0; 
+  for(auto v: values)
+    sum += v; 
+  assert(fabs(sum - 1.0) < 1e-6); 
+
+  auto result = Density::lnDirichlet(values, alphas ); 
+  return result; 
+}
+
+
+void DirichletPrior::print(std::ostream& out ) const 
+{
+  out << "Dirichlet("   ; 
+  bool first = true; 
+  for(auto v : alphas)
+    {      
+      out << ( first ? "" : "," )  << v ;
+      if(first)
+	first = false;
+    }    
+  out << ")";
+}
+
+
+ParameterContent DirichletPrior::getInitialValue() const
+{
+  auto result = ParameterContent{}; 
+  result.values = alphas; 
+  RateHelper::convertToSum1(result.values); 
+  return result; 
+}
diff --git a/src/priors/DirichletPrior.hpp b/src/priors/DirichletPrior.hpp
new file mode 100644
index 0000000..031209c
--- /dev/null
+++ b/src/priors/DirichletPrior.hpp
@@ -0,0 +1,38 @@
+
+#ifndef _DIRICHLET_PRIOR
+#define _DIRICHLET_PRIOR
+
+#include "AbstractPrior.hpp"
+
+class DirichletPrior : public AbstractPrior
+{
+public: 
+  DirichletPrior(std::vector<double> a) 
+    : alphas(a)
+  {
+  }
+
+  virtual ParameterContent drawFromPrior(Randomness &rand)  const {assert(0); return ParameterContent{}; } ; 
+
+  virtual log_double getLogProb( const ParameterContent& content) const ; 
+  virtual void print(std::ostream& out ) const ; 
+
+  virtual ParameterContent getInitialValue() const; 
+
+  virtual bool needsIntegration() const {return true; } 
+
+  virtual log_double accountForMeanSubstChange( TreeAln &traln, const AbstractParameter* param, double myOld, double myNew ) const {assert(0) ; return log_double::fromAbs(0) ; } 
+
+  virtual AbstractPrior* clone() const { return new  DirichletPrior(*this) ; }
+
+  double getFirstDerivative( const AbstractParameter& param) const {assert(0); return 0; } // doesnt have that
+
+  virtual log_double getUpdatedValue(double oldRawVal, double newRawVal, const AbstractParameter* param) const
+    { assert(0); return log_double();}
+  
+private: 
+  std::vector<double> alphas; 
+
+} ;
+
+#endif
diff --git a/src/priors/DiscreteModelPrior.cpp b/src/priors/DiscreteModelPrior.cpp
new file mode 100644
index 0000000..c665da3
--- /dev/null
+++ b/src/priors/DiscreteModelPrior.cpp
@@ -0,0 +1,77 @@
+#include "DiscreteModelPrior.hpp"
+#include "ProtModel.hpp"
+
+
+DiscreteModelPrior:: DiscreteModelPrior(std::unordered_map<ProtModel,double> model)
+  :_modelProbs{model}
+{
+} 
+
+
+ParameterContent DiscreteModelPrior::getInitialValue() const 
+{
+  auto result = ParameterContent{}; 
+  auto aModel = std::get<0>( *(_modelProbs.begin() )); 
+  result.protModel.push_back( aModel);  
+  return result;
+} 
+
+
+log_double DiscreteModelPrior::accountForMeanSubstChange( TreeAln &traln, const AbstractParameter* param , double myOld, double myNew ) const 
+{
+  assert(0); 
+  return log_double::fromAbs(0);
+}
+
+ 
+// TODO bool uniform 
+ParameterContent DiscreteModelPrior::drawFromPrior(Randomness &rand)  const 
+{
+  auto modelList = std::vector<ProtModel>{}; 
+  for(auto &v : _modelProbs)
+    if( FLOAT_IS_INITIALIZED(std::get<1>(v)) )
+      modelList.push_back(std::get<0>(v)); 
+
+  auto index = rand.drawIntegerOpen(int(modelList.size()))  ; 
+  
+  auto result = ParameterContent{}; 
+  result.protModel.push_back(modelList.at(index));
+  return result; 
+}
+
+log_double DiscreteModelPrior::getLogProb( const ParameterContent& content ) const 
+{
+  assert(content.protModel.size() == 1 ); 
+  
+  auto model = ProtModel(content.protModel[0]);
+  // auto model = ProtModel(content.values[0]); 
+  assert(_modelProbs.find(model) != _modelProbs.end()); 
+
+  return log_double::fromAbs(_modelProbs.at(model));
+}
+
+ 
+void DiscreteModelPrior::print(std::ostream &out) const 
+{
+  if(_modelProbs.size() == 1 )
+    {
+      auto model = std::get<0>(* _modelProbs.begin()); 
+      out << "Fixed(" << ProtModelFun::getName(model) << ")" ; 
+    }
+  else 
+    {
+      out << "Discrete(" ; 
+      auto isFirst = bool{true}; 
+      for(auto &modelPair : _modelProbs)
+	{
+	  if(isFirst)
+	    isFirst = false; 
+	  else 
+	    out << "," ;
+
+	  out << ProtModelFun::getName(std::get<0>(modelPair)) << "=" << SOME_FIXED_PRECISION <<  std::get<1>(modelPair) ; 
+	}
+      out << ")"; 
+    }
+}
+
diff --git a/src/priors/DiscreteModelPrior.hpp b/src/priors/DiscreteModelPrior.hpp
new file mode 100644
index 0000000..25088b0
--- /dev/null
+++ b/src/priors/DiscreteModelPrior.hpp
@@ -0,0 +1,32 @@
+#ifndef DISCRETE_MODEL_PRIOR
+#define DISCRETE_MODEL_PRIOR
+
+#include <unordered_map>
+#include "ProtModel.hpp"
+#include "AbstractPrior.hpp"
+
+class DiscreteModelPrior : public AbstractPrior
+{
+public: 
+  DiscreteModelPrior(std::unordered_map<ProtModel,double> model); 
+  
+  // if we have only one model this is basically a fixed prior 
+  virtual bool needsIntegration() const {assert(_modelProbs.size() > 0 ); return _modelProbs.size() > 1 ; } 
+
+  virtual ParameterContent getInitialValue() const ; 
+  virtual log_double accountForMeanSubstChange( TreeAln &traln, const AbstractParameter* param , double myOld, double myNew ) const ; 
+  ParameterContent drawFromPrior(Randomness &rand)  const ; 
+  virtual log_double getLogProb(const ParameterContent& content ) const ; 
+  virtual void print(std::ostream &out) const ;
+
+  double getFirstDerivative( const AbstractParameter& param) const {assert(0); return 0; } // doesnt have that
+
+  virtual log_double getUpdatedValue(double oldRawVal, double newRawVal, const AbstractParameter* param) const
+    { assert(0); return log_double();}
+
+  virtual AbstractPrior* clone()const { return new  DiscreteModelPrior(*this) ; }
+private: 
+  std::unordered_map<ProtModel,double> _modelProbs; 
+}; 
+
+#endif
diff --git a/src/priors/ExponentialPrior.cpp b/src/priors/ExponentialPrior.cpp
new file mode 100644
index 0000000..45e04ef
--- /dev/null
+++ b/src/priors/ExponentialPrior.cpp
@@ -0,0 +1,68 @@
+#include "ExponentialPrior.hpp"
+#include "AbstractParameter.hpp"
+#include "BranchLengthsParameter.hpp"
+
+ExponentialPrior::ExponentialPrior(double l) 
+  : _lambda(l)
+{
+}
+
+
+log_double ExponentialPrior::getLogProb(const ParameterContent& content) const 
+{
+  auto& values = content.values; 
+  assert(values.size() == 1); 
+  return Density::lnExponential(values[0], _lambda); 
+}
+
+
+void ExponentialPrior::print(std::ostream& out ) const  
+{        
+  out << "Exponential("  << _lambda << ")" ;       
+}
+
+
+log_double ExponentialPrior::getUpdatedValue(double oldRawVal, double newRawVal, const AbstractParameter* param) const  
+{
+  // tout << SHOW(newRawVal)e
+  auto result = _lambda *  param->getMeanSubstitutionRate() * log(newRawVal / oldRawVal) ; 
+  return log_double::fromLog(result)  ; 
+}
+
+
+log_double ExponentialPrior::accountForMeanSubstChange( TreeAln &traln, const AbstractParameter* param, double myOld, double myNew ) const 
+{
+  double blInfluence = 0; 
+  for(auto &b : traln.extractBranches(param))
+    blInfluence += log(b.getLength().getValue());
+
+  auto result = log_double::fromLog((myNew - myOld) *  _lambda  *  blInfluence ); 
+  return result; 
+}
+
+
+ParameterContent ExponentialPrior::getInitialValue() const
+{
+  auto result = ParameterContent{}; 
+  result.values.push_back( 1. / _lambda); 
+  return result; 
+} 
+
+
+double ExponentialPrior::getFirstDerivative(const AbstractParameter& param) const
+{
+  // this assert is clearly ridiculous; however it is not worth making
+  // the situation even more complicated...
+  
+  // TODO properly cast it 
+  assert( dynamic_cast<BranchLengthsParameter*>(const_cast<AbstractParameter*>(&param)) != nullptr ); 
+  auto fracchange = param.getMeanSubstitutionRate();
+  return fracchange * _lambda; 
+}
+
+
+ParameterContent ExponentialPrior::drawFromPrior(Randomness &rand)  const 
+{
+  auto val = rand.drawRandExp(_lambda); 
+  return ParameterContent{{val}};
+} 
diff --git a/src/priors/ExponentialPrior.hpp b/src/priors/ExponentialPrior.hpp
new file mode 100644
index 0000000..1439bdb
--- /dev/null
+++ b/src/priors/ExponentialPrior.hpp
@@ -0,0 +1,28 @@
+#ifndef _EXPONENTIAL_PRIOR 
+#define _EXPONENTIAL_PRIOR 
+
+#include "AbstractPrior.hpp"
+#include "Density.hpp"
+ 
+class ExponentialPrior : public AbstractPrior
+{
+public: 
+  ExponentialPrior(double lambda) ; 
+  virtual bool needsIntegration() const {return true; } 
+  virtual log_double getLogProb(const ParameterContent& content) const  ; 
+  virtual log_double getUpdatedValue(double oldRawVal, double newRawVal, const AbstractParameter* param) const  ;
+  virtual ParameterContent drawFromPrior(Randomness &rand)  const ; 
+  virtual void print(std::ostream& out ) const  ; 
+  virtual double getLamda()  const  { return _lambda; } 
+  virtual ParameterContent getInitialValue() const; 
+  virtual log_double accountForMeanSubstChange( TreeAln &traln, const AbstractParameter* param, double myOld, double myNew )  const ; 
+
+  virtual double getFirstDerivative( const AbstractParameter& param) const; 
+
+  virtual AbstractPrior* clone() const { return new ExponentialPrior(*this) ; }
+
+private: 
+  double _lambda; 
+}; 
+
+#endif
diff --git a/src/priors/FixedPrior.cpp b/src/priors/FixedPrior.cpp
new file mode 100644
index 0000000..e1053af
--- /dev/null
+++ b/src/priors/FixedPrior.cpp
@@ -0,0 +1,108 @@
+#include "FixedPrior.hpp"
+#include "AbstractParameter.hpp"
+#include "Category.hpp"
+#include "BoundsChecker.hpp"
+#include <numeric>
+
+FixedPrior::FixedPrior(std::vector<double> fixedValues)
+  : _fixedValues(fixedValues) 
+{
+  if(_fixedValues.size() >  1 )
+    {
+      auto sum = std::accumulate(begin(_fixedValues), end(_fixedValues),0.); 
+      for(auto &v : _fixedValues)
+	v /= sum; 
+    }
+}
+
+
+log_double FixedPrior::getLogProb(const ParameterContent& content)  const
+{    
+  auto &values = content.values; 
+
+  // branch lengths case! 
+  if(_fixedValues.size( )== 1 )
+    {
+      if(fabs (values[0] - _fixedValues.at(0) ) > 1e-6)
+	{
+	  tout << "Fatal: for fixed prior, value should be "   << _fixedValues.at(0) << " but actually is " << values[0] << std::endl; 
+	  assert(0); 
+	}
+    }
+  else 
+    {
+      for(nat i = 0; i < _fixedValues.size() ; ++i)
+	{
+	  if(std::fabs(_fixedValues[i] - values[i]) > 1e-6 )
+	    {
+	      tout << "error: expected " << SHOW(_fixedValues) << " but obtained " << SHOW(values) << std::endl; 
+	      assert(0); 
+	    }
+	}
+    }
+
+  return log_double::fromAbs(1.); 
+}
+
+
+ParameterContent FixedPrior::getInitialValue() const
+{
+  auto result = ParameterContent{}; 
+
+  if(not _keepInitData) 
+    result.values = _fixedValues; 
+  else 
+    result.values = {0.1}; 
+       
+  return result; 
+} 
+
+
+void FixedPrior::print(std::ostream &out) const 
+{
+  out << "Fixed(" ;     
+  bool first = true; 
+  for(auto v : _fixedValues)
+    {
+      out << (first ? "" : ",") << v ; 
+      if(first) first = false; 
+    }
+  out << ")"; 
+}
+
+
+log_double FixedPrior::accountForMeanSubstChange(TreeAln  &traln, const AbstractParameter* param, double myOld, double myNew ) const 
+{
+  if(param->getCategory() == Category::BRANCH_LENGTHS)
+    {
+      // first check, if re-scaling is possible 
+      auto bls = traln.extractBranches(param); 
+
+      for(auto &b : bls)
+	{
+	  if(_keepInitData)
+	    {
+	      auto len = b.getLength().getValue();
+	      double frac = myNew / myOld; 
+	      b.setLength( InternalBranchLength(pow(len, 1. / frac ) ));
+	    }
+	  else 
+	    {
+	      b.setLength(InternalBranchLength::fromAbsolute(_fixedValues.at(0), param->getMeanSubstitutionRate())); 
+	    }
+	}
+      
+      if( std::any_of(bls.begin(), bls.end(), [](BranchLength &b){ return not BoundsChecker::checkBranch(b) ;  }) ) 
+	return log_double::negativeInfinity();
+
+      for(auto &b : bls)
+	traln.setBranch(b,param); 
+
+      return log_double::fromAbs(1); 
+    }
+  else 
+    {
+      assert(0); 
+      return log_double::fromAbs(0); 
+    }
+}
diff --git a/src/priors/FixedPrior.hpp b/src/priors/FixedPrior.hpp
new file mode 100644
index 0000000..e8c3a5f
--- /dev/null
+++ b/src/priors/FixedPrior.hpp
@@ -0,0 +1,32 @@
+#ifndef _FIXE_PRIOR
+#define  _FIXE_PRIOR
+
+#include "AbstractPrior.hpp"
+
+
+class FixedPrior : public AbstractPrior
+{
+public: 
+  FixedPrior(std::vector<double> fixedValues)   ; 
+
+  virtual bool needsIntegration() const {return false; } 
+  virtual log_double getLogProb(const ParameterContent &content )  const; 
+
+  virtual ParameterContent drawFromPrior(Randomness &rand)  const {assert(0); return ParameterContent{}; } 
+
+  virtual void print(std::ostream &out) const ; 
+  virtual ParameterContent getInitialValue() const; 
+
+  virtual AbstractPrior* clone() const { return new  FixedPrior(*this) ; }
+  virtual log_double accountForMeanSubstChange( TreeAln &traln, const AbstractParameter* param, double myOld, double myNew ) const; 
+
+  double getFirstDerivative( const AbstractParameter& param) const {assert(0); return 0; }
+
+  virtual log_double getUpdatedValue(double oldRawVal, double newRawVal, const AbstractParameter* param) const
+    { assert(0); return log_double();}
+
+private: 
+  std::vector<double> _fixedValues; 
+}; 
+
+#endif
diff --git a/src/priors/PriorBelief.cpp b/src/priors/PriorBelief.cpp
new file mode 100644
index 0000000..621fadf
--- /dev/null
+++ b/src/priors/PriorBelief.cpp
@@ -0,0 +1,129 @@
+#include "PriorBelief.hpp"
+
+#include <cmath>
+
+#include "BoundsChecker.hpp"
+#include "GlobalVariables.hpp"
+#include "AbstractPrior.hpp"
+#include "UniformPrior.hpp"
+#include "ExponentialPrior.hpp"
+#include "Category.hpp"
+
+#include "TreePrinter.hpp"
+
+
+PriorBelief::PriorBelief()
+  : _lnPrior(log_double::fromAbs(1.))
+  , _lnPriorRatio(log_double::fromAbs(1.))
+  , wasInitialized(false)
+{
+}
+
+
+void PriorBelief::initialize(const TreeAln &traln , ParameterList &params)
+{
+  _lnPrior = scoreEverything(traln, params); 
+  _lnPriorRatio = log_double::fromAbs(1.); 
+  wasInitialized = true; 
+}
+
+
+log_double PriorBelief::scoreEverything(const TreeAln &traln, ParameterList &parameters) const 
+{
+  auto result = log_double::fromAbs(1.);
+
+  for( auto& v : parameters)
+    {
+      auto partialResult = log_double::fromAbs(1.); 
+      
+      switch(v->getCategory()) 
+	{	  
+	case Category::DIVERGENCE_RATES: 
+	case Category::DIVERGENCE_TIMES: 
+	  {
+	    // that's how it is supposed to be ... this entire switch
+	    // should be converted into respective methods in the
+	    // parameters ...
+	    partialResult *= v->getPriorValue(traln); 
+	  }
+	  break; 
+	case Category::TOPOLOGY: 	  
+	  partialResult *= log_double::fromAbs(1.); 	// well...
+	  break; 
+	case Category::BRANCH_LENGTHS: 
+	  {
+	    auto bs = traln.extractBranches(v); 
+	    auto pr = v->getPrior(); 
+	    auto meanSubstRate = v->getMeanSubstitutionRate();
+	    for(auto &b : bs)	      
+	      {
+		auto len = b.toMeanSubstitutions(meanSubstRate); 
+		auto logProb = pr->getLogProb( ParameterContent {  { len  }  }); 
+		partialResult *= logProb; 
+	      }
+	  }
+	  break; 
+	case Category::FREQUENCIES: 
+	  {
+	    auto freqs = traln.getFrequencies(v->getPartitions()[0]); 
+	    partialResult = v->getPrior()->getLogProb( freqs) ; 
+	  } 
+	  break; 
+	case Category::SUBSTITUTION_RATES: 
+	  {
+	    auto revMat = traln.getRevMat(v->getPartitions()[0] , false); 
+	    partialResult = v->getPrior()->getLogProb(revMat); 
+	  }
+	  break; 
+	case Category::RATE_HETEROGENEITY: 
+	  {
+	    double alpha = traln.getAlpha(v->getPartitions()[0]) ;
+	    partialResult = v->getPrior()->getLogProb( ParameterContent{{ alpha} }); 
+	  }
+	  break; 
+	case Category::AA_MODEL: 
+	  {
+	    auto p = v->getPartitions()[0]; 
+	    auto model = traln.getProteinModel(p); 
+	    auto content =  ParameterContent(); 
+	    content.protModel.push_back(model); 
+	    partialResult = v->getPrior()->getLogProb(content);
+	  }
+	  break; 
+	default : assert(0); 
+	}
+      
+      // std::cout << "pr(" <<  v << ") = "<< partialResult << std::endl ; 
+      result *= partialResult; 
+    }
+
+  // the lnPriorRatio may be infinite. But never the assumed value   
+  assert(not result.isInfinity() && not result.isNaN()); 
+  
+  return result; 
+} 
+
+
+void PriorBelief::verifyPrior(const TreeAln &traln, ParameterList& parameters)  
+{
+  // assert( _lnPriorRatio.toAbs() == 1. ); 
+  
+  auto verified = scoreEverything(traln, parameters); 
+
+  if (   log_double( verified / _lnPrior).toAbs() - 1.  >=  ACCEPTED_LNPR_EPS)
+    {
+      tout << MAX_SCI_PRECISION << "ln prior was " << _lnPrior << " while it should be " << verified << std::endl; 
+      tout << "difference: "<< fabs( verified.toAbs() - _lnPrior.toAbs()) << std::endl; 
+      assert(0); 
+    }
+
+  _lnPrior = verified; 
+}
+
+
+void PriorBelief::addToRatio(log_double val) 
+{
+  assert(wasInitialized) ;
+  // tout << MAX_SCI_PRECISION << "adding " << val << std::endl; 
+  _lnPriorRatio *= val; 
+}
diff --git a/src/priors/PriorBelief.hpp b/src/priors/PriorBelief.hpp
new file mode 100644
index 0000000..cbc2dc7
--- /dev/null
+++ b/src/priors/PriorBelief.hpp
@@ -0,0 +1,86 @@
+/**
+   @file PriorBelief.hpp
+
+   @brief top level object that represents the prior probability of a
+   chain
+ */ 
+
+
+#ifndef _PRIORMANAGER_H
+#define _PRIORMANAGER_H
+
+#include <cassert>
+#include <cmath>
+#include <memory>
+#include <vector>
+#include <iostream>
+
+#include "GlobalVariables.hpp"
+#include "extensions.hpp"
+
+#include "ParameterList.hpp"
+
+class AbstractPrior; 
+class AbstractParameter; 
+class TreeAln;
+class PriorBelief
+{
+public:
+  PriorBelief();  
+  /** 
+      @brief intializes and scores the prior each parameter    
+   */ 
+  void initialize(const TreeAln &traln, ParameterList &params);   
+  /** 
+      @brief informs the prior about acceptance of the new state    
+   */ 
+  void accept()  { assert(wasInitialized); _lnPrior *= _lnPriorRatio;  _lnPriorRatio = log_double::fromAbs(1.); }  
+  /** 
+      @brief informs the prior about rejection of the new state 
+   */
+  void reject() { assert(wasInitialized) ; _lnPriorRatio = log_double::fromAbs(1.); }
+  /** 
+      @brief adds a (logarithmic!) value to the prior ratio
+   */ 
+  void addToRatio(log_double val); 
+  
+  /** 
+      @brief accounts for branch length prior changes due to either
+      substitution rate or state frequencies updates
+
+      @param oldFc old fracchanges for each involved branch length parameter
+      @param newFc new fracchanges (after proposal) for each involved branch length parameter 
+
+      @notice indices in the fracchange arrays correspond to
+      idOfMyKind of branch length parameters
+
+      @notice this is very pedastrian, but I do not see how to avoid this
+   */ 
+  // void accountForFracChange( TreeAln &traln, const std::vector<double> &oldFc, const std::vector<double> &newFcs, 
+  // 			    const std::vector<AbstractParameter*> &affectedBlParams )  ; 
+  /** 
+      @brief verifies the prior 
+   */ 
+  void verifyPrior(const TreeAln &traln, ParameterList& variables)  ;  
+
+  ///////////////
+  // OBSERVERS //
+  ///////////////
+  log_double getLnPrior () const { // assert(not std::isinf(_lnPrior)) ;
+    assert(wasInitialized); return _lnPrior; } 
+  log_double getLnPriorRatio() const {assert(wasInitialized) ; return _lnPriorRatio; }
+
+private: 
+  log_double scoreEverything(const TreeAln &traln, ParameterList& params) const ; 
+  
+  // having an internal state actually defies the logic of the randomVariables being external 
+  log_double _lnPrior; 
+  log_double _lnPriorRatio; 
+  bool wasInitialized; 
+
+  // double _error; 
+}; 
+
+
+
+#endif
diff --git a/src/priors/README.txt b/src/priors/README.txt
new file mode 100644
index 0000000..5e172e9
--- /dev/null
+++ b/src/priors/README.txt
@@ -0,0 +1 @@
+This module contains classes that implement various priors.
diff --git a/src/priors/UniformPrior.cpp b/src/priors/UniformPrior.cpp
new file mode 100644
index 0000000..b10e6a4
--- /dev/null
+++ b/src/priors/UniformPrior.cpp
@@ -0,0 +1,68 @@
+#include "UniformPrior.hpp"
+
+
+UniformPrior::UniformPrior(double minV, double maxV) 
+  : minVal(minV), maxVal(maxV)
+{
+}
+
+log_double UniformPrior::getLogProb(const ParameterContent& content)  const 
+{
+  auto &values = content.values; 
+  assert(values.size() == 1); 
+  double value = values[0];
+
+  if(minVal <= value && value <= maxVal )      
+    return log_double::fromAbs(1 / (maxVal - minVal)); 
+  else  
+    {
+      return log_double::lowest();
+    }
+}
+
+
+void UniformPrior::print(std::ostream& out ) const  
+{ 
+  out << "Uniform("  << minVal << "," << maxVal << ")" ; 
+}
+
+ParameterContent UniformPrior::getInitialValue() const
+{
+  auto result = ParameterContent(); 
+
+  assert(minVal < maxVal); 
+  result.values.push_back( minVal + ( maxVal - minVal ) / 2  ) ; 
+  return result; 
+} 
+
+
+
+log_double UniformPrior::accountForMeanSubstChange( TreeAln &traln, const AbstractParameter* param, double oldFc, double newFc )const 
+{
+  auto result = 0.; 
+
+  auto maxV =  exp( - getMin() / newFc) , 
+    minV = exp(  - getMax() / newFc) ; 
+
+  for(auto &b : traln.extractBranches(param))
+    {
+      bool less = b.getLength().getValue() < minV; 
+      bool greater = b.getLength().getValue() > maxV; 
+	      
+      assert(not (less && greater)); 
+
+      if(less || greater)
+	{
+	  // tout << b.getLength() << " is not okay (" << b.getInterpretedLength(traln,param) << ")" << std::endl; 
+	  result += - std::numeric_limits<double>::infinity();
+	}
+    }
+  
+  return log_double::fromAbs(result); 
+} 
+
+
+double UniformPrior::getFirstDerivative( const AbstractParameter& param) const
+{
+  return 0; 
+} 
diff --git a/src/priors/UniformPrior.hpp b/src/priors/UniformPrior.hpp
new file mode 100644
index 0000000..dc3fb2d
--- /dev/null
+++ b/src/priors/UniformPrior.hpp
@@ -0,0 +1,34 @@
+#ifndef _UNIFORM_PRIOR
+#define _UNIFORM_PRIOR
+
+#include "AbstractPrior.hpp" 
+
+class UniformPrior : public AbstractPrior
+{
+public: 
+  UniformPrior(double minVal, double maxVal); 
+  virtual log_double getLogProb(const ParameterContent& content)  const ; 
+  virtual bool needsIntegration() const {return true; } 
+  virtual void print(std::ostream& out ) const  ; 
+  virtual ParameterContent getInitialValue() const; 
+
+  virtual ParameterContent drawFromPrior(Randomness &rand)  const {assert(0); return ParameterContent{}; } ; 
+
+  virtual log_double accountForMeanSubstChange( TreeAln &traln, const AbstractParameter* param, double myOld, double myNew ) const; 
+
+  virtual AbstractPrior* clone() const { return new  UniformPrior(*this) ; }
+
+  virtual log_double getUpdatedValue(double oldRawVal, double newRawVal, const AbstractParameter* param) const
+    { assert(0); return log_double();}
+
+  double getMin() const {return minVal; }
+  double getMax() const {return maxVal; }
+
+  double getFirstDerivative( const AbstractParameter& param) const;
+
+private:
+  double minVal; 
+  double maxVal; 
+}; 
+
+#endif
diff --git a/src/proposals/AbstractProposal.cpp b/src/proposals/AbstractProposal.cpp
new file mode 100644
index 0000000..1148590
--- /dev/null
+++ b/src/proposals/AbstractProposal.cpp
@@ -0,0 +1,222 @@
+#include "AbstractProposal.hpp"
+#include "ParameterList.hpp"
+
+
+AbstractProposal::AbstractProposal( Category cat, std::string name,double weight, double minTuning, double maxTuning, bool needsFullTraversal )  
+  : _name(name)
+  , _sctr{}
+  , _category(cat)
+  , _primParamIds{}
+  , _secParamIds{}
+  , _relativeWeight(weight)
+  , _needsFullTraversal(needsFullTraversal)
+  , _inSetExecution(false)
+  , _preparedBranch(0,0)
+  , _preparedOtherBranch(0,0)
+  , _id{0}
+  , _forProteinOnly(false)
+  , _minTuning{minTuning}
+  , _maxTuning{maxTuning}
+  , _numTaxNeeded{4}
+  , _usingOptimizedBranches(false)
+  , _allParams( nullptr ) 	// do not like 
+  // the proper way to initialize everything is probably a factory... 
+{
+} 
+
+
+std::ostream& AbstractProposal::printShort(std::ostream &out)  const 
+{
+  out << _name << "( " ;  
+    
+  bool isFirst = true; 
+  for(auto &v : _primParamIds)
+    {
+      // tout << "trying to print "  << v << std::endl; 
+      if(not isFirst)
+	out << ","; 
+      else 
+	isFirst = false; 
+      auto p = _allParams->at(v); 
+      p->printShort(out); 
+    }
+
+  if(_secParamIds.size() > 0)
+    {
+      out << ";"; 
+      isFirst = true; 
+      for(auto &v : _secParamIds)
+	{
+	  if(not isFirst)
+	    out << ","; 
+	  else 
+	    isFirst = false; 
+	  _allParams->at(v)->printShort(out); 
+	}
+    }
+
+  printParams(out);
+
+  out << " )"; 
+  return out; 
+}
+
+
+std::ostream& AbstractProposal::printNamePartitions(std::ostream &out)
+{
+  out << _name  << "(" ; 
+  assert(_primParamIds.size() == 1); 
+  bool isFirst= true; 
+  for (auto v : _allParams->at(_primParamIds[0])->getPartitions()) 
+    {
+      if( not isFirst)
+	out << ","; 
+      else 
+	isFirst = false; 
+      out << v ; 
+    }
+  out << ")" ; 
+  return out; 
+}
+
+
+std::ostream&  operator<< ( std::ostream& out , const AbstractProposal& rhs) 
+{
+  out << rhs._name  << std::endl
+      << "\tintegrating:\t"; 
+  for(auto &r : rhs._primParamIds)
+    out << rhs._allParams->at(r) << ", "  ; 
+  
+  if(not rhs._secParamIds.empty() )
+    {
+      out << std::endl << "\talso modifying:\t" ; 
+      for(auto &r : rhs._secParamIds ) 
+	out << rhs._allParams->at(r) << ",\t" ; 
+    }
+  return out; 
+}
+
+
+void AbstractProposal::serialize( std::ostream &out)   const
+{
+  _sctr.serialize(out) ; 
+  writeToCheckpointCore(out); 
+}
+
+
+void AbstractProposal::deserialize( std::istream &in )
+{
+  _sctr.deserialize(in); 
+  readFromCheckpointCore(in); 
+}
+
+
+std::vector<AbstractParameter*> AbstractProposal::getPrimaryParameterView() const
+{
+  auto result = std::vector<AbstractParameter*> {}; 
+  for(auto &v : _primParamIds)
+    result.push_back( _allParams->at(v)); 
+  return result; 
+}
+
+ 
+std::vector<AbstractParameter*> AbstractProposal::getSecondaryParameterView() const 
+{
+  auto result = std::vector<AbstractParameter*>{}; 
+  for(auto &v : _secParamIds)
+    result.push_back( _allParams->at(v)); 
+  return result; 
+}
+
+
+std::vector<AbstractParameter*> AbstractProposal::getBranchLengthsParameterView() const 
+{
+  auto result = std::vector<AbstractParameter*> {}; 
+  for(auto &p : _primParamIds)
+    if(_allParams->at(p)->getCategory() == Category::BRANCH_LENGTHS)
+      result.push_back(_allParams->at(p)); 
+
+  for(auto &p : _secParamIds ) 
+    if(_allParams->at(p)->getCategory() == Category::BRANCH_LENGTHS)
+      result.push_back(_allParams->at(p));
+  return result; 
+} 
+
+
+std::vector<nat> AbstractProposal::getAffectedPartitions() const 
+{
+  assert( _primParamIds.size() == 1); 
+  return _allParams->at(_primParamIds[0])->getPartitions();
+} 
+
+
+std::array<bool,3>
+AbstractProposal::getBranchProposalMode() const 
+{
+  bool outer = false; 
+  bool multiply = false; 
+  bool sequential = false; 
+
+  auto branchOpt = std::getenv("PROPOSE_BRANCHES"); 
+  if(branchOpt != NULL )
+    {
+      auto &&iss =  std::istringstream(branchOpt); 
+      int mode = 0; 
+      iss >> mode; 
+      if(mode == 0)
+	{
+	}
+      else if(mode == 1)
+	{
+	  multiply = true ; 
+	}
+      else if(mode == 2)
+	{
+	  multiply = true; 
+	  outer = true; 
+	}
+      else if(mode == 3 )
+	{
+	  multiply = true; 
+	  sequential = true; 
+	}
+      else if(mode == 4 )
+	{
+	  multiply = true; 
+	  outer = true; 
+	  sequential = true; 
+	}
+      else 
+	assert(0);
+    }
+
+  return {{multiply, outer, sequential }}; 
+}
+
+
+/**
+   @brief log tuning for a parameter 
+   
+   @return tuned parameter    
+ */
+double AbstractProposal::tuneParameter(int batch, double accRatio, double parameter, bool inverse )
+{  
+  double delta = 1.0 / sqrt(batch + 1 );
+  // delta = 0.1 < delta ? 0.1 : delta;
+
+  assert(  FLOAT_IS_INITIALIZED(_minTuning)  || FLOAT_IS_INITIALIZED( _maxTuning) ); 
+
+  double logTuning = log(parameter);
+  
+  if(inverse)
+    logTuning += (accRatio > TARGET_RATIO)  ? -delta : +delta ;
+  else 
+    logTuning += (accRatio > TARGET_RATIO)  ? +delta : -delta ;
+  
+  double newTuning = exp(logTuning);
+
+  if (_minTuning <  newTuning && newTuning < _maxTuning)
+    return newTuning; 
+  else 
+    return parameter; 
+}
diff --git a/src/proposals/AbstractProposal.hpp b/src/proposals/AbstractProposal.hpp
new file mode 100644
index 0000000..fa1fe39
--- /dev/null
+++ b/src/proposals/AbstractProposal.hpp
@@ -0,0 +1,202 @@
+#ifndef _ABSTRACTPROPOSAL_H
+#define _ABSTRACTPROPOSAL_H
+
+#include <string>
+#include <vector>
+
+class OptimizedParameter;  
+
+#include "Category.hpp"
+#include "SuccessCounter.hpp" 
+#include "Randomness.hpp"
+#include "PriorBelief.hpp"
+#include "GlobalVariables.hpp"
+#include "LikelihoodEvaluator.hpp"
+#include "TreeRandomizer.hpp"
+#include "Serializable.hpp"
+#include "DistributionProposer.hpp"
+#include "GammaProposer.hpp"
+#include "ParameterList.hpp"
+
+
+class AbstractProposal : public Serializable
+{
+public: 			// INHERITED METHODS 
+  /**
+     @brief determines the proposal, applies it to the tree / model, updates prior and hastings ratio
+   */ 
+  virtual void applyToState(TreeAln &traln, PriorBelief &prior, log_double &hastings, Randomness &rand, LikelihoodEvaluator& eval) = 0; 
+  /**
+     @brief evaluates the proposal 
+     @todo remove the prior, we should not need it here 
+   */ 
+  virtual void evaluateProposal(LikelihoodEvaluator &evaluator, TreeAln &traln, const BranchPlain &branchSuggestion) = 0; 
+  /** 
+      @brief resets the tree to its previous state; corrects the prior, if necessary (@todo is this the case?)
+   */ 
+  virtual void resetState(TreeAln &traln) = 0 ; 
+  /** 
+      @brief tunes proposal parameters, if available  
+   */ 
+  virtual void autotune() = 0  ;
+  
+  virtual AbstractProposal* clone() const = 0;  
+
+  virtual BranchPlain determinePrimeBranch(const TreeAln &traln, Randomness& rand) const = 0; 
+  /** 
+      @brief gets nodes that are invalid by executed the proposal 
+   */ 
+  virtual std::vector<nat> getInvalidatedNodes(const TreeAln &traln) const = 0;  
+  /** 
+      @brief inform proposal about acceptance
+   */ 
+  virtual void accept() {_sctr.accept();}
+  /**
+     @brief inform proposal about rejection 
+  */ 
+  virtual void reject() {_sctr.reject();}
+
+  virtual void extractProposer(TreeAln& traln, const OptimizedParameter& param) { }
+
+  /** 
+      @brief prepare for set execution (only relevant for branch length + node slider)
+   */ 
+  virtual std::pair<BranchPlain,BranchPlain> prepareForSetExecution(TreeAln &traln, Randomness &rand)  = 0; 
+
+  // we need to implement these 
+  virtual void serialize( std::ostream &out)  const;  
+  virtual void deserialize( std::istream &in ) ; 
+
+  /** 
+      @brief writes proposal specific (tuned) parameters
+   */ 
+  virtual void writeToCheckpointCore(std::ostream &out)const  = 0 ;  
+  /** 
+      @brief reads proposal specific (tuned) parameters 
+   */ 
+  virtual void readFromCheckpointCore(std::istream &in) = 0; 
+
+  virtual void prepareForSetEvaluation( TreeAln &traln, LikelihoodEvaluator& eval) const  {} 
+
+  virtual void printParams(std::ostream &out)  const {} 
+
+public: 
+  AbstractProposal( Category cat, std::string  _name, double weight, double minTuning, double maxTuning, bool needsFullTraversal )  ; 
+  AbstractProposal(const AbstractProposal& rhs) = default; 
+  AbstractProposal& operator=(const AbstractProposal &rhs)  = default; 
+
+  virtual ~AbstractProposal(){}
+
+  bool isUsingOptimizedBranches() const {return _usingOptimizedBranches; } 
+
+  std::array<bool,3> getBranchProposalMode() const ; 
+
+  /** 
+      @brief gets the relative weight of this proposal 
+   */ 
+  double getRelativeWeight() const { return _relativeWeight; }
+  /**
+     @brief sets the relative weight of this proposal 
+   */ 
+  void setRelativeWeight(double tmp) { _relativeWeight = tmp; }
+  
+
+  /** 
+      @brief gets the category 
+   */ 
+  Category getCategory() const {return _category; }
+  /** 
+      @brief gets the name of the proposal 
+   */ 
+  std::string getName() const {return _name; }
+
+  /** 
+      @brief gets the success counter 
+   */ 
+  const SuccessCounter& getSCtr()  const { return _sctr; }
+  /** 
+      @brief gets the number of proposal invocation, since it has been tune the last time 
+   */ 
+  int getNumCallSinceTuning() const { return _sctr.getRecentlySeen(); }
+  /** 
+      @brief add a parameter to be integrated over to the proposal 
+   */ 
+  void addPrimaryParameter(nat id) {_primParamIds.push_back(id) ; }
+  /** 
+      @brief add a parameter  that is integrated over as a by-product of this proposal 
+   */ 
+  void addSecondaryParameter(nat id) {_secParamIds.push_back(id) ; }
+  /** 
+      @brief indicates whether this proposal needs a full traversal 
+   */ 
+  bool isNeedsFullTraversal() const {return _needsFullTraversal; }
+  std::vector<AbstractParameter*> getBranchLengthsParameterView() const ; 
+
+  /** 
+      @brief update the hatsings
+      @param valToAdd is the absolute proposal ratio that shall be added 
+   */ 
+  // static void updateHastingsLog(double &hastings, double valToAdd, std::string whoDoneIt); 
+
+  std::vector<nat> getAffectedPartitions() const ; 
+
+  std::ostream& printNamePartitions(std::ostream &out); 
+  std::ostream& printShort(std::ostream &out)  const ;
+
+  std::vector<AbstractParameter*> getPrimaryParameterView() const; 
+  std::vector<AbstractParameter*> getSecondaryParameterView() const ; 
+
+  void setPreparedBranch(BranchPlain b ) {_preparedBranch = b;  }
+  void setOtherPreparedBranch(BranchPlain b){_preparedOtherBranch = b; }
+
+  void setInSetExecution(bool exec) { _inSetExecution = exec;  }
+  void setId(nat id){_id = id; }
+  nat getId() const {return _id; }
+
+  friend std::ostream&  operator<< ( std::ostream& out , const AbstractProposal& rhs); 
+
+  void setForProteinsOnly(bool val)  {_forProteinOnly = val; }
+  bool isForProteinOnly() const {return _forProteinOnly; }
+
+  double tuneParameter(int batch, double accRatio, double parameter, bool inverse ); 
+
+  nat getNumTaxNeeded() const {return _numTaxNeeded; }
+
+  
+  /* 
+     this method should not be....rather unsafe. Ideally, we'd like to
+     have a factory that produces proposals and parameters alike...
+   */ 
+  void setParams( ParameterList *params) { _allParams = params ; }
+
+protected:   			// ATTRIBUTES 
+  std::string _name;   
+  SuccessCounter _sctr; 
+  Category _category; 
+
+  std::vector<nat> _primParamIds; // it is the  primary purpose of this proposal to integrate over these parameters (in most cases only 1) 
+  std::vector<nat> _secParamIds;  // as a by-product also these random variables are changed 
+
+  double _relativeWeight; 
+  bool _needsFullTraversal; 
+  bool _inSetExecution;
+
+  // meh 
+  BranchPlain _preparedBranch; 
+  BranchPlain _preparedOtherBranch; 
+  
+  nat _id; 
+
+  bool _forProteinOnly; 
+
+  double _minTuning; 
+  double _maxTuning; 
+
+  nat _numTaxNeeded; 
+  bool _usingOptimizedBranches; 
+
+  ParameterList* _allParams; 	// call back to chain->params ; not owned here 
+}; 
+
+#endif
+
diff --git a/src/proposals/AminoModelJump.cpp b/src/proposals/AminoModelJump.cpp
new file mode 100644
index 0000000..b57ed8b
--- /dev/null
+++ b/src/proposals/AminoModelJump.cpp
@@ -0,0 +1,164 @@
+#include "AminoModelJump.hpp"
+#include "BoundsChecker.hpp"
+#include "Category.hpp"
+#include "AbstractPrior.hpp"
+
+
+AminoModelJump::AminoModelJump()
+    : AbstractProposal(Category::AA_MODEL, "aaMat", 1., 0, 0, true)
+    , _savedMod{}
+{}
+
+ProtModel                    AminoModelJump::drawProposal(
+    Randomness&rand) const
+{
+    auto primVar  = getPrimaryParameterView();
+    auto newModel = _savedMod;
+
+    while (newModel == _savedMod)
+    {
+        auto content = primVar[0]->getPrior()->drawFromPrior(rand);
+        newModel = content.protModel[0];
+    }
+
+    return newModel;
+}
+
+void                         AminoModelJump::applyToState(
+    TreeAln&            traln,
+    PriorBelief&        prior,
+    log_double&         hastings,
+    Randomness&         rand,
+    LikelihoodEvaluator&eval)
+{
+    // save the old fracchanges
+    auto                       blParams = getBranchLengthsParameterView();
+
+    auto                       primVar = getPrimaryParameterView();
+
+    assert(primVar.size() == 1);
+    const auto&                partitions = primVar[0]->getPartitions();
+
+    std::vector<double>        oldFCs;
+    oldFCs.reserve(partitions.size());
+
+    for (auto&blParam : blParams)
+        oldFCs.push_back(blParam->getMeanSubstitutionRate());
+
+    _savedMod = traln.getProteinModel(partitions[0]);
+
+    auto                       newModel = drawProposal(rand);
+
+    std::vector<double>        newFCs;
+    newFCs.reserve(partitions.size());
+
+    // apply new model
+    for (auto p : partitions)
+        traln.setProteinModel(p, newModel);
+
+    // update the fracchanges
+    for (auto blParam: blParams)
+        blParam->updateMeanSubstRate(traln);
+
+    for (auto blParam : blParams)
+        newFCs.push_back(blParam->getMeanSubstitutionRate());
+
+    // account for implicit BL multiplier in prior
+    for (nat i = 0; i < blParams.size(); ++i)
+    {
+        prior.addToRatio(blParams[i]->getPrior()->accountForMeanSubstChange(
+                             traln,
+                             blParams[i],
+                             oldFCs.at(i),
+                             newFCs.at(i)));
+    }
+
+    // account for implicit BL multiplier in Hastings
+    for (nat i = 0; i < blParams.size(); ++i)
+    {
+        auto value =
+            traln.getNumberOfBranches()
+            * log(newFCs.at(i) / oldFCs.at(i));
+
+        hastings *= log_double::fromLog(value);
+    }
+}
+
+
+void                                AminoModelJump::evaluateProposal(
+    LikelihoodEvaluator&evaluator,
+    TreeAln&            traln,
+    const BranchPlain&  branchSuggestion)
+{
+    evaluator.evaluate(traln, traln.getAnyBranch(), true); // TODO evaluate one
+                                                           // partition
+}
+
+
+void                                AminoModelJump::resetState(
+    TreeAln&traln)
+{
+    auto primVar = getPrimaryParameterView();
+    assert(primVar.size() == 1);
+    auto partitions = primVar[0]->getPartitions();
+
+    for (auto p: partitions)
+        traln.setProteinModel(p, _savedMod);
+
+    // necessary, if we have fixed branch lengths
+    for (auto&param : getBranchLengthsParameterView())
+    {
+        if (not param->getPrior()->needsIntegration())
+        {
+            for (auto&b : traln.extractBranches(param))
+            {
+                auto content = param->getPrior()->getInitialValue();
+
+                b.setLength(InternalBranchLength::fromAbsolute(
+                                content.values[0],
+                                param->getMeanSubstitutionRate()));
+
+                if (not BoundsChecker::checkBranch(b))
+                    BoundsChecker::correctBranch(b);
+
+                traln.setBranch(b, param);
+            }
+        }
+        else
+        {
+            // TODO inefficient =/ but cannot use the oldFCs. That
+            // would cause trouble in proposal sets
+            param->updateMeanSubstRate(traln);
+        }
+    }
+}
+
+
+void                                AminoModelJump::autotune()
+{
+    // do nothing
+}
+
+
+AbstractProposal*                   AminoModelJump::clone() const
+{
+    return new AminoModelJump(*this);
+}
+
+
+std::vector<nat>                    AminoModelJump::getInvalidatedNodes(
+    const TreeAln& traln) const
+{
+    auto result = std::vector<nat>{};
+
+    for (nat i = traln.getNumberOfTaxa() + 1;
+         i < traln.getNumberOfNodes() + 1;
+         ++i)
+    {
+        //
+        result.push_back(i);
+    }
+
+
+    return result;
+}
diff --git a/src/proposals/AminoModelJump.hpp b/src/proposals/AminoModelJump.hpp
new file mode 100644
index 0000000..3e7a242
--- /dev/null
+++ b/src/proposals/AminoModelJump.hpp
@@ -0,0 +1,67 @@
+#ifndef _AAMODEL_JUMP_H
+#define _AAMODEL_JUMP_H
+
+#include "AbstractProposal.hpp"
+#include "ProtModel.hpp"
+
+#include <vector>
+
+///////////////////////////////////////////////////////////////////////////////
+//                             AMINO MODEL JUMP                              //
+///////////////////////////////////////////////////////////////////////////////
+class AminoModelJump : public AbstractProposal
+{
+public:
+    // _________________________________________________________________________
+    AminoModelJump();
+    // _________________________________________________________________________
+    virtual BranchPlain                               determinePrimeBranch(
+        const TreeAln& traln,
+        Randomness&    rand) const {return BranchPlain(0, 0); }
+    // _________________________________________________________________________
+    virtual void                                      readFromCheckpointCore(
+        std::istream&in){}                                    // disabled
+    // _________________________________________________________________________
+    virtual void                                      writeToCheckpointCore(
+        std::ostream&out) const {}                                 // disabled
+    // _________________________________________________________________________
+    virtual void                                      applyToState(
+        TreeAln&             traln,
+        PriorBelief&         prior,
+        log_double&          hastings,
+        Randomness&          rand,
+        LikelihoodEvaluator& eval);
+    // _________________________________________________________________________
+    virtual void                                      evaluateProposal(
+        LikelihoodEvaluator&evaluator,
+        TreeAln&            traln,
+        const BranchPlain&  branchSuggestion);
+    // _________________________________________________________________________
+    virtual void                                      resetState(
+        TreeAln&traln);
+    // _________________________________________________________________________
+    virtual void                                      autotune();
+    // _________________________________________________________________________
+    virtual AbstractProposal*                         clone()
+    const;
+    // _________________________________________________________________________
+    virtual std::vector<nat>                          getInvalidatedNodes(
+        const TreeAln& traln) const;
+    // _________________________________________________________________________
+    virtual std::pair<BranchPlain,
+                      BranchPlain>                    prepareForSetExecution(
+        TreeAln&   traln,
+        Randomness&rand)
+    {
+        return std::make_pair(BranchPlain(0, 0), BranchPlain(0, 0));
+    }
+private:
+    // _________________________________________________________________________
+    ProtModel                                         drawProposal(
+        Randomness&rand) const;
+private:
+    ProtModel _savedMod;
+};
+
+
+#endif
diff --git a/src/proposals/BranchIntegrator.hpp b/src/proposals/BranchIntegrator.hpp
new file mode 100644
index 0000000..830e6b7
--- /dev/null
+++ b/src/proposals/BranchIntegrator.hpp
@@ -0,0 +1,39 @@
+#ifndef _BRANCH_INTEGRATOR
+#define _BRANCH_INTEGRATOR
+
+#include "BranchLengthMultiplier.hpp"
+
+class BranchIntegrator  : public BranchLengthMultiplier
+{
+public: 
+  BranchIntegrator( double _mult )
+    : BranchLengthMultiplier( _mult)
+    , toPropose{}
+  {
+    _name =  "blInt"; 
+    _relativeWeight = 20; 
+    _category = Category::BRANCH_LENGTHS;     
+  }
+
+  virtual BranchPlain proposeBranch(const TreeAln &traln, Randomness &rand) const
+  {
+    
+    return toPropose; 
+  } 
+  
+  void setToPropose(BranchPlain b) { toPropose = b; }
+
+  virtual AbstractProposal* clone() const {return new BranchIntegrator(*this); }   
+
+  virtual std::vector<nat> getInvalidatedNodes(const TreeAln &traln ) const  {return {}; }
+
+  virtual void autotune(){}
+
+private:
+  BranchPlain toPropose; 
+  
+
+}; 
+
+
+#endif
diff --git a/src/proposals/BranchLengthMultiplier.cpp b/src/proposals/BranchLengthMultiplier.cpp
new file mode 100644
index 0000000..0e7321e
--- /dev/null
+++ b/src/proposals/BranchLengthMultiplier.cpp
@@ -0,0 +1,137 @@
+#include "BranchLengthMultiplier.hpp"
+#include "TreeAln.hpp"
+#include "BoundsChecker.hpp"
+#include "TreeRandomizer.hpp"
+#include "AbstractPrior.hpp"
+
+
+BranchLengthMultiplier::BranchLengthMultiplier(  double multiplier)
+  : AbstractProposal(Category::BRANCH_LENGTHS, "blMult", 7., 0.0001,  100, false)
+  , _multiplier(multiplier)
+  , _savedBranch{}
+{
+}
+
+
+BranchPlain BranchLengthMultiplier::proposeBranch(const TreeAln &traln, Randomness &rand) const 
+{
+  if(_inSetExecution)
+    return _preparedBranch;
+  else  
+    return determinePrimeBranch(traln,rand); 
+}   
+
+
+BranchPlain BranchLengthMultiplier::determinePrimeBranch(const TreeAln &traln, Randomness& rand) const 
+{
+  return TreeRandomizer::drawBranchUniform(traln, rand); 
+} 
+
+
+void BranchLengthMultiplier::applyToState(TreeAln &traln, PriorBelief &prior, log_double &hastings, Randomness &rand, LikelihoodEvaluator& eval) 
+{
+  auto b = BranchLength(proposeBranch(traln, rand)); 
+  
+  assert(_primParamIds.size() == 1); 
+  auto param = _allParams->at(_primParamIds[0]); 
+
+  _savedBranch = traln.getBranch(b, param); 
+
+  double oldZ = _savedBranch.getLength().getValue();
+
+  double
+    drawnMultiplier = 0 ,
+    newZ = oldZ; 
+
+  drawnMultiplier= rand.drawMultiplier( _multiplier); 
+  // tout << SHOW(drawnMultiplier) << std::endl; 
+  assert(drawnMultiplier > 0.); 
+  newZ = pow( oldZ, drawnMultiplier);
+
+  // tout << MAX_SCI_PRECISION << "proposed " << newZ <<  " from " << multiplier << " and oldBranch=" << savedBranch << std::endl; 
+  
+  b.setLength(InternalBranchLength(newZ)); 
+
+  if(not BoundsChecker::checkBranch(b))
+    BoundsChecker::correctBranch(b); 
+  traln.setBranch(b, param); 
+
+  double realMultiplier = log(b.getLength().getValue()) / log(oldZ); 
+
+  hastings *= log_double::fromAbs(realMultiplier); 
+
+  prior.addToRatio(param->getPrior()->getUpdatedValue(oldZ, b.getLength().getValue(), param));
+}
+
+
+void BranchLengthMultiplier::evaluateProposal(LikelihoodEvaluator &evaluator,TreeAln &traln, const BranchPlain &branchSuggestion) 
+{
+  assert(_primParamIds.size() == 1 ); 
+  auto parts = _allParams->at(_primParamIds[0])->getPartitions();
+  
+#ifdef PRINT_EVAL_CHOICE
+  tout << "EVAL: " << savedBranch << std::endl; 
+#endif
+  evaluator.evaluatePartitionsWithRoot(traln,_savedBranch, parts, false); 
+
+  // tout << SOME_FIXED_PRECISION << "lnl=" << traln.getTrHandle().likelihood << std::endl; 
+}
+
+ 
+void BranchLengthMultiplier::resetState(TreeAln &traln) 
+{
+  assert(_primParamIds.size() == 1)  ; 
+  auto params = getBranchLengthsParameterView(); 
+  assert(params.size() == 1); 
+  auto param = params[0]; 
+  traln.setBranch( _savedBranch, param); 
+}
+
+
+void BranchLengthMultiplier::autotune() 
+{
+  double ratio = _sctr.getRatioInLastInterval(); 
+  double newParam = tuneParameter(_sctr.getBatch(), ratio , _multiplier, false);
+
+  // tout << MAX_SCI_PRECISION << SHOW(_multiplier) << " -> " << SHOW(newParam) << std::endl; 
+
+  // tout << MAX_SCI_PRECISION <<   SHOW(_minTuning) << SHOW(newParam) << SHOW(_maxTuning) << std::endl; 
+  
+  _multiplier = newParam; 
+
+  _sctr.nextBatch();
+}
+
+
+AbstractProposal* BranchLengthMultiplier::clone() const
+{
+  return new BranchLengthMultiplier(*this);
+}
+
+
+void BranchLengthMultiplier::readFromCheckpointCore(std::istream &in) 
+{
+  _multiplier = cRead<decltype(_multiplier)>(in);
+} 
+
+
+void BranchLengthMultiplier::writeToCheckpointCore(std::ostream &out) const
+{
+  cWrite<decltype(_multiplier)>(out, _multiplier); 
+} 
+
+
+std::pair<BranchPlain,BranchPlain> BranchLengthMultiplier::prepareForSetExecution(TreeAln &traln, Randomness &rand) 
+{
+  assert(_inSetExecution); 
+  return std::pair<BranchPlain,BranchPlain>( 
+					    determinePrimeBranch(traln,rand),
+					    BranchPlain(0,0)); 
+}
+
+
+std::vector<nat> BranchLengthMultiplier::getInvalidatedNodes(const TreeAln &traln ) const 
+{
+  return {}; 
+}
+
diff --git a/src/proposals/BranchLengthMultiplier.hpp b/src/proposals/BranchLengthMultiplier.hpp
new file mode 100644
index 0000000..1d277f5
--- /dev/null
+++ b/src/proposals/BranchLengthMultiplier.hpp
@@ -0,0 +1,42 @@
+#ifndef _BRANCHLENGTHSMULTIPLIER_H
+#define _BRANCHLENGTHSMULTIPLIER_H
+
+#include "AbstractProposal.hpp"
+
+#include <limits>
+
+
+class BranchLengthMultiplier : public AbstractProposal
+{
+public: 
+  BranchLengthMultiplier(  double multiplier); 
+  BranchLengthMultiplier(const BranchLengthMultiplier& rhs) = default; 
+  BranchLengthMultiplier( BranchLengthMultiplier&& rhs) = default; 
+  BranchLengthMultiplier& operator=(const BranchLengthMultiplier &rhs)  = default; 
+
+  virtual BranchPlain determinePrimeBranch(const TreeAln &traln, Randomness& rand) const ; 
+
+  virtual void applyToState(TreeAln &traln, PriorBelief &prior, log_double &hastings, Randomness &rand, LikelihoodEvaluator& eval) ; 
+  virtual void evaluateProposal(LikelihoodEvaluator &evaluator,TreeAln &traln, const BranchPlain &branchSuggestion) ; 
+  virtual void resetState(TreeAln &traln) ; 
+
+  virtual void autotune();
+
+  virtual std::vector<nat> getInvalidatedNodes(const TreeAln &traln ) const ; 
+
+  virtual AbstractProposal* clone() const;  
+  virtual std::pair<BranchPlain,BranchPlain> prepareForSetExecution(TreeAln &traln, Randomness &rand) ;
+
+  virtual BranchPlain proposeBranch(const TreeAln &traln, Randomness &rand) const ;   
+
+  virtual void readFromCheckpointCore(std::istream &in); 
+  virtual void writeToCheckpointCore(std::ostream &out) const; 
+
+protected: 
+  double _multiplier;  
+  BranchLength _savedBranch;   
+  
+}; 
+
+
+#endif
diff --git a/src/proposals/ChosenBranchIntegrator.hpp b/src/proposals/ChosenBranchIntegrator.hpp
new file mode 100644
index 0000000..ed9d250
--- /dev/null
+++ b/src/proposals/ChosenBranchIntegrator.hpp
@@ -0,0 +1,39 @@
+#ifndef _CHOSEN_BRANCH_INTEGRATOR_HPP
+#define _CHOSEN_BRANCH_INTEGRATOR_HPP
+
+#include "BranchLengthMultiplier.hpp"
+
+
+class ChosenBranchIntegrator : public BranchLengthMultiplier
+{
+public: 
+  ChosenBranchIntegrator(double multiplier)
+    : BranchLengthMultiplier(multiplier)
+    , _chosenBranches{}
+  {
+  }
+
+  virtual BranchPlain proposeBranch(const TreeAln &traln, Randomness &rand) const 
+  {
+    auto elem = rand.drawIntegerOpen(_chosenBranches.size());
+    return _chosenBranches[elem]; 
+  }   
+  
+  void setChosenBranches(std::vector<BranchPlain> branches)
+  {
+    _chosenBranches = branches; 
+  }
+
+  
+  AbstractProposal* clone() const
+  {
+    return new ChosenBranchIntegrator(*this);
+  }
+
+private: 
+    std::vector<BranchPlain> _chosenBranches; 
+
+
+}; 
+
+#endif
diff --git a/src/proposals/DistributionBranchLength.hpp b/src/proposals/DistributionBranchLength.hpp
new file mode 100644
index 0000000..84a3e79
--- /dev/null
+++ b/src/proposals/DistributionBranchLength.hpp
@@ -0,0 +1,43 @@
+#ifndef _DISTRBUTION_BRANCH_LENGTH
+#define  _DISTRBUTION_BRANCH_LENGTH
+
+#include "BranchLengthMultiplier.hpp"
+
+#include "DistributionProposer.hpp"
+#include "GammaProposer.hpp"
+
+#include "ComplexTuner.hpp"
+
+#include "OptimizedParameter.hpp"
+
+template <class C>
+class DistributionBranchLength : public BranchLengthMultiplier
+{
+public: 
+  DistributionBranchLength();
+
+  virtual void createProposer(TreeAln &traln, LikelihoodEvaluator& eval, BranchPlain b); 
+  virtual void applyToState(TreeAln &traln, PriorBelief &prior, log_double &hastings, Randomness &rand, LikelihoodEvaluator& eval) ; 
+  virtual void autotune();  
+  virtual std::pair<BranchPlain,BranchPlain> prepareForSetExecution(TreeAln &traln, Randomness &rand) ; 
+  virtual AbstractProposal* clone() const  { return new DistributionBranchLength(*this); }  
+  virtual void extractProposer(TreeAln& traln, const OptimizedParameter& param) 
+  {
+    auto attr = _allParams->at(_primParamIds[0])->getAttributes();
+    _proposer = param.getProposerDistribution< C >(traln, attr._convTuner.getParameter(),attr._nonConvTuner.getParameter() );
+  }
+
+  virtual void accept(); 
+  virtual void reject(); 
+
+private: 
+  DistributionProposer<C> _proposer;
+
+  bool _converged; 
+
+}; 
+
+void calcDiagptable(const double z, const int states, const int numberOfCategories, const double *rptr, const double *EIGN, double *diagptable); 
+#include "DistributionBranchLength.tpp"
+
+#endif
diff --git a/src/proposals/DistributionBranchLength.tpp b/src/proposals/DistributionBranchLength.tpp
new file mode 100644
index 0000000..3696ef4
--- /dev/null
+++ b/src/proposals/DistributionBranchLength.tpp
@@ -0,0 +1,159 @@
+#include "DistributionBranchLength.hpp"
+#include "BoundsChecker.hpp"
+#include "AbstractPrior.hpp"
+#include "ParallelSetup.hpp"
+#include "DistributionProposer.hpp"
+#include "BranchLengthOptimizer.hpp"
+
+
+#define MAX_OPT_ITER 8 
+
+// ONLY gamma right now 
+
+
+template<class C> 
+DistributionBranchLength<C>::DistributionBranchLength( ) 
+  : BranchLengthMultiplier(0)
+  , _proposer()
+  , _converged{false}
+{
+  _name = std::string("blDist") + C::getName() ; 
+  _category = Category::BRANCH_LENGTHS; 
+  _usingOptimizedBranches = true; 
+  _relativeWeight = 7.;
+}
+ 
+
+
+template<class C>
+std::pair<BranchPlain,BranchPlain> DistributionBranchLength<C>::prepareForSetExecution(TreeAln &traln, Randomness &rand) 
+{
+  assert(_inSetExecution); 
+
+  auto chosenBranch = determinePrimeBranch(traln,rand);
+  auto dummyBranch = BranchPlain(0,0); 
+
+  return std::make_pair(chosenBranch, dummyBranch);
+} 
+
+
+template<class C>
+void DistributionBranchLength<C>::createProposer(TreeAln &traln, LikelihoodEvaluator& eval, BranchPlain b)
+{
+  auto params = getBranchLengthsParameterView();
+  assert(params.size() == 1 );     
+  auto param = params[0]; 
+  
+  _savedBranch = traln.getBranch(b,param); 
+  
+  eval.evaluateSubtrees(traln, b, param->getPartitions(), false);
+  eval.evaluatePartitionsDry(traln, b, param->getPartitions());
+
+  auto blo= BranchLengthOptimizer(traln, b, MAX_OPT_ITER, eval.getParallelSetup().getChainComm(), params); 
+  blo.optimizeBranches(traln);
+  auto optParams = blo.getOptimizedParameters();
+  assert(optParams.size() == 1);
+  
+  auto attr = _allParams->at(_primParamIds[0])->getAttributes();
+    
+  _proposer = optParams[0].getProposerDistribution< C >(traln, attr._convTuner.getParameter(), attr._nonConvTuner.getParameter());
+}
+
+
+template<class C>
+void DistributionBranchLength<C>::applyToState(TreeAln &traln, PriorBelief &prior, log_double &hastings, Randomness &rand, LikelihoodEvaluator& eval) 
+{
+  auto b = proposeBranch(traln, rand); 
+  
+  auto params = getBranchLengthsParameterView();
+  assert(params.size() == 1 );     
+  auto param = params[0]; 
+
+  _savedBranch = traln.getBranch(b, param);
+
+  if(not _inSetExecution)
+    createProposer(traln, eval, b);
+
+  auto newBranch  = _proposer.proposeBranch(b, traln, param, rand); 
+
+  _converged = _proposer.isConverged(); 
+
+  auto prevAbsLen = _savedBranch.toMeanSubstitutions(param->getMeanSubstitutionRate()); 
+  auto curAbsLen  = newBranch.toMeanSubstitutions(param->getMeanSubstitutionRate()); 
+
+  auto oldPr = param->getPrior()->getLogProb( ParameterContent{{ prevAbsLen }} ); 
+  auto newPr = param->getPrior()->getLogProb( ParameterContent{{ curAbsLen }} ); 
+
+  // update prior 
+  prior.addToRatio( newPr / oldPr );
+
+  // update hastings 
+  auto propDensCur = _proposer.getLogProbability(curAbsLen); 
+  auto propDensPrev = _proposer.getLogProbability(prevAbsLen);
+
+  hastings *= (propDensPrev / propDensCur) ;
+
+  traln.setBranch(newBranch, param);
+}
+
+
+template<class C>
+void DistributionBranchLength<C>::autotune()
+{
+  auto res = getEnvironmentVariable("TUNE"); 
+
+  auto attr = _allParams->at(_primParamIds[0])->getAttributes(); 
+
+  if(res.compare("0") != 0 )
+    {
+      if( attr._convTuner.getRecentlySeen()  > 100 )
+	{
+	  // tout << "tuning conv" << std::endl;
+	  attr._convTuner.tune();
+	}
+      
+      if( attr._nonConvTuner.getRecentlySeen() > 100)
+      	{
+	  // tout << "tuning non-conv" << std::endl;
+      	  attr._nonConvTuner.tune();
+      	}
+    }
+  
+  _allParams->at(_primParamIds[0])->setAttributes(attr);
+
+  _sctr.nextBatch();
+}
+
+ 
+
+template<class C>
+void DistributionBranchLength<C>::accept() 
+{
+  _sctr.accept();  
+
+  auto attr = _allParams->at(_primParamIds[0])->getAttributes();
+
+  if(_converged)
+    attr._convTuner.accept();
+  else 
+    attr._nonConvTuner.accept();
+  
+  _allParams->at(_primParamIds[0])->setAttributes(attr); 
+}
+
+
+template<class C>
+void DistributionBranchLength<C>::reject() 
+{
+  _sctr.reject();
+
+  auto attr = _allParams->at(_primParamIds[0])->getAttributes();
+
+  if( _converged )
+    attr._convTuner.reject();
+  else 
+    attr._nonConvTuner.reject();
+
+  _allParams->at(_primParamIds[0])->setAttributes(attr); 
+}
+
diff --git a/src/proposals/DivRateSlider.cpp b/src/proposals/DivRateSlider.cpp
new file mode 100644
index 0000000..95aab12
--- /dev/null
+++ b/src/proposals/DivRateSlider.cpp
@@ -0,0 +1,240 @@
+#include "DivRateSlider.hpp"
+
+DivRateSlider::DivRateSlider() :
+		AbstractProposal(Category::DIVERGENCE_TIMES, "divRateSlider", 10, 1e-5,
+				1e2, false), _savedContent
+		{ }
+{
+}
+
+DivRateSlider::~DivRateSlider()
+{
+}
+
+double DivRateSlider::getNewProposal(double oldRate, Randomness &rand)
+{
+	/* the absolute value here ensures a positive value */
+	return std::abs(rand.drawFromSlidingWindow(oldRate, 0.1));
+}
+
+void DivRateSlider::applyToState(TreeAln &traln, PriorBelief &prior,
+		log_double &hastings, Randomness &rand, LikelihoodEvaluator& eval)
+{
+	nat proposalMode = PROP_MODE_RATES;
+	nat numberOfRates, maxCategory;
+
+	auto primParam = _allParams->at(_primParamIds[0]);
+	_savedContent = primParam->extractParameter(traln);
+	auto content = _savedContent;
+	numberOfRates = _savedContent.rateAssignments.size();
+
+	maxCategory = 0;
+	for (nat i = 0; i < numberOfRates; i++)
+	{
+		if (_savedContent.rateAssignments[i] > maxCategory)
+		{
+			maxCategory = _savedContent.rateAssignments[i];
+		}
+	}
+
+	if (proposalMode == PROP_MODE_CATEGORIES)
+	{
+		nat assignOperation = ASSING_OP_MOVE;
+		switch (assignOperation)
+		{
+		case ASSING_OP_MERGE:
+		{
+
+			break;
+		}
+		case ASSING_OP_SPLIT:
+		{
+
+			break;
+		}
+		case ASSING_OP_MOVE:
+		{
+
+			break;
+		}
+		default:
+			assert(0);
+		}
+
+		/* merge cate */
+	}
+	else if (proposalMode == PROP_MODE_RATES)
+	{
+		/* Select category at random */
+		nat categoryToChange = rand.drawIntegerClosed(maxCategory);
+		/* Propose a new value */
+		double newRate = getNewProposal(_savedContent.values[categoryToChange],
+				rand);
+
+		/* TODO-divtimes update root children if necessary! */
+		auto rootBranch = traln.getRootBranch();
+		if (_savedContent.rateAssignments[rootBranch.getPrimNode() - 1]
+				== categoryToChange
+				|| _savedContent.rateAssignments[rootBranch.getSecNode() - 1]
+						== categoryToChange)
+		{
+			std::pair<double, double> rootRates =
+					{
+							(_savedContent.rateAssignments[rootBranch.getPrimNode()
+									- 1] == categoryToChange) ?
+									newRate :
+									content.values[_savedContent.rateAssignments[rootBranch.getPrimNode()
+											- 1]],
+							(_savedContent.rateAssignments[rootBranch.getSecNode()
+									- 1] == categoryToChange) ?
+									newRate :
+									content.values[_savedContent.rateAssignments[rootBranch.getSecNode()
+											- 1]] };
+			double parentAgeValue = _allParams->at(
+					_secParamIds[_secParamIds.size() - 1])->extractParameter(
+					traln).nodeAges[0].getHeight();
+			double child1AgeValue =
+					traln.isTipNode(rootBranch.getPrimNode()) ?
+							0.0 :
+							(_allParams->at(
+									_secParamIds[rootBranch.getPrimNode()
+											- traln.getNumberOfTaxa() - 1])->extractParameter(
+									traln).nodeAges[0].getHeight());
+			double child2AgeValue =
+					traln.isTipNode(rootBranch.getSecNode()) ?
+							0.0 :
+							(_allParams->at(
+									_secParamIds[rootBranch.getSecNode()
+											- traln.getNumberOfTaxa() - 1])->extractParameter(
+									traln).nodeAges[0].getHeight());
+			double v = (parentAgeValue - child1AgeValue) * rootRates.first
+					+ (parentAgeValue - child2AgeValue) * rootRates.second;
+			double branchLength = exp(-v / traln.getTrHandle().fracchange);
+
+			/* TODO-divtimes: discard if branch length is out of bounds! */
+			if (branchLength
+					&& (branchLength < BoundsChecker::zMin
+							|| branchLength > BoundsChecker::zMax))
+			{
+#ifdef DIVTIME_DEBUG
+				std::cout << "DIV-RATES-DBG: Propose new rate for root out of bounds..."
+#endif
+				return;
+			}
+
+#ifdef DIVTIME_DEBUG
+			std::cout << "DIV-RATES-DBG: Propose new rate for root C1: "
+			<< content.values[_savedContent.rateAssignments[rootBranch.getPrimNode()
+			- 1]] << " to " << newRate << std::endl;
+			std::cout << "DIV-RATES-DBG:                           C2: "
+			<< content.values[_savedContent.rateAssignments[rootBranch.getSecNode()
+			- 1]] << " to " << newRate << std::endl;
+			std::cout << "DIV-RATES-DBG: - - Branch changes from "
+			<< content.branchLengths[rootBranch.getPrimNode() - 1].getLength().getValue()
+			<< " to " << branchLength << std::endl;
+#endif
+
+			content.branchLengths[rootBranch.getPrimNode() - 1].setLength(
+					InternalBranchLength(branchLength));
+			content.branchLengths[rootBranch.getSecNode() - 1].setLength(
+					InternalBranchLength(branchLength));
+		}
+
+		for (nat nodeToChange = 0; nodeToChange < numberOfRates; nodeToChange++)
+		{
+			if (_savedContent.rateAssignments[nodeToChange] == categoryToChange)
+			{
+				if (traln.isRootChild(nodeToChange + 1))
+				{
+					/* TODO-divtimes SKIP ROOT NODES */
+					continue;
+				}
+				else
+				{
+					/* Update branch length */
+					double branchLength =
+							content.branchLengths[nodeToChange].getLength().getValue();
+					branchLength = exp(
+							log(branchLength) * newRate
+									/ _savedContent.values[categoryToChange]);
+
+					/* TODO-divtimes: discard if branch length is out of bounds! */
+					if (branchLength
+							&& (branchLength < BoundsChecker::zMin
+									|| branchLength > BoundsChecker::zMax))
+					{
+#ifdef DIVTIME_DEBUG
+						std::cout << "DIV-RATES-DBG: Propose new rate out of bounds..."
+#endif
+						return;
+					}
+
+					content.branchLengths[nodeToChange].setLength(
+							InternalBranchLength(branchLength));
+				}
+			}
+		}
+#ifdef DIVTIME_DEBUG
+		std::cout << "DIV-RATES-DBG: Propose new rate for " << nodeToChange << " --> " << _savedContent.values[nodeToChange] << " to " << newRate << std::endl;
+		std::cout << "DIV-RATES-DBG: - - Branch changes from " << content.branchLengths[nodeToChange].getLength().getValue() << " to " << branchLength << std::endl;
+#endif
+		content.values[categoryToChange] = newRate;
+	}
+	else
+	{
+		assert(0);
+	}
+
+	primParam->applyParameter(traln, content);
+}
+
+void DivRateSlider::evaluateProposal(LikelihoodEvaluator &evaluator,
+		TreeAln &traln, const BranchPlain &branchSuggestion)
+{
+	auto prts = _allParams->at(_primParamIds[0])->getPartitions();
+	evaluator.evaluatePartitionsWithRoot(traln, branchSuggestion, prts, true);
+}
+
+void DivRateSlider::resetState(TreeAln &traln)
+{
+#ifdef DIVTIME_DEBUG
+	std::cout << "DIV-RATES-DBG: Reset rate proposal " << std::endl;
+#endif
+	_allParams->at(_primParamIds[0])->applyParameter(traln, _savedContent);
+}
+
+void DivRateSlider::autotune()
+{
+}
+
+AbstractProposal* DivRateSlider::clone() const
+{
+	return new DivRateSlider(*this);
+}
+
+BranchPlain DivRateSlider::determinePrimeBranch(const TreeAln &traln,
+		Randomness& rand) const
+{
+	return BranchPlain();
+}
+
+std::vector<nat> DivRateSlider::getInvalidatedNodes(const TreeAln &traln) const
+{
+	return
+	{};
+}
+
+std::pair<BranchPlain, BranchPlain> DivRateSlider::prepareForSetExecution(
+		TreeAln &traln, Randomness &rand)
+{
+	return std::make_pair(BranchPlain(0, 0), BranchPlain(0, 0));
+}
+
+void DivRateSlider::writeToCheckpointCore(std::ostream &out) const
+{
+}
+
+void DivRateSlider::readFromCheckpointCore(std::istream &in)
+{
+}
+
diff --git a/src/proposals/DivRateSlider.hpp b/src/proposals/DivRateSlider.hpp
new file mode 100644
index 0000000..d4cb26b
--- /dev/null
+++ b/src/proposals/DivRateSlider.hpp
@@ -0,0 +1,50 @@
+#ifndef DIVRATESLIDER_H
+#define DIVRATESLIDER_H
+
+
+#include "AbstractProposal.hpp"
+
+  // AbstractProposal( Category cat, std::string  _name, double weight, double minTuning, double maxTuning, bool needsFullTraversal )  ; 
+
+
+class DivRateSlider : public AbstractProposal
+{
+
+public: 
+  virtual void applyToState(TreeAln &traln, PriorBelief &prior, log_double &hastings, Randomness &rand, LikelihoodEvaluator& eval) ; 
+  virtual void evaluateProposal(LikelihoodEvaluator &evaluator, TreeAln &traln, const BranchPlain &branchSuggestion) ; 
+  virtual void resetState(TreeAln &traln)  ; 
+  virtual void autotune()   ;
+  virtual AbstractProposal* clone() const ;  
+  virtual BranchPlain determinePrimeBranch(const TreeAln &traln, Randomness& rand) const ; 
+  virtual std::vector<nat> getInvalidatedNodes(const TreeAln &traln) const ;  
+  virtual std::pair<BranchPlain,BranchPlain> prepareForSetExecution(TreeAln &traln, Randomness &rand)  ; 
+  virtual void writeToCheckpointCore(std::ostream &out)const   ;  
+  virtual void readFromCheckpointCore(std::istream &in) ; 
+
+  DivRateSlider();
+  virtual ~DivRateSlider();
+
+protected:
+
+  enum ProposalMode {
+		  PROP_MODE_CATEGORIES,
+		  PROP_MODE_RATES
+  };
+
+  enum AssignmentsOperation {
+		  ASSING_OP_MERGE,  /* merge 2 categories */
+		  ASSING_OP_SPLIT,  /* split 1 category in 2 or several */
+		  ASSING_OP_MOVE    /* move an item from one category to another */
+  };
+
+  double getNewProposal(double oldRate, Randomness &rand);
+
+  ParameterContent _savedContent;
+  
+};
+
+
+
+
+#endif /* DIVRATESLIDER_H */
diff --git a/src/proposals/DivTimeProposal.cpp b/src/proposals/DivTimeProposal.cpp
new file mode 100644
index 0000000..48b572e
--- /dev/null
+++ b/src/proposals/DivTimeProposal.cpp
@@ -0,0 +1,84 @@
+#include "DivTimeProposal.hpp"
+
+// okay...just noticed, that this class is not used ;-) 
+
+double DivTimeProposal::defaultWeight = 10.; 
+
+// the default weight (10?) be divided by the number of proposals, we have. 
+
+DivTimeProposal::DivTimeProposal( double weight  )  
+  : AbstractProposal(Category::BRANCH_LENGTHS, "divTimeDirich", weight,  0,0, true)
+    // TODO: should be a 
+{
+  // todo initialize parameters, e.g. a parameter to tune the dirichlet proposal
+} 
+
+
+void DivTimeProposal::applyToState(TreeAln &traln, PriorBelief &prior, log_double &hastings, Randomness &rand, LikelihoodEvaluator& eval)
+{
+  assert(0); 
+  return;
+} 
+
+ void DivTimeProposal::evaluateProposal(LikelihoodEvaluator &evaluator, TreeAln &traln, const BranchPlain &branchSuggestion)
+{
+  // trivial full evaluaet (just chekc the toher proposals )
+  assert(0); 
+} 
+
+
+ void DivTimeProposal::resetState(TreeAln &traln) 
+{
+  // reset the previous state of traln 
+  assert(0); 
+}
+
+
+
+void DivTimeProposal::autotune() 
+{
+  // tune proposal parameter? 
+}
+
+
+AbstractProposal* DivTimeProposal::clone() const
+{
+  return new DivTimeProposal(*this); 
+}  
+
+
+BranchPlain DivTimeProposal::determinePrimeBranch(const TreeAln &traln, Randomness& rand) const
+{
+  // TODO implement, if you want to have proposal sets (not necessary iniitiallyz)
+  assert(0); 
+} 
+
+
+std::vector<nat> DivTimeProposal::getInvalidatedNodes(const TreeAln &traln) const
+{
+  // TODO implement, if you want to have proposal sets (not necessary iniitiallyz)
+  assert(0); 
+} 
+
+
+
+std::pair<BranchPlain,BranchPlain> DivTimeProposal::prepareForSetExecution(TreeAln &traln, Randomness &rand) 
+{
+  // TODO implement, if you want to have proposal sets (not necessary iniitiallyz)
+  assert(0); 
+  return std::make_pair(BranchPlain(), BranchPlain());
+} 
+
+
+void DivTimeProposal::writeToCheckpointCore(std::ostream &out)const
+{
+  // todo implemeent, in case you have proposal parameters (e.g., alpha of dirichlet)
+  // see other proposals 
+}
+
+
+void DivTimeProposal::readFromCheckpointCore(std::istream &in)
+{
+  // todo implemeent, in case you have proposal parameters (e.g., alpha of dirichlet)
+  // see other proposals 
+} 
diff --git a/src/proposals/DivTimeProposal.hpp b/src/proposals/DivTimeProposal.hpp
new file mode 100644
index 0000000..a691f63
--- /dev/null
+++ b/src/proposals/DivTimeProposal.hpp
@@ -0,0 +1,70 @@
+#ifndef _DIVTIME_PROPOSAL_H
+#define _DIVTIME_PROPOSAL_H
+
+
+#include "AbstractProposal.hpp"
+
+class DivTimeProposal : public AbstractProposal
+{
+public: 
+  DivTimeProposal(double weight ) ; 
+
+  /**
+     @brief determines the proposal, applies it to the tree / model, updates prior and hastings ratio
+   */ 
+  virtual void applyToState(TreeAln &traln, PriorBelief &prior, log_double &hastings, Randomness &rand, LikelihoodEvaluator& eval) ; 
+  /**
+     @brief evaluates the proposal 
+     @todo remove the prior, we should not need it here 
+   */ 
+  virtual void evaluateProposal(LikelihoodEvaluator &evaluator, TreeAln &traln, const BranchPlain &branchSuggestion) ; 
+  /** 
+      @brief resets the tree to its previous state; corrects the prior, if necessary (@todo is this the case?)
+   */ 
+  virtual void resetState(TreeAln &traln)  ; 
+  /** 
+      @brief tunes proposal parameters, if available  
+   */ 
+  virtual void autotune()   ;
+  
+  virtual AbstractProposal* clone() const ;  
+
+  virtual BranchPlain determinePrimeBranch(const TreeAln &traln, Randomness& rand) const ; 
+  /** 
+      @brief gets nodes that are invalid by executed the proposal 
+   */ 
+  virtual std::vector<nat> getInvalidatedNodes(const TreeAln &traln) const ;  
+
+  virtual std::pair<BranchPlain,BranchPlain> prepareForSetExecution(TreeAln &traln, Randomness &rand)  ; 
+
+  // we need to implement these 
+  virtual void serialize( std::ostream &out)  const{}  
+  virtual void deserialize( std::istream &in ) {} 
+
+  /** 
+      @brief writes proposal specific (tuned) parameters
+   */ 
+  virtual void writeToCheckpointCore(std::ostream &out)const   ;  
+  /** 
+      @brief reads proposal specific (tuned) parameters 
+   */ 
+  virtual void readFromCheckpointCore(std::istream &in) ; 
+
+  virtual void prepareForSetEvaluation( TreeAln &traln, LikelihoodEvaluator& eval) const  {} 
+
+
+  virtual void printParams(std::ostream &out)  const {} 
+
+
+public:                         // STATIC 
+  static double defaultWeight; 
+  
+protected:   
+  // probably needs something like 
+  // std::set<TimeBranchLength>  _backup
+  // for the reset
+
+}; 
+
+#endif
+
diff --git a/src/proposals/DivTimeSlider.cpp b/src/proposals/DivTimeSlider.cpp
new file mode 100644
index 0000000..82db588
--- /dev/null
+++ b/src/proposals/DivTimeSlider.cpp
@@ -0,0 +1,310 @@
+#include "DivTimeSlider.hpp"
+
+
+const double DivTimeSlider::defaultWeight = 10.;  
+
+// see DivTimeProposal for why we want a weight here . 
+
+DivTimeSlider::DivTimeSlider(double weight) :
+		AbstractProposal(Category::DIVERGENCE_TIMES, "divTimeSlider", weight, 1e-5,
+				1e2, false), _savedContent()
+{
+}
+
+double DivTimeSlider::getNewProposal(double height, double oldHeight, double youngHeight,
+		Randomness &rand)
+{
+	/* find the range for the slider */
+	assert(oldHeight > height && height > youngHeight);
+	double upperRange = oldHeight - height;
+	double lowerRange = height - youngHeight;
+	double window = 2 * std::max(upperRange, lowerRange);
+	double newValue = rand.drawFromSlidingWindow(height, window);
+	if (newValue > oldHeight)
+	{
+		newValue = 2 * oldHeight - newValue;
+	}
+	else if (newValue < youngHeight)
+	{
+		newValue = 2 * youngHeight - newValue;
+	}
+	assert(oldHeight > newValue && newValue > youngHeight);
+
+	return newValue;
+}
+
+NodeAge DivTimeSlider::getNodeAge(TreeAln & traln, nat primaryNode) const
+{
+	NodeAge result;
+	for (int i : _secParamIds)
+	{
+		if (_allParams->at(i)->extractParameter(traln).nodeAges.size() > 0)
+		{
+			NodeAge testNode =
+					_allParams->at(i)->extractParameter(traln).nodeAges[0];
+			if (testNode.getPrimNode() == primaryNode)
+			{
+				result = testNode;
+				break;
+			}
+		}
+	}
+	return result;
+}
+
+NodeAge DivTimeSlider::getNodeAge(TreeAln & traln, BranchPlain & bp) const
+{
+	NodeAge result = getNodeAge(traln, bp.getPrimNode());
+	assert(bp == result);
+	return result;
+}
+
+void DivTimeSlider::applyToState(TreeAln &traln, PriorBelief &prior,
+		log_double &hastings, Randomness &rand, LikelihoodEvaluator& eval)
+{
+	AbstractParameter * myDivtimesParameter;
+
+	bool isRootNode;
+	double oldHeight, newHeight;
+
+	std::pair<BranchPlain, BranchPlain> descendants;
+	std::pair<NodeAge, NodeAge> childrenNodeAge;
+	NodeAge parentNodeAge;
+
+	assert(_primParamIds.size() == 1);
+	myDivtimesParameter = _allParams->at(_primParamIds[0]);
+
+	_savedContent = myDivtimesParameter->extractParameter(traln);
+	NodeAge savedAge = _savedContent.nodeAges[0];
+	isRootNode = !(savedAge.getPrimNode() + savedAge.getSecNode());
+	oldHeight = savedAge.getHeight();
+
+#ifdef DIVTIME_DEBUG
+	std::cout << "DIV-TIMES-DBG: Sliding node " << savedAge << std::endl;
+#endif
+
+	/* Get parent and children */
+	if (isRootNode)
+	{
+		descendants.first = traln.getRootBranch();
+		descendants.second = traln.getRootBranch().getInverted();
+	}
+	else
+	{
+		descendants = traln.getDescendents(savedAge);
+		descendants.first = descendants.first.getInverted();
+		descendants.second = descendants.second.getInverted();
+	}
+
+	if (traln.isTipNode(descendants.first.getPrimNode()))
+	{
+		childrenNodeAge.first = NodeAge(descendants.first, 0.0);
+	}
+	else
+	{
+		childrenNodeAge.first = getNodeAge(traln, descendants.first);
+	}
+
+	if (traln.isTipNode(descendants.second.getPrimNode()))
+	{
+		childrenNodeAge.second = NodeAge(descendants.second, 0.0);
+	}
+	else
+	{
+		childrenNodeAge.second = getNodeAge(traln, descendants.second);
+	}
+
+	if (!(isRootNode || traln.isRootBranch(savedAge)))
+	{
+		parentNodeAge = getNodeAge(traln, savedAge.getSecNode());
+	}
+
+	if (traln.isRootBranch(savedAge))
+	{
+		parentNodeAge =
+				_allParams->at(_secParamIds[_secParamIds.size() - 1])->extractParameter(
+						traln).nodeAges[0];
+	}
+
+	double parentAgeValue = (
+			isRootNode ?
+					(2 * savedAge.getHeight()
+							- std::max(childrenNodeAge.first.getHeight(),
+									childrenNodeAge.second.getHeight())) :
+					parentNodeAge.getHeight());
+	double childrenAgeValue = std::max(childrenNodeAge.first.getHeight(),
+			childrenNodeAge.second.getHeight());
+
+	/* Propose a new time for the node and a new NodeAge */
+	newHeight = getNewProposal(oldHeight, parentAgeValue, childrenAgeValue,
+			rand);
+	auto newNodeAge = savedAge;
+	newNodeAge.setHeight(newHeight);
+
+	/* Add the new age to the content */
+	auto content = ParameterContent();
+	content.nodeAges.push_back(newNodeAge);
+
+#ifdef DIVTIME_DEBUG
+	std::cout << "DIV-TIMES-DBG: Propose " << newNodeAge.getHeight() << " for "
+	<< savedAge << std::endl;
+#endif
+
+	auto rates = _allParams->at(_secParamIds[0])->extractParameter(traln).values;
+
+	if (isRootNode)
+	{
+		/* root update */
+		auto rootBranch = traln.getRootBranch();
+		/* Root is a special case because the computation of the branch length
+		 * depends on both root children branches.
+		 *
+		 * Both times and rates are pushed into the content object and
+		 * the Parameter computes the actual branch length.
+		 */
+		double v = (newHeight - childrenNodeAge.first.getHeight())
+				* rates[rootBranch.getPrimNode() - 1]
+				+ (newHeight - childrenNodeAge.second.getHeight())
+						* rates[rootBranch.getSecNode() - 1];
+		double newLength = exp(-v / traln.getTrHandle().fracchange);
+		content.values.push_back(0.0); // no parental branch
+		content.values.push_back(newLength);
+		content.values.push_back(newLength);
+	}
+	else
+	{
+		double v, newLength;
+		/* add the old time to the content */
+		double fracchange =
+				(traln.getTrHandle().fracchange > 1e-7) ?
+						traln.getTrHandle().fracchange : 1.0;
+		if (traln.isRootBranch(savedAge))
+		{
+			double sisterAgeValue = 0.0;
+			if (!traln.isTipNode(savedAge.getSecNode()))
+			{
+				sisterAgeValue =
+						getNodeAge(traln, savedAge.getSecNode()).getHeight();
+			}
+			v = (parentAgeValue - newHeight) * rates[savedAge.getPrimNode() - 1]
+					+ (parentAgeValue - sisterAgeValue)
+							* rates[savedAge.getSecNode() - 1];
+			newLength = exp(-v / fracchange);
+			content.values.push_back(newLength);
+		}
+		else
+		{
+			v = (parentAgeValue - newHeight)
+					* rates[savedAge.getPrimNode() - 1];
+			newLength = exp(-v / fracchange);
+			content.values.push_back(newLength);
+		}
+
+		if (childrenNodeAge.first.getPrimNode())
+		{
+			v = (newHeight - childrenNodeAge.first.getHeight())
+					* rates[childrenNodeAge.first.getPrimNode() - 1];
+			newLength = exp(-v / fracchange);
+			content.values.push_back(newLength);
+		}
+		else
+		{
+			content.values.push_back(0.0);
+		}
+
+		if (childrenNodeAge.second.getPrimNode())
+		{
+			v = (newHeight - childrenNodeAge.second.getHeight())
+					* rates[childrenNodeAge.second.getPrimNode() - 1];
+			newLength = exp(-v / fracchange);
+			content.values.push_back(newLength);
+		}
+		else
+		{
+			content.values.push_back(0.0);
+		}
+	}
+
+	/* TODO-divtimes: sometimes the age grows too fast! */
+	for (double value : content.values)
+	{
+		if (value
+				&& (value < BoundsChecker::zMin || value > BoundsChecker::zMax))
+		{
+			return;
+		}
+	}
+	myDivtimesParameter->applyParameter(traln, content);
+
+	//double realMultiplier = newHeight / oldHeight;
+	//hastings *= log_double::fromAbs(realMultiplier);
+	//prior.addToRatio(param->getPrior()->getUpdatedValue(oldAge, newAge, param));
+}
+
+void DivTimeSlider::evaluateProposal(LikelihoodEvaluator &evaluator,
+		TreeAln &traln, const BranchPlain &branchSuggestion)
+{
+	auto parts = _allParams->at(_primParamIds[0])->getPartitions();
+	evaluator.evaluate(traln, traln.getRootBranch(), true);
+}
+
+void DivTimeSlider::resetState(TreeAln &traln)
+{
+#ifdef DIVTIME_DEBUG
+	std::cout << "DIV-TIMES-DBG: Reset state" << std::endl;
+#endif
+
+	auto param = _allParams->at(_primParamIds[0]);
+	param->applyParameter(traln, _savedContent);
+}
+
+void DivTimeSlider::autotune()
+{
+	/* TODO-divtimes. ? */
+}
+
+AbstractProposal* DivTimeSlider::clone() const
+{
+	return new DivTimeSlider(*this);
+}
+
+BranchPlain DivTimeSlider::determinePrimeBranch(const TreeAln &traln,
+		Randomness& rand) const
+{
+	ParameterContent content =
+			_allParams->at(_primParamIds[0])->extractParameter(traln);
+	if (content.nodeAges.size() == 1)
+	{
+		return content.nodeAges[0];
+	}
+	else
+	{
+		return BranchPlain();
+	}
+}
+
+std::vector<nat> DivTimeSlider::getInvalidatedNodes(const TreeAln &traln) const
+{
+	ParameterContent content =
+			_allParams->at(_primParamIds[0])->extractParameter(traln);
+	assert(content.nodeAges.size() == 1);
+	return
+	{	content.nodeAges[0].getPrimNode()};
+}
+
+std::pair<BranchPlain, BranchPlain> DivTimeSlider::prepareForSetExecution(
+		TreeAln &traln, Randomness &rand)
+{
+	/* TODO-divtimes. Check this */
+	return std::pair<BranchPlain, BranchPlain>(
+			determinePrimeBranch(traln, rand), BranchPlain(0, 0));
+}
+
+void DivTimeSlider::writeToCheckpointCore(std::ostream &out) const
+{
+}
+
+void DivTimeSlider::readFromCheckpointCore(std::istream &in)
+{
+}
+
diff --git a/src/proposals/DivTimeSlider.hpp b/src/proposals/DivTimeSlider.hpp
new file mode 100644
index 0000000..264efe7
--- /dev/null
+++ b/src/proposals/DivTimeSlider.hpp
@@ -0,0 +1,43 @@
+#ifndef DIVTIMESLIDER_H
+#define DIVTIMESLIDER_H
+
+
+#include "AbstractProposal.hpp"
+
+class DivTimeSlider : public AbstractProposal
+{ 
+public:                         // STATIC 
+  const static double defaultWeight;  
+
+public:				// INHERITED 
+
+  virtual void applyToState(TreeAln &traln, PriorBelief &prior, log_double &hastings, Randomness &rand, LikelihoodEvaluator& eval) ; 
+  virtual void evaluateProposal(LikelihoodEvaluator &evaluator, TreeAln &traln, const BranchPlain &branchSuggestion) ; 
+  virtual void resetState(TreeAln &traln)  ; 
+  virtual void autotune()   ;
+  virtual AbstractProposal* clone() const ;  
+  virtual BranchPlain determinePrimeBranch(const TreeAln &traln, Randomness& rand) const ; 
+  virtual std::vector<nat> getInvalidatedNodes(const TreeAln &traln) const ;  
+  virtual std::pair<BranchPlain,BranchPlain> prepareForSetExecution(TreeAln &traln, Randomness &rand)  ; 
+  virtual void writeToCheckpointCore(std::ostream &out)const   ;  
+  virtual void readFromCheckpointCore(std::istream &in) ; 
+
+  DivTimeSlider(double weight);
+  virtual ~DivTimeSlider(){}
+
+protected:
+  double getNewProposal(double height, double oldHeight, double youngHeight, Randomness &rand);
+
+  NodeAge getNodeAge(TreeAln & traln, BranchPlain & bp) const;
+  NodeAge getNodeAge(TreeAln & traln, nat primaryNode) const;
+  ParameterContent _savedContent;
+//  NodeAge _savedAge;
+//  double _savedTime;
+//  double _savedBranchLength;
+//  std::pair<double, double> _savedChildrenBranchLength;
+};
+
+
+
+
+#endif /* DIVTIMESLIDER_H */
diff --git a/src/proposals/GenericTopoProposal.cpp b/src/proposals/GenericTopoProposal.cpp
new file mode 100644
index 0000000..9005fa9
--- /dev/null
+++ b/src/proposals/GenericTopoProposal.cpp
@@ -0,0 +1,264 @@
+#include "GenericTopoProposal.hpp"
+#include "Path.hpp"
+#include "TreeRandomizer.hpp"
+#include "BranchSetProposer.hpp"
+#include "Arithmetics.hpp"
+
+#define NUM_ITER 10
+
+using std::get; 
+
+// since this will not be a production level feature, the parameter is
+// hard coded.
+
+// this is the appropriate parameter for a uniform draw in [2/3 ; 1.5] on the exponential scale 
+double GenericTopoProposal::multiplier = std::log(2. / 3. ) / -0.5 ; 
+
+
+
+GenericTopoProposal::GenericTopoProposal( std::unique_ptr<TopoMoveProposer> moveDet , std::string name , double relWeight, MoveOptMode toOpt  ) 
+  : AbstractProposal(Category::TOPOLOGY,  name, relWeight, 0., 0., false)
+  , _move(  nullptr )	       
+  , _moveProposer{std::move(moveDet)}
+  , _moveOptMode{toOpt}
+  , _backup{}
+  , _useMultiplier{false}
+{
+}
+
+
+GenericTopoProposal::GenericTopoProposal(const GenericTopoProposal& rhs)
+  :  AbstractProposal(rhs)
+  , _move( rhs._move == nullptr ? nullptr : rhs._move->clone())
+  , _moveProposer(rhs._moveProposer->clone())
+  , _moveOptMode{rhs._moveOptMode}
+  , _backup{rhs._backup}
+  , _useMultiplier{rhs._useMultiplier}
+{ 
+}
+
+
+GenericTopoProposal& GenericTopoProposal::operator=( GenericTopoProposal rhs)  
+{
+  swap(*this, rhs); 
+  return *this;
+}
+
+
+void swap(GenericTopoProposal& lhs, GenericTopoProposal& rhs) 
+{
+  std::swap(lhs._move, rhs._move); // abstract product  
+  std::swap(lhs._moveProposer,rhs._moveProposer); // abstract factory 
+  std::swap(lhs._backup, rhs._backup); 
+  std::swap(lhs._moveOptMode, rhs._moveOptMode);
+  std::swap(lhs._useMultiplier, rhs._useMultiplier);
+}
+
+
+BranchPlain GenericTopoProposal::determinePrimeBranch(const TreeAln &traln, Randomness& rand) const
+{
+  return _moveProposer->determinePrimeBranch(traln,rand);
+}
+
+
+log_double GenericTopoProposal::proposeAndApplyNewBranches(TreeAln &traln, const std::vector<BranchPlain> &bs, PriorBelief &prior,  Randomness &rand, LikelihoodEvaluator& eval) const 
+{
+  if(bs.size() == 0)
+    return log_double::fromAbs(1.); 
+
+  auto params = getBranchLengthsParameterView(); 
+
+  auto hastForwBranch = log_double::fromAbs(1.); 
+  
+  if(_useMultiplier && not _moveProposer->hasOptimizedBranches())
+    {
+      for(auto b : bs)
+	{
+	  for(auto p : params)
+	    {
+	      auto multi = rand.drawMultiplier(multiplier);
+	      auto meanSubstRate = p->getMeanSubstitutionRate(); 
+	      auto bl = traln.getBranch(b,p); 
+	      auto oldLen = bl.toMeanSubstitutions(meanSubstRate); 
+	      
+	      // bl.setConvertedInternalLength( p, oldLen * multi);
+	      bl.setLength(InternalBranchLength::fromAbsolute(oldLen * multi, meanSubstRate));
+	      if(not BoundsChecker::checkBranch(bl))
+		BoundsChecker::correctBranch(bl);
+	      auto newLen = bl.toMeanSubstitutions(meanSubstRate); 
+	      auto realMulti = newLen / oldLen; 
+
+	      // tout << SHOW(realMulti) << std::endl;
+	      
+	      traln.setBranch(bl,p);
+
+	      prior.addToRatio(p->getPrior()->getLogProb( ParameterContent{{newLen}}) 
+	      		       / p->getPrior()->getLogProb( ParameterContent{{oldLen}}) ) ;
+
+	      hastForwBranch *= log_double::fromAbs(realMulti);
+	    }
+	}
+    }
+  else 
+    {
+      auto getOptParams = [&]() -> std::vector<OptimizedParameter>
+	{
+	  auto result = std::vector<OptimizedParameter>{}; 
+
+	  if(_moveProposer->hasOptimizedBranches())
+	    result =  _moveProposer->getOptimizedBranches();
+	  else 
+	    {
+	      auto bsp = BranchSetProposer(traln, bs, params); 
+	      bsp.findJointOptimum(eval, NUM_ITER, false);
+	      for(auto elem : bsp.getResult() ) 
+		result.insert(end(result), begin(elem.second), end(elem.second));
+	    }
+	  return result; 
+	}; 
+
+      for(auto &optParam : getOptParams())
+	{
+	  auto p = optParam.getParam();
+	  auto b = optParam.getBranch();
+	  auto meanSubstRate = p->getMeanSubstitutionRate();
+
+	  auto convParam = p->getAttributes()._convTuner.getParameter();
+	  auto nonConvParam = p->getAttributes()._nonConvTuner.getParameter();
+
+	  auto dist = optParam.getProposerDistribution<GammaProposer>(traln, convParam, nonConvParam ); 
+	  auto bl = dist.proposeBranch(b, traln, p, rand);
+	  
+	  auto oldLen = traln.getBranch(b,p).toMeanSubstitutions( meanSubstRate);
+	  traln.setBranch(bl, p);
+	  auto newLen = bl.toMeanSubstitutions(meanSubstRate); 
+	  
+
+	  // tout  << MAX_SCI_PRECISION << SHOW(newLen)<< std::endl; 
+	  
+	  // update log prior 
+	  prior.addToRatio(p->getPrior()->getLogProb( ParameterContent{{newLen}}) 
+			   / p->getPrior()->getLogProb( ParameterContent{{oldLen}}) ) ;
+
+	  auto hastHere = dist.getLogProbability(newLen); 
+	  hastForwBranch *= hastHere;
+	  // tout << MAX_SCI_PRECISION << SHOW(oldLen) << " ->  " << SHOW(newLen) << SOME_FIXED_PRECISION << SHOW(hastHere)<< std::endl; 
+	}
+
+    }
+  return hastForwBranch; 
+}
+
+
+/* 
+   using the backup for this 
+*/ 
+log_double GenericTopoProposal::assessOldBranches(TreeAln& traln, LikelihoodEvaluator& eval, const std::vector<BranchPlain> &bs, const std::vector<AbstractParameter*> params) 
+{
+  auto result = log_double::fromAbs(1.);
+
+  if(bs.size() == 0)
+    return result;  
+
+  // hastings is covered in the forward part 
+  if(_useMultiplier)
+    return result; 
+
+  auto bsp = BranchSetProposer(traln, bs, params); 
+  bsp.findJointOptimum(eval, NUM_ITER, false); 
+  for(auto elem : bsp.getResult ())
+    {
+      auto b = elem.first; 
+      auto& optParams = elem.second; 
+      for(auto &optParam : optParams)
+	{
+	  auto p = optParam.getParam();
+	  
+	  auto convParam = p->getAttributes()._convTuner.getParameter();
+	  auto nonConvParam = p->getAttributes()._nonConvTuner.getParameter();
+
+	  auto found = _backup.find(b,p); 
+
+	  if(not get<0>(found))
+	    tout << "error: could not find " << b << std::endl; 
+
+	  auto curLen = get<1>(found).toMeanSubstitutions(p->getMeanSubstitutionRate()); 
+	  // tout << MAX_SCI_PRECISION << SHOW(curLen)<< std::endl; 
+	  result *= optParam.getProposerDistribution<GammaProposer>(traln, convParam, nonConvParam).getLogProbability(curLen); 
+	}
+    }
+  
+  return result; 
+}
+
+
+// TODO EFFICIENCY (marking stuff used)
+
+void GenericTopoProposal::applyToState(TreeAln &traln, PriorBelief &prior, log_double &hastings, Randomness &rand, LikelihoodEvaluator& eval) 
+{    
+  auto primeBranch =  determinePrimeBranch(traln, rand); 
+  auto params = getBranchLengthsParameterView(); 
+
+  _moveProposer->determineMove(traln, eval, rand, primeBranch, params); 
+  _move = _moveProposer->getMove(); 
+
+  // branches that we have to propose in order to get back to the start 
+  auto bsBack = _move->getBranchesToPropose(traln, _moveOptMode); 
+  _backup = BranchBackup(traln, bsBack, params);
+
+  // tout << SHOW(_moveOptMode) << std::endl; 
+
+  _move->apply(traln, params ); 
+  _move->invalidateArrays(eval, traln, _moveOptMode); 
+
+  // branches that we want to propose as part of the proposal  
+  auto bsForw = _move->getInverse()->getBranchesToPropose(traln, _moveOptMode);
+  
+  auto bHastF = proposeAndApplyNewBranches(traln, bsForw, prior, rand, eval );
+
+  // tout << SHOW(*_move) << std::endl; 
+
+  _moveProposer->determineBackProb(traln, eval,params);
+
+  hastings *= _moveProposer->getProposalDensity();
+
+  _move->getInverse()->apply(traln, params); 
+  for(auto n : _move->getDirtyNodes())
+    eval.invalidateArray(traln, n);
+
+  auto bHastB = assessOldBranches(traln, eval, bsBack, params );
+
+  _move->apply(traln, params); 
+  _move->invalidateArrays(eval, traln, _moveOptMode ); 
+
+  hastings *= ( bHastB / bHastF); 
+}
+
+
+void GenericTopoProposal::evaluateProposal(  LikelihoodEvaluator &evaluator, TreeAln &traln, const BranchPlain &branchSuggestion)
+{
+  auto evalBranch = _move->getEvalBranch(traln); 
+  _move->invalidateArrays(evaluator, traln, _moveOptMode);
+  evaluator.evaluate(traln, evalBranch, false); 
+}
+
+
+void GenericTopoProposal::resetState(TreeAln &traln)  
+{
+  auto params = getSecondaryParameterView(); 
+  auto inv = _move->getInverse(); 
+  inv->apply(traln,params);
+  _backup.resetFromBackup(traln);
+}
+
+
+AbstractProposal* GenericTopoProposal::clone()  const
+{
+  return new GenericTopoProposal( *this );
+}
+
+
+std::vector<nat> GenericTopoProposal::getInvalidatedNodes(const TreeAln& traln) const
+{
+  return _move->getDirtyNodes();
+}
diff --git a/src/proposals/GenericTopoProposal.hpp b/src/proposals/GenericTopoProposal.hpp
new file mode 100644
index 0000000..245f5ee
--- /dev/null
+++ b/src/proposals/GenericTopoProposal.hpp
@@ -0,0 +1,50 @@
+#ifndef _GENERIC_TOPO_PROPOSAL_HPP
+#define _GENERIC_TOPO_PROPOSAL_HPP
+
+#include "AbstractProposal.hpp"
+#include "TopoMoveProposer.hpp"
+#include "BranchBackup.hpp"
+
+
+class GenericTopoProposal : public AbstractProposal
+{
+public: 			// INHERITED METHODS 
+  virtual void applyToState(TreeAln &traln, PriorBelief &prior, log_double &hastings, Randomness &rand, LikelihoodEvaluator& eval) ; 
+  virtual void evaluateProposal(  LikelihoodEvaluator &evaluator, TreeAln &traln, const BranchPlain &branchSuggestion) ; 
+  virtual void resetState(TreeAln &traln) ; 
+  virtual std::pair<BranchPlain,BranchPlain> prepareForSetExecution(TreeAln &traln, Randomness &rand)  { return std::make_pair(BranchPlain(0,0),BranchPlain(0,0) ); }
+  virtual void autotune() {}	// disabled 
+  virtual AbstractProposal* clone() const;  
+  virtual void readFromCheckpointCore(std::istream &in) {   } // disabled
+  virtual void writeToCheckpointCore(std::ostream &out) const { } //disabled
+  
+  virtual void printParams(std::ostream &out)  const { _moveProposer->printParams(out); } 
+  
+public: 			// METHODS 
+  GenericTopoProposal( std::unique_ptr<TopoMoveProposer> moveDet , std::string name , double relWeight, MoveOptMode toOpt); 
+  GenericTopoProposal(const GenericTopoProposal& rhs); 
+  GenericTopoProposal(GenericTopoProposal&& rhs) = delete; 
+  GenericTopoProposal& operator=( GenericTopoProposal rhs) ; 
+  friend void swap(GenericTopoProposal& lhs, GenericTopoProposal& rhs); 
+
+  void enableUseMultiplier() { _useMultiplier = true; } 
+ 
+  log_double assessOldBranches(TreeAln& traln, LikelihoodEvaluator& eval, const std::vector<BranchPlain> &bs, const std::vector<AbstractParameter*> params) ; 
+  BranchPlain determinePrimeBranch(const TreeAln &traln, Randomness& rand) const; 
+  std::vector<nat> getInvalidatedNodes(const TreeAln& traln) const;  
+  
+private: 			// METHODS 
+  log_double proposeAndApplyNewBranches(TreeAln &traln, const std::vector<BranchPlain> &bs, PriorBelief &prior,  Randomness &rand, LikelihoodEvaluator& eval) const ; 
+
+private:			// ATTRIBUTES
+  std::unique_ptr<TopoMove> _move; // abstract product  
+  std::unique_ptr<TopoMoveProposer> _moveProposer; // abstract factory 
+  MoveOptMode _moveOptMode;	
+  BranchBackup _backup; 
+  bool _useMultiplier ; 
+
+  static double multiplier; 
+
+};
+
+#endif
diff --git a/src/proposals/InsertionResult.hpp b/src/proposals/InsertionResult.hpp
new file mode 100644
index 0000000..378fca4
--- /dev/null
+++ b/src/proposals/InsertionResult.hpp
@@ -0,0 +1,34 @@
+#ifndef _INSERTION_RESULT_HPP
+#define  _INSERTION_RESULT_HPP
+
+#include "OptimizedParameter.hpp" 
+
+class InsertionResult
+{
+public: 
+  InsertionResult(BranchPlain branch = BranchPlain(0,0), log_double prob = log_double::fromAbs(1.), std::vector<OptimizedParameter> optParams = std::vector<OptimizedParameter>{})
+    : _branch{branch}
+    , _lprob{prob}
+    , _optParams{optParams}
+  {
+  } 
+  
+  BranchPlain getBranch() const { return _branch;}
+  log_double getInsertionProb() const {return _lprob;  }
+  void setInsertionProb(log_double d) { _lprob = d;  }
+
+  std::vector<OptimizedParameter> getOptParams() const {return _optParams;}
+
+  friend std::ostream& operator<<(std::ostream& out, const InsertionResult& rhs)
+  {
+    out << rhs._branch << "\t" << rhs._lprob << "\t"  << rhs._optParams.size(); 
+    return out;  
+  }
+  
+private: 
+  BranchPlain _branch; 
+  log_double _lprob; 
+  std::vector<OptimizedParameter> _optParams; 
+}; 
+
+#endif
diff --git a/src/proposals/InsertionScore.hpp b/src/proposals/InsertionScore.hpp
new file mode 100644
index 0000000..24fd146
--- /dev/null
+++ b/src/proposals/InsertionScore.hpp
@@ -0,0 +1,39 @@
+#ifndef _INSERTION_SCORE 
+#define _INSERTION_SCORE 
+
+
+class  InsertionScore
+{
+public: 
+  InsertionScore(BranchPlain _b, std::vector<nat> _tmp) : b(_b), partitionParsimony(_tmp){}  
+  BranchPlain getBranch() const  {return b; }
+
+  double getWeight() const {return  logProb; }
+  void setWeight(double w) { logProb = w; }
+
+  nat getScore() const
+  {
+    nat result = 0; 
+    for(auto b : partitionParsimony)
+      result += b; 
+    return result; 
+  }
+
+  nat getPartitionScore(int model) const{return partitionParsimony[model] ; }
+
+
+private: 
+  BranchPlain b; 
+  std::vector<nat> partitionParsimony; 
+  double logProb;
+
+  friend std::ostream& operator<< (std::ostream &out, const InsertionScore &rhs) { 
+    out <<  "(" << rhs.b << "=" ; 
+    for(auto elem : rhs.partitionParsimony)
+      out << elem << "," ; 
+    return out; 
+  }
+} ; 
+
+
+#endif
diff --git a/src/proposals/MoveEnumeration.cpp b/src/proposals/MoveEnumeration.cpp
new file mode 100644
index 0000000..4bd82ca
--- /dev/null
+++ b/src/proposals/MoveEnumeration.cpp
@@ -0,0 +1,105 @@
+#include "MoveEnumeration.hpp"
+
+#include <cassert>
+
+#include "SprMove.hpp"
+
+
+
+std::vector<SprMove> MoveEnumeration::getMovesFromDepthFirstSearch_helper(const TreeAln& traln, const BranchPlain & pruneBranch, const BranchPlain& insert, int depth, bool isFirst ) 
+{
+  auto result = std::vector<SprMove>{}; 
+  
+  if(depth < 0 )
+    return result; 
+
+  if(not isFirst )
+    result.emplace_back(traln, pruneBranch, insert);
+
+  if(not traln.isTipNode(insert.getSecNode())) 
+    {
+      auto desc = traln.getDescendents(insert.getInverted()); 
+
+      auto res1 = getMovesFromDepthFirstSearch_helper(traln, pruneBranch, desc.first, depth - 1, false);
+      auto res2 = getMovesFromDepthFirstSearch_helper(traln, pruneBranch, desc.second, depth - 1, false);
+      
+      result.insert(end(result), begin(res1), end(res1)); 
+      result.insert(end(result), begin(res2), end(res2)); 
+    }
+
+  return result; 
+}
+
+std::vector<SprMove> MoveEnumeration::getMovesFromDepthFirstSearch(const TreeAln& traln, const BranchPlain & pruneBranch, int dist)
+{
+  auto result = std::vector<SprMove>{}; 
+
+  assert(not traln.isTipNode(pruneBranch.getPrimNode())); 
+
+  auto desc = traln.getDescendents(pruneBranch);
+
+  auto res1 = getMovesFromDepthFirstSearch_helper(traln, pruneBranch, desc.first, dist, true ) ; 
+  auto res2 = getMovesFromDepthFirstSearch_helper(traln, pruneBranch, desc.second, dist, true ) ; 
+
+  result.insert(end(result), begin(res1), end(res1));
+  result.insert(end(result), begin(res2), end(res2)); 
+  
+  return result; 
+}
+
+
+
+std::vector<SprMove> MoveEnumeration::getMovesForBranch(const TreeAln& traln, BranchPlain pruneBranch, nat dist) 
+{
+  auto result = std::vector<SprMove>{};
+  
+  auto pP = pruneBranch.getPrimNode();  
+
+  if(not traln.isTipNode( pruneBranch.getPrimNode()))
+    {
+      auto distBranches = traln.getBranchesByDistance(pruneBranch, dist + 1, false ); 
+
+      for(auto insertBranch : distBranches)
+	{
+	  auto iP = insertBranch.getPrimNode(),
+	    iS = insertBranch.getSecNode(); 
+
+	  if(dist == 1 
+	     &&   
+	     ( ( traln.exists(BranchPlain(pP, iP )) && pP > iP  ) 
+	       || ( traln.exists(BranchPlain(pP, iS )) && pP > iS  )) )
+	    {
+	      // tout << "skipping " << pruneBranch << "," << insertBranch << std::endl; 
+	      continue; 
+	    }
+
+	  result.emplace_back( traln, pruneBranch, insertBranch);
+	}
+    }
+
+  return result; 
+}
+
+
+
+std::vector<SprMove> MoveEnumeration::getAllUniqueMoves(const TreeAln& traln, nat dist)
+{
+  auto result = std::vector<SprMove>{}; 
+  
+  assert(dist > 0); 
+
+  for(auto pruneBranch : traln.extractBranches())  
+    {
+      auto res1 = getMovesForBranch(traln, pruneBranch, dist+1); 
+      auto res2 = getMovesForBranch(traln, pruneBranch.getInverted(), dist+1); 
+
+      result.insert(end(result), begin(res1),end(res1)); 
+      result.insert(end(result), begin(res2),end(res2)); 
+    }
+  
+  return result; 
+}
+
+
+
+
diff --git a/src/proposals/MoveEnumeration.hpp b/src/proposals/MoveEnumeration.hpp
new file mode 100644
index 0000000..a4bd0c7
--- /dev/null
+++ b/src/proposals/MoveEnumeration.hpp
@@ -0,0 +1,25 @@
+#ifndef _MOVE_ENUMERATOR_HPP
+#define _MOVE_ENUMERATOR_HPP
+
+#include <vector> 
+
+#include "common.h"
+
+
+#include "TreeAln.hpp"
+
+class SprMove; 
+
+class MoveEnumeration
+{
+public: 
+  static std::vector<SprMove> getAllUniqueMoves(const TreeAln& traln, nat dist) ; 
+  static std::vector<SprMove> getMovesForBranch(const TreeAln& traln, BranchPlain pruneBranch, nat dist) ; 
+  static std::vector<SprMove> getMovesFromDepthFirstSearch(const TreeAln& traln, const BranchPlain & pruneBranch, int dist); 
+
+private: 
+  static std::vector<SprMove> getMovesFromDepthFirstSearch_helper(const TreeAln& traln, const BranchPlain & pruneBranch, const BranchPlain& insert, int depth, bool isFirst ) ; 
+}; 
+
+
+#endif
diff --git a/src/proposals/NodeSlider.cpp b/src/proposals/NodeSlider.cpp
new file mode 100644
index 0000000..035c341
--- /dev/null
+++ b/src/proposals/NodeSlider.cpp
@@ -0,0 +1,186 @@
+#include "NodeSlider.hpp"
+#include "LikelihoodEvaluator.hpp"
+#include "BoundsChecker.hpp"
+#include "AbstractPrior.hpp"
+#include "BranchLength.hpp"
+
+NodeSlider::NodeSlider( double _multiplier)
+  : AbstractProposal( Category::BRANCH_LENGTHS, "nodeSlider", 5.,  0,0, false)
+  , multiplier(_multiplier)
+  , oneBranch{}
+  , otherBranch{}
+{
+}
+
+
+std::pair<BranchPlain,BranchPlain> NodeSlider::prepareForSetExecution(TreeAln& traln, Randomness &rand) 
+{
+  assert(_inSetExecution); 
+
+  auto a = determinePrimeBranch(traln, rand); 
+  auto descendents = traln.getDescendents(a); 
+  auto b = rand.drawRandDouble01() < 0.5 ? descendents.first : descendents.second; 	
+  return std::pair<BranchPlain,BranchPlain>(a,b); 
+}
+
+
+BranchPlain NodeSlider::determinePrimeBranch(const TreeAln &traln, Randomness& rand) const
+{
+  return TreeRandomizer::drawInnerBranchUniform(traln,rand); 
+} 
+
+
+BranchPlain NodeSlider::proposeBranch(const TreeAln &traln, Randomness &rand) const 
+{
+  if(_inSetExecution)
+    {
+      return _preparedBranch;
+    }
+  else  
+    {
+      return determinePrimeBranch(traln, rand); 
+    }
+}
+
+
+BranchPlain NodeSlider::proposeOtherBranch(const BranchPlain &firstBranch, const TreeAln& traln, Randomness& rand) const 
+{
+  if(_inSetExecution)
+    return _preparedOtherBranch; 
+  else 
+    {
+      auto descendents = traln.getDescendents(firstBranch); 
+      return rand.drawRandDouble01() < 0.5 ? descendents.first : descendents.second; 	
+    }
+}
+
+
+void NodeSlider::prepareForSetEvaluation( TreeAln &traln, LikelihoodEvaluator& eval) const 
+{
+  nat middleNode = getCommonNode(oneBranch,otherBranch) ;
+  nat otherNode = oneBranch.getOtherNode(middleNode); 
+  
+  auto b = BranchPlain(middleNode, otherNode); 
+  nodeptr p = traln.findNodePtr(b);    
+
+  eval.invalidateArray( traln, p->number); 
+}
+
+
+void NodeSlider::applyToState(TreeAln &traln, PriorBelief &prior, log_double &hastings, Randomness &rand, LikelihoodEvaluator& eval) 
+{
+  auto blParams = getPrimaryParameterView(); 
+  auto param = blParams[0];
+  assert(blParams.size() == 1); 
+
+  // TODO outer branches have a lower probability of getting drawn? =/ 
+  oneBranch = traln.getBranch(proposeBranch(traln, rand),param); 
+  otherBranch = traln.getBranch(proposeOtherBranch(oneBranch, traln, rand),param); 
+
+  auto oldA = oneBranch.getLength().getValue(),
+    oldB = otherBranch.getLength().getValue();
+
+  double bothZ = oldA * oldB; 
+
+  // correct the multiplier 
+  double drawnMultiplier = rand.drawMultiplier(multiplier); 
+  double newZ = pow(bothZ, drawnMultiplier); 
+  auto testBranch = oneBranch; 
+  testBranch.setLength(sqrt(newZ)); 
+  if(not BoundsChecker::checkBranch(testBranch))
+    {
+      BoundsChecker::correctBranch(testBranch); 
+      newZ = pow(testBranch.getLength( ).getValue(),2); 
+      drawnMultiplier = log(newZ)   / log(bothZ); 
+    }
+
+  double uniScaler = rand.drawRandDouble01(), 
+    newA = pow(newZ, uniScaler ),
+    newB = pow(newZ, 1-uniScaler); 
+
+  bool problemWithA = false; 
+  testBranch.setLength(newA); 
+  if(not BoundsChecker::checkBranch(testBranch))
+    {
+      BoundsChecker::correctBranch(testBranch); 
+      newA = testBranch.getLength().getValue(); 
+      problemWithA = true; 
+    }
+  testBranch.setLength(newB); 
+  if(not BoundsChecker::checkBranch(testBranch))
+    {
+      BoundsChecker::correctBranch(testBranch); 
+      newB = testBranch.getLength().getValue(); 
+      assert(not problemWithA); // should have been detected, when we checked the multiplier 
+    }
+
+  testBranch = oneBranch; 
+  testBranch.setLength(newA); 
+  // tout << "changing " << oneBranch << " to " << testBranch << std::endl; 
+  traln.setBranch(testBranch, param); 
+  
+  auto lnPrA = param->getPrior()->getUpdatedValue(oneBranch.getLength().getValue(), testBranch.getLength().getValue(), param);
+
+  // auto lnPrA = param->getPrior()->getLogProb( ParameterContent{{ testBranch.getInterpretedLength(param) } } )
+  //   /   param->getPrior()->getLogProb( ParameterContent{{ oneBranch.getInterpretedLength(param) } } ); 
+
+  testBranch = otherBranch; 
+  testBranch.setLength(newB); 
+  // tout << "changing " << otherBranch << " to " << testBranch << std::endl; 
+  traln.setBranch(testBranch, param); 
+
+  auto lnPrB = param->getPrior()->getUpdatedValue(otherBranch.getLength().getValue(), testBranch.getLength().getValue(), param); 
+
+  // auto lnPrB = param->getPrior()->getLogProb( ParameterContent{{ testBranch.getInterpretedLength(param) } } )
+  //   /   param->getPrior()->getLogProb( ParameterContent{{ otherBranch.getInterpretedLength(param) } } ); 
+
+  // AbstractProposal::updateHastingsLog(hastings, log(), _name); 
+  hastings *= log_double::fromAbs(pow(drawnMultiplier,2));
+
+  prior.addToRatio(lnPrA * lnPrB); 
+}
+
+void NodeSlider::evaluateProposal(  LikelihoodEvaluator &evaluator, TreeAln &traln, const BranchPlain &branchSuggestion) 
+{
+  nat middleNode = getCommonNode(oneBranch,otherBranch) ;
+  nat otherNode = oneBranch.getOtherNode(middleNode); 
+  assert(_primParamIds.size() == 1); 
+  auto b = BranchPlain(middleNode, otherNode); 
+
+  auto parts = _allParams->at(_primParamIds[0])->getPartitions(); 
+
+  for(auto aNode : getInvalidatedNodes(traln) ) 
+    { 
+      for(auto part : parts)
+	evaluator.invalidateArray(traln, part, aNode); 
+    }
+
+#ifdef PRINT_EVAL_CHOICE
+  tout << "EVAL "  << b << std::endl; 
+#endif
+
+  evaluator.evaluatePartitionsWithRoot(traln,b, parts, false); 
+}
+
+
+void NodeSlider::resetState(TreeAln &traln) 
+{
+  auto view = getPrimaryParameterView();
+  assert(view.size() == 1);
+
+  traln.setBranch(oneBranch, view[0]); 
+  traln.setBranch(otherBranch, view[0]); 
+}
+
+
+AbstractProposal* NodeSlider::clone() const
+{
+  return new NodeSlider(*this); 
+}  
+
+
+std::vector<nat> NodeSlider::getInvalidatedNodes(const TreeAln& traln) const
+{
+  nat middleNode = getCommonNode(oneBranch,otherBranch) ;
+  return { middleNode } ; 
+}
diff --git a/src/proposals/NodeSlider.hpp b/src/proposals/NodeSlider.hpp
new file mode 100644
index 0000000..ccd6c85
--- /dev/null
+++ b/src/proposals/NodeSlider.hpp
@@ -0,0 +1,40 @@
+#ifndef _NODESLIDER_H
+#define _NODESLIDER_H
+
+#include "AbstractProposal.hpp" 
+#include "Path.hpp"
+
+
+class NodeSlider : public AbstractProposal
+{
+public:   
+  NodeSlider(  double multiplier);
+  virtual ~NodeSlider(){}
+
+  virtual BranchPlain determinePrimeBranch(const TreeAln &traln, Randomness& rand) const; 
+
+  virtual void applyToState(TreeAln &traln, PriorBelief &prior, log_double &hastings, Randomness &rand, LikelihoodEvaluator& eval) ; 
+  virtual void evaluateProposal(  LikelihoodEvaluator &evaluator, TreeAln &traln, const BranchPlain &branchSuggestion) ; 
+  virtual void resetState(TreeAln &traln) ; 
+  
+  BranchPlain proposeBranch(const TreeAln &traln, Randomness &rand) const ; 
+  BranchPlain proposeOtherBranch(const BranchPlain &firstBranch, const TreeAln& traln, Randomness& rand) const ; 
+
+  virtual void prepareForSetEvaluation( TreeAln &traln, LikelihoodEvaluator& eval) const ; 
+  std::pair<BranchPlain,BranchPlain> prepareForSetExecution(TreeAln& traln, Randomness &rand) ; 
+  virtual void autotune() {}	// disabled 
+
+  virtual AbstractProposal* clone() const;  
+
+  virtual std::vector<nat> getInvalidatedNodes(const TreeAln &traln ) const; 
+
+  virtual void readFromCheckpointCore(std::istream &in) {   } // disabled
+  virtual void writeToCheckpointCore(std::ostream &out) const { } //disabled
+
+protected: 
+  double multiplier; 
+  BranchLength oneBranch; 
+  BranchLength otherBranch; 
+};  
+
+#endif
diff --git a/src/proposals/ParameterProposal.cpp b/src/proposals/ParameterProposal.cpp
new file mode 100644
index 0000000..433f0fe
--- /dev/null
+++ b/src/proposals/ParameterProposal.cpp
@@ -0,0 +1,225 @@
+#include "ParameterProposal.hpp"
+#include "AbstractPrior.hpp"
+#include "BoundsChecker.hpp"
+
+ParameterProposal::ParameterProposal(
+    Category                         cat,
+    std::string                      name,
+    bool                             modBL,
+    std::unique_ptr<AbstractProposer>_proposer,
+    double                           p,
+    double                           weight,
+    double                           minTuning,
+    double                           maxTuning)
+    : AbstractProposal(cat, name, weight, minTuning, maxTuning, true)
+    , modifiesBL(modBL)
+    , parameter(p)
+    , proposer(std::move(_proposer))
+    , _savedContent{}
+    , _savedBinaryContent{}
+    , _oldFCs{}
+{}
+
+
+ParameterProposal::ParameterProposal(
+    const ParameterProposal&rhs)
+    : AbstractProposal(rhs)
+    , modifiesBL(rhs.modifiesBL)
+    , parameter(rhs.parameter)
+    , proposer(std::unique_ptr<AbstractProposer>(rhs.proposer->clone()))
+    , _savedContent{rhs._savedContent}
+    , _savedBinaryContent{rhs._savedBinaryContent}
+    , _oldFCs{rhs._oldFCs}
+{}
+
+
+void                    ParameterProposal::applyToState(
+    TreeAln&             traln,
+    PriorBelief&         prior,
+    log_double&          hastings,
+    Randomness&          rand,
+    LikelihoodEvaluator& eval)
+{
+    auto blParams = getBranchLengthsParameterView();
+
+    assert(_primParamIds.size() == 1);  // we only have one parameter to
+                                        // integrate over
+    // this parameter proposal works with any kind of parameters (rate
+    // heterogeneity, freuqencies, revmat ... could also be extended to
+    // work with AA)
+
+
+    // extract the parameter (a handy std::vector<double> that for
+    // instance contains all the frequencies)
+    auto primParam = _allParams->at(_primParamIds[0]);
+    auto content = primParam->extractParameter(traln);
+    _savedContent = content;
+
+    // for aa revmat + statefreqs, we need to be able to restore the exact
+    // value
+    _savedBinaryContent = primParam->extractParameterRaw(traln);
+
+    // nasty, we have to correct for the fracchange
+    // auto oldFCs = std::vector<double>{};
+    _oldFCs.clear();
+    auto newFCs = std::vector<double>{};
+
+    for (auto&param : blParams)
+        _oldFCs.push_back(param->getMeanSubstitutionRate());
+
+    // we have a proposer object, that does the proposing (check out
+    // ProposalFunctions.hpp) It should take care of the hastings as
+    // well (to some degree)
+
+    auto newValues = proposer->proposeValues(content.values, parameter, rand,
+                                             hastings);
+
+    // tout << "proposing "  << newValues << std::endl;
+    assert(newValues.size() == content.values.size());
+
+    // create a copy
+    auto newContent = ParameterContent{};
+    newContent.values = newValues;
+    // use our parameter object to set the frequencies or revtmat rates
+    // or what ever (for all partitions)
+    primParam->applyParameter(traln, newContent);
+
+    if (modifiesBL)
+    {
+        // update the frac changes
+        for (auto&param : blParams)
+            param->updateMeanSubstRate(traln);
+
+
+        for (auto&param : blParams)
+            newFCs.push_back(param->getMeanSubstitutionRate());
+
+        auto ctr = 0;
+
+        // account for implicit BL multiplier in prior
+        for (auto&param: blParams)
+        {
+            prior.addToRatio(param->getPrior()->accountForMeanSubstChange(
+                                 traln,
+                                 param,
+                                 _oldFCs.at(ctr),
+                                 newFCs.at(ctr)));
+            ++ctr;
+        }
+
+        // account for proposal density ratio
+        for (nat i = 0; i < blParams.size(); ++i)
+        {
+            auto value = traln.getNumberOfBranches() * log(newFCs.at(i)
+                                                           / _oldFCs.at(i));
+            hastings *= log_double::fromLog(value);
+        }
+    }
+
+    // a generic prior updates the prior rate
+    auto pr = primParam->getPrior();
+    prior.addToRatio(pr->getLogProb(newValues) / pr->getLogProb(
+                         _savedContent.values));
+}
+
+
+void                    ParameterProposal::evaluateProposal(
+    LikelihoodEvaluator&evaluator,
+    TreeAln&            traln,
+    const BranchPlain&  branchSuggestion)
+{
+    auto prts = _allParams->at(_primParamIds[0])->getPartitions();
+#ifdef PRINT_EVAL_CHOICE
+    tout << "EVAL-CHOICE "  << branchSuggestion << std::endl;
+#endif
+
+    evaluator.evaluatePartitionsWithRoot(traln, branchSuggestion, prts, true);
+}
+
+
+void                    ParameterProposal::resetState(
+    TreeAln&traln)
+{
+    assert(_primParamIds.size() == 1);
+    _allParams->at(_primParamIds[0])->applyParameter(traln, _savedContent);
+
+    // for aa gtr revmat  + statefreq, we need to reset the exact binary value
+    _allParams->at(
+        _primParamIds[0])->applyParameterRaw(traln, _savedBinaryContent);
+
+    // for a fixed bl parameter, we have to re-scale the branch lengths after
+    // rejection again.
+    // NOTICE: this is very inefficient
+    if (modifiesBL)
+    {
+        for (auto&param : getBranchLengthsParameterView())
+        {
+            if (not param->getPrior()->needsIntegration())
+            {
+                auto prior = param->getPrior();
+
+                for (auto&b : traln.extractBranches(param))
+                {
+                    auto content = prior->getInitialValue();
+                    // b.setConvertedInternalLength(param, content.values[0]);
+                    b.setLength(InternalBranchLength::fromAbsolute(
+                                    content.values[0],
+                                    param->getMeanSubstitutionRate()));
+
+                    if (not BoundsChecker::checkBranch(b))
+                        BoundsChecker::correctBranch(b);
+
+                    traln.setBranch(b, param);
+                }
+            }
+            else
+                param->updateMeanSubstRate(traln);
+        }
+    }
+}
+
+
+void                                ParameterProposal::autotune()
+{
+    if (not proposer->isTune())
+        return;
+
+    double newParam = tuneParameter(_sctr.getBatch(),
+                                    _sctr.getRatioInLastInterval(), parameter,
+                                    not proposer->isTuneup());
+
+    // tout << *this << "" << std::endl;
+    // printShort (tout) ;
+    // tout << "\t" << parameter << " -> "<< newParam << "\t" <<
+    //  _sctr.getBatch() << std::endl;
+
+    parameter = newParam;
+    _sctr.nextBatch();
+}
+
+
+void                                ParameterProposal::readFromCheckpointCore(
+    std::istream&in)
+{
+    parameter = cRead<decltype(parameter)>(in);
+}
+
+
+void                                ParameterProposal::writeToCheckpointCore(
+    std::ostream&out)  const
+{
+    cWrite<decltype(parameter)>(out, parameter);
+}
+
+
+std::vector<nat>                    ParameterProposal::getInvalidatedNodes(
+    const TreeAln&traln) const
+{
+    auto result = std::vector<nat>{};
+
+    for (nat i = traln.getNumberOfTaxa() + 1; i < traln.getNumberOfNodes() + 1;
+         ++i)
+        result.push_back(i);
+
+    return result;
+}
diff --git a/src/proposals/ParameterProposal.hpp b/src/proposals/ParameterProposal.hpp
new file mode 100644
index 0000000..34bb7fb
--- /dev/null
+++ b/src/proposals/ParameterProposal.hpp
@@ -0,0 +1,82 @@
+#ifndef _PARAMETER_PROPOSALS
+#define _PARAMETER_PROPOSALS
+
+#include "TreeAln.hpp"
+#include "AbstractProposal.hpp"
+#include "AbstractProposer.hpp"
+#include "ParameterProposal.hpp"
+
+#include <memory>
+
+///////////////////////////////////////////////////////////////////////////////
+//                             PARAMETER PROPOSAL                            //
+///////////////////////////////////////////////////////////////////////////////
+class ParameterProposal : public AbstractProposal
+{
+public:
+    // _________________________________________________________________________
+    ParameterProposal(
+        Category                         cat,
+        std::string                      _name,
+        bool                             modifiesBL,
+        std::unique_ptr<AbstractProposer>_proposer,
+        double                           parameter,
+        double                           weight,
+        double                           minTuning,
+        double                           maxTuning);
+    // _________________________________________________________________________
+    ParameterProposal(
+        const ParameterProposal&prop);
+    // _________________________________________________________________________
+    virtual ~ParameterProposal(){}
+    // _________________________________________________________________________
+    virtual void                                      applyToState(
+        TreeAln&             traln,
+        PriorBelief&         prior,
+        log_double&          hastings,
+        Randomness&          rand,
+        LikelihoodEvaluator& eval);
+    // _________________________________________________________________________
+    virtual void                                      evaluateProposal(
+        LikelihoodEvaluator&evaluator,
+        TreeAln&            traln,
+        const BranchPlain&  branchSuggestion);
+    // _________________________________________________________________________
+    virtual void                                      resetState(
+        TreeAln&traln);
+    // _________________________________________________________________________
+    virtual void                                      autotune();
+    // _________________________________________________________________________
+    virtual BranchPlain                               determinePrimeBranch(
+        const TreeAln&traln,
+        Randomness&   rand) const {return BranchPlain(); }
+    // _________________________________________________________________________
+    virtual AbstractProposal*                         clone()
+    const {return new ParameterProposal(*this);   }
+    // _________________________________________________________________________
+    virtual std::vector<nat>                          getInvalidatedNodes(
+        const TreeAln&traln) const;
+    // _________________________________________________________________________
+    virtual std::pair<BranchPlain,
+                      BranchPlain>                    prepareForSetExecution(
+        TreeAln&   traln,
+        Randomness&rand)
+    {return std::make_pair(BranchPlain(0, 0), BranchPlain(0, 0)); }
+    // _________________________________________________________________________
+    virtual void                                      readFromCheckpointCore(
+        std::istream&in);
+    // _________________________________________________________________________
+    virtual void                                      writeToCheckpointCore(
+        std::ostream&out) const;
+private:
+    bool                              modifiesBL;
+    double                            parameter;
+    std::unique_ptr<AbstractProposer> proposer;
+
+    ParameterContent                  _savedContent;
+    ParameterContent                  _savedBinaryContent;
+    std::vector<double>               _oldFCs;
+};
+
+
+#endif
diff --git a/src/proposals/ProposalSet.cpp b/src/proposals/ProposalSet.cpp
new file mode 100644
index 0000000..b0acb9e
--- /dev/null
+++ b/src/proposals/ProposalSet.cpp
@@ -0,0 +1,113 @@
+#include "ProposalSet.hpp"
+
+
+ProposalSet::ProposalSet(double relWeight, std::vector<std::unique_ptr<AbstractProposal> > _proposals)
+  : Serializable()
+  , relativeWeight(relWeight)
+  , proposals{}
+{
+  for(auto &p : _proposals)
+    proposals.emplace_back(p->clone()); 
+
+  for(auto &p : proposals)
+    p->setInSetExecution(true);
+} 
+
+
+ProposalSet::ProposalSet(const ProposalSet &rhs)
+  : Serializable(rhs)
+  , relativeWeight(rhs.relativeWeight)
+  , proposals{}
+{
+  for(auto &p : rhs.proposals)
+    proposals.emplace_back(p->clone());
+
+  for(auto &p : rhs.proposals)
+    p->setInSetExecution(true);
+}
+
+
+ProposalSet& ProposalSet::operator=(const ProposalSet &rhs)
+{
+  auto&& result = ProposalSet(rhs); 
+  std::swap(result, *this); 
+  return *this; 
+}
+
+
+std::vector<AbstractProposal*> ProposalSet::getProposalView() const
+{
+  auto result = std::vector<AbstractProposal*>{}; 
+  for(auto &p : proposals)
+    result.push_back(p.get());
+  return result; 
+}  
+
+
+void ProposalSet::printVerboseAbbreviated(std::ostream &out, double sum) const
+{
+  out << relativeWeight / sum * 100 <<   "%\tSET(totalNumber=" << proposals.size() << "):" << std::endl;
+  for(auto &p : proposals)
+    {
+      out << "\t"; 
+      out << p->getId() << "\t"; 
+      p->printShort(out); 
+      out << std::endl; 
+    }
+}
+
+
+nat ProposalSet::numerateProposals(nat ctr)
+{
+  for(auto &p : proposals)
+    {
+      p->setId(ctr); 
+      ++ctr; 
+    }
+
+  return ctr; 
+} 
+
+
+void ProposalSet::deserialize( std::istream &in )
+{
+  for(auto &p : proposals)
+    p->deserialize(in); 
+}
+
+
+void ProposalSet::serialize( std::ostream &out) const
+{
+  for(auto &p : proposals)
+    p->serialize(out); 
+}   
+
+
+std::ostream& operator<<(std::ostream& out, const ProposalSet &rhs)
+{
+  out << "SET("; 
+  
+  std::unordered_set<std::string> pNames; 
+  for(auto &p : rhs.proposals)
+    pNames.insert(p->getName()); 
+
+  out << pNames << ")"; 
+
+  return out; 
+}
+
+
+bool ProposalSet::needsFullTraversal()
+{
+  bool result = true; 
+  for(auto &p : proposals)
+    result &= p->isNeedsFullTraversal();
+  return result; 
+}
+
+
+void ProposalSet::setParameterListPtr(ParameterList* pPtr)
+{
+  for(auto &elem : proposals)
+    elem->setParams(pPtr );
+} 
diff --git a/src/proposals/ProposalSet.hpp b/src/proposals/ProposalSet.hpp
new file mode 100644
index 0000000..29505ee
--- /dev/null
+++ b/src/proposals/ProposalSet.hpp
@@ -0,0 +1,60 @@
+/** 
+    @file ProposalSet.hpp
+    
+    @brief represents a set of proposals 
+
+    This class should be used to execute component-wise
+    Metropolis-Hastings (a.k.a. component-in-sequence MH).
+
+    The main motivation to do so is efficiency.
+
+    The justification to do is e.g., 
+    http://theclevermachine.wordpress.com/2012/11/04/mcmc-multivariate-distributions-block-wise-component-wise-updates/  
+    
+    and more specifically 
+    The Metropolitan-Hastings Algorithm and Extensions.S. Sawyer — Washington University — Vs. August 22, 2010
+ */ 
+
+
+#ifndef PROPOSAL_SET
+#define PROPOSAL_SET
+
+#include <iostream>
+#include "AbstractProposal.hpp"
+
+class ProposalSet : public Serializable
+{
+public: 
+  // life cycle 
+  ProposalSet(double relWeight, std::vector<std::unique_ptr<AbstractProposal>> proposals); 
+  ProposalSet(const ProposalSet &rhs);
+  ProposalSet& operator=(const ProposalSet &rhs); 
+  /** 
+      @brief prints the proposal set    
+   */ 
+  void printVerboseAbbreviated(std::ostream &out, double sum) const; 
+  /** 
+      @brief indicates whether for this proposal set a full tree
+      traversal is necessary
+   */ 
+  bool needsFullTraversal(); 
+  
+  nat numerateProposals(nat ctr); 
+
+  void setParameterListPtr(ParameterList* pPtr);  
+
+  double getRelativeWeight() const {return relativeWeight; }
+  std::vector<AbstractProposal*> getProposalView() const;  
+
+  virtual void deserialize( std::istream &in ); 
+  virtual void serialize( std::ostream &out) const;   
+
+  friend std::ostream& operator<<(std::ostream& out, const ProposalSet &rhs); 
+
+private: 
+  double relativeWeight; 
+  std::vector<std::unique_ptr<AbstractProposal> > proposals;   
+}; 
+
+
+#endif
diff --git a/src/proposals/ProposalType.cpp b/src/proposals/ProposalType.cpp
new file mode 100644
index 0000000..e46d922
--- /dev/null
+++ b/src/proposals/ProposalType.cpp
@@ -0,0 +1,217 @@
+#include <iostream>		// 
+#include <cassert>
+
+#include "ProposalType.hpp"
+
+
+namespace ProposalTypeFunc
+{
+  std::string getLongName(ProposalType type)
+  {
+    std::unordered_map<ProposalType, std::string, ProposalTypeHash> map = 
+      {
+	{ ProposalType::ST_NNI , "statistical NNI"  } , 
+	{ ProposalType::E_SPR , "extended SPR"}, 
+	{ ProposalType::E_TBR , "extended TBR"},
+	{ ProposalType::PARSIMONY_SPR, "parsimony-guided SPR"},
+	{ ProposalType::TL_MULT , "tree length multiplier"},
+	{ ProposalType::NODE_SLIDER , "node slider"},
+	{ ProposalType::BRANCH_LENGTHS_MULTIPLIER , "branch length multiplier"},
+	{ ProposalType::REVMAT_SLIDER , "substition matrix slider"},
+	{ ProposalType::REVMAT_DIRICHLET , "substitution matrix dirchlet"},
+	{ ProposalType::RATE_HET_SLIDER , "rate heterogeneity slider"},
+	{ ProposalType::RATE_HET_MULTI , "rate heterogeneity multiplier"},
+	{ ProposalType::FREQUENCY_SLIDER , "frequency slider"},
+	{ ProposalType::FREQUENCY_DIRICHLET , "frequency dirichlet"},
+	{ ProposalType::AMINO_MODEL_JUMP , "amino acid model jump"},
+	{ ProposalType::BRANCH_DIST_GAMMA , "branch length from opt-dist"} ,
+	{ ProposalType::LIKE_SPR, "likelihood-guided SPR move"}, 
+	{ ProposalType::DIRICH_REVMAT_PER_RATE, "rate orientated dirichlet proposal on RevMat" } ,
+	{ ProposalType::SLIDING_REVMAT_PER_RATE, "rate orientated sliding proposal on RevMat"} , 
+	{ ProposalType::BL_DIST_WEIBULL , "a weibull based branch length proposal" } ,
+	{ ProposalType::DIV_TIME_DIRICH , "dirichlet proposal on divergence times" } ,
+      };
+    
+    if(map.find(type) == map.end())
+      {
+	std::cerr << "you requested a proposal type for which no long name has been set. Correct that in ProposalType.hpp  " << std::endl; 
+	exitFunction(-1, true); 
+      }
+    return map[type]; 
+  }
+
+  std::string getConfigStringFromType(ProposalType p )
+  {
+    // notice: MUST be upper case!
+    std::unordered_map<ProposalType, std::string, ProposalTypeHash> proposal2name = 
+      {
+	{ ProposalType::ST_NNI,  "STNNI" } ,
+	{ ProposalType::E_SPR,  "ESPR" } ,
+	{ ProposalType::E_TBR,  "ETBR" } ,
+	{ ProposalType::PARSIMONY_SPR,  "PARSIMONYSPR" } ,
+	{ ProposalType::TL_MULT,  "TREELENGTHMULT" } ,
+	{ ProposalType::BRANCH_LENGTHS_MULTIPLIER,  "BRANCHMULTI" } ,
+	{ ProposalType::NODE_SLIDER,  "NODESLIDER" } ,
+	{ ProposalType::REVMAT_SLIDER,  "REVMATSLIDER" }  , 
+	{ ProposalType::REVMAT_DIRICHLET,  "REVMATDIRICHLET" } ,
+	{ ProposalType::RATE_HET_SLIDER,  "RATEHETSLIDER" } ,
+	{ ProposalType::RATE_HET_MULTI,  "RATEHETMULTI" } ,
+	{ ProposalType::FREQUENCY_SLIDER,  "FREQUENCYSLIDER" } ,
+	{ ProposalType::FREQUENCY_DIRICHLET,  "FREQUENCYDIRICHLET" } ,
+	{ ProposalType::AMINO_MODEL_JUMP,  "AAMODELJUMP" } ,
+	{ ProposalType::BRANCH_DIST_GAMMA , "BLDISTGAMMA"} , 
+	{ ProposalType::LIKE_SPR, "LIKESPR"},
+	{ ProposalType::DIRICH_REVMAT_PER_RATE, "REVMATRATEDIRICH" } ,
+	{ ProposalType::SLIDING_REVMAT_PER_RATE, "REVMATRATESLIDER"} ,
+	{ ProposalType::BL_DIST_WEIBULL , "BLDISTWEIBULL" } ,
+	{ ProposalType::DIV_TIME_DIRICH , "DIVTIMEDIRICH" },
+      };
+
+    return proposal2name[p];     
+  }
+
+  ProposalType getTypeFromConfigString(std::string name )
+  {
+    auto ps = getAllProposals();
+    for(auto p : ps)
+      {
+	if(getConfigStringFromType(p).compare(name) == 0)
+	  return p; 
+      }
+    
+    std::cerr << "something went wrong while trying to identify what kind of proposal >"  << name  << "< is. See ProposalType.hpp" << std::endl; 
+    exitFunction(-1, true); 
+    return ProposalType::ST_NNI; 
+  }
+
+
+  std::vector<ProposalType> getSingleParameterProposalsForCategory(Category c) 
+  {
+    switch(c)
+      {
+      case Category::DIVERGENCE_TIMES: 
+	return
+	  {
+	    ProposalType::DIVTIME_SLIDER 
+	  }; 
+      case Category::DIVERGENCE_RATES: 
+	return 
+	  {
+	    ProposalType::DIVRATE_SLIDER
+	  }; 
+      case Category::TOPOLOGY: 
+	return { 
+	  ProposalType::ST_NNI, 
+	    ProposalType::E_SPR, 
+	    ProposalType::E_TBR, 
+	    ProposalType::PARSIMONY_SPR, 
+	    ProposalType::LIKE_SPR
+	    }; 
+      case Category::BRANCH_LENGTHS: 
+	return { 
+	  ProposalType::BRANCH_LENGTHS_MULTIPLIER, 
+	    ProposalType::TL_MULT, 
+	    ProposalType::BRANCH_DIST_GAMMA , 
+	    ProposalType::NODE_SLIDER, 
+	    ProposalType::BL_DIST_WEIBULL, 
+	    ProposalType::DIV_TIME_DIRICH, 
+            };
+      case Category::FREQUENCIES: 
+	return { 
+	  ProposalType::FREQUENCY_SLIDER, 
+	    ProposalType::FREQUENCY_DIRICHLET
+	    } ; 
+      case Category::SUBSTITUTION_RATES: 
+	return { 
+	  ProposalType::REVMAT_SLIDER, 
+	    ProposalType::REVMAT_DIRICHLET, 
+	    ProposalType::DIRICH_REVMAT_PER_RATE,
+	    ProposalType::SLIDING_REVMAT_PER_RATE
+	    }; 	
+      case Category::RATE_HETEROGENEITY: 
+	return { 
+	  ProposalType::RATE_HET_MULTI, 
+	    ProposalType::RATE_HET_SLIDER
+	    }; 
+      case Category::AA_MODEL: 
+	return { 
+	  ProposalType::AMINO_MODEL_JUMP
+	    }; 
+      default: 
+	{
+	  std::cerr << "no proposals for caterogy " << int(c) << std::endl; 	  
+	  assert(0); 
+	}
+      }
+  }
+
+
+  std::vector<ProposalType> getAllProposals()
+  {
+    auto result = std::vector<ProposalType>{}; 
+    auto cs =   CategoryFuns::getAllCategories() ; 
+    for(auto c : cs)
+      {
+	auto someProposals =  getSingleParameterProposalsForCategory( c) ; 
+	result.insert(result.end(), someProposals.begin(), someProposals.end()); 
+      } 
+
+    return result; 
+  }
+
+  bool isValidName(std::string name)
+  {
+    auto ps = getAllProposals();     
+    for(auto &p : ps)
+      {
+	if(getConfigStringFromType(p).compare(name) == 0)
+	  return true; 
+      }
+    return false; 
+  } 
+
+
+  bool isDefaultInstantiate(ProposalType p)
+  {
+    std::unordered_map<ProposalType, bool, ProposalTypeHash> map  = 
+    {
+	{ ProposalType::ST_NNI,  true } ,
+	{ ProposalType::E_SPR,  true } ,
+	{ ProposalType::E_TBR,  false } , // dont like this one: mostly works, when degenerated to spr 
+	{ ProposalType::LIKE_SPR , true}, 
+	{ ProposalType::PARSIMONY_SPR,  true } ,
+
+	{ ProposalType::REVMAT_SLIDER,  true }  , 
+	{ ProposalType::REVMAT_DIRICHLET,  true } ,
+	{ ProposalType::DIRICH_REVMAT_PER_RATE, true } ,
+	{ ProposalType::SLIDING_REVMAT_PER_RATE, false} , 
+
+	{ ProposalType::RATE_HET_SLIDER,  false } ,
+	{ ProposalType::RATE_HET_MULTI,  true } ,
+
+	{ ProposalType::FREQUENCY_SLIDER,  true } ,
+	{ ProposalType::FREQUENCY_DIRICHLET,  true } ,
+
+	{ ProposalType::AMINO_MODEL_JUMP,  true } ,
+
+	{ ProposalType::TL_MULT,  true } ,
+        { ProposalType::BRANCH_DIST_GAMMA , true } ,
+        { ProposalType::BRANCH_LENGTHS_MULTIPLIER,  true } ,
+	{ ProposalType::NODE_SLIDER,  false } ,
+	{ ProposalType::BL_DIST_WEIBULL, false }, 
+	{ ProposalType::DIV_TIME_DIRICH, false }, 
+	{ ProposalType::DIVTIME_SLIDER , true } , 
+	{ ProposalType::DIVRATE_SLIDER , true }
+    };
+
+    if(map.find(p) == map.end())
+      {
+	std::cerr << "Error, could not find type >" << int(p) << 
+	  "< when trying to determine, if proposal is ready for productive use. Check ProposalType.cpp" << std::endl; 
+	assert(0);
+	exitFunction(-1, true); 
+      }
+
+    return map[p]; 
+  }
+}
diff --git a/src/proposals/ProposalType.hpp b/src/proposals/ProposalType.hpp
new file mode 100644
index 0000000..2c6c039
--- /dev/null
+++ b/src/proposals/ProposalType.hpp
@@ -0,0 +1,91 @@
+#ifndef _PROPOSAL_TYPE 
+#define _PROPOSAL_TYPE 
+
+#include <unordered_map>
+#include <vector>
+
+#include "Category.hpp" 
+
+
+// add your new proposal here and update accordingly in everything in
+// ProposalType.cpp .  if you missed something, then exabayes usually
+// complains with an > assert(0);
+
+enum class ProposalType
+{
+  ST_NNI, 
+    E_SPR, 
+    E_TBR,
+    PARSIMONY_SPR,
+    TL_MULT,
+    NODE_SLIDER,
+    BRANCH_LENGTHS_MULTIPLIER,
+    REVMAT_SLIDER,
+    REVMAT_DIRICHLET,
+    RATE_HET_SLIDER,
+    RATE_HET_MULTI,
+    FREQUENCY_SLIDER,
+    FREQUENCY_DIRICHLET,
+    AMINO_MODEL_JUMP,
+    BRANCH_DIST_GAMMA,
+    LIKE_SPR,
+    DIRICH_REVMAT_PER_RATE,
+    SLIDING_REVMAT_PER_RATE,
+    BL_DIST_WEIBULL,
+    DIV_TIME_DIRICH, 
+    DIVRATE_SLIDER,
+    DIVTIME_SLIDER
+}; 
+
+
+class ProposalTypeHash
+{
+public: 
+  size_t operator()(const ProposalType& t) const 
+  {
+    std::hash<int> hasher; 
+    return hasher(int(t)) ; 
+  }
+}; 
+
+
+namespace ProposalTypeFunc
+{
+  /** 
+      @brief gets the verbose name of the proposal 
+   */ 
+  std::string getLongName(ProposalType type); 
+  /** 
+      @brief gets the proposal type from the name in the config file   
+   */ 
+  ProposalType getTypeFromConfigString(std::string s); 
+  /** 
+      @brief gets the name of the proposal by type 
+   */ 
+  std::string getConfigStringFromType(ProposalType p ); 
+  /** 
+      @brief gets all proposals for a category that integrate only over one parameter (primarily) 
+   */ 
+  std::vector<ProposalType> getSingleParameterProposalsForCategory(Category c) ; 
+  /** 
+      @brief IMPORTANT get all relevant proposals for a category  
+   */ 
+  // std::vector<ProposalType> getProposalsForCategory(Category c) ; 
+  /** 
+      @brief gets all relevant proposals 
+   */ 
+  std::vector<ProposalType> getAllProposals();   
+  /**
+     @brief indicates, if the string specifies a valid proposal name 
+   */ 
+  bool isValidName(std::string name); 
+  /** 
+      @brief indicates, if the proposal is ready for productive use
+      (if this is not the case, then the proposal can only be
+      activated by explicitly specifying it in the config file)
+   */ 
+  bool isDefaultInstantiate(ProposalType p); 
+
+}
+
+#endif
diff --git a/src/proposals/README.txt b/src/proposals/README.txt
new file mode 100644
index 0000000..cbdcf51
--- /dev/null
+++ b/src/proposals/README.txt
@@ -0,0 +1 @@
+This module contains all classes that implement proposals.
diff --git a/src/proposals/TreeLengthMultiplier.cpp b/src/proposals/TreeLengthMultiplier.cpp
new file mode 100644
index 0000000..d67ccec
--- /dev/null
+++ b/src/proposals/TreeLengthMultiplier.cpp
@@ -0,0 +1,133 @@
+
+#include "BoundsChecker.hpp"
+
+#include "TreeLengthMultiplier.hpp"
+#include "Randomness.hpp"
+#include "TreeAln.hpp"
+#include "UniformPrior.hpp"
+#include "AbstractPrior.hpp"
+
+TreeLengthMultiplier::TreeLengthMultiplier( double _multiplier)
+  : AbstractProposal(Category::BRANCH_LENGTHS, "TL-Mult", 1., 0.0001, 100, true)
+  , multiplier(_multiplier)    
+  , initTreeLength{0.}
+  , storedBranches{}
+{
+}
+
+void TreeLengthMultiplier::applyToState(TreeAln &traln, PriorBelief &prior, log_double &hastings, Randomness &rand, LikelihoodEvaluator& eval) 
+{
+  storedBranches.clear(); 
+
+  assert(_primParamIds.size() == 1); 
+  auto blParam = (*_allParams)[_primParamIds[0]]; 
+  // getPrimaryParameterView()[0]; 
+
+
+
+  storedBranches = traln.extractBranches(blParam);
+
+  auto  newBranches = storedBranches; 
+  
+  double treeScaler = rand.drawMultiplier(multiplier); 
+  double initTL = 0; 
+  double newTL = 0; 
+
+  auto haveUniformPrior = dynamic_cast<UniformPrior*>(blParam->getPrior()) != nullptr;
+
+  auto meanSubstRate = blParam->getMeanSubstitutionRate(); 
+
+  for(auto &b : newBranches)
+    {
+      auto initLength = b.getLength();
+      initTL += b.toMeanSubstitutions(meanSubstRate); 
+
+      b.setLength(  InternalBranchLength(pow(initLength.getValue(), treeScaler) )); 
+      
+      if( not BoundsChecker::checkBranch(b))
+	BoundsChecker::correctBranch(b);
+
+      double realScaling = log(b.getLength().getValue()) / log(initLength.getValue()); 
+
+      hastings *= log_double::fromAbs(realScaling); 
+
+      double tmp = b.toMeanSubstitutions(meanSubstRate) ; 
+      newTL += tmp;
+      
+      // correct? 
+      if(haveUniformPrior && blParam->getPrior()->getLogProb(ParameterContent{{tmp}}).isNegativeInfinity())
+	prior.addToRatio( log_double::lowest()); 
+    }
+
+  for(auto &b : newBranches)
+    traln.setBranch(b, blParam);
+
+  if(not haveUniformPrior)
+    {
+      auto tmp = blParam->getPrior()->getLogProb( ParameterContent{{ newTL} }  ) / blParam->getPrior()->getLogProb( ParameterContent{{ initTL} } ); 
+      prior.addToRatio( tmp ); 
+    }
+}
+
+
+void TreeLengthMultiplier::resetState(TreeAln &traln)  
+{
+  auto blParams = getPrimaryParameterView(); 
+  assert(blParams.size( )== 1 ) ;
+  auto blParam = blParams[0]; 
+  for(auto &b : storedBranches)
+    traln.setBranch(b, blParam); 
+} 
+
+
+void TreeLengthMultiplier::autotune()
+{
+  double parameter = multiplier; 
+
+  double newParam = tuneParameter(_sctr.getBatch(), _sctr.getRatioInLastInterval(), parameter, PLL_FALSE);
+
+  multiplier = newParam; 
+
+  _sctr.nextBatch();
+}
+ 
+ 
+void TreeLengthMultiplier::evaluateProposal(  LikelihoodEvaluator &evaluator, TreeAln &traln, const BranchPlain &branchSuggestion) 
+{
+  assert(_primParamIds.size( )== 1); 
+  auto parts = _allParams->at(_primParamIds[0])->getPartitions(); 
+
+#ifdef PRINT_EVAL_CHOICE
+  tout << "EVAL-CHOICE " << branchSuggestion << std::endl; 
+#endif
+
+  evaluator.evaluatePartitionsWithRoot(traln,branchSuggestion, parts, true); 
+}
+
+
+AbstractProposal* TreeLengthMultiplier::clone() const
+{
+  return new TreeLengthMultiplier(*this);
+}  
+
+
+void TreeLengthMultiplier::readFromCheckpointCore(std::istream &in)
+{
+  multiplier = cRead<decltype(multiplier)>(in); 
+} 
+
+void TreeLengthMultiplier::writeToCheckpointCore(std::ostream &out) const
+{
+  cWrite<decltype(multiplier)>(out, multiplier); 
+} 
+
+
+std::vector<nat> TreeLengthMultiplier::getInvalidatedNodes(const TreeAln& traln) const
+{
+  auto result = std::vector<nat>{}; 
+  for(nat i = traln.getNumberOfTaxa() + 1 ; i < traln.getNumberOfNodes() + 1  ; ++i)
+    result.push_back(i); 
+  return result; 
+} 
+
+
diff --git a/src/proposals/TreeLengthMultiplier.hpp b/src/proposals/TreeLengthMultiplier.hpp
new file mode 100644
index 0000000..7407f34
--- /dev/null
+++ b/src/proposals/TreeLengthMultiplier.hpp
@@ -0,0 +1,33 @@
+#include "AbstractProposal.hpp"
+
+
+class TreeLengthMultiplier : public AbstractProposal
+{
+public: 
+  TreeLengthMultiplier(  double _multiplier) ; 
+  virtual ~TreeLengthMultiplier(){}
+
+  virtual BranchPlain determinePrimeBranch(const TreeAln &traln, Randomness& rand) const{return BranchPlain(); }
+
+  virtual void applyToState(TreeAln &traln, PriorBelief &prior, log_double &hastings, Randomness &rand, LikelihoodEvaluator& eval) ; 
+  virtual void evaluateProposal(  LikelihoodEvaluator &evaluator, TreeAln &traln, const BranchPlain &branchSuggestion) ; 
+  virtual void resetState(TreeAln &traln)  ; 
+  virtual void autotune() ;
+
+  virtual AbstractProposal* clone() const;  
+
+  virtual void readFromCheckpointCore(std::istream &in);
+  virtual void writeToCheckpointCore(std::ostream &out) const;
+
+  virtual std::pair<BranchPlain,BranchPlain> prepareForSetExecution(TreeAln &traln, Randomness &rand)  { return std::make_pair (BranchPlain(0,0),BranchPlain(0,0) );}
+
+  virtual std::vector<nat> getInvalidatedNodes(const TreeAln& traln) const; 
+
+private: 			// METHODS
+  void multiplyBranchLengthsRecursively(TreeAln& traln, nodeptr p, double multiHere); 
+
+private: 			// ATTRIBUTES
+  double multiplier; 		// the tuning variable  
+  double initTreeLength; 
+  std::vector<BranchLength> storedBranches; 
+} ; 
diff --git a/src/proposals/param-proposers/AbstractProposer.cpp b/src/proposals/param-proposers/AbstractProposer.cpp
new file mode 100644
index 0000000..9367d0d
--- /dev/null
+++ b/src/proposals/param-proposers/AbstractProposer.cpp
@@ -0,0 +1,74 @@
+#include <algorithm>
+#include "AbstractProposer.hpp"
+
+AbstractProposer::AbstractProposer(bool tune, bool tuneup, double minVal, double maxVal)
+  : _tune{tune}
+  , _tuneup{tuneup}
+  , _minVal{minVal}
+  , _maxVal{maxVal}
+{
+  
+} 
+
+
+void AbstractProposer::correctAbsoluteRates(std::vector<double> &values) const 
+{
+  nat prevFixed = -1; 
+  auto nowFixed = 0u; 
+  
+  auto fixedHigh = std::vector<bool>(values.size(), false);
+  auto fixedLow = std::vector<bool>(values.size(), false);
+
+  nat iter = 0; 
+  bool valuesNotOkay = true; 
+  while(prevFixed != nowFixed && valuesNotOkay)
+    {
+      double normer = 0; 
+      nat ctr = 0; 
+      for(auto &v : values)
+	{
+	  assert(v > 0); 	    
+	  if( v <= _minVal)
+	    {
+	      // tout << "================ value too small!" << std::endl; 
+	      v = _minVal; 
+	      fixedLow.at(ctr) = true; 
+	    }
+	  else if(_maxVal <= v)
+	    {
+	      // tout << "================ value too high!" << std::endl; 
+	      v = _maxVal; 
+	      fixedHigh.at(ctr) = true; 
+	    }
+	  else 
+	    normer += v; 
+	  ++ctr ; 
+	}
+
+      auto numHigh = std::count_if(begin(fixedHigh), end(fixedHigh), [](bool elem) {return elem; }); 
+      auto numLow = std::count_if(begin(fixedLow), end(fixedLow), [](bool elem){return elem; }); 
+
+      normer = ( 1. - (_minVal * double(numLow)  +  _maxVal * double(numHigh)))    / normer  ;
+
+      
+      valuesNotOkay = false; 
+      ctr = 0; 
+      for(auto &v : values)
+	{
+	  if(not  ( fixedHigh.at(ctr)  ||  fixedLow.at(ctr))  )
+	    {
+	      v *= normer; 
+
+	      // meh: could simplify everything alltogether again 
+	      valuesNotOkay |= ( v <= _minVal || _maxVal <= v) ; 
+	    }
+	  ++ctr; 
+	}
+
+      prevFixed = nowFixed; 
+      nowFixed = nat(numHigh + numLow); 
+      ++iter; 
+    }
+
+} 
+
diff --git a/src/proposals/param-proposers/AbstractProposer.hpp b/src/proposals/param-proposers/AbstractProposer.hpp
new file mode 100644
index 0000000..f9da2c7
--- /dev/null
+++ b/src/proposals/param-proposers/AbstractProposer.hpp
@@ -0,0 +1,37 @@
+#ifndef _PROPOSAL_FUNCTION_H
+#define _PROPOSAL_FUNCTION_H
+
+#include <vector>
+#include <algorithm>
+
+#include "Randomness.hpp"
+#include "Density.hpp"
+#include "Chain.hpp"
+#include "AbstractProposal.hpp"
+
+//////////////
+// ABSTRACT //
+//////////////
+class AbstractProposer
+{
+public:   
+  AbstractProposer(bool tune, bool tuneup, double minVal, double maxVal); 
+  virtual ~AbstractProposer(){}
+ 
+  virtual std::vector<double> proposeValues(std::vector<double> oldValues, double parameter, Randomness &rand, log_double &hastings) = 0; 
+  bool isTune() const {return _tune; } 
+  bool isTuneup() const {return _tuneup; }
+  void correctAbsoluteRates(std::vector<double> &values) const ; 
+  virtual AbstractProposer* clone() const = 0; 
+
+protected: 
+  bool _tune; 
+  bool _tuneup; 
+  double _minVal; 
+  double _maxVal; 
+}; 
+
+
+#endif
+
+
diff --git a/src/proposals/param-proposers/DirichletProposer.cpp b/src/proposals/param-proposers/DirichletProposer.cpp
new file mode 100644
index 0000000..70157b6
--- /dev/null
+++ b/src/proposals/param-proposers/DirichletProposer.cpp
@@ -0,0 +1,47 @@
+#include "DirichletProposer.hpp"
+#include "BoundsChecker.hpp" 
+#include <numeric>
+
+DirichletProposer::DirichletProposer( double minValI, double maxValI, bool _minMaxIsRelative ) 
+  : AbstractProposer{true, false, minValI, maxValI}
+  , minMaxIsRelative{_minMaxIsRelative}
+  , _rateHelper{}
+{
+} 
+
+
+std::vector<double> DirichletProposer::proposeValues(std::vector<double> oldValues, double parameter, Randomness &rand, log_double &hastings)
+{
+  assert(fabs(std::accumulate(oldValues.begin(), oldValues.end(), 0. ) - 1.0 ) < 1e-6); // sum of rates equals 1 ? 
+
+  auto newValues = std::vector<double> (); 
+  auto scaledOld = _rateHelper.getScaledValues(oldValues, parameter); 
+
+  newValues = rand.drawRandDirichlet(scaledOld); 
+  
+  if( minMaxIsRelative)		// for revmat 
+    {
+      for(auto &v : newValues)
+	v /= newValues.back(); 
+
+      BoundsChecker::correctRevMat(newValues);       
+
+      RateHelper::convertToSum1(newValues);
+    }
+  else 				// for freuqencies (or everything else, that sums up to 1)
+    {      
+      correctAbsoluteRates(newValues); 
+
+      RateHelper::convertToSum1(newValues);
+    }  
+
+  auto scaledNew = _rateHelper.getScaledValues(newValues, parameter);
+
+  auto backP = Density::lnDirichlet(oldValues, scaledNew); 
+  auto forP = Density::lnDirichlet(newValues, scaledOld); 
+
+  hastings *= ( backP / forP); 
+    
+  assert(fabs(std::accumulate(oldValues.begin(), oldValues.end(), 0. ) - 1.0 ) < 1e-6); // sum of rates equals 1 ? 
+  return newValues; 
+}
diff --git a/src/proposals/param-proposers/DirichletProposer.hpp b/src/proposals/param-proposers/DirichletProposer.hpp
new file mode 100644
index 0000000..7a5f375
--- /dev/null
+++ b/src/proposals/param-proposers/DirichletProposer.hpp
@@ -0,0 +1,35 @@
+#ifndef DIRICHLETPROPOSAL_H
+#define DIRICHLETPROPOSAL_H
+
+#include "AbstractProposer.hpp"
+#include "RateHelper.hpp"
+
+class DirichletProposer : public AbstractProposer
+{				
+public: 
+  /** 
+      @brief constructs a dirichlet proposal
+      
+      @param minMaxIsRelative
+      indicates whether the previous two boundary arguments are
+      relative to a value (e.g., revmat) or whether they sum up to 1.
+   */ 
+  DirichletProposer( double minVal, double maxVal, bool minMaxIsRelative); 
+
+  DirichletProposer(const DirichletProposer& rhs)  = default; 
+  //   : AbstractProposer(rhs)
+  // {
+  //   minMaxIsRelative = rhs.minMaxIsRelative; 
+  // }
+
+  virtual ~DirichletProposer(){}
+  virtual std::vector<double> proposeValues(std::vector<double> oldValues, double parameter, Randomness &rand, log_double &hastings); 
+  virtual AbstractProposer* clone() const  {return new DirichletProposer(*this);  }
+
+private: 
+  bool minMaxIsRelative;
+
+  RateHelper _rateHelper; 
+}; 
+
+#endif
diff --git a/src/proposals/param-proposers/MultiplierProposer.cpp b/src/proposals/param-proposers/MultiplierProposer.cpp
new file mode 100644
index 0000000..708bfa1
--- /dev/null
+++ b/src/proposals/param-proposers/MultiplierProposer.cpp
@@ -0,0 +1,28 @@
+#include "MultiplierProposer.hpp"
+
+
+MultiplierProposer::MultiplierProposer(double minVal, double maxVal)
+  : AbstractProposer{true, true, minVal, maxVal}
+{
+}
+
+
+std::vector<double> MultiplierProposer::proposeValues(std::vector<double> oldValues, double parameter, Randomness &rand, log_double &hastings)
+{    
+  double newVal = 0,  multiplier = 0; 
+
+  auto position = rand.drawIntegerOpen( oldValues.size() ); 
+  multiplier =  rand.drawMultiplier( parameter);     
+  newVal = oldValues[position] * multiplier; 
+
+  // TODO allowed? 
+  if(newVal < _minVal)
+    newVal = _minVal; 
+  else if(_maxVal < newVal)
+    newVal = _maxVal; 
+
+  hastings *= log_double::fromAbs(multiplier);
+
+  oldValues[position] = newVal; 
+  return oldValues;
+}
diff --git a/src/proposals/param-proposers/MultiplierProposer.hpp b/src/proposals/param-proposers/MultiplierProposer.hpp
new file mode 100644
index 0000000..dea19ec
--- /dev/null
+++ b/src/proposals/param-proposers/MultiplierProposer.hpp
@@ -0,0 +1,20 @@
+#ifndef MULTIPLIERPROPOSAL_H
+#define MULTIPLIERPROPOSAL_H
+
+#include "AbstractProposer.hpp"
+
+////////////////
+// MULTIPLIER //
+////////////////
+class MultiplierProposer : public AbstractProposer
+{
+public: 
+  MultiplierProposer(double minVal, double maxVal); 
+  
+  MultiplierProposer(const MultiplierProposer& rhs): AbstractProposer(rhs) {}
+
+  virtual AbstractProposer* clone() const  {return new MultiplierProposer(*this);  }
+  virtual std::vector<double> proposeValues(std::vector<double> oldValues, double parameter, Randomness &rand, log_double &hastings); 
+}; 
+
+#endif
diff --git a/src/proposals/param-proposers/README.txt b/src/proposals/param-proposers/README.txt
new file mode 100644
index 0000000..8ee211e
--- /dev/null
+++ b/src/proposals/param-proposers/README.txt
@@ -0,0 +1,2 @@
+This module contains classes that implement proposers, that is
+abstract type of proposals such as a sliding window proposal.
diff --git a/src/proposals/param-proposers/RateDirichletProposer.cpp b/src/proposals/param-proposers/RateDirichletProposer.cpp
new file mode 100644
index 0000000..dfef11f
--- /dev/null
+++ b/src/proposals/param-proposers/RateDirichletProposer.cpp
@@ -0,0 +1,95 @@
+#include "RateDirichletProposer.hpp"
+#include "BoundsChecker.hpp"
+#include "AminoAcidAlphabet.hpp"
+
+RateDirichletProposer::RateDirichletProposer(double minValI, double maxValI)
+  : AbstractProposer{true,false, minValI, maxValI}
+  , _rateHelper{}
+{
+}
+
+
+// RateDirichletProposer::RateDirichletProposer(const RateDirichletProposer& rhs)
+//   : AbstractProposer(rhs)
+// {
+  
+// }
+
+// OUTPUT: 
+// allNewRates: all rates summing up to 1, the newly proposed, but corrected values
+// newRates : all new rates, summing up to 1 and after corection 
+std::tuple<std::vector<double>, std::vector<double> > RateDirichletProposer::correctValues(nat whichFreq, nat numFreq, std::vector<double> newRates, std::vector<double> allNewValues)
+{
+  _rateHelper.insertRates(whichFreq ,numFreq, allNewValues, newRates); 
+
+  _rateHelper.convertRelativeToLast(allNewValues);
+  BoundsChecker::correctRevMat(allNewValues);
+  _rateHelper.convertToSum1(allNewValues);
+
+  newRates = _rateHelper.extractSomeRates(whichFreq, numFreq, allNewValues);
+
+  _rateHelper.convertToSum1(newRates);  
+  return std::make_tuple(newRates, allNewValues);
+}
+
+
+
+std::vector<double> RateDirichletProposer::proposeValues(std::vector<double> allOldValues, double parameter, Randomness &rand, log_double &hastings) 
+{
+  // tout << std::setprecision(6) ; 
+  // tout << "\n" << std::endl; 
+
+  static const nat numFreq =  20 ; 
+
+  // this is hard-coded for amino acids currently 
+  assert(allOldValues.size() == ( numFreq * numFreq - numFreq )  / 2 ); 
+
+  // choose a reference rate 
+  auto whichFreq = rand.drawIntegerOpen(numFreq);
+
+  // tout << "FREQ: " << whichFreq << std::endl; ; 
+  // tout << "allRates: "  << allOldValues << std::endl; 
+
+  // extract subst rates for one freq
+  auto ratesForFreq = _rateHelper.extractSomeRates(whichFreq, numFreq, allOldValues);
+  assert(ratesForFreq.size()  == numFreq -1 ); 
+  
+  // tout << "theseRates: " << ratesForFreq << std::endl; 
+
+  auto oldSumOfPart = _rateHelper.convertToSum1(ratesForFreq);
+  auto alphasOld = _rateHelper.getScaledValues(ratesForFreq, parameter); 
+
+  // draw new
+  auto newRatesForFreq = rand.drawRandDirichlet(alphasOld);
+  
+  // scale the rates s.t. they fit back into the original matrix
+  _rateHelper.convertToGivenSum(newRatesForFreq, oldSumOfPart);
+
+  // tout << "proposed: "<< newRatesForFreq << std::endl; 
+  
+  // create the full set of rates we could propose 
+  auto allNewValues = std::vector<double> {}; 
+  std::tie(newRatesForFreq, allNewValues) = correctValues(whichFreq, numFreq, newRatesForFreq, allOldValues);
+
+  // tout << "correcPart: "  << newRatesForFreq << std::endl; 
+  // tout << "allNewCorr: "  << allNewValues << std::endl;  
+
+  auto forP = Density::lnDirichlet(newRatesForFreq,alphasOld); 
+  
+  // scale new 
+  auto alphasNew =  _rateHelper.getScaledValues(newRatesForFreq, parameter); 
+  auto backP = Density::lnDirichlet(ratesForFreq, alphasNew); 
+
+  // AbstractProposal::updateHastingsLog(hastings, backP - forP, "dirichletPartial");
+  hastings *= backP / forP;
+
+  // tout << "hastings=" << backP - forP << std::endl; 
+
+  return  allNewValues; 
+}
+
+
+AbstractProposer* RateDirichletProposer::clone() const 
+{
+  return new RateDirichletProposer(*this);
+}
diff --git a/src/proposals/param-proposers/RateDirichletProposer.hpp b/src/proposals/param-proposers/RateDirichletProposer.hpp
new file mode 100644
index 0000000..09e9aa8
--- /dev/null
+++ b/src/proposals/param-proposers/RateDirichletProposer.hpp
@@ -0,0 +1,24 @@
+#ifndef _PARTIAL_DIRICHLET_HPP 
+#define _PARTIAL_DIRICHLET_HPP 
+
+#include "AbstractProposer.hpp"
+#include "RateHelper.hpp"
+
+
+class RateDirichletProposer :  public AbstractProposer
+{
+public: 
+  RateDirichletProposer(double minValI, double maxValI);
+  RateDirichletProposer(const RateDirichletProposer& rhs) = default; 
+
+  virtual std::vector<double> proposeValues(std::vector<double> oldValues, double parameter, Randomness &rand, log_double &hastings) ; 
+  virtual AbstractProposer* clone() const ; 
+
+private: 			// METHODS
+  std::tuple<std::vector<double>, std::vector<double> > correctValues(nat whichFreq, nat numFreq, std::vector<double> newRates, std::vector<double> allNewValues); 
+
+private: 			// ATTRIBUTES
+  RateHelper _rateHelper; 
+}; 
+
+#endif
diff --git a/src/proposals/param-proposers/RateSlidingProposer.cpp b/src/proposals/param-proposers/RateSlidingProposer.cpp
new file mode 100644
index 0000000..0fda00e
--- /dev/null
+++ b/src/proposals/param-proposers/RateSlidingProposer.cpp
@@ -0,0 +1,38 @@
+#include "RateSlidingProposer.hpp" 
+
+
+
+RateSlidingProposer::RateSlidingProposer(double minValI, double maxValI)
+  : AbstractProposer(true, true, minValI, maxValI)
+{
+}
+
+
+
+RateSlidingProposer::RateSlidingProposer(const RateSlidingProposer &rhs)
+  : AbstractProposer(rhs)
+{
+}
+
+
+std::vector<double> RateSlidingProposer::proposeValues(std::vector<double> allOldValues, double parameter, Randomness &rand, log_double &hastings) 
+{
+  static const nat numFreq = 20; // meh
+  assert(allOldValues.size() == (numFreq * numFreq - numFreq) / 2); 
+  
+
+  // TODO implement. There are quite some problems with the slider here. 
+
+  // choose a reference rate 
+  // auto whichFreq = rand.drawIntegerOpen(numFreq);
+
+  // convertRelativeToLast(allOldValues); 
+  
+  // find upper and lower bound 
+  
+  
+  
+  assert(0); 
+  
+  return {}; 
+} 
diff --git a/src/proposals/param-proposers/RateSlidingProposer.hpp b/src/proposals/param-proposers/RateSlidingProposer.hpp
new file mode 100644
index 0000000..6977e2b
--- /dev/null
+++ b/src/proposals/param-proposers/RateSlidingProposer.hpp
@@ -0,0 +1,22 @@
+#ifndef RATES_LIDINGP_ROPOSER_HPP
+#define RATES_LIDINGP_ROPOSER_HPP
+
+#include "AbstractProposer.hpp"
+
+
+class RateSlidingProposer : public AbstractProposer
+{
+public: 
+  RateSlidingProposer(double minValI, double maxValI); 
+  RateSlidingProposer(const RateSlidingProposer &rhs); 
+
+  virtual std::vector<double> proposeValues(std::vector<double> oldValues, double parameter, Randomness &rand, log_double &hastings) ; 
+  virtual AbstractProposer* clone() const { return new RateSlidingProposer(*this) ; } 
+
+
+}; 
+
+
+
+
+#endif
diff --git a/src/proposals/param-proposers/SlidingProposer.cpp b/src/proposals/param-proposers/SlidingProposer.cpp
new file mode 100644
index 0000000..cae04fe
--- /dev/null
+++ b/src/proposals/param-proposers/SlidingProposer.cpp
@@ -0,0 +1,115 @@
+#include "SlidingProposer.hpp"
+#include "RateHelper.hpp"
+#include "BoundsChecker.hpp"
+#include <numeric>
+
+SlidingProposer::SlidingProposer(double minVal, double maxVal, bool _minMaxIsRelative)
+  : AbstractProposer{true, true, minVal, maxVal}
+  , minMaxIsRelative{_minMaxIsRelative}
+{
+}
+
+
+double SlidingProposer::proposeOneValue(double oldVal, double parameter, Randomness &rand, log_double &hastings)
+{
+  double newVal = rand.drawFromSlidingWindow(oldVal, parameter);
+  if(newVal < 0 )
+    newVal = - newVal ; 
+
+  // todo currently only asserting, that it is not used 
+  assert(0);
+  return newVal; 
+} 
+
+
+std::vector<double> SlidingProposer::proposeRelativeMany(std::vector<double> oldValues, double parameter, Randomness &rand, log_double &hastings)
+{
+
+#if 1
+
+  auto posA = rand.drawIntegerOpen(oldValues.size()) ; 
+  auto posB = rand.drawIntegerOpen(oldValues.size()-1); 
+  if(posA == posB)
+    posB = oldValues.size() - 1 ; 
+
+  
+  // tout << "proposing " << posA << " and " << posB << std::endl ; 
+  
+  auto &rateA = oldValues.at(posA); 
+  auto &rateB = oldValues.at(posB); 
+  double sum = rateA + rateB; 
+
+  // tout << MAX_SCI_PRECISION << "oldVals="  << rateA << "," << rateB  << "\t"; 
+  
+  double oldProb = rateA / (sum); 
+  double newProb = rand.drawFromSlidingWindow(oldProb, parameter) ; 
+  
+  // tout << "new prob= " << newProb << std::endl; 
+
+  if(newProb <= 0)
+    newProb = - newProb; 
+  else if(1 <= newProb )
+    newProb = newProb-1; 
+
+  // tout << "new prob after correct= " << newProb << std::endl; 
+  
+  assert(0. < newProb && newProb < 1. ); 
+
+  rateA = newProb *   sum ; 
+  rateB = (1-newProb) * sum ; 
+
+  // tout << "newVals=" << rateA << ","  << rateB << std::endl; 
+  // assert((rateA + rateB) -  sum < 1e-6); 
+
+#else 
+
+  nat posA = rand.drawIntegerOpen(oldValues.size()); 
+  auto &rate = oldValues.at(posA)  ; 
+  double newVal = rand.drawFromSlidingWindow(rate, parameter) ; 
+
+  if(newVal <= 0)
+    newVal = - newVal; 
+  else if(1 <= newVal )
+    newVal = newVal-1; 
+  
+  rate = newVal; 
+  
+  RateHelper::convertToSum1(oldValues); 
+
+#endif
+
+  // check if contracts are met  
+  if(minMaxIsRelative)
+    {
+      RateHelper::convertRelativeToLast(oldValues); 
+      BoundsChecker::correctRevMat(oldValues); 
+      RateHelper::convertToSum1(oldValues); 
+    }
+  else 
+    {
+      // sum may not be one 
+      RateHelper::convertToSum1(oldValues) ; 
+      correctAbsoluteRates(oldValues);
+      RateHelper::convertToSum1(oldValues) ; 
+    }
+
+  if( fabs( std::accumulate(oldValues.begin(), oldValues.end(), 0.) - 1.0 ) > 1e-6 )
+    {
+      std::cerr << "Danger: while proposing values,  sum was " << std::accumulate(oldValues.begin(), oldValues.end(), 0.) << ". values: "   << oldValues  << std::endl; 
+      assert(0); 
+    }
+
+  return oldValues; 
+}
+
+
+
+std::vector<double> SlidingProposer::proposeValues(std::vector<double> oldValues, double parameter, Randomness &rand, log_double &hastings)
+{
+  if(oldValues.size() == 1 )
+    return {proposeOneValue(oldValues[0], parameter,rand, hastings)}; 
+  else
+    return proposeRelativeMany(oldValues, parameter, rand, hastings);
+}
+
+
diff --git a/src/proposals/param-proposers/SlidingProposer.hpp b/src/proposals/param-proposers/SlidingProposer.hpp
new file mode 100644
index 0000000..363c88d
--- /dev/null
+++ b/src/proposals/param-proposers/SlidingProposer.hpp
@@ -0,0 +1,33 @@
+#ifndef SLIDINGPROPOSAL
+#define SLIDINGPROPOSAL
+
+#include "AbstractProposer.hpp"
+
+
+class SlidingProposer : public AbstractProposer
+{
+public: 
+  SlidingProposer(double minVal, double maxVal, bool minMaxIsRelative); 
+  virtual ~SlidingProposer(){}
+
+  SlidingProposer(const SlidingProposer &rhs) 
+    : AbstractProposer(rhs)
+    , minMaxIsRelative(rhs.minMaxIsRelative)
+  {
+  }
+
+  double proposeOneValue(double oldVal, double parameter, Randomness &rand, log_double &hastings); 
+
+  std::vector<double> proposeRelativeMany(std::vector<double> oldValues, double parameter, Randomness &rand, log_double &hastings); 
+
+
+  virtual std::vector<double> proposeValues(std::vector<double> oldValues, double parameter, Randomness &rand, log_double &hastings); 
+
+  virtual AbstractProposer* clone() const  {return new SlidingProposer(*this);  }
+
+
+private: 
+  bool minMaxIsRelative ; 
+}; 
+
+#endif
diff --git a/src/proposals/topo-proposers/ExtendedSprProposer.cpp b/src/proposals/topo-proposers/ExtendedSprProposer.cpp
new file mode 100644
index 0000000..5822ebf
--- /dev/null
+++ b/src/proposals/topo-proposers/ExtendedSprProposer.cpp
@@ -0,0 +1,129 @@
+#include "ExtendedSprProposer.hpp"
+#include "Path.hpp"
+#include "TreeRandomizer.hpp"
+#include "SprMove.hpp"
+
+ExtendedSprProposer::ExtendedSprProposer(double stopProb )
+  : _stopProb{stopProb}
+  , _move{}
+{
+  assert(0. < _stopProb && _stopProb < 1.0 ); 
+}
+
+
+// this is bad legacy code ... 
+void ExtendedSprProposer::determineMove(TreeAln &traln, LikelihoodEvaluator &eval, Randomness& rand, BranchPlain primeBranch, const std::vector<AbstractParameter*> &params) 
+{
+  auto modifiedPath = Path{}; 
+
+  assert(modifiedPath.size( ) == 0 ); 
+
+  auto start = primeBranch; 
+  auto p = traln.findNodePtr(start) ; 
+  auto q = p->next->back; 
+  auto r = p->next->next->back; 
+
+  auto lengthR = traln.getBranch(r, params); 
+  auto lengthQ = traln.getBranch(q, params); 
+  traln.clipNode(q,r);
+  // auto newBranch = lengthR; 
+  // newBranch.setSecNode(q->number); 
+
+  auto newBranch = BranchLengths(BranchPlain(  lengthR.getPrimNode(), q->number), lengthR.getLengths() ); 
+  traln.setBranch(newBranch, params); 
+
+  p->next->back = p->next->next->back = (nodeptr)NULL; 
+
+  modifiedPath.append(start); 
+  modifiedPath.append(BranchPlain(q->number, r->number)); 
+
+  nodeptr currentNode = rand.drawRandDouble01() < 0.5  ? q : r; 
+  boolean accepted = PLL_FALSE;   
+  while(not accepted)
+    {  
+      nodeptr n = 
+	rand.drawRandDouble01()  < 0.5 
+	? currentNode->next->back
+	: currentNode->next->next->back; 
+
+      modifiedPath.pushToStackIfNovel(BranchPlain(currentNode->number, n->number),traln); 
+
+      currentNode = n; 
+      
+      accepted = rand.drawRandDouble01() < _stopProb && modifiedPath.size() > 2 ; 	
+    }
+
+  /* undo changes to the tree  */
+  traln.clipNode(p->next,q); 
+
+  newBranch = BranchLengths(BranchPlain(lengthQ.getPrimNode(), p->number), lengthQ.getLengths()); 
+  // newBranch = lengthQ ; 
+  // newBranch.setSecNode(p->number); 
+  traln.setBranch(newBranch, params);
+
+  traln.clipNode(p->next->next,r);   
+  newBranch = BranchLengths(BranchPlain(lengthR.getPrimNode(), p->number), lengthR.getLengths()); 
+  // newBranch = lengthR; 
+  // newBranch.setSecNode(p->number); 
+  traln.setBranch(newBranch, params); 
+  
+  /* now correct  */
+  if( modifiedPath.at(2).hasNode(modifiedPath.at(1).getPrimNode()))    
+    modifiedPath.at(1).setSecNode(p->number); 
+  else if(modifiedPath.at(2).hasNode(modifiedPath.at(1).getSecNode()  ))    
+    modifiedPath.at(1).setPrimNode( p->number); 
+  else 
+    assert(0); 
+
+  /* correct the incorrectly set first branch in the path */
+  modifiedPath.at(0) = traln.getThirdBranch(modifiedPath.at(0), modifiedPath.at(1)); 
+  
+#ifdef DEBUG_ESPR
+  cout << *modifiedPath << endl; 
+#endif
+  
+  modifiedPath.debug_assertPathExists(traln); 
+
+  // TODO in principle, we can throw away the path of this proposal and use the move proposal  
+  // move.
+
+  auto bla = modifiedPath.at(int(modifiedPath.size() - 1)); 
+
+  _move = SprMove(traln,  BranchPlain(p->number, p->back->number), BranchPlain(bla.getPrimNode(), bla.getSecNode()) ); 
+
+  _forwProb = log_double::fromAbs(1.); 
+
+}
+ 
+TopoMoveProposer* ExtendedSprProposer::clone() const
+{
+  return new ExtendedSprProposer(*this);  
+}
+
+
+BranchPlain ExtendedSprProposer::determinePrimeBranch(const TreeAln &traln, Randomness& rand) const
+{
+  auto  start = BranchPlain(); 
+  nodeptr p,q,r; 
+  do 
+    {
+      start = TreeRandomizer::drawBranchWithInnerNode(traln, rand); 
+      
+      p = traln.findNodePtr(start );
+      q = p->next->back; 
+      r = p->next->next->back;
+    } while(traln.isTipNode(q) && traln.isTipNode(r) ); 
+  return start; 
+}
+
+
+std::unique_ptr<TopoMove> ExtendedSprProposer::getMove() const   
+{
+  return std::unique_ptr<TopoMove>(_move.clone()); 
+} 
+
+
+void ExtendedSprProposer::determineBackProb(TreeAln &traln, LikelihoodEvaluator &eval, const std::vector<AbstractParameter*> &params) 
+{ 
+  _backProb = log_double::fromAbs(1.); 
+}
diff --git a/src/proposals/topo-proposers/ExtendedSprProposer.hpp b/src/proposals/topo-proposers/ExtendedSprProposer.hpp
new file mode 100644
index 0000000..3b8953c
--- /dev/null
+++ b/src/proposals/topo-proposers/ExtendedSprProposer.hpp
@@ -0,0 +1,21 @@
+#include "TopoMoveProposer.hpp"
+
+#include "SprMove.hpp"
+
+class ExtendedSprProposer : public TopoMoveProposer
+{
+public: 			// inherited methods 
+  virtual void determineMove(TreeAln &traln, LikelihoodEvaluator &eval, Randomness& rand, BranchPlain primeBranch, const std::vector<AbstractParameter*> &params) ; 
+  virtual TopoMoveProposer* clone() const; 
+  virtual BranchPlain determinePrimeBranch(const TreeAln &traln, Randomness& rand) const; 
+  virtual void determineBackProb (TreeAln &traln, LikelihoodEvaluator &eval, const std::vector<AbstractParameter*> &params) ;
+  virtual std::unique_ptr<TopoMove> getMove() const   ; 
+
+  virtual void printParams(std::ostream &out)  const { out << ";stopProb=" << _stopProb  ;} 
+public: 			// methods 
+  ExtendedSprProposer(double stopProb );
+
+private: 
+  double _stopProb; 
+  SprMove _move; 
+}; 
diff --git a/src/proposals/topo-proposers/ExtendedTbrProposer.cpp b/src/proposals/topo-proposers/ExtendedTbrProposer.cpp
new file mode 100644
index 0000000..79bfbd5
--- /dev/null
+++ b/src/proposals/topo-proposers/ExtendedTbrProposer.cpp
@@ -0,0 +1,148 @@
+#include "ExtendedTbrProposer.hpp" 
+
+#include "Path.hpp"
+#include "TreeRandomizer.hpp"
+
+#include "TbrMove.hpp"
+
+
+void ExtendedTbrProposer::buildPath(Path &path, BranchPlain bisectedBranch, TreeAln &traln, Randomness &rand, std::vector<AbstractParameter*> params ) const 
+{
+  double stopProb = _stopProb; 
+
+  nodeptr p= traln.findNodePtr(bisectedBranch ); 
+  path.clear();
+
+  nodeptr pn = p->next->back,
+    pnn = p->next->next->back; 
+  
+  
+  auto pnBranch = traln.getBranch(pn, params),
+    pnnBranch = traln.getBranch(pnn, params);
+
+  // prune  
+  traln.clipNodeDefault(pn, pnn); 
+  p->next->next->back = p->next->back = NULL; 
+
+  path.append(bisectedBranch);
+  path.append(BranchPlain(pn->number, pnn->number)); 
+  nodeptr currentNode = rand.drawRandDouble01() < 0.5  ? pn : pnn;
+  bool accepted = false; 
+  while(not accepted )
+    {
+      nodeptr n = 
+	rand.drawRandDouble01()  < 0.5 
+	? currentNode->next->back
+	: currentNode->next->next->back; 
+
+      path.pushToStackIfNovel(BranchPlain(currentNode->number, n->number),traln); 
+      currentNode = n;       
+      accepted = rand.drawRandDouble01() < stopProb && path.size() > 2 ; 
+    }
+
+  // reset
+  traln.clipNode(p->next, pn); 
+  traln.setBranch(pnBranch, params);
+  traln.clipNode(p->next->next, pnn); 
+  traln.setBranch(pnnBranch, params);
+
+  // a correction is necessary 
+  if(path.at(2).hasNode(path.at(1).getPrimNode() ))
+    path.at(1).setSecNode(p->number); 
+  else if (path.at(2).hasNode(path.at(1).getSecNode() ))
+    path.at(1).setPrimNode(p->number); 
+  else 
+    assert(0); 
+
+  // for reasons of resetting the first branch in the path must be
+  // identifyable later
+  path.at(0) = traln.getThirdBranch(bisectedBranch, path.at(1)); 
+}
+
+
+void ExtendedTbrProposer::determineMove(TreeAln &traln, LikelihoodEvaluator &eval, Randomness& rand, BranchPlain primeBranch, const std::vector<AbstractParameter*> &params) 
+{
+  auto modifiedPath1 = Path{}; 
+  auto modifiedPath2 = Path{}; 
+
+  auto bisectedBranch = primeBranch; 
+
+  // determine, if a true TBR move can be executed
+  auto canMove = [&](const BranchPlain &b) -> bool 
+    { 
+      if(traln.isTipNode(b.getPrimNode()))
+	return false; 
+      else 
+	{
+	  auto desc = traln.getDescendents(b) ; 
+	  return not(traln.isTipBranch(desc.first) && traln.isTipBranch(desc.second)) ; 
+	}
+    }; 
+  auto oneMovable = canMove(bisectedBranch);
+  auto otherMovable = canMove(bisectedBranch.getInverted()); 
+
+  auto descOne = BranchPlain{}; 
+  if(oneMovable)
+    {
+      buildPath(modifiedPath1, bisectedBranch, traln, rand, params); 
+      descOne = modifiedPath1.at( int(modifiedPath1.size() -1) ); 
+    }
+
+  auto descOther = BranchPlain{}; 
+  if(otherMovable)
+    {
+      
+      buildPath(modifiedPath2, bisectedBranch.getInverted(), traln, rand, params); 
+      descOther = modifiedPath2.at(int(modifiedPath2.size()-1)); 
+    }
+
+  _forwProb = log_double::fromAbs(1.);
+  _move = TbrMove(traln, bisectedBranch, descOne, descOther) ; 
+}
+
+
+TopoMoveProposer* ExtendedTbrProposer::clone() const 
+{
+  return new ExtendedTbrProposer(*this);
+}
+
+BranchPlain ExtendedTbrProposer::determinePrimeBranch(const TreeAln &traln, Randomness& rand) const
+{
+  auto canMove = [&](const BranchPlain &b) -> bool 
+    { 
+      auto result = traln.isTipBranch(b); 
+      if( not result)
+  	{
+  	  auto desc = traln.getDescendents(b) ; 
+  	  result = not(traln.isTipBranch(desc.first) && traln.isTipBranch(desc.second) ); 
+  	  // tout << b << " with children " << std::get<0>(desc) << "," << std::get<1>(desc)<< std::endl ; 
+  	}
+      return result; 
+    }; 
+
+  auto bisectedBranch = BranchPlain{}; 
+  auto movableA = bool{false}; 
+  auto movableB = bool{false}; 
+
+  while(not ( movableA || movableB ) )
+    {
+      bisectedBranch = TreeRandomizer::drawBranchWithInnerNode(traln,rand); 
+      movableA = canMove(bisectedBranch); 
+      movableB = canMove(bisectedBranch.getInverted()); 
+    }
+
+  return bisectedBranch; 
+}
+
+
+
+std::unique_ptr<TopoMove> ExtendedTbrProposer::getMove() const   
+{
+  return std::unique_ptr<TopoMove>(_move.clone()); 
+} 
+
+
+void ExtendedTbrProposer::determineBackProb(TreeAln &traln, LikelihoodEvaluator &eval, const std::vector<AbstractParameter*> &params)
+{
+  _backProb = log_double::fromAbs(1.); 
+} 
diff --git a/src/proposals/topo-proposers/ExtendedTbrProposer.hpp b/src/proposals/topo-proposers/ExtendedTbrProposer.hpp
new file mode 100644
index 0000000..595d112
--- /dev/null
+++ b/src/proposals/topo-proposers/ExtendedTbrProposer.hpp
@@ -0,0 +1,37 @@
+#ifndef _EXTENDED_TBR_DETERMINER_HPP
+#define _EXTENDED_TBR_DETERMINER_HPP
+
+#include "TbrMove.hpp"
+#include "TopoMoveProposer.hpp"
+
+class Path;
+
+class ExtendedTbrProposer : public TopoMoveProposer
+{
+
+public:				// INHERITED METHODS 
+  virtual void determineMove(TreeAln &traln, LikelihoodEvaluator &eval, Randomness& rand, BranchPlain primeBranch, const std::vector<AbstractParameter*> &params)  ; 
+  virtual TopoMoveProposer* clone() const ; 
+  virtual BranchPlain determinePrimeBranch(const TreeAln &traln, Randomness& rand) const ; 
+  virtual void determineBackProb(TreeAln &traln, LikelihoodEvaluator &eval, const std::vector<AbstractParameter*> &params); 
+  std::unique_ptr<TopoMove> getMove() const   ; 
+
+  virtual void printParams(std::ostream &out)  const { out << ";stopProb=" << _stopProb  ;} 
+
+public: 			// METHODS 
+  ExtendedTbrProposer(double stopProb )
+    : _stopProb{stopProb}
+    , _move{}
+  {}
+  
+private: 			// METHODS
+  void buildPath(Path &path, BranchPlain bisectedBranch, TreeAln &traln, Randomness &rand, std::vector<AbstractParameter*> params ) const; 
+
+private: 			// ATTRIBUTES
+  double _stopProb; 
+  TbrMove _move; 
+}; 
+
+
+
+#endif
diff --git a/src/proposals/topo-proposers/LikelihoodSprProposer.cpp b/src/proposals/topo-proposers/LikelihoodSprProposer.cpp
new file mode 100644
index 0000000..bcbdcf5
--- /dev/null
+++ b/src/proposals/topo-proposers/LikelihoodSprProposer.cpp
@@ -0,0 +1,206 @@
+#include "LikelihoodSprProposer.hpp"
+#include "TreeRandomizer.hpp"
+#include "MoveEnumeration.hpp"
+#include "BranchSetProposer.hpp"
+
+using std::get; 
+
+double LikehoodSprProposer::weightEps = 1e-100; 
+
+#define MAX_ITER 10 
+
+
+LikehoodSprProposer::LikehoodSprProposer(nat maxStep, double likeWarp, MoveOptMode toOpt)
+  : _maxStep{maxStep}
+  , _likeWarp{likeWarp}
+  , _move{}
+  , _moveOptMode{toOpt}
+{
+  this->_withOptimizedBranches = true; 
+}
+
+  
+void LikehoodSprProposer::determineMove(TreeAln &traln, LikelihoodEvaluator &eval, Randomness& rand, BranchPlain primeBranch, const std::vector<AbstractParameter*> &params)  
+{
+  auto prunedTree = primeBranch; 
+
+  // tout << SHOW(prunedTree) << std::endl; 
+  auto insertions = computeLikelihoodsOfInsertions(traln,eval, prunedTree, params);
+  insertions = transformLikelihoods(insertions);
+
+  auto myR = rand.drawRandDouble01(); 
+
+  auto choice = []( const std::vector<InsertionResult>& ins, double r ) -> InsertionResult
+    {
+      for(auto &v : ins)
+	{
+	  r -= v.getInsertionProb().toAbs(); 
+	  if(r <= 0 )
+	    return v; 
+	}
+
+      assert(0); 
+      return ins.at(0); 
+    }; 
+  
+  auto chosen = choice(insertions, myR); 
+  
+  _move = SprMove(traln, prunedTree, chosen.getBranch() ); 
+  _forwProb = chosen.getInsertionProb();
+  _optBranches = chosen.getOptParams();
+}
+
+
+void LikehoodSprProposer::determineBackProb(TreeAln &traln, LikelihoodEvaluator& eval, const std::vector<AbstractParameter*> &params) 
+{
+  // tout << "\nBACK\n" << std::endl; 
+
+  auto prunedTree = _move.getEvalBranch(traln); 
+
+  auto insertsForRevMove = computeLikelihoodsOfInsertions(traln, eval, prunedTree, params); 
+  insertsForRevMove = transformLikelihoods(insertsForRevMove); 
+
+  auto invMove = _move.getInverseMove(); 
+  auto backBranch =  invMove.getInsertBranch(); 
+  
+  // find the correct element for the reverse move
+  auto backInsertIter = std::find_if(begin(insertsForRevMove), end(insertsForRevMove),
+				     [&]( const InsertionResult& elem) 
+				     { 
+				       // return elem.getBranch().equalsUndirected(backBranch); 
+				       return elem.getBranch() == backBranch 
+				       ||  elem.getBranch() == backBranch.getInverted(); 
+				     }); 
+  assert(backInsertIter != end(insertsForRevMove)); 
+  
+  _backProb = backInsertIter->getInsertionProb(); 
+}
+
+
+BranchPlain LikehoodSprProposer::determinePrimeBranch(const TreeAln &traln, Randomness& rand) const 
+{
+  auto prunedTree = BranchPlain();
+  nodeptr p, pn, pnn;  
+  do 
+    {
+      prunedTree  = TreeRandomizer::drawBranchWithInnerNode(traln,rand); 
+      p = traln.findNodePtr(prunedTree);
+      pn = p->next->back; 
+      pnn = p->next->next->back;         
+
+    } while( (traln.isTipNode(pn) &&  traln.isTipNode(pnn)) ); 
+
+  return prunedTree; 
+}
+ 
+
+TopoMoveProposer* LikehoodSprProposer::clone() const 
+{
+  return new LikehoodSprProposer(*this); 
+}
+
+
+std::unique_ptr<TopoMove> LikehoodSprProposer::getMove() const  
+{
+  return std::unique_ptr<TopoMove>(_move.clone()); 
+}
+
+ 
+std::vector<InsertionResult>  
+LikehoodSprProposer::computeLikelihoodsOfInsertions(TreeAln &traln, LikelihoodEvaluator &eval, const BranchPlain& prunedTree, const std::vector<AbstractParameter*> &params)  
+{
+  auto result = std::vector<InsertionResult>  {}; 
+
+  auto moves = MoveEnumeration::getMovesFromDepthFirstSearch(traln, prunedTree, int(_maxStep)); 
+
+  auto prevMove = SprMove();
+
+  for(auto move : moves )
+    {
+      move.apply(traln, params);
+      auto branches = move.getInverse()->getBranchesToPropose(traln, _moveOptMode); 
+
+      if(_moveOptMode == MoveOptMode::NONE || _moveOptMode == MoveOptMode::ONLY_SWITCHING) 
+	{
+	  auto setdiff = move.getDirtyWrtPrevious(prevMove)	  ; 
+	  // tout << "SET-DIFF: " << SHOW(move) << SHOW(prevMove) << SHOW(setdiff)<< std::endl; 
+	  for(auto n : setdiff ) 
+	    eval.invalidateArray(traln,n);
+	  eval.invalidateArray(traln, prunedTree.getPrimNode());
+	}
+      else 
+	{
+	  move.invalidateArrays(eval, traln, _moveOptMode); 
+	}
+
+      if(branches.size() == 0 )
+	{
+	  eval.evaluate(traln, prunedTree, false);
+	  auto lnl = traln.getLikelihood(); 
+	  result.emplace_back(move.getInsertBranch(), lnl);
+	  // tout <<  SHOW(lnl) << std::endl; 
+	}
+      else 
+	{
+	  auto backup = BranchBackup(traln, branches, params);
+	  auto bsp = BranchSetProposer(traln, branches, params);
+	  bsp.findJointOptimum(eval, MAX_ITER, true);
+
+	  auto mappedOptParams = bsp.getResult(); 
+	  auto optParams = std::vector<OptimizedParameter>{}; 
+	  for(auto elem : mappedOptParams)
+	    optParams.insert(end(optParams), begin(elem.second), end(elem.second)); 
+
+	  result.emplace_back(move.getInsertBranch(), bsp.getOptimalLikelihood(), optParams );
+	  backup.resetFromBackup(traln); 
+	}
+
+      auto inv = move.getInverse(); 
+      inv->apply(traln,params); 
+
+      if(not (_moveOptMode == MoveOptMode::NONE || _moveOptMode == MoveOptMode::ONLY_SWITCHING))
+	inv->invalidateArrays(eval, traln, _moveOptMode);       
+
+      prevMove = move; 
+    }
+
+  prevMove.invalidateArrays(eval,traln, _moveOptMode); 
+
+  return result; 
+}
+
+
+
+std::vector<InsertionResult>  
+LikehoodSprProposer::transformLikelihoods(std::vector< InsertionResult > result ) const 
+{
+  auto maxElem = std::max_element(begin(result), end(result), [](const InsertionResult& a, const InsertionResult &b){ return  a.getInsertionProb() < b.getInsertionProb()  ;   });
+  auto maximum = maxElem->getInsertionProb();
+  // tout << SHOW(maximum) << std::endl; 
+
+  auto sum = 0.;
+  for(auto &v : result)
+    {
+      auto val = v.getInsertionProb();
+      val /= maximum; 
+      val = exponentiate(val, _likeWarp);
+      auto abs = val.toAbs() + weightEps; 
+      v.setInsertionProb(log_double::fromAbs(abs));
+      sum += abs; 
+    }
+
+  auto lsum = log_double::fromAbs(sum);
+  for(auto &v : result)
+    v.setInsertionProb(v.getInsertionProb()  / lsum); 
+
+#ifdef PRINT_LIKESPR_INFO
+  tout << "================================================================" << std::endl; 
+  tout << "likelihoods: " << std::endl; 
+  for(auto &pair : result)
+    tout << "DIFF " << pair.getBranch() << "\t" <<  MAX_SCI_PRECISION << pair.getInsertionProb()  << "\t" << SOME_FIXED_PRECISION << pair.getInsertionProb() << std::endl; 
+#endif
+  
+  return result; 
+}
+
+
diff --git a/src/proposals/topo-proposers/LikelihoodSprProposer.hpp b/src/proposals/topo-proposers/LikelihoodSprProposer.hpp
new file mode 100644
index 0000000..0cb2b96
--- /dev/null
+++ b/src/proposals/topo-proposers/LikelihoodSprProposer.hpp
@@ -0,0 +1,39 @@
+#ifndef LIKELIHOODSPRPROPOSER_H
+#define LIKELIHOODSPRPROPOSER_H
+
+#include "TopoMoveProposer.hpp"
+#include "SprMove.hpp"
+#include "BranchBackup.hpp"
+
+
+class LikehoodSprProposer  : public  TopoMoveProposer
+{
+public: 			// INHERITED 
+  virtual void determineMove(TreeAln &traln, LikelihoodEvaluator &eval, Randomness& rand, BranchPlain primeBranch, const std::vector<AbstractParameter*> &params)  ; 
+  virtual void determineBackProb(TreeAln &traln, LikelihoodEvaluator &eval, const std::vector<AbstractParameter*> &params) ; 
+  virtual BranchPlain determinePrimeBranch(const TreeAln &traln, Randomness& rand) const ; 
+  virtual TopoMoveProposer* clone() const ; 
+  virtual std::unique_ptr<TopoMove> getMove() const  ; 
+
+  virtual void printParams(std::ostream &out)  const { out << ";radius=" << _maxStep << ",warp=" << _likeWarp ;} 
+
+public:
+  LikehoodSprProposer(nat maxStep, double likeWarp, MoveOptMode toOpt); 
+  virtual ~LikehoodSprProposer(){}
+
+private:			// METHODS 
+  std::vector<InsertionResult> computeLikelihoodsOfInsertions(TreeAln &traln, LikelihoodEvaluator &eval, const BranchPlain& prunedTree, const std::vector<AbstractParameter*> &params)  ; 
+  std::vector<InsertionResult> transformLikelihoods(std::vector< InsertionResult > result ) const ; 
+
+
+private: 			// ATTRIBUTES 
+  nat _maxStep; 
+  double _likeWarp; 
+  SprMove _move; 
+  MoveOptMode _moveOptMode; 
+  
+  static double weightEps; 
+};
+
+
+#endif /* LIKELIHOODSPRPROPOSER_H */
diff --git a/src/proposals/topo-proposers/MoveOptMode.cpp b/src/proposals/topo-proposers/MoveOptMode.cpp
new file mode 100644
index 0000000..ae1360c
--- /dev/null
+++ b/src/proposals/topo-proposers/MoveOptMode.cpp
@@ -0,0 +1,29 @@
+#include "MoveOptMode.hpp"
+
+#include <iostream>
+#include <cassert>
+
+std::ostream& operator<<(std::ostream& s, const MoveOptMode& c) 
+{
+  switch(c)
+    {
+    case MoveOptMode::NONE : 
+      s << "NONE" ; 
+      break; 
+    case MoveOptMode::ONLY_SWITCHING: 
+      s << "ONLY_SWITCHING" ; 
+      break; 
+    case MoveOptMode::ALL_INTERNAL: 
+      s << "ALL_INTERNAL" ; 
+      break; 
+    case MoveOptMode::ALL_IN_MOVE: 
+      s << "ALL_IN_MOVE" ; 
+      break; 
+    case MoveOptMode::ALL_SURROUNDING  : 
+      s << "ALL_SURROUNDING" ; 
+      break; 
+    default : 
+      assert(0); 
+    }
+  return s;
+}
diff --git a/src/proposals/topo-proposers/MoveOptMode.hpp b/src/proposals/topo-proposers/MoveOptMode.hpp
new file mode 100644
index 0000000..5d7641b
--- /dev/null
+++ b/src/proposals/topo-proposers/MoveOptMode.hpp
@@ -0,0 +1,18 @@
+#ifndef MOVEOPTMODE_H
+#define MOVEOPTMODE_H
+
+#include <iosfwd>
+
+enum class MoveOptMode : int 
+{
+  NONE = 0 , 
+    ONLY_SWITCHING = 1, 
+    ALL_INTERNAL = 2, 
+    ALL_IN_MOVE = 3, 
+    ALL_SURROUNDING = 4  
+    }; 	 
+
+std::ostream& operator<<(std::ostream& s, const MoveOptMode& c) ;
+
+#endif /* MOVEOPTMODE_H */
+
diff --git a/src/proposals/topo-proposers/ParsSprProposer.cpp b/src/proposals/topo-proposers/ParsSprProposer.cpp
new file mode 100644
index 0000000..0b90466
--- /dev/null
+++ b/src/proposals/topo-proposers/ParsSprProposer.cpp
@@ -0,0 +1,247 @@
+#include "ParsSprProposer.hpp"
+
+#include "Randomness.hpp"
+#include "TreeRandomizer.hpp"
+
+#include "SprMove.hpp"
+
+double ParsSprProposer::weightEps = 1e-100; 
+
+
+ParsSprProposer::ParsSprProposer(double parsWarp, int depth, Communicator& comm )
+  : _parsWarp{parsWarp}
+  , _depth{depth}
+  , _pEval{}
+  , _comm(comm)
+  , _computedInsertions{}
+  , _move{}
+{
+}
+
+
+
+// this is legacy code, could be implemented in a nicer way...
+
+static double state2factor(nat states)
+{
+  static double typicalBL = 0.05; 
+  return log((1.0/states) - exp(-(states/(states-1) * typicalBL)) / states);
+}
+
+
+std::array<double,2> ParsSprProposer::factors = 
+  {
+    {
+      state2factor(4),		// DNA
+      state2factor(20)		// AA
+    }
+  }; 
+
+
+ParsSprProposer::branch2parsScore
+ParsSprProposer::determineScoresOfInsertions(TreeAln& traln, BranchPlain prunedTree  )  
+{
+  auto result = branch2parsScore{}; 
+
+  nodeptr
+    p = traln.findNodePtr(prunedTree), 
+    pn = p->next->back , 
+    pnn = p->next->next->back ; 
+
+  // prune the subtree 
+  traln.clipNode( pn, pnn); 
+  p->next->back = p->next->next->back = NULL; 
+
+  // fetch all parsimony scores   
+  if(not traln.isTipNode(pn)) 
+    {
+      testInsertParsimony(traln, pn->next->back, p, result, _depth);
+      testInsertParsimony(traln, pn->next->next->back, p, result, _depth); 
+    }
+  if(not traln.isTipNode(pnn))
+    {
+      testInsertParsimony(traln, pnn->next->back,p, result, _depth); 
+      testInsertParsimony(traln, pnn->next->next->back,p, result, _depth); 
+    }
+
+  traln.clipNode( p->next, pn ); 
+  traln.clipNode( p->next->next, pnn); 
+
+  return result; 
+}
+
+
+
+void ParsSprProposer::testInsertParsimony(TreeAln &traln, nodeptr insertPos, nodeptr prunedTree, branch2parsScore &result, int curDepth)  
+{
+  if(curDepth == 0 )
+    return; 
+  --curDepth; 
+
+  nodeptr insertBack =  insertPos->back;   
+  traln.clipNode(insertPos, prunedTree->next);
+  traln.clipNode( insertBack, prunedTree->next->next); 
+  
+  auto b = BranchPlain(insertPos->number, insertBack->number); 
+
+  if(_computedInsertions.size() > 0 && _computedInsertions.find(b) != _computedInsertions.end()) 
+    {
+      result[b] = _computedInsertions.at(b); 
+    }
+  else 
+    {
+      ParsimonyEvaluator::disorientNode(prunedTree); 
+      result[b] =  _pEval.evaluate(traln, prunedTree, false  ); 
+    }
+
+  traln.clipNode(insertPos, insertBack); 
+  prunedTree->next->back = prunedTree->next->next->back = NULL; 
+
+  // recursively descend 
+  if(not traln.isTipNode(insertPos))
+    {
+      testInsertParsimony(traln, insertPos->next->back, prunedTree, result, curDepth); 
+      testInsertParsimony(traln, insertPos->next->next->back, prunedTree, result, curDepth); 
+    }
+}
+
+void ParsSprProposer::determineMove(TreeAln &traln, LikelihoodEvaluator &eval, Randomness& rand, BranchPlain primeBranch, const std::vector<AbstractParameter*> &params)  
+{
+  // auto result = new SprMove{}; 
+  auto blParams = params; 
+  auto prunedTree = primeBranch; 
+
+  _pEval = ParsimonyEvaluator{} ; 
+
+  _pEval.evaluate(traln, traln.findNodePtr(prunedTree), true );
+
+  // decide upon an spr move 
+  _computedInsertions = branch2parsScore {}; 
+  auto forwInsertions  = determineScoresOfInsertions(traln, prunedTree);
+  auto weightedInsertions = getWeights(traln, forwInsertions); 
+
+  auto r = rand.drawRandDouble01(); 
+  auto chosen = std::pair<BranchPlain,double>{}; 
+  for(auto &v : weightedInsertions)
+    {
+      if(r < v.second)
+	{
+	  chosen = v; 
+	  break; 
+	}
+      else 
+	r -= v.second; 
+    }
+
+  // determine the branch, we pruned from 
+  auto desc = traln.getDescendents(prunedTree);
+  auto prunedFromBranch = BranchPlain{std::get<0>(desc).getSecNode() , std::get<1>(desc).getSecNode()}; 
+
+  // important: save the move 
+  _move = SprMove(traln, prunedTree,chosen.first );
+  _forwProb = log_double::fromAbs(std::get<1>(chosen));
+} 
+
+
+void ParsSprProposer::determineBackProb( TreeAln &traln, LikelihoodEvaluator &eval, const std::vector<AbstractParameter*> &params )
+{
+  // assumes the move has alread been applied!!! 
+
+  auto prunedTree = _move.getEvalBranch(traln); 
+  auto prunedFromBranch = _move.getInverseMove().getInsertBranch();
+
+  ParsimonyEvaluator::disorientNode( traln.findNodePtr(prunedTree)); 
+  _pEval.evaluateSubtree(traln, traln.findNodePtr(prunedTree));
+
+  auto backScores = determineScoresOfInsertions(traln, prunedTree); 
+  auto weightedInsertionsBack = getWeights(traln, backScores); 
+  
+  assert(weightedInsertionsBack.find(prunedFromBranch) != end(weightedInsertionsBack)); 
+
+  // RESULT 
+  _backProb = log_double::fromAbs(weightedInsertionsBack[prunedFromBranch]); 
+} 
+
+TopoMoveProposer* ParsSprProposer::clone() const  
+{
+  return new ParsSprProposer(*this); 
+}
+
+
+BranchPlain ParsSprProposer::determinePrimeBranch(const TreeAln &traln, Randomness& rand) const 
+{
+  auto prunedTree = BranchPlain();
+  nodeptr p, pn, pnn;  
+  do 
+    {
+      prunedTree  = TreeRandomizer::drawBranchWithInnerNode(traln,rand); 
+      p = traln.findNodePtr(prunedTree);
+      pn = p->next->back; 
+      pnn = p->next->next->back;         
+
+    } while( (traln.isTipNode(pn) &&  traln.isTipNode(pnn))     ); 
+
+  return prunedTree; 
+} 
+
+
+
+ParsSprProposer::weightMap ParsSprProposer::getWeights(const TreeAln& traln, branch2parsScore insertions)   
+{
+  auto result = weightMap{}; 
+  double minWeight = std::numeric_limits<double>::max(); 
+
+  auto data = std::vector<parsimonyNumber>{}; 
+  data.reserve(insertions.size()  * 2 );
+  for(auto &pair : insertions)
+    {
+      auto &values = std::get<1>(pair); 
+      for(auto& v : values)
+	data.push_back(v);
+    }
+
+  data = _comm.get().allReduce<>(data);
+
+  nat ctr = 0; 
+  for(auto &pair :insertions)
+    {
+      auto &values = std::get<1>(pair); 
+      for(auto &v : values)
+	v = data[ctr++]; 
+    }
+
+  for(auto &elem : insertions)
+    {
+      double score = 0; 
+
+      auto& scoreArray= std::get<1>(elem); 
+      for(nat i = 0 ; i < scoreArray.size() ; ++i)
+	score += - ( factors[i]  * _parsWarp) * scoreArray[i]; 
+
+      if(score < minWeight)
+	minWeight = score; 
+
+      result[std::get<0>(elem)] = score; 
+    }
+
+  // converting back to non-log
+  double sum = 0; 
+  for(auto & elem : result)
+    {
+      double normalizedWeight =exp(minWeight - elem.second)  + weightEps; 
+      sum += normalizedWeight; 
+      elem.second = normalizedWeight; 
+    }
+
+  for(auto &elem : result)
+    std::get<1>(elem) /= sum; 
+
+  return result; 
+}
+
+
+
+std::unique_ptr<TopoMove> ParsSprProposer::getMove() const   
+{
+  return std::unique_ptr<TopoMove>(_move.clone()); 
+} 
diff --git a/src/proposals/topo-proposers/ParsSprProposer.hpp b/src/proposals/topo-proposers/ParsSprProposer.hpp
new file mode 100644
index 0000000..07ac182
--- /dev/null
+++ b/src/proposals/topo-proposers/ParsSprProposer.hpp
@@ -0,0 +1,62 @@
+#ifndef _PARS_SPR_DETERMINER_HPP
+#define _PARS_SPR_DETERMINER_HPP
+
+#include "TopoMoveProposer.hpp"
+#include "SprMove.hpp"
+#include "ParsimonyEvaluator.hpp"
+#include "Communicator.hpp"
+
+class ParsSprProposer : public  TopoMoveProposer
+{
+  typedef std::unordered_map<BranchPlain, double> weightMap; 
+  typedef std::unordered_map<BranchPlain,std::array<parsimonyNumber,3> > branch2parsScore;
+
+public: 			// INHERITED METHODS
+  virtual void determineMove(TreeAln &traln, LikelihoodEvaluator& eval, Randomness& rand, BranchPlain primeBranch, const std::vector<AbstractParameter*> &params)  ; 
+  virtual TopoMoveProposer* clone() const ; 
+  virtual BranchPlain determinePrimeBranch(const TreeAln &traln, Randomness& rand) const ; 
+  virtual void determineBackProb( TreeAln &traln, LikelihoodEvaluator &eval, const std::vector<AbstractParameter*> &params ); 
+
+  virtual std::unique_ptr<TopoMove> getMove() const ; 
+
+  virtual void printParams(std::ostream &out)  const { out << ";radius=" << _depth << ",warp=" << _parsWarp ;} 
+
+public: 			// METHODS
+  ParsSprProposer(double parsWarp, int depth, Communicator &comm );
+
+  virtual  ~ParsSprProposer() {} 
+  ParsSprProposer(const ParsSprProposer& rhs)
+    : TopoMoveProposer(rhs)
+    , _parsWarp{rhs._parsWarp}
+    , _depth{rhs._depth}
+    , _pEval{rhs._pEval}
+    , _comm{rhs._comm}
+    , _computedInsertions{rhs._computedInsertions}
+    , _move{rhs._move}
+  {
+  }
+
+
+  ParsSprProposer(ParsSprProposer&& rhs) = default; 
+  ParsSprProposer& operator=(const ParsSprProposer &rhs)  = default; 
+  ParsSprProposer& operator=( ParsSprProposer &&rhs)  = default ; 
+  
+private: 			// METHODS 
+  branch2parsScore determineScoresOfInsertions(TreeAln& traln, BranchPlain prunedTree  )  ;
+  void testInsertParsimony(TreeAln &traln, nodeptr insertPos, nodeptr prunedTree, branch2parsScore &result, int curDepth) ; 
+  auto  getWeights(const TreeAln& traln, branch2parsScore insertions)  -> weightMap; 
+
+private: 			// ATTRIBUTES
+  double _parsWarp; 
+  int _depth; 
+  ParsimonyEvaluator _pEval; 
+  std::reference_wrapper<Communicator> _comm; 
+  branch2parsScore _computedInsertions; 
+  SprMove _move; 
+
+  static std::array<double,2> factors; 
+  static double weightEps; 	// mostly a numerical addition
+}; 
+
+
+#endif
diff --git a/src/proposals/topo-proposers/SprMove.cpp b/src/proposals/topo-proposers/SprMove.cpp
new file mode 100644
index 0000000..ae9ba73
--- /dev/null
+++ b/src/proposals/topo-proposers/SprMove.cpp
@@ -0,0 +1,358 @@
+#include <array> 
+#include <algorithm>
+#include <cmath>
+
+// #include "AdHocIntegrator.hpp"
+#include "SprMove.hpp"
+#include "Arithmetics.hpp"
+#include "BoundsChecker.hpp"
+#include "ParallelSetup.hpp"
+#include "BranchLengthOptimizer.hpp"
+
+
+
+
+SprMove::SprMove(const TreeAln &traln, const BranchPlain &prunedTree,  const BranchPlain &insertBranch) 
+  : _path{}
+{
+  nodeptr p = traln.findNodePtr(prunedTree);
+  
+  _path.clear();   
+  _path.findPath(traln, p, traln.findNodePtr(insertBranch));
+  _path.reverse();   
+
+  auto Tmp = _path.at(0); 
+
+  nodeptr aNode = traln.findNodePtr(Tmp); 
+  if(traln.isTipNode(aNode))
+    aNode = traln.findNodePtr(Tmp.getInverted());
+  assert(not traln.isTipNode(aNode)); 
+  auto b = _path.at(0); 
+  while(  (b == _path.at(0) || b.getInverted() == _path.at(0)) 
+ // b.equalsUndirected( )
+	  || // b.equalsUndirected(BranchPlain(p->number, p->back->number))
+	  (b == BranchPlain(p->number, p->back->number) || b.getInverted() == BranchPlain(p->number, p->back->number))
+	  ) 
+    {
+      aNode = aNode->next; 
+      b = BranchPlain(aNode->number, aNode->back->number) ;
+    }
+  _path.reverse();
+  _path.append(b);  
+  _path.reverse();
+}
+
+
+
+
+void SprMove::apply(TreeAln &traln,const std::vector<AbstractParameter*> &params) const
+{
+
+  assert(_path.size() > 2 ); 
+
+  auto third =  traln.getThirdBranch(_path.at(0), _path.at(1)); 
+  nodeptr sTPtr = traln.findNodePtr(third); 
+  assert(_path.at(1).hasNode(sTPtr->number )); 
+  
+  // finds the two nodeptrs adjacent to the subtree  
+  auto prOuterPtr = traln.findNodePtr(BranchPlain(_path.getNthNodeInPath(0) ,_path.getNthNodeInPath(1)) ),
+    prInnerPtr = traln.findNodePtr(BranchPlain(_path.getNthNodeInPath(2), _path.getNthNodeInPath(1)) ); 
+
+  int lastNode = _path.getNthNodeInPath(  int(_path.getNumberOfNodes()-1 ) ),
+    s2LastNode = _path.getNthNodeInPath( int(_path.getNumberOfNodes()-2 ) ); 
+  nodeptr s2lPtr = traln.findNodePtr(BranchPlain(s2LastNode, lastNode) ), // s2l 
+    lPtr = traln.findNodePtr(BranchPlain(lastNode, s2LastNode) ); // l
+
+  nodeptr toBeInserted = prInnerPtr->back;   
+  nodeptr toBeInsertedPath = prOuterPtr->back;  
+
+  assert(toBeInserted->number == sTPtr->number && sTPtr->number == toBeInsertedPath->number); 
+
+  /* prune sTPtr */
+  traln.clipNode(prInnerPtr, prOuterPtr); 		 
+  traln.setBranch(traln.getBranch(prOuterPtr, params), params); 
+  sTPtr->next->back = sTPtr->next->next->back = (nodeptr) NULL; 
+  
+  // and hook up at the reattachment point, mapping the branches 
+  traln.clipNode(toBeInsertedPath, lPtr);
+  traln.setBranch(traln.getBranch(lPtr, params), params);
+
+  traln.clipNode(toBeInserted, s2lPtr); 
+  traln.setBranch(traln.getBranch(toBeInserted, params), params); 
+
+  assert(traln.exists(BranchPlain(sTPtr->number, s2lPtr->number))); 
+  assert(traln.exists(BranchPlain(sTPtr->number, lPtr->number) )); 
+}
+
+
+
+
+/* 
+   this does not assume that the move already has been applied 
+ */ 
+BranchPlain SprMove::getMovingSubtree(const TreeAln &traln) const 
+{
+  return traln.getThirdBranch(_path.at(0), _path.at(1)); 
+}
+
+
+/*
+    we assume that the move already has been applied 
+ */ 
+BranchPlain SprMove::getEvalBranch(const TreeAln &traln) const
+{    
+  auto b = traln.getThirdBranch(_path.at(0), _path.at(1)); 
+  auto lastBranch = _path.at( int(_path.size()-1 )); 
+
+  auto bA = BranchPlain(b.getPrimNode(), lastBranch.getPrimNode()), 
+    bB = BranchPlain(b.getPrimNode(),lastBranch.getSecNode()); 
+
+  assert(traln.exists(bA) && traln.exists(bB)); 
+
+  auto futureRoot = traln.getThirdBranch(bA, bB ); 
+  
+  return futureRoot; 
+}
+
+
+
+
+
+std::ostream& operator<<(std::ostream &out, const SprMove& rhs)
+{
+  return out << rhs._path;   
+} 
+
+
+
+
+
+SprMove SprMove::getInverseMove() const
+{
+  if( _path.size() > 0 )
+    { 
+      auto result = *this; 
+      auto newPath = Path{}; 
+
+      newPath.append(BranchPlain(result._path.getNthNodeInPath(0) , result._path.getNthNodeInPath(2) ));
+      for(nat i = 2; i < result._path.size()-1 ; ++i)
+	newPath.append(result._path.at(i));
+
+      newPath.append(BranchPlain(result._path.getNthNodeInPath(result._path.getNumberOfNodes()-2), 
+				    result._path.getNthNodeInPath(1))); 
+      newPath.append(BranchPlain(result._path.getNthNodeInPath(result._path.getNumberOfNodes()-1), 
+				    result._path.getNthNodeInPath(1))); 
+      newPath.reverse();
+      
+      result._path = newPath; 
+      
+      return result; 
+    }
+  else 
+    return SprMove{}; 
+}
+
+
+std::vector<nat> SprMove::getDirtyNodes() const 
+{
+  auto result = std::vector<nat>{}; 
+  for(auto i = 1u; i < _path.getNumberOfNodes() -1 ; ++i)
+    result.push_back(_path.getNthNodeInPath(i)) ;
+
+  return result; 
+} 
+
+
+template<typename T1,typename T2>
+std::ostream& operator<<(std::ostream& out, const std::pair<T1,T2> &elem)
+{
+  out << elem.first << "," << elem.second ; 
+  return out; 
+}
+
+
+std::unique_ptr<TopoMove> SprMove::getInverse() const 
+{
+  // auto result = new SprMove();
+  // *result = getInverseMove();
+  return std::move(std::unique_ptr<TopoMove>(new SprMove(getInverseMove()))); 
+} 
+
+
+TopoMove* SprMove::clone() const
+{
+  return new SprMove(*this);
+}
+
+
+void SprMove::print(std::ostream& out)  const 
+{
+  out << *this; 
+} 
+
+
+
+// 0: only the "inner branches of the move"(1 for NNI, 2 for SPR-2 )
+std::unordered_set<BranchPlain> SprMove::getBranchesByDistance(const TreeAln &traln, nat dist) const 
+{
+  auto result = std::unordered_set<BranchPlain>{}; 
+  if(dist == 0)
+    {
+      for(nat i = 1; i < _path.size() -1 ; ++i)
+	result.insert(_path.at(i));
+    }
+  else 
+    {
+      auto prevBranches = getBranchesByDistance(traln, dist-1); 
+      
+      auto additionalBranches = std::unordered_set<BranchPlain>{}; 
+
+      for(auto &v : prevBranches)
+	{
+	  if(not traln.isTipNode( v.getPrimNode()))
+	    {
+	      auto desc = traln.getDescendents(v); 
+	      additionalBranches.insert(desc.first);
+	      additionalBranches.insert(desc.second);
+	    }
+	  
+	  auto vI = v.getInverted();
+	  if( not traln.isTipNode( vI.getPrimNode()) )
+	    {
+	      auto desc =  traln.getDescendents(vI);
+	      additionalBranches.insert(desc.first); 
+	      additionalBranches.insert(desc.second); 
+	    }
+	}
+
+      
+      result = prevBranches; 
+      result.insert(begin(additionalBranches), end(additionalBranches)); 
+    }
+  
+  return result; 
+}
+
+
+
+
+
+
+std::vector<BranchPlain> SprMove::getBranchesToPropose(const TreeAln& traln, MoveOptMode mode )
+{
+  auto result = std::vector<BranchPlain>{}; 
+
+  if( _path.size() == 0)
+    return result; 
+
+  switch(mode)
+    {
+    case MoveOptMode::ALL_SURROUNDING:
+      {
+	result.push_back(_path.at(0)); 
+	for(auto i = 1u; i < _path.size(); ++i)
+	  {
+	    result.push_back(_path.at(i)); 
+	    result.push_back(traln.getThirdBranch(_path.at(i-1), _path.at(i))); 
+	  }
+      }
+      break; 
+    case MoveOptMode::ALL_INTERNAL: 
+      for(nat i = 1; i < _path.size()-1 ; ++i)
+	result.push_back( _path.at(i));
+      break; 
+    case MoveOptMode::ONLY_SWITCHING: 
+      result.push_back(_path.at(1)); 
+      break; 
+    case MoveOptMode::NONE: 
+      break; 
+    case MoveOptMode::ALL_IN_MOVE: 
+      for (nat i = 0; i < _path.size(); ++i) 
+	result.push_back(_path.at(i)); 
+      break; 
+    default: 
+      assert(0); 
+    }
+
+  for(auto &elem : result )
+    assert(traln.exists(elem)); 
+    
+  assert(std::unordered_set<BranchPlain>(begin(result), end(result)).size() == result.size() ); 
+  return result; 
+}
+
+
+
+
+std::vector<nat> SprMove::getNodeList() const 
+{
+  auto result = std::vector<nat>{}; 
+  for(nat i = 0; i <_path.size() + 1 ; ++i )
+    result.push_back(_path.getNthNodeInPath(i));
+  return result; 
+}
+
+
+void SprMove::invalidateArrays(LikelihoodEvaluator& eval,  TreeAln& traln, MoveOptMode mode)  const 
+{
+  for(auto n : getDirtyNodes())
+    eval.invalidateArray(traln, n); 
+} 
+
+
+
+
+static bool isSubset(const std::vector<nat> &listA, const std::vector<nat> &listB)
+{
+  auto len = std::min(listB.size(), listA.size()); 
+  for(nat i = 0; i < len; ++i)
+    {
+      auto res = (listA[i] == listB[i]) ; 
+      if (not res  )
+	return false; 
+    }
+
+  return true; 
+}
+
+
+
+std::vector<nat> SprMove::getDirtyWrtPrevious(const SprMove &rhs) const 
+{
+  // damn, this is inefficient here....dont have more time ...
+
+  auto result = std::vector<nat>{}; 
+  auto hisDirty =  rhs.getDirtyNodes(); 
+  auto myDirty =  getDirtyNodes();
+
+  auto aIter = begin(hisDirty); 
+  auto bIter = begin(myDirty); 
+
+  // tout << SHOW(hisDirty)<< SHOW(myDirty) << std::endl; 
+  
+  auto lastCommon = -1; 
+  while(aIter != end(hisDirty) && bIter != end(myDirty) && *aIter == *bIter)  
+    {
+      lastCommon = *aIter; 
+      ++aIter;
+      ++bIter; 
+    }
+
+  while(aIter != end(hisDirty))
+    {
+      result.push_back(*aIter);
+      ++aIter; 
+    }
+  while(bIter != end(myDirty))
+    {
+      result.push_back(*bIter); 
+      ++bIter; 
+    }
+
+  // tout << SHOW(lastCommon)<< std::endl; 
+
+  if(lastCommon != -1 && not isSubset(rhs.getNodeList() , getNodeList()) ) // that would be a descent 
+    result.push_back(lastCommon ) ; 
+  
+  return result; 
+}
diff --git a/src/proposals/topo-proposers/SprMove.hpp b/src/proposals/topo-proposers/SprMove.hpp
new file mode 100644
index 0000000..118d6e4
--- /dev/null
+++ b/src/proposals/topo-proposers/SprMove.hpp
@@ -0,0 +1,58 @@
+/** 
+    @brief a helper object making the code concerning a SPR move
+    re-usable.
+ */ 
+
+
+#ifndef _SPR_MOVE_H
+#define _SPR_MOVE_H
+
+#include "Path.hpp"
+
+#include "TreeTraverser.hpp"
+#include <unordered_set> 
+
+#include "TopoMove.hpp"
+
+class PriorBelief; 
+class LikelihoodEvaluator; 
+
+class SprMove : public TopoMove
+{
+public : 			// INHERITED 
+  virtual void apply(TreeAln &traln, const std::vector<AbstractParameter*> &blParams) const; 
+  virtual BranchPlain getEvalBranch(const TreeAln &traln) const; 
+  virtual std::unique_ptr<TopoMove> getInverse() const ; 
+  virtual TopoMove* clone() const ; 
+  virtual void print(std::ostream& out) const ; 
+  virtual std::vector<BranchPlain> getBranchesToPropose(const TreeAln& traln, MoveOptMode mode ); 
+  virtual int getNniDistance() const  { return std::max(int(_path.size() ) - 2,0) ; }
+  virtual std::vector<nat> getDirtyNodes() const ; 
+
+  virtual void invalidateArrays(LikelihoodEvaluator& eval,  TreeAln& traln, MoveOptMode mode)  const ; 
+
+public: 
+  explicit SprMove()
+    : _path{}
+  {}
+  virtual ~SprMove(){}
+  SprMove(const TreeAln &traln, const BranchPlain &prunedTree,  const BranchPlain &insertBranch);
+
+  std::vector<nat> getDirtyWrtPrevious(const SprMove &rhs) const ; 
+
+  BranchPlain getMovingSubtree(const TreeAln &traln) const ; 
+  
+  std::vector<nat> getNodeList() const ; 
+
+  SprMove getInverseMove() const ; 
+  BranchPlain getInsertBranch() const { return _path.at(int(_path.size())-1); }
+
+  std::unordered_set<BranchPlain> getBranchesByDistance(const TreeAln &traln, nat dist) const ; 
+
+  friend std::ostream& operator<<(std::ostream &out, const SprMove& rhs); 
+
+private: 			// ATTRIBUTES
+  Path _path; 
+}; 
+
+#endif
diff --git a/src/proposals/topo-proposers/StatNniProposer.cpp b/src/proposals/topo-proposers/StatNniProposer.cpp
new file mode 100644
index 0000000..5705d48
--- /dev/null
+++ b/src/proposals/topo-proposers/StatNniProposer.cpp
@@ -0,0 +1,40 @@
+#include "StatNniProposer.hpp"
+#include "TreeRandomizer.hpp"
+#include "SprMove.hpp"
+
+void StatNniProposer::determineMove(TreeAln &traln, LikelihoodEvaluator &eval, Randomness& rand, BranchPlain primeBranch, const std::vector<AbstractParameter*> &params) 
+{
+  auto b = traln.getBranch( primeBranch, params); 
+  nodeptr p = traln.findNodePtr(b); 
+  auto switchingBranch = BranchPlain( rand.drawRandDouble01() < 0.5  
+				      ? p->back->next->back->number
+				      : p->back->next->next->back->number, 
+				      p->back->number ); 
+  
+  _move = SprMove(traln, b, switchingBranch); 
+  _forwProb = log_double::fromAbs(1.); 
+} 
+
+
+TopoMoveProposer* StatNniProposer::clone() const  
+{
+  return new StatNniProposer(*this);
+}
+
+
+BranchPlain StatNniProposer::determinePrimeBranch(const TreeAln &traln, Randomness& rand) const 
+{
+  return TreeRandomizer::drawInnerBranchUniform(traln, rand);   
+} 
+
+
+std::unique_ptr<TopoMove> StatNniProposer::getMove() const   
+{
+  return std::unique_ptr<TopoMove>(_move.clone()); 
+} 
+
+
+void StatNniProposer::determineBackProb(TreeAln &traln, LikelihoodEvaluator &eval, const std::vector<AbstractParameter*> &params) 
+{
+  _backProb = log_double::fromAbs(1.);
+} 
diff --git a/src/proposals/topo-proposers/StatNniProposer.hpp b/src/proposals/topo-proposers/StatNniProposer.hpp
new file mode 100644
index 0000000..b8e7a40
--- /dev/null
+++ b/src/proposals/topo-proposers/StatNniProposer.hpp
@@ -0,0 +1,25 @@
+#ifndef _STAT_NNI_HPP_NEW
+#define _STAT_NNI_HPP_NEW
+
+#include "SprMove.hpp"
+
+#include "TopoMoveProposer.hpp"
+
+class StatNniProposer : public TopoMoveProposer
+{
+public: 
+  StatNniProposer() 
+    : _move{}
+  {}
+  
+  virtual void determineMove(TreeAln &traln, LikelihoodEvaluator &eval, Randomness& rand, BranchPlain primeBranch, const std::vector<AbstractParameter*> &params)  ; 
+  virtual TopoMoveProposer* clone() const ; 
+  virtual BranchPlain determinePrimeBranch(const TreeAln &traln, Randomness& rand) const ; 
+  virtual void determineBackProb(TreeAln &traln, LikelihoodEvaluator &eval, const std::vector<AbstractParameter*> &params) ; 
+  std::unique_ptr<TopoMove> getMove() const   ; 
+
+private: 
+  SprMove _move; 
+}; 
+
+#endif
diff --git a/src/proposals/topo-proposers/TbrMove.cpp b/src/proposals/topo-proposers/TbrMove.cpp
new file mode 100644
index 0000000..5828fc1
--- /dev/null
+++ b/src/proposals/topo-proposers/TbrMove.cpp
@@ -0,0 +1,163 @@
+// #include "Branch.hpp"
+#include "TbrMove.hpp"
+#include "Path.hpp"
+
+#include <set>
+
+
+TbrMove::TbrMove(const TreeAln &traln, const BranchPlain &bisected, const BranchPlain& insertA, const BranchPlain& insertB)  
+  : _moveA{}
+  , _moveB{}
+{
+  auto empty = BranchPlain{}; 
+
+  _moveA = 
+    // not insertA.equalsUndirected(empty) 
+    not (insertA == empty || insertA.getInverted() == empty)
+    ? SprMove(traln, bisected,insertA)
+    : SprMove(); 
+  
+  _moveB = 
+    not 
+    // insertB.equalsUndirected(empty) 
+    (insertB == empty || insertB.getInverted() == empty ) 
+    ? SprMove(traln, bisected.getInverted(),insertB)
+    : SprMove();
+}
+
+
+void TbrMove::apply(TreeAln &traln, const std::vector<AbstractParameter*> &blParams) const 
+{
+  assert(_moveA.getNniDistance() > 0 || _moveB.getNniDistance() > 0 ); 
+
+  if( _moveA.getNniDistance() > 0)
+    _moveA.apply(traln, blParams);
+  if( _moveB.getNniDistance() > 0)
+    _moveB.apply(traln,blParams); 
+} 
+
+
+
+TbrMove TbrMove::getInverseMove() const 
+{
+  auto result = *this; 
+
+  result._moveA = result._moveA.getInverseMove();
+  result._moveB = result._moveB.getInverseMove();
+
+  return result; 
+}
+
+BranchPlain TbrMove::getEvalBranch(const TreeAln &traln) const 
+{   
+  auto evalBranch = BranchPlain{}; 
+
+  if( _moveA.getNniDistance() >  0 )
+    evalBranch = _moveA.getEvalBranch(traln);
+  else if( _moveB.getNniDistance() > 0 )
+    evalBranch = _moveB.getEvalBranch(traln);
+  else 
+    assert(0); 
+
+  return evalBranch; 
+}
+
+
+std::ostream& operator<<(std::ostream &out, const TbrMove &rhs) 
+{
+  return out <<  "path1:"  << rhs._moveA << std::endl
+	     << "path2:" << rhs._moveB << std::endl; // 
+}  
+
+
+std::vector<nat> TbrMove::getDirtyNodes() const
+{
+  auto tmp = std::unordered_set<nat>{}; 
+  for(auto val : _moveA.getDirtyNodes())
+    tmp.insert(val); 
+  for(auto val : _moveB.getDirtyNodes())
+    tmp.insert(val); 
+
+  return std::vector<nat>(begin(tmp),end(tmp)); 
+} 
+
+
+
+std::unique_ptr<TopoMove> TbrMove::getInverse() const  
+{
+  return std::unique_ptr<TopoMove>(new TbrMove(getInverseMove()));
+} 
+
+
+TopoMove* TbrMove::clone() const  
+{
+  return new TbrMove(*this); 
+}
+
+ 
+void TbrMove::print(std::ostream& out) const 
+{
+  out << *this; 
+} 
+
+
+std::vector<BranchPlain> TbrMove::getBranchesToPropose(const TreeAln& traln, MoveOptMode mode) 
+{
+  auto result = std::vector<BranchPlain>{}; 
+
+  auto nniA = _moveA.getNniDistance(); 
+  auto nniB = _moveB.getNniDistance(); 
+  auto trueTbr = nniA > 0 && nniB > 0; 
+
+  auto res1 = _moveA.getBranchesToPropose(traln,mode); 
+  auto res2 = _moveB.getBranchesToPropose(traln,mode); 
+  
+  result.insert(end(result), begin(res1), end(res1));
+  result.insert(end(result), begin(res2), end(res2));
+
+
+
+  if(trueTbr)
+    {
+      switch(mode)
+	{
+	case MoveOptMode::ALL_SURROUNDING: 
+	  // the bisected branch has been inserted twice
+	  {
+	    auto tmp = std::unordered_set<BranchPlain>(begin(result), end(result)); 
+	    result = std::vector<BranchPlain>(begin(tmp),end(tmp));
+	  }
+	  break; 
+	case MoveOptMode::ALL_IN_MOVE:
+	case MoveOptMode::ONLY_SWITCHING: 
+	case MoveOptMode::ALL_INTERNAL: 
+	  // also add the bisected branch 
+	  {
+	    auto a = _moveA.getMovingSubtree(traln); 
+	    auto b = _moveB.getMovingSubtree(traln); 
+	    assert( a == b || a.getInverted() == b ); 
+	    result.push_back(b);
+	  }
+	  break; 
+	case MoveOptMode::NONE: 
+	  break; 
+	default :
+	  assert(0); 
+	}
+    }
+
+  for(auto &elem : result )
+    assert(traln.exists(elem)); 
+    
+  assert(std::unordered_set<BranchPlain>(begin(result), end(result)).size() == result.size() ); 
+
+  return result; 
+} 
+
+
+
+void TbrMove::invalidateArrays(LikelihoodEvaluator& eval, TreeAln& traln, MoveOptMode mode)  const 
+{
+  _moveA.invalidateArrays(eval, traln, mode); 
+  _moveB.invalidateArrays(eval, traln, mode); 
+}
diff --git a/src/proposals/topo-proposers/TbrMove.hpp b/src/proposals/topo-proposers/TbrMove.hpp
new file mode 100644
index 0000000..2eb1721
--- /dev/null
+++ b/src/proposals/topo-proposers/TbrMove.hpp
@@ -0,0 +1,40 @@
+#ifndef _TBR_MOVE_H 
+#define _TBR_MOVE_H 
+
+#include "SprMove.hpp"
+
+#include "TopoMove.hpp"
+
+class TbrMove : public TopoMove
+{
+public: 			// INHERITED methods  
+  virtual void apply(TreeAln &traln, const std::vector<AbstractParameter*> &blParams) const ; 
+  virtual ~TbrMove(){}
+  virtual BranchPlain getEvalBranch(const TreeAln &traln) const ; 
+  virtual std::vector<nat> getDirtyNodes() const  ; 
+  virtual std::unique_ptr<TopoMove> getInverse() const  ; 
+  virtual TopoMove* clone() const  ; 
+  virtual void print(std::ostream& out) const ; 
+
+  virtual std::vector<BranchPlain> getBranchesToPropose(const TreeAln& traln, MoveOptMode mode ) ; 
+  
+  virtual int getNniDistance() const { return _moveA.getNniDistance() + _moveB.getNniDistance()  ; }
+  virtual void invalidateArrays(LikelihoodEvaluator& eval, TreeAln& traln, MoveOptMode mode) const ; 
+
+public: 			// methods 
+  explicit TbrMove()  
+    : _moveA{}
+    , _moveB{}
+  {}
+  TbrMove(const TreeAln &traln, const BranchPlain &bisected, const BranchPlain& insertA, const BranchPlain& insertB)  ; 
+
+  TbrMove getInverseMove() const ; 
+
+  friend std::ostream& operator<<(std::ostream &out, const TbrMove &rhs) ;  
+
+private: 			// ATTRIBUTES
+  SprMove _moveA; 
+  SprMove _moveB; 
+}; 
+
+#endif
diff --git a/src/proposals/topo-proposers/TopoMove.cpp b/src/proposals/topo-proposers/TopoMove.cpp
new file mode 100644
index 0000000..b28b04f
--- /dev/null
+++ b/src/proposals/topo-proposers/TopoMove.cpp
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/proposals/topo-proposers/TopoMove.hpp b/src/proposals/topo-proposers/TopoMove.hpp
new file mode 100644
index 0000000..de3e9c6
--- /dev/null
+++ b/src/proposals/topo-proposers/TopoMove.hpp
@@ -0,0 +1,42 @@
+#ifndef _ABSTRACT_MOVE_HPP
+#define _ABSTRACT_MOVE_HPP
+
+#include <vector>
+#include "TreeAln.hpp"
+#include "LikelihoodEvaluator.hpp"
+
+#include "MoveOptMode.hpp"
+
+
+class AbstractParameter; 
+
+class TopoMove 
+{
+public: 
+  virtual ~TopoMove() = 0; 
+
+  virtual void apply(TreeAln &traln, const std::vector<AbstractParameter*> &blParams) const = 0; 
+  virtual BranchPlain getEvalBranch(const TreeAln &traln) const = 0; 
+  virtual std::vector<nat> getDirtyNodes() const = 0 ; 
+  virtual std::unique_ptr<TopoMove> getInverse() const = 0 ; 
+  virtual TopoMove* clone() const = 0 ; 
+  virtual void print(std::ostream& out) const = 0; 
+  
+  virtual int getNniDistance() const = 0; 
+
+  virtual std::vector<BranchPlain> getBranchesToPropose(const TreeAln& traln, MoveOptMode mode ) = 0; 
+  
+  virtual void invalidateArrays(LikelihoodEvaluator& eval,  TreeAln& traln, MoveOptMode mode) const = 0; 
+
+  // common 
+  friend std::ostream& operator<<(std::ostream& out, const TopoMove& elem)
+  {
+    elem.print(out);
+    return out; 
+  } 
+
+}; 
+
+inline TopoMove::~TopoMove() = default; 
+
+#endif
diff --git a/src/proposals/topo-proposers/TopoMoveProposer.hpp b/src/proposals/topo-proposers/TopoMoveProposer.hpp
new file mode 100644
index 0000000..35f2c7f
--- /dev/null
+++ b/src/proposals/topo-proposers/TopoMoveProposer.hpp
@@ -0,0 +1,62 @@
+#ifndef _ABSTRACT_TOPO_MOVE_DRAWER_HPP 
+#define _ABSTRACT_TOPO_MOVE_DRAWER_HPP 
+
+#include <memory> 
+
+#include "TreeAln.hpp"
+#include "log_double.hpp"
+#include "TopoMove.hpp"
+#include "LikelihoodEvaluator.hpp"
+#include "OptimizedParameter.hpp"
+
+
+class Communicator; 
+
+class TopoMoveProposer
+{
+public: 			// INHERITED METHODS  
+  /** 
+      determines the move and a probability of drawing this move     
+   */ 
+  virtual void determineMove(TreeAln &traln, LikelihoodEvaluator &eval, Randomness& rand, BranchPlain primeBranch, const std::vector<AbstractParameter*> &params)  = 0; 
+  /** 
+      only determines the proposal density of the backward move (NOT including any further transformations like branch lengths) 
+   */ 
+  virtual void determineBackProb(TreeAln &traln, LikelihoodEvaluator &eval, const std::vector<AbstractParameter*> &params) = 0; 
+  /**
+     determines the first branch (e.g., subtree that is pruned)
+   */ 
+  virtual BranchPlain determinePrimeBranch(const TreeAln &traln, Randomness& rand) const = 0; 
+  virtual TopoMoveProposer* clone() const = 0; 
+
+  virtual std::unique_ptr<TopoMove> getMove() const  = 0; 
+
+  virtual void printParams(std::ostream &out)  const {} 
+  
+public: 			// METHODS 
+  TopoMoveProposer()
+    : _forwProb{log_double::fromAbs(1.)}
+    , _backProb{log_double::fromAbs(1.)}
+    , _withOptimizedBranches{false}
+    , _optBranches{}
+  {
+  }
+  virtual ~TopoMoveProposer(){}
+  TopoMoveProposer(const TopoMoveProposer& rhs) = default; 
+  TopoMoveProposer(TopoMoveProposer&& rhs) = default ; 
+  TopoMoveProposer& operator=(const TopoMoveProposer &rhs) = default; 
+  TopoMoveProposer& operator=( TopoMoveProposer &&rhs) = default; 
+
+  log_double getProposalDensity() const {return _backProb / _forwProb; }
+  bool hasOptimizedBranches()  const  { return _withOptimizedBranches; } 
+  std::vector<OptimizedParameter> getOptimizedBranches() const { return _optBranches;  } 
+
+protected: 
+  log_double _forwProb; 
+  log_double _backProb; 
+  bool _withOptimizedBranches; 
+  std::vector<OptimizedParameter> _optBranches; 
+}; 
+
+
+#endif
diff --git a/src/system/AlignedAllocator.hpp b/src/system/AlignedAllocator.hpp
new file mode 100644
index 0000000..60b9c5a
--- /dev/null
+++ b/src/system/AlignedAllocator.hpp
@@ -0,0 +1,165 @@
+#ifndef ALIGNED_ALLOCATOR_HPP
+#define ALIGNED_ALLOCATOR_HPP
+
+// modified version from from: 
+// http://stackoverflow.com/questions/12942548/making-stdvector-allocate-aligned-memory
+
+
+#include <stddef.h>
+#include "common.h"
+
+#include "VectAlign.hpp"
+
+
+template <typename T, VectAlign Align = VectAlign::AVX>
+class AlignedAllocator;
+
+
+template <VectAlign Align>
+class AlignedAllocator<void, Align>
+{
+public:
+  typedef void*             pointer;
+  typedef const void*       const_pointer;
+  typedef void              value_type;
+
+  template <class U> struct rebind { typedef AlignedAllocator<U, Align> other; };
+};
+
+
+template <typename T, VectAlign Align>
+class AlignedAllocator
+{
+public:
+  typedef T         value_type;
+  typedef T*        pointer;
+  typedef const T*  const_pointer;
+  typedef T&        reference;
+  typedef const T&  const_reference;
+  typedef size_t    size_type;
+  typedef ptrdiff_t difference_type;
+
+  typedef std::true_type propagate_on_container_move_assignment;
+
+  template <class U>
+  struct rebind { typedef AlignedAllocator<U, Align> other; };
+
+public:
+  AlignedAllocator() noexcept
+  {}
+
+  template <class U>
+  AlignedAllocator(const AlignedAllocator<U, Align>&) noexcept
+  {}
+
+  size_type
+  max_size() const noexcept
+  { return (size_type(~0) - size_type(Align)) / sizeof(T); }
+
+  pointer
+  address(reference x) const noexcept
+  { return std::addressof(x); }
+
+  const_pointer
+  address(const_reference x) const noexcept
+  { return std::addressof(x); }
+
+  pointer
+  allocate(size_type n, typename AlignedAllocator<void, Align>::const_pointer = 0)
+  {
+    void *ptr = aligned_malloc<T, size_t(Align)>(n);
+
+    if (ptr == nullptr) {
+      throw std::bad_alloc();
+    }
+
+    return reinterpret_cast<pointer>(ptr);
+  }
+
+  void
+  deallocate(pointer p, size_type) noexcept
+  { return free(p); }
+
+  template <class U, class ...Args>
+  void
+  construct(U* p, Args&&... args)
+  { ::new(reinterpret_cast<void*>(p)) U(std::forward<Args>(args)...); }
+
+  void
+  destroy(pointer p)
+  { p->~T(); }
+};
+
+
+template <typename T, VectAlign Align>
+class AlignedAllocator<const T, Align>
+{
+public:
+  typedef T         value_type;
+  typedef const T*  pointer;
+  typedef const T*  const_pointer;
+  typedef const T&  reference;
+  typedef const T&  const_reference;
+  typedef size_t    size_type;
+  typedef ptrdiff_t difference_type;
+
+  typedef std::true_type propagate_on_container_move_assignment;
+
+  template <class U>
+  struct rebind { typedef AlignedAllocator<U, Align> other; };
+
+public:
+  AlignedAllocator() noexcept
+  {}
+
+  template <class U>
+  AlignedAllocator(const AlignedAllocator<U, Align>&) noexcept
+  {}
+
+  size_type
+  max_size() const noexcept
+  { return (size_type(~0) - size_type(Align)) / sizeof(T); }
+
+  const_pointer
+  address(const_reference x) const noexcept
+  { return std::addressof(x); }
+
+  pointer
+  allocate(size_type n, typename AlignedAllocator<void, Align>::const_pointer = 0)
+  {
+    void *ptr = aligned_malloc<T, size_t(Align)>(); 
+    if (ptr == nullptr) {
+      throw std::bad_alloc();
+    }
+
+    return reinterpret_cast<pointer>(ptr);
+  }
+
+  void
+  deallocate(pointer p, size_type) noexcept
+  {return free(p); }
+
+  template <class U, class ...Args>
+  void
+  construct(U* p, Args&&... args)
+  { ::new(reinterpret_cast<void*>(p)) U(std::forward<Args>(args)...); }
+
+  void
+  destroy(pointer p)
+  { p->~T(); }
+};
+
+template <typename T, VectAlign TAlign, typename U, VectAlign UAlign>
+inline
+bool
+operator== (const AlignedAllocator<T,TAlign>&, const AlignedAllocator<U, UAlign>&) noexcept
+{ return TAlign == UAlign; }
+
+template <typename T, VectAlign TAlign, typename U, VectAlign UAlign>
+inline
+bool
+operator!= (const AlignedAllocator<T,TAlign>&, const AlignedAllocator<U, UAlign>&) noexcept
+{ return TAlign != UAlign; }
+
+
+#endif
diff --git a/src/system/BandWidthTest.cpp b/src/system/BandWidthTest.cpp
new file mode 100644
index 0000000..75f4a0a
--- /dev/null
+++ b/src/system/BandWidthTest.cpp
@@ -0,0 +1,56 @@
+#include "BandWidthTest.hpp"
+#include "GlobalVariables.hpp"
+
+#include <cassert>
+// #include "time.hpp"
+
+
+nat BandWidthTest::determineOptimum(Communicator& comm, std::string fileName)
+{
+#if 1 
+  // assert(0); 
+  // return 0; 
+  // return 1; 
+#else 
+  auto numNodes = comm.getNumberOfPhysicalNodes();
+
+  auto &&in = std::ifstream(fileName, std::ios::binary); 
+  in.seekg(0, std::ios::end);
+  auto toRead = in.tellg() / 100 ; // read 1% of the file 
+
+  auto bestBw = 0; 
+  uint32_t bestNum = 0; 
+
+  for(auto i = int(numNodes) ; i <= comm.getSize() ; i *= 2 )
+    {
+      auto tp = getTimePoint(); 
+      comm.waitAtBarrier();
+      nat everyNth = comm.getSize() / i;
+      if(comm.getRank() % everyNth == 0)
+	{
+	  auto mySubRank = comm.getRank() / everyNth; 
+	  auto toReadNow = toRead / i ;
+	  auto tmp = std::vector<uint8_t>(toReadNow, '\0'); 
+	  in.seekg(toReadNow * mySubRank, std::ios::beg); 
+	  in.read((char*)tmp.data(), toReadNow * sizeof(uint8_t));
+	}
+      comm.waitAtBarrier();
+      auto dur = getDuration(tp); 
+      auto bw = ((double(toRead) / 1024.) / 1024. ) / dur; 
+      tout << i << " procs: " << bw << " MiB/sec" << std::endl;
+
+      if(bestBw < bw)
+	{
+	  bestBw = bw; 
+	  bestNum = everyNth;  
+	}
+    }
+
+  bestNum = comm.broadcastVar(bestNum); 
+  
+  tout << "best bandwidth was "<< bestBw <<  ". This means that every  " << bestNum << " process should be used for reading." << std::endl; 
+
+  return bestNum;
+#endif
+  return 0; 
+} 
diff --git a/src/system/BandWidthTest.hpp b/src/system/BandWidthTest.hpp
new file mode 100644
index 0000000..450c035
--- /dev/null
+++ b/src/system/BandWidthTest.hpp
@@ -0,0 +1,16 @@
+#ifndef _BAND_WIDTH_TEST
+#define _BAND_WIDTH_TEST
+
+#include "common.h"
+#include "Communicator.hpp"
+
+class BandWidthTest
+{
+public: 
+  nat determineOptimum(Communicator& comm, std::string fileName); 
+  
+
+}; 
+
+
+#endif
diff --git a/src/system/BitMask.cpp b/src/system/BitMask.cpp
new file mode 100644
index 0000000..4ea23b9
--- /dev/null
+++ b/src/system/BitMask.cpp
@@ -0,0 +1,11 @@
+#include "BitMask.hpp"
+
+template<typename T> 
+BitMask<T>::BitMask()
+{
+  _impl[0] = 1; 
+  for(auto i = 1u; i < length; ++i)
+    _impl[i] = _impl[i-1] << 1 ; 
+}
+template BitMask<unsigned int>::BitMask();
+
diff --git a/src/system/BitMask.hpp b/src/system/BitMask.hpp
new file mode 100644
index 0000000..4239022
--- /dev/null
+++ b/src/system/BitMask.hpp
@@ -0,0 +1,21 @@
+#ifndef _BITMASK_HPP
+#define _BITMASK_HPP
+
+#include <stddef.h> 
+
+
+template<typename T> 
+class BitMask
+{
+public: 
+  static size_t constexpr length = sizeof(T) * 8 ; // dont know where size_of_byte define is 
+
+public: 
+  BitMask(); 
+  T operator[](int num ) {return _impl[num]; } 
+private:
+  T _impl[length]; 
+}; 
+
+
+#endif
diff --git a/src/system/BoundsChecker.cpp b/src/system/BoundsChecker.cpp
new file mode 100644
index 0000000..ed5370a
--- /dev/null
+++ b/src/system/BoundsChecker.cpp
@@ -0,0 +1,172 @@
+#include <cmath>
+#include <cassert>
+
+// #include "Branch.hpp"
+
+#include "BoundsChecker.hpp"
+#include "GlobalVariables.hpp"
+
+// here we initialize the max/min values for our various
+// parameters. Static const is essentially like a global variable but
+// saver. You access it with e.g., BoundsChecker::zmin, since the variable
+// does not belong to an instance of the class, but the class in general. 
+
+const double BoundsChecker::zMin = 1.0e-15 ; // 1e-16
+const double BoundsChecker::zMax = (1.0 - 1.0e-6) ; // 1-1e-6
+
+//  these values would be okay according to raxml, but it takes things too far ... 
+const double BoundsChecker::rateMin = 1e-7; 
+const double BoundsChecker::rateMax = 1e6; 
+
+const double BoundsChecker::alphaMin = 2e-2; 
+const double BoundsChecker::alphaMax = 1e3; 
+
+const double BoundsChecker::freqMin = 1e-3;
+
+
+bool BoundsChecker::checkFrequencies( const std::vector<double> &freqs )  
+{
+  static double dirtyThresh = 1e-6; 
+
+  bool result = true; 
+  double sum = 0; 
+  for(auto &f : freqs)    
+    {
+      result &= ( freqMin <= f || fabs(freqMin - f)  <   dirtyThresh) ; 
+      sum += f; 
+    }
+  assert( fabs(sum  - 1.0 ) < 1e-6 ); 
+  return result; 
+}
+
+bool BoundsChecker::checkBranch( const BranchLength &branch) 
+{
+  auto v = branch.getLength().getValue() ; 
+  return BoundsChecker::zMin <= v && v <= BoundsChecker::zMax ; 
+}
+
+bool BoundsChecker::checkBranch( const BranchLengths &branch) 
+{
+  bool okay = true; 
+  for(auto &v : branch.getLengths())
+    {
+      auto val = v.getValue();
+      okay &= BoundsChecker::zMin <= val && val <= BoundsChecker::zMax; 
+    }
+  return okay; 
+}
+
+bool BoundsChecker::checkRevmat( const std::vector<double> &rates) 
+{
+  static double dirtyThresh = 1e-6;
+
+  bool result = true; 
+  for(auto &r : rates)
+    {
+      auto prob =  ( r <= BoundsChecker::rateMax || fabs(BoundsChecker::rateMax - r ) < dirtyThresh ) 
+	&&  ( BoundsChecker::rateMin <= r  || fabs(BoundsChecker::rateMin - r ) < dirtyThresh ) ; 
+      
+      if(not prob)
+      	tout << MAX_SCI_PRECISION << "attention: problem  with " << r << std::endl; 
+      result &=  prob ; 
+    }
+
+  if( std::fabs(rates.back() - 1. )  > std::numeric_limits<double>::epsilon() )
+    {
+      tout << "error: last state was "<< MAX_SCI_PRECISION << rates.back() << std::endl; 
+      assert(0) ;
+    }
+
+  return result; 
+}
+ 
+bool BoundsChecker::checkAlpha( double alpha) 
+{
+  return BoundsChecker::alphaMin <= alpha    && alpha <= BoundsChecker::alphaMax; 
+} 
+
+
+void BoundsChecker::correctAlpha(double &alpha) 
+{
+  if( alpha < BoundsChecker::alphaMin)
+    alpha = BoundsChecker::alphaMin; 
+  if(  BoundsChecker::alphaMax < alpha )
+    alpha = BoundsChecker::alphaMax; 
+}
+
+
+void BoundsChecker::correctBranch( BranchLengths &branch ) 
+{
+  auto lengths = branch.getLengths(); 
+
+  for(auto &length : lengths )
+    {
+      auto val = length.getValue();
+      if(val < BoundsChecker::zMin )
+	length.setValue(BoundsChecker::zMin); 
+      if(BoundsChecker::zMax < val)
+	length.setValue(BoundsChecker::zMax); 
+    }
+
+  branch.setLengths(lengths);   
+} 
+
+
+void BoundsChecker::correctBranch(BranchLength &branch)
+{
+  auto length = branch.getLength(); 
+  if(length.getValue() < BoundsChecker::zMin )
+    length = BoundsChecker::zMin;
+  if(BoundsChecker::zMax < length.getValue())
+    length = BoundsChecker::zMax; 
+  branch.setLength(length);   
+}
+
+
+void BoundsChecker::correctRevMat( std::vector<double> &rates)
+{
+  // because we have to convert the revmat from relative
+  // representation to rate representation, this is more tricky.
+
+  // note: rates are relative to last value here 
+
+  for(auto &r : rates )
+    {
+      if( r < BoundsChecker::rateMin)
+	r = BoundsChecker::rateMin; 
+      else if(BoundsChecker::rateMax < r  ) 
+	r = BoundsChecker::rateMax; 
+    }  
+}
+ 
+void BoundsChecker::correctFrequencies( std::vector<double> &frequencies)
+{
+  // TODO 
+  assert(0); 
+  // used anywhere? 
+
+  // determine number of freqs that are not okay 
+  int numberOkay = 0; 
+  auto  sum = double(0);  
+  for(auto &f : frequencies)
+    {
+      if(f < BoundsChecker::freqMin) 
+	f = BoundsChecker::freqMin; 
+      else 
+	  ++numberOkay; 
+    }
+
+  sum = 1. - (static_cast<double>(frequencies.size()) - numberOkay )  * BoundsChecker::freqMin; 
+
+  // renormalize again 
+  for(auto &f : frequencies)
+    if(  std::fabs(f -  BoundsChecker::freqMin) > std::numeric_limits<double>::epsilon() ) 
+	f /= sum; 
+  
+  // check to be sure that they add up to 1 
+  sum = 0 ;
+  for(auto &f : frequencies)
+    sum += f; 
+  assert(fabs(sum - 1.0 ) < 1e-6); 
+} 
+
diff --git a/src/system/BoundsChecker.hpp b/src/system/BoundsChecker.hpp
new file mode 100644
index 0000000..8f2b151
--- /dev/null
+++ b/src/system/BoundsChecker.hpp
@@ -0,0 +1,35 @@
+#ifndef _BOUNDS_CHECKER
+#define _BOUNDS_CHECKER
+
+#include <vector>
+// #include "Branch.hpp"
+#include "BranchLength.hpp"
+#include "BranchLengths.hpp"
+
+
+class BoundsChecker
+{
+public: 
+  static const double zMin, zMax, 
+    rateMax, rateMin, 
+    alphaMin, alphaMax,
+    freqMin; 
+
+  static bool checkFrequencies( const std::vector<double> &freqs )  ; 
+  static bool checkBranch( const BranchLength &branch ) ; 
+  static bool checkBranch( const BranchLengths &branch ) ; 
+  static bool checkRevmat( const std::vector<double> &rates) ; 
+  static bool checkAlpha( double alpha) ; 
+  
+
+  static void correctAlpha(double &alpha) ;   
+  static void correctBranch( BranchLengths &branch ) ; 
+  static void correctBranch(BranchLength &branch); 
+  static void correctRevMat( std::vector<double> &rates); 
+  static void correctFrequencies( std::vector<double> &frequencies); 
+
+}
+ ; 
+
+
+#endif
diff --git a/src/system/ByteFile.cpp b/src/system/ByteFile.cpp
new file mode 100644
index 0000000..08e713b
--- /dev/null
+++ b/src/system/ByteFile.cpp
@@ -0,0 +1,531 @@
+#include "ByteFile.hpp"
+
+#include "Bipartition.hpp"
+#include "PartitionAssignment.hpp"
+
+#include "BandWidthTest.hpp"
+
+#include "ParallelSetup.hpp"
+
+#include <iostream>
+#include <cassert>
+#include <cstring>
+
+#define DIRECT_READ
+
+extern const char inverseMeaningDNA[16]; // TODO remove 
+
+ByteFile::ByteFile(std::string name, bool saveMemory)
+  : _fileName(name)  
+  , _in{_fileName, std::ios::binary}
+  , _taxa{}
+  , _numPat{0}
+  , _partitions{}
+  , _saveMemory{saveMemory}
+  , _weightType{IntegerWidth::BIT_8}
+{
+}
+
+
+
+nat ByteFile::determineOptStride(Communicator &comm)
+{
+  auto t = BandWidthTest(); 
+  auto opt = t.determineOptimum(comm, _fileName);
+  return opt; 
+}
+
+
+template<typename T>
+std::vector<std::vector<T>> ByteFile::readAndDistributeArrays(ParallelSetup& pl, PartitionAssignment& pAss, size_t numberOfArrays)
+{
+  auto result = std::vector<std::vector<T>>(); 
+
+  auto fileStart = _in.tellg();
+  auto numProcPerChain = std::max( ( pl.getGlobalComm().size() / pl.getChainsParallel()) / pl.getRunsParallel(),size_t(1u)); 
+  auto participatingProcs = numProcPerChain * pl.getChainsParallel() * pl.getRunsParallel(); 
+  auto numIter = (numberOfArrays / participatingProcs) +   ( ((numberOfArrays % participatingProcs) == 0 ) ? 0 : 1 ); 
+
+  auto countsPerProc = std::vector<int>{}; 
+  auto displPerProc = std::vector<int>{};
+  std::tie(countsPerProc, displPerProc) = pAss.getCountsAndDispls(pl.getChainComm().size()) ; 
+  
+  auto arrsProcessed = size_t(0u); 
+  for(nat iter = 0; iter < numIter ; ++iter)
+    {
+      auto arraysThisRound = std::min(size_t(participatingProcs), numberOfArrays - iter * participatingProcs);
+      auto arrs = std::vector< std::vector<T> >(arraysThisRound); 
+      auto myArrNum = iter * participatingProcs + pl.getGlobalComm().getRank(); 
+
+      if( nat(pl.getGlobalComm().getRank()) < participatingProcs)
+	{
+	  if( myArrNum < numberOfArrays)
+	    {
+	      _in.seekg( std::streamoff(size_t(fileStart) +  ( _numPat * sizeof(T) ) * myArrNum), std::ios::beg );
+	      arrs[myArrNum - arrsProcessed ] = readArray<T>(_numPat); 
+	    }
+
+	  nat ctr = 0; 
+	  for(auto j = myArrNum % numProcPerChain; j < arraysThisRound ; j += numProcPerChain)
+	    {
+	      if(arrs[j].size() == 0 )
+		arrs[j].resize(_numPat); 
+	      // arrs[j] = pl.getChainLeaderComm().broadcast(arrs[j], ctr); 
+	      ++ctr; 
+	    }
+	}
+
+      auto arrReordereds = std::vector< std::vector<T> >(numberOfArrays); 
+      for(nat i = 0; i < arrs.size() ; ++i)
+	{
+	  if(arrs.at(i).size() > 0 )
+	    {
+	      // std::cout << "reordering array " << i << std::endl; 
+	      auto &arr = arrs[i]; 
+	      auto &arrReordered = arrReordereds[i] ; 
+	      arrReordered.resize(arrs[i].size()); 
+	      auto indexPerProc = displPerProc; 
+
+	      auto ass = pAss.getAssignment(); 
+	      for(auto assignmentPair : ass)
+		{
+		  auto assignment = std::get<1>(assignmentPair); 
+		  auto &partition  = _partitions.at(assignment.partId);
+		  auto beg = partition.getLower() + assignment.offset; 
+		  std::copy(begin(arr) + beg, begin(arr) + beg + assignment.width, begin(arrReordered) + indexPerProc.at(assignment.procNum)); 
+		  indexPerProc[assignment.procNum] += assignment.width; 
+		}
+	      for(nat j = 1; j < indexPerProc.size(); ++j)
+		assert(displPerProc[j] == indexPerProc[j-1]); 
+	      assert( indexPerProc.back() == int(arrReordered.size()) ); 
+	      
+	      arr.clear();
+	      arr.shrink_to_fit();
+	    }
+
+	  auto &&res = pl.getChainComm().scatterVariableKnownLength<T>(arrReordereds[i], countsPerProc, displPerProc, i % int(numProcPerChain)); 
+	  result.push_back(res);
+	}
+      arrsProcessed += arraysThisRound; 
+    }
+
+  return result; 
+}
+template std::vector<std::vector<int32_t>> ByteFile::readAndDistributeArrays(ParallelSetup& pl, PartitionAssignment& pAss, size_t numberOfArrays); 
+template std::vector<std::vector<uint16_t>> ByteFile::readAndDistributeArrays(ParallelSetup& pl, PartitionAssignment& pAss, size_t numberOfArrays); 
+template std::vector<std::vector<uint8_t>> ByteFile::readAndDistributeArrays(ParallelSetup& pl, PartitionAssignment& pAss, size_t numberOfArrays); 
+
+
+std::tuple<int,int> ByteFile::parseHeader(ParallelSetup& pl)
+{
+  auto commBuf = std::vector<int>(3,0); 
+  
+  if(pl.isGlobalMaster())
+    {
+      if(not _in)
+	{
+	  tout << "Error: could not find file: " << _fileName << std::endl; 
+	  exitFunction(-1, false) ; 
+	}
+
+    }
+
+  checkMagicNumber();
+  
+  seek(Position::HEADER); 
+  
+  int numTax = readVar<int>();
+  int numPart = readVar<int>();
+  _numPat = readVar<// decltype(_numPat)
+    int
+		    >();
+  int lenOfWeights = readVar<int>(); 
+
+  _weightType = IntegerWidth(lenOfWeights); 
+
+  return std::make_pair(numTax, numPart); 
+}
+
+
+
+
+void ByteFile::parse(ParallelSetup& pl )
+{
+  auto numTax = int(0); 
+  auto numPart = int(0); 
+  std::tie(numTax, numPart) = parseHeader(pl);
+
+  // must be done here, because of the variable length strings
+  parseTaxa(numTax); 
+  parsePartitions(numPart);
+
+  auto size = pl.getChainComm().size(); 
+  auto pAss = PartitionAssignment(size); 
+  pAss.assign(_partitions);
+
+  switch(_weightType)
+    {    
+    case IntegerWidth::BIT_8: 
+      parseWeights<uint8_t>(pl, pAss);
+      break; 
+    case IntegerWidth::BIT_16: 
+      parseWeights<uint16_t>(pl, pAss);
+      break; 
+    case IntegerWidth::BIT_32: 
+      parseWeights<uint32_t>(pl, pAss);
+      break; 
+    case IntegerWidth::BIT_64: 
+      assert(0); 
+      break; 
+    default:  
+      assert(0); 
+    }
+
+  parseAlnsDirectRead(pl, pAss); 
+}
+
+
+
+void ByteFile::parseAlnsDirect_newLayout(ParallelSetup& pl, PartitionAssignment& pAss )
+{
+  seek(Position::ALIGNMENT); 
+  auto alnPos = _in.tellg();
+
+  // auto pureIo = 0.; 
+  // auto pureReorder = 0.;  
+  // auto pureParsimony = 0.; 
+  // auto pureCommTime = 0.; 
+
+  auto range = pAss.getAssignment().equal_range(pl.getChainComm().getRank()); 
+
+  for(auto iter = range.first; iter != range.second; ++iter )
+    {
+      auto assignment = iter->second; 
+      auto &partition = _partitions.at(assignment.partId); 
+      auto lenOfPat = sizeof(uint8_t) * _taxa.size(); 
+
+      auto pos = alnPos + std::streamoff(lenOfPat *  (partition.getLower() + assignment.offset)); 
+      _in.seekg( pos ); 
+      
+      // auto tp = getTimePoint();
+      auto alnTmp = readArray<uint8_t>(assignment.width * lenOfPat);
+      // pureIo += getDuration(tp); 
+      
+      auto aln = aligned_malloc<uint8_t, size_t(EXA_ALIGN)>(assignment.width * _taxa.size()); 
+
+      // tp = getTimePoint(); 
+      auto numTax =  _taxa.size(); 
+      for(auto j = 0u;  j < assignment.width; ++j)
+	{
+	  auto iter2 = alnTmp.data() + j * numTax; 
+	  for(auto i = 0u; i < numTax; ++i)
+	    aln[ i * assignment.width + j ]  = iter2[i]; 
+        }
+      // pureReorder += getDuration(tp); 
+
+      // parse information about parsimony informativeness; it
+      // probably would be easier to read the entire bit vector
+      // instead of cutting out a part of it =/
+      seek(Position::PARSIMONY); 
+      auto startPos = partition.getLower() + assignment.offset; 
+      auto endPos = startPos + assignment.width; 
+      auto startInt =    startPos   / 32  ; 
+      // auto endInt = endPos / 32; 
+      auto intWidth = assignment.width / 32   ; 
+      bool addAtStart = (startPos  % 32)  != 0; 
+      bool addAtEnd = (endPos % 32) != 0; 
+      if(addAtStart || addAtEnd )
+	++intWidth; 
+      _in.seekg(startInt * sizeof(uint32_t), std::ios::cur);
+
+      auto bv = readArray<uint32_t>(intWidth); 
+      auto bp = Bipartition(); 
+      bp.setRawBip(bv); 
+      
+      auto remainder = startPos % 32; 
+
+      auto parsInfo = std::vector<bool>(assignment.width,true);
+
+      for(auto i = 0u ; i < assignment.width ; ++i)
+	{
+	  if(not bp.isSet(i + remainder ))
+	    parsInfo.at(i) = false; 
+	}
+
+#if 0 
+      partition.setParsimonyInformative(parsInfo); 
+#else 
+
+      // TODO !!!! 
+      // tout << "NOT setting parsimony information read from file "  << std::endl; 
+#endif
+
+      // tp = getTimePoint(); 
+      partition.setAlignment(shared_pod_ptr<uint8_t>(aln), assignment.width); 
+      // pureParsimony += getDuration(tp); 
+    }
+
+  // tout << "===> pure io: " << pureIo << " sec" << std::endl; 
+  // tout << "===> pure reorder: "  << pureReorder << " sec" << std::endl; 
+  // tout << "===> pure pars: " << pureParsimony << " sec" << std::endl; 
+  // tout << "===> pure comm: "<< pureCommTime << " sec" << std::endl; 
+}
+
+
+void ByteFile::parseAlnsDirectRead(ParallelSetup& pl, PartitionAssignment& pAss)
+{
+  seek(Position::ALIGNMENT);
+
+  // auto itime = getTimePoint(); 
+  // double mallocTime = 0; 
+  // double ioTime = 0; 
+
+  auto alnPos = _in.tellg();
+  auto range = pAss.getAssignment().equal_range(pl.getChainComm().getRank()); 
+  for(auto iter = range.first; iter != range.second; ++iter)
+    {
+      auto assignment =  iter->second; 
+      auto &partition = _partitions.at(assignment.partId); 
+      // itime = getTimePoint(); 
+      auto aln = aligned_malloc<uint8_t, size_t(EXA_ALIGN) >(assignment.width * _taxa.size());
+      // mallocTime += getDuration(itime); 
+      
+      nat ctr = 0; 
+      for(nat i = 0; i < _taxa.size(); ++i)
+	{
+	  auto start = size_t(alnPos) + ctr * _numPat +  partition.getLower() + assignment.offset; 
+	  _in.seekg(start);
+	  
+	  // itime = getTimePoint(); 
+	  readArray( assignment.width, aln +   assignment.width * ctr  ); 
+	  // ioTime += getDuration(itime); 
+	  ++ctr; 
+	}
+
+      // tout << aln << std::endl; 
+
+      partition.setAlignment(shared_pod_ptr<uint8_t>(aln), assignment.width); 
+    }
+
+  // tout << "[ "  << getDuration(_initTime) << "] computed parsimony" << std::endl; 
+  // tout << "io-time: " << ioTime << "\tmallocTime" << mallocTime << std::endl; 
+  // _initTime = getTimePoint();
+
+}
+
+
+void ByteFile::parseAlns(ParallelSetup& pl, PartitionAssignment& pAss)
+{
+  seek(Position::ALIGNMENT); 
+  
+  auto myAln = std::vector< std::vector<unsigned char> >(); 
+
+  myAln = readAndDistributeArrays<unsigned char>(pl, pAss ,_taxa.size()); 
+
+  // tout << "[ "  << getDuration(_initTime) << "] distributed alignment" << std::endl; 
+  // _initTime = getTimePoint();
+
+  auto range = pAss.getAssignment().equal_range(pl.getChainComm().getRank()); 
+  nat pos = 0; 
+
+  for(auto iter = range.first ; iter != range.second; ++iter)
+    {
+      auto assignment = iter->second; 
+      auto &partition = _partitions.at(assignment.partId); 
+      auto aln = aligned_malloc<unsigned char, size_t (EXA_ALIGN) >(assignment.width * _taxa.size());
+      
+
+      nat ctr = 0; 
+      for(auto myAlnRow : myAln)
+	{
+	  std::copy(begin(myAlnRow) + pos , begin(myAlnRow) + pos + assignment.width, aln  + ctr * assignment.width );
+	  ++ctr; 
+	}
+
+      pos += assignment.width; 
+      partition.setAlignment(shared_pod_ptr<unsigned char>(aln), assignment.width); 
+    }
+
+  // tout << "[ "  << getDuration(_initTime) << "] computed parsimony" << std::endl; 
+  // _initTime = getTimePoint();
+}
+
+
+
+
+
+
+
+template<typename T> 
+void ByteFile::parseWeights(ParallelSetup& pl, PartitionAssignment &pAss)
+{
+  seek(Position::WEIGHTS ); 
+
+  auto assigns = pAss.getAssignment(); 
+  auto wgtPos = std::streamoff(_in.tellg()); 
+  auto range = assigns.equal_range(pl.getChainComm().getRank() ); 
+
+  for(auto iter = range.first; iter != range.second; ++iter)
+    {
+      auto assignment = iter->second; 
+      auto wgts = aligned_malloc<int, size_t(EXA_ALIGN)>(assignment.width);
+      auto arrForReading = std::vector<T>(assignment.width,0); 
+      auto &partition = _partitions.at(assignment.partId); 
+
+      _in.seekg(wgtPos + ( partition.getLower() + assignment.offset ) * sizeof(T));
+      readArray<T>( assignment.width , arrForReading.data() ); 
+
+      // more efficient copy possible? probably not, since we change the size of the integer 
+
+      for(nat i = 0; i < arrForReading.size(); ++i) 
+	wgts[i] = arrForReading[i]; 
+
+      partition.setWeights(shared_pod_ptr<int>(wgts), assignment.width); 
+    }
+} 
+template void ByteFile::parseWeights<uint32_t>(ParallelSetup& pl, PartitionAssignment &pAss); 
+template void ByteFile::parseWeights<uint16_t>(ParallelSetup& pl, PartitionAssignment &pAss); 
+template void ByteFile::parseWeights<uint8_t>(ParallelSetup& pl, PartitionAssignment &pAss); 
+
+ 
+void ByteFile::parseTaxa(int numTax)
+{
+  seek(Position::TAXA); 
+
+  for(int i = 0; i < numTax; ++i)
+    {
+      // TODO this is one mess with the zero byte ... 
+
+      int len = readVar<int>(); 
+      auto arr = readArray<char>(len-1); 
+      auto str = std::string(begin(arr), end(arr)); 
+      _taxa.push_back(str);
+
+      readVar<char>(); 
+    }
+}
+
+
+void ByteFile::parsePartitions(int numPart)
+{
+  seek(Position::PARTITIONS); 
+
+  // read partition contributions 
+  auto pCont = readArray<double>(numPart); 
+
+  for(int i = 0; i < numPart; ++i)
+    {
+      pInfo p; 
+
+      auto states = readVar<decltype(p.states)>();      
+      auto maxTipStates = readVar<decltype(p.maxTipStates)>(); 
+      auto lower = readVar<decltype(p.lower)> (); 
+      auto upper = readVar<decltype(p.upper)>(); 
+      auto dataType = readVar<decltype(p.dataType)>();
+      auto protModel = readVar<decltype(p.protModels)>(); 
+      auto protFreqs = readVar<decltype(p.protUseEmpiricalFreqs)>(); 
+      auto nonGTR = readVar<decltype(p.nonGTR)>(); 
+      auto len = readVar<int>(); 
+
+      auto arr = readArray<char>(len-1);  
+      auto str =std::string(begin(arr), end(arr)); 
+      readVar<char>(); 
+
+      auto partition =  Partition(nat(_taxa.size()), str, dataType, states, maxTipStates, _saveMemory); 
+
+      partition.setPartitionContribution(pCont.at(i)); 
+      partition.setLower(lower);
+      partition.setUpper(upper);
+      partition.setWidth(0); // width
+      partition.setProtModel(protModel); 
+      partition.setProtFreqs(protFreqs); 
+      partition.setNonGTR(nonGTR); 
+      partition.setDataType(dataType); 
+
+      _partitions.push_back(partition); 
+
+      // tout << "parsed partition " << i << ": " << partition.getLower() << "\t" << partition.getUpper() << "\twidth" << partition.getWidth()  << std::endl; 
+    }
+
+  // tout << "after parsing partitions, pos was "<< _in.tellg() << std::endl;
+}
+
+ 
+void ByteFile::seek(Position pos)
+{
+  pInfo ps; 
+  size_t toSkip = 6; 		// always skip the magic 
+  switch(pos) 
+    {
+    case Position::PARSIMONY: 	// skip alignment 
+      {
+	size_t toSkipHere = _taxa.size() * _numPat * sizeof(uint8_t) ; 
+	toSkip += toSkipHere; 
+      }
+    case Position::ALIGNMENT: 	// skips partitions
+      {
+	size_t toSkipHere = 0; 
+
+	// skip partition contributios 
+	toSkipHere += _partitions.size() * sizeof(double); 
+
+	auto oneElem = 
+	  sizeof(ps.states) + sizeof(ps.maxTipStates) + sizeof(ps.lower) + sizeof(ps.upper) + 
+	  sizeof(ps.dataType) + sizeof(ps.protModels) + sizeof(ps.protUseEmpiricalFreqs) + sizeof(ps.nonGTR); 
+	toSkipHere += _partitions.size() * (oneElem + sizeof(int)); 
+
+	for(auto &p : _partitions)
+	  toSkipHere += ( p.getName().size() +1 )  * sizeof(char) ; // TODO zero byte  
+
+	toSkip += toSkipHere; 
+      }
+    case Position::PARTITIONS: 	// skips taxa
+      {
+	size_t toSkipHere = 0; 
+	toSkipHere += _taxa.size() * sizeof(int); 
+	for(auto &t : _taxa ) 
+	  toSkipHere +=  ( t.size() +1) * sizeof(char); // TODO zero byte 
+	toSkip += toSkipHere; 
+      }
+    case Position::TAXA: 
+      {
+	toSkip += _numPat * size_t(_weightType); // skips weights
+      }
+    case Position::WEIGHTS:
+      {
+	toSkip += sizeof(_numPat) + 3 * sizeof(int) ; // skips header 
+      }
+    case Position::HEADER: 
+      // dont skip anything 
+      break; 
+    default: 
+      assert(0); 
+    }
+
+  _in.seekg(toSkip, std::ios_base::beg); 
+} 
+
+
+
+
+void ByteFile::checkMagicNumber()  
+{
+  char tmp[7]; 
+  _in.seekg(0, std::ios_base::beg);
+  memset(&tmp, 0 , sizeof(char) * 7 ); 
+  _in.read(tmp, 6 * sizeof(char)); 
+  if( std::string(tmp).compare("BINARY") != 0 )
+    {
+      tout << "expected different file start (maybe reparse the binary file). Got >"  << tmp << "<"<< std::endl; 
+      assert(0); 
+    }
+}
+
+
+std::vector<Partition> ByteFile::getPartitions() const 
+{
+  
+
+  return _partitions; 
+}
+
diff --git a/src/system/ByteFile.hpp b/src/system/ByteFile.hpp
new file mode 100644
index 0000000..830c8dc
--- /dev/null
+++ b/src/system/ByteFile.hpp
@@ -0,0 +1,81 @@
+#ifndef _BYTE_FILE_HPP
+#define _BYTE_FILE_HPP
+
+#include <fstream>
+#include <string>
+#include "Partition.hpp"
+// #include "time.hpp"
+
+
+class Communicator; 
+class ParallelSetup; 
+class PartitionAssignment; 
+
+
+enum class Position
+{
+  HEADER,
+    WEIGHTS, 
+    TAXA, 
+    PARTITIONS, 
+    ALIGNMENT, 
+    PARSIMONY
+}; 
+
+
+
+enum class IntegerWidth : size_t 
+{
+  BIT_64 = sizeof(uint64_t) , 
+    BIT_32 = sizeof(uint32_t), 
+    BIT_16 = sizeof(uint16_t), 
+    BIT_8  = sizeof(uint8_t)
+    }; 
+
+
+class ByteFile
+{
+public: 
+  ByteFile(std::string name, bool saveMemory = false); 
+  void parse(ParallelSetup &pl); 
+  
+  std::vector<std::string> getTaxa() const {return _taxa; }
+  std::vector<Partition> getPartitions() const; 
+
+  nat determineOptStride(Communicator& comm); 
+
+private: 			// METHODS
+  std::tuple<int,int> parseHeader(ParallelSetup& pl); 
+  void checkMagicNumber();
+  void parsePartitions(int numPart ); 
+  void seek(Position pos); 
+  void parseTaxa(int numTax); 
+
+  template<typename T>
+  void parseWeights(ParallelSetup& pl, PartitionAssignment& pAss); 
+  void parseAlns(ParallelSetup& pl, PartitionAssignment& pAss);
+  void distributeArray(ParallelSetup& pl); 
+
+  void parseAlnsDirectRead(ParallelSetup& pl, PartitionAssignment& pAss); 
+  void parseAlnsDirect_newLayout(ParallelSetup& pl, PartitionAssignment& pAss); 
+
+  template<typename T> std::vector<std::vector<T>> readAndDistributeArrays(ParallelSetup& pl, PartitionAssignment& pAss, size_t numberOfArrays); 
+
+  template <typename T> T readVar(); 
+  template<typename T> std::vector<T> readArray(size_t length); 
+  template<typename T> void readArray(size_t length, T* array); 
+
+private: 			// ATTRIBUTES
+  std::string _fileName; 
+  std::ifstream _in; 
+  std::vector<std::string> _taxa; 
+  int _numPat;
+  std::vector<Partition> _partitions; 
+  bool _saveMemory; 
+  IntegerWidth _weightType; 
+  // CLOCK::system_clock::time_point _initTime; 
+}; 
+
+#include "ByteFile.tpp"
+
+#endif
diff --git a/src/system/ByteFile.tpp b/src/system/ByteFile.tpp
new file mode 100644
index 0000000..1882baa
--- /dev/null
+++ b/src/system/ByteFile.tpp
@@ -0,0 +1,41 @@
+#include <cassert>
+#include "GlobalVariables.hpp"
+
+
+template<typename T> 
+T ByteFile::readVar()
+{
+  T result ; 
+  _in.read((char*)&result, sizeof(T)  ); 
+  auto bytesRead = _in.gcount();
+  assert(bytesRead == std::streamsize(sizeof(T))); // 
+  if(bytesRead != std::streamsize(sizeof(T)))
+    {
+      std::cout << "read " << bytesRead << " expected "  << sizeof(T) << std::endl; 
+      assert(0); 
+    }
+
+  return result; 
+}
+
+template<typename T> 
+void ByteFile::readArray(size_t length, T* array)
+{
+  _in.read((char*)array, sizeof(T) * length); 
+  auto bytesRead = _in.gcount();
+  
+  if(size_t(bytesRead) != size_t(sizeof(T) * length))
+    {
+      std::cout << "problem reading " << length * sizeof(T) << " instead got " << SHOW(bytesRead) << std::endl; 
+       assert(0);
+    }
+} 
+
+
+template<typename T>
+std::vector<T> ByteFile::readArray(size_t length)
+{
+  auto result = std::vector<T>(length); 
+  readArray(length, result.data());
+  return result; 
+}
diff --git a/src/system/FlagType.hpp b/src/system/FlagType.hpp
new file mode 100644
index 0000000..196dcf4
--- /dev/null
+++ b/src/system/FlagType.hpp
@@ -0,0 +1,44 @@
+#ifndef FLAG_TYPE
+#define FLAG_TYPE
+
+#include <type_traits>
+
+
+// icc wants prior definition 
+template<typename T> T operator|( T a, T b)  ; 
+template<typename T> T operator&( T a,  T b) ; 
+template<typename T> T operator&=(T a, T b) ; 
+template<typename T> T operator|=(T a, T b) ;  
+
+
+template<typename T>
+T operator|( T a, T b) 
+{
+  static_assert(std::is_enum<T>::value  , "type must be an enum!\n"); 
+  return static_cast<T>(static_cast<int>(a) | static_cast<int>(b)); 
+}
+
+template<typename T>
+T operator&( T a,  T b)
+{
+  static_assert(std::is_enum<T>::value, "type must be an enum!\n"); 
+  return static_cast<T>(static_cast<int>(a) & static_cast<int>(b)); 
+}
+
+
+template<typename T>
+T operator&=(T a, T b)
+{
+  return a & b; 
+}
+
+
+template<typename T>
+T operator|=(T a, T b)
+{
+  return a | b; 
+}
+
+
+
+#endif
diff --git a/src/system/GlobalVariables.hpp b/src/system/GlobalVariables.hpp
new file mode 100644
index 0000000..3f592ae
--- /dev/null
+++ b/src/system/GlobalVariables.hpp
@@ -0,0 +1,81 @@
+/**
+    @file globals.h
+
+    @brief Global variables for ExaBayes.
+    
+    Notice that there are already a bunch of global variables from axml-variants.  
+*/ 
+
+
+#ifndef _GLOBALS_H
+#define _GLOBALS_H
+
+#include <string>
+#include <chrono> 
+#include <memory>
+
+#include <fstream>
+#include "common.h"
+#include "config.h"
+
+#include <thread>
+#include <mutex>
+#include "TeeStream.hpp"
+
+class AdHocIntegrator; 
+class TreeIntegrator; 
+
+#define tout (*teeOut) << SyncOut()
+
+class TeeStream;
+
+
+#ifdef _INCLUDE_DEFINITIONS
+
+
+std::unique_ptr<TeeStream> teeOut; 
+std::unique_ptr<std::ofstream> logStream;
+std::mutex mtx;
+
+// std::chrono::system_clock::time_point timeIncrement;  
+int debugPrint = 0; 
+bool startIntegration = false; 
+
+AdHocIntegrator* ahInt; 
+TreeIntegrator* tInt; 
+
+bool isYggdrasil; 
+
+void (*exitFunction)(int code, bool waitForAll); 
+
+std::thread::id _masterThread; 
+volatile bool _threadsDie; 
+
+#else 
+
+extern   std::unique_ptr<TeeStream> teeOut; 
+extern std::unique_ptr<std::ofstream> logStream;
+extern std::mutex mtx;
+  
+
+extern std::thread::id _masterThread; 
+extern volatile bool  _threadsDie; 
+
+extern void (*exitFunction)(int code , bool waitForAll); 
+
+extern bool isYggdrasil; 
+// extern int PLL_NUM_BRANCHES; 
+
+extern bool startIntegration; 
+extern AdHocIntegrator* ahInt; 
+extern TreeIntegrator* tInt; 
+// extern GlobalVariables globals; 
+// extern std::chrono::system_clock::time_point timeIncrement;  
+extern int debugPrint; 
+#endif
+
+
+#include "SyncOut.hpp"
+
+#endif
+
diff --git a/src/system/NastyGlobalVariables.cpp b/src/system/NastyGlobalVariables.cpp
new file mode 100644
index 0000000..b36d540
--- /dev/null
+++ b/src/system/NastyGlobalVariables.cpp
@@ -0,0 +1,3 @@
+#define _INCLUDE_DEFINITIONS
+#include "GlobalVariables.hpp"
+#undef _INCLUDE_DEFINITIONS
diff --git a/src/system/PartitionAssignment.cpp b/src/system/PartitionAssignment.cpp
new file mode 100644
index 0000000..d56834d
--- /dev/null
+++ b/src/system/PartitionAssignment.cpp
@@ -0,0 +1,405 @@
+#include <algorithm>
+#include <cassert>
+#include <list>
+
+#include "GlobalVariables.hpp"
+#include "PartitionAssignment.hpp"
+
+
+static inline int popAndYield(std::vector<nat> &list)
+{
+  if(list.empty())
+    return -1; 
+  else 
+    {
+      auto val = list.back();
+      list.pop_back();
+      return val; 
+    }
+}  
+
+
+static inline nat openNewPartition(std::vector<PartInfo>::iterator &iter, std::vector<PartInfo>::iterator end)
+{
+  auto result = 0; 
+
+  if(iter != end)
+    ++iter; 
+  if(iter != end)
+    result = iter->num; 
+
+  return result; 
+}
+
+
+void PartitionAssignment::improvedAssign( std::vector<PartInfo> partitions )
+{
+  std::sort(begin(partitions), end(partitions), []( const PartInfo& a,  const PartInfo&b ) {return a.num < b.num; }); 
+  
+  auto partIter = begin(partitions);
+  
+  auto __totalSites = 0u; 
+  for(auto &p : partitions)
+    __totalSites += p.num; 
+
+  auto cap = static_cast<nat>(ceil( double(__totalSites) / double(_numProc) )); 
+  auto remainder =  int(cap * _numProc -  __totalSites); 
+  assert(remainder >= 0);   
+  auto numFull = 0u; 
+  auto numAssigned = std::vector<nat>(_numProc,0); 
+  auto sizeAssigned = std::vector<nat>(_numProc, 0); 
+
+  auto numLow = 0u; 
+  auto iterate = true;
+
+  // phase 2 initial assignment 
+  while(iterate)
+    {
+      for(nat proc = 0; proc < _numProc; ++proc)
+	{
+	  if( partIter != end(partitions) && sizeAssigned[proc] + partIter->num <= cap )
+	    {
+	      _assignToProcFull(*partIter,proc, numAssigned, sizeAssigned); 
+
+	      if(sizeAssigned[proc] == cap)
+		{
+		  ++numFull; 
+		  if(numFull == _numProc - remainder )
+		    --cap; 
+		}
+	      ++partIter;
+	    }
+	  else 
+	    {
+	      // low = proc+1; 	// +1 necessary? 
+	      numLow = numAssigned[proc];
+	      iterate = false;
+	      break; 
+	    }
+	}
+    }
+
+
+  // phase 4: stick breaking 
+  auto procsHigh = std::vector<nat>{}; 
+  auto procsLow = std::vector<nat>{}; 
+  numFull = 0; 
+  for(nat proc = 0; proc < _numProc; ++proc)
+    {
+      if( sizeAssigned[proc] < cap)
+	{
+	  if( numAssigned[proc] == numLow )
+	    procsLow.push_back(proc);
+	  else if(numAssigned[proc] == numLow + 1)
+	    procsHigh.push_back(proc); 
+	}
+      else 
+	++numFull; 
+    }
+  assert(procsHigh.size() + procsLow.size() + numFull == _numProc); 
+
+  int toAdd = ( partIter == end(partitions )) ? 0 : partIter->num ; 
+
+  int highProc =  procsHigh.empty() ? popAndYield(procsLow) : popAndYield(procsHigh) ;
+  int lowProc =  procsLow.empty() ? popAndYield(procsHigh) : popAndYield(procsLow) ; 
+
+  while( not (procsLow.empty() &&  procsHigh.empty() && highProc == -1 && lowProc == -1 ))
+    {
+      if(highProc != - 1  && sizeAssigned[highProc] + toAdd >= cap)
+	{
+	  auto toTransfer = cap - sizeAssigned[highProc]; 
+	  auto offset = partIter->num - toAdd; 
+	  
+	  _assignToProcPartially(*partIter, highProc, numAssigned, sizeAssigned, offset, toTransfer); 
+	  toAdd -= toTransfer; 
+
+	  if(toAdd == 0 )
+	    {
+	      toAdd = openNewPartition(partIter, end(partitions)); 
+	      if(toAdd == 0)
+		break; 
+	    }
+
+	  ++numFull; 
+	  
+	  if(numFull == _numProc - remainder)
+	    {
+	      --cap; 
+	    }
+	  
+	  highProc = procsHigh.empty() ? popAndYield(procsLow) : popAndYield(procsHigh); 
+	}
+      else if(lowProc != - 1)
+	{
+	  if ( sizeAssigned[lowProc] + toAdd < cap)
+	    {
+	      auto offset = partIter->num - toAdd; 
+	      _assignToProcPartially(*partIter, lowProc, numAssigned, sizeAssigned, offset, toAdd); 
+	      if(highProc != -1 )
+		procsHigh.push_back(highProc); 
+	      highProc = lowProc;
+	      toAdd = openNewPartition(partIter, end(partitions)); 
+	      if(toAdd == 0)
+		break; 
+	      lowProc = procsLow.empty() ? popAndYield(procsHigh) : popAndYield(procsLow); 
+	    }
+	  else 
+	    {
+	      auto toTransfer = cap - sizeAssigned[lowProc] ; 
+	      auto offset = partIter->num - toAdd; 
+	      _assignToProcPartially(*partIter, lowProc, numAssigned, sizeAssigned, offset, toTransfer); 
+	      toAdd -= toTransfer;
+	      
+	      if(toAdd == 0 )
+		{
+		  toAdd = openNewPartition(partIter, end(partitions)); 
+		  if(toAdd == 0)
+		    break; 
+		}
+
+	      ++numFull; 
+	      if(numFull == _numProc - remainder)
+		--cap; 
+
+	      lowProc = procsHigh.empty() ? popAndYield(procsLow) : popAndYield(procsHigh) ; 
+	    }
+	}
+    }
+
+  assert(toAdd == 0); 
+  assert(partIter == end(partitions)); 
+}
+
+
+void PartitionAssignment::_assignToProcFull(PartInfo p, nat proc, std::vector<nat> &numAssigned, std::vector<nat> &sizeAssigned) 
+{
+  auto assnmnt = Assignment{p.id, proc, 0, p.num, 0}; 
+  _proc2assignment.insert(std::make_pair(proc, assnmnt));
+  sizeAssigned[proc] += p.num; 
+  ++numAssigned[proc];   
+}
+
+
+void PartitionAssignment::_assignToProcPartially(PartInfo p, nat proc, std::vector<nat> &numAssigned, std::vector<nat> &sizeAssigned, nat offset, nat numElem) 
+{
+  assert(numElem > 0 ); 
+  auto assignment = Assignment{p.id, proc, offset, numElem, 0}; 
+  _proc2assignment.insert(std::make_pair(proc, assignment));
+  sizeAssigned[proc] += numElem; 
+  ++numAssigned[proc];   
+}
+
+
+void PartitionAssignment::assignForType(  std::vector<PartInfo> curParts )
+{
+  // extract relevant elements 
+  nat totalSites = 0; 
+  for(auto &p : curParts)
+    totalSites += p.num; 
+
+  auto sitesPerProc = int(totalSites / _numProc); 
+  auto remainder = totalSites - (sitesPerProc * _numProc); 
+      
+  std::sort(begin(curParts), end(curParts), [](const PartInfo &a, const PartInfo& b){ return a.num < b.num ; }); 
+
+  auto sitesLeft = std::vector<int>(_numProc, sitesPerProc);
+  for(auto i = 0u; i< remainder; ++i)
+    ++sitesLeft[i]; 
+
+  // that's a bit much, but it only assures that elements are
+  // always ordered by 
+  // * number of partitions assigned so far (first, ascending)
+  // * number of sites assigned so far (second, descending)  
+  auto comparator = [](const std::pair<int,int> &a, const std::pair<int,int>& b)
+    {
+      return ( a.first == b.first  && a.second  > b.second ) 
+      || a.first < b.first; 
+    }; 
+  
+  auto numPartAndSites2Proc = std::multimap<std::pair<int,int>,int, decltype(comparator)>(comparator); 
+  for(nat i = 0; i < _numProc; ++i)
+    numPartAndSites2Proc.insert(std::make_pair(std::make_pair(0, 0), i)); 
+      
+  for(auto part : curParts)
+    {
+      int toAssign = part.num; 
+      nat offset = 0; 
+	  
+      while(toAssign > 0 )
+	{
+	  auto ptr2elem = begin(numPartAndSites2Proc); 
+	  auto proc = ptr2elem->second; 
+	  auto numParts = ptr2elem->first.first; 
+	  auto numSites = ptr2elem->first.second; 
+	  auto elemsToTransfer = std::min(sitesLeft[proc], toAssign); 
+	  assert(elemsToTransfer > 0 ); 
+
+	  // create assignment 
+	  _proc2assignment.insert(std::make_pair(proc, Assignment{part.id, nat(proc), nat(offset), nat(elemsToTransfer), 0}));
+
+	  // update bookkeeping 
+	  sitesLeft[proc] -= elemsToTransfer; 
+	  toAssign -= elemsToTransfer; 
+	  offset += elemsToTransfer; 
+	  numPartAndSites2Proc.erase(ptr2elem);
+	  ++numParts ; 
+	  numSites += elemsToTransfer; 
+
+	  if(sitesLeft[proc] > 0)
+	    numPartAndSites2Proc.insert(std::make_pair(std::make_pair(numParts, numSites), proc)); 
+	}
+    }
+}
+
+
+
+
+
+
+
+void PartitionAssignment::assign(const std::vector<Partition>& partitions)
+{
+  //  order partitions by type 
+  auto typeToPart =  std::multimap<nat, PartInfo>{}; 
+  nat ctr = 0; 
+  for( auto &p : partitions )
+    {
+      auto type = p.getDataType(); 
+      typeToPart.insert(std::make_pair(type, PartInfo{ctr, nat(p.getUpper() - p.getLower()), 0}) );
+      ++ctr; 
+    }
+  
+  auto uniqKeys = std::vector<std::pair<nat, PartInfo>> {};
+  std::unique_copy(begin(typeToPart),
+		   end(typeToPart),
+		   std::back_inserter(uniqKeys),
+		   [](const std::pair<nat, PartInfo> &entry1, const std::pair<nat, PartInfo> &entry2) 
+		   {
+		     return (entry1.first == entry2.first);
+		   }
+             );
+  
+  for(auto uniq : uniqKeys)
+    {
+      auto iterPair = typeToPart.equal_range(uniq.first) ; 
+      auto relevant = std::vector<PartInfo>{}; 
+      for( auto iter = iterPair.first; iter != iterPair.second; ++iter )
+	relevant.push_back(iter->second); 
+      
+#if 0 
+      assignForType(relevant); 
+#else 
+      improvedAssign(relevant); 
+#endif
+    }
+  
+  assert(_proc2assignment.size() >= partitions.size()); 
+}
+
+
+void PartitionAssignment::assignOld(const std::vector<Partition>& partitions)
+{
+  // sort partitions by computational load 
+  auto ps = std::vector<PartInfo>{}; 
+  nat ctr = 0; 
+  for(auto &p : partitions)
+    {
+      nat len = p.getHandle().upper - p.getHandle().lower; 
+      nat load = p.getHandle().states  * p.getHandle().states ; 
+      ps.push_back(PartInfo{ctr, len, load});
+      ++ctr; 
+    }
+  std::sort(begin(ps), end(ps), [](const PartInfo& a, const PartInfo &b){return a.num * a.compStates > b.num * b.compStates; }); 
+
+  double totalLoad = 0; 
+  for(auto &p : ps)
+    totalLoad += p.num * p.compStates; 
+
+  nat loadPerProc = nat(ceil(totalLoad / double(_numProc))); 
+  nat curProc = 0; 
+  nat curLoad = 0; 
+  for(auto &p : ps)
+    {
+      nat partitionElemsLeft =  p.num; 
+      nat offset = 0; 
+      while(curProc < _numProc && partitionElemsLeft != 0) 
+	{
+	  nat elemsToTransfer = nat(ceil(double(std::min(partitionElemsLeft * p.compStates, loadPerProc - curLoad) ) / double(p.compStates))); 
+	  assert(elemsToTransfer > 0 ); 
+
+	  _proc2assignment.insert(std::make_pair(curProc, Assignment{p.id, curProc, offset, elemsToTransfer, p.compStates}));
+
+	  offset += elemsToTransfer; 
+
+	  partitionElemsLeft -= elemsToTransfer; 
+	  curLoad += elemsToTransfer * p.compStates; 
+	  
+	  if(loadPerProc <= curLoad)
+	    {
+	      curLoad = 0; 
+	      ++curProc; 
+	    }
+	}
+      assert(offset == p.num); 
+    }
+}
+
+
+std::ostream& operator<<(std::ostream& out, const Assignment& rhs) 
+{
+  out << "id=" << rhs.partId << "\t->" << rhs.procNum << "\t(" << rhs.offset << "," << rhs.width << ")" ; 
+  return out; 
+}
+
+
+size_t PartitionAssignment::getTotalWidthPerProc(nat proc) const 
+{
+  size_t result = 0; 
+  auto iterPair = _proc2assignment.equal_range(proc); 
+  for(auto iter = std::get<0>(iterPair); iter != std::get<1>(iterPair); ++iter)
+    result += std::get<1>(*iter).width; 
+  return result; 
+}
+
+
+std::vector<nat> 
+PartitionAssignment::getSitesPerProcess() const 
+{
+  auto result = std::vector<nat>(_numProc,0);
+  for(auto &p : _proc2assignment)
+    {
+      auto ass = std::get<1>(p); 
+      result[ass.procNum] += ass.width; 
+    }
+  return result; 
+}
+
+
+auto PartitionAssignment::getNumPartPerProcess() const 
+  -> std::vector<nat>
+{
+  auto result = std::vector<nat>(_numProc,0); 
+  for(auto &p : _proc2assignment)
+    {
+      auto ass = std::get<1>(p); 
+      ++result[ass.procNum]; 
+    }
+  return result; 
+}
+
+
+
+std::pair< std::vector<int>,std::vector<int> > 
+PartitionAssignment::getCountsAndDispls( size_t numInComm) const 
+{
+  auto countsPerProc = std::vector<int>{}; 
+  for(nat i = 0; i <  numInComm; ++i)
+    countsPerProc.push_back(int(getTotalWidthPerProc(i))); // TODO inefficient
+  auto displPerProc = std::vector<int>{}; 
+  displPerProc.push_back(0); 
+  for(nat i = 1; i  < numInComm ; ++i)
+    displPerProc.push_back(int(displPerProc[i-1] + countsPerProc[i-1]));
+
+  return std::make_pair(countsPerProc,displPerProc);
+} 
+
diff --git a/src/system/PartitionAssignment.hpp b/src/system/PartitionAssignment.hpp
new file mode 100644
index 0000000..63d7b9f
--- /dev/null
+++ b/src/system/PartitionAssignment.hpp
@@ -0,0 +1,64 @@
+#ifndef _PARTITION_ASSIGNMENT_HPP
+#define _PARTITION_ASSIGNMENT_HPP
+
+#include <map>
+
+#include "common.h"
+#include "Partition.hpp"	
+
+struct Assignment
+{
+  nat partId; 
+  nat procNum;
+  nat offset; 
+  nat width; 
+  nat compStates; 
+}; 
+
+
+
+
+std::ostream& operator<<(std::ostream& out, const Assignment& rhs); 
+
+struct PartInfo
+{
+  nat id; 
+  nat num; 
+  nat compStates; 		// not used in modern thingie 
+}; 
+
+
+class PartitionAssignment
+{
+public: 
+  explicit PartitionAssignment(size_t size )
+    : _numProc(size)
+    , _proc2assignment{}
+  {
+  }
+
+  size_t getTotalWidthPerProc(nat proc) const; 
+  void assignOld(const std::vector<Partition>& pass); 
+
+  void assign(const std::vector<Partition>& pass); 
+  const std::multimap<nat,Assignment>& getAssignment() const {return _proc2assignment; }
+  std::pair< std::vector<int>,std::vector<int> > getCountsAndDispls(size_t bla) const ; 
+
+  size_t getNumProc() const {return _numProc; }
+
+  auto getNumPartPerProcess() const -> std::vector<nat>; 
+  auto getSitesPerProcess() const  -> std::vector<nat>; 
+
+private: 			// METHODS 
+  void assignForType( std::vector<PartInfo> ); 
+  void improvedAssign( std::vector<PartInfo> partitions); 
+  void _assignToProcFull(PartInfo p, nat proc, std::vector<nat> &numAssigned, std::vector<nat> &sizeAssigned) ; 
+  void _assignToProcPartially(PartInfo p, nat proc, std::vector<nat> &numAssigned, std::vector<nat> &sizeAssigned, nat offset, nat numElem) ; 
+  
+private: 			// ATTRIBUTES
+  size_t _numProc; 
+  std::multimap<nat,Assignment> _proc2assignment;
+}; 
+
+
+#endif
diff --git a/src/system/ProposalRegistry.cpp b/src/system/ProposalRegistry.cpp
new file mode 100644
index 0000000..b221714
--- /dev/null
+++ b/src/system/ProposalRegistry.cpp
@@ -0,0 +1,232 @@
+#include <memory>
+#include <limits>
+#include <unordered_map>
+
+#include "ProposalRegistry.hpp"
+
+#include "StatNniProposer.hpp"
+#include "ExtendedSprProposer.hpp"
+#include "ExtendedTbrProposer.hpp"
+#include "ParsSprProposer.hpp"
+#include "LikelihoodSprProposer.hpp"
+
+#include "DivRateSlider.hpp"
+#include "DivTimeSlider.hpp"
+
+#include "WeibullProposer.hpp"
+#include "DivTimeProposal.hpp"
+#include "DistributionBranchLength.hpp"
+#include "GenericTopoProposal.hpp"
+
+#include "BranchLengthMultiplier.hpp"
+#include "AminoModelJump.hpp"
+#include "NodeSlider.hpp"
+#include "TreeLengthMultiplier.hpp"
+#include "AbstractProposal.hpp"
+
+#include "AbstractProposer.hpp"
+#include "SlidingProposer.hpp"
+#include "MultiplierProposer.hpp"
+#include "DirichletProposer.hpp"
+#include "RateDirichletProposer.hpp"
+#include "RateSlidingProposer.hpp"
+
+#include "extensions.hpp"
+
+#include "ProposalType.hpp"
+#include "BoundsChecker.hpp"
+
+const double ProposalRegistry::initBranchLengthMultiplier = 1.386294; 
+
+const double ProposalRegistry::initRateSlidingWindow = 0.15 ;
+
+const double ProposalRegistry::initFrequencySlidingWindow = 0.2 ; 
+const double ProposalRegistry::initGammaSlidingWindow = 0.75; 
+const double ProposalRegistry::initSecondaryBranchLengthMultiplier = 0.098; 
+const double ProposalRegistry::initTreeLengthMultiplier = 1.386294; 
+
+const double ProposalRegistry::initDirichletAlpha = 100 ; 
+const double ProposalRegistry::initDirichletProtAlpha = 50 ; 
+
+const double ProposalRegistry::initGammaMultiplier = 0.811 ; 
+const double ProposalRegistry::initNodeSliderMultiplier = 0.191 ; 
+
+
+/**
+   @brief yields a set of proposls for integrating a category  
+ */
+std::vector<std::unique_ptr<AbstractProposal> >
+ProposalRegistry::getSingleParameterProposals(Category cat, const BlockProposalConfig &config, const TreeAln &traln, ParallelSetup& pl, ParameterList &params) const 
+{
+  auto result = std::vector<unique_ptr<AbstractProposal> >{} ; 
+
+  auto numNodeAges = traln.getNumberOfInnerNodes(true);
+
+  auto&& proposals = ProposalTypeFunc::getSingleParameterProposalsForCategory(cat ) ; 
+  for(auto& p : proposals)
+    {     
+
+      double userWeight = 1; 
+      if(config.wasSetByUser(p))
+	{
+	  userWeight = config.getProposalWeight(p); 
+	  if( not FLOAT_IS_INITIALIZED(userWeight))
+	    continue; 
+	} 
+      else if( not ProposalTypeFunc::isDefaultInstantiate(p)  )		
+	continue;       
+
+      auto&& proposal = std::unique_ptr<AbstractProposal>{}; 
+
+      switch(p)
+	{
+	case ProposalType::DIVRATE_SLIDER: 
+	  {
+	    // tout << "init: divrateslider " << std::endl; 
+	    proposal = make_unique<DivRateSlider>();
+	  }
+	  break;
+	case ProposalType::DIVTIME_SLIDER: 
+	  {
+	    // tout << "init: divtimeslider " << std::endl; 
+	    proposal = make_unique<DivTimeSlider>(DivTimeSlider::defaultWeight / numNodeAges); 
+	  }
+	  break; 
+	case ProposalType::ST_NNI: 
+	  {
+	    auto tmp = make_unique<GenericTopoProposal>(  make_unique<StatNniProposer>(), "stNNI", 6., config.getMoveOptMode() ) ;
+	    if(config.hasUseMultiplier())
+	      tmp->enableUseMultiplier();
+	    proposal = std::move(tmp);
+	  }
+	  break; 
+	case ProposalType::BRANCH_LENGTHS_MULTIPLIER:	      
+	  proposal = make_unique< BranchLengthMultiplier>( initBranchLengthMultiplier) ; 
+	  break; 
+	case ProposalType::NODE_SLIDER:
+	  proposal = make_unique<NodeSlider> (initNodeSliderMultiplier); 
+	  break; 
+	case ProposalType::TL_MULT:
+	  proposal = make_unique< TreeLengthMultiplier> (  ProposalRegistry::initTreeLengthMultiplier); 
+	  break; 
+	case ProposalType::E_TBR: 
+	  {
+	    auto&& tmp = make_unique<GenericTopoProposal>(  make_unique<ExtendedTbrProposer>(config.getEtbrStopProb()) , "eTBR", 5., config.getMoveOptMode());
+	    if(config.hasUseMultiplier())
+	      tmp->enableUseMultiplier();
+	    proposal = std::move(tmp); 
+	  }
+	  break; 
+	case ProposalType::E_SPR: 
+	  {
+	    auto tmp = make_unique<GenericTopoProposal>( make_unique<ExtendedSprProposer>(config.getEsprStopProp()), "eSPR", 6. , config.getMoveOptMode());
+	    if(config.hasUseMultiplier())
+	      tmp->enableUseMultiplier();
+	    proposal = std::move(tmp);
+	  }
+	  break; 
+	case ProposalType::LIKE_SPR: 
+	  {
+	    int rad =  config.getLikeSprMaxRadius(); 
+	    if(rad == -1)
+	      rad = int(std::ceil(std::log(traln.getNumberOfTaxa()) / std::log(2))); 
+
+	    proposal = make_unique<GenericTopoProposal>( make_unique<LikehoodSprProposer>(rad , config.getLikeSprWarp(), config.getMoveOptMode()),
+							 "likeSPR", 2., config.getMoveOptMode());
+	  }
+	  break; 
+	case ProposalType::PARSIMONY_SPR:	
+	  {
+	    // decide upon radius 
+	    int radius = config.getParsSPRRadius(); 
+	    nat numTax = traln.getNumberOfTaxa(); 
+	    if(radius == -1)
+	      radius = int(std::floor( std::log(numTax) * 2   ));
+	    auto&& tmp  = make_unique<GenericTopoProposal>( make_unique<ParsSprProposer>(config.getParsimonyWarp(),radius, pl.getChainComm()), "parsSpr", 6. , config.getMoveOptMode()); 
+	    if(config.hasUseMultiplier())
+	      tmp->enableUseMultiplier();
+	    proposal = std::move(tmp);
+	  }
+	  break; 
+	case ProposalType::REVMAT_SLIDER: 
+	  proposal = make_unique<ParameterProposal>  (Category::SUBSTITUTION_RATES, "revMatSlider", true, 
+						      make_unique<SlidingProposer>(BoundsChecker::rateMin, BoundsChecker::rateMax, true),
+						      initRateSlidingWindow,1,   1e-5,1 ) ; 
+	  break; 
+	case ProposalType::FREQUENCY_SLIDER:
+	  proposal = make_unique<ParameterProposal>  (Category::FREQUENCIES, "freqSlider", true, 
+						      std::unique_ptr<SlidingProposer>( new SlidingProposer(BoundsChecker::freqMin, std::numeric_limits<double>::max(), false)), 
+						      initFrequencySlidingWindow,0.5,     1e-5, 1 ) ; 
+	  break; 		  
+	case ProposalType::RATE_HET_MULTI: 
+	  proposal = make_unique<ParameterProposal>  (Category::RATE_HETEROGENEITY, "rateHetMulti", false, 
+						      std::unique_ptr<MultiplierProposer>(new MultiplierProposer(BoundsChecker::alphaMin, BoundsChecker::alphaMax)),
+						      initGammaMultiplier,1,  1e-4, 1e2 ) ; 
+	  break; 
+	case ProposalType::RATE_HET_SLIDER: 
+	  proposal = make_unique<ParameterProposal>  (Category::RATE_HETEROGENEITY, "rateHetSlider", false, 
+						      std::unique_ptr<SlidingProposer>(new SlidingProposer(BoundsChecker::alphaMin, BoundsChecker::alphaMax, false)),   
+						      initGammaSlidingWindow,0, 1e-4, 1e2 ) ; 
+	  break; 
+	case ProposalType::FREQUENCY_DIRICHLET: 
+	  proposal = make_unique<ParameterProposal>  (Category::FREQUENCIES, "freqDirich", true, 
+						      std::unique_ptr<DirichletProposer	>(new DirichletProposer	(BoundsChecker::freqMin, std::numeric_limits<double>::max(), false)), 
+						      initDirichletAlpha,0.5, 1e-3, 1e4 ) ; 
+	  break; 
+	case ProposalType::REVMAT_DIRICHLET: 
+	  proposal = make_unique<ParameterProposal>  (Category::SUBSTITUTION_RATES, "revMatDirich", true, 
+						      std::unique_ptr<DirichletProposer	>(new DirichletProposer	 (BoundsChecker::rateMin, BoundsChecker::rateMax, true)), 
+						      initDirichletAlpha,1, 1e-3, 1e4) ; 
+	  break; 
+	case ProposalType::DIRICH_REVMAT_PER_RATE:
+	  {
+	    proposal = make_unique<ParameterProposal>(Category::SUBSTITUTION_RATES, "revMatDirichRate", true,
+						      make_unique<RateDirichletProposer>( BoundsChecker::rateMin, BoundsChecker::rateMax),
+						      initDirichletProtAlpha, 
+						      // 4, 
+						      1, 
+						      1e-3, 1e4
+						      );
+	    proposal->setForProteinsOnly(true); 
+	  }
+	  break; 
+	case ProposalType::SLIDING_REVMAT_PER_RATE:
+	  {
+	    proposal = make_unique<ParameterProposal>(Category::SUBSTITUTION_RATES, "revMatSliderRate", true,
+						      make_unique<RateSlidingProposer>( BoundsChecker::rateMin, BoundsChecker::rateMax),
+						      initRateSlidingWindow, 0.5, 0,0 // TODO !!! 
+						      );
+	    
+	    // TODO not ready yet   
+	    assert(0); 
+	  }
+	  break; 
+	case ProposalType::AMINO_MODEL_JUMP: 
+	  proposal = make_unique<AminoModelJump>();
+	  break; 
+	case ProposalType::BRANCH_DIST_GAMMA: 
+	  proposal = make_unique<DistributionBranchLength<GammaProposer> >();
+	  break;
+	case ProposalType::BL_DIST_WEIBULL: 
+	  proposal = make_unique< DistributionBranchLength<WeibullProposer> >();
+	  break; 
+	case ProposalType::DIV_TIME_DIRICH:
+	  proposal = make_unique<DivTimeProposal>(DivTimeProposal::defaultWeight / numNodeAges ); 
+	  break; 
+        default :
+	  {
+	    cerr << "you did not implement case " << int(p) << " in ProposalRegistry.cpp" << endl; 
+	    assert(0); 
+	  }
+	} 
+      
+      proposal->setParams(&params);
+
+      if(config.wasSetByUser(p))
+	proposal->setRelativeWeight(userWeight);       
+      
+      result.push_back((std::move(proposal))); 	
+    }
+
+  return result; 
+} 
diff --git a/src/system/ProposalRegistry.hpp b/src/system/ProposalRegistry.hpp
new file mode 100644
index 0000000..77fac3b
--- /dev/null
+++ b/src/system/ProposalRegistry.hpp
@@ -0,0 +1,40 @@
+#ifndef _PROPOSAL_REGISTRY_H
+#define _PROPOSAL_REGISTRY_H
+
+#include <vector>
+#include <memory>
+
+#include "GlobalVariables.hpp"
+#include "BlockProposalConfig.hpp"
+#include "ParameterProposal.hpp"
+#include "ParameterList.hpp"
+
+class ProposalRegistry
+{
+public: 
+  /** 
+      @brief get all proposals that integrate over a single parameter   
+  */ 
+  std::vector<std::unique_ptr<AbstractProposal> >
+  getSingleParameterProposals(Category cat, const BlockProposalConfig &config, const TreeAln &traln, ParallelSetup& pl, ParameterList &params) const ; 
+
+  static const double initFrequencySlidingWindow ; 
+  static const double initBranchLengthMultiplier; 
+  static const double initRateSlidingWindow; 
+  static const double initGammaSlidingWindow; 
+  static const double initSecondaryBranchLengthMultiplier; 
+  static const double initDirichletAlpha; 
+  static const double initTreeLengthMultiplier ; 
+  static const double initGammaMultiplier; 
+  static const double initNodeSliderMultiplier; 
+  static const int likeSprMinRadius; 
+  static const int likeSprMaxRadius; 
+  static const double likeSprWarp; 
+  static const double initDirichletProtAlpha; 
+
+private: 
+
+}; 
+
+
+#endif
diff --git a/src/system/RunFactory.cpp b/src/system/RunFactory.cpp
new file mode 100644
index 0000000..1c03e1c
--- /dev/null
+++ b/src/system/RunFactory.cpp
@@ -0,0 +1,523 @@
+#include <set>
+#include <iostream>
+
+#include "extensions.hpp"
+#include "RunFactory.hpp"
+#include "ProposalRegistry.hpp"	
+
+#include "AbstractProposer.hpp"
+#include "MultiplierProposer.hpp"
+#include "DirichletProposer.hpp" 
+#include "SlidingProposer.hpp"
+
+#include "TopologyParameter.hpp"
+#include "BranchLengthsParameter.hpp"
+#include "FrequencyParameter.hpp"
+#include "RevMatParameter.hpp"
+#include "RateHetParameter.hpp"
+
+#include "DiscreteModelPrior.hpp"
+#include "AbstractPrior.hpp"
+#include "ExponentialPrior.hpp"
+#include "UniformPrior.hpp"
+#include "DirichletPrior.hpp"
+
+void RunFactory::addStandardParameters(std::vector<std::unique_ptr<AbstractParameter> > &params, const TreeAln &traln ) const 
+{
+  int highestParamId = -1; 
+  if(params.size() > 0 )
+    {
+      auto ids = std::vector<nat>{};
+      for(auto &param : params )
+	ids.push_back(param->getId() ); 
+      highestParamId = * (std::max_element(ids.begin(), ids.end())) ; 
+    } 
+
+  auto allCats = CategoryFuns::getAllCategories(); 
+  auto cat2partsUsed = std::unordered_map<Category, std::vector<bool> >(); 
+  auto cat2idOfItsKind = std::unordered_map<Category,int>(); 
+  for( auto c : allCats)
+    {
+      cat2partsUsed[c] = std::vector<bool>(traln.getNumberOfPartitions(), false);
+      cat2idOfItsKind[c] = -1; 
+    }
+
+  // register which partitions are used by which parameter 
+  for(const auto &param : params)
+    {
+      auto cat =param->getCategory(); 
+      int id = param->getIdOfMyKind(); 
+      if( cat2idOfItsKind[cat] < id )
+	cat2idOfItsKind[cat] = id; 
+      for(auto &p : param->getPartitions())
+	cat2partsUsed[cat].at(p) = true; 
+    }
+
+  // add frequency parameters to aa-revmats, if not already there 
+  auto relCat = Category::FREQUENCIES; 
+  auto&& paramsToAdd= std::vector<std::unique_ptr<AbstractParameter>> {};
+  for( const auto &p : params)
+    {
+      assert(p->getPartitions().size() > 0 );
+      if ( p->getCategory() == Category::SUBSTITUTION_RATES
+	   &&  traln.getPartition(p->getPartitions()[0]).getDataType() == PLL_AA_DATA ) 
+	{
+	  for(auto part : p->getPartitions())
+	    {
+	      if(not cat2partsUsed.at(relCat).at(part) )
+		{
+		  ++highestParamId;   
+		  ++cat2idOfItsKind[relCat]; 
+  		  paramsToAdd.push_back(CategoryFuns::getParameterFromCategory(relCat, highestParamId, cat2idOfItsKind[relCat], {part}, traln.getNumberOfTaxa()));
+		  cat2partsUsed.at(relCat).at(part) = true; 
+		}
+	    }
+	}
+    }
+  
+  for(auto &p : paramsToAdd)
+    params.push_back(std::move(p)); 
+
+  auto divTimeMode = std::any_of(begin(params), end(params), 
+				 [](const std::unique_ptr< AbstractParameter> &param){ return param->getCategory() == Category::DIVERGENCE_TIMES
+										       || param->getCategory() == Category::DIVERGENCE_RATES ; }); 
+  
+  // add standard stuff, if not defined yet
+  for(auto cat : CategoryFuns::getAllCategories())
+    {
+      // determine unused partitions 
+      auto partsUnused = std::vector<nat>{}; 
+      switch(cat)
+	{	  
+	  // force to have everything linked with those 
+	case Category::BRANCH_LENGTHS: 
+	case Category::RATE_HETEROGENEITY:
+	case Category::TOPOLOGY: 
+          if(not divTimeMode)
+            {
+              for(nat i = 0; i < traln.getNumberOfPartitions() ; ++ i)
+                {
+                  if(not cat2partsUsed.at(cat).at(i))
+                    {
+                      partsUnused.push_back(i);
+                    }
+                }
+            }
+          else 
+            continue; 
+          break; 
+	case Category::DIVERGENCE_RATES: 
+	case Category::DIVERGENCE_TIMES:
+	  {
+	    // but do not instantiate these parameters, if we are doing
+	    // divtime (use the conflicting categories later, to rerduce
+	    // the complexity of the code)
+	    if(divTimeMode)
+	      {
+		for(nat i = 0; i < traln.getNumberOfPartitions() ; ++ i)
+		  {
+		    if(not cat2partsUsed.at(cat).at(i))
+		      partsUnused.push_back(i);
+		  }
+	      }
+	    else 
+	      continue ; 
+	  }
+	  break; 
+	case Category::AA_MODEL:	
+	  {
+	    for(nat i = 0; i < traln.getNumberOfPartitions(); ++i)
+	      {
+		if( traln.getPartition(i).getDataType() == PLL_AA_DATA
+		    && not cat2partsUsed[Category::SUBSTITUTION_RATES][i]
+		    && not cat2partsUsed[Category::AA_MODEL][i] )
+		  partsUnused.push_back(i);
+	      }
+	  } 
+	  break; 
+	case Category::FREQUENCIES:
+          for(nat i = 0; i < traln.getNumberOfPartitions() ; ++i )
+            {
+              auto dataType = traln.getPartition(i).getDataType(); 
+              if(not cat2partsUsed.at(cat).at(i) // not already there 
+                 && dataType != PLL_AA_DATA ) // we use an AA_MODEL as default for proteins 
+                partsUnused.push_back(i); 
+            }
+          break ;
+	case Category::SUBSTITUTION_RATES: 
+	  {
+	    for(nat i = 0; i < traln.getNumberOfPartitions() ; ++i )
+	      {
+		auto dataType = traln.getPartition(i).getDataType(); 
+		if(not cat2partsUsed.at(cat).at(i) // not already there 
+		   && dataType != PLL_AA_DATA
+		   && dataType != PLL_BINARY_DATA) // we use an AA_MODEL as default for proteins 
+		  partsUnused.push_back(i); 
+	      }
+	  }
+	  break; 
+	default: 
+	  assert(0); 
+	}
+      
+      if(partsUnused.size() == 0 )
+        continue; 
+
+
+
+      if(CategoryFuns::inUniqueByDefault(cat))
+	{
+	  auto numNeeded =  ( cat == Category::DIVERGENCE_TIMES ) ? (traln.getNumberOfInnerNodes(true))  : 1;
+	  for(int i = 0; i < numNeeded; ++i )
+            {
+              ++highestParamId; 
+              ++cat2idOfItsKind[cat]; 
+	      params.push_back(CategoryFuns::getParameterFromCategory(cat, highestParamId, cat2idOfItsKind[cat] , 
+								      partsUnused, traln.getNumberOfTaxa())); 
+            }
+	}
+      else 
+        {
+	  // add a parameter per partition 
+          for(auto p : partsUnused)
+            {
+              ++highestParamId;
+              ++cat2idOfItsKind[cat];
+	      params.push_back(CategoryFuns::getParameterFromCategory(cat, highestParamId, cat2idOfItsKind[cat], 
+								      {p}, traln.getNumberOfTaxa())); 
+            }
+        }
+    }
+
+
+  // TODO sanity check, whehther conflicting parameters are there...
+}
+
+
+void RunFactory::addStandardPrior(AbstractParameter* var, const TreeAln& traln )
+{
+  switch(var->getCategory())			// TODO such switches should be part of an object
+    {
+    case Category::TOPOLOGY:  
+      var->setPrior( make_unique<UniformPrior>(0,0) ); // TODO : proper topology prior? 
+      break; 
+      
+    case Category::DIVERGENCE_TIMES:
+      var->setPrior(make_unique<UniformPrior>(0,10)); 
+      break; 
+    case Category::DIVERGENCE_RATES: 
+    {
+      std::vector<double> cats(2*traln.getNumberOfTaxa() - 2, 1.0);
+      var->setPrior(make_unique<DirichletPrior>(cats));
+      break; 
+    }
+    case Category::BRANCH_LENGTHS: 
+      var->setPrior( make_unique<ExponentialPrior>(10.0 ));
+      break; 
+    case Category::FREQUENCIES: 
+      {
+	auto& partition = traln.getPartition(var->getPartitions()[0]);
+	assert(partition.getDataType() == PLL_DNA_DATA 
+	       || partition.getDataType() == PLL_AA_DATA 
+	       || partition.getDataType() == PLL_BINARY_DATA
+	       ); 
+	var->setPrior(std::unique_ptr<AbstractPrior>(new DirichletPrior(std::vector<double>(partition.getStates() , 1.)))); 
+      }
+      break; 
+    case Category::SUBSTITUTION_RATES: 
+      {
+	auto& partition = traln.getPartition(var->getPartitions()[0]);	;
+	var->setPrior( make_unique<DirichletPrior>( std::vector<double>(RateHelper::numStateToNumInTriangleMatrix(partition.getStates()), 1.) )); 
+      }
+      break; 
+    case Category::RATE_HETEROGENEITY: 
+      var->setPrior(make_unique<UniformPrior>(1e-6, 200)); 
+      break; 
+    case Category::AA_MODEL : 
+      {
+	auto modelProbs = std::unordered_map<ProtModel,double>{}; 
+	for(auto model : ProtModelFun::getAllModels())
+	  modelProbs[model] = 1.; 
+	auto&& prior =  make_unique<DiscreteModelPrior>(modelProbs);
+	var->setPrior(std::move(prior));
+      }
+      break; 
+    default: 
+      assert(0); 
+    }
+}
+
+
+void RunFactory::addPriorsToParameters(const TreeAln &traln,  const BlockPrior &priorInfo, ParameterList &variables)
+{
+  auto& priors = priorInfo.getPriors();
+
+  for(auto &v : variables)
+    {
+      auto partitionIds = v->getPartitions(); 
+      
+      auto cat = v->getCategory();
+      auto foundPrior = bool{false}; 
+
+      // try to find a partition specific prior 
+      for(auto iter = priors.find(cat) ; iter != priors.end() ; ++iter)
+	{
+	  auto &partitionsOfPrior = std::get<0>(iter->second); 
+	  foundPrior = std::any_of(begin(partitionIds), end(partitionIds), [&]( nat tmp ){  return partitionsOfPrior.find(tmp) != partitionsOfPrior.end(); } ); 
+	  
+	  auto& prior = *(std::get<1>(iter->second).get()); 
+
+	  if(foundPrior)
+	    {
+	      if(not v->priorIsFitting(prior, traln))
+		{
+		  tout  << "You forced prior " << &prior << " to be applied to parameter  "  << v << ". This is not possible. "  << std::endl; 
+		  exitFunction(-1, true);
+		}
+
+	      // tout << "setting prior " << &prior << 
+              // " for param "<< v.get() << std::endl; 
+
+	      v->setPrior( std::unique_ptr<AbstractPrior>(prior.clone()) ) ; 
+	      break; 
+	    }
+	}
+
+      // try to find a general prior 
+      if(not foundPrior)
+	{
+	  for(auto iter = priors.find(cat) ; iter != priors.end() ; ++iter)
+	    {
+	      auto &prior = *(std::get<1>(iter->second).get()); 
+
+	      if(not v->priorIsFitting(prior, traln))
+		continue; 
+
+	      auto &partitionsOfPrior = std::get<0>(iter->second); 
+	      foundPrior = partitionsOfPrior.size() ==  0; 
+	      if(foundPrior)
+		{
+		  // tout << "setting prior " << &prior << " for param "<< v.get() << std::endl; 
+		  v->setPrior( std::unique_ptr<AbstractPrior>(prior.clone()) ) ; 
+		  break; 
+		}
+	    }
+	}
+      
+      if(not foundPrior)
+	addStandardPrior(v,traln); 
+    }
+}
+
+
+void RunFactory::addSecondaryParameters(AbstractProposal* proposal,  ParameterList &allParameters, nat numTaxa)
+{
+  // TODO reduce code complexity 
+
+  auto primParams = proposal->getPrimaryParameterView(); 
+  
+  auto doingDivRates = std::any_of(begin(primParams), end(primParams), [](const AbstractParameter* param){return param->getCategory() == Category::DIVERGENCE_RATES; }); 
+  auto doingDivTimes = std::any_of(begin(primParams), end(primParams), [](const AbstractParameter* param){return param->getCategory() == Category::DIVERGENCE_TIMES; }); 
+
+  if(doingDivRates)
+    {
+//      auto tp = std::find_if(begin(allParameters), end(allParameters), [](const AbstractParameter* param){return param->getCategory() == Category::DIVERGENCE_TIMES; });
+//      proposal->addSecondaryParameter((*tp)->getId());
+      for(auto &p : allParameters)
+	{
+	  if(p->getCategory() == Category::DIVERGENCE_TIMES)
+	    {
+	      // now add all *other* div time parameters as secondary parameters
+	      proposal->addSecondaryParameter(p->getId());
+	    }
+	}
+    }
+  else if(doingDivTimes)
+    {
+      // what is our current primary parameter id?
+      assert(primParams.size() == 1 ); 
+      auto primId = primParams[0]->getId();
+
+      for(auto &p : allParameters)
+	{
+	  if(p->getCategory() == Category::DIVERGENCE_RATES)
+	    {
+	      // add the div-rates as a secondary paramater
+	      proposal->addSecondaryParameter(p->getId()); 
+	    }
+	  else if(p->getCategory() == Category::DIVERGENCE_TIMES && p->getId() != primId)
+	    {
+	      // now add all *other* div time parameters as secondary parameters 
+	      proposal->addSecondaryParameter(p->getId()); 
+	    }
+	}
+    }
+  else 
+    { 
+      // get all branch length pararemeters   
+      auto blParameters = allParameters.getViewByCategory(Category::BRANCH_LENGTHS);
+      bool needsBl = false; 
+  
+      auto myPartitions = std::unordered_set<nat> {}; 
+  
+      for(auto &p: proposal->getPrimaryParameterView())
+        {
+	  needsBl |=  ( p->getCategory() == Category::FREQUENCIES 
+			|| p->getCategory() == Category::SUBSTITUTION_RATES
+			|| p->getCategory() == Category::TOPOLOGY
+			|| p->getCategory() == Category::AA_MODEL
+                        ); 
+	  auto ps = p->getPartitions();
+          myPartitions.insert(ps.begin(), ps.end()); 
+        }
+
+      if(needsBl)
+        {
+          for(auto &blRandVar : blParameters)
+            {
+              auto partitions =  blRandVar->getPartitions();
+              if(std::any_of(partitions.begin(),partitions.end(), 
+                             [&](nat i){ return myPartitions.find(i) != myPartitions.end(); }))
+                proposal->addSecondaryParameter( blRandVar->getId() ); 
+	    }
+	}
+    }
+}
+
+
+
+std::tuple<std::vector<std::unique_ptr<AbstractProposal>>,std::vector<ProposalSet> > 
+RunFactory::produceProposals(const BlockProposalConfig &propConfig, const BlockPrior &priorInfo, 
+			     ParameterList  &params, const TreeAln &traln, bool componentWiseMH, ParallelSetup& pl)
+{
+  auto proposals = std::vector<std::unique_ptr<AbstractProposal> >{} ; 
+  auto resultPropSet = std::vector<ProposalSet >{} ; 
+  addPriorsToParameters(traln, priorInfo, params);
+
+  auto reg = ProposalRegistry{}; 
+
+  // instantiate all proposals that integrate over one parameter 
+  for(auto &v : params)
+    {
+      if(not v->getPrior()->needsIntegration() )
+	continue;
+
+      if( componentWiseMH && v->getCategory() != Category::TOPOLOGY )
+	continue; 
+      
+      auto tmpResult = reg.getSingleParameterProposals(v->getCategory(), propConfig,  traln, pl, params); 
+
+      // remove proposals that are not meant for DNA/AA
+      if(v->getCategory() == Category::SUBSTITUTION_RATES)
+	{
+	  // bool isProtPartition = traln.getPartition(v->getPartitions().at(0)).dataType == AA_DATA; 
+	  bool isDNAPartition = traln.getPartition(v->getPartitions().at(0)).getDataType() == PLL_DNA_DATA; 
+	  auto tmp = decltype(tmpResult){}; 
+	  for(auto &elem : tmpResult )
+	    {
+	      if( not ( elem->isForProteinOnly() && isDNAPartition ) ) // TODO more generic!  
+		tmp.push_back(std::move(elem)); 
+	    }
+	  tmpResult.clear(); 
+	  tmpResult = std::move( tmp ) ; 
+	}
+      
+      for(auto &p : tmpResult )
+	{
+	  p->addPrimaryParameter(v->getId());
+	  addSecondaryParameters(p.get(), params, traln.getNumberOfTaxa()); 
+	}
+
+      // dammit...
+      for(auto it = tmpResult.begin(); it != tmpResult.end(); )
+	{
+	  proposals.emplace_back(std::move(*it));
+	  it = tmpResult.erase(it);
+	}
+    }
+
+  // instantiate proposals that integrate over multiple over an entire
+  // category gather all parameters that we can integrate over
+  // together in a partitioned manner and output a good set of
+  // proposals
+  nat blCtr = 0; 
+  auto mashableParameters = std::vector<AbstractParameter*>{}; 
+  for(auto &v : params)
+    {
+      if(not v->getPrior()->needsIntegration() ) 
+	continue;
+
+      // those are prototypes! non-owning pointers 
+      switch(v->getCategory())
+	{
+	case Category::DIVERGENCE_RATES: 
+	case Category::DIVERGENCE_TIMES: 
+	case Category::SUBSTITUTION_RATES: 
+	case Category::FREQUENCIES:
+	case Category::RATE_HETEROGENEITY: 
+	case Category::AA_MODEL:	
+	  mashableParameters.push_back(v); 
+	  break; 
+	case Category::BRANCH_LENGTHS:
+	  {
+	    mashableParameters.push_back(v); 
+	    ++blCtr; 
+	  }
+	case Category::TOPOLOGY:
+	  break; 
+	default: 
+	  ;
+	}
+    }  
+
+  // TODO that's all a bit cumbersome, has to be re-designed a bit 
+  if(componentWiseMH)
+    {
+      auto cat2param = std::unordered_map<Category, std::vector<AbstractParameter*> >{}; 
+      for(auto &p:  mashableParameters)
+	cat2param[p->getCategory()].push_back(p); 
+
+      for(auto &elem : cat2param)
+	{
+	  auto proposalsForSet = reg.getSingleParameterProposals(elem.first, propConfig, traln, pl,params );
+
+	  // filter out proposals that do not fit the current data
+	  // type of
+	  // TODO improve the setup here 
+	  if(std::get<0>(elem) == Category::SUBSTITUTION_RATES)
+	    {
+	      // bool isProtPartition = traln.getPartition(std::get<1>(elem).at(0)->getPartitions().at(0)).dataType == AA_DATA; 
+	      bool isDNAPartition = traln.getPartition(std::get<1>(elem).at(0)->getPartitions().at(0)).getDataType() == PLL_DNA_DATA; 
+	      auto tmp = decltype(proposalsForSet){}; 
+	      for(auto &elem2 : proposalsForSet )
+		{
+		  if( not ( elem2->isForProteinOnly() &&  isDNAPartition ) ) // TODO more generic! 
+		    tmp.push_back(std::move(elem2)); 
+		}
+	      proposalsForSet.clear(); 
+	      proposalsForSet = std::move( tmp ) ; 
+	    }	  
+	  
+	  // this and the above for-loop essentially produce all
+	  // proposals, that we'd also obtain in the default case =>
+	  // but we need a set of it
+	  for(auto &proposalType : proposalsForSet)
+	    {
+	      auto lP = std::vector<std::unique_ptr<AbstractProposal> >{}; 	      
+	      for(auto &p : elem.second)
+		{
+		  auto proposalClone = std::unique_ptr<AbstractProposal>(proposalType->clone()); 
+		  proposalClone->addPrimaryParameter(p->getId());
+		  addSecondaryParameters(proposalClone.get(), params, traln.getNumberOfTaxa()); 
+		  lP.push_back(std::move(proposalClone));		  
+		} 
+	      proposalType->setInSetExecution(true);
+
+	      resultPropSet.emplace_back(lP[0]->getRelativeWeight(), std::move(lP)); 
+	    }
+	}
+    }
+
+  return std::make_tuple(std::move(proposals), resultPropSet); 
+}
+
diff --git a/src/system/RunFactory.hpp b/src/system/RunFactory.hpp
new file mode 100644
index 0000000..b558510
--- /dev/null
+++ b/src/system/RunFactory.hpp
@@ -0,0 +1,50 @@
+/**
+   @file RunFactory
+
+   @brief an essential class that uses all available information to
+   create the exact setup of the run in terms of priors, proposals and
+   so on
+
+
+*/ 
+
+
+#ifndef _PROPOSALFACTORY
+#define _PROPOSALFACTORY
+
+#include <vector>
+
+#include "ProposalSet.hpp"
+#include "BlockProposalConfig.hpp"
+#include "BlockPrior.hpp"
+#include "BlockParams.hpp"
+#include "AbstractProposal.hpp"
+#include "TreeAln.hpp"
+#include "GlobalVariables.hpp"
+#include "AbstractParameter.hpp"
+#include "ParameterList.hpp"
+
+
+class RunFactory
+{
+public:  
+  /** 
+      @brief configures the proposals 
+  */ 
+  std::tuple<std::vector<std::unique_ptr<AbstractProposal> >, std::vector<ProposalSet> >
+  produceProposals(const BlockProposalConfig &propConfig, const BlockPrior &priorInfo, 
+		   ParameterList  & params, const TreeAln &traln, bool componentWiseMH, ParallelSetup& pl  ); 
+  /** 
+      @brief get a copy of the random variables to be integrated  
+   */ 
+  void addStandardParameters(std::vector<std::unique_ptr<AbstractParameter> > &vars, const TreeAln &traln ) const; 
+private: 			// METHODS 
+  void addStandardPrior(AbstractParameter* var, const TreeAln& traln ); 
+  void addPriorsToParameters(const TreeAln &traln,  const BlockPrior &priorInfo,  ParameterList  &variables); 
+  /** 
+      @brief adds secondary parameters to proposals, if necessary (currently only branch lengths)
+  */ 
+  void addSecondaryParameters(AbstractProposal* proposal,  ParameterList  &allParameters, nat numTaxa); 
+}; 
+
+#endif
diff --git a/src/system/Serializable.cpp b/src/system/Serializable.cpp
new file mode 100644
index 0000000..9f19dd5
--- /dev/null
+++ b/src/system/Serializable.cpp
@@ -0,0 +1,151 @@
+#include "Serializable.hpp"
+#include "GlobalVariables.hpp"
+#include "log_double.hpp"
+
+
+void Serializable::getOfstream(std::string name, std::ofstream &result)
+{
+  if(checkpointIsBinary)
+    result.open(name, std::ios::binary); 
+  else 
+    result.open(name); 
+}
+
+
+
+void Serializable::getIfstream(std::string name, std::ifstream &result )
+{
+  if(checkpointIsBinary)
+    result.open(name, std::ios::binary); 
+  else 
+    result.open(name); 
+}
+
+
+
+void Serializable::readDelimiter(std::istream &in)  
+{
+  char c; 
+  in >> c ; 
+  assert(c == DELIM); 
+}
+
+
+std::string Serializable::readString(std::istream &in )
+{
+  auto result = std::string{}; 
+
+  if(checkpointIsBinary)
+    {
+      int length = 0; 
+      in.read((char*)&length, sizeof(int)); 
+      
+      result.resize(length) ;
+      char *aString  = new char[length]; 
+      // auto aString = std::vector<char> (length, '\0');
+      in.read(aString, length * sizeof(char));       
+      result = std::string(aString); 
+      delete [] aString; 
+      // result = std::string(aString.begin(), aString.end());
+    }
+  else 
+    {      
+      getline(in, result, DELIM); 
+    }
+  return result; 
+}
+
+void Serializable::writeString(std::ostream &out, std::string toWrite) const 
+{  
+  if(checkpointIsBinary)
+    {
+      toWrite += '\0'; 
+      int length = int(toWrite.size()); 
+      out.write((char*)&length, sizeof(int)); 
+      out.write(toWrite.c_str(), length * sizeof(char)); 
+    }
+  else  
+    {
+      out << toWrite << DELIM; 
+    }
+}
+
+
+
+
+template<> log_double Serializable::cRead<log_double>(std::istream &in)  
+{
+  double tmp = cRead<double>(in); 
+  return log_double::fromLog(tmp); 
+}
+
+template<> void Serializable::cWrite<log_double>( std::ostream &out, const log_double &val )  const 
+{
+  double tmp = (double)val.getRawLog(); 
+  cWrite(out,  tmp); 
+}
+
+
+
+
+
+template<typename T>
+void Serializable::cWrite(std::ostream &out, const T& toWrite) const 
+{
+  static_assert(std::is_fundamental<T>::value, "only serialization of fundamental types allowed."); 
+
+  static_assert(not std::is_same<T, std::string>::value, "Do NOT use the cWrite funciton with strings (there is a specific function for that)");
+
+  // std::cout << "wrote " << toWrite << std::endl; 
+  
+  if(checkpointIsBinary)
+    {      
+      out.write((const char*)&toWrite, sizeof(T)); 
+      // std::cout << "WROTE " << toWrite << std::endl;
+    }
+  else 
+    {
+      out << std::scientific << MAX_SCI_PRECISION; 
+      out << toWrite << DELIM; 
+    }
+}
+template void Serializable::cWrite<int>(std::ostream &out, const int& toWrite) const ;
+template void Serializable::cWrite<nat>(std::ostream &out, const nat& toWrite) const ;
+template void Serializable::cWrite<long>(std::ostream &out, const long& toWrite) const ;
+template void Serializable::cWrite<double>(std::ostream &out, const double& toWrite) const ;
+template void Serializable::cWrite<unsigned long>(std::ostream &out, const unsigned long& toWrite) const ;
+template void Serializable::cWrite<unsigned long long>(std::ostream &out, const unsigned long long& toWrite) const ;
+
+
+
+template<typename T>
+T Serializable::cRead(std::istream &in )
+{
+  static_assert(std::is_fundamental<T>::value, "only serialization of fundamental types allowed."); 
+  
+  T result; 
+
+  static_assert(not std::is_same<T, std::string>::value, "Do NOT use the cRead funciton with strings (there is a specific function for that)");
+
+  if(checkpointIsBinary)
+    {
+      in.read((char*)&result, sizeof(T)); 
+      // std::cout << "READ " << result << std::endl; 
+    }
+  else 
+    {
+      in >> result; 
+      // std::cout <<  "READ " << result << std::endl; 
+      readDelimiter(in);
+    }
+
+  // std::cout << "read " << result << std::endl; 
+
+  return result; 
+}
+template int Serializable::cRead(std::istream &in );
+template nat Serializable::cRead(std::istream &in );
+template long Serializable::cRead(std::istream &in );
+template double Serializable::cRead(std::istream &in );
+template unsigned long Serializable::cRead(std::istream &in );
+template unsigned long long Serializable::cRead(std::istream &in );
diff --git a/src/system/Serializable.hpp b/src/system/Serializable.hpp
new file mode 100644
index 0000000..9ef7958
--- /dev/null
+++ b/src/system/Serializable.hpp
@@ -0,0 +1,49 @@
+#ifndef _CHECKPOINTABLE_H 
+#define _CHECKPOINTABLE_H 
+
+#include <iostream>
+#include <cassert>
+#include <fstream>
+#include <iomanip>
+#include <limits>
+#include "common.h"
+
+
+class Serializable
+{
+public: 			// INHERITED METHODS 
+  virtual void deserialize( std::istream &in )  = 0 ; 
+  virtual void serialize( std::ostream &out) const = 0;   
+
+public: 
+  Serializable()
+    : DELIM('&')
+    , checkpointIsBinary(true)
+  {}
+
+  Serializable(const Serializable& rhs) = default; 
+  Serializable( Serializable&& rhs) = default; 
+  Serializable& operator=(const Serializable &rhs)  = default; 
+  Serializable& operator=( Serializable &&rhs)  = default; 
+
+  virtual ~Serializable(){}
+
+  void getOfstream(std::string name, std::ofstream &result); 
+  void getIfstream(std::string name, std::ifstream &result ); 
+
+  template<typename T> void cWrite(std::ostream &out, const T &toWrite) const; 
+  template<typename T> T cRead(std::istream &in); 
+
+  std::string readString(std::istream &in ); 
+  void writeString(std::ostream &out, std::string toWrite) const; 
+
+private: 			// METHODS
+  void readDelimiter(std::istream &in) ; 
+
+private: 			// ATTRIBUTES 
+  char DELIM; 
+  bool checkpointIsBinary; 
+}; 
+
+
+#endif
diff --git a/src/system/SyncOut.hpp b/src/system/SyncOut.hpp
new file mode 100644
index 0000000..4b2ee5c
--- /dev/null
+++ b/src/system/SyncOut.hpp
@@ -0,0 +1,42 @@
+#ifndef _SYNC_OSTREAM_HPP
+#define _SYNC_OSTREAM_HPP
+
+#include <sstream>
+#include <mutex>
+#include "GlobalVariables.hpp"
+
+/** 
+    thread safe stream
+*/ 
+
+
+class SyncOut
+{
+public: 
+  SyncOut()
+    : _lock(mtx)
+    , _ss{}
+  {
+  }
+  
+  ~SyncOut(){}
+
+  template<typename T>
+  friend SyncOut& operator<<(SyncOut& out, T elem)
+  {
+    out._ss << elem ; 
+    return out; 
+  }
+
+  friend std::ostream& operator<<(std::ostream &out, const SyncOut& rhs)
+  {
+    out << rhs._ss.str() ; 
+    return out; 
+  }
+  
+private :
+  std::lock_guard<std::mutex> _lock; 
+  std::stringstream _ss; 
+}; 
+
+#endif
diff --git a/src/system/TeeStream.hpp b/src/system/TeeStream.hpp
new file mode 100644
index 0000000..2b934be
--- /dev/null
+++ b/src/system/TeeStream.hpp
@@ -0,0 +1,68 @@
+#ifndef _TEE_STREAM_H
+#define _TEE_STREAM_H
+
+#include "Teebuf.hpp"
+#include <iostream>
+#include <unordered_set>
+#include <vector>
+
+
+// START definition 
+template<typename T> std::ostream& operator<<(std::ostream& out, std::vector<T> elems); 
+template<typename T> std::ostream& operator<<(std::ostream& out, std::unordered_set<T> elems); 
+// END 
+
+
+
+template<typename T>
+std::ostream& operator<<(std::ostream& out, std::vector<T> elems)
+{
+  bool isFirst = true; 
+  for(auto &elem : elems)
+    {
+      if(isFirst) 
+	isFirst = false; 
+      else 
+	out << "," ; 
+      out << elem ; 
+    }
+  return out; 
+}
+
+
+template<typename T>
+std::ostream& operator<<(std::ostream& out, std::unordered_set<T> elems)
+{
+  bool isFirst = true; 
+  for(auto &elem : elems)
+    {
+      if(isFirst)
+	isFirst = false; 
+      else 
+	out << "," ; 
+      out << elem; 
+    }
+
+  return out; 
+}
+
+
+
+
+
+
+class TeeStream : public std::ostream
+{
+public:   
+  TeeStream(std::ostream &o1, std::ostream &o2, std::thread::id tid)
+    : std::ostream(&tbuf)
+    ,tbuf(*o1.rdbuf(), *o2.rdbuf(), tid)
+  {}
+
+  void disable(){tbuf.disable();}
+  
+private :
+  Teebuf tbuf; 
+}; 
+
+#endif
diff --git a/src/system/Teebuf.cpp b/src/system/Teebuf.cpp
new file mode 100644
index 0000000..897fbfe
--- /dev/null
+++ b/src/system/Teebuf.cpp
@@ -0,0 +1,42 @@
+#include "Teebuf.hpp" 
+
+
+Teebuf::Teebuf(std::streambuf &_sb1, std::streambuf &_sb2, std::thread::id masterThread)
+  : sb1(_sb1)
+  , sb2(_sb2)
+  , isDisabled(false)
+  , _masterThread(masterThread)
+{
+}
+
+
+int Teebuf::overflow(int c)
+{
+  if( MY_TID != _masterThread)
+    return 0; 
+  
+  if(isDisabled) 
+    return EOF; 
+  
+  if(  c == EOF)      
+    return !EOF; 
+  else 
+    {	
+      auto r1 = sb1.get().sputc(char(c)); 
+      auto r2 = sb2.get().sputc(char(c));
+      return r1 == EOF || r2 == EOF ? EOF : c ; 
+    }
+}
+
+
+
+int Teebuf::sync()
+{
+  if(not isDisabled ) 
+    {
+      auto r1 = sb1.get().pubsync();
+      auto r2 = sb2.get().pubsync();
+      return r1 == 0 && r2 == 0 ? 0 : -1; 
+    }
+  return 0; 
+}
diff --git a/src/system/Teebuf.hpp b/src/system/Teebuf.hpp
new file mode 100644
index 0000000..e07c3c5
--- /dev/null
+++ b/src/system/Teebuf.hpp
@@ -0,0 +1,24 @@
+#ifndef _TEE_BUF_H
+#define _TEE_BUF_H
+
+#include "threadDefs.hpp"
+#include <streambuf>
+
+class Teebuf : public std::streambuf
+{
+public: 
+  Teebuf(std::streambuf &_sb1, std::streambuf &_sb2, std::thread::id masterThread); 
+  void disable() {isDisabled = true; }
+  
+private: 
+  virtual int overflow(int c); 
+  virtual int sync(); 
+
+  std::reference_wrapper<std::streambuf> sb1; 
+  std::reference_wrapper<std::streambuf> sb2; 
+  bool isDisabled; 
+  std::thread::id _masterThread; 
+}; 
+
+
+#endif
diff --git a/src/system/TimeTracker.cpp b/src/system/TimeTracker.cpp
new file mode 100644
index 0000000..4523807
--- /dev/null
+++ b/src/system/TimeTracker.cpp
@@ -0,0 +1,67 @@
+#include "TimeTracker.hpp"
+
+TimeTracker::TimeTracker(size_t numCpu)
+  : _timePoint{getTimePoint()}
+  , _accWallTime{0.}
+  , _accCpuTime{0.}
+  , _numCpu{numCpu}
+{
+}
+
+
+double TimeTracker::getDuration(CLOCK::system_clock::time_point tp )
+{
+  return CLOCK::duration_cast<CLOCK::duration<double> > (CLOCK::system_clock::now()- tp   ).count(); 
+} 
+
+
+CLOCK::system_clock::time_point TimeTracker::getTimePoint()
+{
+  return CLOCK::system_clock::now(); 
+} 
+
+
+void TimeTracker::deserialize( std::istream &in )
+{
+  _accWallTime = cRead<decltype(_accWallTime)>(in);
+  _accCpuTime = cRead<decltype(_accCpuTime)>(in); 
+}
+
+
+void TimeTracker::serialize( std::ostream &out) const 
+{
+  cWrite<decltype(_accWallTime)>(out, _accWallTime);
+  cWrite<decltype(_accCpuTime)>(out, _accCpuTime);
+}
+
+
+
+double TimeTracker::getRecentElapsed() const 
+{
+  return getDuration(_timePoint); 
+}
+
+ 
+void TimeTracker::updateTime()
+{
+  auto wallTimeElapsed = getDuration(_timePoint); 
+  _accWallTime += wallTimeElapsed; 
+  _accCpuTime += double(_numCpu) * wallTimeElapsed; 
+  _timePoint = getTimePoint();
+}  
+
+
+std::array<double,3>
+TimeTracker::formatForWatch(double time )  
+{
+  auto altFormat = std::array<double,3>();
+
+  auto tmp = time; 
+  altFormat[0] = int(tmp / 3600); 
+  tmp -= altFormat[0] * 3600 ; 
+  altFormat[1] = int(tmp / 60); 
+  tmp -= altFormat[1] * 60 ; 
+  altFormat[2] = tmp ; 
+
+  return altFormat; 
+}
diff --git a/src/system/TimeTracker.hpp b/src/system/TimeTracker.hpp
new file mode 100644
index 0000000..810a424
--- /dev/null
+++ b/src/system/TimeTracker.hpp
@@ -0,0 +1,45 @@
+#ifndef TIMETRACKER_H
+#define TIMETRACKER_H
+
+#include <chrono> 
+#include <ratio>
+#include <array>
+#define CLOCK std::chrono  
+
+#include "Serializable.hpp"
+
+
+class TimeTracker : public Serializable
+{
+public: 
+  virtual void deserialize( std::istream &in ); 
+  virtual void serialize( std::ostream &out) const;
+
+public: 
+  TimeTracker(size_t numCpu);
+  TimeTracker(const TimeTracker& rhs) = default; 
+  TimeTracker( TimeTracker&& rhs) = default; 
+  TimeTracker& operator=(const TimeTracker &rhs)  = default; 
+  TimeTracker& operator=( TimeTracker &&rhs)  = default; 
+
+  double getRecentElapsed() const ; 
+  void updateTime(); 
+  
+  double getAccWallTime()const {return _accWallTime; } 
+  double getAccCpuTime() const {return _accCpuTime; } 
+
+  static double getDuration(CLOCK::system_clock::time_point tp );
+  static CLOCK::system_clock::time_point getTimePoint(); 
+  static std::array<double,3> formatForWatch(double time )  ; 
+
+private:
+  CLOCK::system_clock::time_point _timePoint; 
+
+  double _accWallTime; 
+  double _accCpuTime; 
+
+  size_t  _numCpu; 
+}; 
+
+
+#endif /* TIMETRACKER_H */
diff --git a/src/system/VectAlign.hpp b/src/system/VectAlign.hpp
new file mode 100644
index 0000000..e9543b3
--- /dev/null
+++ b/src/system/VectAlign.hpp
@@ -0,0 +1,12 @@
+#ifndef _MY_VECT_ALIGN_HPP
+#define _MY_VECT_ALIGN_HPP
+
+
+enum class VectAlign : size_t
+{
+Normal = sizeof(void*),
+  SSE    = 16,
+  AVX    = 32
+  };
+
+#endif
diff --git a/src/system/extensions.cpp b/src/system/extensions.cpp
new file mode 100644
index 0000000..6b4489f
--- /dev/null
+++ b/src/system/extensions.cpp
@@ -0,0 +1,67 @@
+#include "extensions.hpp"
+#include <cassert>
+
+
+void formatRange(std::ostream &out, const std::vector<nat> &values) 
+{
+  bool inRange = false; 
+  for(auto iter = begin(values); iter != end(values) ; ++iter )
+    {
+      if(iter == begin(values))
+	out << *iter; 
+      else if(iter == end(values) -1 )
+	{
+	  if(inRange)
+	    out << "-" << *iter ;  
+	  else 
+	    out << "," << *iter; 
+	}
+      else 
+	{ 
+	  bool haveBeenInRange = ((iter-1) ==  begin(values)) || inRange; 
+	  inRange = *iter == *(iter-1) + 1;  
+
+	  if(not haveBeenInRange )
+	    {
+	      out << "," << *iter ; 
+	    }
+	  else
+	    {
+	      if(not inRange)
+		out << "-" << *iter; 
+	    }
+	}
+    }
+  
+}
+
+
+template<typename T, int ALIGN>
+T* aligned_malloc( size_t size )
+{
+  T *ptr = NULL; 
+  int res = posix_memalign((void**)&ptr, ALIGN, sizeof(T) * size); 
+  assert(res == 0); 
+  assert(ptr != NULL); 
+  return ptr; 
+}
+template int* aligned_malloc<int,size_t(EXA_ALIGN)>( size_t size ) ; 
+template nat* aligned_malloc<nat,size_t(EXA_ALIGN)>( size_t size ) ; 
+template unsigned char* aligned_malloc<unsigned char,size_t(EXA_ALIGN)>( size_t size ) ; 
+template double* aligned_malloc<double,size_t(EXA_ALIGN)>( size_t size ) ; 
+
+
+
+std::string getEnvironmentVariable( const std::string  & key ) 
+{
+  char * val;                                                                        
+  val = getenv( key.c_str() );                                                       
+  std::string retval = "";                                                           
+  
+  if (val != NULL) 
+    { 
+      retval = val;                                                                    
+    } 
+  
+  return retval;                                                                        
+}
diff --git a/src/system/extensions.hpp b/src/system/extensions.hpp
new file mode 100644
index 0000000..94f63b3
--- /dev/null
+++ b/src/system/extensions.hpp
@@ -0,0 +1,83 @@
+#ifndef _MY_EXTENSIONS_HPP
+#define _MY_EXTENSIONS_HPP
+
+#include <vector>
+#include <type_traits>
+
+#include <memory>
+#include <iostream>
+
+#include "log_double.hpp"
+
+#include "common.h"
+
+#define PRINT(x) (tout << "#x=x"  << std::endl) 
+
+
+#if ! defined(HAVE_CXX14)
+
+namespace std{
+// START definitions
+template<typename T, typename ...Args> std::unique_ptr<T> make_unique( Args&& ...args );
+// END
+
+// still missing in c++11.
+
+template<typename T, typename ...Args>
+std::unique_ptr<T> make_unique( Args&& ...args )
+{
+  return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) );
+}
+
+}
+#endif
+
+
+// a bit more number formatting  
+template<typename T> class ThousandsSeparator : public std::numpunct<T> 
+{
+public:
+  ThousandsSeparator(T Separator) : m_Separator(Separator) {}
+
+protected:
+  std::string do_grouping() const
+  {
+    return "\03";
+  }
+
+private:
+    T m_Separator;
+}; 
+
+void formatRange(std::ostream &out, const std::vector<nat> &values) ; 
+
+template<typename T> struct shared_pod_ptr
+{
+  shared_pod_ptr(T *arg = nullptr)
+    : _impl{arg, [](T* bla){ free(bla) ; }}
+  {}
+  
+  T* get() {return _impl.get() ; }
+
+private: 
+  std::shared_ptr<T> _impl; 
+}; 
+
+template<typename T, int ALIGN> T* aligned_malloc( size_t size ); 
+
+
+
+#include "AlignedAllocator.hpp"
+
+
+template<typename T>
+struct aligned_vector
+{
+typedef std::vector<T, AlignedAllocator<T, EXA_ALIGN> >  type; 
+}; 
+
+// that's mostly for development. accessing an environment variable is easier than 
+std::string getEnvironmentVariable( const std::string  & key ) ; 
+
+
+#endif
diff --git a/src/system/log_double.cpp b/src/system/log_double.cpp
new file mode 100644
index 0000000..48fde59
--- /dev/null
+++ b/src/system/log_double.cpp
@@ -0,0 +1,40 @@
+#include "log_double.hpp"
+
+
+log_double exponentiate(log_double val, double exponent) 
+{
+  val._val *= exponent; 
+  return val; 
+}
+
+
+std::ostream& operator<<(std::ostream& out, const log_double& rhs )
+{
+  out << rhs._val ;
+  return out; 
+}
+
+
+log_double operator/(  const log_double& lhs , const log_double &rhs )
+{
+  return lhs * exponentiate(rhs,-1); 
+}
+
+log_double operator*( const log_double& lhs, const log_double &rhs)
+{
+#if 0 
+  auto result = lhs; 
+  result._error = lhs._error + rhs._error; 
+
+  auto y = rhs._val - result._error; 
+  auto t = result._val + y ; 
+  result._error = (t - result._val)  -  y ; 
+  result._val = t; 
+  return result;  
+#else 
+  auto result = lhs ; 
+  result._val += rhs._val; 
+  return result; 
+#endif 
+
+}
diff --git a/src/system/log_double.hpp b/src/system/log_double.hpp
new file mode 100644
index 0000000..387d498
--- /dev/null
+++ b/src/system/log_double.hpp
@@ -0,0 +1,121 @@
+#ifndef _LOG_DOUBLE
+#define _LOG_DOUBLE
+
+#include <cmath>
+#include <ostream>
+#include <cassert>
+
+#include <limits>
+
+#include "GlobalVariables.hpp"
+
+
+class log_double
+{
+public: 
+  log_double()
+    : _val{0}
+    , _error{0}
+  {
+  }
+
+  static log_double fromAbs(double val)
+  {
+    if(  val <= 0 )
+      {
+	tout << "error: tried to create a log-double of " <<  val << std::endl; 
+	assert(val > 0 ); 
+      }
+    
+    auto result = log_double();
+    result._val = log(val); 
+    return result; 
+  }
+
+  static log_double fromLog(double val )
+  {
+    auto result = log_double();
+    result._val = val; 
+    return result; 
+  }
+  
+  // could overload numeric_limits<log_double>::min()
+  static log_double lowest()
+  {
+    auto result = log_double::fromAbs(1.); 
+    result._val = std::numeric_limits<double>::lowest();
+    return result; 
+  }
+  
+  bool isNegativeInfinity() const 
+  {
+    return isInfinity() && _val < 0. ; 
+  }
+
+  bool isInfinity() const 
+  {
+    return std::isinf( _val ); 
+  }
+
+  bool isNaN() const 
+  {
+    return std::isnan(_val); 
+  }
+
+  // maybe allow this again, if we can be sure that log_double is used
+  // carefully.
+
+  // operator double()
+  // {
+  //   auto tmp = exp(_val); 
+  //   return tmp; 
+  // }
+
+  double toAbs() const 
+  {
+    return exp(_val); 
+  }
+
+  static log_double negativeInfinity()
+  {
+    auto result = log_double (); 
+    result._val = 0; 
+    return result; 
+  }
+
+  friend bool operator<(const log_double& lhs, const log_double& rhs)
+  {
+    return lhs._val < rhs._val; 
+  }
+
+
+  friend void operator /= (log_double &lhs, const log_double &rhs)
+  {
+    lhs = lhs / rhs; 
+  }
+
+  friend void operator*= (log_double &lhs, const log_double& rhs)
+  {
+    lhs = lhs * rhs; 
+  }
+
+  friend log_double operator/(  const log_double &lhs , const log_double &rhs ); 
+  friend log_double operator*( const log_double& lhs, const log_double &rhs); 
+
+  
+  // this is only meant for communication with PLL
+  double getRawLog() const 
+  {
+    return _val; 
+  }
+
+
+  friend log_double exponentiate(log_double val, double exponent); 
+  friend std::ostream& operator<<(std::ostream& out, const log_double& rhs ); 
+
+private: 
+  double _val; 
+  double _error; 
+}; 
+
+#endif
diff --git a/src/system/memory.hpp b/src/system/memory.hpp
new file mode 100644
index 0000000..efd9db2
--- /dev/null
+++ b/src/system/memory.hpp
@@ -0,0 +1,18 @@
+#ifndef _MEMORY_HPP
+#define _MEMORY_HPP
+
+#ifdef _DEVEL
+
+#include <stdio.h>
+#include <proc/readproc.h>
+
+uint64_t getCurrentMemory()
+{
+  struct proc_t usage;
+  look_up_our_self(&usage);
+  return usage.vsize; 
+}
+
+
+#endif
+#endif
diff --git a/src/tree-parse/BasicTreeReader.cpp b/src/tree-parse/BasicTreeReader.cpp
new file mode 100644
index 0000000..4441629
--- /dev/null
+++ b/src/tree-parse/BasicTreeReader.cpp
@@ -0,0 +1,123 @@
+#include "BasicTreeReader.hpp"	// 
+// #include "Branch.hpp"
+#include "LabelPolicy.hpp"
+
+#include <tuple>
+#include <cassert>
+
+
+template<class LABEL_READER,class BL_READER>
+BasicTreeReader<LABEL_READER,BL_READER>::BasicTreeReader( nat numTax )
+  : _highestInner{numTax + 1 }
+  , lr{}
+  , br{}
+{
+}
+
+template<class LABEL_READER,class BL_READER>
+inline void BasicTreeReader<LABEL_READER, BL_READER>::expectChar(std::istream &iss, int ch)
+{
+  int got = iss.get(); 
+  if(ch != got)
+    {
+      std::cerr << "expected >" << char(ch) << "<, got >"  <<  char(got) << "<" << std::endl; 
+      exitFunction(-1, false); 
+    }
+}
+
+
+template<class LABEL_READER, class BL_READER>
+std::tuple<nat,double> BasicTreeReader<LABEL_READER,BL_READER>::parseElement(std::istream &iss)
+{
+  auto bl = double{ nan("") };  
+  auto label = lr.readLabel(iss);
+
+  int ch = iss.peek(); 
+  if(ch == ':')
+    {
+      expectChar(iss,':');
+      bl = br.readBranchLength(iss);
+    }
+  else 
+    {
+      std::cerr << "did not find bl for label " << label << std::endl; 
+    }
+
+  return std::make_tuple(label, bl);
+}
+
+
+template<class LABEL_READER,class BL_READER>
+void BasicTreeReader<LABEL_READER, BL_READER>::addBranch(nat label, std::tuple<nat,double> subtree, std::vector<BranchLength> &branches) const 
+{
+  auto label2 = 0u;
+  auto len = 0.;
+
+  std::tie(label2,len) = subtree;
+
+  assert(label2 != 0u && label != 0u);
+
+  branches.emplace_back(BranchPlain(label, label2),len);
+}
+
+
+template<class LABEL_READER,class BL_READER>
+std::tuple<nat,double> BasicTreeReader<LABEL_READER, BL_READER>::parseSubTree(std::istream &iss, std::vector<BranchLength> &branches, bool toplevel) 
+{
+  int ch = iss.peek(); 
+  auto label = nat{0}; 
+  auto bl = double{nan("")};  
+
+  if(ch != '(')			// must be a taxon label  
+    {
+      return parseElement(iss);
+    }
+  else 				// true tree 
+    {
+      expectChar(iss,'(');
+
+      label = _highestInner; 
+      ++_highestInner;
+
+      auto res  = parseSubTree(iss,branches, false);
+      addBranch(label, res, branches); 
+      expectChar(iss,',');
+      res = parseSubTree(iss,branches, false);
+      addBranch(label, res, branches); 
+
+      if(toplevel)
+	{
+	  expectChar(iss,','); 
+	  res = parseSubTree(iss,branches, false); 
+	  addBranch(label, res, branches); 
+	}
+
+      expectChar(iss,')'); 
+      
+      if(iss.peek() == ':'  )
+	{
+	  expectChar(iss,':');
+	  bl = br.readBranchLength(iss);
+	}
+    }
+
+  return std::make_tuple(label,bl); 
+}
+
+
+template<class LABEL_READER,class BL_READER>
+std::vector<BranchLength> BasicTreeReader<LABEL_READER, BL_READER>::extractBranches(std::istream &iss ) 
+{
+  auto result = std::vector<BranchLength>{}; 
+
+  parseSubTree(iss, result, true);
+  expectChar(iss,';');
+
+  return result; 
+}
+
+
+template class BasicTreeReader<IntegerLabelReader,ReadBranchLength>; 
+template class BasicTreeReader<IntegerLabelReader,IgnoreBranchLength>; 
+template class BasicTreeReader<NameLabelReader,ReadBranchLength>; 
+template class BasicTreeReader<NameLabelReader,IgnoreBranchLength>; 
diff --git a/src/tree-parse/BasicTreeReader.hpp b/src/tree-parse/BasicTreeReader.hpp
new file mode 100644
index 0000000..41be17d
--- /dev/null
+++ b/src/tree-parse/BasicTreeReader.hpp
@@ -0,0 +1,38 @@
+#ifndef _BASIC_TREE_READER
+#define _BASIC_TREE_READER
+
+#include <string>
+#include <vector>
+#include <sstream>
+
+#include "BranchLength.hpp"
+
+#include "BranchLengthPolicy.hpp"
+#include "LabelPolicy.hpp"
+#include <iosfwd>
+// #include "Branch.hpp"
+
+typedef unsigned int nat; 
+
+template<class LABEL_READER,class BL_READER>
+class BasicTreeReader
+{
+public: 
+  BasicTreeReader( nat numTax ); 
+  std::vector<BranchLength> extractBranches(std::istream &iss) ; 
+  void setLabelMap(std::unordered_map<std::string,nat> map) { lr.setLabelMap(map) ; }
+  
+private: 			// METHODS 
+  double parseFloat(std::istream &iss); 
+  std::tuple<nat,double> parseSubTree( std::istream &iss,std::vector<BranchLength> &branches, bool ) ; 
+  std::tuple<nat,double> parseElement(std::istream &iss); 
+  void expectChar(std::istream &iss,int ch); 
+  void addBranch(nat label, std::tuple<nat,double> subtree, std::vector<BranchLength> &branches) const ; 
+  
+private: 
+  nat _highestInner; 
+  LABEL_READER lr; 
+  BL_READER br; 
+}; 
+
+#endif
diff --git a/src/tree-parse/BranchLengthPolicy.hpp b/src/tree-parse/BranchLengthPolicy.hpp
new file mode 100644
index 0000000..30459e5
--- /dev/null
+++ b/src/tree-parse/BranchLengthPolicy.hpp
@@ -0,0 +1,43 @@
+#ifndef BRANCH_LENGTH_POLICY
+#define BRANCH_LENGTH_POLICY
+
+#include <limits>
+#include <iosfwd>
+#include <cmath>
+
+class IgnoreBranchLength
+{
+public: 
+  double readBranchLength(std::istream &iss)
+  {
+    bool foundNext = false; 
+    while(not foundNext)
+      {
+	int ch = iss.get(); 
+
+	foundNext = ( ch == ')'
+		      || ch == ';'
+		      || ch == ',' ) ; 
+      }
+    iss.unget();
+    return nan("");
+  }
+};
+
+
+class ReadBranchLength
+{
+public: 
+  double readBranchLength(std::istream &iss)
+  {
+    auto result = double{0.};
+
+    iss.precision(std::numeric_limits<double>::digits10 + 2);
+
+    iss >> result; 
+    return result; 
+  }
+  
+};
+
+#endif
diff --git a/src/tree-parse/LabelPolicy.hpp b/src/tree-parse/LabelPolicy.hpp
new file mode 100644
index 0000000..a67890d
--- /dev/null
+++ b/src/tree-parse/LabelPolicy.hpp
@@ -0,0 +1,77 @@
+#ifndef INTEGER_LABEL_READER
+#define INTEGER_LABEL_READER
+
+#include "GlobalVariables.hpp"
+#include <unordered_map>
+#include <iostream>
+#include <cassert>
+
+typedef unsigned int nat; 
+
+class IntegerLabelReader
+{
+public: 
+  nat readLabel(std::istream &in)
+  {
+    nat result; 
+    in >> result; 
+    return result; 
+  }
+
+void setLabelMap(std::unordered_map<std::string,nat> map) {} 
+
+}; 
+
+
+
+class NameLabelReader
+{
+public: 
+  NameLabelReader()
+    : _name2id{}
+  {
+  }
+
+  nat readLabel(std::istream &in)
+  {
+    auto label = std::string{}; 
+    label.reserve( 1 << 10 );
+    assert(_name2id.size() > 0 ); 
+
+    // tout << "comparing against elems: " ; 
+    // for(auto elem : _name2id)
+    //   {
+    // 	tout << std::get<0>(elem) << "," << std::get<1>(elem) << std::endl; 
+    //   }
+
+    bool foundDelim = false; 
+    while(not foundDelim)
+      {
+	int ch = in.get();
+	foundDelim = 
+	  ( ch == ':'
+	    || ch == ','
+	    || ch == ')'
+	    ) ; 
+	if(not foundDelim)
+	  label.push_back(char(ch));
+      }
+    in.unget();
+
+    if(_name2id.find(label) == _name2id.end()) 
+      {
+	std::cerr << "Error: while parsing tree, could not find taxon >" << label << "<" << std::endl; 
+	exitFunction(-1, false); 
+      }
+
+    return _name2id[label]; 
+  }
+
+  void setLabelMap(std::unordered_map<std::string,nat> map) { _name2id = map; } 
+
+
+  std::unordered_map<std::string,nat> _name2id; 
+}; 
+
+
+#endif
diff --git a/src/tree-parse/README.txt b/src/tree-parse/README.txt
new file mode 100644
index 0000000..c5f3952
--- /dev/null
+++ b/src/tree-parse/README.txt
@@ -0,0 +1 @@
+This module contains classes used for parsing trees.
diff --git a/src/tree-parse/TreeProcessor.cpp b/src/tree-parse/TreeProcessor.cpp
new file mode 100644
index 0000000..165fb8e
--- /dev/null
+++ b/src/tree-parse/TreeProcessor.cpp
@@ -0,0 +1,158 @@
+#include <sstream>
+#include "extensions.hpp" 
+#include <string.h>
+#include <cassert>
+#include <iostream>
+#include <cmath>
+// #include "Branch.hpp"
+#include "BasicTreeReader.hpp"
+#include "TreeProcessor.hpp"
+#include "BranchLengthsParameter.hpp"
+
+using namespace std;
+
+TreeProcessor::TreeProcessor(std::vector<std::string> fileNames, bool expensiveCheck)
+  : _tralnPtr{nullptr}
+  , _fns{}
+  , _taxa(fillTaxaInfo(fileNames.at(0)))
+{
+  assert(fileNames.size() > 0); 
+
+  if(expensiveCheck && fileNames.size() > 1)
+    {
+      for(auto f : fileNames )
+	{
+	  auto taxa = fillTaxaInfo(f); 
+	  bool okay = true;  
+	  for(nat i = 0; i < taxa.size() ; ++i)
+	    okay &= (_taxa[i].compare(taxa[i]) == 0 ); 
+	  if(not okay)
+	    {
+	      std::cout << "Error: file " << f << " contains a different numbering of taxa than " << fileNames[0] << ". At the moment, " << PROGRAM_NAME << " does not support this. Write us an e-mail, if this feature is important for you. " << std::endl; 
+	      exitFunction(-1, false);
+	    }
+	}
+    }
+
+  _tralnPtr = make_unique<TreeAln>( int(_taxa.size()), false);
+  
+  // only necessary, if we actually have branch lengths (so resources
+  // are wasted, if we only read the topology)
+  auto blRes = BranchLengthResource(); 
+  blRes.initialize(nat(_taxa.size()), 1 ); 
+  _tralnPtr->setBranchLengthResource(blRes); 
+  
+  _fns = fileNames; 
+}
+
+
+TreeProcessor::TreeProcessor(TreeProcessor&& tp) 
+  : _tralnPtr(std::move(tp._tralnPtr))
+  , _fns(tp._fns)
+  , _taxa(tp._taxa)
+{
+}  
+
+
+TreeProcessor& TreeProcessor::operator=(TreeProcessor &&rhs)
+{
+  if(this == &rhs)
+    return *this; 
+  else 
+    assert(0); 
+} 
+
+
+template<bool readBl>
+void TreeProcessor::nextTree(std::istream &treefile) 
+{
+  auto paramPtr = make_unique<BranchLengthsParameter>(0,0, std::vector<nat>{0});   
+  paramPtr->addPartition(0);
+
+  while( treefile.get() != '('); 
+  treefile.unget();
+
+  auto bt = BasicTreeReader<IntegerLabelReader,
+			    typename std::conditional<readBl,
+						      ReadBranchLength,
+						      IgnoreBranchLength>::type>( nat( _taxa.size()) );
+  auto branches = bt.extractBranches(treefile);
+
+  _tralnPtr->unlinkTree();
+  for(auto b :branches)
+    {
+      _tralnPtr->clipNode(_tralnPtr->getUnhookedNode(b.getPrimNode()), _tralnPtr->getUnhookedNode(b.getSecNode()) );
+      if(readBl)
+	{
+	  _tralnPtr->setBranchUnchecked(b);
+	}
+    }
+}
+
+void TreeProcessor::skipTree(std::istream &iss)
+{
+  while( iss &&  iss.get() != ';'); 
+}
+
+
+std::string TreeProcessor::trim(const std::string& str, const std::string& whitespace) 
+{
+  const auto strBegin = str.find_first_not_of(whitespace);
+  if (strBegin == std::string::npos)
+    return ""; 
+  const auto strEnd = str.find_last_not_of(whitespace);
+  const auto strRange = strEnd - strBegin + 1;
+
+  return str.substr(strBegin, strRange);
+}
+
+
+
+std::vector<std::string>
+TreeProcessor::fillTaxaInfo(std::string fileName)
+{
+  auto result = std::vector<std::string>{}; 
+  auto whiteSpace = " \t";
+
+  auto &&infile =  std::ifstream(fileName);
+  
+  if (!infile)
+    {
+      tout << "Warning: could not find file " << fileName << std::endl;
+      assert(0);
+    }
+  
+  
+  auto line = std::string{} ; 
+  bool foundStart = false; 
+  bool abort = false;
+
+  while(not abort && getline(infile, line))
+    {      
+      std::string cleanLine = trim(line); 
+
+      if(foundStart)
+	{
+	  if(cleanLine[cleanLine.size()-1] == ';') // we are done 
+	    abort = true; 
+
+	  std::string cleanerString = trim(cleanLine, ",;"); 
+
+	  auto pos = cleanerString.find_first_of(whiteSpace, 0);
+	  std::string num =  cleanerString.substr(0, pos),
+	    name = cleanerString.substr(pos+1, cleanerString.size()); 	  
+
+	  // _taxa.push_back(name); 
+	  result.push_back(name);
+	}
+      else if(cleanLine.compare("translate") == 0  )
+	foundStart = true; 
+    }  
+
+  assert(foundStart); 
+  return result; 
+}
+
+
+template void TreeProcessor::nextTree<true>(std::istream &treefile) ; 
+template void TreeProcessor::nextTree<false>(std::istream &treefile) ;
diff --git a/src/tree-parse/TreeProcessor.hpp b/src/tree-parse/TreeProcessor.hpp
new file mode 100644
index 0000000..8354427
--- /dev/null
+++ b/src/tree-parse/TreeProcessor.hpp
@@ -0,0 +1,31 @@
+#ifndef _TREE_PROCESSOR_HPP
+#define _TREE_PROCESSOR_HPP
+
+#include <string>
+#include "TreeAln.hpp"
+
+class TreeProcessor
+{
+public: 
+  TreeProcessor(std::vector<std::string> fileNames, bool expensiveCheck ); 
+  TreeProcessor(TreeProcessor&& tp) ; 
+  virtual ~TreeProcessor(){}
+  TreeProcessor& operator=(TreeProcessor &&tp); 
+  
+  const std::vector<std::string> getTaxa() const {return _taxa; }
+
+protected: 			// METHODS
+  auto fillTaxaInfo(std::string fileName) -> std::vector<std::string>; 
+  template<bool readBl>
+  void nextTree(std::istream &treefile); 
+  void skipTree(std::istream &iss); 
+  static std::string trim(const std::string& str, const std::string& whitespace  = " \t"); 
+
+protected: 			// ATTRIBUTES
+  std::unique_ptr<TreeAln> _tralnPtr;
+  std::vector<std::string> _fns; 
+  std::vector<std::string> _taxa; 
+}; 
+
+
+#endif
diff --git a/tests/BipartitionTest.cpp b/tests/BipartitionTest.cpp
new file mode 100644
index 0000000..9b5fc4c
--- /dev/null
+++ b/tests/BipartitionTest.cpp
@@ -0,0 +1,25 @@
+#include "../src/Bipartition.hpp"
+
+TEST(BipartitionTest, general)
+{
+  Bipartition bp;
+  bp.reserve(23); 
+
+  bp.set(3); 
+  bp.set(18); 
+  bp.set(5); 
+  bp.set(1); 
+  bp.set(13); 
+  bp.set(22); 
+
+  Bipartition bp2 ; 
+  bp2.reserve(23); 
+
+  for(nat i = 0; i < 23; ++i)
+    {
+      if(bp.isSet(i))
+	bp2.set(i); 
+    }
+
+  ASSERT_TRUE(bp == bp2); 
+}
diff --git a/tests/LocalCommTest.cpp b/tests/LocalCommTest.cpp
new file mode 100644
index 0000000..01e96ec
--- /dev/null
+++ b/tests/LocalCommTest.cpp
@@ -0,0 +1,414 @@
+#include "comm/LocalComm.hpp"
+
+#include <vector>
+#include <thread>
+#include <unordered_map>
+
+
+struct fence
+{
+  LocalComm *comm; 
+  std::mutex mtx; 
+  bool isThere; 
+  std::function<void(LocalComm&)> fun; 
+}; 
+
+
+
+void start(fence &fnc)
+{
+  std::lock_guard<std::mutex>(fnc.mtx);
+		  fnc.isThere = true; 
+}
+
+bool isThere(fence &fnc)
+{
+  std::lock_guard<std::mutex>(fnc.mtx);
+		  return fnc.isThere; 
+}
+
+
+
+void execute(  fence *myFencePtr)
+{
+  fence &myFence = *myFencePtr; 
+  while(not isThere(myFence)  )
+    ; 
+
+  auto &comm = *myFence.comm; 
+  myFencePtr->fun(comm); 
+}
+
+
+
+
+void executeWithThreads( int numThreads, std::function<void(LocalComm&)> lam)
+{
+  auto threads = std::vector<std::thread>{}; 
+  
+  fence* myFence = new fence;  
+  myFence->comm = nullptr; 
+  myFence->isThere = false; 
+  auto&& fun = std::bind(execute, myFence); 
+
+  auto ids = std::unordered_map<std::thread::id,int>{}; 
+
+  ids.insert(std::make_pair(MY_TID, 0)); 
+  for(int i = 1; i < numThreads ; ++i)
+    {
+      threads.push_back(std::thread(fun)); 
+      ids.insert(std::make_pair(threads.back().get_id(), i)); 
+    }
+
+  auto&& comm = LocalComm(ids); 
+  myFence->comm = &comm; 
+  myFence->fun = lam; 
+  assert(comm.isValid()); 
+  start(*myFence);
+  
+  execute(myFence);
+
+  for(auto &t : threads)
+    t.join();
+}
+
+
+
+void executeWithThreadsAfterSplit( int numThreads, std::function<void(LocalComm&)> lam, std::vector<int> color, std::vector<int> rank)
+{
+  auto threads = std::vector<std::thread>{}; 
+  
+  fence* myFence = new fence;  
+  myFence->comm = nullptr; 
+  myFence->isThere = false; 
+  auto&& fun = std::bind(execute, myFence); 
+
+  auto ids = std::unordered_map<std::thread::id,int>{}; 
+
+  ids.insert(std::make_pair(MY_TID, 0)); 
+  for(int i = 1; i < numThreads; ++i)
+    {
+      threads.push_back(std::thread(fun)); 
+      ids.insert(std::make_pair(threads.back().get_id(), i)); 
+    }
+
+  auto&& comm = LocalComm(ids); 
+  comm = comm.split(color, rank);
+  myFence->comm = &comm; 
+  myFence->fun = lam; 
+  assert(comm.isValid()); 
+  start(*myFence);
+  
+  execute(myFence);
+
+  for(auto &t : threads)
+    t.join();
+}
+
+
+
+TEST(LocalCommTest, bcastTest)
+{
+  auto lam = [](LocalComm& comm) 
+    {
+      auto myData = std::vector<nat>(10,0); 
+      if(comm.getRank() == 0)
+	{
+	  for(nat i =0; i < myData.size();  ++i)
+	    myData[i] = i+1; 
+	}
+
+      myData = comm.broadcast(myData,0); 
+
+      for(nat i = 0; i< myData.size() ;++i)
+	ASSERT_EQ(i+1, myData[i] ); 
+    }; 
+
+  for(int i = 2; i < 9 ; ++i)
+    {
+      executeWithThreads(i , lam); 
+      // std::cout << SyncOut() << "================ okay ================ "<< std::endl; 
+    }
+}
+
+
+
+
+TEST(LocalCommTest, bcastTestSplitted)
+{
+  auto lam = [](LocalComm& comm) 
+    {
+      auto myData = std::vector<nat>(10,0); 
+      if(comm.getRank() == 0 )
+	{
+	  for(nat i =0 ; i< myData.size(); ++i)
+	    myData[i] = i + comm.getColor(); 
+	}
+
+      myData = comm.broadcast(myData, 0);
+
+      for(nat i = 0; i < myData.size(); ++i)
+	ASSERT_TRUE(myData[i] == i + comm.getColor()); 
+    }; 
+  
+  auto cols = std::vector<int>{0,0,1,1}; 
+  auto ranks = std::vector<int>{0,1,0,1}; 
+
+  executeWithThreadsAfterSplit(4, lam, cols,ranks);
+}
+
+
+
+TEST(LocalCommTest, scatterv)
+{
+  auto lam = [](LocalComm& comm)  
+    {
+      int ROOT = 0; 
+      auto counts = std::vector<int>{3,2,3,2};
+      auto displ = std::vector<int>{0,3,5,8}; 
+      auto myData = std::vector<int>(counts.at(comm.getRank()),0); 
+      auto theData = std::vector<int>();       
+      if(comm.getRank() == ROOT) 
+	{
+
+	  nat ctr = 0; 
+	  for(auto &c : counts)
+	    {
+	      for(int i = 0; i < c ; ++i)
+		theData.push_back(ctr); 
+	      ++ctr; 
+	    }
+	  // std::cout << "the data is " << theData << std::endl; 
+	  assert(theData.size() == 10); 
+	}
+      assert(comm.size() == 4); 
+
+      myData = comm.scatterVariableKnownLength(theData,  counts,displ, ROOT );
+      
+      for(auto &d : myData )
+	{
+	  int myRank = comm.getRank();  
+	  ASSERT_EQ(d, myRank);
+	}
+    }; 
+  
+  executeWithThreads(4, lam);
+}
+
+
+TEST(LocalCommTest, splitScatterv)
+{
+  auto lam = [](LocalComm& comm)  
+    {
+      if(comm.getColor() == 0 )
+	return; 
+
+      int ROOT = 0; 
+      auto counts = std::vector<int>{3,2,3,2};
+      auto displ = std::vector<int>{0,3,5,8}; 
+      auto myData = std::vector<int>(counts.at(comm.getRank()),0); 
+      auto theData = std::vector<int>();       
+      if(comm.getRank() == ROOT) 
+	{
+	  nat ctr = 0; 
+	  for(auto &c : counts)
+	    {
+	      for(int i = 0; i < c ; ++i)
+		theData.push_back(ctr); 
+	      ++ctr; 
+	    }
+	  // std::cout << "the data is " << theData << std::endl; 
+	  assert(theData.size() == 10); 
+	}
+      assert(comm.size() == 4); 
+
+      myData = comm.scatterVariableKnownLength(theData,  counts,displ, ROOT );
+      
+      for(auto &d : myData )
+	{
+	  int myRank = comm.getRank();  
+	  ASSERT_EQ(d, myRank);
+	}
+    }; 
+  
+  auto cols = std::vector<int>{0,0,0,0,1,1,1,1}; 
+  auto ranks = std::vector<int>{0,1,2,3,0,1,2,3};
+
+  executeWithThreadsAfterSplit(8, lam, cols, ranks); 
+}
+
+static int rankSum(int size)
+{
+  auto result = 0; 
+  for(int i = 0; i< size; ++i)
+    result += i; 
+  return result; 
+}
+
+TEST(LocalCommTest, reduceTest)
+{
+  auto lam = [](LocalComm& comm)
+    {
+      int ROOT = 0; 
+      auto myData = std::vector<int>{comm.getRank(), comm.getRank() + 1 };
+      myData = comm.reduce(myData,ROOT); 
+      
+      if(comm.getRank() == ROOT)
+	{
+	  ASSERT_EQ(rankSum(comm.size()), myData[0] ); 
+	  ASSERT_EQ(rankSum(comm.size()) + comm.size(), myData[1] ); 
+	}
+    }; 
+  
+  executeWithThreads(4, lam);
+}
+
+
+
+TEST(LocalCommTest, allReduceTest)
+{
+  auto lm = [](LocalComm& comm)
+    {
+      for(int i = 0; i < 5; ++i)
+	{
+	  auto myData = std::vector<int>{comm.getRank(), comm.getRank() + 1 };
+      
+	  myData = comm.allReduce(myData); 
+
+	  ASSERT_EQ(rankSum(comm.size()), myData[0] ); 
+	  ASSERT_EQ(rankSum(comm.size()) + comm.size(), myData[1] ); 
+	}
+    }; 
+
+  for(int i = 0; i < 12; ++i)
+    {
+      executeWithThreads(i, lm);
+    }
+}
+
+
+
+TEST(LocalCommTest, reduceTestSplit)
+{
+  auto lam = [](LocalComm& comm)
+    {
+      int ROOT = 0; 
+      auto myData = std::vector<int>{comm.getRank(), comm.getRank() + 1 };
+      auto origData = myData;  
+      
+      myData = comm.reduce(myData,ROOT); 
+      
+      if(comm.getRank() == ROOT)
+      	{
+      	  ASSERT_EQ(rankSum(comm.size()), myData[0]); 
+      	  ASSERT_EQ(rankSum(comm.size()) + comm.size(), myData[1] ); 
+      	}
+      
+      
+      // std::cout << SyncOut() << std::this_thread::get_id() << "," << comm.getColor() << "," << comm.getRank()  << " done" << std::endl; 
+
+      myData = origData; 
+
+      // ROOT = 1; 
+      myData = comm.reduce(myData,ROOT); 
+      
+      if(comm.getRank() == ROOT)
+      	{
+      	  ASSERT_EQ(rankSum(comm.size()), myData[0] ); 
+      	  ASSERT_EQ(rankSum(comm.size()) + comm.size(), myData[1] ); 
+      	}
+    }; 
+
+  auto cols = std::vector<int>{0,0,0,0,1,1,1,1}; 
+  auto ranks = std::vector<int>{0,1,2,3,0,1,2,3};  
+
+  executeWithThreadsAfterSplit(8, lam, cols,ranks);
+}
+
+
+
+TEST(LocalCommTest, gathervTest)
+{
+  auto lam = [](LocalComm& comm)
+    {
+      if(comm.getColor() == 0)
+	return;
+
+      int ROOT = 0; 
+      auto myData = std::vector<int>{comm.getRank()};
+      if(comm.getRank() % 2 == 0)
+	myData.push_back(comm.getRank()); 
+
+      auto allData = comm.gatherVariableLength(myData, ROOT);
+      if(comm.getRank() == ROOT)
+	{
+	  nat ctr = 0; 
+	  for(int i = 0; i < comm.size() ;++i)
+	    {
+	      ASSERT_EQ(allData[ctr++] , i); 
+	      if(i % 2 == 0)
+		ASSERT_EQ(allData[ctr++], i); 
+	    }
+	}
+    }; 
+
+  auto cols = std::vector<int>{0,0,0,0,1,1,1,1}; 
+  auto ranks = std::vector<int>{0,1,2,3,0,1,2,3};
+
+  executeWithThreadsAfterSplit(8, lam, cols, ranks); 
+}
+
+
+TEST(LocalCommTest, gatherVariableKnownLength_Split_Test)
+{
+
+  auto lam = [](LocalComm&  comm)
+    {
+      int ROOT = 0; 
+      auto myData = std::vector<int>{comm.getRank()}; 
+      if(comm.getRank() % 2 == 0 )
+	myData.push_back(comm.getRank() + 1 );
+      
+      auto countsPerProc = std::vector<int>();
+      for(int i = 0; i < comm.size() ; ++i)
+	{
+	  if(i % 2 == 0 )
+	    countsPerProc.push_back(2); 
+	  else 
+	    countsPerProc.push_back(1); 
+	}
+
+      auto displPerProc = std::vector<int>{0};
+      for(int i =1; i < comm.size() ; ++i)
+	displPerProc.push_back(displPerProc[i-1] + countsPerProc[i-1]); 
+
+      auto allData = comm.gatherVariableKnownLength(myData, countsPerProc, displPerProc, ROOT);
+
+      // if(comm.getColor() == 1 )
+      // 	std::cout << SyncOut() << "i survived it! \n"; 
+
+      if(comm.getRank() == ROOT)
+	{
+	  auto iter = begin(allData); 
+	  nat ctr = 0; 
+	  while(iter != end(allData))
+	    {
+	      ASSERT_EQ(ctr, *iter); 
+	      ++iter; 
+	      if(ctr % 2 == 0 )
+		{
+		  ASSERT_EQ(ctr+1, *iter); 
+		  ++iter; 
+		}
+	      ++ctr;
+	    }
+	}
+
+      // std::cout << SyncOut()  << comm.getColor() << "," << comm.getRank() << " finished" << std::endl; 
+
+    }; 
+
+  auto cols = std::vector<int>{0,0,0,0,1,1,1,1}; 
+  auto ranks = std::vector<int>{0,1,2,3,0,1,2,3}; 
+  executeWithThreadsAfterSplit(8,lam,cols,ranks); 
+}
diff --git a/tests/MessageQueueTest.cpp b/tests/MessageQueueTest.cpp
new file mode 100644
index 0000000..c094145
--- /dev/null
+++ b/tests/MessageQueueTest.cpp
@@ -0,0 +1,64 @@
+#include <limits>
+#include <algorithm>
+#include <thread>
+
+#include "comm/threads/MessageQueue.hpp"
+
+
+typedef uint8_t byte; 
+
+#define ITER 10000
+
+
+void doSomeWork(MessageQueue &q, int myId)
+{
+  for(int i = 0; i < ITER ; ++i)
+    {
+      auto gotMessage = false; 
+      while(not gotMessage)
+	{
+	  auto msg = std::vector<byte>{}; 
+	  std::tie(gotMessage, msg) = q.consume<byte>(myId); 
+	  if(gotMessage)
+	    {
+	      auto res = std::vector<int>(reinterpret_cast<int*>(msg.data()), reinterpret_cast<int*>(msg.data() + msg.size() / sizeof(int)));
+
+	      auto total = std::accumulate(begin(res), end(res), 0); 
+	      ASSERT_EQ(10 * (i+1) , total); 
+	    }
+	}
+    }
+}
+
+
+#define NUM_THREADS 4
+
+
+TEST(MessageQueueTest, test)
+{
+  auto&& queue = MessageQueue(NUM_THREADS );   
+
+  auto threads = std::vector<std::thread>{}; 
+  for(int i = 0; i < NUM_THREADS ; ++i)
+    {
+      auto fun = std::bind(doSomeWork, std::ref(queue), i);
+      threads.emplace_back(fun );
+    }
+
+  auto data = std::vector<int>{1 ,2 ,3 ,4 };
+
+  for(int i = 0; i < ITER ; ++i)
+    {
+      auto dataNow = data; 
+      for(auto &elem : dataNow)
+	elem *= (i+1); 
+      
+      auto msg = std::vector<byte>(reinterpret_cast<byte*>(dataNow.data()), reinterpret_cast<byte*>(dataNow.data() + sizeof(int) * dataNow.size()) );
+
+      auto readers = std::vector<int> (NUM_THREADS,1);
+      queue.produce(msg, readers ); 
+    }
+
+  for(auto &t : threads)
+    t.join();
+}
diff --git a/tests/PartitionAssignmentTest.cpp b/tests/PartitionAssignmentTest.cpp
new file mode 100644
index 0000000..4656cf5
--- /dev/null
+++ b/tests/PartitionAssignmentTest.cpp
@@ -0,0 +1,106 @@
+#include "system/PartitionAssignment.hpp"
+#include <algorithm>
+
+class PartitionAssignmentTest : public testing::Test
+{
+public: 
+  void SetUp()
+  {
+    auto states = std::vector<nat>
+      {
+	4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
+      }; 
+    
+    auto length = std::vector<nat>
+      {
+	294, 469, 920,  69, 227,  63, 169, 258,  45, 278,  36, 466, 242, 153, 303, 241, 253, 333,  56, 157
+      }; 
+
+    nat numTax = 10; 
+    for(nat i = 0; i< states.size();  ++i)
+      {
+	_partitions.emplace_back(numTax, "", PLL_DNA_DATA,states.at(i), 4, false );
+	_partitions.back().setLower(0);
+	_partitions.back().setUpper(length.at(i));
+      }
+  }; 
+
+  void printStatistics( const PartitionAssignment &pa )
+  {
+    auto ass = pa.getAssignment();
+    tout << "\nRESULT:\n"; 
+    for(auto &a : ass)
+      tout << std::get<1>(a) << std::endl;
+
+    tout << "================================================================"<< std::endl ;
+    auto numParts = pa.getNumPartPerProcess();
+    auto numPats = pa.getSitesPerProcess();
+    auto sum = std::accumulate(begin(numParts), end(numParts), 0u);
+    for(nat i =0 ; i < pa.getNumProc(); ++i)
+      tout << i << "\t" << numParts[i] << "\t" << numPats[i] <<  std::endl; 
+    tout <<  " => "  << sum << " assignments for " << _partitions.size() << " partitions" << std::endl; 
+  }
+
+
+  void checkIfAllAssigned( const PartitionAssignment& pa)
+  {
+    nat totalSites = 0; 
+    for(auto &p : _partitions)
+      totalSites += p.getUpper() - p.getLower();
+
+    nat check = 0; 
+    auto ass = pa.getAssignment(); 
+    for(auto &elem : ass)
+      {
+	auto assignment = elem.second;
+	check += assignment.width; 
+      }
+    ASSERT_EQ(totalSites, check);
+  }
+  
+  std::vector<Partition> _partitions; 
+}; 
+
+
+TEST_F(PartitionAssignmentTest, generic )
+{
+  for(nat i = 1; i < 2 ; ++i) // 100
+    {
+      auto pa =  PartitionAssignment(i); 
+      pa.assign(_partitions);
+      // printStatistics(pa);
+      checkIfAllAssigned(pa); 
+      // tout << "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << std::endl; 
+    }
+}
+
+
+
+
+TEST(PartitionAssignment, tooFewSites)
+{
+  auto _partitions =  std::vector<Partition>() ; 
+  _partitions.emplace_back(10, "", PLL_DNA_DATA,4, 4, false );
+  _partitions.back().setLower(0);
+  _partitions.back().setUpper(10); 
+  
+  auto pa = PartitionAssignment(12); 
+  pa.assign(_partitions); 
+}
+
+
+
+
+TEST(PartitionAssignment, alexeyPathologicalCase)
+{
+  auto _partitions = std::vector<Partition>{};
+  _partitions.emplace_back(101, "", PLL_DNA_DATA, 4,4,false); 
+  _partitions.back().setLower(0); 
+  _partitions.back().setUpper(100); 
+  _partitions.emplace_back(100, "", PLL_DNA_DATA, 4,4,false); 
+  _partitions.back().setLower(101); 
+  _partitions.back().setUpper(201); 
+
+  auto pa = PartitionAssignment(2); 
+  pa.assign(_partitions);
+}
diff --git a/tests/Test.cpp b/tests/Test.cpp
new file mode 100644
index 0000000..c1c7734
--- /dev/null
+++ b/tests/Test.cpp
@@ -0,0 +1,11 @@
+
+TEST(general, bla)
+{
+  auto bla = std::vector<uint8_t>{1,2,3,4,5,6}; 
+  
+  auto cpy = std::vector<uint32_t>(6,0); 
+  std::copy(begin(bla), end(bla), begin(cpy)); 
+
+  for(int i = 0; i < 6; ++i)
+    ASSERT_EQ(cpy[i], i+1); 
+}
diff --git a/tests/TopLevelInvocation.cpp b/tests/TopLevelInvocation.cpp
new file mode 100644
index 0000000..57fe3f8
--- /dev/null
+++ b/tests/TopLevelInvocation.cpp
@@ -0,0 +1,373 @@
+#include <gtest/gtest.h>
+#include <sstream>
+
+#include <sys/sendfile.h>  // sendfile
+#include <fcntl.h>         // open
+#include <unistd.h>        // close
+#include <sys/stat.h>      // fstat
+#include <sys/types.h>     // fstat
+
+
+#ifdef _WITH_MPI
+#include <mpi.h>
+#endif
+
+int NUM_BRANCHES; 
+
+#define _INCLUDE_DEFINITIONS
+#include "GlobalVariables.hpp"
+#undef _INCLUDE_DEFINITIONS
+
+#include  "../src/SampleMaster.hpp"
+
+
+/** 
+    Tests if various command line parameters result in the same known
+    likelihood.
+*/ 
+
+// that was a tough one =(
+extern int optind; 
+
+
+class TopLevel  : public testing::Test
+{
+public: 
+  void SetUp()
+  {
+    globals.logFile = "/dev/null";   
+    globals.logStream =  new std::ofstream{"/dev/null"}; 
+    globals.teeOut =  new teestream(*globals.logStream, *globals.logStream);
+  }
+}; 
+
+
+static std::vector<string> convertLine(std::string line)
+{
+  auto &&iss = std::istringstream{line}; 
+  auto result = std::vector<std::string>{}; 
+  
+  while(iss)
+    {
+      auto str = std::string{}; 
+      iss >> str; 
+      if(str.compare("") != 0 )
+	result.push_back(str) ; 
+    }
+  return result; 
+}
+
+
+CommandLine constructCommandLine(const std::string& str)
+{  
+  auto arr = convertLine(str); 
+  auto arr2 = std::vector<char*>{}; 
+  for(auto &elem : arr)
+    arr2.push_back(strdup(elem.c_str())); 
+  auto cl = CommandLine{}; 
+
+  cl.initialize(arr2.size(), arr2.data());
+  return  cl; 
+}
+
+
+SampleMaster init( std::string cmdln )
+{
+  optind = 0; 
+  
+  auto cl = constructCommandLine(cmdln) ; 
+  auto _plPtr = make_shared<ParallelSetup>(); 
+#if HAVE_PLL == 0 
+  _plPtr->initializeExaml(cl);
+#endif
+
+  char** tmp; 
+  auto _sm = SampleMaster{}; 
+  _sm.setParallelSetup(_plPtr);
+  _sm.setCommandLine(cl); 
+  _sm.initializeRuns(Randomness(cl.getSeed())); 
+  return _sm; 
+}
+
+
+void assertValues(SampleMaster& _sm , double trueBest, double truePp)
+{
+  auto &c = _sm.getRuns()[0].getChains()[0]; 
+  auto best = c.getBestState(); 
+  auto pp = c.getLikelihood() + c.getPrior().getLnPrior(); 
+
+  // std::cout << MAX_SCI_PRECISION << "best="  << best << "\tpp=" << pp << std::endl; 
+
+  ASSERT_TRUE( fabs( best - trueBest )  < 1e-6); 
+  ASSERT_TRUE( fabs (pp - truePp ) < 1e6-6 ); 
+}
+
+
+double dnaBest = -1.607602001225307e+04; 
+double dnaPP = -1.579327993707598e+04; 
+
+double aaBest=-2.950608611893024e+03; 
+double aaPP = -2.996126255407966e+03; 
+
+
+double bestDNA[4] = {  -1.606184140768954e+04 , -1.605852797997213e+04, -1.604100762889591e+04, -1.604441839175527e+04} ; 
+void assertMultiValues(SampleMaster& _sm, bool onlyAtMaster )
+{
+  _sm.synchronize(CommFlag::PRINT_STAT | CommFlag::PROPOSALS | CommFlag::TREE | CommFlag::SWAP);
+
+  int myRank = 0; 
+#ifdef _WITH_MPI
+  MPI_Comm_rank(MPI_COMM_WORLD, &myRank );
+#endif
+  if(onlyAtMaster && myRank == 0 )
+    {
+      nat ctr = 0; 
+      for(auto &run : _sm.getRuns())
+	{
+	  for(auto &c : run.getChains() )
+	    {
+	      ASSERT_TRUE(fabs(c.getBestState()  - bestDNA[ctr] )  < 1e-6);
+	      ++ctr; 
+	    }
+	}
+    }
+}
+
+
+
+static void myCopyFile(std::string src, std::string desti)
+{
+  int source = open(src.c_str(), O_RDONLY, 0);
+  int dest = open(desti.c_str(), O_WRONLY | O_CREAT, 0644);
+
+  struct stat stat_source;
+  fstat(source, &stat_source);
+
+  sendfile(dest, source, 0, stat_source.st_size);
+
+  close(source);
+  close(dest);
+}
+
+
+static void copyResumeFiles()
+{
+  auto resumeFolder = std::string{"./test-data/dna/toResume"}; 
+  auto files = std::vector<std::string> {"ExaBayes_checkpoint.toResume" ,"ExaBayes_info.toResume", "ExaBayes_parameters.toResume.1", "ExaBayes_topologies.toResume.0.tree.0", "ExaBayes_topologies.toResume.1.tree.0", "ExaBayes_diagnostics.toResume",  "ExaBayes_parameters.toResume.0",  "ExaBayes_prevCheckpointBackup.toResume",  "ExaBayes_topologies.toResume.0.tree.1",  "ExaBayes_topologies.toResume.1.tree.1"}; 
+  
+  for(auto file : files)
+    myCopyFile(std::string{resumeFolder + "/"  + file}, std::string{ "./" + file});
+}
+
+
+
+////////////////
+// THE TESTS  //
+////////////////
+
+// DNA parted
+TEST_F(TopLevel, dnaPartedBinary)
+{  
+  auto folder = std::string{"test-data/dna"}; 
+  auto _sm = init(  "bla -s 123 -n test-dnaPartedBinary -f " + folder +  "/aln.binary -c " + folder + "/config.nex"  );
+  _sm.run();
+  _sm.deleteMyFiles();
+  assertValues(_sm, dnaBest ,dnaPP);
+}
+
+
+// parsing DNA  
+TEST_F(TopLevel, dnaPartedRaw)
+{  
+  auto folder = std::string{"test-data/dna"}; 
+  auto _sm = init("bla -s 123 -n test-dnaPartedRaw -f " + folder + "/aln.phy -q " + folder + "/aln.model  -c " + folder + "/config.nex");
+  _sm.run();
+  _sm.deleteMyFiles();
+  assertValues(_sm, dnaBest, dnaPP);
+}
+
+
+// AA parted
+TEST_F(TopLevel, aaParted)
+{  
+  auto folder = std::string{"test-data/aa"}; 
+  auto _sm = init(  "bla -s 123 -n test-aaParted -f "+ folder+  "/aln.binary -c " + folder + "/config.nex"  );
+  _sm.run();
+  _sm.deleteMyFiles();
+  
+  assertValues(_sm, aaBest, aaPP);
+}
+
+
+// parsing AA 
+TEST_F(TopLevel, aaPartedRaw)
+{  
+  auto folder = std::string{"test-data/aa"}; 
+  auto _sm = init(  "bla -s 123 -n test-aaParted -f " + folder +  "/aln.phy  -q "  + folder + "/aln.model -c " + folder + "/config.nex"  );
+  _sm.run();
+  _sm.deleteMyFiles();
+  assertValues(_sm, aaBest, aaPP);
+}
+
+
+// minimal aa (4 taxa)
+TEST_F(TopLevel, minimal)
+{  
+  auto folder = std::string{"test-data/aa-min"}; 
+  auto _sm = init(  "bla -s 123 -n test-aamin -f " + folder +  "/aln.phy  -q "  + folder + "/aln.model -c " + folder + "/config.nex"  );
+  _sm.run();
+  _sm.deleteMyFiles();
+  assertValues(_sm, -1.838165439052971e+03, -1.882050089193929e+03);
+}
+
+
+
+// mixed
+TEST_F(TopLevel, mixed)
+{  
+  auto folder = std::string{"test-data/mixed"}; 
+  auto _sm = init(  "bla -s 123 -n test-aamin -f " + folder +  "/aln.phy  -q "  + folder + "/aln.model -c " + folder + "/config.nex"  );
+  _sm.run();
+  _sm.deleteMyFiles();
+  assertValues(_sm,-7.797382559009363e+04,-7.694705148165907e+04);
+}
+
+
+// mixed  with SEV vectors
+TEST_F(TopLevel, mixedSEV)
+{  
+  auto folder = std::string{"test-data/mixed"}; 
+  auto _sm = init(  "bla -s 123 -n test-aamin-sev -f " + folder +  "/aln.phy  -q "  + folder + "/aln.model -c " + folder + "/config.nex -S "  );
+  _sm.run();
+  _sm.deleteMyFiles();
+  assertValues(_sm,-7.797382559009363e+04,-7.694705148165907e+04);
+}
+
+
+// test -M 1 
+TEST_F(TopLevel, dnamem1)
+{  
+  auto folder = std::string{"test-data/dna"}; 
+  auto _sm = init(  "bla -s 123 -n test-dnamem1 -f " + folder +  "/aln.binary -c " + folder + "/config.nex -M 1"  );
+  _sm.run();
+  _sm.deleteMyFiles();
+  assertValues(_sm, dnaBest ,dnaPP);
+}
+
+
+// test -M 2 
+TEST_F(TopLevel, dnamem2)
+{  
+  auto folder = std::string{"test-data/dna"}; 
+  auto _sm = init(  "bla -s 123 -n test-dnamem2 -f " + folder +  "/aln.binary -c " + folder + "/config.nex -M 2"  );
+  _sm.run();
+  _sm.deleteMyFiles();
+  assertValues(_sm, dnaBest ,dnaPP);
+}
+
+
+// test -M 3 
+TEST_F(TopLevel, dnamem3)
+{  
+  auto folder = std::string{"test-data/dna"}; 
+  auto _sm = init(  "bla -s 123 -n test-dnamem3 -f " + folder +  "/aln.binary -c " + folder + "/config.nex -M 3" );
+  _sm.run();
+  _sm.deleteMyFiles();
+  assertValues(_sm, dnaBest ,dnaPP);
+}
+
+
+// test -M 3 -S 
+TEST_F(TopLevel, dnamem3sev)
+{  
+  auto folder = std::string{"test-data/dna"}; 
+  auto _sm = init(  "bla -s 123 -n test-dnamem3sev -f " + folder +  "/aln.binary -c " + folder + "/config.nex -M 3 -S"  );
+  _sm.run();
+  _sm.deleteMyFiles();
+  assertValues(_sm, dnaBest ,dnaPP);
+}
+
+
+// test multiple runs and chains 
+TEST_F(TopLevel, dnaMulti)
+{  
+  auto folder = std::string{"test-data/dna"}; 
+  auto _sm = init(  "bla -s 123 -n test-dnaMulti -f " + folder +  "/aln.binary -c " + folder + "/config-multi.nex"  );
+  _sm.run();
+  _sm.deleteMyFiles();
+  assertMultiValues(_sm, false);
+}
+
+
+////////////////////////////
+///// NON-MPI specific /////
+////////////////////////////
+#ifndef _WITH_MPI
+// test checkpoint 
+TEST_F(TopLevel, dnaMultiCheckpoint)
+{  
+  auto folder = std::string{"test-data/dna"}; 
+  copyResumeFiles();
+
+  auto _sm = init(  "bla -s 123 -n test-dnaMultiCheckpoint -r toResume -f " + folder +  "/aln.binary -c " + folder + "/config-multi.nex"  );
+  _sm.run();
+  _sm.deleteMyFiles();
+  assertMultiValues(_sm, false);
+}
+#endif
+
+
+///////////////////
+// MPI specific  //
+///////////////////
+
+// some tests that only make sense with MPI 
+#ifdef _WITH_MPI
+
+// resume from a checkpoint in parallel    
+TEST_F(TopLevel, dnaMultiCheckpoint)
+{  
+  auto folder = std::string{"test-data/dna"}; 
+  copyResumeFiles();
+
+  auto _sm = init(  "bla -n test-dnaMultiCheckpoint -r toResume -f " + folder +  "/aln.binary -c " + folder + "/config-multi.nex -C 2 "  );
+  _sm.run();
+  _sm.deleteMyFiles();
+  assertMultiValues(_sm, false);
+}
+
+
+
+// test multiple runs and chains, 2 chains parallel 
+TEST_F(TopLevel, dnaMultiParaChain)
+{  
+  auto folder = std::string{"test-data/dna"}; 
+  auto _sm = init(  "bla -s 123 -n test-dnaMultiParaChain -f " + folder +  "/aln.binary -c " + folder + "/config-multi.nex -C 2"  );
+  _sm.run();
+  _sm.deleteMyFiles();
+  assertMultiValues(_sm, false);
+}
+
+
+// test multiple runs and chains, 2 runs parallel 
+TEST_F(TopLevel, dnaMultiParaRun)
+{  
+  auto folder = std::string{"test-data/dna"}; 
+  auto _sm = init(  "bla -s 123 -n test-dnamultipararun -f " + folder +  "/aln.binary -c " + folder + "/config-multi.nex -R 2"  );
+  _sm.run();
+  _sm.deleteMyFiles();
+  assertMultiValues(_sm, true);
+}
+
+
+// mixed
+TEST_F(TopLevel, mixedWithQ)
+{  
+  auto folder = std::string{"test-data/mixed"}; 
+  auto _sm = init(  "bla -s 123 -n test-aamin-q -f " + folder +  "/aln.phy  -q "  + folder + "/aln.model -c " + folder + "/config.nex -Q"  );
+  _sm.run();
+  _sm.deleteMyFiles();
+  assertValues(_sm,-7.797382559009363e+04,-7.694705148165907e+04);
+}
+
+#endif
diff --git a/tests/TreeAlnTest.cpp b/tests/TreeAlnTest.cpp
new file mode 100644
index 0000000..589f6a5
--- /dev/null
+++ b/tests/TreeAlnTest.cpp
@@ -0,0 +1,30 @@
+#include "model/TreeAln.hpp" 
+#include "system/ByteFile.hpp"
+
+
+TEST(tree, something)
+{
+  nat numTax = 10; 
+  nat numPart = 3; 
+
+  auto&& traln = TreeAln(numTax, false); 
+  traln.createCaterpillar();
+  
+  
+  auto bl = BranchLengthResource{}; 
+  bl.initialize(numTax, numPart); 
+  
+  traln.setBranchLengthResource(bl);
+
+  auto&& traln2 = TreeAln(numTax, false); 
+  traln2 = traln; 
+  
+}
+
+
+TEST(tree, assignment)
+{
+  // auto&& bf = ByteFile("/home/aberer/proj/exa-bayes/data/tiny/aln.binary"); 
+  
+
+}
diff --git a/tests/brentTest.cpp b/tests/brentTest.cpp
new file mode 100644
index 0000000..03d5cc1
--- /dev/null
+++ b/tests/brentTest.cpp
@@ -0,0 +1,37 @@
+#include "math/brent.hpp"
+
+
+class OptFunc : public brent::func_base
+{
+public:   
+  OptFunc(std::function< double(double)> fun)
+    : _fun(fun)
+  {
+  }
+
+  virtual double operator() (double val)
+  {
+    return _fun(val); 
+  }
+
+private: 
+  std::function< double(double) > _fun; 
+
+}; 
+
+
+
+TEST(BRENT_TEST, general)
+{
+
+  auto square =  [](double x ) -> double 
+  {
+    return 3 * pow(x -2 ,2) + 2 ; 
+  }; 
+
+  auto optFun = OptFunc(square); 
+  
+  auto result = brent::zero(-123,345, 1e-3, optFun); 
+  tout << SHOW(result) << std::endl; 
+
+}
diff --git a/tests/exatest.cpp b/tests/exatest.cpp
new file mode 100644
index 0000000..6da2ae7
--- /dev/null
+++ b/tests/exatest.cpp
@@ -0,0 +1,65 @@
+#include <gtest/gtest.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include "system/extensions.hpp"
+#include "system/GlobalVariables.hpp"
+
+void initLogFile( )
+{
+  // globals.logFile = std::string{"/dev/null"}; 
+  globals.logStream = make_unique<std::ofstream>(std::string{"/dev/null"}); 
+  globals.teeOut =  make_unique<TeeStream>(std::cout, *globals.logStream, MY_TID);
+}
+
+
+// TODO 
+// #ifdef _WITH_MPI
+// #include <mpi.h>
+// #endif
+
+// #include "TopLevelInvocation.cpp" // 
+
+// #include "BipartitionTest.cpp"
+#include "tests/PartitionAssignmentTest.cpp"
+// #include "TreeAlnTest.cpp"
+
+#include "MessageQueueTest.cpp"
+#include "LocalCommTest.cpp"
+#include "brentTest.cpp"
+
+
+int main (int argc, char **argv)
+{
+  int result = 0; 
+
+  testing::InitGoogleTest(&argc, argv); 
+
+  initLogFile(); 
+
+  
+// #ifdef _WITH_MPI  
+//   MPI_Init(&argc, &argv); 
+  
+//   int myRank = 0;  
+//   MPI_Comm_rank(MPI_COMM_WORLD, &myRank);
+//   if(myRank > 0 )
+//     {
+//       // hack to silent remaining processes  
+//       int bak, newOne; 
+//       fflush(stdout); 
+//       bak = dup(1); 
+//       newOne = open("/dev/null", O_WRONLY) ; 
+//       dup2(newOne,1); 
+//       close(newOne); 
+//     }
+
+//   result = RUN_ALL_TESTS(); 
+//   MPI_Finalize(); 
+// #else 
+  result = RUN_ALL_TESTS(); 
+// #endif
+  
+  return result; 
+}
diff --git a/utils/automatedBuild.sh b/utils/automatedBuild.sh
new file mode 100755
index 0000000..990c97a
--- /dev/null
+++ b/utils/automatedBuild.sh
@@ -0,0 +1,27 @@
+#! /bin/bash
+
+if [ "$(which sshpass )" == "" ]; then
+    echo "please install sshpass"
+    exit
+fi
+
+apple=administrator at 10.49.49.199
+applessh="sshpass -p apple at H1TS ssh $apple"
+applescp="sshpass -p apple at H1TS scp "
+
+./configure 
+make distclean
+
+excludes=" --exclude packages --exclude final-experiments --exclude data --exclude runs --exclude TMP --exclude extra "
+
+rm packages/* 
+
+# linux build 
+rsync --progress -av -C --delete $excludes ./ tesla:~/proj/exa-bayes
+ssh tesla " cd proj/exa-bayes ; rm packages/* ; ./utils/build-distro.sh 0 4 avx sse no-sse ;  "
+scp tesla:proj/exa-bayes/packages/* packages/
+
+# apple build 
+rsync --progress -av -C -e "$applessh" --delete $excludes ./ :/Users/administrator/proj/exa-bayes
+$applessh " cd proj/exa-bayes ; rm packages/*  ; ./utils/build-distro.sh 1 4 avx sse no-sse ;  "
+$applescp $apple:/Users/administrator/proj/exa-bayes/packages/* packages/
diff --git a/utils/build-distro.sh b/utils/build-distro.sh
new file mode 100755
index 0000000..60078af
--- /dev/null
+++ b/utils/build-distro.sh
@@ -0,0 +1,110 @@
+#! /bin/bash
+
+
+if [ $# -lt 3 ]; then
+    echo -e  "$0 isApple cores ssetypes..\n\nwhere ssetypes can be  avx,sse, no-sse"
+    exit
+fi
+
+IS_APPLE=$1
+shift
+cores=$1
+shift
+
+ssetypes=$*
+
+fold=$(pwd  | tr '/' '\n'| tail -n 1 )
+if [ "$fold" != "exa-bayes" ]; then
+    echo "must be executed in exa-bayes folder!"
+    exit
+fi
+
+if [ $IS_APPLE == 0 ]; then
+    readlink=readlink
+    ccomp=gcc
+    cxxcomp=g++
+    system=linux
+    cxxompi=mpicxx.openmpi
+    cxxmpich=mpicxx.mpich2
+else
+    export PATH=/opt/local/libexec/gnubin/:/opt/local/bin:/opt/local/sbin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
+    readlink=greadlink
+    ccomp=clang
+    cxxcomp=clang++
+    system=apple
+    cxxompi=/usr/local/Cellar/open-mpi16/1.6.5/bin/mpicxx
+    cxxmpich=/usr/local/Cellar/mpich2/3.1.2/bin/mpicxx
+
+    export CXXFLAGS="-stdlib=libc++ $CXXFLAGS -Qunused-arguments -Wno-unreachable-code"
+fi
+
+
+
+
+./configure || exit
+
+rm -f  exabayes-*.zip exabayes-*.tar.gz
+
+for vect in $(echo  $ssetypes ) 
+do 
+    mpis="mpich2 openmpi"
+    
+    for mpi in $( echo  $mpis )
+    do 
+	make distclean
+
+	if [ "$mpi" == "mpich2" ]; then
+	    mpicxx="$cxxmpich"
+	else
+
+	    mpicxx="$cxxompi"
+	fi
+
+	arg=""
+	if [ "$vect" == "sse" ]; then
+	    arg="--disable-avx"
+	elif [ "$vect" == "no-sse" ]; then 
+	    arg="--disable-sse"
+	fi
+
+	mkdir -p  bin && rm -rf bin/*
+	mkdir -p  distro-build  && rm -rf distro-build/*
+
+	cd distro-build 
+
+	
+	cmd="../configure --enable-mpi  --prefix $($readlink -f ../) CXXFLAGS=\"-static-libstdc++ $CXXFLAGS\" CC=\"ccache $ccomp\" CXX=\"ccache $cxxcomp\" MPICXX=$mpicxx $arg"
+	echo $cmd
+	eval $cmd ||   exit
+	make -j $cores || exit 
+	make install  || exit 
+
+	cd .. 
+
+	# build the distribution 
+	./configure 
+	make dist 
+	make dist-zip 
+
+	# mv packages 
+	name=$system-$mpi-$vect
+	newname=$(ls exabayes-*.tar.gz | sed "s/\(.*\)\(.tar.gz\)/\1-$name\2/") 
+	\mv exabayes*.tar.gz ./packages/$newname
+	newname=$(ls exabayes-*.zip | sed "s/\(.*\)\(.zip\)/\1-$name\2/")
+	\mv exabayes*.zip ./packages/$newname
+    done 
+done 
+
+rm bin/*
+
+
+if [  "$IS_APPLE" == "0" ]; then
+    ./configure 
+    make dist 
+    make dist-zip 
+    name=src
+    newname=$(ls exabayes-*.tar.gz | sed "s/\(.*\)\(.tar.gz\)/\1-$name\2/")
+    \mv exabayes*.tar.gz ./packages/$newname
+    newname=$(ls exabayes-*.zip | sed "s/\(.*\)\(.zip\)/\1-$name\2/")
+    \mv exabayes*.zip ./packages/$newname
+fi
diff --git a/utils/checkBounds.R b/utils/checkBounds.R
new file mode 100644
index 0000000..a683059
--- /dev/null
+++ b/utils/checkBounds.R
@@ -0,0 +1,109 @@
+#! /usr/bin/Rscript
+
+## this is a failed attempt at computing the boundaries for a partial
+## sliding window proposal
+
+ 
+max=10
+min = 0.1
+
+a = c(1,2,3,4,5,.2,1)
+arel = a / sum(a)
+
+
+
+
+
+getDelta = function(rates, ind, indo)
+    {
+        inc = range(rates[ind])
+        mininc = inc[1]
+        maxinc = inc[2]
+
+        inco = range(rates[indo])
+        minex = inco[1]
+        maxex = inco[2]
+        
+        rs = rates[length(rates)]
+        N = length(rates)
+        n = length(ind)
+
+        rhoi = max
+        ri = maxinc
+        d1 = (n * ri - n * rhoi * rs) / (rhoi - 1 )
+
+        rhoi = min
+        ri = mininc
+        d2 = (n * ri - n * rhoi * rs) / (rhoi - 1 )
+        
+        rhoo = min
+        ri = minex
+        d3 =  (( - rhoo * rs + ri ) * (N - n)) / ( (rhoo * (N-n)) - 1 )
+
+        rhoo = max
+        ri = maxex
+        d4 =  (( - rhoo * rs + ri ) * (N - n)) / ( (rhoo * (N-n)) - 1 )
+        
+        abs(c(d1,d2,d3,d4) )
+    }
+
+
+## getDelta2 = function(rates, ind, indo)
+##     {
+##         inc = range(rates[ind])
+##         mininc = inc[1]
+##         maxinc = inc[2]
+
+##         inco = range(rates[indo])
+##         minex = inco[1]
+##         maxex = inco[2]
+        
+##         rs = rates[length(rates)]
+##         N = length(rates)
+##         n = length(ind)
+
+##         rhoi = max
+##         ri = maxinc
+##         d1 = (n * (N - n ) * (rhoi * rs - ri)) / (N - n + n * rhoi)
+        
+##         rhoi = min
+##         ri = mininc
+##         d2 = (n * (N - n ) * (rhoi * rs - ri)) / (N - n + n * rhoi)
+        
+##         rhoo = min
+##         ri = minex
+##         d3 = ( (N-n) * (ri - rhoo* rs )) / (1-rhoo)
+
+##         rhoo = max
+##         ri = maxex
+##         d4 = ( (N-n) * (ri - rhoo* rs )) / (1-rhoo)
+
+##         abs(c(d1,d2,d3,d4))
+##     }
+
+
+
+
+applyDelta = function (rates, delta ,ind, indo, dir)
+{
+    n = length(ind)
+    N = length(rates)
+
+    if(dir)
+        {
+            rates[ind] =  rates[ind] + delta / n
+            rates[indo] = rates[indo] - delta / (N - n)
+        }
+    else
+        {
+            rates[ind] =  rates[ind] - delta / n
+            rates[indo] = rates[indo] + delta / (N - n)
+        }
+
+    rates / rates[length(rates)]
+}
+
+res1 = min(getDelta(arel, 1:3, 4:7 ))
+
+b = applyDelta(arel, res1, 1:3,4:7 , T)
+c = applyDelta(arel, res1, 1:3,4:7 , F)
diff --git a/utils/clangTest.sh b/utils/clangTest.sh
new file mode 100755
index 0000000..ddae5a2
--- /dev/null
+++ b/utils/clangTest.sh
@@ -0,0 +1,18 @@
+red='\e[0;31m'
+NC='\e[0m' # No Color
+green='\e[0;32m'
+
+echo "configuring with clang"
+./configure CC="ccache clang" CXX="ccache clang++" --enable-mpi  2> /dev/null  > /dev/null
+make clean > /dev/null 2> /dev/null
+echo "makeing" 
+make -j4 > /dev/null   2> /dev/null
+
+if [ $? != 0 ]; then
+    echo -e  "[ ${red} failure ${NC} ] with clang"
+else  
+    echo -e  "[ ${green} OK ${NC} ] with clang"
+fi
+
+
+
diff --git a/utils/colGrep.sh b/utils/colGrep.sh
new file mode 100755
index 0000000..551bfa7
--- /dev/null
+++ b/utils/colGrep.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+if [ $# != 3  ]; then
+    echo "$0 <file> <line> <exp>"
+    exit 
+fi
+
+file=$1 
+startLine=$2
+name=$3
+
+cols=$(sed -n "${startLine}p"  $file  | tr "\t" "\n"| grep -n -i "$name" | cut -f 1 -d ':' | tr "\n" ",")  
+
+cols=$(echo $cols | rev | cut -c 2- | rev )
+
+cut -f "$cols" $file
+ 
diff --git a/utils/compileTest.sh b/utils/compileTest.sh
new file mode 100755
index 0000000..1b09e6b
--- /dev/null
+++ b/utils/compileTest.sh
@@ -0,0 +1,86 @@
+#! /bin/bash 
+
+# this script will compile 
+
+red='\e[0;31m'
+NC='\e[0m' # No Color
+green='\e[0;32m'
+
+# configure this 
+# see  play.h-its.org:/home/andre/compilers for the setup 
+
+GCC_VERSIONS=(4.8 4.9 5 6)
+CLANG_VERSIONS=(3.4 3.5 3.6 3.7 3.8 3.9 4.0)
+
+numcores=4
+
+# check gcc versions
+for elem in ${GCC_VERSIONS[*]}
+do
+    WARNLOG=warnlog-gcc$elem-without-mpi.log
+
+    ./configure CC="ccache gcc-$elem" CXX="ccache g++-$elem" > /dev/null
+    make clean > /dev/null
+    make -j$numcores  > /dev/null 2> $WARNLOG
+
+    if [ $? != 0 ]; then
+        echo -e  "[ ${red} failure ${NC} ] with GCC $elem (no MPI)"
+    else
+        echo -e  "[ ${green} OK ${NC} ] with GCC $elem (no MPI)"
+    fi
+done
+
+# check gcc versions with MPI
+for elem in ${GCC_VERSIONS[*]}
+do
+    WARNLOG=warnlog-gcc$elem-mpi.log
+
+    ./configure --enable-mpi MPICXX="mpic++.openmpi" OMPI_CXX="ccache g++-$elem" CC="ccache gcc-$elem" CXX="ccache g++-$elem" > /dev/null
+    make clean > /dev/null
+    make -j$numcores  > /dev/null 2> $WARNLOG
+
+    if [ $? != 0 ]; then
+        echo -e  "[ ${red} failure ${NC} ] with GCC $elem (MPI)"
+    else
+        echo -e  "[ ${green} OK ${NC} ] with GCC $elem (MPI)"
+    fi
+done
+
+# check clang versions
+for elem in ${CLANG_VERSIONS[*]}
+do
+    WARNLOG=warnlog-gcc$elem-without-mpi.log
+
+    ./configure CC="ccache clang-$elem" \
+                CXXFLAGS="-stdlib=libc++" \
+                CXX="ccache clang++-$elem" > /dev/null
+
+    make clean > /dev/null
+    make -j$numcores > /dev/null 2> $WARNLOG
+
+    if [ $? != 0 ]; then
+        echo -e  "[ ${red} failure ${NC} ] with clang-$elem (no MPI)"
+    else
+        echo -e  "[ ${green} OK ${NC} ] with clang-$elem (no MPI)"
+    fi
+done
+
+# check clang versions with MPI
+for elem in ${CLANG_VERSIONS[*]}
+do
+    WARNLOG=warnlog-gcc$elem-mpi.log
+
+    ./configure MPICXX="mpic++.openmpi" OMPI_CXX="ccache clang++-$elem" \
+                CC="ccache clang-$elem" \
+                CXXFLAGS="-stdlib=libc++" \
+                CXX="ccache clang++-$elem"  > /dev/null
+
+    make clean > /dev/null
+    make -j$numcores > /dev/null 2> $WARNLOG
+
+    if [ $? != 0 ]; then
+        echo -e  "[ ${red} failure ${NC} ] with $elem (MPI)"
+    else
+        echo -e  "[ ${green} OK ${NC} ] with $elem (MPI)"
+    fi
+done
diff --git a/utils/composePage.sh b/utils/composePage.sh
new file mode 100755
index 0000000..df0c480
--- /dev/null
+++ b/utils/composePage.sh
@@ -0,0 +1,18 @@
+#! /bin/sh
+
+if [ $# != 1 ]; then
+    echo "content-file"
+    exit
+fi
+
+input=$1
+
+start=$(grep -i  -n "<body>" $input  | cut -f 1 -d ':')
+end=$(grep -i  -n "</body>" $input  | cut -f 1 -d ':')
+len=$((end-start))
+
+echo "" > index.html
+
+cat ex-header.html >> index.html
+cat $input | tail -n +$((start+1)) | head -n $((len-1))  >> index.html
+cat ex-footer.html >> index.html
diff --git a/utils/concat-trees.sh b/utils/concat-trees.sh
new file mode 100755
index 0000000..9afcc62
--- /dev/null
+++ b/utils/concat-trees.sh
@@ -0,0 +1,63 @@
+#! /bin/bash 
+
+if [ $# -lt 2   ]; then
+    echo "$0 relBurnin file[..]"
+    exit
+fi
+
+relBurnin=$1
+shift
+treeFiles=$*
+
+headtmp=$(tempfile)
+
+
+# check tree  num 
+refnum=$(grep -c "tree gen" $(echo $treeFiles | tr ' ' '\n' | head -n 1 ))
+for file in $treeFiles
+do 
+    num=$(grep -c "tree gen" $file)
+    if [ $refnum != $num ]; then
+	echo "danger: different number of trees in files"
+	exit
+    fi
+done  
+
+skiptrees=$(echo "(($refnum *  $relBurnin)  + 0.5)  / 1 " | bc)
+
+# check header 
+grep  -h -v "tree gen" $(echo $treeFiles | tr ' ' '\n'  | head -n 1  ) | tail -n +3  > $headtmp
+for file in $treeFiles
+do 
+    tmphere=$(tempfile)
+    grep -h -v "tree gen" $file  | tail -n +3 > $tmphere
+
+    out=$(diff -q $headtmp $tmphere)
+
+    diff -q $headtmp $tmphere
+    
+    if [ "$out" != "" ]; then
+	echo "danger! files do not follow same taxon ordering. Aborting."
+
+	cat $headtmp
+	echo -e  "\n\nAND\n\n" 
+	cat $tmphere
+	
+	exit
+    fi
+    
+    rm $tmphere
+done   
+
+# echo "skipping $skiptrees" 1>&2
+
+grep -h -v "tree gen" $(echo $treeFiles | tr ' ' '\n'  | head -n 1  ) | head -n -1
+
+for file in $treeFiles
+do 
+    cat $file | grep -h  "tree gen" | tail -n +$(($skiptrees+1))
+done  
+
+echo "end;"
+
+rm $headtmp
diff --git a/utils/createMDSPlot.sh b/utils/createMDSPlot.sh
new file mode 100755
index 0000000..7494db4
--- /dev/null
+++ b/utils/createMDSPlot.sh
@@ -0,0 +1,51 @@
+#! /bin/bash
+
+raxml=raxmlHPC 			# TODO set 
+
+if [ "$#" -lt  "2" ]; then
+    echo <<EOF   "$0 id thinning [file ... ] 
+
+* id is just an id for the run 
+* thinning is a number: use only every n-th sample for plotting 
+
+* [ file ... ] are a bunch of ExaBayes_topology-files.  Make sure that
+  they end properly,.e. if you aborted the run, the file will be
+  truncated and you have to remove the last line for having a proper
+  file."
+EOF
+    
+    exit
+fi
+
+id=$1
+shift 
+
+thinning=$1
+shift
+
+echo -ne  "" >  numTrees.$id
+echo -ne  "" > allTopo.$id
+
+idfile=tmp.$id.idfile
+echo -ne  "" > $idfile
+for  i in $(seq 1 $#)
+do
+    file=$1
+    shift 
+
+    $(dirname $0)/getTopologies.sh $file |  sed -n "0~${thinning}p" | sed -e '$d'   > topoTMP
+    cat topoTMP | wc -l  >> numTrees.$id 
+    cat topoTMP >> allTopo.$id
+    rm topoTMP
+    echo $file | cut -f2,3 -d '.' >> $idfile
+done 
+
+rm -f  *.rfDistances
+$raxml -f r -n rfDistances  -z allTopo.$id  -m GTRCAT  > /dev/null
+cat  RAxML_RF-Distances.rfDistances  | cut -f 1,2,3 -d ' ' | tr -d  ':'  > tmp.$id.rf
+
+$(dirname $0 )/createMDSPlotHelper.R tmp.$id.rf numTrees.$id $id $idfile
+
+rm tmp.$id.rf
+rm *.rfDistances
+# rm tmp.$id.idfile
diff --git a/utils/createMDSPlotHelper.R b/utils/createMDSPlotHelper.R
new file mode 100755
index 0000000..31e166c
--- /dev/null
+++ b/utils/createMDSPlotHelper.R
@@ -0,0 +1,42 @@
+#! /usr/bin/Rscript
+
+args = commandArgs(trailingOnly = TRUE)
+
+fn = args[1]                          #rf distances
+numTreeFile = args[2]                      # number of trees per run 
+name = args[3]                          # an id for the run
+ids = args[4]
+
+idTab = read.table(ids, header=F, as.is=T)
+## idTab
+
+tab = read.table(fn, header=F)
+
+numTrees = read.table(numTreeFile, header=F)
+
+maximum = max(tab[,2])
+
+x = matrix(0,nrow=maximum+1, ncol=maximum+1 )
+x[upper.tri(x)] = tab[,3]
+x[lower.tri(x)] = t(x[upper.tri(x)])
+
+rfDists = x
+
+## rfDists
+scaled = cmdscale(rfDists)
+
+pdf(paste("mdsplot-", name, ".pdf", sep=""))
+matplot(NA,NA, xlim=range(scaled[,1]),ylim=range(scaled[,2]), xlab="dim A", ylab="dim B")
+end = 0 
+for (i in 1:dim(numTrees)[1])
+  {
+    start = end + 1 
+    end = start + numTrees[i,1] - 1 
+
+    matlines(scaled[start:end,1],scaled[start:end,2], col=i)
+    
+    legend("topleft", legend=t(idTab), lty=1, lwd=3, col=1:(dim(idTab)[1]))
+  }
+
+bla = dev.off()
+
diff --git a/utils/defaultRun.sh b/utils/defaultRun.sh
new file mode 100755
index 0000000..a68cd22
--- /dev/null
+++ b/utils/defaultRun.sh
@@ -0,0 +1,230 @@
+#! /bin/bash
+
+topdir=$(realpath $(dirname  $0 )/../) 
+
+seed=$RANDOM			# 
+seed=12345
+
+# src/proposals/
+numProc=2
+withTree=0
+
+# extraArgs=" -S "
+extraArgs="    "  
+
+doParse=1
+
+# early with 150 , VERIFIED 
+# seed=31853
+
+# args="--disable-silent-rules" 
+# args="--disable-sse"
+
+startFromBest=0
+dotests=0
+
+# important: if you do not have google-perftools (and the respective
+# *-dev ) package installed, then you should turn this off
+useGoogleProfiler=1
+useClang=0
+
+cflags=""
+cxxflags=""  #  -stdlib=libc++  -rdynamic
+
+
+if [ $dotests == 1 ]; then
+    args="$args --enable-tests"
+fi
+
+# args="$args --disable-sse"
+
+# args="$args --disable-silent-rules"
+# args="$args" 			#    --disable-sse
+
+runid=testRun
+
+if [ -f /proc/cpuinfo ] ; then 
+    numCores=$(cat /proc/cpuinfo  | grep processor  | wc -l) 
+else 
+    numCores=1
+
+fi 
+
+
+if [ "$useClang" -ne "0" -a "$(which clang)" != "" ]; then
+    ccompiler="clang"
+    cxxcompiler="clang++"
+    cppflags="-Qunused-arguments "  
+else 
+    ccompiler="gcc"
+    cxxcompiler="g++"
+fi
+
+if [ $useGoogleProfiler -eq 1  ]; then
+    cppflags="$cppflags -D_USE_GOOGLE_PROFILER "
+fi
+
+
+if [ $useGoogleProfiler -eq 1 ]; then
+    libs="-lprofiler "
+fi
+
+
+if [ "$#" -lt 3 ]; then
+    echo -e  "$0 debug|default|valgrind mpi|thread dataset\n\nwhere the first two arguments are either of the two options, and the third argument is the name of the dataset (e.g., small-dna)"
+    exit
+fi
+
+
+mode=$1
+codeBase=$2
+dataset=$3
+
+
+builddir=/tmp/exabayes
+
+# poor...
+shift  
+shift  
+shift  
+extra=$*
+# echo "extra would be $extra"
+
+
+pathtodata=$topdir/data/$dataset
+if [ ! -d $pathtodata ]; then     
+    echo "could not find dataset $dataset"
+    exit
+fi 
+
+
+case $mode in
+    debug)
+	cflags="$cflags -O0 -g"
+	cxxflags="$cxxflags -O0 -g"
+	gdb="$TERM -e gdb -ex run --args "  #   	
+	;;
+    default)
+	;;
+    valgrind)
+	cflags="$cflags -O0 -g"
+	cxxflags="$cxxflags -O0 -g"
+	gdb="$TERM -hold -e valgrind --track-origins=yes --leak-check=full --tool=memcheck  " #    --leak-check=full --track-origins=yes  --show-reachable=yes
+	;;
+    *)
+	echo "mode must be debug, default or valgrind"
+	exit
+esac
+
+
+configFile=$pathtodata/config.nex
+
+# args="$args --enable-mpi"
+
+if [ "$withTree" = "1" ]; then
+    if [ !  -f $topdir/data/$dataset/tree ]; then
+	echo "could not find data/$dataset/tree"
+	exit 
+    fi
+
+    extraArgs="$extraArgs -t $topdir/data/$dataset/tree"
+fi
+
+
+
+if [ $doParse -eq 0 ] ; then 
+    alnArg=" -f $pathtodata/aln.binary "
+else 
+    alnArg="-f $pathtodata/aln.phy -q $pathtodata/aln.model"
+    if [ ! -f $pathtodata/aln.phy -o ! -f $pathtodata/aln.model  ]; then
+	echo "could not find file $pathtodata/aln.{phy,model} "
+	exit 
+    fi
+fi 
+
+if [ "$codeBase" == "mpi" ]; then    
+    CC="$ccompiler"  
+    CXX="$cxxcompiler"  
+    
+    baseCall="mpirun -np $numProc  $gdb  ./exabayes $alnArg -n $runid -s $seed  $extraArgs -c $configFile $extra"
+
+elif [ "$codeBase" == "thread" ]; then 
+    CC="$ccompiler"
+    CXX="$cxxcompiler"
+    baseCall="$gdb ./yggdrasil -s $seed $alnArg -n $runid $extraArgs -c $configFile $extra "  
+else
+    echo "second argument must be either 'mpi' or 'thread'"
+    exit
+fi
+
+if [ $startFromBest == 1 ]; then 
+    if [ ! -f  $pathtodata/best.tre ] ; then 
+	echo "tried to start from best tree, but could not find $pathtodata/best.tre"
+	echo "if you do not have such a tree, deactivate startFromBest" 
+	exit 
+    fi 
+	
+    baseCall="$baseCall -t $pathtodata/best.tre"
+fi 
+
+
+if [ "$(which ccache)" != "" ]  ; then 
+    CC="ccache $CC"
+    CXX="ccache $CXX"
+fi 
+
+args="$args CC=\""$CC"\" CXX=\""$CXX"\""
+if [ "$cflags" != "" ]; then
+    args="$args CFLAGS=\""$cflags"\""
+fi
+if [ "$cxxflags" != "" ]; then
+    args="$args CXXFLAGS=\""$cxxflags"\""
+fi
+if [ "$cppflags" != "" ]; then
+    args="$args CPPFLAGS=\""$cppflags"\""
+fi
+if [ "$libs" != "" ]; then
+    args="$args LIBS=\""$libs"\""
+fi
+
+################ change dir ################
+
+cd $builddir
+
+
+rm -f exabayes yggdrasil
+if [ -f status ] ; then 
+    prevStat=$(cat status)
+else    
+    prevStat=""
+fi 
+
+cmd="$(realpath $topdir/configure) $args"
+
+if [ "$prevStat"  == "$cmd" ]  
+then     
+    echo "=> no need to reconfigure"
+else 
+    echo "config before: >"$prevStat"<"
+    echo "config    now: >$cmd<"
+
+    rm -f  Makefile
+
+    mkdir -p $builddir
+    cd $builddir
+    eval $cmd
+
+    echo "configuring with $cmd"
+    if [ -f Makefile ]; then
+	echo "$cmd" > status 	
+    fi
+fi 
+
+make -j $numCores
+
+if [ -f ./exabayes -o -f ./yggdrasil ]; then
+    echo "calling exabayes as   $baseCall"
+    rm -f  ExaBayes_*.${runid}*
+    wait 
+    $baseCall    
+fi
diff --git a/utils/distributionPlotter.R b/utils/distributionPlotter.R
new file mode 100755
index 0000000..5193d9c
--- /dev/null
+++ b/utils/distributionPlotter.R
@@ -0,0 +1,16 @@
+#! /usr/bin/Rscript
+
+args<-commandArgs(TRUE)
+
+tab = read.table(args[1], header=T)
+name= args[2]
+opt=args[3]
+
+pdf(name)
+
+if(opt == "line"){  
+  plot(tab[,1], type="l", main=names(tab)[1])
+} else{
+  hist(tab[,1], breaks="FD", main=names(tab)[1])
+}
+bla = dev.off()
diff --git a/utils/extractAllCredSets.py b/utils/extractAllCredSets.py
new file mode 100755
index 0000000..338d3ba
--- /dev/null
+++ b/utils/extractAllCredSets.py
@@ -0,0 +1,47 @@
+#! /usr/bin/python
+
+import sys 
+import re 
+
+if len(sys.argv) != 2  : 
+    print(sys.argv[0] + " file")
+    sys.exit()
+
+
+
+fh = open(sys.argv[1], "r")
+fh.readline()
+
+lines = fh.readlines()
+
+
+lens = []
+for line in lines: 
+    num = line.strip().split()[0]
+    lens.append(int(num))
+
+thesum = sum(lens)
+# print("total %d" % thesum )
+
+# 99 percentile 
+n99 = 0 
+sofar = 0
+goal = float(thesum) * 0.99
+for elem in lens: 
+    n99 += 1 
+    sofar += elem
+    if sofar >= goal : 
+        break
+# print("99-th perc: %d " % n99)
+
+n50 = 0 
+sofar = 0
+goal = float(thesum) * 0.50
+for elem in lens: 
+    n50 += 1 
+    sofar += elem
+    if sofar >= goal : 
+        break
+# print("50-th perc: %d " % n50)
+
+print("%d\t%d\t%d"  % (thesum , n50, n99))
diff --git a/utils/getMapTree.sh b/utils/getMapTree.sh
new file mode 100755
index 0000000..22b0c6a
--- /dev/null
+++ b/utils/getMapTree.sh
@@ -0,0 +1,24 @@
+#! /bin/bash
+
+if [ "$#" != "1"  ]; then
+    echo "./script exabayes-run-id "
+    exit
+fi
+
+
+if [ ! -f lib/raxmlHPC-SSE3 ]; then
+    echo "Please create a link as follows: ./lib/raxmlHPC-SSE3"
+    exit 
+fi
+
+runid=$1
+raxml=./lib/raxmlHPC-SSE3
+
+bestLnl=$(for elem in $(ls ExaBayes_parameters.$runid.* )  ; do    cut -f 2 $elem  | tail -n +3 | sort -n -r | head -n 1 ; done  | sort -n -r | head -n 1)
+
+line=$(grep -n -h -- "$bestLnl" ExaBayes_parameters.$runid.* |  cut -f 1 -d ':'  )
+run=$(grep -- "$bestLnl" ExaBayes_parameters.$runid.*  | cut -f 1 -d ':' | sed 's/.*\.\([0-9]*\)$/\1/')
+p
+lineInTopo=$(($line - 2))
+./utils/getTopologies.sh ExaBayes_topologies.$runid.$run | sed -n "${lineInTopo}p" 
+
diff --git a/utils/getTopologies.sh b/utils/getTopologies.sh
new file mode 100755
index 0000000..a7920ca
--- /dev/null
+++ b/utils/getTopologies.sh
@@ -0,0 +1,39 @@
+#! /bin/bash
+
+
+if [ $# != 1 ]; then
+    echo "./getTopologies.sh file"
+    exit
+fi
+
+file=$1
+
+start=$(grep -n translate   $file | cut -f 1 -d ':')
+end=$(grep -n tree $file | cut -f 1 -d ':' | head -n 3 | tail -n 1 )
+
+head -n $(($end-1)) $file | tail -n "+$(($start+1))" | tr -d  ",;"  > tmp 
+
+grep tree $file   | tail -n +3  | sed 's/.*\[&U\] \(.*\)/\1/'  > trees
+
+
+while read line 
+do 
+    old=$(echo $line | cut -f 1 -d ' '  )
+    new=$(echo $line | cut -f 2 -d ' '  )
+
+    echo "s/\([,(]\)${old}:/\1$new:/"
+done < tmp   > sedFile 
+
+
+for elem in $(cat sedFile)
+do 
+    cat trees | sed "$elem" > bla 
+    mv bla trees 
+done 
+
+cat trees 
+
+rm tmp sedFile trees 
+
+
+ 
diff --git a/utils/monitorTemperature.sh b/utils/monitorTemperature.sh
new file mode 100755
index 0000000..e4f2bc7
--- /dev/null
+++ b/utils/monitorTemperature.sh
@@ -0,0 +1,27 @@
+#! /bin/bash
+
+threshold=90
+
+while true  ; 
+do 
+    result=$(sudo   sensors | grep Core  | sed 's/[^\+]*+\([0-9]*\)\..*/\1/')
+
+    
+    oneTooHot=0
+    for elem in $(echo $result ) 
+    do	
+	if [ "$elem" -gt "$threshold"  ]; then
+	    oneTooHot=1
+	fi
+    done 
+
+    if [ $oneTooHot == 1 ]; then
+	killall -s SIGSTOP  exabayes   2> /dev/null
+    else
+	killall -s SIGCONT  exabayes 2> /dev/null
+    fi
+
+    sudo sensors  | grep Core 
+
+    sleep 1     
+done 
diff --git a/utils/plot.R b/utils/plot.R
new file mode 100755
index 0000000..4b150c0
--- /dev/null
+++ b/utils/plot.R
@@ -0,0 +1,24 @@
+#! /usr/bin/Rscript
+
+
+args = commandArgs(trailingOnly = T )
+
+if(length(args) != 1 )
+  {
+    cat("./script file\n")
+    quit()
+  }
+
+tab = read.table(args[1] , skip=1 , header=T)
+
+start = dim(tab)[1] / 25
+end =  dim(tab)[1] 
+
+
+pdf(paste(args[1], ".pdf", sep=""))
+for( i in 2:length(names(tab)))
+{
+  plot(sort(tab[start:end,i]), xlab="gen", ylab=names(tab)[i])
+  boxplot(tab[start:end,i], ylab=names(tab)[i])
+}
+bla = dev.off()
diff --git a/utils/plotExa.R b/utils/plotExa.R
new file mode 100755
index 0000000..80d1766
--- /dev/null
+++ b/utils/plotExa.R
@@ -0,0 +1,43 @@
+#! /usr/bin/Rscript
+
+library(lattice)
+
+
+myVioBoxPlot = function(form,dta)
+{
+  bwplot(form , data=dta, panel = function(..., box.ratio) {
+    panel.violin(..., col = "lightblue", varwidth = FALSE, box.ratio = box.ratio)
+    panel.bwplot(..., col='black', cex=0.8, pch='|', fill='gray', box.ratio = .1)
+  })
+}
+
+
+args =  commandArgs(trailingOnly=T)
+
+supertab = c()
+for (arg in args)
+  {
+    tab = read.table(arg, skip=1, header=T)
+    tab = tail(tab, dim(tab)[1] * 3 / 4  ) 
+    tab$name = arg
+    supertab = rbind(supertab, tab)
+  }
+
+pdf("exa.pdf")
+
+myVioBoxPlot(LnL ~ name , supertab)
+myVioBoxPlot(TL ~ name , supertab)
+myVioBoxPlot(r0AC ~ name , supertab)
+myVioBoxPlot(r0AG ~ name , supertab)
+myVioBoxPlot(r0AT ~ name , supertab)
+myVioBoxPlot(r0CG ~ name , supertab)
+myVioBoxPlot(r0CT ~ name , supertab)
+myVioBoxPlot(r0GT ~ name , supertab)
+myVioBoxPlot(pi0A ~ name , supertab)
+myVioBoxPlot(pi0C ~ name , supertab)
+myVioBoxPlot(pi0G ~ name , supertab)
+myVioBoxPlot(pi0T ~ name , supertab)
+myVioBoxPlot(alpha0 ~ name , supertab)
+
+bla = dev.off()
+
diff --git a/utils/plotParamDistribution.sh b/utils/plotParamDistribution.sh
new file mode 100755
index 0000000..9f2eb8a
--- /dev/null
+++ b/utils/plotParamDistribution.sh
@@ -0,0 +1,26 @@
+#! /bin/bash
+
+if [ "$#" != 3 ]; then
+    echo "./plotParamDistribution.sh paramFile pos hist|line" 
+    echo "where paramFile is the output of a ExaBayes run and pos is the column in the param file (e.g., 2 for the lnl) "
+    exit
+fi
+
+theFile=$1
+pos=$2
+histOpt=$3
+
+if [  "$histOpt"=="hist" -o "$histOpt"=="line" ]; then
+    okay=1
+else     
+    echo "argument 3 must be either hist or line"
+fi
+
+
+
+tail -n +2 $theFile | cut -f $pos   > tmp 
+
+# echo my dir is  $(dirname $0)
+$(dirname $0)/distributionPlotter.R tmp $1.col$2.plot.pdf $histOpt
+
+rm tmp 
diff --git a/utils/setupPLLLinks.sh b/utils/setupPLLLinks.sh
new file mode 100755
index 0000000..cd5d444
--- /dev/null
+++ b/utils/setupPLLLinks.sh
@@ -0,0 +1,39 @@
+#! /bin/bash
+
+if [ ! -d  lib/phylogenetic-likelihood-library/ ]; then
+    echo "please install the PLL into lib (=> need the path lib/phylogenetic-likelihood-library/)"
+    exit
+fi
+
+if [ ! -f utils/setupPLLLinks.sh ]; then
+    echo "please call me from the ExaBayes top-level folder (e.g. /home/aberer/proj/ExaBayes)"
+    exit
+fi
+
+mkdir src/pll
+cd src/pll
+
+
+for elem in $(ls ../../lib/phylogenetic-likelihood-library/*.c )  
+do 
+    ln -s $elem $(basename $elem .c)-pll.c
+done
+
+
+for elem in $(ls ../../lib/phylogenetic-likelihood-library/*.h )  
+do 
+    ln -s $elem 
+done
+
+
+mkdir phylip_parser 
+
+cd phylip_parser
+
+
+for elem in $(ls ../../../lib/phylogenetic-likelihood-library/phylip_parser/*.h  )  
+do
+    ln -s  $elem 
+done
+
+cd ../../../
diff --git a/utils/smoketests.sh b/utils/smoketests.sh
new file mode 100755
index 0000000..f06259d
--- /dev/null
+++ b/utils/smoketests.sh
@@ -0,0 +1,46 @@
+#! /bin/bash
+
+# ascAlnList=(bin 010 really-tiny toy-usefull tiny tiny-parted tiny-aa 140-parted 775-short 041 027 027-parted small-dna small-dna-parted small-dna-superparted 050 064 036 043 029 071 059 052 140 140-randpart 354 p-202 143 044 024)
+
+ascAlnList=(bin)
+
+for dataname in ${ascAlnList[*]}
+do
+    base=data/$dataname
+    alnfile=$base/aln.phy
+
+    if [ -f $base/aln.part ]; then
+        partcmd="-q $base/aln.part"
+    else
+        partcmd="-m $(cat $base/model | awk '{print toupper($0)}')"
+    fi
+
+    rand=$RANDOM
+    cmdline="-f $alnfile $partcmd -s $rand  -c test-config.nex"
+
+    # testing yggdrasil
+    cmd="./yggdrasil $cmdline -T 4  -n yggdrasil.$dataname.$rand"
+    eval $cmd
+
+    if [ $? -ne 0 ]; then
+        echo "WARNING: problem with $cmd" >> ERRORS
+    fi
+
+    # testing exabayes
+    cmd="mpirun -np 4 ./exabayes $cmdline -n exabayes.$dataname.$rand"
+    eval $cmd
+
+    if [ $? -ne 0 ]; then
+        echo "WARNING: problem with $cmd" >> ERRORS
+    fi
+
+    # testing exabayes
+    cmd="mpirun -np 4 ./exabayes $cmdline -R 2 -C 2 -n exabayes.$dataname-para.$rand"
+    eval $cmd
+
+    if [ $? -ne 0 ]; then
+        echo "WARNING: problem with $cmd" >> ERRORS
+    fi
+done
+
+# check restart from checkpoint
diff --git a/utils/switchMpi.sh b/utils/switchMpi.sh
new file mode 100755
index 0000000..746ed55
--- /dev/null
+++ b/utils/switchMpi.sh
@@ -0,0 +1,23 @@
+#! /bin/bash
+
+if [ "$#" != "1" ]; then
+    echo "$0 ompi|mpich"
+    exit 
+fi
+
+
+mode=$1
+
+case $mode in
+    ompi)
+	sudo update-alternatives --set mpirun /usr/bin/mpirun.openmpi  
+	sudo update-alternatives --set mpi /usr/lib/openmpi/include
+	;;
+    mpich)
+	sudo update-alternatives --set mpirun /usr/bin/mpirun.mpich
+	sudo update-alternatives --set mpi /usr/include/mpich
+	;;
+    *)
+	echo "$0 opmpi|mpich"
+	exit
+esac
diff --git a/utils/updateDate.sh b/utils/updateDate.sh
new file mode 100755
index 0000000..408eeb3
--- /dev/null
+++ b/utils/updateDate.sh
@@ -0,0 +1,13 @@
+#! /bin/bash
+
+commitId=$(git log  | head -n 1  | cut -f 2  -d ' ' )
+date=$(git log --date=iso -1  | grep Date  | sed 's/Date:[ ]*\(.*\)/\1/' | cut -f 1,2 -d ' ')
+
+echo "#define RELEASE_DATE \"$date\"" > src/releaseDate.hpp
+echo "#define GIT_COMMIT_ID \"$commitId\"" >> src/releaseDate.hpp
+
+echo -e  "\n\nupdated release date: "
+cat src/releaseDate.hpp
+echo -e  "\n\n"
+
+
diff --git a/utils/updateWebpage.sh b/utils/updateWebpage.sh
new file mode 100755
index 0000000..243bde4
--- /dev/null
+++ b/utils/updateWebpage.sh
@@ -0,0 +1,35 @@
+#! /bin/sh
+
+read -p "did you follow the following procedure? C-e C-h l p, C-e C-h h h,  make man? [type yes] " res 
+if [ "$res" != "yes" ]; then
+    echo "then do it!"
+    exit
+fi
+
+path=$(dirname $0)
+
+if [ "$(pwd)" != "$path"  ]; then
+    echo "can only be executed from $path"
+    exit
+fi
+
+# update packages, if wanted 
+# read -p "update package? if yes, specify version: " version
+# if [ "$version" != "" ]; then
+#     rsync --no-p --no-g --chmod=Du=rwx,Dgo=rx --progress  -av packages/* dellsco:/scratch/sco/exelixis-new/material/exabayes/$version
+#     ssh dellsco chmod -R  o+rx /scratch/sco/exelixis-new/material/exabayes/$version
+# fi
+
+# compose webpages 
+cd webpage 
+../utils/composePage.sh content.html
+cd ../manual/
+../utils/composePage.sh content.html
+cd .. 
+
+# check if repository is up to date 
+cd /home/aberer/proj/exelixis-web
+git pull 
+cd $path
+
+rsync -C -L  -av webpage/ ~/proj/exelixis-web/web/software/exabayes/

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/exabayes.git



More information about the debian-med-commit mailing list